Тут вот, 10 дней назад, случился порт epiphany на GTK4. https://github.com/GNOME/epiphany/commit/6e5357947679e48aa1c043f221425255105937a1
Я, конечно, завел его раньше всех, и даже сделал для вас скриншот(как обычно, на телефон, для доказательства того, что все работает на реальном железе)
Оно пока жрет 100% одного ядра, и поэтому не очень юзабельно.
Интерфейсы на libadwaita, признаться, мне нравятся меньше, чем gtk3.
Я, конечно, завел его раньше всех, и даже сделал для вас скриншот(как обычно, на телефон, для доказательства того, что все работает на реальном железе)
Оно пока жрет 100% одного ядра, и поэтому не очень юзабельно.
Интерфейсы на libadwaita, признаться, мне нравятся меньше, чем gtk3.
👍5❤2🥰1
commit -m "better"
https://www.opennet.ru/opennews/art.shtml?num=56518 #law #yeswecan #provider Опять наезжают на youtube-dl. Надеюсь, Европа с ее continental law, с этими говнюками справится лучше. Отмечу, что уже хорошо то, что идут в суд, а не в github. И провайдер молодцы…
Кажется, у меня есть победитель в этом соревновании. #kuroko
https://www.opennet.ru/opennews/art.shtml?num=57995
https://kuroko-lang.github.io/
Язык реально очень похож на Python, работает под все нужные мне платформы, легко собирается.
При этом:
В некоторых проектах этот враппер замедляет компиляцию в разы, именно из-за долгой подгрузки интерпретатора.
https://www.opennet.ru/opennews/art.shtml?num=57995
https://kuroko-lang.github.io/
Язык реально очень похож на Python, работает под все нужные мне платформы, легко собирается.
При этом:
pg-> time python3 ./qw.pyНу, то есть, эта штука решает мою основную проблему с Python - на нем невыгодно писать часто выполняющиеся скрипты, типа моего враппера для clang, который реализует всякую магию со статической линковкой - https://github.com/pg83/ix/blob/main/pkgs/bld/scripts/wrapcc/wrapcc.py
real 0m0.041s
user 0m0.030s
sys 0m0.003s
pg-> time kuroko ./qw.py
real 0m0.004s
user 0m0.001s
sys 0m0.001s
pg-> cat qw.py
pg->
В некоторых проектах этот враппер замедляет компиляцию в разы, именно из-за долгой подгрузки интерпретатора.
www.opennet.ru
Выпуск операционной системы ToaruOS 2.1
Опубликован выпуск Unix-подобной операционной системы ToaruOS 2.1, написанной с нуля и поставляемой со своим ядром, загрузчиком, стандартной Си-библиотекой, пакетным менеджером, компонентами пространства пользователя и графическим интерфейсом с композитным…
👍11🔥4🤔2👏1
Для дальнейшего текста я молчаливо подразумеваю, что вы знаете, что такое магическое мышление, и согласны с тезисом, что магическое мышление растет(подискутировать на эту тему интересно тоже, но примерно понятно, во что такое обсуждение выльется).
Хочу предложить свою теорию, почему оно растет.
20 век, примерно с самого начала, до, наверное, годов 60-ых, представлял из себя сплошной и постоянный триумф разума и инженерного подхода.
Люди узнавали про окружающий мир все больше, и больше, и умели все быстрее, выше, сильнее.
При этом, почти все, что делалось, можно было пощупать и обозреть. Ну, реально, можно было взять любой предмет, и разобраться от и до, как он работает, исходя из базовых принципов.
Поэтому людям нужно было все меньше и меньше магии для объяснения окружающего мира.
В какой-то момент этот процесс видоизменился. Сложность вещей достигла предела, когда ни один человек не может рассказать, как эта вещь сделана(или из чего она состоит) от и до.
Настало время узких специалистов.
Поэтому нас снова окружает магия, в которой мы не можем разобраться досконально, от и до, но только теперь мы эту магию делаем сами для себя.
На примере - 15 - 20 лет назад я думал, что могу рассказать, как устроен компьютер, от и до, вплоть даже до уровня микросхем. Сейчас уже не могу - литография, корпусирование, это для меня уже магия. Если 15 - 20 лет назад я мог хотя бы отдаленно рассказать, как устроен процессор, то сейчас туда вбухано уже столько усилий, что я не могу этого сделать.
Ну а раз нас снова окружает магия, то и растет магическое мышление.
И совершенно непонятно, почему эта ситуация может улучшиться. Например, с наступлением дипфейков наступает эра, когда мы не просто тонем в потоке информации, а когда мы не сможем ПРИНЦИПИАЛЬНО сказать, что вообще фактологически верно, а что - нет.
Хочу предложить свою теорию, почему оно растет.
20 век, примерно с самого начала, до, наверное, годов 60-ых, представлял из себя сплошной и постоянный триумф разума и инженерного подхода.
Люди узнавали про окружающий мир все больше, и больше, и умели все быстрее, выше, сильнее.
При этом, почти все, что делалось, можно было пощупать и обозреть. Ну, реально, можно было взять любой предмет, и разобраться от и до, как он работает, исходя из базовых принципов.
Поэтому людям нужно было все меньше и меньше магии для объяснения окружающего мира.
В какой-то момент этот процесс видоизменился. Сложность вещей достигла предела, когда ни один человек не может рассказать, как эта вещь сделана(или из чего она состоит) от и до.
Настало время узких специалистов.
Поэтому нас снова окружает магия, в которой мы не можем разобраться досконально, от и до, но только теперь мы эту магию делаем сами для себя.
На примере - 15 - 20 лет назад я думал, что могу рассказать, как устроен компьютер, от и до, вплоть даже до уровня микросхем. Сейчас уже не могу - литография, корпусирование, это для меня уже магия. Если 15 - 20 лет назад я мог хотя бы отдаленно рассказать, как устроен процессор, то сейчас туда вбухано уже столько усилий, что я не могу этого сделать.
Ну а раз нас снова окружает магия, то и растет магическое мышление.
И совершенно непонятно, почему эта ситуация может улучшиться. Например, с наступлением дипфейков наступает эра, когда мы не просто тонем в потоке информации, а когда мы не сможем ПРИНЦИПИАЛЬНО сказать, что вообще фактологически верно, а что - нет.
🔥19👍9❤1🤔1
commit -m "better"
Вышел Python 3.11: Python for WorkTaskGroups, Миша с фороникса пишет, что ажно на треть быстрее - https://www.phoronix.com/review/python-311-performance В релизе написано, что ажно на 22% быстрее - https://www.python.org/downloads/release/python-3110/. (еще…
pg-> time python3.10 ./ix mutТак, я заново провел все измерения, убрал все возможные валенки, и таки намерял 15% перфа.
READY /ix/store/WMzs8auPYT0HprPg-rlm-system/touch
READY /ix/store/FLF6InICfWIWn8f7-rlm-kernel/touch
READY /ix/store/Npg3GsrWkigH1k19-rlm-boot/touch
READY /ix/store/4E7UpTfSwwBw8Weq-rlm-pg/touch
READY /ix/store/UnsOLbAiiYK25ce2-rlm-install/touch
READY /ix/store/bwCWxrGvGTU2qKgF-rlm-pgg/touch
real 0m7.872s
user 0m6.880s
sys 0m0.092s
pg-> time python3.11 ./ix mut
READY /ix/store/WMzs8auPYT0HprPg-rlm-system/touch
READY /ix/store/FLF6InICfWIWn8f7-rlm-kernel/touch
READY /ix/store/Npg3GsrWkigH1k19-rlm-boot/touch
READY /ix/store/4E7UpTfSwwBw8Weq-rlm-pg/touch
READY /ix/store/UnsOLbAiiYK25ce2-rlm-install/touch
READY /ix/store/bwCWxrGvGTU2qKgF-rlm-pgg/touch
real 0m6.800s
user 0m5.767s
sys 0m0.134s
pg->
Вышеуказанная команда строит описание сборочного графа из шаблонов, там много jinja2, json, конкатенации строк, и все такое. Короче, на мой вкус, очень показательная питонячка.
15% на дороге не валяются, чего уж тут.
👍23🔥12👏2
commit -m "better"
Тут вот, 10 дней назад, случился порт epiphany на GTK4. https://github.com/GNOME/epiphany/commit/6e5357947679e48aa1c043f221425255105937a1 Я, конечно, завел его раньше всех, и даже сделал для вас скриншот(как обычно, на телефон, для доказательства того, что…
https://www.opennet.ru/opennews/art.shtml?num=57999
А теперь про epiphany во всех (остальных) газетах!
У меня, конечно, по интересным мне темам самый свежак!
А еще до 1000-го пользователя(которому я принудительно устанавливаю #ix на ноутбук) осталось всего 10 человек!
(правда, буду честным, когда я смогу это сделать, я понятия не имею, потому что в МСК стараюсь без веских причин не ездить)
А теперь про epiphany во всех (остальных) газетах!
У меня, конечно, по интересным мне темам самый свежак!
А еще до 1000-го пользователя(которому я принудительно устанавливаю #ix на ноутбук) осталось всего 10 человек!
(правда, буду честным, когда я смогу это сделать, я понятия не имею, потому что в МСК стараюсь без веских причин не ездить)
www.opennet.ru
Web-браузер Epiphany (GNOME Web) переведён на GTK4
В основную ветку web-браузера Epiphany, развиваемого проектом GNOME, основанного на движке WebKitGTK и предлагаемого пользователям под именем GNOME Web, добавлена поддержка библиотеки GTK4. Интерфейс Epiphany приближен к современным требованиям к стилю приложений…
🔥9👍1🤨1
commit -m "better"
Кажется, у меня есть победитель в этом соревновании. #kuroko https://www.opennet.ru/opennews/art.shtml?num=57995 https://kuroko-lang.github.io/ Язык реально очень похож на Python, работает под все нужные мне платформы, легко собирается. При этом: pg->…
https://github.com/pg83/ix/blob/main/pkgs/bld/scripts/wrapcc/kuroko/wrapcc.krk#L50 #kuroko
Мужик сказал - мужик сделал!
Переписал свой самый главный скрипт на python на kuroko. Оно так раз, и заработало, без излишних проблем.
Что могу сказать?
* Бедная стандартная библиотека(это хорошо!), пришлось наколбасить os.makedirs() самому. subprocess тоже нет, но мне хватило и execve().
* Это действительно диалект питона, в отличие от всяких там starlark(которые похожи снаружи, но имеют совершенно другую модель). Ну, то есть, там есть протокол имплементации генератора, протокол доступа к полям, и они похожи на питонячьи.
* В целом, kuroko похоже на такой обрезанный питон, откуда убрали наслоения "ненужно", и переработали так, как будто перед глазами держали всю эволюцию питона, и сразу знали, как надо.
* block scoped, это очень приятно
Мне понравилось, попробую пописать на нем свои однострочники, для разнообразия.
Мужик сказал - мужик сделал!
Переписал свой самый главный скрипт на python на kuroko. Оно так раз, и заработало, без излишних проблем.
Что могу сказать?
* Бедная стандартная библиотека(это хорошо!), пришлось наколбасить os.makedirs() самому. subprocess тоже нет, но мне хватило и execve().
* Это действительно диалект питона, в отличие от всяких там starlark(которые похожи снаружи, но имеют совершенно другую модель). Ну, то есть, там есть протокол имплементации генератора, протокол доступа к полям, и они похожи на питонячьи.
* В целом, kuroko похоже на такой обрезанный питон, откуда убрали наслоения "ненужно", и переработали так, как будто перед глазами держали всю эволюцию питона, и сразу знали, как надо.
* block scoped, это очень приятно
Мне понравилось, попробую пописать на нем свои однострочники, для разнообразия.
👍20😱3🔥2👌1
https://xeiaso.net/blog/openssl-3.x-secvuln-incoming
Тут вот все спекулируют, какое нас ждет стрррашшшное CVE в openssl, а я чем хуже?
Думаю, уровню нагнетаемого может соответствовать только один баг - кто-то придумал быстрый способ разложения на простые числа, и в openssl запили патч от этого!
(все же поняли, что это шутка, да?)
Если серьезно, и если вспомнить старое, то почему бы и нет - однажды уже находили баги в каком-то конкретном генераторе ключей - https://research.swtch.com/openssl
Тут вот все спекулируют, какое нас ждет стрррашшшное CVE в openssl, а я чем хуже?
Думаю, уровню нагнетаемого может соответствовать только один баг - кто-то придумал быстрый способ разложения на простые числа, и в openssl запили патч от этого!
(все же поняли, что это шутка, да?)
Если серьезно, и если вспомнить старое, то почему бы и нет - однажды уже находили баги в каком-то конкретном генераторе ключей - https://research.swtch.com/openssl
👍5😁3🔥2
Давно не писал про сумасшедших.
Знаете, у многих гениальных людей есть какой-то пунктик, идея фикс.
У кого-то, например, это мечты про статическую линковку во всем мире. Кто-то, как автор #mold, пишет уже второй самый быстрый линкер в мире.
А вот автор #kuroko, например, считает, что command line help должен быть забацан шрифтом с наклоном.
В первый раз такое вижу.
Знаете, у многих гениальных людей есть какой-то пунктик, идея фикс.
У кого-то, например, это мечты про статическую линковку во всем мире. Кто-то, как автор #mold, пишет уже второй самый быстрый линкер в мире.
А вот автор #kuroko, например, считает, что command line help должен быть забацан шрифтом с наклоном.
В первый раз такое вижу.
😁15😐7🤡5👍4🔥3🤔2⚡1😱1🤮1🍌1
Мир динамического связывания, да еще с попытками сохранять ABI, он странный. Иногда я вообще не понимаю, как там хоть чего-то работает, как замышлял автор.
Вот, например:
Тут, literally, написано, что авторы gtk4 скопировали кусок wayland(а, может, оба скопировали кусок Xorg, это не очень важно) к себе, и, в случае динамической линковки прикопали эти символы, чтобы они не торчали наружу.
Зачем?
* Понадобилась новая функциональность.
* Совсем леденящий душу пиздец, если они решили, что лично им нада, чтобы этот код вел себя иначе.
К чему это может привести?
Да к чему угодно!
* Иногда это просто работает
* А иногда, если оказывается, что копипаста оперирует структурами разных версий, и они как-то перетекают из одной области в другую, то случаются произвольно интересные артефакты.
Тестов на это, конечно, нет, обычно это "я у себя локально проверил, мамой клянусь".
Вот, например:
Compiler stderr:Что тут написано?
ld.lld: error: duplicate symbol: xcursor_images_destroy
>>> defined at xcursor.c:249 (/ix/build/fja88msjMiHf4EQC/obj/../src/gdk/wayland/cursor/xcursor.c:249)
>>> xcursor.c.o:(xcursor_images_destroy) in archive /ix/store/fja88msjMiHf4EQC-lib-gtk-4/l
ib/libgtk-4.a
>>> defined at xcursor.c:190 (/ix/build/dZwgGctAuARxPc1P/obj/../src/cursor/xcursor.c:190)
>>> xcursor.c.o:(.text+0x0) in archive /ix/store/dZwgGctAuARxPc1P-lib-wayland/lib/libwayla
nd-cursor.a
ld.lld: error: duplicate symbol: wl_cursor_image_get_buffer
>>> defined at wayland-cursor.c:162 (/ix/build/fja88msjMiHf4EQC/obj/../src/gdk/wayland/cursor/wayland
-cursor.c:162)
>>> wayland-cursor.c.o:(wl_cursor_image_get_buffer) in archive /ix/store/fja88msjMiHf4EQC-
lib-gtk-4/lib/libgtk-4.a
>>> defined at wayland-cursor.c:155 (/ix/build/dZwgGctAuARxPc1P/obj/../src/cursor/wayland-cursor.c:15
5)
>>> wayland-cursor.c.o:(.text+0x0) in archive /ix/store/dZwgGctAuARxPc1P-lib-wayland/lib/l
ibwayland-cursor.a
Тут, literally, написано, что авторы gtk4 скопировали кусок wayland(а, может, оба скопировали кусок Xorg, это не очень важно) к себе, и, в случае динамической линковки прикопали эти символы, чтобы они не торчали наружу.
Зачем?
* Понадобилась новая функциональность.
* Совсем леденящий душу пиздец, если они решили, что лично им нада, чтобы этот код вел себя иначе.
К чему это может привести?
Да к чему угодно!
* Иногда это просто работает
* А иногда, если оказывается, что копипаста оперирует структурами разных версий, и они как-то перетекают из одной области в другую, то случаются произвольно интересные артефакты.
Тестов на это, конечно, нет, обычно это "я у себя локально проверил, мамой клянусь".
👍11😱5🤡2🍌2
https://bugs.chromium.org/p/chromium/issues/detail?id=1178058#c84
А вот Гугл пытается объяснить, зачем же он отрывает в Хроме поддержку #jpegxl, а, на самом деле, фактически, убивает свой же формат.
Расскажу старый советский анекдот на тему:
Коммунизм. Жена посылает мужа в магазин за мясом. Тот возыращается с пустыми руками и говорит: "А там на двери была табличка: "Сегодня в мясе потребности нет!"
А вот Гугл пытается объяснить, зачем же он отрывает в Хроме поддержку #jpegxl, а, на самом деле, фактически, убивает свой же формат.
Расскажу старый советский анекдот на тему:
Коммунизм. Жена посылает мужа в магазин за мясом. Тот возыращается с пустыми руками и говорит: "А там на двери была табличка: "Сегодня в мясе потребности нет!"
😢4🤣4😁3👎1🍌1
commit -m "better"
Беснование в open source набирает обороты, дурацкой лицензией дело не ограничивается, люди уже начинают портить данные на жестких дисках. https://github.com/medikoo/es5-ext/commit/28de285ed433b45113f01e4ce7c74e9a356b2af2 https://github.com/vuejs/vue-cli/issues/7054…
https://sourcehut.org/blog/2022-10-31-tos-update-cryptocurrency/ #ddv #source_hut
sr.ht решили поиграть в модерацию проектов. Пишут, что удалят все проекты, связанные с крипто.
Я тут вижу 2 возможности:
1) Их попросили убрать все это говно, с угрозой закрытия иначе.
2) Они сами решили поиграть в модерацию своей площадки.
В любом их этих вариантов мне далее с ними не по пути, потому что они или врут мне про реальные причины удаления, или они - проклятые леваки-#SJW.
sr.ht решили поиграть в модерацию проектов. Пишут, что удалят все проекты, связанные с крипто.
Я тут вижу 2 возможности:
1) Их попросили убрать все это говно, с угрозой закрытия иначе.
2) Они сами решили поиграть в модерацию своей площадки.
В любом их этих вариантов мне далее с ними не по пути, потому что они или врут мне про реальные причины удаления, или они - проклятые леваки-#SJW.
sourcehut.org
SourceHut terms of service updates, cryptocurrency-related projects to be removed
sourcehut is a network of useful open source tools for software project maintainers and collaborators, including git repos, bug tracking, continuous integration, and mailing lists.
👍7😐6❤3🐳2🍌1
Мне тут посоветовали вместо #mosh использовать https://eternalterminal.dev
Я не знаю, как оно работает, и, весьма вероятно, не узнаю, потому что это какая-то пионерская поделка. Как-то рассказывал про #kitty, вот, примерно из той же оперы - говнокод, работающий исключительно благодаря огромным вложенным усилиям.
Он, знаете ли, падает у меня, причем очень настойчиво, я фикшу одну ошибку, он падает где-то еще:
* Падал при любой попытке вывести исключение. Почему?
* Кидал исключение даже до того, как печатал —help. Почему? Потому что, перед тем, как сделать что-то разумное, пытался перенаправить stderr в файл, и, при этом, содержал некорректную реализацию GetTempDirectory() - https://github.com/MisterTea/EternalTerminal/blob/master/src/base/Headers.hpp#L384 (кто так делает, в 21 веке???), при попытке открыть файл в которой летело исключение. Далее смотри пункт 1. Вообще, неправильное получение tmp dir - этим много кто грешит, поэтому я даже запилил микробиблиотечку, которой патчу клиентов по месту - https://github.com/pg83/ix/blob/main/pkgs/bin/et/ix/ix.sh#L26 https://github.com/pg83/ix/tree/main/pkgs/lib/shim/ix
Настраивать логгирование до парсинга command line - это так-то клиника.
Оно у меня снова падает, и я не уверен, что хочу продолжать этот квест.
Я не знаю, как оно работает, и, весьма вероятно, не узнаю, потому что это какая-то пионерская поделка. Как-то рассказывал про #kitty, вот, примерно из той же оперы - говнокод, работающий исключительно благодаря огромным вложенным усилиям.
Он, знаете ли, падает у меня, причем очень настойчиво, я фикшу одну ошибку, он падает где-то еще:
pg-> et pg@pg.vla.yp-c.yandex.netШтоа?
Could not reach the ET server:
pg.vla.yp-c.yandex.net:2022
pg-> et -u pg pg.vla.yp-c.yandex.net
Segmentation fault
* Падал при любой попытке вывести исключение. Почему?
376 numFrames = backtrace(stack,Ну, например, потому что у меня backtrace() возвращает 0, потому что без frame pointer вывести стектрейс - дорогое удовольствие, #musl не умеет. 0 - нормальный результат, https://man7.org/linux/man-pages/man3/backtrace.3.html
MAX_STACK_FRAMES);
377 memmove(stack, stack + 1,
sizeof(void *) * (numFrames - 1));
* Кидал исключение даже до того, как печатал —help. Почему? Потому что, перед тем, как сделать что-то разумное, пытался перенаправить stderr в файл, и, при этом, содержал некорректную реализацию GetTempDirectory() - https://github.com/MisterTea/EternalTerminal/blob/master/src/base/Headers.hpp#L384 (кто так делает, в 21 веке???), при попытке открыть файл в которой летело исключение. Далее смотри пункт 1. Вообще, неправильное получение tmp dir - этим много кто грешит, поэтому я даже запилил микробиблиотечку, которой патчу клиентов по месту - https://github.com/pg83/ix/blob/main/pkgs/bin/et/ix/ix.sh#L26 https://github.com/pg83/ix/tree/main/pkgs/lib/shim/ix
Настраивать логгирование до парсинга command line - это так-то клиника.
Оно у меня снова падает, и я не уверен, что хочу продолжать этот квест.
Eternal Terminal
Remote terminal for the busy and impatient
😁7🔥5👍3🤯1🍌1
commit -m "better"
Мне тут посоветовали вместо #mosh использовать https://eternalterminal.dev Я не знаю, как оно работает, и, весьма вероятно, не узнаю, потому что это какая-то пионерская поделка. Как-то рассказывал про #kitty, вот, примерно из той же оперы - говнокод, работающий…
Ну я раскопал падение. #debug
https://gist.github.com/pg83/a369133c03715179534c8945c2b6afd6
Что тут написано?
* username - булева опция
* пытаемся ее получить как строку
* ловим bad_cast в dynamic_cast
* кидаем его, не имея exception handler
* попадаем в std::terminate, который перенастроен библиотекой логгирования
* она пытается вывести в stderr
* у нее не получается(хрен знает, почему)
Там особо красивый сниппет кода:
Но abort игнорит текст:
* и оно все падает, без внятной диагностики
https://gist.github.com/pg83/a369133c03715179534c8945c2b6afd6
pg-> /ix/store/q2oDAqRXi4JDSoxV-bin-et-ix/bin/et --help
Remote shell for the busy and impatient
Usage:
et [OPTION...] [user@]hostname[:port]
-h, --help Print help
--version Print version
-u, --username Username
Что тут написано?
* username - булева опция
* пытаемся ее получить как строку
* ловим bad_cast в dynamic_cast
* кидаем его, не имея exception handler
* попадаем в std::terminate, который перенастроен библиотекой логгирования
* она пытается вывести в stderr
* у нее не получается(хрен знает, почему)
Там особо красивый сниппет кода:
2649 std::stringstream reasonStream;
2650 reasonStream << "Fatal log at [" << m_file << ":" << m_line << "]"
2651 << " If you wish to disable 'abort on fatal log' please use "
2652 << "el::Loggers::addFlag(el::LoggingFlag::DisableApplicationAbortOnF
2652 atalLog)";
2653 base::utils::abort(1, reasonStream.str());
Но abort игнорит текст:
116 /// @brief Aborts application due with user-defined status
117 static void abort(int status, const std::string& reason) {
118 // Both status and reason params are there for debugging with tools like gdb etc
119 ELPP_UNUSED(status);
120 ELPP_UNUSED(reason);
121 #if defined(ELPP_COMPILER_MSVC) && defined(_M_IX86) && defined(_DEBUG)
122 // Ignore msvc critical error dialog - break instead (on debug mode)
123 _asm int 3
124 #else
125 ::abort();
126 #endif // defined(ELPP_COMPILER_MSVC) && defined(_M_IX86) && defined(_DEBUG)
127 }
* и оно все падает, без внятной диагностики
Gist
gist:a369133c03715179534c8945c2b6afd6
GitHub Gist: instantly share code, notes, and snippets.
🌚10😢4🔥3🐳2👍1🍌1🍾1
В батле "статическая vs. динамическая линковка" есть один фактор, про который особо никто не рассказывает, ну или мне просто не встречалось раньше.
Это эстетика!
Причем не простая эстетика, что, дескать, в случае статической линковки по всей fs не валяются всякие разные .so, про которые, без пакетного менеджера, не сказать, откуда они и для чего нужны. Это лежит на поверхности, и не очень интересно.
Я как-то, когда рассказывал про #mesa, вскользь упоминал про то, как она собирается.
Речь шла про то, что, в процессе сборки 3 .so-шек собирается 10 .a-шек, и они каким-то, достаточно произвольным, образом, объединяются в соответствующие .so файлы, с использованием linker script для сокрытия общих частей.
Зачем так делается? Почему бы не сделать 10 .so-шек, которые просто линкуются друг с другом, как им и положено, и нет этой магии с дублированием кода и всего прочего?
Этого требует эстетика динамической сборки!
Потому что негоже вываливать на пользователя кучу непонятных .so, без какого-то понятного scope, которые делают невесть что. Надо отдать пользователю понятный набор артефактов, с понятным scope, а то, что между ними код дублируется - кого это волнует?
Кстати, ровно в эту же тему можно отнести мой недавний рассказ про дублирование символов в библиотеках #gtk и #wayland. Это же с ума сойти - выделить эти 3 несчастные функции в какую-то совершенно artificial библиотеку, как ее продать пользователю, как опакетить в дистрибутивах, и прочие неприятные вопросы.
И, наоборот, статическая линковка стимулирует к появлению бОльшего количества более гранулярных зависимостей, потому что это артефакты исключительно времени сборки, и их не видит пользователь. Поэтому они могут быть произвольно всратыми, хоть по 1 функции в каждой, если так удобно, все равно вживую это никто не увидит.
(пример такого разделения библиотек на части - в следующей серии, и так уже много текста)
Поэтому внутренняя эстетика, присущая тому или иному способу линковки, на самом деле, диктует то, как код будет разбит на модули, и (мое личное мнение) статическая сборка приводит к более лучшему, отражающему суть кода, разделению.
Это эстетика!
Причем не простая эстетика, что, дескать, в случае статической линковки по всей fs не валяются всякие разные .so, про которые, без пакетного менеджера, не сказать, откуда они и для чего нужны. Это лежит на поверхности, и не очень интересно.
Я как-то, когда рассказывал про #mesa, вскользь упоминал про то, как она собирается.
Речь шла про то, что, в процессе сборки 3 .so-шек собирается 10 .a-шек, и они каким-то, достаточно произвольным, образом, объединяются в соответствующие .so файлы, с использованием linker script для сокрытия общих частей.
Зачем так делается? Почему бы не сделать 10 .so-шек, которые просто линкуются друг с другом, как им и положено, и нет этой магии с дублированием кода и всего прочего?
Этого требует эстетика динамической сборки!
Потому что негоже вываливать на пользователя кучу непонятных .so, без какого-то понятного scope, которые делают невесть что. Надо отдать пользователю понятный набор артефактов, с понятным scope, а то, что между ними код дублируется - кого это волнует?
Кстати, ровно в эту же тему можно отнести мой недавний рассказ про дублирование символов в библиотеках #gtk и #wayland. Это же с ума сойти - выделить эти 3 несчастные функции в какую-то совершенно artificial библиотеку, как ее продать пользователю, как опакетить в дистрибутивах, и прочие неприятные вопросы.
И, наоборот, статическая линковка стимулирует к появлению бОльшего количества более гранулярных зависимостей, потому что это артефакты исключительно времени сборки, и их не видит пользователь. Поэтому они могут быть произвольно всратыми, хоть по 1 функции в каждой, если так удобно, все равно вживую это никто не увидит.
(пример такого разделения библиотек на части - в следующей серии, и так уже много текста)
Поэтому внутренняя эстетика, присущая тому или иному способу линковки, на самом деле, диктует то, как код будет разбит на модули, и (мое личное мнение) статическая сборка приводит к более лучшему, отражающему суть кода, разделению.
👍13🤔7🔥5😁1🆒1
https://llvm.org/ пишет, что уже можно в clang 15.0.4
Но на https://releases.llvm.org/ ничего нет.
Это все потому, что в(кстати, как правильно, в или на?) github тег уже отвели, но релиз не выложили - https://github.com/llvm/llvm-project/releases/tag/llvmorg-15.0.4
У меня, конечно, весь дистрибутив уже пересобран 8 часов назад, раньше всех! (это я так хвастаюсь)
Но на https://releases.llvm.org/ ничего нет.
Это все потому, что в(кстати, как правильно, в или на?) github тег уже отвели, но релиз не выложили - https://github.com/llvm/llvm-project/releases/tag/llvmorg-15.0.4
У меня, конечно, весь дистрибутив уже пересобран 8 часов назад, раньше всех! (это я так хвастаюсь)
GitHub
Release LLVM 15.0.4 · llvm/llvm-project
LLVM 15.0.4 Release
🔥8👍3
https://arstechnica.com/tech-policy/2022/09/experts-debate-the-ethics-of-linkedins-algorithm-experiments-on-20m-users/
В статье на серьезных щщах рассуждают, этично ли использовать A/B на кожаных мешках, или нет.
Ну, типа, еслы человек попал в плохой бакет - то это же плохо?
Какой-то левацкий sjw-душок у этого текста, не читайте.
В статье на серьезных щщах рассуждают, этично ли использовать A/B на кожаных мешках, или нет.
Ну, типа, еслы человек попал в плохой бакет - то это же плохо?
Какой-то левацкий sjw-душок у этого текста, не читайте.
Ars Technica
Experts debate the ethics of LinkedIn’s algorithm experiments on 20M users
LinkedIn relied on its user agreement to gain consent to research millions of users.
🤯6🤡5🥴3🔥2😁1🖕1
https://kristerw.github.io/2022/11/01/verifying-optimizations/
У меня есть странная слабость к разным там солверам. Я не знаю, почему. Ладно, знаю, потому что мне это до сих пор кажется магией.
К сожалению, в своей практике мне удалось их применить всего пару раз, и это, кстати, тоже был #Z3.
Зато с удовольствием читаю, как и для чего люди их используют, в надежде, что и мне пригодится.
У меня есть странная слабость к разным там солверам. Я не знаю, почему. Ладно, знаю, потому что мне это до сих пор кажется магией.
К сожалению, в своей практике мне удалось их применить всего пару раз, и это, кстати, тоже был #Z3.
Зато с удовольствием читаю, как и для чего люди их используют, в надежде, что и мне пригодится.
kristerw.github.io
Part 2: Verifying GCC optimizations using an SMT solver
This post describes the implementation of pysmtgcc. See “GCC Translation Validation” for background information.
👍6👌2❤1
commit -m "better"
В батле "статическая vs. динамическая линковка" есть один фактор, про который особо никто не рассказывает, ну или мне просто не встречалось раньше. Это эстетика! Причем не простая эстетика, что, дескать, в случае статической линковки по всей fs не валяются…
#gold
Обещал пример разделения статических библиотек, которое никогда бы не смогло случиться во внешнем мире с .so
Как я уже рассказывал, у меня есть реализация функций backtrace(), на самом деле, их там ажно три штуки:
https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo - у меня лежит 4 их реализации:
1) https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo/fake
Это просто реализация, которая ничего не делает(имеет право!), с которой как раз и сломался eternal terminal #et
2) https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo/fp
Это реализация, цельнотянутая из BSD мира, https://www.freshports.org/devel/libexecinfo, широко известна в узких кругах non-glibc linux.
Она содержит фатальный недостаток - если ее позвать из кода, который на x86_64 скомпилен с флагами компилятора по умолчанию(без -fno-omit-frame-pointer), она приводит к падению программы, потому что она падает без frame pointer.
3) https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo/itanium
Эту реализацию наговнокодил я сам, поверх itanium abi для раскрутки стека. Он всегда доступен в программах на C++, а у меня используется #tcmalloc, поэтому по коду это для меня бесплатно. Собственно, она у меня стоит по умолчанию, с возможностью переопределения - https://github.com/pg83/ix/blob/main/pkgs/lib/execinfo/ix.sh Это полезно в цепочке bootstrap, чтобы для первого компилятора собирать поменьше кода - https://github.com/pg83/ix/blob/main/pkgs/bld/boot/8/clang/base/ix.sh
4) https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo/unwind
И реализация поверх библиотеки libunwind от HP. Это старая, известная, библиотека, одна из трех более-менее известных реализаций itanium abi(наряду с stdc++ от gnu, и libunwind от проекта llvm)
Тут очень важно отметить, что, в двух последних случаях я реализовал только функцию backtrace(), одну из трех нужных. Потому что я ленивая жопа, да.
Что бы я сделал, если бы делал .so для внешнего мира? Я бы скопировал две оставшиеся функции из пункта 2) к себе в проект, и был бы счастлив.
Но, в случае статической линковки я могу себе позволить иметь сколько угодно артефактов любой степени всратости, лишь бы конечный продукт работал.
Поэтому я делаю финт ушами - https://github.com/pg83/ix/blob/main/pkgs/lib/execinfo/format/ix.sh
Я пересобираю библиотеку из пункта 2, но с указанием, что в .a файле нужно переименовать функцию backtrace(). На выходе я имею библиотеку, в которой есть функции xxx_backtrace(), backtrace_symbols(), и backtrace_symbols_fd()
Если ее скомпоновать с библиотекой 3), или библиотекой 4), то я получу на выходе годный артефакт. Линкер же выкинет при линковке ненужную функцию xxx_backtrace(), и все будет по красоте!
https://github.com/pg83/ix/blob/main/pkgs/lib/execinfo/itanium/ix.sh#L6
https://github.com/pg83/ix/blob/main/pkgs/lib/execinfo/unwind/ix.sh#L6
Собственно, я так и делаю.
В мире динамической линковки это было бы весьма странно.
В случае же статической сборки, если не особенно сильно принюхиваться, то норм, ну и я, заодно, сэкономил себе кучу времени и усилий.
Обещал пример разделения статических библиотек, которое никогда бы не смогло случиться во внешнем мире с .so
Как я уже рассказывал, у меня есть реализация функций backtrace(), на самом деле, их там ажно три штуки:
#include <execinfo.h>
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *
buffer, int size);
void backtrace_symbols_fd(void *const *
buffer, int size, int fd);
https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo - у меня лежит 4 их реализации:
1) https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo/fake
Это просто реализация, которая ничего не делает(имеет право!), с которой как раз и сломался eternal terminal #et
2) https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo/fp
Это реализация, цельнотянутая из BSD мира, https://www.freshports.org/devel/libexecinfo, широко известна в узких кругах non-glibc linux.
Она содержит фатальный недостаток - если ее позвать из кода, который на x86_64 скомпилен с флагами компилятора по умолчанию(без -fno-omit-frame-pointer), она приводит к падению программы, потому что она падает без frame pointer.
3) https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo/itanium
Эту реализацию наговнокодил я сам, поверх itanium abi для раскрутки стека. Он всегда доступен в программах на C++, а у меня используется #tcmalloc, поэтому по коду это для меня бесплатно. Собственно, она у меня стоит по умолчанию, с возможностью переопределения - https://github.com/pg83/ix/blob/main/pkgs/lib/execinfo/ix.sh Это полезно в цепочке bootstrap, чтобы для первого компилятора собирать поменьше кода - https://github.com/pg83/ix/blob/main/pkgs/bld/boot/8/clang/base/ix.sh
4) https://github.com/pg83/ix/tree/main/pkgs/lib/execinfo/unwind
И реализация поверх библиотеки libunwind от HP. Это старая, известная, библиотека, одна из трех более-менее известных реализаций itanium abi(наряду с stdc++ от gnu, и libunwind от проекта llvm)
Тут очень важно отметить, что, в двух последних случаях я реализовал только функцию backtrace(), одну из трех нужных. Потому что я ленивая жопа, да.
Что бы я сделал, если бы делал .so для внешнего мира? Я бы скопировал две оставшиеся функции из пункта 2) к себе в проект, и был бы счастлив.
Но, в случае статической линковки я могу себе позволить иметь сколько угодно артефактов любой степени всратости, лишь бы конечный продукт работал.
Поэтому я делаю финт ушами - https://github.com/pg83/ix/blob/main/pkgs/lib/execinfo/format/ix.sh
Я пересобираю библиотеку из пункта 2, но с указанием, что в .a файле нужно переименовать функцию backtrace(). На выходе я имею библиотеку, в которой есть функции xxx_backtrace(), backtrace_symbols(), и backtrace_symbols_fd()
Если ее скомпоновать с библиотекой 3), или библиотекой 4), то я получу на выходе годный артефакт. Линкер же выкинет при линковке ненужную функцию xxx_backtrace(), и все будет по красоте!
https://github.com/pg83/ix/blob/main/pkgs/lib/execinfo/itanium/ix.sh#L6
https://github.com/pg83/ix/blob/main/pkgs/lib/execinfo/unwind/ix.sh#L6
Собственно, я так и делаю.
В мире динамической линковки это было бы весьма странно.
В случае же статической сборки, если не особенно сильно принюхиваться, то норм, ну и я, заодно, сэкономил себе кучу времени и усилий.
GitHub
ix/pkgs/lib/execinfo at main · pg83/ix
ix package manager. Contribute to pg83/ix development by creating an account on GitHub.
👍8🤔4🔥3
Выходной, почему-то хорошее настроение, поэтому вот вам чутка менеджерской мудрости от дядюшки PG!
(мне эту глубокую мысль донес один коллега лет 17 назад, я не претендую на лавры изобретателя)
Если вы хотите от какого-то коллеги #protaskivanie чего-нибудь, а он активно сопротивляется, рассказывает про иерархию классов о 10 уровней, и про то, что просто так он протащить это не может, и нужен рефакторинг всей системы на пару месяцев, то скажите ему, что вы сейчас положите нужное значение в глобальную(можно пертредную) переменную, и прочитаете ее там, где вам нужно.
Пообещайте, что сейчас зашлете ему PR, и спокойно возвращайтесь на рабочее место.
К тому моменту, как вы сядете за ноутбук, в вашей почте, скорее всего, уже будет лежать предложение о компромиссном решении, каким-то не очень всратым образом.
В критической ситуации люди соображают быстро, да.
(мне эту глубокую мысль донес один коллега лет 17 назад, я не претендую на лавры изобретателя)
Если вы хотите от какого-то коллеги #protaskivanie чего-нибудь, а он активно сопротивляется, рассказывает про иерархию классов о 10 уровней, и про то, что просто так он протащить это не может, и нужен рефакторинг всей системы на пару месяцев, то скажите ему, что вы сейчас положите нужное значение в глобальную(можно пертредную) переменную, и прочитаете ее там, где вам нужно.
Пообещайте, что сейчас зашлете ему PR, и спокойно возвращайтесь на рабочее место.
К тому моменту, как вы сядете за ноутбук, в вашей почте, скорее всего, уже будет лежать предложение о компромиссном решении, каким-то не очень всратым образом.
В критической ситуации люди соображают быстро, да.
😁62💩14🔥7🤔2