commit -m "better"
3.24K subscribers
1.03K photos
149 videos
3 files
2.39K links
just random thoughts
Download Telegram
https://zivadynamics.com/zrt-face-trainer

Это рендер. Я в полном восторге.

https://www.youtube.com/watch?v=hIfmGQ6AG6A - или вот, например. Где мои 25 и LSD?

———
LLVM weekly.

https://blog.llvm.org/posts/2021-11-18-relicensing-update/ - LLVM почти перешел на лицензию Apache2, осталось совсем чуть-чуть.

https://reviews.llvm.org/rG7f287390d78d, https://bugs.llvm.org/show_bug.cgi?id=20837 - починили знатный баг в сортировке(иногда работала за n^2). Почему бы просто не использовать randomized quick sort?(кстати, тема самого первого поста этого бложика) Наверняка, это поменяло бы ABI, чего авторы libc++ ну никак не могут допустить. #abi

https://reviews.llvm.org/rG2b4948448f03 - например, как запилить теплый ламповый глобальный рефакторинг в монорепе.

———
https://microsoft.github.io/reverse-proxy/ - yet another reverse proxy. Судя по названию, технологию потырили у Я, судя по платформе - нет, таки MS. Когда уже MS перестанет форсить этот унылый мем(NET)?
https://tjournal.ru/news/480589-krupneyshiy-rasprostranitel-lotereynyh-biletov-stoloto-cherez-sud-potreboval-razmestit-svoe-prilozhenie-v-google-play - как вы уже поняли, новость, конечно, очень позитивная.

https://secretmag.ru/zhizn/v-rossii-zadumali-sozdat-reestr-toksichnogo-kontenta-22-11-2021.htm - надеюсь, сервис предоставит RSS. А это какие-то упыри занимаются каким-то леденящим душу пиздецом.

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

———
https://www.notebookcheck.net/First-Intel-Alder-Lake-P-Core-i7-12700H-Cinebench-scores-leave-both-AMD-Cezanne-Zen-3-and-Apple-M1-Max-in-the-dust.579828.0.html
3dnews у них слизал новость - https://3dnews.ru/1054047/publikatsiya-1054047

Очень интересный способ обмануть почтеннейшую публику. Сinebench R20 не умеет в M1, и работает через Rosetta(вот этот факт я проверил не на 100% - лично мне оказалось достаточно того, что он вышел до M1, и что авторы бенчмарка заявили поддержку M1 только в R23(https://www.maxon.net/en/cinebench-tech-info)). Поэтому бенчмарк однопотока мы покажем в R20, и M1 будет сливать. А вот в R23, где добавили поддержку M1, мы покажем только многопоток, потому что у Alder Lake 14 ядер, а не 10, но в однопотоке он будет сливать(легко пересчитывается по результатам многопотока и числу ядер). Ну и пишем, что "по результатам cinebench, новые Alder Lake на 40% быстрее". Красота же!

———
https://reviews.llvm.org/D70631#3149545

В libcxx почти доехал быстрый алгоритм форматирования floating point(https://www.researchgate.net/publication/329410883_Ryu_fast_float-to-string_conversion)

Красота? А как насчет "оно туда ехало 2 года"? Ревью висит с 2019 года, поражаюсь упорству Microsoft. В rust соответствующий код доехал, наверное, за неделю. Че, теперь пару лет ждем, пока доедет быстрый from_string от #Lemire.
У меня при сборке clang под darwin включается вот такой флаг:

{% block setup %}
{% if mix.platform.target.os == 'darwin' %}
export LDFLAGS="-Wl,-w ${LDFLAGS}"
{% endif %}
{% endblock %}

Фактически, мы прокидываем до линкера опцию -w, которая должна убирать предупреждения линкера. К чему это приводит на самом деле:

[259/4503] Building CXX object 
lib/MC/CMakeFiles/LLVMMC.dir/MCStreamer.cpp.o
ld64.lld.darwinnew:
warning: Option `-w' is not
yet implemented. Stay tuned...

Хм, то есть, я прокидываю опцию до линкера, которая должна выключать предупреждения, и она сама выводит предупреждение о том, что опция не поддерживается? ПЖ, ты совсем упоролся со своим бутстрапом?

Самое интересное начинается, если эту опцию убрать. В результате мы получаем такой clang + lld, которые строят некорректные бинарники под darwin(они тупо сегфолтятся на старте).

Почему? Потому что, если выставить такую опцию, то линковка программ начинает писать в stderr на этапе configure/cmake, и система сборки clang начинает думать, что компилятор не поддерживает -fpic/-fPIC, и не добавляет эти аргументы в command line. Ежели собрать clang/lld c такими опциями, он начинает подглючивать(я так полагаю, это где-то бага в районе lld под darwin).

Как я это нашел? Случайно. Случайно был выставлен этот флаг линкера глобально, и когда я его убрал, процесс бутстрапа стал падать после сборки компилятора.

Что будет, когда линкер поддержит эту опцию? Ну, придется выковырять плохие флаги более правильно, пока лень.

———
https://github.com/PhilipHazel/pcre2

Меня сегодня переполняет чистое, незамутненное, счастье!

Обновлял я pcre2, и заметил на странице проекта такой блок текста:

You can check out the PCRE2 
source code via Git or Subversion:

git clone https://github.com/PhilipHazel/pcre2.git
svn co https://github.com/PhilipHazel/pcre2.git

Протер глаза, решил, что Филип совсем уже упоролся со своими регулярками, но решил проверить. И оно таки работает!

https://docs.github.com/en/github/importing-your-projects-to-github/working-with-subversion-on-github/support-for-subversion-clients

Короче, выкинул клиент git, как страшный сон, и пользуюсь божественным svn.

А половине читателей этого бложека должно быть стыдно - наверняка вы мерзко подхихикивали в кулачок, когда я годами жаловался на git, зная про эту фичу. Фу такими быть!
Кстати, каналу уже 2 месяца, поэтому закиньте уже на Патреон, знали бы вы, как надоело жрать Pedigree накидайте ссылок на околоit и научпоп сайты, которые вы читаете? Интересные для меня темы, думаю, вы уже неплохо представляете.
commit -m "better"
Срочно в номер, SJW отакуэ! https://github.com/rust-lang/team/pull/671 "I'm a black latino from a 3rd world country, I hereby declare that I'm voluteering for being a mod." https://www.reddit.com/r/rust/comments/qzme1z/moderation_team_resignation/ http…
Должен сказать, что Mod Team со стороны не похожи на SJW, был неправ. Andrew Gallant, например, автор весьма годной библиотеки регулярок(по следам RE2)(ripgrep я тоже видел, меня лично не заинтересовало).
https://www.opennet.ru/opennews/art.shtml?num=56233

"Проект Airyx развивает редакцию FreeBSD, совместимую с приложениями macOS"

Иногда я не понимаю, что думать, про OSS проекты. Вот этот похож на откровенный стеб - посмотрите на скриншоты, где MacOS, и где вот это поделие? (судя по всему, это вариация GnuSTEP). Сайт(https://airyx.org/) - привет из 80-ых, вырвиглазное нечто. Но Issue tracker и forum живые. Короче, вот про что это? Кто все эти люди, которые качают и ставят себе это поделие?

———
https://www.gwern.net/docs/www/0xeb.net/86e4b3bee45b08ac9249c10b4d649637df73074a.pdf

Феерическая презентация про эмуляцию buffer overflow. Long story short - в оригинальном starcraft от 98 года был проезд по памяти, который эксплуатировался картоделами. Например, благодаря ему запилили карту под starcraft, которая представляет из себя super mario. Карт таких создано было приличное количество, и нужно было, чтобы они продолжили работать в starcraft: remastered от 2017 года. Короче, эпичненько.

———
Мне тут в личных переписках предлагают завести аккаунт на Патреон, или где-то еще. Денег мне не надо, пишу я с гораздо более интересной целью - у меня наполеоновские планы на Mix, но двигать целый дистрибутив в одиночку - ну так себе план. Короче, я ищу себе компанию для этого нелегкого дела. Поэтому лучшее, что вы можете для меня сделать - это привлечь сюда таких же энтузиастов(или, например, рассказать, где их еще можно поискать).

Зачем мне вообще двигать свой дистрибутив? Мне он нравится, но развивать его всю жизнь одному - сложно. Если найдется 100 - 1000 заинтересованных пользователя(а это норм тема, гораздо более странные поделия находят себе пользователей еще больше, выше привел пример), сообща делать это гораздо проще.
commit -m "better"
Я тут хотел накатать большой текст, но решил, что много чести. https://github.com/rust-lang/rust/issues/40174 "For those following various links to this issue, it is important to note that you can compile code using proc_macro to statically-linked musl binaries…
Мужик сказал - мужик сделал. Перешел с Alacritty на #kitty. Правда, это оказалось не так просто, как я ожидал.

#terminal

Kitty разрабатывает индус. Не, натурально, зовут его, кстати, #Ковид, и у него есть скрипт для подсчета объема его лапшеобразного кода - https://github.com/kovidgoyal/kitty/blob/master/count-lines-of-code. Код соответствующего качества.

Например, он зачем-то импортировал цельнотянутые исходники glfw в свой проект, наверное, чтобы увеличить line count. https://github.com/kovidgoyal/kitty/tree/master/glfw

Собирать статически слинкованный бинарь это решительно не помогает.

Так же мне очень нравился рендеринг шрифтов в alacritty(они там более crispy), и я долгое время искал, какую функцию рендера шрифтов MacOS нужно дернуть, чтобы получить нужный результат. Нашел, держите:

https://github.com/kovidgoyal/kitty/blob/master/kitty/core_text.m#L504

Так же #alacritty химичит с вертикальным размером шрифта - почти pixel to pixel я получил, когда обрезал шрифт на 85% исходной высоты. В коде Alacritty я с ходу этого не нашел, там слишком много вхождений литерала 85.

https://www.reddit.com/r/archlinux/comments/n9noje/alacritty_vs_kitty/ - вот, например, сравнение этих двух эмуляторов терминала.

https://wezfurlong.org/wezterm/config/files.html - пока занимался сборкой Kitty, ознакомился и с другими эмуляторами. Этот меня порадовал своим подходом к конфигурации. Конфиг - это код на lua, который должен вернуть dict. Кто-то еще помнит поисковый балансер? Гениальная же штука!

Оказывается, зря я гнал на авторов терминалов - все они понимают, что протокол терминала не позволяет нормально НЕ делать апдейты посреди процесса вывода программой своего интерфейса. Вот, пожалуйста, документ про это - https://gitlab.freedesktop.org/terminal-wg/specifications/-/merge_requests/2. Кстати, наш друг Ковид там тоже засветился. Но если понимают - то что же так криво реализуют существующую схему-то?

Кстати, Kitty мерцает существенно меньше, чем Alacritty, хотя и несколько медленнее.
Купил тут себе новую игрушку. #xiaomi

Давно хотел себе мощный ноутбук с Linux, при этом:

* Желательно AMD. Intel объективно отстали на много лет, при сравнимой производительности у них бешеный теплопакет, и наоборот. От AMD можно взять 16 потоков, от Intel max 8.
* Желательно, без дискретной видеокарты. Меня душит жаба платить за то, что я не использую. Хочется хорошую встроенную - чтобы рисовать ускоренный десктоп, не более того.
* OLED, 4K. Ноутбук с плохим экраном(Apple) у меня уже есть, хочется хорошего.
* Чтобы Linux без танцев с бубном.

Долго искал, пробовал разные варианты, и вот, тададам!!!

https://www.ixbt.com/news/2021/05/24/oled-3-5k-ryzen-7-5800h-100-1055-xiaomi-mi-notebook-pro-15-ryzen-edition.html
https://www.reddit.com/r/linuxhardware/comments/p4a148/2021_xiaomi_mi_notebook_pro_15_ryzen_edition/

Все, как я хотел(не работает только сенсор отпечатков пальцев), и даже лучше:

* Отличная сборка - лучше, чем у dell xps, asus rog
* Цельнопизженный дизайн от Apple. Мне нравится, нечего тут выделываться, и надо воровать лучшее решение на рынке.
* Благодаря AMD сборка в 16 потоков не жарит коленки, как было в моем Mac Book Pro от 19 года.

Что так себе(но было ожидаемо):
* Батарею держит плохо. Ну, топовое ядро + Linux - это заведомо беспроигрышное сочетание. Не думаю, что я со своими требованиями могу найти что-то лучше.
* Ядро хуже, чем M1. Сборка clang где-то 20 минут(топовые результаты можно почитать где-то тут).

Что просто так себе:
* На клавиатуре есть честные pgup/home/end/pgdown, поэтому fn + arrow не работают. В биосе починки я не нашел.
* Тачпад кажется дубовым. Думаю, это особенность libinput, дойдут руки собрать ее - попробую зафиксить.

Что хочу особо отметить:
* ЭКРАН. Экран просто божественный. Он просто бескомпромиссно хороший. Черный - черный. Белый - белый. Везде. Без бликов. При любой скорости скроллинга. Цвета огонь. Шрифты четкие(нет разницы включать AA, или нет - это значит, что точки достаточно мелкие) - на мониторе от Apple вокруг белых шрифтов на черном фоне видно гало. Я не знаю, как это описать - возьмите телефон с хорошим OLED, и представьте, что у вас весь экран такой. Яркость экрана тоже на высоте. Кажется, это первый ноутбук, где я выкрутил яркость не на 100%.
* Не забываем в загрузку ядра добавлять mitigations=off, это 5 - 10% перфа.
* Китайцы не постеснялись сделать в BIOS по умолчанию китайские иероглифы. Я считаю, это правильно. Вот Apple выебы;%ется, и ничего, все равно ее железки раскупают, как горячие пирожки.

В первый раз провел bootstrap с fedora linux, узнал еще много разных и нетривиальных способов, какими сборочные скрипты лезут в систему. perl, например, запускает linker, и по путям к .so пролезает в host систему.
https://www.opennet.ru/opennews/art.shtml?num=56246

Чинят сборку с Emscripten. А я еще удивлялся - чего у меня сломалась статическая сборка питона в 3.11. А это, оказывается, ее шатают для такой благородной задачи. Статическая сборка питона, традиционно, всегда сломана, причем, от релиза к релизу, всегда разным способом. В 3.11 сломали каким-то новым, доселе невиданным, способом(в Modules/Setup оставили модули, часть из которых перенесли в принудительную сборку в Makefile.pre, если кто-то понимает, о чем я), но, надеюсь, раз решили поддержать Emscripten, то больше ломаться не будет. Надо понимать, что сборка под #WASM всегда статическая, сами понимаете, под js в браузере нет никаких .so.

———
https://www.openswr.org/index.html

Начал собирать Mesa, и вот порция свежих знаний. Оказывается, Intel запилил ОЧЕНЬ быстрый software rasterizer для Mesa OpenGL, в десятки раз быстрее, чем llvmpipe. Сравнения с GPU я не нашел, но это уже близко.

———
https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.17-AF_UNIX-Optimization

Оказывается, в Linux все AF_UNIX сокеты живут под одним big lock. Я из текста не понял, это один lock на все, или это только изначальное отображение int fd на внутриядерную структуру(которая сама уже живет без этого big lock). В любом случае, это жесть, и разработчики решили это дело поменять хотя бы на шардированный lock. Дело хорошее, всяким local rpc, типа Wayland, D-Bus, etc, должно стать хорошЕе.
Новости бутстрапа.

Я собрал opengl, во всех его ипостасях(egl, gles[1, 2, 3], etc). Про то, что у меня теперь драйвер видеокарты влинкован в Sway, я расскажу отдельно. А сегодня - про Mesa(https://www.mesa3d.org/). Mesa - это:

1) Реализация различных API(OpenGL, Vulkan, D3D(да, да, он там есть, нативный, но разработчики это скрывают, потому что не хотят, чтобы им пользовался кто-то, кроме Wine))
2) OSS ускоренные драйвера(AMD, Intel, Noveau, Mali, etc)

Вы знаете, я был очень приятно удивлен. Я никогда не видел такой хорошей кодовой базы на C. Чистый, понятный, код, разумное разделение на слои и разделение ответственности. Если вы хотите(хз, правда, зачем) научиться, как хорошо писать на С - почитайте кодовую базу Mesa.

Я почитал(зачем? проект загружает драйвера в виде .so, это требует некой творческой доработки для статической линковки), и имею вам сказать следующее:

1) Что-то я разуверился, что #asahi linux достигнет какого-то разумного прогресса в плане ускоренного десктопа. Все очень просто. Код для asahi в Mesa - это 200 килобайт, драйвер и компилятор шейдеров. Код развитого драйвера в #Mesa - 5 и более мегабайт. Я не верю в чудо, что разработчики asahi смогли уместить такую сложную штуку, как Apple GPU, в 200К. Я не видел там реализации по существу, все это больше похоже на какой-то boilerplate. :(

2) Благодаря Mesa появилась система сборки Meson(https://mesonbuild.com/). На ней основана сборка практически всего графического стека Linux. И это очень хорошая(не побоюсь сказать, что лучшая OSS) система сборки:

* Мало внешних зависимостей. Фактически, только Python. Python собрать проще и быстрее, чем CMake.
* Сборочные файлы основаны на кастрированном подмножестве Python, чтобы не жестить(https://mesonbuild.com/GuiTutorial.html). Skylark украл эту идею из Meson. Сборочные файлы по большей части декларативные, но немного императивщины дозволено - все же, OSS, много настроек, вариабельность.
* Действительно хорошая поддержка тулзов - Meson знает про clang, lld, и умеет с ними обращаться.
* Сборочные скрипты очень чистые и понятные - без жести, все очень по существу вопроса.
* Хорошо поддерживает вариабельность сборки(настройки). Настройки лежат в отдельном файле, их можно узнать, не читая сборочные скрипты. Это реально удобно. В gnu #autohell для этого нужно запустить configure, и не факт, что он выдаст все настройки. В CMake это IMHO вообще невозможно - любой -DXXX - это настройка, выгрепать их все - невозможно.
* Поддержка кросс-компиляции.
* Идеальный custom_command - {'inputs': [...], 'outputs': [...], 'descr': '...', cmd: ['A', 'B', 'C']}. Кто занимается системами сборки, тот поймет. Я аж прослезился.
* Не мешает, и даже помогает, задаче герметичной сборки. Это редкость.
* Очень быстрый configure stage.
* Не совсем про Meson, но. Оно поддерживает coverity из коробки. И werror из коробки. Это многое говорит о проектах, которые ее используют.

Подобное есть в Bazel, но он очень тяжелый, и зависит от Java.

В общем, я свои проекты портирую на #Meson, и вам желаю того же. Хорошая, годная, вещь.

Ну и вот еще - https://gms.tf/the-rise-of-meson.html Meson очень быстро набирает популярность!
https://www.youtube.com/watch?v=9vyh1APsMAE #abi

IMHO C++ тоже постепенно тонет. И, вот, IBM зачерпывает водички из-за борта, и заботливо подливает в трюм - https://reviews.llvm.org/D111323

TL;DR - поддержка EBCDIC в libc++. На поддержку ICU у IBM мейнфрейма не нашлось(https://icu.unicode.org/#h.fnv22un0oe4t), а тут на тебе!

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4210.pdf - труп их же триграфов еще остыть не успел.

———
https://www.opennet.ru/opennews/art.shtml?num=56265

Про #Vizio и GPL я тут уже писал. Дело принимает интересный оборот, я даже не знаю, кто из сторон бОльший негодяй. Vizio просит прекратить суд, потому что правообладателям кода типа пофиг. Е;%ла жаба гадюку, что называется.

———
https://dwheeler.com/trusting-trust/

Про технику diverse double compiling для защиты от trusting trust я тут тоже писал, вот, текст с комментариями про это, и с кучей интересных ссылок. Мне особенно зашла https://static.lwn.net/images/conf/rtlws11/random-hardware.pdf - "Analysis of inherent randomness of the Linux kernel"
Жесть, самый странный #debug в моей жизни.

pg@:~/sources/mix strings ~/mix/realm/stable/bin/sway | grep hello
pg@:~/sources/mix ldd ~/mix/realm/stable/bin/sway
не является динамическим исполняемым файлом
pg@:~/sources/mix HELLO YES THIS IS DOGHELLOYES THIS IS DOG^C
pg@:~/sources/mix
pg@:~/sources/mix ldd ~/mix/realm/stable/bin/sway
не является динамическим исполняемым файлом
pg@:~/sources/mix strings ~/mix/realm/stable/bin/sway | grep HELLO
pg@:~/sources/mix strings ~/mix/realm/stable/bin/sway | grep DOG
HB_SCRIPT_DOGRA
G_UNICODE_SCRIPT_DOGRA
pg@:~/sources/mix 12345HELLOYES THIS IS DOG890
bash: 12345HELLOYES: команда не найдена
pg@:~/sources/mix 12345 HELLO YES THIS IS DOG 890

Я собрал sway, который вместо 6 и 7(пишу с другого хоста) печатает вот то, что вы видите сверху. Я, короче, в шоке. libinput:

5 event4   KEYBOARD_KEY            +1.513s  *** (-1) released
event4 KEYBOARD_KEY +1.967s *** (-1) pressed
HELLO event4 KEYBOARD_KEY +2.059s *** (-1) released
event4 KEYBOARD_KEY +2.345s *** (-1) pressed
YES THIS IS DOG event4 KEYBOARD_KEY +2.433s ***
(-1) released
event4 KEYBOARD_KEY +3.082s *** (-1) pressed
event4 KEYBOARD_KEY +3.330s *** (-1) pressed
^C

Вывод - приходит 1 нажатие, которое далее преобразуется в этот текст. Wayland передает клиентам keystrokes, значит, ошибка в коде клиента. Проверяем:

recvmsg(5, {msg_name=NULL, msg_namelen=0, msg_iov=
[{iov_base="\34\0\0\0\3\0\30\0n\n\0\0
\376\251d\5\10\0\0\0\1\0\0\0", iov_len=3128}, {iov_base=
"", iov_len=968}], msg_iovlen=2, msg_controllen=0,
msg_flags=MSG_CMSG_CLOEXEC}, MSG_DONTWAIT|MSG_CMSG_CLOEXEC) = 24
write(7, "YES THIS IS DOG", 15) = 15
timerfd_settime(6, 0, {it_interval={tv_sec=0,
tv_nsec=40000000}, it_value={tv_sec=0, tv_nsec=600000000}},
NULL) = 0
epoll_pwait(3, [{events=EPOLLIN,
data={u32=2820241184, u64=5633522366240}}], 8, -1, [], 8) = 1
read(7, "YES THIS IS DOG", 24576) = 15
read(7, 0x7ffecfe04050, 24576) = -1 EAGAIN
(Ресурс временно недоступен)

[root@dynamic-vpn pg]# ls -la /proc/3101931/fd/7
lrwx------. 1 pg pg 64 дек 3 07:42 /proc/3101931/fd/7
-> /dev/ptmx

Единственная подозрительная библиотека, с которой слинкованы все клиенты:

/* Multiple keysyms. */
TEST_KEY(KEY_6, "HELLO", 0);
TEST_KEY(KEY_7, "YES THIS IS DOG", 0);

libxkbcommon-xkbcommon-1.3.1/test cat state.c | grep DOG
TEST_KEY(KEY_7, "YES THIS IS DOG", 0);
TEST_KEY(KEY_7, "YES THIS IS DOG", 0);

С%ка, я чуть не поседел... Один, печатаю в терминале, и тут на экране появляется "HELLO YES THIS IS DOG"...

Как оно пролезло из теста в реальный бинарь - в следующей серии.
commit -m "better"
Жесть, самый странный #debug в моей жизни. pg@:~/sources/mix strings ~/mix/realm/stable/bin/sway | grep hello pg@:~/sources/mix ldd ~/mix/realm/stable/bin/sway не является динамическим исполняемым файлом pg@:~/sources/mix HELLO YES THIS IS DOGHELLOYES THIS…
Вот починка, из одной строчки. Дело в том, что make install этого пакета не ставил необходимые данные. Я посмотрел, что с установленной системе эти файлики похожи на содержимое test/data, и просто скопировал тестовые данные в production. Получилось то, что получилось. Где живут настоящие данные, я пока не нашел, поэтому копирую их из системы, чтобы можно было двигаться дальше.

https://github.com/pg83/mix/commit/df138dda7508c7024a372262b8f593bb8fcfb84d#diff-041427458f79449f1c1f36bb41796c56acaaa27b91363293fb6cb62af04a209eR33
Forwarded from Daniel Lemire's blog
Science and Technology links (December 4th 2021)

It used to be that all the exciting new processors came from Intel and AMD, and they were meant for your PC. The mobile revolution changed that: it lead to the production of fantastic processors that used little energy. We are now moving back into laptops and servers. The leading supplier of servers is probably Amazon: if you want to run servers for your business, your first choice is often Amazon and its cloud computing infrastructure. And Amazon now makes their own processors. Initially, they made low-cost chips that were secondary to Intel and AMD powerful processors. Amazon released its latest processor, Graviton 3. It is a much wider and deeper chip: The N1 core used in the Graviton2 chip had an instruction fetch unit that was 4 to 8 instructions wide and 4 wide instruction decoder that fed into an 8 wide issue unit that included two SIMD units, two load/store units, three arithmetic units, and a branch unit. With the Perseus N2 core used in the Graviton3, there is an 8 wide fetch unit that feeds into a…

https://lemire.me/blog/2021/12/04/science-and-technology-links-december-4th-2021/
https://repositories.lib.utexas.edu/bitstream/handle/2152/86210/P-2018-02_Intel_Address_Hashing.pdf?sequence=3 (TACC уполномочен заявить!)

Тут вот коллега* прислал красивое. Long story short - у ядер процессора, помимо приватных L1/L2 есть общий LLC. Он устроен примерно так - у каждого ядра есть своя частичка LLC, они все объединены общей шиной, все это организовано в 12-way associative hash table(по хешу от адреса мы понимаем, в какое ядро и в какую его ячейку идти за нужным нам cache line).

Статья про свойства этого хеша, и про то, что false sharing иногда бывает очень сильным.

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

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

*: Гулин

———
https://tvl.fyi/blog/rewriting-nix

Товарищи решили переписать пакетный менеджер Nix. Причина - он тормозной, что пипец(подтверждаю, обновить 10 пакетов пустым обновлением у меня занимает секунд 20).

1) Товарищи решили поддержать динамическую генерацию графа(когда ноды могут сгенерить новые ноды). Я считаю, что это жесть и путь в никуда.
2) Интересное - "PS: TVL is international, but a lot of the development will take place in our office in Moscow. Say hi if you're around and interested!" - а я вот не знал.

———
https://riscv.org/announcements/2021/12/riscv-ratifies-15-new-specifications/

Теперь risc-v можно официально использовать в серьезных вещах - векторные расширения и гипервизор, в официальных спеках.
https://codeberg.org/dnkl/foot/wiki/Performance #terminal

Я вот решил попробовать какой-то другой эмулятор терминала, один из самых популярных not hardware-accelerated - #foot. Автор, конечно, всячески пытается сделать вид, что он не конкурирует с alacritty:

1) Но вот в тест, где он рвет #alacritty, "срежиссирован" специально - он строчкой ранее пишет, что alacritty гораздо быстрее рендерит пустые глифы, чем заполненные, и, чтобы показать преимущество своего damage control, показывает этот damage control на полностью заполненном терминале. На терминале с небольшим числом непустых глиф даже его damage control не показал бы преимущества.

2) Чтобы его foot не совсем сильно тормозил, он сделал оптимизацию с копированием части буфера через memcpy, если он считает, что она не изменилась. И набажил - у меня при скроллинге, если предыдущие строки немного похожи на следующие, начинаются глюки отрисовки.

Ну не соревнуешься - так не соревнуйся, сделай простую, как 5 копеек, вещь, которой можно пользоваться без hardware acceleration.

———
https://github.com/dvdhrm/kmscon

#kmscon

Какой-то странный проект по замене линуксовой консоли во frame buffer. Я тоже задумался о такой штуке, но мне показалось, что гораздо проще взять киоск-style композитор на основе wlroots, и слинковать в одну программу эмулятор терминала(любой), киоск-style композитор, libinput, и все такое. Получаем бинарь с клиентом-терминалом и сервером-композитором, который умеет в консоль в fb.

———
Я хочу признаться в одной странности, которая меня никак не отпускает. Я строю prefix trie из путей к проектам в своей системе сборки Mix. Что это значит?

lib/pcre, lib/pcre/2, а не lib/pcre2. lib/tom/math, lib/tom/crypt, а не lib/tommath, lib/tomcrypt. lib/z, а не lib/zlib(а это уже что, граф?), net/wget и net/wget/2, и самое любимое - lib/curses/n, lib/curses/netbsd. Пока не сжал dev/build/autoconf, dev/build/automake, но руки чешутся.

Я хз, зачем я это делаю, но мне нравится!

———
У меня было время почитать интернеты про #Vizio и ее предполагаемое нарушение GPL, понял, что зря записал ее в негодяи в прошлый раз. Вот то, что она пытается отменить суд на основе того, что иск подал не владелец кода, это не значит, что они негодяи, и у них нет возможности доказать, что они не используют GPL в своей прошивке, а это просто очень "техническая" вещь - так дешевле.
Будни #bootstrap.

Собирал тут правильные данные для xkbcommon(ага, те самые "YES THIS IS DOG"). Думал, задачка на 5 минут, но пришлось собрать Perl с вкомпиленными в него модулями. Не то, чтобы я очень хотел это делать, но по цепочке из GNU-того говна из Perl и Bash в проект приехала зависимость от XML::Parser модуля, которому нужен expat. Я сделал это как-то очень странно - подложил в сборку Perl из исходников модуль из Cpan, и он его каким-то чудом подхватил. Магия.

https://github.com/pg83/mix/blob/main/pkgs/dev/lang/perl5/full/mix.sh#L16

Еще из интересных технических решений(в этом же файлике ниже) - сборке этого модуля не хватает miniperl, поэтому я ловко подсовываю вместо miniperl интерпретатор, собранный ранее.

———
https://github.com/nineties/planckforth/blob/main/bootstrap.fs

Потихоньку изучаю Forth, и мне таки начинает казаться(кажется, в этом чате мне об этом уже писали), что для задачи бутстрапа из ничего Forth подходит лучше, чем даже Lisp. Есть что-то магическое, когда поток токенов становится все более и более насыщенным смыслом.

———
Решил тут попробовать воспользоваться firefox, а то chrome у меня в Sway глючит. Мне даже понравилось - с помощью расширения Tree Style Tabs получилось настроить Firefox так, как должен выглядеть браузер(скриншот будет в комментариях, если скриншотилка заработает под Wayland).

IMHO Firefox нужно выкинуть свою реализацию Java Script. Это не то, что придает уникальный привкус браузеру(когда у меня clang начинает побеждать gcc, я выкидываю gcc, и не рефлексирую), на это уходит много ресурсов разработки, и в Мозилле работают не самые крутые инженеры. Java Script от Гугла круче.
#LLVM news.

https://reviews.llvm.org/rG6a9487df73e9 - полезная проверка, что строки не конструируются от nullptr. Впрочем, начиная с С++2023 соответствующие конструкторы просто забанены.

llvm считает важным упомянуть вот об этом замечательном событии, и мы тоже, вслед за всем прогрессивным человечеством!

"The next Women in Compilers and Tools meetup will take place on December 9th. It will feature Sangeeta Chowdhary’s talk, Fast and Precise Approaches to Detect, Debug, and Repair Numerical Errors."

———
https://www.opennet.ru/opennews/art.shtml?num=56291 #yeswecan #provider

Несколько раз уже писал, что инфраструктурная площадка не может сама себе быть судьей, и решать, кто может пользоваться ее сервисом, а кто нет. Вот пример правильного поведения инфраструктурной площадки, всем бы брать с нее пример. С самим решением суда я не согласен*, но это правильный путь.

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

———
https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)

"every frame is perfect", ага.

1) Разработчики Firefox умудрились устроить мне мерцание даже в Wayland, хорошо заметно под нагрузкой.

2) Авторы Sway вообще не понимают, как надо делать композитор. При переключении рабочих столов они сначала рендерят frame, показывают его, а потом уже применяют накопившиеся(пока рабочий стол был скрыт) изменения к итоговой картинке. Это приводит к тому, что первый кадр всегда содержит stale данные. И, соответственно, к мерцанию.

Кстати, лет 10 назад, когда про Wayland еще никто ничего не знал, Я любил мне показывать фотографии вот этой замечательной женщины, когда я что-то искал на тему.

https://yandex.ru/images/search?from=tabbar&text=wayland%20susann

Так я и полюбил латекс.
😁1
Галопом по Европам.

А вы знали, что можно писать не sed -e s///, а sed -e s|||? Я вот узнал всего полгода назад, и мне это уже сэкономило кучу нервов и сил на эскейпинге /. Наверняка это всем давно известно, и никому не интересно, но я вот не знал.

———
https://hacks.mozilla.org/2021/12/webassembly-and-back-again-fine-grained-sandboxing-in-firefox-95/

Мозилла начала делать какую-то очень странную вещь. Часть библиотек они компилируют не в исполняемый код, а в #WASM, и джитят во время работы. Это им дает возможность установить менее большую surface для особо опасного кода, и, типа, так безопаснее. Я имею сказать:

1) Норм тащить в проект 1000000 строк кода, чтобы обезопасить 10000? Впрочем, JIT для WASM и так и так бы был.

2) А почему бы не сделать на WASM весь браузер? https://pbs.twimg.com/media/ELxt9LSXUAMlmIp.jpg А, было же такое - https://en.wikipedia.org/wiki/HotJava , не полетело.

———
https://codeberg.org/dnkl/foot/pulls/461 #foot
https://gitlab.freedesktop.org/terminal-wg/specifications/-/merge_requests/2

#terminfo

Я тут пару раз писал про разные эмуляторы терминала, и сокрушался, что их авторы не хотят реализовывать нормальный протокол для tear-free rendering. Потом я написал, что, оказывается, разработчики терминалов в курсе этой проблемы, и даже изобрели syncronized updates, но почему-то все равно не хотят реализовывать правильный протокол. Я еще раз перечитал доступные тексты, и понял, что разработчики терминалов считают проблему решенной - кому надо(я, например), могут использовать syncronized updates, а проблемы негров(ncurses, например) шерифа не волнуют.

Пока читал, выяснил, что эти прекрасные люди не смогли договориться до одного варианта, и придумали аж целых два. Я оба и реализовал: #kitty #foot

https://github.com/pg83/ted/commit/a0aa84567efb7ac0760fde048dae0acf805fd188

В ncurses, наверное, не появится никогда.
Давеча писал, что перешел с git на svn при использовании github. Увы, недолго музыка играла, не работает переименование каталогов. Пришлось откатиться назад, на inferior решение.

———
Про #monospace шрифты! #font

Мне очень нравится шрифт Input Mono, он вышел 7 лет назад, я его эти 7 лет и использую. Это не очень популярный шрифт, и, когда я заметил его использование на одном там скриншоте в одном там чате, я спросил, "не Input ли это Mono". Оказалось, что это JetBrains Mono. Короче, шрифт 1 в 1. Ммм, не то чтобы они похожи, они 1 в 1, пару отличий я искал с лупой, в side by side terminal.

https://habr.com/ru/post/237179/
https://input.djr.com/
https://fonts.google.com/specimen/JetBrains+Mono

Input круче, потому что это не 1 шрифт, это конструктор шрифтов - можно выбрать много разных вариантов(толщина линий, межстрочный интервал, ширина символов, начертание символов). При некоторых настройках, повторю, получается JetBrains Mono. Кажется, единственное заметное визуальное отличие - это написание буквы "u".

С одной стророны, я рад, что самый лучший шрифт наконец-то стал популярным, с другой - жалко, что не под своим оригинальным именем(думаю, Jet Brains просто купили на него лицензию, упоминания этого факта я нигде не нашел).

———
Assembler porn!

https://github.com/haileys/doslinux/tree/master/script

DOS services for Linux, нет, really. Я думал, шутка, почитал исходники - все честно. Запускаем dos, запускаем в нем TSR, которая будет обслуживать прерывание для входа в Linux, входим в unreal mode(офигенный режим, кстати!), копируем ядро в высокую область памяти, входим в него, вместо init запускаем код, который будет передавать управление в dos TSR, и наоборот(потому что важно, чтобы вызов из dos приходил в контексте какого-нибудь существующего процесса Linux). Что-то по типу того, как работал DOS4GW. Я сначала было подумал, что там MMU-less сборка ядра, но нет, все честно.

https://trixter.oldskool.org/2012/12/17/maze-generation-in-thirteen-bytes/

Или вот генерация лабиринта за 10 байт ассемблера i386(все же, у x86 очень компактная кодировка)!
https://www.phoronix.com/scan.php?page=news_item&px=More-Apple-M1-For-Linux-5.17

Вот тут вот пишут, что в ядро добавили еще больше M1. В mesa я никакой активности про драйвер не вижу, увы. И, если уж начал про mesa и аппаратное ускорение, то я осилил статически слинкованный opengl и аппаратно ускоренные драйвера в одном бинаре.

pg@:~/sources/mix ls -la /home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway
-rwxr-xr-x 1 pg pg 206469240 Dec 10 17:10
/home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway
pg@:~/sources/mix strip
/home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway
pg@:~/sources/mix ls -la
/home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway
-rwxr-xr-x 1 pg pg 78393840 Dec 10 18:51
/home/pg/mix/store/
106d22493865f8686a8eb38db12e4711
-b-shell-sway/bin/sway

Я думал, будет раза в 3 больше. Впрочем, я нашел интересный способ не линковать #LLVM в каждый бинарь.

https://docs.mesa3d.org/drivers/zink.html - реализация opengl поверх vulkan. #zink
https://www.opennet.ru/opennews/art.shtml?num=51026 - компилятор шейдеров от Valve, который не требует LLVM. Все #хорошее в графическом стеке Linux делают корпорации!

Совместно это дает ускоренный OpenGL, не зависящий от LLVM.

К сожалению, Vulkan мне пока не удалось завести. Разработчики Khronos Group - какие-то невменозы. Я тут уже однажды писал, что делают разрабы, когда у них заканчиваются задачи. Ответ - начинают их себе выдумывать на ровном месте. Вот это и делает Khronos Group. Мегабайты кода аццкого качества, задача которого - загрузить .so, экспортировать из нее функцию, которая вернет структуру, заполненную коллбеками(короче, интерфейс). Где-то там происходит нечто, из-за чего какой-то коллбек от драйвера становится nullptr, и все падает. Копипаста между разными репозиториями одного проекта, где-то заголовки используются из системы, в виде библиотеки, где-то их нужно положить рядышком, во время сборки. Разные репозитории имеют не совместимые друг с другом версии. Там 4 важных репозитория, если взять их последние релизы, они не совместимы друг с другом. У этих гондонов даже есть файлик с номерами ревизий, с которыми, типа, работает. Не с зарелиженными версиями, с ревизиями! https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/scripts/known_good.json

Стык загрузчика от Khronos Group и кода Mesa - это жесть. Им там не хватает информации в передаваемых контекстах, поэтому там вовсю всякие пертредные хештаблицы со всякими недостающими запчастями.

Зато я впервые трассировал графический драйвер, это интересно.

Нашел странную упячку в Mesa - там есть шейдерный кеш, и там есть часть ключа в этом кеше, которая зависит от dl_iterate_phdr на какую-то определенную функцию в библиотеке(https://github.com/mesa3d/mesa/blob/main/src/util/build_id.c#L118). Мне кажется, они таким странным способом хотели сказать, что кеш нужно инвалидировать при смене версии библиотеки, очень интересным способом(название исходника как бы намекает на это).

Дело осложнилось тем, что на границе кода #Mesa <-> Khronos Group происходит потеря информации в возвращаемой ошибке, поэтому драйвер просто возвращал "не могу проинициализироваться", без указания из-за чего, и где. Кстати, как эта проблема решается в языках без динамических исключений, типа Rust, когда коллбек имеет более богатую ошибку, чем вызывающий код может прокинуть наверх?

Отдельно, конечно, хочу сказать, что все эти графические API делают люди, которые вообще ничего не понимают в дизайне систем. Компилятор шейдеров в виде библиотеки, которая линкуется в каждую программу? Ну такое. О том, что можно и нужно для этого запустить демон - не, не слышали.