Saturday 30 August 2008

Permissions III

Ένα σημείο το οποίο χωράει συζήτηση είναι το δικαίωμα ανάγνωσης (r). Όταν κάποιος άλλος χρήστης έχει δικαίωμα ανάγνωσης μόνο, σημαίνει ότι μπορεί να διαβάσει το αρχείο αλλά όχι να το τροποποιήση. Να διαβάσει όμως σημαίνει όχι απλώς να το ανοιξει με έναν editor και να το διαβάσει, αλλά να το αντιγράψει κι όλας, με την εντολή cp για παράδειγμα. Φυσικά το νέο αρχείο θα έχει ως ιδιοκτήτη το νέο χρήστη. Αυτό δημιουργία κάποια ανασφάλεια στους νέους χρήστες, αλλά δυστυχώς ή ευτυχώς έτσι είναι. Δεν είναι ούτε bug ούτε feature. Πολλές μεγάλες δισκογραφικές εταιρίες κάνουν έρευνα ώστε να μπορεί κάποιος να διαβάζει κάτι χωρίς να μπορεί να το αντιγράψει αλλά ανεπιτυχώς θα έλεγα. Οπότε αν θέλετε να μη μπορεί κάποιος να αντιγραψει τα αρχεία σας θα πρέπει να μην τους δώσετε δικαιώματα ανάγνωσης.

Μια δεύτερη επισήμανση είναι οι φάκελοι. Για να μπορέσει κανείς να "μπει" μέσα σε ένα φάκελο πρέπει να έχει δικαίωμα εκτέλεσης του φακέλου.

Αν θέλουμε να αναφερθούμε σε όλους τους χρήστες (u, g και ο) τότε μπορούμε να γράψουμε a (all) δηλαδή
chmod a+w myfile
δίνει σε όλους δικαίωμα τροποποίησης.

Ακόμη μία άσκηση: Πώς μπορούμε να δημιουργήσουμε ένα φάκελο που να λειτουργεί σαν γραμματοκιβώτιο όπου όλοι μπορούν να γράψουν ένα αρχειό (να στείλουν ένα γράμμα) αλλά να μόνο ο ιδιοκτήτης να μπορεί να δεί το γραμματοκιβώτιό του. Το γράμμα μπορεί να το καταστρέψει ο αποστολέας; Ο παραλήπτης;

Permissions II

Και τώρα η συνέχεια!

Η σύνταξη της εντολής chgrp είναι:
chgrp mygroup myfile
όπου mygroup είναι η ομάδα στην οποιά θα αλλάξει το αρχείο myfile. Mερικές επιλογές είναι -R η οποία αλλάζει και τις ομάδες στους υποφακέλους του myfile, αν υπάρχουν.

Αντίστοιχα, η σύνταξη της εντολής chown είναι:
chown owner myfile
όπου owner είναι o καινούριος ιδιοκτήτης στον οποιά θα ανηκει το αρχείο myfile. Mερικές επιλογές είναι -R η οποία αλλάζει και τους ιδιοκτήτες στους υποφακέλους του myfile, αν υπάρχουν.

Η εντολή chmod αλλάζει τα δικαιώματα ως εξής:
chmod mode myfile
όπου mode είναι τα νέα δικαιώματα του αρχείου myfile. Oι επιλογές του mode δίνονται με ένα γράμμα που δείχνει ποιον αφορά η αλλάγη (u, g, o), επειτα + για να προσθέσουμε δικαιώματα ή με - για να τα αφαιρέσουμε και έπειτα ακολουθουν τι δικαιώματα θέλουμε να δώσουμε ή να αφαιρέσουμε (r,w,x).

Με μερικά παραδείγματα θα γίνει πιο κατανοητό.
ls -l
-rw-r--r-- 1 dp staff 0 Aug 27 10:01 myfile
έχουμε ένα απλό αρχείο με δικαιώματα αναγνωσης και τροποποίησης από τον ιδιοκτήτη (dp), αναγνωσης από την ομάδα (staff) και αναγνωσης από όλους τους άλλους. Η εντολή:
chmod u+x myfile
δίνει στον ιδιοκτητη το δικαίωμα να το εκτελεσει το αρχειο. Φυσικά αν δεν είναι bash script, ή εκτελέσιμο πρόγραμμα ή python script, κτλ. θα βγάλει σφάλμα αν πάμε να το εκτελέσουμε με
./myfile
Aλλά υποτίθεται ότι ξέρουμε σε ποια αρχεία δίνουμε το δικαίωμα της εκτέλεσης. Mε ls -l
-rwxr--r-- 1 dp staff 0 Aug 27 10:01 myfile*
βλέπουμε στην πρώτη τριαδα το x. Aναλογα με τις ρυθμίσεις του κελύφους bash θα αλλάξει και το χρώμα του myfile (σε μενα βάζει ένα αστεράκι). Η εντολή:
chmod u-x myfile
το επαναφέρει στην αρχική του κατάσταση.
chmod go+w myfile
θα δώσει δικαιώματα τροποποίησης στην ομάδα staff και σε όλους τους άλλους. Το αποτελεσμα της ls -l θα είναι τότε:
-rwxrw-rw- 1 dp staff 0 Aug 27 10:01 myfile*
στη δεύτερη και την τρίτη στήλη θα υπάρχει και w.
chmod o-wr myfile
θα αφαιρέσει το δικαίωμα τροποποιησης και αναγνωσης από όλους όσους δεν ανήκουν στην ομάδα staff.

Υπάρχει και ένας δεύτερος τρόπος περιγραφης των δικαίωματων, κάπως πιο απόκρυφος ο οποίος χρησιμοποιείται και κάπως παραλαγμένος στην umask (Θα φτάσουμε κι εκεί.) Την κάθε τριάδα μπορούμε να την δούμε σαν ένα δυαδικό αριθμό που αποτελείται από bits τα οποία μπορεί να είναι 0 ή 1. Όταν υπάρχει ένα δικαίωμα το αντίστοιχο bit είναι 1, όταν δεν υπάρχει είναι 0. Η τριάδα r-- θα είναι ο αριθμό 100 στο δυαδικό σύστημα, τον οποίο αν το μετατρέψουμε στο δεκαδικό θα είναι ο 1x2**2+0x2**1 +0x2**0 (** σημαίνει ύψωση σε δύναμη) δηλαδή 4. Αντίστοιχα η τριάδα rw- αντιστοιχεί στο δυαδικό αριθμό 110 ή στον δεκαδικό 6. Αν θέλουμε τώρα να δώσουμε τα δικαιώματα rw-r--r-- σε ένα αρχείο θα δίναμε την εντολή:
chmod 644 myfile
Άσκηση: Ποιο θα είναι το αποτέλεσμα της εντολής;
chmod 755 myfile

Permissions

Τα δικαιώματα (permissions) είναι ένα από τα βασικά χαρακτηριστικά των συστημάτων unix γενικότερα, που επιτρέπει τους χρήστες να ανταλλάσουν αρχεία ή να περιορίζουν την πρόσβαση τρίτων. Ας ανοίξουμε όμως ένα τερματικό από Αpplications > Accessories > Terminal για να δούμε ακριβώς τι συμβαίνει. Είμαστε λογικά στο αρχικό κατάλογο (/home/user όπου user το ονομα χρήστη σας) Πληκτρολογούμε:
ls -l
H εντολή αυτή μας εμφανίζει τα περιεχόμενα του καταλόγου μαζί με χίλιες δυο άλλες άχρηστες πληροφορίες.

Η πρώτη στηλη μπορεί να είναι d ή -, d για φάκελος (directory), - για απλό αρχείο.
Κάθε αρχείο, κι όταν λέω αρχείο εννοώ και φακέλους, έχει ορισμένα χαρακτηριστικά, όπως σε ποιον ανήκει το αρχείο, σε ποια ομάδα ανήκει, ποιος έχει δικαίωμα να το διαβάσει, να το τροποποιήσει ή να το εκτελέσει. Η επόμενες 9 στήλες είναι συνδυασμοί των r,w,x,- έπειτα ακολουθεί ένας αριθμός, κι εκεί βλέπεται το όνομα του χρήστη σας δύο φορές. Η πρώτη εμφάνιση του user συμβολίζει τον ιδιοκτήτη του αρχείου (owner). H δεύτερη εμφάνιση την ομάδα (group). Oι 9 στήλες που περάσαμε είναι 3 συνδυασμοί των 3. Οι πρώτοι 3 συνδυασμοί αναφέρονται στα δικαιώματα του χρήστη. Η δεύτερη τριάδα αναφέρεται στα δικαιώματα της ομάδας και η τελευταία τριάδα στα δικαιώματα των άλλων (οthers, βλ. ανέκδοτο: εσύ με ποιούς είσαι με μας ή με τους άλλους; )

r σημαίνει δικαιώματα ανάγνωσης (read). w σημαίνει δικαιώματα τροποποίησης (write). x σημαίνει δικαιώματα εκτέλεσης (execute). Οποτε αν δούμε το συνδυασμό -rw-r--r-- σημαίνει ότι το αρχείο είναι απλό αρχείο και όχι φάκελος, ο χρήστης στον οποίο ανήκει το αρχείο έχει δικαιώματα να το διαβάσει και να το τροποποιήσει, αλλά όχι να το εκτελέσει. Οι χρήστες που ανήκουν στην ομάδα έχουν δικαίωμα μόνο ανάγνωσης και οι άλλοι έχουν επισης δικαίωμα μόνο ανάγνωσης.

Ο αριθμός που μας διέφυγε σημαίνει πόσα αρχεία περιλαμβάνει το αρχείο μας (Τι αριθμό θα έχει ένα αρχείο με - μπροστα κι όχι d; )

Φυσικά όλα αυτά τα δικαιώματα μπορούν να αλλάξουν. Μερικές χρήσιμες εντολές είναι η chgrp, chown, chmod. H chgrp αλλάζει την ομάδα του αρχείου. Η chown αλλάζει τον ιδιοκτήτη του αρχείου. Και η chmod αλλάζει τα δικαιώματα. Φυσικά για να αλλάξουν αυτά πρέπει να είμαστε ιδιοκτήτες του αρχείου.

Αντιμετώπιση προβλημάτων

Τι κάνουμε όταν:
  • έχει κολήσει το γραφικό περιβάλλον

    ctrl+alt+backspace

    Επανεκκινεί το xserver. Στις περισσότερες περιπτώσεις ίσως αρκεί να κάνουμε μόνο αυτό.
  • έχει κολήσει το γραφικό περιβάλλον και δεν επανέρχεται με ctrl+alt+backspace

    ctrl+alt+f1

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

    sudo shutdown -h now

    ενώ η επανεκκίνηση με:

    sudo shutdown -r now
  • δεν ανταποκρίνεται το πληκτρολόγιο

    ctrl+alt+PrintScreen+R

    Θα μας δώσει το πληκτρολόγιο πάλι υπο τον έλεγχό μας. Τότε μπορούμε να πάμε στην αρχή της λίστας και να δοκιμάσουμε τα δύο πρώτα βήματα.
  • δεν ανταποκρίνεται το πληκτρολόγιο και το παραπάνω βήμα δεν έχει αποτελέσματα

    ctrl+alt+PrintScreen+REISUB

    Τερματίζει τον υπολογιστή σωστά.

ΠΡΟΣΟΧΗ: Σε καμία περίπτωση δε σβήνουμε τον υπολογιστή αποσυνδέοντας την τροφοδοσία (βγάζοντας τον απο την μπριζα, ή σβήνοντας το διακόπτη). Είναι ότι χειρότερο μπορούμε να κάνουμε για τα δεδομένα μας.

Thursday 21 August 2008

Serial

Για τη σειριακή θύρα υπάρχουν τα προγράμμα: ckermit και gkermit από αυτή την ιστοσελίδα: http://www.columbia.edu/kermit/

Ίσως και το minicom να φανεί χρήσιμο.

Wednesday 20 August 2008

xorg.conf

Eνα βασικό αρχείο ρυθμίσεων του X-server, της υπηρεσίας δηλαδή γραφικών σε συστήματα linux, είναι το /etc/X11/xorg.conf
Χωρίζεται σε διάφορα sections για καθε συσκευή. Καλό είναι να ξέρουμε τι κάνει το κάθε section, ώστε να μπορούμε να το προσαρμόζουμε κατά βούληση. Πάντα πριν από κάθε αλλαγή κρατάμε ένα αντίγραφο ασφαλείας:
cp /etc/X11/xorg.conf ~/Desktop
Mία αναλυτική περιγραφή του αρχείου μπορεί να βρεθεί εδώ: http://www.x.org/archive/X11R6.8.0/doc/xorg.conf.5.html
Οι επιλογές που επηρεάζουν τα γραφικά είναι Device, Monitor, Screen. Φυσικά δεν είναι οι μόνες.

Device
Πρέπει να έχει το λιγότερο ένα section για να λειτουργήσει η κάρτα γραφικών. Μπορεί όμως να περιλαμβάνει και παραπανω. Η δομή είναι η εξής:
Section "Device"
Identifier "name"
Driver "driver"
entries
...
EndSection
Τα πεδία Identifier και Driver είναι απαραίτητα. Το πεδίο Identifier δηλώνει το μοναδικό όνομα της συσκευής, που θα χρειαστεί παρακάτω. Το πεδίο Driver δηλώνει τον οδηγό που θα χρησιμοποιηθεί. Για nvidia κάρτες με κλειστούς οδηγούς αυτό μπορεί να είναι "nv" για τους παλιούς οδηγούς, ή "nvidia" για τους καινουριους. Οι οδηγοί πρέπει να είναι εγκατεστημένη για να είναι έγκυρη αυτή η επιλογή.

Monitor
Πρέπει να έχει το λιγότερο ένα section για να λειτουργήσει η οθόνη. Μπορεί όμως να περιλαμβάνει και παραπανω. Η δομή είναι η εξής:
Section "Monitor"
Identifier "name"
entries
...
EndSection
Τo πεδίo Identifier είναι απαραίτητo. Το πεδίο Identifier δηλώνει το μοναδικό όνομα της συσκευής, που θα χρειαστεί παρακάτω. Εδώ καθορίζεται η αναλυση της οθονης, συχνότητα ανανέωσης και άλλα.

Screen
Εδώ γίνεται ένας συνδυασμός Device και Monitor. Tα υποχρεωτικά πεδία είναι Identifier, Device, Monitor. Φυσικά για να χρησιμοποιηθεί ένα Device πρέπει προηγουμένως να έχει οριστεί. Το ίδιο και για το Monitor.

Embedded HA5-30

Οδηγός/πρόγραμμα που να ελέγχει αυτη τη συσκευή μπορεί να βρεθεί σε αυτή την ιστοσελίδα:
http://www.lesbonscomptes.com/psxtcl/

Η μεταγλώττιση του κώδικα γίνεται εύκολα με την εγκατάσταση του πακέτου tcl-dev
sudo apt-get instal tcl-dev
και την αλλάγη του Makefile ώστε να έχει το σωστό include path (/usr/include/tcl8.4)

Relay card

H κάρτα advantech pci 1762 είναι μια pci κάρτα που έχει έξοδο 16 relay. Στην παρακάτω ιστοσελίδα υπάρχουν linux drivers για την κάρτα αυτή καθώς και για άλλες ενδιαφέρουσες κάρτες: http://www.comedi.org

Για τον έλεγχο της παραπάνω κάρτας πρέπει να εγκατασταθούν οι drivers της comedi, οι οποίοι πρέπει να μεταγλωττιστούν με τον πυρήνα.

Για έλεγχο της παράλληλης θύρας υπάρχει το πρόγραμμα parashell, βλ. http://sourceforge.net/projects/parashell/
To Makefile πρέπει να τροποποιηθεί ώστε να περιλαμβάνει το σωστό include path για το αρχείο asm/io.h (-I/usr/src/linux-headers-2.6.24-19/include/)

Monday 18 August 2008

Πώς στήνεται ένα cluster;

ΠΡΟΣΟΧΗ: Αυτά που ακολουθούν είναι για γερά νεύρα. Μπορεί να περιέχουν λάθη, ασάφειες και ατέλειες ή απλώς να μην ισχύουν για όλα τα συστήματα. Δεν ευθύνομαι για τυχόν λάθη ή βλάβες που θα δημιουργηθούν. Ακολουθήστε με δική σας ευθύνη.

1. Εισαγωγή

Ένα cluster είναι ένα δίκτυο από υπολογιστές, σχεδιασμένοι να λειτουργούν από κοινού ώστε να λύσουν ένα πρόβλημα. Clusters χρησιμοποιούνται συνήθως αλλά όχι μόνο σε τομείς της υπολογιστικής μηχανικής, φυσικής, κρυπτογραφίας, δημιουργίας ταινιών κ.α. αλλά και για οποιαδήποτε εφαρμογή απαιτεί πολλη υπολογιστική ισχύ. Θα μπορούσε να χρησιμοποιηθεί και ως desktop αλλά ένα έτοιμο desktop κάνει καλύτερα τη δουλειά και με λιγότερο κόπο. Η ιδέα πισω από το parallel computing είναι η εξής: χωρίζω το πρόβλημά μου σε μικρότερα υποπροβλήματα τα οποία λύνονται πιο γρήγορα σε έναν υπολογιστή και έπειτα ανασυνθέτω τη λύση από τα επιμέρους στοιχεία. Για να τρέξει ένα πρόγραμμα σε ένα cluster πρέπει να προγραμματιστεί σε mpi (υπάρχουν βιβλιοθήκες τουλάχιστον για fortran, C, C++ ). Η μετατροπή ενός υπάρχοντος προγράμματος είναι πολύ δύσκολη και είναι προτιμότερο να ξαναγραφεί από την αρχή, μιας και η αρχή λειτουργίας είναι τελείως διαφορετική.

Δύο πακέτα που περιλαμβάνουν σχεδόν όλα όσα χρειαζόμαστε είναι το oscar και το rocks. Το oscar εγκαθίσταται σε ένα υπάρχον λειτουργικό - υποστηρίζει fedora, mandriva, suse, redhat, scientific linux, centos - ενώ το rocks εγκαθιστά και περιλαμβάνει το red hat. Είναι φυσικά δυνατόν να στηθεί ένα cluster πάνω σε οποιαδήποτε διανομή, αλλά αυτά είναι που διατίθενται έτοιμα και λειτουργούν με τον ελαχιστο κόπο.

Αυτό το μέρος θα ασχοληθεί με το καθαρά τεχνικό κομμάτι. Δηλαδή φυσική συναρμολόγηση του cluster. Έπειτα θα ακολουθήσει η εγκατάσταση του λειτουργικού, με όλα τα απαραίτητα προγράμματα και βιβλιοθήκες. Προς το παρόν αυτός ο οδηγός θα ασχοληθεί μόνο με red hat ως λειτουργικό. Τέλος θα δωθεί μια μικρή εισαγωγή σε προγραμματισμό με mpi.

2. Ασφάλεια

Πριν τη δημιουργία ενός cluster είναι απαραίτητο να γνωρίζουμε που βρίσκονται οι ασφάλειες της ηλεκτρικής εγκατάστασης. Επίσης πρέπει να ξέρουμε αν η ηλεκτρική μας εγκατάσταση αντέχει την ισχύ που θα εγκατασταθεί. (Μπορεί με 2 υπολογιστές να είναι αμελητέα, αλλά με 4 αρχίζουν και σοβαρεύουν τα πράματα.) Πρέπει επίσης να ξέρουμε ότι το σύστημα θα παραγει θερμότητα και το καλοκαίρι στην Ελλάδα είναι αρκετά επιφορτισμένο. Οπότε καλό είναι να σκεφτούμε και λίγο το περιβάλλον. (Εγω τα δοκιμάζω όλα αυτά κάπου στην κεντρική Ευρώπη με μέγιστη θερμοκρασία 25 βαθμούς.)

3. Προαπαιτούμενα

Τι θα χρειαστεί (ελάχιστα προαπαιτούμενα);

1 υπολογιστής (από δω και πέρα θα ονομάζεται master) με:
* 2 κάρτες δικτύου
* 1 GB ram
* 20 GB σκληρό δίσκο
* cdrom

2 υπολογιστές (από δω και πέρα θα ονομάζονται slave, και μπορούν να είναι και περισσότεροι) με:
* 1 κάρτα δικτύου
* 1 GB ram
* 20 GB σκληρό δίσκο
* cdrom ή PXE κάρτα δικτύου (με cdrom είναι πιο εύκολα)

1 ethernet switsch

4 καλώδια δικτύου ethernet

1 πολύμπριζο με διακόπτη (αν η μπρίζα του τοίχου δεν αντέχει την ισχύ τότε θα πρέπει να χρησιμοποιηθούν περισσότερες μπρίζες)

Οθόνη, πληκτρολόγιο, ποντικί είναι απαραίτητα μόνο για την αρχική εγκατάσταση. Έπειτα η διαχείρηση του cluster θα γίνεται απομακρυσμένα από το τοπικό δίκτυο (αν υπάρχει). Σε περίπτωση που δεν υπάρχει τοπικό δίκτυο τότε χρειάζονται μόνο στον master.

Η παρακάτω εγκατάσταση θα σβήσει όλα τα δεδομένα των υπολογιστών.

4. Συναρμολόγηση

Η βασική διάταξη που θα χρησιμοποιηθεί είναι όλοι οι υπολογιστές του cluster συνδέονται με όλους. Αυτό θα γίνει στο ethernet switch. Eπιπλέον ο master με τη δεύτερη κάρτα δικτύου θα συνδεθεί στο εξωτερικό τοπικό δίκτυο. Υπάρχουν φυσικά και άλλοι τρόποι συνδεσμολογίας, που για πολλούς υπολογιστές ελαχιστοποιούν τη χρήση καλωδιών και ethernet switch αλλά δε θα ασχοληθούμε με αυτούς.


Bιβλιογραφία
1. High Performance Linux Clusters: with OSCAR, ROCKs, openMosix & MPI, J. D. Sloan
2. Beowulf
3. Oscar
4. Rocks

Thursday 14 August 2008

Αλλά τι είναι ένας υπολογιστής; ΙΙ

Περνώντας ένα επίπεδο παραπάνω από αυτές τις λογικές πύλες μπορούν να φτιαχνούν πιο πολύπλοκα ηλεκτρονικά εξαρτήματα. Οι αγωγοί που συνδέουν τις ηλεκτρονικές συσκευές μεταξύ τους και μεταφέρουν δεδομένα από τη μία στην άλλη λέγονται buses. Aν υποθέσουμε ότι χρειαζόμαστε να συνδέσουμε 3 συσκευές μεταξύ τους τότε χρειάζονται 3 αγωγοί που συνδεουν κάθε συσκευή με όλες τις άλλες. Με 4 συσκευές τότε ο αριθμός των αγωγών είναι 6, για 5 συσκευές χρειαζόμαστε 10 αγωγούς κ.τ.λ. Μια απλή τεχνική να μειωθεί το πλήθος των αγωγών είναι κάθε συσκευή να έχει τον κωδικό της, όλες οι συσκευές να συνδεθούν σε σειρά και στην αρχή των δεδομένων να υπαρχει ο κωδικός της κάθε συσκευής. Έτσι όλα τα δεδομένα περνάνε με τη σειρά από όλες τις συσκευες αλλά μόνο η συσκευή με το σωστό κωδικό δεχεται τα δεδομενα. Υπ'όψην ότι τα δεδομένα μπορεί να είναι όχι "απλά δεδομένα" αλλά κάποιο σύνολο οδηγιων που πρέπει να εκτελέσει η κάθε συσκευή.

Τι συμβαίνει όμως στην περίπτωση που ένας αγωγός πάθει βλάβη; Τότε όλο το σύστημα θα πάψει να λειτουργει. Στην περίπτωση αυτή πρέπει να υπάρχουν εφεδρικοί αγωγοί, αλλά πόσοι; Για 3 αγωγους είπαμε ότι χρειάζονται 3 αγωγοι, ενω αν χρησιμοποιήσουμε την τεχνικη διέυθυνσης τότε μειωνονται στους 2. Είναι εύκολο να δει κανεις ότι με 3 αγωγους όμως αν συμβεί το πολύ σε έναν αγωγό βλάβη τότε το σύστημα μπορεί να συνεχίσει να λειτουργεί. Παρόμοιες τεχνικές έχουν αναπτυχθεί και για πιο πολύπλοκα συστήματα.

Το πιο βασικό στοιχειo μνήμης είναι το register (καταχωρητής). Οι μνήμες αυτές είναι πολύ μικρές σε χωρητικότητα αλλά η ταχύτητα προσπέλασης τους είναι πολύ μεγάλη και είναι ενσωματωμένες στον επεργαστή. (Στους προγραμματιστές C είναι ίσως γνωστή η τεχνική να τοποθετούν μια μεταβλητή που θα χρησιμοποιηθεί πολλές φορές σε register για να αυξηθεί η ταχύτητα του προγράμματος.)

Εχοντας αυτά ως δομικά στοιχεία μπορούμε τώρα να γράψουμε ένα πρόγραμμα. Το σύνολο οδηγιών (instruction set) δεν είναι τίποτε άλλο από συνδυασμούς 4 βασικών οδηγιών - πρόσθεση, αφαιρεση, φορτωση, αποθηκευση δυαδικών αριθμών. Στις πρώτες assembly γλώσσες οι δυνατότητες δεν ήταν πολλές παραπάνω από αυτές τις 4. Καταρχήν χρειάζεται μια μνήμη για να αποθηκευτούν αυτές οι οδηγίες, ο καταχωρητης, και οι οδηγίες αυτές εκτελούνται από τον επεξεργαστή. Aς υποθέσουμε ότι στον καταχώρητη έχει αποθηκευτεί το παρακάτω σύνολο οδηγίων:

Φορτωσε τη θέση μνήμης 123 (η οποια περιλαμβάνει τον αριθμό 0101)
Φορτωσε τη θέση μνήμης 456 (η οποια περιλαμβάνει τον αριθμό 0011)
Πρόσθεσε τα δύο
Αποθηκευσε το αποτέλεσμα στη θέση μνήμης 789

Όπως βλέπουμε στα δύο πρώτα βήματα λειτουργεί μόνο η οδηγία φόρτωσης, στο τρίτο της πρόσθεσης και στο τεταρτο της αποθήκευσης. Αυτό έδωσε την ιδέα να χρησιμοποιηθεί στο μέγιστο η ικανοτητα του επεξεργστή με το να εκτελει και τις τεσσερις οδηγίες ταυτοχρονα. Δηλαδή ας υποθέσουμε ότι ενα δευτερο συνολο οδηγιων ειναι το εξης:

Αποθηκευσε τον αριθμό 0011 στη θέση μνήμης 345
Τιποτε
Τιποτε
Τιποτε

Τότε δεν είναι απαραίτητο να περιμένει ο επεξεργαστής να τελείωσει το πρώτο σύνολο οδηγιών για να εκτελεσθεί το δεύτερο, αλλά μπορεί να εκτελεσθεί ταυτοχρονα με το πρώτο, αφού οδηγια 1 είναι διαφορετική στις δύο περιπτώσεις. Από τη στιγμή που έχουμε ένα σύνολο οδηγιών που επαναλαμβάνεται πολλές φορες δημιουργήθηκε η ιδέα της διαδικασίας (procedure), που περιλαμβάνει ακριβώς ένα τέτοιο σύνολο οδηγιών. Μια διαδικασία μπορεί να καλεσθεί από ένα μεγαλύτερο σύνολο οδηγιων και να εκτελεσθεί στα πλαίσια αυτού του συνόλου. Επειτα μπορεί να χρησιμοποιηθεί από ένα άλλο σύνολο οδηγιων.

Αλλά τι είναι ένας υπολογιστής;

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

Η βασική αρχή της Αριστοτελικής λογικής είναι ότι μία πρόταση μπορεί να είναι αληθης ή ψευδής. Δε μπορεί να είναι και αληθής και ψευδής ταυτόχρονα, αλλά ούτε και να είναι τίποτε άλλο εκτός απο αληθης ή ψευδής. Φυσικά υπάρχουν και άλλες λογικες όπως η τρίτιμη λογική του Lukasiewiz, ή η ασαφής λογική (fuzzy) αλλα οι υπολογιστές δε λειτουργούν ακόμη με αυτές. Ίσως στο μέλλον. Aς υποθέσουμε τώρα ότι έχουμε δύο προτάσεις π1 και π2. Η κάθε πρόταση μπορεί να είναι αληθής ή ψευδής, αρα οι δυνατοί συνδυασμοί είναι 4.
π1 αληθής, π2 αληθής
π1 αληθής, π2 ψευδής
π1 ψευδής, π2 αληθής
π1 ψευδής, π2 ψευδής

Η ερώτηση που τίθεται τώρα είναι τι συμβαίνει με την πρόταση "π1 και π2". Το αποτέλεσμα μπορεί να βρεθεί με το λεγόμενο πίνακα αλήθειας.
(Πρέπει να βάλω τον πίνακα εδώ)

Αλλά ας δούμε ένα παράδειγμα. π1="Σήμερα βρέχει" και π2="Χθες είχε ήλιο". Ας υποθεσουμε ότι όντως σημερα βρέχει και ότι όντως χθες είχε ήλιο. Τότε η π1 αληθεύει και η π2 αληθεύει. Τότε η π3= π1 και π2 ="Σήμερα βρέχει αλλά χθες είχε ήλιο" επίσης αληθεύει. Αν όμως χθες δεν είχε ήλιο, αρα η π2 είναι ψευδης, τότε και η π3="Σήμερα βρέχει αλλά χθες είχε ήλιο" είναι επίσης ψευδής.

Παρόμοιο πίνακα αλήθειας μπορούμε να συντάξουμε για το διαζευτικό ή (όχι αποκλειστικό).
(Πρέπει να βάλω τον πίνακα εδώ)

π1="Σήμερα θα βρέψει", π2="Σήμερα θα έχει ήλιο", π3=π1 ή π2="Σήμερα θα βρέξει ή θα έχει ήλιο" αληθεύει σε τρεις από τις τέσσερις περιπτώσεις, εκτός απο την περίπτωση δηλαδή που ούτε βρέξει ούτε έχει ήλιο (ίσως όταν έχει μόνο σύννεφα).

Υπάρχει βέβαια και το αποκλειστικό ή.
(Πρέπει να βάλω τον πίνακα εδώ)

Όπου πρέπει να αληθεύει το πολύ μία απο τις προτάσεις, όχι και οι δύο ταυτόχρονα, για να είναι και ο συνδυασμός τους αληθής.

Φυσικά όλα τα παραπάνω μπορούν να γραφούν με μαθηματικά ή ηλεκτρονικά σύμβολα και να διατυπωθούν σχέσεις μεταξύ τους. Ας υποθέσουμε προς στιγμή ότι οι παραπάνω πίνακες μπορούν να πραγματοποιηθούν ως πύλες (ηλεκτρονικα εξαρτηματα, θα αναφερθώ στη φυσική τους λειτουργία παρακάτω). Οι τιμές αληθής-ψευδής μπορούν να μεταφραστούν ως 0-1 ή υψηλή-χαμηλή τάση, όπως χρησιμοποιείται στην ηλεκτρονική. Έχουμε δηλαδή μια συσκευή που έχει δύο εισόδους (καλώδια, σωλήνες), τις π1 και π2, και μία έξοδο (καλώδιο, σωλήνας), την π3.
Αναλογα με το ποια συσκευη θα χρησιμοποιήσουμε μπορούμε να πραγματοποιήσουμε την αντίστοιχη πράξη. Οι είσοδοι αυτές δεν είναι τίποτε άλλο απο καλώδια με ρεύμα. Αν εχουν υψηλη ταση, αληθευουν. Με χαμηλή τάση ψεύδονται.

Οι παραπάνω πύλες μπορούν να συνδυαστούν είτε σε σειρά ή παράλληλα και να δώσουν άλλες πιο πολύπλοκες πύλες με περισσότερες εισόδους και εξόδους. Το αποτελεσμα μιας πύλης μπορεί να διοχευτεί σε ένα λαμπτήρα (παλιότερα χρησιμοποιούσαν λαμπτηρες πυρακτώσεως στους πρώτους υπολογιστές). Αν είναι υψηλή η τάση (1, αληθης) τότε θα ανάψει η λαμπα, αν είναι χαμηλή η τάση (0, ψευδής) δε θα αναψει η λάμπα. Ετσι έχουμε μια πρωτόγονη επικοινωνία με το χρήστη. Κατ'αναλογία μπορεί να φανταστεί κανείς τα pixel της οθόνης.

Μεχρι στιγμής είδαμε ότι μπορούμε να αναπαραστήσουμε μόνο 0-1, ψευδές-αληθες, και τίποτε παραπάνω. Θα αποδείξουμε τώρα ότι αυτή την αναπαρασταση μπορούμε να τη χρησιμοποιήσουμε για οτιδήποτε. Ας πάρουμε τους φυσικούς αριθμούς 1, 2, 3, 4, ... Το 1 είναι εύκολο. Το 2 γράφεται 1*2, το 3=1*2+1, 4=1*2*2, 5=1*2*2+1, 6=1*2*2+1*2, 7=1*2*2+1*2+1 κτλ. Όπως φαίνεται όλοι οι αριθμοί μπορούν να γραφούν ως γινομενο και άθροισμα του 1 και του 2. Ας θεωρήσουμε τώρα ότι έχουμε 8 λάμπες. Σβηστή είπαμε είναι 0, ανοιχτή 1. Τις βάζουμε σε σειρά. Το ένα αναπαρισταται απο αυτές τις λάμπες ώς εξης: οι 7 αριστερά ειναι σβηστες και η ογδοη ειναι ανοιχτη (00000001). Το δύο: οι 6 αριστερά ειναι σβηστες και η εβδομη ειναι ανοιχτη και η ογδοη σβηστη (00000010). Το τρία: οι 6 αριστερά ειναι σβηστες και η εβδομη ειναι ανοιχτη (00000011)και η ογδοη ανοιχτή. Το τέσσερα (00000100). Το πέντε (00000101). Και πάει λέγοντας.

Γιατί όμως ξεκινάμε από δεξία; Οι άραβες θα ξεκινούσαν από αριστερα; Το ίδιο ακριβώς πρόβλημα υπάρχει και στην αρχιτεκτονική επεξεργαστών. Ο τρόπος που παρουσιάσαμε παραπάνω ακολουθεί το συνηθισμένο τρόπο γραφής αριθμών και καλείται big endian. Αντίθετα, ο τρόπος που γράφουμε την ημερομηνία (27.06.2008) από τα μικρότερα ψηφία στα μεγαλύτερα λέγεται little endian. Aρχιτεκτονική big endian έχουν οι επεξεργαστές powerpc, sparc, ενώ little endian οι intel, amd και άλλοι.

Αν θελήσουμε να αναπαραστήσουμε και αρνητικούς αριθμούς τότε χρειαζόμαστε και μία ακομη λαμπα (bit) για το πρόσημο. Αν η πρώτη πρώτη λαμπα απο αριστερα είναι αναμένη τότε έχουμε αρνητικό αριθμό. (Για αυτούς που ξέρουν C αυτό αντιστοιχεί σε integer, ενώ η προηγούμενη αναπαρασταση σε unsigned)

Επειδή όμως έχουμε πεπερασμένο αριθμό από λάμπες δε μπορουμε να αναπαραστήσουμε όλους τους αριθμούς. Γι'αυτό και υπαρχει σε όλες τις γλώσσες προγραμματισμού ένα εύρος απο -12345678 μέχρι 12345678 (για παραδειγμα) που μπορεί να αναπαρασταθεί. Η αναπαράσταση πραγματικών αριθμών γίνεται με τη χρήση επιπλέον λαμπτήρων (bits) που αποθηκεύουν τη θέση της υποδιαστολής και τον εκθέτη του 10, αλλά δε θα ήθελα να μπώ εδώ σε τέτοιες λεπτομέρειες.

Έπειτα έρχεται η ερώτηση ναι αλλά εγώ δε θέλω μόνο αριθμούς θέλω και γράμματα, μικρά και κεφαλαία. Η απάντηση ήρθε με το αλφάβητο ASCII. Κάθε σύμβολο που χρησιμοποιείται έχει την αναπαράστησή του στο δεκαεξαδικό σύστημα (αντι να έχουμε λάμπες ανοιχτες-σβηστες, δυαδικό σύστημα δηλαδή, εχουμε λάμπες σβηστες+15 χρώματα δεκαεξαδικό δηλαδή). Ετσι μπορούμε να χρησιμοποιούμε λατινικούς χαρακτήρες, μικρά κεφαλαια, και άλλα σύμβολα. Μετά φυσικά ήρθαν και άλλες κωδικοποιήσεις για τις οποίες δεν έχω ιδέα

Εισαγωγή σε parallel computing

Όλο και πιο συχνά ακούγεται στις μέρες μας ο όρος parallel computing, παράλληλοι υπολογισμοί, και έχει γίνει πλέον και στους προσωπικούς υπολογιστές πραγματικότητα με επεξεργαστές διπλών και τρίδιπλων (όπως το λαϊκό) επεξεργαστών. Αλλά ποιος ο λόγος και υπάρχει πράγματι κέρδος από τους επεξεργαστές με δύο πυρήνες ή είναι απλώς ένα εμπορικό παιχνίδι των εταιριών για να αυξήσουν τα κέρδη τους; Αυτή την ερώτηση δυστυχώς αδυνατώ να απαντήσω αλλά θα σας δώσω μια απλή γεύση του πως μπορούμε να εκμεταλλευτούμε αυτή τη δυνατότητα.

Oι παράλληλοι υπολογιστές χωρίζονται σε δύο βασικές κατηγορίες (επιτρέψτε μου την αγγλική ορολογία): shared και distributed μνήμης υπολογιστές. Οι πρώτοι, shared memory, είναι αυτοί που έχουμε στους υπολογιστές μας, όπου ο κάθε επεξεργαστής (στο σημείο αυτό δε θα τους ξεχωρήσω από τους πυρήνες) μοιράζεται την ίδια μνήμη με όλους τους υπόλοιπους. Οι distributed memory υπολογιστές έχουν ο καθένας δική του μνήμη και επικοινωνούν μέσω δικτύου. Προφανώς αν έχουμε 100 επεξεργαστές είναι λίγο δύσκολο να τους καλωδιώσουμε ώστε να μοιράζονται την ίδια μνήμη, ίσως στο μέλλον. Η δημιουργια, ο προγραμματισμός και η χρήση distributed memory είναι αρκετά προχωρημένη και δε θα ασχοληθω εδώ καθόλου.

Ας συνεχίσουμε λοιπόν με shared memory υπολογιστές. Για τα παρακάτω θα χρειαστούν:

sudo apt-get install build-essential libgomp

build-essential περιέχει όλα τα απαραίτητα πακέτα για προγραμματισμό και αναπτυξη κώδικα
libgomp περιέχει τη βιβλιοθήκη για shared memory parallel programming

Aναλυτικές οδηγίες για την gnu openMP μπορούν να βρεθούν http://gcc.gnu.org/onlinedocs/libgomp/

Θα ξεκινήσω με ένα απλό hello world πρόγραμμα σε C. Δημιοργούμε καταρχήν ένα φάκελο

mkdir ~/testgomp
cd ~/testgomp

Ανοίγουμε μέσα στο φάκελο testgomp με το gedit το αρχείο hello.c

gedit hello.c &


Kαι εισάγουμε τα παρακάτω:

int main()
{
printf("Hello world\n");
}

To μεταγλωττίζουμε και δημιουργούμε το εκτελέσιμο με:

gcc -c hello.c
gcc -o serialtest hello.o

Eκτελούμε το πρόγραμμα που δημιουργήθηκε με

./serialtest


και βλέπουμε ότι εκτυπώνεται στην οθόνη Hello world μόνο μία φορά.

Tώρα προσθέτουμε τη γραμμή #pragma omp parallel δηλαδή το αρχείο θα πρέπει να φαίνεται:

int main()
{
#pragma omp parallel
printf("Hello world\n");
}

To μεταγλωττίζουμε (τώρα χρειάζεται να συνδέσουμε επίσης την αντίστοιχη βιβλιοθήκη) και δημιουργούμε το εκτελέσιμο με:

gcc -c -fopenmp hello.c
gcc -o paralleltest hello.o

Εκτελούμε τώρα το παράλληλο πρόγραμμα με

./paralleltest


και βλέπουμε να τυπώνεται δύο φορές ενώ υπάρχει μόνο μία φορά στον κώδικά μας και δεν υπάρχει φυσικά κανένας βρόγχος. (Φυσικά αν έχουμε επεξεργαστή με ένα μόνο πυρήνα δε θα δούμε διαφορά)
Η γραμμή #pragma omp parallel αντιλαμβάνεται από το μεταγλωττιστή gcc σαν σχόλιο αν δεν υπάρχει η επιλογή -fopenmp κατά τη μεταγλώττιση, πράμα που επιτρέπει ένα πρόγραμμα που γράφουμε να είναι αρκετά portable.

Φυσικά αυτό δεν είναι και πολύ χρήσιμο γιατί επαναλαμβάνει την ίδια δουλειά δύο φορές. Εμείς χρειαζόμαστε κάτι που να μοιράζει το φόρτιο εργασίας στους δύο επεξεργαστές.
Aς δημιουργήσουμε τώρα ένα άλλο αρχείο hello2.c που θα περιέχει τα εξης:

#define N 100000
int main()
{
int i, a[N];
#pragma omp parallel for
for (i=0;i< style="font-weight: bold;"> a[i]= 2*i;
return 0;
}

Και μεταγλώττιση όπως πάντα με

gcc -c -fopenmp hello2.c
gcc -o paralleltest2 hello2.o

Το συγκεκριμένο παράδειγμα μοιράζει αυτόματα το array a[N] στα δύο threads που δημιουργούνται. Τα αποτελέσματα είναι σωστά γιατί το δεξί μέλος της ισότητας δεν εξαρτώνται από το αριστερό.

Aν είχαμε όμως κάτι όπως αυτό:


#define N 100000

int main()
{
int i, a[N];
a[0]=0;
#pragma omp parallel for
for (i=1; i<> a[i]= a[i-1]+1;
return 0;
}

δε θα λειτουργούσε γιατι κάθε επόμενο στοιχείο του a θα εξαρτάται από το προηγούμενο, αρα για να υπολογισει το στοιχειο 50000 στο δεύτερο thread θα χρειάζεται το 49999 από το πρώτο thread το οποίο δεν έχει υπολογιστεί ακομη.

Σε distributed memory υπολογιστές όπου τα δεδομένα, το a στο παράδειγμά μας, δεν είναι σε κοινή μνήμη θα πρέπει να μεταφέρονται από επεξεργαστή σε επεξεργαστή (για περισσότερες πληροφοριές δες http://en.wikipedia.org/wiki/Message_Passing_Interface) Yπάρχουν διάφορα εργαλεία για να στηθεί ένα [/url=http://en.wikipedia.org/wiki/Computer_cluster]cluster[/url] (distributed memory υπολογιστής) φυσικά και σε linux.

Βιβλιογραφία
1. http://openmp.org/wp/
2. http://gcc.gnu.org/onlinedocs/libgomp/
3. http://en.wikipedia.org/wiki/OpenMP
4. http://en.wikipedia.org/wiki/Parallel_computing

Wednesday 13 August 2008

Απλή ρίζα

Ο αριθμός 11.111.112.222.222 - 3.333.333 είναι τέλειο τετράγωνο. Βρείτε την τετραγωνική του ρίζα. Χωρίς υπολογιστή τσέπης ή γενικότερα υπολογιστή.

Διόφαντος, βιβλίο 1, πρόβλημα 1

Πρόβλημα: Δοθείς αριθμός να μεριστεί σε δύο αριθμούς με δοθείσα διαφορά.

Λύση: Έστω πως ο δοθείς αριθμός είναι εκατό και η δοθείσα διαφορά σαράντα μονάδες. Να βρεθούν οι δύοι αριθμοί.
Έστω πως ο μικρότερος είναι ο αριθμός, τότε ο μεγαλύτερος θα είναι ένας αριθμός συν σαράντα μονάδες, το άθροισμά τους είναι ίσο προς εκατό μονάδες, άρα εκατό μονάδες είναι ίσες προς δύο αριθμούς συν σαράντα μονάδες. Από όμοια μπορώ να αφαιρέσω όμοια, οπότε αφαιρώ και από τα δύο μέλη σαράντα μονάδες. Απομένουν δύο αριθμοί ίσοι προς εξήντα μονάδες, άρα ο αριθμός είναι τριάντα. Επομένως ο μικρότερος θα είναι τριάντα μονάδες και ο μεγαλύτερος εβδομήντα, η απόδειξη είναι φανερή.

Κέλυφος για αρχάριους

Bash for beginners

To bash είναι ένα κέλυφος, όπως το csh, tcsh, zsh, ksh και άλλα. Είναι το προεπιλεγμένο κέλυφος για το ubuntu. To κέλυφος παρέχει ένα τρόπο επικοινωνίας του χρήστη με το λειτουργικό, είτε ενεργά (interactively) ή παθητικά (non-interactively). Ενεργά σημαίνει ότι οι εντολές εισάγονται από το πληκτρολόγιο από το χρήστη ενώ παθητικά εννοούμε ότι οι εντολές εκτελούνται από ένα αρχείο.

Αν μια εντολή ξεκινάει με # τότε θεωρείται από το bash ως σχόλιο και αγνοείται. Οι εντολές μπορούν να χωριστούν χονδρικά σε τεσσερις κατηγορίες:

* Απλές εντολές
* Αγωγοί (pipelines)
* Λίστες
* Σύνθετες εντολές

Οι απλές εντολές είναι ακολουθία λέξεων και κενών, όπως
cd ~/Documents
Oι αγωγοί | διοχετεύουν το αποτέλεσμα της πρώτης εντολής στη δεύτερη
ls | grep myfile
Οι λίστες είναι ακολουθία εντολών που εκτελούνται η μία μετά την άλλη
cd ~/Documents; ls; cd
Οι σύνθετες εντολές περιλαμβάνουν βρόγχους και εντολές ελέγχου.

Το κέλυφος μπορεί να χρησιμοποιηθεί σαν μια αυτόνομη γλώσσα προγραμματισμού μιας και περιέχει όλα τα χαρακτηριστικά όπως πρόσθεση, πολλαπλασιασμός, βρόγχους, στοιχεία ελέγχου κ.α. που απαιτεί μια γλώσσα προγραμματισμού. Η εκτέλεση ενός προγράμματος κελύφους, ας πούμε του αρχείου myscript, γίνεται ως εξής:
bash myscript
Για ευκολία μπορούμε να εισάγουμε ως πρώτη γραμμή του αρχείου myscript τη γραμμή:
#!/bin/bash
και να αλλάξουμε τα δικαιώματα του αρχείου σε εκτελέσιμο
chmod u+x myscript
Tώρα μπορούμε να το εκτελέσουμε και ως
./myscript
Στην περίπτωση αυτή το # δεν λειτουργεί ως σχόλιο, η μόνη εξαίρεση, αλλά σε συνδυασμό με τo ! δηλώνει ότι πρόκειται για πρόγραμμα κέλυφους bash.

To κλασσικό παράδειγμα "Hallo World" στους προγραμματιστές θα φαίνοταν στο bash:
#!/bin/bash
echo Hallo World
που τυπώνει απλώς στην οθονη το "Hallo World".

Όπως στις περισσότερες γλώσσες προγραμματισμού υπάρχουν οι έννοιες τυπική έξοδος (stdout), τυπική είσοδος (stdin), τυπικό λάθος (stderr). Η τυπική έξοδος και το τυπικό λάθος είναι συνήθως η οθόνη, ενώ η τυπική είσοδος το πληκτρολόγιο. Μπορούμε όμως να αναδιοχετεύσουμε όλα αυτά.

* stdout σε αρχείο
ls -l > result1.txt
Το αποτέλεσμα της εντολής ls-l αποθηκεύεται στο αρχείο result1.txt.
ls -l >> result1.txt
Εδώ τo αποτέλεσμα της εντολής ls -l θα αποθηκευτεί στο αρχείο result1.txt. Αν υπάρχει το αρχείο τότε θα γραφεί στο τέλος του αρχείου χωρις να διαγράψει τα προηγούμενα.

* stderr σε αρχείο
cd blah 2> err.txt
cd blah >& err.txt
Διοχετεύει το λάθος μήνυμα, σε περιπτωση που δεν υπάρχει ο φάκελος blah, στο αρχείο err.txt.

Στα προγράμματα κελύφους είναι πολύ εύκολο να διαβάσουμε τα ορίσματα του προγράμματος με τις μεταβλητές $0, $1, $2, ..., οι οποίες δηλώνουν το όνομα του προγράμματος με$0 και επειτα το πρώτο, δεύτερο όρισμα κ.ο.κ. To παρακάτω πρόγραμμα τυπώνει στην οθόνη το όνομα του προγράμματος (του αρχείου) και το πρώτο όρισμα.

#!/bin/bash
echo $0, $1

Οδηγός gnuplot

gnuplot

Το gnuplot είναι ένα πρόγραμμα για τη σχεδίαση δεδομένων και συναρτήσεων από τη γραμμή εντολών. H εγκατάσταση του προγράμματος gnuplot γίνεται με την εκτέλεση της εντολής:

sudo apt-get install gnuplot

όπως πάντα άλλωστε. Το gnuplot ενδείκνυται για να συμπεριληφθεί ως εντολές σχεδίασης σε άλλο πρόγραμμα που διαβάζει ή παράγει τα δεδομένα. Τονίζεται ότι χρησιμοποιείται από το octave (υψηλού επιπέδου γλώσσα για αριθμητικούς υπολογισμούς) και υπάρχει και επέκταση της γλώσσας προγραμματισμού python για gnuplot.

Πληκτρολογώντας gnuplot στη γραμμή εντολών του κελύφους εισέρχεστε στη γραμμή εντολών του gnuplot, ενώ πληκτρολογώντας exit ή quit επιστρέφετε στη γραμμή εντολών του κελύφους.

H εντολή plot

Είναι η βασικότερη ίσως εντολή στο gnuplot, η οποία σχεδιάζει μεγάλη ποικιλία διαγραμμάτων στο επιπέδο (2d). Μπορεί να σχεδιάσει απλές γραμμές, σημεία (dots ή points), συνδυασμό των γραμμών και των σημείων, ιστογράμματα, ράβδους με ένδειξη λάθους, διανύσματα, ράβδους για οικονομικές εφαρμογές κ.α. Τα δεδομένα μπορεί να δημιουργούνται είτε μέσα απο το gnuplot με τη χρήση ενσωματωμένων συναρτήσεων ή που θα διαβάζονται από αρχεία. Οι επιλογές που δέχεται η εντολή plot είναι πάρα πολλές και οι συνδυασμοί τους ακόμη περισσότεροι, γι'αυτό στον οδηγό αυτό θα περιγραφούν μόνο μερικές από τις βασικές.

Συναρτήσεις

Οποιαδήποτε μαθηματική έκφραση που γίνεται αποδεκτή απο C, FORTRAN, Pascal μπορεί να σχεδιαστεί και με το gnuplot. Η προτεραιότητα των τελεστών καθορίζεται από τις προδιαγραφές της γλώσσας C.

Αν πληκτρολογήσουμε

plot x

θα σχεδιάσει μια ευθεία γραμμή που θα ξεκινάει από το σημείο (-10,-10) και θα καταλήγει στο σημείο (10,10) προεπιλεγμένα από το ίδιο το gnuplot. O τύπος της συνάρτησης φάινεται στην επάνω δεξιά γωνία του διαγράμματος. Με την ιδια λογική μπορούμε να σχεδιάσουμε γραφικές παραστάσεις πιο πολύπλοκων συναρτησεων όπως φαίνεται στα παρακάτω παραδείγματα:

plot x**2, x**3-5*x**2
plot sin(x), cos(2*x)
plot 1/tan(x), 1/tan(x+5), 1/tan(x/10)

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

myfun(x) = sin(x) + x
plot myfun(x)

Για να αλλάξει το εύρος που θα σχεδιαστεί η καμπύλη, στο παράδειγμα από 0 μέχρι 5, μπορούμε να πληκτρολογήσουμε

plot [0:5] 1/tan(x)

Αρχεία δεδομένων

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

0 1.2
1 2.5
2 3.7
3 4.8
4 5.9

Για να σχεδιάσουμε τα δεδομένα αυτά στο gnuplot, θα γράφαμε

plot "mydata"

Τα αρχεία δεδομένων μπορεί να περιλαμβάνουν περισσότερες από μία στήλες, οι οποίες μπορούν να σχεδιαστούν με την επιλογή using ή u.

plot "mydata" using 1:2, u 1:3

στην πρώτη περίπτωση θεωρεί ως δεδομενα την πρώτη και δεύτερη στήλη για τους x- και y- άξονες αντίστοιχα, ενώ στη δεύτερη περίπτωση την πρώτη και τρίτη στήλη του αρχείου.

Μορφοποίηση διαγράμματος

Ένας γενικός τίτλος πάνω από το διάγραμμα ορίζεται ως

set title "Hallo world"

σε αντίθεση με τη λεζάντα που δίνεται από

plot x title "f(x) = x", x**2 title "f(x) = x**2"

Oι ετικέτες των αξόνων ορίζονται με τις επιλογές

set xlabel "x"
set ylabel "f(x)"

και το διάγραμμα τότε μπορεί να ξανασχεδιαστεί με

replot

Αυτοματοποίηση εντολών

Όλες οι εντολές που θα χρησιμοποιηθούν μπορούν να αποθηκευτούν σε ένα αρχείο για μελλοντική χρήση και να καλούνται από το gnuplot με την εντολή load. Για παράδειγμα το αρχείο myfile μπορεί να περιλαμβάνει τις εξής εντολές:

set title "Hallo world"
set xlabel "Time"
set ylabel "Money"
plot x title "Time is money"

και να καλεσθεί μέσα από το gnuplot ως:

load "myfile"

όπου θα εκτελεσθούν οι παραπάνω εντολές.

Επίλογος

Οι δυνατότητες φυσικά του gnuplot δε περιορίζονται σε αυτά τα οποία περιγράφτηκαν εδώ. Για περισσότερες πληροφορίες μπορεί κανείς να ψάξει στην ιστοσελίδα του gnuplot, ή μέσα από το πρόγραμμα πληκτρολογώντας

help {<θέμα>}

Βιβλιογραφία

http://www.gnuplot.info/docs/gnuplot.html

Oδηγός wget

wget

Το wget είναι ένα πρόγραμμα για συλλογή δεδομένων από το διαδίκτυο, το οποίο μπορεί να εκτελεστεί και στο υπόβαθρο (background). Αυτό σημαίνει ότι ο χρήστης μπορεί ακόμη και να αποσυνδεθεί από το σύστημα ενώ η εντολή wget θα συνεχίσει να εκτελείται.

Το wget μπορεί να δημιουργήσει τοπικές εκδόσεις μιας ιστοσελίδας, αναπαράγωντας πλήρως τη δομή των φακέλων της αρχικής ιστοσελίδας. Μπορεί επίσης να μετατρέψει τους συνδέσμους της ιστοσελίδας σε τοπικά αρχεία HTML για αναφορά σε εκτός σύνδεσης κατάσταση.

Στο σημείο αυτό πρέπει να τονίσω ότι η δυνατότητα του να κατεβάζει κανείς δεδομένα από το διαδίκτυο από τη γραμμή εντολών σημαίνει ότι μπορεί να ενσωματωθεί σε ένα αρχείο εντολών κελύφους (script) και να εκτελεσθεί αυτόματα. Αυτό επιτρέπει την κατάχρηση ιστοσελίδων, που μπορεί να οδηγήσει στην κατάρρευσή τους. Αρά δεν ειναι αποδεκτή μια τέτοια χρήση και προτείνεται να γίνεται πάντα με μέτρο. Γι'αυτό στον οδηγό αυτό δε θα χρησιμοποιηθεί καμία ιστοσελίδα ως παράδειγμα αλλά πάντα η λέξη "url". Σε όλα τα παραδείγματα μπορείτε να αντικαταστήσετε τη λέξη url με οποιαδήποτε ιστοσελίδα όπως για παράδειγμα www.google.com ή http://ubuntu.opengr.net.

Όπως η περισσότερες εντολές η επιλογή -V ή --version τυπώνει την έκδοση του wget, ενώ η επιλογή -h ή --help τυπώνει ένα μήνυμα βοηθειας με όλες τις επιλογές του wget.

Αλλά ας περάσουμε σε ένα πολύ απλό παράδειγμα. Η παρακάτω εντολή

wget url

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

Σε περίπτωση που δε βρεθεί η ιστοσελίδα τότε θα εμφανιστεί ένα μήνυμα λάθους "Resolving url... failed: Host not found." Aν επιθυμείτε να προωθείσετε τα μηνύματα της εντολής wget σε ένα αρχείο τότε με την επιλογή -ο logfile όλα τα μηνύματα αποθηκεύονται στο αρχείο logfile.

wget url -o mylog

Αντί να δημιουργεί κάθε φορά καινούριο αρχείο μηνυμάτων, με την επιλογή -a logfile τα μηνύματα γράφονται στο τέλος του αρχείου logfile. Αν το αρχείο δεν υπάρχει τότε δημιουργείται ενα καινούριο. Φυσικά όλα τα μηνύματα μπορούν να κατασταλλούν με την επιλογή -q ή --quiet.

Αν θελετε να κατεβάσετε με μία εντολή από πολλές ιστοσελίδες τότε μπορείτε να γράψετε όλες τις ιστοσελίδες σε ένα αρχείο εισόδου, για παραδειγμα το αρχείο myinput μπορεί να περιλαμβάνει

url1
url2
url3

Τότε η εντολή

wget -i myinput -a mylog

θα διαβάσει από το αρχείο εισόδου myinput όλες τις ιστοσελίδες που θα δεί, δηλαδή τις url1, url2, url3, και θα τις κατεβάσει γράφοντας όλα τα μηνύματα στο αρχειό mylog.

Το προεπιλεγμένο αρχείο εξόδου όπως είπαμε είναι το index.html. Αυτό μπορεί να αλλαχτεί με την επιλογή -Ο file. Προσοχή: είναι κεφαλαίο αγγλικό ο και όχι μηδέν!!!

wget url -O myurl.html

Η παραπάνω εντολή θα αποθηκεύσει την ιστοσελίδα url στο αρχείο myurl.html.

Σε περίπτωση που η ιστοσελίδα περιέχει εικόνες, τότε η εντολή πρέπει να εκτελεσθεί με την επιλογή -k ή --convert-links ώστε να είναι αυτές διαθέσιμες και για τοπική χρήση. Μια άλλη επιλογή είναι η -m ή --mirror, η οποία δημιουργεί ένα κατοπτρικό αντίγραφο της ιστοσελίδας. Η επιλογή αυτή ενεργοποιεί, εκτός των άλλων, την αναδρομική επιλογή -r ή --recursive. To βάθος της αναδρομής οριζεται:

-l depth

όπου η προεπιλεγμένη τιμή για το depth είναι 5.

H επιλογή -b ή --background θέτει την εντολή στο υπόβαθρο αμέσως μετά την εκκίνησή της. Εάν δεν έχει οριστεί αρχείο εξόδου μέσω της επιλογής -o, τότε το αποτέλεσμα προωθείται στο αρχειό wget-log. Θα παρατηρήσετε ότι με αυτή την εντολή, ο ελέγχος επιστρέφεται αμέσως στη γραμμή εντολών, μαζί με το pid (process identity) της διαδικασίας που ξεκίνησε. Αν ο χρήστης αποσυνδεθεί τότε η διαδικασία αυτή θα συνεχίσει να τρέχει.

Και φυσικά είναι δυνατό τα cookies να ενεργοποιηθούν --cookies=on ή και να απενεργοποιηθούν --cookies=off.

Βιβλιογραφία

Manual pages: wget

Oδηγός script

Script

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

Γι'αυτές τις περιπτώσεις είναι χρήσιμη η εντολή script. Πληκτρολογώντας απλώς script οι εντολές καθως και τα αποτελέσματα όλων των εντολών απο δω και μετά θα αποθηκεύονται και σε ένα αρχείο που δημιουργειται στον τρέχων φάκελο. Για παράδειγμα σε εμένα το αποτελεσμα της script είναι:

Script started, output file is typescript

και ό,τι βλέπουμε στην οθονη αποθηκευεται και στο αρχείο typescript. H επιλογή -a προσθέτει τα αποτελεσματα σε ένα υπάρχον αρχείο χωρις να το διαγραφει το προηγούμενο. Μπορούμε να βγούμε από το περιβάλλον της εντολής script με ctrl+D, σταματώντας έτσι την αποθήκευση των εντολών και των αποτελεσματων τους στο αρχείο.

Για περισσότερες επιλογές δες man script

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

Οδηγός μεταγλώττισης πηγαίου κώδικα

Make

1. Εισαγωγή

Oι υπολογιστές αυτό που κάνουν δεν είναι τίποτε άλλο από πρόσθεση, πολλαπλασιασμός και αποθήκευση και μεταφορά δεδομένων. Αυτό επιτυγχάνεται με ηλεκτρονικά κυκλώματα, τα οποία ανάλογα με την είσοδο που δέχονται επιτρέπουν ή όχι τη διέλευση του ρεύματος. Οι καταστάσεις αυτές μπορούν να αναπαρασταθούν στο δυαδικό συστημα ως 0 "δεν παιρνά ρεύμα" ή 1 "παιρνά ρεύμα". Οι οδηγίες ή εντολές που καταλαβαίνει δηλαδή ο υπολογιστής είναι γραμμένες σε γλώσσα μηχανής (machine code). Κώδικας μηχανής ή γλώσσα μηχανής είναι ένα σύστημα οδηγιών και δεδομένων που μπορούν να εκτελεσθούν απ'ευθείας από την κεντρική μοναδα επεξεργασίας του υπολογιστή. Η γλώσσα μηχανής είναι συνήθως δύσκολη στο χειρισμό από τον άνθρωπο, αν και στις πρώτες μέρες των υπολογιστών ήταν αρκετά απλά. Γι'αυτό το λόγο δημιουργήθηκε μια άλλη γλώσσα, η assembly, πιο προσιτή στον άνθρωπο. Η assembly είναι μια χαμηλού επιπέδου γλώσσα για τον προγραμματισμό υπολογιστών. Aν και χρησιμοποιείται ακόμη και σήμερα σε κάποιες εφαρμογές, όπως μικροεπεξεργαστές ή plc, είναι αρκετά δύσχρηστη. Γι'αυτό αναπτύχθηκαν υψηλότερου επιπέδου γλώσσες κατανοητές στον άνθρωπο. Οι γλώσσες προγραμματισμού μπορούν να χωριστούν σε δύο κατηγορίες, compiled και interpreted, ανάλογα με το αν μετατρέπουν τον πηγαίο κώδικα σε κώδικα μηχανής ή αν τον εκτελούν βήμα-βήμα. Μερικά παραδείγματα compiled γλωσσών προγραμματισμού είναι fortran, C, C++, ada, algol, cobol, delphi, pascal. Παραδείγματα interpreted γλωσσών προγραμματισμού, γνωστές και ως scripting γλώσσες, αποτελούν python, java, tcl, ruby. Στον παρών οδηγό θα ασχοληθούμε με τη μεταγλώττιση προγραμμάτων γραμμένα κυρίως σε C, και σε κάποιες περιπτώσεις fortran.

Για τη μεταγλώττιση προγραμμάτων είναι απαραίτητα, εκτός του μεταγλωττιστή, κάποια εργαλεία που διευκολύνουν και αυτοματοποιούν τη διαδικασία. Στο debian (και σε παράγωγά του όπως το ubuntu) η εγκατάσταση των απαραίτητων προγραμμάτων, αν και είναι πολύ πιθανόν να είναι ήδη εγκατεστημένα, γίνεται ως εξής:

sudo apt-get install gcc
sudo apt-get install make

Για τους χρήστες FORTRAN το απαραίτητο πακέτο μπορεί να εγκατασταθεί:

sudo apt-get install gfortran

Mια άλλη δυνατότητα περιλαμβάνει τη χρήση του μεταγλωττιστή g95, ο οποίος πρέπει να εγκατασταθεί χειροκίνητα. Τα υπόλοιπα εργαλεία, ld, ar, nm, που θα χρειασθούν είναι εγκατεστημένα σε κάθε σύστημα linux. Σε διαφορετική περίπτωση μπορούν να εγκατασταθούν επίσης απλά με τη χρήση της εντολής apt-get, όπως παραπάνω. Άλλες διανομές έχουν διαφορετικό τρόπο εγκατάστασης των πακέτων, όπως το rpm της Red Hat, oι οποίοι δεν πρόκειται να συζητηθούν εδώ.

2. Ο μεταγλωττιστής gcc

Ο μεταγλωττιστής gcc (GNU Compiler Collection, παλιότερα γνωστός ως GNU C Compiler) είναι ένα πρόγραμμα για τη μεταγλώττιση πηγαίου κώδικα σε γλώσσα μηχανής γραμμένου στις γλώσσες C, C++, ή Objective-C (αντικειμενική-C). Ο gcc μεταγλωττίζει ένα ή περισσότερα αρχεία πηγαίου κώδικα, για παράδειγμα πηγαία αρχεία C (file.c), πηγαία αρχεία assemply (file.s) ή προεπεξεργασμένα πηγαία αρχεία C (file.i). Aν η κατάληξη του αρχείου δεν αναγνωρισθεί τότε θεωρείται ως αντικειμενικό αρχείο (object) ή βιβλιοθήκη. Ο gcc καλεί συνήθως έναν προεπεξεργαστή (preprocessor), μεταγλωττίζει τον προεπεξεργασμένο κώδικα σε γλώσσα assembly, τον συναρμολεί και μετά το συνδέει με το linker. H διαδικασία μπορεί να διακοπεί σε ένα από τα προηγούμενα στάδια χρησιμοποιώντας τις επιλογές -c, -S, ή -E. Τα βήματα μπορεί επίσης να διαφέρουν ανάλογα με τη γλώσσα που χρησιμοποιείται. Ως προεπιλογή η έξοδος αποθηκεύεται στο αρχειό a.out. Σε μερικές περιπτώσεις ο gcc δημιουργεί ένα αντικειμενικό αρχειό έχοντας την κατάληξη .o και το αντίστοιχο βασικό όνομα.

Οι επιλογές του προεπεξεργαστή και του linker που δίνονται στη γραμμη εντολών του gcc, μεταβιβάζονται σε αυτά τα εργαλεία όταν εκτελούνται. Στον παρών οδηγό θα σχολιασθούν μόνο οι βασικές επιλογές του gcc, ενώ για μια πλήρη αναφορά μπορείτε να ανατρέξετε στις σελίδες εγχειριδίου (man pages).

Ας ξεκινήσουμε όμως από ένα απλό παράδειγμα. Το αρχείο hallo.c περιλαμβάνει τα εξής:

/* hallo.c */
int main(){
printf("Hallo world\n");
}

H εντολή

gcc hallo.c

δέχεται ως αρχείο εισόδου το hallo.c, το μεταγλωτίζει και χωρίς να αποθηκεύει το ενδιάμεσο αντικείμενο, δημιουργεί το εκτελέσιμο με το προεπιλεγμένο όνομα a.out.

H περιφραστική εκδοχή της παραπάνω εντολής θα ήταν:

gcc -c hallo.c
gcc -o a.out hallo.c

Η επιλογή -c δηλώνει μεταγλώττιση (compile), ενώ η -ο (οutput) δηλώνει το αρχείο εξόδου. Στην περιφραστική εκδοχή αποθηκεύεται και το ενδιάμεσο αντικείμενο hallo.o.

Αν υποθέσουμε ότι το αρχείο hallo.c περιέχει πολλούς βρόγχους (loops) τον ένα μέσα στον άλλο για τον υπολογισμό πινάκων. Τότε αυτό θα κάνει το πρόγραμμα αρκετά αργό. Σε τέτοιες περιπτώσεις είναι απαραίτητη η χρήση της επιλογής βελτιστοποίησης -Ο όπως στο παρακάτω παράδειγμα:

gcc -c -O3 hallo.c

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

Οι επιλογές προεπεξεργαστή μπορεί να χρησιμοποιηθεί για προγράμματα που πρέπει να λειτουργούν σε διάφορες αρχιτεκτονικές με διαφορετικές τιμές σε μια μεταβλητή. Ας θεωρήσουμε ότι έχουμε σε ένα πρόγραμμα την επιλογή 32-bit ή 64-bit, και ότι σε καθε περίπτωση πρέπει να συμβεί κάτι διαφορετικό. Αυτό δε συμαίνει ότι πρέπει να έχουμε και δύο εκδόσεις του προγράμματος. Μπορεί εύκολα να λυθεί με την επιλογή -D όπως στο παρακάτω παράδειγμα:

int main(){
if (BIT==32){
printf("%i\n", BIT);
}
else if (BIT==64){
printf("%i\n",BIT);
}
else {
printf("%i\n",BIT);
}
}

To οποίο μεταγλωττίζεται με μία από τις επιλογές:

gcc -DBIT hallo.c

gcc -DBIT=32 hallo.c

gcc -DBIT=64 hallo.c

Aς υποθέσουμε τώρα το αρχειό mylib.h βρίσκεται στο φάκελο ~/include και ότι θέλουμε να το συμπεριλάβουμε στον κώδικά μας με την εντολή #include "mylib.h". Αυτό θα το κάναμε με την επιλογή -Ι κατά τη μεταγλώττιση, ή οποία δεχεται τόσο σχετική όσο και απόλυτη διαδρομή.

gcc -l~/include hallo.c

Η χρήση μιας βιβλιοθήκης, πχ. libast.a, η οποία βρίσκεται στο φάκελο ~/lib γίνεται με τις παρακάτω επιλογές:

gcc -L~/lib -last hallo.c

Πρέπει να σημειωθεί ότι η βιβλιοθήκη libast.a με το εργαλείο ar, που θα παρουσιαστεί παρακάτω.

Γενικές επιλογές (κατά αλφαβητική σειρά)

-ansi
Eπιβάλει πλήρη συμβατότητα με το πρότυπο ANSI.
-c Δημιουργία ενός συνδέσιμου αρχείου αντικειμένου για κάθε αρχείο πηγαίου κώδικα, αλλά χωρίς κλήση του linker.
-E Προεπεξεργάζεται τα πηγαία αρχεία αλλά δεν τα μεταγλωττίζει. Τυπώνει τα αποτελέσματα στην τυπική έξοδο. Αυτή η επιλογή είναι χρήσιμη για τη μεταβίβαση μερικών επιλογών cpp (C PreProcessor) που διαφορετικά θα σταματούσαν το gcc όπως η -C, -M, ή -P.
-g Συμπεριλαμβάνει πληροφορίες αποσφαλμάτωσης (debugging) για χρήση με το gdb.
-glevel
Παρέχει πληροφορίες για την αποσφαλμάτωση. level πρέπει να είναι 1, 2, ή 3, με το 1 να παρέχει το ελάχιστο πλήθος πληροφοριών. Η προεπιλογή είναι το 2.
--help
Τυπώνει τις συνηθέστερες βασικές επιλόγες και τερματίζει.
-o file
Ορίζει το αρχείο εξόδου ως file. Προεπιλεγμένο είναι το a.out.
-O[level]
Βελτιστοποίηση. level πρέπει να είναι 1, 2, 3, ή 0 (προεπιλεγμένο είναι το 1). Το 0 απενεργοποιεί τη βελτιστοποίηση.
-p Παρέχει πληροφορίες προφιλ για χρήση με prof.
-pedantic
Προειδοποιεί αμετροεπώς.
-pg Παρέχει πληροφορίες προφιλ για χρήση με gprof.
-std=standard
Kαθορίζει το πρότυπο της C του αρχείου εισόδου. Αποδεκτές τιμές είναι:
iso9899:1990, c89 1990 ISO C πρότυπο.
iso9899:199409 1994 προσθήκη στο 1990 ISO C πρότυπο.
iso9899:1999, c99 1999 ISO C αναθεωρημένο πρότυπο.
iso9899:1999, c9x
gnu89 1990 C πρότυπο με GNU επεκτάσεις (η προεπιλεγμένη τιμή).
gnu99, gnu9x 1999 αναθεωρημένο ISO C πρότυπο με GNU επεκτάσεις.

-s Μεταγλωττίζει τα πηγαία αρχεία σε κώδικα assembly, αλλά δεν τα συναρμολογεί.
-v Tυπώνει πληροφορίες έκδοσης.
-V version
Προσπαθεί να εκτελέσει την gcc έκδοση version.
-w Aποσιωπεί τις προειδοποιήσεις.
-W Προειδοποιεί πιο αμετροεπώς από το κανονικό.
-Wall
Ενεργοποιεί όλες τις πιθανές προειδοποιήσεις.
-x language
Περιμένει το αρχείο εισόδου να είναι γραμμένο στη γλώσσα language, που μπορεί να είναι c, objective-c, c-header, c++, ada, f77, ratfor, assembler, java, cpp-output, c++-cpp-ouput, objc-cpp-output, f77-cpp-output, assembler-with-cpp, ή ada. Αν δεν ορισθεί τίποτε τότε μαντεύει τη γλώσσα από την κατάληξη του αρχείου.

Επιλογές προεπεξεργαστή

Ο gcc μεταβιβάζει τις παρακάτω επιλογές στον προεπεξεργαστή:

-Dname[=def]
Οριζει το name με την τιμή def σαν να είχε οριστεί ως #define. Αν δε δοθεί =def, τότε το name ο=ρίζεται με την τιμή 1. -D έχει χαμηλότερη προτεραιότητα από -U.
-Idir
Περιλαμβάνει το dir στη λίστα με τους φακέλους για να ψαξει για αρχεία που πρέπει να συμπεριληφθούν.
-Uname
Aπομακρύνει τον ορισμό το συμβόλου name.

Eπιλογές linker

Ο gcc μεταβιβάζει τις παρακάτω επιλογές στο linker:

-llib
Συνδέει στη βιβλιοθήκη lib.
-Ldir
Ψάχνει στο dir εκτός από προεπιλεγμένους φακέλους για βιβλιοθήκες.
-u symbol
Αναγκάζει το linker να ψάξει στις βιβλιοθηκες για τον ορισμό του symbol, και να συνδέσει στις βιβλιοθήκες που βρήκε.

3. Εργαλεία

3.1 Η εντολή: ld

Το πρόγραμμα ld συνδέει (link) διαφορα αντικειμενα, στη δοσμένη σειρά, σε ένα εκτελέσιμο αντικείμενο (προεπιλογή a.out). Συνήθως εκτελείται αυτόματα από τις εντολές μεταγλώττισης όπως η gcc. Η βασική σύνταξη της εντολής είναι:

ld [options] objfiles

Eπιλογές

-Ldir
Ψάχνει στο dir εκτός από προεπιλεγμένους φακέλους για βιβλιοθήκες.
-o file
Ορίζει το αρχείο εξόδου ως file. Προεπιλεγμένο είναι το a.out.

Για παράδειγμα:

ld -o myexe file1.o file2.o file3.o

δημιουργεί το εκτελέσιμο myexe από τα αντικείμενα file1.o file2.o file3.o.

3.2 H εντολή: ar

Χρησιμοποιείται συνήθως για τη δημιούργια βιβλιοθηκών. Η βασική σύνταξη της εντολής είναι:

ar key [args] [posname] [count] archive [files]

Key

d Διαγραφή των files από το archive.
m Μετακίνηση των files στο τέλος του archive.
p Τυπώνει τα files του archive.
q Προσθέτει τα files στο τέλος του archive.
r Αντικαθιστά τα files στο archive.
t Δείχνει τα περιεχομενα του archive ή τα αναφερθέντα files.
x Εξάγει τα περιεχόμενα από το archive ή μόνο τα αναφερθέντα files.

Συνήθη ορίσματα

a Χρηση με r ή m για τοποθέτηση των files στο archive μετά το posname.
b Όπως το a αλλά πρίν το posname.
c Δημιουργία archive "σιωπηλά"
i Όπως το b.
u Χρήση με το r για την αντικατάσταση μόνο των files που άλλαξαν από την τελευταία φορά που προστέθηκαν στο archive.

Για παράδειγμα η εντολή

ar cr libast.a *.o

θα δημιουργήσει μια βιβλιοθηκή με το όνομα libast από όλα τα αρχεία .ο που βρίσκονται στο φάκελο. Αν κάποιο όνομα αρχείο υπάρχει ήδη στη βιβλιοθηκη τοτε θα αντικατασταθεί.

3.3 H εντολή: nm

Με αυτή την εντολή μπορούν να τυπωθούν τα ονόματα των συναρτήσεων που χρησιμοποιούνται στο αντικείμενο. Τα ονόματα τυπώνονται όχι όπως φαίνονται στον πηγαίο κώδικα αλλά με underscores και άλλες λεπτομέρεις που εξαρτώνται από το μεταγλωττιστή. Η εντολή nm είναι πολύ χρήσιμη κατά την αποσφαλμάτωση προγραμμάτων που είναι γραμμένα σε ανάμικτες γλώσσες προγραμματισμού. Η βασική σύνταξη της εντολής είναι:

nm [options] objfiles

Για παράδειγμα το αρχειό hallo.o του πρώτου παραδειγματος στο λειτουργικό mac os x (powerpc) θα δώσει:

00000000 T _main
U _printf
U dyld_stub_binding_helper

4. make

Το make είναι ένα εργαλείο για την αυτόματη δημιουργία προγραμμάτων. Το προεπιλεγμένο αρχείο εισόδου είναι το Makefile, οπότε με την εκτέλεση της εντολής make θα ψάξει το πρόγραμμα για το αρχείο Makefile και αν δε το βρει θα βγάλει μήνυμα λάθους. Ένα απλό Makefile περιλαμβάνει τα εξής:

# Αυτό είναι σχόλιο
COM=myexe
OBJ=file1.o file2.o file3.o
LDR=gcc

$(COM): $(OBJ)
$(LDR) -o $(COM) $(OBJ)
# Τα κενά στην αρχή της παραπάνω γραμμής είναι σημαντικό να είναι tab.

clean:
rm $(OBJ)
# Ομοίως το κενό πρέπει να είναι tab.

Στα Makefiles υπάρχει η "παραξενιά" να χρησιμοποιείται το tab. Πρέπει απλώς κανείς να το συνηθισει. Αλλά ας πάρουμε το αρχείο από την αρχή. COM=myexe δινει στη μεταβλητή COM την τιμή myexe, η οποία θα είναι το όνομα του εκτελέσιμου. OBJ=file1.o file2.o file3.o λέει στο make ότι τα αντικείμενα που χρειάζονται είναι τα file1.o file2.o file3.o. LDR=gcc ορίζει το πρόγραμμα που θα συνδέσει τα αντικείμενα, θα μπορούσε να ήταν και το ld.

H επόμενη γραμμή λέει ότι το εκτελέσιμο $(COM) εξαρτάται από τα αντικείμενα $(OBJ). Για να δημιουργηθεί δηλαδή το αρχείο myexe πρέπει πρώτα να δημιουργηθούν τα εξαρτόμενα αντικείμενα. Ας υποθέσουμε τώρα ότι τα file1.c και file2.c είναι αρχεία C, ενώ το file3.f είναι αρχείο fortran. Aυτό δε φαίνεται πουθενά στο Makefile, παρόλ' αυτά το make θα καλέσει τους κατάλληλους μεταγλωττιστές, κι αν δεν υπάρχουν θα βγάλει μήνυμα λάθους. Aν πληκτρολογήσουμε make, θα προσπαθήσει να εκτελέσει τις εντολές:

gcc -c file1.c
gcc -c file2.c
g77 -c file3.f

Έπειτα θα τα συνδέσει με την εντολή

gcc -o myexe file1.o file2.o file3.o

Tελος η εντολή rm $(OBJ) δε θα εκτελεσθεί. Αυτό συμβαίνει γιατί υπάρχουν στο συγκεκριμενο αρχείο 2 στόχοι (targets), ο $(COM) και ο clean. Aν κατα την εκτέλεση της εντολής δε εχουμε δώσει κάποιο στόχο τότε ο προεπιλεγμένος είναι ο ανώτερος, δηλαδή σε αυτή την περίπτωση ο $(COM). Αν πληκτρολογήσουμε

make clean

τότε θα πάει στη γραμμή

clean:

όπου δε θα δει καμία εξάρτηση και μετά θα εκτελέσει την εντολή rm $(OBJ).

Όλες οι παραπάνω εντολές και επιλόγες των εντολών που παρουσιασθηκαν παραπάνω, μπορούν με μεγάλη ευκολία να χρησιμοποιηθούν σε ένα Makefile.

5. Επίλογος

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

6. Βιβλιογραφία

Herold, Helmut (2003), make - Das Profitool zur automatischen Generierung von Programmen, Addison-Wesley.

Robbins, Arnold (2005), UNIX in a nutshell, O' Reilly.

Καλώς ήρθατε, welcome, willkommen

To θέμα αυτού του blog είναι όπως λέει και ο τίτλος το linux. Ίσως να μην έχει καμία σχέση με την κβαντομηχανική αλλά με τη λειτουργία του linux έχει. Ίσως στο μέλλον να ασχοληθεί και με την κβαντομηχανική, αλλά στο παρόν θα επιμείνουμε στην κλασσική μηχανική. Άλλωστε οι κβαντικοί υπολογιστές θα γίνουν στο μέλλον σίγουρα πραγματικότητα.

Καλή ανάγνωση!!!