LINUX.ORG.RU
ФорумTalks

Почему всё так всрато?

 


0

5

Навеяно программированием.

Вот сижу, никого не трогаю, программирую. Я не то что бы нубас в системном программировании, в прошлом под ДОС даже многозадачные оболочки писал на пассале, но и не гуру, тем более не гуру красноглазия.

Но все таки некоторые «решения» меня откровенно удивляют.

Вот взять например «системный трей».

Первая реализация этой штуки была реализована в 2002 году, уже после выхода XP, во время скажем так «претензии Линукса на десктоп». Реализаторы этой срани почему-то посчитали, что для вывода иконки приложения в определенную зону, и вызова контекстного меню по нажатию на эту иконку - нужно создавать целую сороконожку на костылях и сажать ее на велосипед с квадратными колесами. По логике реализаторов, приложение которое хочет в трей, обязано общаться с этим треем через протокол в протоколе в Иксах, при этом этот трей прежде должен был правильно инициализироваться и создать свою область (именно поэтому мы иногда могли видеть «another instance of systray already running», когда запускали вторую копию панели или системтрейного плагина). Если его не было - то приложение не могло быть затреено, соответственно при запуске трея, трей был обязан послать сообщение через Иксы всем приложениям, что вот он, я, запущен, треемся. Регистрация «действия», таких как активация или контекстное меню - так вообще сплошная головная боль. В итоге самая минималистичная программа, у которой три задачи: а) вывести иконки, б) обрабатывать их изменения, в) кидать вызов программе для активации ее, или контекстного меню - занимала почти тысячу строчек.

Шло время, и индеец Зоркий Глаз через ~15 лет увидел, что как-то это все не тру, и решил с подачи Каноникла и Кедов переделать этот велосипед, чтоб на нем было приятнее ездить.

И не нашли ничего лучше, чем срать через d-bus. Типа приложение, которое хочет в трей - создает сервис в d-bus'е, StatusNotifierItem, вместе с фичами которые оно хочет, а другие приложения обязаны это читать, опять же через этот d-bus, и если хотят что-то с приложением сделать - должны через d-bus послать сигнал, который приложение застолбило.

Какой же это бред.

С 1985 существует ProcFS. Она следовала юниксовому принципу «все есть файл». Она предназначена для взаимодействия процесса с ядром, ядра с процессом, и процесса с процессом.

Ну вот что мешало приложению создать в своем пространстве запись «/proc/PID/i_want_to_be_trayed», «/proc/PID/my_tray_icon», и «/proc/PID/tray_menu», куда можно сделать «echo activate > /proc/PID/tray_menu» или echo «contextmenu» > /proc/PID/tray_menu ? Соответственно приложение которое хочет в трей - создает у себя в пространстве запись, а приложение которое хочет прочитать треевые приложения - просто пробегается в поиске «i_want_to_be_trayed»? И все! Все чтения изменений через простой inotify.

В порыве экспериментизма, я сделал вменяемую, простую, работающую реализацию такого трея за 4 часа. Эта реализация работает на PHP, C, Python, Pascal, Bash. Она не требует знаний третьей технологии (иксов, dbus, etc). В клиентском приложении она реализуется 10 строками на PHP, 25 строками на С, из которых 10 строк - строки и память.

О работе с иксами, d-bus, и wayland я расскажу в следующей серии.

Ну вот почему пингвинятники вечно идут каким-то своим, оверинжинирнутым путем? Ведь это снижает порог входа тех кто знает ЧТО писать, но не знает КАК.

★★★★★
Ответ на: комментарий от windows10

Универсальное - это какое? D-bus что ли? За недостатки этого дерьма может сам почитаешь?

У всего есть достоинства и недостатки.

простое решение, реализуемое без дополнительной глючащей абстракции

и у него нет недостатков, надо полагать?

FishHook
()
Ответ на: комментарий от Bad_ptr

короче, надо писать свою ОС на пхп

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

windows10 ★★★★★
() автор топика

что мешало приложению создать в своем пространстве запись «/proc/PID/i_want_to_be_trayed»

В смысле? Приложение-то может на другой машине работать.

все есть файл

Это не значит что этот «файл» будет смонтирован куда-то и вообще что он будет внутри файловой системы.

no-such-file ★★★★★
()
Ответ на: комментарий от ya-betmen

Куда мне положить системный трей если я сижу в консольке?

Вот смотри. Есть общеизвестная всем область, пусть это /dev/shm/systray.

Приложение которое хочет оттреиться, просто создает там каталог с именем своего PID, или другим идентификатором. Просто кладет туда файл со своей иконкой, файл со своим именем, и файл через который мониторит события. Аналогично signal в d-bus, только проще.

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

Отвечая на твой вопрос, в случае что я предлагаю - ты можешь использовать затреенные приложения, даже сидя в консольке, подобно тому как mc выводит pwd, забыл как называется эта техника. А можешь и не использовать. А можешь получить скриптом на bash. Или прибить все скриптом на bash. Захочешь, можешь подменить им иконки на свои кастомные. И многое многое другое.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от no-such-file

В смысле? Приложение-то может на другой машине работать.

Какое это отношение имеет к области уведомления?

Это не значит что этот «файл» будет смонтирован куда-то и вообще что он будет внутри файловой системы.

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

windows10 ★★★★★
() автор топика
Ответ на: комментарий от FishHook

и у него нет недостатков, надо полагать?

Не больше недостатков чем скажем у работы с оборудованием через /sys

Наверное недостаток в том, что приложение которое захочет в трей - должно уметь писать в ФС.

#include<stdio.h>
int main () {
   FILE *fp;
   char str[] = "Title of my App";
   fp = fopen( "/dev/shm/systray/MyApp/tray_title" , "w" );
   fwrite(str , 1 , sizeof(str) , fp );
   fclose(fp); 
   return(0);
}

Все. В понимании моего API - приложение затреилось.

mkdir /dev/shm/systray/MyApp;echo "Title of my App" > /dev/shm/systray/MyApp/tray_title

То же самое, используя shell.

Если я захочу программу для вывода приложений из систрея - думаю код очевиден?

windows10 ★★★★★
() автор топика

Самое не всратое IMHO - иконка в трее - отдельное окно, трей просто как WM его держит. Но нет, людям не нравится.

Shadow ★★★★★
()
Ответ на: комментарий от Bad_ptr

пересекается с этой темой

Не просто «пересекается», а практически антагонист :)

Dimez ★★★★★
()
Ответ на: комментарий от Shadow

Самое не всратое IMHO - иконка в трее - отдельное окно, трей просто как WM его держит. Но нет, людям не нравится.

Ну или так. Тоже довольно очевидный вариант.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

Наверное недостаток в том

p = fopen( «/dev/shm/systray/MyApp/tray_title» , «w» );

Ага, то если у меня в системе ДВА приложения с именем MyApp они обязаны делить один трей на двоих. Ну а чо, главное просто же - десять строк

FishHook
()
Ответ на: комментарий от Dimez

Тебя спуфинг покусал?

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

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

Да ладно, systemd устаканилась - это был не идеологический проект, принимающий критику. И в рамках linux с его cgroups2 оно норм. Другое дело, что его за пределами linux не существует и это странно. Wayland-у это точно не грозит.

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 1)
Ответ на: комментарий от FishHook

Ага, то если у меня в системе ДВА приложения с именем MyApp они обязаны делить один трей на двоих. Ну а чо, главное просто же - десять строк

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

И да, дублирование иконок в линуксячьей области уведомления - вполне себе встречаемый глюкан. Забавно когда одна из них неактивна в плане нажатия, но отображения изменяет чин по чину =)

windows10 ★★★★★
() автор топика
Последнее исправление: windows10 (всего исправлений: 1)

Ой, а можно ли сделать одному приложению две иконки? «Вам это не нужно» что-ли? А для файлвого менеджера иконка отмонтирования и иконка фоновой операции например?

А если приложение запущено на другом хосте (это же иксы, там это нормально). Опять «вам это ненужно»?

В общем, иногда лучше подумать, прежде чем писать всякие идеи

no-dashi-v2 ★★★
()
Ответ на: комментарий от no-dashi-v2

Ой, а можно ли сделать одному приложению две иконки? «Вам это не нужно» что-ли? А для файлвого менеджера иконка отмонтирования и иконка фоновой операции например?

Хоть миллион. В этом и достоинство моего метода, что ты в одном приложении можешь создать сколько угодно иконок, в отличие от предыдущей иксовой срани, привязанной к pid, привязанному к window id. Или ты не знал, что для вывода нескольких иконок для одного инстанса - нужно было форкнуть приложение, при этом фильтруя параметры запуска, чтобы не вывести полноценное окно - и только когда оно обзаведется еще окнами - только тогда вывести иконки в трей через XEMBED?)

А если приложение запущено на другом хосте (это же иксы, там это нормально). Опять «вам это ненужно»?

Это не то что не нужно, этим попросту никто не пользуется, потому что мало кому придет в голову запускать графическое приложение на другом компьютере, а тем кому это действительно нужно - RDP\VNC.

windows10 ★★★★★
() автор топика
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от windows10

Именно поэтому я говорил за PID.

Отлично, PID. И вот мой процесс был пристрелен как бешеная собака с помощью kill -9, «/dev/shm/systray/ PID /tray_title» остался в ФС навсегда. Я запускаю другое приложение, система ему назначает PID и я вижу в трее непонятно откуда взявшийся tray_title!

Этим примером я всего лишь показал возможную реализацию

Когда твоя реализация доберется до версии 0.1alpha, когда ты пофиксишь миллион маленьких и больших косяков, которых ты не видел в начале своих изысканий, ты изобретешь dbus, только это будет dbus курильщика.

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

FishHook
()
Ответ на: комментарий от windows10

Конечно, ты то взял и накостылял нерасширяемое, однопользовательское, несетевое решение и сидишь весь в белом, сытно попёрдывая в ватные штаны :)

Dimez ★★★★★
()
Ответ на: комментарий от windows10

А кто сказал что трей не может быть ядерным интерфейсом?

windows10

FishHook
()
Ответ на: комментарий от windows10

Давай люди сами решат что им нужно, а что им не нужно ;)

Давай. Решаю – трей не нужен ;)

skiminok1986 ★★★★★
()
Ответ на: комментарий от FishHook

Отлично, PID. И вот мой процесс был пристрелен как бешеная собака с помощью kill -9, «/dev/shm/systray/ PID /tray_title» остался в ФС навсегда. Я запускаю другое приложение, система ему назначает PID и я вижу в трее непонятно откуда взявшийся tray_title!

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

Когда твоя реализация доберется до версии 0.1alpha, когда ты пофиксишь миллион маленьких и больших косяков, которых ты не видел в начале своих изысканий, ты изобретешь dbus, только это будет dbus курильщика.

dbus и без трея раковый, это очередной костыль на костыли.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от Dimez

Конечно, ты то взял и накостылял нерасширяемое, однопользовательское, несетевое решение и сидишь весь в белом, сытно попёрдывая в ватные штаны :)

С чего бы это оно нерасширяемое и однопользовательское?

windows10 ★★★★★
() автор топика
Ответ на: комментарий от FishHook

сделай лучше

Та уже сделал. Другие вещи пилю. Благодаря дерьмовой реализации других вещей - это оказывается не так просто.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

нерасширяемое

Как самый начальный PoC сгодится, может быть, но дальше надо переписывать на нормальный язык

однопользовательское

А ты сам подумай.

Dimez ★★★★★
()
Ответ на: комментарий от Dimez

Как самый начальный PoC сгодится, может быть, но дальше надо переписывать на нормальный язык

Переписывать на нормальный язык для чего, и что это даст в конечном итоге?

А ты сам подумай.

Подумал. Не вижу тут ничего однопользовательского. Мы что, разучились определять UID или chownить файлы? Просто не думал что такие мелочи нужно явно указывать. Сходи на freedesktop, почитай спеки, там вообще не понятно КАК оно работает :)

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

Та уже сделал.

Есть шанс прославить себя в веках. Напиши Торвальдсу, типа дорогой Линус, я нашел фатальный недостаток этого вашего линупса и знаю как его пофиксить раз и навсегда в десять строк кода. Думаю, твоим именем назовут какой-нибудь популярный дистрибутив, основанный на идеях ядерного трея и прочих упоительных инноваций, возьмут на работу TEO редхарта или сузе, в общем блистатеное будущее гарантировано, надо только иметь смелость начать громко о себе заявлять.

FishHook
()
Ответ на: комментарий от skiminok1986

Когда твоя программка упадёт, кто за ней приберёт? Как ты будешь различать треи разных пользователей?

Вообще-то когда программка падает - за ней прибирает сам реализатор трея.

Пользователей различать это вообще задача проще простого.

windows10 ★★★★★
() автор топика

procfs - это та самая ФС, которая создавалась для храниения базовой инфы о процессах, но стала засираться такими вот юз-кейсами, как треи?

seiken ★★★★★
()
Ответ на: комментарий от windows10

А потом народ жалуется, чой-то система постоянно диском шуршит.

ya-betmen ★★★★★
()
Ответ на: комментарий от windows10

Вообще-то когда программка падает - за ней прибирает сам реализатор трея.

А может и не прибирать.

Пользователей различать это вообще задача проще простого.

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

skiminok1986 ★★★★★
()
Ответ на: комментарий от FishHook

А Торвальдс тут при чем?

С него вообще спрос мал, тут скорее вопрос к канониклу и кедерастам, которые вместо того чтобы запилить нормальный простой интерфейс - мало того что умудрились внедрить непонятное некроссплатформенное решение, так еще и привязали его к местами неработающей, глючаще-зависающей технологии. Прибивали б уже сразу к системде. systemd-trayd get_list --user=windows_10 и вуаля.

Тогда уж лучше Лёне писать.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от seiken

procfs - это та самая ФС, которая создавалась для храниения базовой инфы о процессах, но стала засираться такими вот юз-кейсами, как треи?

Ее можно использовать вообще для хранения инфы о процессах, тем более как я уже писал выше, системда УЖЕ имеет туда доступ.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от skiminok1986

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

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

Мы же как-то получаем доступ только к своему конфигу ГУЯ, только к своему конфигу иксов, и тд итп.

windows10 ★★★★★
() автор топика

Я как человек, страдающий перфекционизмом и в некоторой степени ОКР, стараюсь не обращать на это внимание, ведь каждый раз, когда я совершаю попытки глубоко разобраться во всем этом, у меня начинается тряска, и появляется чувство, что система медленно костыляет и вот-вот развалится. Но другая проблема заключается в том, что альтернативы не лучше, на выбор остается поделие паджитов из МС и макось с ректальными зондами и кибергулагом. Поэтому я стараюсь как можно быстрее выполнить свои задачи за компьютером и убежать от него подальше, так и живем.

eyrell
()
Ответ на: комментарий от FishHook

Вот те на, ты же толко что ратовал за ядерный трей. Ядро - это к Торвальдсу

Я ратовал за выделение трею определенной заранее всем известной области с принципом «все есть файл».

Как вариант привел в пример procfs. Можно tmpfs. Или devfs. И даже ext4.

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

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

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

FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от FishHook

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

Тю, ты так говоришь будто с d-bus имеющим доступ к системной шине, этого нельзя сделать :)

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

Если ты хочешь увидеть прям готовую реализацию, которую напишет один человек, и которая будет уметь все то, что писала куча человек за 10 лет - придется немного потерпеть ;)

windows10 ★★★★★
() автор топика
Ответ на: комментарий от FishHook

А, так мы еще и не диск это писать будем? Идея заблестела совсем другими красками!

Ну чтение ж тебя не особо угнетает. Или ты думаешь что условный icon_pixmap на сесионной шине d-bus из libastral берется ?)

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

windows10 ★★★★★
() автор топика

Ты эта. Только не думай «накинулись все на меня из-за синдрома утёнка, ууу, редиски».

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

Вся проблема иксов в том, что в их проектировании и разработке принимали участие инженеры с настоящим высшим образованием и учёными степенями, а сейчас за их дальнейшее развитие взялись трансы в платьишках с недостатком обожания, которые зачастую торгуют лицами на конференциях ;-) И им банально «сложна, сложна, сложна!» :)

Dimez ★★★★★
()

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

ergo ★★★
()
Последнее исправление: ergo (всего исправлений: 1)
Ответ на: комментарий от FishHook

я так-то думал, что d-bus это и есть системная шина

Да. И ты можешь получить доступ к всем данным приложений, которые не скрывают они и не скрывает сам d-bus.

Вот например я могу создать программу, которая сядет на шину, будет принимать сигнал например «run» и запускать rm -rf. Могу этот сигнал закрыть, могу не закрывать, могу проверять юзера перед запуском rm -rf, а могу и не проверять.

К чему я веду - проверки пермишенов все равно происходят, просто на другом уровне.

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

windows10 ★★★★★
() автор топика
Ответ на: комментарий от windows10

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

Это сразу мимо.

Мы же как-то получаем доступ только к своему конфигу ГУЯ, только к своему конфигу иксов, и тд итп.

Во! Пишем в хомяк и делу край :)

skiminok1986 ★★★★★
()
Ответ на: комментарий от Dimez

Вся проблема иксов в том, что в их проектировании и разработке принимали участие инженеры с настоящим высшим образованием и учёными степенями, а сейчас за их дальнейшее развитие взялись трансы в платьишках с недостатком обожания, которые зачастую торгуют лицами на конференциях ;-) И им банально «сложна, сложна, сложна!» :)

Да, есть такой недостаток у иксов. Почему недостаток? Потому что инженеры тоже относятся к категории «когда у тебя в руках молоток - все кажется гвоздями», соответственно методы которыми они пользуются - объяснимы с точки зрения инженерии, но не объяснимы с точки зрения прикладного пользования. Это ведь надо не только создать, этим еще надо и пользоваться.

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

windows10 ★★★★★
() автор топика
Ответ на: комментарий от skiminok1986

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

Ну блин, не /dev/shm/systray/PID, а /dev/shm/UID/systray/PID, без разницы. В чем проблема? Что юзер может увидеть запущенные приложения другого юзера? Так он и так их может увидеть через ps.

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

windows10 ★★★★★
() автор топика
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)