Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven

TL;DR: Haiku — ett operativsystem speciellt utvecklat för PC, vilket ger det flera knep som gör dess arbetsmiljö mycket bĂ€ttre Ă€n andra. Men hur fungerar det?

Nyligen Jag upptÀckte Haiku, ett ovÀntat bra system. Jag Àr fortfarande förvÄnad över hur smidigt det fungerar, sÀrskilt jÀmfört med arbetsmiljöer pÄ Linux. Idag ska jag titta under huven. DÀr det Àr nödvÀndigt för en djupare förstÄelse kommer jag att göra jÀmförelser med den ursprungliga Macintosh, Mac OS X och Linux-arbetsmiljöer (standard XDG frÄn freedesktop.org).

Resurser i ELF-filer

IgÄr fick jag veta att IconOMatic kan spara ikoner i rdef-resurser i ELF-körbara filer. Idag vill jag se hur det egentligen fungerar.

Resurser? Citat frÄn Bruce Horn, den ursprungliga skaparen av Macintosh Finder och "fadern" till Macintosh Resource Manager:

Jag oroar mig för det styva sĂ€ttet att skriva kod pĂ„. För mig Ă€r sjĂ€lva idĂ©n om en applikation fryst i kod, utan möjlighet att förĂ€ndra nĂ„got dynamiskt — en avskyvĂ€rd galenskap. Det bör finnas en möjlighet att Ă€ndra sĂ„ mycket som möjligt vid körningstid. Naturligtvis kan sjĂ€lva koden för applikationen inte Ă€ndras, men visst gĂ„r det att förĂ€ndra nĂ„got utan att recompilera koden?

PÄ den ursprungliga Macintosh gjorde man sÄ att dessa filer hade en "datasektion" och en "resurssektion", vilket oerhört underlÀttade lagring av olika saker, till exempel ikoner, översÀttningar och sÄ vidare i körbara filer.

PĂ„ Mac anvĂ€nds detta ResEdit, ett grafiskt program för — överraskande nog — att redigera resurser.

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
ResEdit pÄ den ursprungliga Macintosh

Som ett resultat blev det möjligt att redigera ikoner, menyval, översÀttningar och sÄ vidare ganska enkelt, men de "reser" ÀndÄ tillsammans med applikationerna.
Hur som helst hade detta tillvÀgagÄngssÀtt en stor nackdel: det fungerade endast pÄ Apples filsystem, vilket blev en av anledningarna till att Apple övergav "resurssektionen" nÀr de övergick till Mac OS X.
PÄ Mac OS X ville Apple ha en lösning oberoende av filsystemet, sÄ de anvÀnde konceptet paket (frÄn NeXT), kataloger som hanteras av filhanteraren som "opaka objekt", liknande filer, snarare Àn kataloger. Varje paket med en applikation i formatet .*.app innehÄller, bland annat, en fil Info.plist (i nÄgot motsvarande JSON eller YAML frÄn Apple), som innehÄller metadata för applikationen.

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Nycklarna i Info.plist-filen frÄn Mac OS X-applikationspaketet.

Resurser som ikoner, UI-filer och andra lagras i paketet som filer. Konceptet har i stort sett ÄtergÄtt till sina rötter i NeXT.

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Mathematica.app pÄ NeXTSTEP 1.0 Är 1989: visas som en katalog med filer i terminalen, men som ett enda objekt i den grafiska filhanteraren.

LÄt oss gÄ tillbaka till BeOS, som Haiku Àr baserat pÄ. Dess utvecklare bestÀmde sig vid övergÄngen frÄn PEF (PowerPC) till ELF (x86) (samma som anvÀnds pÄ Linux) för att lÀgga till en resurssektion i slutet av ELF-filer. Ingen egen lÀmplig ELF-sektion anvÀndes, den skrivs helt enkelt till slutet av ELF-filen. Resultatet var att program strip och andra frÄn binutils, som inte kÀnde till detta, helt enkelt klippte bort den. DÀrför, för att lÀgga till resurser i ELF-filer pÄ BeOS, bör man undvika att arbeta med dem med Linux-verktyg.

Vad hÀnder nu med Haiku? I princip ganska samma sak.

Teoretiskt sett skulle det vara möjligt att placera resurser i den lÀmpliga ELF-sektionen. Enligt utvecklarna pÄ #haiku-kanalen pÄ irc.freenode.net:

Med ELF skulle sektionen ha mer mening... den enda anledningen till att vi inte gör det Àr att sÄ gjordes i BeOS.
Och det Àr inte vÀrt att Àndra nu.

Resurshantering

Resurser skrivs i ett strukturerat "resurs"-format: i grunden en lista av resurser med storlekar och sedan deras innehÄll. Jag tÀnker pÄ formatet ar..
Hur kan man kontrollera resurser i Haiku? Finns det nÄgot som ResEdit?
Enligt dokumentationen:

För att visa resurser som levereras i applikationspaketet kan man dra den körbara filen till ett program som Resourcer.Du kan ocksÄ gÄ in i terminalen och köra kommandot listres filnamn..

Resourcer finns i HaikuDepot, men jag fÄr bara programmet att krascha.

Hur hanterar man resurser i ELF-filer? Med hjÀlp av rsrc. och rdef.. rdef. Filerna kompileras till rsrc.. Filen rdef. lagras i ett vanligt textformat, sÄ det Àr mycket enklare att arbeta med. Filer i formatet rsrc. lÀgger till nÄgot i slutet av ELF-filen. LÄt oss prova att leka lite:

~> rc -h
Haiku Resurskompilator 1.1 För att kompilera ett rdef-skript till en resursfil:
    rc [alternativ] [-o ] ... För att konvertera en resursfil tillbaka till ett rdef-skript:
    rc [alternativ] [-o ] -d ... Alternativ:
    -d --dekompilera       skapa ett rdef-skript frÄn en resursfil
       --auto-namn       konstruera resursnamn frÄn ID-symboler
    -h --hjÀlp            visa detta meddelande
    -I --inkludera    lÀgg till  i listan över inkluderingsvÀgar
    -m --sammanfoga       radera inte befintligt innehÄll i utdatafilen
    -o --utdata          specificera namn pÄ utdatafil, standard Àr out.xxx
    -q --tyst           visa inga felmeddelanden
    -V --version         visa programvaruversion och licens.

Programmet kan anvÀndas xres för att kontrollera och hantera:

/> 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.
(...)

Okej, ska vi prova?

/> 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

Mer om resurser och format rdef. kan lÀsas hÀr.

Standardtyper av resurser

Även om man kan lĂ€gga vad som helst i resurser, finns det nĂ„gra specifika standardtyper:

  • app_signature: MIME-typen för applikationen, för att matcha öppningsbara filer, start, IPC osv.
  • app_name_catalog_entry: Eftersom applikationens namn vanligtvis Ă€r pĂ„ engelska, kan man hĂ€r ange platser dĂ€r översatta namn finns, sĂ„ att anvĂ€ndare av olika sprĂ„k kan se det översatta namnet vid behov.
  • app_version: precis det du tĂ€nker pĂ„
  • app_flags: anger registrar hur applikationen ska behandlas. Jag tror att det finns mer Ă€n det verkar vid första anblicken. Till exempel finns det B_SINGLE_LAUNCH, vilket fĂ„r systemet att starta en ny applikationsprocess varje gĂ„ng, pĂ„ begĂ€ran av anvĂ€ndaren (samma princip anvĂ€nds för de flesta applikationer pĂ„ Linux). Det finns B_MULTIPLE_LAUNCH, vilket tvingar att starta en process för varje fil. Slutligen finns det B_EXCLUSIVE_LAUNCH, vilket fĂ„r systemet att starta endast en process Ă„t gĂ„ngen, oavsett hur ofta anvĂ€ndare försöker starta den (till exempel, sĂ„ startar Firefox pĂ„ Linux; samma resultat kan uppnĂ„s i Qt-applikationer med hjĂ€lp av funktionen QtSingleApplication). Applikationer med B_EXCLUSIVE_LAUNCH informeras nĂ€r anvĂ€ndaren försöker starta dem igen: till exempel fĂ„r de sökvĂ€gen till den fil som anvĂ€ndaren vill öppna med hjĂ€lp av dem.
  • vector_icon: Vektorikon för applikationen (I BeOS fanns det inga vektorikoner, de flesta applikationer hade istĂ€llet tvĂ„ rasterikoner i exekverbara filer).

SjÀlvklart kan man lÀgga till resurser med valfria ID och typer, och sedan lÀsa dem i sjÀlva applikationen eller andra applikationer med hjÀlp av klassen BResources. Men lÄt oss först pausa vid det intressanta Àmnet ikoner.

Vektorikoner i Haiku-stil

SjÀlvklart valde inte bara Haiku det bÀsta formatet för ikoner, situationen med skrivbordsmiljöerna i Linux Àr lÄngt ifrÄn perfekt:

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

Att se nÄgot sÄdant kan man redan kÀnna vad det hÀr stycket handlar om.

SjÀlvklart finns det skalbara, vilket man kan förstÄ, vektorikoner. Varför finns det dÄ nÄgot annat? För att resultatet av rendering av vektorgrafik i smÄ storlekar kan vara sÀmre Àn perfekt. Man vill ha olika alternativ, optimerade för olika storlekar. I Linux-miljöer uppnÄs detta genom att sprida ut ikoner med olika storlekar över filsystemet.

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

Observera: det finns inget begrepp för olika versioner av Firefox. DÀrför kan man inte sofistikerat hantera situationen med nÀrvaron av flera versioner av applikationen i systemet.

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Olika ikoner för Firefox i olika versioner. För nu Àr det omöjligt att hantera detta i Linux utan olika nödlösningar.

Mac OS X hanterar detta nÄgot mer sofistikerat:

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

Det syns att det finns en fil firefox.icns i paketet Firefox.app, som innehÄller alla storlekar, sÄ att olika versioner av samma applikation har olika ikoner.
Mycket bÀttre! Ikonerna reser med applikationen, alla resurser i en fil.

LÄt oss Äterkomma till Haiku. En fantastisk lösning, utan undantag. Enligt dokumentationen:

Det har utvecklats ett sÀrskilt, högoptimerat format för smÄ storlekar och snabb rendering, HVIF. DÀrför Àr vÄra ikoner för det mesta mycket mindre Àn i raster- eller det allmÀnt anvÀnda SVG-formatet.

Och de Àr faktiskt optimerade:

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Storlekarna pÄ ikonerna i HVIF jÀmfört med andra format.

Skillnaden Àr en ordning!

Men magin slutar inte hÀr. Samma HVIF kan visa olika detaljnivÄer beroende pÄ den visade storleken, trots att det Àr ett vektorformat.

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Olika detaljnivÄer (LOD) beroende pÄ storleken pÄ rendering

Nu om nackdelarna: man kan inte bara ta SVG, slÀnga den i ImageMagick och vara klar, man mÄste gÄ igenom flera cykler för att skapa en ikon i HVIF-format. HÀr förklaringar. Men IconOMatic kan ganska ofullstÀndigt importera SVG; omkring 90% av detaljrikedomen i SVG importeras med viss sannolikhet, de resterande 10% mÄste justeras och Àndras manuellt. LÀs mer om hur HVIF gör sin magi kan i bloggen Lea Genson

Att lÀgga till en ikon i applikationen

Nu kan jag lÀgga till ikonen till paketet som skapades förra gÄngen, med tanke pÄ all information som har mottagits.
Eftersom jag för nĂ€rvarande inte har nĂ„got som helst intresse av att rita en egen ikon för min "Hej, VĂ€rld" QtQuickApp — tar jag den frĂ„n 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

LÄt oss kontrollera att ikonen har kopierats:

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

Ser bra ut, men varför visas inte den nya ikonen nÀr den har kopierats?

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Den kopierade VICN:101:BEOS:ICON anvÀnds fortfarande inte som ikon för applikationen i filhanteraren.

Vad har jag missat?

Utvecklarens kommentar:

Jag behöver skapa en fil rdef. med alla resurser, sedan köra kommandot rc namn.rdef, det kommer att skapa en fil .rsrc. Sedan behöver jag köra kommandot resattr -o namn_binĂ€r namn.rsrc. Åtminstone anvĂ€nder jag liknande kommandon för att lĂ€gga till ikoner till mina skript.

Men, jag ville ju skapa en resurs, inte en attribut. Jag Àr verkligen förvirrad.

Intelligent caching med hjÀlp av filsystemet.

Att öppna och lÀsa attribut frÄn ELF fungerar lÄngsamt. Som jag skrev ovan, skrivs ikonen som en resurs i sjÀlva filen. Denna metod Àr mer pÄlitlig och klarar av att överleva kopiering till ett annat filsystem. Men den kopieras ocksÄ till filsystemattributet, till exempel BEOS:ICON. Detta fungerar endast pÄ vissa filsystem, som BFS. Ikoner som visas av systemet (i Tracker och Deskbar) lÀses frÄn detta utökade attribut, eftersom en sÄdan lösning fungerar snabbt. PÄ vissa stÀllen (dÀr hastighet inte spelar nÄgon roll, som i det vanliga "Om-programmet"-fönstret) fÄr systemet ikonen direkt frÄn resursen i filen. Men det Àr inte slutet. Kom ihÄg, pÄ Mac kunde anvÀndare ersÀtta ikoner för applikationer, mappar, dokument med sina egna, eftersom Mac har möjlighet att göra dessa "viktiga" saker, till exempel att byta den nya Slack-ikonen mot den tidigare.I Haiku bör resursen (i filen) ses som den ursprungliga ikonen som levereras med applikationen, medan attributet (i BFS-filsystemet) Àr nÄgot som gör att anvÀndaren kan göra Àndringar efter eget val (Àven om,tips, det grafiska grÀnssnittet för att sÀtta en anvÀndarikon ovanpÄ standardikonen Ànnu inte Àr implementerat).

Kontroll av filsystemets attribut.

Med hjÀlp av resaddr möjligheten att kontrollera och stÀlla in filsystemets attribut.

/> 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.
(...)

I grunden handlar det om ett "klister" som utför omvandling fram och tillbaka mellan (pÄlitliga) resurser och (snabba) attribut hos filsystemet. Och eftersom systemet Àr utformat för att hÀmta resurser och automatiskt utföra kopiering, behöver jag inte lÀngre oroa mig för detta.

Magin med hpkg-paket

För nÀrvarande anvÀnds paket oftast för att fÄ program pÄ Haiku .hpkg. LÄt dig inte luras av det enkla namnet: .hpkg-formatet fungerar helt annorlunda Àn andra format med liknande namn som du kan ha stött pÄ, det har verkliga superkrafter.

Med traditionella paketformat har jag lĂ€nge varit frustrerad över den hĂ€r faktorn: du laddar ner en (paket), men i systemet installeras nĂ„got annat (filer inne i paketet). Det Ă€r ganska svĂ„rt att hantera filer (till exempel att ta bort dem) nĂ€r en paketinstallation görs pĂ„ det traditionella sĂ€ttet. Anledningen till detta Ă€r att innehĂ„llet i paketet sprids ut över hela filsystemet, inklusive platser dĂ€r en vanlig anvĂ€ndare kanske inte har skrivĂ„tkomst. Detta ger upphov till en helt ny klass av program — paketförvaltare. Att flytta redan installerad programvara, till exempel till en annan dator, extern enhet eller filserver, blir Ă€nnu svĂ„rare, om inte helt omöjligt. I ett vanligt Linux-baserat system kan det lĂ€tt finnas frĂ„n flera hundratusen till miljontals separata filer. SjĂ€lvklart Ă€r detta samtidigt bĂ„de skört och lĂ„ngsamt, till exempel vid den första installationen av systemet, vid installation, uppdatering och borttagning av vanliga paket, samt vid kopiering av en startpartition (rotpartition) till en annan lagringsenhet.

Jag arbetar pÄ projektet AppImage, en delvis lösning för slutanvÀndarprogram. Det Àr ett distributionsformat för programvara som samlar applikationen och alla dess beroenden i en enda filsystemavbild, som monteras vid körning av applikationen. Det förenklar saker avsevÀrt, eftersom samma ImageMagick plötsligt blir en enda fil som hanteras i filhanteraren av vanliga dödliga. Det föreslagna sÀttet fungerar endast för programvara, som namnet pÄ projektet Äterspeglar, och har ocksÄ en egen uppsÀttning problem, eftersom mÀnniskor som arbetar med att distribuera programvara för Linux alltid skyller pÄ mig.

LÄt oss Äterkomma till Haiku. Har vi lyckats hitta en optimal balans mellan traditionella paketbaserade system och programvaruleverans baserad pÄ avbildningar? Dess paket .hpkg Àr i praktiken komprimerade avbildningar av filsystemet. Vid systemstart monterar kÀrnan alla installerade och aktiva paket med följande kÀrnmeddelanden:

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

Coolt, eller hur? HÄll i er, det kommer att bli Ànnu bÀttre!

Det finns ett mycket speciellt paket:

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

Det innehĂ„ller ett ganska minimalistiskt operativsystem, inklusive kĂ€rnan. Trots att det lĂ„ter otroligt, sĂ„ extraheras inte ens kĂ€rnan frĂ„n startvolymen (rotpartitionen) utan laddas noggrant pĂ„ sin plats frĂ„n paketet. .hpkg. TĂ€nk pĂ„ det! Jag har redan nĂ€mnt att, enligt mig, en del av den övergripande elegansen och enheten av Haiku beror pĂ„ att hela systemet, frĂ„n kĂ€rnan och det grundlĂ€ggande anvĂ€ndarutrymmet till paketförvaltningen och arbetsmiljöinfrastrukturen, utvecklas tillsammans av ett enda team. TĂ€nk pĂ„ hur mĂ„nga olika grupper och team som skulle behövas för att fĂ„ nĂ„got liknande att fungera baserat pĂ„ Linux. [jag förestĂ€ller mig projektet PuppyLinux, — anm. översĂ€ttaren]. TĂ€nk sedan pĂ„ hur lĂ„ng tid det skulle ta att implementera detta till distros. Man sĂ€ger ju: ta en enkel uppgift, fördela den mellan olika utförare, sĂ„ blir den sĂ„ komplicerad att den inte gĂ„r att lösa lĂ€ngre. Haiku har i det hĂ€r fallet öppnat mina ögon. Jag tror att det precis Ă€r vad som hĂ€nder med Linux just nu (Linux Ă€r hĂ€r en samlande term för Linux/GNU/dpkg/apt/systemd/Xorg/dbus/Gtk/GNOME/XDG/Ubuntu).

SystemÄterstÀllning med hpkg

Hur ofta uppstÄr följande situation: uppdateringen har genomförts utan problem, men sen visar det sig att nÄgot inte fungerar som det ska? NÀr man anvÀnder vanliga paketshanterare Àr det svÄrt att ÄterstÀlla systemets tillstÄnd till tiden innan de nya paketen installerades (till exempel nÀr nÄgot gÄr fel). Vissa system erbjuder lösningar i form av avbilder av filsystemet, men de Àr ganska skrymmande och anvÀnds lÄngt ifrÄn i alla system. I Haiku löser vi detta med paket. .hpkg. Varje gÄng paket Àndras i systemet tas inte gamla paket bort, utan de lagras i systemet i underkataloger av typen /Haiku/system/packages/administrative/state-<...>/ konstant. OfullstÀndiga operationer lagrar sina data i underkataloger /Haiku/system/packages/administrative/transaction-<...>/.

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
InnehĂ„ll /Haiku/system/packages/administrative. Katalogerna "state..." innehĂ„ller textfiler med namn pĂ„ aktiva paket, "transaction..." — sjĂ€lva paketen.

"Gammalt aktivt tillstÄnd", dvs. listan .hpkg över paket som var aktiva innan Àndringarna skrivs efter varje operation i filhanteraren i en textfil /Haiku/system/packages/administrative/state-<...>/activated-packages. PÄ liknande sÀtt skrivs det nya "aktiva tillstÄndet" i en textfil /Haiku/system/packages/administrative/activated-packages.

Katalog /Haiku/system/packages/administrative/state-<...>/ innehÄller endast en textfil med listan över aktiva paket i detta tillstÄnd (vid installation av paket utan borttagning), och om paket raderades eller uppdaterades, sÄ innehÄller state-katalogen gamla versioner av paketen.

Vid systemstart fattas beslut om aktivering (montering) av paket baserat pÄ listan över paket. SÄ enkelt Àr det! Om nÄgot gÄr fel vid uppstart kan man ange att bootloadern ska anvÀnda en annan, Àldre lista. Problemet Àr löst!

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Haikus bootloader. Varje inmatningspunkt representerar motsvarande "aktiva tillstÄnd".

Jag gillar tillvÀgagÄngssÀttet med enkla textfiler som lista över "aktiva tillstÄnd", dÀr begripliga namn skrivs. .hpkgDetta stÄr i skarp kontrast till den maskinskapade röran frÄn OSTree eller Flatpak i filsystemet (i samma nivÄ som Microsoft GUID). Listan över aktiva paket för varje tidpunkt

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Konfigurationsdata

Tycks finnas i katalogen

innehÄller instÀllningsfiler för paketen, men tillgÀngliga för skrivning. Eftersom, som ni minns, /Haiku/system/packages/administrative/writable-files monteras endast för lÀsning. DÀrför mÄste dessa filer kopieras frÄn paketen innan de skrivs. Det Àr meningsfullt. .hpkg GUI-integration för systemet .hpkg

GUI-integration för systemet .hpkg

LÄt oss nu titta pÄ hur dessa fantastiska paket .hpkg hanterar integrationen i anvÀndarens arbetsmiljö (UX). Haiku Àr ju avsett för personligt bruk, trots allt. Jag har stÀllt en hög standard genom att jÀmföra anvÀndarupplevelsen med paket .*.app pÄ Macintosh med samma erfarenhet pÄ .hpkg. Jag kommer inte ens att jÀmföra situationen med arbetsmiljöer pÄ Linux, eftersom den Àr helt förfÀrlig i jÀmförelse med andra.

Följande scenarier kommer att tÀnka pÄ:

  • Jag vill se innehĂ„llet i paketet .hpkg
  • Jag vill installera paketet
  • Jag vill ta bort paketet
  • Jag vill ta bort nĂ„got som kom in i systemet som en del av paketet
  • Jag vill kopiera nĂ„got som kom in i systemet som en del av paketet
  • Jag vill ladda ner alla beroenden för paketet som kanske inte ingĂ„r i varje Haiku-installation (till exempel har jag en fysiskt isolerad maskin utan internetĂ„tkomst).
  • Jag vill flytta mina paket (eller en del av dem) till en annan plats, skilt frĂ„n startvolymen (roten) (eftersom jag till exempel har ont om utrymme dĂ€r).

Detta borde tÀcka de flesta grundlÀggande fallen frÄn mitt dagliga arbete. NÄvÀl, lÄt oss sÀtta igÄng.

Kontroll av paketets innehÄll

PÄ Mac högerklickar jag enkelt pÄ paketet för att öppna det och se innehÄllet i Finder. För det Àr ju egentligen bara en maskerad katalog! (Jag vet att det finns paket .pkg för delar av systemet som inte Àr applikationer, men vanliga anvÀndare interagerar sÀllan med dem).

PÄ Haiku högerklickar jag pÄ paketet, sedan klickar jag pÄ 'InnehÄll' för att se vad som finns inuti. Men hÀr Àr det bara en lista med filer utan möjlighet att öppna dem med dubbelklick.
Det skulle vara mycket bÀttre om det fanns ett sÀtt att (temporÀrt) montera paketet .hpkg för att se genom filhanteraren, utan att anvÀndaren behövde bekymra sig om implementationsdetaljer. (För övrigt, man kan öppna .hpkg paketet i Expander, som kan packa upp det precis som en vanlig arkivfil).

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
I grÀnssnittet HaikuDepot kan man se en lista med paketets filer, men det finns inget sÀtt att se innehÄllet, till exempel genom att dubbelklicka pÄ README.md.

I denna kategori vinner Mac, men det borde inte vara sÀrskilt svÄrt att lÀgga till den nödvÀndiga funktionaliteten i HaikuDepot.

Installera paketet via GUI

PÄ Mac, de flesta diskavbilder .dmg innehÄller paket .*.app. Vi öppnar diskavbilden med dubbelklick, och kopierar paketet, till exempel genom att dra det till /Applications Finder. För mig Àr det en sjÀlvklarhet, men jag har hört att vissa nybörjare kan ha problem med det. Som standard "erbjuder" Apple en systemomfattande katalog /Applications (pÄ NeXT var den nÀtverksbaserad, samt individuell), men man kan enkelt placera sina program pÄ en filserver eller i underkatalogen $HOME/Applications, om det Àr vad du föredrar.

PĂ„ Haiku, dubbelklicka pĂ„ paketet, klicka sedan pĂ„ "Installera", enklare Ă€n sĂ„ blir det inte. Jag undrar vad som hĂ€nder om paketet har beroenden som Ă€r tillgĂ€ngliga i HaikuPorts, men som Ă€nnu inte Ă€r installerade. PĂ„ Linux vet man faktiskt inte vad man ska göra i den situationen, men svaret Ă€r uppenbart — frĂ„ga anvĂ€ndaren om de vill ladda ner och installera beroenden. Precis vad Haiku gör.

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Jag laddade ner paketet 'sanity' manuellt och klickade pÄ det, paketmanagern vet var den ska hÀmta dess beroenden (förutsatt att repositoryn redan Àr konfigurerad i systemet). Inte alla Linux-distributioner kan göra detta.

Ett annat sĂ€tt Ă€r att anvĂ€nda filhanteraren, det rĂ€cker med att dra .hpkg paketet antingen till /Haiku/system/packages (för systemomfattande installation, som standard), eller till /Haiku/home/config/packages (för individuell installation; inte tillgĂ€nglig vid dubbelklick — jag stör mig fortfarande pĂ„ ordet "config" hĂ€r, som för mig i detta sammanhang Ă€r en synonym till "instĂ€llningar"). Och konceptet för flera anvĂ€ndare Ă€r inte ens tillgĂ€ngligt för Haiku (kanske dĂ€rför Ă€r allt sĂ„ enkelt — jag vet inte, kanske skulle fleranvĂ€ndarfunktioner komplicera saker för arbetsmiljön pĂ„ en personlig dator).

I denna kategori vinner Haiku eftersom den kan hantera inte bara program utan Àven systemprogram.

Borttagning av paket frÄn GUI

PÄ Mac, man behöver bara dra applikationsikonen till papperskorgen, sÄ Àr det klart. LÀtt!

PÄ Haiku, för det första, man mÄste hitta var paketet Àr installerat i systemet, eftersom man sÀllan installerar det dÀr det borde (systemet gör allt). Oftast mÄste man leta i /Haiku/system/packages (vid systemomfattande installation som standard), eller i /Haiku/home/config/packages (jag har redan sagt att "config" Àr ett felaktigt namn?). Sedan drar man bara applikationen till papperskorgen, sÄ Àr det klart.
LĂ€tt! ÄndĂ„ skulle jag inte sĂ€ga det. HĂ€r Ă€r vad som faktiskt hĂ€nder:

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
SÄ hÀr blir det om du drar en applikation till papperskorgen frÄn /Haiku/system/packages

Jag försökte bara flytta min gÄrdagens applikation "Hej, vÀrld" pÄ QtQuickApp till papperskorgen. Jag försökte inte flytta systemkatalogen, och eftersom alla paket installeras i systemkatalogen gÄr det inte att ta bort paketet .hpkg utan att Àndra "dess innehÄll".. En vanlig anvÀndare skulle bli skrÀmd, trycka pÄ knappen "Avbryt" som Àr standardinstÀlld.

Förklarar mr. waddlesplash:

Detta meddelande Àr över 10 Är gammalt. Det Àr troligt att vi behöver stÀlla in det sÄ att varningen bara visas nÀr sjÀlva paketet flyttas. Vanliga anvÀndare behöver inte göra sÄ.

Okej, kanske jag ska göra detta med HaikuDepot? Jag dubbelklickar pÄ paketet i /Haiku/system/packages, och hoppas att knappen "Avinstallera" dyker upp. Nej, det finns (bara) "Installera". "Avinstallera", var Àr du?

För skojs skull försökte jag se vad som hÀnder om jag trycker pÄ "Installera" för ett redan installerat paket. Det blir sÄ hÀr:

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Det blir sÄ hÀr om du försöker installera ett redan installerat paket.

DĂ€refter dyker detta upp:

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
Om du trycker pÄ "TillÀmpa Àndringar" i föregÄende fönster blir det sÄ hÀr

Jag misstĂ€nker att detta Ă€r en programvarubugg, en lĂ€nk till en Ă€rende finns redan. [författaren har inte tillhandahĂ„llit en lĂ€nk, — anm. översĂ€ttaren]

Snabb lösning: LÀgg till en knapp "Avinstallera" om paketet redan finns i /Haiku/system/packages, eller i /Haiku/home/config/packages.

NÀr jag tittar pÄ listan över paket som Àr installerade i HaikuDepot ser jag mitt paket i listan och kan ta bort det.

I denna kategori vinner Mac. Men jag kan förestÀlla mig att med rÀtt instÀllningar skulle anvÀndarupplevelsen pÄ Haiku vara bÀttre Àn pÄ Mac. (En av utvecklarna bedömde detta sÄ hÀr: "Mindre Àn en timme för att lÀgga till den angivna funktionen i HaikuDepot, om du vet lite C++", finns det frivilliga?)

Att ta bort nÄgot frÄn paketet

LÄt oss försöka ta bort applikationen istÀllet för paketet .hpkg, varifrÄn den kom (jag tvivlar pÄ att det finns nÄgon skillnad för "vanliga dödliga").

PĂ„ Mac, anvĂ€ndaren arbetar faktiskt vanligtvis med filen .dmg, dĂ€r applikationspaketet kommer ifrĂ„n .*.app. Vanligtvis samlas bilder .dmg i nedladdningskatalogen, medan paket kopieras av anvĂ€ndaren till /Applications. Det finns en Ă„sikt om att mĂ„nga anvĂ€ndare sjĂ€lva inte vet vad de gör, denna hypotes bekrĂ€ftas av en tidigare anstĂ€lld pĂ„ Apple. (En av de saker jag inte gillar med Mac. Å andra sidan, med AppImage finns det ingen skillnad mellan applikationen och paketet som den kom i. Drag ikonen till papperskorgen = det Ă€r allt. LĂ€tt!)

PÄ Haiku, det finns ocksÄ en uppdelning mellan apps/ och packages/, sÄ jag tvivlar pÄ att det har blivit tydligare för anvÀndarna. Men vad hÀnder om man drar en applikation frÄn apps/ till papperskorgen:

Min sjÀtte dag med Haiku: en mÀngd resurser, ikoner och paket under huven
SÄ hÀr ser det ut nÀr man försöker ta bort en applikation som tagits frÄn filen .hpkg

Tekniskt sett Àr det korrekt (eftersom applikationen endast Àr placerad pÄ en skrivskyddad filsystem till att börja med), men det Àr inte sÀrskilt anvÀndbart för anvÀndaren.

Snabb lösning: istÀllet erbjud en GUI-alternativ för att ta bort .hpkg

Som ett experiment försökte jag duplicera applikationen genom att trycka pĂ„ Alt+D. Jag fick meddelandet "Det gĂ„r inte att flytta eller kopiera objekt pĂ„ en skrivskyddad volym". Och allt pĂ„ grund av /system (utöver /system/packages och /system/settings) Ă€r en punkt för montering av packagefs (minns hur den visas i utdata frĂ„n df?). К ŃĐŸĐ¶Đ°Đ»Đ”ĐœĐžŃŽ, ĐČыĐČĐŸĐŽ ĐșĐŸĐŒĐ°ĐœĐŽŃ‹ mount klargör inte situationen (som nĂ€mnts i en av tidigare artiklar), mountvolume visar inte det sökta (uppenbarligen rĂ€knas paket som monteras via loop .hpkg inte som "volymer"), och sĂ„ glömde jag de alternativa kommandona.

Ingen har vunnit i denna kategori förutom AppImage (men det Àr, om vi ska vara helt Àrliga, en partisk Äsikt). Men man kan tÀnka sig att efter justeringar, kommer anvÀndarupplevelsen pÄ Haiku vara bÀttre Àn pÄ Mac.

Observera: det mÄste avgöras vad en "volym" innebÀr i förhÄllande till "partitionen". Sannolikt Àr det relaterat till förhÄllandet mellan "mapp" och "katalog": de flesta kataloger visas i filhanteraren som mappar, men inte alla av dem (till exempel paket, hanteras som filer). Gör sÄdana slutsatser mig officiellt till en nörd?

Att kopiera innehÄllet i ett paket till ett annat system

PĂ„ Mac, jag drar bara paketet .*.app, och eftersom beroenden inuti paketet flyttas med.

PÄ Haiku, drar jag applikationen, men beroenden hanteras överhuvudtaget inte.

Snabb lösning: LÄt istÀllet föreslÄs att dra paketet "`.hpkg helt och hÄllet, tillsammans med dess beroenden, om de finns.

I denna kategori vinner Mac utan tvekan. Åtminstone för mig, som Ă€lskar deras paradigm. PĂ„ Haiku borde det kopieras .hpkg istĂ€llet för appen, men systemet erbjuder mig inte ett sĂ„dant


Nedladdning av paketet med alla dess beroenden

Inte varje maskin Ă€r ansluten till nĂ€tverket hela tiden. TvĂ€rtom, vissa maskiner (ja, jag tittar pĂ„ er, moderna Windows, Mac och Linux) glömmer bort det. För mig Ă€r det viktigt att jag kan gĂ„ till exempelvis ett internetcafĂ©, ladda ner programvara pĂ„ ett USB-minne, plugga in det i min hemmadator och vara sĂ€ker pĂ„ att allt kommer att fungera [riskabel kille, gör det hĂ€r pĂ„ Windows
 — anm. översĂ€ttaren].

Som ett resultat fÄr jag lite oftare Àn vanligt olösta beroenden pÄ Windows och Linux.

PĂ„ Mac det Ă€r vanligtvis en fil, allt som behövs — ladda ner .dmg. Oftast har det inga beroenden, förutom de som tillhandahĂ„lls av MacOS som standard. Ett undantag kan vara komplicerade program som krĂ€ver en specifik körmiljö, till exempel Java.

PÄ Haiku ladda ner paketet .hpkg för, lÄt oss sÀga, samma Java-applikation kan visa sig vara otillrÀckligt, eftersom Java kan finnas eller inte finnas pÄ den mÄlmaskinen. Finns det nÄgot sÀtt att ladda ner alla beroenden för detta paket .hpkg, förutom de som installeras i Haiku som standard och dÀrför bör finnas i varje Haiku-system?

I den hÀr kategorin vinner Mac med en liten marginal.

Kommenterar mr. waddlesplash:

För att skriva ett program som samlar alla beroenden av en applikation i form av en uppsÀttning paket .hpkg för nÄgon som Àr bekant med Haikus interna struktur, rÀcker det med cirka 15 minuter. Att lÀgga till stöd för detta Àr inte sÄ svÄrt om det finns ett verkligt behov. Men för mig Àr det en sÀllsynt situation.

Vi hÄller andan till nÀsta artikel i den hÀr serien.

Flytta paket till en avskild plats

Som jag nÀmnde tidigare vill jag lÀgga mina paket .hpkg (ja, eller en del av dem) pÄ en sÀrskild plats, Ätskild frÄn den vanliga placeringen pÄ startpartitionen (rotpartitionen). I vanliga fall (inte sÄ teoretiskt) beror anledningen pÄ att mitt (inbyggda) utrymme stÀndigt tar slut, oavsett hur stora de Àr. Jag kopplar ofta externa diskar eller nÀtverksresurser dÀr mina program finns.

PÄ Mac jag flyttar bara paketen .*.app till en extern enhet eller nÀtverkskatalog i Finder, och det Àr allt. Jag kan fortfarande öppna appen med dubbelklick som jag vanligtvis gjorde med startvolymen. Enkelt!

PÄ Haiku, som jag fick veta, kan detta uppnÄs genom att flytta mina .hpkg paket till en extern enhet eller nÀtverkskatalog, men dÄ mÄste man anvÀnda nÄgra icke-dokumenterade kommandon i terminalen för att montera dem i systemet. Jag vet inte hur jag gör det enbart med GUI.

Denna kategori vinner Mac.

Enligt mr. waddlesplash:

HÀr Àr optimeringen baserad pÄ vanlig anvÀndning. Om efterfrÄgan skulle vara större Àn vad en anvÀndare kan hantera, sÄ kommer vi att implementera det. I vilket fall som helst finns det möjlighet till tredjepartsimplementation.

Detta kommer vi att berÀtta mer om i nÀsta artikel.

NÀr det kommer till nÀtverkskataloger: det skulle vara fantastiskt (jag förmodar LAN-partyn) att ha enkla, upptÀckbara, nÀtverksapplikationer (till exempel via Zeroconf) som man kan kopiera till den lokala datorn eller köra direkt frÄn det lokala nÀtverket. SjÀlvklart har utvecklarna möjlighet att avstÄ genom app_flags.

Slutrapport om systemintegration av hpkg med GUI

Jag tror att det frÀmst beror pÄ den relativa nyheten av integrationen .hpkg med GUI som fortfarande lÀmnar en del att önska. I vilket fall som helst finns det flera aspekter som kan förbÀttras nÀr det gÀller UX...

En annan sak: Kernel Debug Land

Det skulle vara fantastiskt att kunna skriva kommandon vid kernel panic, till exempel syslog | grep usb. NĂ„vĂ€l, pĂ„ Haiku Ă€r detta möjligt tack vare Kernel Debug Land. Hur kan man se denna magi i aktion om allt fungerar som det ska utan att hamna i kernel panic? Enkelt, genom att trycka pĂ„ Alt+PrintScn+D (mnemonik Debug). Jag tĂ€nker genast pĂ„ Programmer’s Key, som tillĂ€t de ursprungliga utvecklarna av Macintosh att komma in i debuggern (om den var installerad, naturligtvis).

Slutsats

Jag börjar förstÄ att Haikus sofistikering kommer frÄn att arbetet utförs av ett litet team med tydligt fokus pÄ arbetsmiljö och tillgÄng till alla systemlag.
En skarp kontrast mot vÀrlden av Linux/GNU/dpkg/apt/systemd/Xorg/dbus/Gtk/GNOME/XDG/Ubuntu, dÀr allt Àr splittrat i sÄ smÄ delar att abstraktionen stÄr pÄ abstraktion och klamrar sig fast med provisorier.
Det har ocksÄ blivit tydligt hur systemet .hpkg kombinerar bÀsta praxis frÄn traditionella paketförvaltare, Snappy, Flatpak, AppImage, till och med btrfs, och blandar dem med principen "bara fungerar" frÄn Mac.

Som om nÄgot har "slÄtt till" i huvudet och jag förstod hur systemet .hpkg kan ÄterstÀllas, - bara genom att titta pÄ det. Men det Àr inte jag, utan systemets skönhet och enkelhet. Mycket hÀr Àr genomdrÀngt av den ursprungliga Macens anda.

Ja, att blÀddra genom sidor i webblÀsaren kan vara hackigt och fungera lÄngsamt, det kan saknas appar (det finns ingen Gtk, Electron - utvecklarna har dragit slutsatsen att de inte passar ihop med subtiliteten), videouppspelning och 3d kan helt saknas, men jag gillar ÀndÄ detta system. För dessa saker kan ÄtgÀrdas och de kommer förr eller senare att dyka upp. Det Àr bara en tidsfrÄga och, eventuellt, lite röda ögon.

Jag kan inte erbjuda hjÀlp, men jag tror att det hÀr ögonblicket kommer att markera Äret Haiku pÄ skrivbordet.

Slumpproblem

Finns det redan förfrÄgningar, eller ska jag öppna dem?

  • BeScreenCapture bör ha möjlighet att exportera till GIF, precis som i Peek. Detta kan göras med hjĂ€lp av ffmpeg, som redan finns för Haiku. FörfrĂ„gan.
  • Programmet för att ta skĂ€rmdumpar kan inte ta en bild av ett modalt fönster, utan tar istĂ€llet en bild av hela skĂ€rmen.
  • Det gĂ„r inte att beskĂ€ra skĂ€rmdumpar med beskĂ€rningsverktyget i WonderBrush och sedan spara resultatet i en fil.
  • Jag gillar inte sĂ€rskilt muspekaren i handform i Haiku, men jag tror att det Ă€r kopplat till varma nostalgiska kĂ€nslor. Det Ă€r sĂ€rskilt frustrerande nĂ€r jag anvĂ€nder beskĂ€rningsverktyget i Krita, eftersom det ger en otillrĂ€cklig beskĂ€rning (se skĂ€rmdumpar med modala dialoger i den hĂ€r artikeln). En korspekare skulle vara fantastisk. FörfrĂ„gan.

Prova sjÀlv! Eftersom Haiku-projektet tillhandahÄller bilder för nedladdning frÄn DVD eller USB, som skapas dagligen. För installationen rÀcker det med att ladda ner en bild och skriva den pÄ ett USB-minne med hjÀlp av Etcher

Har du frÄgor? VÀlkommen till vÄr svensksprÄkiga telegramkanal.

Felkod: Hur man skjuter sig sjÀlv i foten i C och C++. En samling recept för Haiku OS

FrÄn författare översÀttning: detta Àr den sjÀtte artikeln i serien om Haiku.

Artikellista: Första Andra Tredje FjÀrde Femte

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster