LINUX.ORG.RU

Сообщения rhubear

 

StumpWM как вершина ручного тайлинга

Галерея — Скриншоты

StumpWM — это ручной тайловый менеджер, написанный на Common Lisp. Со стороны эта фраза ничего не значит, но на деле это оконный менеджер с огромным потенциалом для превращения его в удобную рабочую среду, альтернатив которой почти нет (если есть вообще).

Прежде всего, что такое ручной тайлинг (или manual tiling, или static tiling). Это тайлинг, где расположением окон управляет пользователь, а не оконный менеджер. В случае со StumpWM, пользователь делает сетку из фреймов (или тайлов), куда будут распологаться окна. Окна распологаются друг над другом и занимают фрейм полностью. Можно привести аналогию с картами, где окно — это карта и эта карта складывается в общую пачку в виде фрейма и, эти несколько пачек, располагающиеся напротив друг друга — это итоговая сетка из фреймов. По опыту, это самое безболезненное решение из всех, если окон очень много.

Сам оконный менеджер написан на Common Lisp и, благодаря этому, позволяет переконфигурировать его на лету через Emacs+SLIME/Sly. Сам конфиг тоже на лиспе, что удобно. У меня, например, накопилось около 2000 строк кода. WM позиционирует себя как Emacs среди оконных менеджеров. Не в плане того, что может полностью зависнуть, если какой-то из плагинов будет долго думать, а в плане способствования хакам.

Кстати об имаксе. Как и у Emacs, у StumpWM хоткеи работают по принципу цепочки аккордов (chord chain). Например, можно реализовать такой хоткей: нажатие Ctrl+C, отпускание и нажатие таба — это может считаться одним хоткеем и быть забиндено на, скажем, вызов терминала. В конфиге выглядеть это будет примерно так:

(set-prefix-key (kbd "C-c"))
(define-key *root-map* (kbd "Tab") "run-shell-command sakura")

Из кода получается, что при нажатии на Ctrl+C оконный менеджер переключит лейаут клавиатуры на root-map и будет ожидать следующей клавиши. А на этом лейауте будет таб, при нажатии на который будет вызываться команда sakura. Мап, по факту, является раскладкой клавиатуры для оконного менеджера, на котором расположены бинды команд для него. И подобных map-ов может быть, в целом, до бесконечности и можно даже подсунуть мап в хоткей другого мапа:

(set-prefix-key (kbd "C-c"))
(register-kmap *layout-map* nil)
(define-key *root-map* (kbd "w") '*layout-map*)

Тут при переходе на рутовый мап мы можем нажать на W и перейти на следующий мап — layout-map.

Говоря простым языком, мы можем определять потенциально бесконечное число цепочек аккордов для хоткея. И это замечательно в плане эргономики — руки меньше напрягаются для хоткеев.

Я использую патченный StumpWM, т.к. мне не удалось найти, можно ли в лиспе в рантайме менять атрибуты класса. Но у патчей есть свои предпосылки. Ванильный StumpWM для перемещения по лейауту предлагает переключение фреймов по принципу «ближайший в заданном направлении», что неудобно и занимает время при переключении (особенно на мультимониторных конфигурациях). Так что мне удалось встроить в StumpWM свой принцип переключения фреймов, который заключается в тегировании фреймов. Схему в общем виде можно наблюдать на второй пикче. Суть в том, что на фрейм накладывается определённый тег, который привязывается к определённому хоткею. И, соответственно, при нажатии будет немедленное переключение на соответствующий тег. Патч был нужен лишь для добавления атрибута тега в класс фрейма. Функции по работе с этим реализованы на уровне конфига. Теги создаются динамически и также динамически привязываются к хоткеям. Они могут по-разному называться и их может быть до бесконечности.

Весь этот текст — фиксация того, что можно найти в StumpWM, т.к. с него я ухожу. Это один из лучших оконных менеджеров, но в нём есть свои проблемы:

  • Плохая поддержка мультимониторной конфигурации. Если в каком-нибудь herbstluftwm на один монитор даётся один воркспейс, то у StumpWM один воркспейс на все мониторы. Это порождает разного рода проблемы, например, если второй монитор служит информационным дисплеем, то при переключении воркспейсов, воркспейс переключается на всех мониторах, соответственно, убирая информацию со второго монитора.

  • Позиционирование а-ля имакс. Субъективщина, но модульность кажется более лучшим решением, чем всё в одном решении.

  • Мне не удалось придумать как решить проблему, если в воркспейсе накопилось слишком много окон. Ты начинаешь в них утопать, переключая в поисках нужного. То, как это всё реализовано в StumpWM сейчас — лучшее из того, что мне доводилось пробовать. Но хочется лучше. У меня была идея делать субворкспейсы — это обычные воркспейсы, но они условно привязаны к какому-либо из воркспейсов. По типу того, что есть воркспейс anyame и мы создаём подворкспейсы: anyame1, anyame2, etc… И все окна раскидываем по ним. Главное тут во всём: переключение подворкспейсов должно быть максимально доступным, как Alt+Tab, только в два хоткея: вперёд по цепочке и обратно. Но вся идея упёрлась в первый пункт проблем. И это стало малоиспользуемым, по итогу.

  • Просто мелкие баги, которые могут доставлять дискомфорт. Например, может быть так, что WM может застрять между двумя воркспейсами и показывать окна с них одновременно — лечится переключением обратно.

Проблема с большим количеством окон для меня сильно актуальна, т.к. я стараюсь отказываться от табов в приложении в пользу отдельных окон, т.к. окнами должен управлять оконный менеджер. И у меня уже есть идея улучшенного тайлинга, который должен быть лучше классического. Но это если и будет, то не на тайловом WM.

А так, в плане кастомизации под свои нужды, этот WM — вершина ручного тайлинга.

Дальнейшие ресурсы для изучения:

 , , ,

rhubear
()

Создание эргономичных расположений клавиш на Linux-системах

Статьи — Desktop

В этой статье мы рассмотрим:

  • почему вообще может потребоваться ремаппинг;
  • как ремаппят другие;
  • как раскладка реализована у меня;
  • как сделать собственную раскладку’.

Кроме обычного ремаппинга, мы также коснёмся темы создания слоёв, их индикации, а также рассмотрим создание аккордов (chords). Всё это на уровне системы.

( читать дальше... )

 , , , ,

rhubear
()

Дрю Деволт: да что такое это ваше Gemini и почему я так в восторге от него? [перевод]

Форум — Web-development

Оригинал: https://drewdevault.com/2020/11/01/What-is-Gemini-anyway.html

Я в своём блоге писал о некоторых специфичных вещах, связанных с Gemini, если взглянуть на последние два месяца или около того. Но так до сих пор и не написал более широкое введение в этот протокол: о том, что я делаю с помощью него и почему вы должны быть восхищены им так же, как и я. Давайте сделаем это сегодня!

Gemini - сетевой протокол для обмена гипертекстовыми документами. «Гипертекстовый» - в общем смысле этого слова, а не в отношении HTML («HyperText Markup Language»), который понимают веб-браузеры. Это простой сетевой протокол, который позволяет клиентам запрашивать гипертекстовые документы (в собственном формате, который называется gemtext). В некотором смысле, это эволюция протокола Gopher, но более модернизированная и упрощённая.

Gemini очень прост. Протокол использует TLS для установления шифрованного соединения (чаще используя самоподписанные сертификаты и Trust on first use (TOFU), чем центры сертификации). И он использует очень простой обмен: клиент отсылает URL того, что он хочет получить, завершая запрос символом новой строки. Сервер отвечает информационной строкой, которая содержит числовой код статуса и некоторую дополнительную информацию (такую как MIME-тип документа), затем пишет документ и завершает соединение. Аутентификация при желании выполняется с помощью клиентских сертификатов. Пользовательский ввод при желании выполняется с помощью кода ответа, который передаёт строку приглашения для ввода после чего выполняется второй запрос с ответом пользователя, который закодирован в query string URL-строки. Да и вот, собственно, и всё!

$ openssl s_client -quiet -crlf   \
    -servername drewdevault.com   \
    -connect drewdevault.com:1965 \
  | awk '{ print "response: " $0 }'
gemini://drewdevault.com
response: 20 text/gemini
response: ```ASCII art of a rocket next to "Drew DeVault" in a stylized font
response:   /\
response:   ||    ________                         ________       ____   ____            .__   __
response:   ||    \______ \_______   ______  _  __ \______ \   ___\   \ /   /____   __ __|  |_/  |_
response:  /||\    |    |  \_  __ \_/ __ \ \/ \/ /  |    |  \_/ __ \   Y   /\__  \ |  |  \  |\   __\
response: /:||:\   |    `   \  | \/\  ___/\     /   |    `   \  ___/\     /  / __ \|  |  /  |_|  |
response: |:||:|  /_______  /__|    \___  >\/\_/   /_______  /\___  >\___/  (____  /____/|____/__|
response: |/||\|        \/            \/                 \/     \/             \/
response:   **
response:   **
response: ```
[...]

Так почему я восхищён этим протоколом?

Моё презрение к веб-браузерам хорошо документировано (раз, два, три). Веб-браузеры чрезвычайно переусложнены и любые попытки создать новый будут являться сизифовым трудом. Удачное выполнение этой работы, если и возможно, будет неизбежно порождать лавкрафтовский беспорядок, который невозможно мэйнтейнить, полный уязвимостей, отжирающий гигабайты оперативной памяти при использовании и часы при компиляции. И учитывая, что все современные веб-браузеры, что реализуют полезную часть веб-стандартов, очень плохи и становятся только хуже, то что мы можем сделать?

Проблема неразрешимая. Мы не можем иметь «веб» без всех этих проблем. Но вот что мы можем, так это иметь нечто немного другое, что-то типа Gemini. Gemini не решает все проблемы веба, но то подмножество юзкейсов, на которое он нацелен, он решает лучше веба и это меня восхищает в нём. Я хочу отказаться от той части веба, которую Gemini выполняет лучше и найти решения для оставшихся частей веба, которые имеет смысл сохранить (подсказка: самую малую часть).

Вот некоторые аспекты этого протокола, которые я очень одобряю:

  • Он очень простой. Реализация сервера или клиента может быть написана одним человеком с нуля в промежутке одного-двух дней. Новый веб-браузер может занимать миллион часов при сотнях разработчиков для полной реализации.
  • Он не расширяемый. Gemini спроектирован так, чтобы его было трудно расширять без потери обратной совместимости и почти все запросы на расширение в рассылке в конечном итоге сносятся. Это хорошо. Ибо расширяемость как правило плохая идея. Расширения в конечном итоге ведут к большему усложнению и Gemini может страдать от той же участи, что и веб, если он не будет противиться расширениям.
  • Он однозначен в вопросах форматирования документов. В нём нет inline-ссылок (каждая ссылка идёт на новую линию), никакого форматирования и никаких inline-изображений (inline images). Gemini строго разделяет роли доставки контента и его отображения. Доставка контента - роль исключительно сервера, а его отображение - исключительно клиента. Здесь нет «стилей сайта» и роль автора очень мала в вопросах того как должен отображаться контент. Авторы всё ещё имеют возможность проявлять себя в этих рамках, ровно как и в любых других. Да и они позволяют быть клиентам проще и действовать как пользовательский инструмент, нежели вендорский.

Некоторые люди утверждают, что нам стоит сделать «веб, но в чуть урезанном виде», т.е. взяв только «нормальное» подмножество веб-стандартов. Я не согласен с этим (например, я не считаю, что существует «нормальное» их подмножество), но я оставлю это для своего другого поста. Gemini - это новая среда, и она отлична от веба. Любой, кто входит в неё должен быть готов к этому и открыт её рамкам. Ограничения порождают креативность!

Что насчёт меня. Я работал над некоторыми проектами, связанными с Gemini. Например, этот блог теперь доступен и через Gemini и я начал писать эксклюзивный контент, доступный только через этот протокол. Я также написал некоторый софт, которым вы можете воспользоваться:

  • libgmni, gmni и gmnlm - мой инструментарий для клиентского софта. Всё написанно на C11 и только лишь требует POSIX-like систему с OpenSSL. libgmni - клиенсткая библиотека общего назначения для Gemini с простым интерфейсом. gmni - CLI-утилита для выполнения Gemini-запросов, выполненная в стиле cURL. Ну и, наконец, gmnlm - line-mode браузер с богатым набором фич. Вместе эти утилиты достигают около 4000 строк кода из которых 1600 - URL-парсер, взятый из cURL.
  • gmnisrv - высокопроизводительный Gemini-сервер, написанный на C11 для POSIX-систем с OpenSSL. Он поддерживает TLS без конфигурирования (zero-configuration TLS), CGI-скриптование, auto-indexing, regex routing, URL-перезапись и планирую ещё несколько вещей для версии 1.0. И весь код достигает около 6700 строк кода из которых 1600 - тот же код, взятый из cURL и ещё дополнительно 2800, взятые из quickjs Фабриса Белларда для реализации регэкспов.
  • kineto - это сетевой шлюз для соединения HTTP-клиента и Gemini-сервера. Реализован в одном Go-файле при поддержке go-gemini библиотеки от ~adnano. Мой Gemini-блог доступен через этот портал, если вы хотите посмотреть его.

Так что погружайтесь и изучайте! Устанавливайте gmnisrv на свой сервер и настраивайте своё Gemini-окружение. Читайте фиды из CAPCOM. Пишите собственный софт!

 , , , ,

rhubear
()

Перевод манги и OpenBSD

Галерея — Скриншоты

Довольно старый скриншот, который показывает, что OpenBSD вполне себе подходит для занятий графикой. Например, для перевода манги.

На данном скрине переводится манга «Выпрямись! Добро пожаловать в кружок танцев школы Шика» от со-автора манги «Мастер дрочки Куросава». А конкретно начало второго тома с японского (потому что в фанатском английском переводе его нет).

Для клина используется Krita, а для тайпа и финализации скана - GIMP. Для японского ввода используется IBus с не помню каким IM-фреймворком. Вроде fcitx.

Была идея частичной автоматизации процесса тайпа с помощью скрипта на Python, который использует ImageMagick. Этот скрипт генерирует из перевода (который на JSON) растровые изображения текста, которые остаётся лишь нанести вручную за заклиненные сканы. Затык лишь в том, что ручная работа всё-таки остаётся в виде переноса изображений текста на клин и самого клина, который без понятия как автоматизировать.

И, чтобы показать жизнеспособность данного метода перевода манги, я таким путём сделал перевод одного ваншота из «Osaka Banpaku» от автора манги «nichijou» на английский. Как выглядит сам текстовый перевод: https://github.com/lo-fi-scanlations/osakabanpaku.translation.

Ну, и немного процесса клина и тайпа обложки 2-го тома этой манги: оригинал, клин, готовая обложка.

При переводе обложки использовался также Inkscape для создания логотипа.

Используемый WM: herbstluftwm. Остальной workflow описан здесь: Будни NetBSD-раба

 , , , ,

rhubear
()

Вышла OpenBSD 6.6

Новости — BSD
Группа BSD

17 октября состоялся новый релиз операционной системы OpenBSD - OpenBSD 6.6.

Обложка релиза: https://www.openbsd.org/images/sixdotsix.gif

( читать дальше... )

>>> Подробности

 ,

rhubear
()

RSS подписка на новые темы