Η πέμπτη μέρα μου με το Haiku: ας μεταφέρουμε μερικά προγράμματα

Η πέμπτη μέρα μου με το Haiku: ας μεταφέρουμε μερικά προγράμματα

TL? DR: Ένας αρχάριος είδε το Haiku για πρώτη φορά, προσπαθώντας να μεταφέρει ορισμένα προγράμματα από τον κόσμο του Linux.

Η πέμπτη μέρα μου με το Haiku: ας μεταφέρουμε μερικά προγράμματα
Το πρώτο μου πρόγραμμα μεταφοράς Haiku, συσκευασμένο σε μορφή hpkg

Πρόσφατα Ανακάλυψα το Haiku, ένα εκπληκτικά καλό λειτουργικό σύστημα για υπολογιστές.
Σήμερα θα μάθω πώς να μεταφέρω νέα προγράμματα σε αυτό το λειτουργικό σύστημα. Η κύρια εστίαση είναι μια περιγραφή της πρώτης εμπειρίας μετάβασης στο Haiku από την οπτική γωνία ενός προγραμματιστή Linux. Ζητώ συγγνώμη για τα ανόητα λάθη που έκανα στην πορεία, καθώς δεν έχει περάσει ούτε μια εβδομάδα από τότε που κατέβασα για πρώτη φορά το Haiku.

Θέλω να πετύχω τρεις στόχους:

  • Μεταφέρετε μια απλή εφαρμογή CLI
  • Μεταφορά μιας εφαρμογής από το GUI στο Qt
  • Στη συνέχεια, συσκευάστε τα σε μορφή hpkg (αφού ακόμα σκέφτομαι να προσαρμόσω το AppDir και το AppImage για Haiku...)

Ας αρχίσουμε. Σε ενότητες την τεκμηρίωση и ανάπτυξη, καθώς και στο wiki από το HaikuPorts βρήκα τη σωστή κατεύθυνση. Υπάρχει ακόμη και ένα διαδικτυακό βιβλίο PDF BeOS: Μεταφορά μιας εφαρμογής Unix.
467 σελίδες - και αυτό είναι από το 1997! Είναι τρομακτικό να κοιτάς μέσα, αλλά ελπίζω για το καλύτερο. Τα λόγια του προγραμματιστή είναι ενθαρρυντικά: «χρειάστηκε πολύς χρόνος επειδή το BeOS δεν ήταν συμβατό με το POSIX», αλλά το Haiku «ως επί το πλείστον» είναι ήδη έτσι.

Μεταφορά μιας απλής εφαρμογής CLI

Η πρώτη σκέψη ήταν να μεταφερθεί η εφαρμογή αβκντίδ, αλλά, όπως αποδείχθηκε, αυτό είναι ήδη έχουν κάνει πολύ καιρό πριν.

Πρώτη προσπάθεια: τίποτα για να παρακολουθήσετε

Αυτό που δεν μπορώ να καταλάβω είναι ότι ήδη Οι εφαρμογές έχουν μεταφερθεί στο Haiku για πάνω από 10 χρόνια - παρά το γεγονός ότι το ίδιο το λειτουργικό σύστημα δεν είναι ακόμη η έκδοση 1.0.

Δεύτερη προσπάθεια: ανάγκη να ξαναγράψω

Οπότε θα χρησιμοποιήσω ptouch-770, CLI για τον έλεγχο του εκτυπωτή Brother P-Touch 770 που χρησιμοποιώ για την εκτύπωση ετικετών.
Τυπώνω διάφορες ετικέτες πάνω του και ίσως το έχετε ήδη δει στο προηγούμενο άρθρο. Λίγο νωρίτερα, έγραψα ένα μικρό πρόγραμμα περιτυλίγματος GUI στην Python (καθώς είναι σε Gtk+, θα πρέπει να ξαναγραφτεί και αυτός είναι ένας καλός λόγος για να μάθετε).

Η πέμπτη μέρα μου με το Haiku: ας μεταφέρουμε μερικά προγράμματα
Εκτυπωτής ετικετών Brother P-Touch 770. Θα λειτουργήσει με το Haiku;

Ο διαχειριστής πακέτων Haiku γνωρίζει για τις βιβλιοθήκες και τις εντολές, οπότε αν λάβω ένα μήνυμα "δεν μπορώ να βρω libintl" κατά την εκτέλεση configure - Μόλις εκτοξεύω pkgman install devel:libintl και θα βρεθεί το απαιτούμενο πακέτο. Επίσης pkgman install cmd:rsync. Λοιπόν, κλπ.

Εκτός από τις περιπτώσεις που αυτό δεν λειτουργεί:

/Haiku/home> git clone https://github.com/probonopd/ptouch-770
Cloning into 'ptouch-770'...
remote: Enumerating objects: 134, done.
remote: Total 134 (delta 0), reused 0 (delta 0), pack-reused 134
Receiving objects: 100% (134/134), 98.91 KiB | 637.00 KiB/s, done.
Resolving deltas: 100% (71/71), done./Haiku/home> cd ptouch-770//Haiku/home/ptouch-770> make
gcc -Wall -O2 -c -o ptouch-770-write.o ptouch-770-write.c
ptouch-770-write.c:28:10: fatal error: libudev.h: No such file or directory
 #include <libudev.h>
          ^~~~~~~~~~~
compilation terminated.
Makefile:16: recipe for target 'ptouch-770-write.o' failed
make: *** [ptouch-770-write.o] Error 1/Haiku/home/ptouch-770> pkgman install devel:libudev
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:libudev": Name not found/Haiku/home/ptouch-770> pkgman install devel:udev
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:udev": Name not found

Ίσως το udev να βασίζεται πολύ σε Linux και επομένως να μην υπάρχει για το Haiku. Που σημαίνει ότι πρέπει να επεξεργαστώ τον πηγαίο κώδικα που προσπαθώ να μεταγλωττίσω.
Ε, δεν μπορείς να πηδήξεις πάνω από το κεφάλι σου και δεν ξέρω καν από πού να ξεκινήσω.

Τρίτη προσπάθεια

Θα ήταν ωραίο να έχουμε tmate για το Haiku, τότε θα επέτρεπα στους προγραμματιστές Haiku να συνδεθούν στην περίοδο λειτουργίας του τερματικού μου - σε περίπτωση που κάτι πάει στραβά. Οι οδηγίες είναι πολύ απλές:

./autogen.sh
./configure
make
make install

Φαίνεται καλό, οπότε γιατί να μην το δοκιμάσετε στο Haiku;

/Haiku/home> git clone https://github.com/tmate-io/tmate/Haiku/home> cd tmate//Haiku/home/tmate> ./autogen.sh
(...)/Haiku/home/tmate> ./configure
(...)
checking for libevent... no
checking for library containing event_init... no
configure: error: "libevent not found"/Haiku/home/tmate> pkgman install devel:libevent
(...)
The following changes will be made:
  in system:
    install package libevent21-2.1.8-2 from repository HaikuPorts
    install package libevent21_devel-2.1.8-2 from repository HaikuPorts
Continue? [yes/no] (yes) :
100% libevent21-2.1.8-2-x86_64.hpkg [965.22 KiB]
(...)
[system] Done.checking for ncurses... no
checking for library containing setupterm... no
configure: error: "curses not found"/Haiku/home/tmate> pkgman install devel:libcurses
(...)
*** Failed to find a match for "devel:libcurses": Name not found/Haiku/home/tmate> pkgman install devel:curses
(...)
*** Failed to find a match for "devel:curses": Name not found

Σε αυτό το βήμα ανοίγω το HaikuDepot και ψάχνω curses.
Βρέθηκε κάτι, το οποίο μου έδωσε μια υπόδειξη για μια πιο κατάλληλη ερώτηση:

/Haiku/home/tmate> pkgman install devel:libncurses
(...)
100% ncurses6_devel-6.1-1-x86_64.hpkg [835.62 KiB]
(...)./configure
(...)
checking for msgpack >= 1.1.0... no
configure: error: "msgpack >= 1.1.0 not found"/Haiku/home/tmate> pkgman install devel:msgpack
(...)
*** Failed to find a match for "devel:msgpack": Name not found/Haiku/home/tmate> pkgman install devel:libmsgpack
(...)
*** Failed to find a match for "devel:libmsgpack": Name not found

Πάλι πήγα στο HaikuDepot και, φυσικά, βρήκα devel:msgpack_c_cpp_devel. Ποια είναι αυτά τα περίεργα ονόματα;

/Haiku/home/tmate> pkgman install devel:msgpack_c_cpp_devel
100% repochecksum-1 [65 bytes]
Validating checksum for Haiku...done.
100% repochecksum-1 [64 bytes]
Validating checksum for HaikuPorts...done.
*** Failed to find a match for "devel:msgpack_c_cpp_devel": Name not found# Why is it not finding it? To hell with the "devel:".../Haiku/home/tmate> pkgman install msgpack_c_cpp_devel
(...)
The following changes will be made:
  in system:
    install package msgpack_c_cpp-3.1.1-1 from repository HaikuPorts
    install package msgpack_c_cpp_devel-3.1.1-1 from repository HaikuPorts
Continue? [yes/no] (yes) :
(...)/Haiku/home/tmate> ./configure
(...)
checking for libssh >= 0.8.4... no
configure: error: "libssh >= 0.8.4 not found"/Haiku/home/tmate> pkgman install devel:libssh/Haiku/home/tmate> make
(...)
In file included from /boot/system/develop/headers/msgpack.h:22,
                 from tmate.h:5,
                 from cfg.c:29:
/boot/system/develop/headers/msgpack/vrefbuffer.h:19:8: error: redefinition of struct iovec'
 struct iovec {
        ^~~~~
In file included from tmux.h:27,
                 from cfg.c:28:
/boot/system/develop/headers/posix/sys/uio.h:12:16: note: originally defined here
 typedef struct iovec {
                ^~~~~
Makefile:969: recipe for target 'cfg.o' failed
make: *** [cfg.o] Error 1

Σε αυτό το βήμα, συνειδητοποίησα ότι η μεταφορά ενός προγράμματος στο Haiku απαιτεί πολύ περισσότερες γνώσεις από αυτές που χρειάζονται για μια απλή ανακατασκευή.
Μίλησα με τους φιλικούς προγραμματιστές Haiku, αποδεικνύεται ότι υπάρχει ένα σφάλμα στο msgpack και μετά από λίγα λεπτά βλέπω μια ενημέρωση κώδικα στο HaikuPorts. Μπορώ να δω με τα μάτια μου πώς το διορθωμένο πακέτο πηγαίνοντας εδώ (build slave - εικονικές μηχανές).

Η πέμπτη μέρα μου με το Haiku: ας μεταφέρουμε μερικά προγράμματα
Δημιουργία του διορθωμένου πακέτου μηνυμάτων στο buildmaster

Στο μεταξύ στέλνω ένα patch στο upstream για να προσθέσετε υποστήριξη Haiku στο msgpack.

Πέντε λεπτά αργότερα, το ενημερωμένο πακέτο μηνυμάτων είναι ήδη διαθέσιμο στο Haiku:

/Haiku/home/tmate> pkgman update
(...)
The following changes will be made:
  in system:
    upgrade package msgpack_c_cpp-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
    upgrade package msgpack_c_cpp_devel-3.1.1-1 to 3.2.0-2 from repository HaikuPorts
Continue? [yes/no] (yes) : y
100% msgpack_c_cpp-3.2.0-2-x86_64.hpkg [13.43 KiB]
(...)
[system] Done.

Απροσδόκητα καλό. Το είπα αυτό?!

Επιστρέφω στο αρχικό πρόβλημα:

/Haiku/home/tmate> make
(...)
In file included from tmux.h:40,
                 from tty.c:32:
compat.h:266: warning: "AT_FDCWD" redefined
 #define AT_FDCWD -100

In file included from tty.c:25:
/boot/system/develop/headers/posix/fcntl.h:62: note: this is the location of the previous definition
 #define AT_FDCWD  (-1)  /* CWD FD for the *at() functions */

tty.c: In function 'tty_init_termios':
tty.c:278:48: error: 'IMAXBEL' undeclared (first use in this function); did you mean 'MAXLABEL'?
  tio.c_iflag &= ~(IXON|IXOFF|ICRNL|INLCR|IGNCR|IMAXBEL|ISTRIP);
                                                ^~~~~~~
                                                MAXLABEL
tty.c:278:48: note: each undeclared identifier is reported only once for each function it appears in
Makefile:969: recipe for target 'tty.o' failed
make: *** [tty.o] Error 1

Τώρα φαίνεται ότι το msgpack δεν φταίει. σχολιάζω IMAXLABEL в tty.c όπως αυτό:

tio.c_iflag &= ~(IXON|IXOFF|ICRNL|INLCR|IGNCR|/*IMAXBEL|*/ISTRIP);

Το αποτέλεσμα:

osdep-unknown.c: In function 'osdep_get_cwd':
osdep-unknown.c:32:19: warning: unused parameter 'fd' [-Wunused-parameter]
 osdep_get_cwd(int fd)
               ~~~~^~
make: *** No rule to make target 'compat/forkpty-unknown.c', needed by 'compat/forkpty-unknown.o'.  Stop.

Λοιπόν, πάμε πάλι... Με την ευκαιρία:

/Haiku/home/tmate> ./configure | grep -i OPENAT
checking for openat... no

κύριος. παφλασμός σας λέει πού να σκάψετε:

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd"
(...)/Haiku/home/tmate> make
(...)
In file included from tmux.h:40,
                 from window.c:31:
compat.h:266: warning: "AT_FDCWD" redefined
 #define AT_FDCWD -100

In file included from window.c:22:
/boot/system/develop/headers/posix/fcntl.h:62: note: this is the location of the previous definition
 #define AT_FDCWD  (-1)  /* CWD FD for the *at() functions */

make: *** No rule to make target 'compat/forkpty-unknown.c', needed by 'compat/forkpty-unknown.o'.  Stop.

Εδώ δημοσίευσα config.log.

Μου εξήγησαν ότι υπάρχει κάτι άλλο στο libnetwork εκτός από το libresolv στο Haiku. Προφανώς ο κώδικας χρειάζεται περαιτέρω επεξεργασία. Χρειάζεται σκέψη…

find . -type f -exec sed -i -e 's|lresolv|lnetwork|g'  {} ;

Το αιώνιο ερώτημα: τι συμβαίνει;

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd"
(...)/Haiku/home/tmate> make
(...)
# Success!# Let's run it:/Haiku/home/tmate> ./tmate
runtime_loader: /boot/system/lib/libssh.so.4.7.2: Could not resolve symbol '__stack_chk_guard'
resolve symbol "__stack_chk_guard" returned: -2147478780
runtime_loader: /boot/system/lib/libssh.so.4.7.2: Troubles relocating: Symbol not found

Το ίδιο, μόνο στο προφίλ. Googled και βρήκε αυτό. Αν προσθέσετε -lssp Το "μερικές φορές" βοηθά, προσπαθώ:

/Haiku/home/tmate> ./configure LDFLAGS="-lbsd -lssp"
(...)/Haiku/home/tmate> make
(...)/Haiku/home/tmate> ./tmate

Ουάου! Ξεκινάει! Αλλά…

[tmate] ssh.tmate.io lookup failure. Retrying in 2 seconds (non-recoverable failure in name resolution)

Θα προσπαθήσω να διορθώσω σφάλματα αρχείο εδώ:

/Haiku/home/tmate> strace -f ./tmate >log 2>&1

Το "Bad port ID" μοιάζει ήδη με επαγγελματική κάρτα χαϊκού. Ίσως κάποιος έχει μια ιδέα τι φταίει και πώς να το διορθώσετε; Αν ναι, θα ενημερώσω το άρθρο. Συνδέω με GitHub.

Μεταφορά της εφαρμογής GUI στο Qt.

Επιλέγω μια απλή εφαρμογή QML.

/> cd /Haiku/home//Haiku/home> git clone https://github.com/probonopd/QtQuickApp
/Haiku/home/QtQuickApp> qmake .
/Haiku/home/QtQuickApp> make
/Haiku/home/QtQuickApp> ./QtQuickApp # Works!

Πραγματικά απλό. Λιγότερο από ένα λεπτό!

Εφαρμογές συσκευασίας σε hpkg με χρήση haikuporter και haikuports.

Με τι να ξεκινήσω; Δεν υπάρχει απλή τεκμηρίωση, πηγαίνω στο κανάλι #haiku στο irc.freenode.net και ακούω:

  • Ομάδα package - ένας τρόπος δημιουργίας πακέτων χαμηλού επιπέδου. Ως επί το πλείστον, το PackageInfo της είναι αρκετό, όπως περιγράφεται στην ενότητα "Κάνοντας το σε ένα σωστό πακέτο .hpkg"
  • Πρέπει να κάνω κάτι ένα
  • Μπορεί να χρησιμοποιήσει hpkg-creator (κολλάει για μένα, αναφορά σφαλμάτων)

Δεν είναι ξεκάθαρο τι να κάνει. Υποθέτω ότι χρειάζομαι έναν οδηγό για αρχάριους σε στυλ Hello World, ιδανικά ένα βίντεο. Θα ήταν ωραίο να έχουμε επίσης μια βολική εισαγωγή στο HaikuPorter, όπως γίνεται στο GNU hello.

Διαβάζω τα εξής:

haikuporter είναι ένα εργαλείο για τη δημιουργία κοινών πακέτων έργων για Haiku. Χρησιμοποιεί το αποθετήριο HaikuPorts ως βάση για όλα τα πακέτα. Οι συνταγές Haikuporter χρησιμοποιούνται για τη δημιουργία πακέτων.

Επιπλέον, διαπιστώνω ότι:

Δεν χρειάζεται να αποθηκεύετε συνταγές στο χώρο αποθήκευσης HaikuPorts. Μπορείτε να φτιάξετε ένα άλλο αποθετήριο, να βάλετε τις συνταγές σε αυτό και μετά να το υποδείξετε στο haikuporter.

Ακριβώς αυτό που χρειάζομαι - αν δεν ψάχνω έναν τρόπο να κυκλοφορήσω δημόσια το πακέτο. Αλλά αυτό είναι ένα θέμα για άλλη ανάρτηση.

Εγκατάσταση haikuporter και haikuports

cd /boot/home/
git clone https://github.com/haikuports/haikuporter --depth=50
git clone https://github.com/haikuports/haikuports --depth=50
ln -s /boot/home/haikuporter/haikuporter /boot/home/config/non-packaged/bin/ # make it runnable from anywhere
cd haikuporter
cp haikuports-sample.conf /boot/home/config/settings/haikuports.conf
sed -i -e 's|/mydisk/haikuports|/boot/home/haikuports|g' /boot/home/config/settings/haikuports.conf

Γράφοντας μια συνταγή

SUMMARY="Demo QtQuick application"
DESCRIPTION="QtQuickApp is a demo QtQuick application for testing Haiku porting and packaging"
HOMEPAGE="https://github.com/probonopd/QtQuickApp"
COPYRIGHT="None"
LICENSE="MIT"
REVISION="1"
SOURCE_URI="https://github.com/probonopd/QtQuickApp.git"
#PATCHES=""
ARCHITECTURES="x86_64"
PROVIDES="
    QtQuickApp = $portVersion
"
REQUIRES="
    haiku
"
BUILD_REQUIRES="
    haiku_devel
    cmd:qmake
"BUILD()
{
    qmake .
    make $jobArgs
}INSTALL()
{
    make install
}

Συναρμολόγηση της συνταγής

Αποθηκεύω το αρχείο με το όνομα QtQuickApp-1.0.recipe, μετά την οποία εκκινώ aikuporter -S ./QuickApp-1.0.recipe. Οι εξαρτήσεις ελέγχονται για όλα τα πακέτα στο αποθετήριο haikuports, το οποίο χρειάζεται λίγο χρόνο. Θα πάω να πάρω έναν καφέ.

Γιατί να γίνει αυτός ο έλεγχος στο τοπικό μου μηχάνημα και όχι κεντρικά στον διακομιστή μια για όλους;

Σύμφωνα με τον κ. waddlesplash:

Με τέτοιο τρόπο ώστε να μπορείτε να ξαναγράψετε οποιοδήποτε αρχείο στο αποθετήριο 😉 Μπορείτε να το βελτιστοποιήσετε λίγο, υπολογίζοντας τις απαραίτητες πληροφορίες όταν χρειάζεται, γιατί οι τελευταίες αλλαγές που έγιναν είναι αρκετά σπάνιες.

~/QtQuickApp> haikuporter  QtQuickApp-1.0.recipe
Checking if any dependency-infos need to be updated ...
Looking for stale dependency-infos ...
Error: QtQuickApp not found in repository

Αποδεικνύεται ότι δεν υπάρχει ένα κανονικό αρχείο συνταγής που περιέχει τον πηγαίο κώδικα της εφαρμογής σας. Πρέπει να το διατηρήσετε σε ένα αποθετήριο σε μορφή HaikuPorts.

~/QtQuickApp> mv QtQuickApp-1.0.recipe ../haikuports/app-misc/QtQuickApp/
~/QtQuickApp> ../haikuport
~/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe

Αυτό το γεγονός καθιστά τη συναρμολόγηση πιο δυσκίνητη. Δεν μου αρέσει ιδιαίτερα, αλλά νομίζω ότι είναι απαραίτητο ώστε τελικά όλο το λογισμικό ανοιχτού κώδικα να εμφανίζεται στα HaikuPorts.

Παίρνω το εξής:

~/QtQuickApp> haikuporter -S QtQuickApp-1.0.recipe
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
Error: QtQuickApp-1.0.recipe not found in tree.

Τι τρέχει? Αφού διάβασα το irc κάνω:

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Downloading: https://github.com/probonopd/QtQuickApp.git ...
--2019-07-14 16:12:44--  https://github.com/probonopd/QtQuickApp.git
Resolving github.com... 140.82.118.3
Connecting to github.com|140.82.118.3|:443... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://github.com/probonopd/QtQuickApp [following]
--2019-07-14 16:12:45--  https://github.com/probonopd/QtQuickApp
Reusing existing connection to github.com:443.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git’
     0K .                                                     1.34M=0.06s
2019-07-14 16:12:45 (1.34 MB/s) - ‘/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git’ saved [90094]
Validating checksum of QtQuickApp.git
Warning: ----- CHECKSUM TEMPLATE -----
Warning: CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"
Warning: -----------------------------
Error: No checksum found in recipe!

Προέκυψε ένα ενδιαφέρον ερώτημα. Εάν προσθέσω ένα άθροισμα ελέγχου στη συνταγή - θα ταιριάζει με την τελευταία δέσμευση git για συνεχή ενσωμάτωση; (Ο προγραμματιστής επιβεβαιώνει: "Δεν θα λειτουργήσει. Οι συνταγές έχουν σχεδιαστεί για να είναι σχετικά σταθερές.")

Για διασκέδαση, προσθέστε στη συνταγή:

CHECKSUM_SHA256="cf906a65442748c95df16730c66307a46d02ab3a12137f89076ec7018d8ce18c"

Ακόμα δεν είμαι ικανοποιημένος:

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
        updating dependency infos of QtQuickApp-1.0
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------
Skipping download of source for QtQuickApp.git
Validating checksum of QtQuickApp.git
Unpacking source of QtQuickApp.git
Error: Unrecognized archive type in file /boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git

Τι κάνει? Μετά από όλα, αυτό είναι ένα αποθετήριο git, ο κώδικας είναι ήδη εκεί απευθείας, δεν υπάρχει τίποτα για να αποσυσκευαστεί. Από την άποψή μου, το εργαλείο θα πρέπει να είναι αρκετά έξυπνο ώστε να μην ψάχνει για αποσυμπιεστή εάν βρίσκεται πάνω από το url του GitHub.

Ίσως το uri git:// να λειτουργήσει

SOURCE_URI="git://github.com/probonopd/QtQuickApp.git"

Τώρα παραπονιέται ως εξής:

Downloading: git://github.com/probonopd/QtQuickApp.git ...
Error: Downloading from unsafe sources is disabled in haikuports.conf!

Χμ, γιατί είναι όλα τόσο περίπλοκα, γιατί δεν μπορείς να "εργάζεσαι"; Εξάλλου, δεν είναι τόσο ασυνήθιστο να δημιουργείς κάτι από το GitHub. Είτε πρόκειται για εργαλεία που λειτουργούν άμεσα, χωρίς την ανάγκη εγκατάστασης, είτε όπως το αποκαλώ «φασαρία».

Ίσως λειτουργήσει ως εξής:

SOURCE_URI="git+https://github.com/probonopd/QtQuickApp.git"

Οχι. Εξακολουθώ να λαμβάνω αυτό το περίεργο σφάλμα και το κάνω, όπως περιγράφεται εδώ

sed -i -e 's|#ALLOW_UNSAFE_SOURCES|ALLOW_UNSAFE_SOURCES|g' /boot/home/config/settings/haikuports.conf

Προχωρώ λίγο πιο πέρα, αλλά γιατί μου ουρλιάζει (το GitHub δεν είναι ασφαλές!) και εξακολουθεί να προσπαθεί να αποσυσκευάσει κάτι.

Σύμφωνα με κύριος. παφλασμός:

Λοιπόν, ναι, ο λόγος ήταν η επιθυμία να ελεγχθεί η ακεραιότητα των δεδομένων που ελήφθησαν για συναρμολόγηση. Μία από τις επιλογές είναι να επαληθεύσετε το άθροισμα ελέγχου του αρχείου, αλλά μπορείτε, φυσικά, να κατακερματίσετε μεμονωμένα αρχεία, τα οποία δεν θα εφαρμοστούν, επειδή παίρνει πολύ περισσότερο χρόνο. Η συνέπεια αυτού είναι η «ανασφάλεια» του git και άλλων VCS. Αυτό πιθανότατα θα συμβαίνει πάντα, καθώς η δημιουργία ενός αρχείου στο GitHub είναι αρκετά εύκολη και συχνά πιο γρήγορη. Λοιπόν, στο μέλλον, ίσως το μήνυμα σφάλματος να μην είναι τόσο φανταχτερό... (δεν συγχωνεύουμε πλέον τέτοιες συνταγές στο HaikuPorts).

~/QtQuickApp> haikuporter -S QtQuickApp
Checking if any dependency-infos need to be updated ...
Looking for stale dependency-infos ...
----------------------------------------------------------------------
app-misc::QtQuickApp-1.0
        /boot/home/haikuports/app-misc/QtQuickApp/QtQuickApp-1.0.recipe
----------------------------------------------------------------------Downloading: git+https://github.com/probonopd/QtQuickApp.git ...
Warning: UNSAFE SOURCES ARE BAD AND SHOULD NOT BE USED IN PRODUCTION
Warning: PLEASE MOVE TO A STATIC ARCHIVE DOWNLOAD WITH CHECKSUM ASAP!
Cloning into bare repository '/boot/home/haikuports/app-misc/QtQuickApp/download/QtQuickApp.git'...
Unpacking source of QtQuickApp.git
tar: /boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
Command 'git archive HEAD | tar -x -C "/boot/home/haikuports/app-misc/QtQuickApp/work-1.0/sources/QtQuickApp-1.0"' returned non-zero exit status 2

Από παλιά συνήθεια, πηγαίνω να ρωτήσω καλούς ανθρώπους στο κανάλι #haiku στο δίκτυο irc.freenode.net. Και πού θα ήμουν χωρίς αυτούς; Μετά την υπόδειξη, κατάλαβα ότι έπρεπε να χρησιμοποιήσω:

srcGitRev="d0769f53639eaffdcd070bddfb7113c04f2a0de8"
SOURCE_URI="https://github.com/probonopd/QtQuickApp/archive/$srcGitRev.tar.gz"
SOURCE_DIR="QtQuickApp-$srcGitRev"
CHECKSUM_SHA256="db8ab861cfec0ca201e9c7b6c0c9e5e828cb4e9e69d98e3714ce0369ba9d9522"

Εντάξει, έγινε σαφές τι κάνει - κατεβάζει ένα αρχείο με τον πηγαίο κώδικα μιας συγκεκριμένης αναθεώρησης. Είναι ανόητο, από την άποψή μου, και όχι ακριβώς αυτό που ήθελα, δηλαδή, να κατεβάσω την τελευταία αναθεώρηση από τον κύριο κλάδο.

Ένας από τους προγραμματιστές το εξήγησε ως εξής:

Έχουμε το δικό μας CI, επομένως ό,τι τοποθετείται στο αποθετήριο haikuports θα συσκευάζεται για όλους τους χρήστες και δεν θέλουμε να διακινδυνεύσουμε να συλλέξουμε και να παραδώσουμε «όλα στην πιο πρόσφατη έκδοση upstream».

Κατανοητό! Σε κάθε περίπτωση, έγινε αυτό:

waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
waiting for build package QtQuickApp-1.0-1 to be activated
(...)

Επαναλαμβάνει αυτό επ' άπειρον. Προφανώς πρόκειται για σφάλμα (υπάρχει εφαρμογή; Δεν μπόρεσα να τη βρω).

С haikuporter και αποθετήριο haikuports Δεν έχει μια αίσθηση "απλώς λειτουργεί", αλλά ως προγραμματιστής, υπάρχουν μερικά πράγματα που μου αρέσουν στη συνεργασία με το Haiku. Ως επί το πλείστον, είναι παρόμοιο με το Open Build Service, ένα σύνολο εργαλείων για τη δημιουργία εκδόσεων Linux: εξαιρετικά ισχυρό, με συστηματική προσέγγιση, αλλά υπερβολικό για τη μικρή μου εφαρμογή "hello world".

Και πάλι, σύμφωνα με τον κ. waddlesplash:

Πράγματι, το HaikuPorter είναι αρκετά αυστηρό από προεπιλογή (συν υπάρχει και μια λειτουργία lint καθώς και μια αυστηρή λειτουργία για να γίνει ακόμα πιο αυστηρό!), αλλά μόνο επειδή δημιουργεί πακέτα που θα λειτουργήσουν, αντί να δημιουργεί απλώς πακέτα. Γι' αυτό διαμαρτύρεται για μη δηλωμένες εξαρτήσεις, μη σωστή εισαγωγή βιβλιοθηκών, λανθασμένες εκδόσεις κ.λπ. Ο στόχος είναι να αντιμετωπιστούν όλα τα προβλήματα, συμπεριλαμβανομένων των μελλοντικών, πριν το μάθει ο χρήστης (γι' αυτό δεν ήταν δυνατή η εγκατάσταση του avrdude, επειδή η εξάρτηση προσδιορίστηκε στην πραγματικότητα στη συνταγή). Οι βιβλιοθήκες δεν είναι μόνο μεμονωμένα πακέτα ή ακόμη και συγκεκριμένες εκδόσεις SO. Το HaikuPorter διασφαλίζει ότι όλα αυτά τηρούνται στις ίδιες τις συνταγές για την αποφυγή σφαλμάτων κατά την εκτέλεση.

Κατ 'αρχήν, αυτό το επίπεδο αυστηρότητας δικαιολογείται κατά τη δημιουργία ενός λειτουργικού συστήματος, αλλά μου φαίνεται περιττό για μια εφαρμογή "hello world". Αποφάσισα να δοκιμάσω κάτι άλλο.

Δημιουργία εφαρμογών σε μορφή hpkg χρησιμοποιώντας την εντολή «δημιουργία πακέτου».

Ίσως αυτό Οι απλές οδηγίες θα λειτουργήσουν καλύτερα για μένα;

mkdir -p apps/
cp QtQuickApp apps/cat >  .PackageInfo <<EOF
name QtQuickApp
version 1.0-1
architecture x86_64

summary "Demo QtQuick application"
description "QtQuickApp is a demo QtQuick application for testing Haiku porting and packaging"

packager "probono"
vendor "probono"

copyrights "probono"
licenses "MIT"

provides {
  QtQuickApp = 1.0-1
}requires {
  qt5
}
EOFpackage create -b QtQuickApp.hpkg
package add QtQuickApp.hpkg apps# See below if you also want the application
# to appear in the menu

Απροσδόκητα γρήγορο, απροσδόκητα απλό, απροσδόκητα αποτελεσματικό. Όπως ακριβώς μου αρέσει, καταπληκτικό!

Εγκατάσταση - τι και πού;

Μετακινήθηκε το αρχείο QtQuickApp.hpkg στο ~/config/packagesχρησιμοποιώντας έναν διαχειριστή αρχείων, μετά τον οποίο εμφανίστηκε ως δια μαγείας το QtQuickApp ~/config/apps.
Και πάλι, απροσδόκητα γρήγορο, απλό και αποτελεσματικό. Καταπληκτικό, απίστευτο!

Αλλά... (πού θα ήμασταν χωρίς αυτούς!)

Η εφαρμογή εξακολουθεί να λείπει από τη λίστα μενού εφαρμογών και το QuickLaunch. Νομίζω ότι ξέρω ήδη πώς να το διορθώσω. Στη διαχείριση αρχείων μετακινώ το QtQuickApp.hpkg από ~/config/packages στο /system/packages.

Όχι, εξακολουθούν να λείπουν. Προφανώς, κάτι έχασα (καλά, και τις οδηγίες).

Έχοντας κοιτάξει την καρτέλα "Περιεχόμενα" στο HaikuDepot για κάποιες άλλες εφαρμογές, είδα ότι υπάρχουν αρχεία όπως /data/mimedb/application/x-vnd... αυτό που είναι ακόμα πιο αξιοσημείωτο είναι /data/deskbar/menu/Applications/….

Λοιπόν, τι να βάλω εκεί; Ελα...

mkdir -p data/deskbar/menu/Applications/
( cd data/deskbar/menu/Applications ; ln -s ../../../../apps/QtQuickApp . )
package add QtQuickApp.hpkg apps data

Είμαι σίγουρος ότι αυτό το τέχνασμα θα λειτουργήσει, αλλά τα ερωτήματα παραμένουν: γιατί είναι απαραίτητο, σε τι χρησιμεύει; Νομίζω ότι αυτό καταστρέφει τη συνολική εντύπωση ότι το σύστημα είναι τόσο εξελιγμένο.

Όπως εξήγησε ο κ. waddlesplash:

Μερικές φορές υπάρχουν εφαρμογές που χρειάζονται άλλες εφαρμογές αλλά δεν βρίσκονται στο μενού. Για παράδειγμα, το LegacyPackageInstaller στο στιγμιότυπο οθόνης σας, επεξεργάζεται αρχεία .pkg σε μορφή BeOS. Θα ήθελα οι χρήστες να τα εγκαταστήσουν, αλλά η παρουσία τους στο μενού θα οδηγήσει σε σύγχυση.

Για κάποιο λόγο μου φαίνεται ότι υπάρχει πιο απλή λύση π.χ Hidden=true σε αρχεία .desktop σε Linux. Γιατί να μην κάνετε τις "κρυμμένες" πληροφορίες πόρο και χαρακτηριστικό του συστήματος αρχείων;

Αυτό που δεν είναι ιδιαίτερα διακριτικό είναι το όνομα μιας (κάποιας) εφαρμογής που εμφανίζει το μενού, deskbar, άκαμπτα δεμένο στην πορεία.

κύριος. Το waddlesplash εξηγεί αυτό:

Το "Deskbar" σε αυτήν την περίπτωση θα πρέπει να γίνει κατανοητό ως ένα είδος γενικού όρου (με τον ίδιο τρόπο όπως το "Taskbar", το οποίο αναφέρεται τόσο στην εφαρμογή των Windows όσο και στη γενική έννοια). Λοιπόν, από αυτό deskbar, όχι "Deskbar", αυτό μπορεί επίσης να γίνει κατανοητό με παρόμοιο τρόπο.

Η πέμπτη μέρα μου με το Haiku: ας μεταφέρουμε μερικά προγράμματα
2 "σχεδόν πανομοιότυποι" κατάλογοι με εφαρμογές μέσα τους

Γιατί υπάρχουν 2 κατάλογοι με εφαρμογές και επίσης γιατί το QtQuickApplication μου βρίσκεται στο ένα, αλλά όχι στο άλλο; (Εξάλλου, δεν πρόκειται για ένα σύστημα, αλλά για ένα δεύτερο χρήστη, κάτι που θα ήταν κατανοητό σε εμένα προσωπικά).
Είμαι πραγματικά μπερδεμένος και νομίζω ότι αυτό πρέπει να ενοποιηθεί.

σχόλιο από τον κ. παφλασμός

Ο κατάλογος Εφαρμογές περιέχει εφαρμογές που δεν χρειάζονται στο μενού. Αλλά η κατάσταση με το μενού πρέπει πραγματικά να βελτιωθεί, για να γίνει πιο προσαρμόσιμο.

Εφαρμογή, αλλιώς δεν θα γίνει 😉

Αναρωτήθηκα: είναι πραγματικά απαραίτητο να φιλοξενούμε εφαρμογές /system/apps, εάν οι χρήστες τα βλέπουν εκεί, δεν είναι επιθυμητό. Ίσως θα ήταν καλύτερο να τα τοποθετήσετε σε άλλο μέρος όπου ο χρήστης δεν θα τα συναντήσει; Ακριβώς όπως γίνεται στο Mac OS X, όπου τα περιεχόμενα των πακέτων .app, το οποίο δεν πρέπει να είναι ορατό στον χρήστη στο /Applications, κρύβεται στα βάθη του /System/Library/…“`.

Τι γίνεται με τις εξαρτήσεις;

Νομίζω ότι αξίζει να προσδιορίσετε τις εξαρτήσεις με κάποιο τρόπο, σωστά; Μπορεί το Qt να θεωρηθεί υποχρεωτικό μέρος της εγκατάστασης Haiku από προεπιλογή; Οχι! Το Qt δεν είναι εγκατεστημένο από προεπιλογή. Μπορεί ένα πρόγραμμα δημιουργίας πακέτων να εντοπίσει αυτόματα τις εξαρτήσεις ελέγχοντας τα αρχεία ELF; Μου είπαν ότι το HaikuPorter το κάνει αυτό, αλλά package Οχι. Αυτό συμβαίνει επειδή είναι απλώς ένας "δημιουργός πακέτων" που δημιουργεί μόνο του αρχεία hpkg.

Θα πρέπει να γίνει πιο εξελιγμένο το Haiku με την προσθήκη μιας πολιτικής σύμφωνα με την οποία ένα πακέτο δεν πρέπει να έχει εξαρτήσεις από πακέτα εκτός του Haiku; haikuports? (Το θα ήθελα γιατί μια τέτοια πολιτική θα έκανε τα πράγματα πολύ πιο εύκολα—το σύστημα θα μπορούσε να επιλύει αυτόματα εξαρτήσεις για κάθε πακέτο που λαμβάνεται από οπουδήποτε, χωρίς να μπλέκει με πρόσθετες πηγές πακέτων.)

κύριος. Ο waddlesplash εξηγεί:

Δεν θα θέλαμε να περιορίσουμε τόσο πολύ την ελευθερία των προγραμματιστών, γιατί είναι προφανές ότι αν η CompanyX θέλει να υποστηρίξει το δικό της σύνολο λογισμικού με εξαρτήσεις (και επομένως ένα αποθετήριο), θα το κάνει εντελώς ελεύθερα.

Σε αυτήν την περίπτωση, ίσως αξίζει να προτείνουμε τα πακέτα τρίτων να αποφεύγουν τις εξαρτήσεις από οτιδήποτε δεν περιλαμβάνεται στα haikuports, συσκευάζοντας πλήρως όλα όσα χρειάζονται με την εφαρμογή. Αλλά νομίζω ότι αυτό είναι ένα θέμα για ένα μελλοντικό άρθρο αυτής της σειράς. [Ο συγγραφέας κατευθύνεται προς το AppImage; — περίπου. μεταφράστης]

Προσθήκη εικονιδίου εφαρμογής

Τι γίνεται αν θέλω να προσθέσω ένα από τα προσεγμένα ενσωματωμένα εικονίδια στους πόρους της εφαρμογής που δημιούργησα πρόσφατα; Αποδεικνύεται ότι αυτό είναι ένα καταπληκτικό θέμα, επομένως θα είναι η βάση για το επόμενο άρθρο.

Πώς να οργανώσετε συνεχείς κατασκευές εφαρμογών;

Φανταστείτε ένα έργο όπως το Inkscape (ναι, γνωρίζω ότι δεν είναι ακόμα διαθέσιμο στο Haiku, αλλά είναι βολικό να εμφανίζεται σε αυτό). Έχουν ένα αποθετήριο πηγαίου κώδικα https://gitlab.com/inkscape/inkscape.
Κάθε φορά που κάποιος πραγματοποιεί τις αλλαγές του στο αποθετήριο, εκκινούνται build pipelines, μετά από τις οποίες οι αλλαγές δοκιμάζονται αυτόματα, δημιουργούνται και η εφαρμογή συσκευάζεται σε διάφορα πακέτα, συμπεριλαμβανομένου του AppImage για Linux (ένα αυτόνομο πακέτο εφαρμογής που μπορεί να ληφθεί για τοπική δοκιμή ανεξάρτητα τι μπορεί να εγκατασταθεί ή όχι στο σύστημα [Το ήξερα! — περίπου. μεταφράστης]). Το ίδιο συμβαίνει με κάθε αίτημα συγχώνευσης υποκαταστήματος, ώστε να μπορείτε να κάνετε λήψη της εφαρμογής που δημιουργήθηκε από τον κώδικα που προτείνεται στο αίτημα συγχώνευσης πριν από τη συγχώνευση.

Η πέμπτη μέρα μου με το Haiku: ας μεταφέρουμε μερικά προγράμματα
Αιτήματα συγχώνευσης με καταστάσεις έκδοσης και δυνατότητα λήψης των μεταγλωττισμένων δυαδικών αρχείων εάν η κατασκευή είναι επιτυχής (με πράσινο χρώμα)

Η κατασκευή εκτελείται σε κοντέινερ Docker. Το GitLab προσφέρει δωρεάν δρομείς σε Linux και νομίζω ότι μπορεί να είναι δυνατό να συμπεριλάβετε τους δικούς σας δρομείς (παρεμπιπτόντως, δεν βλέπω πώς θα λειτουργούσε αυτό για συστήματα όπως το Haiku, που ξέρω ότι δεν έχουν Docker ή αντίστοιχο, αλλά επίσης για το FreeBSD δεν υπάρχει Docker, επομένως αυτό το πρόβλημα δεν είναι μοναδικό στο Haiku).

Στην ιδανική περίπτωση, οι εφαρμογές Haiku μπορούν να κατασκευαστούν μέσα σε ένα κοντέινερ Docker για Linux. Σε αυτήν την περίπτωση, η συναρμολόγηση για το Haiku μπορεί να εισαχθεί σε υπάρχοντες αγωγούς. Υπάρχουν cross compilers; Ή πρέπει να μιμηθεί όλο το Haiku μέσα σε ένα κοντέινερ Docker χρησιμοποιώντας κάτι σαν το QEMU/KVM (υποθέτοντας ότι θα λειτουργήσει έτσι μέσα στο Docker); Παρεμπιπτόντως, πολλά έργα χρησιμοποιούν παρόμοιες αρχές. Για παράδειγμα, το Scribus το κάνει αυτό - είναι ήδη διαθέσιμο για Haiku. Μια μέρα θα έρθει η μέρα που θα μπορώ να στείλω τέτοιος Σύρετε αιτήματα σε άλλα έργα για να προσθέσετε υποστήριξη Haiku.

Ένας από τους προγραμματιστές εξηγεί:

Για άλλα έργα που επιθυμούν να δημιουργήσουν τα ίδια πακέτα, υποστηρίζεται η κανονική μέθοδος CMake/CPack. Άλλα συστήματα κατασκευής μπορούν να υποστηριχθούν καλώντας απευθείας το πρόγραμμα κατασκευής του πακέτου, κάτι που είναι εντάξει αν ενδιαφέρονται οι άλλοι για αυτό. Η εμπειρία δείχνει: μέχρι στιγμής δεν υπήρξε μεγάλο ενδιαφέρον, οπότε το haikuporter λειτούργησε όσο βολεύει για εμάς, αλλά, τελικά, και οι δύο μέθοδοι θα πρέπει να λειτουργούν μαζί. Θα πρέπει να εισαγάγουμε ένα σύνολο εργαλείων για λογισμικό πολλαπλής κατασκευής από το Linux ή οποιοδήποτε άλλο λειτουργικό σύστημα διακομιστή (το Haiku δεν έχει σχεδιαστεί για να εκτελείται σε διακομιστές).

χειροκροτώ. Οι τακτικοί χρήστες Linux μεταφέρουν όλο αυτό το πρόσθετο φορτίο και τις πρόσθετες αποσκευές (ασφάλεια, αυστηρό έλεγχο κ.λπ.) που είναι απαραίτητα για ένα λειτουργικό σύστημα διακομιστή, αλλά όχι για ένα προσωπικό. Συμφωνώ λοιπόν απόλυτα ότι η δυνατότητα δημιουργίας εφαρμογών Haiku σε Linux είναι ο καλύτερος τρόπος.

Συμπέρασμα

Η μεταφορά εφαρμογών POSIX στο Haiku είναι δυνατή, αλλά μπορεί να είναι πιο ακριβή από μια τυπική ανακατασκευή. Σίγουρα θα ήμουν κολλημένος με αυτό για πολύ καιρό αν δεν υπήρχε η βοήθεια των ανθρώπων από το κανάλι #haiku στο δίκτυο irc.freenode.net. Αλλά ακόμη και αυτοί δεν έβλεπαν πάντα αμέσως τι ήταν λάθος.

Οι εφαρμογές γραμμένες σε Qt είναι μια εύκολη εξαίρεση. Έφτιαξα μια απλή εφαρμογή επίδειξης χωρίς κανένα πρόβλημα.

Η κατασκευή ενός πακέτου για απλές εφαρμογές είναι επίσης αρκετά εύκολη, αλλά μόνο για τις «παραδοσιακά κυκλοφορούντες», π.χ. έχοντας εκδόσεις αρχείων πηγαίου κώδικα που προορίζονται για υποστήριξη σε haikuports. Για μια συνεχή κατασκευή (κατασκευή για κάθε δέσμευση αλλαγών) με το GitHub, όλα φαίνονται να μην είναι τόσο απλά. Εδώ το Haiku μοιάζει περισσότερο με διανομή Linux παρά με αποτέλεσμα σε Mac, όπου όταν κάνετε κλικ στο κουμπί "Build" στο XCode λαμβάνετε ένα πακέτο .app, έτοιμο να εισαχθεί σε εικόνα δίσκου .dmg, ετοιμάστηκε για λήψη στον ιστότοπό μου.
Η συνεχής δημιουργία εφαρμογών με βάση ένα λειτουργικό σύστημα «διακομιστή», για παράδειγμα, το Linux, πιθανότατα θα καταστεί δυνατή εάν υπάρχει ζήτηση από προγραμματιστές, αλλά αυτή τη στιγμή το έργο Haiku έχει άλλες, πιο πιεστικές εργασίες.

Δοκιμάστε το μόνοι σας! Εξάλλου, το έργο Haiku παρέχει εικόνες για εκκίνηση από DVD ή USB, που δημιουργούνται καθημερινά. Για εγκατάσταση, απλώς κατεβάστε την εικόνα και εγγράψτε την σε μια μονάδα flash USB χρησιμοποιώντας Χαράκτης

Έχετε ερωτήσεις; Σας προσκαλούμε στο ρωσόφωνο κανάλι τηλεγραφήματος.

Επισκόπηση σφάλματος: Πώς να πυροβολήσετε τον εαυτό σας στο πόδι σε C και C++. Συλλογή συνταγών Haiku OS

Από ο συγγραφέας μετάφραση: αυτό είναι το πέμπτο άρθρο της σειράς για το Haiku.

Λίστα άρθρων: Πρώτα Η δεύτερη Третья Τέταρτον

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο