henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2020-08-20 12:28 am
Entry tags:

Man pages

З огидою гортавши man-сторінку mpv(1), я вирішив порівняти її гаргантюажний розмір з іншими пакетами.

20 найтовстіших man сторінок на 32й федорі:

man/man3/Image::ExifTool::TagNames.3pm  609
man/man1/ffmpeg-all.1                   482
man/man1/cabal.1                        403
man/man1/ffprobe-all.1                  389
man/man1/ffplay-all.1                   385
man/man1/gcc.1                          347
man/man1/g++.1                          347
man/man1/perltoc.1                      307
man/man1/ffmpeg-filters.1               273
man/man7/cmake-modules.7                249
man/man1/mpv.1                          219
man/man1/hg.1                           213
man/man1/perlapi.1                      153
man/man3/Net::SSLeay.3pm                152
man/man7/systemd.directives.7           149
man/man1/gm.1                           149
man/man1/mplayer.1                      147
man/man1/mencoder.1                     147
man/man5/smb.conf.5                     146
man/man1/perluniprops.1                 134

Колонка сліва означає кількість постскрíптових letter-size сторінок.

У списку є відсутній пакет lapack, який завойовував б призові місця (сотні однакових файлів по 535 сторінок), але додав б нічого, крім сміття. Мені здається що людина, яка їх генерувала, зловісно посміхалася у процесі. Таких man pages я ще не бачив:

Надрукувати свій список для лайнаксу або bsd можна взявши цього мейкфайлу та сказавши make en=1 n=20

$ cat Makefile
en :=
n := 50
d := /usr/share/man /usr/local/share/man
out := _out

all: $(out)/man-stat.txt
    sort -n -k2 -r $< $(if $(en),| grep man/) | head -$(n) | column -t

$(out)/man-stat.txt:
    @mkdir -p $(dir $@)
    find $(d) -type f | sed 's/$$/._/g' | grep -iv lapack | xargs $(MAKE) --no-print-directory > $@

$(out)/man-stat.sh: Makefile; @echo "$$man_stat" > $@
%._: $(out)/man-stat.sh; @sh $< $*

export define man_stat :=
[ -r "$$1" ] || exit 1

pages() {
    local o=-Tps; [ `uname` != "Linux" ] && o=-t # bsd
    man $$o "$$1" 2>/dev/null | awk '/^%%Pages/ {m=$$2} END {print m}';
}
name() { echo "$$1" | awk -F/ '{n = split($$0, r, "/"); sub("\\.gz$$", "", r[n]); printf "%s/%s/%s", $$(NF-2), $$(NF-1), r[n]}'; }

[ -z "$$MAKELEVEL" ] || echo $$1 1>&2
echo `name "$$1"` `pages "$$1"`
endef

Спочатку воно має порахувати (та запам'ятати) кількість ps-сторінок для кожної man page, тому перший запуск буде довгий.

Роздивляючись результат під fbsd 12, я помітив, що fbsd використовує не стандартний лайнаксний man-db, а mandoc, у якого тече пам'ять при генеруванні ps/pdf для man-сторінки objdump (~700MB).

mandoc--то є цікавий німецький проекта, який ув 2020 використовує cvs. 1 з їх мейнтейнерів мене суворо попередив, щоб я більше не смів слати патчі, де замість табс були спейсес, а на мою ремарку про openbsd'шний сіскол pledge почав слати мені ютубні презентації Тео де Раадта.

Наразі, транк mandoc'а продовжує мати витік пам'яті, і якщо ви побачите онлайнівські man page viewers, де можна отримати pdf, то... (Ну, ви понялі.)

Я, звичайно, миттєво побіг робити це з онлайновим fbsd в'ювером, але, на жаль, їм щось відомо, так як для генерації pdf вони використовують groff.


Post a comment in response:

If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting