LINUX.ORG.RU

Избранные сообщения Imker

Выпуск FluxCast 0.2.7, инструмента для трансляции рабочего стола Linux на Smart TV

 , , , ,

Группа Мультимедиа

Состоялся выпуск проекта FluxCast v0.2.7, предназначенного для организации стриминга рабочего стола Linux на экраны Smart TV по протоколам Wi-Fi Direct (Miracast), DLNA и Chromecast с минимальной задержкой. Исходный код проекта написан на Python и распространяется под лицензией GPLv3.

Ключевым изменением в версии 0.2.7 стало полное устранение двух уязвимостей безопасности в сетевом стеке (исправлены несанкционированное подключение к RTSP-сессии и DoS-уязвимость, приводящая к MemoryError).

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

>>> Подробности релиза на GitHub (github.com)

Illium
()

Дошли руки до написать поддержку клавиатуры в OpenRGB

 , ,

Клавиатура Thermaltake TT Premium X1 RGB. На первом фото написано HI LOR 23 SEP.

Отправил PR… и судя по фото, нужно почистить клавиатуру.

P.S.: В реальности она не настолько грязная, камера сильно увеличивает.

anonymous_sama
()

Bobiverse 6. Перевод с помощью ИИ.

 , ,

Транскрибировал и перевёл новую книгу Денниса Тейлора The Infinite Extent из серии Bobiverse (она недавно вышла в виде аудиокниги). Три человека уже прочитали, остались довольны.

В общий доступ не выкладывал, потому что как-то не по-пацански, но скину в личку интересующимся. Обращайтесь.

Как делал и первые несколько глав можно посмотреть тут:

https://t.me/enginegger/144

https://t.me/enginegger/145

Puzan
()

Я создал youta: TUI для Ютуба, ЯндексМузыки, локальных файлов/аудиокниг (запоминает где играл), радио (показывает текущий трек), подкасты

 , , , ,

Люблю Ютуб, и обычно перед сном слушою его. На старом ноутбуке. Где от обычного Ютуба - включается вентилятор. Спасался юзерскриптом который оставлял только аудио. Пробовал разные TUI для Ютуба - везде было чтото не то. И вот решил попробовать через LLM сгенерировать себе то что хочется. А с LLM знаете как - вместо записи в TODO новой функциональности - можно ему сказать - и он сделает. Так что обросла моя youta многими полезными кнопками.

Audio-only. Играет через mpv. В фоне - yt-dlp. Также используется API Ютуба - для комментариев.

Помимо Ютуба - поддерживаются и многие другие онлайн площадки.

Гетерогенные плейлисты - это значит можно составлять из разных источников - то есть например сначала играет с Ютуба, потом с ЯндексМузыки, потом локальный файл, потом ещё откуда то.

Такая же гетерогенная история.

Реклама пропускается - если в таймкоде написано «Реклама» и через SponsorBlock. Альтернативный заголовок показывает рядом - через DeArrow.

Codex, Rust. Стартует моментально. Экономит CPU, RAM, батарею. Один исполняемый файл - около 20 мегабайт. Есть Gentoo ebuild - в том числе bin. Есть i686 сборка - чтобы ваш древний компьютер приносил пользу.

Знакомый аудиофил рассказывал что у них Gentoo считается лучшей системой - потому что можно использовать alsa и убрать лишнее - так что возможно тут и этот кейс.

Можно оставлять локальные «комментарии»-заметки.

Интегрирован с AcoustID - когда по горячей клавише - делает отпечаток - и находит Викиданные - не по метадате - а по звуку.

Есть горячие клавиши для перехода между главами Ютуба.

Можно показать QR для локального файла, папки, канала Ютуба - и получить podcast xml в свой телефон. Без промежуточного сервера - генерируется LAN ссылка.

Можно скачать весь Ютуб канал.

Шортсы показывает по умолчанию - но есть кнопка отключения.

По подписке - может на старте автоматически скачивать новые аудио.

Синхронизации с подписками Ютуба нету.

Можно дать линк на любую страницу - и youta вынимет оттуда то что можно проиграть.

Есть загрузка в Wikimedia Commons, Evernote. Саммари из LLM можно получить - для этого скачиваются captions.

Доступна и GUI версия на веб технологиях - мой друг добавил - не нравится ему TUI.

На выходе проверяет - если ~/.config/youta/ под гитом - делает коммит и пуш - чтобы сохранить подписки, историю, заметки.

Использую в TTY. Нравится.

MIT.

https://github.com/vitaly-zdanevich/youta

Рассказывал на митапе о нём https://www.youtube.com/watch?v=swzZX4Y30Ak

vitaly-zdanevich
()

Проблемы Mageia 10, их решения и другие полезные наработки

 

Дистрибутив Mageia традиционно ценится за предсказуемость, консервативную надёжность и верность классическим традициям Unix-подобных систем. Однако при развёртывании свежего выпуска Mageia 10 на современном оборудовании (мобильные процессоры Intel Core Ultra архитектур Arrow Lake, высокоскоростные накопители NVMe, экраны высокого разрешения с расширенным динамическим диапазоном) пользователь сталкивается с целым рядом неочевидных проблем — от периодических зависаний графического стола при записи на диск до перегрева, аварийного сброса частот процессора и блокировок сетевого трафика межсетевым экраном.

В настоящей статье систематизирован практический опыт глубокой инженерной доводки дистрибутива Mageia 10 до эталонного рабочего состояния на примере компактного ультрабука HONOR MagicBook Art 14 2025 (16-ядерный процессор Intel Core Ultra 7 255H, встроенный графический ускоритель Intel Arc, сенсорный OLED-экран 3120x2080 @ 120 Гц, твердотельный накопитель NVMe 1 ТБ с шифрованием LUKS (dm-crypt) и файловой системой Btrfs, графическая среда KDE Plasma 6 под управлением Wayland).

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


1. Базовая системная инициализация

1.1. Настройка прав суперпользователя (sudo)

В Mageia после установки обычный пользователь не включён в число доверенных администраторов: sudo ему недоступен, а без него не сделать и половины шагов этого гайда. Полномочия выдаются в два приёма: включение в штатную группу wheel (стандартный путь, применяется при следующем входе в систему — в /etc/sudoers строка %wheel уже раскомментирована) и отдельный drop-in-файл в /etc/sudoers.d/, который даёт sudo немедленно, без перелогина:

su -                                    # вход под root (пароль root, заданный при установке)
gpasswd -a <имя_пользователя> wheel     # включение в группу wheel
echo '<имя_пользователя> ALL=(ALL:ALL) ALL' > /etc/sudoers.d/<имя_пользователя>
chmod 0440 /etc/sudoers.d/<имя_пользователя>
visudo -cf /etc/sudoers.d/<имя_пользователя>   # обязательная проверка синтаксиса
exit

Важное правило: любой файл в каталоге /etc/sudoers.d/ обязан валидироваться утилитой visudo -cf — вывод должен быть <файл>: parsed OK. Один файл с синтаксической ошибкой ломает sudo во всей системе целиком (парсер останавливается на первой ошибке и перестаёт принимать всё, включая корректные файлы). Поэтому правило такое: создали файл — тут же проверили.

🔎 Теги для поиска: mageia нет sudo, как включить sudo mageia, пользователь не администратор mageia, sudoers wheel, не работает sudo после установки

1.2. Сетевое имя компьютера (hostname)

После назначения имени машины через hostnamectl необходимо синхронизировать его с файлом статического разрешения имён /etc/hosts: без записи в строке 127.0.0.1 система не может отрезолвить собственное имя, и приложения при старте испытывают характерные технологические задержки (таймауты на каждом первом обращении к «себе»):

sudo hostnamectl set-hostname magicbook
# дописать имя в /etc/hosts к локальной петле 127.0.0.1:
sudo sed -i 's/^\(127\.0\.0\.1.*\)/\1 magicbook/' /etc/hosts

Мелочь, о которой легко забыть: уже открытый терминал продолжит показывать старое имя в приглашении — bash кэширует \h на момент запуска. Откройте новый терминал или выполните exec bash.

🔎 Теги для поиска: сменить имя компьютера mageia, hostname mageia, изменить имя хоста, приложения долго запускаются mageia, как назвать компьютер linux

1.3. Шрифты высокой чёткости

Метрически-совместимые свободные замены (Liberation, Carlito, Caladea) в Mageia 10 уже установлены — они решают проблему «поехавшей вёрстки» документов, но выглядят иначе, чем оригиналы. Готового пакета с настоящими шрифтами Microsoft в репозиториях нет (лицензия EULA не позволяет их распространять — как и в большинстве дистрибутивов). Официальный путь — самораспаковывающиеся пакеты corefonts (исходно от Microsoft, раздаются SourceForge):

sudo dnf install -y cabextract
cd /tmp && for f in andale32 arial32 arialb32 comic32 courie32 georgi32 impact32 times32 trebuc32 verdan32 webdin32; do
  curl -fsSL -o "$f.exe" "https://downloads.sourceforge.net/corefonts/$f.exe"
done
sudo mkdir -p /usr/share/fonts/msttcore
for f in *.exe; do cabextract -L -q -d /tmp/ttf "$f"; done
sudo cp /tmp/ttf/*.ttf /usr/share/fonts/msttcore/ && sudo fc-cache -f
fc-match Arial    # проверка: должно вывести Arial.ttf

Это покрывает Arial, Times New Roman, Courier New, Verdana, Georgia, Trebuchet, Comic Sans, Impact, Andale и Webdings. Свободного эквивалента Tahoma и Segoe UI не существует — их можно взять только из установленной копии Windows, скопировав в пользовательский каталог ~/.local/share/fonts/ с последующей пересборкой кэша fc-cache -f. После установки шрифтов перезапустите браузеры — они держат шрифтовые подстановки в памяти.

🔎 Теги для поиска: шрифты windows в linux, arial times new roman mageia, кривые шрифты на сайтах mageia, установить ms шрифты linux, msttcorefonts, шрифты в браузере выглядят иначе


2. Дисковая подсистема: ликвидация зависаний интерфейса и тонкая настройка Btrfs

2.1. Зависания графического окружения из-за планировщика BFQ на накопителях NVMe

Симптом: при интенсивной фоновой записи на диск (работа систем контроля версий, распаковка архивов, сброс кэша операционной системы, синхронизация облака) графический стол подвисает на 5–10 секунд — при этом курсор мыши продолжает плавно двигаться, создавая классическую иллюзию «зависшего рабочего стола при живой мыши». Проблема проявлялась только в Mageia 10 и отсутствовала в Debian и Manjaro на том же железе.

Причина — комбинация трёх факторов, все — специфика Mageia и этого контроллера:

  1. Главная: планировщик BFQ на NVMe. В ядре Mageia (kernel-desktop) включён параметр сборки CONFIG_IOSCHED_DEFAULT_BFQ=y: Mageia назначает планировщик BFQ всем блочным устройствам без исключения, в отличие от других дистрибутивов, где быстрые NVMe работают на none (сквозные аппаратные параллельные очереди). BFQ сворачивает аппаратные очереди NVMe в одну логическую и для «справедливого» распределения полосы выдерживает технологические микропаузы slice_idle = 8ms. На скоростных накопителях при любой интенсивной записи контроллер захлёбывается в этой искусственной очереди, и процессы GUI (kwin_wayland, plasmashell, браузеры), пытаясь синхронно прочитать кэш или сделать мелкую запись, встают в непрерываемое ожидание ввода-вывода (состояние ядра D-wait). Курсор при этом движется: аппаратный указатель отрисовывается DRM-слоем ядра без дискового ввода-вывода.
  2. Усилитель: глубокое энергосбережение APST контроллера NVMe. Засыпание контроллера в глубокие фазы APST (Autonomous Power State Transition) и выход из них на ряде контроллеров (в частности, YMTC PC411) сопровождаются аппаратными задержками в десятки миллисекунд, которые на фоне BFQ складываются в заметные «подёргивания».
  3. Усилитель: дефолтный сброс «грязных» страниц. При 32 ГиБ ОЗУ порог по умолчанию (20 % памяти) позволяет накопить свыше 6 ГиБ несинхронизированных данных, которые файловая система Btrfs затем сбрасывает залпом каждые 30 секунд — прямо в узкое горлышко BFQ.

Решение — три шага:

  1. Правило udev /etc/udev/rules.d/60-ioschedulers.rules, назначающее планировщик по типу накопителя: NVMe — none (аппаратные очереди), SATA/USB SSD — mq-deadline, магнитные HDD — bfq (там BFQ как раз уместен — он сглаживает позиционирование головок):
# Перевод накопителей NVMe на режим аппаратных параллельных очередей (none)
ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*", ENV{DEVTYPE}=="disk", ATTR{queue/scheduler}="none"

# Перевод твердотельных накопителей SATA и USB на mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]*", ENV{DEVTYPE}=="disk", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"

# Назначение планировщика BFQ исключительно для магнитных жестких дисков (HDD)
ACTION=="add|change", KERNEL=="sd[a-z]*", ENV{DEVTYPE}=="disk", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"

Применить без перезагрузки и проверить:

sudo udevadm control --reload && sudo udevadm trigger --subsystem-match=block
cat /sys/block/nvme0n1/queue/scheduler   # в квадратных скобках должно быть [none]
  1. Отключить задержку перед переходами энергосбережения APST контроллера NVMe — параметром ядра в GRUB_CMDLINE_LINUX файла /etc/default/grub:
nvme_core.default_ps_max_latency_us=0

Применить на лету (до перезагрузки) и обновить конфигурацию загрузчика:

echo 0 | sudo tee /sys/module/nvme_core/parameters/default_ps_max_latency_us
sudo update-grub2
  1. Задать контролируемые пороги сброса буферов записи в файле /etc/sysctl.d/99-dirty-writeback.conf:
# начало плавного фонового сброса при накоплении 512 МиБ
vm.dirty_background_bytes = 536870912

# принудительная блокирующая синхронизация при накоплении 2 ГиБ
vm.dirty_bytes = 2147483648
sudo sysctl --system

⚠️ Значения проверены опытным путём: занижать их не стоит. Пробный вариант 128 МБ / 512 МБ дал результат хуже дефолта — слишком частые мелкие сбросы помножаются на задержки LUKS+Btrfs. 512 МБ / 2 ГиБ — подтверждённый оптимум для системы с 32 ГиБ ОЗУ на Btrfs-корне.

Результат тестов: сброс и синхронизация 2 ГиБ случайных данных на шифрованный Btrfs-корень ускорились с 5–10 секунд блокирующего фриза до 0,13 секунды (sync), без малейших задержек интерфейса; синхронизация даже десятков гигабайт данных выполняется бесшовно.

🔎 Теги для поиска: зависает рабочий стол mageia, курсор двигается всё остальное висит, mageia подвисает при копировании файлов, фризы при записи на диск, nvme планировщик bfq, подвисает kde при работе с диском, mageia тормозит debian нет

2.2. Файл подкачки на Btrfs и гибернация при шифровании LUKS

На файловой системе Btrfs файл подкачки обязан иметь атрибут отсутствия копирования-при-записи (NoCoW) — CoW-файл ядро откажется активировать как своп (swapon: Invalid argument). Штатная утилита btrfs mkswapfile сама выставляет NoCoW и создаёт своп-сигнатуру, поэтому ручные трюки с chattr +C и dd не нужны:

# размер: минимум = объём ОЗУ (иначе гибернация невозможна), с запасом — 2× ОЗУ
MEM_KB=$(awk '/^MemTotal:/{print $2}' /proc/meminfo)
SIZE=$(( MEM_KB * 1024 * 2 ))                          # 2× RAM в байтах
sudo btrfs filesystem mkswapfile --size "$SIZE" /swapfile   # сам делает NoCoW + mkswap
sudo swapon /swapfile
echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab

Сразу полезно ограничить склонность к свопированию — при 32 ГиБ ОЗУ своп нужен только под реальным давлением памяти:

echo 'vm.swappiness=1' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl -w vm.swappiness=1

⚠️ Свопинг — это вес склонности, а не жёсткий триггер «свопить при заполнении X %». Полезный побочный бонус: файл подкачки лежит на LUKS-контейнере, поэтому содержимое свопа на диске зашифровано. Если своп «залип» (система висит при свободной RAM после пиковой нагрузки): sudo swapoff -a && sudo swapon -a (нужно достаточно свободной памяти).

Настройка гибернации (спящего режима с сохранением на диск) сквозь контейнер LUKS:

  1. Определение физического смещения первого блока файла подкачки — только штатной командой btrfs (filefrag на Btrfs даёт неверное значение, использовать его нельзя):
sudo btrfs inspect-internal map-swapfile -r /swapfile   # выведет число, напр. 14798603
  1. Определение идентификатора корневой файловой системы:
findmnt -no UUID /
  1. Параметры в /etc/default/grub в строку GRUB_CMDLINE_LINUX: при загрузке LUKS-контейнер уже расшифрован средствами initramfs, поэтому в resume достаточно указать UUID самой файловой системы корня:
GRUB_CMDLINE_LINUX="... resume=UUID=<UUID-корня> resume_offset=<число>"
  1. Пересборка начального образа и меню загрузчика:
sudo update-grub2
sudo dracut -f

⚠️ Mageia собирает классический (не systemd) initramfs по пути /boot/initrd-<версия-ядра>.img. Поэтому dracut -f печатает безобидные строки вида dracut[E]: Module 'systemd*' can't be installed — игнорировать их: нужные модули (crypt/luks, btrfs, resume) всё равно оказываются в образе. Проверить можно так: lsinitrd /boot/initrd-$(uname -r).img | grep -c crypt.

После перезагрузки проверить восстановление: systemctl hibernate. Если /sys/kernel/security/lockdown отсутствует, Secure Boot/lockdown гибернацию не блокируют.

🔎 Теги для поиска: swap файл btrfs, не создаётся swap btrfs, гибернация mageia, не работает гибернация linux, resume_offset, своп на btrfs luks, swapon invalid argument, спящий режим ноутбук linux

2.3. Автоматическая оптимизация твердотельного накопителя (fstrim.timer)

В Mageia 10 системный таймер еженедельной фоновой очистки блоков SSD (fstrim.timer) отключен по умолчанию, и корневая файловая система также монтируется без параметра discard=async (проверка: findmnt -o OPTIONS /). В долгую это означает деградацию скоростей накопителя — контроллер не знает, какие блоки свободны, и вынужден стирать их на ходу при каждой записи. Включение таймера:

sudo systemctl enable --now fstrim.timer

Таймер раз в неделю в фоне отправляет команду TRIM на все подключённые файловые системы, поддерживающие очистку.

Важное замечание для разделов LUKS: диспетчер dm-crypt по умолчанию блокирует прохождение TRIM сквозь криптоконтейнер (в целях безопасности — чтобы не раскрывать карту заполнения блоков). Чтобы команды очистки доходили до физического контроллера, в /etc/crypttab для соответствующего тома нужно указать флаг discard (например: crypt_root UUID=... none discard), после чего пересобрать initramfs (sudo dracut -f). Это компромисс: карта заполнения раздела становится видимой, что для домашнего ноутбука обычно не считается риском, а скорость и ресурс накопителя сохраняются.

🔎 Теги для поиска: ssd тормозит со временем, trim mageia, включить fstrim, ssd медленный linux, trim через luks, discard crypttab, ssd скорость падает

2.4. Ошибка загрузчика GRUB sparse file not allowed на Btrfs

Симптом: при каждом старте компьютера загрузчик печатает ошибку: error: ../../grub-core/commands/loadenv.c:216: sparse file not allowed. Она постоянная, но безвредная — загрузка продолжается.

Причина — грабли Btrfs. GRUB при старте читает свой файл переменных /boot/grub2/grubenv (команда load_env, размер 1024 байта), а Btrfs упаковывает столь мелкие файлы inline — прямо внутрь дерева метаданных (проверка: filefrag -v показывает флаг inline). Честные «разрежённые» файлы и inline-файлы GRUB не различает, поэтому принимает inline-файл за разрежённый и завершает чтение с ошибкой. Причём Mageia вставляет load_env в grub.cfg безусловно, поэтому одного отключения «запоминания последнего пункта меню» мало — файл нужно ещё пересоздать как обычный extent.

Решение — два шага:

# 1) отключить запоминание последнего пункта (чтобы grubenv больше не перезаписывался).
#    Бонус: GRUB_DEFAULT=0 — всегда грузится первый пункт меню.
sudo sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=0/'             /etc/default/grub
sudo sed -i 's/^GRUB_SAVEDEFAULT=.*/GRUB_SAVEDEFAULT=false/' /etc/default/grub

# 2) пересоздать grubenv как NoCoW-файл (реальный extent, а не inline):
sudo chattr +C /boot/grub2                   # новые файлы в каталоге наследуют NoCoW
sudo rm -f /boot/grub2/grubenv
sudo grub2-editenv /boot/grub2/grubenv create
sudo chmod 644 /boot/grub2/grubenv

sudo update-grub2
# проверка — флага inline быть НЕ должно (пустой вывод = ок):
sudo filefrag -v /boot/grub2/grubenv | grep -i inline

Железобетонный запасной вариант: если ошибка осталась — просто sudo rm /boot/grub2/grubenv. Тогда GRUB пропустит load_env (проверка [ -f grubenv ] даст ложь), и ошибки не будет; с GRUB_SAVEDEFAULT=false файл заново не создастся. Проверять результат — по факту следующей загрузки: строки об ошибке быть не должно.

Попутно — быстрая загрузка. Если других ОС на диске нет, меню GRUB можно почти не показывать: в /etc/default/grub задать GRUB_TIMEOUT=1 (меню мелькнёт одну секунду — успеете нажать стрелку при необходимости) или GRUB_TIMEOUT=0 (меню скрыто, вызвать можно, держа при загрузке Esc или Shift). Меню можно сделать на весь нативный экран: GRUB_GFXMODE=3120x2080,auto (подставьте родное разрешение своей панели) — дефолтные 1024x768 заставляют GRUB обрезать фоновую картинку до 4:3.

🔎 Теги для поиска: grub sparse file not allowed, ошибка grub при загрузке mageia, grub ошибка btrfs, loadenv ошибка, убрать меню grub, ускорить загрузку mageia


nadim
()

Выключаем копипаст средней кнопкой мыши в красноглазом Niri (и используем её для других задач)

 , , ,

Здравствуйте, красноглазые нирийцы, который вздрагивают при одном упоминании Нокталии! Сегодня мы с вами будем перепиливать поведение мыши. Долой наследие иксов!

Итак, сначала идём и вписываем в ~/.config/niri/config.kdl

clipboard {
    disable-primary
}
Этого уже достаточно для отключения копипастинга мышью в Brave, telegram-desktop,... и т.д.

Для GTK можно добавить команду

dconf write /org/gnome/desktop/interface/gtk-enable-primary-paste false

Теперь добираемся до эмулятора терминала. Поскольку я перешёл на Wezterm (написан на нашем любимом Rust'е), то опишу для него. В ~/.config/wezterm/wezterm.lua надо добавить

config.mouse_bindings = {
  {
    event = { Down = { streak = 1, button = 'Middle' } },
    mods = 'NONE',
    action = act.Nop,
  },
  {
    event = { Up = { streak = 1, button = "Left" } },
    mods = "NONE",
    action = wezterm.action.OpenLinkAtMouseCursor,
  },
  {
    event = { Up = { streak = 2, button = "Left" } },
    mods = "NONE",
    action = wezterm.action.Nop,
  },
  {
    event = { Up = { streak = 3, button = "Left" } },
    mods = "NONE",
    action = wezterm.action.Nop,
  },
}

Однако, это просто отключение. Но у нас освобождается целая кнопка! И её теперь можно использовать в разных сценариях. Например, для того же Wezterm'а можно прописать

config.mouse_bindings = {
  {
    event = { Down = { streak = 1, button = 'Middle' } },
    mods = 'NONE',
    action = wezterm.action.SendString 'elio\r',
  },
  {
    event = { Down = { streak = 1, button = 'Middle' } },
    mods = 'CTRL',
    action = wezterm.action.SendString 'eza --tree ./',
  },
  {
    event = { Down = { streak = 1, button = 'Middle' } },
    mods = 'ALT',
    action = wezterm.action.SendString 'btm\r',
  },
  {
    event = { Down = { streak = 1, button = 'Middle' } },
    mods = 'SHIFT',
    action = wezterm.action.SendString 'fd -t f . | fzf --preview "bat --style=numbers --color=always {}" | xargs hx',
  },
  {
    event = { Up = { streak = 1, button = "Left" } },
    mods = "NONE",
    action = wezterm.action.Nop,
  },
  {
    event = { Up = { streak = 2, button = "Left" } },
    mods = "NONE",
    action = wezterm.action.Nop,
  },
  {
    event = { Up = { streak = 3, button = "Left" } },
    mods = "NONE",
    action = wezterm.action.Nop,
  },
}
Что это даёт в этом конкретном примере?

  • При нажатии средней кнопки мыши запустится файловый менеджер elio (написан на нашем любимом Rust'е (Niri тоже на Rust'е)).
  • При нажатии Ctrl+средняя кнопка мыши в командную строку вставится шаблон 'eza --tree ./' для запуска продвинутой альтернативы ls+tree с подсветкой и значками (написана на нашем любимом Rust'е).
  • При нажатии Alt+средняя кнопка мыши запустится системный монитор bottom (написан на нашем любимом Rust'е).
  • При нажатии Shift+средняя кнопка мыши в командную строку вставится шаблон 'fd -t f . | fzf --preview «bat --style=numbers --color=always {}» | xargs hx' для поиска и открытия файлов в текстовом редакторе helix (написан на нашем любимом Rust'е). Вместо find и less здесь используются fd и bat соответственно (написаны на нашем любимом Rust'е).

Enjoy!

saahriktu
()

OpenShield v0.2.4

 , openshield, ,

Привет, $username!

Хотел рассказать о своём проекте OpenShield. OpenShield – это фарвол для Linux с контролем сетевой активности отдельных приложений, написанный на Rust. Для управления используется терминальный интерфейс, а фильтрацией пакетов занимается nftables с возможностью переключения на iptables. В режиме обучения программа пропускает исходящий трафик и автоматически создаёт разрешающие правила. Затем можно перейти в режим Enforcing: соединения, для которых нет разрешающего правила, будут блокироваться. Правила можно привязывать к cgroup, пути исполняемого файла и параметрам запуска, дополняя ограничениями по адресам, портам и протоколам. Поддерживаются действия accept, drop и reject, а также временное отключение правил без их удаления.

Идея создать свой аналог OpenSnitch появилась довольно давно, но не было окончательного видения проекта. Когда я понял что должно получиться, закипела работа.

Я написал на GitHub, что OpenShield является форком opensnitch, наверное это не совсем так, поскольку заимствована лишь идея, а код написан заново, отличаются механизмы работы и задачи приложения. Поэтому точнее было бы назвать OpenShield самостоятельной реализацией, вдохновлённой OpenSnitch. В OpenSnitch заметный акцент сделан на интерактивном контроле исходящих соединений через графический интерфейс; также есть управление системным фаерволом и несколькими узлами. В OpenShield я делаю упор на локальную политику защиты хоста и работу через терминал, в том числе на серверах без графического окружения. Основной сценарий — собрать правила в режиме обучения, проверить их и перейти к фильтрации по явно разрешённым соединениям.

Отдельное внимание уделяется поведению при ошибках. В режиме Enforcing невозможность достоверно определить приложение не должна превращаться в разрешение трафика: неоднозначная атрибуция приводит к блокировке соответствующего пакета. При критических сбоях предусмотрен аварийный режим BlockAll. Изменять правила и режим работы может только root, а наблюдение доступно участникам группы openshield. Управление и мониторинг разделены между локальными Unix-сокетами с проверкой учётных данных клиента; сетевого управляющего API нет.

Демон и TUI написаны на Rust, в собственном коде запрещён unsafe. Дополнительно ограничены размеры сообщений, очереди и время обработки запросов, предусмотрены проверки сохранённого состояния и тесты поведения при перегрузке. Это не обещание отсутствия уязвимостей и не утверждение, что OpenSnitch небезопасен, а описание выбранных инженерных приоритетов. Обучение тоже не определяет, заслуживает ли приложение доверия: оно лишь фиксирует наблюдавшуюся активность, поэтому полученные разрешения необходимо проверять перед включением Enforcing.

Довольно продолжительное время было уделено производительности приложения, однако она пока остаётся слабым местом при большом количестве коротких соединений и интенсивном исходящем UDP-трафике, особенно состоящем из множества небольших пакетов. Здесь важнее не столько объём переданных данных, сколько количество пакетов и новых соединений, для которых требуется определить приложение.

Это связано со стоимостью проверки правил, привязанных к приложениям. Обычные сетевые правила — адреса, порты, протоколы и интерфейсы — обрабатываются непосредственно ядром через nftables или iptables. Если же решение требует проверки приложения, пакет передаётся демону через NFQUEUE. Демон устанавливает владельца сокета, проверяет идентичность процесса и сопоставляет её с условиями правила: путём исполняемого файла, cgroup, аргументами запуска и другими заданными признаками. Такая проверка существенно дороже сравнения адреса и порта.

Для TCP предусмотрено ускорение: после авторизации соединения его established-трафик может обрабатываться в ядре через conntrack с проверкой поколения политики. Поэтому длительное разрешённое TCP-соединение обычно обходится дешевле постоянного открытия новых. Для UDP, не разрешённого отдельным сетевым правилом, проверка приложения повторяется для каждого пакета, требующего прикладного решения. Именно этот сценарий особенно чувствителен к PPS: даже небольшой по мегабитам поток способен заметно загрузить демон и увеличить задержки. Используемые кеши ускоряют поиск владельца, но не заменяют проверку актуальности его идентичности безусловным повторным разрешением.

Я представляю первую публичную версию, где представлен основной набор функций приложения, над производительность ещё предстоит работать. В OpenSnitch механизм проверок проще, поэтому его работа не даёт подобной нагрузки на систему, возможно схожий режим появится и в OpenShield.

Приложение собирается для Debian 12 и 13, Ubuntu 22.04, 24.04 и 26.04, Fedora 43 и 44, AlmaLinux 9 и 10, Rocky Linux 9 и 10, openSUSE Leap 16.0, openSUSE Tumbleweed, Alpine Linux 3.23 и 3.24, а также Arch Linux. В зависимости от дистрибутива предусмотрены пакеты для x86_64 (amd64), 32-разрядного x86 (i586/i686), ARMv5, ARMv6, ARMv7, ARM64 (aarch64), PowerPC 64 LE (ppc64le), IBM Z (s390x) и RISC-V 64 (riscv64). Это общий перечень архитектур: не каждая комбинация дистрибутива и архитектуры входит в матрицу сборки.

Предрелизные проверки установки пакетов и функциональные тесты фаервола выполняются:

  • на x86_64 — для всех перечисленных дистрибутивов и версий;
  • на ARM64 — для всех перечисленных, кроме Arch Linux;
  • на 32-разрядном x86 — для Debian 12 и 13, AlmaLinux 10, Alpine Linux 3.23 и 3.24, openSUSE Tumbleweed.

Всего получается 37 комбинаций дистрибутива и архитектуры. Для каждой проверяются nftables и резервный iptables, включая обучение, переход в Enforcing и применение правил. Отдельный performance gate запускается на openSUSE Tumbleweed x86_64.

Для остальных архитектур пока выполняются сборка, проверка формата исполняемых файлов и пробный запуск --version; полноценного тестирования установки и фильтрации трафика на них нет. Контейнерные проверки также не означают проверку собственного ядра каждого дистрибутива.

Скачать и попробовать приложение можно по последнему актуальному тегу v0.2.4

Сильно не пинайте, буду благодарен за любые отзывы и комментарии.

Спасибо, что дочитали до конца.

unclestephen
()

Неочевидная штука systemd, suspend-then-hibernate, счетчик времени

 , , ,

Итак файл: /etc/systemd/sleep.conf

[Sleep]
AllowSuspend=yes
AllowHibernation=yes
AllowSuspendThenHibernate=yes
HibernateMode=platform shutdown
HibernateDelaySec=10min

В таком виде не работает. Т.е. ноут как бы засыпает, потом якобы уходит в гибернацию, но на деле у меня (Thinkpad X1 Carbon G8) жрёт 16% батарейки за сутки.

Если запустить вручную в терминале: systemctl suspend-then-hibernate, то плюётся ошибкой:

Call to SuspendThenHibernate failed: Sleep verb 'suspend-then-hibernate' is not configured or configuration is not supported by kernel

Выяснил, что в параметр HibernateDelaySec надо именно что вписывать integer, без постфиксов секунд, минут, и прочая.

Причём нигде в доках systemd я про это не нашёл.

Гадство в том, что некоторые другие тайм-параметры, например в юнитах, например OnBootSec - допускают префиксы.

Таким обазом, рабочий вариант такой:

[Sleep]
AllowSuspend=yes
AllowHibernation=yes
AllowSuspendThenHibernate=yes
HibernateMode=platform shutdown
HibernateDelaySec=600
kixx09
()

Вышла модель Deepseek v4 Vision Exp, ваш домашний opus 4.8 (почти)

 , ,

Тихо и незаметно вышла модель Deepseek V4 Vision Exp!

https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash-Vision-Exp

По архитектуре это тот же Deepseek V4 0731, но с добавлением computer vision.

Она чуть лучше показывает себя на бенчмарках чем предыдущий 0731, и чуть чуть хуже чем облачный поприетарный opus 4.8

BenchmarkDeepSeek-V4-Flash-Vision-ExpDeepSeek-V4-Flash-0731Opus-4.8
Text Agent Capabilities
Terminal Bench 2.183.982.785.0
NL2Repo57.754.269.7
Cybergym75.376.778.3
DeepSWE59.354.458.0
Toolathlon-Verified75.970.376.2
DSBench-Hard63.659.671.7
AutomationBench (Public)25.725.127.2
Multimodal Agent Capabilities
ApexBench (Pass@1)36.526.2*39.4
Agents’ Last Exam27.325.2*25.7
Chartography64.3—65.0
ZeroBench (Pass@5)35.0—34.0

* DeepSeek-V4-Flash-0731 в ApexBench и Agents’ Last Exam игнорировал мультимодальные элементы входа.

Для text-agent тестов DeepSeek использовал DeepSeek Harness в minimal mode, reasoning effort = max, temperature = 1.0, top_p = 0.95.

gagarin0
()

Больше игр — нативных и разных!

 , ,

Буквально несколько часов назад состоялся релиз занятного ретро-платформера с нативной поддержкой Linux — Gizmoduck («Уткоробот»), созданного на движке Godot.

Игра повествует о приключениях утки в супер-пупер-навороченном робокостюме из хорошо знакомой многим с детства мультвселенной.

Проект распространяется в виде легковесного исполняемого файла (58 МБ архив, 116 распакованный файл) без сторонних лаунчеров. Официальных требований разработчики не заявляли, но игра отлично завелась на мини-ПК с Intel N100, 12 ГБ RAM под управлением Debian 13. Из коробки поддерживаются геймпады, есть русский язык и внутриигровые достижения.

Пока игру можно скачать совершенно бесплатно. Где скачать, легко найти по названию. Приятной игры всем, кто надумает поиграть! :-)

nuxster
()

Выпуск gswitch 0.6.6, утилиты исправления текста в неверной раскладке

 , gswitch, , ,

Группа Open Source

Состоялся выпуск gswitch 0.6.6 – свободной утилиты для Linux (X11 и Wayland), которая по команде исправляет уже набранный текст в неверной раскладке. Программа не пытается угадывать язык во время ввода: пользователь сам запускает преобразование последнего слова, текста после последнего Enter или выделенного фрагмента.

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

>>> Репозиторий и релиз 0.6.6 (github.com)

arumata
()

Выпуск WinBtrfs 1.10, реализации файловой системы Btrfs для Windows

 , , , ,

Группа Open Source

После более двух лет разработки опубликован выпуск проекта WinBtrfs 1.10, развивающего драйвер для использования файловой системой Btrfs на платформе Windows. WinBtrfs не основан на коде Btrfs из ядра Linux, а является созданной с нуля альтернативной реализацией. Поддерживается работа с Windows XP и более новыми выпусками. Драйвер включён в состав операционной системы ReactOS и может применяться для загрузки Windows из раздела с Btrfs. Код написан на языках C/C++ и распространяется под лицензией LGPLv3.

WinBtrfs поддерживает большинство возможностей Linux-версии Btrfs, включая запись и чтение в асинхронном режиме, использование RAID0/1/10/5/6, кэширование, автообнаружение разделов, ACL, символические ссылки, подразделы, снапшоты, жесткие ссылки, разреженные файлы, упреждающее выделение места, сжатие, балансировку, проверку целостности данных, удаление и добавление накопителей, отправку и приём подразделов, изменение размера раздела, расширенные контрольные суммы (xhash, sha256, blake2). Из специфичных возможностей драйвера выделяется реализация альтернативных потоков данных и сопоставление идентификаторов пользователей Linux и Windows. Возможна конвертация существующих разделов NTFS в Btrfs.

Среди изменений в новой версии:

  • Добавлена поддержка записи битовых карт с информацией о свободном месте.
  • Реализована возможность сохранения мелких файлов в блоках с метаданными (inline) в сжатом виде.
  • Улучшена работа с извлекаемыми накопителями. Прекращена поддержка создания RAID-массивов на извлекаемых накопителях.
  • Повышена надёжность восстановления после ошибок, вызванных нехваткой оперативной памяти (OOM) или исчерпанием свободного места на накопителе (ENOSPC).
  • Устранены аварийные завершения, возникавшие при перемещении файлов между подразделами и при одновременном создании большого числа файлов.
  • Устранена ошибка, приводившая к повреждению дерева экстентов при записи снапшотов.
  • Исправлена взаимная блокировка при работе с жёсткими ссылками.
  • Проведён рефакторинг внутренних структур и констант для их приближения к вариантам, используемым в Linux.
  • При рецензировании изменений и разборе ошибок задействован AI-ассистент Claude, но код как и раньше создаётся исключительно вручную.

>>> Подробности на opennet (opennet.ru)

PunkPerson
()

Сообщалка: программа для общения в команде

 , , , ,

Группа Open Source

Так как меня не устраивали существующие мессенджеры для локальной сети, я написал свой. Если у кого-то ещё сходные требования, можете пользоваться.

Что умеет Сообщалка:

  • общий список всех сообщений от всех собеседников;
  • отбор сообщений по собеседнику или группе собеседников (группы добавляются и редактируются администратором);
  • отправка сообщений собеседнику или группе;
  • поиск по регулярному выражению;
  • просмотр сообщений за указанную дату или несколько дней перед датой;
  • позволяет отметить факт ознакомления с сообщением одним щелчком;
  • позволяет вставлять в сообщение изображения в любое место (как принято в письмах и как нет в мессенджерах);
  • позволяет цитировать сообщения (в том числе несколько в одном сообщении) и по щелчку переходить к процитированному;
  • позволяет редактировать отправленное сегодня сообщение и хранит историю;
  • серверная часть хранит сообщения в каталоге в виде читаемых файлов, изображения в одном экземпляре;
  • полностью переносима в рамках Windows/Linux/MacOS, работает на любой архитектуре процессора;
  • не имеет внешних зависимостей, кроме языка программирования Racket.

Что не умеет и вряд ли будет:

  • шифрование канала: если надо, можно ставить stunnel;
  • много пользователей: интерфейс на данный момент не предполагает прокрутку списка пользователей, но за счёт этого все данные на сервере в памяти и работает очень быстро;
  • вложение файлов: я считаю, что если файл нужен, то его надо выкладывать на файловый сервер и давать ссылку, а не превращать средство общения в хранилище файлов;
  • видео и аудио: если надо позвонить, логичнее кинуть ссылку на jitsi или что в команде принято.

>>> Исходники (gitflic.ru)

monk
()

Утилита rmd — от костыля sleep && notify-send к CLI-напоминалке для Linux

 , , , ,

Группа Open Source

Раньше я делал так:

(sleep 25m && notify-send "Пора выпить кофе") &

Пока терминал открыт и машина не ушла в сон — такая конструкция работает. Закрыл сессию, перезагрузился, ноутбук заснул на час — таймер исчез. Напоминание о звонке или о еде на плите в такой схеме слишком хрупкое.

Мне были нужны одноразовые напоминания, которые:

  • не пропадают после перезагрузки и спящего режима;
  • гарантированно привлекают внимание (через уведомления рабочего стола);
  • не тянут за собой канбан, проекты и «когда-нибудь».

Так появилась rmd — лёгкая CLI-утилита с фоновым демоном для Linux.

Интерфейс

Примеры вызова:

rmd +25m Пора выпить кофе
rmd tomorrow 15:00 Созвон по релизу
rmd fri 22:00 Заткнись и иди спать!
rmd 2026-12-01 10:00 Продление домена
rmd

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

Пример списка уведомлений

Просто напоминалка

Это не менеджер задач. Нет повторяющихся проектов, досок, списков «прочитать потом». Уведомления задуманы только для событий с дедлайном по времени: еда на плите, созвон через 10 минут, «выйти из дома».

Если нужен todo с проектами — это другой класс инструментов. У rmd намеренно более узкая специализация.

От sleep && notify-send отличается наличием:

  • фонового демона: systemd user service или автозапуск из CLI;
  • сохранения состояния: ~/.local/state/rmd/reminders.json — напоминания остаются после перезагрузки;
  • обработки пропущенных срабатываений: если машина была выключена, приходит одно сгруппированное уведомление.

Стек: Linux + notification daemon. Написано на Rust, без тяжёлого runtime вокруг одной утилиты.

Внутреннее устройство

CLI общается с демоном по Unix-сокету. Демон держит таймеры в памяти и атомарно пишет JSON на диск. В момент срабатывания уходит уведомление по D-Bus. При старте демон проверяет, не было ли пропусков, пока система была выключена.

Требования:

  • Linux (x86_64 или aarch64)
  • Демон уведомлений по D-Bus

macOS и Windows не поддерживаются.

Установка:

  • Исходники и описание: github/rmd
  • Бинарники: github/releases
  • Из crates.io: cargo install rmd-cli (бинарь называется rmd)

Альтернативы

Инструменты вроде at, cron, systemd timers и полноценных todo-менеджеров решают смежные задачи. Мне не хватало инструмента под узкий сценарий: ввёл время и текст в одной строке — получил гарантированное уведомление, которое не пропадёт после перезагрузки. Без аккаунта в облаке и без ежедневного ритуала «разобрать входящие».

Если вы тоже устали от sleep && notify-send и не хотите ради чайника заводить пятый таск-трекер — имеет смысл попробовать.

>>> Репозиторий на GitHub (github.com)

bunch
()

Нет удовольствия от программирования из-за ИИ

 

Статья

Я прочитал, значит вы тоже должны. Текст на 2-5 минут, интерес 95%.

Перемещено dataman из ai

AZJIO
()

Вышла open weight модель Qwen38-27b, пожалуй, новый дефолт для локальных домашних моделей!

 ,

Вышла Qwen3.8-27B — 27B dense, vision, 262K контекста и MTP

Qwen наконец выложили Qwen3.8-27B.

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

Модель dense, мультимодальная: понимает текст, изображения и видео. Из коробки заявлены coding, research, professional workloads и длинные agentic-задачи.

По архитектуре тоже есть интересные изменения.

Внутри:

  • 27B параметров;
  • hidden size 5120;
  • 64 слоя;
  • vocabulary / embedding — 248 320;
  • гибрид Gated DeltaNet + обычный Attention;
  • схема слоёв: 16 × (3 × DeltaNet → FFN + 1 × Attention → FFN);
  • FFN — 17 408;
  • MTP — Multi-Token Prediction, причём модель обучалась сразу с несколькими prediction steps.

То есть это уже не обычный Transformer, где на каждом слое приходится считать полноценный quadratic attention. Большая часть слоёв использует Gated DeltaNet, а классический attention появляется периодически.

Из практического интереса здесь ещё и MTP. Если inference-движки нормально его реализуют, это потенциально хороший источник дополнительной скорости при локальной генерации.

Контекст

Нативное окно — 262 144 токена.

До 1 000 000 токенов его можно расширить через YaRN. Причём сами Qwen отдельно предупреждают, что статический YaRN может немного ухудшать качество на коротком контексте и рекомендуют включать scaling только тогда, когда он действительно нужен.

Для 524K, например, они рекомендуют factor=2.0, а для миллиона — factor=4.0.

Это приятная деталь: вместо привычного «у нас миллион токенов» мелким шрифтом прямо написано, как этот миллион получается и какие у него есть компромиссы.

Thinking mode

По умолчанию модель работает с reasoning включённым и пишет reasoning в <think>...</think>.

Есть три официальных уровня:

  • xhigh — максимальное рассуждение, используется по умолчанию;
  • medium — баланс скорости и качества;
  • low — упор на скорость.

Thinking можно полностью отключить.

Ещё появилась интересная штука preserve_thinking: модель по умолчанию сохраняет reasoning из предыдущих сообщений в многоходовом диалоге. В первую очередь это рассчитано на агентов, чтобы модель не начинала каждый следующий шаг размышлять над задачей заново.

А теперь цифры

Официальная таблица Qwen выглядит довольно бодро:

BenchmarkQwen3.8-27BQwen3.6-27BQwen3.7-PlusMuse Glimmer-30BOpus 4.6 Max
Terminal Bench 2.173.063.464.051.778.2
SWE-bench Pro61.753.557.651.253.4
NL2Repo-Bench42.336.241.1—47.6
DeepSWE 1.142.213.314.2——
QwenSWEBench79.049.359.2—63.8
CoWorkBench70.761.065.1—68.2
JobBench33.421.827.6——
IFBench79.569.179.177.062.5
GPQA Diamond89.287.890.383.591.3
HLE30.824.034.722.040.0
LiveCodeBench v690.383.989.6—88.8

Для 27B особенно впечатляют результаты по coding.

SWE-bench Pro — 61.7, DeepSWE 1.1 — 42.2, QwenSWEBench — 79.0, LiveCodeBench v6 — 90.3.

Причём это не только задачки вида «напиши функцию сортировки». В таблице отдельно есть repo-level code generation, software engineering и agentic terminal coding.

Vision и computer use

Поскольку модель изначально vision-language, есть отдельная пачка мультимодальных тестов:

BenchmarkQwen3.8-27BQwen3.6-27BQwen3.7-PlusMuse Glimmer-30BOpus 4.6 Max
OSWorld-Verified84.363.973.365.972.7
WebArena-Verified64.848.855.3——
AndroidWorld81.970.381.0—62.0
RecreationBench47.129.830.2——
SWE-MM38.625.730.0—27.1
Vision2Web62.945.042.1——
OmniDocBench 1.591.189.491.475.886.6
RealWorldQA85.984.186.9—73.9
ERQA65.562.569.8—40.8

OSWorld 84.3, WebArena 64.8 и AndroidWorld 81.9 намекают, что модель довольно серьёзно затачивали не просто на чат, а именно на работу агентом с интерфейсами, браузером и приложениями.

Плюс она умеет непосредственно принимать видео. В документации есть отдельный пример работы с video_url, а для длинных видео предусмотрена настройка частоты выборки кадров. Разработчики прямо говорят про обработку видео продолжительностью порядка часа.

Поддержка на старте заявлена для Transformers, vLLM, SGLang и TokenSpeed.

Ждём GGUF :)

Модель:

https://huggingface.co/Qwen/Qwen3.8-27B

gagarin0
()

Ограничиваем сертификат Минцифры

 , ,

Сейчас многие российские сайты, в первую очередь сайты банков, перешли (не по своей воле, но тем не менее) на использование УЦ, которые контролируются Правительством Российской Федерации. Корневые сертификаты этих УЦ (в просторечье - «сертификаты Минцифры»), как правило, по умолчанию не включаются в списки доверенных стандартными иностранными ОС и браузерами. Что будет, если мы их туда включим?

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

Lrrr
()

VNC с буфером обмена, звуком и микрофоном: x-combo-remote

 , , ,

А точнее скрипт, который позволяет удобно запускать обычный VNC и другие приложения, предоставляющие функциональность, которой не хватает в VNC.
Всё сетевое взаимодействие завёрнуто внутрь SSH. Это значительно сужает настройку firewall и прочие вопросы безопасности.

Я был бы рад найти в Интернете такой скрипт ещё несколько лет назад. Но его там нет. По этому я написал его сам и выложил. Наверняка я не последний, кто будет это искать.

Да, я знаю про открытый RustDesk и проприетарный AnyDesk, но всё равно мне нравится VNC. Мне нравится делать вручную, и всё контролировать, понимая как оно работает, а не верить что одно большое умное приложение не сломается. «Одна программа — одна задача». GNU/Linux для меня искусство, а не бездушный инструмент.

Пишите, кто что думает об этой поделке.

Скачать скрипт:
[GitHub] [GitVerse]

IASIVAn
()

Комплекс Физических Программ / Makarov Physics Suite

 , , ,

Выложил исходники программы по моделированию физических процессов, которую разработал на втором курсе вуза (в 2004 году):

https://github.com/makarov-mm/MakarovPhysics

--------------------------

Также в открытом доступе некоторое количество программ по физике:

https://buymeacoffee.com/makarovmm/posts

--------------------------

Видео свежей разработки (не опенсорс):

https://www.youtube.com/watch?v=3L69oUlDxOE

( ещё )

makarov
()

Особенности гейминга под Linux

 , , ,

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

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

altwazar
()