Εδώ βλέπετε τις διαφορές μεταξύ της επιλεγμένης έκδοσης και της τρέχουσας έκδοσης της σελίδας.
Προηγούμενος έλεγχος και από τις δύο πλευρές Προηγούμενη αναθεώρηση | |||
octave [2020/11/21 09:52] 127.0.0.1 εξωτερική τροποποίηση |
octave [2021/01/30 13:59] (τρέχουσα) 62.210.151.70 παλαιότερη έκδοση επαναφέρθηκε (2014/01/29 10:01) |
||
---|---|---|---|
Γραμμή 1: | Γραμμή 1: | ||
+ | ======Καλωσορίσατε στην GNU/ | ||
+ | Το wiki αυτό είναι μια εισαγωγή στην γλώσσα υψηλού επιπέδου GNU/Octave, μια ελεύθερη γλώσσα προγραμματισμού εναλλακτική της Matlab. Για πιο σοβαρή ενασχόληση με την γλώσσα είναι καλύτερο κάποιος να διαβάσει το [[http:// | ||
+ | ======Ιστορία====== | ||
+ | Στο δεύτερο μισό της δεκαετίας του 1970 αναπτύχθηκαν σε ForTran βιβλιοθήκες ρουτινών για την επίλυση προβλημάτων αριθμητικής ανάλυσης. Οι βιβλιοθήκες αυτές [[ http:// | ||
+ | Ένας από τους συντάκτες αυτών των βιβλιοθηκών ο Cleve Moler καθώς και οι Little and Steve Bangert, οι οποίοι μετέγραψαν τις παραπάνω βιβλιοθήκες σε C ίδρυσαν την εταιρία Mathworks το 1984 και ξεκίνησαν την ανάπτυξη και εκμετάλλευση της [[http:// | ||
+ | H Octave πρωτοαναπτύχθηκε το 1988 στο πλαίσιο προπτυχιακού μαθήματος στο Παν. του Τέξας. Η κανονική της ανάπτυξη ξεκίνησε το 1992 ενώ το 1994 είχαμε την πρώτη έκδοση 1.0. Έκτοτε αναπτύσσεται αδιάλειπτα ως [[http:// | ||
+ | |||
+ | ======Ξεκινάμε; | ||
+ | Για να χρησιμοποιήσει κάποιος την γλώσσα GNU/Octave θα πρέπει πρώτα να την εγκαταστήσει στον υπολογιστή του. [[https:// | ||
+ | Εκτελείται με την εντολή octave και αφού μας ενημερώσει για την έκδοση και την άδεια χρήσης περιμένει τις εντολές μας: | ||
+ | | ||
+ | [chiossif@anacoda ~]$ octave | ||
+ | GNU Octave, version 3.8.0 | ||
+ | Copyright (C) 2013 John W. Eaton and others. | ||
+ | This is free software; see the source code for copying conditions. | ||
+ | There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or | ||
+ | FITNESS FOR A PARTICULAR PURPOSE. | ||
+ | | ||
+ | Octave was configured for " | ||
+ | | ||
+ | Additional information about Octave is available at http:// | ||
+ | | ||
+ | Please contribute if you find this software useful. | ||
+ | For more information, | ||
+ | | ||
+ | Read http:// | ||
+ | For information about changes from previous versions, type ' | ||
+ | | ||
+ | octave: | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ======Χρήση της octave ως αριθμομηχανής====== | ||
+ | Γράψτε: | ||
+ | octave: | ||
+ | ans = 5 | ||
+ | Η απάντηση είναι 5. Σωστά; :-) | ||
+ | Οι πράξεις που υποστηρίζονται είναι + για την πρόσθεση, | ||
+ | Αντέχει... μην την φοβάστε. Όλα τα υπολογίζει: | ||
+ | octave: | ||
+ | ans = 1.0505e+09 | ||
+ | octave: | ||
+ | octave: | ||
+ | ans = 1050537743 | ||
+ | octave: | ||
+ | octave: | ||
+ | ans = 1.0505e+09 | ||
+ | Όπως βλέπετε με την εντολή format ρυθμίζουμε το πλήθος των σημαντικών ψηφίων τα οποία θα εμφανίζονται ως απάντηση. Η επιλογή long καλύπτει κάθε ανάγκη και δεν επιδέχεται βελτίωση. | ||
+ | |||
+ | |||
+ | |||
+ | ======Περιβάλλον χρήσης====== | ||
+ | Μέχρι εδώ έχουμε δει να δίνει απλές απαντήσεις. Τι γίνεται όμως αν θέλουμε πιο σύνθετες πράξεις/ | ||
+ | Υποστηρίζονται όλες οι [[http:// | ||
+ | cos Συνημίτονο | ||
+ | sin Ημίτονο | ||
+ | tan Εφαπτομένη | ||
+ | exp Εκθετική e^x | ||
+ | log Λογάριθμος | ||
+ | log10 Λογάριθμος με βάση 10 | ||
+ | sinh | ||
+ | cosh | ||
+ | tanh | ||
+ | acos | ||
+ | acosh τόξο υπερβολικού συνημιτόνου | ||
+ | asin | ||
+ | asinh τόξο υπερβολικού ημιτόνου | ||
+ | atan | ||
+ | atan2 τόξο εφαπτομένης με δύο ορίσματα x/y | ||
+ | atanh τόξο υπερβολικής εφαπτομένης | ||
+ | abs απόλυτη τιμή | ||
+ | sign | ||
+ | round στρογγυλοποίηση στον πλησιέστερο ακέραιο | ||
+ | floor στρογγυλοποίηση προς τα κάτω | ||
+ | ceil | ||
+ | fix στρογγυλοποίηση προς το μηδέν | ||
+ | rem υπόλοιπο ακέραιας διαίρεσης | ||
+ | |||
+ | Οι τριγωνομετρικές συναρτήσεις είναι σε ακτίνια. | ||
+ | Υποστηρίζονται [[ http:// | ||
+ | Έχουμε σταθερές και δεν θα έχουμε μεταβλητές; | ||
+ | octave: | ||
+ | octave: | ||
+ | ans = 50 | ||
+ | Όπως βλέπετε η μεταβλητή ans είναι αυτόματη απάντηση/ | ||
+ | octave: | ||
+ | octave: | ||
+ | octave: | ||
+ | c = 8 - 1i | ||
+ | Για τις συναρτήσεις σε μιγαδικούς αριθμούς δείτε περισσότερα [[http:// | ||
+ | |||
+ | |||
+ | ======Πίνακες και διανύσματα====== | ||
+ | Η octave υποστηρίζει πίνακες και διανύσματα. Δείτε ένα παράδειγμα: | ||
+ | octave: | ||
+ | octave: | ||
+ | octave: | ||
+ | C = | ||
+ | | ||
+ | | ||
+ | octave: | ||
+ | D = | ||
+ | | ||
+ | | ||
+ | octave: | ||
+ | E = | ||
+ | 2 2 | ||
+ | | ||
+ | Υποστηρίζονται οι πράξεις +,-,* ως πολλαπλασιασμός πινάκων και .* ως βαθμωτός πολλαπλασιασμός, | ||
+ | octave: | ||
+ | F = | ||
+ | | ||
+ | | ||
+ | octave: | ||
+ | G = | ||
+ | | ||
+ | | ||
+ | Ο πολλαπλασιασμός πινάκων δεν είναι αντιμεταθετικός. Έτσι διαίρεση γίνεται με πολλαπλασιασμό με τον αντίστροφο είτε από δεξιά ( Α/Β == Α*Β^(-1) ) είτε από αριστερά (Α\Β == Β^(-1)*Α). Προσοχή στο .\ ;-) | ||
+ | Αν έχω ένα σύστημα Α*Χ=Β μπορώ να πάρω αμέσως την λύση. Δείτε πως: | ||
+ | octave: | ||
+ | A = | ||
+ | | ||
+ | | ||
+ | octave: | ||
+ | B = | ||
+ | 17 | ||
+ | 39 | ||
+ | octave: | ||
+ | X = | ||
+ | | ||
+ | | ||
+ | Τέλος υπάρχουν και οι [[https:// | ||
+ | octave: | ||
+ | ans = | ||
+ | Diagonal Matrix | ||
+ | | ||
+ | | ||
+ | | ||
+ | octave: | ||
+ | ans = | ||
+ | | ||
+ | | ||
+ | octave: | ||
+ | ans = | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | octave: | ||
+ | ans = | ||
+ | | ||
+ | octave: | ||
+ | ans = | ||
+ | 0 | ||
+ | 0 | ||
+ | 0 | ||
+ | Πριν φύγουμε από τους πίνακες θα πρέπει να δούμε τον ειδικό χαρακτήρα : με τον οποίο ορίζουμε εύρη τιμών. Έτσι μπορούμε, | ||
+ | | ||
+ | A = | ||
+ | | ||
+ | | ||
+ | | ||
+ | ans = | ||
+ | | ||
+ | για την πρώτη γραμμή και | ||
+ | | ||
+ | ans = | ||
+ | 1 | ||
+ | 3 | ||
+ | για την πρώτη στήλη. | ||
+ | Τι σημαίνει όμως το [https:// | ||
+ | octave: | ||
+ | ans = | ||
+ | | ||
+ | Σε περίπτωση που το βήμα είναι 1, μπορεί να παραληφθεί: | ||
+ | | ||
+ | ans = | ||
+ | 1 | ||
+ | Μια σημαντική λέξη κλειδί που μπορεί να χρησιμοποιηθεί είναι το end. Σε περίπτωση λοιπόν που θέλουμε να επιλέξουμε μια γραμμή ή μια στήλη ενός πίνακα από την αρχή μέχρι το τέλος μπορούμε να γράψουμε: | ||
+ | | ||
+ | ans = | ||
+ | 1 | ||
+ | 3 | ||
+ | Έστω λοιπόν πως ορίζουμε έναν πίνακα δύο διαστάσεων: | ||
+ | octave: | ||
+ | A = | ||
+ | | ||
+ | 5 11 10 | ||
+ | 9 | ||
+ | 4 14 15 | ||
+ | Μπορώ να εξάγω με τον χαρακτήρα : τις γραμμές ως εξής: | ||
+ | octave: | ||
+ | ans = | ||
+ | 5 11 | ||
+ | 9 7 | ||
+ | 4 14 | ||
+ | Επίσης μπορώ να εξάγω τα στοιχεία της τελευταίας στήλης ως εξής: | ||
+ | octave: | ||
+ | ans = | ||
+ | 13 | ||
+ | 8 | ||
+ | 12 | ||
+ | 1 | ||
+ | Με το εύρος τιμών είδαμε πως μπορούμε να κόβουμε έναν πίνακα σαν σπανακόπιτα. ;-) Πως μπορούμε όμως να τον ξανασυνδέσουμε; | ||
+ | Στο ακόλουθο παράδειγμα βλέπουμε πως σχηματίζεται ένας νέος πίνακας από άλλους: | ||
+ | octave: | ||
+ | octave: | ||
+ | octave: | ||
+ | octave: | ||
+ | octave: | ||
+ | E = | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | |||
+ | ======Εντολές ελέγχου====== | ||
+ | Μπορούμε να ελέγχουμε την ροή εκτέλεσης εντολών στην octave; Φυσικά και μπορούμε. Αρκεί να ξέρουμε κατ' | ||
+ | |||
+ | Σύμβολο | ||
+ | == | ||
+ | ~= | ||
+ | > | ||
+ | >= | ||
+ | < | ||
+ | <= μικρότερο ή ίσο από | ||
+ | && | ||
+ | || Ή if x == 1 | y > 2 | ||
+ | ~ ΌΧΙ | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | =====Εντολή ελέγχου if===== | ||
+ | Η εντολή ελέγχου ροής είναι η if και η γενική μορφή της είναι η παρακάτω: | ||
+ | if συνθήκη1 | ||
+ | ΟΜΑΔΑ Α ... | ||
+ | elseif συνθήκη2 | ||
+ | ΟΜΑΔΑ Β | ||
+ | else | ||
+ | ΟΜΑΔΑ Ω | ||
+ | end | ||
+ | Εάν η συνθήκη1 είναι αληθής, | ||
+ | ΠΡΟΣΟΧΉ: | ||
+ | octave: | ||
+ | octave: | ||
+ | octave: | ||
+ | > c=3 | ||
+ | > else | ||
+ | > c=4 | ||
+ | > end | ||
+ | c = 4 | ||
+ | Προσέξτε τον χαρακτήρα > στο παραπάνω παράδειγμα. Τον συναντάμε όταν μία εντολή καταλαμβάνει περισσότερες από μία γραμμές και μέχρι την ολοκλήρωσή της. | ||
+ | |||
+ | |||
+ | =====Εντολή ελέγχου switch===== | ||
+ | Σε περίπτωση που σε ένα πρόγραμμα χρειάζονται πολλές if/elseif εντολές προκειμένου να επιλεγεί το αποτέλεσμα μέσα από μια ποικιλία διαφορετικών εντολών, | ||
+ | switch x | ||
+ | case x1, | ||
+ | .... | ||
+ | case x2, | ||
+ | .... | ||
+ | otherwise, | ||
+ | .... | ||
+ | end | ||
+ | Στην εντολή switch, η τιμή του x συγκρίνεται με κάθε μια από την λίστα με τα case, και αν βρεί μια ίση με αυτή τότε εκτελεί την αντίστοιχη ομάδα εντολών. Σε περίπτωση που κανένα case δεν είναι αληθές, | ||
+ | octave: | ||
+ | octave: | ||
+ | > case 0 | ||
+ | > disp(" | ||
+ | > case 1 | ||
+ | > disp(" | ||
+ | > otherwise | ||
+ | > disp(" | ||
+ | > end | ||
+ | a is one | ||
+ | Η συνάρτηση disp εμφανίζει την τιμή ενός αριθμού ή μια παράσταση χαρακτήρων. Στο συγκεκριμένο παράδειγμα χρησιμοποιείται για να εκτυπώσει στην οθόνη μια σειρά από χαρακτήρες. Μπορεί όμως να χρησιμοποιηθεί και με μεταβλητές. πχ. disp(a) θα εκτυπώσει την τιμή του a. | ||
+ | |||
+ | |||
+ | ======Εντολές επανάληψης====== | ||
+ | |||
+ | |||
+ | =====Εντολή επανάληψης for===== | ||
+ | Στον προγραμματισμό είναι πολύ συνήθης η χρήση της εντολής επανάληψης for, η οποία επαναλαμβάνει μια ομάδα εντολών για προκαθορισμένες τιμές και με ένα προκαθορισμένο βήμα. Στην γλώσσα octave η χρήση του πρέπει να αποφεύγεται. Προσπαθήσετε να χρησιμοποιήσετε τις πράξεις με διανύματα, | ||
+ | for variable = vector | ||
+ | statements | ||
+ | end | ||
+ | όπου το vector (διάνυσμα) περιλαμβάνει και τον αριθμό του βήματος. Ακολουθεί ένα παράδειγμα: | ||
+ | octave: | ||
+ | > nf(n) = factorial(n); | ||
+ | > end | ||
+ | octave: | ||
+ | nf = | ||
+ | | ||
+ | όπου σχηματίζεται ένας νέος πίνακας με τα παραγοντικά των αριθμών 1 έως 5. Αυτό το παράδειγμα έγινε μόνο για την επίδειξη της εντολής και είναι ατυχές όπως το 99% των περιπτώσεων χρήσης της for, αφού μπορούμε να έχουμε το ίδιο αποτέλεσμα έτσι: | ||
+ | octave: | ||
+ | n = | ||
+ | | ||
+ | octave: | ||
+ | nf = | ||
+ | | ||
+ | ΠΡΟΣΟΧΗ: | ||
+ | |||
+ | |||
+ | =====Εντολή επανάληψης while===== | ||
+ | Σε περίπτωση που δεν ξέρουμε ακριβώς πόσες επαναλήψεις μπορεί να χρειαστούμε και απλά χρειαζόμαστε μια επαναληπτική διαδικασία μέχρι να εκπληρωθεί μια συνθήκη, | ||
+ | while expression | ||
+ | statements | ||
+ | end | ||
+ | Παράδειγμα: | ||
+ | octave: | ||
+ | octave: | ||
+ | > x=x/2; | ||
+ | > end | ||
+ | octave: | ||
+ | octave: | ||
+ | x = 1.11022302462516e-16 | ||
+ | Ας θυμηθούμε εδώ ότι παρότι στον Η/Υ μπορούμε να αποθηκεύουμε πολύ μικρότερους αριθμούς από το 1e-16 η ακρίβεια των υπολογισμών δεν είναι αντίστοιχη. Όπως σε κάθε αναπαράσταση [[https:// | ||
+ | |||
+ | Και μια και θυμηθήκαμε αυτό ας θυμηθούμε και το άλλο: | ||
+ | για τον ίδιο λόγο αποφεύγουμε τον έλεγχο ισότητας πραγματικών αριθμών. Αντί για το: | ||
+ | a==b επιλέγουμε το abs(a-b)< | ||
+ | octave: | ||
+ | ans = 2.22044604925031e-16 | ||
+ | Μόλις ένα bit μεγαλύτερος από το x στο παραπάνω παράδειγμα ;-) | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ======Συναρτήσεις====== | ||
+ | Ε, αν δεν έχει η octave συναρτήσεις τότε ποιος έχει; Κι είναι τόσο απλές που με ένα παράδειγμα θα γίνουν πλήρως κατανοητές. | ||
+ | Ας ξεκινήσουμε: | ||
+ | octave: | ||
+ | > if x>0 | ||
+ | > y=2*x | ||
+ | > else | ||
+ | > y=3*x | ||
+ | > endif | ||
+ | > endfunction | ||
+ | octave: | ||
+ | y = 4 | ||
+ | ans = 4 | ||
+ | octave: | ||
+ | y = -6 | ||
+ | ans = -6 | ||
+ | Ας τα δούμε αναλυτικά: | ||
+ | |||
+ | Οι εντολές function και endfunction ορίζουν την αρχή και το τέλος της συνάρτησης. Η συνάρτηση έχει όνομα fifi ενώ x και y είναι οι τοπικές της μεταβλητές για να δείξουμε τι θέλουμε να κάνουμε. Στο παράδειγμά μας με y είναι η μεταβλητή που επιστρέφεται η τιμή αποτέλεσμα (αν υπάρχει) ενώ με x δίνεται η τιμή ορισμού (μπορεί να είναι περισσότερες από μία). Το σώμα της συνάρτησης ακολουθεί με χρήση των παραπάνω μεταβλητών και όποιων άλλων θέλουμε και όσο πολύπλοκο θέλουμε. | ||
+ | |||
+ | Η δύναμη της octave φαίνεται αν συνεχίσουμε το παράδειγμα: | ||
+ | octave: | ||
+ | octave: | ||
+ | y = | ||
+ | 3 -6 | ||
+ | 9 -12 | ||
+ | | ||
+ | octave: | ||
+ | b = | ||
+ | | ||
+ | 3 -6 | ||
+ | 9 -12 | ||
+ | Τι να πω; Τα πάντα όλα κάνει η octave. Και ας μην ξεχνάμε το τεράστιο πλήθος συναρτήσεων (μια ιδέα πήραμε [[http:// | ||
+ | |||
+ | Καλά όλα αυτά αλλά θα πρέπει κάθε φορά να φτιάχνω την συνάρτηση και να την γράφω; Δεν μπορεί... κάπως θα γίνεται... | ||
+ | Φτιάχνουμε ένα αρχείο με το όνομα fifi.m, περιεχόμενα την συνάρτησή μας όπως πριν: | ||
+ | function y=fifi(x) | ||
+ | if x>0 | ||
+ | y=2*x; | ||
+ | else | ||
+ | y=3*x; | ||
+ | endif | ||
+ | endfunction | ||
+ | και το αποθηκεύουμε στον φάκελο εργασίας μας. (Σημείωση: | ||
+ | |||
+ | Τώρα ανοίγουμε τo περιβάλλον και: | ||
+ | octave: | ||
+ | octave: | ||
+ | octave: | ||
+ | b = | ||
+ | 3 -6 | ||
+ | 9 -12 | ||
+ | Καλό, έτσι; | ||
+ | Προσοχή λοιπόν στο όνομα της συνάρτησης και του αρχείου. Και μετά κάνουμε ότι θέλουμε :-) | ||
+ | |||
+ | |||
+ | ======Ομαδική εκτέλεση εντολών====== | ||
+ | Ομαδική εκτέλεση εντολών είδαμε με μορφή συνάρτησης σε αρχείο m. Εδώ επιπλέον θα δούμε ότι μπορούμε να αποθηκεύουμε πίνακες (γενικά κάθε μεταβλητή) σε αρχεία τύπου mat και φυσικά να εκτελούμε αρχεία συναρτήσεων / ομαδικών εντολών τύπου m. | ||
+ | Εδώ: | ||
+ | octave: | ||
+ | octave: | ||
+ | octave: | ||
+ | αποθηκεύσαμε στο αρχείο | ||
+ | |||
+ | Το αρχείο αυτό έχει περιεχόμενα: | ||
+ | [chiossif@home-6400 ~]$ cat pinAB.mat | ||
+ | # Created by Octave 3.6.4, Sun Jan 26 13:42:21 2014 EET < | ||
+ | # name: A | ||
+ | # type: matrix | ||
+ | # rows: 4 | ||
+ | # columns: 2 | ||
+ | 1 1 | ||
+ | 2 1 | ||
+ | 3 1 | ||
+ | 4 1 | ||
+ | | ||
+ | | ||
+ | # name: B | ||
+ | # type: matrix | ||
+ | # rows: 4 | ||
+ | # columns: 1 | ||
+ | 6 | ||
+ | 5 | ||
+ | 7 | ||
+ | 10 | ||
+ | (Η εντολή cat είναι εντολή στο τερματικό bash του [[https:// | ||
+ | |||
+ | και μετά μπορούμε με την load: | ||
+ | octave: | ||
+ | octave: | ||
+ | X = | ||
+ | | ||
+ | | ||
+ | | ||
+ | octave: | ||
+ | s = 1.4491 | ||
+ | δεν ξέρω αν το καταλάβατε αλλά μόλις λύσαμε ένα σύστημα με ΜΕΤ και υπολογίσαμε και σίγμα ;-) | ||
+ | Αν μάλιστα φτιάξουμε ένα αρχείο MET.m με περιεχόμενα: | ||
+ | load pinAB.mat | ||
+ | X=A\B | ||
+ | s=sqrt(sum((A*X-B).^2)/ | ||
+ | στον φάκελο εργασίας μαζί με το pinAB.mat που είδαμε μόλις πριν, τότε αρκεί μία εντολή: | ||
+ | octave: | ||
+ | X = | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | s = 1.4491 | ||
+ | για να γίνουν όλα :-) | ||
+ | |||
+ | |||
+ | |||
+ | ======Βιβλιοθήκη επεξεργασίας εικόνας====== | ||
+ | Ναι... υπάρχει και είναι [[http:// | ||
+ | Κατ' | ||
+ | |||
+ | Με την ευκαιρία [[http:// | ||
+ | |||
+ | Ξεκινάμε... | ||
+ | (to be written - curently starring at [[http:// | ||
+ | |||
+ | ======Άλλες βιβλιοθήκες και πρόσθετο υλικό====== | ||
+ | |||
+ | ======Επίλογος; | ||
+ | |||
+ | ======Μέτα την παράσταση====== | ||
+ | Με όλα όσα αναφέρθηκαν παραπάνω, | ||
+ | Επίσης να σημειωθεί ότι αυτό το wiki είναι // | ||
+ | Επιπρόσθετα θα σας ενθαρρύναμε ότι πρόγραμμα γράφετε να είναι ανοιχτό και ελεύθερο προς όλους. Να μπορεί δηλαδή ο καθένας να διαβάσει τον κώδικα του και να τον τροποποιήσει ανάλογα με τις ανάγκες του. | ||
+ | Μεταφράζοντας τα 4 στοιχεία τα οποία πρέπει να έχει ένα πρόγραμμα για να θεωρείται ελεύθερο (όλη την φιλοσοφία μπορείτε να την βρείτε εδώ : http:// | ||
+ | => Πρέπει να παρέχει την ελευθερία σε τρίτους να το εκτελούν για οποιοδήποτε λόγο. | ||
+ | => Πρέπει να παρέχει την ελευθερία σε τρίτους να μελετούν πως δουλεύει το πρόγραμμα και να το προσαρμόζουν στις δικές τους ανάγκες. Η ελεύθερη πρόσβαση στον κώδικα είναι προαπαιτούμενη | ||
+ | => Πρέπει να παρέχει την ελευθερία σε τρίτους να διανέμουν αντίτυπα του προγράμματος για να βοηθήσουν τον πλησίον τους. | ||
+ | => Πρέπει να παρέχει την ελευθερία σε τρίτους να βελτιώνουν το πρόγραμμα και να δημοσιεύουν τις βελτιώσεις στο ευρύ κοινό, ώστε να επωφελείται από αυτές ολόκληρη η κοινότητα. Η ελεύθερη πρόσβαση στον κώδικα είναι προαπαιτούμενη. | ||
+ | **Τέλος ας σημειωθεί ότι ο όρος //free software// πρέπει να αντιλαμβάνεται ως //freedom of speech// και όχι ως //free beer//. ;)** | ||