Короче говоря вам важно оптимизировать под размер, если я правильно понял.
Это однако не означает, что Zig вам не подходит. Я не программист, но из того что я читал про него, это такой современный C, который в том числе прозрачно с C взаимодействует и позволяет собирать его проекты. Как я понимаю, zmx такой большой потому что работает через libghostty-vt, внутри всё-таки эмулируя терминал. А ему для этого дофига всего надо, например парсить юникод. Вот отчёт клода с анализом:
Что вносит основной вклад в размер (881Ki ReleaseSmall)
.text — 538Ki (61%)
┌──────────────────────────────┬─────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Источник │ ~Размер │ Причина │
├──────────────────────────────┼─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ghostty: terminal.* │ ~170Ki │ Terminal emulator: PageList, Screen, OSC parser, Stream, formatter — весь ghostty-vt │
├──────────────────────────────┼─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ log.scoped инстанциации │ ~125Ki │ 127Ki из одного ghostty terminal/stream — каждый log.warn("...", .{}) с уникальной format-строкой = отдельная скомпилированная функция (Zig comptime) │
├──────────────────────────────┼─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ std.debug (panic/stacktrace) │ ~70Ki │ DWARF reader (debug.Dwarf.ElfModule.load = 26Ki), stack unwinder, panic machinery. Тянется из-за того что binary linked с libcxx │
├──────────────────────────────┼─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ zmx: main.* │ ~60Ki │ Собственный код daemon, attach, list │
├──────────────────────────────┼─────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ std (fmt, collections) │ ~65Ki │ std.fmt, ArrayHashMap, etc. │
└──────────────────────────────┴─────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
.rodata — 227Ki (26%)
┌───────────────────────────────┬────────┬─────────────────────────────────────────────────────┐
│ Источник │ Размер │ │
├───────────────────────────────┼────────┼─────────────────────────────────────────────────────┤
│ props.Tables.stage2 (Unicode) │ 61Ki │ Unicode property lookup table (ghostty-vt) │
├───────────────────────────────┼────────┼─────────────────────────────────────────────────────┤
│ props.Tables.stage1 (Unicode) │ 16Ki │ Второй уровень таблицы │
├───────────────────────────────┼────────┼─────────────────────────────────────────────────────┤
│ simdutf lookup tables │ ~30Ki │ UTF-8/UTF-16 SIMD conversion tables │
├───────────────────────────────┼────────┼─────────────────────────────────────────────────────┤
│ format strings & strings │ ~120Ki │ Строковые литералы (в т.ч. от 155 log-инстанциаций) │
└───────────────────────────────┴────────┴─────────────────────────────────────────────────────┘
.eh_frame — 53Ki (6%)
C++ exception unwinding frames. Приходят от linkage с libcxxabi + libunwind (которые ghostty-vt тянет из-за SIMD C++ кода). Этот оверхед есть всегда при смешивании Zig + C++.
.data.rel.ro — 37Ki (4%)
Таблицы виртуальных функций C++ (vtables) из libcxxabi. Нужны для C++ exceptions / RTTI в simd/*.cpp.
---
Итоговая картина зависимостей
ghostty-vt (~65% размера)
├── terminal/* Zig code ~170Ki .text (VT emulator core)
├── unicode property tables ~80Ki .rodata (Unicode lookup tables)
├── log.scoped инстанциации ~125Ki .text (ghostty's logging в stream.zig)
└── simd/ C++ (simdutf, highway) ~40Ki .text + C++ overhead:
├── .eh_frame 53Ki (C++ unwind frames)
└── .data.rel.ro 37Ki (C++ vtables/RTTI)
std.debug / panic machinery ~70Ki .text (DWARF reader для stacktrace)
cxa_demangle (libcxxabi) ~132Ki VM (C++ name demangler — для panic demangling)
zmx own code ~60Ki .text
Главные выводы
1. Доминирует ghostty-vt: ~65% бинарника. Это цена за использование полноценного VT эмулятора.
2. log.scoped(.stream).warn — 127Ki сюрприз. В ghostty terminal/stream.zig множество log-вызовов, каждый с уникальной строкой → Zig генерирует отдельную функцию на каждый. Это называется "log bloat" от comptime-инстанциации.
3. C++ overhead (libcxxabi + libunwind + .eh_frame + .data.rel.ro) = ~280Ki — неизбежная стоимость использования simd/*.cpp из ghostty, который тянет C++ runtime.
4. std.debug = ~70Ki — DWARF reader для красивых panic stacktrace. Без него было бы меньше.
Если бы вы писали atch на zig, размер бинарника вышел бы примерно как сейчас.
$ time zig build -Doptimize=ReleaseSmall
real 0m56,688s
user 3m11,146s
sys 0m22,207s
$ ls -l zig-out/bin/
total 884
-rwxrwxr-x 1 self self 901600 2026-03-07 18:38 zmx
Да и в вашем выводе 130K - это уже не килобайтики, а весомые сотни килобайт. Да, собирается не быстро (atch ещё не пробовал собирать, так что не могу сравнить).
Ок, atch поменьше, зато у zmx язык моднее-безопаснее и звёзд у репы на порядок больше. Но все эти критерии мало что говорят и выбора я пока для себя не сделал.
Но можно и не заниматься такой вознёй, а слать со своих прогулок фоточки своему партнёру и получать в ответ сердечки и пожелания круто оторваться. Тоже доступная опция!
Главное отличие - сервер сессий уже есть в поставке.
А что это такое?
Отсутствие конфликтов прокруток и выделений — очень солидный аргумент! Я честно говоря считал решение этого практически невозможным. Что обязательно какой-нибудь sixel отвалится.
С другой стороны насколько я знаю tmux прозрачно интегрируется с iTerm (но я сам маки обхожу за километр)
У zellij конфиг выглядит как нормальный конфиг - key, value и набор вложенных лэйаутов в формете близком к json
Что только люди ни придумают лишь бы TOML не использовать (
Манов по настройке и дефолтного конфига, в который можно было бы заглянуть за опциями в поставке tmux не имется, насколько мне известно.
man tmux. Дефолтные параметры смотреть типа такого: Run tmux show-options -g for session options and tmux show-window-options -g for window options.
Ну значит тем больше аргументов голосовать за пиратскую партию, если она есть в вашей стране.
Или рассказывать окружающим о проблемах.
Все сейчас решённые социальные проблемы осознавались как проблемы сначала небольшой долей людей. Так что в принципе, пусть иногда, но малое количество соратников — не приговор.
Ну и это, господа айтишники, давайте подумаем, как мы можем противостоять чрезмерной миграции вебаппов в мобильные приложения. Например:
Можно посмотреть, может какое-то из установленных у вас приложений можно заменить на [ярлык на] вебсайт
Может показать кому-то из знакомых, что использование вебсайта вместо приложения даёт дополнительный контроль
Может в своей рабочей среде при принятии решения будет ли сделан вебсайт или мобильное приложение вы можете озвучить этические аргументы против мобильного приложения
Ещё один недостаток мобильных приложений по сравнению с вебсайтами — отсутствие контроля. В случае вебсайта легко скрыть лишние элементы вебсайта с помощью uBlock, слегка изменить в чём-то его работу или добавить недостающую именно тебе функцию через Tamper Monkey. Сейчас, с появлением LLM, сделать такие модификации вебсайта стало особенно легко.
Есть несколько механизмов, которые будут этому препятствовать:
У них будет в принципе гораздо меньше клиентов, кто хочет купить в последний день/втридорога. Сейчас к ним обращаются от безысходности: билеты в продаже кончились. А в моей схеме большинство их потенциальных клиентов сами себе купят на аукционе билет в один из первых дней, пока дешевле.
Непонятно как посетителю иметь высокую гарантию, что перекуп продал билет только ему одному и он не окажется на входе в ситуации, что кто-то по билету уже вошёл. За уменьшение рисков можно и чуть заплатить больше.
Если есть задача бороться с перекупами ещё сильнее, то см.
Или продавать билеты только на кошельки, на которых есть выдаваемый гос. органами NFT условно "паспорта", для которого государство гарантирует, что один человек больше одного такого NFT не получит.
И без опции "передать NFT билета другому владельцу". Только вариант отказаться вернув в общий пул и получив назад что заплатил.
Им бессмыленно участвовать в аукционе в первый день продаж, когда нужно заплатить на 5% участника с самой низкой ставкой, чтобы перекупить билет, потому что гипотетический клиент скальпера, который раньше к нему обращался за билетом, потому что билеты в свободной продаже быстро кончались, лучше сам поучаствует в аукционе в первые дни аукциона.
И тем более скальперу бессмысленно покупать билет в последний день, когда нужно заплатить x10 от минимальной ставки.
GUI жрёт лишних 100MB RAM. Вот на выбор экономнее:
Вариант через cvlc внезапно на моих тестах оказался самым экономичным по RAM.
Короче говоря вам важно оптимизировать под размер, если я правильно понял.
Это однако не означает, что Zig вам не подходит. Я не программист, но из того что я читал про него, это такой современный C, который в том числе прозрачно с C взаимодействует и позволяет собирать его проекты. Как я понимаю, zmx такой большой потому что работает через libghostty-vt, внутри всё-таки эмулируя терминал. А ему для этого дофига всего надо, например парсить юникод. Вот отчёт клода с анализом:
Если бы вы писали atch на zig, размер бинарника вышел бы примерно как сейчас.
При ReleaseSmall zmx меньше мегабайта:
Да и в вашем выводе 130K - это уже не килобайтики, а весомые сотни килобайт.
Да, собирается не быстро (atch ещё не пробовал собирать, так что не могу сравнить).
Ок, atch поменьше, зато у zmx язык моднее-безопаснее и звёзд у репы на порядок больше. Но все эти критерии мало что говорят и выбора я пока для себя не сделал.
Любопытно сравнить с другим вышедшим только что исследованием https://www.anthropic.com/research/labor-market-impacts
https://github.com/neurosnap/zmx видели?
Недавно появился и как я понимаю тоже с намерением сделать как dtach, но лучше.
Как такие смартфоны искать?
Сборка для F-Droid страдала от похожих проблем недавно: https://gitlab.com/relan/fennecbuild/-/issues/134
Тогда нашли workaround.
хорошо бы зарепортить вашу ситуацию куда-то
Сборка для F-Droid страдала от похожих проблем недавно: https://gitlab.com/relan/fennecbuild/-/issues/134
хорошо бы зарепортить вашу ситуацию куда-то
Но можно и не заниматься такой вознёй, а слать со своих прогулок фоточки своему партнёру и получать в ответ сердечки и пожелания круто оторваться. Тоже доступная опция!
Было бы неплохо уточнить OpenStreetMap о проверенных таксофонах.
Сейчас OSM знает в РФ 4643 общественныamenity=telefoneх телефона: https://overpass-turbo.eu/s/2eIN
Тег amenity=telefone
Поправите?
И это WebP, который уже лет 5 назад стал мейнстримом! Пора JPEG XL поддерживать.
feh, конечно, открывает.
xli заброшен и не развивается, постепенно вымывается из репозиториев. Переходите на feh.
А pqiv попробую посмотреть. Это вроде geeqie?
А что это такое?
Отсутствие конфликтов прокруток и выделений — очень солидный аргумент! Я честно говоря считал решение этого практически невозможным. Что обязательно какой-нибудь sixel отвалится.
С другой стороны насколько я знаю tmux прозрачно интегрируется с iTerm (но я сам маки обхожу за километр)
Что только люди ни придумают лишь бы TOML не использовать (
man tmux. Дефолтные параметры смотреть типа такого:Run
tmux show-options -gfor session options andtmux show-window-options -gfor window options.Я попробовал почитать обзоры zellij но не увидел в них конкретных примеров преимуществ над tmux. Ну хоткеи discoverable - так я уже tmux запомнил
Можете привести пример чем пользуетесь?
Не надо zellij: он потребляет RAM на порядок с лишним больше, чем tmux.
Ну значит тем больше аргументов голосовать за пиратскую партию, если она есть в вашей стране.
Или рассказывать окружающим о проблемах.
Все сейчас решённые социальные проблемы осознавались как проблемы сначала небольшой долей людей. Так что в принципе, пусть иногда, но малое количество соратников — не приговор.
Ну и это, господа айтишники, давайте подумаем, как мы можем противостоять чрезмерной миграции вебаппов в мобильные приложения. Например:
Можно посмотреть, может какое-то из установленных у вас приложений можно заменить на [ярлык на] вебсайт
Может показать кому-то из знакомых, что использование вебсайта вместо приложения даёт дополнительный контроль
Может в своей рабочей среде при принятии решения будет ли сделан вебсайт или мобильное приложение вы можете озвучить этические аргументы против мобильного приложения
Ещё один недостаток мобильных приложений по сравнению с вебсайтами — отсутствие контроля. В случае вебсайта легко скрыть лишние элементы вебсайта с помощью uBlock, слегка изменить в чём-то его работу или добавить недостающую именно тебе функцию через Tamper Monkey. Сейчас, с появлением LLM, сделать такие модификации вебсайта стало особенно легко.
Есть несколько механизмов, которые будут этому препятствовать:
У них будет в принципе гораздо меньше клиентов, кто хочет купить в последний день/втридорога. Сейчас к ним обращаются от безысходности: билеты в продаже кончились. А в моей схеме большинство их потенциальных клиентов сами себе купят на аукционе билет в один из первых дней, пока дешевле.
Непонятно как посетителю иметь высокую гарантию, что перекуп продал билет только ему одному и он не окажется на входе в ситуации, что кто-то по билету уже вошёл. За уменьшение рисков можно и чуть заплатить больше.
Если есть задача бороться с перекупами ещё сильнее, то см.
И без опции "передать NFT билета другому владельцу". Только вариант отказаться вернув в общий пул и получив назад что заплатил.
Не понял вашу мысль совсем.
Скальперам в моей схеме места нет.
Им бессмыленно участвовать в аукционе в первый день продаж, когда нужно заплатить на 5% участника с самой низкой ставкой, чтобы перекупить билет, потому что гипотетический клиент скальпера, который раньше к нему обращался за билетом, потому что билеты в свободной продаже быстро кончались, лучше сам поучаствует в аукционе в первые дни аукциона.
И тем более скальперу бессмысленно покупать билет в последний день, когда нужно заплатить x10 от минимальной ставки.