У телеги brain split на несколько независимых сегментов, интересно, к чему это?
🤔6
В этой новости прекрасно все, поэтому я просто оставлю ее тут:
https://www.opennet.ru/opennews/art.shtml?num=59641
На самом деле (tm), особо ничего неожиданного в этом нет, потому что Python сначала победил в качестве языка для анализа всяческих данных, потом победил Jupyter Notebook, а потом Екселю не осталось ничего, как признать поражение, и сделать вот ровно то же самое.
https://www.opennet.ru/opennews/art.shtml?num=59641
На самом деле (tm), особо ничего неожиданного в этом нет, потому что Python сначала победил в качестве языка для анализа всяческих данных, потом победил Jupyter Notebook, а потом Екселю не осталось ничего, как признать поражение, и сделать вот ровно то же самое.
www.opennet.ru
В Microsoft Excel встроена поддержка языка программирования Python
Компания Microsoft, в которой с 2020 года работает Гвидо ван Россум, создатель языка программирования Python, объявила об интеграции Python в табличный процессор Excel. Python можно использовать в Excel для написания формул, работы с данными, анализа информации…
🔥15👍6🤔1
commit -m "better"
Знаменитый блоггер #maskray продолжает радовать нас зануднейшими текстами про устройство линкера. КМК, читать такое можно только либо за зарплату, ну или если вы - фанат. https://maskray.me/blog/2023-05-14-relocation-overflow-and-code-models Основной текст…
#maskray #rant
https://maskray.me/blog/2021-11-07-init-ctors-init-array
А вот еще один классный текст от знаменитого блоггера MaskRay!
Он про устройство секций, в которых лежат указатели на функции, которые нужно вызвать до main. Так что, если вам казалось, что там есть какая-то магия, то почитайте, ничего магического там нет.
Наткнулся я на этот текст по рабочей необходимости.
Старая версия CUDA (<= 10), которую все еще иногда приходится использовать, содержит в себе секции .ctors, но не содержит .init_array. А используемый нами линкер пару лет назад перестал поддерживать секцию .ctors. Ну и нам приходилось поддерживать патчи на линкер, чтобы он умел в .ctors, а не только в .init_array.
При переходе на новую версию линкера мне надоело накладывать эти патчи, и я, пользуясь этой заметкой, бинарно переделал библиотеки от nvidia, переместив конструкторы из .ctors в .init_array.
Примерно вот такой командой:
Что формат .ctors и .init_array ничем не отличаются, это одна и та же секция, просто ее назвали иначе.
Чем же кому-то не угодила секция .ctors, почему в новых стандартах пришлось заводить .init_array, который, по сути, ничем не отличается, и зачем нужно было убирать поддержку .ctors, история (и MaskRay) умалчивают:
"Under the hood, on ELF platforms, the initialization functions or constructors are implemented in two schemes. The legacy one uses .init/.ctors while the new one uses .init_array"
Наверное, потому, что ничего технически интересного в этой истории нет, а просто кто-то с кем-то не договорился, как оно обычно и бывает.
https://maskray.me/blog/2021-11-07-init-ctors-init-array
А вот еще один классный текст от знаменитого блоггера MaskRay!
Он про устройство секций, в которых лежат указатели на функции, которые нужно вызвать до main. Так что, если вам казалось, что там есть какая-то магия, то почитайте, ничего магического там нет.
Наткнулся я на этот текст по рабочей необходимости.
Старая версия CUDA (<= 10), которую все еще иногда приходится использовать, содержит в себе секции .ctors, но не содержит .init_array. А используемый нами линкер пару лет назад перестал поддерживать секцию .ctors. Ну и нам приходилось поддерживать патчи на линкер, чтобы он умел в .ctors, а не только в .init_array.
При переходе на новую версию линкера мне надоело накладывать эти патчи, и я, пользуясь этой заметкой, бинарно переделал библиотеки от nvidia, переместив конструкторы из .ctors в .init_array.
Примерно вот такой командой:
objcopy --rename-section .ctors=.init_array file
Что нам говорит этот вызов?Что формат .ctors и .init_array ничем не отличаются, это одна и та же секция, просто ее назвали иначе.
Чем же кому-то не угодила секция .ctors, почему в новых стандартах пришлось заводить .init_array, который, по сути, ничем не отличается, и зачем нужно было убирать поддержку .ctors, история (и MaskRay) умалчивают:
"Under the hood, on ELF platforms, the initialization functions or constructors are implemented in two schemes. The legacy one uses .init/.ctors while the new one uses .init_array"
Наверное, потому, что ничего технически интересного в этой истории нет, а просто кто-то с кем-то не договорился, как оно обычно и бывает.
MaskRay
.init, .ctors, and .init_array
Updated in 2023-03. In C++, dynamic initializations for non-local variables happen before the first statement of the main function. All (most?) implementations just ensure such dynamic initializations
🔥12
commit -m "better"
https://asahilinux.org/2022/11/november-2022-report/ Очередной status update от #asahi Linux. Интересно почитать про пляски вокруг firmware(потому что Apple не нужно заморачиваться с кучей платформ, и они хранят firmware прямо в своем ядре!), и про power…
#asahi
https://www.opennet.ru/opennews/art.shtml?num=59648
У коллег, судя по всему, прямо прорыв в поддержке 3D.
Интересно, конечно, что у них с питаловом, то есть, сколько жрет GPU с этим drm driver.
Напомню, что это были основные проблемы с open source nvidia driver, что, без изпользования подписанного nvidia firmware, все работало не самым оптимальным образом.
Но, вообще, конечно, это очень и очень круто. Надо будет как-нибудь попробовать там запустить #stal/ix. Прямо сейчас мне мешает только тот факт, что drm driver написан на Rust.
https://www.opennet.ru/opennews/art.shtml?num=59648
У коллег, судя по всему, прямо прорыв в поддержке 3D.
Интересно, конечно, что у них с питаловом, то есть, сколько жрет GPU с этим drm driver.
Напомню, что это были основные проблемы с open source nvidia driver, что, без изпользования подписанного nvidia firmware, все работало не самым оптимальным образом.
Но, вообще, конечно, это очень и очень круто. Надо будет как-нибудь попробовать там запустить #stal/ix. Прямо сейчас мне мешает только тот факт, что drm driver написан на Rust.
www.opennet.ru
Открытый драйвер Asahi для чипов Apple M1 и M2 сертифицирован на совместимость с OpenGL ES 3.1
Консорциум Khronos, занимающийся разработкой графических стандартов, признал полную совместимость открытого драйвера Asahi для GPU AGX, поставляемого в чипах Apple M1 и M2, со спецификацией OpenGL ES 3.1. Драйвер успешно прошёл все тесты из набора CTS (Kronos…
🔥5😁3🤔1
commit -m "better"
Воскресный #rant из серии "лучше бы они". https://www.phoronix.com/news/Intel-oneAPI-Embree-4.1 Лучше бы они портировали под arm https://github.com/intel/hyperscan. Проблема, конечно, в том, что hyperscan - полезная библиотека, и так-то быстрые регулярки…
Совершенно случайно пришлось заглянуть в код subj.
Слушайте, мне иногда кажется, что у некоторых программистов, когда они кодят, в голове происходит что-то типа https://www.youtube.com/watch?v=NVwAOiKbOqI
Потому что я вот не знаю, чем можно объяснить вот такое:
https://github.com/intel/hyperscan/blob/master/src/rose/rose_build_convert.cpp#L564
* new/make_shared может вернуть nullptr? А в 21 веке?
* разное поведение в дебаге и в релизе - assert vs. runtime error (кстати, немного в сторону - то, как в Rust обрабатываются переполнения - это треш, угар, содомия)
* этот bad_alloc не содержит line info, поэтому человек, решивший такое раздебажить, может поседеть
Короче, это совершенно redundant блок кода, который современный компилятор может вообще убрать нафиг. И вообще, это как использовать 3 презерватива, если вы понимаете, о чем я.
И это не единственная такая штука - там все, все выделение ресурсов обмазано вот такой вот проверкой. https://github.com/intel/hyperscan/blob/master/src/nfa/goughcompile.cpp#L210, всего несколько десятков таких однотипных проверок.
Слушайте, мне иногда кажется, что у некоторых программистов, когда они кодят, в голове происходит что-то типа https://www.youtube.com/watch?v=NVwAOiKbOqI
Потому что я вот не знаю, чем можно объяснить вот такое:
https://github.com/intel/hyperscan/blob/master/src/rose/rose_build_convert.cpp#L564
shared_ptr<NGHolder> h_new = make_shared<NGHolder>();В этом отрывке прекрасно все:
if (!h_new) {
assert(0);
throw std::bad_alloc();
}
* new/make_shared может вернуть nullptr? А в 21 веке?
* разное поведение в дебаге и в релизе - assert vs. runtime error (кстати, немного в сторону - то, как в Rust обрабатываются переполнения - это треш, угар, содомия)
* этот bad_alloc не содержит line info, поэтому человек, решивший такое раздебажить, может поседеть
Короче, это совершенно redundant блок кода, который современный компилятор может вообще убрать нафиг. И вообще, это как использовать 3 презерватива, если вы понимаете, о чем я.
И это не единственная такая штука - там все, все выделение ресурсов обмазано вот такой вот проверкой. https://github.com/intel/hyperscan/blob/master/src/nfa/goughcompile.cpp#L210, всего несколько десятков таких однотипных проверок.
YouTube
ОБЕЗЬЯНКА В ГОЛОВЕ
Взято из мультфильма: Симпсоны в кино
🔥10😁5🐳3❤2
Будни #bootstrap, пятничный #rant
Отвязывать сборку от окружения - сложно (особенно без контейнеризации/виртуализации).
Недавно я узнал, что cmake и meson, в момент configure, могут дергать вот такую вот команду:
А потом, передавать в линкер /usr/lib/libxml2.a, вместо -lxml2. К чему это приводит, вы можете придумать и сами, от банальных ошибок в линковке, до падений в runtime, из-за разных ABI.
Какой в этом поиске физический смысл - я не понимаю.
Система сборки должна запустить pkg-config (или cmake, если метаинформация про установочные пути живет в базе данных от cmake), и узнать у него про пути к библиотекам, а не заниматься вот такого рода самодеятельностью.
Я не стал выяснять, что там воркэраундили эти сумасшедшие, а просто налепил workaround на workaround - https://github.com/pg83/ix/blob/main/pkgs/bld/wrapcc/kuroko/wrapcc.krk#L118-L119 Теперь и cmake, и meson, не видят этих путей для поиска, и меньше лезут в систему.
Отвязывать сборку от окружения - сложно (особенно без контейнеризации/виртуализации).
Недавно я узнал, что cmake и meson, в момент configure, могут дергать вот такую вот команду:
# clang -print-search-dirsИ использовать найденные пути для поиска библиотек!
programs: = ...:.../clang-16/bin: \
/usr/lib/gcc/.../x86_64-linux-gnu/bin
libraries: = .../clang-16/lib/clang/16: \
/usr/lib/gcc/x86_64-linux-gnu/9: \
/usr/lib/gcc/.../lib64: \
/lib/x86_64-linux-gnu: \
/lib/../lib64: \
/usr/lib/x86_64-linux-gnu: \
/usr/lib/../lib64: \
/lib: \
/usr/lib
А потом, передавать в линкер /usr/lib/libxml2.a, вместо -lxml2. К чему это приводит, вы можете придумать и сами, от банальных ошибок в линковке, до падений в runtime, из-за разных ABI.
Какой в этом поиске физический смысл - я не понимаю.
Система сборки должна запустить pkg-config (или cmake, если метаинформация про установочные пути живет в базе данных от cmake), и узнать у него про пути к библиотекам, а не заниматься вот такого рода самодеятельностью.
Я не стал выяснять, что там воркэраундили эти сумасшедшие, а просто налепил workaround на workaround - https://github.com/pg83/ix/blob/main/pkgs/bld/wrapcc/kuroko/wrapcc.krk#L118-L119 Теперь и cmake, и meson, не видят этих путей для поиска, и меньше лезут в систему.
GitHub
ix/pkgs/bld/wrapcc/kuroko/wrapcc.krk at main · pg83/ix
ix package manager. Contribute to pg83/ix development by creating an account on GitHub.
🔥10😁4🤣3💩1
commit -m "better"
#fork https://www.hashicorp.com/blog/hashicorp-adopts-business-source-license #HashiCorp вычеркивают себя из open source. Флаг им в руки, но не думаю, что у них выйдет из этого что-то хорошее.
https://www.opennet.ru/opennews/art.shtml?num=59666 #fork
Продолжение истории с #hashicorp.
Как обычно, когда какая-то компания пытается монетизировать выстреливший, за счет своей бесплатности и доступности, продукт, у нее ничего не выходит, потому что подсевшие на эту иглу просто скидываются, и продолжают развивать форк. Потому что никто и никогда не будет договариваться с шантажистом.
Я бы сравнил подобную деятельность со стрельбой себе в ногу, потому что пока компания ведет себя честно, никто даже и не пытается такой форк замутить, потому что кто же им будет пользоваться? А вот как только компания-собственник сходит с ума, тут же появляется шанс на то, что такой форк будет вполне жизнеспособен.
Из интересного - форком будет заниматься >= 14 разрабов fulltime, а в hashicorp всего 5.
Продолжение истории с #hashicorp.
Как обычно, когда какая-то компания пытается монетизировать выстреливший, за счет своей бесплатности и доступности, продукт, у нее ничего не выходит, потому что подсевшие на эту иглу просто скидываются, и продолжают развивать форк. Потому что никто и никогда не будет договариваться с шантажистом.
Я бы сравнил подобную деятельность со стрельбой себе в ногу, потому что пока компания ведет себя честно, никто даже и не пытается такой форк замутить, потому что кто же им будет пользоваться? А вот как только компания-собственник сходит с ума, тут же появляется шанс на то, что такой форк будет вполне жизнеспособен.
Из интересного - форком будет заниматься >= 14 разрабов fulltime, а в hashicorp всего 5.
www.opennet.ru
Организация OpenTF создала форк платформы управления конфигурацией Terraform
Объявлено о создании организации OpenTF, которая будет развивать форк платформы управления конфигурацией и автоматизации поддержания инфраструктуры Terraform. Разработку планируют перевести под покровительство организации Linux Foundation для дальнейшего…
🔥14🎉3🆒2👍1👎1
Forwarded from Programmer memes
This media is not supported in your browser
VIEW IN TELEGRAM
😁19👎4❤3🆒2🫡1
commit -m "better"
Не помню, рассказывал про свое микросоревнование с самим собой, или нет, беглый поиск по каналу ничего такого не нашел, поэтому рассказываю, тем более, есть повод! Просто писать код - скучно, это уже давно доведено до автоматизма. Поэтому я, по крайней мере…
Сумел стереть еще 1.5кб кода, но, правда, до 50кб так и не "ужал".
Стер за счет того, что "перепридумал" способ указывать exe, который будет выполнять конкретный скрипт. Раньше это был хардкод в ядре, а теперь я это перенес в шаблон, вместе с остатками скриптовой питонячки.
https://github.com/pg83/ix/commit/9899433a4e9c0003764aff563b1d3213a45d213b
https://github.com/pg83/ix/commit/c8b112fc9406e35802f688906f7c4faa40247c47
Благодаря этому упрощению теперь возможно использовать шаблоны описания сборки пакетов на любом языке, а не только на ранее захардкоженных sh/python.
Не то чтобы я ожидал шквал пакетов на JS, но, тем не менее.
Стер за счет того, что "перепридумал" способ указывать exe, который будет выполнять конкретный скрипт. Раньше это был хардкод в ядре, а теперь я это перенес в шаблон, вместе с остатками скриптовой питонячки.
https://github.com/pg83/ix/commit/9899433a4e9c0003764aff563b1d3213a45d213b
https://github.com/pg83/ix/commit/c8b112fc9406e35802f688906f7c4faa40247c47
Благодаря этому упрощению теперь возможно использовать шаблоны описания сборки пакетов на любом языке, а не только на ранее захардкоженных sh/python.
Не то чтобы я ожидал шквал пакетов на JS, но, тем не менее.
GitHub
better · pg83/ix@9899433
ix package manager. Contribute to pg83/ix development by creating an account on GitHub.
🔥10💩3❤2🤔2
commit -m "better"
Призывал и буду призывать владельцев open source софта всегда делать официальный бекап на github. Потому что github самый надежный, а ваш sr.ht/repo.cz/gitlab/whatever однажды ляжет, и поднимать его будут неделю. Поэтому я всегда радовался, какие же хорошие…
Опять лежит gitlab от freedesktop - https://gist.github.com/pg83/de5cc5e61cd5bbd05ac7e6959136fd89
И я, конечно, воспользуюсь этим, чтобы призвать всех владельцев open source софта делать RO зеркала на github.
И я, конечно, воспользуюсь этим, чтобы призвать всех владельцев open source софта делать RO зеркала на github.
Gist
gist:de5cc5e61cd5bbd05ac7e6959136fd89
GitHub Gist: instantly share code, notes, and snippets.
👍8😁6🔥2
commit -m "better"
#gold #blob #supply https://github.com/serde-rs/serde/issues/2538 этот тред, конечно, пополнит мою золотую коллекцию. Разработчики serde (насколько я знаю, самая популярная библиотека сериализации для Rust), решили, что им "очень нада" ускорить сборку своего…
https://github.com/serde-rs/serde/pull/2590 #blob
Из serde таки удалили бинарный блоб. Это, конечно, хорошо. Потому что скорость сборки - скоростью сборки, но она не должна достигаться таким вот хаком.
Меня больше, чем вся эта история с бинарным блобом, заинтересовала вот эта вот папочка - https://github.com/serde-rs/serde/tree/bfcd44704f847ac5a9f3072e102e803b5ebbef31/precompiled/proc-macro2 (ее уже нет в транке, потому что выпилили всю precompiled/ историю).
Я вот как в этом вот анекдоте:
- Василий Иваныч, сколько будет ноль целых пять десятых плюс одна вторая?
- Нутром чую, что литр, а доказать не могу!..
Нутром чую, что в этой папочке лежит реализация proc_macro, которая не требует загрузки .so в rustc, а работает через subprocess. Ну или я тогда не понимаю смысл этого precompiled binary - что там лежало-то?
Раскопки приводят к https://github.com/dtolnay/watt (от того же автора):
"Watt is a runtime for executing Rust procedural macros compiled as WebAssembly"
Короче, в конце тоннеля забрезжил свет, возможно, у меня получится прикрутить эту штуку к Rust, чтобы она использовалась вместо реализации по умолчанию, и не требовала загрузки свежесобранной .so в rustc. То, что там #wasm - это дело десятое, главное, что в виде отдельного бинаря.
Из serde таки удалили бинарный блоб. Это, конечно, хорошо. Потому что скорость сборки - скоростью сборки, но она не должна достигаться таким вот хаком.
Меня больше, чем вся эта история с бинарным блобом, заинтересовала вот эта вот папочка - https://github.com/serde-rs/serde/tree/bfcd44704f847ac5a9f3072e102e803b5ebbef31/precompiled/proc-macro2 (ее уже нет в транке, потому что выпилили всю precompiled/ историю).
Я вот как в этом вот анекдоте:
- Василий Иваныч, сколько будет ноль целых пять десятых плюс одна вторая?
- Нутром чую, что литр, а доказать не могу!..
Нутром чую, что в этой папочке лежит реализация proc_macro, которая не требует загрузки .so в rustc, а работает через subprocess. Ну или я тогда не понимаю смысл этого precompiled binary - что там лежало-то?
Раскопки приводят к https://github.com/dtolnay/watt (от того же автора):
"Watt is a runtime for executing Rust procedural macros compiled as WebAssembly"
Короче, в конце тоннеля забрезжил свет, возможно, у меня получится прикрутить эту штуку к Rust, чтобы она использовалась вместо реализации по умолчанию, и не требовала загрузки свежесобранной .so в rustc. То, что там #wasm - это дело десятое, главное, что в виде отдельного бинаря.
GitHub
Phase out precompiled by pinkforest · Pull Request #2590 · serde-rs/serde
Following consensus on: #2580 (review)
This PR phases out the precompiled per final consensus made in #2580
This PR phases out the precompiled per final consensus made in #2580
👍12🔥4❤2😱1
#bootstrap
https://go.dev/blog/rebuild
Заметка от Russ Cox (все же помнят, что я большой его фанат?), про воспроизводимость сборок тулчейна go.
Ничего особо интересного, потюнили процесс там и тут. Правда, есть небольшой подлог - задачу воспроизводимости сборки усилили требованием воспроизводимости, имея только исходники самого тулчейна (то есть, как-то пришлось убирать зависимости от C compiler, в cgo).
Так-то, что в #IX, что, уверен, в #guix (насчет nix не знаю, они не очень запариваются #bootstrap), сборки и так были воспроизводимы.
Фактически, сделали простую задачу чуть более интересной. Ну и хрен с ними, дело-то хорошее.
https://go.dev/blog/rebuild
Заметка от Russ Cox (все же помнят, что я большой его фанат?), про воспроизводимость сборок тулчейна go.
Ничего особо интересного, потюнили процесс там и тут. Правда, есть небольшой подлог - задачу воспроизводимости сборки усилили требованием воспроизводимости, имея только исходники самого тулчейна (то есть, как-то пришлось убирать зависимости от C compiler, в cgo).
Так-то, что в #IX, что, уверен, в #guix (насчет nix не знаю, они не очень запариваются #bootstrap), сборки и так были воспроизводимы.
Фактически, сделали простую задачу чуть более интересной. Ну и хрен с ними, дело-то хорошее.
go.dev
Perfectly Reproducible, Verified Go Toolchains - The Go Programming Language
Go 1.21 is the first perfectly reproducible Go toolchain.
👍11❤5🔥4
#rant #bootstrap
А вот вам, например, выдержка из сборки qemu.
https://github.com/qemu/qemu/blob/master/ui/meson.build#L172
Тут написано, что для сборки qemu нужен meson subproject, без фолбека на системный вариант. Ну вот так получилось, что это скрипт от авторов же qemu, и они его решили так заисполдьзовать (хотя бОльшая часть зависимостей у них делается через git submodules).
А в это subproject написано, что этот проект можно скачать только из git - https://github.com/qemu/qemu/blob/master/subprojects/keycodemapdb.wrap
Вот, реально, только из git, без фолбека на локальную копию в репозитории. Если бы она была, то лежала бы в папочке keycodemapdb вот тут - https://github.com/qemu/qemu/tree/master/subprojects
Что это значит?
Что у этих школьников сборка намертво прибита к хождению по сети через git (начиная с версии 8.1.0), и ничего с этим не сделать, кроме как жестко выпатчить к хуям (что я и сделал, без ссылки, там нет ничего красивого и/или интересного).
Мораль?
Ее, как обычно, нет.
А вот вам, например, выдержка из сборки qemu.
https://github.com/qemu/qemu/blob/master/ui/meson.build#L172
Тут написано, что для сборки qemu нужен meson subproject, без фолбека на системный вариант. Ну вот так получилось, что это скрипт от авторов же qemu, и они его решили так заисполдьзовать (хотя бОльшая часть зависимостей у них делается через git submodules).
А в это subproject написано, что этот проект можно скачать только из git - https://github.com/qemu/qemu/blob/master/subprojects/keycodemapdb.wrap
Вот, реально, только из git, без фолбека на локальную копию в репозитории. Если бы она была, то лежала бы в папочке keycodemapdb вот тут - https://github.com/qemu/qemu/tree/master/subprojects
Что это значит?
Что у этих школьников сборка намертво прибита к хождению по сети через git (начиная с версии 8.1.0), и ничего с этим не сделать, кроме как жестко выпатчить к хуям (что я и сделал, без ссылки, там нет ничего красивого и/или интересного).
Мораль?
Ее, как обычно, нет.
GitHub
qemu/ui/meson.build at master · qemu/qemu
Official QEMU mirror. Please see https://www.qemu.org/contribute/ for how to submit changes to QEMU. Pull Requests are ignored. Please only use release tarballs from the QEMU website. - qemu/qemu
🐳12😁5🔥2🥴1