tgindex
brain_leakage_etc

brain_leakage_etc

Статистика
@brain_leakage_etcрусский

Не мысли, но мыслишки некоего @astynax. Можно сказать то, что не получилось дописать до средней длины публикаций в @brain_dump_etc

Последний пост
11 авг.
Последнее чтение
14 авг.
Постов за неделю
1
Всего постов
21
Тип
открытый
Язык
русский
В каталоге с
12 авг.
Подписчики
131
+1 за 5 дн.
Сутки
+1
+0,77%
Неделя
 
Месяц
 
Просмотров на пост
292
20 постов
Вовлечённость
222,9%
к подписчикам
Постов в день
0,1
всего 21
Упоминаний
2
каналов
Охват размещения
оценка
1/24сутки в ленте
67
1/48двое суток
76
1/72трое суток
82

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

Посты

  • Вчера сделал для своего winu (от "WIndow meNU") сортировку списка окон по последнему переключению на каждое. Всё предельно просто: любое новое окно при запросе у ОС списка окон добавляется в конец списка, а когда я переключаюсь на какое-то окно, оно перемещается в начало списка. Далее, в интерфейсе окна выводятся в том порядке, в котором они располагаются в этой внутренней очереди с перестановками. И если всегда считать окном для переключения по умолчанию — когда не нужно ничего выбирать, просто вызвать winu и нажать Return — второе окно в списке, то получится быстрое переключение между парой самых "горячих" окон. И это ровно то, что мне нужно обычно. Все остальные окна я выбираю, вводя строку для нечёткого поиска, там уже ранжирование по "близости" название окна к введённому запросу делается — эт о всё ещё быстрее, чем стрелками выбирать из списка. Хотя и такой вариант у меня есть, разумеется, и не только стрелками, но и по C-n=/=C-p с подтверждением и по Return и по C-j. Что же происходит, когда я переключаюсь между виртуальными рабочими столами? Поскольку список recency у меня никогда не забывает окна, то даже когда я получаю список видимых окон только для текущего Space, ранжирование по недавности не ломается, потому что относительный порядок сохраняется! А это значит, что я бесплатно получаю свою группу "горячих" окон для каждого Space 😎 И даже не пришлось делать по выделенному списку окон на каждое пространство! Да, порядок может слегка ломаться, если таскать окно с одного пространства на другое, но всё восстанавливается после пары переключений. Из проблем, которые ещё предстоит решить, наиболее заметная заключается в том, что моё winu ничего не знает о том, как пользователь переключается между окнами вне его. Но, опять же, если оглянуться на то, что мне ещё не пришлось получать доступ к Accessibility API и в фоне отслеживать активность окон, как делают все "большие" программы, то и текущий вариант очень даже неплох! А уж когда я сделаю динамическое подвешивание окон на буквы и цифры, то меня в принципе порядок станет волновать меньше 🤓 P.S. Может быть сортировку по недавности все так делают, не исключено. Но я лично всё сам придумал, в этом часть удовольствия от процесса!

  • Начал использовать свой переключатель окон в macOS! Потому что хоть я и натыкался на "почти то, что мне нужно", уже начав делать свой, но и то приложение было слишком bloat. Если интересно, то пробовал я AltTab и BetterCmdTab. Первое больше про красоту, но буквально одна маленькая возможность, нужная мне, находится за pay-wall вместе со всем ворохом того, что я никогда использовать не буду. Да и работал этот AltTab нестабильно. Я хотел им переключать видимые окна, а "все-все" окна переключал бы ванильный механизм — как раз более чем один режим переключения окон у AltTab платный. Так вот, я с помощью Karabiner подвесил AltTab.app на Cmd+Tab, а оригинальный переключатель переместил на Cmd+Option+Tab. А в итоге AltTab начал очень странно реагировать на Cmd+Shift+Tab, то есть сразу закрываться с выбором предыдущего окна. И я не смог это отдебажить и побороть. Где-то в процессе починки AltTab очередной brew update показал, что есть такая штука — BetterCmdTab. FOSS, бесплатно навсегда, keyboard-driven — звучало вкусно! Поставил, начал подстраиваться под него и его подстраивать под себя. В итоге программа умудряется ломаться регулярно и показывать невидимо окно, которое захватывает фокус, но переключать ничто и никуда не даёт. Да, вроде бы где-то автор это как-то подтыкал, но у меня не починилось после того патча. В итоге я и эту программку снёс, хоть она и была близка к тому, что я конкретно хочу. А мой переключатель тупой, не умеет ничего красивого, но пока не отваливается! И я его могу чинить сам, если придётся 😜 Буквально сегодня я сделал для своей переключалки показ по глобальному сочетанию клавиш. Причём я не хочу пока влезать в Accessibility API и выдачу соответствующих прав. А раз уж у меня уже есть keyboard shortcut manager в лице Karabiner, то нужно было всего-то дать уже запущенной программе знать, что ей нужно окошко показать. Я чуть-было не кинулся делать IPC на named-pipes, но вовремя вспомнил про SIGUSR1 — это же буквально то, что нужно для данной задачи, максимально дёшево и сердито 🌚

  • Копаюсь дальше в профиле 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 авг.1 10156

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

  • Вообще всё это мне вернуло слегка те ощущения из времени, когда я писал для себя всякие GUI-надстройки для Windows на Delphi. Правда, такого уровня удобства "от мысли, до первого запуска" так никто и не достиг с тех пор, только усложнили всё. Я уж молчу про возможность в оффлайне всё делать, имея и всю документацию на руках с ворохом примеров на все случаи жизни. Нейросетки позволяют превозмочь ступор чистого листа — как раньше тебя прямо-таки звала "Form1" уже готовая и даже запускабельная. Но всё таки ощущения другие: да, можно больше, но не самому...

  • И, да, чтобы получиться список окон на текущем мониторе на активном Space, надо потыкать постоянной отгнивающий приватный API, а публичного и стабильного просто нет. При этом Acessibility API простойные, но им тоже как-то наплевать на "текущий десктоп того монитора, на котором сейчас фокус", официально есть только способ перечислить окна, видимые и не только, но ника не поэкраново. В итоге все открытые и не очень решения обёртывают эти самые приватные API в либу, собирают отдельные версии для разных релизов ОС со своими наборами костылей для каждого релиза. Фу так жить. Вот я и не буду — для себя же делаю, остановлюсь там, где станет уже не весело.

  • Вчера не смог удержаться, решил написать свою переключалку окон для macOS. Потому что иcкоробочный вариант переключает окошки, лежащие на всех десктопах, мне это неудобно. Да, есть какие-то аналоги, которые в той или иной степени платные или навязчиво просят денег даже в бесплатном режиме. И все какие-то толстые. А мне не хватает dmenu/rofi. Решил в итоге свою версию сделать. Конечно же решил вайбкодить, поэтому скормил все нейронке и сказал, мол, "вот тебе Swift, вот тебе базовые библиотеки, давай, делай". И, собственно, надиктовал за часик MVP. Причем базовая функциональность заработала с первого промпта, то есть в течении минут пяти! Дальше я уже просто специально микро-шашками двигался и смотрел заодно, как и что делается в их мире. Вот как-то так. Сам я, конечно же, такое писать не стал бы, хоть Swift и не ужасен и даже местами приятный. А вот яблочный SDK сомнительный для был всегда на мой лично вкус. А теперь можно машину запрячь, пускай работает!

  • Жёлтые тюльпа-аны Это не для зву-ука! Красные тюльпа-аны Вам не композит!

  • Активно начал умирать второй динамик в макбуке. Прожил на полгода дольше собрата. Точнее, не динамик, а усилитель. Скоро мой ноут будет немым, разве что порт наушниковый звучать продолжит и BT ещё

  • А ещё можно через TRAMP запускать фрагменты кода из вашего локального Org файла на удалённых машинах и спутывать (tangle) ваши конфиги тоже в удалённые файлы. При этом можно на одной машине выполнить скрипт, результат которого подставить в конфиг, заливаемый на другую машину — простор для вариаций широчайший! Собственно, Literate Ops вокруг этого всего и построен 😎

  • 1 июл.240111

    Вчера собрал в докере python, uv, LSP сервер (pyrefly, через uv tool install). Запустил контейнер. В Emacs зашёл по пути /docker:urly-swan/app/foo.py и открылся файл в контейнере, как будто локальный. Вызвал eglot— тот запустил и подконнектился к LSP-серверу в контейнере. Сервер увидел сорцы, зависимости и остальное. Потом я вызвал eshell при активном буфере с файлом в контейнере — и shell открылся тоже внутри контейнера. А можно было просто в eshell сделать cd /docker:crazy-donkey/app и перепрыгнуть в контейнер. Вместо Docker весь сетап мог быть спрятан за SSH и всё работало бы так же! Что характерно, это всё встроенные в Emacs штуки: - eglot — поддержка LSP - TRAMP — поддержка всяких "удалённых машин", то есть работа через SSH, scp, Docker, последовательный порт и проч. - eshell — shell с возможностью писать команды на elisp, куда уж без этого

  • https://unix.foo/posts/it-will-never-be-the-year-of-the-linux-desktop/ The problem is that Linux can make almost anything exist, but it cannot make almost everyone agree to care about it at the same time. Увы и ах, всё так и есть...

  • >>> from pydantic import BaseModel, BeforeValidator >>> from typing import Annotated >>> type CommaSeparated[T] = Annotated[list[T], BeforeValidator(lambda v: v.split(","))] >>> class Buckets(BaseModel): ... REQUEST_DURATION_BUCKETS: CommaSeparated[float] | None = None ... >>> import os >>> Buckets.model_validate(os.environ) Buckets(REQUEST_DURATION_BUCKETS=None) >>> >>> os.environ["REQUEST_DURATION_BUCKETS"] = "1.2,5" >>> Buckets.model_validate(os.environ) Buckets(REQUEST_DURATION_BUCKETS=[1.2, 5.0]) >>> >>> os.environ["REQUEST_DURATION_BUCKETS"] = "1.2,oops" >>> Buckets.model_validate(os.environ) Traceback (most recent call last): ... REQUEST_DURATION_BUCKETS.1 Input should be a valid number, unable to parse string as a number [type=float_parsing, input_value='oops', input_type=str] Modern type-driven Python may look like that! Вполне себе композабельно и удобненько, особенно когда добавили [T] синтаксис и параметризованные тайп алиасы

  • Первый раз наткнулся на то, что объявление в классе метода def list(self, ..) ломает тайпчекинг и код просто падает на вычислении аннотаций. Потому что в области видимости класса теперь list — это дескриптор метода экземпляра. То есть произошло затенение (shadowing), которое почти никак не видно в самом коде, потому что вызывается-то метод через точку! А вот аннотации ломаются, потому что они-то в пространстве имён объявления класса живут. В самом Python можно сделать from __future__ import annotations и это даст коду запуститься. А вот ty ругается, мол, ты всё сломал и не починил! Пришлось локально заглушить. И, да, это рабочий проект на Python 3.11. Коллеги просто забивают и пишут from typing import List и аннотируют через него. В итоге половина кода с List[foo], а другая половина с list[bar]. Но всем, кроме меня, пофиг.

  • https://www.stvn.sh/writing/programming-still-sucks-fqffhyp отзывается.

  • Эппл поимел меня. Питоновский torch уже не собирают для Intel Mac, только для винды или армовых маков. А собирать torch из сорцов — боль! Там надо подтянуть под конкретный GPU заголовочники и остальные приседания делать...

  • https://www.reddit.com/r/custommagic/comments/yqujp0/commander_volkov/ просто забавное название карточки. Накопал, пока искал скриншот VC для сегодняшнего стрима

  • Начал щёлкать левый динамик в макбуке. Для MacBook Pro 16-inch оба канала сидят на одинаковой схеме smart-amp, обычно от Cirrus Logic, управляемой через AppleHDA. Щелчки это типичный сценарий деградации smart-amp (обычно чип от Cirrus Logic), а не самого динамика. К сожалению, для этой модели это обычно означает: - либо жить с отключённым каналом, - либо внешняя акустика / наушники, - либо замена верхнего модуля (дорогой ремонт). Стоит ли чинить? Честно: для 16" 2019 с i9 ремонт часто экономически сомнителен, если только машина не в идеальном состоянии и тебе принципиально важны встроенные динамики. Это не опасная поломка — ничего не «сгорит дальше». Просто канал постепенно станет совсем шумным. Мде

  • без подписи

  • без подписи