<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dw="https://www.dreamwidth.org">
  <id>tag:dreamwidth.org,2011-04-06:733589</id>
  <title>henry_flower</title>
  <subtitle>henry_flower</subtitle>
  <author>
    <name>henry_flower</name>
  </author>
  <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/"/>
  <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom"/>
  <updated>2026-05-20T18:30:45Z</updated>
  <dw:journal username="henry_flower" type="personal"/>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:529090</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/529090.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=529090"/>
    <title>3D віртуальних мошин та персистенція Деб'яну</title>
    <published>2026-05-20T18:30:45Z</published>
    <updated>2026-05-20T18:30:45Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Випадково помітив як те, що обіцяли 2 роки тому, справдилосі:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mesa Venus serializes Vulkan instructions on guest &amp;amp; sends them to
host, which means GPU accelerated Vulkan on QEMU VMs, without GPU
passthrough. Venus is same as VirGL, except it uses Vulcan instead
of OpenGL.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Одного дня ви прокинетеся і побачите як слопгазети напередодні
написали що ваша ОС більше не збирається тягати бібліотеки opengl, а
3d аватар полетівшого на луну Джона Кармака зазначить що &amp;#39;ганебна
інерція&amp;#39; була єдиною причиною за якою люди не полишили opengl 10 років
тому, але пізно є краще аніж ніколи.&lt;/p&gt;
&lt;p&gt;Щоб мати працюючий компóзітор ув VM раніше робили або gpu passthrough
до QEMU, або користувалися vmware ws, яка мала звичку залиппппати на
amdgpu з увімкненою 3d акселерацією. З QEMU без окремого gpu для
кожної VM залишалося сумувати.&lt;/p&gt;
&lt;p&gt;Але зараз всі негаразди є позаду! Попереду--захопливі часи, якщо
guest+host є лайнакс (&lt;em&gt;we got both kinds: country &amp;amp; western&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Ви коли-небудь тестуєте інші дістро? Дивитеся на колотнечу ув
сусідньому таборі? Зазвичай є live iso, але як їх швидко подивитися
без створення VM, чи записування того .iso на usb драйва?&lt;/p&gt;
&lt;p&gt;Сучасний QEMU емулює фіктивного дівайса, який називається
virtio-gpu. Зі свіжими (4-річної давнини) драйверами mesa на обох host
та guest, свіжим кернелом (4-річної давнини) та свіжим графічним
тулкітом (gtk3 4-річної давнини), guest використовує по протоколу
virgl host&amp;#39;овий gpu для акселерації opengl. Зі сторони host&amp;#39;а йому
відповідає бібліотека virglrenderer.&lt;/p&gt;
&lt;p&gt;Майбутній світ opengl не використовує, а наполягає на vulkan. Якщо
зійти з теми та згадати що рік тому llama.cpp отримала підтримку
останнього, після чого навіть найпростіші інтегровані gpu стали у
кілька разів швидше за cpu поряд стріляти токенами (якщо користувач
для того має вдосталь ram), то заперечувати його корисність стає
складно.&lt;/p&gt;
&lt;p&gt;Нові дістро, окрім virgl, підтримують також venus, який працює за тією
самою схемою, але акселерує vulkan замість opengl.&lt;/p&gt;
&lt;p&gt;Перевірити це можна так:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(host) $ (. /etc/os-release &amp;amp;&amp;amp; echo $PRETTY_NAME)
Fedora Linux 44 (Forty Four)

(host) $ alias qemu3d=&amp;#39;qemu-system-x86_64 -enable-kvm -m 4G \
    -device virtio-vga-gl,hostmem=2G,blob=true,venus=true \
    -display gtk,gl=on&amp;#39;

(host) $ qemu3d debian-live-13.5.0-amd64-xfce.iso
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Тест opengl:&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/_F9eOhqCvJU?si=5E8drheJ6NFh8VK4" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;

&lt;p&gt;То є вікно віртуальної мошини, а не хоста. Водичка морська там є не
відео, а рендер шейдера за допомогою хостового gpu. Якщо ви думаєте що
нічого особливого ув тому немає (біґ діл, комп&amp;#39;ютери зараз швидкі),
спробуйте прибрати &amp;quot;&lt;code&gt;-device virtio-vga-gl,…&lt;/code&gt;&amp;quot; і подивіться скільки fps
воно намалює (підказка: жалюгідну цифру).&lt;/p&gt;
&lt;p&gt;Синтетичний тест vulkan можна зробити&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(guest) $ vkmark --fullscreen -b texture
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;і подивитися з &lt;code&gt;-D $UUID&lt;/code&gt; (&lt;code&gt;vkmark -L&lt;/code&gt; друкує списка всіх gpu) на
різницю з software рендеринґом, але до RL це відношення мати не
буде. Наприклад,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(host) $ GSK_RENDERER=vulkan gtk4-demo --run gears
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;запускається без проблем, але робить coredump ув guest.&lt;/p&gt;
&lt;p&gt;Більш цікавий тест буде з іграшкою &lt;a href="https://github.com/supertuxkart/stk-code/releases"&gt;supertuxkart&lt;/a&gt;, яка отримала
підримку vulkan кілька років тому.&lt;/p&gt;
&lt;p&gt;Після розпакування .tar.gz:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(guest) $ ./run_game.sh --render-driver=vulkan \
    --screensize=1920x1080 -f --benchmark
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;якщо fps буде &amp;gt;= частоти оновлення монітора, venus працює.&lt;/p&gt;
&lt;h3&gt;Персистенція live iso&lt;/h3&gt;
&lt;p&gt;Недолік більшості live дістро полягає ув їх ефемерності: як тільки
знищити QEMU процеса, всі налаштунки VM зникають. Деб&amp;#39;ян вміє робити
оверлей / з додатковим партішоном на справжньому hardware, проте ув
середині .iso ніякого writable додаткового партішона немає, тому
оверйлеїть там є ні з чим.&lt;/p&gt;
&lt;p&gt;Якщо підготувати lol.qcow2 хфайла, який (а) має хфайлову систему з
лейблом &lt;em&gt;persistence&lt;/em&gt;, та (b) хфайла persistence.conf на тій хфайловій
системі, то з&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(host) $ qemu3d -hda debian.iso -hdb lol.qcow2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;така VM стане майже справжньою. Тобто не стане, тому що доведеться ще
змінити &lt;code&gt;boot/grub/grub.cfg&lt;/code&gt; всередині .iso, але як ви то зробите,
коли loop дівайса буде змонтований ув read-only? Суто лайнакський
винахід, де замінюють одні 12 байт на інші 12 байт:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(host) $ export LANG=C
(host) $ sed -i &amp;#39;s/splash quiet/persistence /;s/quiet splash/persistence /&amp;#39; \
    debian.iso
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Варіянт божевільних (мій улюблений): додати ext4 партішона до
.iso. Тоді такий деб&amp;#39;ян можна таскати як однохфайлову VM або зdd&amp;#39;їти
її на usb драйва і ув обох випадках отримати персистенцію. Скрипта&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(host) $ ./mdlip 2G debian-live-13.5.0-amd64-xfce.iso new.iso
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;додає 2GB до копії оригінального .iso та підготовлює ті гігабайти ув
манері lol.qcow2. На жаль, менше за 38 рядків не вийшло:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

set -e

eh() { echo &amp;quot;mdlip error: $*&amp;quot; 1&amp;gt;&amp;amp;2; exit 1; }
cc() { for c; do command -v &amp;quot;$c&amp;quot; &amp;gt; /dev/null || { eh &amp;quot;no $c&amp;quot;; }; done; }

cc file sfdisk mkfs.ext4

size=$1; in=$2; out=$3

[ $# = 3 ] || eh &amp;#39;Usage: mdlip SIZE in.iso out.iso&amp;#39;
[ &amp;quot;`file -b --mime-type &amp;quot;$in&amp;quot;`&amp;quot; = application/x-iso9660-image ] || eh &amp;#39;bad .iso&amp;#39;
echo &amp;quot;$size&amp;quot; | grep -qxE &amp;#39;[0-9]+[MG]?&amp;#39; || eh &amp;quot;invalid SIZE&amp;quot;

export LANG=C
out_dir=`dirname &amp;quot;$out&amp;quot;`
tmp_dir=`mktemp -d &amp;quot;$out_dir/mdlip.XXXXXX.tmp&amp;quot;`
echo / union &amp;gt; &amp;quot;$tmp_dir&amp;quot;/persistence.conf
iso=&amp;quot;$tmp_dir.iso&amp;quot;

trap &amp;#39;rm -rf $tmp_dir $iso&amp;#39; 0 1 2 15

# STEP 1: replace bytes inside (hopefully) boot/grub/grub.cfg &amp;amp; resize the image
sed &amp;#39;s/splash quiet/persistence /;s/quiet splash/persistence /&amp;#39; &amp;lt; &amp;quot;$in&amp;quot; &amp;gt; &amp;quot;$iso&amp;quot;
truncate -s +&amp;quot;$size&amp;quot; &amp;quot;$iso&amp;quot;

# STEP 2: convert free space into a partition
sfdisk -F &amp;quot;$iso&amp;quot; | tail -1 |
    awk &amp;#39;{printf &amp;quot;start=%s, size=%s, type=L\n&amp;quot;, $1, $3}&amp;#39; |
    sfdisk -q --append &amp;quot;$iso&amp;quot;

# STEP 3: create a filesystem &amp;amp; copy a .conf file to it
set -- `sfdisk -l &amp;quot;$iso&amp;quot; | tail -1 | awk &amp;#39;{print $2, $4}&amp;#39;`
mkfs.ext4 -q -L persistence -E offset=$(($1 * 512)) -d &amp;quot;$tmp_dir&amp;quot; &amp;quot;$iso&amp;quot; \
          $(($2 * 512 / 1024))

mv &amp;quot;$iso&amp;quot; &amp;quot;$out&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Якщо потім виявиться що 2GB було замало, можна завжди додати більше:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(host) $ truncate -s +2G new.iso
(host) $ echo &amp;#39;, +&amp;#39; | sfdisk -N 3 new.iso
(guest) $ sudo resize2fs /dev/sda3
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=529090" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:528775</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/528775.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=528775"/>
    <title>Jargon File</title>
    <published>2026-04-07T17:52:04Z</published>
    <updated>2026-04-07T17:52:04Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>1</dw:reply-count>
    <content type="html">&lt;p&gt;Колись був такий чималенький хфайла &lt;a href="http://catb.org/~esr/jargon/oldversions/jarg447.txt"&gt;jarg447.txt&lt;/a&gt;, який містив
дефініції слів &lt;em&gt;micros~1&lt;/em&gt; чи &lt;em&gt;ken&lt;/em&gt; та загальний опис емайтішних
хакерів, їх поведінку, розваги і погляди на життя.&lt;/p&gt;
&lt;p&gt;З тих часів, коли я його листав (&amp;gt; 20 тому), змінилося майже все, а
меінтейнер хфайлу--Ерік Реймонд (який, до речі, хоча є і маґа, але не
любить Московію)--не оновлював його з 2003 року.&lt;/p&gt;
&lt;p&gt;Я згадав про хфайла жаргонів, коли намагався пригадати як називають
software тіпів, яким є байдуже на hardware:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./jargon softy
softy: n.

   [IBM]  Hardware  hackers&amp;#39;  term  for a software expert who is largely
   ignorant of the mysteries of hardware.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Це ж я! Ну, за вийнятком &amp;#39;іксперт&amp;#39;.)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;jarg447.txt&lt;/em&gt; чомусь залишається ув iso-8859-1, напевно тому шо ув
2003 ще не вийнашли UTF8, а уйоб-версія видає&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -Is http://www.catb.org/~esr/jargon/html/S/support.html | grep type
content-type: text/html; charset=utf-8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;хоча сторінки також залишаються ув iso-8859-1. Сучасні бовзери
вибирати кастомне кодування сторінки не дозволяють і все виглядає
поламаним та занедбаним.&lt;/p&gt;
&lt;p&gt;Після iconv залишається питання як шукати терміни, тому що вгадати
довжену конь тексту для grep там є неможливо:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:term: pronunciation\n\n   def
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(довжина &lt;em&gt;def&lt;/em&gt; є довільна)&lt;/p&gt;
&lt;p&gt;awk дозволяє змінювати роздільники, наприклад, замість &amp;#39;\n&amp;#39;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BEGIN { RS = &amp;quot;\n\n:&amp;quot; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;де залишається тоді тільки домовитися на чому робити match:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat jargon
#!/usr/bin/awk -f

function eh(s) { print s &amp;gt; &amp;quot;/dev/stderr&amp;quot;; exit 1 }

BEGIN {
    if (ARGC &amp;lt; 2) eh(&amp;quot;Usage: jargon pattern [indices_mode]&amp;quot;)
    if ( !(&amp;quot;JARGON&amp;quot; in ENVIRON))
        eh(&amp;quot;JARGON env must contain path to jarg447.txt&amp;quot;)

    pattern = ARGV[1]
    indices_mode = ARGV[2]
    ARGV[1] = ENVIRON[&amp;quot;JARGON&amp;quot;]
    ARGV[2] = &amp;quot;&amp;quot;

    RS = &amp;quot;\n\n:&amp;quot;
    ORS = indices_mode ? &amp;quot;\n&amp;quot; : &amp;quot;\n\n&amp;quot;
}

function entry() {
    if ($0 ~ /^#/) return &amp;quot;&amp;quot;
    return substr($0, 0, index($0, &amp;quot;:&amp;quot;)-1)
}

tolower(entry()) ~ tolower(pattern) {
    print indices_mode ? entry() : $0
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Що є трохи забагато зусиль для іграшкового словника, але дозволяє
дізнатися купу трівіа:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ export JARGON=/mnt/scrap/lib3/doc/jargon-4.4.7.txt
$ ./jargon . 1 | wc -l
2310

$ ./jargon slop 1
slop
slopsucker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ось, ви напевно думали що slop це якесь нове слово останніх років.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./jargon micro 1
killer micro
micro-
MicroDroid
microfortnight
microLenat
microReid
microserf
Microsloth Windows
Microsoft
micros~1

$ ./jargon \~
micros~1:

   An  abbreviation  of  the full name {Microsoft} resembling the rather
   {bogus} way Windows 9x&amp;#39;s VFAT filesystem truncates long file names to
   fit in the MS-DOS 8+3 scheme (the real filename is stored elsewhere).
   If other files start with the same prefix, they&amp;#39;ll be called micros~2
   and  so  on,  causing lots of problems with backups and other routine
   system-administration problems. During the US Antitrust trial against
   Microsoft  the names Micros~1 and Micros~2 were suggested for the two
   companies that would exist after a break-up.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(Дуже програв з останнього речення.)&lt;/p&gt;
&lt;p&gt;Виявляється, Кен Томпсон був відповідальним за релізи:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./jargon ^ken | head
ken: /ken/, n.

   1. [Unix] Ken Thompson, principal inventor of Unix. In the early days
   he  used  to hand-cut distribution tapes, often with a note that read
   &amp;quot;Love,   ken&amp;quot;.   Old-timers  still  use  his  first  name  (sometimes
   uncapitalized,  because  it&amp;#39;s  a  login  name  and  mail  address) in
   third-person  reference;  it  is  widely  understood  (on  Usenet, in
   particular)  that  without  a  last  name  `Ken&amp;#39;  refers  only to Ken
   Thompson.  Similarly, `Dennis&amp;#39; without last name means Dennis Ritchie
   (and he is often known as dmr). See also {demigod}, {Unix}.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;awk-скрипта має бага зі словом &lt;em&gt;zorkmid&lt;/em&gt;, т.я. воно є останнім і після
нього ув хфайлі йдуть поза-словникові додатки. Фікса залишається ув
якості домашнього завдання.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=528775" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:528542</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/528542.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=528542"/>
    <title>Збільшення fat32</title>
    <published>2026-03-14T21:41:45Z</published>
    <updated>2026-03-14T21:41:45Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>6</dw:reply-count>
    <content type="html">&lt;p&gt;Для спеціялізованого кастомного дістро мені знадобився механізма
збільшення fat32 партішона (під час початкового буту). Коли вимовляють
слово &lt;em&gt;resize&lt;/em&gt; мають на увазі 2 речі: збільшення партішона та
збільшення хфайлової системи. Можна просто зробити 1ше, але зиску для
користувача-дурбели від того буде небагато.&lt;/p&gt;
&lt;p&gt;Кастомний дістро використовує (не треба непритомніти) systemd, який
вміє це робити, але, на жаль, не для fat32:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;systemd-growfs knows very little about specific file systems
... and will instruct the kernel to grow the mounted filesystem to
full size of the underlying block device ... Currently: ext4, btrfs,
xfs&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Якщо би мова йшла про ext4 та безтурботне життя без systemd, алгоритма
був би нескладний: за допомогою parted(8) збільшується розмір
партішона, потім за допомогою resize2fs(8) збільшується хфайлова
система. Робити це можна, наприклад, ув initramfs, до того як
монтуються блокові дівайси і запускається фінальний switch_root(8).&lt;/p&gt;
&lt;p&gt;Ріпо з parted насправді має С бібліотеку libparted, якою користується
ютіліта parted. Навколо libparted побудована вся інфраструктура
магічних аплікації, які можуть зменшувати/збільшувати розміри
будь-яких партішонів.&lt;/p&gt;
&lt;p&gt;libparted не містить коду для збільшення &lt;em&gt;файлових систем&lt;/em&gt;, за
винятком vfat. Не дивлячись на це, рісайзування fat залишається
прихованим від користувача і відсутнім ув parted (страшенно популярна
gtk&amp;#39;шна аплікація &lt;strong&gt;g&lt;/strong&gt;parted той маловідомий куток libparted радісно
використовує).&lt;/p&gt;
&lt;p&gt;Далі починається божевілля. Будь-який дістро, від деривативів убунти,
федори та прибацаного арча до контейнерів з олпайном, містить &lt;em&gt;нєчто&lt;/em&gt;
під назвою fatresize. Будь-яка LLM мументально виплюне цю назву і
напише приклад її використання, що, могло би бути вкрай корисно, коли
би та fatresize працювала.&lt;/p&gt;
&lt;p&gt;Якщо поглянути на її нутрощі після розглядання libparted/parted, стає
нескладно помітити, що той, хто її писав, копіював звідти шматки
хфункцій чи цілі хфункції verbatim, що одначе не допомогло: &amp;quot;ютіліта&amp;quot;
є неспроможною навіть розпарсити рядок &lt;code&gt;/dev/sda3&lt;/code&gt; коректно і вилітає
після спроби замість того обробляти &lt;code&gt;/dev/sda&lt;/code&gt;, тому що libparted
відмовляється робити ідіотизм.&lt;/p&gt;
&lt;p&gt;На ґітгабі плачуть, але автор не відповідає. Є 1 (один) форк працюючий
(у сенсі, з намаганням полагодити елементарні речі), але також
занедбаний.&lt;/p&gt;
&lt;p&gt;Варіянти вирішення прублеми: (а) натравити на те улюбленого огента,
(б) сказати огенту написати з нуля, (с) написати самому. Я вибрав
останнє,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ _out/fat32-resize _out/junk/1G info 2
transport                 file
sectors                   2097152
partition_table           msdos
partitions                2
sector_size               512
partition_start           411648
partition_end             2097151
partition_length          1685504
fs_type                   fat32
fs_start                  411648
fs_end                    1460219
fs_length                 1048572
partition_used_percent    62
lolbar                    loooooooooooooooooooo...........l
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;але перед тим поцікавився, хто є автор fatresize.&lt;/p&gt;
&lt;p&gt;Ви не повірите!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;то, что ми сєйчас наблюдаєм по всєму міру -- єто вскритий давно
зрєющій фурункул русофобії і злоби. Шовінізм по отношєнію Запада ко
всєм русскім. Маскі сняти.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Це з його linkedin, де він пише що нібито працює ув швейцарському
охфісі гоогла, але одночасно ув твіторі чомусь косить під румунського
маґа-патріота.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=528542" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:528221</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/528221.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=528221"/>
    <title>winiso2img v3</title>
    <published>2026-01-10T07:26:01Z</published>
    <updated>2026-01-10T07:26:39Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>2</dw:reply-count>
    <content type="html">&lt;div style="margin-left: auto; width: 23em"&gt;
 &lt;div style="border: 1px solid gray; padding: 10px"&gt;
  &lt;div&gt;✔️ Install Windows 11&lt;/div&gt;
  &lt;div&gt;✔️ Keep nothing&lt;/div&gt;
 &lt;/div&gt;
 &lt;i&gt;— З інсталяційного даялоґу віндюка&lt;/i&gt;
&lt;/div&gt;

&lt;p&gt;Нумеро тре драматичного епосу про майкрософтські айсо хфайли. (Нумеро
&lt;a href="https://henry-flower.dreamwidth.org/524067.html"&gt;уно&lt;/a&gt;, а також менш
цікавий нумеро &lt;a href="https://henry-flower.dreamwidth.org/524323.html"&gt;дуе&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Невеличкий скрипта, який тулив інсталяційні хфайли з охфіційного .iso
до .img (для подальшої dd&amp;#39;ізації його на блокового носія знімного),
раптом перестав працювати з .iso від 25h2!&lt;/p&gt;
&lt;p&gt;Щось ув механізмі з двома GPT партішонами перестало подобатися свіжій
інсталяції. Т.я. останній раз я дивився на те майже рік тому, жодного
бажання пригадувати деталі у мене не з&amp;#39;явилося. Простіше за все було
подивитися як то робить &lt;em&gt;Media Creation Tool&lt;/em&gt; майкрософтський та
скопіювати його поведінку.&lt;/p&gt;
&lt;p&gt;Замість GPT він форматує дівайса з MBR і створює самотнього fat32
партішона, куди переносить всі хфайли з .iso. Останній містить
&lt;code&gt;efi/boot/bootx64.efi&lt;/code&gt; аплікацію, тому байоса навіть ув режимі
суворого UEFI її запускає. Я думав GPT є необхідний завжди, але це
виявилося неправдою.&lt;/p&gt;
&lt;p&gt;Щоправда fat32 не підтримує файли &amp;gt; 4 GB, а .iso має &lt;code&gt;install.wim&lt;/code&gt;
розміром &amp;gt; 6 GB, тому останнього треба ділити на шматки за допомогою
ютіліти wimlib-imagex, яка є навіть ув стандартних федориних ріпо.&lt;/p&gt;
&lt;p&gt;Хоча фінальний .img виглядає як MBR-леґесі,&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ parted w11.img print | grep &amp;#39;^[PN ]&amp;#39;
WARNING: You are not superuser.  Watch out for permissions.
Partition Table: msdos
Number  Start   End     Size    Type     File system  Flags
 1      1049kB  8591MB  8590MB  primary  fat32        boot, lba
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;він не зможе завантажитися ув режимі байосного леґесі режиму через
відсутність бут лоадеру:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ head -c512 &amp;lt; w11.img | xxd -a
00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
*
000001b0: 0000 0000 0000 0000 3eeb 5b2d 0000 8020  ........&amp;gt;.[-...
000001c0: 2100 0cfe ffff 0008 0000 0000 0001 0000  !...............
000001d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000001f0: 0000 0000 0000 0000 0000 0000 0000 55aa  ..............U.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Оновлений ланаксний скрипта на
&lt;a href="https://github.com/gromnitsky/mkwiniso"&gt;ґітгабі&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=528221" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:527999</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/527999.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=527999"/>
    <title>Фільтрування removable драйвів</title>
    <published>2026-01-03T03:13:39Z</published>
    <updated>2026-01-03T03:13:39Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Хотів звільнити usb драйва від лайнаксних gpt партішонів, щоб
заформатувати потім його ув віндюку, і отримав ось це:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo fdisk -l /dev/sdi
Disk /dev/sdi: 112.64 GiB, 120945901568 bytes, 236222464 sectors
Disk model: Transcend 128GB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot      Start        End    Sectors  Size Id Type
/dev/sdi1       4294967295 8589934589 4294967295    2T ff BBT
/dev/sdi2       4294967295 8589934589 4294967295    2T ff BBT
/dev/sdi3       4294967295 8589934589 4294967295    2T ff BBT
/dev/sdi4       4294967295 6854241533 2559274239  1.2T ff BBT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Виявляється, як видаляти все через копіювання /dev/zero на перший та
останній МБ, віндюка побачить відсутність партішонів і, ув якості
помсти, зробить &lt;em&gt;superfloppy&lt;/em&gt;. Супер-шо?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#39;Removable media without either GPT or MBR formatting is considered
a &amp;quot;superfloppy&amp;quot;. The entire media is treated as a single partition.&amp;#39;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(З майкрософтських питань-відповідей про gpt.)&lt;/p&gt;
&lt;p&gt;Щоб цього не сталосі (і ув fdisk не їхав дах) треба заздалегідь мати&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ lsblk /dev/sdi
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sdi      8:128  1 120.3M  0 disk
└─sdi1   8:129  1 119.3M  0 part
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Я спитав себе чому за стільки років не маю скрипта який би робив
очищення та &amp;#39;правільно&amp;#39; заформатовував дівайса, а замість того кожного
разу гооглю офсети для dd. Цікавого там є 0, кожний читач може
написати те коректно самотужки, але що мені не подобається ув таких
скриптах і чого я боюся, це те, що слухаючи сирену, я можу випадково
передати їм ім&amp;#39;я не usb драйву, а внутрішнього ssd, і тоді &lt;em&gt;Smokey, my
friend, you&amp;#39;re entering a world of pain.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Перевірити ув лайнаксі чи є блоковий носій знімним, можна подивившись
ув файла &lt;code&gt;/sys/block/XXX/removable&lt;/code&gt;. Тоді, проітерувавши все з
&lt;code&gt;/sys/block/&lt;/code&gt;, стає легко відфільтрувати непотрібне. Якщо такий
шелóвий скрипта намалює список зі usb-драйвів користувачу, останній
зможе безпечно вибрати потрібний, а перший надрукує результат вибору
для наступної аплікації:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./blockdevrem-select | xargs sudo ./blockdevrem-wipe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Тобто, скрипта, який небезпечно маніпулює байтами на дівайсі, нічого
не знає про нутрощі скрипта який дозволяє дівайса вибрати. Запускати
другий без першого зазвичай немає потреби.&lt;/p&gt;
&lt;p&gt;&lt;video style="width: auto; max-width: 100%; height: auto;" controls="controls" loop="loop" src="https://sigwait.org/~alex/mm/dreamwidth/blockdevrem.mp4" type="video/mp4"&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;Віджет меню ув dialog(1) очікує парного числа параметрів, але у нас
вони можуть містити пробіли, тому як не використовувати баша з його
масивами, доведеться змінювати IFS.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat blockdevrem-select
#!/bin/sh

eh() { echo &amp;quot;blockdevrem-select error: $*&amp;quot; 1&amp;gt;&amp;amp;2; exit 1; }

test -d /sys/block || eh /sys/block is not a directory
command -v dialog &amp;gt;/dev/null || eh &amp;#39;no dialog(1)&amp;#39;

# shellcheck disable=2012
removables() {
    ls -1 /sys/block | while read -r name; do
        [ &amp;quot;`cat /sys/block/&amp;quot;$name&amp;quot;/removable`&amp;quot; = 1 ] &amp;amp;&amp;amp;
            [ &amp;quot;`cat /sys/block/&amp;quot;$name&amp;quot;/size`&amp;quot; != 0 ] &amp;amp;&amp;amp;
            desc &amp;quot;$name&amp;quot;
    done
}

US=`printf &amp;#39;\037&amp;#39;`

desc() {
    cat &amp;quot;/sys/block/$1/device/vendor&amp;quot; &amp;quot;/sys/block/$1/device/model&amp;quot; | xargs |
        xargs -0 printf &amp;quot;%s$US%s$US&amp;quot; &amp;quot;/dev/$1&amp;quot;
}

dev=`removables`; [ &amp;quot;$dev&amp;quot; = &amp;quot;&amp;quot; ] &amp;amp;&amp;amp; eh no USB drives

reply=`mktemp`
trap &amp;#39;rm -f $reply&amp;#39; 0 1 2 15
exec 3&amp;gt; &amp;quot;$reply&amp;quot;

IFS=$US
dialog --output-fd 3 --title -- &amp;quot;${1:-Select a removable drive}&amp;quot; --keep-tite \
       --menu &amp;quot;${2:-}&amp;quot; 0 0 0 $dev 1&amp;gt;&amp;amp;2 &amp;amp;&amp;amp;
    cat &amp;quot;$reply&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=527999" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:527832</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/527832.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=527832"/>
    <title>Заретушування pdf</title>
    <published>2025-12-24T15:10:07Z</published>
    <updated>2025-12-24T15:10:07Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>11</dw:reply-count>
    <content type="html">&lt;p&gt;Дуже сміявсь:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anonymous
@OpDeathEaters&lt;/p&gt;
&lt;p&gt;The Epstein files on the DOJ website allow you to highlight the
redacted text, copy it, and paste it into another document, which
reveals what was hidden. You can also press Ctrl+F and search for
&amp;quot;Trump &amp;quot; (with a space) to see his name appear more than 600
times. #OpDeathEaters&lt;/p&gt;
&lt;p&gt;4:02 PM . Dec 23, 2025&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Може то є звичайна твіторська маячня, перевіряти я не буду, але це
нагадало мені старий квеста (2017), коли тато спитав мене за
редагування pdf:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://henry-flower.dreamwidth.org/397452.html"&gt;https://henry-flower.dreamwidth.org/397452.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Гадаю, з тих часів змінилося небагато.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=527832" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:527399</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/527399.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=527399"/>
    <title>PC World USSR</title>
    <published>2025-12-13T13:53:34Z</published>
    <updated>2025-12-13T13:53:34Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>3</dw:reply-count>
    <content type="html">&lt;p&gt;Ґай Кавасакі ув своєму &lt;em&gt;Шлях Мокінтошу&lt;/em&gt; (1989) має пасажа про совок:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#39;Denise Caruso, columnist extraordinaire for the &lt;em&gt;San Francisco
Examiner&lt;/em&gt;, wrote about the first issue of &lt;em&gt;PC World USSR&lt;/em&gt;. Thirty
pages of ad space were sold to American advertisers, but only four
pages appeared.&lt;/p&gt;
&lt;p&gt;&amp;#39;The Soviet editors had pulled the other ads because they did not
contain enough technical information or the information was already
mentioned in the editorial. The Soviets have something
there—advertising with content.&amp;#39;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Як то є типово для раціоналізації на відсутності фактів, висновок
виглядає ахінеєю (до речі, а громші вони повернули?), але з того
цінного Кавасаківського едвайсу я дізнався шо ув совдепії друкували
локалізований PC World. (Я пам&amp;#39;ятаю &lt;em&gt;PC World Ukraine&lt;/em&gt;, де ув ~2002 я
прочитав як інсталювати fbsd.)&lt;/p&gt;
&lt;p&gt;Якийсь петрушка відсканував 1й випуск 1988 року. Дебіл не спромігся
накласти текстового шару на зображення і pdf виглядає як OCR газети.&lt;/p&gt;
&lt;p&gt;Однак &amp;quot;only four pages appeared&amp;quot; виявилось неправдою. Сторінки
&lt;em&gt;іностранной&lt;/em&gt; реклами:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Країна&lt;/th&gt;
&lt;th&gt;Кількість&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bundesrepublik Deutschland&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U.S.A.&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Але найбільше там мене розсмішив &lt;a href="https://sigwait.org/~alex/doc/garry-kasparov/%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%B2-%D1%86%D0%B5%D0%B9%D1%82%D0%BD%D0%BE%D1%82%D0%B5/"&gt;текст Гаррі Каспарова&lt;/a&gt;, де він
бідкається за відсутність &lt;em&gt;ґласності в інформатікє&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#39;Можно понять, почему у нас трудно наладить производство и пустить в
массовую продажу 24-игольчатые, струйные и лазерные принтеры,
цветные мониторы с высоким разрешением, дисководы 1,44 Мбайт,
винчестеры, модемы, телефаксы, видеодиджитайзеры, детские
конструкторы &amp;quot;Собери сам IBM-совместимый ПК&amp;quot;, сканеры (устройства
ввода текста и изображений), копировальные машины и многие другие
необходимые в жизни товары. Но кто может объяснить, почему
программисты должны стоять в очереди на чтение книги Б. Карнигана и
Д. Ричи &amp;quot;Язык программирования Си&amp;quot; или ксерокопировать ее по 10
коп. за страницу? За нелегальное ксерокопирование могут очень строго
наказать. А кто наказал тех, кто виноват в том, что тираж
&amp;quot;Англо-русского словаря по программированию и информатике&amp;quot;
А. Борковского всего 60 000 экземпляров? Даже если не говорить о
миллионах школьников и студентов, которым он очень нужен, в СССР 300
000 программистов.&amp;#39;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;300К погромістів?&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=527399" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:527259</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/527259.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=527259"/>
    <title>Обфускація лінків зображень</title>
    <published>2025-12-05T03:05:58Z</published>
    <updated>2025-12-05T03:05:58Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>7</dw:reply-count>
    <content type="html">&lt;p&gt;Я побачив це недавно, але коїтися воно почалосі біля року тому. На
деяких уйоб-сайтах звичайний теґ img став раптом виглядати як
божевільне майкрософтське ікстеншона Інторнет Іксплореру 1998 року:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&amp;quot;blob:https://example.com/b501e863-fe43-4b63-ae5d-dac14cac097e&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Уйоб-сторінка, яка його містить, наочно рендерить зображення без
жодних прублем, але коли наївний користувач &lt;em&gt;збросіт лінк в чят&lt;/em&gt;, з
того вийде нічого--блоб, на який посилається &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;, існує лише ув
пам&amp;#39;ті конкретного інстансу бовзера, а на &lt;code&gt;https://example.com/UUID&lt;/code&gt;
сервер відповість 404.&lt;/p&gt;
&lt;p&gt;Навіщо це роблять? Деякі люди кожні n років починають боятися
хотлінкінґу (&lt;em&gt;сволочі воруют наш трафік&lt;/em&gt;), борці з ЕйАй намагаються
зіпсувати бізнес злим корпораціям, а поціновувачі іграшкових DRM
тішаться від нової скіми.&lt;/p&gt;
&lt;p&gt;Якщо подивиться на fetch-ріквести такої сторінки, там будуть ресурси
які схожі на зображення, але насправді не є ними:&lt;/p&gt;
&lt;pre&gt;
$ url='&lt;a href="https://ia800206.us.archive.org/BookReader/BookReaderPreview.php?id=parkinsonlaw00park&amp;amp;subPrefix=parkinsonlaw00park&amp;amp;itemPath=/31/items/parkinsonlaw00park&amp;amp;server=ia800206.us.archive.org&amp;amp;page=leaf8&amp;amp;scale=1"&gt;https://ia800206.us.archive.org/🙈.jpg&lt;/a&gt;'

$ curl -sI "$url" | grep -e type -e length -e obfuscate
content-type: image/jpeg
content-length: 267470
x-obfuscate: 1|uoEV6/PZOWtGhOZdVM898w==

$ curl -s "$url" | head -c25 | file -
/dev/stdin: data
&lt;/pre&gt;

&lt;p&gt;Такий .jpg є зашифрований. Частковий ключа є ув &lt;code&gt;X-Obfuscate&lt;/code&gt; хедері,
але про це не знає ані скрейпера рендомної ЕйАй контори, ані
будь-яка соцсіточка. Шифр також не афішується, і кожний уйоб-сайт може
мати який завгодно, дотримання рекомендацій тут зводить нанівець мету
обфускації.&lt;/p&gt;
&lt;p&gt;Алгоритм малювання зображень тоді стає таким:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;завантажити зашифрований хфайла;&lt;/li&gt;
&lt;li&gt;розшифрувати його ключем з відповідного хедеру і запхнути результат
ув блоб;&lt;/li&gt;
&lt;li&gt;створити посилання на блоб хфункцією &lt;code&gt;URL.createObjectURL&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;інджекнути до DOM елемента &lt;code&gt;img&lt;/code&gt;, у якого атрібута &lt;em&gt;src&lt;/em&gt; дорівнює
новому посиланню.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Для збільшення ентропії можна написати кастомного елемента:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img-blob alt=&amp;quot;a fluffy cat&amp;quot; src=&amp;quot;cat.bin&amp;quot;&amp;gt;&amp;lt;/img-blob&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;який буде &lt;a href="https://sigwait.org/~alex/demo/misc/img-blob/"&gt;робити все перелічене самотужки&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ув якості економії, аркайв.орґ AES-CTR-шифрує лише перші 1024 байт
зображення. Бовзери знають про AES, але суворо вимагають secure
context, що може дратувати під час тестування, тому для мікімаусного
DRM можна взяти xor-шифра.&lt;/p&gt;
&lt;p&gt;Обфускатувати &lt;code&gt;X-Obfuscate&lt;/code&gt; хедера можна ще більше. Наприклад&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x-obfuscate: rlW2MKWmnJ9hVwbtZFjtVzgyrFV6VPVkZwZ0AFW9Pt==
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;виглядає як рядок ув base64, але&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ echo rlW2MKWmnJ9hVwbtZFjtVzgyrFV6VPVkZwZ0AFW9Pt== | base64 -d | xxd
base64: invalid input
00000000: ae55 b630 a5a6 9c9f 6157 06ed 6458 ed57  .U.0....aW..dX.W
00000010: 3832 ac55 7a54 f564 6706 7400 55bd 3e    82.UzT.dg.t.U.&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Я спитав вініпухівський ДіпСік розібратися: він витратив 9 хвилин і
залишив без води 2 села ув провінції Чжецзян, був кілька разів дуже
близько від мети, але зрештою зазнав невдачі.&lt;/p&gt;
&lt;p&gt;Рядок був оброблений напилком rot13:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ alias rot13=&amp;quot;tr &amp;#39;A-Za-z&amp;#39; &amp;#39;N-ZA-Mn-za-m&amp;#39;&amp;quot;
$ echo rlW2MKWmnJ9hVwbtZFjtVzgyrFV6VPVkZwZ0AFW9Pt== | rot13 | base64 -d
{&amp;quot;version&amp;quot;: 1, &amp;quot;key&amp;quot;: &amp;quot;12345&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ув якості домашнього завдання, до кастомного елементу можна додати
еквівалента &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; за допомогою Інтерсекційного
Спостерігача.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=527259" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:526966</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/526966.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=526966"/>
    <title>Епл ув Кетаї</title>
    <published>2025-11-30T23:12:43Z</published>
    <updated>2025-11-30T23:12:43Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>7</dw:reply-count>
    <content type="html">&lt;p&gt;Що відбувається з Еплом останні 25 років ув Кетаї:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;До них звертається тайванська (або кетайська) контора, яка обіцяє
за 3-5% від BOM збирати дівайси (або навіть, як з еірподами, за
0%). Виробництво прототипів є завжди безплатно.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;У такої контори є зв&amp;#39;язки з КПК, тому землю під фабрику Кетай
материковий їм &amp;quot;дарує&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Контора будує фабрику (та житло для робочих) за гроші, які дає
конкретна кетайська провінція. Зазвичай то є території Спеціяльних
Економічних Зон, де перші N років роботи фабрики податків фактично
немає.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Епл купляє обладнання, яке буває гамериканським, дойчландським,
японським, чи кетайським. Фабрика, таким чином, орендує обладнання
у Еплу. Якщо останні є чимось незадоволені, вони його забирають і
відвозять до іншої кетайської контори.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Кетайська провінція завозить автобусами селян з навколишніх
сіл. Вони оселяються ув збудованих для них бараках.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Епл привозить &lt;em&gt;тисячі&lt;/em&gt; інженерів з гамерики, які вчать маленьких
вініпухів збирати дівайса.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(Процеса є описаний ув книжці &lt;a href="https://www.amazon.com/Apple-China-Capture-Greatest-Company/dp/1668053373"&gt;Apple in China&lt;/a&gt;, яка хоча і написана
неприємним сучасним стилем бізнес-макулатури, містить багато
анекдотів.)&lt;/p&gt;
&lt;p&gt;Не знаю, чи є випадки, коли контора сама платить Еплу за привілеї
працювати з, але я не здивуюсь.&lt;/p&gt;
&lt;p&gt;Навіщо це кетайцям? Фабрика працює ув 2 зміні. На 3й, робиться такий
самий дівайса, але для місцевого бренду Liu Hai Zhong чи Zhong Gongsu
Hai. Іноді ця таємниця розкривається і Епла влаштовує скандал. Через
рік, Епл з подивом дізнається як Хуавей чи Шаомі починають виробляти
майже такий самий дівайса, не дивлячись на те, що вони з ними
контактували ніколи.&lt;/p&gt;
&lt;p&gt;Коли Епл потребує компонента, який неможливо знайти ув Кетаї, вони
купляють його ув гамериканського виробника щоб згодом навчити
вініпухів робити копію.&lt;/p&gt;
&lt;p&gt;Гамериканські інженери, яких відправляють до Кетаю, отримують офери
від Хуавею x2 від їх поточних зарплат. Ув якості бонусу можуть
підіслати кошкожінку. &lt;em&gt;I want to express my sincere gratitude for the
opportunities, support, and experience I&amp;#39;ve gained at Apple. It&amp;#39;s been
a pleasure working with the team.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Найсумніше ув цьому не Епл per se, а те що так само роблять всі (?)
тайванські та японські бренди (&lt;em&gt;добровольно і с пєстнєй&lt;/em&gt;). Як злізти з
цієї голки не знає ніхто.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=526966" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:526675</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/526675.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=526675"/>
    <title>I Love My Mac</title>
    <published>2025-11-15T14:45:40Z</published>
    <updated>2025-11-15T14:45:40Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Зазвичай пісеньки тематичні не вартують уваги, але &lt;em&gt;I Love My Mac&lt;/em&gt;
(2004) від канадійської тітоньки мене розвеселила:&lt;/p&gt;
&lt;p&gt;&lt;audio controls="controls" src="https://sigwait.org/~alex/mm/I-Love-My-Mac/ILoveMyMac.mp3"&gt;&lt;/audio&gt;&lt;/p&gt;
&lt;p&gt;Що сталося з авторкою--невідомо. Всі її інтервебні маєтності не
працюють, видно лише їх &lt;a href="https://web.archive.org/web/20170704225552/http://ilovemymacthesong.com/page12/page12.html"&gt;шматки на аркайв.орґ&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Окрім ойтюнзу, знайти оригінальні хфайли пісеньки можна лише всередині
.dmg диску (грудень 2005) з журналу MacAddict, який збанкрутував 18
років тому.&lt;/p&gt;
&lt;img alt="" src="https://sigwait.org/~alex/mm/I-Love-My-Mac/licence-plate.jpg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=526675" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:526382</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/526382.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=526382"/>
    <title>firewall-cmd</title>
    <published>2025-10-26T13:29:04Z</published>
    <updated>2025-10-27T09:57:33Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>4</dw:reply-count>
    <content type="html">&lt;p&gt;Всі інтерпрайзні лайнакси зроблені для постійного нагадування що життя
це є виживання найпристосованіших.&lt;/p&gt;
&lt;p&gt;ОйБіЕмівські дістро мають агента-посередника поміж кернельним
файрволом та істотою з клавіятурою. Без таких прокладок інтерпрайзний
лайнакс немає сенсу: раціоналізація необхідності преміяльного саппорту
тоді звужується до швидкості копіпасти. Додана вартість ув якості
біспоукного софтware, яке повинно генерувати додаткове технічне
обслуговування, необхідна як запас води ув пустелі.&lt;/p&gt;
&lt;p&gt;Агента-посередник називається firewalld. Це є повільна як черепаха
пáйфонівська аплікація, яка виконує команди &amp;quot;нумо відкрити порт нумеро
1488 на інтерхфесі enp13s77&amp;quot;. З кернелом firewalld розмовляє за
допомогою С бібліотеки libnftables, а з юзерлендом по протоколу dbus.&lt;/p&gt;
&lt;p&gt;Якщо наївний користувач, &lt;em&gt;чуждий духу інтєрпрайза&lt;/em&gt;, додасть свою chain
чи rule командою nft, то firewalld на це відреагує ніяк--ув кернелі
з&amp;#39;явиться гуляш з інструкцій від firewalld та користувача.&lt;/p&gt;
&lt;p&gt;Що мене завжди неймовірно дратувало ув клайнтах до firewalld це їх
відраза до показу номерів портів. Наприклад, активний &amp;quot;сервіс&amp;quot;
(термінологія firewalld, нічого спільного з &amp;quot;сервісами&amp;quot; від systemd) з
назвою samba контролює їх 2 штуки, але ані GUI клаент, ані жахлива,
повільна як черепаха (се є пáйфон) ютіліта firewall-cmd, вам їх не
покажуть. &lt;em&gt;Where ignorance is bliss, &amp;#39;tis folly to be wise.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Свій стейт firewalld зберігає ув &lt;code&gt;/etc/firewalld/&lt;/code&gt; (яка є чомусь &lt;code&gt;0750&lt;/code&gt;
&lt;code&gt;root:root&lt;/code&gt;, що там такого секретного?), де мапінґа сервіс-порт є
відсутній.&lt;/p&gt;
&lt;p&gt;З деяким дратування гортаючи man-сторінку firewall-cmd, можна знайти
опцію &lt;code&gt;--info-service&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo firewall-cmd --info-service samba | grep /
  ports: 139/tcp 445/tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Для групи сервісів окремої зони це треба робити руками:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo firewall-cmd --zone=home --list-services |
     xargs -n1 sudo firewall-cmd --info-service |
     grep -ie ^[a-z] -e /
dhcp
  ports: 67/udp
dhcpv6-client
  ports: 546/udp
  destination: ipv6:fe80::/64
http
  ports: 80/tcp
…
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Це займає секунди 3 якщо &amp;quot;сервісів&amp;quot; &amp;gt; 20 (можна прискорити через
&lt;code&gt;xargs -P&lt;/code&gt;). Запити по dbus не є такими повільними per se навіть через
огидний пáйфон, повільна є ютіліта firewall-cmd.&lt;/p&gt;
&lt;p&gt;Є також варіянт з dbus. Ви часто бачите скрипти які розмовляють з
ґноумівською &lt;em&gt;шиною&lt;/em&gt;? Я--ніколи. Можливо, нарід не знає що
поттерінґівське busctl може друкувати результат ув json (додали
недавно, 7 років тому), або просто цим гидують.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat firewall-zone-ports
#!/usr/bin/env bash

set -e -o pipefail

zone=&amp;quot;${1:?Usage: firewall-zone-ports zone}&amp;quot;
call_firewall=&amp;#39;busctl -j call org.fedoraproject.FirewallD1&amp;#39;

$call_firewall \
       /org/fedoraproject/FirewallD1 \
       org.fedoraproject.FirewallD1.zone \
       getServices s &amp;quot;$zone&amp;quot; |
    jq -r .data[].[] |
    while read -r service; do
        interface=`$call_firewall \
            /org/fedoraproject/FirewallD1/config \
            org.fedoraproject.FirewallD1.config \
            getServiceByName s &amp;quot;$service&amp;quot; | jq -r &amp;#39;.data[]&amp;#39;`

        echo &amp;quot;$service&amp;quot;

        $call_firewall \
            &amp;quot;$interface&amp;quot; \
            org.fedoraproject.FirewallD1.config.service \
            getPorts | jq -r &amp;#39;[.data[][] | join(&amp;quot;/&amp;quot;)] | join(&amp;quot;,&amp;quot;)&amp;#39;
    done | xargs -r -n2 printf &amp;quot;%-30s %s\n&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Мілий ґлазу&lt;/em&gt; інтерпрайз &lt;code&gt;org.fedoraproject.FirewallD1.config.service&lt;/code&gt;
справляється за 0.1 сек, але витрачати час на таку оптимізацію я не
раджу.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=526382" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:526267</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/526267.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=526267"/>
    <title>PL vs. UA</title>
    <published>2025-09-04T13:42:05Z</published>
    <updated>2025-09-04T13:42:05Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>6</dw:reply-count>
    <content type="html">&lt;p&gt;Нижче є статистика висіння ~15 годин ув топі хакір н&amp;#39;юз неділю
тому. Ув порівнянні з минулорічним показниками, змінилося мало: Польща
тоді була на 9 позиції, ми на 32.&lt;/p&gt;
&lt;p&gt;Дуже сумно, тому що до &amp;#39;22 &lt;strong&gt;цифри були зворотні&lt;/strong&gt;: ми мали 10-15
місця &lt;em&gt;завжди&lt;/em&gt;, а Польща бовталася ув 3-тьому десятку.&lt;/p&gt;
&lt;p&gt;Як повернути все назад, я не знаю. Гадаю, це є неможливо і далі буде
лише гірше: залишаться військові (мілтек за $500/місяць), тітки за 40
та пенсіонери. Пітун переміг.&lt;/p&gt;
&lt;p&gt;Вибачте за відсутність оптимізму.&lt;/p&gt;
&lt;img alt="blog post stats" src="https://sigwait.org/~alex/mm/dreamwidth/adobe-reader-vs-sumatrapdf.countries.svg"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=526267" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:525953</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/525953.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=525953"/>
    <title>Why don't the labels on the points match the scale?</title>
    <published>2025-08-26T19:54:01Z</published>
    <updated>2025-08-26T19:54:01Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>7</dw:reply-count>
    <content type="html">&lt;p&gt;Про офлайнові інсталятори адобі рідера.&lt;/p&gt;
&lt;p&gt;Хто переможе: каліхфорнійська контора з капіталізацією маркетовою ув
150 бульйонів чи Кшиштоф Ковальчик з Кракова?&lt;/p&gt;
&lt;img style="width: 100%" src="https://sigwait.org/~alex/blog/2025/08/25/adobe_reader-vs-sumatrapdf.svg" alt="adobe reader vs sumatrapdf"&gt;

&lt;p&gt;та&lt;/p&gt;
&lt;img style="width: 100%" src="https://sigwait.org/~alex/blog/2025/08/25/adobe_reader-vs-sumatrapdf.linear.svg" alt="adobe reader vs sumatrapdf (linear scale)"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=525953" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:525615</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/525615.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=525615"/>
    <title>dirname ув AT&amp;T</title>
    <published>2025-08-23T21:48:34Z</published>
    <updated>2025-08-23T21:48:34Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>2</dw:reply-count>
    <content type="html">&lt;p&gt;Команда dirname(1) з беллабсівської рісьóрч Unix v8 (1985):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat usr/bin/dirname
#       @(#)dirname.sh  1.2
expr \
  ${1-.}&amp;#39;/&amp;#39; : &amp;#39;\(/\)[^/]*/$&amp;#39; \
  \| ${1-.}&amp;#39;/&amp;#39; : &amp;#39;\(.*[^/]\)//*[^/][^/]*//*$&amp;#39; \
  \| .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;На жаль, Торвальдсу тоді було лише 16 років і ґіта він AT&amp;amp;T подарувати
не міг, тому хто був автором іммортальних рядків, залишається
невідомим.&lt;/p&gt;
&lt;p&gt;Загалом, v8 продвжувала традицію &amp;#39;все що може бути скриптом шелóвим
має їм бути&amp;#39;, наприклад /bin/true сяяв 0755 з розміром 0 байт.&lt;/p&gt;
&lt;p&gt;Багато хто зі світу віндюка досі не розуміє чому навіть сучасні
лайнакси мало використовують імена хфайлів з пробілами. Річ у тому, що
останні вийнашли тільки ув 2000х роках, а до того &lt;a href="https://sigwait.gitlab.io/les_podervyansky--plays/ch24.html"&gt;люди ніколи не
умивалися і їли
сало&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sh usr/bin/dirname &amp;#39;foo bar&amp;#39;
expr: syntax error: unexpected argument ‘bar/’
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ви часто використовуєте ютіліту expr(1)? Я чомусь думав вона є
&lt;em&gt;builtin&lt;/em&gt;, але ніхто з шелів її не чіпає. Гадаю, про неї забули всі
хто про неї знав, як тільки з&amp;#39;явилася підтримка орифметичного
ікспаншону ув &lt;code&gt;$(( … ))&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Оператор &lt;code&gt;:&lt;/code&gt; став для мене новиною. &lt;code&gt;STRING : REGEX&lt;/code&gt; робить пошук за
взірцем, а якщо regex має субікспрешона &lt;code&gt;\( … \)&lt;/code&gt;, то ютіліта друкує
його ув стилі &amp;#39;grep -o&amp;#39;.&lt;/p&gt;
&lt;p&gt;Це видається корисним, але насправді товку від того є небагато.&lt;/p&gt;
&lt;p&gt;Можна написати аналога basename(1), але навіщо?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ expr /$SHELL : &amp;#39;.*/\([^/]*\)$&amp;#39;
bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Порахувати довжину рядка:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ expr foobar : &amp;#39;.*&amp;#39;
6
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Надрукувати ув лайнаксі регіона таймзони:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ expr `realpath /etc/localtime` : &amp;#39;.*/\(.*\)/.*$&amp;#39;
Europe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Таке. Перевірити рядок на суфікса:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ q=foo.txt
$ expr $q : &amp;#39;.*\.txt$&amp;#39;
7
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;але ідіома&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ [ &amp;quot;${q##*.}&amp;quot; = &amp;#39;txt&amp;#39; ]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;є більш відомою і викличе меньше питань.&lt;/p&gt;
&lt;p&gt;Сучасні dirname(1), звичайно, шелóвими скриптами не бувають. Вони або
використовують позіксну dirname(3), або пишуть криву (але свою, як
coreutils) хфункцію пошуку &amp;#39;/&amp;#39;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=525615" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:525366</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/525366.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=525366"/>
    <title>SMTP вітання</title>
    <published>2025-07-30T18:53:33Z</published>
    <updated>2025-07-30T18:53:33Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>9</dw:reply-count>
    <content type="html">&lt;p&gt;Розважаючи себе переписуванням SOHO конфіґурації Exim, якщо це можна
назвати розвагою, я поцікавився навіщо гаю час на Exim, коли допевне
мають бути ольтернативи.&lt;/p&gt;
&lt;p&gt;Років 20 тому ця галузь консалтинґу вирувала разом зі великою
всесвітньою боротьбою проти спаму, але з того часу вояцький запал
помітно вщух, а SOHO сервери поштові залишилися лише ув гротескних
параноїків чи контрольних фріків.&lt;/p&gt;
&lt;p&gt;Як вірити вікіпідіа (я не вірю), бійка поміж postfix та exim триває
досі, де обидва разом мають маркетову частку ув ~92%. Обидва
знаходяться ув непевному стані на межі занедбаності: 1й відрізняється
відсутністю публічного ріпо; зміст вікі 2го нагадує покинуті військові
бази або таймкапсулу з 2002 року. Обидва мають по 1му регулярному
комітеру.&lt;/p&gt;
&lt;p&gt;92%?&lt;/p&gt;
&lt;p&gt;Перевірити який саме сервер поштовий використовує нарід можна просто
відкривши tcp сокета і прочитавши (зазвичай) 1 рядок, який сервер
надішле. RFC 5321 не вимагає друкувати ім&amp;#39;я, лише код відповіді зі
своїм доменом, тому цей тест не завжди є корисний.&lt;/p&gt;
&lt;p&gt;(Навіщо залишають ім&amp;#39;я та версію ув рядку вітання, я не зовсім
розумію, напевно щоб русскім та північним корейцям було легше
підбирати вразливості.)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ dig mx apple.com +short | head -1
20 mx-in-vib.apple.com.
$ timeout 2 ncat mx-in-vib.apple.com 25
220 vib-mx02.apple.com -- Server ESMTP (Oracle Communications Messaging Server 8.1.0.27.20250130 64bit (built Jan 30 2025))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Я спитав ув Ґрока за популярні уйоб-сайти, але добрий шмат зі того
списку використовує гооглівську хмару. Наприклад, 40 штук для України:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ xargs ./smtp-banner.sh &amp;lt; top_websites_ukraine.txt | tee ua.txt
112.ua                    220-mx2.myservices.email ESMTP Postfix (Debian/GNU)
nv.ua                     220 mx.nv.ua ESMTP MailCleaner (Community Edition 0-da47da2) Wed, 30 Jul 2025 15:40:51 +0300
tsn.ua                    220 ironport2.1plus1.net ESMTP
suspilne.media            220 DU6PEPF0000A7E2.mail.protection.outlook.com Microsoft ESMTP MAIL Service ready at Wed, 30 Jul 2025 12:45:23 +0000 [08DDCC7178A4D2A2]
ukr.net                   220 2.0.0 UKR.NET ESMTP Wed, 30 Jul 2025 15:38:14 +0300 [un.20250730.wFQEzbLiXz8plF0C]
prom.ua                   220-mail.uaprom.net ESMTP
youtube.com               220 mx.google.com ESMTP 38308e7fff4ca-331f409b92csi28321721fa.89 - gsmtp
google.com                220 mx.google.com ESMTP 38308e7fff4ca-331f4302005si28576861fa.422 - gsmtp
rozetka.com.ua            220 eva.rozetka.com.ua ESMTP Exim 4.98.2 Wed, 30 Jul 2025 15:38:14 +0300
sinoptik.ua               220 UKR.NET ESMTP Wed, 30 Jul 2025 15:38:14 +0300
wikipedia.org             220 mx-in1001.wikimedia.org ESMTP Postfix (Debian/GNU)
censor.net                220 mx.cloudflare.net Cloudflare Email ESMTP Service ready
uakino.best               220 uakino.me ESMTP Postfix (Debian/GNU)
gismeteo.ua               220 mx.google.com ESMTP 2adb3069b0e04-55b633bfa57si3094256e87.626 - gsmtp
x.com                     220 mx.google.com ESMTP 2adb3069b0e04-55b63161bdasi3091803e87.68 - gsmtp
telegram.org              220 mx110.telegram.org ESMTP Postfix (Debian/GNU)
instagram.com             220 mx0b-00082601.pphosted.com ESMTP mfa-m0109332
obozrevatel.com           220 mail.obozrevatel.com ESMTP Exim 4.97.1 Wed, 30 Jul 2025 15:38:15 +0300
privatbank.ua             220 mx.google.com ESMTP d9443c01a7336-24022a2c33fsi83113735ad.210 - gsmtp
korrespondent.net         220 fr1.umh.ua ESMTP Exim 4.90_1 Wed, 30 Jul 2025 15:38:15 +0300
facebook.com              421 4.1.8 DNS-T2 Domain lookup failed https://www.facebook.com/postmaster/response_codes?ip=109.95.54.222#DNS-T2
segodnya.ua               oopsie
pravda.com.ua             220 mx.google.com ESMTP d9443c01a7336-240837b0f6dsi29521265ad.390 - gsmtp
olx.ua                    220 mx.google.com ESMTP d9443c01a7336-24076196724si35342125ad.184 - gsmtp
alerts.in.ua              220 mx.cloudflare.net Cloudflare Email ESMTP Service ready
epravda.com.ua            220 mx.google.com ESMTP 2adb3069b0e04-55b63374c7bsi3209840e87.411 - gsmtp
shafa.ua                  220-mail.uaprom.net ESMTP
rbc.ua                    220 mx.zohomail.com SMTP Server ready July 30, 2025 5:38:15 AM PDT
zoom.us                   220 mx0b-00569201.pphosted.com ESMTP mfa-m0288579
netflix.com               220 mx.google.com ESMTP 38308e7fff4ca-331f42d90afsi28847841fa.324 - gsmtp
unian.ua                  220 fiat.1plus1.net ESMTP
booking.com               220 mx07-0032a201.pphosted.com ESMTP mfa-m0176169
dou.ua                    220 mx.google.com ESMTP 41be03b00d2f7-b42100b07ebsi3220280a12.1117 - gsmtp
zakupki.prom.ua           220-mail.uaprom.net ESMTP
znaj.ua                   220 mx.cloudflare.net Cloudflare Email ESMTP Service ready
kyivpost.com              220 mx.google.com ESMTP 41be03b00d2f7-b3f7f73b516si9642287a12.729 - gsmtp
sport.ua                  220 mx.google.com ESMTP 41be03b00d2f7-b421518e194si2403306a12.701 - gsmtp
lun.ua                    220 mx.google.com ESMTP 98e67ed59e1d1-31f63dc06e0si1846146a91.45 - gsmtp
work.ua                   220 mail.work.ua ESMTP Exim 4.96 Wed, 30 Jul 2025 15:38:18 +0300
aliexpress.com            220 mx1.aliyun-inc.com MX AliMail Server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Сортування є випадкове, т.я. скрипта робить конкурентні
ріквести. Фасебоок огризається, тому що домашній ойпі у мене не має
PTR рекорду.&lt;/p&gt;
&lt;p&gt;Без поняття, наскільки ці данні є релевантні.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ grep -ic exim ua.txt
4
$ grep -ic postfix ua.txt
4
$ grep -ic gsmtp ua.txt # гоогл
13
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Лайнаксний скрипта замість ncat&amp;#39;у використовує башівські віртуальні
&lt;a href="https://henry-flower.dreamwidth.org/517810.html"&gt;/dev/tcp файли&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env bash
# shellcheck disable=SC3040

set -o pipefail

banner() {
    dig MX &amp;quot;${1:?no domain}&amp;quot; +short | awk &amp;#39;{print $NF}&amp;#39; | sort -R | head -1 |
        grep . | {
        server=`cat`; [ &amp;quot;$server&amp;quot; ] || exit 1
        MODE=connect timeout 5 &amp;quot;$0&amp;quot; &amp;quot;$server&amp;quot;
    }
}

read_1_line() {
    { exec 3&amp;lt;&amp;gt; &amp;quot;/dev/tcp/$1/25&amp;quot;; } 2&amp;gt;/dev/null || return 1
    read -r line &amp;lt;&amp;amp;3
    exec 3&amp;lt;&amp;amp;-
    echo &amp;quot;$line&amp;quot;
}

fmt() { tr -d \\r | tr \\n \\0 | xargs -0 printf &amp;#39;%-25s %s\n&amp;#39; &amp;quot;$1&amp;quot;; }

type dig nproc timeout &amp;gt; /dev/null || exit 1
[ &amp;quot;$1&amp;quot; ] || { echo Usage &amp;quot;$0&amp;quot; example.com ... 1&amp;gt;&amp;amp;2; exit 1; }

case &amp;quot;$MODE&amp;quot; in
    connect) read_1_line &amp;quot;$1&amp;quot; ;;
    banner) { banner &amp;quot;$1&amp;quot; || echo oopsie; } | fmt &amp;quot;$1&amp;quot; ;;
    *)
        export MODE=banner
        echo &amp;quot;$@&amp;quot; | xargs -P&amp;quot;`nproc`&amp;quot; -n1 &amp;quot;$0&amp;quot;
esac
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=525366" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:525234</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/525234.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=525234"/>
    <title>Аткінсонія</title>
    <published>2025-06-12T13:15:25Z</published>
    <updated>2025-06-12T13:15:25Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>2</dw:reply-count>
    <content type="html">&lt;p&gt;&amp;quot;Компактні&amp;quot; Мокінтоши перестали мати чорно-білі екрани лише 1993 року,
що є вкрай смішно, тому що їх лінійка &amp;quot;професійних&amp;quot; Мокінтошів ІІ
отримала кольори ув 1987. NeXT ув 1988 вийшов з 2-бітним монітором
(ч/б + 2 варіянти сірого), про що ув одному зі старих інтерв&amp;#39;ю Джобса
останній розповідав як газети тоді писали що він таємно ненавидить
кольори і, коли має для того владу, робить лише монохромні комп&amp;#39;ютери.&lt;/p&gt;
&lt;p&gt;(До речі, оригінальний &lt;a href="https://archive.org/details/apple-macintosh-ii-manual-1986-030-3080-A/page/n21/mode/2up"&gt;посібник по Мокінтошу ІІ&lt;/a&gt; виглядав гарною
coffee table книжкою (конь цепта маловідомий у Центрально-Східній
Європі), випадкове досягнення яке Епл спромоглася повторити ніколи,
навіть після повернення Джобса.)&lt;/p&gt;
&lt;p&gt;Мокінтош ув 1984 комплектувавсь безоплатним MacPaint&amp;#39;ом, який трохи
пізніше Майкрософта злизала собі для віндюка. Для 1-бітних екранів
симулювати відтінки сірого ув MacPaint&amp;#39;і можна було тільки за
допомогою дізерінґу. Найвідоміший алгоритм--Floyd-Steinberg (FS)--був
винайдений ув 1974, але Аткінсон, якого автор книжки &lt;a href="https://en.wikipedia.org/wiki/Revolution_in_the_Valley"&gt;Revolution in
the valley&lt;/a&gt; називає єдиним дорослим ув команді Мокінтошу, вважав FS
малоконтрастним.&lt;/p&gt;
&lt;p&gt;Коли стало відомо що Аткінсон помер, на HN з&amp;#39;явився лінка на
&lt;a href="https://gazs.github.io/canvas-atkinson-dither/"&gt;бовзерний емулятора&lt;/a&gt; його алгоритму від якогось угорця, який
ховається від Орбана ув Ландані.&lt;/p&gt;
&lt;p&gt;Якість мене вразила:&lt;/p&gt;
&lt;img src="https://sigwait.org/~alex/mm/dreamwidth/atkinson/bird.jpg" alt="orig"&gt;
&lt;img src="https://sigwait.org/~alex/mm/dreamwidth/atkinson/bird.atkinson.jpg" alt="dither"&gt;

&lt;p&gt;Напевно це можна робити ув лайнаксі з командного рядка? На жаль,
ні. Опція &lt;code&gt;-&amp;NoBreak;dither&lt;/code&gt; ув ImageMagick про Аткінсона
не знає (&lt;em&gt;слушайтє пєсню Валєнкі&lt;/em&gt;). pamditherbw (з netpbm) знає, але
результат засмучує:&lt;/p&gt;
&lt;img src="https://sigwait.org/~alex/mm/dreamwidth/atkinson/bird.pamditherbw.png" alt="pamditherbw"&gt;

&lt;p&gt;Угорська демо працює так:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;створюється Canvas з розміром зображення оригінального кольорового;&lt;/li&gt;
&lt;li&gt;зображення копіюється на Canvas;&lt;/li&gt;
&lt;li&gt;з Canvas&amp;#39;у читаються пікселі ув форматі &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/ImageData"&gt;ImageData&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;ImageData модифікується;&lt;/li&gt;
&lt;li&gt;Результат знову копіюється на Canvas;&lt;/li&gt;
&lt;li&gt;з Canvas&amp;#39;у експортується нове чб-зображення ув форматі png.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Всі пункти, окрім 4, підтримуються власно бовзером та вимагають жодних
зусиль.&lt;/p&gt;
&lt;p&gt;Хоча угорська демо написана ув темні часи кофіскрипта, траспайлер
останнього друкує читабельного джаваскрипта. Скомбінувавши зміст до
1ї хфункції&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default function(imagedata) {
  let threshold = i =&amp;gt; (i &amp;lt;= 128) ? 0 : 255

  let luminance = function(imagedata) {
    var i, j, pixels, ref;
    pixels = imagedata.data;
    for (i = j = 0, ref = pixels.length; j &amp;lt;= ref; i = j += 4) {
      // luminance: red x 0.3 + green x 0.59 + blue x 0.11
      pixels[i] = pixels[i + 1] = pixels[i + 2] = parseInt(pixels[i] * 0.3 + pixels[i + 1] * 0.59 + pixels[i + 2] * 0.11, 10);
    }
    return imagedata;
  }

  let dither = function(imagedata) {
    var err, i, j, mono, neighbours, one, pixels, ref, w;
    pixels = imagedata.data;
    w = imagedata.width;
    for (i = j = 0, ref = pixels.length; j &amp;lt;= ref; i = j += 4) {
      neighbours = [i + 4, i + 8, i + (4 * w) - 4, i + (4 * w), i + (4 * w) + 4, i + (8 * w)];
      mono = threshold(pixels[i]);
      err = parseInt((pixels[i] - mono) / 8, 10);
      pixels[i] = mono;
      for (one in neighbours) {
        pixels[neighbours[one]] += err;
      }
      pixels[i + 1] = pixels[i + 2] = pixels[i];
    }
    return imagedata;
  }

  return dither(luminance(imagedata))
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;залишається лише прикрутити її до Canvas. (Уважний читач помітить
зайві змінні ув циклах, courtesy of транспайлера.)&lt;/p&gt;
&lt;p&gt;Спочатку я чомусь вирішив що то є робота для Puppeteer. Це була велика
помилка. Кожного разу коли я намагаюся притулити його до чогось,
закінчується це невгамовним бажанням міцно потримати авторів Puppeteer
ойпіай за горло. &lt;a href="https://sigwait.org/~alex/mm/dreamwidth/atkinson/atkinson-puppeteer.js"&gt;Кривий скрипта врешті запрацював&lt;/a&gt;, але
користуватися їм я не раджу.&lt;/p&gt;
&lt;p&gt;Потім я згадав про шматки DOM, які нарід багато років (марно)
намагаються портувати до ноуда. Певно, Canvas має бути там давно?
Виявляється, так, контора яка пише Вордпреса, роздає свою реалізацію
всім охочим. (Її дуже складно знайти--1й хіт на npmjs.com на
кейворда &amp;quot;кенвес&amp;quot;.)&lt;/p&gt;
&lt;p&gt;З вордпресівською бібліотекою, безглуздий мотлох Puppeteer зменшується
до&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function dither(img, algo) {
  let cnvas = canvas.createCanvas(img.width, img.height)
  let ctx = cnvas.getContext(&amp;#39;2d&amp;#39;)
  ctx.drawImage(img, 0, 0)
  let imagedata = ctx.getImageData(0, 0, img.width, img.height)
  ctx.putImageData(algo(imagedata), 0, 0)
  return cnvas.createPNGStream()
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;IRL, щоб показувати прогреса ув %, там є трохи більше рядків, але
мінімалізм мене тішить. Щоб подивитися на життя ув 1984, для ноуда 22:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ npm -g i atkinson
$ atkinson file.jpg &amp;gt; 1.png
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=525234" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:524932</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/524932.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=524932"/>
    <title>Началось-то прі бідонє, соотвєтствєнно срокі</title>
    <published>2025-05-16T20:18:23Z</published>
    <updated>2025-05-16T20:18:23Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>8</dw:reply-count>
    <content type="html">&lt;ul&gt;
&lt;li&gt;Прєзідєнту&lt;/li&gt;
&lt;li&gt;Прєзідєнт&lt;/li&gt;
&lt;li&gt;Прєзідєнта&lt;/li&gt;
&lt;li&gt;Прєзідєнт&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://stas.dreamwidth.org/1475958.html"&gt;https://stas.dreamwidth.org/1475958.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Достеменно залишається невідомим, чи переможуть цього року на
змаганнях ув жалюгідності сндовські маґа навальністів з дойчландії.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=524932" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:524323</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/524323.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=524323"/>
    <title>winiso2img v2</title>
    <published>2025-05-14T18:12:55Z</published>
    <updated>2025-05-15T10:13:46Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;(Продовження саги про віндюка та його інсталяцію.)&lt;/p&gt;
&lt;p&gt;Я помітив що аплікація &lt;code&gt;gnome-disks&lt;/code&gt; вміє монтувати image files не
питаючи ув polkit дозволу. Виявляється, монтувати loop дівайси можна
через udisksctl без руту, тобто замість&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo mount -t udf Win11_24H2_English_x64.iso /media
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;друкується&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ udisksctl loop-setup -f Win11_24H2_English_x64.iso
Mapped file Win11_24H2_English_x64.iso as /dev/loop0.

$ udisksctl mount -t udf -b /dev/loop0
Mounted /dev/loop0 at /run/media/alex/CCCOMA_X64FRE_EN-US_DV9
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Таким чином, створювати окремі партішони, форматувати їх та копіювати
результата до raw image можна також робити зовсім без руту. Наприклад,
2й партішон для ntfs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ truncate -s 6G lol.img
$ mkfs.ntfs -fF -s 512 -S 63 -H 255 -p $((boot_size + 2048)) lol.img
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;де &lt;code&gt;boot_size&lt;/code&gt; розмір (ув секторах) 1го партішону.&lt;/p&gt;
&lt;p&gt;Raw image генерується sfdisk&amp;#39;ом як&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ boot_size=$(( 1024*1024*1023 / 512))
$ setup_size=$(( 6*1024*1024*1024 / 512))

$ sfdisk w11.img &amp;lt;&amp;lt; EOF
label: gpt
1 : start=2048, size=$boot_size, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name=&amp;quot;BOOT&amp;quot;
2 : start=$((boot_size + 2048)), size=$setup_size, type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, name=&amp;quot;INSTALL&amp;quot;
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Потім, щоб втулити отой &lt;code&gt;lol.img&lt;/code&gt; з ntfs до &lt;code&gt;w11.img&lt;/code&gt;, треба вказати
правильний офсета для dd і не забути про &lt;code&gt;conv=notrunc&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ dd if=lol.img of=w11.img conv=notrunc bs=512 seek=$((boot_size + 2048))
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=524323" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:524067</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/524067.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=524067"/>
    <title>Безвідповідальна модифікація інсталяції</title>
    <published>2025-05-11T16:33:46Z</published>
    <updated>2025-05-14T18:13:37Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>7</dw:reply-count>
    <content type="html">&lt;p&gt;Майкрософт вперше додали механізма &lt;code&gt;autounattend.xml&lt;/code&gt; за часів
захоплюючих краєвидів Вісти. Користувач завантажував те що зараз
називається ADK віндюковий, який містив графічну ютіліту WSIM, яка
випльовувала xml-файла. Останній клавсь до кореня usb-драйву і віндюка
(ув ідеалі) інсталювався без втручання хомо сапієнса.&lt;/p&gt;
&lt;p&gt;Нічого революційно нового ув тому не було--лайнакси схожі механізми
мали багато років, наприклад kickstart ув Федорі.&lt;/p&gt;
&lt;p&gt;Прублема ADK є ув тому, що він потребує інстальованої ОС, а способу
генерації &lt;code&gt;autounattend.xml&lt;/code&gt; з-під ОС конкурентів Майкрософт не надає,
окрім цінних порад писати його ув текстовому редакторі вручну (дуже
дякую).&lt;/p&gt;
&lt;p&gt;Не слідкуючи за їх цирком на дроті, деякий час назад я почув, що з
винахідливим змістом того .xml можна отримати інсталяцію віндюка без
сучасних та корисних аплікації типу коупайлота або ноутпеда (модерн)
чи аутлука (н&amp;#39;ю), та без необхідності ув танцюванні гопака для
створювання &amp;#39;офлайнового&amp;#39; користувацького акавнту.&lt;/p&gt;
&lt;p&gt;Різноманітні онлайнові генератóри &lt;code&gt;autounattend.xml&lt;/code&gt; змінюються як
пори року. Поточним, працюючим, популярним (ППП) залишається
дойчландський unbeaufsichtigter (вимовляйте це самі)
&lt;a href="https://schneegans.de/windows/unattend-generator/"&gt;generator&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;На цьому пригоди лише починаються:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Якщо потрібен .iso з доданим &lt;code&gt;autounattend.xml&lt;/code&gt; для створення
мошини віртуальної, то як модифікувати оригінальний .iso? Всередені
там є хфайлова система udf, яку змаунтувати можна тільки read-only.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Якщо треба інсталювати віндюка на справжнього комп&amp;#39;ютера (ви не
повірите, але такі випадки трапляються непоодиноко), то як створити
з оригінального .iso завантажувальний usb?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Нагадаю: ми ув лайнаксі, де жодні rufus&amp;#39;и працюють не тут.
Різноманітні ютіліти різної ступені занедбаності або підтримують лише
.iso лайнаксних дістро, або написані ув найкращому випадку школярами,
ув найгіршому--вініпухами чи руснею (&lt;em&gt;маґа-патріот-джон с тексастской
області лєнінґрадскоґо района&lt;/em&gt;). Ув 2х останніх різновидах є гарний
шанс отримати гарного .iso с безоплатним подарунком всередині.&lt;/p&gt;
&lt;p&gt;З найсмішніших варіянтів що я бачив, кількість залежностей є така, що
аплікацію, разом з залежностями, завертають ув appimage як ковбасу.&lt;/p&gt;
&lt;h3&gt;.iso → usb&lt;/h3&gt;
&lt;p&gt;Rufus&amp;#39;и та друзі для режиму UEFI роблять нічого складного: на
usb-дівайсі створюється дві GPT партішони:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;невелика fat32;&lt;/li&gt;
&lt;li&gt;ntfs (рідше--exfat), яка займає решту дівайса.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;До 1ї переписують бутлоадера (зазвичай &amp;#39;універсального&amp;#39;, який може
вантажити декілька різних ОС). До ntfs копіюють вміст .iso.&lt;/p&gt;
&lt;p&gt;Ув нашому варіянті майкрософтський .iso має свого бутлоадера, тому
скопіювати можна його. Головний трюка є ув правільному створені
партішонів: (1) fat32 &lt;em&gt;не&lt;/em&gt; повинен бути з позначками esp та boot,
інакше віндюковий інсталятора вирішить що саме на usb-драйві буде EFI
розділ для ОС, хоча останню він ставить до геть іншого драйва; (2) без
позначки msftdata на ntfs партішоні віндюка кидає &amp;quot;Install driver to
show hardware&amp;quot; даялога, а її diskpart малює його як &amp;quot;Unknown&amp;quot;. Вкрай
неввічливо.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ parted test.img print | grep -v ^Disk
WARNING: You are not superuser.  Watch out for permissions.
Model:  (file)
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1074MB  1073MB  fat32        BOOT     msftdata
 2      1074MB  7516MB  6442MB  ntfs         INSTALL  msftdata
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Наївний
&lt;a href="https://sigwait.org/~alex/mm/dreamwidth/mkwiniso/winiso2img.svg"&gt;скрипта&lt;/a&gt;,
який це втомлююче робить, на жаль, вимагає рута через створення loop
devices, але не чіпає хадварних драйвів:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo ./winiso2img Win11_24H2_English_x64.iso test.img
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;test.img&lt;/code&gt; потім можна перенести на usb-драйв будь-яким улюбленим
способом, наприклад:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo dd if=test.img of=/dev/XXX status=progress bs=1M oflag=direct,sync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ув принципі, щоб згенерувати хфайла з потрібною таблицею партішонів
можна обійтися без losetup+parted, а взяти sfdisk та udisksctl, але
&lt;code&gt;mkfs.ntfs -fF file.img&lt;/code&gt; у мене не бажало форматувати хфайла так, щоб
його визнавала інсталяція.&lt;/p&gt;
&lt;h3&gt;Модифікація .iso&lt;/h3&gt;
&lt;p&gt;Майкрософтські .iso зроблені з хфайлової системи udf, а крихітний шар
iso9660 там містить лише хфайла README.TXT з повідомленям про skill
issue читача.&lt;/p&gt;
&lt;p&gt;Лайнакс знає про udf, але маунтить оті .iso лише ув read-only.&lt;/p&gt;
&lt;p&gt;Спочатку я хотів взяти 7-zip. Розаркування великого аркайву (&amp;gt; 5GB)
займає час навіть на сучасних мошинах, тому бажано повідомляти
користувачу що коїться. 7-zip друкує лінію стану розаркування, але
робить це ув найворожіший спосіб. По-1ше, автор 7-zip&amp;#39;у вважає що &lt;code&gt;\r&lt;/code&gt;
(carriage return) то є &lt;em&gt;буржуазноє ізлішєство&lt;/em&gt;. Ось фрагмент
збереженого аутпуту:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;00000000: 2020 304d 2053 6361 6e20 2f68 6f6d 652f    0M Scan /home/
00000010: 616c 6578 2f44 6f77 6e6c 6f61 6473 2f77  alex/Downloads/w
00000020: 696e 2f69 736f 2f77 3131 2f08 0808 0808  in/iso/w11/.....
00000030: 0808 0808 0808 0808 0808 0808 0808 0808  ................
00000040: 0808 0808 0808 0808 0808 0808 0808 0808  ................
00000050: 0808 0808 0808 2020 2020 2020 2020 2020  ......
00000060: 2020 2020 2020 2020 2020 2020 2020 2020
00000070: 2020 2020 2020 2020 2020 2020 2020 2020
00000080: 2008 0808 0808 0808 0808 0808 0808 0808   ...............
00000090: 0808 0808 0808 0808 0808 0808 0808 0808  ................
000000a0: 0808 0808 0808 0808 0808 0808 2020 3025  ............  0%
000000b0: 2031 3030 204f 7065 6e08 0808 0808 0808   100 Open.......
000000c0: 0808 0808 0808 2020                      ......
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Воно видаляє рядок за допомогою циклу з &lt;code&gt;\b&lt;/code&gt; (backspace), потім друкує
пробіли щоб видалити їх знову.&lt;/p&gt;
&lt;p&gt;По-2ге, воно відмовляється малювати лінію стану коли stdout не є
терміналом. Зі script(1) це можна побороти і, з деяким зусиллям, я
змусив аутпут від 7z бути зумісним з dialog(1) gauge, але після
проглядання 7-zip src, огида до нього у мене переросла бажання його
торкатися. Це 1 з найгірших src, які я бачив. То є диво що воно
працює взагалі, а кількість CVE починаючи з 2022 наводить на
конспірологічні думки які я тут писати не буду.&lt;/p&gt;
&lt;p&gt;Якщо ігнорувати 7-zip, як тоді модифікувати змонтований read-only
.iso? Можна скопіювати все ув іншу директорію, але існує більш
шляхетний спосіб: &lt;a href="https://wiki.archlinux.org/title/Overlay_filesystem"&gt;overlayfs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;З ним гагібайти хфайлів не копіються, але метод вимагає рута. FreeBSD
ніби мала раніше щось схоже (unionfs), але коли я користувався fbsd,
воно часто працювало з помилками.&lt;/p&gt;
&lt;p&gt;Після отримання директорії з &lt;code&gt;autounattend.xml&lt;/code&gt; хфайлом, її завертають
ув .iso знову.
&lt;a href="https://sigwait.org/~alex/mm/dreamwidth/mkwiniso/mkwiniso.svg"&gt;Скрипта&lt;/a&gt;,
який це робить, є на 24 рядки більший за попередній &lt;code&gt;winiso2img&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ wc -l *
  67 mkwiniso
  91 winiso2img
 158 total
$ sudo ./mkwiniso add lol.xml Win11_24H2_English_x64.iso test.iso
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Якщо просто треба з розаркованого Майкрософтського .iso створити
новий, рута є непотрібний:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./mkwiniso generate dir 1.iso
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=524067" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:523820</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/523820.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=523820"/>
    <title>Куток лузерів</title>
    <published>2025-05-11T12:32:01Z</published>
    <updated>2025-05-11T12:32:01Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>7</dw:reply-count>
    <content type="html">&lt;p&gt;712 безглуздих слів про &lt;a href="https://meta.stackexchange.com/q/408823/"&gt;&amp;quot;renewing the Brand&amp;quot;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Дякуючи Зевсу, Гері та іншим богам, ЕйАй, який нищить Stack Exchange,
вміє перетворювати воду на сенс:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Stack Exchange is launching a rebrand because they think their
identity is a mess, and it’s hurting their business. Instead of fixing
real problems, they’re wasting time and money on consultants and vague
“brand strategy” to make everything look more polished while AI eats
their lunch. They say they want community input, but this is corporate
theater.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=523820" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:523577</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/523577.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=523577"/>
    <title>Why isn't the Golden Gate golden?</title>
    <published>2025-05-03T06:06:53Z</published>
    <updated>2025-05-03T06:06:53Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>3</dw:reply-count>
    <content type="html">&lt;p&gt;Понапридумували ґолдів:&lt;/p&gt;
&lt;img src="https://sigwait.org/~alex/mm/dreamwidth/colorsel.svg" alt="colorsel screenshot"&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=523577" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:523389</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/523389.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=523389"/>
    <title>Лінки до віндюка ув 2025</title>
    <published>2025-04-07T22:13:36Z</published>
    <updated>2025-04-07T22:13:36Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>6</dw:reply-count>
    <content type="html">&lt;p&gt;&lt;a href="https://henry-flower.dreamwidth.org/463367.html"&gt;З безтурботних часів&lt;/a&gt; кінця сивочолого криголама (що мені не
подобалось?), для знаходження діректових лінків на .iso, Майкрософт
кілька разів змінювали внутрішній ойпіай, загалом, потреба ув якому як
була так і залишається незрозумілою, якщо не рахувати необхідність
свіжих булітів кожного end-of-year рів&amp;#39;ю.&lt;/p&gt;
&lt;p&gt;Щоб завантажити 24h2, треба отримати ойді сесії та список мов, за
якими Майкрософт подарує згенерований url ув джейсоні. Як робити
найостанніший ріквеста забагато разів на годину (наприклад, нахабно 5
разів), Майкрософт зобанить. Покласти всі &lt;em&gt;.iso&lt;/em&gt; на статичного сервера
не можна--це буде глузування над здоровий глуздом, потрібна Процедура.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ grep -Ev &amp;#39;^#|^$&amp;#39; windows-iso-url | wc -l
28
&lt;/code&gt;&lt;/pre&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/aHMvY8FMMH0?si=2shEXwjsAjvaaMV3" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="https://raw.githubusercontent.com/gromnitsky/windows-iso-url/refs/heads/master/windows-iso-url"&gt;Скрипта&lt;/a&gt; вимагає nokogiri.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=523389" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:523045</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/523045.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=523045"/>
    <title>Respect my capabilitah</title>
    <published>2025-03-22T19:55:03Z</published>
    <updated>2025-03-25T18:25:10Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Спостерігаючи за бійкою між Поттерінґом та термінальними пуристами, я
дізнався про таке собі &lt;em&gt;XTGETTCAP&lt;/em&gt;. Це є механізма (відносно новий,
~2019?) для отримання &lt;em&gt;можливостей&lt;/em&gt; терміналу без консалтінґу
terminfo. Це означає, що брехати про тип терміналу з XTGETTCAP не
вийде.&lt;/p&gt;
&lt;p&gt;Наприклад, якщо хочеться намалювати користувачу саме монохроматичного
інфобокса, зараз можна підсунути назву терміналу, для якого ув
terminfo зазначено безбарвне життя:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ TERM=vt100 dialog --infobox &amp;#39;ну шо ти малá&amp;#39; 0 0&lt;/code&gt;&lt;/pre&gt;&lt;img src="https://sigwait.org/~alex/mm/dreamwidth/XTerm.0x480000e.png" alt=""&gt;

&lt;p&gt;Це працює тому що даялоґа використовує ncurses, який дивиться ув
terminfo. Якби даялоґа стріляв ув термінала XTGETTCAP&amp;#39;апом, замість
читання змінної середовища &lt;code&gt;TERM&lt;/code&gt;, такий хфокус би не спрацював:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ echo $TERM
xterm-256color
$ TERM=vt100 ./XTGETTCAP TN
xterm-256color&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Якщо ув теорії XTGETTCAP--майбутнє вже сьогодні, то на практиці цей
механізма мені не подобається. Можливо &lt;em&gt;in-band signalling&lt;/em&gt; було
надією людства ув 1970ті, але зараз щоб імплементувати XTGETTCAP запита
та прочитати результата, треба перемикати термінала ув raw режим,
конвертувати ім&amp;#39;я capability ув hex строку і писати до tty обгорнувши
її з &lt;code&gt;\e&lt;/code&gt; (ascii 033 ув октал) з обох боків, поряд з іншим мотлохом:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;printf &amp;#39;\033P+q%s\033&amp;#39;\\ &amp;quot;$capablity&amp;quot; &amp;gt; &amp;quot;`tty`&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Що для &amp;quot;TN&amp;quot; виглядає як&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;00000000: 1b50 2b71 3534 3465 1b5c                 .P+q544e.\&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Потім треба обережно прочитати результата все ще знаходячись ув raw
режимі. Якщо робити це з акуратністю, з якою нарід пише скрипти шелóві,
вірогідність того, шо термінал буде заблоковано перманентно, наближається до 1.&lt;/p&gt;
&lt;p&gt;Для wayland&amp;#39;у є емулятор терміналу &lt;em&gt;foot&lt;/em&gt;, який має окрему C ютіліту
для читання XTGETTCAP, але вона наглухо висне, якщо термінала не
розуміє запиту. Як можна сподіватися на здібності гіпадріла
звичайного, якщо це не можуть порядно зробити навіть люди, які пишуть
термінального емулятора.&lt;/p&gt;
&lt;p&gt;Окрім xterm (який вимагає увімкненого &lt;code&gt;allowTcapOps&lt;/code&gt;, який вирублений
по замовчуванню на всіх ОйБіЄм'івських дістро через &lt;a href="https://www.openwall.com/lists/oss-security/2022/11/10/1"&gt;цирка на
дроті&lt;/a&gt;),
найбільше просунулося у цьому напрямку індійське диво kitty (на яке я
маю алергію після стількох років страждань з calibre (автор той
самий)), та усілякі ghostly та ін. штукенції, якими користуються 12
людей на планеті земля. iterm2 та діфолтне еплівське одоробло також ніби має
підтримку, але мені є лінь перевіряти.&lt;/p&gt;
&lt;p&gt;Найсумніше є те, що XTGETTCAP наразі не працює через gnu screen чи
tmux, що хоча є вина останніх, популярності XTGETTCAP не додає.&lt;/p&gt;
&lt;p&gt;Скрипта, яким можна тестувати:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

set -e

eh() { echo &amp;quot;Error: $*&amp;quot; 1&amp;gt;&amp;amp;2; trap - 0; exit 1; }
text2hex() { od -A n -t x1 | tr -d &amp;#39; \n&amp;#39;; }
hex2text() { sed &amp;#39;s/../0x&amp;amp; /g&amp;#39; | xargs printf &amp;#39;\\\\%03o\n&amp;#39; | xargs printf %b; }
stty_orig=`stty -g`
stty_restore() { stty &amp;quot;$stty_orig&amp;quot;; }

[ -n &amp;quot;$1&amp;quot; ] || eh Usage: XTGETTCAP capability

capablity=`printf &amp;#39;%s&amp;#39; &amp;quot;$1&amp;quot; | text2hex`
trap stty_restore 0

stty -echo raw time 1 min 0
printf &amp;#39;\033P+q%s\033&amp;#39;\\ &amp;quot;$capablity&amp;quot; &amp;gt; /dev/tty
buf=`dd status=none count=1`
stty_restore

[ -n &amp;quot;$buf&amp;quot; ] || eh unsupported terminal
[ &amp;quot;$V&amp;quot; ] &amp;amp;&amp;amp; printf %s &amp;quot;$buf&amp;quot; | xxd

buf=`printf %s &amp;quot;$buf&amp;quot; | sed &amp;#39;s/[^a-zA-Z0-9+=]//g&amp;#39;`
[ P1 = &amp;quot;${buf%+*}&amp;quot; ] || eh unknown capabilitah
printf %s &amp;quot;${buf#*=}&amp;quot; | hex2text | xargs&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Повинно працювати з пацаватими dash, busybox sh та ін.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hex2text()&lt;/code&gt; тут не фонтан, звичайно, але нопешіть як то можна інакше,
щоб (а) було сумісно з fbsd, (б) не вимагало чогось ікстернального, як
xxd.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./XTGETTCAP TN
xterm-kitty
$ V=1 ./XTGETTCAP colors
00000000: 1b50 312b 7236 3336 6636 6336 6637 3237  .P1+r636f6c6f727
00000010: 333d 3332 3335 3336 1b5c                 3=323536.\
256
$ ./XTGETTCAP шо?
Error: unknown capabilitah&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=523045" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:522902</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/522902.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=522902"/>
    <title>Кольорологія терміналів</title>
    <published>2025-03-20T10:28:22Z</published>
    <updated>2025-03-20T10:28:22Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>0</dw:reply-count>
    <content type="html">&lt;p&gt;Ув вікіпідіа написано шо хадварні термінали VT100 (продавалися з 1978
року) та VT220 (1983) були монохромні (кольорові варіянти, напевно,
лише для заможних верств гіпадрілів). Terminfo ув лайнаксі про ці
термінали містить ту саму інформацію:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ for i in dumb vt100 vt220 screen xterm $TERM; do printf &amp;quot;%-20s&amp;quot; $i; TERM=$i tput colors; done
dumb                -1
vt100               -1
vt220               -1
screen              8
xterm               8
xterm-256color      256
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Кілька днів тому, нєкто Поттерінґ, мастодонів про діфолтне значення
&lt;code&gt;TERM&lt;/code&gt;, яке обирає systemd:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#39;The default fallback $TERM we so far picked has been &amp;quot;vt220&amp;quot; … This
deemed us to be a good choice, since (unlike the better known vt100)
these kind of terminals support PageUp/PageDown keys&amp;#39;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Загалом, ув terminfo дивляться зазвичай тільки ютіліти які для
користувацького інтерхфейсу використовують ncurses; решта вгадує
можливості терміналу шляхом слідкування за візерунками руху небесних
тіл, e.g.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;чи є змінна середовища &lt;code&gt;COLORTERM&lt;/code&gt; (нещодавно обраний шлях systemd);&lt;/li&gt;
&lt;li&gt;змінна середовища &lt;code&gt;NO_COLOR&lt;/code&gt; (я би віддав перевагу, навпаки, щось на
кшталт &lt;code&gt;COLOR=1&lt;/code&gt;, бо діфолтне плювання кольорами ув консолі є
страшенний несмак);&lt;/li&gt;
&lt;li&gt;дивитися на &lt;code&gt;TERM&lt;/code&gt; і шукати збіг ув своїй вкомпайлений (не жарт)
табличці, як то робить ls з coreutils;&lt;/li&gt;
&lt;li&gt;механізма terminal-colors.d(5) з util-linux, яким користується
ніхто, окрім деяких ютіліт з util-linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Лайнаксний ls, звичайно, перемагає ув конкурсі найдебільнішого
рішення.&lt;/p&gt;
&lt;img alt="" src="https://sigwait.org/~alex/mm/dreamwidth/coreutils.ls-color.svg"&gt;

&lt;p&gt;Воно друкує барвами для vt100, тому що протягом компіляції coreutils
хапається текстовий хфайла з налаштунками для dircolors(1), який має
ось такі рядки:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;TERM vt100
TERM xterm*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Цей хфайл (його копія зазвичай є ув &lt;code&gt;/etc/DIR_COLORS&lt;/code&gt;) скрипта
перловий конвертує ув символьного масива&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ head -c7 src/dircolors.hin # ув ріпо coreutils
# Confi
$ (head -c61 &amp;amp;&amp;amp; printf 🤡 &amp;amp;&amp;amp; tail -c39) &amp;lt; &amp;lt;(src/dcgen src/dircolors.hin)
static char const G_line[] =
{
  &amp;#39;#&amp;#39;,&amp;#39; &amp;#39;,&amp;#39;C&amp;#39;,&amp;#39;o&amp;#39;,&amp;#39;n&amp;#39;,&amp;#39;f&amp;#39;,&amp;#39;i&amp;#39;,🤡,&amp;#39;r&amp;#39;,&amp;#39;i&amp;#39;,&amp;#39;a&amp;#39;,&amp;#39;b&amp;#39;,&amp;#39;l&amp;#39;,&amp;#39;e&amp;#39;,&amp;#39;s&amp;#39;,&amp;#39;.&amp;#39;,0,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;який потім інклудиться як &lt;code&gt;dircolors.h&lt;/code&gt; ув &lt;code&gt;ls.c&lt;/code&gt;, де є хфункція&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* Check if the content of TERM is a valid name in dircolors.  */
static bool known_term_type(void) {
  char const *term = getenv(&amp;quot;TERM&amp;quot;);
  if (!term || !*term)
    return false;

  char const *line = G_line;
  while (line - G_line &amp;lt; sizeof(G_line)) {
    if (STRNCMP_LIT(line, &amp;quot;TERM &amp;quot;) == 0) {
      if (fnmatch(line + 5, term, 0) == 0)
        return true;
    }
    line += strlen(line) + 1;
  }

  return false;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dircolors(1) також парсить нещасну &lt;code&gt;G_line&lt;/code&gt; та друкує 0 інструкцій для
ls, коли &lt;code&gt;TERM&lt;/code&gt; є відсутня чи несе невідоме значення:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ env -i SHELL=/bin/sh dircolors
LS_COLORS=&amp;#39;&amp;#39;;
export LS_COLORS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;У чому сенс тоді, навіть за відсутності &lt;code&gt;LS_COLORS&lt;/code&gt;, розмальовуювати
множинні character devices з директоріями (довгий масив
&lt;code&gt;color_indicator[]&lt;/code&gt; ув &lt;code&gt;ls.c&lt;/code&gt;, якщо комусь цікаво), але полишати файли
звичайні (кольори для яких &lt;code&gt;G_line&lt;/code&gt; має), залишається невідомим.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=522902" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
  <entry>
    <id>tag:dreamwidth.org,2011-04-06:733589:522590</id>
    <link rel="alternate" type="text/html" href="https://henry-flower.dreamwidth.org/522590.html"/>
    <link rel="self" type="text/xml" href="https://henry-flower.dreamwidth.org/data/atom/?itemid=522590"/>
    <title>Как он пасмєл наєзжать?</title>
    <published>2025-03-01T05:45:46Z</published>
    <updated>2025-03-01T05:45:46Z</updated>
    <dw:security>public</dw:security>
    <dw:reply-count>6</dw:reply-count>
    <content type="html">&lt;p&gt;Найвизначнішою рисою істот з СНД, навіть якщо останнє вони покинули
фізично, залишається гарантована &lt;em&gt;compassion towards victims&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Приклад типовий: &lt;a href="https://stas.dreamwidth.org/1468036.html"&gt;https://stas.dreamwidth.org/1468036.html&lt;/a&gt; разом з
коментарями.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://www.dreamwidth.org/tools/commentcount?user=henry_flower&amp;ditemid=522590" width="30" height="12" alt="comment count unavailable" style="vertical-align: middle;"/&gt; comments</content>
  </entry>
</feed>
