LINUX.ORG.RU

Сообщения MOPKOBKA

 

Соревнование в медлительности компиляции Hello World

Мой кандидат, C++ & gcc-15

import std;

int main() {
  std::println("Hello World!");
}
$ time g++-15 \
  -g3 \
  -fsanitize=address \
  -flto=1 \
  -Wall \
  -Wextra \
  -Ofast \
  -fanalyzer \
  -std=c++26 \
  -fmodules \
  -fsearch-include-path bits/std.cc \
  main.cc

real	0m27,911s
user	0m27,290s
sys	0m0,613s

$ cat /proc/cpuinfo | grep name
model name	: Intel(R) Core(TM) i9-14900K
Почти 30 секунд, сможете обойти?

 ,

MOPKOBKA
()

Си без UB/ID: Две кучи и GC, как?

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

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

Решение которое не работает в стандартом С:

bool in_heap(char *heap, ssize_t heap_size, char *p)
{
  return p >= heap && p < heap + heap_size;
}

А по стандарту как? Готов перейти на дескрипторы вместо указателей, но это не должно тормозить.

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

 ,

MOPKOBKA
()

Немного о совершенстве Wayland

Иногда одни окна нужно встраивать в другие. Примеры использования:

  • Виджеты для панели в Xfce4 и некоторых других DE, каждый виджет это отдельное окно которое размещается в окне панели, если виджет падает, то панель просто его перезапустит, а сама продолжит работать
  • Встраивание окна с игрой в редактор Godot

Про Godot я и хочу поговорить, недавно они решили переходить на Wayland, как же там встроить окно?

А ответ прост, нужно заново реализовать Wayland-сервер, но уже в приложении, на котором будут запускаться дочерние окна, и уже через него рисоваться, как будто окно приложения это весь экран, именно поэтому в Godot была попытка внедрить wlroots.

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

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

Но такой прокси, в отличии от повторной реализации Wayland сервера, намного проще, для альфы пришлось написать всего около 3 000 строк! Так что несмотря на некоторые недостатки, решение хорошее. Конечно решение еще сырое, но даже 6 000 строк это не так уж и плохо.

А теперь покажу как встраиваются окна в MS Windows Win32:

SetParent(child_window, parent_window);

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

 

MOPKOBKA
()

Man or boy 2к25: Ваш статически типизированный ЯП полноценен?

Когда то Кнут придумал тест для ALGOL реализаций, и он известен под именем «Man or boy test». Но там просто локальные функции, не особо интересно.

Предоставляю вам версию для проверки языка программирования, на то, достоен ли он существовать в 21 веке!

Для начала нарушу это правило (у Python динамическая типизация), и покажу Python версию:

def print_sum(x):
  def make(acc):
    def f(y):
      print("acc(%d) + %d" % (acc, y))
      return make (acc + y)
    return f
  return make(x)

print_sum(10)(20)(30)(40)
Вывод
acc(10) + 20
acc(30) + 30
acc(60) + 40

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

Мое повторение на OCaml с rectypes:

let print_sum x =
  let rec f acc = fun y ->
    printf "acc(%d) + %d\n" acc y;
    f (acc + y)
  in 
  f x
  
let () = ignore (print_sum 10 20 30 40)
Типы он вывел сам, но можно и указать вручную:
type t = int -> t 

let print_sum (x : int) : t =
  let rec f (acc : int) : t = fun (y : int) : t ->
    printf "acc(%d) + %d\n" acc y;
    f (acc + y)
  in 
  f x
  
let () = ignore (print_sum 10 20 30 40)

Языки которые смогли реализовать тест на лямбдах/функциях, их система типов и ее записи позволяет строить рекурсивные по возврату лямбды и функции:

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

Языки у которых пока не получилось без дополнительных средств типа классов/структур для обхода проблем с типами:

  • Rust (использование trait)
  • C (некорректная реализация)
  • Zig (использование классов)
  • D (использование делегатов)

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

 

MOPKOBKA
()

Возможна ли плавная прокрутка в Emacs?

Или это недоступные технологии для Lisp хакеров?

Включаю в GNU Emacs 30.1

(pixel-scroll-precision-mode t)
(mouse-wheel-progressive-speed nil)

  • 1. И если выделить последнюю видимую строку в редакторе, и переместить мышь ниже что бы спровоцировать скролл, все начнет дергаться и мигать, никакой плавной прокрутки нет. А возможна?
  • 2. Я отключил прогрессивную прокрутку, но она все равно то медленно то быстро крутится, нужно как в Chrome, IDEA.

БОНУС: Демонстрация плавной прокрутки в терминале vt320, которым пользовался фараон Нармер для быстрой отправки писем по своему государству в тридцать втором веке до нашей эры https://youtu.be/tSJfzrSA0ec?t=5

 

MOPKOBKA
()

Lisp: Где применимы cons?

Для начала небольшой «бенчмарк», С без всех оптимизаций в 7406000 раз быстрее.

(defun main ()
  (declare (optimize (speed 3)))
  (let ((n 99999) (l '()) (sum 0))
    (loop for i from 0 to n
	  do (setq l (append l (list i))))
    (setq sum 0)
    (loop for i from 0 to n
	  do (setq sum (+ sum (nth i l))))
    (format t "~d~%" sum)))
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
	long n = 99999, *l = NULL, count = 0, sum = 0;
	for (long i = 0; i <= n; i++) {
		l = realloc(l, (count + 1) * sizeof(long)); 
		l[count++] = i;
	}
	for (long i = n; i >= 0; i--) sum += l[i];
	printf("%ld\n", sum);
}

Для чего же нужны cons? В качестве универсального строительного блока, я считаю это одна из самых худших структур. Все ее преимущества заканчиваются на быстром добавлении в начало. Добавление в конец уже нежелательно, разрез в произвольном месте тоже, так как нету даже быстрого доступа к случайному элементу. Она медленная и неудобная, можно придумать кучу более быстрых и удобных структур. Даже JS на световые годы опережает Lisp со своим JSON, и его частое использование лишь подтверждает его удобство.

Так почему же cons из языка-ассемблера IPL 1956 года считается важным? Да, это неплохая структура для AST, если ваша машина имеет 16 кб памяти, но она распространилась по языку слишком широко.

 cons,

MOPKOBKA
()

Нужны ли нам теги в новостях, которые указывают на язык программирования и используемые библиотеки в проекте?

Последняя новость:

mpv 0.40
Теги: c, ffmpeg, lua, mpv, sdl

Как подписанный на sdl, мне не особо хочется получать в уведомления новость для каждой программы написанной на sdl. Особенно учитывая что ничего про sdl в самой новости нету. Хотя если бы там было добавление sdl, и хорошая сноска почему они так сделали, тег был бы полезен.

Еще непонятен выбор только этих тегов, почему не продолжить: x11, opengl, linux, ассемблер, x86, тразистор, физика, солипсизм? Какие ограничения у этого подхода?

Или вот еще пример:

Linux 6.14
Теги: c, linux, rust, ядро

Не особо интересно следить за всеми ядрами, если я просто подписан на rust, это очень маленькая область в среде rust.

Что скажете, удобно это или нет?

 

MOPKOBKA
()

Как вывести число в С?

Берем код, который использует обсуждаемые расширения gcc, стандарт C23, который не так давно появился, и пока плохо поддерживается компиляторами:

#include <complex.h>

int main() {
    constexpr signed _BitInt(142) _Complex A = 1 + 3 * I;
}
BitInt отвечает за количество бит в числе, Complex это значит что у нас комплексное число, а I это мнимая единичная константа.

У к вам сразу несколько вопросов: 1) как бы вы вывели переменную 2) можете ли вы уверенно предположить какой код это сгенерирует 3) как бы вы описали интерфейс extern «C» в Rust для вызова функции которая возвращает этот тип

 

MOPKOBKA
()

git, и мультирепозиториевые атомарные коммиты, как?

Вернусь в прошлое, в старой системе контроля версий под названием CVS, которая была задолго до git, изменения (коммиты) применялись не для репозитория, а для файлов, у каждого файла была своя версия, можно было нарваться на проблему когда обновлен только файл А, хотя для работы требуется еще и получить коммиты для файла Б.

Сейчас по лучшим практикам любой проект нужно разбить на как можно большее количество микросервисов, проектов, и репозиториев git.

Как делается атомарный коммит в git, если нужно его сразу применить для нескольких репозиториев? Какие существуют костыли? Облегчает ли этот процесс GH?

Как более реальный пример приближенный к миру Linux, я хочу изменить код интерфейса в kdelib, и так же изменить код в kapp1, kapp2 которые зависят от kdelib, потому что изменился интерфейс. Если обновить kapp1 отдельно от kdelib, или наоборот, то приложения будут неработоспособны. Нужна атомарность.

Прошу не обсуждать ПРИДУМАННЫЕ примеры, меня интересует только атомарность комитов применяемых сразу к нескольким репозиториям.

 ,

MOPKOBKA
()

Аналог godbolt.org для Java/JVM

На godbolt.org есть Java, но там показан байткод, а я хочу увидеть результат C2 компилятора JVM, нативный ассемблер. Есть такое?

 ,

MOPKOBKA
()

Web-интерфейс для навигации по исходному коду дистрибутива

Кто нибудь уже реализовал и захостил?

Вот есть для ядра elixir: https://elixir.bootlin.com/linux/v6.11/C/ident/task_struct

Для web-php есть opengrok: https://heap.space/search?project=web-php&full=site_footer&defs=&...

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

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

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

 

MOPKOBKA
()

Программы, которые не тормозят

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

Предлагаю составить список программ, которые работают быстро, или терпимо.

Но для начала я напишу то чего стоит избегать

  • qt5, qt6, gtk3, gtk4 они тормозят, открываются с задержкой, есть ощутимый лаг при взаимодействии
  • electron
  • wxWidgets если в качестве бекенда используется gtk3 или qt5
  • старые версии программ, например xfce до перехода на gtk3, или xpdf до перехода на qt5. они не тормозили, но они уже не развиваются, интереснее узнать что есть из живого, или хотя бы такого что будет легко установить без перекомпиляции

Программы которые работают терпимо

  • xfe файловый менеджер (не путать с xfce http://roland65.free.fr/xfe/ )
  • (x)nedit простой текстовый редактор c номерами строк и подсветкой
  • grafx2 рисовалка, ориентирована на pixelart
  • mpv просмотр видео
  • palemoon браузер. с отключенным javascript, ощущается приятно, открывает больше чем какой нибудь netsurf
  • OpenOffice офис. тормозит но тормозит намного быстрее чем LibreOffice
  • xdm дисплейный менеджер
  • jwm, icewm оконные менеджеры похожие на windows, быстрые и не требующие сложной настройки
  • cmus аудиоплеер с двухпанельностью. консольный что минус, но быстро работает с библиотекой, сканирует, поддерживает cp1251
  • mutt+msmtprc консольный почтовик, относительно легко настроить и управлять

Пользователь d советует рассмотреть проекты

  • suckless
  • pwmt

Пользователь xsaeta рекомендует

  • zzzfm двухпанельный файловый менеджер
  • nsxiv просмотрщик изображений
  • mpd для музыки
  • ClawsMail почтовик
  • приложения Trinity
  • приложения LXDE
  • Pidgin — мультипротокольный IM-клиент на GTK+2

Пользователь tiinn подсказывает XPaint программу для рисования

Пользователь posixbit рекомендует

  • SpaceFM (очень быстрый и мощный файловый менеджер GTK+ 2 с большим количеством плагинов).
  • Double Commamder (версия GTK+ 2; быстрый двухпанельный файловый менеджер, почти полная копия Total Commander).
  • Sylpheed (классический и самый быстрый почтовый клиент; GTK +2).
  • LillyTerm (терминал с настройкой через графический интерфейс на GTK+ 2), st (самый простой терминал; не использует Qt и GTK), Kitty (простой терминал, но с GPU-ускорением) {{MOPKOBKA: Kitty у меня тормозит}}.
  • Rainbow-CM, Parcelite (менеджеры буфера обмена на GTK+ 2).
  • Zathura-PDF-MUPDF (самая быстрая читалка PDF — именно эта версия с MuPDF, а не Poopler).
  • LXTask (диспетчер задач; можно собрать с GTK+ 2).
  • Cinelerra GG (самый быстрый, но довольно функциональный видеоредактор под Linux; не использует Qt и GTK).
  • GMPC (музыкальный плеер — быстрый и мощный графический клиент GTK+ 2 к mpd).
  • TransGUI (самый быстрый и лёгкий торрент-клиент; использует GTK+ 2, требует для работы установленный и запущенный transmission-daemon).
  • CudaText-GTK2 (довольно быстрый и развивающийся текстовый редактор, вдохновлённый SublimeText). {{MOPKOBKA: У меня тормозит}}
  • LiteXL (довольно быстрый текстовый редактор на Lua; не использует Qt и GTK). {{MOPKOBKA: на SDL2 думаю будет тормозить, не пробовал}}
  • Abiword (лёгкий и функциональный текстовый процессор) и Gnumeric (самый быстрый и функциональный табличный процессор под Linux; великолепная совместимость с xls/xlsx) — обе эти программы можно собрать с GTK+ 2. {{MOPKOBKA: У меня тормозит}}
  • Dia (лёгкий редактор диаграмм, схем и графиков; на GTK+ 2).
  • FreeOffice (самый быстрый офисный пакет под Linux, имеет хорошую совместимость с файлами Microsoft Office; использует Xlib, а не Qt или GTK).
  • ImageMagick-GUI (различные быстрые операции над изображениями; не использует Qt и GTK).
  • AzPainter (быстрый, но мощный графический редактор на Xlib).
  • Oculante (быстрый просмотрщик изображений; не использует Qt и GTK). {{MOPKOBKA: Rust}}
  • maim (простая, но гибкая утилита для создания скриншотов с настройкой через консольные команды; не использует GTK и Qt); {{MOPKOBKA: Не пробовал, но мне нравится scrot}}
  • Dunst (простейший центр уведомлений; не использует Qt и GTK).
  • FTP/SFTP-менеджер gFTP (GTK+ 2)
  • IRC-клиенты HexChat (GTK+ 2) и XChat-SE (Xlib) {{MOPKOBKA: HexChat все }}

Пользователь firkax советует свой WM https://dev.m1089.ru/fwmx

Коллективный анон советует

  • moc(p) - TUI
  • mpg123/ogg123 - CLI
  • xcalc - калькулятор {{MOPKOBKA: Входит в набор X11 Applications, там все хорошо работает, но не все актуально}}
  • https://codeberg.org/newsraft/newsraft - rss читалка

Пользователь vbcnthfkmnth123 рекомендует

Пользователь stabilitron рекомедует

  • ffplay - игрок видео, аудио, стримов, гифок, картинок и пр. {{MOPKOBKA: Программка проекта ffmpeg}}

Пользователь SPRATAY исползует

  • Bluetui - TUI for managing bluetooth on Linux
  • Lazygit - simple terminal UI for git commands

У пользователя dhubsith на скриншоте в LQ обнаружил

  • Avidemux - Редактор видеофайлов

Якобы не тормозят, но у меня тормозят еще как

  • gpu ускоренные терминалы
  • xterm, rxvt, vte терминалы
  • AbiWord замена ворда
  • SublimeText текстовый редактор
  • vim, emacs в любом виде

 , ,

MOPKOBKA
()

Баг, неправильное количество реакций

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

 

MOPKOBKA
()

Почему в UNIX атрибуты файлов не являются файлами?

Придумали зачем то отдельные утилиты, отдельные флаги со своим поведением, не лучше ли было сделать их тоже файлами, а сам файл директорией? Можно отдельный синтаксис перехода в директорию атрибутов, что бы не запутаться, например вместо «/» сделать ":"

Узнать дату создания файла cat file.txt:created_at

Записать дату создания echo **** > file.txt:created_at

Очень удобно!

Тоже относится и к /proc/cpuinfo, зачем нужен этот текстовик, если можно было сделать /proc/cpuinfo/core1/model_name

 

MOPKOBKA
()

Rust и Makefile, как?

$ echo 'fn main() {}' > main.rs
$ rustc --emit=obj main.rs 
$ rustc main.o -o main
error: couldn't read main.o: stream did not contain valid UTF-8
error: aborting due to previous error
$ cc main.o
/usr/bin/ld: main.o: in function `std::rt::lang_start' ... undefined reference to `std::rt::lang_start_internal'

Есть ли способ узнать что мне именно нужно линковать сейчас?

 

MOPKOBKA
()

Пустой элемент внизу

Если разлогиниться, то внизу появляется пустой элемент с классом infoblock

Пример треда где появляется: Почему используются в основном только две графические библиотеки?

 

MOPKOBKA
()

Почему DoH не защищает от замедления YouTube?

DoH должен скрывать информацию о ресурсе который запрошен пользователем, в Firefox при включении DoH должен включаться ECH, у меня все галочки тут горят https://www.cloudflare.com/ssl/encrypted-sni/

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

 ,

MOPKOBKA
()

В Wayland добавили киллер-фичу, последние разработчики Xorg задумываются о переходе

Сегодня очень важный день. Вышел wayland-protocols 1.37!!!

Теперь в Wayland окна могут програмно устанавливать себе иконки! Да, да, вот эти что слева перед заголовком в Windows, Xfce, KDE. Раньше они тянулись лишь из файлов описания, теперь приложение может их изменять через протокол!!! Теперь даже разные окна одного приложения могут иметь разные значки если захотят!!!

Удивительно что это произошло, потому что в обсуждении я заметил вот такой комментарий от разработчика из RedHat:

Sebastian Wick @swick
Я проигнорирую этот MR, потому что аргументы здесь оказались бесполезными, и я также позабочусь о том, чтобы это было отклонено.

Так же икосафанатикам хочу напомнить что по единому мнению ЛОРа, Wayland готов уже как минимум 9 лет:

Wayland готов и является полноценной альтернативой X11. уже сейчас можно нажатием одной кнопки запустить GNOME под Wayland без каких-либо регрессий в сравнении с X.org.

------

Полные изменения wayland-protocols 1.37 можно прочесть тут https://lists.freedesktop.org/archives/wayland-devel/2024-August/043774.html

Еще добавили
* ext-image-capture-source
* ext-image-copy-capture

Для захвата изображения окна.

 

MOPKOBKA
()

Vim, Emacs или Xorg две колонки

Вертикально на монитор текста вмещается мало, в читалках есть возможность отображать две страницы рядом, так пустое пространство справа всегда занято, есть ли такой режим в vim без плагинов? А в Emacs? Если нет, то можно ли как то с помощью Xorg отобразить высокое окно в виде широкого разбитого?

 , ,

MOPKOBKA
()

Антиваксер реанимирует X.Org

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

Так же Энрико выступает против античеловечных экспериментов по выведению новых видов гуманоидов с измененной ДНК. Но конечно это не сравнится с безумнейшим предложением разработчиков Wayland иметь DOS фреймбуфер без права получить положение окна в качестве замены оконной системы.

Все его патчи можно посмотреть тут, их очень много, есть исправление багов в том числе и под BSD, удаление мертвого кода, добавление новых возможностей: https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests?author_username=...

Так что слухи о прекращении разработки X.Org недействительны.

 , ,

MOPKOBKA
()

RSS подписка на новые темы