commit -m "better"
3.45K subscribers
1.17K photos
165 videos
3 files
2.6K links
just random thoughts
Download Telegram
Forwarded from Топ Twitter
😁13👍3🤩2🔥1
commit -m "better"
https://vgel.me/posts/mmap-arena-alloc/ "mmap(1Tb): A Rust arena allocator (ab)using Linux overcommit" Чувак написал memory pool поверх mmap. Как обычно, 2/3 статьи восхваляют Rust, еще 1/3 - некрасивые врапперы над системным примитивом(mmap, в данном случае)…
Мне, пока я писал про memory pool на 1TB, вспомнилась история с одной нашей программой, которая ласково называется "движочек".

Программа использовала похожую технику. На старте каждого треда(на самом деле, корутины, но этот факт просто затруднит рассказ, но ничего не привнесет в него, поэтому пусть будет тред) выделялось 16 мегабайт памяти на стек, и дальше программа старалась минимизировать число динамических аллокаций, и использовать всякого рода memory pool, созданные на этом стеке.

Как?

char buf[1000000];
MemoryPool pool(buf, sizeof(buf));
someFunc(pool);

В какой-то момент времени заметили, что программа снова утекает.

(почему снова? Потому что программа была сложная, со сложной судьбой, берущей свои начала в C. А санитайзеры с ней тогда еще не умели работать)

Долго с этим ковырялись, в конце концов выяснилось красивое:

Стеки выделялись с overcommit, и переиспользовались. Запросы, которые обрабатывала программа, могли сожрать как 2 килобайта стека, так и 16 мегабайт.

Поэтому, с течением времени, каждый стек из пула обрабатывал "тяжелый" запрос, и "закоммичивался" на свой полный размер.

Выглядело это как утечка.

Как это починили?

Рассматривалось несколько разных решений:

* тред-реклеймер, который бы с каким-то постоянным rate возвращал бы пулы в систему

* В конце каждого запроса бросать кубик, и, с небольшой вероятностью, возвращать(или munmap, или madvise, это неважно) память в систему.

* Завести счетчик использования для каждого пула.

Как конкретно было сделано в движочке, я не помню, коллеги, которые меня читают, если захотят, расскажут в комментариях :)

Я особо хочу заострить внимание на вероятностном способе. Он применим много где, но про него, почему-то, мало кто знает.

Чаще всего его надо использовать, когда у вас горит здесь и сейчас, и проблему надо решить быстро - за единицы и десятки минут. Например, разросся какой-то кеш в программе, и все начало oom-иться - можно добавить в code path на добавление элемента бросание кубика и очистку кеша.

Это, конечно, скорее, про "починить быстро и грязно, чтобы получить время на нормальную починку", но, так-то, знаю места, где подобное грязное решение просуществовало несколько лет, прежде чем появилась нужда в чем-то более качественном.
🔥9👍4🐳3
Forwarded from Дидлошная
😁22🥴4🔥1
commit -m "better"
Прекрасное от того же автора, что и текст про статическую линковку: #gavin https://news.ycombinator.com/item?id=28737554 https://yzena.com/yzena-copyleft-license/ (пункт 16) #copilot Товарищ заодно еще и автор новой лицензии на OSS, основная фишка которой…
https://www.opennet.ru/opennews/art.shtml?num=58055
https://lobste.rs/s/ukgknn/github_copilot_litigation

#copilot

Мне особо нечего добавить к тексту на opennet, он реально хороший, разве что:

* Я не юрист, но, кажется, цитирование скольки-то строк не создает нарушение copyright.

* Чем обучение copilot отличается от обучения меня? Я, когда прочел код, и сам написал похожий, тоже нарушил copyright?

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

* Я, с точки зрения отношения к #strong_ai, луддит, но эту лавину уже не остановить, поэтому зачем ее тормозить - непонятно.
👍5🤩3🤔1🤯1
https://github.com/hanslub42/rlwrap #terminfo

Релиз ничем не примечателен, кроме того замечательного факта, что он у меня сегфолтится.

Но я подумал, что, наверняка, есть коллеги, которые не знают про эту замечательную утилиту.

TL;DR - она добавляет readline в любую внешнюю программу, которая ориентирована на построчный ввод. С автодополнением, и прочими ништяками.

Конечно, было бы правильно, если бы этим занимался ваш терминал.

Ну, реально, если бы API терминала был чуть менее асинхронным, и можно было бы сделать синхронный вызов в него. Пишешь в него специальную ESC последовательность, а он тебе - строку с результатом в твой stdin.

Сразу исчезли бы все проблемы с лицензией на GNU readline, и она стала бы доступна по клиент-серверной модели всем желающим.

Вряд ли, конечно, господа терминало-писатели до этого договорятся. #foot
👍6
commit -m "better"
#svg С иконками, я, конечно, намучался. * Пути к дефолтным иконкам в тулкитах. * Какие иконки должны быть. * Часть иконок в Adwaita лежит в png, часть - в svg, эти множества частично пересекаются. Что выберет то или иное приложение, одному (хз знает кому)…
Решил я запилить простенький демон, который бы по запросу вычитывал svg, вызывал бы inkscape, и отдавал бы отренжеренную иконку.

А плагин для отрисовки svg в gtk(gdk-pixbuf) ходил бы в этот демон, вместо того, чтобы вызвать бажную и глючную librsvg.

Но, перед тем, как пилить код, решил проверить, сколько вообще inkscape рендерит простейший svg файл:

pg-> time inkscape -o ~/qw.png -w 100 
window-close-symbolic.svg

real 0m0.160s
user 0m0.147s
sys 0m0.014s

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

(надо сказать, что сам рендеринг там быстрый, но вот cold start inkscape - тормозит)

Думал я, думал, и, в конце концов, плюнул на всю воображаемую красоту, и наговнокодил вот этот скриптец - https://github.com/pg83/ix/blob/main/pkgs/aux/adwaita/icons/png/ix.sh

Он готовит пакет с преренжеренными иконками в png формате, для любой наперед заданной темы, с помощью inkscape.

Все иконки из adwaita, например, заняли 10 мегабайт.

Артефакты рендеринга с таким пакетом иконок, понятное дело, ушли.

Ну, ладно, если попытаться отрендерить некоторые иконки в нестандартном разрешении, они все еще будут некрасивыми, но свои 90% профита я в данном месте съел.

А вы, конечно, сидите на inferior rendering от rsvg, да!
👍8😈3🔥1
commit -m "better"
Меня тут в комментариях спрашивали, что я собираюсь делать с вопроизведением звука через bluetooth, потому что в Linux оно нормально работает только через PipeWire. #cras #sndio Я на это ответил, что у меня есть 2 варианта: 1) alsa умеет предоставлять bluetooth…
ChromiumOS, это, конечно, кладезь полезного кода, жалко что Google не двигает все его запчасти в ширнармассы. Решения инженеров из Гугла мне нравятся больше, чем решения бородатых дядек из RedHat.

https://chromium.googlesource.com/chromiumos/platform2/+/master/vm_tools/sommelier/

Вот, например, совершенно замечательная штука - nested wayland compositor.

Я пока не придумал, куда мне ее применить, но, кажется, что, с ее помощью, можно научиться переживать смерть основного композитора.

Так же она позволяет запустить набор окон со своим уникальным scale.

Написано оно весьма неплохо, если интересно, как запилить свой композитор, то лучше почитать ее, нежели sway/wlroots.
👍9💯1
https://www.phoronix.com/news/Linux-DRM-Process-Start-With-X

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

Так-то это нормальная практика, я несколько раз писал, что это делает, например, #mesa. Кстати, не помню, рассказывал или нет, но в одной из версий они проапдейтили этот механизм так, что он начал матчить хаки по md5 от бинарника(https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/util/00-mesa-defaults.conf#L888). В мире Linux это имеет мало смысла, а вот в мире игруль под wine(windows, valve, etc) это, конечно, имеет смысл.

https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/util/00-mesa-defaults.conf - вообще, посмотрите, сколько тут всяких интересных хаков для разных программ.
👍42😁2👎1
Я вам сегодня расскажу, что такое катарсис!

Катарсис, это когда:

* тебе нужно указать зависимость gtk -> набор иконок по умолчанию(скажем, adwaita)
* ты понимаешь, что рендеринг этих иконок у тебя сломан, потому что старая librsvg
* ты хочешь отрендерить эти иконки с помощью inkscape
* и тут появляется кольцевая зависимость, потому что inkscape -> gtk -> adwaita -> inkscape
* ты полгода пилишь свой графовый движок, чтобы он был достаточно хорош, чтобы понять, что data runtime dep не портит uid сборки, и сборка inkscape + gtk + adwaita - это ровно то же самое, что сборка inkscape + gtk + no icons
* и, наконец, разбить этот цикл, сказав, что inkscape для сборки - это inkscape, но с "gtk без иконок" - https://github.com/pg83/ix/commit/95eeebcce8a347873dbbf2b4ec54915265c7b1ff
* самое главное - что получившийся "inkscape без иконок" имеет тот же uid, и команду для сборки, что и "inkscape с иконками", то есть, у нас не случилось extra work!

То вот это вот - катарсис! :D
👍8🔥8😁3👎2🤔2
Oops!…I Did It Again

У меня тут, при переходе на #QT 6.4, каким-то очень странным образом начала коркаться телега, при попытке отобразить какие-то очень специфические картинки:

[Switching to LWP 14132]
0x0000000009f795b7 in QRgba64 const* fetchTransformedBilinear64<(TextureBlendType)4>(QRgba64*, Operator const*, QSpanData const*, int, int, int) ()
(gdb) bt
#0 0x0000000009f795b7 in QRgba64 const* fetchTransformedBilinear64<(TextureBlendType)4>(QRgba64*, Operator const*, QSpanData const*, int, int, int) ()
#1 0x0000000009f87338 in handleSpans<BlendSrcGenericRGB64>(int, QT_FT_Span_ const*, QSpanData const*, Operator const&)::{lambda(int, int)#1}::operator()(int, int) const ()
#2 0x0000000009f87444 in void std::__1::__function::__policy_invoker<void ()>::__call_impl<std::__1::__function::__default_alloc_func<handleSpans<BlendSrcGenericRGB64>(int, QT_FT_Span_ const*, QSpanData const*, Operator const&)::{lambda()#1}, void ()> >(std::__1::__function::__policy_storage const*)
()
#3 0x000000000a4ce3a1 in QThreadPoolThread::run() ()
#4 0x000000000a4cbdb9 in QThreadPrivate::start(void*) ()
#5 0x000000000a746a6c in start ()
#6 0x0000000000000000 in ?? ()

Проблема в том, что в дебажной сборке нихрена не видно - не падает, а как(и куда) нести такое - непонятно.

Поэтому базовую библиотеку qt я(временно!) собираю без оптимизаций - https://github.com/pg83/ix/blob/main/pkgs/lib/qt/6/base/ix.sh#L61, так оно делает вид, что работает.

Это уже вторая такая библиотека, первой была openssl - https://github.com/pg83/ix/blob/main/pkgs/lib/openssl/t/ix.sh#L25

Морали в этом особой нет, просто "и вот такие решения приходится принимать". На поиск таких ошибок можно полжизни положить, было бы желание.
👍3🤯3🤔1😢1
commit -m "better"
https://www.oilshell.org/blog/2022/10/garbage-collector.html Тут вот коллега пишет status update про oil shell. Пишут, что занимались garbage collector. Ну, конечно, это основное, что надо пилить, когда ты решил запилить shell. Я почему-то совсем не удивлен:…
https://www.oilshell.org/release/0.12.9/changelog.html

Я продолжаю (с огромным удовольствием!) следить за развитием проекта oil shell.

На этот раз интересного changelog нет, но я просто посмотрел в список коммитов.

Некто "Andy C" занимается рефакторингом, рантаймом, gc, бенчмарками, фреймворком для бенчмарков, всем, кроме самого shell.

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

Ну, ладно, автора явно прет, а остальные-то чего хотят?
😁11👍2🤡2
Субботний rant про невменяемые системы сборки.

Нет ни одной OSS системы сборки, которую я бы мог назвать "бескомпромиссно хорошей".

Мало кто из OSS сборок знает, что такое "чистые билды", что такое content addressable storage.

#bazel знает, но написан на java.

#meson не знает, но зато в нем приятные скрипты для описания конфигурации.

Дай, думаю, посмотрю на #premake. https://premake.github.io/

Бугага, в качестве graph execution engine он предлагает gnu makefile, и даже не предлагает ninja.

И, самая мякотка, https://github.com/SpartanJ/efsw/blob/1.3.0/premake5.lua#L121, он позволяет сборочному скрипту контролировать, куда premake положит Makefile.

Вот, реально, сгенеренный Makefile можно положить в любое место, которое придет в голову мейнтейнеру пакета, и переопределить снаружи это невозможно.

Это вообще какое неуважение к тем, кто этот код собирает?

Для запуска Makefile так-то нужно знать, где он лежит.

Набор типовых конфигураций тоже не стандартизован - https://github.com/SpartanJ/efsw/blob/1.3.0/premake5.lua#L123, install таргетов я не нашел, да и вообще, все это выглядит как зумерская поделка.
👍3😢2😐2
https://sohl-dickstein.github.io/2022/11/06/strong-Goodhart.html

Интересный текст про ML, он мне напомнил, что я давно хотел написать нижележащий текст(прямо они не связаны).

Я бы хотел поговорить про евгенику.

Мне кажется, что человечество "застревает". Каждый следующий шаг дается труднее, чем предыдущий.

Это видно и локально, и глобально:

* Когда вы оптимизируете программу, в какой-то момент вы получаете плоский профиль, и дальше наших мозгов не хватает, чтобы что-то улучшить радикально. Потому что задача становится слишком сложной. И мы начинаем тратить просто колоссальные усилия, чтобы выедать по 0.5% перфа за год, условно говоря.

* Когда вы оптимизируете какую-то метрику качества. Тут применимы ровно те же слова, что и в предыдущем абзаце.

* Теория относительности и квантовая механика - довольно простые штуки, с ними может разобраться любой выпускник мехмата. Попытка построить теорию, их объединяющую - это какие-то гигантские усилия больших количеств ученых, в течении многих лет, без видимого результата. Да и БАК нам намекает, что за пределами стандартной модели ничего и нет. Или просто мы не видим?

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

Вот ровно та же ситуация - человек может написать решатель в 100 if(), и он будет понимать структуру решения, и структуру исходной задачи и данных. Применив AI, для получения следующих 10% метрики, понимания не возникает.

Более того, мое ключевое утверждение - вот эти 10%, добытые таким образом - это не интересно. Профит есть, а интеллектуальное удовольствие от возникшего понимания - не наступает.

#strongai, на мой взгляд, тоже не очень интересно. Ну вот ты получишь ответ на любой вопрос, а что делать, если ты даже не сможешь ответ понять? И не сможешь сформулировать по настоящему интересные вопросы про мир, вселенную, и так далее.

Кстати, уже кидал ссылку на эту книгу, но IMHO весьма годный текст про потенциальное устройство взаимодействия человеков и strongai - https://www.labirint.ru/books/512769/.

Воодушевления не вызывает.

Мне не нужен результат, мне хочется понимания структуры решения, и самой задачи.

Вот тут и наступает разговор про евгенику. Он будет короткий!

Лично я считаю, что, для того, чтобы получить то, чего мне бы хотелось, человекам надо прокачивать свой CPU, чтобы он научился понимать реальность на новых уровнях.

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

Может, после серии таких экспериментов какая-нибудь обезьянка смогла бы с нами поговорить, а, заодно, рассказать про объединение квантов и гравитации. Так, походя :)

К сожалению, эксперименты одного там Адольфа закрыли возможность даже серьезно говорить на эту тему надолго.

(Хотя, nuff said, скрининг на синдром Дауна сейчас все стараются делать)
👍7👎5🔥3🤔1🙈1
Forwarded from Дидлошная
😁13🤣11💯1
https://dougallj.wordpress.com/2022/11/09/why-is-rosetta-2-fast/

Закончил читать этот прекрасный текст.

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

Например:

"Rosetta 2 translates the entire text segment of the binary from x86 to ARM up-front.... Each x86 instruction is translated to one or more ARM instructions once within the ahead-of-time binary (with the exception of NOPs, which are ignored). When an indirect jump or call sets the instruction pointer to an arbitrary offset in the text segment, the runtime will look up the corresponding translated instruction, and branch there"

Это же прямо целый новый мир того, как это может быть устроено. Наверняка такая техника известна всем специалистам, а я вот не знал.

TL;DR по теме теста - Apple M1/M2 просто классное железо, поэтому оно может выполнить таким образом оттранслированный код "быстро".

Я бы тут даже поспекулировал, что исполнитель внутри M1 может понимать, что это оттранслированный по таким простым правилам x86 код, восстанавливать его, и выполнять примерно так же как и ARM инструкции, поверх своего внутреннего ядра.

(зачем так сложно? Ну, например, Intel не продает лицензии на архитектуру)
👍11🤔2
commit -m "better"
TIL что pthread_create под нагрузкой может вернуть EAGAIN. https://github.com/oneapi-src/oneTBB/pull/824 От автора #mold, пишет, что в Go тоже есть retry. Признаться, меня это сильно удивляет, и, если бы не соответствующий код в Go, я бы подумал, что Rui…
https://github.com/oneapi-src/oneTBB/pull/824

PR, наконец-то, вмержили.

Заняло это с мая месяца этого года.

Я тут как-то писал, как правильно делать code review, вот, почитайте этот тред, чтобы понять, как точно не надо:

* Морозить до первой реакции несколько месяцев.

* Не разобраться, с тем, что реально происходит, и предложить пару способов, как переделать то, что уже сделано.

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

* Попросить решить более широкую задачу, вот это самое "а заодно". А заодно сделайте нам graceful degradation, my ass.

Я прекрасно понимаю, что tbb - это OSS проект, но точно так же понимаю, что пишут его люди на зарплате от Intel, и ожидаю, что они будут соблюдать соответствующие стандарты качества. Реально, github надо сделать кнопку "пожаловаться менеджеру в материнской компании проекта".
👍24
commit -m "better"
https://habr.com/ru/post/599767/ https://www.bleepingcomputer.com/news/security/dev-corrupts-npm-libs-colors-and-faker-breaking-thousands-of-apps/ https://twitter.com/marak/status/1479200803948830724?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E14…
https://www.phoronix.com/news/Mold-1.7 #money

Оказывается, слона-то в новом релизе #mold я и не заметил!

"I'd like to inform users that I'm seriously considering changing the mold's license from AGPL to a source-available license unless I secure big funding. The new license would be something like individuals can use it for free but corporate users have to pay. mold started as my personal project, and I've been working on this full time for two years so far. I thought that I could earn a comfortable income if mold become popular, but unfortunately, I'm still losing my money."

Забавно, что такой умный человек попал в эту ловушку. В open source нет денег, писал про это и буду писать.

open source, если он от отдельных граждан, а не от больших компаний - это for fun, для души, как #charity, опять же. Но уж точно не деньги.

Он пишет(кстати, очень стандартная тема от таких "жалующихся"):

"It's even a bit ironic that I had been asked by several big-name companies when mold/macOS would become available, since they wanted to use it for their multi-billion-dollar businesses. But none of them gave me financial support"

Я ему могу легко ответить.

#mold не настолько лучше, по сравнению с ближайшим конкурентом(lld), чтобы за него платить деньги.

Это удивительно, и наивно, - "я сделал хороший продукт, подарил его вам, а теперь заплатите мне".

Блин, я вообще посмотрел в сторону mold в том числе, потому, что он открытый И бесплатный, зачем он мне в виде платного софта? Ну, нет, на рынке линкеров большая конкуренция, есть предложения и получше(бесплатный lld, например).
👍5🤡5😁1