Thursday 22 October 2009

Ghostscript


Η αποθήκευση ορισμένων σελίδων από αρχεία pdf, ps, eps ώς ξεχωριστά αρχεία καθώς και η συγχώνευση πολλών αρχείων pdf, ps, eps είναι αρκετά εύκολη με το πρόγραμμα ghostscript. Από τη γραμμή εντολών το πρόγραμμα αυτό εκτελείται πληκτρολογόντας gs. 


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

gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf -dFirstPage=first -dLastPage=last input.pdf

όπου output.pdf είναι το όνομα του καινούριου αρχείου, first είναι ο αριθμός της πρώτης σελίδας που θέλουμε να εξάγουμε, last είναι ο αριθμός της τελευταίας σελίδας που θέλουμε να εξάγουμε, και input.pdf είναι το όνομα του αρχικού αρχείου.


Η συγχώνευση πολλών αρχείων pdf γίνεται με την παρακάτω εντολή:

gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf input1.pdf input2.pdf input3.pdf

όπου output.pdf είναι πάλι το όνομα του νέου αρχείου και input1.pdf, input2.pdf input3.pdf είναι τα ονόματα των αρχείων προς συγχώνευση.


Και ένα script που αυτοματοποιεί κάπως την πληκτρολόγηση δίνεται παρακάτω:


#!/bin/csh -f

# pdfextract - extracts pages from a pdf

# 2009.06.19 - written by DP

set output=0

set com=`basename $0`

set USAGE="usage: $com [-f FirstPage] [-l LastPage] [-o OutputFile] [file]"

set argv=(`getopt f:l:o: $*`)

set errflg=$status

set first=1

set last=0

set pdffile=""

if ($errflg == 0) then

while ("$argv[1]" != "--")

switch ($argv[1])

case -f:

set first=$argv[2]

shift argv

breaksw

case -l:

set last=$argv[2]

shift argv

breaksw

case -o:

set output=1

set OutputFile=$argv[2]

shift argv

breaksw

default:

set errflg=1

breaksw

endsw

shift argv

end

shift argv

endif

if ( $#argv == 0 ) then

set errflg=2

endif

if ($errflg != 0) then

echo "$USAGE"

exit 1

endif

if ($output == 0) then

if ( $last == 0 ) then

set OutputFile="`basename -s .pdf $1`$first-end.pdf"

else

set OutputFile="`basename -s .pdf $1`$first-$last.pdf"

endif

endif

foreach i ( ${argv} )

set pdffile="$pdffile $i"

end

if (-e $OutputFile) then

echo "$OutputFile already exists"

exit 1

endif

if ( $last == 0 ) then

set gsargs=""

else

set gsargs="-dLastPage=$last"

endif

gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$OutputFile -dFirstPage=$first $gsargs $pdffile


ΥΓ. Προσοχή που αλλάζει η γραμμή και που συνεχίζεται.

Tuesday 15 September 2009

Μεταπρογραμματισμός

Μεταγλώσσα, μεταλογική και μεταπρογραμματισμός


Ήθελα να προγραμματίσω στην python την εντολή struct του matlab, η οποία λειτουργεί ως εξής:

a = struct('x', 1, 'y', [1,2], 'z', zeros(2))


και δημιουρργεί μια τέτοια δομή:

a =


x: 1

y: [1 2]

z: [2x2 double]


και μετά είναι δυνατό να γράψουμε:

a.id = 1


Μετά από μια χρονοβόρα αναζήτηση σε εγχειρίδια της python, σε online documentation και στο διαδίκτυο γενικότερα, οδηγήθηκα στη λέξη μεταπρογραμματισμός, και συνειρμικά φυσικά θυμήθηκα τις λέξεις μεταγλώσσα και μεταλογική. Στη γλώσσα χρησιμοποιούμε προτάσεις 'ένα συν ένα κάνει δύο' αλλά και 'η πρόταση "ένα συν ένα κάνει δύο" είναι αληθής'. Στην πραγματικότητα οι δύο αυτοί τύποι προτάσεων ανήκουν σε δύο διαφορετικές γλώσσες. Η μία είναι η γλώσσα που περιέχει ένα σύνολο προτάσεων---δυνατών συντακτικά και γραμματικά---και η μεταγλώσσα, η οποία περιέχει τις προτάσεις που εκφέρουν την αλήθεια ή ψευδος των προτάσεων της γλώσσας. Η μεταγλώσσα είναι κι αυτή φυσικά μια γλώσσα, η οποία στη συγκεκριμένη περίπτωση χρησιμοποιεί τα ίδια σύμβολα με τη γλώσσα. Στο παραπάνω παράδειγμα η πρόταση 'ένα συν ένα κάνει δύο' ανήκει στη γλώσσα, ενώ η 'η πρόταση "ένα συν ένα κάνει δύο" είναι αληθής' ανήκει στη μεταγλώσσα.

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

Ο κλάδος της λογικής (ή των μαθηματικών) που ασχολείται με αυτά τα προβλήματα είναι η μεταλογική (ή τα μεταμαθηματικά).


Κατ' αναλογία, υπάρχει κάτι αντίστοιχο και στον προγραμματισμό. Όχι με έκφραση αλήθειας βέβαια. Στον αντικειμενοστραφή προγραμματισμό είναι γνωστές οι έννοιες της κληρονομικότητας (inheritance), πολυμορφίας (polymorphism), encapsulation (δε γνωρίζω την ελληνική έννοια), κ.α. Δημιουργούμε classes, υπερφορτώνουμε τελεστές, κρύβουμε δεδομένα, αλλά οι δυνατότητες της python επεκτείνονται και στον μεταπρογραμματισμό.


def struct(*args):

class mystruct: pass

for i in range(len(args)/2):

setattr(mystruct, args[2*i], args[2*i+1])

return mystruct

Wednesday 5 August 2009

Εκλογικό σύστημα

Χρειαζόμαστε μια αναγέννηση. Όχι φυσικά υπό το εθνικιστικό πρήσμα ορισμένων. Ούτε όμως μία τεχνολογική αναγέννηση. Μια απαρχή της ανθρωπιστικής σκέψης ύπο ένα νέο πρίσμα. Μέχρι τώρα οι ανθρωπιστικές επιστημές, όπως και η ιατρική, ήταν περιχαρακωμένες στο δικό τους τρόπο σκέψης. Δε δεχόταν την επιρροή των μαθηματικών και της φυσικής. Αντίθετα τώρα βλέπουμε τη κβαντομηχανική να εισρέει στο πεδίο της λειτουργίας του εγκεφάλου και κατ'επέκταση να προσπαθεί να απαντήσει το ερώτημα της ελευθερίας της σκέψης. Οι φιλόσοφοι δε μπορούν πλέον να παράγουν τίποτε καινούριο, αναμοχλεύουν τα παλιά. Ακόμη κι αν το αρνούνται τα μαθηματικά επηρεάζουν  όλες τις πτυχές τις φιλοσοφίες.  


Ένα εκλογικό σύστημα πλειοψηφίας είναι στη βάση του μη δημοκρατικό. Γιατί; Ας πάρουμε το εξής παράδειγμα των 100 ψηφοφόρων. Οι 40 ψηφίζουν για τον Α. Οι 30 για το Β και οι άλλοι 30 για το Γ. Αυτοί που ψήφισαν για το Β, αν δεν έβγαινε ο Β θα προτιμούσαν το Γ και όχι τον Α. Αυτοί που ψήφισαν για το Γ, αν δεν έβγαινε ο Γ θα προτιμούσαν το Β και όχι τον Α. Και αυτοί που ψήφισαν για τον Α, αν δεν έβγαινε ο Α θα προτιμούσαν το Β και όχι το Γ. Αμεσως αμέσως παρατηρούμε ότι τον Α τον θέλουν λιγότεροι (40) από αυτούς που τον αντιπαθούν (30+30). Και καταλήγουμε σε ένα κλίμα τόσο κοινωνικής όσο και πολιτικής αντιπάθειας. Αν όμως λάβουμε υπόψην τις δεύτερες προτιμήσεις των ψηφοφόρων τότε ο Β έχει 40 από αυτούς που θα ψήφιζαν τον Α συν 30 από αυτούς που θα ψήφιζαν το Γ (συν φυσικά τους δικούς του 30) και κανένα που τον αντιπαθεί. Δηλαδή όλοι θα προτιμούσαν το Β από τον Α!!!  


Φυσικά τα πράγματα δεν είναι τόσα απλά, αλλά αυτό που θέλω να δείξω είναι η ανάγκη να αναθεωρήσουμε τον τρόπο σκέψης μας γενικότερα. Η αθηναϊκη δημοκρατία ήταν δημοκρατία όχι μόνο λόγω της άμεσης ψήφου, αλλά επείδη οι πολίτες είχαν το δικαίωμα του εξοστρακισμού. Σήμερα αυτό δεν υπάρχει. 

Tuesday 4 August 2009

Η κατάπτωση του σύγχρονου νεοελληνικού πολιτισμού


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


Τα αίτια αυτής της κατάπτωσης μπορεί να ποικίλουν από την διαφθορά των πολιτικών και των πολιτών--δεν είναι μόνο οι πολιτικοί διεφθαρμένοι--μέχρι τη δομή του εκπαιδευτικού συστήματος. Σε πολλά συστήματα--με τον όρο σύστημα εννοείται οποιοδήποτε φυσικό ή κοινωνικό--άρση της αιτίας οδηγεί και σε άρση του αποτελέσματος. Παρόλ'αυτά η κατάπτωση του σύγχρονου πολιτισμού μας δεν άρεται απλά με την αλλαγή του εκπαιδευτικού συστήματος. Υψίστης σημασίας είναι η αλλαγή του τρόπου σκέψης ή καλύτερα η απαρχή της σκέψης, μιας και στη σύγχρονη κοινωνία η σκέψη, συνοδευόμενη από κριτική ικανότητα,   απουσιάζει παντελώς. 


H σύγχρονη δήθεν τεχνολογικά αναπτυγμένη κοινωνία μας έχει στη διάθεσή της μεταξύ των άλλων ηλεκτρονικούς υπολογιστές, ασύρματη επικοινωνία, πληθώρα μεταφορικών μέσων. Παρόλ'αυτά η γνώση των αρχών λειτουργίας τους αμελήται. Oι νέοι αδιαφορούν να μάθουν και αδιαφορούν να σκεφτούν. Ίσως επειδή δεν έχουν μάθει, αλλά πολύ πιο πιθανό είναι επειδή κάποιοι τους στέρουν εσκεμμένα αυτή τη δυνατότητα. Οι περισσότεροι νέοι που θέλουν να μάθουν κάτι παραπάνω φεύγουν στο εξωτερικό, επείδη η ελληνική πραγματικότητα τους στερεί ακριβώς αυτή τη δυνατότητα. 


Ο τρόπος διδασκαλίας έχει πλέον χάσει το νόημά του. Τα πανεπιστήμια αδυνατούν να διδάξουν, με φυσικά ελάχιστες εξαιρέσεις. Δεν υπάρχουν ελληνικά περιοδικά για τις φυσικές επιστήμες, τα μαθηματικά, τη φιλοσοφία ή αν υπάρχουν είναι απολιθωμένα σε μια προϊστορική εποχή. Παρ'όλαυτά βλέπουμε μικρές εστίες, που εκμεταλλεύονται τις νέες τεχνολογίες του διαδικτύου και προσπαθούν να αναζωπυρώσουν την όρεξη των νέων για μάθηση και για σκέψη.

Friday 26 June 2009

Maxima

To Maxima είναι ένα σύστημα υπολογιστικής άλγεβρας (computer algebra system) για την επεξεργασία συμβολικών και αριθμητικών εκφράσεων. Συμπεριλαμβάνει παραγώγιση, ολοκλήρωση, σειρές Taylor, μετασχηματισμοί Laplace, κανονικές διαφορικές εξισώσεις, συστήματα γραμμικών εξισώσεων, πολυώνυμα καθώς και σύνολα, διανύσματα, πίνακες και τανυστές.Το Maxima προσφέρει υψηλής ακρίβειας αριθμητικά αποτελέσματα χρησιμοποιώντας ακριβή κλάσματα, μεταβλητής ακρίβειας ακεραίους και μεταβλητής ακρίβειας πραγματικούς αριθμούς. Έχει τη δυνατότητα σχεδιασμού συναρτήσεων και δεδομένων σε δύο και τρεις διαστάσεις.

Το πρόγραμμα Maxima είναι τώρα πλέον ελεύθερο λογισμικό υπό την άδεια GNU GPL ενώ κατάγεται από το Macsyma, το θρυλικό σύστημα υπολογιστικής άλγεβρας που αναπτύχθηκε στα τέλη του 1960 στο πανεπιστήμιο της Μassachussetts.

Οι δυνατότητες του Maxima είναι απεριόριστες και εδώ θα περιοριστούμε στην παρουσίαση μερικών μόνο. Η γραμμή εντολών του χωρίζεται σε inputs και outputs, οπότε γράφοντας 9+7; θα πάρουμε ως αποτέλεσμα 16 (τo ; στο τέλος είναι απαραίτητο κατάλοιπο από τη C). Τίποτε το συνταρακτικό. Αν όμως δώσουμε 2/6; θα μας επιστρέψει 1/3, θα απλοποιήσει δηλαδή το κλάσμα χωρίς να υπολογίσει την προσέγγισή του. Αν θέλουμε ένα ρητό αριθμό ως προσέγγιση τότε θα πρέπει να γράψουμε float(1/3); για να πάρουμε το αποτέλεσμα 0.333333333333. Αλλά ας περάσουμε σε κάτι πιο θεαματικό. Ας υποθέσουμε ότι χρειαζόμαστε να αναπτύξουμε τον αριθμό 30! (30 παραγοντικό είναι 1*2*3*...*28*29*30) σε γινόμενο πρώτων παραγόντων, τότε γράφοντας factor(30!); παίρνουμε ως αποτέλεσμα 2^26*3^14*5^7*7^4*11^2*13^2*17*19*23*29. Φυσικά με τον ίδιο τρόπο μπορούμε να παραγοντοποιήσουμε πολυώνυμα factor(x^2 + x -6); για να δούμε (x-2)(x+3).

H επίλυση εξισώσεων γίνεται το ίδιο εύκολα solve(x^2-4,x); Το δεύτερο όρισμα, x, δηλώνει ως προς ποια μεταβλητή θα πρέπει να λυθεί η εξίσωση. Η παραγώγιση πραγματοποιείται με τη συνάρτηση diff(sin(x), x); Πάλι το δεύτερο όρισμα δηλώνει ως προς ποιά μεταβλητή πρέπει να παραγωγηθεί η δεδομένη συνάρτηση. Παρόμοια λειτουργεί και η αόριστη ολοκλήρωση integrate(1/x,x); και η ορισμένη ολοκλήρωση integrate(x+2/(x-3), x, 0, 1); H ανάπτυξη μιας συνάρτησης σε σειρά Taylor γίνεται με δύο τρόπους: niceindices(powerseries(%e^x, x, 0)); ή taylor(%e^x, x, 0, 5); Το όρισμα 0 δηλώνει σε ποιο σημείο να υπολογισθεί η σειρά ενώ στο δεύτερο τρόπο το όρισμα 5 δηλώνει πόσους όρους να δείξει στο αποτέλεσμα.

Φυσικά ένα τέτοιο πρόγραμμα θα ήταν ελλειπές αν δεν είχε δυνατότητες σχεδιασμού. Χρησιμοποιεί το πρόγραμμα gnuplot για το σχεδιασμό. Οι συναρτήσεις plot2d και plot3d δίνουν αυτή τη δυνατότητα. Tα αποτελέσματα των εντολών plot2d([x^2, x^3, x^4-x+1], [x,-10,10]);


και f(x,y):= sin(x) + cos(y); plot3d(f(x,y), [x,-5,5], [y,-5,5]); δίνουν τα αντίστοιχα διδιάστατα και τριδιάστατα γραφήματα. Στη δεύτερη περίπτωση ορίσαμε προηγουμένως μια νέα συνάρτηση χρησιμοποιώντας τον τελεστή := για να αποφύγουμε μια μακροσκελή εντολή.



To πρόγραμμα είναι γραμμένο σε Common Lisp και περιλαμβάνει μια πλήρη γλώσσα προγραμματισμού και σύνταξη παρόμοια με την ALGOL. Mπορεί να προσπελαστεί προγραμματιστικά και να επεκταθεί καθώς η υποκείμενη Lisp μπορεί να κληθεί μέσα από το Maxima. Μία άλλη πολύ ενδιαφέρουσα δυνατότητα του Maxima είναι η δημιουργία κώδικα για compiled γλώσσες προγραμματισμού όπως η FORTRAN.

Εγκαθίσταται πολύ απλά από τη γραμμή εντολών με sudo apt-get install maxima ή από το μενού Εφαρμογές > Προσθαφαίρεση Προγραμμάτων. Πρόσθετα πακέτα που μπορούν να φανούν χρήσιμα είναι τα maxima-doc, maxima-emacs, kayali (ένα GUI γραμμένο σε Qt), xmaxima (ένα GUI γραμμένο σε tcl/tk). Περισσότερες λεπτομέρειες μπορούν να βρεθούν στην ιστοσελίδα http://maxima.sourceforge.net/

Thursday 25 June 2009

Η τέχνη του προγραμματισμού

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

Γιατί τέχνη και γιατί προγραμματισμός; Προγραμματισμός γιατί όλες οι εφαρμογές στον υπολογιστή απαιτούν προγραμματισμό στη μία ή στην άλλη γλώσσα. Τέχνη γιατί δεν αρκεί να μάθει κανείς πως αναμιγνύονται τα χρώματα για να γίνει ζωγράφος, ούτε να μάθει να διαβάζει το πεντάγραμμο για να γίνει μουσικός. Φυσικά είναι απαραίτητες προϋποθέσεις αλλά δεν είναι οι μοναδικές. Έτσι και στον προγραμματισμό δε αρκεί να μάθει κανείς τη σύνταξη μιας γλώσσας για να πει ότι είναι προγραμματιστής.

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

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

H τέχνη του προγραμματισμού δεν περιλαμβάνει μόνο το γράψιμο κώδικα, αλλά κυρίως την αποσφαλμάτωσή του (debugging). Το πρώτο βήμα είναι η ορθή ανάγνωση του σφάλματος, το οποίο περιέχει αρκετές πληροφορίες για να βρούμε τη λύση του προβλήματος. Στην περίπτωση που το σφάλμα είναι bus error ή segmentation fault τότε αρχίζει η πραγματική τέχνη. Στη διαδικασία της αποσφαλμάτωσης ενά απλό printf διάσπαρτο σε διάφορα σημεία του κώδικα μπορεί να αντικαταστήσει και τον καλύτερο εργαλείο αποσφαλμάτωσης.

Η τέχνη του προγραμματισμού περιλαμβάνει την κατανόηση του πως λειτουργεί, στοιχειωδώς τουλάχιστον, ο μεταγλωττιστής (compiler) ή ο ερμηνευτής (interpreter) της γλώσσας που χρησιμοποιούμε. Μόνο έτσι θα μπορεί να βελτιστοποιήσει κανείς ένα πρόγραμμα ή να βρει ένα δύσκολο λάθος σε άλλο. Tαυτόχρονα να κατανοεί πως λειτουργεί ο υπολογιστής και το λειτουργικό σύστημα, για να κατανοήσει τι σημαίνει θέση μνήμης και δείκτης.

Η τέχνη του προγραμματισμού περιλαμβάνει τη γνώση των απαραίτητων εργαλείων που κάνουν τη ζωή του προγραμματιστή πιο εύκολη, αλλά ίσως και όχι. Τι θέλω να πω; Ο προγραμματιστής οφείλει να μπορεί να διαβάσει το Makefile ή το configure script ενός προγράμματος, να μπορεί να χρησιμοποιήσει debuggers και ταυτόχρονα όλα αυτά από τη γραμμή εντολών. Παρόλ'αυτά αν βρεθεί σε ένα καινούριο περιβάλλον να μπορεί να εξοικειωθεί γρήγορα με τα νέα εργαλεία του.

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

Προγραμματισμός σημαίνει να βρίσκεται η βέλτιστη λύση σε κάθε πρόβλημα. Το κριτήριο όμως της βελτιστότητας κάθε φορά διαφέρει. Άλλες φορές είναι η ταχύτητα εκτέλεσης και άλλες φορές η ταχύτητα συγγραφής. Πολλές φορές η μέθοδος "brute force" είναι αποδεκτή όταν ένας πολύπλοκος αλγόριθμος θα χαλάσει την απλότητα του προγράμματος, χωρίς αυτό να σημαίνει ότι απλότητα είναι πάντα και ωραία.

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

Ο καλύτερος τρόπος να αποκτήσει κανείς εμπειρία με τον προγραμματισμό είναι να αρχίσει να προγραμματίζει. Στον κόσμο του ελεύθερου λογισμικού όπου ο κώδικας είναι ελεύθερος οι δυνατότητες για μάθηση είναι απεριόριστες. Η μελέτη κώδικα που έχουν γράψει άλλοι προγραμματιστές και η βήμα-βήμα επέκτασή του είναι ενδεδειγμένη τεχνική στην απόκτηση εμπειρίας και γνώσεων. Είναι αλήθεια ότι στην αρχή όλα φαίνονται δυσνόητα και απρόσιτα αλλά με την πάροδο του χρόνου ο κώδικας αρχίζει και γίνεται κατανοητός.

Ο προγραμματισμός πρέπει να είναι στάση ζωής. Αυτό σημαίνει να βρίσκουμε αλγόριθμους για επίλυση προβλημάτων στην καθημερινή μας ζωή, όπως ποιός είναι ο συντομότερος δρόμος για τη δουλειά ή ποια είναι η βέλτιστη τακτική στο risk.

Τέλος, σημασία έχει να διασκεδάζουμε με αυτό κάνουμε, διαφορετικά όλα είναι μάταια (όχι ότι δεν είναι ούτως ή άλλως, αλλά ας πούμε ότι δεν είναι).

Wednesday 29 April 2009

Περί της λειτουργίας του εγκεφάλου

Oι νόμοι της φύσης υπάρχουν γιατί είμαστε---οι άνθρωποι δηλαδή---έλλογα όντα (είμαστε όντως;) ή μήπως είμαστε έλλογα όντα (αν είμαστε φυσικά) εξαιτίας των νόμων της φύσης; Οι φυσικοί νόμοι δηλαδή, προβλέπουν την ανθρώπινη ευφυία και αν ναι τότε προβλέπουν (με άμμεσο ή έμμεσο τρόπο) τις ερωτήσεις αυτές;

Τι μαθηματικά χρειάζονται για να περιγραφεί η λειτουργία του εγκεφάλου; Ποιοι είναι οι φυσικοί νόμοι που διέπουν τη λειτουργία του εγκεφάλου; Τα φαινόμενα της συνείδησης διέπονται τους νόμους της κβαντομηχανικής; Αλλά τι είναι συνείδηση;

Tuesday 28 April 2009

Αυτόματος έλεγχος

Στον αυτόματο έλεγχο (control) έχουμε ένα δυναμικό σύστημα (κανονική διαφορική εξίσωση) και προσπαθούμε να ελέγξουμε τις παραμέτρους του συστήματος ώστε να μας δώσει το επιθυμητό αποτέλεσμα. Με την ίδια λογική μπορούμε να επεκτείνουμε την έννοια του ελέγχου και σε μερικές διαφορικές εξισώσεις, αν και σε αυτή την περίπτωση μιλάμε για βελτιστοποίηση (optimization) πλέον και όχι για έλεγχο. Oι εφαρμογές της βελτιστοποίησης μερικών διαφορικών εξισώσεων ποικίλουν από τη ρευστομηχανική και τις κατασκευές μέχρι τον ηλεκτρομαγνητισμό και γενικότερα όλα τα φαινόμενα που μπορούν να περιγραφούν με μερικές διαφορικές εξισώσεις.

Τόσο η θεωρία του αυτόματου ελέγχου όσο και η βελτιστοποίηση μερικών διαφορικών εξισώσεων μπορεί να εφαρμοστεί σε plc για τον έλεγχο και βελτιστοποίηση σε πραγματικό χρόνο παραγωγικών διεργασίων.

Sunday 22 March 2009

FORTRAN

10 IF (.NOT.(ΕΧΩ ΔΙΑΒΑΣΕΙ ΑΥΤΟ)) ΤΗΕΝ
READ IT
ELSE
GOTO 10
END IF

Κάπως έτσι φαίνεται ο κώδικας στην τυποποίηση της FORTRAN 77. Όλα κεφαλαία, καθόλου identation, πολλά goto και άλλα πολλά που κάνουν τον κώδικα δυσανάγνωστο. Αλλά η αρχαιότερη γλώσσα υψηλού επιπέδου έχει εξελιχθεί αρκετά. Υποστηρίζει πολλά χαρακτηριστικά του αντικειμενοστραφή προγραμματισμού με τα modules, έχει δικούς της δείκτες (pointers), αλλά και συμβατούς με τη C δείκτες (Cray pointers οι οποίοι όμως δεν περιλαμβάνονται στην τυποποίηση). Το πλεονέκτημά της είναι η ταχύτητα εκτέλεσης και ότι υπάρχει μια απειρία από προγράμματα που μπορεί να βρει κανείς σχετικά με επιστημονικούς υπολογισμούς. Για παράδειγμα το scipy της python περιλαμβάνει πολλούς wrapper σε προγράμματα FORTRAN (από εδώ www.netlib.org) για διαφορικές εξισώσεις, μετασχηματισμούς Fourier κ.α.. Φυσικά η FORTRAN υποστηρίζει και τις δύο μορφές παραλληλοποίησης, openmp και mpi.

Σίγουρα στα γραφικά υστερεί. Aλλά για αυτό υπάρχει η C ή η python. H επικοινωνία με τη C είναι απλή (αν ξέρεις πως γίνεται δηλαδή), με παρόμοιο τρόπο γίνεται και με τη C++, αν και χρειάζεται και δεύτερο wrapper από C σε C++ για να μη χαθεί η αντικειμενοστρέφεια του κώδικα, με την python μπορεί να χρησιμοποιηθεί το πρόγραμμα f2py που γράφει ένα wrapper από τον FORTRAN κώδικα.

Θα μου πείτε ποιος χρησιμοποιεί ακόμη FORTRAN όταν υπάρχει η python, η java, η C++ και τόσες άλλες γλώσσες προγραμματισμού; Πολλοί. Η πλειονότητα των προγραμμάτων στους υπερυπολογιστές (high performance computing) και σμήνη υπολογιστών (clusters) είναι προγράμματα FORTRAN. Δεν πρόκειται να δείτε κανένα πρόγραμμα java.

Προγραμματίζοντας στη FORTRAN, όπως και στη C, μαθαίνει κανείς διαχείριση μνήμης. Το σίγουρο είναι ότι θα ψάχνεται με τις ώρες ένα bug που θα βγάζει segmentation fault ή bus error. Τα άλλα είναι σχετικά εύκολα, μιας και τα βρίσκει και o compiler.

Μετά θα μου πείτε, μα αφού υπάρχει το octave ή το scilab ή τα αντίστοιχα εμπορικά; Ναι, και πάλι το octave χρησιμοποιει συναρτήσεις FORTRAN για την επίλυση εξισώσεων. Φυσικά είναι πολύ πιο εύκολο να προγραμματίσεις κάτι στο octave, αλλά αν ένας πίνακας είναι μεγάλος, της τάξης των 1.000.000 στοιχείων, τότε θα πρέπει να περιμένετε μέρες.

Η FORTRAN υποστηρίζει και system call, δηλαδή μπορείτε να καλέσετε άλλα προγράμματα μέσω FORTRAN. Καθόλου καλή προγραμματιστική τεχνική αλλά γίνεται.

Tuesday 24 February 2009

Γραφικά με GTK+

Γενικά
Θέμα του οδηγού αυτού είναι τα γραφικά με τη χρήση της βιβλιοθήκης GTK+. Ο επίσημος οδηγός στα αγγλικά βρίσκεται εδώ: http://library.gnome.org/devel/gtk-tutorial/stable/ Τα παραδείγματα που χρησιμοποιώ βρίσκονται και στον αρχικό οδηγό. Παρ'όλ' αυτά δεν πρόκειται για μετάφραση μιας και ο μεταφραστής είναι προδότης (traduttore traditore :D ) αλλά για έναν καινουριο οδηγό.
Η GTK+ είναι μια βιβλιοθήκη που ξεκίνησε από το πρόγραμμα GIMP και εξελίχθηκε σε αυτόνομη βιβλιοθήκη. Παρέχει τις βασικές λειτουργίες για γραφικά, GUI, συμβάντα, κ.α.

Προαπαιτούμενα
Για τη χρήση της βιβλιοθήκης θα χρειαστεί να εγκαταστήσουμε μερικά πακέτα, τα build-essential, gtk+-2.0, pkg-config. To build-essential μας δίνει το GNU C μεταγλωττιστή, τo εργαλείo make κ.α., το gtk+-2.0 είναι η βιβλιοθήκη, και το pkg-config είναι ένα βοηθητικό πρόγραμμα που διαχειρίζεται τις παραμέτρους για το gcc. Aνοίγουμε το τερματικό και πληκτρολογούμε:

sudo apt-get install build-essential gtk+-2.0 pkg-config

Το πρώτο πρόγραμμα
Στον παρών οδηγό θα ασχοληθούμε με c, αλλά υπάρχουν και διεπιφάνειες και για άλλες γλώσσες προγραμματισμού. Ανοίγουμε ένα αρχείο bla.c και γράφουμε μέσα τον παρακάτω κώδικα:

#include <gtk/gtk.h>

int main( int argc,
char *argv[] )
{
GtkWidget *window;

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);

gtk_main ();

return 0;
}

Το αποθηκεύουμε και έπειτα το μεταγλωττίζουμε με την εντολή:

gcc bla.c -o bla `pkg-config --cflags --libs gtk+-2.0`

Προσοχή παραπάνω είναι ` και όχι ', αυτό σημαίνει αντικατάσταση του αποτελέσματος της εντολής pkg-config --cflags --libs gtk+-2.0, την οποία αν εκτελέσουμε μόνη της θα δούμε μια λίστα από διαδρομές, αρχεία, βιβλιοθήκες τα οποία είναι παράμετροι για το gcc. Φυσικά αν ξέρουμε τι κάνουμε αυτές τις παραμέτρους μπορούμε να τις τροποποιήσουμε με το χέρι.
Τρέχοντας το πρόγραμμα:

./bla

θα δούμε ένα παράθυρο που δεν έχει τη δυνατότητα τερματισμού εκτός από το ctrl+c.

H πρώτη γραμμή λέει στο πρόγραμμά μας ποια αρχεία να συμπεριλάβει. Η διαδρομή των αρχείων καθορίζεται από την εντολή pkg-config --cflags --libs gtk+-2.0. Μετά από τον απαραίτητο ορισμό του κυρίως προγράμματος main χρειαζόμαστε την κλήση της συνάρτησης gtk_init. Σε όλα τα προγράμματα αυτή η κλήση είναι απαραίτητη εκτός κι αν ξέρουμε τι κάνουμε. Όλες τις παραμέτρους από τη γραμμή εντολών που έχουν να κάνουν με τη gtk τις αφαιρεί από τη λίστα των παραμέτρων και τις υπόλοιπες μπορεί ο χρήστης να τις χρησιμοποιήσει όπως θέλει.

Στην gtk σχεδόν όλα είναι GtkWidgets. Έτσι και το παράθυρό μας είναι ένας δείκτης τύπου GtkWidget (GtkWidget *window). Αυτός είναι ο ορισμός του αλλά το παράθυρο δημιουργείται για πρώτη φορά στη γραμμή:

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

Δημιουργείται όμως στη μνήμη, τίποτε δε φαίνεται ακόμη στην οθόνη. Η εντολή που το προβάλλει είναι η:

gtk_widget_show (window);

Αλλά πάλι δε συμβαίνει τίποτε. Αρχίζουμε και βλέπουμε πράματα όταν ο κώδικάς μας μπει στο βρόγχο gtk_main (), ο οποίος είναι και ο κύριος βρόγχος του προγράμματός μας. Μετά από αυτή την εντολή τίποτε δε συμβαίνει.


Pygtk
Και ύστερα από την παραπάνω προτροπή ακολουθεί σε python. Η python είναι μια γλώσσα προγραμματισμού που δε χρειάζεται να μεταγλωττιστεί (interpreted και όχι compiled, ας με βοηθήσει κάποιος με την ελληνική ορολογία) Σε αυτή την περίπτωση θα χρειαστούμε επιπλέον το πακέτο pygtk.

Ανοίγουμε το τερματικό και πληκτρολογούμε python και μας περιμένει το γνωστό
>>>
Εδώ πληκτρολογούμε

>>>import pygtk
>>>import gtk

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

>>>window = gtk.Window(gtk.WINDOW_TOPLEVEL)

και το προβάλουμε με

>>> window.show()

Προφανώς ακόμη δεν εμφανίστηκε τίποτε στην οθόνη γιατί δε φτάσουμε στο κυρίως βρόγχο. Αυτό γίνεται με

>>>gtk.main_level()

Και πάλι το πρόγραμμά μας δεν έχει δυνατότητα τερματισμού εκτός από ctrl+c. Η δυνατότητα τερματισμού πραγματοποιείται με σύνδεση του συμβάντος με την αντίστοιχη εντολή.

Friday 13 February 2009

sed

H sed είναι κι αυτή μια γλώσσα προγραμματισμού για μαζική επεξεργασία κειμένου. Ο όρος μαζική αναφέρεται στην αλλάγη για παράδειγμα μιας ακολουθίας γραμματων με μία άλλη σε πολλά αρχεία. Δε θέλουμε φυσικά να κάνουμε αυτή τη δουλειά για όλα τα αρχεία με το χερί, γι'αυτό και υπάρχουν αυτά τα εργαλεία που την αυτοματοποιούν.

Aς υποθέσουμε ότι θέλουμε να αλλάξουμε σε ένα αρχείο, χωρίς να το ανοίξουμε με κάποιο πρόγραμμα, όλες τις εμφανίσεις της λέξης foo σε man. To αρχικό αρχείο είναι το old και αποθηκεύουμαι τις αλλαγές στο new. Αυτό γίνεται πολύ απλά με την παρακάτω εντολή:

sed s/foo/man/ < old > new

awk

Η awk είναι μια ακόμη γλώσσα προγραμματισμού που χρησιμοποιείται συνήθως σε συνδυασμό με προγράμματα κελύφους. Σκοπός της είναι να διευκολύνει την αναζήτηση σε αρχεία για ένα συγκεκριμένο μόρφωμα (pattern). Μπορεί να χρησιμοποιηθεί είτε ως εντολή από το τερματικό:
awk 'source code' input-file1 input-file2
ή αν το πρόγραμμα είναι αρκετά μεγάλο να εκτελεστεί από ένα αρχείο:
awk -f program-file input-file1 input-file2 ...
Ένα απλό πρόγραμμα awk είναι το εξής:
awk '{ print }'
το οποίο τυπώνει ό,τι γράψετε στην οθόνη (όχι με ανεξίτηλο μαρκαδόρο γιατι δε θα σβήνει μετα με τίποτε).
Ένα πιο χρήσιμο πρόγραμμα θα μπορούσε να είναι το εξής:
ps aux | awk '/foo/ { print $2 }'
το οποίο τυπώνει τη δεύτερη στήλη της εντολής ps μόνο αν μία συγκεκριμένη γραμμή περιέχει την ακολουθία foo.

grep

Η εντολή grep είναι από τις πλέον ισχυρές εντολές στο linux. H χρήση της συνήθως συνδυάζεται με τους διαύλους (pipes). Σκοπός της είναι η αναζήτηση μιας ακολουθίας χαρακτήρων σε ένα κείμενο. Αλλά ας δούμε ένα παράδειγμα. To αποτέλεσμα της εντολής:

ps aux

είναι όλες οι δειργασίες που εκτελουνται στον υπολογιστή μας από όλους τους χρήστες και όπως φαντάζεστε είναι αρκετά μακροσκελές. Εμείς όμως ψάχνουμε το id μιας συγκεκριμένης διεργασίας, η οποία ξέρουμε ότι περιέχει το συνδυασμό γραμμάτων qti. Για να αναζητήσουμε αυτή τη διεργασία διοχετεύουμε το αποτέλεσμα της εντολής ps aux με ένα δίαυλο στην εντολή grep:

ps aux | grep qti


η οποία μετά αναζητεί το συνδυασμό χαρακτήρων qti και επιστρέφει μόνο εκείνες τις γραμμές που περιεχουν αυτό το συνδυασμό. Φυσικά η χρήση διαύλων δε περιορίζεται μόνο σε έναν:

ps aux | grep qti | grep wx


(Eίναι πολύ πιθανό η παραπάνω εντολές να μην επιστρέψουν τίποτε αν δεν υπάρχουν διεργασίες με τετοιους συνδυασμούς γραμμάτων στο όνομά τους.)

Sunday 25 January 2009

Αρχαίες σοφίες...

"I wouldn't touch that if I were you."

"If it doesn't work on the first try, it certainly will on the 99th."

"The only thing better than working, is making plans to work."

"Well, all it needs is a bigger hammer."

"More steam! It worked for uncle, before he blew up, so it should work now!"

"If it works well with two wheels, just think how well it will work with eithy-four."

"What do you mean it isn't working? It worked four decades ago!"

Thursday 22 January 2009

Η θεωρία της σημειωτικής

Σύμφωνα με τη θεωρία της σημειωτικής (από τον Peirce μέχρι και τον Eco) σε ένα κείμενο μπορεί να υπάρχουν περισσότερες από μία ερμηνείες. Αλλά τι συμβαίνει με ένα μαθηματικό κείμενο; Mπορεί για ένα μαθηματικό κείμενο να υπάρχουν περισσότερες από μία ερμηνείες. Τι σημαίνει αυτό και πώς είναι δυνατό; Συνήθως οι μαθηματικοί τύποι είναι δύσκολο να παρερμηνευθούν αλλά υπάρχουν παραδείγματα που δείχνουν ακριβώς αυτό. Για παράδειγμα όταν ο Shannon ζήτηση τη συμβουλή του Neumann για το πως να ονομάσει ένα μέγεθος (αυτό που τώρα ονομάζουμε εντροπία Shannon) ο Neumann του πρότεινε την έννοια της εντροπίας, πιστεύοντας ότι είναι η ίδια με αυτή που ήξερε αυτός από την κβαντομηχανική. Παρ'όλαυτα οι δύο έννοιες δεν είναι ταυτόσημες και ανάλογα σε ποιο πλαίσιο τη συναντάμε οφείλουμε να την ερμηνεύουμε διαφορετικά.

Friday 9 January 2009

Αξιωματική θεμελίωση της φυσικής

Το έκτο πρόβλημα του Hilbert είναι η αξιωματική θεμελίωση όλης της φυσικής. Ο Ευκλείδης ήταν ο πρώτος ίσως που ξεκίνησε ένα τέτοιο έργο με την αξιωματική θεμελίωση της γεωμετρίας, γνωστής τώρα ώς ευκλείδειος γεωμετρίας. Αρχικά θέτονται τα αξιώματα του συστήματος το οποίο πρόκειται να αναλυθεί και έπειτα με λογικά επιχειρήματα παράγονται όλα τα υπόλοιπα θεωρήματα. Το ίδιο έκανε και η ομάδα των γάλλων μαθηματικών Bourbaki με τα Στοιχεία των Μαθηματικών για όλα τα πεδία των θεωρητικών μαθηματικών, τα οποία περιλαμβάνουν:
1. Θεωρία συνόλων
2. Άλγεβρα
3. Τοπολογία
4. Συναρτήσεις μίας πραγματικής μεταβλητής
5. Τοπολογικοί διανυσματικοί χώροι
6. Ολοκλήρωση
7. Αντιμεταθετική άλγεβρα
8. Ομάδες Lie
9. Φασματική θεωρία

Στο πεδίο της φυσικής υπάρχει τo έργο των Landau και Lifschitz που καλύπτει τα εξής θέματα:
1. Μηχανική
2. Κλασσική θεωρία πεδίων
3. Κβαντομηχανική: Μη σχετικιστική θεωρία
4. Κβαντική ηλεκτροδυναμική
5. Στατιστική φυσική Ι
6. Ρευστομηχανική
7. Θεωρία της ελαστικότητας
8. Ηλεκτροδυναμική των συνεχών μέσων
9. Στατιστική φυσική ΙΙ
10. Φυσική κινητική

Στο παρόν θα καλύψουμε μόνο τα θέματα της μηχανικής και θεωρίας της ελαστικότητας, ρευστομηχανικής, στατιστικής μηχανικής και φυσικής κινητικής. Η θεωρία πεδίων, η κβαντομηχανική και η ηλεκτροδυναμική δε θα περιληφθούν.

Η μεγαλύτερη δυσκολία σε μία τέτοια προσπάθεια προέρχεται από τη δυσκολία απόδειξης για την ύπαρξη ή μη λύσεως στις εξισώσεις Navier-Stokes.

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