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 я расскажу в следующей серии.

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

★★★★★

нужно создавать целую сороконожку на костылях и сажать ее на велосипед с квадратными колесами

Энджой ёр гаражно-панковская модель разработки

yu-boot ★★★★
()

почему пингвинятники вечно идут каким-то своим, оверинжинирнутым путем?

расскажи как это делают не пингвинятники

//пересекается с этой темой Почему люди все время пытаются изобрести велосипед

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

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

Трезвость, все беды от неё. Какого ляда ты решил это увязывать с процессом?

Все чтения изменений через простой inotify.

Ой все, inotify на /proc.

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

Какого ляда ты решил это увязывать с процессом?

А в чём проблема? Второй экземпляр запустил - он тоже создаст в проке то же самое для себя.

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

Вообще никакой. Запустил вложенные иксы/композитор — всем по две иконки. Залогинился другим юзером в другую графсессию — по три.

t184256 ★★★★★
()

Трей не нужен, есть список окон, у них сто лет в обед есть api для кастомных меню. </thread>

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

Трезвость, все беды от неё. Какого ляда ты решил это увязывать с процессом?

Потому что это самый простой идентификатор приложения по которому его можно дернуть. В самом деле, ведь проще когда приложение с pid 1234 создает в d-bus (с pid 567) запись :1.8910. Это и называется оверинжиниринг.

Ой все, inotify на /proc

Ваще пофиг, будет это специальный каталог на блочной ФС, или другой УЖЕ СУЩЕСТВУЮЩИЙ (это важно) метод слежения за изменением. Хоть через ведро, пофигу.

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

Ну давай, делай. Если не плюнешь, то быстро изобретешь, что это должно быть уникально для юзера, нет, сессии, а ещё rw, а ещё с чисткой при отвале, а вообще лучше произвольным rpc, а чтобы не тормозило и было переносимо, то проще маленьким демоном и опа, nihdbus.

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

Системное программирование

Системный трей

То самое системное программирование на ПХП, не перепутайте.

moonmadness
()
Ответ на: комментарий от t184256

Трей не нужен, есть список окон, у них сто лет в обед есть api для кастомных меню.

Трей не имеет никакого отношения к кастомным меню. Трей - это область уведомления с определенными параметрами, а точнее: а) приложение выводит туда актуальную информацию; б) Приложение предоставляет определенное меню, которое отличается от меню окна.

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

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

Да чёрт его знает. Как и четыре уровня абстракций при реализации звука в линуксе.

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

То самое системное программирование на ПХП, не перепутайте

Да.

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

Ну вот что мешало приложению создать в своем пространстве запись «/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»? И все!

Ну то есть ты изобрел d-bus на минималках, в котором межпроцессные сообщения передаются через записи в файлах «/proc/PID/…» и который поддерживает сообщения адресованые только для одной конкретной программы и только такие, которые ты придумал за пять минут напряжонного мозгового штурма. При этом уже имеющееся универсальное решение, позволяющее решить широкий круг задач включая пресловутый трей, ты решительно отвергаешь как «велосипед».

Вам, уважаемый, лучше бы перестать употреблять наркотики.

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

А сколько вызовов на куте или гатека?

Кути и гатека этим вообще не занимаются. Этим занимается микс из иксов и д-баса, своей, уличной магией.

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

А ты знаешь кто и как занимается этим на винде/маке ?

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

У приложения есть иконка в таскбаре, возможность привлекать внимание, возможность выводить туда прогресс бар и кастомные действия по ПКМ. Что именно в «трей не нужен» ты не расслышал?

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

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

Окно — свернуть, разрабов — уволить.

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

Ну то есть ты изобрел d-bus на минималках, в котором межпроцессные сообщения передаются через записи в файлах «/proc/PID/…» и который поддерживает сообщения адресованые только для одной конкретной программы и только такие, которые ты придумал за пять минут напряжонного мозгового штурма. При этом уже имеющееся универсальное решение, позволяющее решить широкий круг задач включая пресловутый трей, ты решительно отвергаешь как «велосипед».

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

И нет, я не изобретал D-bus на минималках, я обратил внимание на наиболее простое решение, реализуемое без дополнительной глючащей абстракции.

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

«Таскбар» в кедах, гноме и сотнях wm очень разный. Выведи всю эту красоту на tint2, например - там это просто не заложено.

yu-boot ★★★★
()
Ответ на: комментарий от t184256

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

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

У приложения есть иконка в таскбаре, возможность привлекать внимание, возможность выводить туда прогресс бар и кастомные действия по ПКМ. Что именно в «трей не нужен» ты не расслышал?

Желаю удачи в размещении регулятора громкости в таскбаре, трех мессенджеров в таскбаре, торрент трекера в таскбаре, индикатора раскладки в таскбаре, впн-клиента в таскбаре.

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

Котаны, тема не о трее, тема о том, зачем пингвинятники реализуют очевидные решения через жёпу. Трей - это просто наглядный пример данной жёпы.

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

Нужна ли ещё одна ступень в иерархии ненужности?

Ну так можно и дома книги, одежду, кошачий лоток и вчерашний суп размещать на одной полке :)

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

Не вижу проблемы. Громкость видеть раз не нужно, торрент-клиент запущен => должен быть в доке, индикатор раскладки на клавиатуре, а уж если настолько упорот, что вместо одного мессенджера на мобилке запустил три и на десктопе, то дурь твоя каждому должна быть видна.

То же относится и к неинтегрированному в систему VPN-клиенту, брось каку.

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

А нужен ли трей? Вот уже несколько лет на sway без трея сижу. Не могу сказать, что мне его не хватало. Зато сильно бесило, что на иксах нельзя было его разместить на обоих мониторах.

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

Не вижу проблемы. Громкость видеть раз не нужно, торрент-клиент запущен => должен быть в доке, индикатор раскладки на клавиатуре, а уж если настолько упорот, что вместо одного мессенджера на мобилке запустил три и на десктопе, то дурь твоя каждому должна быть видна.

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

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

А нужен ли трей?

Существование во всех более менее популярных системах и попытки реализовать это в линуксах - говорят что нужен.

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

Ну вот что мешало приложению создать в своем пространстве запись «/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.

Ужас. Не знаю ничего про устройство иксов, но твое предложение хуже некуда.

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

У «непингвинятников» системный трей является частью системного API, в принципе что и логично. То есть это «не иксы», «не д-бус», а отдельная область, которую одни приложения могут читать, а другие туда писать. И все это по гайдлайнам с примерами.

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

Ужас. Не знаю ничего про устройство иксов, но твое предложение хуже некуда

Аргументируй чем хуже размещение хотелок приложения в самом приложении ?

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

Котаны, тема не о трее, тема о том, зачем пингвинятники реализуют очевидные решения через жёпу. Трей - это просто наглядный пример данной жёпы.

Потому что:
1. Разработка сложного ПО это *очень* сложная задача.
2. Предусмотреть появление через десятилетие новых треев, устройств ввода, мониторов сложно/нереально.
3. Люди ошибаются.
4. Есть различные не инженерные факторы и просто случайности.

На Ютубе есть лекция Паккарда об истории Иксов, там многое из таких факторов он рассказывает.

urxvt ★★★★★
()

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

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

У «непингвинятников» системный трей является частью системного API

Т.е. если бы «пингвин» был клозедСорс и ты не видел деталей реализации, то тебе было бы норм.

Тупые «пингвинятники» дают тебе заглянуть «под капот». Ну всё не как у людей.

Bad_ptr ★★★★★
()

Потому что над вендами работают известные в отрасли люди, в отличие от.

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

Потому что /proc это ядерный интерфейс а не для какого-то трея и использования приложениями (X). Делать из /proc помойку не нужно.

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

А нужен ли трей?

Нет. Сижу на CDE без трея больше года, все хорошо.

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

Ну сделали же пайпы. До сих пор работает. Сделали сокеты. До сих пор работает, актуально, менять не нужно. Мне кажется что когда делаешь очередную реализацию чего-либо, ее нужно начинать строить с максимально простых и понятных кирпичиков, согласно KISS.

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

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

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

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

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

Потому что /proc это ядерный интерфейс а не для какого-то трея и использования приложениями (X). Делать из /proc помойку не нужно.

А кто сказал что трей не может быть ядерным интерфейсом? То есть systemГэ туда можно писать свой жорнал, а собственное приложение не может?

Да и не в /proc суть. Суть в организации пространства, желательно соответствующего парадигме «все есть файл».

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