Αυτό το commit περιλαμβάνεται σε:
infl00p 2022-03-23 20:14:33 +02:00
commit 8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές

40
content/articles/22/01_editorial.md Κανονικό αρχείο

@ -0,0 +1,40 @@
+++
title = 'Editorial'
date = '2000-03-01T00:00:00Z'
description = ''
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
issue = ['Magaz 22']
issue_weight = 1
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Καλώς ορίσατε στο **Magaz**\...*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Κανονικά αυτό το τεύχος θα έπρεπε να είναι \"διπλό\" μια και τεύχος Φεβρουαρίου δεν βγήκε. Τελικά μάλλον πρέπει να δημιουργηθεί σενάριο failover για περιπτώσεις
όπως αυτή, που από τέλος Ιανουαρίου μέχρι μέσα Φεβρουαρίου αδυνατούσα να ασχοληθώ με οτιδήποτε.
Στο προηγούμενο τεύχος, υπήρχε ένα άρθρο σχετικά με τους γιδοβοσκούς του Ιντερνέτ, άρθρο το οποίο δεν γέννησε τις αντιδράσεις που περίμενα, είχε όμως ως
αποτέλεσμα κάποιοι άνθρωποι να επικοινωνήσουν μαζί μου για να πάρουν συγκεκριμένες οδηγίες. Προφανώς τους παρέπεμψα στα RFCs μια που δεν είναι δουλειά μου να
δίνω τέτοιες οδηγίες\....
Το ότι κάποιος όμως, ενδιαφέρθηκε να διορθώσει τις σελίδες του, και να μάθει παραπάνω πράγματα, για μένα είναι σημαντικό.
Σε αυτό το τεύχος έχουμε ένα πολύ όμορφο άρθρο για το VI, από τον φίλο Σεραφείμ Ζανικόλα. Πραγματικά invaluable για τους αρχαρίους του vi, και πολύ χρήσιμο για
όσους το ξέρουν σε κάποιο μέσο επίπεδο.
Έχουμε και το άρθρο του Μάνου Καραγιώργου που ασχολείται με το swapping (και λίγο με το paging). Πραγματικά χρήσιμο, για να ρυθμίσετε τα swap files και devices
σας για να είναι αποδοτική η εργασία του συστήματός σας.
Ο Πολύβιος Πρατικάκης καταπιάνεται με το θέμα της ελευθερίας του Internet, και τους κινδύνους που αυτή θέτει, συγκρίνοντας τη σημερινή κατάσταση, με αυτήν που
περιέγραψε ο Όργουελ στο βιβλίο του 1984.
Τέλος, ο The Reverant μας εξηγεί πόσο παραμετροποιήσιμος είναι ο FVWM2, ένας window manager με ιστορία στο Linux, και μας οδηγεί σε απλές (και όχι τόσο απλές)
αλλαγές στο configuration file του.
Οι πιο παρατηρητικοί από εσάς θα προσέξουν νέα ονόματα σε αυτό το τεύχος. Μόνο νέα ονόματα, γεγονός το οποίο ενισχύει για μία ακόμα φορά τις προσπάθειες της
συντακτικής ομάδας του Magaz να γίνει το περιοδικό ένας χώρος έκφρασης και brainstorming της ελληνικής linux κοινότητας, και όχι ένας χώρος μονολόγων των
ολίγων.
Καλή ανάγνωση\...

449
content/articles/22/02_swapping.md Κανονικό αρχείο

@ -0,0 +1,449 @@
+++
title = 'Swapping'
date = '2000-03-01T00:00:00Z'
description = ''
author = 'Μάνος Καραγιώργος(mailto:mantis@pathfinder.gr)'
issue = ['Magaz 22']
issue_weight = 2
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Άξονας κίνησης του παρόντος άρθρου είναι η περιγραφή του σκοπού ύπαρξης swap αρχείων/κατατμήσεων, της λειτουργίας τους, της διαδικασίας ορισμού τους, κ.ά.*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
**1. Let\'s swap\...**
-------------------------------------------------
- [1.1 Σκοπός ύπαρξης swap κατάτμησης/αρχείου](#ss1.1)
- [1.2 Εικονική μνήμη](#ss1.2)
- [1.3 Λειτουργία](#ss1.3)
- [1.4 Swapping/Paging](#ss1.4)
- [1.5 Μέγεθος swap](#ss1.5)
- [1.6 Όρια](#ss1.6)
- [1.7 Συμβουλές για μέγιστη απόδοση](#ss1.7)
**2. Swap αρχεία**
---------------------------------------------
- [2.1 Ορισμός swap αρχείου](#ss2.1)
- [2.2 Ρόλος του /dev/zero](#ss2.2)
**3. Swap κατατμήσεις**
--------------------------------------------------
- [3.1 Ορισμός swap κατάτμησης](#ss3.1)
**4. Ρύθμιση swap συσκευών**
-------------------------------------------------------
**5. Συγχρονισμός\... ΤΩΡΑ**
-------------------------------------------------------
- [5.1 Ρόλος της sync](#ss5.1)
**6. Χρησιμοποίηση swap συσκευών**
-------------------------------------------------------------
- [6.1 Το αρχείο /etc/fstab](#ss6.1)
- [6.2 Εξηγήσεις\...](#ss6.2)
- [6.3 Παράμετροι στην swapon](#ss6.3)
- [6.4 Αυτόματη χρησιμοποιήση swap συσκευών](#ss6.4)
- [6.5 Μή χρησιμοποίηση swap συσκευών](#ss6.5)
**7. Έλεγχος χρήσης swap συσκευών**
--------------------------------------------------------------
- [7.1 free](#ss7.1)
- [7.2 cat /proc/meminfo](#ss7.2)
- [7.3 cat /proc/swaps](#ss7.3)
- [7.4 top](#ss7.4)
- [7.5 procinfo](#ss7.5)
**8. Ιδέες\...**
-------------------------------------------
- [8.1 Συνδυασμός swap και /tmp](#ss8.1)
- [8.2 Swap κατ\' απαίτηση με loopback device](#ss8.2)
**9. Ίδιος χώρος swap με άλλα λειτουργικά συστήματα**
--------------------------------------------------------------------------------
- [9.1 FreeBSD](#ss9.1)
- [9.2 Microsoft Windows](#ss9.2)
**10. Σχετικά**
--------------------------------------------
- [10.1 No time\...](#ss10.1)
- [10.2 Πηγές](#ss10.2)
### [1. Let\'s swap\...]{#s1}
### [1.1 Σκοπός ύπαρξης swap κατάτμησης/αρχείου]{#ss1.1}
To swap αρχείο/κατάτμηση χρησιμοποιείται ως εικονική μνήμη (virtual RAM) στο σύστημά σας. Η εικονική μνήμη είναι επέκταση της πραγματικής μνήμης του συστήματος.
Η ύπαρξή του τις περισσότερες φορές είναι απαραίτητη.
### [1.2 Εικονική μνήμη]{#ss1.2}
Το Linux υποστηρίζει εικονική μνήμη, δήλαδη χρησιμοποιεί ένα δίσκο σαν επέκταση της RAM, έτσι ώστε το συνολικό μέγεθος της χρησιμοποιήσιμης μνήμης να αυξάνει
αναλογικά. Ο πυρήνας γράφει τα περιεχόμενα ενός τρέχοντος αχρησιμοποίητου block μνήμης στο σκληρό δίσκο έτσι ώστε η μνήμη να μπορεί να χρησιμοποιηθεί για άλλο
σκοπό. Όταν τα αρχικά περιέχομενα χρειάζονται ξανά, διαβάζονται πάλι από τη μνήμη.
Αυτά όλα γίνονται τελείως αδιαφανή από το χρήστη. Προγράμματα που τρέχουν κάτω από το Linux βλέπουν μόνο τη μεγαλύτερη ποσότητα της διαθέσιμης μνήμης και δεν
προσέχουν πως κομμάτια αυτών μένουν στο δίσκο από στιγμή σε στιγμή. Το κομμάτι του σκληρού δίσκου που χρησιμοποιείται σαν εικονική μνήμη ονομάζεται χώρος swap
(χώρος προσωρινής αποθήκευσης).
### [1.3 Λειτουργία]{#ss1.3}
Όταν χρησιμοποιείται swap χώρος, το Linux μετακινεί αχρησιμοποιήτες σελίδες μνήμης στο σκληρό δισκό, επιτρέποντας να τρέχετε περισσότερες εφαρμογές ταυτόχρονα
στο σύστημά σας.
Όμως, επειδή αυτή η διαδικασία είναι σχετικά αργή (χίλιες φορές περίπου), ο χώρος swap δεν μπορεί να αντικαταστήσει την πραγματική φυσική μνήμη RAM, που είναι
πιο γρήγορη. Έτσι τα προγράμματα δεν τρέχουν το ίδιο γρήγορα. Οι εφαρμογές του X Window System, κυρίως, έχουν ιδιαίτερες απαιτήσεις σε μνήμη και γι\'αυτό θα
πρέπει να έχετε μια συσκευή (αρχείο/κατάτμηση) swap.
Μερικά προγράμματα καταλαμβάνουν στατικά σελίδες πραγματικής μνήμης (κλειδώνοντάς τες) για λόγους ασφαλείας ή για λόγους απόδοσης. Με αυτόν τον τρόπο οι
\"κλειδωμένες\" σελίδες μειώνουν το μέγεθος της διαθέσιμης πραγματικής μνήμης, καθιστώντας απαραίτητη τη χρήση swap μνήμης.
### [1.4 Swapping/Paging]{#ss1.4}
Με απλά λόγια:
Υπάρχει διαχωρισμός μεταξύ του swapping (γράφοντας ολόκληρες τις διεργασίες (processes) σε χώρο swap) και του paging (γράφοντας μόνο καθορισμένου μεγέθους
κομμάτια, συνήθως μερικά kilobytes τη φορά).
Το paging είναι συνήθως πιο αποτελεσματικό, και αυτό είναι που κάνει το Linux, αλλά μιλάμε για swapping έτσι κι αλλιώς.
### [1.5 Μέγεθος swap]{#ss1.5}
Ορισμένοι προτείνουν ότι η swap μνήμη πρέπει να έχει διπλάσιο μέγεθος από αυτό της πραγματικής μνήμης. Υπάρχουν αρκετές διαφοροποιήσεις σχετικά με το πόση swap
μνήμη θα πρέπει να χρησιμοποιήσετε: όλες εξαρτώνται από το τι εφαρμογές θέλετε να τρέχετε\...
Το μέγεθος του χώρου swap εξαρτάται ακόμη από πόση μνήμη έχετε ήδη στο σύστημά σας.
Αν έχετε αρκετή φυσική μνήμη (\>128ΜΒ) και είστε ο μοναδικός χρήστης του συστήματος χωρίς ιδιαίτερες απαιτήσεις μπορεί να σκεφτείτε να μην χρησιμοποιήσετε μνήμη
swap, έχοντας έτσι περισσότερο ελεύθερο αποθηκευτικό χώρο και μειώνοντας το χρόνο αναζήτησης στα δεδομένα σας.
Μπορεί να μην χρησιμοποιείτε μια swap κατάτμηση πολύ συχνά, όταν όμως τη χρειαστείτε η παρουσία της είναι ανεκτίμητη.
Πιθανότατα δεν έχει νόημα να έχετε swap μνήμη περισσότερη από τρεις φορές της φυσικής μνήμης.
Υπολογίστε τη συνολικη σας ανάγκη σε μνήμη. Αυτή είναι το μεγαλύτερο μέγεθος μνήμης που πιθανώς θα χρειαστείτε σε κάθε στιγμή, δηλαδή το άθροισμα των απαιτήσεων
σε μνήμη όλων των προγραμμάτων που θέλετε να τρέχετε ταυτοχρόνως. Αυτό μπορεί να γίνει τρέχοντας την ίδια ώρα όλα τα προγράμματα που πιθανώς θα τρέξετε ποτέ
ταυτοχρόνως. Για παράδειγμα, αν θέλετε να τρέχετε το X Window System, θα πρέπει να καταχωρίσετε περίπου 8-16 MB για αυτό, ο gcc θέλει αρκετά megabytes (μερικά
αρχεία χρειάζονται μία ασυνήθιστα μεγάλη ποσότητα, μέχρι και δεκάδες megabytes, αλλά συνήθως περίπου 4-8 θα είναι αρκετά) κτλ. Ο πυρήνας θα χρησιμοποιήσει
περίπου 1-2ΜΒ από μόνος του, και τα συνηθισμένα shells και άλλα μικρά βοηθητικά προγράμματα ίσως μερικές εκατοντάδες kilobytes (περίπου 1ΜΒ όλα μαζί). Δεν
υπάρχει ανάγκη να προσπάθησετε να είστε ακριβείς, υπολογισμοί στο περίπου είναι μια χαρά, αλλά μπορεί να θέλετε να είστε στην απαισιόδοξη πλευρά.
Θυμηθείτε πως αν υπάρχουν αρκετά άτομα που χρησιμοποιούν το σύστημα ταυτοχρόνως, θα καταναλώνουν όλα μνήμη. Πάντως, αν δύο άτομα τρέχουν το ίδιο πρόγραμμα
αταυτοχρόνως, η συνολική κατανάλωση μνήμης συνήθως δεν είναι διπλάσια, εφόσον οι σελίδες του κώδικα και οι shared βιβλιοθήκες υπάρχουν ήδη μια φορά.
### [1.6 Όρια]{#ss1.6}
Το μέγιστο χρήσιμο μέγεθος μιας περιοχής swap εξαρτάται πλέον από την αρχιτεκτονική του συστήματος.
Είναι περίπου:
- 2GB σε i386, PPC, m68k, ARM,
- 1GB σε sparc,
- 512MB σε mips,
- 128GB σε alpha και
- 3TB σε sparc64.
Υποστηρίζονται μέχρι και 8 συνολικά περιοχές swap.
### [1.7 Συμβουλές για μέγιστη απόδοση]{#ss1.7}
Συνιστάται η χρησιμοποιήση μιας swap κατάτμησης παρά ενός swap αρχείου. Έτσι σε πολλές εγκαταστάσεις του Linux θα συναντήσετε δύο τουλάχιστον κατατμήσεις. To
swapping σε αρχείο επιφέρει σχετική μείωση της απόδοσης του συστήματος γιατί πηγαίνει μέσω του συστήματος αρχείων (ext2). Από την άλλη, μπορείτε να προσθέσετε
swap αρχείο όποτε θέλετε χωρίς καμία ανάγκη για κατάτμηση των δίσκων σας.
Χρησιμοποποιείστε πρώτα αρχείο swap, δουλέψτε με το σύστημα σας για λίγο καιρό για να δείτε πόση μνήμη swap χρειάζεστε περίπου, και μετά φτιάξτε μια κατάτμηση
swap. Μπορείτε βέβαια να χρησιμοποιείτε πολλές swap κατατμήσεις ή/και swap αρχεία, ταυτοχρόνως.
Αφήστε, πάντως, περιθώρια ασφαλείας γιατί πιθανότατα θα ξεχάσετε να τρέξετε μερικά προγράμματα που θα θέλετε να τρέχετε και βεβαιωθείτε ότι έχετε ελέυθερο χώρο
σε κάθε περίπτωση. Είναι καλύτερα να καταχωρήσετε πάρα πολύ χώρο παρά πολύ λίγο (προσέξτε τους τόνους στο παρα\...), αλλά δεν υπάρχει ανάγκη να το παρακάνετε
και να καταχωρήσετε ολόκληρο δίσκο, εφόσον αχρησιμοποιήτος χώρος swap είναι no doubt wasted χώρος.
Αν ο χώρος swap, που θα υπολογίσετε με την παραπάνω μέθοδο, είναι πάρα πολύ μεγαλύτερος από τη φυσική σας μνήμη (όχι τη δικιά σας, του συστήματος σας\...),
καλύτερα να σκεφτείτε σοβαρά να επενδύσετε στην αγορά περισσότερης φυσικής μνήμης, αλλιώς η απόδοση θα είναι αρκετά χαμηλή.
Είναι καλή ιδέα να έχετε τουλάχιστον λίγο χώρο swap, ακόμη και αν οι υπολογισμοί σας δείχουν ότι δεν χρειάζεστε καθόλου. Το Linux χρησιμοποιεί το χώρο swap
δυαναμικά, έτσι ώστε όση περισσότερη φυσική μνήμη το δυνατόν να μπορεί να παραμείνει ελεύθερη. Το Linux θα swap out σελίδες μνήμης που δεν έχουν χρησιμοποιηθεί,
ακόμη και αν η μνήμη δεν χρειάζεται ακόμη για τίποτα. Αυτό αποφεύγει την αναμονή για swapping όταν χρειάζεται: το swapping μπορεί να γίνει νωρίτερα, όταν ο
δίσκος είναι έτσι κι αλλιώς αδρανής.
Ο χώρος swap μπορεί να χωριστεί ανάμεσα σε αρκετούς δίσκους. Αυτό μερικές φορές βελτιώνει την απόδοση, ανάλογα με τις σχετικές ταχύτητες των δίσκων και το χρόνο
προσπέλασης αυτών. Μπορεί να θέλετε να πειραματιστείτε με μερικά διαδεδομένα μοντέλα, αλλά κατανοήστε ότι κάνοντας τα πειράματα κανονικά είναι αρκετά δύσκολο.
Δε θα πρέπει να πιστεύετε φήμες που λένε ότι ένα μοντέλο είναι ανώτερο από κάθε άλλο, εφόσον δε θα είναι πάντα αληθείς.
Μπορείτε να χρησιμoποιήσετε και περισσότερες από μία swap κατατμήσεις.
Μερικοί χρησιμοποιούν RAM disks για swapping, δεν κερδίζετε πολλά με αυτόν τον τρόπο αφού μειώνεται τη διαθέσιμη μνήμη για caching και buffering.
Συνιστάται να δημιουργείτε κατατμήσεις swap σε μεσαία tracks του σκληρού δίσκου (συνήθως /dev/?d?x, όπου xε{4,5,\...} ανάλογα με τον αριθμό των υπάρχοντων
κατατμήσεων) , γιατί τότε η αναζήτηση είναι σχετικά γρήγορη (γρήγορη διαμεταγωγή και αναζήτηση αρχείων).
Αν χρησιμοποιείτε swap αρχείο συνιστάται να τοποθετείται σε ξεχωριστή κατάτμηση, αφού περιλαμβάνει λιγότερα ρίσκα. Αυτή η κατάτμηση δε θα μπορεί πλεόν να
χρησιμοποιηθεί, ακόμη και αν φαίνεται να υπάρχει ελεύθερος χώρος σε αυτή.
### [2. Swap αρχεία]{#s2}
Ένα swap αρχείο είναι ένα κανονικό αρχείο. Δεν είναι με κανένα τρόπο ειδικό προς τον πυρήνα. Το μόνο πράγμα που νοιάζει τον πυρήνα είναι να μην έχει καθόλου
\"τρύπες\", και να είναι έτοιμο για χρήση με την εντολή mkswap.
Πρέπει, πάντως, να διαμένει σε έναν τοπικό δίσκο του συστήματος. Δεν μπορεί να διαμένει σε ένα σύστημα αρχείων που έχει προσαρτηθεί μέσω NFS για λόγους
υλοποίησης.
Το κομμάτι σχετικά με τις \"τρύπες\" είναι σημαντικό. Το αρχείο swap κρατάει τον χώρο του δίσκου έτσι ώστε ο πυρήνας να μπορεί γρήγορα να swap out μια σελίδα
χωρίς να χρειάζεται να παέι μέσω όλων των πραγμάτων που είναι χρήσιμα όταν καταχωρεί ένα sector δίσκου σε ένα αρχείο. Ο πυρήνας απλώς χρησιμοποιεί όποιους
τομείς έχουν ήδη καταχωρηθεί στο αρχείο. Επειδή μια \"τρύπα\" σε ένα αρχείο σημαίνει πως δεν υπάρχουν καθόλου τομείς δίσκου καταχωρημένοι (για αυτό το μέρος
μέσα στο αρχείο), δεν είναι καλό για τον πυρήνα να προσπαθεί να τους χρησιμοποιεί.
### [2.1 Ορισμός swap αρχείου]{#ss2.1}
Ένας καλός τρόπος για να δημιουργήσετε το swap αρχείο χωρίς \"τρύπες\" είναι μέσω της ακόλουθης εντολής:
dd if=/dev/zero of=<swap αρχείο> bs=<bytes> count=<blocks>
- if=/dev/zero : input file, διαβάζει από αυτό το αρχείο
- of=\<swap αρχείο\> : output file, γράφει σε αυτό το αρχείο
- bs=\<bytes\> : block size, διαβάζει και γράφει \<bytes\> bytes κάθε φορά
- count=\<blocks\> : αντιγράφει μόνο \<blocks\> blocks από αυτά που διαβάζει
Θα εμφανιστεί το μήνυμα:
<blocks>+0 records in
<blocks>+0 records out
Είναι καλύτερα το μέγεθος να είναι πολλαπλάσιο του 4, επειδή ο πυρήνας γράφει σελίδες μνήμης, που είναι 4ΚΒ σε μέγεθος. Αν το μέγεθος δεν είναι πολλαπλάσιο του
4, το τελευταίο ζευγάρι των kilobytes μπορεί να είναι αχρησιμοποίητο. Ειδικότερα, για swap αρχείο το μέγεθος είναι καλό να είναι πολλαπλάσιο του inode μεγέθους,
συνήθως 1024 ή 2048 (ή ακόμη και 4096), γιατί 1block=1KB=1024 bytes άρα τιμές πολλαπλάσιες του 1024.
### [2.2 Ρόλος του /dev/zero]{#ss2.2}
Το /dev/zero είναι ένα ειδικό αρχείο που κατά την ανάγνωσή του, επιστρέφει \\0 χαρακτήρες. Είναι μια συσκευή που όταν την διαβάζετε παίρνετε άπειρα ASCII 0.
Είναι χρήσιμη ως πηγή \"κενών\" bytes, όπως ακριβώς και πολλοί επεξεργαστές RISC έχουν ένα zero καταχωρητή που είναι πάντα 0.
Δημιουργείται με:
mknod -m 666 /dev/zero c 1 5
chown root.mem /dev/zero
### [3. Swap κατατμήσεις]{#s3}
Μία swap κατάτμηση δεν είναι επίσης ειδική με κανέναν τρόπο. Τη δημιουργείτε όπως κάθε άλλη κατάτμηση. Η μόνη διαφορά είναι ότι χρησιμοποιείται σαν μια άδεια
(raw) κατάτμηση, δηλαδή, δεν περιέχει κανένα σύστημα αρχείων. Είναι καλη ιδέα να σημειώνετε τις κατατμήσεις swap σαν τύπο 82 (Linux swap). Αυτό κάνει τα
περιεχόμενα της κατάτμησης πιο σαφή, αν και δεν είναι αυστηρώς απαραίτητο στον πυρήνα.
Όπως αναφέραμε, οι κατατμήσεις swap είναι πιο γρήγορες ξεπερνούν το σύστημα αρχείων, διαβάζοντας κατευθείαν από τον σκληρό δίσκο.
### [3.1 Ορισμός swap κατάτμησης]{#ss3.1}
Η swap κατάτμηση δεν είναι ανάγκη να βρίσκεται στον ίδιο σκληρό δίσκο με την κατάτμηση που είναι εγκατεστημένο το Linux.
Τρέξτε το πρόγραμμα fdisk. Δώστε n (add a new partition), μετά p (primary partition), για hex code: 82 (αν γράψετε l θα δείτε ότι αυτός ο τύπος αντιστοιχεί σε
κατάτμηση Linux swap).
Κάθε είδος κατάτμησης έχει έναν ξεχωριστό (identifier number) αριθμό ώστε να αναγνωρίζεται από το λειτουργικό σύστημα. (π.χ. για το Linux είναι 83).
Τελος, δώστε: w (write table to disk and exit).
### [4. Ρύθμιση swap συσκευών]{#s4}
Εφόσον έχετε δημιουργήσει ένα swap αρχείο ή μια swap κατάτμηση, πρέπει να γράψετε μια υπογραφή στην αρχή του/της, αυτή περιέχει μερικές διευθυντικές πληροφορίες
και χρησιμοποιείται από τον πυρήνα. Η εντολή για να το κάνετε αυτό είναι η mkswap. Τη χρησιμοποιείτε έτσι:
mkswap <swap συσκευή> <μέγεθος>
Συνηθισμένες παράμετροι:
- -c ελέγχει τη συσκευή (block device) για bad blocks
- -v0 παλιά μέθοδος (μέχρι 128ΜΒ)
- -v1 νέα μέθοδος (μέχρι 2GB)
Θα εμφανιστεί το μήνυμα:
Setting up swapspace, size = <μεγεθος> bytes
Ο swap χώρος δεν χρησιμοποιείται ακόμη. Υπάρχει, αλλά ο πυρήνας δεν τον χρησιμοποιεί για να παρέχει εικονική μνήμη.
Πρέπει να είστε πολύ προσεκτικοί στη χρησιμοποίηση της εντολής mkswap, εφόσον ΔΕΝ ελέγχει αν το αρχείο ή η κατάτμηση χρησιμοποιείται για άλλο σκοπό. Η
χρησιμοποίησή της γίνεται συνήθως κατά την εγκατάσταση του συστήματος, την εκτελείτε μόνο ΜΙΑ φορά.
### [5. Συγχρονισμός\... ΤΩΡΑ]{#s5}
H εντολή sync μέσω της συνάρτησης sync() δεσμεύει πρώτα τα inodes σε buffers, και μετά τα buffers στο σκληρό δίσκο. Εκτελείται, συνήθως, αμέσως μετά από την
mkswap.
### [5.1 Ρόλος της sync]{#ss5.1}
Κάθε U\*ix έχει φορτωμένο στη μνήμη το super block και τον inode πίνακα και ό,τι δουλειά κάνει πάνω σε αυτά την κάνει στη MNHMH, για ταχύτητα. Περιοδικά τα
\"κατεβάζει\" και στο δίσκο, για αποφυγή απρόσμενων γεγονότων. To sync είναι ακριβώς η εντολή που κάνει το \"κατέβασμα\". Με αυτόν τον τρόπο μπορεί κάποιος να
βεβαιωθεί ότι ολά έχουν γραφτεί με ασφάλεια.
Στα περισσότερα UNIX συστήματα, υπάρχει ένα πρόγραμμα ου λέγεται update και τρέχει στο background κάνοντας ένα sync κάθε 30 δευτερόλεπτα, οπότε συνήθως δεν
είναι απαραίτητο να χρησιμοποιήσετε την sync. Το Linux έχει έναν επιπρόσθετο δαίμονα (daemon), τον bdflush, ο οποίος κάνει ένα πιο ατελές sync πιο συχνά.
Κάτω από το Linux, ο bdflush εκκινείται από το update. Δεν υπάρχει συνήθως κανένας λόγος για να ανησυχείτε, αλλά αν ο bdflush πεθάνει για κάποιο λόγο, ο πυρήνας
θα σας προειδοποιήσει γι\' αυτό, και θα πρέπει να τον ξεκίνησετε μόνοι σας (/sbin/update).
### [6. Χρησιμοποίηση swap συσκευών]{#s6}
Εφόσον έχουν ακολουθηθεί τα παραπάνω βήματα για ρύθμιση swap αρχείων/κατατμήσεων, η χρησιμοποίηση αυτών από τον πυρήνα γίνεται με την εντολή swapon.
### [6.1 Το αρχείο /etc/fstab]{#ss6.1}
FileSystem TABle
Το αρχείο /etc/fstab δίνει πληροφορίες για τα διάφορα συστήματα αρχείων στα οποία μπορούμε να έχουμε πρόσβαση.
Για μια swap συσκευή θα δείτε μια γράμμη όπως η παρακάτω. Στο σύστημά μου (powered by SuSE) είναι:
/dev/hde3 swap swap defaults 0 0
### [6.2 Εξηγήσεις\...]{#ss6.2}
- Το πρώτο πεδίο περιγράφει τη block συσκευή ή το σύστημα αρχείων που θέλουμε να προσαρτήσουμε,
- το δεύτερο περιγράφει το σημείο προσάρτησης (για swap κατάτμηση είναι swap),
- το τρίτο περιγράφει τον τύπο του συστήματος αρχείων (δείτε cat /proc/filesystems για αυτά που υποστηρίζονται από τον τρέχοντα πυρήνα σας),
- το τέταρτο περιγράφει τις παραμέτρους προσάρτησης,
- το πέμπτο χρησιμοποιείται από την εντολή dump (στην περίπτωσή μας είναι 0, δεν χρειάζεται),
- το έκτο καθορίζει τη σειρά προτεραιότητας με την οποία τα συστήματα αρχείων ελέγχονται κατά την εκκίνηση του Linux (στην περίπτωση μας είναι 0, δεν είναι
απαραίτητο).
### [6.3 Παράμετροι στην swapon]{#ss6.3}
-a: διαβάζει το /etc/fstab και κάνει διαθέσιμες τις συσκευές/αρχεία που προορίζονται για swapping.
-p: θέτει προτεραίοτητα στο swapon, 0 \< p \< 32767 από το /etc/fstab, όπου pri=\"τιμή\".
### [6.4 Αυτόματη χρησιμοποιήση swap συσκευών]{#ss6.4}
Επεξεργαστείτε το αρχείο /etc/fstab και δημιουργήστε ένα νέο πεδίο για κάθε συσκευή που θέλετε να χρησιμοποιήσετε.
Τα script εκκίνησης θα τρέξουν την εντολή swapon -a χρησιμοποιώντας όσες swap συσκευές έχουν καταχωριθεί στο /etc/fstab. Επομένως, η εντολή swapon
χρησιμοποιείται μόνο όταν χρειάζεται περισσότερος χώρος swap.
### [6.5 Μή χρησιμοποίηση swap συσκευών]{#ss6.5}
Μία περιοχή swap μπορεί να μην χρησιμοποιηθεί με χρήση της εντολής swapoff. Δεν είναι συνήθως απαραίτητο να το κάνετε, εκτός από προσωρινούς χώρους swap. Όλες
οι σελίδες που χρησιμοποιούνται στο χώρο swap αντιγράφονται στη μνήμη πρώτα. Αν δεν υπάρχει αρκετή φυσική μνήμη να τις κρατήσει, Θα αντιγραφούν τότε σε κάποιον
άλλο χώρο. Αν δεν υπάρχει αρκετή εικονική μνήμη να κρατήσει όλες τις σελίδες, το Linux θα αρχίσει να thrash (πιθανότατα, θα αρχίσει να παραπονιέται ο σκληρός,
όσο σκληρός και αν είναι\...). Ύστερα από λίγο, θα πρέπει να γίνει recover, αλλά ενδιάμεσα το σύστημα θα είναι μη χρησιμοποιήσιμο. Θα πρέπει να ελέγξτε (π.χ.,
με free) αν υπάρχει αρκετή ελεύθερη μνήμη πριν απομακρύνετε ένα χώρο swap από χρήση.
Όλες οι περιοχές swap που χρησιμοποιούνται αυτόματα με swapon -a μπορούν αν απομακρυνθούν με swapoff -a. Διαβάζει το αρχείο /etc/fstab για να βρει τί να
απομακρύνει. Όσες περιοχές swap έχουν χρησιμοποιηθεί manually θα παραμείνουν σε χρήση.
Μερικές φορές πολύς χώρος swap μπορεί να χρησιμοποιείται ακόμη και αν υπάρχει αρκετή πραγματική μνήμη διαθέσιμη. Αυτό μπορεί να συμβεί για παράδειγμα αν σε
κάποιο σημείο υπάρχει ανάγκη για swap, αλλά αργότερα μια μεγάλη διεργασία που καταλάμβανε μεγάλο μέρος της φυσικής μνήμης τερματίζεται και ελευθερώνει τη μνήμη.
Τα swapped-out δεδομένα δεν αντιγράφονται αυτόματα στη μνήμη έως ότου χρειάζεται, έτσι η φυσική μνήμη μπορεί να παραμείνει ελεύθερη για ένα μεγάλο χρονικό
διάστημα. Δεν υπάρχει καμία ανάγκη να ανησυχείτε γι\'αυτό, αλλά μπορεί να σας ανακουφίζει το γεγονός αν γνωρίζετε τι συμβαίνει.
### [7. Έλεγχος χρήσης swap συσκευών]{#s7}
Έχοντας μια swap συσκευή μπορείτε να δείτε πόση από αυτή χρησιμοποιείται. Απλώς δώστε:
### [7.1 free]{#ss7.1}
total used free shared buffers cached
Mem: 63092 61604 1488 12684 7664 43396
-/+ buffers/cache: 10544 52548
Swap: 136512 376 136136
Η πρώτη γραμμή Mem εμφανίζει τη φυσική μνήμη.
- Η στήλη total ΔΕΝ εμφανίζει τη φυσική μνήμη που χρησιμοποιείται από τον πυρήνα, που είναι περίπου 1-2MB.
- Η στήλη used εμφανίζει το μέγεθος της μνήμης που χρησιμοποιείται (η δεύτερη γραμμή δεν μετράει buffers).
- Η στήλη free εμφανίζει το μέγεθος της αχρησιμοποίητης μνήμης.
- Η στήλη shared εμφανίζει το μέγεθος της μνήμης που μοιράζεται από διάφορες διεργασίες, όσο περισσότερη, τόσο καλύτερη.
- Η στήλη buffers εμφανίζει το τρέχον μέγεθος buffer cache του δίσκου.
Η τελευταία γραμμή Swap εμφανίζει παρόμοιες πληροφορίες για τις περιοχές swap. Αν αυτή η γραμμή είναι όλο μηδενικά, ο swap χώρος σας δεν έχει ενεργοποιηθει.
### [7.2 cat /proc/meminfo]{#ss7.2}
total: used: free: shared: buffers: cached:
Mem: 64606208 63078400 1527808 12877824 7847936 44437504
Swap: 139788288 385024 139403264
MemTotal: 63092 kB
MemFree: 1492 kB
MemShared: 12576 kB
Buffers: 7664 kB
Cached: 43396 kB
BigTotal: 0 kB
BigFree: 0 kB
SwapTotal: 136512 kB
SwapFree: 136136 kB
### [7.3 cat /proc/swaps]{#ss7.3}
Filename Type Size Used Priority
/dev/hde4 partition 136512 376 -1
### [7.4 top]{#ss7.4}
Mem: 63092K av, 61544K used, 1548K free, 13116K shrd, 7516K buff
Swap: 136512K av, 376K used, 136136K free 43372K cached
### [7.5 procinfo]{#ss7.5}
Memory: Total Used Free Shared Buffers Cached
Mem: 63092 61488 1604 12796 7516 43372
Swap: 136512 376 136136
### [8. Ιδέες\...]{#s8}
### [8.1 Συνδυασμός swap και /tmp]{#ss8.1}
Η ιδέα υπάρχει από το tmpfs στα \*BSD και το Solaris, καθώς και από το swapfs σε NeXT συστήματα.
Η λογική είναι ότι αυτά χρησιμοποιούνται για προσωρινή αποθήκευση που υπό κανονικές συνθήκες δεν απαιτούν πάρα πολύ χωρό. Έτσι συνδυάζοντας τα swap και /tmp δε
χρειάζεται να κρατάτε ξεχωριστό χώρο για αυτά τα δύο, όπως κανονικά θα έπρεπε. Αυτό το ειδικευμένο σύστημα αρχείων είναι ένας swappable RAM δίσκος, που
τοποθετεί τα προσωρινά αρχεία στην swap κατάτμηση. Σημαντικό μειονέκτημα είναι ότι για να κερδίσετε αποθηκευτικό χώρο, χάνετε ταχύτητα (μειώνεται λίγο η απόδοση
του συστήματος), αφού δεν μπορείτε να έχετε και τα δυο σε παραλληλία, γεγονός που ξεπερνιέται με χρήση πολλαπλών δίσκων (interleaving). Με αυτόν τον τρόπο
μπορείτε να μοιράσετε σε διάφορους δίσκους το φόρτωμα του εν λόγω συστήματος αρχείων και να πετύχετε παραλληλία.
### [8.2 Swap κατ\' απαίτηση με loopback device]{#ss8.2}
Εφόσον έχετε υποστήριξη για loopback devices στον πυρήνα, γράψτε ένα shell script ώστε να εκχωρείται δυναμικά ο χώρος του swap σε αρχείο βέβαια, χωρίς ξεχωριστή
κατάτμηση\.....κτλ, κτλ
### [9. Ίδιος χώρος swap με άλλα λειτουργικά συστήματα]{#s9}
### [9.1 FreeBSD]{#ss9.1}
Δεν έχω (ακόμα\...) δεν έχω δοκιμάσει. Δείτε το Linux+FreeBSD mini HOWTO.
### [9.2 Microsoft Windows]{#ss9.2}
Έχω (ακόμα\...), δεν έχω δοκιμάσει. Δείτε το Tips-HOWTO και το Swap-Space mini HOWTO, που πλέον συντηρείται. Το ονομα είναι παραπλανητικό\... αναφέρεται σε
ειδικό θέμα ενώ το όνομά του παραπέμπει αλλού.
### [10. Σχετικά]{#s10}
### [10.1 No time\...]{#ss10.1}
Τα τρία τελευταία κομμάτια, για loopback και για μοίρασμα χώρου swap με άλλα OS θα μπορούσα να τα αναλύσω περισσότερο. Έδωσα, πάντως, κάποιους κατευθυντήριους
άξονες για κάθε ενδιαφερόμενο. Ήθελα να δώσω το στοιχείο της πληρότητας αλλά αν το έκανα σε κάθε πιθανή γωνία του παρόντος θα κατέληγα σε πληρέστατο HOWTO, που
θα απαιτούσε πολύ χρόνο\...
### [10.2 Πηγές]{#ss10.2}
Για τη σύνταξη του παραπάνω χρησιμοποιήθηκαν διάφορες πηγές, από HOWTOs, από το SAG, από ερωτήσεις/απαντήσεις διάφορων mailining lists/newsgroups, από σχετικές
man pages, εγχειρίδια διανομών, βιβλία για το Linux κτλ, κτλ.

569
content/articles/22/03_vi.md Κανονικό αρχείο

@ -0,0 +1,569 @@
+++
title = 'Οι βασικές λειτουργίες του VI'
date = '1999-03-01T00:00:00Z'
description = ''
author = 'Ζανικόλας Σεραφείμ(mailto:serzan@it.teithe.gr)'
issue = ['Magaz 22']
issue_weight = 3
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Αυτό το έγγραφο φιλοδοξεί να παρουσιάσει με κατανοητό και γρήγορο τρόπο τις βασικές λειτουργίες του `VI`, ενός από τους καθιερωμένους επεξεργαστές κειμένου των
UNIX λειτουργικών συστημάτων.*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
**1. Σχετικά\...**
---------------------------------------
**2. Εισαγωγή**
------------------------------------
**3. Μετακίνηση**
--------------------------------------
- [3.1 Στα όρια της ενεργής γραμμής](#ss3.1)
- [3.2 Σε σχέση με την οθόνη](#ss3.2)
- [3.3 Σε όλο το κείμενο](#ss3.3)
**4. Επεξεργασία Κειμένου**
------------------------------------------------
- [4.1 Εισαγωγή](#ss4.1)
- [4.2 Διαγραφή](#ss4.2)
- [4.3 Αντικατάσταση](#ss4.3)
- [4.4 Αλλες χρήσιμες εντολές επεξεργασίας](#ss4.4)
**5. Αναζήτηση**
-------------------------------------
- [5.1 Στα όρια της ενεργής γραμμής](#ss5.1)
- [5.2 Σε όλο το κείμενο](#ss5.2)
**6. Διαχείρηση Αρχείων**
----------------------------------------------
**7. Διαχείριση περιοχών μνήμης προσωρινής αποθήκευσης (buffers)**
---------------------------------------------------------------------------------------
**8. Διάφορες εντολές**
--------------------------------------------
**9. Παραδείγματα**
----------------------------------------
### [1. Σχετικά\...]{#s1}
Όπως δηλώνει σαφώς και ο τίτλος, σε καμμία περίπτωση δεν αποτελεί πλήρη οδηγό του VI. Η ομαδοποίηση των εντολών έγινε αυθαίρετα έχοντας υπ\'όψη την -όσο το
δυνατόν- ευκολότερη εκμάθηση τους. Για παρατηρήσεις / προτάσεις, επικοινωνήστε στην παραπάνω διεύθυνση. Τέλος το έγγραφο θα το βρείτε στη διεύθυνση
http://aetos.it.teithe.gr/\~serzan/vi/vi.html
### [2. Εισαγωγή]{#s2}
**Καταστάσεις Λειτουργίας, Εντολές**
: Ο `VI`(sual editor) έχει δύο βασικές καταστάσεις λειτουργίας:
- κατάσταση εντολών (command mode)
- κατάσταση εισαγωγής κειμένου (text entry mode)
Κατά τη κατάσταση εντολών οτιδήποτε πληκτρολογείτε μεταφράζεται ως εντολή. Φροντίστε να είστε προσεκτικοί γιατί δε φαίνονται οι εντολές που δίνετε, βλέπετε
μόνο τα αποτελέσματά τους. Εξαίρεση αποτελούν οι εντολές που αρχίζουν από \":\" (άνω κάτω τελεία) οι οποίες εμφανίζονται στο κάτω μέρος της οθόνης και
εκτελούνται αφού πατήσετε `<CR>` (enter). Σε κατάσταση εισαγωγής κειμένου -σχεδόν- ο,τιδήποτε πληκτρολογείτε εισάγεται στο κείμενο.
**Εισαγωγή - Διαγραφή**
: Πατώντας `<ESC>` ή `^[` (control-\[) μπορείτε να είστε σίγουροι πως ο `VI` είναι σε κατάσταση εντολών. Βασικοί τρόποι για να περάσετε σε κατάσταση εισαγωγής
κειμένου είναι: πατώντας `i` (insert - εισαγωγή κειμένου στη θέση του δρομέα), `a` (append - εισαγωγή κειμένου στην πρώτη θέση στα δεξιά του δρομέα) ή `o`
(open(?) - εισαγωγή κειμένου σε νέα γραμμή κάτω από την ενεργή). Χρησιμοποιήστε το `x` για να διαγράψετε το χαρακτήρα στη θέση του δρομέα.
**Μετακίνηση**
: Για να κινηθείτε μέσα στο κείμενο, αφού βεβαιωθείτε πως είστε σε κατάσταση εντολών, χρησιμοποιήστε τα `h j k l` για αριστερά, κάτω, πάνω και δεξιά.
Εναλλακτικά μπορείτε να χρησιμοποιήσετε τα βελάκια, κάτι που δε συνίσταται για λόγους ταχύτητας.
**Χειρισμός Αρχείων, Εξοδος**
: Οσο επεξεργάζεστε ένα αρχείο στον `VI`, ουσιαστικά δουλεύετε σε ένα αντίγραφο του αρχείου σε μία προσωρινή μνήμη (buffer). Οι αλλαγές που κάνετε στην
προσωρινή μνήμη δεν αποθηκεύονται μέχρι τη στιγμή που θα δώσετε την εντολή `:w<CR>` (από το write). Εάν το αρχείο είναι read only μπορείτε να γράψετε μόνο
με `:w!<CR>`, με την προυπόθεση φυσικά πως έχετε δικαίωμα εγγραφής στο αρχείο (write permission). Γράφοντας
`:e filename<CR>` μπορείτε να ανοίξετε ένα νέο αρχείο για επεξεργ ασία, ενώ τερματίζετε τον `VI` με `:q<CR>`. Εφόσον δεν
έχετε αποθηκεύσει τις αλλαγές που κάνατε ο `VI` θα διαμαρτυρηθεί και δε θα εκτελέσει την εντολή σας, σε αυτή την περίπτωση χρησιμοποιήστε `:e! filename<CR>`
και `:q!<CR>` αντίστοιχα.
**Αντιγραφή, Διαγραφή, Επικόλληση**
: Οι εντολές `c[E]`, `y[E]` και `d[E]` (change-αλλαγή, yank-copy-αντιγραφή σε προσωρινή μνήμη, delete-διαγραφή και αντιγραφή στην προσωρινή μνήμη), επιδρούν
σε περιοχή κειμένου που προσδιορίζεται από το επίθεμά `[E]` πχ. `yw` (yank word to buffer). Η επανάληψη (`cc`, `yy`, `dd)` υποδηλώνει την επίδρασή τους στην
τρέχουσα γραμμή πχ. το `yy` αντιγράφει το περιεχόμενο της τρέχουσας γραμμής στην προσωρινή μνήμη (yank line to buffer). Επικόλληση κειμένου από την
προσωρινή μνήμη γίνεται μ ε το `p`.
**Η Λογική Των Εντολών**
: Οι περισσότερες εντολές του `VI` μπορούν να δεχτούν ένα αριθμητικό πρόθεμα, με το οποίο δηλώνουμε πόσες φορές επιθυμούμε την εκτέλεση τους. Ετσι λοιπόν εκεί
που το `dd` θα έσβηνε την τρέχουσα γραμμή το `3dd` σβήνει 3 γραμμές.
Ακολουθούν κάποια παραδείγματα. Είναι επιθυμητό ο αναγνώστης να εξοικειωθεί με όσα αναφέρθηκαν μέχρι στιγμής δεδομένου ότι οι εντολές των επόμενων κεφαλαίων
ενδέχεται να προκαλέσουν σύγχιση.
**Παραδείγματα**
:
**`14l`**
: μεταφορά του δρομέα 14 θέσεις προς τα δεξιά
**`10j`**
: μεταφορά του δρομέα 10 σειρές προς τα κάτω
**`10x`**
: διαγραφή 10 χαρακτήρων, ξεκινώντας από το δρομέα προς τα δεξιά
**`cwtext`**
: αλλαγή λέξης με το text
**`3cctext`**
: αλλαγή τριών γραμμών με το text
**`7yw`**
: αντιγραφή 7 λέξεων στην προσωρινή μνήμη
**`3yy`**
: αντιγραφή 3 γραμμών στην προσωρινή μνήμη
**`5dw`**
: διαγραφή 5 λέξεων (και αντιγραφή στην προσωρινή μνήμη)
**`2dd`**
: διαγραφή 2 γραμμών (και αντιγραφή στην προσωρινή μνήμη)
### [3. Μετακίνηση]{#s3}
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα \[N\] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμα των εντολών `y d c` με \[E\]
### [3.1 Στα όρια της ενεργής γραμμής]{#ss3.1}
**`[N][E] w b e`**
: μετακίνηση στην επόμενη λέξη, στην αρχή ή στο τέλος λέξης (οι λέξεις αποτελούνται από γράμματα και ψηφία, οτιδήποτε άλλο θεωρείται διαχωριστικό λέξης)
**`[N][E] W B E`**
: μετακίνηση στην επόμενη λέξη, στην αρχή ή στο τέλος λέξης (οι λέξεις αποτελούντα από οποιουσδήποτε χαρακτήρες εκτός από το κενό, που έιναι διαχωριστικό
λέξης)
**`[E] 0`**
: μεταφορά του δρομέα στην πρώτη στήλη της ενεργής γραμμής
**`[E] n|`**
: μεταφορά του δρομέα στην νιοστή στήλη της ενεργής γραμμής ή στην πρώτη εάν δεν προσδιοριστεί το `n`
**`[E] $`**
: μετακίνηση του δρομέα στο τέλος της ενεργής γραμμής
### [3.2 Σε σχέση με την οθόνη]{#ss3.2}
**`[E] H`**
: μετακίνηση στην πρώτη γραμμή της οθόνης
**`[E] M`**
: μετακίνηση στη γραμμή στη μέση της οθόνης
**`[E] L`**
: μετακίνηση στην τελευταία γραμμή της οθόνης
**`^F`**
: μετακίνηση μία οθόνη προς τα κάτω
**`^B`**
: μετακίνηση μία οθόνη προς τα πάνω
### [3.3 Σε όλο το κείμενο]{#ss3.3}
**`[N] h j k l`**
: αριστερά, κάτω, πάνω, δεξιά (εναλλακτικά χρησιμοποιήστε τα βελάκια)
**`[E] nG`**
: μετακίνηση στη νιοστή γραμμή ή στο τέλος του αρχείου (χωρίς το `n`)
**`:n<CR>`**
: μετακίνηση στη νιοστή γραμμή
**`[E] 'a`**
: μετακίνηση στην πρώτη στήλη της γραμμής που σημειώθηκε ως `a`, αυτό γίνεται με την εντολή `ma` όπου `a` ένα οποιοδήποτε μικρό γράμμα του λατινικού αλφαβήτου
**`` [E] `a ``**
: μετακίνηση στη στήλη και στη γραμμή που σημειώθηκε ως `a`, αυτό γίνεται με την εντολή `ma` όπου `a` ένα οποιοδήποτε μικρό γράμμα του λατινικού αλφαβήτου
### [4. Επεξεργασία Κειμένου]{#s4}
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα \[N\] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμα των εντολών `y d c` με \[E\]
### [4.1 Εισαγωγή]{#ss4.1}
**`atext`**
: γράφει το `text` στα δεξιά της θέσης του δρομέα (append)
**`A`text**
: γράφει το `text` στο τέλος της ενεργής γραμμής
**`itext`**
: γράφει το `text` στη θέση του δρομέα (insert)
**`Itext`**
: γράφει το `text` στην αρχή της ενεργής γραμμής
**`otext`**
: γράφει το `text` στην αρχή μιας νέας γραμμής που ανοίγει κάτω από την ενεργή (open)
**`Otext`**
: γράφει το `text` στην αρχή μιας νέας γραμμής που ανοίγει πάνω από την ενεργή
### [4.2 Διαγραφή]{#ss4.2}
Κάθε φορά που διαγράφετε κάτι, αυτό αντιγράφετε αυτόματα στη γενικής χρήσεως προσωρινή μνήμη (buffer).
**`[N] x`**
: διαγραφή του χαρακτήρα στον οποίο βρίσκεται ο δρομέας
**`[N] X`**
: διαγραφή του χαρακτήρα αριστερά του δρομέα
**`[N] d[E]`**
: διαγραφή από τη θέση του δρομέα εώς το σημείο που προσδιορίζει το `[E]`
**`[N] dd`**
: διαγραφή τρέχουσας γραμμής
**`D`**
: διαγραφή από τη θέση του δρομέα εώς το τέλος της γραμμής (ισοδύναμο με `d$`)
**`:d<CR>`**
: διαγραφή τρέχουσας γραμμής (ισοδύναμο με `dd`)
**`:nd<CR>`**
: διαγραφή νιοστής γραμμής, όπου `n` ακέραιος αριθμός που προσδιορίζει τον αριθμό γραμμής
**`:x,yd<CR>`**
: διαγραφή από την γραμμή `x` εώς και την `y`. Όπου `x` και `y` μπορεί να είναι: α) οποιοσδήποτε αριθμός γραμμής β). (τελεία - ενεργή γραμμή) γ) \$ (τελευταία
γραμμή) δ) τα (β) ή (γ) + - αριθμητική σταθερά
### [4.3 Αντικατάσταση]{#ss4.3}
#### Στα όρια της ενεργής γραμμής
**`[N] c[E]text`**
: αλλαγή (change) του κειμένου, από το δρομέα εώς τη θέση που προσδιορίζει το `[E]`, με το `text`
**`[N] cctext`**
: αλλαγή ενεργής γραμμής με το `text`
**`Ctext`**
: αλλαγή του κειμένου, από το δρομέα εώς το τέλος της γραμμής, με το `text` (ισοδύναμο με `c$text`)
**`:s/re1/re2/<CR>`**
: αντικατάσταση (subtitute), ΜΟΝΟ της πρώτης συμβολοσειράς `re1` ή αυτής που προσδιορίζεται από την κανονική έκφραση `re1` (relative expression), που θα
βρεθεί στην ενεργή γραμμή, με τη συμβολοσειρά `re2` ή αυτήν που προσδιορίζεται από την κανονική έκφραση `re2`
**`:s/re1/re2/g<CR>`**
: το ίδιο με τη διαφορά πως θα αντικαταστήσει ΟΛΑ τα `re1`, της ενεργής γραμμής, με το `re2` και όχι μόνο το πρώτο
**`:s/re1/re2/c<CR>`**
: το ίδιο με τη διαφορά πως θα σας ζητήσει επιβεβαίωση για κάθε αλλαγή που θα κάνει. Οι επιλογές `g` (global) και `c` (confirm) είναι προαιρετικές και μπορούν
να χρησιμοποιηθούν και ταυτόχρονα
#### Σε όλο το κείμενο
**`:x,y s/re1/re2/<CR>`**
: αντικατάσταση, ΜΟΝΟ της πρώτης συμβολοσειράς `re1` ή αυτής που προσδιορίζεται από την κανονική έκφραση `re1` (relative expression), που θα βρεθεί στις
γραμμές που προσδιορίζονται από τα `x` και `y`, με τη συμβολοσειρά `re2` ή αυτήν που προσδιορίζεται από την κανονική έκφραση `re2`. Όπου `x` και `y` μπορεί
να είναι: α) οποιοσδήποτε αριθμός γραμμής β). (τελεία - ενεργή γραμμή) γ) \$ (τελευταία γραμμή) δ) τα (β) ή (γ) + - αριθμητική σταθε ρά
### [4.4 Αλλες χρήσιμες εντολές επεξεργασίας]{#ss4.4}
**`[N] ~`**
: αλλάζει το χαρακτήρα στη θέση του δρομέα, από μικρό σε κεφαλαίο ή αντίστροφα, και κινείται μία θέση δεξιά (μόνο για λατινικούς χαρακτήρες)
**`[N] u`**
: ακυρώνει μία ή περισσότερες ενέργεις (undo)
**`J`**
: ενώνει την ενεργή γραμμή με την επόμενη
### [5. Αναζήτηση]{#s5}
Οι εντολές που δέχονται αριθμητικό πρόθεμα φαίνονται με το χαρακτήρα \[N\] ενώ εκείνες που μπορούν να χρησιμοποιηθούν ως επίθεμα των εντολών `y d c` με \[E\]
### [5.1 Στα όρια της ενεργής γραμμής]{#ss5.1}
**`[N][E] fa Fa`**
: μεταφορά του δρομέα στο πρώτο `a` που θα βρεθεί στη γραμμή προς τα δεξιά (`fa`) ή προς τα αριστερά (`Fa`)
**`[N][E] , ;`**
: επανάληψη τελευταίας αναζήτησης προς τα αριστερά (`,`) ή προς τα δεξιά (`;`)
### [5.2 Σε όλο το κείμενο]{#ss5.2}
**`/re`**
: αναζήτηση, προς τα εμπρός, του `re`, όπου `re` μια οποιαδήποτε συμβολοσειρά ή κανονική έκφραση
**`?re`**
: αναζήτηση, προς τα πίσω, του `re`, όπου `re` μια οποιαδήποτε συμβολοσειρά ή κανονική έκφραση
**`n`**
: επανάληψη τελευταίας αναζήτησης προς τα κάτω
**`N`**
: επανάληψη τελευταίας αναζήτησης προς τα πάνω
### [6. Διαχείρηση Αρχείων]{#s6}
**`:w<CR>`**
: αποθήκευση αλλαγών στο αρχικό αρχείο
**`:w filename<CR>`**
: αποθήκευση αλλαγών στο `filename`
**`:wq<CR>`**
: αποθήκευση αλλαγών στο αρχικό αρχείο και τερματισμός του `VI`
**`:e filename<CR>`**
: ανοίγει το `filename` (αν δεν υπάρχει δημιουργεί ένα άδειο), θα εμφανιστεί προειδοποίηση σε περίπτωση που δεν έχουν αποθηκευτεί οι αλλαγές του αρχικού
αρχείου
**`:e! filename<CR>`**
: ανοίγει το `filename` ανεξάρτητα από το αν έχουν αποθηκευτεί οι αλλαγές του πρώτου ή όχι
**`:r filename<CR>`**
: προσθέτει τα περιεχόμενα του αρχείου `filename` στη θέση του δρομέα
**`:r <!unix_cmd><CR>`**
: προσθέτει την έξοδο της εντολής `unix_cmd` στη θέση του δρομέα
**`:q <CR>`**
: έξοδος από τον `VI`, θα εμφανιστεί προειδοποίηση σε περίπτωση που δεν έχουν αποθηκευτεί οι αλλαγές
**`:q! <CR>`**
: έξοδος από τον `VI`, ανεξάρτητα από το αν έχουν αποθηκευτεί οι αλλαγές του αρχείου
### [7. Διαχείριση περιοχών μνήμης προσωρινής αποθήκευσης (buffers)]{#s7}
Εκτός από την γενικής χρήσης ή ανώνυμη μνήμη αποθήκευσης υπάρχουν και οι επώνυμες, μία για κάθε (μικρό) γράμμα του λατινικού αλφαβήτου.
**`y[E]`**
: αντιγραφή του κειμένου, από το δρομέα εώς το σημείο που προσδιορίζει το `[E]`, στη γενικής χρήσης μνήμη
**`Y`**
: αντιγραφή της ενεργής γραμμής στη γενικής χρήσης μνήμη, ισοδύναμο του `yy`
**`"ay[E]`**
: αντιγραφή του κειμένου, από το δρομέα εώς το σημείο που προσδιορίζει το `[E]`, στην επώνυμη μνήμη `a`, όπου `a` οποιοδήποτε μικρό γράμμα του λατινικού
αλφαβήτου
**`p P`**
: επικόλληση του περιεχομένου της γενικής χρήσης προσωρινής μνήμης μετά ή πριν τη θέση του δρομέα ή την ενεργή γραμμή (ανάλογα με το αν η μνήμη έχει λέξεις ή
γραμμές)
**`"ap "aP`**
: επικόλληση του περιεχομένου της προσωρινής μνήμης `a` μετά ή πριν τη θέση του δρομέα
### [8. Διάφορες εντολές]{#s8}
**`:sh`\<CR\>**
: προσωρινή έξοδος στο κέλυφος (shell), επιστροφή με `exit`
**`:!unix_cmd`\<CR\>**
: εκτέλεση της εντολής `unix_cmd`
**`:cd dir_name`\<CR\>**
: αλλαγή ενεργού καταλόγου στον `dir_name`
**`^G`**
: εμφανίζει το όνομα του αρχείου, ένδειξη τροποποίησης ή όχι, αρ.γραμμής και θέση του δρομέα στο αρχείο σε ποσοστό %
**`^Z`**
: προσωρινή διακοπή του `VI`, επιστροφή με fg
### [9. Παραδείγματα]{#s9}
**`c4Wtext`**
: αλλαγή των 4 επόμενων λέξεων με το `text` (όπου λέξη οποιαδήποτε σειρά χαρακτήρων δεν περιέχει το κενό)
**`d4wtext`**
: διαγραφή των 4 επόμενων λέξεων (όπου λέξη οποιαδήποτε σειρά γραμμάτων και ψηφίων)
**`d0`**
: διαγραφή του κειμένου από τη θέση του δρομέα εώς την αρχή της γραμμής
**`d$`**
: διαγραφή του κειμένου από τη θέση του δρομέα εώς το τέλος της γραμμής
**`dN|`**
: διαγραφή του κειμένου από τη θέση του δρομέα εώς τη στήλη `N`
**`:11d<CR>`**
: διαγραφή της 11ης γραμμής
**`:.,.+3d<CR>`**
: διαγραφή της ενεργής γραμμής και των τριών επόμενων
**`:.,$d<CR>`**
: διαγραφή από την ενεργή γραμμή εώς το τέλος του αρχείου
**`4~`**
: αλλαγή των κεφαλαίων γραμμάτων σε μικρών και αντίστροφα, για τους επόμενους τέσσερεις χαρακτήρες
**`3u`**
: ακυρώνει τις τρεις τελευταίες ενέργειες (undo)
**`f*`**
: μετακίνηση του δρομέα στο πρώτο `*`
**`3f*`**
: μετακίνηση του δρομέα στο τρίτο `*`
**`y2fB`**
: αντιγραφή του κειμένου από το δρομέα εώς το δεύτερο B, στη γενικής χρήσης (ανώνυμη) μνήμη
**`d5fa`**
: διαγραφή του κειμένου από το δρομέα εώς το πέμπτο a, αντιγραφή στη γενικής χρήσης (ανώνυμη) μνήμη
**`c5fatext`**
: αλλαγή του κειμένου από το δρομέα εώς το πέμπτο a με το `text`
**`:s/text1/text2/<CR>`**
: αντικατάσταση του πρώτου `text1` που θα βρεθεί στην ενεργή γραμμή με το `text2`
**`:s/text1/text2/g<CR>`**
: αντικατάσταση όλων των `text1` που θα βρεθούν στην ενεργή γραμμή με το `text2`
**`:s/text1/text2/gc<CR>`**
: αντικατάσταση όλων των `text1` που θα βρεθούν στην ενεργή γραμμή, με το `text2`, μετά από επιβεβαίωση
**`:5,11 s/text1/text2/<CR>`**
: αντικατάσταση του πρώτου `text1` που θα βρεθεί στις γραμμές 5 εώς και 11, με το `text2`
**`:.,.+3 s/text1/text2/gc<CR>`**
: αντικατάσταση όλων των `text1` που θα βρεθούν στην ενεργή γραμμή και στις 3 επόμενες, με το `text2`, μετά από επιβεβαίωση
**`:.,$ s/text1/text2/gc<CR>`**
: αντικατάσταση όλων των `text1` που θα βρεθούν από την ενεργή γραμμή εώς και το τέλος του αρχείου, με το `text2`, μετά από επιβεβαίωση
**`"ayf.`**
: αντιγραφή του κειμένου από το δρομέα εώς την πρώτη τελεία, στην επώνυμη μνήμη `a`
**`"ap`**
: επικόλληση του περιεχομένου της επώνυμης μνήμης `a`, στα δεξιά του δρομέα
**`"zy2f)`**
: αντιγραφή του κειμένου από το δρομέα εώς τη δεύτερη παρένθεση, στην επώνυμη μνήμη `z`
**`"zP`**
: επικόλληση του περιεχομένου της επώνυμης μνήμης `z`, στη θέση του δρομέα

78
content/articles/22/04_internet.md Κανονικό αρχείο

@ -0,0 +1,78 @@
+++
title = 'Οι κίνδυνοι του Internet'
date = '2000-03-01T00:00:00Z'
description = ''
author = 'Πρατικάκης Πολύβιος(mailto:el97649@central.ntua.gr)'
issue = ['Magaz 22']
issue_weight = 4
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Οι κίνδυνοι του Internet και του κυβερνοχώρου, 16 χρόνια μετά το 1984.*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Έχετε αναρωτηθεί πόσο ελεύθερο είναι το Internet;
Όλοι ακούμε συνεχώς για την υπερλεωφόρο των πληροφοριών, και πώς πρόκειται να επηρεάσει τη ζωή μας, να μας δώσει ελευθερία, απελευθέρωση του λόγου, και καλύτερη
δια-προσωπική επικοινωνία. Όμως, υπάρχει και μία άλλη άποψη, όχι τόσο διαδεδομένη και ακουστή, \"η άλλη πλευρά\", η οποία μεταβάλλει τις παραπάνω αισιόδοξες
δηλώσεις, μόνο με το να προσθέσει τη λέξη \"δυνητικά\". Φυσικά, η τεχνολογία είναι καλή, η γνώση είναι για όλους, και η πληροφορία θέλει να είναι ελεύθερη.
Αλλά, από την άλλη, τι να την κάνουμε την τεχνολογία και την ελευθερία που μπορεί να προσφέρει, αν όλοι χάσουμε το ενδιαφέρον μας για ελευθερία;
Το Internet τελευταία έχει αρχίσει να μεταμορφώνεται σε ένα άλλο είδος τηλεόρασης, υιοθετώντας όλο και περισσότερο το είδος σχέσης πομπού-δέκτη, με τη
δικαιολογία ότι \"πάντα υπάρχει η δυνατότητα αμφίδρομης επίδρασης\". Κανείς δεν αρνείται ότι υπάρχει η δυνατότητα αλληλεπίδρασης, αλλα φαίνεται ότι συγχέουμε τη
δυνατότητα με την πραγματοποίηση. Διαπράτουμε το ίδιο λάθος με αυτούς που υποστηρίζουν ότι οι τηλεθεατές έχουν πάντα την επιλογή να κλείσουν την τηλεόραση.
Όλο και πιό πολλοί άνθρωποι, μην έχοντας τη δυνατότητα να ψάξουν και να αναζητήσουν ανάμεσα στις τεράστιες -και συνεχώς διογκούμενες- ποσότητες πληροφορίας, οι
περισσότερες από τις οποίες αποτελούν κυρίως \"θόρυβο\", εξαρτώνται από μηχανές αναζήτησης για να εντοπίσουν τις πληροφορίες που θέλουν. Οι περισσότεροι από
τους \"καινουριοφερμένους\" στο Internet, συγχέουν το Internet με τα portals και τις μηχανές αναζήτησης, αλλά σχεδόν κανείς δεν αναρωτιέται ποτέ ποιός διοικεί
αυτές τις μηχανές. Ποιός δηλαδή λίγο πολύ \"φιλτράρει\" τις πληροφορίες στις οποίες έχουν πρόσβαση, ή ακόμα πιο πέρα, από ποιόν εξαρτώνται αυτές οι μηχανές.
Γιατί λ.χ. \"τυχαίνει\" κάθε φορά οι σελίδες που αποτελούν απάντησεις σε ένα ερώτημα να είναι ταξινομημένες, σε φθίνουσα σειρά, ανάλογα με το πόσα χρήματα
δαπανά η εταιρία που έχει την σελίδα για διαφήμηση στο εν λόγω ψαχτήρι.
Ένα άλλο ανησυχητικό θέμα που έχει προκύψει είναι η ιδιωτική ζωή. Το λάθος εδώ έγκειται στο γεγονός ότι οι περισσότεροι άνθρωποι νιώθουν ότι ο κυβερνοχώρος
είναι μια ζώνη \"παιχνιδιού\", ένας χώρος όπου όλοι είναι αυτό που θέλουν να είναι, ένα μέρος χωρίς σύνορα ούτε νόμους. Αυτό φυσικά δεν είναι αλήθεια, αλλά και
ακόμη κι άν ήταν, σίγουρα δεν είναι επιθυμητό, όσο παράξενο κι αν ακούγεται. Φαίνεται να ξεχνάμε ότι τα κράτη και οι νόμοι -ειδικά στο δυτικό κόσμο- υπάρχουν
για να προστατεύουν τους πολίτες και τη δημοκρατία, και έχουν κερδηθεί και πληρωθεί πολύ ακριβά. Ξεχνάμε επίσης ότι είτε θέλουμε είτε όχι, ο κυβερνοχώρος είναι
μια προέκταση της κοινωνίας, είναι άλλο ένα ανθρώπινο δημιούργημα. Είναι φυσιολογικό επομένως να επηρεάζεται -και να επηρεάζει- από την \"υλική\" κοινωνία.
Είναι αδύνατον οι ίδιοι άνθρωποι να ζούν στον ένα κόσμο σε ένα σύστημα δημοκρατίας (η μη\...), και ταυτόχρονα στον άλλο μέσα σε μια ιδεαλιστική αναρχία. Αυτά τα
δύο δέν συμβιβάζονται, γιατί απαιτούν ένα εντελώς διαφορετικό σύστημα αξιών. Όταν λέμε αναρχία στον κυβερνοχώρο, δεν εννοούμε την ουτοπιστική έννοια όπου δεν
υπάρχει αρχή, γιατί δεν χρειάζεται να υπάρχει, αφού όλοι συνειδητοποιούν την αξία της ελευθερίας και υποχωρούν όπου πρέπει οικιοθελώς. Δυστυχώς η αναρχία, αν
τελικά επικρατήσει, στον κυβερνοχώρο, θα εκφράζεται ως η απουσία οποιασδήποτε αρχής θα μπορούσε να ελέγξει ποιος καταπιέζει ποιον.
Στις σύγχρονες δημοκρατίες (εντός ή εκτός εισαγωγικών) οι αρχές και οι νόμοι θέτουν τα όρια και τις δικλείδες ώστε να μην παραβιάζονται οι αρχές της δημοκρατίας
και της ισότητας. Αυτό μπορεί να ακούγεται εξίσου ουτοπικό με την ιδανική αναρχία, αλλά έστω και αν η πραγματικότητα απέχει στις περισσότερες των περιπτώσεων,
τουλάχιστον είναι καλύτερα απ\' ότι παλιότερα. Δεν μπορούμε να δούμε ότι από τον κυβερνοχώρο λείπουν όλες αυτές οι προστασίες -μερικοί τις λένε
\"περιορισμούς\"- και όλο αυτό γιατί οι άνθρωποι θεωρούν δεδομένο ότι τα δικαιώματά τους είναι ασφαλή και δεν επηρρεάζονται.
Αντιθέτως, αυτοί οι \"περιορισμοί\" που τραβούν τη διαχωριστική γραμμή εκεί που τελειώνει η ελευθερία του ενός και αρχίζει η ελευθερία του άλλου, δεν είναι
ενεργοί στον κυβερνοχώρο. Το γεγονός αυτό επιτρέπει την καταπάτηση της ιδιωτικής ζωής, η οποία θεωρείται απόρθητη στον πραγματικό κόσμο. Δεν φαινόμαστε να
συνειδητοποιούμε ότι εμείς, τα γούστα μας, τα ενδιαφέροντά μας, οι σκέψεις μας εμπορευματοποιούνται και πωλούνται από τον ένα διαφημιστή στον άλλο, και το
χειρότερο, αυτό γίνεται \"ελεύθερα\". Στον \"έξω\" κόσμο, η παραβίαση του απορρήτου της αλληλογραφίας είναι ακατανόητη, και θα προκαλούσε σκάνδαλο, αν και οι
περισσότερες εταιρίες που έχουν δίκτυα, αλλά και οι ISP και mail-providers γενικότερα, ψάχνουν στην ηλεκτρονική αλληλογραφία των πελατών τους, για να
\"προστατέψουν\" τα συστήματά τους.
\"Και τι σχέση έχει το Linux;\" θα ρωτούσε κανεις. Μπορεί να μη φαίνεται με την πρώτη, αλλά η σχέση είναι μεγάλη, και όχι μόνο για το Linux, αλλά για τη
φιλοσοφία OpenSource γενικότερα. Η σχέση βασίζεται στην σημασία του λογισμικού για τον κυβερνοχώρο. Το λογισμικό είναι ουσιαστικά αυτό που καθιστά τον
κυβερνοχώρο αυτό που είναι. Κανείς δεν σκέφτεται τον κυβερνοχώρο ως τα καλώδια και τα κομμάτια πυρίτιο που αποτελούν το υλικό. Επιπλέον, το υλικό δεν είναι καν
ελεύθερο, αφού πολύ μικρό ποσοστό των γραμμών που υλοποιούν τις συνδέσεις είναι δημόσιο. Και όμως το Internet δεν είναι ιδιωτικό. Αυτό συμβαίνει γιατί ο
κυβερνοχώρος έγκειται στο χώρο του ιδεατού, είναι δηλαδή ως ιδέα πολύ πιο κοντά στο λογισμικό. Ο έλεγχος δηλαδή της βιομηχανίας του λογισμικού συνεπάγεται
έλεγχο σε ένα μεγάλο βαθμό και του κυβερνοχώρου. Δεν είναι δυνατόν να μιλάμε για δημοκρατία, ισότητα και ελευθερία, όταν ο έλεγχος αυτός δεν γίνεται από μια
πλειοψηφία τουλάχιστον, και στην καλύτερη περίπτωση από όλους.
Σήμερα, η συντριπτική πλειοψηφία των χρηστών δεν έχουν τη δυνατότητα του παραμικρού ελέγχου και κριτικής πάνω στο λογισμικό που χρησιμοποιούν. Οι ιδέες, γιατί η
έννοια του λογισμικού είναι κοντά σ\' αυτό που λέμε ιδέα, έχουν γίνει ιδιοκτησία, και το να μάθει κάποιος την ιδιοκτησία του άλλου είναι έγκλημα. Αλήθεια, τι
άλλο θα μπορούσε να ονομαστεί \"έγκλημα σκέψης\";
Το Linux και η όλη φιλοσοφία που εισάγεται με το Open Source Software, είναι ουσιαστικά μια μεταβίβαση της δυνατότητας ελέγχου του λογισμικού, από αυτούς που το
γράφουν, σε όλους. Είναι δηλαδή η βασική προϋπόθεση για τον \"εκδημοκρατισμό\" του κυβερνοχώρου, και μια ελπίδα ώστε να μην καταλήξουμε σε μια ασύδοτη
\"αναρχία\", αλλά σε μια καλύτερη έκδοση της υπάρχουσας κοινωνίας. Ο καθένας μπορεί να ελέγξει τον κώδικα, να καταλάβει τις σκέψεις του άλλου, να τις βελτιώσει.
Και βέβαια αυτό δεν είναι κλοπή, αλλά αναγνώριση της αξίας του δημιουργού. Το Linux εισάγει στον κυβερνοχώρο το αυτονόητο: τη δυνατότητα όλων να κρίνουν, να
ελέγχουν και να προστατεύουν τους εαυτούς τους, αλλά και τη δυνατότητα του κάθε δημιουργού να εισπράξει την αναγνώριση για το έργο του. Αυτός είναι ένας άλλος
μεγάλος τομέας προόδου, αφού μέχρι τώρα, την \"ιδιοκτησία\" του λογισμικού δεν την είχαν αυτοί που το δημιουργούσαν αλλά δικηγόροι και managers. (Αλήθεια, ο
Gates προγραμμάτισε τα Windows;)
Ας ελπίσουμε ότι κάποια στιγμή οι άνθρωποι θα συνειδητοποιήσουν ότι τα δικαιώματά τους στον κυβερνοχώρο είναι ακριβώς όσο πολύτιμα όσο και στον υλικό κόσμο, και
ότι η ελευθερία πρέπει να προστατευθεί για τους αδύνατους. Ας μη μιλάμε μόνο για ελευθερία στον κυβερνοχώρο, ενάντια σε κάθε νόμο και έλεγχο, μόνο γιατί
νιώθουμε ότι περιοριζόμαστε από το να \"εξαπλώσουμε\" την ελευθερία μας ενάντια σ\'αυτή κάποιου άλλου. Μπορεί όλοι να νιώθουμε δυνατοί, αλλά πάντα υπάρχει ο πιο
δυνατός, και αν τους κανόνες του παιχνιδού δεν τους θέτουν αυτοί που θα έπρεπε, θα τους θέσουν αυτοί που δεν πρέπει.

449
content/articles/22/05_fvwm2.md Κανονικό αρχείο

@ -0,0 +1,449 @@
+++
title = 'Πώς να κάνετε τον FVWM2 πιο Στυλάτο'
date = '2000-01-01T00:00:00Z'
description = ''
author = 'The Reverant(mailto:reverant@x-treme.gr)'
issue = ['Magaz 22']
issue_weight = 5
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Ο FVWM2 είναι ένας Window Manager (WM) που λόγω ηλικίας είναι πλέον αρκετά \"ώριμος\" και σταθερός. Δυστυχώς όμως, είναι περισσότερο \"ώριμος\" από όσο θα
έπρεπε όσον αφορά την εμφάνισή του, και είναι αναμφισβήτητο γεγονός το ότι η λειτουργικότητά του χρήζει παραιτέρω βελτίωσης.*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αυτός είναι και ο σκοπός αυτού του άρθρου. Πρωτίστως να βελτιώσει το εντελώς ανιαρό και συντηρητικό standard look του FVWM2, και να βελτιώσει στα σημεία τη
λειτουργικότητά του. Αρχίζουμε λοιπόν\... :-)
ΣΗΜΕΙΩΣΗ: Αυτό το άρθρο προϋποθέτει κάποια εξοικείωση με τον FVWM2. Αν αυτή δεν υπάρχει, προτείνεται η χρήση του μέχρι κάποιου σημείου εξοικείωσης, καθώς και η
ανάγνωση της man σελίδας (man fvwm2 μόνο για όποιον έχει πραγματικά **ΓΑΙΔΟΥΡΙΝΗ** υπομονή. Ο υπογράφων μερικές φορές δεν φάνηκε αρκετά \"ζώον\" και η υπομονή
του δοκιμάστηκε πέραν ανθρωπίνων ορίων :-) )
Πρώτο βήμα είναι να βρούμε το config αρχείο του FVWM2. Αυτό είναι το .fvwm2rc το οποίο αναζητείται στο home directory του χρήστη. Εαν δεν βρεθεί εκεί, τότε
χρησιμοποιείται το system-wide που συνήθως βόσκει στο λιβάδι /usr/X11R6/lib/X11/fvwm2/.fvwm2rc. Δεν προτείνεται να πειράξετε το system-wide αρχείο, αντιθέτως,
πειράξτε το αντίστοιχο ενός απλού χρήστη. Και φυσικά, πριν κάνετε οποιαδήποτε παρέμβαση, κάντε ένα **τριπλό** backup του αρχείου αυτού, για κάθε ενδεχόμενο.
Κατόπιν, ανοίγουμε το αρχείο .fvwm2rc με έναν editor και αρχίζουμε:
1. Window buttons - Μπορούμε να ορίσουμε την εμφάνιση των window control buttons. Τα standard κρίνονται ικανοποιητικά, οπότε αφήνονται ως εχουν.
2. General Configuration - Διάφορες γενικοί παράμετροι του FVWM2. Αυτό που θα πειραχθεί από εδώ είναι το DeskTopSize. Αυτή η παράμετρος ορίζει πόσα virtual
desktops θα εμφανίζονται στον pager. Η default τιμη 3x2 μέχρι τώρα δεν μου έχει χρησιμεύσει προσωπικά. Τουναντίον μάλιστα :-). Για αυτό και βάζουμε τιμή
2x2:
DeskTopSize 2x2
3. Colors and fonts - Μπορούμε να ορίσουμε τα χρώματα των selected windows και των διαφόρων menu. Με τη δήλωση:
HilightColors TextColor BackColor
το selected window θα έχει ως font color το \"TextColor\" και ως background color το \"backColor\". Αυτά τα χρώματα μπορεί να είναι οποιαδήποτε χρώματα που
αναφέρονται στο αρχείο: /usr/X11R6/lib/X11/rgb.txt\
Για τα sticky παράθυρα:
StickyColors TextColor BackColor
Για τα ανενεργά παράθυρα, καθώς και για συγκεκριμένα παράθυρα, θα χρησιμοποιήσουμε τη Style δήλωση, της οποίας η χρήση αναλύεται αργότερα. Κατόπιν, για το
χρώμα & το font των menus:
Menustyle TextColor BackColor OtherColor -misc-fixed-medium-r-normal-*-15-*-75-75-c-90-iso8859-1 fvwm
Το \"OtherColor\" δεν έχει διαπιστωθεί που χρησιμεύει (κανείς;). Κατόπιν, η standard δήλωση του font που θέλουμε.
4. Functions για Initialization, Restart & Exit.\
Functions είναι δηλώσεις που εκτελούνται κατόπιν κάποιας πράξης του χρήστη, π.χ. πατάει ένα button στο FvwmButtons, ή κάνει κλικ στο desktop, κ.τ.λ. Αυτές
εκτελούνται κατόπιν αναλόγου σήματος του WM. Για initialization (οι παρακάτω δηλώσεις θα εκτελούνται όταν ο FVWM2 γίνεται initialized):\
Δήλωση της function \"InitFunction\":
AddToFunc InitFunction
Και μετά έχουμε:
- Το module \"FvwmBanner\" δεν χρησιμεύει πουθενά, οπότε κερδίζει ένα comment-out σύμβολο (\#) με την αξία του! :-)
#+ "I" Module Fvwmbanner
- Τα xmessages προτιμώ προσωπικά να εμφανίζονται σε ενα xterm με background χρώμα το μαύρο και text χρώμα το πράσινο (Old-schoοl terminal), με τίτλο
\"Xmessages\", και ένα συγκεκριμένο geometry (δηλαδή μέγεθος και σημείο τοποθέτησης του παραθύρου πάνω στο desktop) που βολεύει. Αυτό γίνεται με την
εξής δήλωση:
+ "I" Exec xterm -geometry 83x10+0+1120 -bg black -fg green -T "XMessages" -e tail -f /root/.X.err
Η original δήλωση αφαιρείται όπως έχει.
- Το default xterm που εμφανίζεται με το initialization του fvwm2 έχει χάλια χρώματα, οπότε:
+ "I" Exec xterm -geometry +0+88 -bg black -fg green
- Ένα όμορφο background πάντα βοηθάει την κατάσταση :-)
+ "I" Exec xpmroot /root/pics/skull.xpm
ΣΗΜΕΙΩΣΗ: Για όποιον ενδιαφέρεται, οι εικόνες και τα εικονίδια που χρησιμοποιώ, θα είναι διαθέσιμα από 5-6 Ιανουαρίου στο:
<http://reverant.fortunecity.com/linux-icons.tar.gz>. Τα κάνετε extract με:
$: tar zxfv linux-icons.tar.gz
και ύστερα τα αντιγράφετε στο: /usr/X11R6/include/X11/pixmaps
- Με ενδιαφέρει επίσης να μπορώ να βλέπω τα διάφορα log messages χωρίς να αλλάζω consoles συνεχώς, οπότε:
+ "I" Exec xterm -ls -geometry 100x10+513+1120 -T "Messages" -bg black -fg green -e tail -f /var/log/messages
- Μια **ΜΕΓΑΛΗ** έλλειψη του FVWM2 όπως έρχεται το config του, είναι ένα είδος taskbar, η οποία να δείχνει ποια παράθυρα υπάρχουν, και να βοηθάει στην
μεταξύ τους εναλλαγή. Αυτό το πρόβλημα λύνεται με τη χρήση του module \"FvwmTaskBar\":
+ "I" Module FvwmTaskBar
Για Restart (Οι παρακάτω δηλώσεις θα εκτελούνται όταν κάνουμε restart τον FVWM2). Τα βήματα 2, 4 και 5 επαναλαμβάνονται σε αυτήν τη δήλωση:
AddToFunc RestartFunction
+ "I" Exec xterm -geometry 83x10+0+1120 -bg black -fg green -T "XMessages" -e tail -f /root/.X.err
+ "I" Exec xpmroot /root/pics/skull.xpm
+ "I" Exec xterm -ls -geometry 100x10+513+1120 -T "Messages" -bg black -fg green -e tail -f /var/log/messages
Εννοείται ότι οι original δηλώσεις για xmessages, xpmroot αφήνουν το μάταιο τούτο config file :-)\
Η Exit function αφήνεται όπως έχει.
5. Functions - Το ψωμί της υπόθεσης, ή αλλιώς, \"όλα τα λεφτά!\". Εδώ δηλώνουμε τις functions, κοινώς δηλαδή τι γίνεται όταν λαμβάνει χώρα κάποιο γεγονός
(μπερδευτήκατε;), π.χ. κάνουμε κλικ σε ενα button του FvwmButtons. Μια function, προκειμένου να δηλώσουμε την εμφάνιση ενός menu με επιλογές, έχει την εξής
μορφή:
AddToMenu OnomaTisFunctionPopUp "Onoma Tis Function" Title
...Εδώ μέσα δηλώσεις για το τι περιλαμβάνει η function...
# end popup OnomaTisFunction
Εξηγήσεις:\
Με την λέξη \"AddToMenu\" δηλώνουμε μια function η οποία θα κάνει PopUp μια λίστα με εντολές. Μετά δηλώνεται το όνομα της function. Στην περίπτωσή μας, αυτό
είναι \"OnomaTisFunctionPopUp\". Δηλαδή, όποτε θέλουμε να αναφερθούμε στη function αυτή, θα χρησιμοποιούμε το όνομα αυτό. Προσοχή, το όνομα της function δεν
μπορεί να έχει κενά ανάμεσα στα γράμματα, ούτε κάποιους ειδικούς χαρακτήρες.\
ΣΗΜΕΙΩΣΗ: Στην πραγματικότητα, με τη δήλωση \"AddToMenu\" δεν δηλώνουμε μια function, αλλά ένα menu, που είναι κατά κάποιο τρόπο μια function, απλά το μόνο
που μπορεί να κάνει είναι να εμφανίζει μια λίστα. Για λόγους απλούστευσης όμως, θα θεωρούμε και τα menus ως functions. Κατόπιν, δηλώνεται το όνομα που
θέλουμε να εμφανίζεται στην ανώτερη θέση της λίστας, δηλαδή ένα όνομα που περιγράφει τι εντολές περιέχονται στη λίστα, και μετά την ειδική λέξη \"Title\".
Ένα παράδειγμα είναι π.χ. \"Shells\", ή \"My Programs\". Εδώ επιτρέπονται και κενά, και ειδικοί χαρακτήρες (Για περισσότερες πληροφορίες, κοιτάξτε το manual
page του fvwm2). Εάν κάποιος δεν θέλει να εμφανίζεται καθόλου τίτλος, απλά δεν γράφει έναν και ΔΕΝ βάζει την λέξη Title μετά το όνομα της Function.\
\... Μετά οι δηλώσεις για τα περιεχόμενα της λίστας (εξηγούνται παρακάτω, υπομονή παρακαλώ :ο) )\...\
Τέλος, **εάν** θέλει κανείς μπορεί για λόγους ευκολίας ανάγνωσης και μόνο να βάλει ένα comment-out και μετά να δηλώσει \"end popup onomatisfunction\". Αυτό
είτε το βάλει κανείς είτε δεν το βάλει, ένα και το αυτό. Απλά, για να είναι ξεκάθαρο που τελειώνει η δήλωση της function καλό θα ήταν να το δηλώνετε.\
Και τώρα οι δηλώσεις για το τι θα περιλαμβάνει η PopUp λίστα που θα εμφανίζεται. Γενικά, μια δήλωση έχει ως εξής:
+ "Onoma entolis%onomaicon.xpm" Kanekati
Όπου:
- Onoma entolis είναι το όνομα της εντολής που θα εμφανίζεται σε μία PopUp λίστα, π.χ. StarOffice, ή BitchX. Προσοχή στο ότι αυτό το όνομα δεν είναι η
\"πραγματική\" εντολή που θα εκτελεστεί από τον WM. Είναι απλά ένα όνομα, ένα \"alias\". Κατόπιν, τοποθετούμε το σύμβολο \"%\" για να διαχωρίσουμε το
alias από το filename του icon που θέλουμε να χρησιμοποιήσουμε για το alias αυτό, και ταυτόχρονα να δηλώσουμε ότι το icon θέλουμε να εμφανιστεί δίπλα
στο alias (χρησιμοποιώντας το σύμβολο \"\$\" αντί του \"%\" δηλώνουμε ότι θέλουμε το icon να εμφανιστεί πάνω από το alias). Προσοχή στο ότι η συνένωση
αυτών των δύο δηλώσεων πρέπει να είναι μέσα σε εισαγωγικά (double quotes: \").
- Ακολουθεί η εντολή που θέλουμε να πραγματοποιηθεί. Αυτή μπορεί να είναι είτε μια κανονική εντολή που θα εκτελοέσαμε εμείς στο shell, είτε μια εντολή
προς τον WM να εμφανίσει μια άλλη PopUp λίστα. Για να εκτελέσει ο WM ένα πρόγραμμα, δηλώνουμε:
+ "Onoma entolis%onomaicon.xpm" Exec enaprogramma
π.χ., για να εκτελέσουμε ένα bash shell, δηλώνουμε:
+ "Bash shell%bash.xpm" Exec bash
Άλλο παράδειγμα, για το XISP:
+ "XISP%xisp.xpm" Exec xisp
Αν θέλουμε, μπορεί αντί να εκτελεστεί μια εντολή, να εμφανιστεί μια άλλη PopUp λίστα. Για να το κάνουμε αυτό, δηλώνουμε:
+ "List of programs%programs.xpm" PopUp ProgramsPopUp
όπου ProgramsPopUp μια function με το όνομα αυτό.\
Γνωρίζοντας τα παραπάνω ας αρχίσουμε λοιπόν να γράφουμε/τροποποιούμε τις functions που θα χρειαστούμε, αφού σκεφτούμε πρώτα τι χρειαζόμαστε από ένα WM.
Χρειαζόμαστε λοιπόν:
1. Μια function για να χειριζόμαστε διάφορες παραμέτρους του WM (modules, exit/restart, start another WM), βοήθεια για τον WM και τα modules του, καθώς και
για reboot/halt του συστήματος.
2. Μια function για ανεύρεση αρχείων.
3. Μια function για βοήθεια
4. Μια function για να ξεκινάμε ένα shell (Το γιατί πρέπει να είναι ξεχωριστή αυτή η function από τις άλλες είναι θέμα εργονομίας: Ένα shell συνήθως
εκτελείται αρκετές φορές παραπάνω από οποιοδήποτε άλλο πρόγραμμα.)
5. Μια function για γενικό configuration του συστήματος
6. Μια function για να τρέχουμε κάποια συχνά χρησιμοποιούμενα προγράμματα μας.
7. Μια function για άμεση πρόσβαση σε δισκους, CD-ROM, Floppy, κ.τ.λ.
Για την πρώτη function, θα χρησιμοποιήσουμε μια υπάρχουσα. Αυτή είναι η thiswmpopup:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
###############################################################################
#
# thiswmpopup
#
###############################################################################
AddToMenu thiswmpopup "Fvwm2" Title
+ "Other window managers%small.icon_warning_3d.xpm%" Popup otherwmpopup
+ "Fvwm2 Modules%small.install_3d.xpm%" Popup modulepopup
+ "Configuration%small.checklist2_3d.xpm%" Popup susewmpopup
+ "Fvwm2 Man Pages%small.xman3d.xpm%" Popup wmmanpopup
+ "" Nop
+ "Restart Fvwm2%small.restart_suse_3d.xpm%" Restart fvwm2
+ "Exit Fvwm2 and X%small.exit.xpm%" Function QuitSave
# end popup thiswmpopup
----------------------------------------------------------------------------------------------------------------------------------------------------------------
στην οποία θα προσθέσουμε τις εξής 2 γραμμές:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
+ "Reboot System" Exec Reboot
+ "Halt System" Exec Halt
----------------------------------------------------------------------------------------------------------------------------------------------------------------
για να κάνουμε reboot & halt αντίστοιχα όλο το σύστημα.
Δεύτερη function είναι η function που μας βοηθά στο να βρούμε κάποιο αρχείο γρήγορα, χωρις να θυμόμαστε πολύπλοκες συντάξεις εντολών, π.χ. της find:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
############################################################
#
# findpopup
#
############################################################
AddToMenu findpopup "Find" Title
+ "Find a file*find.xpm*" Exec xterm -bg black -fg green -e findfile
# end popup findpopup
----------------------------------------------------------------------------------------------------------------------------------------------------------------
To findfile είναι ένα shell script που έχει γραφεί με σκοπό τον προαναφερθέντα, και είναι το εξής:
echo "Filename?"
read filename
echo "Search where?"
read pathname
find $pathname -name $filename
echo "Done, press enter to exit"
read anykey
exit
Η τρίτη function είναι η function που θα μας εμφανίζει τα σχετικά με help, documentation, κ.τ.λ. Συγκεκριμένα, θα τρέχει το xman για να διαβάσουμε κάποια
man page, μας ανοίγει τον xfilemanager στο /usr/doc/howto/en/ ή στο /usr/doc/howto/el/ :
----------------------------------------------------------------------------------------------------------------------------------------------------------------
############################################################
#
# helpmepopup
#
############################################################
AddToMenu helpmepopup "Help" Title
+ "Manual Pages%small.xman3d.xpm%" Exec xman
+ "Greek HOWTO's%help1.xpm%" Exec xfilemanager -rootDir /usr/doc/howto/el -singleWindow
+ "English HOWTO's%help1.xpm%" Exec xfilemanager -rootDir /usr/doc/howto/en -singleWindow
# end popup findpopup
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Με την τέταρτη function θα εμφανίζεται ένα xterm, στοιχείο πολύ βασικό στο Πραγματικό Λειτουργικό :-)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
############################################################
#
# runmepopup
#
############################################################
AddToMenu runpopup "Shells" Title
+ "Old-school Xterm%small.greenterm.xpm%" Exec xterm -bg black -fg green
# end popup findpopup
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Με την πέμπτη function θα εμφανίζεται μια λίστα με διάφορες επιλογές για configuration, π.χ. για kernel configuration, εκτέλεση του yast (Για S.u.S.E.
μόνο!), καθώς και για configuration των Χ:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
############################################################
#
# mesettingspopup
#
############################################################
AddToMenu mesettingspopup "Settings" Title
+ "Yast%small.yast_suse_3d.xpm%" Exec xterm -bg balck -fg green -e yast
+ "Kernel Configuration" Exec xterm -bg black -fg green -e mkmc
+ "X configuration" Exec xterm -bg black -fg green -e Xconfig
# end popup mesettingspopup
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Με την έκτη function θα εμφανίζεται μία λίστα με διάφορα προγράμματα που θα χρησιμοποιούνται συχνά - για αυτό και η ανάγκη για μια δικιά τους function.
Κόφτε και ράφτε κατά τα μέτρα σας :-) :
----------------------------------------------------------------------------------------------------------------------------------------------------------------
############################################################
#
# meprogramspopup
#
############################################################
AddToMenu meprogramspopup "Programs" Title
+ "Netscape%netscape1.xpm%" Exec netscape
+ "X11Amp%x11amp.xpm%" Exec x11amp
+ "The Gimp%gimp.xpm%" Exec gimp
+ "GRio%grio.xpm%" Exec grio
+ "KEdit%kedit.xpm%" Exec kedit
+ "Bitchx%bitchx.xpm%" Exec bitchx
+ "Kmix%kmix.xpm%" Exec kmix
+ "XIsp%xisp.xpm%" Exec xisp -nohints
+ "Acrobat Reader%acrobat.xpm" Exec xpdf
# end popup findpopup
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Τέλος, η function για πρόσβαση στα διάφορα drives:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
############################################################
#
# medrivespopup
#
############################################################
AddToMenu medrivespopup "Drive I/O" Title
+ "Root filesystem%hdd.xpm" Exec xfilemanager -rootDir / -singleWindow
+ "CD-ROM%cdrom.xpm" Exec xfilemanager -rootDir /cdrom -singleWindow
+ "Floppy%floppy.xpm" Exec xfilemanager -rootDir /floppy -singleWindow
# end popup medrivespopup
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Σημείωση: Αν χρησιμοποίησετε τις functions αυτές, θα παρατηρήσετε ότι πρέπει να κρατάτε πατημένο το πλήκτρο του πόντικα σας ή του πληκτρολογίου σας για να
παραμείνει η λίστα στην οθόνη. Για να το αποφύγετε αυτό, κάντε το εξής: Γράφτε μια function σαν την παρακάτω, για κάθε function που θέλετε να συμβαίνει
αυτό, και στη συνέχεια αντί να καλείτε την πρωτότυπη, καλέστε την καινούργια. Π.χ., για την medrivespopup, γράφουμε την εξής function:
AddToFunc medrivespopupfunc
+ "I" Popup medrivespopup
# end function medrivespopupfunc
6. Η δήλωση \"Style\" - Με αυτήν μπορούμε να δηλώσουμε συγκεκριμένες ιδιότητες που θα έχει κάποιο ή όλα τα παράθυρα. Αυτή η δήλωση δεν γίνεται μόνο μια φορά
αλλά πολλές - τόσες ώστε να αποδώσουμε όλες τις επιθυμητές ιδιότητες στα παράθυρά μας. Μια δήλωση style έχει ως εξής:
style "titleparathirou" idiotita1, idiotita2, idiotia3, κ.τ.λ.
όπου titleparathirou ο τίτλος του παραθύρου στο οποίο θέλουμε να δώσουμε τις ιδιότητες idiotita1, idiotita2, idiotita3, κ.τ.λ. Αν αυτές τις ιδιότητες
θέλουμε να τις αποδώσουμε σε όλα τα παράθυρα, τότε δηλώνουμε:
style "*" idiotita1, idiotita2, idiotia3, κ.τ.λ.
Άν ακόμα έχουμε ένα παράθυρο του οποίου ο τίτλος δεν είναι απολύτως σταθερός, όπως π.χ. το xosview, του οποίου ο τίτλος εξαρτάται από το όνομα του
μηχανήματος (Hostname), τότε μπορούμε να δηλώσουμε:
style "katistathero*" idiotita1, idiotita2, idiotia3, κ.τ.λ.
όπου katistathero είναι το μέρος του τίτλου τού παραθύρου που μένει σταθερό. Ας αρχίσουμε λοιπόν τις style δηλώσεις που μας ενδιαφέρουν:
- Το module FvwmTaskbar είναι μια Taskbar η οποία έχει κουμπιά με τα προγράμματα που τρέχουν. Επειδή είναι αρκετά χαζό να συμπεριλαμβάνεται ο εαυτός της,
θα της δώσουμε την ιδιότητα WindowListSkip, η οποία εξαιρεί την εμφάνιση του προγράμματος στο οποίο αποδίδουμε την ιδιότητα, στην Taskbar. Ακόμα, δεν
θέλουμε η Taskbar να έχει τίτλο και \"decorations\", για αυτό της δίνουμε την ιδιότητα NoTitle. Ακόμα, θέλουμε να είναι συνεχώς ορατό, οπότε του δίνουμε
την ιδιότητα StaysOnTop. Έτσι έχουμε:
Style "FvwmWinList" NoTitle, WindowListSkip, StaysOnTop
- Το εικονίδιο του xterm είναι **επειικώς** απαράδεκτο, οπότε:
Style *xterm* Icon greenterm.xpm
Με τη δήλωση αυτή, δηλώνουμε ότι θέλουμε όταν το xterm γίνεται iconified, το εικονίδιό του να είναι το greenterm.xpm
- Εμένα μου αρέσουν αυτά τα χρώματα στα inactive παράθυρά μου:
Style "*" BackColor Purple4
Style "*" ForeColor Red
BackColor to background χρώμα του παραθύρου, ForeColor το χρώμα των γραμμάτων του τίτλου του παραθύρου. Αν δεν σας αρέσουν, ξέρετε τι να κάνετε :-P
7. FvwmButtons - Το FvwmButtons είναι ένα Module του FVWM, το οποίο είναι ουσιαστικά μια μπάρα με κουμπιά, και εμείς διαλέγουμε πόσα κουμπιά θα έχει, τι θα
κάνει το καθένα, κ.τ.λ. Αρχίζουμε με τα χρώματα, τών οποιων η δήλωση είναι αρκετά απλή:
*FvwmButtonsFore Green
*FvwmButtonsBack Purple4
και ύστερα η θέση του στο desktop, η οποία είναι ελαφρώς μετατοπισμένη προς τα κάτω, γιατί επάνω από το FvwmButtons θα τοποθετηθεί η TaskBar:
*FvwmButtonsGeometry +0+31
Άν θέλετε, μπορείτε όπως εγώ να βγάλετε τις δηλώσεις των xclock, xeyes, και asclock, γιατί καταλαμβάνουν πολύτιμο χώρο. Εξ άλλου, η Taskbar διαθέτει ρολόι
στο δεξί άκρο της. Έχουμε λοιπόν:
#*FvwmButtons - - Swallow "FvwmXeyes" Exec xeyes -name "FvwmXeyes" -geometry +0+0 -bg grey67 &
#*FvwmButtons - - Swallow "FvwmXclock" Exec xclock -name "FvwmXclock" -geometry +0+0 -padding 1 -bg grey67 &
#*FvwmButtons - - Swallow "asclock" Exec asclock -position +0+0 -shape -led green &
Για το αν το coolmail αξίζει το χώρο που πιάνει, εγώ προσωπικά νομίζω πως όχι, οπότε\... Αν βέβαια εσείς θέλετε να το έχετε, ε, τι να κάνουμε\... :-) Και
τώρα οι ζουμερές δηλώσεις ;-)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*FvwmButtons "" shutdown.xpm Function barthiswmpopupfunc
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Με την παραπάνω δηλώνουμε ότι θέλουμε να προσθέσουμε ένα button στο FvwmButtons, το οποίο δεν έχει καθόλου κείμενο πάνω του (Τα εισαγωγικά είναι κενά. Ο
λόγος είναι ότι στη συγκεκριμένη περίπτωση, το εικονίδιο έχει πάνω του το περιγραφικό κείμενο, π.χ. \"I/O Access\", ή \"Help\".), ενώ όταν κάνουμε αριστερό
κλικ πάνω εκτελείται η function barthiswmpopupfunc, η οποία με τη σειρά της εμφανίζει και κρατάει σταθερό στην οθόνη το thiswmpopup menu.\
Ομοίως λοιπόν για τις άλλες δηλώσεις:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*FvwmButtons "" cfind.xpm Function findpopupfunc
*FvwmButtons "" help.xpm Function helpmepopupfunc
*FvwmButtons "" run.xpm Function runpopupfunc
*FvwmButtons "" settings.xpm Function mesettingspopupfunc
*FvwmButtons "" programs.xpm Function meprogramspopupfunc
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Τα άλλα buttons (SuSE, Graphics, Tools, Shells) μας αποχαιρέτησαν (\#).
8. FvwmTaskBar - Όπως αναφέρθηκε και προηγουμένως, η TaskBar είναι μια μπάρα, πάνω στην οποία υπάρχουν buttons τα οποία χρησιμοποιεί κανείς για να κάνει
iconify/maximise ένα πρόγραμμα. Εκτός αυτών, η Taskbar έχει και ένα button στο οποίο μπορούμε να αναθέσουμε κάποια function ή menu, παρόμοιο με το \"Start\"
button ακατανόμαστου αλειτούργητου συστήματος που άρχισε να κυκλοφορεί το 1995 ;-) Οι δηλώσεις που έχω εγώ για την TaskBar είναι:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
###############################################################################
# #
# Task Bar #
# #
###############################################################################
*FvwmTaskBarGeometry +0+0
*FvwmTaskBarFore Green
*FvwmTaskBarBack Purple4
*FvwmTaskBarUseSkipList
*FvwmTaskBarShowTips
*FvwmTaskBarStartName Main()
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Επεξηγήσεις: Οι τρεις πρώτες δηλώσεις είναι αρκετά απλές. Η τέταρτη (\*FvwmTaskBarUseSkipList) δίνει εντολή στην TaskBar να \"δίνει σημασία\" στην ιδιότητα
WinListSkip ενός παραθύρου. Αν αυτή η δήλωση παραλειφθεί, παράθυρα στα οποία έχει δωθεί η ιδιότητα WinListSkip θα φαίνονται κανονικά και με το Νόμο στην
TaskBar.
Φυσικά δεν είναι αναγκαστικό να κάνετε ότι έκανα και εγώ. Πειραματιστείτε, ψάξτε, και όλο και κάτι πιο καλό θα βρείτε.