Δημήτρης Καμενόπουλος για το Magaz ( magaz.hellug.gr(http://magaz.hellug.gr) ) Ιουν 2000
Αυτό που εντυπωσιάζει τον προγραμματιστή και τον χρήστη της κονσόλας του Unix είναι ότι "τα πάντα είναι αρχεία". Οι κατάλογοι, τα φυσικά αρχεία, οι σκληροί δίσκοι, οι συσκευές δικτύου, οι δικτυακές συνδέσεις... Όλα είναι αρχεία και αντιμετωπίζονται μέσα από ένα πρότυπο σύνολο λειτουργιών. Η τάση αυτή για διαφάνεια και ολοκλήρωση είναι διάχυτη στο Unix, και αποτελεί βασικό τμήμα της φιλοσοφίας του.Το KDE, που παρά το γραφικό του χαρακτήρα δε θα μπορούσε ποτέ να απαρνηθεί τη φιλοσοφία του παλιού καλού Unix, χρησιμοποιεί ένα ανάλογο μοντέλο για να αντιμετωπίζει με ενιαίο τρόπο όλες τις δυνατές πηγές εισόδου/εξόδου πληροφοριών. Είτε πρόκειται για τα τοπικά συστήματα αρχείων, είτε για βάσεις δεδομένων SQL. Η αντίστοιχη τεχνολογία λέγεται KDE IO Slaves, είναι βασικό μέρος του KDE 2.x και τη χρησιμοποιείτε καθημερινά μέσω του Konqueror.
1. Εισαγωγή
2. Η Αφαίρεση
3. Πώς Λειτουργούν οι KDE IO Slaves
4. Πώς Χρησιμοποιούμε (οι Χρήστες) έναν IO Slave
5. IO Slaves σε Δράση
6. Πού χρησιμοποιούνται οι IO Slaves
7. Επίλογος
Ένα από τα μεγάλα ατού των Windows 98 ήταν η "επαναστατική" δυνατότητα του IE να ανοίγει τοπικούς καταλόγους, δικτυακές ιστοσελίδες και τόπους FTP. Μπορώ να θυμηθώ ενθουσιώδη άρθρα σε περιοδικά του χώρου για τον "ενιαίο τρόπο" αντιμετώπισης τοπικών και απομακρυσμένων αρχείων. Αφήνουμε κατά μέρος το ότι η "επαναστατική" ενιαία αντιμετώπιση προϋπήρχε στο Unix εδώ και αρκετά χρόνια (ποτέ μην ξεχνάτε ότι στο μηχάνημά σας "συνδέεστε", και ότι το /home δεν αποκλείεται να είναι προσαρτημένο με NFS και να αντιπροσωπεύει ένα σκληρό δίσκο στην άλλη όχθη του Ατλαντικού).
Το πρόβλημα ήταν ότι η αντιμετώπιση εσωτερικά δεν ήταν καθόλου ενιαία. Εντελώς διαφορετικό πρόγραμμα (με διαφορετικά κουμπάκια και μενού) είναι το τμήμα του Explorer που λειτουργεί ως Web Browser, εντελώς διαφορετικό το τμήμα FTP browser και εντελώς διαφορετικό το τμήμα File Manager. Το γεγονός ότι ο Explorer παθαίνει "μεταμόρφωση" εσωτερικά για να αντιμετωπισει διαφορετική είσοδο κρύβεται από το χρήστη και από τον προγραμματιστή, και αυτό είναι καλό. Ωστόσο το να επιτρέπεις σε λειτουργίες εισόδου/εξόδου να φτάνουν μέχρι το επίπεδο του User Interface δεν είναι κατά τη γνώμη μου καλή σχεδίαση. Ο Explorer, ή καλύτερα το αντικείμενο "Explorer" είναι τρία (ή και περισσότερα) μονολιθικά προγράμματα.
Αποτέλεσμα: παρά την υψηλής ποιότητας δουλειά των προγραμματιστών της Microsoft, ο Explorer είναι δυνατόν να κολλήσει αν τον "στείλετε" σε έναν κατάλογο FTP και η σύνδεση είναι πολύ αργή ή κοπεί. Κι αυτό γιατί το "υψηλού" επιπέδου UI είναι στενά δεμένο με το "χαμηλού" επιπέδου σύστημα Ι/Ο.
Ας έρθουμε όμως στα δικά μας, και συγκεκριμένα στο KDE. Ο Konqueror, όπως θα ξέρετε όλοι είναι File Manager και ταυτόχρονα Web και FTP browser. Θα δούμε σε αυτό το άρθρο ότι ο Konqueror μπορεί να δει επίσης αλληλογραφία POP3, ηχητικά CD, αρχειοθήκες .tar.gz και άλλα πολλά. Όλα (εκτός από τις Ιστοσελίδες) αντιμετωπίζονται με ενιαίο τρόπο και μάλιστα με εξαιρετική απλότητα. Υπεύθυνο για όλα αυτά είναι ένα στρώμα βοηθητικών προγραμμάτων, που εσωτερικά είναι γνωστά με την ονομασία KDE IO Slaves.
Η σχεδίαση της τεχνολογίας IO Slaves είναι η *σωστή* αρθρωτή και ιεραρχική σχεδίαση που υποτίθεται ότι διδάσκεται σε κάθε μάθημα προγραμματισμού. Ο τελευταίος απόφοιτος μιας σχολής προγραμματισμού γνωρίζει πως δεν πρέπει ποτέ λειτουργίες των χαμηλών επιπέδων (Ι/Ο) να "εισβάλλουν" στα υψηλά επίπεδα (User Interface), όπως και ότι κοινές λειτουργίες θα πρέπει κατά το δυνατόν να ομαδοποιούνται και να προσφέρονται κατά ομοιόμορφο τρόπο στους χρήστες και στους προγραμματιστές. Οι IO Slaves δεν είναι παρά απλή εφαρμογή των παραπάνω ιδεών. Με αυτά υπόψη, θα μπορούσαμε να συνοψίσουμε την τεχνολογία IO Slaves στην παρακάτω παράγραφο:
Οι ΙΟ Slaves είναι ένα στρώμα αντικειμένων που παρεμβάλλονται ανάμεσα σε ένα πρόγραμμα που ζητά πληροφορίες (π.χ. Konqueror) και την πηγή αυτών των πληροφοριών. Αναλαμβάνουν να απαλλάξουν το πρόγραμμα από τις λεπτομέρειες της συνδιαλλαγής με την πηγή και της ανάκτησης των πληροφοριών, πραγματοποιώντας οι ίδιοι αυτές τις λειτουργίες. Η χρήση των IO slaves γίνεται μέσω εντολών που είναι κοινές για όλους τους IO Slaves και άρα ανεξάρτητες του είδους της πηγής.
Αν το δούμε πολύ αφαιρετικά το θέμα, σχεδόν τα πάντα σε έναν υπολογιστή μπορούν να αντιμετωπισθούν είτε ως περιεχόμενο, είτε ως αρχεία. Η διαφορά είναι μεγάλη. Ένα "αρχείο" είναι ένα "πράγμα" με συγκεκριμένο όνομα. Τα περιεχόμενά του δε φαίνονται κατ' ευθείαν όταν το κοιτάμε απ' έξω. Πρέπει να το "ανοίξουμε" και τότε κάποιο πρόγραμμα θα μας παρουσιάσει το "περιεχόμενο" του αρχείου. Υπάρχουν πρωτόκολλα που είναι καλύτερο να αντιμετωπιστούν σαν πρωτόκολλα αρχείων. Το FTP για παράδειγμα, ή το NFS. Υπάρχουν όμως και πρωτόκολλα που (μολονότι εν τέλει στηρίζονται και αυτά σε κάποια αρχεία) καθορίζουν κυρίως περιεχόμενο. Για παράδειγμα το HTTP κατά κανόνα χρησιμοποιείται για μεταφορά περιεχομένου.
Οι IO Slaves κάνουν αυτή τη διάκριση. Όταν πρόκειται για περιεχόμενο αναλαμβάνουν να το εξαγάγουν σε κάποια μορφή που να μπορεί να προβληθεί από τον Konqueror. Π.χ. ο gzip IO Slave παίρνει στην είσοδο ένα συμπιεσμένο αρχείο και το αποσυμπιέζει στην έξοδο. Ενεργεί δηλαδή σαν φίλτρο. Από εκεί και πέρα είναι θέμα του Konqueror (ή οποιασδήποτε άλλης επφαρμογής χρησιμοποιεί τις υπηρεσίες του IO Slave) να προβάλλει σωστά αυτό το περιεχόμενο. Όταν πρόκειται για αρχεία, ο IO Slave απλά δίνει πληροφορίες για αυτά τα αρχεία στην εφαρμογή, η οποία πρέπει να ζητήσει μια συγκεκριμένη υπηρεσία (την get) για να πάρει τα περιεχόμενά τους. Ο FTP ΙΟ Slave π.χ., δίνει στον Konqueror μια λίστα με τα αρχεία ενός καταλόγου FTP και ο Konqueror εμφανίζει τα αντίστοιχα εικονίδια στην οθόνη.
Ας δούμε τι αντιμετωπίζεται κυρίως σαν αρχείο (ή κατάλογος):
Και τι αντιμετωπίζεται κυρίως σαν περιεχόμενο:
Οι λίστες δεν είναι εξαντλητικές, ενώ η διάκριση δεν είναι πάντοτε τόσο απόλυτα. Σε γενικές γραμμές, ο IO slave αντιμετωπίζει ένα πρωτόκολλο σαν βασισμένο σε αρχεία όταν σας δίνει στον Konqueror μια λίστα με εικονίδια, και σαν βασισμένο σε περιεχόμενο όταν σας δίνει HTML ή άλλη έξοδο.
Ένας IO Slave είναι (σχεδιαστικά) ένα αντικείμενο που καταλαβαίνει ένα πρωτόκολλο και παρέχει λειτουργίες του πρωτοκόλλου για χρήση από προγράμματα ανωτέρου επιπέδου. Συνήθως όμως τα περισσότερα προγράμματα χρησιμοποιούν μόνο μερικές στάνταρ λειτουργίες για την επικοινωνία με όλους τους IO Slaves, ενώ μόνο ειδικά γραμμένα για κάποιον IO Slave προγράμματα κάνουν πλήρη χρήση όλων των λειτουργιών του.
Επειδή αυτό ακούγεται λίγο περίπλοκο, θα προσπαθήσω να το εξηγήσω με ένα παράδειγμα: τον τετριμμένο IO Slave "ftp" ο οποίος χρησιμοποιείται από τον Konqueror για τις λειτουργίες διαχείρισης τόπων FTP. Ο "ftp" παρέχει τις εξής λειτουργίες:
Οι περίσσότεροι IO Slaves παρέχουν μία τουλάχιστον από αυτές τις τρεις λειτουργίες. Οι Slaves περιεχομένου υποστηρίζουν βασικά την get, που στην περίπτωσή τους "φιλτράρει" την είσοδό τους. Επίσης οι Slaves περιεχομένου υποστηρίζουν τη λειτουργία mimetype που καθορίζει το είδος της εξόδου τους. Οι περισσότεροι έχουν έξοδο τύπου text/html, δηλαδή ιστοσελίδα, ώστε να μπορεί να απεικονιστεί στον Konqueror. Τέλος, μερικοί IO slaves (βασικά ο file και μελλοντικά οι FTP και SMB) έχουν και λειτουργίες εγγραφής.
Φυσικά άλλoi ΙΟ Slaves έχουν και άλλες υπηρεσίες, αλλά οι "στάνταρ" είναι αυτές οι τέσσερις. Αν το καλοσκεφτείτε, δεν κάνετε και άλλα πράγματα με οποιονδήποτε πόρο του Η/Υ σας. Είτε βλέπετε πληροφορίες για αυτόν, είτε τον ανοίγετε, είτε τον τροποποιείτε.
Τουλάχιστον τρεις IO Slaves τους χρησιμοποιείτε κατά κόρον: είναι οι file, HTTP και ftp με προφανείς λειτουργίες. Για να χρησιμοποιήσουμε γενικά έναν οποινδήποτε πόρο μέσω IO Slave, η σύνταξη είναι
(όνομα IO Slave): ('/' ή '//') (όνομα πόρου ή URL)
δηλαδή
ftp://ftp.ntua.gr/pub/linux
ή
http://localhost:631/admin
ή
floppy:/
Μέχρι στιγμής το μόνο πρόγραμμα που υποστηρίζει πλήρως αυτή τη σύνταξη είναι ο Konqueror. Μπορείτε να βάλετε στη μπάρα διεύθυνσης τη "διεύθυνση" οποιουδήποτε από τους υπάρχοντες IO Slaves και είναι σίγουρο ότι θα επικοινωνήσει μια χαρά, και θα β��ει και κάτι χρήσιμο να κάνει.
Από την άλλη, οποιοσδήποτε προγραμματιστής μιας εφαρμογής KDE μπορεί να χρησιμοποιήσει αυτή τη σύνταξη στα προγράμματά του για να εξυπηρετηθεί από έναν IO Slave. Οι "γενικευμένες" διευθύνσεις, που είναι σαν URLs αλλά αντί για http://, ftp:// ή file:// ή άλλα στάνταρ πρωτόκολλα έχουν και τα "ψευδοπρωτόκολλα" που προφέρει κάποιος IO Slave (π.χ. info://) περιγράφονται από την κλάση KURL.
Εκτός από τετριμμένες λειτουργίες (π.χ. έξοδος στο standard error) τα προγράμματα KDE πρέπει να χρησιμοποιούν KURLs και όχι απλά ονόματα αρχείων ή απλά URL για είσοδο/έξοδο, οπότε καταλαβαίνετε πως η μέρα που το KEdit π.χ. θα επεξεργάζεται "απ' ευθείας" αρχεία σε απομακρυσμένα FTP Sites στην άλλη άκρη της γης ίσως να μην είναι και τόσο μακριά (αν και για την ώρα απέχουμε αρκετά από κάτι τέτοιο, δείτε και παρακάτω).
Πολλοί θα ξέρετε την εντολή finger. Αυτή καλείται ως 'finger username@hostname' και εμφανίζει πληροφορίες για το χρήστη username του μηχανήματος hostname. Η χρήση του IO Slave είναι απλή:
Στη μπάρα διεύθυνσης του Konqueror δώστε π.χ.
finger://root@localhost
και θα πάρετε πληροφορίες για το χρήστη root.
Συνδεδεθείτε στο Internet, και δώστε στη μπάρα διεύθυνσης
pop3://διεύθυνση.του.mail.server.σας
π.χ.
pop3://mail.ntua.gr
Πατήστε Enter. Αν όλα πάνε καλά, θα σας ζητηθεί username και password και μετά από λίγο ο Konqueror θα εμφανίσει τα μηνύματα που περιμένουν να τα παραλάβετε, σαν μια λίστα εικονιδίων.
Βέβαια τα πράγματα δεν είναι πολύ βολικά, αφού αν ανοίξετε ένα από αυτά τα "αρχεία" θα πάρετε το αντίστοιχο μήνυμα σαν "raw data", ενώ ένα πρόγραμμα όπως το KMail αποκωδικοποιεί αυτά τα raw data και σας εμφανίζει ελληνικά, HTML, URL και τα λοιπά. Από την άλλη, μπορείτε εύκολα να αντιγράψετε αυτά τα ακατέργαστα μηνύματα στο δίσκο σας με ένα Select All και μετά με drag 'n' drop, ενώ π.χ. με το KMail θα πρέπει να τα αποθηκεύσετε ένα ένα ή όλα μαζί σε ένα μεγάλο αρχείο.
Ένα πράγμα που είναι λίγο βαρετό, είναι τα mount/umount που πρέπει να γίνονται ακόμα και για απλή προβολή της δισκέτας. Υπό την προϋπόθεση ότι έχετε δικαιώματα ανάγνωσης απ' ευθείας από το /dev/fd0 ή όποια άλλη συσκευή αντιστοιχεί στο floppy disk drive του συστήματός σας, δίνοντας
floppy:/
Θα δείτε αμέσως τα περιεχόμενα της δισκέτας σας, χωρίς να χρειαστεί να κάνετε mount.
Ναι, ο τίτλος είναι σωστός. Πρόκειται για μια εντυπωσιακή εφαρμογή της τεχνολογίας IO Slaves, που κακώς δε διαφημίζεται. Υπάρχουν κάποια προαπαιτούμενα και πάλι.
Η όλη διαδικασία είναι αρκετά πολύπλοκη και κατά πάσα πιθανότητα θα αποτελέσει αντικείμενο ξεχωριστού άρθρου.
Αν όμως οι παραπάνω προϋποθέσεις πληρούνται, βάλτε στο CD ROM σας ένα ηχητικό CD και δώστε στη μπάρα διεύθυνσης του Konqueror
audiocd:/
Θα δείτε (μετά από λίγο) το εξής εκπληκτικό: Ο Konqueror γεμίζει με εικονίδια, που αντιστοιχούν στα tracks του CD (track01, track02...), και εμφανίζει και μερικούς καταλόγους, με ονόματα όπως "WAV", "Ogg Vorbis" και "MP3". Αυτοί οι κατάλογοι, "περιέχουν" τις ripped και encoded εκδόσεις των κομματιών του CD. Φυσικά δεν έχει γίνει ακόμα κανένα ripping. Αλλά ο audiocd ΙΟ Slave είναι έτοιμος να σας σερβίρει ότι του ζητήσετε. Αν έχετε "σφαιράτο" μηχάνημα, ανοίξτε ένα από τα MP3 κομμάτια. Θα έχετε τη -σπανιότατη- εμπειρία να ακούτε ένα MP3 που ripάρεται και κωδικοποιείται σε πραγματικό χρόνο. Πιο ρεαλιστική εφαρμογή, είναι να "τσιμπήσετε" το MP3 και να το "πετάξετε" σε κάποιον τοπικό κατάλογο. Ο audio slave αρχίζει τότε να κάνει ripping και να γράφει το mp3 στο δίσκο. Αντίστοιχα γίνεται η εξαγωγή σε μορφή Ogg Vorbis, σε WAV ή και σε RAW.
To πλέον εντυπωσιακό, είναι ότι αν το CD σας υπάρχει στη CDDB (όπως το "Dark Side of the Moon" των Pink Floyd, τότε αντί για track0, track02 και λοιπά θα δείτε τους τίτλους των τραγουδιών (π.χ. "Pink Floyd - The Dark Side of The Moon - Time.mp3", ). Γι' αυτό και απαιτείται η σύνδεση με Ιντερνετ. Ο IO Slave προσπαθεί πάντοτε να χρησιμοποιήσει τη CDDB. Μάλιστα (και εδώ έχουμε μια ατέλεια), αν δεν είστε συνδεδεμένοι, ο IO Slave κλείνει χωρίς να σας ενημερώσει, ενώ θα μπορούσε να συνεχίζει και να ονομάζει τα κομμάτια track01, track02 κλπ.
Κανονικά: παντού όπου υπάρχει Ι/Ο στο KDE, είτε ο χρήστης το καταλαβαίνει, είτε όχι. Το KMail χρησιμοποιεί τους pop3 και imap4 IO Slaves για να ανακτήσει την αλληλογραφία σας, ο Konqueror (κυρίως) τους http, ftp, file,help, man, info και tar για τις καθημερινές του λειτουργίες, ενώ πολλές εφαρμογές χρησιμοποιούν τους nfs και smb για να προσφέρουν λειτουργίες "Network Neighboorhoud".
Πρέπει να τονιστεί ότι ΟΛΟΙ ανεξαιρέτως οι IO Slaves μπορούν να χρησιμοποιηθούν απ' αυθείας από τον Konqueror, επιτρέποντας ενδιαφέρουσες εφαρμογές, όπως δημιουργία σελιδοδείκτη για μια ιστοσελίδα που βρίσκεται συμπιεσμένη σε ένα αρχείο .tar.gz και drag 'n' drop από ηχητικά CD's σε τοπικούς καταλόγους. Έχετε πάντοτε υπόψη σας όμως ότι όλες οι λειτουργίες ενός IO slave πιθανόν να μην είναι προσπελάσιμες έτσι απλά, ή να απαιτούν άδειες που έχει μόνον ο root.
Μια παράλειψη των IO slaves είναι ότι δεν είναι και τόσο "O" όσο είναι "Ι". Δηλαδή δεν έχουν ακόμα λειτουργίες εγγραφής στον πόρο που χειρίζονται (με κάποιες εξαιρέσεις). Αυτό όμως είναι και λογικό. Ποιος θέλει να τροποποιήσει μια man page ή ένα audio cd; Πάντως αυτή η έλλειψη είναι και ο λόγος που το KEdit δε μπορεί ακόμα να επεξεργαστεί απ' ευθείας ένα αρχείο σε κάποιον FTP server :-o.
Πληροφορίες για τους διαθέσιμους IO Slaves μπορείτε να πάρετε (στο τρέχον CVS του KDE) στον Πίνακα Ελέγχου, στην ενότητα Δίκτυο - υποενότητα Πρωτόκολλα. Α, ναι :-) Το "user-friendly" όνομα των IO Slaves είναι "KDE Networking Protocols", κάτι που δεν είναι βέβαια απόλυτα σωστό, αλλά οι περισσότεροι αποφάσισαν ότι λέει περισσότερα σε έναν μη προγραμματιστή από το "IO slaves". Εσωτερικά βέβαια η τεχνολογία λέγεται πάντα "ΙΟ Slaves".
Να 'μαστε λοιπόν. Ο δικός μας Web Browser φτιάχνει και MP3, και μάλιστα με απλό drag 'n' drop. Αυτό είναι ένα δίδαγμα για όσους, ερχόμενοι από τον κόσμο των Windows και του Macintosh περιμένουν να τα βρουν όλα ολόιδια. Ποτέ μην περιφρονείτε τον τρόπο που τα πράγματα γίνονται στο linux, γιατί μπορεί να είναι και καλύτερος. Κανείς δεν έχει ιδιαίτερα μεγάλη όρεξη να φτιάξει αντίγραφα των Windows. Θα ήταν μάλλον χαζό, αφού υπάρχει το πρωτότυπο.
Η ομάδα KDE πήρε απλά τη λόγική της ενιαίας αντιμετώπισης των πόρων που είχε ενσωματωμένη πάντοτε το Unix, και την έφτασε δέκα χρόνια μπροστά από τις εμπορικές "ευκολίες". Για "αντίγραφο των Windows κατασκευασμένο από δεκαπεντάχρονο χακερά" όπως είχε αποκαλέσει κάποιος ..απλός χρήστης, νομίζω ότι το KDE δεν τα πήγε και άσχημα.