Кое-что еще: пакеты приложений Haiku?

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

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!


TL;DR: может ли Haiku получить надлежащую поддержку пакетов приложений, к примеру каталогов приложений (как .app в Mac) и/или образов приложений (Linux AppImage)? Мне кажется, это будет достойным дополнением, которое правильно внедрить проще, чем в других системах, поскольку большая часть инфраструктуры уже есть.


Неделю назад я открыл для себя Haiku, неожиданно хорошую систему. Ну а поскольку я давно интересуюсь каталогами и образами приложений (вдохновленными простотой Macintosh), то неудивительно, что мне в голову пришла идея…


Для полного понимания: я создатель и автор AppImage, формата распространения приложений Linux, нацеленного на простоту Mac и предоставляющего полное управление авторам приложений и конечным пользователям (хотите знать больше — см. wiki и документацию).


Что если мы сделаем AppImage для Haiku?


Давайте немного, чисто теоретически, порассуждаем: что нужно сделать для того, чтобы получить AppImage, или нечто подобное, на Haiku? Необязательно создавать что-то прямо сейчас, ведь система, которая уже есть в Haiku, работает удивительно, а вот воображаемый эксперимент получился бы неплохой. А еще он демонстрирует утонченность Haiku, по сравнению с рабочими окружениям Linux, где подобные вещи ужасно трудны (имею право так говорить: 10 лет уже маюсь с отладкой).



На Macintosh System 1 каждое приложение было отдельным файлом, "управляемым" в Finder. Используя AppImage я пробую пересоздать этот же пользовательский опыт на Linux.


Во-первых, а что такое AppImage? Это система для выпуска приложений сторонних разработчиков (к примеру, Ultimaker Cura), позволяющая выпускать приложения, когда и как им охота: не нужно знать особенности различных дистрибутивов, политик сборки или инфраструктуры сборки, не нужна поддержка сопровождающих, и они не указывают пользователям, что (не)можно устанавливать у себя на компьютерах. AppImage следует понимать как что-то, похожее на пакет для Mac в формате .app внутри образа диска .dmg. Основное отличие в том, что приложения не копируются, а остаются внутри AppImage всегда, примерно так же, как пакеты Haiku .hpkg монтируются, и никогда не устанавливаются в обычном смысле.


AppImage за более чем 10 лет существования получил некоторую притягательность и популярность: сам Линус Торвальдс публично одобрил его, а распространенные проекты (к примеру, LibreOffice, Krita, Inkscape, Scribus, ImageMagick) приняли его в качестве основного способа распространения непрерывных или ночных сборок, не мешающих установленным или не установленным приложениям пользователей. Однако рабочие окружения и дистрибутивы Linux чаще всего по-прежнему цепляются за традиционную, централизованную модель распространения на основе сопровождающих и/или продвигают собственные корпоративные бизнес и/или инженерные программы на основе Flatpak (RedHat, Fedora, GNOME) и Snappy (Canonical, Ubuntu). Доходит до смешного.


Как все работает


  • Каждый AppImage содержит в себе 2 части: маленький исполняемый по двойному щелчку ELF (т.наз. runtime.c), с последующим образом файловой системы SquashFS.


  • Файловая система SquashFS содержит полезную нагрузку в виде приложения и всего необходимого для его запуска, которое в здравом уме нельзя считать частью установки по-умолчанию для каждой достаточно свежей целевой системы (дистрибутива Linux). Также она содержит метаданные, к примеру имя приложения, иконки, типы MIME и проч., проч.


  • При запуске пользователем runtime использует FUSE и squashfuse для монтирования файловой системы, после чего обрабатывает запуск некоторой точки входа (т.н. AppRun) внутри смонтированного AppImage.
    Файловая система размонтируется после того, как завершится процесс.

Вроде все просто.


А эти вещи все усложняют:


  • с таким разнообразием дистрибутивов Linux уже ничто «в здравом уме» не назовешь "частью установки по-умолчанию для каждой свежей целевой системы". Мы обходим эту проблему путем сборки excludelist, позволяющего определить, что будет упаковано в AppImage, а что нужно будет взять где-то еще. При этом мы иногда промахиваемся, несмотря на то, что в общем-то все отлично работает. По этой причине мы рекомендуем создателям пакетов проверять AppImages на всех целевых системах (дистрибутивах).
  • Приложения в виде полезной нагрузки должны быть перемещаемыми по файловой системе. К сожалению, в многих приложениях жестко заданы абсолютные пути к, например, ресурсам в /usr/share. Это надо как-то исправлять. Помимо этого надо либо экспортировать LD_LIBRARY_PATH, либо исправлять rpath для того, чтобы загрузчик мог найти связанные библиотеки. У первого способа есть свои недостатки (которые обходятся сложными способами), а второй просто громоздкий.
  • Самая большая UX ловушка для пользователей в том, что надо установить исполняемый бит файлу AppImage после скачивания. Хотите верьте, хотите нет, но для кого-то это реальный барьер. Необходимость установки бита исполняемости громоздка даже для опытных пользователей. В качестве обходного пути мы предложили установку небольшого сервиса, следящего за файлами AppImage и устанавливающего им бит исполнимости. В чистом виде, не самое лучшее решение, поскольку не будет работать "из коробки". Дистрибутивы Linux не поставляют этот сервис, следовательно, у пользователей "из коробки" все плохо.
  • Пользователи Linux ждут, что у нового приложения появится иконка в меню запуска. Системе не скажешь: «Смотри, вон новое приложение, давай работай". Вместо этого, согласно спецификации XDG, надо скопировать файл .desktop в нужное место в /usr для общесистемной установки, или в $HOME для индивидуальной. Иконки определенных размеров, согласно спецификации XDG, нужно поместить в определенные места в usr или $HOME, после чего запустить команды в рабочем окружении для обновления кэша иконок, или надеяться, что менеждер рабочего окружения сообразит и автоматически все обнаружит. Аналогично с типами MIME. В качестве обходного способа предлагается использовать тот же сервис, который помимо установки признака исполнимости будет, при наличии иконок и проч. в AppImage, копировать их из AppImage в нужные места согласно XDG. При удалении или перемещении сервис предполагаемо будет зачищать все. Конечно, есть различия в поведении у каждого рабочего окружения, в форматах графических файлов, их размерах, местах хранения и способах обновления кэшей, что и рождает проблему. Короче, этот способ — костыль.
  • Если вышеперечисленного недостаточно, в файловом менеджере так и нет иконки AppImage. В мире Linux до сих пор не приняли решение о внедрении elficon (несмотря на обсуждение и реализации), так что невозможно встроить иконку прямиком в приложение. Вот и получается, что приложения в файловом менеджере не имеют собственных иконок (без разницы, AppImage или что-то другое), они есть только в меню запуска. В качестве обходного пути мы применяем миниатюры — механизм, который изначально был разработан для того, чтобы менеджеры рабочего стола могли показывать уменьшенные изображения для предпросмотра графических файлов в качестве их иконок. Следовательно, сервис для установки бита исполнимости также работает как "миниатюризатор", создавая и записывая миниатюры иконок в соответствующие места /usr и $HOME. Также этот сервис выполняет зачистку если AppImage удаляется или перемещается. Из-за того, что каждый менеджер рабочего стола ведет себя чутка по-разному, к примеру, в каких форматах принимает иконки, в каких размерах или местах, это все реально болезненно.
  • Приложение просто падает при исполнении, если возникают ошибки (к примеру, есть библиотека, которая не является частью базовой системы и не поставляемая в AppImage), и никто не говорит пользователю в GUI о том, что именно происходит. Мы начали обходить это, используя уведомления на рабочем столе, а значит, нам надо вылавливать ошибки из командной строки, преобразовать их в понимаемые пользователю сообщения, которые потом надо еще отобразить на рабочем столе. И конечно же, каждое рабочее окружение обрабатывает их немножко по-разному.
  • На текущий момент (сентябрь 2019 года, — прим. переводчика) я не нашел простого пути сказать системе, что файл 1.png надо открывать с помощью Krita, а 2.png — с помощью GIMP.


Местом хранения cross-desktop спецификаций, используемых в GNOME, KDE и Xfce является freedesktop.org


Достижение уровня утонченности, глубоко вплетенного в рабочее окружение Haiku, затруднено, если не сказать «невозможно», из-за спецификаций XDG от freedesktop.org для cross-desktop, а также реализаций менеджеров рабочего стола на основе этих спецификаций. В качестве примера можно привести одну общесистемную иконку Firefox: видимо, авторам XDG и в голову не пришло, что у пользователя может быть установлено несколько версий одного и того же приложения.



Иконки разных версий Firefox


Мне было интересно, чему мир Linux мог бы научиться у Mac OS X, чтобы не лажать при системной интеграции. Если у вас есть время и вы занимаетесь таким — обязательно почитайте, что сказал Арно Гурдол, один из первых инженеров Mac OS X:


Мы хотели, чтобы установить приложение было так же просто, как перетащить иконку приложения откуда-нибудь (сервер, внешний диск) на диск вашего компьютера. Для этого в пакете приложения сохранена вся информация, включая иконки, версию, обрабатываемый тип файла, тип схем URL, которую система должна знать для обработки приложения. Сюда же относится информация для 'централизованного хранения' в базе данных Icon Services и Launch Services. Для поддержки производительности приложения 'обнаруживаются' в нескольких 'хорошо известных' местах: в системном и пользовательском каталоге Applications, а также в некоторых других автоматически, если пользователь перешел в Finder в каталог, содержащий приложение. На практике это очень хорошо сработало.

https://youtu.be/qQsnqWJ8D2c
Apple WWDC 2000 сессия 144 — Mac OS X: упаковка приложений и распечатка документов.


Ничего подобного из этой инфраструктуры нет на рабочих окружениях Linux, поэтому мы ищем обходные пути вокруг структурных ограничений в проекте AppImage.



Неужто Haiku спешит на помощь?


И еще: платформы Linux в качестве основы рабочих окружений, как правило, до того недоспецифицированны, что многие вещи, которые весьма просты в согласованной системе с полным стеком, разочаровывают фрагментированностью и сложностью в Linux. Я посвятил целый доклад вопросам, связанным с платформой Linux для рабочих окружений (знающие разработчики подтвердили: все так и останется еще очень надолго).



Мой доклад по проблемам рабочих окружений Linux в 2018


Даже Линус Торвальдс признал, что именно из-за фрагментации идея рабочих окружений не удалась.


Приятно видеть Haiku!


С Haiku все становится потрясающе простым


Хотя наивный подход к "переносу" AppImage на Haiku заключается в простой попытке сборки (в основном runtime.c и сервиса) его компонентов (что может быть даже и возможно!), это не принесет особой пользы для Haiku. Потому что на самом деле большинство этих проблем решено на Haiku и концептуально обоснованно. Haiku предоставляет именно те кирпичики для системной инфраструктуры, которые я так долго искал в рабочих окружениях на Linux и не мог поверить, что их там нет. А именно:



Верите или нет, но это не могут побороть многие пользователи Linux. На Haiku все делается автомагически!


  • Файлы ELF, не имеющие бита исполнимости, получает его автоматически при двойном щелчке в файловом менеджере.
  • Приложения могут иметь встроенные ресурсы, к примеру иконки, которые отображаются в файловом менеджере. Не нужно копировать кучу изображений в особые каталоги с иконками, а следовательно, не надо их подчищать после удаления или перемещения приложения.
  • Есть база данных для связывания приложений с документами, нет необходимости копировать какие-либо файлы для этого.
  • В каталоге lib/ рядом с исполняемым файлом библиотеки ищутся по-умолчанию.
  • Нет многочисленных дистрибутивов и окружений рабочего стола, все что работает — работает везде.
  • Не существует отдельного модуля для запуска, который отличался бы от каталога Applications.
  • В приложениях нет встроенных абсолютных путей к своим ресурсам, есть специальные функции для определения местоположения во время исполнения.
  • Внедрена идея сжатых образов файловых систем: это любой пакет hpkg. Все они монтируются ядром.
  • Каждый файл открывается приложением, которое его создало, если явно не указать что-то иное. Как же это круто!


Два файла png. Обратите внимание на разные иконки, показывающие, что они будут открываться разными приложениями по двойному щелчку. Также обратите внимание на выпадающее меню "Открыть с помощью:", где пользователь может выбрать отдельное приложение. Как просто!


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


Нужны ли Haiku пакеты приложений, в конце концов?


Это подводит к большому вопросу. Если бы на Haiku создать систему вроде AppImage оказалось на порядок проще, чем на Linux, стоило бы этим заняться? Или же Haiku с ее системой пакетов hpkg фактически устранила необходимость разработки подобной идеи? Что ж, для ответа надо взглянуть на мотивацию существования AppImages.


Взгляд со стороны пользователя


Посмотрим на нашего конечного пользователя:


  • Я хочу поставить приложение без запроса пароля администратора (root). На Haiku нет понятия администратора, у пользователя полный контроль, поскольку это персональная система! (В принципе, можно представить это и в многопользовательском режиме, надеюсь, разработчики сохранят простоту)
  • Я хочу получать последние и лучшие версии приложений, не ждать, когда они появятся в моём дистрибутиве (чаще всего это значит "никогда", по крайней мере, если не обновить всю операционку). На Haiku это "решено" с помощью плавающих выпусков. Это означает, что есть возможность получать последние и лучшие версии приложений, но для этого нужно постоянно обновлять и остальную часть системы, фактически превращая ее в "движущуюся цель".
  • Мне хочется несколько версий одного и того же приложения рядом, поскольку нельзя узнать, что было сломано в последней версии, или, допустим, мне, как веб-разработчику, надо проверить свою работу под разными версиями браузера. В Haiku решена первая, но не вторая проблема. Обновления откатываются, но только для системы целиком, невозможно (как мне известно) запустить, к примеру, несколько версий WebPositive или LibreOffice одновременно.

Один из разработчиков пишет:


По сути, обоснование такое: сценарий использования настолько редкий, что оптимизация для него не имеет смысла; обработка его, как особого случая, в HaikuPorts, кажется более чем приемлемой.

  • Мне нужно сохранять приложения там, где мне нравится, а не на загрузочном диске. На дисках у меня часто заканчивается место, так что мне надо подключать внешний диск или сетевой каталог для хранения приложений (всех версий, что я скачал). Если я подключаю такой диск — надо чтобы приложения запускались по двойному щелчку. Haiku сохраняет старые версии пакетов, но я не знаю как переместить их на внешний диск, а также как потом вызывать приложения оттуда.

Комментарий разработчика:


Технически, это уже возможно с командой mount. Конечно, мы сделаем GUI для этого, как только наберется достаточно заинтересованных пользователей.

  • Мне не нужны миллионы файлов, разбросанных по файловой системе, которыми я не могу самостоятельно вручную управлять. Хочу один файл на приложение, который я могу легко скачать, переместить, удалить. На Haiku эта проблема решена с помощью пакетов .hpkg, которые переносят, к примеру python, из тысяч файлов в один. Но если есть, к примеру, Scribus, использующий python, то мне приходится иметь дело минимум с двумя файлами. И я должен позаботиться о том, чтобы сохранить их работающие друг с другом версии.


Многочисленные версии AppImages, запущенный рядом на одном Linux


Взгляд со стороны разработчика приложений


Давайте посмотрим с точки зрения разработчика приложений:


  • Я хочу управлять пользовательским опытом целиком. Не хочу зависеть от операционной системы, которая будет мне указывать, когда и как я должен выпускать приложения. В Haiku разработчикам можно работать со своими собственными репозиториями hpkg, но это означает, что пользователям надо будет настраивать их вручную, что делает эту идею "менее привлекательной".
  • У меня есть страница загрузки на моем веб-сайте, где я распространяю .exe для Windows, .dmg для Mac и .AppImage для Linux. А может, я захочу монетизировать доступ к этой странице, все может быть? Что мне надо разместить там для Haiku? Достаточно файла .hpkg с зависимостями только от HaikuPorts
  • Моему ПО нужны определенные версии другого ПО. К примеру, известно, что для Krita нужна исправленная версия Qt, или Qt, которая точно настроена на конкретную версию Krita, по крайней мере, до тех пор, пока исправления не вернутся обратно в Qt. Можно упаковать собственный Qt для приложения в пакете .hpkg, но скорее всего, такое не приветствуется.


Обычная страница загрузки приложения. Что же разместить здесь для Haiku?


Станут ли комплекты (существующие в виде каталогов приложений, как AppDir или .app в стиле Apple) и/или образы (в виде сильно модифицированных AppImages или .dmg от Apple) приложений полезным дополнением для рабочего окружения Haiku? Или это разбавит целостную картину и приведет к фрагментации, а следовательно, добавит сложности? Я разрываюсь: с одной стороны, красота и утонченность Haiku основаны на том, что обычно есть один способ сделать что-то, а не много. С другой стороны, большая часть инфраструктуры для каталогов и/или комплектов приложений уже на месте, поэтому система взывает к тому, чтобы на свои места встали и оставшиеся несколько процентов.


Согласно разработчику mr. waddlesplash


На Linux они (каталоги и комплекты приложений, — прим. переводчика) скорее всего являются техническим решением системных проблем. На Haiku мы предпочитаем просто решать системные проблемы.

А вы что думаете?


Прежде чем ответите...


Подождите, сделаем быструю проверку на реальность: по факту каталоги приложений — уже часть Haiku:



Каталоги приложений уже существуют на Haiku, но пока не поддерживаются в файловом менеджере


Они просто не так хорошо поддерживаются, как, скажем, в Macintosh Finder. Насколько было бы круто, если бы каталог QtCreator имел бы в верхнем левом углу имя и иконку "QtCreator", запускающие приложение по двойному щелчку?


Немного ранее я уже спрашивал:


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

Имеется ли уже ответ со стороны Haiku, или каталоги и комплекты приложений смогут тут помочь? Я думаю, смогут.


Согласно mr. waddlesplash:


Да, у нас есть ответ на вопрос: мы просто будем поддерживать эти приложения столько, сколько нужно, пока кто-нибудь не сможет правильным способом прочитать их форматы файлов или обеспечить функциональность один к одному. Наше стремление поддерживать работу приложений BeOS R5 на Haiku — прямое тому доказательство...

Это точно!


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


Я могу представить мирное сосуществование hpkg, каталогов и образов приложений:


  • Системное ПО использует .hpkg
  • Для наиболее часто используемого ПО (особенно для того, которому надо запланировать плавающие выпуски) используется .hpkg (примерно 80% всех случаев)
  • Некоторые, установленные через .hpkg, приложения выиграют при переходе на инфраструктуру с каталогами приложений (к примеру, QtCreator): они будут распространяться в виде .hpkg, как и раньше.

mr. waddlesplash пишет:


Если все, что нужно, это — просмотр приложений в /system/apps, вместо этого надо сделать каталоги в Deskbar более управляемыми для пользователей, поскольку /system/apps не предназначен для того, чтобы пользователи регулярно открывали и смотрели его (в отличие от MacOS). Для таких ситуаций у Haiku другая парадигма, но этот вариант, по идее, приемлем.

  • Haiku получает инфраструктуру для запуска образов приложений, ночных, непрерывных и тестовых сборок ПО, а также на случаи, когда пользователь желает его "заморозить во времени", для частного и внутреннего ПО, и других особых случаев использования (около 20% от всех). Эти образы содержат необходимые для запуска приложения файлы .hpkg, монтируемые средствами системы, а после завершения приложения — размонтируемые. (Возможно, файловый менеджер мог бы помещать файлы .hpkg в образы приложений, автоматически или по требованию пользователя — ну, как когда перетаскиваешь приложение на сетевой каталог или внешний диск. Это же просто песня! А точнее поэзия — хайку.) С другой стороны, пользователь может захотеть установить содержимое образа в виде файлов.hpkg, после чего они будут обновляться и обрабатываться точно также, как если бы были установлены через HaikuDepot… Надо провести мозговой штурм).

Цитата от mr. waddlesplash:


Запуск приложений с внешних дисков или сетевых каталогов потенциально может быть полезным. А добавление возможности настройки большего количества "зон" для pkgman определенно станет хорошей функцией.

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


Заключение


Для Haiku есть инфраструктура, предоставляющая простой и утонченный пользовательский интерфейс для ПК, и далеко выходящая за рамки того, что обычно предоставляется для ПК на Linux. Система пакетов .hpkg — один из таких примеров, но остальные части системы также пропитаны утонченностью. Тем не менее, от правильной поддержки каталогов и образов приложений Haiku бы выиграла. Как это лучше всего сделать — стоит обсудить с людьми, знающими Haiku, ее философию и архитектуру намного лучше, чем я. В конце концов я пользуюсь Haiku чуть больше недели. Но тем не менее, я считаю, что этот свежий взгляд окажется полезен дизайнерам, разработчикам и архитекторам Haiku. По крайней мере, я с радостью побуду для них «спарринг-партнером». У меня более 10 лет практического опыта работы с каталогами и комплектами приложений для Linux, и мне хотелось бы найти им применение для Haiku, для концепции которой, по моему мнению, они подходят идеально. Предложенные мною потенциальные решения вовсе не являются единственно верными для проблем, которые я описал, и если команда Haiku решит найти другие, более изящные, — я только всеми руками за. В принципе, я уже обдумываю идею того, как сделать систему hpkg еще более удивительной, не меняя способа ее работы. Оказывается, команда Haiku давно думала о комплектах приложений при внедрении системы управления пакетами, но к сожалению, (мне кажется) идея ушла в "устаревшие". Может быть, пришло время возродить ее?


Попробуйте сами! Ведь проект Haiku предоставляет образы для загрузки с DVD или USB, формируемые ежедневно.
Появились вопросы? Приглашаем вас в русскоязычный telegram-канал.


Обзор ошибок: Как выстрелить себе в ногу в C и C++. Сборник рецептов Haiku OS


От автора перевода: это восьмая и заключительная статья из цикла про Haiku.


Список статей: Первая Вторая Третья Четвертая Пятая Шестая Седьмая

Источник: https://habr.com/ru/company/southbridge/blog/466301/


Интересные статьи

Интересные статьи

У пользователей iOS сейчас непростые времена: App Store теряет крупные приложения и блокирует успешные стартапы, многие компании обвиняют Apple в монополизме, а Epic Games вообще ...
Предыстория До начала работы с Алисой мне уже приходилось сталкиваться с разработкой чат-ботов для telegram, viber, вконтакте. Чат-бот с расписаниями автобусов без Алисы Чат-бот был разработан...
Друзья, это становится доброй традицией. Мы не встречались почти 11 месяцев – прошлая наша встреча была накануне Нового года и у самого Кремля. А в этом году Node.js исполнилось 10 лет, а это зна...
.NET – управляемая среда выполнения. Это означает, что в ней представлены высокоуровневые функции, которые управляют вашей программой за вас (из Introduction to the Common Language Runtime (CLR),...
Сегодня мы представляем вашему вниманию первую часть перевода материала, который посвящён разработке крупномасштабных React-приложений. При создании одностраничного приложения с помощью React оче...