Πρώτο commit
Αυτό το commit περιλαμβάνεται σε:
commit
8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές
30
content/articles/23/01_editorial.md
Κανονικό αρχείο
30
content/articles/23/01_editorial.md
Κανονικό αρχείο
|
@ -0,0 +1,30 @@
|
|||
+++
|
||||
title = 'Editorial'
|
||||
date = '2000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
|
||||
issue = ['Magaz 23']
|
||||
issue_weight = 1
|
||||
+++
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Καλώς ορίσατε στο **Magaz**\...*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Τεύχος προεκλογικό (ψηφίστε μας :-) αυτό, λόγω ημερομηνίας βέβαια και όχι λόγω ύλης. Για να πω την αλήθεια, εγω θα ψήφιζα ΔΑΓΚΩΤΟ αυτόν που θα μου έλεγε ότι θα
|
||||
ακολουθούσε το παράδειγμα του Μεξικού, να γεμίσει τα σχολεία ΜΟΝΟ με Linux και να σταθεί σαν επίσημο κράτος πίσω από το Linux. Αλλά τέλος πάντων, αυτό δεν είναι
|
||||
επί του παρόντος.
|
||||
|
||||
Όπως είπαμε στο τεύχος 20, προσπαθούμε να επικεντρωθούμε σε τεχνικά θέματα, λίγο πιο advanced από το \"Πως βάζω ελληνικά στο Linux\" όχι επειδή το δεύτερο δεν
|
||||
μας απασχολεί, αλλά επειδή έχει απαντηθεί και αναλυθεί τόσες πολλές φορές που πλέον καταντάει γελοίο. Βέβαια, το να αρχίσει το Magaz να έχει πιο advanced
|
||||
θέματα, εξαρτάται αποκλειστικά και μόνο από τους αρθρογράφους του. Και αυτή τη φορά, οι αρθρογράφοι μας έκαναν τη χάρη να μας βοηθήσουν.
|
||||
|
||||
Έχουμε λοιπόν, [μία παρουσίαση της xbasic](02_xbasic.html) από τον Κώστα Τσακάλογλου σε αυτό το τεύχος, μία πρώτη προσέγγιση στον [προγραμματισμό με
|
||||
gawk](03_gawk1.html) από τον DJ-Art, μία ελαφριά και επιφανειακή προσέγγιση της [χρήσης του Perl DBI](04_perldbi.html) και τεχνικές οδηγίες για την [εγκατάσταση
|
||||
του apache με SSL και jserv](05_apachejserv.html) από τον Κώστα Γεωργακόπουλο.
|
||||
|
||||
Η [δημοσκόπηση αυτού του μήνα](http://magaz.hellug.gr/cgi-bin/poll23.cgi) καταπιάνεται με την αγαπημένη σας γλώσσα (αν προγραμματίζετε, ή αν θα προγραμματίζατε,
|
||||
ποια θα προτιμούσατε να μάθετε).
|
||||
|
||||
Καλή ανάγνωση\...
|
238
content/articles/23/02_xbasic.md
Κανονικό αρχείο
238
content/articles/23/02_xbasic.md
Κανονικό αρχείο
|
@ -0,0 +1,238 @@
|
|||
+++
|
||||
title = 'Xbasic'
|
||||
date = '2000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Κώστας Τσακάλογλου(mailto:tsakf@hellug.gr)'
|
||||
issue = ['Magaz 23']
|
||||
issue_weight = 2
|
||||
+++
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Μία γλώσσα προγραμματισμού Basic που έχει αρκετά στοιχεία C.*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Κατά την τακτική επίσκεψη μου στους δικτυακούς χώρους πέρασα και από το site της [Sourceforge](http://Sourceforge.net). Στην προσπάθεια αναζήτησης εργαλείων
|
||||
προγραμματισμού για το LINUX ζήτησα να δώ τι υπάρχει από Developement tools. Προσπαθώντας να δω τελικά με τι θα δουλέψω τώρα που έστησα και εγω επιτέλους το
|
||||
Linuxάκι μου (SUSE 6.3) έπεσα επάνω σε ένα link που έγραφε Xbasic. Τι ωραία! Λές να υπάρχει κάτι ενδιαφέρον, αναρωτιέμαι.. Μια και γράφω σε Basic από την εποχή
|
||||
του TRS-80 καλό θα ήταν να βρω κάτι που δεν θα μου αλλάξει και πολύ το στύλ μου. Ακολουθώντας τα διάφορα links πηγαίνω στην κατάλληλη σελίδα για να δω
|
||||
τελοσπάντων τι πράγμα είναι αυτή η Xbasic. Επιλέγοντας να δω κάποια οθόνη από το πρόγραμμα βρέθηκα μπροστά στην παρακάτω εικόνα:
|
||||
|
||||

|
||||
|
||||
Αρκετά όμορφο περιβάλλον για να γράφει κανείς πρόγραμμα, για να δούμε όμως από ουσία τι λέει:
|
||||
|
||||
Ετσι αποφάσισα να κατεβάσω το πρόγραμμα και να το εγκαταστήσω στο μηχάνημά μου. Σύμφωνα με τις οδηγίες εγκατάστασης, έπρεπε να κατεβάσω το αρχείο
|
||||
*xblinux.tar.gz* στο μηχάνημά μου και μετά να πληκτρολογήσω τις παρακάτω εντολές:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
cd /
|
||||
tar xfz xblinux.tar.gz
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Αφού λοιπόν το κατέβασμα έγινε μια χαρά και το tar έκανε την δουλειά του, ξεκινάω τα X (KDE). Ανοίγω το Bash Terminal και γράφω:
|
||||
|
||||
cd /usr/xb
|
||||
xb
|
||||
|
||||
Ωραία ξεκίνησε μια χαρά και ήρθε η ώρα να γράψω τις πρώτες μου εντολές. Μόλις δίνω την εντολή για το ξεκίνημα συγγραφής νέου προγράμματος να και άλλη μια
|
||||
έκπληξη.
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
'
|
||||
'
|
||||
' ######################
|
||||
' ##### Entry () #####
|
||||
' ######################
|
||||
'
|
||||
' Programs contain:
|
||||
' 1. A PROLOG with type/function/constant declarations.
|
||||
' 2. This Entry() function where execution begins.
|
||||
' 3. Zero or more additional functions.
|
||||
'
|
||||
FUNCTION Entry ()
|
||||
|
||||
END FUNCTION
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Αυτό δεν θυμίζει λίγο στο ξεκίνημα για την C;
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
main()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Προσπαθώντας έτσι να ρίξω μια ματιά στην γλώσσα για να δω περίπου τι κάνει, πέφτω επάνω στους τύπους των μεταβλητών. Αρχίζω και βλέπω τύπους που δεν υπάρχουν
|
||||
στην MS-BASIC ούτε καν στην VISUAL BASIC. Είδα διάφορα ωραία πράγματα και τα παραθέτω. Πρώτα από όλα να ξεκινήσω με τον κατάλογο των επιθεμάτων.
|
||||
|
||||
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
|
||||
\ SBYTE 8-bit signed integer
|
||||
`@`
|
||||
|
||||
`@@` UBYTE 8 bit unsigned integer
|
||||
|
||||
\% SSHORT 16 bit signed integer
|
||||
|
||||
%% USHORT 16 bit unsigned integer
|
||||
|
||||
& SLONG 32 bit signed long integer
|
||||
|
||||
&& ULONG 32 bit unsigned long integer
|
||||
|
||||
\~ XLONG 32/64 bit signed machine integer
|
||||
|
||||
\$\$ GIANT 64 bit signed giant (financial) integer
|
||||
|
||||
! SINGLE IEEE single precision floating point
|
||||
|
||||
\# DOUBLE IEEE double precision floating point
|
||||
|
||||
\$ STRING STRING of unsigned bytes
|
||||
|
||||
|
||||
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
|
||||
|
||||
Από τον παραπάνω πίνακα, οι τύποι SBYTE ,UBYTE,USHORT,ULONG,XLONG και GIANT δεν υπάρχουν στην MS-BASIC και VISUAL BASIC. Οι Unsigned τύποι καθαρά είναι τύποι
|
||||
που υποστηρίζει η C. Για τον τύπο XLONG νομίζω ότι είναι μια χαρά για εφαρμογές προγραμματισμού συστήματος (systems programming).
|
||||
|
||||
Οι μεταβλητες όμως στην XBASIC μπορούν να έχουν και προθέματα που δείχνουν την χρήση των μεταβλητών στις διάφορες ρουτίνες και προγράμματα. Τα προθέματα που
|
||||
μπορούν να χρησιμοποιηθούν στην XBASIC είναι:
|
||||
|
||||
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
|
||||
\ SHARED Η μεταβλητή είναι διαθέσιμη σε όλες τις ρουτίνες
|
||||
\#
|
||||
|
||||
\#\# EXTERNAL Η μεταβλητή είναι διαθέσιμη και σε άλλα προγράμματα
|
||||
|
||||
\$ LOCAL CONSTANT Η μεταβλητή έχει σταθερή τιμή για την τρέχουσα
|
||||
ρουτίνα
|
||||
|
||||
\$\$ SHARED CONSTANT Η μεταβλητή έχει σταθερή τιμή και είναι διαθέσιμη σε
|
||||
όλες τις ρουτίνες
|
||||
|
||||
|
||||
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
|
||||
|
||||
Θέλει προσοχή όταν ορίζουμε και χρησιμοποιούμε μεταβλητές στην XBASIC. Όπως και στο Linuxάκι μας τα κεφαλαία / πεζά είναι σημαντικά για την ονοματολογία των
|
||||
αρχείων, έτσι και στην XBasic τα κεφαλαία / πεζά δίνουν διαφορετικά ονόματα μεταβλητών άρα και διαφορετικές τιμές. Για αυτή την γλώσσα τα ονόματα COUNT, Count
|
||||
και count είναι διαφορετικές μεταβλητές.
|
||||
|
||||
Σύμφωνα με προηγούμενα καταλαβαίνουμε ότι οι εντολές πρέπει να γράφονται αποκλειστικά με κεφαλαία γράμματα γιατί διαφορετικά η γλώσσα τις βλέπει σαν μεταβλητές.
|
||||
Έτσι το:
|
||||
|
||||
FOR I%=1 to 100
|
||||
|
||||
είναι σωστό, ενώ το:
|
||||
|
||||
For I%=1 to 100
|
||||
|
||||
είναι λάθος γιατί η γλώσσα καταλαβαίνει ότι υπάρχει μια μεταβλητή For όπου δεν την κάνουμε τίποτα.
|
||||
|
||||
Παρακάτω συνέχισα την ανάγνωση και έπεσα στους τελεστές συγκρίσεων. Εκεί πάλι είδα στοιχεία από την C να ξεφυτρώνουν όπως οι τελεστές:
|
||||
|
||||
= ,<>,< ,<=,>=,>
|
||||
|
||||
μπορούν να εκφραστούν και αντίστοιχα με
|
||||
|
||||
==,!=,!>=,!>,!<,!<=
|
||||
|
||||
Επίσης αν ρίξουμε μια ματιά στον παρακάτω πίνακα θα δούμε τελεστές διευθύνσεων μνήμης (pointers) που τόσο αρέσουν στους προγραμματιστές της C και διάφορα άλλα
|
||||
καλούδια όπως μετακινίσεις bit κλπ.
|
||||
|
||||
------------------- ------------------- ------------------- ------------------- ------------------- ------------------- ------------------- -------------------
|
||||
\ ALT ΚIND CLASS OPERANDS RETURNS PREC COMMENTS
|
||||
OP
|
||||
|
||||
& unary 10 AnyType Address 12 Address of Object
|
||||
Data
|
||||
|
||||
&& unary 10 AnyType Address 12 Address of Object
|
||||
Handle
|
||||
|
||||
! unary 9 Numeric T/F 12 Logical Not (TRUE
|
||||
if 0, else FALSE)
|
||||
|
||||
!! unary 9 Numeric T/F 12 Logical Test (FALSE
|
||||
if 0, else TRUE)
|
||||
|
||||
NOT \~ unary 9 Integer SameType 12 Bitwise NOT
|
||||
|
||||
\+ unary 8 Numeric SameType 12 Plus
|
||||
|
||||
\- unary 8 Numeric SameType 12 Minus
|
||||
|
||||
\>\>\> binary 7 Integer LeftType 11 Arithmetic Up Shift
|
||||
|
||||
\<\<\< binary 7 Integer LeftType 11 Arithmetic Down
|
||||
Shift
|
||||
|
||||
\<\< binary 7 Integer LeftType 11 Bitwise Left Shift
|
||||
|
||||
\>\> binary 7 Integer LeftType 11 Bitwise Right Shift
|
||||
|
||||
\*\* binary 4 Numeric HighType 10 Power
|
||||
|
||||
/ binary 4 Numeric HighType 9 Divide
|
||||
|
||||
\* binary 4 Numeric HighType 9 Multiply
|
||||
|
||||
\\ binary 6 Numeric Integer 9 Integer Divide
|
||||
|
||||
MOD binary 6 Numeric Integer 9 Modul. (Int.Remain)
|
||||
|
||||
\+ binary 5 Numeric HighType 8 Add
|
||||
|
||||
\+ binary 5 String String 8 Concatenate
|
||||
|
||||
\- binary 4 Numeric HighType 8 Subtract
|
||||
|
||||
AND & binary 3 Integer HighType 7 Bitwise AND
|
||||
|
||||
XOR \^ binary 3 Integer HighType 6 Bitwise XOR
|
||||
|
||||
OR \| binary 3 Integer HighType 6 Bitwise OR
|
||||
|
||||
\> !\<= binary 2 NumStr T/F 5 Greater-Than
|
||||
|
||||
\>= !\< binary 2 NumStr T/F 5 Greater-Or-Equal
|
||||
|
||||
\<= !\> binary 2 NumStr T/F 5 Less-Or-Equal
|
||||
|
||||
\< !\>= binary 2 NumStr T/F 5 Less-Than
|
||||
|
||||
\<\> != binary 2 NumStr T/F 4 Not-Equal
|
||||
|
||||
= == binary 2 NumStr T/F 4 Equal(also
|
||||
\"!\<\>\")
|
||||
|
||||
&& binary 1 Integer T/F 3 Logical AND
|
||||
|
||||
\^\^ binary 1 Integer T/F 2 Logical XOR
|
||||
|
||||
\|\| binary 1 Integer T/F 2 Logical OR
|
||||
|
||||
= binary NumStr RightType 1 Assignment
|
||||
|
||||
T/F T/F always returned
|
||||
as XLONG
|
||||
|
||||
|
||||
------------------- ------------------- ------------------- ------------------- ------------------- ------------------- ------------------- -------------------
|
||||
|
||||
Κάτι Address και bitwise shift έχουν κάποιο ενδιαφέρον για κάποιους που θέλουν να χρησιμοποιήσουν αυτές τις εντολές αλλά η μέχρι τώρα γνωστές Basic δεν τους
|
||||
έδιναν αυτή την δυνατότητα.
|
||||
|
||||
Από μια πρώτη ματιά νομίζω ότι κάποιος που ξέρει BASIC και έχει αποφασίσει να αρχίσει να γράφει προγράμματα για το LINUX καλό είναι να ρίξει μια ματιά σε αυτή
|
||||
την γλώσσα που εκ πρώτης όψεως υπόσχεται πολλά. Εκτός από τις εντολές που δίνουν την δύναμη της C στον προγραμματιστή υπάρχει και παράθυρο εργαλείων για την
|
||||
κατασκευή μιας φόρμας. Κουμπιά και όλα τα Widgets των X μάλλον υποστηρίζονται. Λέω μάλλον γιατί δεν έχω προλάβει να αρχίσω να κάνω κάτι με αυτή την γλώσσα. Απλά
|
||||
όταν την είδα με μια πρώτη ματιά μου άρεσε τόσο που αποφάσισα να μοιραστώ τις εντυπώσεις που με άλλους προγραμματιστές γράφοντας αυτό το κείμενο και
|
||||
παρουσιάζοντάς το στο Magaz. Τον άλλο μήνα που θα έχω κάνει κάτι θα γράψω και νεότερα. Εχω σκοπό να κρατάω σημειώσεις για κάθε τι που κάνω και να παρουσιάζω
|
||||
κάθε τόσο από τη στήλη του Magaz κάθε τι καινούργιο όπως θα το μαθαίνω. Αυτά τα λίγα για τώρα και τα ξαναλέμε στο επόμενο Magaz.
|
590
content/articles/23/03_gawk1.md
Κανονικό αρχείο
590
content/articles/23/03_gawk1.md
Κανονικό αρχείο
|
@ -0,0 +1,590 @@
|
|||
+++
|
||||
title = 'Προγραμματισμός με gawk μέρος 1ο'
|
||||
date = '2000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'DJ Art(mailto:djart@hellug.gr)'
|
||||
issue = ['Magaz 23']
|
||||
issue_weight = 3
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Το άρθρο αυτό έχει σκοπό να σας βοηθήσει στην εκμάθηση της γλώσσας προγραμματισμού awk. Μία \"εξειδικευμένη\" γλώσσα προγραμματισμού, ένα ιδιαίτερα δυνατό
|
||||
εργαλείο στη διαχείρηση αρχείων κειμένου (text files), καθώς και δημιουργίας αναφορών, με το πλεονέκτημα ότι είναι και εύκολη στην εμάθηση και στην σύνταξη,
|
||||
αλλά και ότι \"συγγενεύει\" με την C. Το πλήρες άρθρο αποτελείται από δύο μέρη, εδώ σας παρουσιάζεται το πρώτο, ενώ ετοιμάζεται και το 2ο :-)*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
**1. Εισαγωγή**
|
||||
---------------------------------------
|
||||
|
||||
- [1.1 Ιστορικά](#ss1.1)
|
||||
- [1.2 Εφαρμογές](#ss1.2)
|
||||
- [1.3 Δυνατότητες](#ss1.3)
|
||||
|
||||
**2. Τα πρώτα βήματα**
|
||||
----------------------------------------------
|
||||
|
||||
- [2.1 Οι βασικές αρχές](#ss2.1)
|
||||
- [2.2 Σύνταξη](#ss2.2)
|
||||
- [2.3 Απλά Παραδείγματα](#ss2.3)
|
||||
- [2.4 Awk Scripts](#ss2.4)
|
||||
|
||||
**3. Πρότυπα (και Πράξεις)**
|
||||
----------------------------------------------------
|
||||
|
||||
- [3.1 Ειδικά πρότυπα](#ss3.1)
|
||||
- [3.2 Πρότυπα κανονικών παραστάσεων](#ss3.2)
|
||||
- [3.3 Πρότυπα σχεσιακών εκφράσεων](#ss3.3)
|
||||
- [3.4 Λογικοί Τελεστές](#ss3.4)
|
||||
- [3.5 Διάστημα προτύπων](#ss3.5)
|
||||
|
||||
**4. Πράξεις**
|
||||
--------------------------------------
|
||||
|
||||
- [4.1 Εισαγωγή](#ss4.1)
|
||||
- [4.2 Μεταβλητές](#ss4.2)
|
||||
- [4.3 Αλφαριθμητικά](#ss4.3)
|
||||
- [4.4 Πίνακες](#ss4.4)
|
||||
|
||||
|
||||
### [1. Εισαγωγή]{#s1}
|
||||
|
||||
### [1.1 Ιστορικά]{#ss1.1}
|
||||
|
||||
Η gawk, ή καλύτερα η GNU awk, είναι μιά από τις πιο καινούριες εκδόσεις της γλώσσας προγραμματισμού awk, η οποία είχε δημιουργηθεί για το περιβάλλον UNIX από
|
||||
τους Alfred Aho, Peter Weinberger και Brian Kernighan το 1977. Το όνομα awk προέρχεται από τα αρχικά γράμματα των επωνύμων των παραπάνω δημιουργών. Η σχεδίαση
|
||||
της awk φαίνεται στη διατριβή τους: \"AWK - a pattern scanning and processing language\" Software-Practice and Experience, Ιούλιος 1978. Η awk έχει την καταγωγή
|
||||
της σε ιδέες από την SNOBOL4, από την εντολή sed, από τα εργαλεία yacc και lex και από τη C. Επίσης, ο Kernighan είναι ένας από αυτούς που βοήθησε στη
|
||||
δημιουργία της C και του UNIX, ενώ οι άλλοι δύο βοήθησαν στη δημιουργία του UNIX. Για ακριβώς αυτούς τους λόγους, θα δείτε πολλές ομοιότητες μεταξύ της C και
|
||||
της awk. Υπάρχουν πολλές εκδόσεις της awk: η αυθεντική awk, η nawk, η POSIX awk και, φυσικά, η gawk, η οποία είναι βασισμένη στην POSIX awk.
|
||||
|
||||
### [1.2 Εφαρμογές]{#ss1.2}
|
||||
|
||||
H awk, σε όλες τις εκδόσεις, είναι μια γλώσσα επεξεργασίας και σύγκρισης προτύπων (patterns) με μεγάλη δύναμη σε αυτόν τον τομέα. Μπορεί να ψάξει ένα ή
|
||||
περισσότερα αρχεία για εγγραφές (records) που ταιριάζουν μέ ένα δοσμένο πρότυπο. Όταν ταιριάξουν, μία καθορισμένη πράξη (action) εκτελείται. Σαν
|
||||
προγραμματιστής, δεν χρειάζεται να ανησυχείτε για το άνοιγμα, την επαναλαμβανόμενη ανάγνωση των εγγραφών ή το κλείσιμο ενός αρχείου. Αυτές οι λεπτομέρειες
|
||||
γίνονται αυτόματα για εσάς. Το να γράφετε μικρά awk προγράμματα είναι εύκολο λόγω της λειτουργικότητας της γλώσσας, πολλές διαδικασίες είναι αυτοματοποιημένες.
|
||||
|
||||
Θα βρείτε πολλές εφαρμογές για τη awk, όπως το να \"διαβάζετε\" δεδομένα από ένα αρχείο, να μετράτε συγκεκριμένες \"υπάρξεις\" μέσα σ\' αυτό, αλλά και να
|
||||
δημιουργείτε εξειδικευμένες αναφορές (reports). Η γενική σύνταξη της awk μοιάζει πάρα πολύ/έχει πολλά κοινά σημεία με τη C. Εάν ήδη ξέρετε C, τότε γνωρίζετε
|
||||
αρκετά πράγματα από τη awk. Από πολλές απόψεις, η gawk είναι μία ευκολότερη \"έκδοση\" της C. Αν δεν γνωρίζετε C, τότε θα την μάθετε ευκολότερα αν ήδη γνωρίζετε
|
||||
awk.
|
||||
|
||||
ΣΗΜΕΙΩΣΗ: H awk δουλεύει με text αρχεία, όχι εκτελέσιμα. Επειδή τα εκτελέσιμα αρχεία περιέχουν χαρακτήρες που μοιάζουν με το τέλος εγγραφών (δηλαδή σύμβολα
|
||||
αλλαγής σειράς), η awk μπερδεύεται. Αν θέλετε να επεξεργαστείτε εκτελέσιμα αρχεία, τότε χρειάζεστε την Perl ή, φυσικά, μία από τις \"πατροπαράδοτες\" γλώσσες
|
||||
προγραμματισμού, όπως η C.
|
||||
|
||||
### [1.3 Δυνατότητες]{#ss1.3}
|
||||
|
||||
Η awk είναι ευλύγιστη, όπως το UNIX περιβάλλον, περιλαμβάνει προκαθορισμένες μεταβλητές, αυτοματοποιεί πολλές από τις \"διαδικασίες\" του κλασσικού
|
||||
προγραμματισμού, παρέχει τη δυνατότητα των συμβατικών μεταβλητών, υποστηρίζει το μορφοποιημένο output της C και είναι εύκολη στη χρήση. Σας επιτρέπει να
|
||||
συνδυάσετε τα πλεονεκτήματα των shell scripts με πολλά στοιχεία της C. Να σημειώσω πως δεν χρειάζετε να ορίζετε τον τύπο μιάς μεταβλητής (σε αντίθεση με τη C),
|
||||
αφού η awk καταλαβαίνει τον τύπο τους όταν τις χρησιμοποιεί. Φυσικά, υποστηρίζει τους βρόγχους της C (if/else, do/while, for), αλλά δεν υποστηρίζει το
|
||||
switch/case. Παρόλα αυτά, υποστηρίζει το printf() της C, αλλά και την εντολή print, μιά απλούστερη (από την printf) εντολή.
|
||||
|
||||
|
||||
### [2. Τα πρώτα βήματα]{#s2}
|
||||
|
||||
### [2.1 Οι βασικές αρχές]{#ss2.1}
|
||||
|
||||
Για να χρησιμοποιήσετε την gawk, θα πρέπει να γράψετε ένα πρόγραμμα. Το πρόγραμμα αυτό θα το ονομάζουμε awk script. Το λέω αυτό, γιατί σε απλές εφαρμογές θα
|
||||
παρατηρήσετε πως θα μπορούσατε αντί για την gawk να χρησιμοποιήσετε το grep. Στο grep, όμως, δεν γράφετε πρόγραμμα (script), αλλά του δίνετε παραμέτρους.
|
||||
Φυσικά, το awk script δεν έχει περιορισμούς στο μέγεθος. Μπορείτε να το κάνετε όσο μεγάλο θέλετε. To πρόγραμμα που φτιάχνετε μπορεί να \"διαβαστεί\" από την
|
||||
gawk με πολλούς τρόπους, από τους οποίους οι πιό συνηθισμένοι είναι η από την γραμμή εντολών ή από ένα αρχείο. Η gawk μπορεί επίσης να δεχθεί input με pipe
|
||||
(διασωλήνωση) από άλλο πρόγραμμα ή ακόμα και από το ίδιο το πληκτρολόγιο (επί τόπου). Το output με τη σειρά του, μπορεί εκτός από το standard, να ανακατεθυνθεί
|
||||
σε ένα αρχείο ή να διασωληνωθεί σε ένα άλλο πρόγραμμα.
|
||||
|
||||
### [2.2 Σύνταξη]{#ss2.2}
|
||||
|
||||
gawk -Fx 'πρόγραμμα' [αρχείο/α]
|
||||
gawk -Fx -f αρχείο_εντολών [αρχείο/α]
|
||||
|
||||
Το **πρόγραμμα** είναι μία σειρά από εντολές της awk, ενώ **αρχείο\_εντολών** είναι ένα αρχείο που περιέχει εντολές της awk. To **αρχείο/α** (στο τέλος της
|
||||
σύνταξης) είναι το όνομα του αρχείου στο οποίο θα γίνει η επεξεργασία που θέλουμε. Αν παραλείψουμε εκεί το αρχείο, τότε η gawk δέχεται input από την καθιερωμένη
|
||||
μονάδα εισόδου (πληκτρολόγιο).
|
||||
|
||||
Κάθε εντολή της awk έχει την μορφή: **πρότυπο {πράξη}**\
|
||||
Η awk \"σαρώνει\" γραμμή προς γραμμή το αρχείο και κάθε γραμμή συγκρίνεται με το πρότυπο. Αν ταιριάζει, τότε εκτελείται η αντίστοιχη πράξη. Αν από την παραπάνω
|
||||
μορφή απουσιάζει το πρότυπο, τότε η πράξη εκτελείται για κάθε γραμμή, ενώ αν απουσιάζει η πράξη, τότε όλες οι γραμμές που ταιριάζουν με το πρότυπο εμφανίζονται
|
||||
στην οθόνη. Την χρησιμότητα της επιλογής **-Fx** θα την δούμε παρακάτω.
|
||||
|
||||
### [2.3 Απλά Παραδείγματα]{#ss2.3}
|
||||
|
||||
Ο απλούστερος τρόπος να χρησιμοποιήσετε την awk είναι να γράψετε το πρόγραμμα στην γραμμή εντολών. Ας δούμε ένα απλό παράδειγμα:
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
$ cat arxeio.txt | gawk '{print NF ": " $0}'
|
||||
2: Γεια σας
|
||||
8: Σήμερα θα μάθουμε να προγραμματίζουμε με την gawk
|
||||
4: Σας εύχομαι καλή επιτυχία!
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Για να δούμε τώρα τί κάνει το πρόγραμμα. Το αποτέλεσμα της εντολής cat arxeio.txt περνά σαν είσοδος στην gawk. Πρότυπο δεν έχουμε, επομένως η πράξη (μέσα στις
|
||||
αγκύλες) εφαρμόζεται για κάθε γραμμή (του arxeio.txt). Από εκεί και πέρα η gawk εμφανίζει στην οθόνη των αριθμό των λέξεων, την άνω και κάτω τελεία, το κενό και
|
||||
μετά τα περιεχόμενα (ανά γραμμή) του arxeio.txt. To NF είναι μια προκαθορισμένη μεταβλητή της gawk, η οποία παριστάνει των αριθμό των πεδίων σε κάθε εγγραφή.
|
||||
Από default το κάθε πεδίο ξεχωρίζει από το άλλο με κενό (space) ή με tab, ενώ κάθε εγγραφή ξεχωρίζει με τον χαρακτήρα αλλαγής γραμμής. Επομένως, ας πώ τί κάνει
|
||||
η NF με πιο απλά λόγια: παριστάνει τον αριθμό λέξεων σε κάθε γραμμή. Όντως, στην πρώτη γραμμή η λέξεις ήταν 2 κλπ. Το σύμβολο \$0 παριστάνει ολόκληρη την
|
||||
εγγραφή, ενώ υπάρχουν τα σύμβολα \$1, \$2 κ.ο.κ. για τα πεδία. Για παράδειγμα, στην πρώτη γραμμή, το \$1 παριστάνει το πεδίο \"Γεια\", ενώ το \$2 το \"σας\".
|
||||
Στην δεύτερη γραμμή το \$5 είναι το \"προγραμματίζουμε\".
|
||||
|
||||
Θα μπορούσατε να χρησιμοποιήσετε την ανακατεύθυνση του UNIX, ή απλά το όνομα του αρχείου για να καταλήξετε στο ίδιο αποτέλεσμα με την παραπάνω εντολή. Δείτε
|
||||
άλλες δύο ισοδύναμες (με την παραπάνω) εντολές:
|
||||
|
||||
$ gawk '{print NF ": " $0}' < arxeio.txt
|
||||
$ gawk '{print NF ": " $0}' arxeio.txt
|
||||
|
||||
### [2.4 Awk Scripts]{#ss2.4}
|
||||
|
||||
Ας δούμε πάλι το παραπάνω παράδειγμα, την εντολή **gawk \'{print NF \": \" \$0}\' arxeio.txt**. Θα μπορούσατε να απόφυγετε την πληκτρολόγηση της εντολής στην
|
||||
γραμμή εντολών, αλλά να την συμπεριλάβετε σε ένα awk script. Προσέξτε πως στο awk script δεν πρέπει να γράψετε τα απλά εισαγωγικά, αφού αυτά χρησιμεύουν για να
|
||||
μην ασχοληθεί ο φλοιός (shell) με το περιεχόμενό τους. Αν τα χρησιμοποιήσετε η gawk θα σας βγάλει ένα μήνυμα λάθους και, φυσικά, δεν θα έχετε το επιθυμητό
|
||||
αποτέλεσμα. Οπότε, θα δημιουργήσετε ένα αρχείο **script.awk** που θα περιέχει τα εξής:
|
||||
|
||||
{print NF ": " $0}
|
||||
|
||||
Στη συνέχεια, θα τρέξετε το πρόγραμμα με την εξής εντολή:
|
||||
|
||||
gawk -f script.awk arxeio.txt
|
||||
|
||||
Να αναφέρω επίσης, πως η gawk και άλλες εκδόσεις της awk, οι οποίες συμβαδίζουν με το POSIX πρότυπο (standard) σας επιτρέπουν να χρησιμοποιήσετε περισσότερα του
|
||||
ενός scripts μετά την επιλογή -f (π.χ. gawk -f script1 script2 script3 arxeio.txt). Θα σας συμβούλευα να προτιμήσετε να καλέσετε ένα μόνο script (και όχι πιο
|
||||
πολλά) για να αποφύγετε διάφορα λάθη ή ενέργειες που μπορεί να σας μπερδέψουν.
|
||||
|
||||
|
||||
### [3. Πρότυπα (και Πράξεις)]{#s3}
|
||||
|
||||
Στην gawk μπορείτε να χρησιμοποιήσετε πρότυπα 3 ειδών:
|
||||
|
||||
1. Ειδικά πρότυπα (special patterns)
|
||||
2. Κανονικές παραστάσεις (regular expression patterns)
|
||||
3. Σχεσιακές εκφράσεις (comparison patterns)
|
||||
|
||||
### [3.1 Ειδικά πρότυπα]{#ss3.1}
|
||||
|
||||
Η awk περιλαμβάνει δύο ειδικά πρότυπα: το **BEGIN** και το **END**. Η πράξη που ακολουθεί το πρότυπο **BEGIN** εκτελείται πρίν διαβαστεί οποιαδήποτε γραμμή του
|
||||
αρχείου. Για αυτόν τον λόγο, το **BEGIN** χρησιμοποιείται συνήθως για εκτύπωση επικεφαλίδων ή για αρχική καταχώρηση σε μία μεταβλητή. Η πράξη που ακολουθεί το
|
||||
**END** εκτελείται όταν έχουν επεξεργαστεί όλες οι γραμμές από το αρχείο.
|
||||
|
||||
Τα πρότυπα **BEGIN** και **END** είναι εντελώς προαιρετικά. Τα χρησιμοποιείτε αν θέλετε. Όμως, αν τα χρησιμοποιήσετε τότε μπορείτε να τα έχετε μόνο μιά φορά
|
||||
μέσα στο πρόγραμμά σας. Μην χρησιμοποιήσετε δύο **BEGIN** ή δύο **END**. Παράδειγμα για τα **BEGIN** και **END** θα δούμε παρακάτω, όταν μιλήσουμε για
|
||||
μεταβλητές.
|
||||
|
||||
### [3.2 Πρότυπα κανονικών παραστάσεων]{#ss3.2}
|
||||
|
||||
Κανονική παράσταση είναι μία σειρά χαρακτήρων που περικλείονται ανάμεσα σε ζευγάρι από / (slash). Για παράδειγμα, αν εκτελέσετε την:
|
||||
|
||||
gawk '/linux/' my_doc.txt
|
||||
|
||||
τότε θα εμφανιστούν στην οθόνη όλες οι γραμμές του αρχείου my\_doc.txt που περιέχουν τη λέξη linux.
|
||||
|
||||
Οι κανονικές παραστάσεις της gawk αποτελούνται από χαρακτήρες (όπως τα γράμματα της αλφαβήτου) και από μεταχαρακτήρες (metacharacters). Οι μεταχαρακτήρες είναι
|
||||
και αυτοί χαρακτήρες που έχουν ειδικό νόημα: δεν χρησιμοποιούνται για \"ταίριασμα\" με πεδίο ή εγγραφή ενός αρχείου, αλλά εκτελούν μιά συγκεκριμένη λειτουργία.
|
||||
Ας δούμε, λοιπόν, έναν πίνακα με τους μεταχαρακτήρες και την συμπεριφορά τους:
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
\ **Συμπεριφορά**
|
||||
**Μεταχαρακτήρας**
|
||||
|
||||
\\ Ακυρώνει την έννοια του ειδικού χαρακτήρα που ακολουθεί την backslash,\
|
||||
οπότε ο ειδικός χαρακτήρας αντιμετωπίζεται σαν απλός
|
||||
|
||||
\^ Σύγκριση (matching) στην αρχή της γραμμής
|
||||
|
||||
\$ Σύγκριση στο τέλος της γραμμής
|
||||
|
||||
/\^\$/ Σύγκριση για κενή γραμμή
|
||||
|
||||
. Συγκρίνει οποιονδήποτε απλό χαρακτήρα
|
||||
|
||||
\[ΑΒΓ\] Συγκρίνει για οποιονδήποτε από τους Α, Β ή Γ
|
||||
|
||||
\[Α-Γα-γ\] Συγκρίνει για οποιονδήποτε από τους Α, Β, Γ, α, β, ή γ
|
||||
|
||||
\[\^ΑΒΓ\] Συγκρίνει για οποιονδήποτε άλλο χαρακτήρα εκτός των Α, Β ή Γ
|
||||
|
||||
Linux\|System Συγκρίνει για την λέξη Linux ή για την System (λογικό OR)
|
||||
|
||||
\[ΑΒΓ\]\[ΔΕΖ\] Συγκρίνει για τους Α, Β ή Γ, οι οποίοι όμως,θα πρέπει να ακολουθούνται\
|
||||
από οποιονδήποτε των Δ, Ε ή Ζ
|
||||
|
||||
\[XYZ\]\* Συγκρίνει για καμμία ή περισσότερες εμφανίσεις της παράστασης\[XYZ\]
|
||||
|
||||
\[XYZ\]+ Συγκρίνει για μία ή περισσότερες εμφανίσεις της παράστασης\[XYZ\]
|
||||
|
||||
\[XYZ\]? Συγκρίνει για καμμία ή μία εμφάνιση της παράστασης\[XYZ\]
|
||||
|
||||
() Συνδυάζει κανονικές παραστάσεις. Π.χ. το (ανα\|δια)λύω συγκρίνει για να\
|
||||
βρεί είτε τη λέξη αναλύω είτε τη λέξη διαλύω
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
|
||||
#### Παραδείγματα
|
||||
|
||||
Ας δούμε την παρακάτω κανονική παράσταση:
|
||||
|
||||
/[Mm]agaz|interesting$/
|
||||
|
||||
Αυτή η παράσταση αναζητά τις γραμμές στις οποίες βρίσκονται οι λέξεις Magaz ή magaz (σε οποιοδήποτε σημείο της γραμμής) ή interesting (στο τέλος της γραμμής).
|
||||
|
||||
Ας δούμε άλλη μία παράσταση:
|
||||
|
||||
/[Mm][Aa][Gg][Aa][Zz]/
|
||||
|
||||
Αυτή η παράσταση αναζητά τις γραμμές στις οποίες βρίσκεται η λέξη magaz ΜΕ ΟΠΟΙΟΝΔΗΠΟΤΕ τρόπο γραμμένη, δηλαδή μπορεί να \"ξεθάψει\" την λέξη ακόμα και αν αυτή
|
||||
είναι γραμμένη με έναν από τους συνολικά 32 τρόπους!! (δηλ. Magaz, MAgaz, MAGaz, MAGAz, MAGAZ, mAgaz κ.ο.κ.)
|
||||
|
||||
### [3.3 Πρότυπα σχεσιακών εκφράσεων]{#ss3.3}
|
||||
|
||||
Με τις σχεσιακές εκφράσεις γίνεται σύγκριση αριθμών ή αλφαριθμητικών (strings). H σύγκριση γίνεται με τους σχεσιακούς τελεστές, οι οποίοι είναι παρόμοιοι με
|
||||
αυτούς της C και των φλοιών (shells) του UNIX. Μέχρι τώρα είδαμε πως οι κανονικές παραστάσεις \"σαρώνουν\" όλη τη γραμμή για να βρούν αυτό που ζητάμε. Μπορούμε,
|
||||
όμως, να συνδυάσουμε τις κανονικές παραστάσεις με τις σχεσιακές εκφράσεις για να \"ψάξουμε\" σε συγκεκριμένα πεδία. Ας δούμε πρώτα όμως, έναν πίνακα με τους
|
||||
σχεσιακούς τελεστές:
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
\ **Ερμηνεία**
|
||||
**Τελεστής**
|
||||
|
||||
== Ίσο με
|
||||
|
||||
\< Μικρότερο
|
||||
|
||||
\> Μεγαλύτερο
|
||||
|
||||
\<= Μικρότερο ή ίσο
|
||||
|
||||
\>= Μεγαλύτερο ή ίσο
|
||||
|
||||
!= Διάφορο του
|
||||
|
||||
\~ Ίσο με την ακόλουθη κανονική παράσταση
|
||||
|
||||
!\~ Διάφορο της ακόλουθης κανονικής παράστασης
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
|
||||
#### Παραδείγματα
|
||||
|
||||
Ας δούμε ένα \"τυπικό\" παράδειγμα εφαρμογής των παραπάνω τελεστών:
|
||||
|
||||
$1 == "Linux" { print "Linux Rocks!!" }
|
||||
|
||||
Η παραπάνω εντολή ελέγχει αν το πρώτο πεδίο είναι η λέξη Linux και αν είναι εκτελεί την πράξη, δηλαδή στην περίπτωσή μας εμφανίζει στην οθόνη το μήνυμα Linux
|
||||
Rocks!! Προσέξτε ότι εδώ τα πράγματα είναι όπως ακριβώς φαίνονται, δηλαδή αν το πρώτο πεδίο είναι η λέξη linux (το l όχι κεφαλαίο όπως το δηλώσαμε), τότε δεν θα
|
||||
εκτελεστεί η πράξη. Επομένως, ας δούμε τη χρησιμότητα του συνδυασμού της κανονικής παράστασης με τις σχεσιακές εκφράσεις:
|
||||
|
||||
\$6 !\~ /\[Mm\]\[Aa\]\[Gg\]\[Aa\]\[Zz\]/ { print \"we have no magaz\" }
|
||||
|
||||
Η παραπάνω εντολή ελέγχει αν το 6ο πεδίο περιέχει τη λέξη magaz (όπως και αν είναι γραμμένη) και όταν δεν τη βρεί τυπώνει αυτό που περιέχεται στα εισαγωγικά της
|
||||
print.
|
||||
|
||||
### [3.4 Λογικοί Τελεστές]{#ss3.4}
|
||||
|
||||
Οι λογικοί τελεστές που χρησιμοποιούνται στην awk είναι παρόμοιοι με αυτούς της C. Χρησιμοποιούμε τους τελεστές αυτούς για να συνδυάσουμε πρότυπα (σχεσιακές
|
||||
εκφράσεις ή κανονικές παραστάσεις) ώστε να \"συνθέσουμε\" μιά πολύπλοκη μορφή λογικής. Ας δούμε έναν πίνακα με τους λογικούς τελεστές:
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
\ **Ερμηνεία**
|
||||
**Τελεστής**
|
||||
|
||||
&& Λογικό ΚΑΙ (AND)
|
||||
|
||||
\|\| Λογικό Η (OR)
|
||||
|
||||
! Λογικό ΟΧΙ (NOT)
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
|
||||
Ας δούμε ένα παράδειγμα:
|
||||
|
||||
$3 == "Linux" && $18 == "Magaz" {print "Μήνυμα εξόδου")
|
||||
|
||||
Εδώ, το πρότυπό μας, στην περίπτωση που το 3ο πεδίο είναι η λέξη Linux ΚΑΙ το 18ο πεδίο η λέξη Magaz, τυπώνει στην οθόνη το μήνυμα.
|
||||
|
||||
### [3.5 Διάστημα προτύπων]{#ss3.5}
|
||||
|
||||
Μπορείτε στη θέση ενός προτύπου να χρησιμοποιήσετε ένα διάστημα προτύπων. Το διάστημα προτύπων είναι δύο πρότυπα, τα οποία χωρίζονται με κόμμα (,) και
|
||||
χρησιμεύουν στο εξής: Η πράξη που τα ακολουθεί, εφαρμόζεται σε όλες εκείνες τις γραμμές που βρίσκονται ανάμεσα στη γραμμή που εμφανίζεται το πρώτο πρότυπο και
|
||||
στη γραμμή που εμφανίζεται το δεύτερο πρότυπο. Παράδειγμα:
|
||||
|
||||
/Linux/,/Magaz/
|
||||
|
||||
Η gawk θα αναζητήσει εκείνες τις γραμμές, από εκείνη που εμφανίζεται η λέξη Linux μέχρι εκείνη που εμφανίζεται η λέξη Magaz.
|
||||
|
||||
|
||||
### [4. Πράξεις]{#s4}
|
||||
|
||||
### [4.1 Εισαγωγή]{#ss4.1}
|
||||
|
||||
Οι πράξεις είναι αυτές που λένε στην awk \"τί να κάνει\" όταν το πρότυπο ταιριάξει με αυτό που του ζητήσαμε. Μία πράξη αποτελείται από μία ή περισσότερες
|
||||
εντολές, οι οποίες μοιάζουν πάρα πολύ με τις εντολές τις C. Μία πράξη μπορεί να περιέχει:
|
||||
|
||||
- Μεταβλητές
|
||||
- Πίνακες
|
||||
- Ενσωματωμένες συναρτήσεις (αλφαριθμητικές και αριθμητικές)
|
||||
- Εντολές ελέγχου ροής
|
||||
- Εκτυπώσεις
|
||||
|
||||
Οι πράξεις γράφονται μέσα σε αγκύλες ({}). Ο μόνος περιορισμός που έχετε, είναι να γράψετε την πρώτη αγκύλη στην ίδια γραμμή με το πρότυπο. Αυτός, βέβαια, είναι
|
||||
ο μόνος σας περιορισμός.
|
||||
|
||||
Υπάρχουν κανόνες για τον τρόπο με τον οποίο γράφετε ένα awk script. Ευτυχώς, οι κανόνες αυτοί είναι σχεδόν ίδιοι με τους κανόνες της C: γενικά, στην συγγραφή
|
||||
ενός προγράμματος, έχετε μιά ελευθερία με τα κενά, τις γραμμές κλπ. Ας τα δούμε, όμως, από την αρχή. Μέσα σε ένα script, οι κενές γραμμές αγνοούνται. Οι εντολές
|
||||
που γράφετε μπορούν είτε να είναι στην ίδια γραμμή είτε σε διαφορετική. Η awk αναγνωρίζει τα κενά με τον ίδιο τρόπο που τα αναγνωρίζει η C. Οι επόμενες δύο
|
||||
γραμμές είναι ακριβώς οι ίδιες:
|
||||
|
||||
$1=="Linux"{print"μήνυμα 1"}
|
||||
|
||||
$1 == "Linux" { print "μήνυμα 1" }
|
||||
|
||||
Εννοείται πάντως, πως διαφόρων ειδών κενά μέσα στα εισαγωγικά δεν αγνοούνται. Τα υπόλοιπα κενά (μέσα στον κώδικα) αγνοούνται. Μπορείτε επίσης, να \"σπάτε\" τις
|
||||
εντολές σε πολλές γραμμές:
|
||||
|
||||
$1 == "Linux" {
|
||||
print "μήνυμα 1"
|
||||
}
|
||||
|
||||
Μπορείτε να έχετε πολλές διαφορετικές πράξεις μέσα στις αγκύλες ({}). Μπορείτε να τις χωρίζετε με το ελληνικό ερωτηματικό (;):
|
||||
|
||||
$1 == "Linux" {print "μήνυμα 1"; print "μήνυμα 2"; print μήνυμα 3";}
|
||||
|
||||
Όμως, έχετε τη δυνατότητα να μην χρησιμοποιήσετε το ελληνικό ερωτηματικό, αλλά να γράψετε κάθε εντολή της πράξης σε διαφορετική γραμμή. Το ακόλουθο παράδειγμα
|
||||
έχει το ίδιο αποτέλεσμα με το παραπάνω:
|
||||
|
||||
$1 == "Linux" {
|
||||
print "μήνυμα 1"
|
||||
print "μήνυμα 2"
|
||||
print "μήνυμα 3"
|
||||
}
|
||||
|
||||
Επίσης, μπορείτε να έχετε σχόλια (comments) μέσα στο script σας. Αυτό μπορείτε να το κάνετε χρησιμοποιώντας το σύμβολο **\#** μπροστά από κάθε γραμμή σχόλιου.
|
||||
|
||||
### [4.2 Μεταβλητές]{#ss4.2}
|
||||
|
||||
Οι μεταβλητές σας χρειάζονται, φυσικά, για να έχετε τη δυνατότητα να αποθηκεύετε δεδομένα μέσα σε ένα πρόγραμμα. Υπάρχουν τριών ειδών μεταβλητές στην awk:
|
||||
|
||||
- Μεταβλητές πεδίου
|
||||
- Προκαθορισμένες μεταβλητές
|
||||
- Καθορισμένες από το χρήστη μεταβλητές
|
||||
|
||||
Από όλα αυτά τα είδη έχουμε δεί παραδείγματα των πρώτων δύο ειδών. Τις μεταβλητές πεδίου, όπως το \$1 και τις προκαθορισμένες μεταβλητές, όπως το NF κ.α.
|
||||
|
||||
Οι μεταβλητές που ορίζονται από το χρήστη είναι, όπως θα καταλάβατε, οι μεταβλητές που δημιουργείτε εσείς μέσα σε ένα πρόγραμμα για να σας εξυπηρετήσουν σε έναν
|
||||
συγκεκριμένο σκοπό. Ένα πλεονέκτημα της awk είναι πως δεν χρειάζετε να ορίσετε τον τύπο της μεταβλητής που θα δημιουργήσετε. Δεν είναι π.χ. όπως στη C (και σε
|
||||
άλλες) που ορίζετε το αν μία συγκεκριμένη μεταβλητή είναι integer, float, char κλπ. Στην awk απλά χρησιμοποιείτε την μεταβλητή (θυμάστε την BASIC ? :-) H awk
|
||||
καταλαβαίνει τον τύπο της μεταβλητής, από το πώς αυτή χρησιμοποιείται μέσα στο πρόγραμμα. Αν για παράδειγμα, μέσα σε μιά μεταβλητή συμπεριλάβετε γράμματα και/ή
|
||||
αριθμούς, τότε αυτή η μεταβλητή αναγνωρίζεται ως αλφαριθμητικό. Αν χρησιμοποιήσατε μόνο αριθμούς, τότε αυτή αναγνωρίζεται ως αριθμητική μεταβλητή.
|
||||
|
||||
Όπως και στη C, τα ονόματα των μεταβλητών που χρησιμοποιείτε ΠΡΕΠΕΙ να αρχίζουν με αλφαβητικό χαρακτήρα ή με μία κάτω παύλα/underscore (\_). Για το υπόλοιπο
|
||||
όνομα της μεταβλητής μπορείτε να χρησιμοποιήσετε γράμματα, underscores ή αριθμούς. Οι αλφαβητικοί χαρακτήρες μπορούν να είναι είτε κεφαλαία είτε μικρά γράμματα.
|
||||
Φυσικά, σε αυτό το σημείο πάντα δίνονται δύο (κλασσικές) συμβουλές: Η μία είναι να δίνετε στις μεταβλητές ονόματα περιγραφικά (δηλαδή, να καταλαβαίνει κάποιος
|
||||
τί είναι το περιεχόμενό τους από το όνομά τους). Η δεύτερη συμβουλή είναι να αποφεύγετε όσο μπορείτε να γράφετε τις μεταβλητές με κεφαλαία γράμματα γιατί, όπως
|
||||
θα δούμε παρακάτω, οι προκαθορισμένες μεταβλητές της awk είναι με κεφαλαία γράμματα, οπότε μπορεί εύκολα να γίνει λάθος.
|
||||
|
||||
Λοιπόν, ας δούμε τώρα έναν πίνακα με τις προκαθορισμένες (built-in variables) μεταβλητές της awk. Ο πίνακας έχει 3 στήλες. Στην 3η στήλη αναγράφεται, αν
|
||||
υπάρχει, η default τιμή μιας μεταβλητής. Επίσης, να τονίσω ότι πολλές από τις παρακάτω μεταβλητές δεν υπάρχουν σε προηγούμενες εκδόσεις της awk (άλλωστε μιλάμε
|
||||
για gawk):
|
||||
|
||||
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
|
||||
\ **Σημασία** **Default Τιμή**
|
||||
**Μεταβλητή**
|
||||
|
||||
ARGC Ο αριθμός των παραμέτρων που δίνονται στην γραμμή
|
||||
εντολών
|
||||
|
||||
ARGV Πίνακας με όλες τις παραμέτρους που δίνονται στην
|
||||
γραμμή εντολών
|
||||
|
||||
CONVFMT Η μορφή που η awk \"διαβάζει\" τους αριθμούς %.6g
|
||||
|
||||
ENVIRON Οι μεταβλητές περιβάλλοντος του UNIX
|
||||
|
||||
ERRNO Τα μηνύματα λάθους του UNIX
|
||||
|
||||
FILENAME Το όνομα του τρέχοντος αρχείου εισόδου
|
||||
|
||||
FNR Ο τρέχων αριθμός εγγραφής
|
||||
|
||||
FS Ο διαχωριστής πεδίων Space
|
||||
|
||||
IGNORECASE Ελέγχει την case sensitivity 0 (δηλ. υπάρχει case sensitivity)
|
||||
|
||||
NF Ο αριθμός των πεδίων στην τρέχουσα εγγραφή
|
||||
|
||||
NR Ο αριθμός των εγγραφών
|
||||
|
||||
OFMT Η μορφή εξόδου των αριθμών %.6g
|
||||
|
||||
OFS Ο διαχωριστής πεδίων για την έξοδο Space
|
||||
|
||||
ORS Ο διαχωριστής εγγραφών της εξόδου Newline
|
||||
|
||||
RS Ο διαχωριστής εγγραφών της εισόδου Newline
|
||||
|
||||
|
||||
----------------------------------------------------- ----------------------------------------------------- -----------------------------------------------------
|
||||
|
||||
#### Αναλυτικά
|
||||
|
||||
- Η πρώτη παράμετρος που δίνετε στην γραμμή εντολών συμβολίζεται με ARGV\[0\], ενώ η τελευταία παράμετρος είναι η ARGV\[ARGC-1\]. Για την ακρίβεια, η πρώτη
|
||||
\"παράμετρος\" που δίνουμε στην γραμμή εντολών είναι η ίδια η gawk. Αρα ARGV\[0\]=\"gawk\"
|
||||
|
||||
- Ας μιλήσουμε τώρα για εκείνη την παράμετρο **-Fx** που είδαμε στην σύνταξη της εντολής gawk. Εξ ορισμού, τα πεδία ξεχωρίζουν από τα κενά (ανεξάρτητου μήκους
|
||||
κενά) μεταξύ τους. Τί γίνεται, όμως, αν θέλετε να επεξεργαστείτε ένα αρχείο σαν το /etc/passwd το οποίο δεν περιέχει κενά, αλλά παρόλα αυτά περιέχει πολλά
|
||||
πεδία με πληροφορίες; Εδώ θα χρειαστεί να χρησιμοποιήσετε διαφορετικό από τον εξ ορισμού διαχωριστή πεδίων (field seperator). Αυτό μπορείτε να το κάνετε με
|
||||
την παράμετρο **-Fx** όπου στη θέση του **x** θα βάλετε τον διαχωριστή που θέλετε. Για παράδειγμα, στο αρχείο /etc/passwd, σίγουρα θα θέλετε τα πεδία να
|
||||
ξεχωρίζουν με το σύμβολο της άνω και κάτω τελείας (:). Επομένως, αρκεί να χρησιμοποιήσετε την παράμετρο **-F:**
|
||||
|
||||
Υπάρχει, όμως, εναλλακτικός τρόπος να ορίσετε τον διαχωριστή. Η μεταβλητή **FS** χρησιμοποιείται από την awk για αυτόν ακριβώς το λόγο. Επομένως, έχετε τη
|
||||
δυνατότητα να χρησιμοποιήσετε αυτήν την μεταβλητή σε συνδυασμό με το ειδικό πρότυπο **BEGIN**. Π.χ. πρίν γράψετε οτοδήποτε άλλο στον κώδικά σας, μπορείτε να
|
||||
γράψετε το:
|
||||
|
||||
BEGIN { FS = ":" }
|
||||
|
||||
- Θα καταλάβετε την μεταβλητή ENVIRON με το ακόλουθο παράδειγμα:
|
||||
|
||||
ENVIRON["TERM"] == "vt100" { print "Δουλεύετε σε VT100 !!" }
|
||||
|
||||
Η παραπάνω εντολή ελέγχει αν είστε σε VT100 τερματικο και, αν είστε, τυπώνει το μήνυμα.
|
||||
|
||||
- Είδατε δύο Default τιμές να είναι \"%.6g\". Για το τί σημαίνει αυτή η τιμή (και γενικά τιμές τέτοιου τύπου) θα μιλήσουμε όταν αναφερθούμε στις εκτυπώσεις
|
||||
και, συγκεκριμένα, όταν αναφερθούμε στην \"printf\" (στο 2ο μέρος).
|
||||
|
||||
### [4.3 Αλφαριθμητικά]{#ss4.3}
|
||||
|
||||
Εδώ θα σας δώσω ένα παράδειγμα \"μεταχείρισης\" αλφαριθμητικών (άλλωστε, σε προηγούμενα παραδείγματα, θα έχετε ήδη καταλάβει τί/πώς/πού/κλπ. είναι τα
|
||||
αλφαριθμητικα). Στη συνέχεια, θα μιλήσουμε για τις αλφαριθμητικές ενσωματωμένες συναρτήσεις και στο τέλος θα σας δώσω έναν πίνακα με ειδικές αλφαριθμητικές
|
||||
σταθερές.
|
||||
|
||||
Τα αλφαριθμητικά πάντα γράφονται μέσα σε ζευγάρι διπλών εισαγωγικών (\"). Ένα αλφαριθμητικό μπορεί να περιέχει οποιουσδήποτε χαρακτήρες. Να σημειώσω πως αν
|
||||
χρησιμοποιήσετε ΜΟΝΟ αριθμούς (π.χ. το \"156\") για ένα αλφαριθμητικό, τότε αυτόματα η awk το χρησιμοποιεί σαν αριθμητική μεταβλητή. Αντίθετα, αν έχετε ένα
|
||||
αλφαριθμητικό (με χαρακτήρες ή ακόμα και \"μορφοποιημένο\" αριθμό: π.χ. \"+30 972 66 55 44\" \<\-- το οποίο για την gawk είναι αλφαριθμητικό, αφού περιέχει κενά
|
||||
(\" \"). Προσέξτε, το \"+\" επιτρέπεται, όπως και το \"-\" σε αριθμητικές μεταβλητές) και προσπαθήσετε να κάνετε μιά αλγεβρική πράξη με αυτό (πρόσθεση,
|
||||
αφαίρεση, κλπ \...) τότε η awk θα προσπαθήσει να μετατρέψει το αλφαριθμητικό σε αριθμητική μεταβλητή και, πολύ απλά, θα του δώσει την αριθμητική τιμή 0 (μηδέν).
|
||||
Ας δούμε το παράδειγμα:
|
||||
|
||||
$ gawk 'BEGIN {x="αβγ""δεζ" ; y = "magaz"; z=x y; z2 = "A"x"LINUX"y"END"; print x, y, z, z2}'
|
||||
αβγδεζ magaz αβγδεζmagaz AαβγδεζLINUXmagazEND
|
||||
|
||||
Είδατε, λοιπόν, πως μπορούμε να \"συνδυάσουμε\" αλφαριθμητικά. Είδατε επίσης, στη μεταβλητή x, πώς δεν είναι ανάγκη να συμπεριλάβουμε όλους τους χαρακτήρες στο
|
||||
ίδιο ζεύγος εισαγωγικών. Ακόμα, στο τέλος, αν δεν είχαμε χρησιμοποιήσει το κόμμα (,) ανάμεσα στις μεταβλητές στην εντολή print, αυτό που θα μας έδινε η έξοδος
|
||||
θα ήταν:\
|
||||
αβγδεζmagazαβγδεζmagazAαβγδεζLINUXmagazEND
|
||||
|
||||
Ας δούμε τώρα τον πίνακα με τις συναρτήσεις. Και πάλι, μερικές από αυτές μπορεί να μην δουλεύουν σε παλιότερες εκδόσεις awk:
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
\ **Ερμηνεία**
|
||||
**Συνάρτηση**
|
||||
|
||||
index(s1, s2) Επιστρέφει την θέση (από αριστερά) του αλφαριθμητικού s2 στο αλφαριθμητικό s1
|
||||
|
||||
length(string) Μετρά τον αριθμό χαρακτήρων του string
|
||||
|
||||
split(string, πίνακας, διαχωριστής) Δείτε παρακάτω, στα αναλυτικά
|
||||
|
||||
substr(string, m, n) Επιστρέφει εκείνο το τμήμα του αλφαριθμητικού string που αρχίζει από\
|
||||
τη θέση m και έχει n χαρακτήρες
|
||||
|
||||
tolower(string) Επιστρέφει το string με μικρούς χαρακτήρες
|
||||
|
||||
toupper(string) Επιστρέφει το string με κεφαλαίους χαρακτήρες
|
||||
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
|
||||
#### Αναλυτικά
|
||||
|
||||
- Η split(string, πίνακας, διαχωριστής) καταχωρεί τα τμήματα του αλφαριθμητικού string που χωρίζονται μεταξύ τους με τον χαρακτήρα \"διαχωριστή\", στα
|
||||
στοιχεία πίνακας\[1\], πίνακας\[2\], \... , πίνακας\[ν\] του πίνακα και επιστρέφει το ν. Αν δεν υπάρχει ο \"διαχωριστής\", τότε χρησιμοποιείται η μεταβλητή
|
||||
FS. Παράδειγμα:
|
||||
|
||||
number = split("29/3/2000", array, "/")
|
||||
|
||||
Λοιπόν, μετά την εκτέλεση της εντολής θα έχουμε: array\[1\]=29, array\[2\]=3, array\[3\]=2000. H μεταβλητή number θα έχει την τιμή 3.
|
||||
|
||||
- Ας δούμε και ένα παράδειγμα για την substr. Έχουμε:
|
||||
|
||||
var=substr("Linux", 3, 2)
|
||||
|
||||
Μετά την εκτέλεση της εντολής, η μεταβλητή var θα περιέχει το αλφαριθμητικό \"nu\".
|
||||
|
||||
Παρακάτω, βλέπετε έναν πίνακα με ειδικές αλφαριθμητικές σταθερές, τις οποίες μπορείτε να χρησιμοποιήσετε μέσα σε ένα αλφαριθμητικό για συγκεκριμένες,
|
||||
εξειδικευμένες \"εκτυπώσεις\". Π.χ. αν θα θέλατε μέσα σε ένα αλφαριθμητικό να χρησιμοποιήσετε τα διπλά εισαγωγικά (\") τότε θα πρέπει να γράψετε πρίν από αυτά
|
||||
την backslash (\\) ώστε να μην \"μπερδευτεί\" η awk με τα εισαγωγικά που περιβάλλουν το αλφαριθμητικό:
|
||||
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
\ **Σημασία**
|
||||
**Σταθερά**
|
||||
|
||||
\\\\ Παριστάνει την ίδια την backslash
|
||||
|
||||
\\a Ο χαρακτήρας alert ή bell (Θα ηχήσει το speaker)
|
||||
|
||||
\\b Backspace
|
||||
|
||||
\\f Formfeed
|
||||
|
||||
\\n Newline
|
||||
|
||||
\\r Carriage return
|
||||
|
||||
\\t Tab
|
||||
|
||||
\\v Vertical Tab
|
||||
|
||||
\\\" Παριστάνει τα εισαγωγικά
|
||||
|
||||
\\xYY Δείχνει ότι ο ΥΥ είναι δεκαεξαδικός αριθμός
|
||||
|
||||
\\0YYY Δείχνει ότι ο ΥΥΥ είναι οκταδικός αριθμός
|
||||
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
|
||||
|
||||
### [4.4 Πίνακες]{#ss4.4}
|
||||
|
||||
Όταν έχετε πολλά δεδομένα (π.χ. τιμές) που αφορούν στο ίδιο θέμα, τότε έχετε 2 επιλογές: είτε θα χρησιμοποιήσετε πολλές μεταβλητές, είτε θα χρησιμοποιήσετε έναν
|
||||
πίνακα, ο οποίος σας επιτρέπει να έχετε συγκεντρωμένα πολλά δεδομένα. Ένας πίνακας αποτελείται από το όνομά του και τα στοιχεία του. Συμβολίζεται κάπως έτσι:
|
||||
όνομα\[στοιχείο\].
|
||||
|
||||
Προσοχή!! Οι πίνακες στην awk έχουν ειδικές ικανότητες, οι οποίες δεν παρουσιάζονται στις περισσότερες γλώσσες προγραμματισμού. Είναι δυναμικοί πίνακες, πράγμα
|
||||
που σημαίνει πως ξεφεύγουμε από το μαθηματικό μοντέλο του πίνακα (αν και πρέπει πάντα να το έχουμε στο μυαλό μας) καταργώντας τα \"αριθμημένα\" στοιχεία, δηλαδή
|
||||
τις *διαστάσεις του πίνακα*. Το στοιχείο του πίνακα στην awk συμβολίζεται με αλφαριθμητικό!! Δεν χρειάζετε να δηλώνετε για μία συγκεκριμένη μεταβλητή πως είναι
|
||||
πίνακας (όπως κάνουμε στη C), οπότε δεν δηλώνουμε εκ των προτέρων το μέγεθος που έχει ο πίνακάς μας. Όταν χρησιμοποιείτε ένα καινούριο στοιχείο για πρώτη φορά,
|
||||
τότε αυτό δυναμικά προστίθεται στον πίνακά μας. Ας δούμε δύο παραδείγματα πινάκων:
|
||||
|
||||
magaz_subject["Linux"] = 1
|
||||
magaz_subject["gardening"] = 0
|
||||
|
||||
Αν θα θέλαμε να κάνουμε το ίδιο σε άλλη γλώσσα προγραμματισμού, τότε θα έπρεπε να έχουμε 2 διαφορετικούς πίνακες, όπου στον έναν να είχαμε διάφορα θέματα και
|
||||
στον άλλον πίνακα, στα ίδια στοιχεία να βάζαμε την τιμή 0 ή 1 (ανάλογα αν ανταποκρίνεται το magaz στα θέματα αυτά), οπότε κάθε φορά να κάναμε \"αντιστοίχιση\"
|
||||
των πινάκων. Δηλαδή, για το παραπάνω παράδειγμα, ο ένας πίνακας ας υποθέσουμε ότι στη θέση 5 (στοιχείο 5 / array\[5\]) περιείχε το αλφαριθμητικό \"Linux\" και
|
||||
στη θέση 6 το αλφαριθμητικό \"gardening\". Ο δεύτερος πίνακας θα είχε στη θέση 5 το 1 και στη θέση 6 το 0.
|
||||
|
||||
Η τακτική αυτή στην awk (δηλαδή η χρήση αλφαριθμητικού για στοιχείο) είναι \"λιγότερο προγραμματιστική-μαθηματική\" αλλά ευκολότερη στο διάβασμα. Η τακτική αυτή
|
||||
οφείλεται για το γεγονός ότι η awk δεν υποστηρίζει άμεσα πολυδιάστατους πίνακες.
|
||||
|
||||
#### Συναρτήσεις πινάκων
|
||||
|
||||
Η awk περιλαμβάνει 2 συναρτήσεις για τους πίνακες: την in και την delete. Η συνάρτηση in ελέγχει την ύπαρξη ενός στοιχείου του πίνακα. Η delete σβήνει ένα
|
||||
στοιχείο από έναν πίνακα.
|
||||
|
||||
Για παράδειγμα, μπορούμε να χρησιμοποιήσουμε την παρακάτω εντολή μέσα σε έναν βρόγχο if (τους οποίους θα δούμε στο 2ο μέρος) για να εξετάσουμε μιά ύπαρξη και να
|
||||
εκτελέσουμε, ανάλογα, μιά πράξη:
|
||||
|
||||
"Linux" in magaz_subject
|
||||
|
||||
Ομοίως, χρησιμοποιούμε την συνάρτηση delete:
|
||||
|
||||
delete magaz_subject["gardening"]
|
||||
|
||||
Προσέξτε, ότι όταν χρησιμοποιείτε την delete, το στοιχείο σβήνεται από την περιοχή μνήμης. Τα δεδομένα δεν μπορούν να ανακτηθούν. Προσέξτε όμως, πως δεν
|
||||
μπορείτε να χρησιμοποιήσετε την delete κάπως έτσι: delete magaz\_subject. Δεν μπορείτε να σβήσετε ολόκληρο τον πίνακα, αλλά μόνο τα στοιχεία του.
|
||||
|
||||
#### Πολυδιάστατοι Πίνακες
|
||||
|
||||
Είπαμε πως η awk δεν υποστηρίζει άμεσα πολυδιάστατους πίνακες, αλλά τους \"εξομοιώνει\". Το γεγονός αυτό, δεν σας επηρεάζει ως προγραμματιστές. Εσείς προχωράτε
|
||||
κανονικά και δηλώνετε τους πολυδιάστατους πίνακες όπως ακριβώς και στη C, δηλαδή:
|
||||
|
||||
magaz_subject[6, 2] = "Linux"
|
||||
|
||||
Εννοείται πως μπορείτε να χρησιμοποιήσετε τις in και delete όπως ακριβώς και στους μονοδιάστατους.
|
||||
|
223
content/articles/23/04_perldbi.md
Κανονικό αρχείο
223
content/articles/23/04_perldbi.md
Κανονικό αρχείο
|
@ -0,0 +1,223 @@
|
|||
+++
|
||||
title = 'DataBaseInterface για Perl'
|
||||
date = '2000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Μιχάλης Καμπριάνης(mailto:kabrianis@hellug.gr)'
|
||||
issue = ['Magaz 23']
|
||||
issue_weight = 4
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Σε αυτό το μικρό αρθράκι θα κάνουμε μία πρώτη και επιφανειακή προσέγγιση σε προγραματισμό Perl για Databases μέσω του DBI interface*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Η Perl είναι μία interpreted γλώσσα όπως όλοι ξέρουν. Και ως interpreted θεωρείται από αρκετούς \"κακή\" γλώσσα. Από την άλλη, είναι εξαιρετικά απλή σε σύνταξη.
|
||||
Και επειδή είναι εξαιρετικά απλή, υπάρχουν εκατοντάδες προγραμματιστές που την επεκτείνουν, σε τομείς για τους οποίους δεν είχε σχεδιαστεί. Ένας από αυτούς τους
|
||||
τομείς είναι οι DataBases.
|
||||
|
||||
**1. Τι παρέχει το DBI**
|
||||
--------------------------------------------------
|
||||
|
||||
**2. Τι ΔΕΝ παρέχει το DBI**
|
||||
------------------------------------------------------
|
||||
|
||||
**3. Συνηθισμένες συναρτήσεις**
|
||||
---------------------------------------------------------
|
||||
|
||||
- [3.1 Connect](#ss3.1)
|
||||
- [3.2 Select](#ss3.2)
|
||||
- [3.3 Insert](#ss3.3)
|
||||
- [3.4 Delete](#ss3.4)
|
||||
- [3.5 Update](#ss3.5)
|
||||
- [3.6 Do αντί για prepare() και execute()](#ss3.6)
|
||||
- [3.7 Finsh και Disconnect](#ss3.7)
|
||||
|
||||
**4. \`Αλλα καλούδια**
|
||||
------------------------------------------------
|
||||
|
||||
**5. Βιβλιογραφία**
|
||||
---------------------------------------------
|
||||
|
||||
|
||||
### [1. Τι παρέχει το DBI]{#s1}
|
||||
|
||||
Το module DBI (Database Interface) παρέχει τη δυνατότητα στην perl να μιλάει με μία database. Το module αυτό παρέχει κάποιες functions οι οποίες μιλάνε με
|
||||
κάποιο underlying module, το οποίο λέγεται DBD. Υπάρχει ξεχωριστό DBD για κάθε βάση δεδομένων (π.χ. MySQL, Postgres, Oracle κλπ), και δεν παρέχουν όλα τις ίδιες
|
||||
δυνατότητες, αλλά με την χρήση του DBI είσαστε λίγο-πολύ σίγουροι ότι ο κώδικας σας μεταφέρεται από την μία Database στην άλλη, χωρίς να ξαναγραφτούν όλες οι
|
||||
functions από την αρχή. Ειδικά αν η SQL που γράφετε είναι \"κανονική\" SQL και όχι specific-database-enhanced SQL, είναι πολύ εύκολο (από πλευράς προγράμματος
|
||||
και μόνο) να αλλάξετε βάση, ή να διανείμετε τον κώδικά σας χωρίς να σας ενδιαφέρει το τί βάση χρησιμοποιεί ο άλλος (αρκεί βέβαια να του ορίσετε το schema που θα
|
||||
δημιουργήσει στην βάση του).
|
||||
|
||||
Βέβαια, αν χρησιμοποιήσετε το DBI για να εκτελέσετε triggers ή stored procedures σε μία βάση (κάτι που γίνεται), δεν μπορείτε να περιμένετε μεγάλη
|
||||
μεταφερσιμότητα, κυρίως λόγω του διαφορετικού τρόπου με τον οποίο καλούν τα διάφορα triggers οι βάσεις. Συνεπώς, αν θέλετε να έχετε την ευελιξία να αλλάξετε
|
||||
βάση αύριο - μεθαύριο χωρίς να σας βγουν τα μάτια να διαβάζετε καλά όλο τον κώδικα για να βρείτε τα databse-specific κομμάτια, σημειώστε καλά τα σημεία που τα
|
||||
χρησιμοποιείτε και στο υπόλοιπο πρόγραμμα\.... stic k to SQL.
|
||||
|
||||
|
||||
### [2. Τι ΔΕΝ παρέχει το DBI]{#s2}
|
||||
|
||||
Το DBI δεν παρέχει έναν τρόπο να μιλήσετε σε μία βάση χωρίς να ξέρετε SQL. To DBI είναι ένα απλό API, άρα αν δεν ξέρετε πως να σχεδιάσετε / υλοποιήσετε ένα
|
||||
RDBMS και πως να αποθηκεύσετε, αλλάξετε, σβήσετε αρχεία με απλή SQL, μην συνεχίσετε να διαβάζετε, το άρθρο αυτό θα σας είναι εντελώς άχρηστο. Αντ\' αυτού
|
||||
διαβάστε ένα βιβλίο για SQL πρώτα, και μετά ξαναελάτε.
|
||||
|
||||
|
||||
### [3. Συνηθισμένες συναρτήσεις]{#s3}
|
||||
|
||||
### [3.1 Connect]{#ss3.1}
|
||||
|
||||
Για να ξεκινήσουμε να μιλάμε σε μία βάση, πρέπει πρώτα να συνδεθούμε σε αυτή τη βάση. Αυτό γίνεται απλά καλώντας την function \"connect\" του DBI. Όταν την
|
||||
καλέσουμε, θα μας επιστρέψει ένα handler (αν επιτύχει βέβαια), και με αυτό το handler θα μιλάμε.
|
||||
|
||||
Παράδειγμα 1
|
||||
$dbh=DBI->connect('DBI:Pg:dbname=dbname user=dbuser password=dbpass');
|
||||
|
||||
Η παραπάνω γραμμή, απλά συνδέεται σε μία postgres database, στην βάση με όνομα dbname, με username dbuser και password dbpass. Η database στο συγκεκριμένο
|
||||
παράδειγμα πρέπει να είναι στο ίδιο μηχάνημα, και να \"ακούει\" στο standard port της Postgres, αλλιώς πρέπει να χρησιμοποιηθούν και οι παράμετροι host= και
|
||||
port=. Σωστή προγραμματιστική τακτική λέει ότι πρέπει η μεταβλητή \$dbh πρέπει να έχει οριστεί νωρίτερα, και να ελεγχθεί αν πράγματι έχει τιμή αυτό που
|
||||
επιστρέφεται (αν δηλαδή πέτυχε το connect).
|
||||
|
||||
Αυτή η συγκεκριμένη γραμμή είναι αρκετά διαφορετική από βάση σε βάση. Για παράδειγμα για Oracle, θα έπρεπε να γραφτεί ως εξής
|
||||
|
||||
Παράδειγμα 2
|
||||
$dbh=DBI->connect('DBI:Oracle:dbname', 'dbuser', 'dbpass');
|
||||
|
||||
και αυτό οφείλεται στο ότι ο κάθε προγραμματιστής ενός DBD δεν ακολουθεί κάποιους κανόνες για το πως περνάει της παραμέτρους στην βάση του.
|
||||
|
||||
### [3.2 Select]{#ss3.2}
|
||||
|
||||
Αφού δημιουργήσαμε τη σύνδεση, πλέον στέλνουμε εντολές, στο \$dbh. Αυτό γίνεται σε δύο στάδια (εκτός από κάποιες περιπτώσεις που θα δούμε παρακάτω). Το πρώτο
|
||||
στάδιο είναι να \"προετοιμάσουμε\" την εντολή, και το δεύτερο είναι να την εκτελέσουμε. Το να λάβουμε τα δεδομένα είναι άλλη υπόθεση (και τρίτο στάδιο). Για
|
||||
παράδειγμα, για να εκτελέσουμε μία τυπική select σε ένα πίνακα, έστω clients, οι εντολές είναι :
|
||||
|
||||
Παράδειγμα 3
|
||||
$entoli = $dbh->prepare('SELECT * FROM clients');
|
||||
$entoli->execute();
|
||||
|
||||
Όσα είπαμε προηγουμένως για σωστή προγραμματιστική τακτική ισχύουν και εδώ (και σε όλο το άρθρο, οπότε θα σταματήσω να τα λέω), και απλά παραλείπονται μια που ο
|
||||
καθένας προτιμάει τον δικό του τρόπο δήλωσης μεταβλητών και ελέγχου επιτυχίας της function.
|
||||
|
||||
Όπως βλέπουμε, η prepare() δίνει την εντολή, η οποία εκτελείται από την execute(). Αν τώρα θέλουμε να επιλέξουμε συγκεκριμένα στοιχεία από τον πίνακα, απλά
|
||||
αντικαθιστούμε το \* με τα στοιχεία που θέλουμε. Έστω δηλαδή ότι θέλουμε τα στοιχεία client\_name και client\_tel από τον πίνακα, οι εντολές γίνονται:
|
||||
|
||||
Παράδειγμα 4
|
||||
$entoli = $dbh->prepare('SELECT client_sname, client_tel FROM clients');
|
||||
$entoli->execute();
|
||||
|
||||
Φυσικά, αν θέλουμε να περιορίσουμε την select μπορούμε μέσω του DBI, θέτοντας WHERE clauses. Ο σωστός τρόπος να γίνει αυτός είναι ο εξής:
|
||||
|
||||
Παράδειγμα 5
|
||||
$entoli = $dbh->prepare('SELECT client_tel FROM clients WHERE client_sname = ?');
|
||||
$entoli->execute('kabrianis');
|
||||
|
||||
Η παράμετρος η οποία θα αντικαταστήσει το ερωτηματικό (?) όταν εκτελεστεί η εντολή, είναι η παράμετρος η οποία μπαίνει ως όρισμα στην function execute(). Τελικά
|
||||
δηλαδή θα εκτελεστεί στην Database η εντολή:
|
||||
|
||||
Παράδειγμα 6
|
||||
SELECT client_tel FROM clients WHERE client_sname = 'kabrianis'
|
||||
|
||||
Προφανώς, μπορούμε να έχουμε περισσότερες από μία παραμέτρους στα WHERE clauses, αντικαθιστώντας τα αντίστοιχα ερωτηματικά με τις παραμέτρους, χωρισμένες με
|
||||
κόμμα, στην αντίστοιχη execute(). Μπορούμε επίσης να έχουμε και subqueries, όπως:
|
||||
|
||||
Παράδειγμα 7
|
||||
$entoli = $dbh->prepare('SELECT client_tel FROM clients WHERE client_addr = ?
|
||||
AND client_sname in (SELECT client_sname FROM clients WHERE client_fname = ?)');
|
||||
$entoli->execute('Athina','Michalis');
|
||||
|
||||
Αν μπερδευτήκατε, ξαναδιαβάστε SQL. Η εντολή είναι απλούστατη, και θα μας βρεί από την βάση μας (πίνακα clients) όσους έχουν διεύθυνση Athina και λέγονται
|
||||
Michalis.
|
||||
|
||||
Όλα αυτά τα αποτελέσματα της SELECT μπορούν να διαβαστούν από εμάς, γραμμή - γραμμή, με την fetchrow\_array() μέθοδο της \$entoli, και βέβαια μας έρχονται σε
|
||||
μορφή array. Για παράδειγμα, ο κώδικας του παραδείγματος 4 θα μας επιστρέφει arrays που θα περιέχουν τα client\_sname και client\_tel ως πρώτο και δεύτερο
|
||||
στοιχείο του array. Το να τα κρατήσουμε σε μεταβλητές και να τα κάνουμε κάτι, είναι φυσικά εύκολο.
|
||||
|
||||
Παράδειγμα 8
|
||||
while (@apotelesmata = $entoli->fetchrow_array()) {
|
||||
$client_sname = $apotelesmata[0];
|
||||
$client_tel = $apotelesmata[1];
|
||||
##
|
||||
## Εδώ κάνουμε κάτι με τα αποτελέσματα που πήραμε
|
||||
##
|
||||
}
|
||||
|
||||
### [3.3 Insert]{#ss3.3}
|
||||
|
||||
Η χρήση της INSERT είναι πολύ απλή, και μοιάζει με αυτή της SELECT. Για παράδειγμα για να βάλουμε άλλη μία γραμμή στον παραπάνω πίνακα (ο οποίος έστω ότι έχει
|
||||
πεδία id, client\_sname, client\_fname και client\_addr) θα γράψουμε τα εξής:
|
||||
|
||||
Παράδειγμα 9
|
||||
$entoli = $dbh->prepare('INSERT INTO clients VALUES (?,?,?,?)');
|
||||
$entoli->execute($id,$client_sname,$client_fname,$client_addr);
|
||||
|
||||
Φυσικά εδώ η fetchrow\_array() δεν θα μας επιστρέψει τίποτα. Η ανωτέρω συνάρτηση μπορεί να επεκταθεί όσο θέλετε, με βάση πάντα τα όρια της SQL, προσθέτοντας
|
||||
συγκεκριμένες τιμές, σε συγκεκριμένα πεδία (αν το επιτρέπει ο πίνακας που έχετε φτιάξει).
|
||||
|
||||
### [3.4 Delete]{#ss3.4}
|
||||
|
||||
Πραγματικά δεν θα περιμένετε κάτι διαφορετικό, έτσι; Ας πάμε κατυεθείαν στον κώδικα:
|
||||
|
||||
Παράδειγμα 10
|
||||
$entoli = $dbh->prepare('DELETE FROM clients WHERE client_sname = ?');
|
||||
$entoli->execute($client_sname);
|
||||
|
||||
και φυσικά, πάλι η fetchrow\_array() δεν θα επιστρέψει τίποτα. Subqueries μπορούν να χρησιμοποιηθούν, για να σβήσουμε συγκεκριμένες γραμμές ενός πίνακα, ακόμα
|
||||
και χωρίς να δώσουμε καθόλου εξωτερικά στοιχεία.
|
||||
|
||||
### [3.5 Update]{#ss3.5}
|
||||
|
||||
\`Αλλη μία απλή εντολή, η update, έχει ακριβώς την ίδια σύνταξη με την insert και την delete.
|
||||
|
||||
Παράδειγμα 11
|
||||
$entoli = $dbh->prepare('UPDATE clients SET client_tel = ? WHERE client_sname = ?');
|
||||
$entoli->execute($client_tel,$client_sname);
|
||||
|
||||
Όπως είπαμε και πιο πάνω, οι παράμετροι της execute() διαβάζονται σειριακά, και αντικαθιστούν τα ερωτηματικά που βρίσκουν στην prepare(). Αυτό το ξανατονίζω
|
||||
γιατί η update είναι ίσως η πιο \"επικίνδυνη\" εντολή, από την άποψη ότι μπορεί εύκολα να κάνεις λάθος, και να μην το καταλάβεις, και να κάνεις update όλες τις
|
||||
εγγραφές ενός πίνακα αντί για μία - δύο που ήθελες.
|
||||
|
||||
### [3.6 Do αντί για prepare() και execute()]{#ss3.6}
|
||||
|
||||
Για τις εντολές insert, update και delete, οι οποίες ΔΕΝ επιστρέφουν τίποτα, το DBI παρέχει έναν τρόπο να αποφεύγουμε τις πολλές γραμμές κώδικα. Ο τρόπος είναι
|
||||
να αντικαταστήσουμε τα prepare(), execute() και finish (που θα δούμε παρακάτω) με την απλή εντολή do.
|
||||
|
||||
Παράδειγμα 12
|
||||
$entoli = $dbh->do('DELETE FROM clients WHERE client_id = 5');
|
||||
|
||||
Έτσι η εντολή DELETE προετοιμάζεται (prepare()), εκτελείται (execute()) και ο handler \$entoli τερματίζεται (finish) αυτόματα.
|
||||
|
||||
### [3.7 Finsh και Disconnect]{#ss3.7}
|
||||
|
||||
Πρέπει πάντα, να τερματίζουμε τον handler της εντολής μετά την εκτέλεσή της, και το fetching των γραμμών που μας επιστρέφει (αν μας επιστρέφει τίποτα φυσικά).
|
||||
Συνεπώς, σε όλα τα παραπάνω παραδείγματα, πρέπει να προσθέσετε στο τέλος την γραμμή:
|
||||
|
||||
$entoli->finish;
|
||||
|
||||
ενώ πρέπει, όταν τελειώνουμε με την βάση μας, να κλείνουμε τη σύνδεση:
|
||||
|
||||
$dbh->disconnect;
|
||||
|
||||
|
||||
### [4. \`Αλλα καλούδια]{#s4}
|
||||
|
||||
Εκτός από τα connect, disconnect, prepare, execute, do, finish και fetchrow\_arrays που είδαμε, υπάρχουν και άλλα καλούδια που παρέχονται από το DBI, τα οποία
|
||||
μπορούν να χρησιμοποιηθούν για να κάνουν τη ζωή σας ευκολότερη. Ας κάνουμε μία σύντομη αναφορά σε κάποια (τα πιο χρήσιμα ίσως) από αυτά:
|
||||
|
||||
- prepare\_cached(): Αν αντί της prepare() χρησιμοποιήσουμε την prepare\_cached, τότε, κάθε φορά που θα εκτελείται ένα execute() με τις ίδιες ακριβώς
|
||||
παραμέτρους, δεν θα γίνεται σύνδεση προς τη βάση, αλλά θα μας επιστρέφονται οι τιμές που έχουν γίνει cached κατά την πρώτη φορά.
|
||||
- rows: Αν χρησιμοποιήσουμε την \$entoli-\>rows, θα μας επιστραφεί ο αριθμός των γραμμών που στέλνει η βάση μετά από ένα select.
|
||||
- bind\_columns(): Αντί της fetchrow\_array() που είδαμε παραπάνω και του while που αναθέτουμε σε κάποιες μεταβλητές, τα στοιχεία του array που μας
|
||||
επιστρέφονται, μπορούμε απλά να χρησιμοποιήσουμε την bind\_columns() δίνοντας ως παραμέτρους τα ονόματα των μεταβλητών. Τα δεδομένα από την βάση μας
|
||||
έρχονται μέσω της fetch.
|
||||
|
||||
Το DBI μας παρέχει στην err τον κωδικό λάθους (αν υπάρχει κάποιο) κατά την εκτέλεση της εντολής, στην errstring το μήνυμα λάθους που επιστρέφει η database, και
|
||||
στην state το SQLSTATE κωδικό λάθους. Χρήσιμες functions είναι οι trace, trace\_msg και η func.
|
||||
|
||||
|
||||
### [5. Βιβλιογραφία]{#s5}
|
||||
|
||||
Καλό βιβλίο, και προτεινόμενο για DBI programming (και με κάποια στοιχεία SQL μέσα) είναι το Programming the Perl DBI από τις εκδόσεις O\'Reilly. Μην το ψάξετε
|
||||
στον Παπασωτηρίου, δεν το έχει (και το ζητούσα 2 μήνες).\
|
||||
Πολύ καλές πληροφορίες δίνει το manual page του DBI του ίδιου.\
|
||||
Πρέπει επίσης να διαβάσετε το manual του DBD module της βάσης σας (αν φυσικά έχει ένα τέτοιο). Βιβλία για Perl και SQL ΔΕΝ θα προτείνω εδώ.
|
||||
|
290
content/articles/23/05_apachejserv.md
Κανονικό αρχείο
290
content/articles/23/05_apachejserv.md
Κανονικό αρχείο
|
@ -0,0 +1,290 @@
|
|||
+++
|
||||
title = 'Apache mod\_ssl mod\_jserv installation'
|
||||
date = '2000-04-01T00:00:00Z'
|
||||
description = ''
|
||||
author = 'Κώστας Γεωργακόπουλος(mailto:kgeorga@magnet.gr)'
|
||||
issue = ['Magaz 23']
|
||||
issue_weight = 5
|
||||
+++
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
*Αυτό το κείμενο προσπαθεί να κάνει την εγκατάσταση του apache-ssl-jserv εύκολη ώστε οποιοσδήποτε, ακολουθώντας απλά τις εντολές, να μπορέσει να εγκαταστήσει το
|
||||
ρημάδι.. Πάντως δούλεψε για μένα..*
|
||||
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
**1. Tι πρέπει να ξέρετε.**
|
||||
---------------------------------------------------------
|
||||
|
||||
**2. Απαραίτητα αρχεία και που θα τα βρείτε.**
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
**3. Εγκατάσταση χωρίς υποστήριξη DSO**
|
||||
---------------------------------------------------------------------
|
||||
|
||||
- [3.1 Αρχίζοντας..](#ss3.1)
|
||||
- [3.2 Εγκατάσταση των προαπαιτούμενων.](#ss3.2)
|
||||
- [3.3 Εγκατάσταση του ApacheJserv](#ss3.3)
|
||||
- [3.4 Eγκατάσταση του apache και του mod\_ssl με ένα μόνο configure (μαγεία!)](#ss3.4)
|
||||
- [3.5 Τελευταία βήματα.](#ss3.5)
|
||||
|
||||
**4. Εγκατάσταση με υπστήριξη DSO (Dynamic Shared Object)**
|
||||
-----------------------------------------------------------------------------------------
|
||||
|
||||
- [4.1 Aρχίζοντας.](#ss4.1)
|
||||
- [4.2 Apache & mod\_ssl configuration σε ένα (ξανά!)](#ss4.2)
|
||||
- [4.3 Εγκατάσταση ApacheJserv](#ss4.3)
|
||||
- [4.4 Τελευταία βήματα.](#ss4.4)
|
||||
- [4.5 Έλεγχος.](#ss4.5)
|
||||
|
||||
**5. Tι να προσέξετε.**
|
||||
-----------------------------------------------------
|
||||
|
||||
**6. Feedback**
|
||||
---------------------------------------------
|
||||
|
||||
|
||||
### [1. Tι πρέπει να ξέρετε.]{#s1}
|
||||
|
||||
**Σύστημα εγκατάστασης**
|
||||
|
||||
: Slackware 7.0 (kernel 2.2.14)
|
||||
|
||||
**Σημειώσεις**
|
||||
|
||||
: - Αν ζείτε στις Η.Π.Α η εγκατάσταση είναι διαφορετική.
|
||||
- Διαλέχτε είτε WITHOUT DSO είτε DSO installation..
|
||||
- Υποθέτω οτι έχετε μια κάποια γνώση του configure script.
|
||||
- Μετά τις 8/2/2000 τα ίδια βήματα ισχύουν για τον apache\_1.3.12 με mod\_ssl-2.6.0-1.3.12 .
|
||||
|
||||
|
||||
### [2. Απαραίτητα αρχεία και που θα τα βρείτε.]{#s2}
|
||||
|
||||
Αναγκαία αρχεία και που θα βρείτε τις τελευταίες εκδόσεις τους..
|
||||
|
||||
mod\_ssl-2.5.0-1.3.11.tar.gz\
|
||||
[www.modssl.org](http://www.modssl.org)
|
||||
|
||||
openssl-0.9.4.tar.gz\
|
||||
[www.openssl.org](http://www.openssl.org)
|
||||
|
||||
ApacheJserv-1.1.tar.gz\
|
||||
[java.apache.org](http://java.apache.org)
|
||||
|
||||
jdk-1.2.2-RC4-linux-i386-glibc-2.1.2.tar.gz (or .bz2 )\
|
||||
<http://java.sun.com/products/servlet/download.html>
|
||||
|
||||
jsdk20-solaris2-sparc.tar.Z\
|
||||
<http://java.sun.com/products/servlet/download.html>
|
||||
|
||||
apache-1.3.11.tar.gz\
|
||||
[www.apache.org](http://www.apache.org)
|
||||
|
||||
|
||||
### [3. Εγκατάσταση χωρίς υποστήριξη DSO]{#s3}
|
||||
|
||||
### [3.1 Αρχίζοντας..]{#ss3.1}
|
||||
|
||||
Διάλεγουμε ένα κατάλογο εργασίας (π.χ /root/work ) και αντιγράφουμε όλα τα παραπάνω αρχεία εκεί..
|
||||
|
||||
cd /root/work\
|
||||
tar -zxvf mod\_ssl-2.5.0-1.3.11.tar.gz\
|
||||
tar -zxvf openssl-0.9.4.tar.gz\
|
||||
tar -zxvf ApacheJserv-1.1.tar.gz\
|
||||
tar -zxvf jdk-1.2.2-RC4-linux-i386-glibc-2.1.2.tar.gz\
|
||||
tar -zxvf jsdk20-solaris2-sparc.tar.gz\
|
||||
tar -zxvf apache-1.3.11.tar.gz
|
||||
|
||||
### [3.2 Εγκατάσταση των προαπαιτούμενων.]{#ss3.2}
|
||||
|
||||
Εγκαθιστούμε τώρα τα αναγκαία από το jserv και το ssl πακέτα..
|
||||
|
||||
-openssl-0.9.4 (προαπαιτούμενο του mod\_ssl)-
|
||||
|
||||
cd openssl-0.9.4
|
||||
./config
|
||||
make
|
||||
make test
|
||||
cd ..
|
||||
|
||||
-jdk ( προαπαιτούμενο του by jserv)-
|
||||
|
||||
cd jdk-1.2.2-RC4-linux-i386-glibc-2.1.2
|
||||
|
||||
Απλή εγκατάσταση , δεν χρειάζεται compile ( βλέπε README )
|
||||
Yποθέτουμε οτι τελικά εγκαθίσταται στο /usr/local/jdk
|
||||
|
||||
cd ..
|
||||
|
||||
-jsdk (προαπαιτούμενο του jserv)-
|
||||
|
||||
Tα ίδια με το προηγούενο.. Yποθέτουμε οτι τελικά εγκαθίσταται στο /usr/local/jsdk
|
||||
|
||||
### [3.3 Εγκατάσταση του ApacheJserv]{#ss3.3}
|
||||
|
||||
Κάνουμε ένα (προαπαιτούμενο από το jserv ) configure στο top directory του apache:
|
||||
|
||||
cd apache_1.3.11
|
||||
./configure --prefix=/usr/local/apache
|
||||
make install
|
||||
cd ..
|
||||
|
||||
Eγκαθιστούμε το ΑpacheJserv :
|
||||
|
||||
cd ApacheJserv-1.1
|
||||
./configure \
|
||||
|
||||
--prefix=/usr/local/jserv \
|
||||
--with-apache-src=../apache_1.3.11 \
|
||||
--with-jdk-home=/usr/local/jdk \
|
||||
--with-JSDK=/usr/local/jsdk \
|
||||
--enable-EAPI
|
||||
|
||||
make
|
||||
make install
|
||||
|
||||
### [3.4 Eγκατάσταση του apache και του mod\_ssl με ένα μόνο configure (μαγεία!)]{#ss3.4}
|
||||
|
||||
Κάνουμε configure τον apache μέσω του mod\_ssl :
|
||||
|
||||
cd mod_ssl-2.5.0-1.3.11
|
||||
./configure \
|
||||
|
||||
--prefix=/usr/local/apache \
|
||||
--with-apache=../apache_1.3.11 \
|
||||
--with-ssl=../openssl-0.9.4 \
|
||||
--activate-module=src/modules/jserv/libjserv.a \
|
||||
--enable-module=ssl \
|
||||
--enable-suexec \ (OPTIONAL)
|
||||
--suexec-caller=nobody (OPTIONAL)
|
||||
[ ..more apache options.. ]
|
||||
cd ..
|
||||
|
||||
Προσθέτουμε στο \"apache\_1.3.11/src/Configuration\" στο τέλος του αρχείου :
|
||||
|
||||
AddModule modules/jserv/libjserv.a
|
||||
|
||||
Κάνουμε μετά στον κατάλογο apache\_1.3.11 :
|
||||
|
||||
make
|
||||
make certificate TYPE=custom (or TYPE=dummy)
|
||||
make install
|
||||
|
||||
### [3.5 Τελευταία βήματα.]{#ss3.5}
|
||||
|
||||
Βάζουμε κάπου στο httpd.conf :
|
||||
|
||||
Include /usr/local/jserv/etc/jserv.conf
|
||||
|
||||
Κάνουμε επίσης : chmod o+w /usr/local/jserv/logs
|
||||
|
||||
Ξεκινάμε τον apache με υποστήριξη ssl :
|
||||
|
||||
/usr/local/apache/bin/apachectl startssl
|
||||
|
||||
Eλέγχουμε το jserv :
|
||||
|
||||
http://server.domain.com/servlets/Hello
|
||||
|
||||
Ελέγχουμε το ssl :
|
||||
|
||||
https://server.domain.com/
|
||||
|
||||
|
||||
### [4. Εγκατάσταση με υπστήριξη DSO (Dynamic Shared Object)]{#s4}
|
||||
|
||||
### [4.1 Aρχίζοντας.]{#ss4.1}
|
||||
|
||||
Απλά επαναλάβετε τα βήματα 3.1 και 3.2 (χρειάζονται και εδώ :) )
|
||||
|
||||
### [4.2 Apache & mod\_ssl configuration σε ένα (ξανά!)]{#ss4.2}
|
||||
|
||||
cd mod_ssl-2.5.0-1.3.11
|
||||
|
||||
./configure \
|
||||
|
||||
--prefix=/usr/local/apache \
|
||||
--with-apache=../apache_1.3.11/ \
|
||||
--with-ssl=../openssl-0.9.4 \
|
||||
--enable-shared=ssl \
|
||||
--enable-rule=SHARED_CORE \
|
||||
--enable-module=so \
|
||||
--enable-suexec \ (OPTIONAL)
|
||||
--suexec-caller=nobody (OPTIONAL)
|
||||
[..more apache options..]
|
||||
cd ..
|
||||
|
||||
cd apache_1.3.11
|
||||
|
||||
make
|
||||
make certificate TYPE=custom (or TYPE=dummy)
|
||||
make install
|
||||
|
||||
cd ..
|
||||
|
||||
### [4.3 Εγκατάσταση ApacheJserv]{#ss4.3}
|
||||
|
||||
cd ApacheJserv-1.1
|
||||
|
||||
./configure \
|
||||
|
||||
--prefix=/usr/local/jserv \
|
||||
--with-apxs=/usr/local/apache/bin/apxs \
|
||||
--with-jdk-home=/usr/local/jdk/ \
|
||||
--with-JSDK=/usr/local/jsdk/
|
||||
|
||||
make
|
||||
make install
|
||||
|
||||
### [4.4 Τελευταία βήματα.]{#ss4.4}
|
||||
|
||||
Bάζουμε κάπου στο httpd.conf :
|
||||
|
||||
Include /usr/local/apache/conf/jserv/jserv.conf
|
||||
|
||||
Επίσης στο AddModules section του httpd.conf:
|
||||
|
||||
AddModule mod_jserv.c
|
||||
|
||||
### [4.5 Έλεγχος.]{#ss4.5}
|
||||
|
||||
Ξεκινάμε τον apache με υποστήριξη ssl :
|
||||
|
||||
/usr/local/apache/bin/apachectl startssl
|
||||
|
||||
Eλέγχουμε το jserv :
|
||||
|
||||
http://server.domain.com/servlets/Hello
|
||||
|
||||
Ελέγχουμε το ssl :
|
||||
|
||||
https://server.domain.com/
|
||||
|
||||
:)
|
||||
|
||||
|
||||
### [5. Tι να προσέξετε.]{#s5}
|
||||
|
||||
Εαν έχετε 2 ή παραπάνω apache δαίμονες να ακούνε σε διαφορετικές IP διευθύνσεις στο ίδιο μηχάνημα (π.χ με IP alias) τότε μάλλον έχετε ενεργοποιήσει την Listen
|
||||
εντολή στο httpd.conf :
|
||||
|
||||
Listen xxx.yyy.zzz.vvv:80
|
||||
|
||||
Aν όντως συμβαίνει αυτό τότε κάντε σχόλιο την παρακάτω γραμμή στο httpd.conf στο οποίο έχετε ενεργοποιήσει την εντολή Listen :
|
||||
|
||||
.
|
||||
.
|
||||
#Listen 80 <-- σχόλιο
|
||||
Listen 443
|
||||
.
|
||||
.
|
||||
|
||||
Εάν έχετε και τις 2 Listen εντολές ενεργοποιημένες τότε ο apache den Θα ξεκινήσει
|
||||
|
||||
|
||||
### [6. Feedback]{#s6}
|
||||
|
||||
ΠΑΡΑΚΑΛΩ στείλτε μου πληροφορίες ( λάθη ή ο,τιδήποτε ) για να ξέρω αν σας βοήθησε καθόλου..\
|
||||
e-mail : <kgeorga@magnet.gr> [kgeorga\@it.teithe.gr.gr](mailto:kgeorga@it.teithe.gr)
|
||||
|
Φόρτωση…
Προσθήκη πίνακα
Προσθήκη υπερσυνδέσμου
Παράθεση σε νέο ζήτημα