Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów

TL; DR: Haiku to system operacyjny zaprojektowany specjalnie dla komputerów PC, dlatego ma kilka sztuczek, dzięki którym jego środowisko graficzne jest znacznie lepsze od innych. Ale jak to działa?

Niedawno Odkryłem Haiku, niespodziewanie dobry system. Wciąż jestem zdumiony, jak płynnie to działa, szczególnie w porównaniu ze środowiskami stacjonarnymi z Linuksem. Dziś zajrzę pod maskę. Tam, gdzie będzie to konieczne dla dogłębnego zrozumienia, dokonam porównań z oryginalnymi środowiskami graficznymi Macintosh, Mac OS X i Linux (standard XDG z freedesktop.org).

Zasoby w plikach ELF

Wczoraj dowiedziałem się, że IconOMatic może zapisywać ikony w zasobach rdef w plikach wykonywalnych ELF. Dzisiaj chcę zobaczyć jak to naprawdę działa.

Zasoby? Zacytować od Bruce’a Horna, oryginalny autor Macintosh Finder i „ojciec” Menedżera zasobów Macintosh:

Martwię się sztywną naturą tradycyjnego kodowania. Dla mnie sam pomysł aplikacji zamrożonej w kodzie, bez możliwości dynamicznej zmiany czegokolwiek, jest najdzikszym barbarzyństwem. Powinno być możliwe dokonanie jak największej liczby zmian w czasie wykonywania. Oczywiście samego kodu aplikacji nie da się zmienić, ale na pewno da się coś zmienić bez przekompilowania kodu?

Na oryginalnym komputerze Macintosh pliki te miały „sekcję danych” i „sekcję zasobów”, co niezwykle ułatwiło zapisywanie takich rzeczy, jak ikony, tłumaczenia i tym podobne. w plikach wykonywalnych.

Na komputerze Mac jest to używane ResEdit, program graficzny do - nagle - edycji zasobów.

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
ResEdit na oryginalnym komputerze Macintosh

W rezultacie stała się możliwa edycja ikon, pozycji menu, tłumaczeń itp. dość łatwe, ale nadal „podróżują” z aplikacjami.
W każdym razie to podejście miało dużą wadę: działało tylko na systemach plików Apple, co było jednym z powodów, dla których Apple porzucił „sekcję zasobów” po przejściu na Mac OS X.
W systemie Mac OS X firma Apple chciała rozwiązania niezależnego od systemu plików, dlatego przyjęła koncepcję pakietów (z NeXT), czyli katalogów, które menedżer plików traktuje jako „nieprzezroczyste obiekty”, podobnie jak pliki, a nie katalogi. Dowolny pakiet z aplikacją w formacie .app zawiera między innymi plik Info.plist (w jakimś odpowiedniku JSON lub YAML firmy Apple) zawierający metadane aplikacji.

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Klucze do pliku Info.plist z pakietu aplikacji Mac OS X.

Zasoby, takie jak ikony, pliki interfejsu użytkownika i inne, są przechowywane w pakiecie jako pliki. Koncepcja faktycznie wróciła do swoich korzeni w NeXT.

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Mathematica.app w NeXTSTEP 1.0 w 1989 r.: pojawia się jako katalog plików w terminalu, ale jako pojedynczy obiekt w graficznym menedżerze plików.

Wróćmy do BeOS-u, koncepcji, na których opiera się Haiku. Jego twórcy, przechodząc z PEF (PowerPC) na ELF (x86) (taki sam, jaki jest używany w systemie Linux), postanowili dodać sekcję zasobów na końcu plików ELF. Nie korzystał z własnej sekcji ELF, był po prostu dodawany na końcu pliku ELF. W wyniku programu strip i inni z binutils, nieświadomi tego, po prostu go odcięli. Dlatego dodając zasoby do pliku ELF w systemie BeOS, lepiej nie manipulować nim za pomocą narzędzi linuksowych.

Co się teraz dzieje z Haiku? W zasadzie mniej więcej to samo.

Teoretycznie możliwe byłoby umieszczenie zasobów w żądanej sekcji ELF. Według twórców na kanale #haiku na irc.freenode.net:

W przypadku ELF ta sekcja miałaby większy sens... Jedynym powodem, dla którego tego nie robimy, jest to, że tak zrobiliśmy w BeOS.
I nie ma sensu tego teraz zmieniać.

Управление ресурсами

Zasoby są zapisywane w ustrukturyzowanym formacie „zasobów”: zasadniczo jest to lista zasobów z rozmiarami, a następnie ich zawartością. Pamiętałem formacie ar.
Jak sprawdzić zasoby w Haiku? Czy istnieje coś takiego jak ResEdit?
Według dokumentacja:

Aby wyświetlić zasoby zawarte w pakiecie aplikacji, możesz przeciągnąć plik wykonywalny do programu, np Zasoby. Możesz także przejść do terminala i uruchomić polecenie listres имя_файла.

Resourcer jest dostępny w HaikuDepot, ale u mnie po prostu się zawiesza.

Jak zarządzać zasobami w plikach ELF? Za pomocą rsrc и rdef. rdef pliki są gromadzone w rsrc. Plik rdef jest przechowywany w formacie zwykłego tekstu, dzięki czemu praca z nim jest znacznie łatwiejsza. Format pliku rsrc dołączony na końcu pliku ELF. Spróbujmy zagrać:

~> rc -h
Haiku Resource Compiler 1.1To compile an rdef script into a resource file:
    rc [options] [-o <file>] <file>...To convert a resource file back into an rdef script:
    rc [options] [-o <file>] -d <file>...Options:
    -d --decompile       create an rdef script from a resource file
       --auto-names      construct resource names from ID symbols
    -h --help            show this message
    -I --include <dir>   add <dir> to the list of include paths
    -m --merge           do not erase existing contents of output file
    -o --output          specify output file name, default is out.xxx
    -q --quiet           do not display any error messages
    -V --version         show software version and license

Możesz skorzystać z programu xres do sprawdzania i kontroli:

/> xres
Usage: xres ( -h | --help )
       xres -l <file> ...
       xres <command> ...The first form prints this help text and exits.The second form lists the resources of all given files.The third form manipulates the resources of one or more files according to
the given commands.
(...)

OK, spróbujmy?

/> xres -l /Haiku/system/apps/WebPositive/Haiku/system/apps/WebPositive resources:type           ID        size  name
------ ----------- -----------  --------------------
'MIMS'           1          36  BEOS:APP_SIG
'APPF'           1           4  BEOS:APP_FLAGS
'MSGG'           1         421  BEOS:FILE_TYPES
'VICN'         101        7025  BEOS:ICON
'VICN'         201          91  kActionBack
'VICN'         202          91  kActionForward
'VICN'         203         300  kActionForward2
'VICN'         204         101  kActionStop
'VICN'         206         243  kActionGoStart
'MSGG'         205        1342  kActionGo
'APPV'           1         680  BEOS:APP_VERSION

Więcej o zasobach i formacie rdef Możesz czytać tutaj.

Standardowe typy zasobów

Chociaż w zasobach możesz umieścić wszystko, istnieje kilka zdefiniowanych typów standardowych:

  • app_signature: typ aplikacji MIME, do mapowania otwartych plików, uruchamiania, IPC itp.
  • app_name_catalog_entry: Ponieważ nazwa aplikacji jest zwykle w języku angielskim, możesz określić miejsca, w których znajdują się przetłumaczone nazwy, tak aby użytkownicy różnych języków mogli w razie potrzeby zobaczyć przetłumaczoną nazwę aplikacji.
  • app_version: dokładnie to, co myślałeś
  • app_flags: wskazuje registrar jak rozpatrzyć wniosek. Myślę, że kryje się za tym coś więcej, niż mogłoby się wydawać. Na przykład istnieje B_SINGLE_LAUNCH, co zmusza system do uruchomienia nowego procesu aplikacji za każdym razem, gdy użytkownik tego zażąda (ta sama zasada jest stosowana w przypadku większości aplikacji w systemie Linux). Jeść B_MULTIPLE_LAUNCH, powodując uruchomienie procesu każdy plik. Wreszcie jest B_EXCLUSIVE_LAUNCH, co wymusza na systemie uruchamianie tylko jednego procesu na raz, niezależnie od tego, jak często użytkownicy go uruchamiają (przykładowo tak działa Firefox na Linuksie; ten sam efekt można osiągnąć w aplikacjach Qt za pomocą funkcji Aplikacja QtSingle). Aplikacje z B_EXCLUSIVE_LAUNCH są powiadamiane, gdy użytkownik spróbuje je ponownie uruchomić: na przykład otrzymują ścieżkę do pliku, który użytkownik chce otworzyć za ich pomocą.
  • vector_icon: Ikona aplikacji wektorowej (BeOS nie miał ikon wektorowych, większość aplikacji zamiast tego miała dwie ikony rastrowe w plikach wykonywalnych).

Można oczywiście dodać zasoby o dowolnych identyfikatorach i typach, a następnie odczytać je w samej aplikacji lub innych aplikacjach za pomocą klasy BResources. Ale najpierw spójrzmy na fascynujący temat ikon.

Ikony wektorowe w stylu Haiku

Oczywiście nie tylko Haiku wybrało najlepszy format ikon; w tej części sytuacja ze środowiskami graficznymi Linux jest daleka od ideału:

me@host:~$ ls /usr/share/icons/hicolor/
128x128  256x256  512x512           index.theme
160x160  28x28    64x64             scalable
16x16    32x32    72x72             symbolic
192x192  36x36    8x8
22x22    42x42    96x96
24x24    48x48    icon-theme.cache

Patrząc na to już można poczuć co to za kawałek.

Oczywiście istnieje skalowalny, który zawiera, jak można zrozumieć, ikony wektorowe. Dlaczego więc jest coś jeszcze? Ponieważ wynik rysowania grafiki wektorowej w małych rozmiarach może być odbiegający od ideału. Chciałbym mieć różne opcje zoptymalizowane dla różnych rozmiarów. W środowiskach graficznych systemu Linux osiąga się to poprzez rozproszenie ikon o różnych rozmiarach w całym systemie plików.

me@host:~$ find /usr/share/icons/ -name 'firefox.*'
/usr/share/icons/HighContrast/16x16/apps/firefox.png
/usr/share/icons/HighContrast/22x22/apps/firefox.png
/usr/share/icons/HighContrast/24x24/apps/firefox.png
/usr/share/icons/HighContrast/256x256/apps/firefox.png
/usr/share/icons/HighContrast/32x32/apps/firefox.png
/usr/share/icons/HighContrast/48x48/apps/firefox.png
/usr/share/icons/elementary-xfce/apps/128/firefox.png
/usr/share/icons/elementary-xfce/apps/16/firefox.png
/usr/share/icons/elementary-xfce/apps/22/firefox.png
/usr/share/icons/elementary-xfce/apps/24/firefox.png
/usr/share/icons/elementary-xfce/apps/32/firefox.png
/usr/share/icons/elementary-xfce/apps/48/firefox.png
/usr/share/icons/elementary-xfce/apps/64/firefox.png
/usr/share/icons/elementary-xfce/apps/96/firefox.png
/usr/share/icons/hicolor/128x128/apps/firefox.png

Uwaga: nie ma koncepcji różnych wersji Firefoksa. Dlatego nie można sprawnie poradzić sobie z sytuacją posiadania wielu wersji aplikacji w systemie.

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Różne ikony Firefoksa w różnych wersjach. Obecnie nie da się sobie z tym poradzić w Linuksie bez różnych kul.

Mac OS X radzi sobie z tym nieco subtelniej:

Mac:~ me$ find /Applications/Firefox.app | grep icns
/Applications/Firefox.app/Contents/MacOS/crashreporter.app
/Contents/Resources/crashreporter.icns
/Applications/Firefox.app/Contents/MacOS/updater.app/Contents/Resources/updater.icns
/Applications/Firefox.app/Contents/Resources/document.icns
/Applications/Firefox.app/Contents/Resources/firefox.icns

Widać, że jest jeden plik firefox.icns w paczce Firefox.app, zawierający wszystkie rozmiary, dzięki czemu różne wersje tej samej aplikacji mają różne ikony.
Dużo lepiej! Ikony podróżują z aplikacją, wszystkie zasoby znajdują się w jednym pliku.

Wróćmy do Haiku. Niesamowite rozwiązanie, bez wyjątków. Według dokumentacja:

Opracowano specjalny format HVIF, wysoce zoptymalizowany pod kątem małych rozmiarów i szybkiego renderowania. Dlatego nasze ikony są w większości znacznie mniejsze niż w rastrze lub w powszechnie używanym formacie SVG.

I nadal są zoptymalizowane:

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Rozmiary ikon w HVIF w porównaniu do innych formatów.

Różnica jest o rząd wielkości!

Ale magia się tutaj nie kończy. Ten sam HVIF może pokazywać różne poziomy szczegółowości w zależności od wyświetlanego rozmiaru, mimo że jest to format wektorowy.

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Różne poziomy szczegółowości (LOD) w zależności od rozmiaru renderowania

A teraz o wadach: nie można wziąć SVG, wrzucić do ImageMagick i zakończyć sprawę; trzeba przejść kilka cykli, aby stworzyć ikonę w formacie HVIF. Tutaj wyjaśnienia. Jednakże IconOMatic może importować pliki SVG w sposób dość niedoskonały; około 90% szczegółów SVG jest importowanych z pewnym prawdopodobieństwem, pozostałe 10% będzie musiało zostać skonfigurowane i zmienione ręcznie. Przeczytaj więcej o tym, jak HVIF robi swoją magię można na blogu Lea Ganson

Dodanie ikony do aplikacji

Teraz mogę dodać ikonę do utworzonego pakietu ostatni raz, biorąc pod uwagę wszystkie otrzymane informacje.
Cóż, ponieważ nie mam teraz ochoty rysować własnej ikony dla mojej aplikacji QtQuickApp „Hello, World”, wyciągam ją z Qt Creator.

/Haiku/home> xres /Haiku/system/apps/QtCreator/bin/Qt Creator  -o /Haiku/home/QtQuickApp/QtQuickApp  -a VICN:101:BEOS:ICON /Haiku/system/apps/QtCreator/bin/Qt Creator

Sprawdźmy, czy ikona została skopiowana:

/Haiku/home> xres -l /Haiku/home/QtQuickApp/QtQuickApp/Haiku/home/QtQuickApp/QtQuickApp
resources:type           ID        size  name
------ ----------- -----------  --------------------
'VICN'         101      152238  BEOS:ICON

Wygląda dobrze, ale dlaczego po skopiowaniu nowej ikony nie pojawia się?

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Skopiowany VICN:101:BEOS:ICONs nie jest jeszcze używany jako ikona aplikacji w menedżerze plików

Co mnie ominęło?

Komentarz dewelopera:

Musimy utworzyć plik rdef ze wszystkimi zasobami, a następnie wykonaj polecenie rc имя.rdef, spowoduje to utworzenie pliku .rsrc. Następnie musisz uruchomić polecenie resattr -o имя_бинарника имя.rsrc. Takich poleceń używam przynajmniej do dodawania ikon do moich skryptów.

Cóż, chciałem stworzyć zasób, a nie atrybut. Jestem bardzo zmieszany.

Inteligentne buforowanie przy użyciu systemu plików

Otwieranie i odczytywanie atrybutów ELF jest powolne. Jak pisałem powyżej ikona jest zapisana jako zasób w samym pliku. Ta metoda jest bardziej niezawodna i pozwala przetrwać kopiowanie do innego systemu plików. Jednakże jest on następnie kopiowany na przykład do atrybutu systemu plików BEOS:ICON. Działa to tylko w niektórych systemach plików, takich jak BFS. Z tego rozszerzonego atrybutu odczytywane są ikony wyświetlane przez system (w Trackerze i Deskbarze), ponieważ takie rozwiązanie działa szybko. W niektórych miejscach (gdzie szybkość nie jest istotna, np. typowe okno „O programie”) system otrzymuje ikonę bezpośrednio z zasobu w pliku. Ale to nie koniec. Pamiętaj, że na komputerze Mac użytkownicy mogą zastępować ikony aplikacji, katalogów, dokumentów własnymi, ponieważ na komputerze Mac można na przykład wykonywać te „ważne” rzeczy zastąpienie nowej ikony Slacka poprzednią. W przypadku Haiku powinieneś myśleć o zasobie (w pliku) jako o oryginalnej ikonie dołączonej do aplikacji, a o atrybucie (w systemie plików BFS) jako o czymś, co pozwala użytkownikowi na dowolne wprowadzanie zmian (jednak wskazówka: GUI do wstawiania niestandardowej ikony na ikonę jest opcjonalne).nie jest jeszcze domyślnie zaimplementowane).

Sprawdzanie atrybutów systemu plików

Z resaddr Możliwe jest sprawdzenie i ustawienie atrybutów systemu plików.

/> resattr
Usage: resattr [ <options> ] -o <outFile> [ <inFile> ... ]

Reads resources from zero or more input files and adds them as attributes
to the specified output file, or (in reverse mode) reads attributes from
zero or more input files and adds them as resources to the specified output
file. If not existent the output file is created as an empty file.
(...)

Zasadniczo jest to „klej”, który wykonuje konwersję między (niezawodnymi) zasobami i (szybkimi) atrybutami systemu plików. A ponieważ system oczekuje na otrzymanie zasobów i kopiuje automatycznie, nie będę się już tym martwić.

Magia pakietów hpkg

Obecnie (najczęściej) pakiety służą do pobierania programów na Haiku .hpkg. Nie daj się zwieść prostej nazwie: format .hpkg działa zupełnie inaczej niż inne formaty o podobnych nazwach, z którymi się spotkałeś, ma prawdziwe supermoce.

W przypadku tradycyjnych formatów pakietów przez długi czas denerwowałem się tym faktem: pobierasz jedną rzecz (pakiet), a w systemie instalowana jest inna (pliki znajdujące się w pakiecie). Zarządzanie plikami (na przykład ich usuwanie) jest dość trudne podczas instalowania pakietu w tradycyjny sposób. A wszystko ze względu na zawartość opakowania rozproszone po całym systemie plików, łącznie z miejscami, w których przeciętny użytkownik może nie mieć dostępu do zapisu. Daje to początek całej klasie programów - menedżerowie pakietów. Jednak przeniesienie już zainstalowanego oprogramowania na przykład na inny komputer, dysk wymienny lub serwer plików staje się jeszcze trudniejsze, jeśli nie całkowicie niemożliwe. W typowym systemie opartym na Linuksie może z łatwością znajdować się od kilkuset tysięcy do milionów pojedynczych plików. Nie trzeba dodawać, że jest to zarówno delikatne, jak i powolne, na przykład podczas pierwszej instalacji systemu, podczas instalowania, aktualizowania i odinstalowywania zwykłych pakietów oraz podczas kopiowania woluminu rozruchowego (partycji głównej) na inny nośnik.

Pracuję nad projektem AppImage, częściowym wsparciem dla aplikacji dla użytkowników końcowych. Jest to format dystrybucji oprogramowania, który gromadzi aplikację i wszystkie jej zależności w jednym obrazie systemu plików, który jest montowany podczas uruchamiania aplikacji. Znacząco upraszcza sprawę, ponieważ ten sam ImageMagick nagle zamienia się w pojedynczy plik, zarządzany w menedżerze plików przez zwykłych śmiertelników. Proponowana metoda działa tylko w przypadku oprogramowania, co odzwierciedla nazwa projektu, ale ma także swój własny zestaw problemów, ponieważ osoby zaangażowane w dostarczanie oprogramowania dla systemu Linux zawsze wskazują na mnie strzałkę.

Wróćmy do Haiku. Czy udało się znaleźć optymalną równowagę pomiędzy tradycyjnymi systemami pakietów a dostarczaniem oprogramowania opartego na obrazach? Jej paczki .hpkg faktycznie skompresowane obrazy systemu plików. Podczas uruchamiania systemu jądro montuje wszystkie zainstalowane i aktywne pakiety, wyświetlając w przybliżeniu następujące komunikaty jądra:

KERN: package_daemon [16042853:   924] active package: "gawk-4.2.1-1-x86_64.hpkg"
KERN: package_daemon [16043023:   924] active package: "ca_root_certificates_java-2019_01_23-1-any.hpkg"
KERN: package_daemon [16043232:   924] active package: "python-2.7.16-3-x86_64.hpkg"
KERN: package_daemon [16043405:   924] active package: "openjdk12_default-12.0.1.12-1-x86_64.hpkg"
KERN: package_daemon [16043611:   924] active package: "llvm_libs-5.0.0-3-x86_64.hpkg"

Super, tak? Trzymaj się, będzie jeszcze chłodniej!

Istnieje bardzo specjalny pakiet:

KERN: package_daemon [16040020:   924] active package: "haiku-r1~beta1_hrev53242-1-x86_64.hpkg"

Zawiera bardzo minimalistyczny system operacyjny, łącznie z jądrem. Wierzcie lub nie, ale nawet samo jądro nie jest usuwane z woluminu rozruchowego (partycji root), ale jest ostrożnie ładowane na swoje miejsce z pakietu .hpkg. Wow! Wspomniałem już, że myślę, że część ogólnego wyrafinowania i spójności Haiku wynika z faktu, że cały system, od jądra i podstawowej przestrzeni użytkownika po zarządzanie pakietami i infrastrukturę wykonawczą, jest rozwijany wspólnie przez jeden zespół. Wyobraź sobie, ile różnych grup i zespołów potrzeba, aby uruchomić coś takiego w systemie Linux [Wyobrażam sobie projekt PuppyLinux – ok. tłumacz]. Następnie wyobraź sobie, ile czasu zajmie przyjęcie tego podejścia w dystrybucjach. Mówią: weź prosty problem, podziel go pomiędzy różnych wykonawców, a stanie się tak skomplikowany, że nie będzie już możliwe jego rozwiązanie. Haiku w tym przypadku otworzyło mi oczy. Myślę, że dokładnie to samo dzieje się teraz w Linuksie (Linux w tym przypadku to zbiorcze określenie stosu Linux/GNU/dpkg/apt/systemd/Xorg/dbus/Gtk/GNOME/XDG/Ubuntu).

Przywracanie systemu za pomocą hpkg

Jak często zdarza się sytuacja, że ​​aktualizacja się udała, a potem okazuje się, że coś nie działa tak, jak powinno? Jeśli korzystasz z konwencjonalnych menedżerów pakietów, trudno jest przywrócić stan systemu do punktu w czasie sprzed zainstalowania nowych pakietów (na przykład w przypadku, gdyby coś poszło nie tak). Niektóre systemy oferują obejścia w postaci migawek systemu plików, ale są one dość kłopotliwe i nie są stosowane we wszystkich systemach. Haiku rozwiązuje ten problem za pomocą pakietów .hpkg. Ilekroć pakiety ulegają zmianie w systemie, stare pakiety nie są usuwane, ale są przechowywane w systemie w podkatalogach, np /Haiku/system/packages/administrative/state-<...>/ stale. Niedokończone operacje przechowują swoje dane w podkatalogach /Haiku/system/packages/administrative/transaction-<...>/.

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Treść /Haiku/system/packages/administrative. Katalogi „stan...” zawierają pliki tekstowe z nazwami aktywnych pakietów, natomiast katalogi „transakcja...” zawierają same pakiety.

„Stary stan aktywny”, tj. lista .hpkg pakiety aktywne przed zmianami zapisywane są po każdej operacji w menadżerze plików w pliku tekstowym /Haiku/system/packages/administrative/state-<...>/activated-packages. W podobny sposób nowy „stan aktywny” zapisywany jest w pliku tekstowym /Haiku/system/packages/administrative/activated-packages.

katalog /Haiku/system/packages/administrative/state-<...>/ zawiera jedynie plik tekstowy z listą aktywnych pakietów tego stanu (w przypadku instalacji pakietów bez usuwania), a jeśli pakiety zostały usunięte lub zaktualizowane - w katalogu stanu znajdują się stare wersje pakietów.

Podczas uruchamiania systemu na podstawie listy pakietów podejmowana jest decyzja o aktywacji (zamontowaniu) pakietów. To takie proste! Jeśli coś pójdzie nie tak podczas pobierania, możesz polecić menedżerowi pobierania, aby użył innej, starszej listy. Problem rozwiązany!

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Program do pobierania Haiku. Każdy punkt wejścia wyświetla odpowiedni „stan aktywny”

Podoba mi się podejście polegające na posiadaniu prostych plików tekstowych jako listy „stanu aktywnego” z łatwymi do zrozumienia nazwami .hpkg. Stanowi to wyraźny kontrast w porównaniu z budową dla maszyn, a nie dla ludzi. garść z OSTree lub Flatpak w systemie plików (na tym samym poziomie co Microsoft GUID).

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Lista aktywnych pakietów dla każdego punktu w czasie

Dane konfiguracyjne

Podobno w katalogu /Haiku/system/packages/administrative/writable-files zawiera pliki konfiguracyjne pakietów, ale można je zapisywać. W końcu, jak pamiętasz, .hpkg zamontowany w trybie tylko do odczytu. Dlatego te pliki muszą zostać skopiowane z pakietów przed zapisaniem. Ma znaczenie.

Integracja GUI dla systemu .hpkg

Zobaczmy teraz, jak wyglądają te błyszczące torby .hpkg radzą sobie z integracją ze środowiskiem pracy użytkownika (UX). W końcu Haiku jest przeznaczone do użytku osobistego. Osobiście stawiam poprzeczkę wysoko, porównując doświadczenie użytkownika z pakietami .app na komputerze Macintosh z tym samym doświadczeniem na .hpkg. Nie będę nawet porównywał sytuacji ze środowiskami pracy na Linuksie, bo jest absolutnie okropnie w porównaniu do innych.

Przychodzą mi na myśl następujące scenariusze:

  • Chcę zobaczyć zawartość paczki .hpkg
  • Chcę zainstalować pakiet
  • Chcę usunąć paczkę
  • Chcę usunąć coś, co przyszło do systemu jako część pakietu
  • Chcę skopiować coś, co przyszło do systemu jako część pakietu
  • Chcę pobrać wszystkie zależności pakietu, który może nie być częścią każdej instalacji Haiku (na przykład mam fizycznie odizolowaną maszynę bez dostępu do Internetu).
  • Chcę przenieść moje pakiety (lub ich część) oddzielnie do innej lokalizacji, oddzielnej od woluminu startowego (partycji root) (ponieważ np. nie mam na nim wystarczającej ilości miejsca).

Powinno to obejmować większość najważniejszych spraw związanych z moją codzienną pracą. Cóż, zaczynajmy.

Sprawdzanie zawartości opakowania

Na Macu Po prostu klikam pakiet prawym przyciskiem myszy, aby go otworzyć i wyświetlić zawartość w Finderze. Przecież w rzeczywistości jest to tylko ukryty katalog! (Wiem, że są pakiety .pkg dla części systemu niebędącej aplikacjami, ale zwykli użytkownicy najczęściej nie mają z nimi interakcji).

Na Haiku Klikam paczkę prawym przyciskiem myszy, a następnie klikam „Zawartość”, aby zobaczyć, co jest w środku. Ale oto tylko lista plików bez możliwości ich otwarcia poprzez dwukrotne kliknięcie.
Byłoby znacznie lepiej, gdyby istniał sposób (tymczasowego) zamontowania pakietu .hpkg można przeglądać za pomocą menedżera plików, a użytkownik nie będzie musiał martwić się szczegółami implementacji. (Nawiasem mówiąc, możesz otworzyć .hpkg pakować w Expander, który może je rozpakować jak każde inne archiwum).

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Interfejs HaikuDepot umożliwia przeglądanie listy plików pakietów, ale nie ma możliwości przejrzenia zawartości, na przykład poprzez dwukrotne kliknięcie pliku README.md

W tej kategorii wygrywa komputer Mac, ale dodanie żądanej funkcjonalności HaikuDepot nie powinno być zbyt trudne.

Instalowanie pakietu poprzez GUI

Na Macu, większość obrazów dysków .dmg zawierają pakiety .app. Kliknij dwukrotnie obraz dysku, a następnie skopiuj pakiet, na przykład przeciągając go do /Applications w Finderze. Dla mnie jest to oczywiste, ale słyszałem, że niektórzy nowicjusze mogą nie być w stanie sobie z tym poradzić. Domyślnie Apple „sugeruje” katalog ogólnosystemowy /Applications (na NeXT było to zarówno sieciowe, jak i indywidualne), ale możesz łatwo umieścić swoje aplikacje na serwerze plików lub w podkatalogu $HOME/Applications, jeśli tak lubisz.

Na Haiku, kliknij dwukrotnie pakiet, a następnie kliknij „Zainstaluj”, to nie może być prostsze. Zastanawiam się, co się stanie, jeśli pakiet będzie miał zależności dostępne w HaikuPorts, ale jeszcze nie zainstalowane. W systemie Linux naprawdę nie wiedzą, co zrobić w tej sytuacji, ale rozwiązanie jest oczywiste - zapytaj użytkownika, czy musi pobrać i zainstalować zależności. Dokładnie to, co robi Haiku.

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Pobrałem ręcznie pakiet „sanity” i kliknąłem go, menedżer pakietów wie, skąd pobrać jego zależności (zakładając, że repozytoria są już zarejestrowane w systemie). Nie każda dystrybucja Linuksa może to zrobić.

Innym sposobem jest użycie menedżera plików, po prostu przeciągnij i upuść .hpkg paczka lub w /Haiku/system/packages (domyślnie w przypadku instalacji ogólnosystemowej) lub w /Haiku/home/config/packages (do instalacji indywidualnej; niedostępne po dwukrotnym kliknięciu - nadal denerwuje mnie słowo „config” w tym miejscu, które dla mnie w tym przypadku jest równoznaczne z „ustawieniami”). A koncepcja wielu użytkowników nie jest jeszcze dostępna nawet dla Haiku (prawdopodobnie dlatego jest taka prosta – nie wiem, może możliwości wielu użytkowników niepotrzebnie skomplikują sytuację w środowisku stacjonarnym).

Haiku wygrywa w tej kategorii, ponieważ potrafi współpracować nie tylko z aplikacjami, ale także z programami systemowymi.

Usuwanie pakietu z GUI

Na Macu, musisz przeciągnąć ikonę aplikacji do kosza i to wszystko. Łatwo!

Na Haiku, po pierwsze musisz znaleźć miejsce w systemie, w którym znajduje się pakiet, ponieważ rzadko instalujesz go we właściwym miejscu (system robi wszystko). Zwykle trzeba zajrzeć /Haiku/system/packages (z domyślną instalacją obejmującą cały system) lub w /Haiku/home/config/packages (Czy wspomniałem, że „config” jest błędną nazwą?). Następnie aplikację po prostu przeciąga się do kosza i gotowe.
Łatwo! Jednak nie powiedziałbym tego. Oto, co się naprawdę dzieje:

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Oto, co się stanie, jeśli przeciągniesz aplikację do kosza /Haiku/system/packages

Właśnie próbowałem przenieść moją wczorajszą aplikację „Hello World” z QtQuickApp do kosza. Nie próbowałem przenosić katalogu systemowego, a ponieważ wszystkie pakiety są zainstalowane w katalogu systemowym, usunięcie pakietu nie jest możliwe .hpkg bez zmian "to zawiera". Zwykły użytkownik przestraszyłby się i wcisnął przypisany mu domyślnie przycisk „Anuluj”.

Wyjaśnia Pan. plusk:

Ten post ma ponad 10 lat. Najprawdopodobniej musimy to skonfigurować tak, aby ostrzeżenie pojawiało się tylko wtedy, gdy sam pakiet zostanie przeniesiony. Zwykli użytkownicy i tak nie muszą tego robić.

OK, może powinienem to zrobić za pomocą HaikuDepot? Klikam dwukrotnie na paczkę /Haiku/system/packages, czekając, aż pojawi się przycisk „Odinstaluj”. Nie, jest (tylko) „Zainstaluj”. „Odinstaluj”, gdzie jesteś?

Dla zabawy próbowałem zobaczyć, co by się stało, gdybym kliknął „Zainstaluj” na już zainstalowanym pakiecie. Okazuje się tak:

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Dzieje się tak, jeśli spróbujesz zainstalować już zainstalowany pakiet.

Pojawia się następny:

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Jeśli w poprzednim oknie klikniesz „Zastosuj zmiany”, będzie to wyglądać następująco

Zakładam, że jest to błąd oprogramowania, link do aplikacji już tam jest. [autor nie podał linku – ok. tłumacz]

Szybkie rozwiązanie: dodaj przycisk „Odinstaluj”, jeśli pakiet jest już obecny /Haiku/system/packages, lub w /Haiku/home/config/packages.

Przeglądając listę pakietów zainstalowanych w HaikuDepot, widzę mój pakiet na liście i mogę go usunąć.

W tej kategorii wygrywa Mac. Ale mogę sobie wyobrazić, że przy odpowiedniej konfiguracji wrażenia użytkownika na Haiku będą lepsze niż na Macu. (Jeden z programistów ocenił to w ten sposób: „Mniej niż godzina na dodanie określonej funkcjonalności do HaikuDepot, jeśli znasz trochę C++”, są jacyś ochotnicy?)

Usuwanie czegoś z paczki

Spróbujmy usunąć samą aplikację, a nie pakiet .hpkg, z którego pochodzi (wątpię, aby dla „zwykłych śmiertelników” była jakakolwiek różnica).

Na Macu, użytkownik zazwyczaj pracuje z plikiem .dmgskąd pochodzi pakiet aplikacji .app. Zwykle obrazy .dmg gromadzone są w katalogu pobierania, do którego użytkownik kopiuje pakiety /Applications. Uważa się, że wielu użytkowników samych nie wie, co robi, hipotezę tę potwierdza były pracownik Apple. (Jedna z rzeczy, których nie lubię na Macu. I na przykład w AppImage nie ma różnicy między aplikacją a pakietem, w którym się znajdowała. Przeciągnij ikonę do kosza = to wszystko. To proste!)

Na Haiku, istnieje również podział pomiędzy apps/ и packages/, więc wątpię, czy stało się to jaśniejsze dla użytkowników. Ale co się stanie, jeśli przeciągniesz aplikację z apps/ Dodaj do koszyka:

Mój szósty dzień z Haiku: pod maską zasobów, ikon i pakietów
Tak się dzieje, gdy próbujesz usunąć aplikację pobraną z pliku .hpkg

Technicznie jest to poprawne (w końcu aplikacja jest hostowana na systemie plików tylko do odczytu), ale dla użytkownika nie jest to szczególnie przydatne.

Szybkie rozwiązanie: zamiast tego zasugeruj użycie GUI do usunięcia .hpkg

Dla zabawy próbowałem zduplikować aplikację, naciskając Alt+D. Otrzymałem komunikat „Nie można przenieść ani skopiować obiektów na woluminie tylko do odczytu”. A wszystko dlatego /system (Oprócz /system/packages и /system/settings) to punkt podłączenia packagefs (pamiętaj, jak to wygląda na wyjściu df?). Niestety wynik polecenia mount nie wyjaśnia sytuacji (co zostało powiedziane w jednym z poprzednich artykułów), mountvolume nie pokazuje tego, czego szukasz (najwyraźniej pakiety montowane za pomocą pętli .hpkg nie są uważane za „woluminy”), zapomniałem też o alternatywnych poleceniach.

W tej kategorii nie zwyciężył nikt poza AppImage (choć szczerze mówiąc, jest to opinia stronnicza). Można jednak sobie wyobrazić, że po ulepszeniach wrażenia użytkownika na Haiku będą lepsze niż na komputerze Mac.

Uwaga: musisz dowiedzieć się, czym jest „tom” w odniesieniu do „sekcji”. Jest to prawdopodobnie podobne do związku „folderu” z „katalogiem”: większość katalogów pojawia się w menedżerze plików jako foldery, ale nie wszystkie (na przykład pakiety traktowane jako pliki). Czy tego rodzaju pokazy czynią mnie oficjalnym kujonem?

Kopiowanie zawartości pakietu do innego systemu

Na Macu, głupio przeciągam paczkę .app, a ponieważ zależności znajdują się wewnątrz pakietu, poruszają się razem.

Na Haiku, przeciągam aplikację, ale zależności nie są w ogóle przetwarzane.

Szybkie rozwiązanie: Zamiast tego zasugerujmy przeciągnięcie całego pakietu `.hpkg wraz z wszelkimi zależnościami, jeśli istnieją.

W tej kategorii zdecydowanie wygrywa Mac. Przynajmniej dla mnie, miłośnika ich paradygmatu. Powinienem skopiować to do Haiku .hpkg zamiast aplikacji, ale system mi tego nie oferuje...

Pobierz pakiet ze wszystkimi jego zależnościami

Nie każda maszyna jest podłączona do sieci przez cały czas. Wręcz przeciwnie, niektóre maszyny (tak, patrzę na ciebie, nowoczesne Windows, Mac i Linux) o tym zapominają. Ważne jest dla mnie to, że mogę pójść np. do kawiarenki internetowej, pobrać oprogramowanie na dysk wymienny, włożyć ten dysk do domowego komputera i mieć pewność, że wszystko będzie działać [ryzykowne gościu, robi to na Windowsie... - około. tłumacz].

W rezultacie nieco częściej niż zwykle trafiam na niezaspokojone zależności w systemach Windows i Linux.

Na Macu jest to zwykle jeden plik, wystarczy go pobrać .dmg. Najczęściej nie ma on żadnych innych zależności poza tymi, które domyślnie zapewnia sam MacOS. Wyjątkiem są złożone aplikacje, które wymagają odpowiedniego środowiska wykonawczego, np. Java.

Na Haiku pobierz pakiet .hpkg na przykład ta sama aplikacja w Javie może nie wystarczyć, ponieważ Java może być dostępna na maszynie docelowej lub nie. Czy istnieje sposób na pobranie wszystkich zależności dla danego pakietu .hpkg, inne niż te, które są domyślnie instalowane w Haiku i dlatego powinny znajdować się w każdym systemie Haiku?

Mac wygrywa w tej kategorii z niewielką przewagą.

Komentarze pana. plusk wody:

Aby napisać program gromadzący wszystkie zależności aplikacji w postaci zestawu pakietów .hpkg dla kogoś zaznajomionego z wewnętrznym funkcjonowaniem Haiku wystarczy około 15 minut. Dodanie wsparcia dla tego nie jest takie trudne, jeśli istnieje realna potrzeba. Ale dla mnie jest to rzadka sytuacja.

Wstrzymajmy oddech do następnego artykułu z tej serii.

Przenoszenie paczek w oddzielną lokalizację

Tak jak pisałem wcześniej chcę umieścić swoje paczki .hpkg (cóż, lub ich część) w specjalnym miejscu, oddzielnym od zwykłego umieszczenia na woluminie rozruchowym (partycja główna). W typowym (nie tak teoretycznym) przypadku powodem tego jest to, że ciągle brakuje mi wolnego miejsca na moich (wbudowanych) dyskach, niezależnie od ich wielkości. Zwykle podłączam dyski zewnętrzne lub udziały sieciowe, w których znajdują się moje aplikacje.

Na Macu Właśnie przenoszę paczki .app na dysk wymienny lub katalog sieciowy w Finderze i to wszystko. Nadal mogę kliknąć dwukrotnie, aby otworzyć aplikację tak, jak zwykle z woluminu rozruchowego. Tylko!

Na Haiku, jak mi powiedziano, można to osiągnąć, przesuwając plik my .hpkg pakiety na dysk wymienny lub do katalogu sieciowego, ale wtedy musisz użyć nieudokumentowanych poleceń w konsoli, aby zamontować je w systemie. Nie wiem, jak to zrobić, używając samego GUI.

W tej kategorii wygrywa Mac.

Według pana. plusk wody:

Jest to optymalizacja oparta na normalnym użytkowaniu. Jeśli będzie zapotrzebowanie ze strony więcej niż jednego użytkownika, zrealizujemy je. W każdym przypadku istnieje możliwość wdrożenia przez stronę trzecią.

Porozmawiamy o tym w następnym artykule.

A skoro mowa o katalogach sieciowych, byłoby wspaniale (przypuszczam, że w sieci LAN) mieć proste, możliwe do wykrycia aplikacje działające w całej sieci (takie jak Zeroconf), które można skopiować na komputer lokalny lub uruchomić bezpośrednio z sieci lokalnej. Oczywiście programiści mają możliwość rezygnacji za pośrednictwem app_flags.

Raport końcowy dotyczący integracji systemu hpkg z GUI

Myślę, że przede wszystkim ze względu na względną nowość integracji .hpkg GUI nadal pozostawia wiele do życzenia. Tak czy inaczej, jest kilka rzeczy, które można poprawić pod względem UX...

Jeszcze jedno: Kraina debugowania jądra

Byłoby wspaniale móc na przykład wprowadzać polecenia podczas paniki jądra syslog | grep usb. Cóż, na Haiku jest to możliwe dzięki Kernel Debug Land. Jak możesz zobaczyć tę magię w akcji, jeśli wszystko działa tak, jak powinno, bez wpadania w panikę jądra? Łatwe, naciskając Alt+PrintScn+D (mnemonik debugowania). Od razu sobie przypominam Klucz programisty, co umożliwiło programistom oryginalnych komputerów Macintosh wejście do debugera (oczywiście jeśli był zainstalowany).

wniosek

Zaczynam rozumieć, że wyrafinowanie systemu Haiku wynika z faktu, że prace wykonuje jeden mały zespół, skupiający się na środowisku pracy, z dostępnymi wszystkimi warstwami systemu.
Ostry kontrast ze światem Linux/GNU/dpkg/apt/systemd/Xorg/dbus/Gtk/GNOME/XDG/Ubuntu, gdzie wszystko jest rozbite na małe kawałki do tego stopnia, że ​​abstrakcja siedzi na abstrakcji i jeździ o kulach.
Poznaliśmy także sposób działania systemu .hpkg łączy najlepsze praktyki tradycyjnych menedżerów pakietów, Snappy, Flatpak, AppImage, a nawet btrfs, i łączy je z podejściem „po prostu działa” komputerów Mac.

To było tak, jakby coś „przełączyło się” w mojej głowie i zrozumiałem, jak działa system .hpkg wie, jak się odsunąć, po prostu na nią patrząc. Ale to nie ja, ale piękno i prostota systemu. Wiele z nich jest inspirowanych duchem oryginalnego komputera Mac.

Tak, przeglądanie w przeglądarce może być szarpane i działać jak ślimak, może brakować aplikacji (bez Gtk, Electron - twórcy doszli do wniosku, że nie radzą sobie z wyrafinowaniem), może w ogóle nie działać akceleracja wideo i 3D, ale i tak podoba mi się ten system. W końcu te rzeczy można naprawić i prędzej czy później się pojawią. To tylko kwestia czasu i może trochę zaczerwienienia oka.

Nie mogę zaoferować pomocy, ale myślę, że od teraz to się zacznie rok Haiku na komputerze.

Losowe problemy

Może są już prośby, czy powinienem je otworzyć?

  • BeScreenCapture powinien mieć możliwość eksportowania do formatu GIF, podobnie jak Peek. Można to zrobić za pomocą ffmpeg, dostępnego już dla Haiku. Podanie.
  • Oprogramowanie do zrzutów ekranu nie przechwytuje okna modalnego, zamiast tego przechwytuje cały ekran
  • Nie można przycinać zrzutów ekranu za pomocą narzędzia do przycinania WonderBrush, a następnie zapisywać wynik w pliku
  • Niezbyt podoba mi się kursor w dłoni w Haiku, ale myślę, że ma to związek z ciepłym, nostalgicznym uczuciem. Jest to szczególnie denerwujące podczas korzystania z narzędzia do przycinania w Krita, ponieważ powoduje niedokładne przycinanie (zobacz zrzuty ekranu modalnych okien dialogowych w tym artykule). Kursor krzyżowy byłby cudowny. Podanie.

Spróbuj sam! W końcu projekt Haiku udostępnia generowane obrazy do rozruchu z DVD lub USB codziennie. Aby zainstalować, wystarczy pobrać obraz i zapisać go na dysku flash za pomocą Akwaforcista

Czy masz jakieś pytania? Zapraszamy na zajęcia rosyjskojęzyczne kanał telegramu.

Przegląd błędów: Jak strzelić sobie w stopę w C i C++. Zbiór przepisów Haiku OS

Od autor tłumaczenie: to szósty artykuł z serii o Haiku.

Lista artykułów: pierwszy Drugi trzeci Po czwarte Po piąte

Źródło: www.habr.com

Dodaj komentarz