commit -m "better"
3.21K subscribers
1.02K photos
147 videos
3 files
2.36K links
just random thoughts
Download Telegram
Forwarded from Дидлошная
👍23😁14🤣6
commit -m "better"
Слушайте, ну мужик сказал - мужик сделал! #ix_run #dev_shell ... HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/mconf.o HOSTCC scripts/kconfig/lxdialog/checklist.o HOSTCC scripts/kconfig/lxdialog/inputbox.o HOSTCC scripts/kconfig/lxdialog/menubox.o…
"ix run" (или любая другая метапоисковая система), конечно, сильно меняет подход к разработке. #ix_run #dev_shell

Свой go-шный portal я собираю, например, вот так - https://github.com/pg83/portal/blob/main/build.sh

ix run set/dev/go -- go build

"Где-то там" строится временный #realm, со всем нужным окружением, в котором запускается свежесобранный go build на мой проект. Оверхед - доли секунды.

Хочется cgo, и зависимость от какий-то C-шной библиотеки?

ix run set/dev/go --cgo lib/gtk/3 -- go build ...

Мне кажется, в ближайшие годы какой-то другой способ разрабатываться в oss должен уйти в небытие, потому что, как я уже несколько раз писал, такие метапакетные системы постепенно идут в массы.
🔥15🤡3👍2🤔21
Анонс курса про Rust в вышке, например
Forwarded from РАСТ
This media is not supported in your browser
VIEW IN TELEGRAM
Анонс курса раста в следующем году. Распространяйте среди первокурсников, чтобы все выбирали нас!
🔥22😁11🥰7
Тут вот Данила "наше все" #Lemire запилил бенчмарк https://lemire.me/blog/2023/03/03/float-parsing-benchmark-regular-visual-studio-clangcl-and-linux-gcc/

Что он бенчмаркал, непонятно (может, свою fast_float, может, компиляторы, а может, виндовый шедулер), потому что:

Под винду сравнил VS/std vs. VS/fastfloat vs. clang/fastfloat, ну и добавил, для пикантности, сравнение с gcc/wsl/???.

Знаете, когда смотрят на перф, то стараются изменять 1 параметр, и пишут, что меняют, чтобы было понятно, что происходит.

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

Не бенчмаркайте так, как это сделал Лемир!
😁10🤔2🐳2🔥1👌1
commit -m "better"
Потихоньку собираю запчасти, которые я использую, в единое целое. Ну, вот, знаете, чтобы ссылки из разных программ открывались единообразно, чтобы привязки программ к типам файлов работали единообразно (без специальных настроек), и так далее. Для этого начал…
Меня тут спрашивают, зачем я решил запилить свой портал.

Рассказываю.

Недавно писал про то, что, при обновлении #mesa до 23 ветки, у меня сломался #zink opengl driver для связки epiphany + ее WebKitWebProcess (это отдельный процесс для рендеринга(и не только)).

Тогда я решил это тем, что собрал epiphany + WebKitProc(blabla) в софтверном режиме.

Но это, конечно, было очень медленно, и нужно было решить проблему более лучше.

Как можно в #mesa выбрать opengl driver для приложения?

* Поправить всратый xml с конфигами - настройками - хаками для приложений, которые не работают с дефолтными настройками. https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/util/00-mesa-defaults.conf Да, там strcmp() по имени приложения, так себе решение, я решил этот способ оставить на самый крайний случай.

* Второй способ - вмешаться в загрузчик драйверов в egl, и как-то override его решение. Я так и хотел сделать, но, к сожалению, zink прикручен к mesa через жопу. Он хочет не только драйвер, но чтобы при загрузке приложения была выставлена опция, котороая говорит, что надо использовать именно zink. Почему? Потому что, вместо того, чтобы протащить какие-то настройки через фабрику с драйверами, им оказалось проще в 5 местах кода сделать проверку на == "zink". Особенно "вредное" место - https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/egl/main/eglapi.c#L695

Что тут написано? Тут написано, что zink - не настоящий драйвер, он в своем коде использует запчасти из opengl software renderer, и ему надо инициализироваться сложнее, чем позвать функцию инициализации из драйвера.

Сразу видно руку мастера, а точнее, программиста на 300000кк/сек, которому после него хоть трава не расти.

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

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

Казалось бы, во враппере для epiphany выставляем эту переменную среды, и все работает?

Почти, но не совсем.

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

И тут я, конечно, вспомнил про то, что epiphany умеет работать во flatpak/snap, а значит, умеет использовать порталы, а значит, умеет вызывать внешние программы для просмотра файлов через портал. Дальше мой портал открывает приложение для просмотра в чистом окружении, в котором нет испорченной переменной среды MESA_LOADER_DRIVER_OVERRIDE.

(на самом деле, я тут чуть-чуть срезал, и путь до портала не совсем такой, но это сильно усложнило бы повествование, и не дало бы больше понимания)

Ну а дальше дело было за малым.
🔥5👍4🤔4
commit -m "better"
#xiaomi https://www.ixbt.com/news/2022/07/01/oled-4k-dolby-vision-xiaomi.html Кто-то ждет выставок от Apple, а я вот теперь жду Xiaomi. Через 2 дня они представят свои "прошки", и, если доставка будет работать, это будет мой следующий ноутбук. Знаете, я…
#xiaomi

Кстати, купил я новый book pro, на Новый Год.

Поставил, конечно, #stal/ix, не с первого раза, потому что первая попытка окирпичила ноут (я полагаю, что эти долбоебы положили какие-то запчасти от загрузчика не во flash, а на раздел на диске, потому что все шло хорошо, пока я не удалил раздел с виндой).

Экран классный, процессор быстрый, греется меньше, чем прошлая модель.

Не без linux глюков, какие-то проблемы с ACPI, не всегда уходит в сон.

Купил ноут на алишечке, поэтому он без русских букв на клавиатуре.

Неожиданно для себя (в 40-то лет) понял, что давно уже печатаю, не смотря на клавиатуру. Поначалу было сложно, мозг отказывался верить, что у него получается работать, не видя русские буквы, но за пару дней я приспособился.

Правда, если я начинаю пытаться нажать на какую-то букву осознано, то, часто, не могу найти ее с первого раза. Поэтому, если где-то ошибся, то проще стереть слово, и напечатать его целиком, на автомате.
👍16🔥9🥰3👎2
commit -m "better"
https://keunwoo.com/notes/rebooting/ #reboot Хороший, только очень длинный текст, в котором написаны 2 простых мысли: * В любой системе нарастает энтропия. По другому - в системе есть https://ru.wikipedia.org/wiki/Гейзенбаг. * Перезагрузка(VM, хоста, программы)…
В продолжении темы регулярных рестартов.

У меня завис unbound. Ну завис и завис, где-то в select/poll/etc, не отвечал на запросы и сам ничего не делал.

Можно, конечно, побороться с ветряными мельницами, заслать совершенно ничего не говорящий stack trace (потому что без символов) в upstream, и ждать у моря погоды.

Я сделал ровно то, что предлагал в цитируемом посте - начал регулярно уменьшать энтропию системы, регулярно рестартуя unbound - https://github.com/pg83/ix/blob/main/pkgs/bin/unbound/runit/ix.sh#L8, с помощью /bin/timeout 300.

Раз в 5 минут, вполне достаточно, чтобы dns cache был полезен.
🤡10🔥5👍3😢2🤔1
commit -m "better"
Меня тут спросили, как, в итоге, получилось настроить 4k120hz. Как, как. Сначала надо как-то найти работающее решение, а потом, имея проторенную дорожку, линейным перебором заменить все компоненты, которые надо заменить. Понял, что ноутбук не выплевывает…
Подвожу черту в своем микроисследовании USB-C to HDMI тракта для поддержки 4k120HZ.

У меня нет ни одного готового, из коробки, решения (это когда вам сразу продают USB-C to HDMI кабель, в который встроен какой-то преобразователь), которое бы давало устойчивое изображение 4k120hz на всех трех моих подопытных устройствах. В целом, это понятно, потому что нужно, чтобы сошлись звезды, и производитель не пожадничал на сразу двух устройствах - преобразователе сигнала, и на самом кабеле. А в noname кабелях вообще невозможно узнать, из чего они сделаны.

Есть кабель, который работает на 2 из 3 устройствах, и на этом все.

Ultimate решение - это купить отдельно преобразователь USB-C DP в HDMI, и отдельно - хороший hdmi кабель, в палец толщиной и в металлической оплетке.

Вот такой преобразователь, у меня с ним заработали все три подопытных устройства.

https://www.ozon.ru/product/perehodnik-video-kabel-j5create-usb-c-to-hdmi-2-1-8k-adapter-seryy-chernyy-jca157-849800092/?utm_medium=organic&utm_referrer=https%3A%2F%2Fyandex.ru%2Fproducts%2Fsearch%3Ftext%3DJCA157&utm_source=yandex_serp_products&sh=ZtlDTV-YKA
👍8🔥71😐1
Forwarded from Programmer memes
😁12👍4😐32🔥1
https://www.phoronix.com/news/Qt-Wayland-Compositor-Restart

Фига, QT-шные приложения теперь будут переживать гибель композитора. Ну теперь Wayland-то точно готов для десктопа!

С точки зрения backend разработчика - вполне очевидное решение, пересоединиться и пересоздать все буфера. Можно было бы и буфера не пересоздавать, если бы сделать это изменение на уровне libwayland, потому что тот факт, что буфер зависит от указателя на wayland контекст - это просто артефакт управления ресурсами, а так-то в ядреном буфере никакого знания про wayland соединения и в помине нет.

(напомню, что в современном gui буфера, куда кидают команды для отрисовки, управляются ядром, а программы просто перекидываются указателями на них).

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

Так же можно было бы иметь демон, владеющий буферами и соединениями, но "wayland - это же не демон, а протокол, my ass".
👍6😁3🤔3
commit -m "better"
В продолжении темы регулярных рестартов. У меня завис unbound. Ну завис и завис, где-то в select/poll/etc, не отвечал на запросы и сам ничего не делал. Можно, конечно, побороться с ветряными мельницами, заслать совершенно ничего не говорящий stack trace…
Как говорится, доверяй, но проверяй!

Я тут, случайно, в выводе pstree увидел красивое:

flock---unbound 

Глаз за это зацепился, потому что я сразу подумал, что тут что-то не то, дерево процессов должно было выглядеть так:

flock---timeout---unbound

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

Посмотрел логи - да, действительно, мой вызов timeout не возымел эффекта. Как будто его и не было.

Не буду утомлять себя рассказом про подробности #debug, сразу расскажу, что было.

https://git.busybox.net/busybox/tree/coreutils/timeout.c#n101

Что там написано?

Там написано, что команда timeout в качестве child запускает код, который демонизируется, и, далее следит за временем выполнения основного процесса, а потом основной процесс делает exec на нужную команду.

Это бы работало, если бы слежка выполнялась в прямом потомке основого процесса, но, видимо, чтобы не плодить зомбаков, следит внук, как я написал выше.

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

Починил я это тем, что добавил в цепочку subreaper, https://unix.stackexchange.com/questions/250153/what-is-a-subreaper-process https://github.com/stal-ix/ix/blob/main/pkgs/bin/unbound/runit/ix.sh#L9

Зачем timeout устроен так сложно?

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

Пока я не разобрался, что же там происходит, выглядело это ну очень дико.
🤔5👍4🔥2🤡1
Дебажил тут один скрипт, который под python2 (да, есть еще легаси в русских селеньях) работал нормально, а под третьим питоном зависал на попытке вывести в stdout кучу (примерно 15 гигабайт) бинарных нулей.

Строчка, приводящая к такой забавной ошибке:

print(six.binary_type(some_func()["id"]))

Динамические типы, приводящие к такой ошибке, вы и сами себе нафантазируете(подсказка - 15 гигабайт - это какой-то ID), а вот как я с этим поборолся, довольно забавно.

Сломанный скрипт - часть рантайма большой production системы, которую починят, но не "прямо сейчас".

А мне же надо "прямо щас", ну и я испорчен взаимодействием с open source, поэтому я сделал в своем скрипте вот так:

cp $(which mega_script) ./ 
sed -e 's|six.binary_type||' \
-i mega_script
export PATH=${PWD}:${PATH}

Моя джоба побежала. В будни, когда коллеги обновят сервис, я это уберу, конечно.

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

Мораль?

Мне интересно, сделал бы я так два года назад, еще до активного взаимодействия с open source, или, все же, нет. Не знаю.
👍15🤯5😱3😁2
Forwarded from Programmer memes
Борьба с говнокодом

Programmer memes
😁46👍8🔥5
Можно ли быть святее папы римского?

Сборки llvm, который можно скачать с их релизной страницы, bootstrapped.

Что это значит?

Что они в процессе сборки собирают новую версию host c++ компилятором, а потом уже им собирают релизную версию нового llvm.

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

Так же они, в процессе, собирают себе libc++, и, скорее всего, какие-то рантаймы.

Но, например, они не собирают себе libc, и прочие zlib/ncurses, от которых будет зависеть этот компилятор.

По ссылке https://github.com/pg83/ix/blob/main/pkgs/bin/clang/16/bootstrapped/ix.sh компилятор, не просто bootstrapped, а еще и все зависимости которого собраны им самим же (конечно, логически, физически это невозможно).

Так что, ответ на поставленный вопрос - да, можно!
12👏5🔥4🤯1
Запилил ix respawn https://github.com/pg83/ix/blob/main/pkgs/bin/ix/respawn/unwrap/main.c

Это такая штука, которая ищет бинарник ix "где-то" (например, во всех предках текущей директории), и вызывает его с переданными аргументами.

Довольно общая штука для всякого рода инструментов, которые не привязаны к рутовой файловой системе и к PATH.

Запилил и запилил, но у нее был какой-то конский размер, несколько сот килобайт. Я подумал, что меня за это зачморят старшие товарищи, и всю жизнь будут тыкать палочкой, мол, "ерунда эта ваша статическая линковка".

Ужал ее размер до 10к, можно было и меньше, но уже было лень.

Как?

* Выпилил stdio, он даже в musl довольно большой. Оставил только сисколлы и строковые функции.

* Не освобождаю память. А зачем это делать в one shot тулзах?

* Заменил аллокатор. Даже самый тонкий аллокатор давал footprint порядка 50 - 200к. Заменил его на bump allocator своего изготовления - https://github.com/pg83/ix/blob/main/pkgs/lib/bumpalloc/alloc.c

Чем он интересен?

* В нем нет ни единого syscall, потому что он распределяет память из заранее выделенного в программе массива.

* Ну и вообще, он не зависит от libc.

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

Прикольная штука, в хозяйстве уже пригодилась не раз.
👍11🔥103🏆2😐2🤔1
Forwarded from Programmer memes
😁33🤯6🔥4🥰1🤣1
commit -m "better"
Потихоньку собираю запчасти, которые я использую, в единое целое. Ну, вот, знаете, чтобы ссылки из разных программ открывались единообразно, чтобы привязки программ к типам файлов работали единообразно (без специальных настроек), и так далее. Для этого начал…
"блеск и нищета С"

Еще одной причиной, почему я решил запилить свой портал - это качество существующих решений.

Я, перед тем, как начать говнокодить, прочел исходники wlr portal, от simon ser'а, и это тот еще говнокод:

* race condition - https://github.com/emersion/xdg-desktop-portal-wlr/blob/master/src/screenshot/screenshot.c#L120https://github.com/emersion/xdg-desktop-portal-wlr/blob/master/src/screenshot/screenshot.c#L120

* утечка номер раз - https://github.com/emersion/xdg-desktop-portal-wlr/blob/master/src/screenshot/screenshot.c#L133

* утечка номер два - https://github.com/emersion/xdg-desktop-portal-wlr/blob/master/src/screenshot/screenshot.c#L273 (тут их две - одна - при ошибке в выделении памяти, а вторая, более серьезная - если кто-то не позовет remote Close() на созданный хендл xdpw_*)

Ну и решил, что мне это не нужно.
👍8🤔3🤡3
Удивительный факт, но, кажется, на текущем сроке прогресс застопорился...
😁19🔥5😱3😢1🖕1😭1
https://j3s.sh/thought/write-posix-shell.html

Хороший текст про shell, например.

Полностью согласен с "simply: because shell is an insanely productive language. in fact, i believe that shell is the *most* productive language"

У меня, когда я пишу на shell, в голове всегда борются два начала:

* чистоплюйское, которое говорит, что надо писать на языках, в которых команды пишутся вот так: ['x', 'y', 'z'], потому что не надо думать про пути, про escaping, и про прочую хрень, которая всегда мешает в sh.

и

* getting things done, которое говорит мне, что, если я напишу "x y z", то я сделаю работу в 10 раз быстрее, хотя и не без потенциальных косяков.

Для кода, который пишется один раз, и который потом проще переписать, чем аугментировать, shell куда как продуктивнее.

Очень рад, что, еще на ранней стадии развития #ix, выкинул все попытки погрузить проблематику в скрипты на python, потому что я бы не успел сделать все то, что сделал к текущему моменту времени, если бы выбрал homebrew/nix-like подход.
👍9👌5