
TL؛ DR: Haiku هو نظام تشغيل مصمم خصيصًا لأجهزة الكمبيوتر، لذا فهو يحتوي على العديد من الحيل التي تجعل بيئة سطح المكتب الخاصة به أفضل بكثير من غيرها. ولكن كيف يعمل؟
اكتشفتُ نظام هايكو، وهو نظام جيد بشكلٍ مُدهش. ما زلتُ مندهشًا من سلاسة تشغيله، خاصةً بالمقارنة مع بيئات سطح المكتب الأخرى. Linuxسألقي اليوم نظرة فاحصة على مكونات الجهاز الداخلية. وعند الضرورة، سأجري مقارنات مع نظام التشغيل ماكنتوش الأصلي، ونظام التشغيل ماك أو إس إكس، وبيئات سطح المكتب. Linux (معيار XDG من موقع freedesktop.org).
الموارد في ملفات ELF
علمت بالأمس أن IconOMatic يمكنه حفظ الرموز في موارد rdef في الملفات التنفيذية ELF. اليوم أريد أن أرى كيف يعمل حقا.
موارد؟ من ، المؤلف الأصلي لـ Macintosh Finder و"الأب" لمدير موارد Macintosh:
أنا قلق بشأن الطبيعة الصارمة للبرمجة التقليدية. بالنسبة لي، فإن فكرة وجود تطبيق مجمّد في التعليمات البرمجية، دون القدرة على تغيير أي شيء ديناميكيًا، هي أعنف فكرة. يجب أن يكون من الممكن التغيير قدر الإمكان في وقت التشغيل. بالطبع، لا يمكن تغيير رمز التطبيق نفسه، ولكن بالتأكيد يمكن تغيير شيء ما دون إعادة ترجمة الكود؟
في نظام ماكنتوش الأصلي، جعلوا هذه الملفات تحتوي على "قسم بيانات" و"قسم موارد"، مما جعل من السهل للغاية حفظ أشياء مثل الرموز والترجمات وما شابه ذلك. في الملفات القابلة للتنفيذ.
على ماك يتم استخدام هذا ، برنامج رسومي لتحرير الموارد فجأة.

ResEdit على جهاز Macintosh الأصلي
ونتيجة لذلك، أصبح من الممكن تحرير الرموز وعناصر القائمة والترجمات وما إلى ذلك. سهل بما فيه الكفاية، لكنهم ما زالوا "يسافرون" مع التطبيقات.
على أية حال، كان لهذا النهج عيب كبير: فهو يعمل فقط على أنظمة ملفات Apple، وهو أحد الأسباب التي دفعت Apple إلى التخلي عن "قسم الموارد" عند الانتقال إلى نظام التشغيل Mac OS X.
في نظام التشغيل Mac OS X، أرادت شركة Apple حلاً مستقلاً عن نظام الملفات، لذلك اعتمدت مفهوم الحزم (من NeXT)، والأدلة التي يتم التعامل معها على أنها "كائنات غير شفافة" بواسطة مدير الملفات، مثل الملفات بدلاً من الأدلة. أي حزمة مع تطبيق بالتنسيق .app لديه، من بين أمور أخرى، ملف Info.plist (في نوع ما يعادل JSON أو YAML من Apple) يحتوي على بيانات تعريف التطبيق.

مفاتيح ملف Info.plist من حزمة تطبيق Mac OS X.
يتم تخزين الموارد، مثل الرموز وملفات واجهة المستخدم وغيرها، في الحزمة كملفات. لقد عاد هذا المفهوم بالفعل إلى جذوره في NeXT.

Mathematica.app في NeXTSTEP 1.0 في عام 1989: يظهر كدليل للملفات في الوحدة الطرفية، ولكن ككائن واحد في مدير الملفات الرسومية.
لنعد إلى نظام التشغيل BeOS، والمفاهيم التي بُني عليها نظام Haiku. عند انتقال مطوريه من PEF (PowerPC) إلى ELF (x86) (وهو نفس النظام المستخدم في Linuxقرروا إضافة قسم موارد إلى نهاية ملفات ELF. ولتحقيق ذلك، لم يستخدموا قسم ELF خاصًا بهم، بل أضافوه ببساطة إلى نهاية ملف ELF. ونتيجة لذلك، أصبح البرنامج strip وبعض الأدوات الثنائية الأخرى، غير مدركة لذلك، قامت ببساطة بحذفه. لذا، بعد إضافة موارد إلى ملف ELF على نظام BeOS، يُفضّل عدم التلاعب به باستخدام الأدوات. Linux.
ماذا يحدث مع هايكو الآن؟ في الأساس، أكثر أو أقل نفس الشيء.
من الناحية النظرية، سيكون من الممكن وضع الموارد في القسم المطلوب من ELF. وفقًا للمطورين على قناة #haiku على irc.freenode.net:
مع ELF، سيكون القسم أكثر منطقية... والسبب الوحيد الذي يجعلنا لا نفعل ذلك بهذه الطريقة هو أنه ما فعلناه في BeOS."
وليس هناك فائدة من تغيير هذا الآن.
إدارة الموارد
تتم كتابة الموارد بتنسيق "مورد" منظم: وهي في الأساس قائمة بالموارد ذات الأحجام ثم محتواها. تذكرت .
كيفية التحقق من الموارد في هايكو؟ هل هناك شيء مثل ResEdit؟
وفق :
لعرض الموارد المتوفرة في حزمة التطبيق، يمكنك سحب الملف القابل للتنفيذ إلى برنامج مثل . يمكنك أيضًا الانتقال إلى المحطة الطرفية وتشغيل الأمر
listres имя_файла.
المورد متاح في HaikuDepot، ولكنه يتعطل بالنسبة لي.
كيفية إدارة الموارد في ملفات ELF؟ استخدام rsrc и rdef. rdef يتم جمع الملفات في rsrc. فيل rdef يتم تخزينه بتنسيق نص عادي، لذلك يكون التعامل معه أسهل بكثير. تنسيق الملف rsrc تم إلحاقه بنهاية ملف ELF. دعونا نحاول اللعب:
~> 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يمكنك استخدام البرنامج xres للفحص والتحكم:
/> 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.
(...)حسنا، دعونا نحاول؟
/> 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المزيد عن الموارد والشكل rdef يمكنك القراءة .
أنواع الموارد القياسية
على الرغم من أنه يمكنك استثمار أي شيء في الموارد، إلا أن هناك بعض الأنواع القياسية المحددة:
app_signature: نوع تطبيق MIME، لتعيين الملفات المفتوحة، والتشغيل، وIPC، وما إلى ذلك.app_name_catalog_entry: بما أن اسم التطبيق عادة ما يكون باللغة الإنجليزية، فيمكنك تحديد الأماكن التي توجد بها الأسماء المترجمة، بحيث يرى مستخدمو اللغات المختلفة اسم التطبيق المترجم إذا رغبوا في ذلك.app_version: بالضبط ما كنت اعتقدapp_flags: يشيرregistrarكيفية معالجة الطلب. أعتقد أن هناك ما هو أكثر مما تراه العين. على سبيل المثال، هناكB_SINGLE_LAUNCHمما يجبر النظام على تشغيل عملية تطبيق جديدة في كل مرة يطلبها المستخدم (يتم استخدام نفس المبدأ لمعظم التطبيقات على Linux). يأكلB_MULTIPLE_LAUNCH، مما يتسبب في تشغيل العملية كل ملف. وأخيرا هناكB_EXCLUSIVE_LAUNCHوهذا يُجبر النظام على تشغيل عملية واحدة فقط في كل مرة، بغض النظر عن عدد مرات تشغيل المستخدمين لها (على سبيل المثال، هكذا يعمل متصفح فايرفوكس على Linuxويمكن تحقيق النتيجة نفسها في تطبيقات Qt باستخدام الدالة ). التطبيقات معB_EXCLUSIVE_LAUNCHيتم إعلامهم عندما يحاول المستخدم تشغيلها مرة أخرى: على سبيل المثال، يتلقون مسار الملف الذي يريد المستخدم فتحه بمساعدتهم.vector_icon: أيقونة تطبيق Vector (لم يكن لدى BeOS أيقونات متجهة، وبدلاً من ذلك كانت معظم التطبيقات تحتوي على رمزين نقطيين في ملفاتها القابلة للتنفيذ).
بالطبع، يمكنك إضافة موارد بأي معرفات وأنواع مرغوبة، ثم قراءتها في التطبيق نفسه أو التطبيقات الأخرى باستخدام الفصل BResources. لكن أولاً، دعونا نلقي نظرة على موضوع الرموز الرائع.
أيقونات المتجهات في أسلوب هايكو
بالطبع، لم تكن هايكو وحدها من اختارت أفضل تنسيق للأيقونات، فالوضع مع بيئات سطح المكتب مختلف أيضاً في هذا الصدد. Linux بعيد كل البعد عن الوضع المثالي:
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بالنظر إلى هذا، يمكنك أن تشعر بالفعل بما هي عليه القطعة.
بالطبع، هناك خيار قابل للتوسيع، والذي، كما تتخيل، يحتوي على أيقونات متجهة. فلماذا يوجد خيار آخر؟ لأن عرض الرسومات المتجهة بأحجام صغيرة قد لا يكون مثاليًا. من المستحسن وجود خيارات مختلفة مُحسَّنة لأحجام مختلفة. في بيئات سطح المكتب Linux ويتحقق ذلك من خلال توزيع أيقونات بأحجام مختلفة في جميع أنحاء نظام الملفات.
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يرجى ملاحظة: لا يوجد مفهوم للإصدارات المختلفة من Firefox. وبالتالي، ليس من الممكن التعامل بأمان مع حالة وجود إصدارات متعددة من التطبيق على النظام.

تختلف أيقونات فايرفوكس باختلاف الإصدارات. ولا يمكن معالجة هذا الأمر حاليًا في Linux بدون استخدام عكازات مختلفة.
يتعامل نظام التشغيل Mac OS X مع الأمر بمهارة أكبر:
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يمكن ملاحظة أن هناك ملفًا واحدًا firefox.icns في حزمة Firefox.app، تحتوي على جميع الأحجام بحيث تحتوي الإصدارات المختلفة من نفس التطبيق على أيقونات مختلفة.
أفضل بكثير! تنتقل الأيقونات مع التطبيق، وجميع الموارد موجودة في ملف واحد.
دعونا نعود إلى هايكو. حل مذهل، لا استثناءات. وفق :
تم تطوير تنسيق HVIF خاص، تم تحسينه بدرجة كبيرة ليناسب الأحجام الصغيرة والعرض السريع. ولذلك، فإن أيقوناتنا في معظمها أصغر بكثير من تلك الموجودة في البيانات النقطية أو بتنسيق SVG المستخدم على نطاق واسع.
وما زالت محسنة:

أحجام الأيقونات بتنسيق HVIF مقارنة بالتنسيقات الأخرى.
الفرق هو أمر من حيث الحجم!
لكن السحر لا ينتهي هنا. يمكن أن يُظهر نفس HVIF مستويات مختلفة من التفاصيل اعتمادًا على الحجم المعروض، على الرغم من أنه تنسيق متجه.

مستويات مختلفة من التفاصيل (LOD) حسب حجم العرض
الآن فيما يتعلق بالعيوب: لا يمكنك استخدام SVG وإلقائه في ImageMagick واستدعائه يوميًا، بل يتعين عليك المرور بعدة دورات لإنشاء رمز بتنسيق HVIF. تفسيرات. ومع ذلك، يمكن لـ IconOMatic استيراد SVG بشكل غير كامل؛ يتم استيراد حوالي 90% من تفاصيل SVG مع بعض الاحتمالات، بينما يجب تكوين الـ 10% المتبقية وتغييرها يدويًا. اقرأ المزيد حول كيفية عمل HVIF لسحره على المدونة
إضافة أيقونة للتطبيق
يمكنني الآن إضافة رمز إلى الحزمة التي تم إنشاؤها مع الأخذ بعين الاعتبار جميع المعلومات الواردة.
حسنًا، نظرًا لأنني لست متحمسًا بشكل خاص لرسم الرمز الخاص بي لتطبيق QtQuickApp الخاص بي "Hello, World" في الوقت الحالي، فقد قمت بسحبه من 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دعونا نتحقق من نسخ الرمز:
/Haiku/home> xres -l /Haiku/home/QtQuickApp/QtQuickApp/Haiku/home/QtQuickApp/QtQuickApp
resources:type ID size name
------ ----------- ----------- --------------------
'VICN' 101 152238 BEOS:ICONيبدو الأمر جيدًا، ولكن لماذا لا يظهر عند نسخ الأيقونة الجديدة؟

VICN:101:BEOS:ICONs المنسوخة لم يتم استخدامها بعد كرمز تطبيق في مدير الملفات
ماذا افتقد؟
تعليق المطور:
نحن بحاجة إلى إنشاء ملف
rdefبكل الموارد، ثم قم بتنفيذ الأمرrc имя.rdefسيؤدي هذا إلى إنشاء الملف.rsrc. ثم تحتاج إلى تشغيل الأمرresattr -o имя_бинарника имя.rsrc. كحد أدنى، أستخدم أوامر مثل هذه لإضافة أيقونات إلى البرامج النصية الخاصة بي.
حسنًا، أردت إنشاء مورد، وليس سمة. انا حقا مرتبك.
التخزين المؤقت الذكي باستخدام نظام الملفات
فتح وقراءة سمات ELF بطيء. كما كتبت أعلاه، يتم كتابة الرمز كمورد في الملف نفسه. هذه الطريقة أكثر موثوقية وتسمح لك بالبقاء على قيد الحياة أثناء النسخ إلى نظام ملفات آخر. ومع ذلك، يتم نسخه أيضًا إلى سمة نظام الملفات، على سبيل المثال BEOS:ICON. يعمل هذا فقط على أنظمة ملفات معينة، مثل BFS. تتم قراءة الرموز التي يعرضها النظام (في Tracker وDeskbar) من هذه السمة الموسعة، لأن هذا الحل يعمل بسرعة. في بعض الأماكن (حيث لا تكون السرعة مهمة، على سبيل المثال، نافذة "حول" النموذجية)، يتلقى النظام الرمز مباشرة من المورد الموجود في الملف. ولكن هذا ليس نهاية المطاف. تذكر، على نظام Mac، يمكن للمستخدمين استبدال أيقونات التطبيقات والأدلة والمستندات برموزهم الخاصة، حيث أنه في نظام Mac من الممكن القيام بهذه الأشياء "المهمة"، على سبيل المثال . في Haiku، يجب أن تفكر في المورد (في الملف) باعتباره الرمز الأصلي الذي يأتي مع التطبيق، والسمة (في نظام ملفات BFS) كشيء يسمح للمستخدم بإجراء تغييرات حسب الرغبة (على الرغم من ذلك، تلميح، واجهة المستخدم الرسومية لإدراج رمز مخصص أعلى الرمز اختيارية ولم يتم تنفيذها افتراضيًا بعد).
التحقق من سمات نظام الملفات
استخدام resaddr من الممكن التحقق من سمات نظام الملفات وتعيينها.
/> 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.
(...)إنه في الأساس "الغراء" الذي ينفذ التحويل ذهابًا وإيابًا بين الموارد (الموثوقة) وسمات نظام الملفات (السريعة). وبما أن النظام يتوقع تلقي الموارد ويقوم بالنسخ تلقائيًا، فلن أقلق بشأن ذلك بعد الآن.
سحر حزم hpkg
تُستخدم الحزم حاليًا (في أغلب الأحيان) للحصول على برامج على Haiku .hpkg. لا تنخدع بالاسم البسيط: يعمل تنسيق .hpkg بشكل مختلف تمامًا عن التنسيقات الأخرى ذات الأسماء المشابهة التي واجهتها، فهو يتمتع بقوى خارقة حقيقية.
مع تنسيقات الحزم التقليدية، كنت منزعجًا لفترة طويلة بسبب هذه الحقيقة: تقوم بتنزيل شيء واحد (الحزمة)، ويتم تثبيت شيء آخر على النظام (الملفات الموجودة داخل الحزمة). من الصعب جدًا إدارة الملفات (على سبيل المثال، حذفها) عند تثبيت الحزمة بالطريقة التقليدية. وكل ذلك بسبب محتويات الحزمة منتشرة في جميع أنحاء نظام الملفات، بما في ذلك الأماكن التي قد لا يتمكن المستخدم العادي من الوصول إليها للكتابة. وهذا يؤدي إلى ظهور فئة كاملة من البرامج - مديري الحزملكن نقل البرامج المثبتة مسبقًا، على سبيل المثال، إلى جهاز آخر أو محرك أقراص قابل للإزالة أو خادم ملفات، يصبح أكثر صعوبة، إن لم يكن مستحيلاً تمامًا. في نظام تقليدي قائم على Linux قد يصل عدد الملفات المنفصلة إلى مئات الآلاف أو حتى ملايين الملفات بسهولة. وبطبيعة الحال، فإن هذا الأمر هش وبطيء، على سبيل المثال أثناء تثبيت النظام الأولي، وعند تثبيت وتحديث وإزالة الحزم الشائعة، وعند نسخ وحدة التخزين الرئيسية (قسم الجذر) إلى قرص آخر.
أعمل على مشروع AppImage، وهو حل جزئي لتطبيقات المستخدم النهائي. إنه تنسيق لتوزيع البرامج يجمع التطبيق وجميع تبعياته في صورة نظام ملفات واحدة، يتم تحميلها عند تشغيل التطبيق. يُبسط هذا الأمر الأمور بشكل كبير، حيث يصبح برنامج ImageMagick نفسه ملفًا واحدًا، يمكن إدارته بسهولة في مدير الملفات. يعمل هذا النهج المقترح فقط مع البرامج، كما يوحي اسم المشروع، وله أيضًا مجموعة من المشاكل الخاصة به، نظرًا لأن الأشخاص الذين يوزعون البرامج لـ Linuxإنهم دائماً ما يوجهون أصابع الاتهام إليّ.
دعونا نعود إلى هايكو. هل كان من الممكن إيجاد التوازن الأمثل بين أنظمة الحزم التقليدية وتسليم البرامج القائمة على الصور؟ حزم لها .hpkg في الواقع صور نظام الملفات المضغوطة. عندما يقوم النظام بالتمهيد، تقوم النواة بتحميل جميع الحزم المثبتة والنشطة مع رسائل النواة التالية تقريبًا:
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"رائع، نعم؟ انتظر هناك، سيكون الأمر أكثر برودة!
هناك باقة مميزة جداً:
KERN: package_daemon [16040020: 924] active package: "haiku-r1~beta1_hrev53242-1-x86_64.hpkg"أنه يحتوي على نظام تشغيل بسيط للغاية، بما في ذلك النواة. صدق أو لا تصدق، حتى النواة نفسها لا تتم إزالتها من وحدة تخزين التمهيد (القسم الجذر)، ولكن يتم تحميلها بعناية في مكانها من الحزمة .hpkgيا للعجب! لقد ذكرتُ سابقًا أن جزءًا من رقيّ نظام هايكو وتماسكه، في رأيي، ينبع من حقيقة أن النظام بأكمله، بدءًا من النواة ومساحة المستخدم الأساسية وصولًا إلى إدارة الحزم وبنية سطح المكتب، يتم تطويره بشكل مشترك من قِبل فريق واحد. تخيّل كم من المجموعات والفرق المختلفة ستكون مطلوبة لتشغيل نظام كهذا. Linux أتخيل مشروع الجروLinuxملاحظة المترجم:ثم تخيل كم سيستغرق تطبيق هذا النهج في التوزيعات. يقولون: خذ مهمة بسيطة، قسّمها بين مطورين مختلفين، وستصبح معقدة لدرجة يصعب معها حلها. في هذه الحالة، كان تطبيق هايكو بمثابة كشف حقيقي لي. أعتقد أن هذا بالضبط ما يحدث في Linux سيشاس (Linux في هذه الحالة، هو مصطلح جماعي يشير إلى مجموعة من العناصر Linux/GNU/dpkg/apt/systemd/Xorg/dbus/Gtk/GNOME/XDG/Ubuntu).
التراجع عن النظام باستخدام hpkg
كم مرة يحدث الموقف التالي: كان التحديث ناجحًا، ثم تبين أن شيئًا ما لا يعمل كما ينبغي؟ إذا كنت تستخدم مديري الحزم التقليديين، فمن الصعب إرجاع حالة النظام إلى نقطة زمنية قبل تثبيت الحزم الجديدة (على سبيل المثال، في حالة حدوث خطأ ما). تقدم بعض الأنظمة حلولاً بديلة في شكل لقطات لنظام الملفات، ولكنها مرهقة للغاية ولا يتم استخدامها في جميع الأنظمة. Haiku يحل هذه المشكلة باستخدام الحزم .hpkg. كلما تغيرت الحزم في النظام، لا يتم حذف الحزم القديمة، ولكن يتم تخزينها في النظام في أدلة فرعية مثل /Haiku/system/packages/administrative/state-<...>/ باستمرار. تقوم العمليات غير المكتملة بتخزين بياناتها في الدلائل الفرعية /Haiku/system/packages/administrative/transaction-<...>/.

محتوى /Haiku/system/packages/administrative. تحتوي أدلة "الحالة..." على ملفات نصية بأسماء الحزم النشطة، وتحتوي أدلة "المعاملة..." على الحزم نفسها.
"الحالة النشطة القديمة"، أي. قائمة .hpkg الحزم النشطة قبل تسجيل التغييرات بعد كل عملية في مدير الملفات في ملف نصي /Haiku/system/packages/administrative/state-<...>/activated-packages. وبطريقة مماثلة، تتم كتابة "الحالة النشطة" الجديدة في ملف نصي /Haiku/system/packages/administrative/activated-packages.
دليل /Haiku/system/packages/administrative/state-<...>/ يحتوي فقط على ملف نصي يحتوي على قائمة الحزم النشطة لهذه الحالة (في حالة تثبيت الحزم دون إزالتها)، وإذا تمت إزالة الحزم أو تحديثها - يحتوي دليل الحالة على الإصدارات القديمة من الحزم.
عندما يقوم النظام بالتمهيد، بناءً على قائمة الحزم، يتم اتخاذ قرار بتنشيط (تحميل) الحزم. بكل بساطة! إذا حدث خطأ ما أثناء التنزيل، فيمكنك إخبار مدير التنزيلات باستخدام قائمة مختلفة وأقدم. تم حل المشكلة!

تحميل هايكو. تعرض كل نقطة دخول "الحالة النشطة" المقابلة لها
أحب أسلوب الحصول على ملفات نصية بسيطة كقائمة "الحالة النشطة"، بأسماء يسهل فهمها .hpkg. وهذا يتناقض بشكل صارخ مع كونها مصممة للآلات وليس للناس. من OSTree أو Flatpak في نظام الملفات (في نفس مستوى Microsoft GUID).

قائمة الحزم النشطة لكل نقطة زمنية
بيانات التكوين
على ما يبدو، في الكتالوج /Haiku/system/packages/administrative/writable-files يحتوي على ملفات تكوين للحزم، لكنها قابلة للكتابة. بعد كل شيء، كما تتذكر، .hpkg شنت للقراءة فقط. لذلك يجب نسخ هذه الملفات من الحزم قبل الكتابة. له المعنى.
تكامل واجهة المستخدم الرسومية لنظام .hpkg
دعونا الآن نرى كيف يمكن لهذه الحقائب لامعة .hpkg التعامل مع الاندماج في بيئة عمل المستخدم (UX). بعد كل شيء، هايكو مخصص للاستخدام الشخصي، بعد كل شيء. أنا شخصياً أضع معايير عالية عند مقارنة تجربة المستخدم بالحزم .app على ماكنتوش مع نفس التجربة .hpkgلن أقارن الوضع حتى ببيئات العمل في Linuxلأنه سيء للغاية مقارنة بأي شيء آخر.
تتبادر إلى الأذهان السيناريوهات التالية:
- أريد الاطلاع على محتويات الحزمة
.hpkg - أريد تثبيت حزمة
- أريد إزالة الحزمة
- أريد إزالة شيء ما دخل إلى النظام كجزء من الحزمة
- أريد نسخ شيء جاء إلى النظام كجزء من الحزمة
- أرغب في تنزيل جميع تبعيات الحزمة، والتي قد لا تكون جزءًا من كل تثبيت Haiku (على سبيل المثال، لدي جهاز معزول فعليًا ولا يمكنه الوصول إلى الإنترنت).
- أريد نقل حزمي (أو جزء منها) بشكل منفصل إلى موقع آخر، منفصل عن وحدة تخزين التمهيد (القسم الجذر) (لأنه، على سبيل المثال، ليس لدي مساحة كافية عليها).
يجب أن يغطي هذا معظم الحالات الرئيسية من عملي اليومي. حسنا، دعونا نبدأ.
التحقق من محتويات الحزمة
على ماك أقوم ببساطة بالنقر بزر الماوس الأيمن على الحزمة لفتحها وعرض محتوياتها في Finder. ففي نهاية المطاف، هو في الواقع مجرد دليل مقنع! (أعلم أن هناك حزمًا .pkg لجزء من النظام ليس تطبيقات، ولكن المستخدمين العاديين في أغلب الأحيان لا يتفاعلون معهم).
على هايكو أنقر بزر الماوس الأيمن على الحزمة، ثم انقر على "المحتويات" لرؤية ما بداخلها. ولكن هنا مجرد قائمة بالملفات دون القدرة على فتحها بالنقر المزدوج.
سيكون من الأفضل بكثير لو كانت هناك طريقة لتركيب الحزمة (مؤقتًا). .hpkg ليتم عرضها من خلال مدير الملفات، ولن يضطر المستخدم إلى القلق بشأن تفاصيل التنفيذ. (بالمناسبة، يمكنك فتح .hpkg حزمة في Expander، والذي يمكنه فك ضغطه مثل أي أرشيف آخر).

تتيح لك واجهة HaikuDepot عرض قائمة بملفات الحزمة، ولكن لا توجد طريقة لعرض المحتويات عن طريق النقر المزدوج على README.md على سبيل المثال.
يفوز جهاز Mac في هذه الفئة، ولكن إضافة وظيفة HaikuDepot التي تريدها لن تكون صعبة للغاية.
تثبيت الحزمة عبر واجهة المستخدم الرسومية
على ماكمعظم صور القرص .dmg تحتوي على حزم .app. انقر نقرًا مزدوجًا فوق صورة القرص ثم انسخ الحزمة، على سبيل المثال، عن طريق سحبها إليها /Applications في الباحث. هذا أمر بديهي بالنسبة لي، لكني سمعت أن بعض المبتدئين قد لا يتمكنون من التعامل مع هذا الأمر. بشكل افتراضي، "تقترح" Apple دليلاً على مستوى النظام /Applications (في NeXT كان الأمر متصلًا بالشبكة وكذلك فرديًا)، ولكن يمكنك بسهولة وضع تطبيقاتك على خادم ملفات أو في دليل فرعي $HOME/Applications، إذا كنت ترغب في ذلك بهذه الطريقة.
على هايكوانقر نقرًا مزدوجًا على الحزمة، ثم انقر على "تثبيت" - الأمر في غاية البساطة. لكنني أتساءل، ماذا يحدث إذا كانت الحزمة تحتوي على تبعيات متوفرة في HaikuPorts ولكنها لم تُثبّت بعد؟ Linux إنهم لا يعرفون حقًا ما يجب فعله في هذا الموقف، لكن الحل واضح: سؤال المستخدم عما إذا كان بحاجة إلى تنزيل وتثبيت التبعيات. هذا بالضبط ما يفعله هايكو.

قمتُ بتنزيل حزمة "sanity" يدويًا ونقرتُ عليها؛ يعرف مدير الحزم من أين يحصل على تبعياتها (بافتراض أن المستودعات مسجلة بالفعل في النظام). ليس كل توزيعة تعمل بهذه الطريقة. Linux بإمكانه فعل ذلك.
هناك طريقة أخرى وهي استخدام مدير الملفات، فقط قم بالسحب والإفلات .hpkg الحزمة أو في /Haiku/system/packages (للتثبيت على مستوى النظام، بشكل افتراضي)، أو في /Haiku/home/config/packages (للتثبيت الفردي؛ غير متاح عند النقر المزدوج - ما زلت منزعجًا من كلمة "config" الموجودة في هذا المكان، والتي تعتبر في هذه الحالة مرادفة لـ "الإعدادات"). ومفهوم تعدد المستخدمين ليس متاحًا حتى الآن لـ Haiku (ربما هذا هو السبب وراء كونه بسيطًا جدًا - لا أعرف، ربما تؤدي إمكانيات تعدد المستخدمين إلى تعقيد الأمور بشكل غير ضروري بالنسبة لبيئة سطح المكتب).
يفوز Haiku في هذه الفئة لأنه لا يمكنه العمل مع التطبيقات فحسب، بل أيضًا مع برامج النظام.
إزالة حزمة من واجهة المستخدم الرسومية
على ماك، تحتاج إلى سحب أيقونة التطبيق إلى سلة المهملات، وهذا كل شيء. بسهولة!
على هايكو، أولاً، تحتاج إلى العثور على مكان وجود الحزمة على النظام، لأنك نادرًا ما تقوم بتثبيتها في المكان المناسب (النظام يفعل كل شيء). عادة ما تحتاج إلى النظر فيها /Haiku/system/packages (مع التثبيت الافتراضي على مستوى النظام)، أو في /Haiku/home/config/packages (هل ذكرت أن كلمة "config" هي تسمية خاطئة؟). ثم يتم سحب التطبيق ببساطة إلى سلة المهملات، وهذا كل شيء.
بسهولة! ومع ذلك، لن أقول ذلك. إليك ما يحدث بالفعل:

هذا ما يحدث إذا قمت بسحب تطبيق إلى سلة المهملات منه /Haiku/system/packages
لقد حاولت للتو نقل تطبيق "Hello World" الخاص بي بالأمس على QtQuickApp إلى سلة المهملات. لم أحاول نقل دليل النظام، وبما أن كافة الحزم مثبتة في دليل النظام، فمن المستحيل إزالة الحزمة .hpkg دون تغيير "محتوياته". سيشعر المستخدم العادي بالخوف ويضغط على زر "إلغاء" المخصص افتراضيًا.
يشرح :
هذا المنشور عمره أكثر من 10 سنوات. على الأرجح نحتاج إلى تكوينه بحيث يظهر التحذير فقط عند نقل الحزمة نفسها. لا يحتاج المستخدمون العاديون إلى القيام بذلك على أي حال.
حسنًا، ربما ينبغي عليّ القيام بذلك باستخدام HaikuDepot؟ قمت بالنقر المزدوج على الحزمة الموجودة /Haiku/system/packages، في انتظار ظهور زر "إلغاء التثبيت". كلا، هناك (فقط) "تثبيت". "إلغاء التثبيت"، أين أنت؟
من أجل المتعة فقط، حاولت معرفة ما سيحدث إذا قمت بالنقر فوق "تثبيت" على حزمة مثبتة بالفعل. اتضح مثل هذا:

يحدث هذا إذا حاولت تثبيت حزمة مثبتة بالفعل.
يظهر التالي:

إذا قمت بالنقر فوق "تطبيق التغييرات" في النافذة السابقة، فسوف يبدو الأمر هكذا
أفترض أن هذا خطأ برمجي؛ رابط التطبيق موجود بالفعل. [لم يقدم المؤلف رابطًا - تقريبًا. مترجم]
الحل السريع: أضف زر "إلغاء التثبيت" إذا كانت الحزمة موجودة بالفعل
/Haiku/system/packagesأو في/Haiku/home/config/packages.
عند عرض قائمة الحزم المثبتة في HaikuDepot، أرى الحزمة الخاصة بي في القائمة ويمكنني إزالتها.
يفوز جهاز Mac في هذه الفئة. لكن يمكنني أن أتخيل أنه مع الإعداد المناسب، ستكون تجربة المستخدم على Haiku أفضل منها على Mac. (قام أحد المطورين بتقييمه على هذا النحو: "أقل من ساعة لإضافة الوظيفة المحددة إلى HaikuDepot، إذا كنت تعرف القليل من لغة C++"، هل من متطوعين؟)
إزالة شيء من الحزمة
دعونا نحاول إزالة التطبيق نفسه، وليس الحزمة .hpkg، الذي جاء منه (أشك في أنه بالنسبة لـ "مجرد البشر" هناك أي فرق).
على ماك، عادةً ما يعمل المستخدم مع الملف .dmgمن أين تأتي حزمة التطبيق؟ .app. عادة الصور .dmg يتم تجميعها في دليل التنزيلات، ويتم نسخ الحزم من قبل المستخدم إلى /Applications. يُعتقد أن العديد من المستخدمين أنفسهم لا يعرفون ماذا يفعلون، وهذه الفرضية أكدها موظف سابق في شركة Apple. (أحد الأشياء التي لا أحبها على نظام Mac. وعلى سبيل المثال، مع AppImage، لا يوجد فرق بين التطبيق والحزمة الموجودة فيه. اسحب الرمز إلى سلة المهملات = هذا كل شيء. سهل!)
على هايكو، هناك أيضا تقسيم بين apps/ и packages/، لذلك أشك في أن هذا جعل الأمر أكثر وضوحًا للمستخدمين. ولكن ماذا يحدث إذا قمت بسحب تطبيق من apps/ أضف إلى السلة:

هذا ما يحدث عندما تحاول إزالة تطبيق مأخوذ من ملف .hpkg
هذا صحيح من الناحية الفنية (بعد كل شيء، تتم استضافة التطبيق على نظام ملفات للقراءة فقط في المقام الأول)، ولكنه ليس مفيدًا بشكل خاص للمستخدم.
الحل السريع: اقترح استخدام واجهة المستخدم الرسومية للحذف بدلاً من ذلك
.hpkg
للمتعة فقط، حاولت تكرار التطبيق بالضغط على Alt+D. تلقيت الرسالة "غير قادر على نقل الكائنات أو نسخها على وحدة تخزين للقراءة فقط." وكل ذلك بسبب /system (بجانب /system/packages и /system/settings) هي نقطة تحميل packagefs (تذكر كيف تظهر في الإخراج df؟). لسوء الحظ، إخراج الأمر mount لا يوضح الوضع (كما قيل في أحد المقالات السابقة)، mountvolume لا يُظهر ما تبحث عنه (من الواضح أن الحزم مثبتة عبر حلقة .hpkg لا تعتبر "مجلدات")، ونسيت أيضًا الأوامر البديلة.
لم يفز أحد في هذه الفئة باستثناء AppImage (لكن هذا، بصراحة، رأي متحيز). ومع ذلك، يمكن للمرء أن يتخيل أنه بعد التغيير والتبديل، ستكون تجربة المستخدم على Haiku أفضل منها على Mac.
ملحوظة: أنت بحاجة إلى معرفة ما هو "الحجم" بالنسبة إلى "القسم". ربما يكون هذا أقرب إلى العلاقة بين "المجلد" و"الدليل": تظهر معظم الأدلة كمجلدات في مدير الملفات، ولكن ليس جميعها (يتم التعامل مع الحزم كملفات، على سبيل المثال). هل هذا النوع من العرض يجعلني مهووسًا رسميًا؟
نسخ محتويات الحزمة إلى نظام آخر
على ماك، أنا أسحب الحزمة بغباء .appوبما أن التبعيات موجودة داخل الحزمة، فإنها تتحرك معًا.
على هايكو، أقوم بسحب التطبيق، لكن لا تتم معالجة التبعيات على الإطلاق.
الحل السريع: دعنا نقترح بدلاً من ذلك سحب الحزمة `.hpkg بأكملها، بالإضافة إلى أي تبعيات، إن وجدت.
من الواضح أن جهاز Mac يفوز في هذه الفئة. على الأقل بالنسبة لي، عاشق لنموذجهم. يجب أن أنسخها إلى هايكو .hpkg بدلا من تطبيق ولكن النظام لا يقدم لي هذا ...
قم بتنزيل الحزمة بكل تبعياتها
ليست كل الأجهزة متصلة بالإنترنت طوال الوقت. في الواقع، بعض الأجهزة (نعم، أنا أتحدث إليكم أيها الأجهزة الحديثة) Windowsماك و Linuxانسَ هذا. بالنسبة لي، من المهم أن أتمكن من الذهاب، على سبيل المثال، إلى مقهى إنترنت، وتنزيل برنامج على قرص تخزين خارجي، وإدخال هذا القرص في جهاز الكمبيوتر المنزلي الخاص بي، والتأكد من أن كل شيء سيعمل [شخص مغامر، أن يقوم بمثل هذا الأمر على Windows... — ملاحظة المترجم].
ونتيجة لذلك، غالباً ما ينتهي بي الأمر، أكثر من المعتاد، بوجود تبعيات غير مُرضية على Windows и Linux.
على ماك عادةً ما يكون هذا ملفًا واحدًا، كل ما عليك فعله هو تنزيله .dmg. في أغلب الأحيان، لا يحتوي على أي تبعيات غير تلك التي يوفرها نظام MacOS نفسه افتراضيًا. الاستثناء هو التطبيقات المعقدة التي تتطلب بيئة تنفيذ مناسبة، على سبيل المثال Java.
على هايكو حزمة التنزيل .hpkg على سبيل المثال، قد لا يكون نفس التطبيق في Java كافيًا، نظرًا لأن Java قد تكون موجودة أو لا تكون موجودة على الجهاز المستهدف. هل هناك طريقة لتنزيل كافة التبعيات لحزمة معينة .hpkg، بخلاف تلك التي يتم تثبيتها افتراضيًا في Haiku وبالتالي يجب أن تكون على كل نظام Haiku؟
يفوز جهاز Mac بهذه الفئة بهامش صغير.
تعليقات السيد. واد سبلاش:
لكتابة برنامج لجمع كافة تبعيات التطبيق كمجموعة من الحزم
.hpkgبالنسبة لشخص مطلع على الأعمال الداخلية لهايكو، حوالي 15 دقيقة كافية. إن إضافة الدعم لهذا ليس بالأمر الصعب إذا كانت هناك حاجة حقيقية لذلك. لكن بالنسبة لي هذه حالة نادرة.
دعونا نحبس أنفاسنا حتى المقالة التالية في هذه السلسلة.
نقل الطرود إلى مكان منفصل
كما كتبت سابقًا، أريد أن أضع الطرود الخاصة بي .hpkg (حسنًا، أو جزء منها) إلى مكان خاص، منفصل عن الموضع المعتاد على وحدة تخزين التمهيد (قسم الجذر). في الحالة المعتادة (وليست النظرية)، السبب في ذلك هو نفاد المساحة الحرة على الأقراص (المدمجة) باستمرار، بغض النظر عن حجمها. وعادة ما أقوم بتوصيل محركات الأقراص الخارجية أو مشاركات الشبكة حيث توجد تطبيقاتي.
على ماك أنا مجرد نقل الطرود .app إلى محرك أقراص قابل للإزالة أو دليل شبكة في Finder، وهذا كل شيء. لا يزال بإمكاني النقر نقرًا مزدوجًا لفتح التطبيق كما أفعل عادةً من وحدة تخزين التمهيد. فقط!
على هايكوكما قيل لي، يمكن تحقيق ذلك عن طريق تحريك ملفي .hpkg حزم إلى محرك أقراص قابل للإزالة أو دليل شبكة، ولكن بعد ذلك تحتاج إلى استخدام بعض الأوامر غير الموثقة في وحدة التحكم لتثبيتها على النظام. لا أعرف كيفية القيام بذلك باستخدام واجهة المستخدم الرسومية فقط.
يفوز جهاز Mac في هذه الفئة.
وفقا للسيد. واد سبلاش:
هذا هو التحسين على أساس الاستخدام العادي. وفي حالة وجود طلب من أكثر من مستخدم سنقوم بتنفيذه. على أية حال، هناك إمكانية تنفيذ طرف ثالث.
سنتحدث عن هذا في المقال التالي.
عند الحديث عن أدلة الشبكة، سيكون من الرائع (أعتقد أن أطراف الشبكة المحلية) أن يكون لديك تطبيقات بسيطة وقابلة للاكتشاف وعلى مستوى الشبكة (مثل Zeroconf) يمكن نسخها إلى الكمبيوتر المحلي أو تشغيلها مباشرة من الشبكة المحلية. وبطبيعة الحال، لدى المطورين خيار إلغاء الاشتراك عبر app_flags.
التقرير النهائي عن تكامل نظام hpkg مع واجهة المستخدم الرسومية
أعتقد أن ذلك يرجع في المقام الأول إلى الحداثة النسبية للتكامل .hpkg واجهة المستخدم الرسومية لا تزال تترك الكثير مما هو مرغوب فيه. على أي حال، هناك بعض الأشياء التي يمكن تحسينها فيما يتعلق بتجربة المستخدم...
شيء آخر: Kernel Debug Land
سيكون من الرائع أن تكون قادرًا على إدخال الأوامر أثناء ذعر النواة، على سبيل المثال syslog | grep usb. حسنًا، هذا ممكن على Haiku بفضل Kernel Debug Land. كيف يمكنك رؤية هذا السحر أثناء العمل إذا كان كل شيء يعمل كما ينبغي دون الدخول في ذعر النواة؟ سهل بالضغط على Alt+PrintScn+D (تصحيح الأخطاء). أتذكر على الفور ، مما سمح لمطوري Macintosh الأصليين بالدخول إلى مصحح الأخطاء (إذا كان مثبتًا بالطبع).
اختتام
بدأت أفهم أن تعقيد نظام هايكو يأتي من حقيقة أن العمل يتم تنفيذه من قبل فريق واحد صغير مع تركيز واضح على بيئة العمل، مع إمكانية الوصول إلى جميع طبقات النظام.
تناقض صارخ مع العالم Linux/GNU/dpkg/apt/systemd/Xorg/dbus/Gtk/GNOME/XDG/Ubuntuحيث يتم تقسيم كل شيء إلى أجزاء صغيرة لدرجة أن التجريد يجلس على التجريد ويقود بعكازات.
وكان هناك أيضا فهم لكيفية عمل النظام .hpkg يجمع بين أفضل ممارسات مديري الحزم التقليديين، Snappy، وFlatpak، وAppImage، وحتى btrfs، ويمزجها مع نهج Mac "يعمل فقط".
كان الأمر كما لو أن شيئًا ما "تغير" في رأسي، وفهمت كيف كان النظام .hpkg تعرف كيف تتدحرج بعيدًا بمجرد النظر إليها. لكن هذا ليس أنا، بل جمال النظام وبساطته. الكثير من هذا مستوحى من روح جهاز Mac الأصلي.
نعم، قد يكون التصفح في المتصفح متشنجًا ويعمل مثل الحلزون، وقد تكون التطبيقات غير موجودة (لا يوجد Gtk، Electron - خلص المطورون إلى أنهم لا يتناسبون مع التطور)، وقد يكون الفيديو والتسريع ثلاثي الأبعاد غائبين تمامًا، لكنني ما زلت مثل هذا النظام. ففي نهاية المطاف، يمكن تصحيح هذه الأمور وستظهر عاجلاً أم آجلاً. إنها مسألة وقت فقط وربما عين حمراء صغيرة.
لا أستطيع تقديم المساعدة، ولكن أعتقد أنها ستبدأ من الآن فصاعدا سنة هايكو على سطح المكتب.
مشاكل عشوائية
ربما هناك طلبات بالفعل، أم يجب أن أفتحها؟
- يجب أن يكون BeScreenCapture قادرًا على التصدير إلى GIF مثل Peek. يمكن القيام بذلك باستخدام ffmpeg، المتوفر بالفعل لـ Haiku. .
- يفشل برنامج لقطة الشاشة في التقاط نافذة مشروطة، وبدلاً من ذلك يلتقط الشاشة بأكملها
- لا يمكنك اقتصاص لقطات الشاشة باستخدام أداة الاقتصاص الخاصة بـ WonderBrush ثم حفظ النتيجة في ملف
- أنا لا أحب بشكل خاص مؤشر اليد في هايكو، لكن أعتقد أن الأمر يتعلق بالشعور بالحنين الدافئ. يعد هذا أمرًا مزعجًا بشكل خاص عند استخدام أداة الاقتصاص في Krita، حيث يؤدي إلى اقتصاص غير دقيق (راجع لقطات الشاشة لمربعات الحوار المشروطة في هذه المقالة). سيكون مؤشر التقاطع رائعًا. .
جربها بنفسك! بعد كل شيء، يوفر مشروع Haiku صورًا للتمهيد من قرص DVD أو USB تم إنشاؤها . للتثبيت ، ما عليك سوى تنزيل الصورة وحرقها على محرك أقراص فلاش USB باستخدام
هل لديك اسئلة؟ نحن ندعوك إلى الناطقين بالروسية .
نظرة عامة على الخطأ:
من الترجمة: هذا هو المقال السادس في سلسلة عن هايكو.
قائمة المقالات:
المصدر: www.habr.com
