commit -m "better"
#mesa, свет моей жизни, искры на кончиках пальцев. Грех мой, любовь моя. Me-sa. Для ее сборки была разработана ныне очень популярная система сборки - #meson, и, на самом деле, это очень печально, потому что разработчики Mesa слишком хорошо знают meson, и…
Снова про #mesa
В цитируемом посте я писал, как ловко запилил процедуры "вычитания" одной статической библиотеки из другой, и почему мне пришлось так делать для сборки mesa.
К сожалению, эта процедура оказалась не очень "робастной" (то есть, апдейт на новую версию был сопряжен с трудностями) - иногда в этих .a оказывался символ с одинаковым именем, но с разной семантикой. В обычной жизни это был какой-нибудь неэкспортируемый из .so символ, и оно как-то жило, ну а у меня случались всякие разные артефакты из-за этой процедуры "вычитания".
Поэтому, в итоге, я решил прекратить экономить на спичках, и сделал по рабоче-крестьянски:
* Условный загрузчик плагинов я оставил как есть
* Ко всем символам, которые были в драйвере opengl, я добавил префикс "o_"
* Ко всем символам, которые были в драйвере vulkan, я добавил префикс "v_"
После чего слил драйвера для opengl и для vulkan в одну общую библиотеку. Да, она получилась больше по размеру, потому что некоторые одинаковые символы получили уникальные имена, но зато это стало лучше отражать то, как жти символы используются в .so (они там тоже дублируются). Ну и исчезли ошибки линковки, когда один и тот же символ объявлен в двух библиотеках.
После этого я, с легкостью, без появления новых странностей, обновился на самую последнюю mesa, чего давно не мог сделать.
В цитируемом посте я писал, как ловко запилил процедуры "вычитания" одной статической библиотеки из другой, и почему мне пришлось так делать для сборки mesa.
К сожалению, эта процедура оказалась не очень "робастной" (то есть, апдейт на новую версию был сопряжен с трудностями) - иногда в этих .a оказывался символ с одинаковым именем, но с разной семантикой. В обычной жизни это был какой-нибудь неэкспортируемый из .so символ, и оно как-то жило, ну а у меня случались всякие разные артефакты из-за этой процедуры "вычитания".
Поэтому, в итоге, я решил прекратить экономить на спичках, и сделал по рабоче-крестьянски:
* Условный загрузчик плагинов я оставил как есть
* Ко всем символам, которые были в драйвере opengl, я добавил префикс "o_"
* Ко всем символам, которые были в драйвере vulkan, я добавил префикс "v_"
После чего слил драйвера для opengl и для vulkan в одну общую библиотеку. Да, она получилась больше по размеру, потому что некоторые одинаковые символы получили уникальные имена, но зато это стало лучше отражать то, как жти символы используются в .so (они там тоже дублируются). Ну и исчезли ошибки линковки, когда один и тот же символ объявлен в двух библиотеках.
После этого я, с легкостью, без появления новых странностей, обновился на самую последнюю mesa, чего давно не мог сделать.
👍18🔥3❤1
commit -m "better"
#wasm #wasi #bootstrap #ix_run Ну, вот, после пары сегфолтов, я это дело таки завел: pg# ./ix run \ bin/b64 --target=wasi32 \ bld/sh \ bin/iwasm/fast/er \ -- \ iwasm --fast-jit \ '$(command -v base64)' b64 (Base64 Encode/Decode) Bob…
https://flak.tedunangst.com/post/www-which-wasm-works
Вот, коллега тоже сталкивается с проблемами "а как же запустить простую программу, собранную в WebAssembly".
При этом коллега не собирал ничего сложного, а "всего лишь" собрал JpegXL кодек.
В общем, пользовательский опыт в #wasm, если не брать песочницы браузеров, пока довольно неубедительный.
Вот, коллега тоже сталкивается с проблемами "а как же запустить простую программу, собранную в WebAssembly".
При этом коллега не собирал ничего сложного, а "всего лишь" собрал JpegXL кодек.
В общем, пользовательский опыт в #wasm, если не брать песочницы браузеров, пока довольно неубедительный.
👍5🔥2😁2
Будни #bootstrap
Вот есть такой https://github.com/microsoft/DirectXShaderCompiler
Он мне, сам по себе, не нужен (хотя стараниями Valve теперь DirectX есть и под Linux), но он нужен для сборки #AMDVLK (мне все хочется пощупать альтернативную #mesa-е реализацию).
В целом, он собрался без особых проблем, за исключением получения version info из git при сборке. Вообще, получить свою версию из .git чекаута хотят многие проекты, и бОльшая часть из них косячат.
Вот, и этот проект смешно накосячил.
https://github.com/microsoft/DirectXShaderCompiler/blob/main/utils/version/gen_version.py - скрипт, пытающийся получить version.
Обратим внимание на https://github.com/microsoft/DirectXShaderCompiler/blob/main/utils/version/gen_version.py#L39-L42, тут сразу несколько ошибок:
* самая очевидная - нельзя так ловить все ошибки, потому что можно проглотить ошибку в ситуации, когда глотать ее нельзя (например, .git есть, но он как-то испорчен)
* чуть менее очевидная - этот скрипт ведет себя неожиданно, когда команды git нет в PATH. Потому что subprocess в этом случае кидает FileNotFoundError (поубивал бы за это, если честно), а не CalledProcessError.
* парсинг информации от git не обернут вот в такой fail safe try/catch. То есть, ошибку от git игнорируем, а невозможность распарсить кривой результат - не игнорируем.
Ну, то есть, коллеги не смогли правильно закодить то, что они на самом деле хотели - вернуть какое-то дефолтное значение, если получить реальную информацию не получилось.
Поэтому мне пришлось запилить специальный fakegit для этого проекта, который всегда выходит с ошибкой:
https://github.com/pg83/ix/blob/main/pkgs/bin/dxsc/ix.sh#L25
Потому что мой стандартный fakegit не сработал, по причинам, изложенным выше.
Мораль? Мораль, наверное, такая - код по обработки ошибок гикто не тестирует, потому что это сложно, и он способен сам давать наведенные ошибки, когда начинает срабатывать!
Вот есть такой https://github.com/microsoft/DirectXShaderCompiler
Он мне, сам по себе, не нужен (хотя стараниями Valve теперь DirectX есть и под Linux), но он нужен для сборки #AMDVLK (мне все хочется пощупать альтернативную #mesa-е реализацию).
В целом, он собрался без особых проблем, за исключением получения version info из git при сборке. Вообще, получить свою версию из .git чекаута хотят многие проекты, и бОльшая часть из них косячат.
Вот, и этот проект смешно накосячил.
https://github.com/microsoft/DirectXShaderCompiler/blob/main/utils/version/gen_version.py - скрипт, пытающийся получить version.
Обратим внимание на https://github.com/microsoft/DirectXShaderCompiler/blob/main/utils/version/gen_version.py#L39-L42, тут сразу несколько ошибок:
* самая очевидная - нельзя так ловить все ошибки, потому что можно проглотить ошибку в ситуации, когда глотать ее нельзя (например, .git есть, но он как-то испорчен)
* чуть менее очевидная - этот скрипт ведет себя неожиданно, когда команды git нет в PATH. Потому что subprocess в этом случае кидает FileNotFoundError (поубивал бы за это, если честно), а не CalledProcessError.
* парсинг информации от git не обернут вот в такой fail safe try/catch. То есть, ошибку от git игнорируем, а невозможность распарсить кривой результат - не игнорируем.
Ну, то есть, коллеги не смогли правильно закодить то, что они на самом деле хотели - вернуть какое-то дефолтное значение, если получить реальную информацию не получилось.
Поэтому мне пришлось запилить специальный fakegit для этого проекта, который всегда выходит с ошибкой:
https://github.com/pg83/ix/blob/main/pkgs/bin/dxsc/ix.sh#L25
Потому что мой стандартный fakegit не сработал, по причинам, изложенным выше.
Мораль? Мораль, наверное, такая - код по обработки ошибок гикто не тестирует, потому что это сложно, и он способен сам давать наведенные ошибки, когда начинает срабатывать!
GitHub
GitHub - microsoft/DirectXShaderCompiler: This repo hosts the source for the DirectX Shader Compiler which is based on LLVM/Clang.
This repo hosts the source for the DirectX Shader Compiler which is based on LLVM/Clang. - microsoft/DirectXShaderCompiler
🔥9❤4🆒4🤡3🗿1
https://github.com/epasveer/seer
А вот вам классный GUI над gdb в ленту.
Я, знаете ли, не люблю пользоваться таким в реальной жизни, потому что:
* Использование графического отладчикаотупляет приводит к тому, что программист начинает лениться, и, вместо того, чтобы держать в голове ментальную модель программы, просто ходит по ней отладчиком. А держать ментальную модель в голове - это хорошо, потому что поощряет меньше говнокодить, и больше думать про структуру.
* Второй пункт следует из первого. Мне кажется, что это все, суммарно, приводит к более лапшеобразному коду, потому что человек не имеет в голове структуры программы, он дотрассировал до нужного места, впилил проверку на свой частный случай, и дальше живет спокойно. Несколько раз работал с такими кодовыми базами, мне не понравилось.
Но вот, на днях, пришлось дебажить #mesa, недавно рассказывал про это, а она написана так, как будто у ее разработчиков есть очень хороший визуальный отладчик, если вы понимаете, о чем я. В таком случае можно, потому что построить ментальную модель это лапши уже решительно невозможно!
Ну и наткнулся на этот seer:
* Не требует KDE/GNOME, работает на чистом QT6
* Просто собрался и заработал, без завязок на X11, и вот это вот все.
Понятно, что это не интегрированный отладчик - языка он не знает, по клику мышкой переменнные не показывает. Но исходники цепляет исправно, за переменными можно следить через консоль в gdb, и этого мне хватило.
А вот вам классный GUI над gdb в ленту.
Я, знаете ли, не люблю пользоваться таким в реальной жизни, потому что:
* Использование графического отладчика
* Второй пункт следует из первого. Мне кажется, что это все, суммарно, приводит к более лапшеобразному коду, потому что человек не имеет в голове структуры программы, он дотрассировал до нужного места, впилил проверку на свой частный случай, и дальше живет спокойно. Несколько раз работал с такими кодовыми базами, мне не понравилось.
Но вот, на днях, пришлось дебажить #mesa, недавно рассказывал про это, а она написана так, как будто у ее разработчиков есть очень хороший визуальный отладчик, если вы понимаете, о чем я. В таком случае можно, потому что построить ментальную модель это лапши уже решительно невозможно!
Ну и наткнулся на этот seer:
* Не требует KDE/GNOME, работает на чистом QT6
* Просто собрался и заработал, без завязок на X11, и вот это вот все.
Понятно, что это не интегрированный отладчик - языка он не знает, по клику мышкой переменнные не показывает. Но исходники цепляет исправно, за переменными можно следить через консоль в gdb, и этого мне хватило.
GitHub
GitHub - epasveer/seer: Seer - a gui frontend to gdb
Seer - a gui frontend to gdb. Contribute to epasveer/seer development by creating an account on GitHub.
👍7🤡5🔥2🤔2❤1🫡1
commit -m "better"
Закрывая (кажется) тему #llvm libc++16 на ближайшее время. В libc++ есть своя реализация format (почему? потому что могут же!), но она не работает. Поэтому авторы ее закомментили, до поры, до времени - https://github.com/llvm/llvm-project/blob/main/libcx…
После перехода на clang17, в выходные перешел на libc++17.
В отличие от прошлого раза (можно почитать в цитируемом посте), все прошло более-менее норм, даже получилось избавиться от polyfill на ranges и fmtlib, потому что в libc++17 format и ranges уже норм.
Из интересного - libc++ перестали поддерживать использование себя с кодом на старых стандартах (с++11 точно, а может, еще и старше тоже). Заметил я это при сборке gcc, для них пришлось оставить libc++16. Благо, сборка это позволяет - https://github.com/pg83/ix/blob/main/pkgs/bin/gcc/10/ix.sh#L4
В отличие от прошлого раза (можно почитать в цитируемом посте), все прошло более-менее норм, даже получилось избавиться от polyfill на ranges и fmtlib, потому что в libc++17 format и ranges уже норм.
Из интересного - libc++ перестали поддерживать использование себя с кодом на старых стандартах (с++11 точно, а может, еще и старше тоже). Заметил я это при сборке gcc, для них пришлось оставить libc++16. Благо, сборка это позволяет - https://github.com/pg83/ix/blob/main/pkgs/bin/gcc/10/ix.sh#L4
GitHub
ix/pkgs/bin/gcc/10/ix.sh at main · pg83/ix
ix package manager. Contribute to pg83/ix development by creating an account on GitHub.
🔥9❤2👍2
Самый страшный код, который может встретить разработчик на C++:
struct X {
X() {
Initialized = true;
}
~X() {
Initialized = false;
}
auto y() {
if (Initialized) {
...
}
}
};
(тут не надо искать подвоха, что y() вызывается в конструкторе или деструкторе, нет)😱9👍5🤔3🤬3🥴3🔥2🐳1🤣1🤨1👀1🤷1
Будни #bootstrap #gold #gir
Гля чо у меня есть!
На самом деле, это значит, что у меня случился локальный прорыв в борьбе с gobject introspection (писал про это в https://xn--r1a.website/itpgchannel/1253)
Я сумел собрать g-ir-scanner в статически слинкованный бинарь (напомню, там python, .py скрипты, и модуль _giscanner, который в оригинале идет в виде .so)
Вкратце скетч построения:
* Сборка этого пакета хочет за один присест построить как тулзы, так и _giscanner.so, ну и сгенерить .typelib файлы для всего glib. Мне пришлось это декомпозировать на части. Первым делом я собираю питонячий модуль в виде .a файла, при этом мне нужно убедить родную сборку этого пакета, что у нее уже есть готовые тулзы. Я заменил готовые тулзы на пустой скрипт, который ничего не делает - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/bootstrap/t/ix.sh#L10-L11
* Так как он ничего не делает, то потом надо убедить make install, что нужныке файлы таки сгенерились (они будут пустые) - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/bootstrap/t/ix.sh#L16-L19C20
* Далее я раскидываю поличившиеся артефакты (модуль, и скрипты) правильным образом, как будет ожидать дальнейший шаг - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/py/ix.sh
* После чего я строю статический конструктор, который зарегистрирует модуль _giscanner в машинерии питона по импорту модулей - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/py/register/ix.sh#L14 (боже, благолови Сишку, что там можно везде написать void*, без всякого дурацкого манглинга!)
* Дальше я линкую все 3 сущности, которые я описал выше, в один модуль - https://github.com/pg83/ix/blob/main/pkgs/bld/gir/scanner/unwrap/ix.sh#L17-L20, который, по удачному стелению обстоятельств, представляет из себя монобинарь с g-ir-scanner. На ходу пришлось подпатчить скрипт, чтобы модуль _giscanner импортировался корректно.
* Ну а дальше, имея готовый https://github.com/pg83/ix/blob/main/pkgs/bld/gir/unwrap/ix.sh#L12, и используя фичу сборки этого пакета с внешним g-ir-scanner (для кросс-компиляции), можно построить настоящие .typelib.
Отдельно можно упомянуть:
* https://github.com/pg83/ix/blob/main/pkgs/bld/gir/unwrap/ix.sh#L22 - если компилятор, который дергает g-ir-scanner, собирает с -O2, то все обламывается на том, что g-ir-scanner не может просканировать заголовки glib, из-за разного поведения G_LIKELY/G_UNLIKELY в дебаге и релизе.
* В процессе работы g-ir-scanner компилирует тулзу, слинкованную со всеми нужнымии библиотеками, и через ldd пытается определить, что же это за библиотеки. Это пришлось зафейкать - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/py/ix.sh#L13-L14
* https://github.com/pg83/ix/blob/main/pkgs/bld/gir/unwrap/ix.sh#L5-L7 - ну и пришлось влинковать в разные программы кучу всякого рода заглушек, которые строят фабрику для dlopen() - https://github.com/pg83/ix/blob/main/pkgs/lib/glib/dl/gobject/ix.sh - вот так, например, выглядит экспорт всех символов из libgobject-2.0.a в мою машинерию.
Короче, это такой маленький шедевр, искусство статической сборки!
(телегу я пока с этим g-ir-scanner не собрал, по причинам, непосредственно с этим текстом не связанным)
Гля чо у меня есть!
pg:~/ix ls .../...-bin-gir/lib/girepository-1.0
cairo-1.0.typelib
DBus-1.0.typelib
DBusGLib-1.0.typelib
fontconfig-2.0.typelib
freetype2-2.0.typelib
Gio-2.0.typelib
GIRepository-2.0.typelib
GL-1.0.typelib
GLib-2.0.typelib
GModule-2.0.typelib
GObject-2.0.typelib
libxml2-2.0.typelib
Vulkan-1.0.typelib
win32-1.0.typelib
xfixes-4.0.typelib
xft-2.0.typelib
xlib-2.0.typelib
xrandr-1.3.typelib
На самом деле, это значит, что у меня случился локальный прорыв в борьбе с gobject introspection (писал про это в https://xn--r1a.website/itpgchannel/1253)
Я сумел собрать g-ir-scanner в статически слинкованный бинарь (напомню, там python, .py скрипты, и модуль _giscanner, который в оригинале идет в виде .so)
Вкратце скетч построения:
* Сборка этого пакета хочет за один присест построить как тулзы, так и _giscanner.so, ну и сгенерить .typelib файлы для всего glib. Мне пришлось это декомпозировать на части. Первым делом я собираю питонячий модуль в виде .a файла, при этом мне нужно убедить родную сборку этого пакета, что у нее уже есть готовые тулзы. Я заменил готовые тулзы на пустой скрипт, который ничего не делает - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/bootstrap/t/ix.sh#L10-L11
* Так как он ничего не делает, то потом надо убедить make install, что нужныке файлы таки сгенерились (они будут пустые) - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/bootstrap/t/ix.sh#L16-L19C20
* Далее я раскидываю поличившиеся артефакты (модуль, и скрипты) правильным образом, как будет ожидать дальнейший шаг - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/py/ix.sh
* После чего я строю статический конструктор, который зарегистрирует модуль _giscanner в машинерии питона по импорту модулей - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/py/register/ix.sh#L14 (боже, благолови Сишку, что там можно везде написать void*, без всякого дурацкого манглинга!)
* Дальше я линкую все 3 сущности, которые я описал выше, в один модуль - https://github.com/pg83/ix/blob/main/pkgs/bld/gir/scanner/unwrap/ix.sh#L17-L20, который, по удачному стелению обстоятельств, представляет из себя монобинарь с g-ir-scanner. На ходу пришлось подпатчить скрипт, чтобы модуль _giscanner импортировался корректно.
* Ну а дальше, имея готовый https://github.com/pg83/ix/blob/main/pkgs/bld/gir/unwrap/ix.sh#L12, и используя фичу сборки этого пакета с внешним g-ir-scanner (для кросс-компиляции), можно построить настоящие .typelib.
Отдельно можно упомянуть:
* https://github.com/pg83/ix/blob/main/pkgs/bld/gir/unwrap/ix.sh#L22 - если компилятор, который дергает g-ir-scanner, собирает с -O2, то все обламывается на том, что g-ir-scanner не может просканировать заголовки glib, из-за разного поведения G_LIKELY/G_UNLIKELY в дебаге и релизе.
* В процессе работы g-ir-scanner компилирует тулзу, слинкованную со всеми нужнымии библиотеками, и через ldd пытается определить, что же это за библиотеки. Это пришлось зафейкать - https://github.com/pg83/ix/blob/main/pkgs/lib/gi/repository/py/ix.sh#L13-L14
* https://github.com/pg83/ix/blob/main/pkgs/bld/gir/unwrap/ix.sh#L5-L7 - ну и пришлось влинковать в разные программы кучу всякого рода заглушек, которые строят фабрику для dlopen() - https://github.com/pg83/ix/blob/main/pkgs/lib/glib/dl/gobject/ix.sh - вот так, например, выглядит экспорт всех символов из libgobject-2.0.a в мою машинерию.
Короче, это такой маленький шедевр, искусство статической сборки!
(телегу я пока с этим g-ir-scanner не собрал, по причинам, непосредственно с этим текстом не связанным)
Telegram
commit -m "better"
Я тут недавно встрял на обновлении телеги, вроде, на версию 4.8.3. #gir
Потому что коллеги там одним махом добавили обязательную зависимость от webview, наверное, чтобы показывать мне охуительные сториз (кстати, предупреждаю, что всех, кто увлекается сторизами…
Потому что коллеги там одним махом добавили обязательную зависимость от webview, наверное, чтобы показывать мне охуительные сториз (кстати, предупреждаю, что всех, кто увлекается сторизами…
🔥12🤯7❤🔥5👍4😱1
commit -m "better"
Будни #bootstrap #gold #gir Гля чо у меня есть! pg:~/ix ls .../...-bin-gir/lib/girepository-1.0 cairo-1.0.typelib DBus-1.0.typelib DBusGLib-1.0.typelib fontconfig-2.0.typelib freetype2-2.0.typelib Gio-2.0.typelib GIRepository-2.0.typelib GL-1.0.typelib GLib…
Пересобрал. Удивительно, но оно даже работает.
Для того, чтобы бампнуть на последнюю версию, пришлось знатно раскурочить исходники, потому что новые ranges, новый компилятор, и вот это вот все.
Вот, например, набор патчей, связанных с ranges - https://github.com/pg83/ix/blob/main/pkgs/bin/telegram/desktop/unwrap/ix.sh#L122-L139
Не знаю, современный С++, наверное, уже слишком сложный, чтобытам завелась жизнь компиляторы могли его понимать однозначно.
Наверняка функция, на которую я заменил ranges::contains, компилируется в 100500 раз быстрее, но кому это важно?
Для того, чтобы бампнуть на последнюю версию, пришлось знатно раскурочить исходники, потому что новые ranges, новый компилятор, и вот это вот все.
Вот, например, набор патчей, связанных с ranges - https://github.com/pg83/ix/blob/main/pkgs/bin/telegram/desktop/unwrap/ix.sh#L122-L139
Не знаю, современный С++, наверное, уже слишком сложный, чтобы
Наверняка функция, на которую я заменил ranges::contains, компилируется в 100500 раз быстрее, но кому это важно?
GitHub
ix/pkgs/bin/telegram/desktop/unwrap/ix.sh at main · pg83/ix
ix package manager. Contribute to pg83/ix development by creating an account on GitHub.
🔥7💊6❤2👨💻1
commit -m "better"
https://xn--r1a.website/itpgchannel/1336 Болельщики с мест нам подсказывают, что разработчики #hyprland прогнулись, и пилят CoC - https://github.com/hyprwm/Hyprland/pull/3366
https://www.phoronix.com/news/wlroots-Tearing-Control-Merged
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3871?s=09
Я так понимаю, это дает нам объяснение того, почему Hyprland прогнулся под атакой #ddv.
Потому что от Hyprland есть какое-то количество PR в wlroots. И, вот, например, PR по ссылке выше - висел себе 10 месяцев, а тут взял и смержился.
Совпадение?
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3871?s=09
Я так понимаю, это дает нам объяснение того, почему Hyprland прогнулся под атакой #ddv.
Потому что от Hyprland есть какое-то количество PR в wlroots. И, вот, например, PR по ссылке выше - висел себе 10 месяцев, а тут взял и смержился.
Совпадение?
Phoronix
wlroots Merges Wayland Tearing Control Support
The wlroots Wayland compositor library used by Sway and other Wayland compositors to help with the heavy lifting has merged support for the tearing control protocol.
🤔5❤3👍3🔥1
Вышел python 3.12
Думаю, самая крутая его фишка - это https://docs.python.org/3.12/howto/perf_profiling.html#perf-profiling
Одной строкой - интеграция с perf record/report.
Да, да, в python появился нормальный профайлер!
Тут, конечно, можно устроить срач на тему, что, если вы запускаете профайлер для python, то вы заранее делаете что-то не так. Но, тем не менее, штука очень крутая.
Думаю, самая крутая его фишка - это https://docs.python.org/3.12/howto/perf_profiling.html#perf-profiling
Одной строкой - интеграция с perf record/report.
Да, да, в python появился нормальный профайлер!
Тут, конечно, можно устроить срач на тему, что, если вы запускаете профайлер для python, то вы заранее делаете что-то не так. Но, тем не менее, штука очень крутая.
Python documentation
Python support for the Linux perf profiler
author, Pablo Galindo,. The Linux perf profiler is a very powerful tool that allows you to profile and obtain information about the performance of your application. perf also has a very vibrant eco...
👍20❤5🔥4👎1🤔1
https://www.cppstories.com/2023/monadic-optional-ops-cpp23
Текст про расширения std::optional в c++23.
Чувак, на голубом глазу, считает, что пример из https://www.cppstories.com/2023/monadic-optional-ops-cpp23/#the-c23-way-monadic-extensions лучше читается, чем пример из https://www.cppstories.com/2023/monadic-optional-ops-cpp23/#traditional-approach-with-ifelse-and-optional-c20
Первый пример, конечно, более компактен, но проще читается код по второй ссылке, потому что он:
* немного более рыхлый
* не требует держать в голове дополнительной семантики для своего понимания
* явный control flow
С точки зрения перфа, кстати, не очень понятно - в первом примере, кажется, кода может быть выполнено больше, потому что nullopt нужно "пробулькать" по всей цепочке, но это не точно.
Текст про расширения std::optional в c++23.
Чувак, на голубом глазу, считает, что пример из https://www.cppstories.com/2023/monadic-optional-ops-cpp23/#the-c23-way-monadic-extensions лучше читается, чем пример из https://www.cppstories.com/2023/monadic-optional-ops-cpp23/#traditional-approach-with-ifelse-and-optional-c20
Первый пример, конечно, более компактен, но проще читается код по второй ссылке, потому что он:
* немного более рыхлый
* не требует держать в голове дополнительной семантики для своего понимания
* явный control flow
С точки зрения перфа, кстати, не очень понятно - в первом примере, кажется, кода может быть выполнено больше, потому что nullopt нужно "пробулькать" по всей цепочке, но это не точно.
C++ Stories
How to Use Monadic Operations for `std::optional` in C++23
In this post we’ll have a look at new operations added to std::optional in C++23. These operations, inspired by functional programming concepts, offer a more concise and expressive way to work with optional values, reducing boilerplate and improving code…
👍10❤7😐5🤔2🤯2🤡2🔥1
https://cstheory.stackexchange.com/questions/53343/recent-advances-in-computer-science-since-2010
Коллега задается вопросом, а что интересного случилось в CS с 2010 года?
А ничего интересного не случилось, инкрементальные улучшения там и тут.
CS, как и многие другие науки, "закончилась", в том смысле, что человеческими мозгами там уже ничего серьезно не накопать. Для како-то существенного прогресса, наверное, нужен более мощный думатель, неважно, алгоритмический, или в виде аппаратного апгрейда человеков.
Коллега задается вопросом, а что интересного случилось в CS с 2010 года?
А ничего интересного не случилось, инкрементальные улучшения там и тут.
CS, как и многие другие науки, "закончилась", в том смысле, что человеческими мозгами там уже ничего серьезно не накопать. Для како-то существенного прогресса, наверное, нужен более мощный думатель, неважно, алгоритмический, или в виде аппаратного апгрейда человеков.
Theoretical Computer Science Stack Exchange
Recent advances in computer science since 2010?
Since I left school (early 2010s) a couple of recently developed techniques were widely adopted by the industry. For example,
Asymmetric numeral systems for compression (e.g. Ubuntu ships with zstd
Asymmetric numeral systems for compression (e.g. Ubuntu ships with zstd
🤔4🤡3😁1🤨1
commit -m "better"
Вышел python 3.12 Думаю, самая крутая его фишка - это https://docs.python.org/3.12/howto/perf_profiling.html#perf-profiling Одной строкой - интеграция с perf record/report. Да, да, в python появился нормальный профайлер! Тут, конечно, можно устроить срач…
https://www.bitecode.dev/p/python-312-what-didnt-make-the-headlines#%C2%A7the-performance-let-down
Тут вот коллега пишет, что python 3.12 не быстрее 3.11 на 5%, а довольно значимо медленнее (для теста использовался https://github.com/python/pyperformance).
"You'll notice that 14 tests run faster, but 79 run slower"
Да и даже по wall time всего теста там видно замедление.
Эх, где те (недавние) времена, когда нам обещали 50%-ое ускорение на каждый мажорный релиз?
#fast_python
Тут вот коллега пишет, что python 3.12 не быстрее 3.11 на 5%, а довольно значимо медленнее (для теста использовался https://github.com/python/pyperformance).
"You'll notice that 14 tests run faster, but 79 run slower"
Да и даже по wall time всего теста там видно замедление.
Эх, где те (недавние) времена, когда нам обещали 50%-ое ускорение на каждый мажорный релиз?
#fast_python
www.bitecode.dev
Python 3.12: what didn't make the headlines
It's less interesting, but it's a niche I can fill
😱10😁4❤3🤔1
https://www.phoronix.com/news/Glibc-LD-Nasty-Root-Bug
"We successfully exploited this vulnerability and obtained full root privileges on the default installations of Fedora 37 and 38, Ubuntu 22.04 and 23.04, Debian 12 and 13; other distributions are probably also vulnerable and exploitable (one notable exception is Alpine Linux, which uses musl libc, not the glibc)"
#stal/ix, по понятным причинам, данной уязвимости не подвержен.
"We successfully exploited this vulnerability and obtained full root privileges on the default installations of Fedora 37 and 38, Ubuntu 22.04 and 23.04, Debian 12 and 13; other distributions are probably also vulnerable and exploitable (one notable exception is Alpine Linux, which uses musl libc, not the glibc)"
#stal/ix, по понятным причинам, данной уязвимости не подвержен.
Phoronix
Glibc Dynamic Loader Hit By A Nasty Local Privilege Escalation Vulnerability
A nasty vulnerability has been made public today concerning Glibc's dynamic loader that can lead to full root privileges being obtained by local users
👍14🔥7😁7⚡2😱2🤡1
Forwarded from Programmer memes
This media is not supported in your browser
VIEW IN TELEGRAM
🔥7❤3👍3😁3🤣2🥴1
commit -m "better"
#ix #mirror Тем временем, у нас появилось первое полноценное зеркало - https://github.com/pg83/ix/blob/main/pkgs/die/scripts/mirrors.txt - http://ix-eparo-mirror.duckdns.org/ Если вы готовы запилить такое же, сразу шлите PR в этот файл. А я, eventually,…
У нас уже 6 зеркал, и есть дока, как запилить свое!
https://github.com/stal-ix/stal-ix.github.io/blob/main/MIRROR.md
Одно из зеркал - http://ix.samokhvalov.xyz/ - мое.
Я совершенно случайно прочел договор с провайдером, и выяснил, что белый IP у меня уже давно есть, просто по умолчанию. Ну а домен я зарегал уже очень давно, просто на всякий случай.
Под это дело я запилил runit юнит для #stal/IX:
Не могу не похвастаться тем, как этот юнит устроен, конкретно - программная его генерация:
https://github.com/pg83/ix/blob/main/pkgs/bin/ix/mirror/unwrap/ix.sh
Прямо классно, как я его собрал из маленьких запчастей. Особенно доставляет, что я забыл, как в Go делается парсинг command line (бывает, когда в голове с 5 языков на постоянной основе), и просто сгенерил программу, в которую зашиты настройки из вызова
https://github.com/pg83/ix/blob/main/pkgs/bin/ix/mirror/serve/serve.go#L6-L7
(я не уверен, что эта простая программа не сможет прочесть что-нибудь не то, но у меня кроме кеша там вообще ничего нет, поэтому пофиг)
https://github.com/pg83/ix/blob/main/pkgs/bin/ix/mirror/serve/ix.sh#L5
Можно было бы вообще inline, без sed, но так проще, потому что не надо думать про escaping.
(do not do this, kids, at home)
#mirror
https://github.com/stal-ix/stal-ix.github.io/blob/main/MIRROR.md
Одно из зеркал - http://ix.samokhvalov.xyz/ - мое.
Я совершенно случайно прочел договор с провайдером, и выяснил, что белый IP у меня уже давно есть, просто по умолчанию. Ну а домен я зарегал уже очень давно, просто на всякий случай.
Под это дело я запилил runit юнит для #stal/IX:
# ix mut system bin/ix/mirror \
--port=8080 \
--user=mirror \
--wd=/home/mirror
# mkdir /home/mirror
# chown mirror /home/mirror
Не могу не похвастаться тем, как этот юнит устроен, конкретно - программная его генерация:
https://github.com/pg83/ix/blob/main/pkgs/bin/ix/mirror/unwrap/ix.sh
Прямо классно, как я его собрал из маленьких запчастей. Особенно доставляет, что я забыл, как в Go делается парсинг command line (бывает, когда в голове с 5 языков на постоянной основе), и просто сгенерил программу, в которую зашиты настройки из вызова
ix mut выше:https://github.com/pg83/ix/blob/main/pkgs/bin/ix/mirror/serve/serve.go#L6-L7
(я не уверен, что эта простая программа не сможет прочесть что-нибудь не то, но у меня кроме кеша там вообще ничего нет, поэтому пофиг)
https://github.com/pg83/ix/blob/main/pkgs/bin/ix/mirror/serve/ix.sh#L5
Можно было бы вообще inline, без sed, но так проще, потому что не надо думать про escaping.
(do not do this, kids, at home)
#mirror
🔥7👍4❤3🫡2🤔1