Δευτέρα 24 Αυγούστου 2015

Μ2000 παράδειγμα: Σκακιέρες

Σκοπός του παραδείγματος είναι να κατανοήσει ο μαθητής την χρήση γραφικών με πολλαπλασιαστή που αυξάνει το μέγεθός τους, ώστε να σχηματίσει στην οθόνη τρείς φορές μια σκακιέρα με πιόνα σε τρία μεγέθη. Έχει προστεθεί κώδικας που εξάγει την οθόνη στο δίσκο και δείχνει την χρήση της εντολής Εικόνα Εξαγωγή για αρχείο jpg με 100% ποιότητα, όπου καταφέρνει ο αλγόριθμος να μειώσει το μέγεθος αρχείου (το βλέπουμε) και  να διατηρήσει την αρχική ποιότητα. Για να το δούμε αυτό τυπώνουμε την εικόνα μεγεθυμένη τρεις φορές!

Σε ένα αρχείο "σκακιερες.gsb" βάζουμε το παρακάτω. Μέσα από το περιβάλλον της γλώσσας ανοίγουμε το φάκελο του χρήστη με την εντολή Win Dir$ ή Σύστημα Κατ$ και εκεί μεταφέρουμε το αρχείο. Άλλος τρόπος είναι μέσα από το περιβάλλον να δώσουμε σ Α και να αντιγράψουμε το Α μετά σ Π και να αντιγράψουμε το Π και τέλος να σώσουμε Σώσε σκακιερες  (δεν χρειάζεται εισαγωγικά - Στην αναθερώρηση 49 αν έχουμε τελικό ς θέλει εισαγωγικά στο όνομα,Σώσε "σκακιερες" , θα διορθωθεί στην 50). Ξεκινάει το πρόγραμμα με το Α και enter.

Η Μ2000 διαβάζει και UTF8 κώδικα και απλό ANSI, και το ξεχωρίζει αυτόματα.

Υπάρχει και άλλος τρόπος: Τρέχουμε το M2000.exe και γράφουμε:
Σ "σκακιερες.gsb"
Τώρα αντιγράφουμε το παρακάτω και πατάμε Esc
Δημιουργήσαμε το αρχείο στο δίσκο, οπότε πρέπει να το φορτώσουμε:
Φόρτωσε σκακιερες
Μετά τρέχουμε το Α
Α

Υπάρχουν βοηθητικά πλήκτρα. Πχ το ctrl+A σώνει στο όνομα που είχαμε φορτώσει τελευταία. Το ctrl+U ανοίγει τις ρυθμίσεις της κονσόλας. Το ctrl+L ή Ctrl+Φ δίνει έτοιμο το Load ή το Φόρτωσε. Το Ctrl+C καθαρίζει τη κονσόλα (αν θέλουμε όλες τις γραμμές, δηλαδή να φύγουν και οι πάνω γραμμές που δεν ολισθαίνουν στο ξεκίνημα, δίνουμε οθόνη, 0 ή Φόρμα 60,30 ή άλλος συνδυασμός. Δείτε ότι στην εντολή οθόνη δεν έχουμε δώσει το πρώτο νούμερο που είναι το χρώμα φόντου για να χρησιμοποιήσει το τρέχον)
Πλήκτρα που συνήθως χρησιμοποιούμε είναι το Ctrl+N και Ctrl+M που δείχνουν τα τρέχοντα τμήματα και τα τμήματα στο δίσκο.  Όταν ανοίγουμε το διορθωτή σε κάποιο τμήμα μπορούμε να δούμε και άλλα τμήματα με το F12 και κλικ στο όνομα τμήματος, δείχνει επίσης και την παλιά έκδοση του τμήματος που αλλάζουμε). Στον διορθωτή παίζουν αρκετά πλήκτρα, μερικά από τα οποία φαίνονται στο μενού επιλογής (βγαίνει με δεξί κλίκ του ποντικιού). Αυτό το μενού ολισθαίνει και δείχνει και άλλες εντολές. Επίσης έχει την ιδιότητα να μεγενθύνεται όταν το τραβάμε από κάτω δεξιά. Αν επιλέξουμε στην γραμμή εντολών το Latin θα έρθουν τα μενού στα αγγλικά, ενώ με Greek θα έρθουν στα Ελληνικά, όπως και τα μηνύματα λάθους.


ΤΜΗΜΑ Α {
οθονη #103399,0
ανανεωση 10000
λ=0
μ=αληθες
σχ=1000
για λλ=1 εως 3 {
      σχ=σχ+λ*9
      συ=1000
      λ=300*λλ
      για κ=0 εως 7 {
            για ι=0 εως 7 {
                  θεση σχ+ι*λ, συ+κ*λ
                  αν μ τοτε { χ=3 } αλλιως χ=7
                  πολυγωνο χ, 0,λ,λ,0,0,-λ,-λ,0
                  μ~
                  θεση σχ+ι*λ, συ+κ*λ
                  αν κ=1 τοτε Π 1, λ
                  αν κ=6 τοτε Π 0, λ
            }
                  μ~     \\ εδώ έχουμε το μ = όχι μ
      }
      για ι=0 εως 7 {
            θεση σχ+ι*λ+λ/2.5, συ+κ*λ
            επιγραφη χαρ$(ι+65),"Arial", λ/50
            θεση σχ-λ/3, συ+ι*λ+λ/3
            επιγραφη γραφη$(ι+1),"Arial", λ/50
      }
     ανανεωση
}
ανανεωση 10
θεση 0,0 \\ εδώ είναι το πρόσθετο μέρος για να σώσει την  οθόνη με δυο φορμά, Jpg και Bmp
καθαρο α$
αντεγραψε κλιμαξ.χ, κλιμαξ.υ στο α$ \\ αντιγράφουμε την οθόνη σε ένα αλφαριθμητικό
εικονα α$ εξαγωγη "screen001.jpg", 100
αντεγραψε "screen001.bmp"   \\ αυτή είναι μια εντολή για απευθείας σώσιμο της οθόνης
\\ εδώ  μας δείχνει το μήκος των αρχείων
Τύπωσε αρχειου.μηκος("screen001.jpg"), αρχειου.μηκος("screen001.bmp")
}
ΤΜΗΜΑ Π {
\\ εδώ φτιάχνουμε το άσπρο ή μαύρο πιόνι, χρησιμοποιούμε σχετικές συντεταγμένες
ΔΙΑΒΑΣΕ ΧΡ, ΠΛΕΥΡΑ
Λ=ΠΛΕΥΡΑ/7000
ΑΝ ΧΡ<>0 ΤΟΤΕ ΧΡ=15
ΒΗΜΑ 3500*λ,2500*λ
Κ=ΠΕΝΑ
ΠΕΝΑ ΧΡ
ΠΟΛΥΓΩΝΟ ΧΡ,3000*Λ,4000*Λ,-6000*Λ,0,3000*Λ,-4000*Λ
ΚΥΚΛΟΣ ΓΕΜΙΣΜΑ ΧΡ, 2000*Λ
ΒΗΜΑ -3500*Λ,-2500*Λ
ΠΕΝΑ Κ
}



χρωματισμένα αυτόματα (έκδοση 8. αναθ. 69)








Σε Windows λειτουργικό, σε νεότερες εκδόσεις της Μ2000, μπορούμε να βάλουμε την εντολή  Ομαλά Ναι  (με Ομαλά Όχι γυρνάμε στο αρχικό), όπου για τα γραφικά χρησιμοποιείται το GDI+ (ενώ το βασικό είναι το GDI32, το οποίο είναι πιο γρήγορο). Με αυτό πετυχαίνουμε να έχουμε ομαλές ακμές. Η εντολή στα αγγλικά είναι Smooth On και Smooth Off. Αν λοιπόν βάλουμε την εντολή έστω στη πρώτη γραμμή του τμήματος Α θα έχουμε το παρακάτω (σε μεγέθυνση Χ3)
στο Ομαλά ναι:

 ή αν το αφήσουμε στο Ομαλά Όχι:

Δείτε ότι οι αριθμοί και στις δυο περιπτώσεις έχουν κάποια χρώματα, που δεν είναι κίτρινα. Αυτό συμβαίνει γιατί έχει μπει το Clear Type για οθόνες TFT. Προς το παρόν (έκδοση 9.4) τα γράμματα συνεχίζουν να εμφανίζονται με χρήση του GDI32.

Σε Linux τρέχει το GDI+ αλλά δεν κάνει smoothing (ενώ παίρνει την εντολή), προφανώς δεν κάνει κάτι επιπλέον από το GDI32 σε αυτό το θέμα. Αν κάποιος βρει ότι σε κάποια έκδοση του Wine, όντως δουλεύει το GDI+ όπως στα Windows, ας ενημερώσει.
 


Υπάρχει σκάκι στη Μ2000!
Ο κώδικας έχει περίπου 1000 εντολές της γλώσσας, είναι το μεγαλύτερο πρόγραμμα στο Info αρχείο (πιο μεγάλο κατά 33% από παράδειγμα με compiler μιας C τύπου γλώσσας που έχει όλα τα σταδια και με έλεγχο λαθών). Σχεδιάστηκε για να παίζει με δυο φυσικούς παίκτες με σκοπό να καταγράφει τις κινήσεις με έναν στάνταρ τρόπο, και να δίνει τη λίστα στο τέλος. Αυτός ο τρόπος καταγραφής χρησιμοποιείται από εξωτερικούς "εγκεφάλους" σκακιού, και μπορούμε να χρησιμοποιήσουμε έναν (όπου είναι αδύνατον να κερδίσουμε). Έτσι προέκυψε και το παιχνίδι εναντίον της μηχανής (τα μαύρα παίζουν με την ΤΝ). Το πρόγραμμα αν δεν βρει τον "εγκέφαλο", πάει σε παιχνίδι δυο ατόμων (δεν έχει δική του ΤΝ (τεχνητή νοημοσύνη) για να παίξει, αλλά έχει όλη τη γνώση για να ελέγχει αν μπορούν να γίνουν κινήσεις και φυσικά τη κωδικοποίηση της νέας θέσης. Μπορούμε να ξεκινάμε παιχνίδι με επιλεγμένη σειρά FEN σαν παράμετρο ή με επικόλληση σε πεδίο για αυτό . FEN λέγεται η κωδικοποίηση: https://www.chess.com/terms/fen-chess. Μπορούμε να πάμε πίσω μπρος τις κινήσεις. Η κίνηση των πιονιών γίνεται με το ποντίκι ή με συντεταγμένες γράφοντάς τις (όπως θέλουμε, και τα δυο είναι συνέχεια αποδεκτά). 
Η ΤΝ που χρησιμοποιώ είναι από εδώ: https://stockfishchess.org/ η stockfish_20090216_x64_modern.exe, στην οποία αλλάζουμε όνομα σε engine.exe και την τοποθετούμε στο φάκελο χρήστη που ανοίγει  στον explorer των Windows με win dir$ ή Σύστημα Κατ$ με ελληνικές εντολές όπου Κατ$ είναι ο τρέχον κατάλογος. Αν έχουμε αλλάξει κατάλογο τότε το dir user ή κατάλογος χρήστη μας πάει στον κατάλογο του χρήστη.

Εδώ είναι ο κώδικας:

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


Μ2000: Αναθεώρηση 40 (έκδοση 8).

Στην νέα αναθεώρηση 40 πέρασε και η λύση στο bug στο IDE (περιβάλλον προγραμματισμού) της Vb6 που βρήκα σε Windows 8 εξηντατετράμπιτα. Σε 32Bit Windows 7 και XP δεν υπάρχει θέμα. Το πρόβλημα δεν υπάρχει στο EXE (στο εκτελέσιμο).

Η γλώσσα Μ2000 σχεδόν έχει τελειώσει - δυο τρια πραγματάκια σκέφτομαι να προσθέσω. Θα ετοιμάσω το ελληνικό εγχειρίδιο "Μ2000: Ορισμός γλώσσας". Προς το παρόν υπάρχει το Αγγλικό Αυτό το καιρό εμπλουτίζω το παράρτημα εντολών και παράλληλα τεκμηριώνω την γλώσσα, δοκιμάζοντας τα παραδείγματα και αυτό παίρνει χρόνο.






Σάββατο 22 Αυγούστου 2015

Μ2000. Συμβατότητα με Windows 8 και 10.

Επιτέλους μετά από πειράματα έβγαλα εντελώς την σύνδεση με το GDI plus, που χρησιμοποιούσα στην Μ2000 για την εξαγωγή jpg αρχείου, και είχε πρόβλημα στα Windows 8  και 10 κατά την εξαγωγή jpg αρχείου. Βρήκα κωδικοποιητή σε vb6 και τον πέρασα στο κώδικα της γλώσσας και τώρα μπορώ να κάνω το ίδιο πράγμα μάλλον καλύτερα. Και αυτό γιατί αυτός που το έφτιαξε ακολούθησε τον ορισμό του βιβλίου..κατά γράμμα και δίνει την δυνατότητα να σώσουμε με ποιότητα ψηφιακής κάμερας.
Πώς γίνεται αυτή η διαφοροποίηση μεταξύ "εξαγωγής κάμερας" και μη; Λοιπόν υπάρχει αυτό SetSamplingFrequencies 1, 1, 1, 1, 1, 1 το οποίο δηλώνει τις τρεις συνιστώσες του μοντέλουYCbCr του jpg (δεν είναι το RGB αλλά φέρνει τοίδιο αποτέλεσμα, την εικόνα) πόσες δειγματοληψίες θα έχει στον αλγόριθμο. Περισσότερες δειγματοληψίες δημιουργούν μια απαλότητα, λιγότερες αφήνουν πιο "σκληρή" την εικόνα, με περισσότερο "γρέζι". Για εκτυπώσεις δεν χρειάζεται τόσο "γρέζι" και έτσι χρησιμοποιούν αυτό SetSamplingFrequencies 2, 2, 1, 1, 1, 1 Τα δυο πρώτα είναι η φωτεινότητα, και αυτής την διαφοροποίηση καταλαβαίνει περισσότερο το μάτι από τα άλλα δύο. Ο αλγόριθμος τελικά για το 2,2,1,1,1,1 θα πάρει για κάθε Pixel τη φωτεινότητα και τις συνιστώσες χρωμάτων μια για κάθε 2Χ2 pixel.
Στην γλώσσα Μ2000 η εξαγωγή γίνεται με την Image A$ Export "image1.jpg", 60   όπου για >50 ποιότητα έχουμε τις συχνότητες 1,1,1,1,1,1 και ίσο και κάτω (<=50) έχουμε το 2,2,1,1,1,1  οπότε μικρότερη ποιότητα σε μεγάλη φωτογραφία δεν φαίνεται η διαφορά (λόγω πολλών μεγαπίξελ). H μεταβλητή α$ κρατάει φωτογραφία ή εικόνα ασυμπίεστη. Μπορούμε να φορτώσουμε ένα αλφαριθμητικό με εικόνα από άλλο αλφαριθμητικό αλλάζοντας μέγεθος, να φορτώσουμε από αρχείο ή να φορτώσουμε από μέρος της οθόνης, δίνοντας πλάτος και ύψος με πάνω αριστερή γωνία τον δρομέα γραφικών. Τις εικόνες από τα αλφαριθμητικά μπορούμε να τις τυπώσουμε στην οθόνη ή στον εκτυπωτή με αλλαγή μεγέθους και περιστροφή, Ειδικές περιπτώσεις είναι η Διαφάνεια όπου ορίζουμε χρώμα για 100% διαφάνεια και παράμετρο για συνολικό ποσοστό διαφάνειας, με ταυτόχρονη αλλαγή μεγέθους και περιστροφή. Επίσης μπορούμε να ορίσουμε 32 επίπεδα (ή παίκτες) όπου βρίσκονται σε σειρά πάνω από την οθόνη χωρίς να "πατάνε" σε αυτήν και μπορούμε να τα μετακινήσουμε όπου θέλουμε. Οι παίκτες μπορούν να πάρουν εικόνα με περιστροφή και μλέγεθοςκαι να οριστεί χρώμα διαφάνειας αλλά και περιοχή διαφάνειας (πόσα γειτωνικά χρώματα επίσης θα είναι 100% διάφανα).

Έκδοση διερμηνευτή-περιβάλλοντος 8 αναθεώρηση 39.


Τετάρτη 19 Αυγούστου 2015

Χειρισμός Εγγράφων στη Μ2000 (ανανεώθηκε)

Η Μ2000 διαθέτει ένα τύπο μεταβλητής το Έγγραφο
Οποιοδήποτε αλφαριθμητικό ή στοιχείο πίνακα αλφαριθμητικών μπορεί να γίνει έγγραφο. Το έγγραφο διατηρεί τα δεδομένα του σε παραγράφους.Με αυτόν τον τρόπο έχουμε δυνατότητα να χειριστούμε μεγάλα κείμενα και να κινηθούμε ανά παράγραφο.
Επιπλέον έχουμε την δυνατότητα να αποθηκεύσουμε το έγγραφο με έναν από τέσσερις τρόπους. Εδώ θα δούμε ένα πρόγραμμα που φτιάχνει τέσσερις φορές το ίδιο έγγραφο, και σε κάθε φορά το σώνει και το προσθέτει επίσης (έτσι διπλασιάζει το μήκος του αρχείου). Μετά μας το παρουσιάζει στον διορθωτή (εμείς απλά πατάμε Esc για να κλείσει) και μας λέει το μέγεθός του στο δίσκο.

Εδώ θα δούμε τις Τύπωσε πάνω, Τύπωσε μέρος, Τύπωσε υπό, νέες εντολές της έκδοσης 8 για την παρουσίαση τιμών και λέξεων στην οθόνη. Η πρώτη διαγράφει πρώτα το φόντο της γραμμής που θα γράψουμε και κάνει πρόσκαιρα το πλάτος της στήλης όσο το πλάτος της οθόνης σε χαρακτήρες. Έτσι μας βολεύει να τυπώσουμε με στοίχιση στο κέντρο, εδώ γίνεται με την $(6), μια εσωτερική συνάρτηση χειρισμού της Τύπωσε. Η δεύτερη τυπώνει χωρίς να αλλάζει γραμμή ακόμα και αν βάλουμε περισσότερες στήλες από όσες χωράνε. Η τελευταία βάζει πρώτα μια υπογράμμιση και μετά αλλάζει γραμμή εκτύπωσης και γίνεται σαν την Τύπωσε Μέρος.

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

Επίσης εδώ χρησιμοποιούμε την Για Επόμενο και όχι την Για {} χωρίς κάποιο ιδιαίτερο λόγο (η Για {} είναι πιο γρήγορη αλλά δεν μας ενδιαφέρει εδώ) .

Δείτε πως με μια ανάθεση τιμών γεμίζουμε τον πίνακα α$() με τέσσερα στοιχεία.

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

Τέλος δείτε ακόμα και τη συνάρτηση μορφή$(). Δεν φαίνεται εδώ η περίπτωση στρογγυλοποίησης αριθμού:

Τύπωσε μορφή$("Α={0:2}, Β={1:2}", 2.567, 3.789)
 Μπορεί κανείς να το αντιγράψει σε ένα τμήμα. Με μια εντολή Σ α ανοίγει ο διορθωτής στο τμήμα α και αντιγράφουμε το παρακάτω (απαιτεί την τελευταία αναθεώρηση 34 της έκδοσης 8, δείτε τον σύνδεσμο δεξιά στη στήλη)

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

Τα αρχεία σώνονται στο κατάλογο του χρήστη (δεν ορίσαμε κάτι άλλο εδώ)

Φόρμα 60,32
οθονη 15 \\ άσπρο
πένα 0 \\ μαύρο
Πίνακας α$(4) : α$(0)="UTF-16LE","UTF-16BE","UTF-8","ANSI"
Τύπωσε πάνω $(6),"Παράδειγμα για αποθήκευση εγγράφου με τέσσερις τρόπους"
Για ι=0 έως 3
       Καθαρό δοκίμασέμε$
      Εγγραφο δοκίμασέμε$ = {1η γραμμή
                              2η γραμμή
                              3η γραμμή
                              }
       δοκίμασέμε$={4η γραμμή  \\ πάτα απλά Esc
                               }
       Τύπωσε υπό  "Σώνω μια φορά και προσθέτω άλλη μια:"  : Τύπωσε
      \\ 10 χαρακτήρες δεξί περιθώριο για την αναφορά
      Τύπωσε @(10), : Αναφορά δοκίμασέμε$ : Τύπωσε @(0),   \\ επιστρέφει ο δρομέας τέρμα αριστερά
      Σώσε.έγγραφο δοκίμασέμε$, "alfa1.txt", ι
       Πρόσθεσε.έγγραφο δοκίμασέμε$, "alfa1.txt", ι
      Τύπωσε μέρος μορφή$({Μήκος αρχείου "{0}" σε bytes {1} τύπος {2}, συνολικοί χαρακτήρες {3}}, "alfa1.txt", αρχείου.μήκος("alfa1.txt"), α$(ι), Εγγράφου.μήκος(δοκίμασέμε$)*2)
       συγγραφή "alfa1.txt"
Επόμενο ι
Τύπωσε υπό


(κάθε φορά που μας ανοίγει το διορθωτή το σύστημα πατάμε Esc για να βγεί)
στην εικόνα εμφανίζονται συνολικοί χαρακτήρες 132, αλλά βγαίνουν 124, και σε Linux/Wine και σε Windows (μάλλον είναι παλιά η εικόνα)


Προσθήκη (21 Οκτ 2021):
Η Σώσε.έγγραφο παίρνει τελευταίο νούμερο τα παρακάτω (αν θέλουμε το δίνουμε αλλιώς αν έχουμε κάνει Φόρτωσε.έγγραφο τότε αυτόματα βρίσκει ο διερμηνευτής τι σύστημα χρησιμοποιούμε και θέτει εσωτερικά το σωστό νούμερο για να γίνει σωστά το σώσιμο αργότερα. Αν θέλουμε όμως επιβάλουμε άλλο τρόπο).
NoBom σημαίνει ότι δεν θα γραφτούν στην αρχή του αρχείου αναγνωριστικά κωδικοποίησης (ΒΟΜ).
lf είναι το 10 ή αλλιώς line feed (το χρισημοποιεί το Linux)
cr είναι το 13 ή αλλιώς carriage return (το χρισημοποιεί το Mac) 
Τα windows χρησιμοποιούν τα cr+lf (13+10, δυο χαρακτήρες). Το έγγραφο εσωτερικά δεν αποθηκεύει για κάθε παράγραφο τους παραπάνω χαρακτήρες. Τους βάζει μόνο όταν γράφει σε αρχείο! Αν όμως γράψουμε ένα αλφαριθμητικό από έγγραφο ή συγκρίνουμε ένα έγγραφο με ένα αλφαριθμητικό τότε πρόσκαιρα το έγγραφο θα δοθεί με cr+lf, χωρίς να υπολογίζει πως ήταν στο αρχείο απ΄όπου αρχικά φορτώθηκε το έγγραφο.

0 UTF-16LE
-4 UTF-16LE No BOM    10 lf   -10 lf NoBom, 20 cr -20 cr NoBom
1 UTF-16BE -1 NoBom   11 lf -11 lf NoBom  21 cr -21 cr NoBom
2 UTF-8  -2 NoBom   12 lf -11 lf NoBom  22 cr -22 cr NoBom
3 ANSI (ότι είναι το σύστημα)
1032  - ANSI Greek Locale (δίνουμε το δικό μας νούμερο). Έτσι το έγγραφο μπορεί να αποθηκευτεί με το τρόπο που θέλουμε (προσοχή γιατί αν έχουμε χαρακτήρες που δεν υπάρχουν στο 1032 ή όποιο άλλο, τότε θα μπει το 63, δηλαδή ο χαρακτήρας ? σε κάθε αποτυχία κωδικοποίησης).
Με το πρόγραμμα παρακάτω βλέπουμε για νούμερα μεταξύ -22 και 22, τι βγαίνει!
α=-12
Τύπωσε " Κωδικοποίηση "+αν$(απολ(α υπολ 10) υπολ 4+1->"UTF-16LE", "UTF-16BE", "UTF-8", "ANSI");
Τύπωσε " | Αλλαγή γραμμής:"+αν$(απολ(α δια 10) +1->"crlf", "lf", "cr");
Τύπωσε " | BOM: "+αν$(α<0->"No ", "")


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

Απλός κώδικας
(Η τύπωσε εμφανίζει τους χαρακτήρες 10 και 13 ως διάστημα):

δείκτης_σε_διάρθρωση=διάρθρωση("alfa1.txt")
τύπωσε δεκαεξ$(0, 2);" ";
για ι=0 έως μήκος(δείκτης_σε_διάρθρωση)-1
      τύπωσε δεκαεξ$(Εκφρ(δείκτης_σε_διάρθρωση, ι), 1);" ";
      αν (ι+1) υπολ 10=0 τότε
            τύπωσε " "+χαρ$(εκφρ$(δείκτης_σε_διάρθρωση, ι-9, 10))
            τύπωσε δεκαεξ$(ι, 2);" ";
      τέλος αν
επόμενο
κ=1
ενώ ι υπολ 10>0 : Τύπωσε "ΧΧ ";: ι++:κ++: τέλος ενώ
τύπωσε " "+χαρ$(εκφρ$(δείκτης_σε_διάρθρωση, ι-10 , 10-κ))

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

Έγγραφο ΕξαγωγήΚειμένου$
Σταθερή πλ=16
δείκτης_σε_διάρθρωση=διάρθρωση("alfa1.txt")
ΕξαγωγήΚειμένου$=δεκαεξ$(0, 2)+" "
για ι=0 έως μήκος(δείκτης_σε_διάρθρωση)-1
      ΕξαγωγήΚειμένου$=δεκαεξ$(Εκφρ(δείκτης_σε_διάρθρωση, ι), 1)+" "
      αν (ι+1) υπολ πλ=0 τότε
            ΕξαγωγήΚειμένου$=" "+@Αλλαξεχαρ$(εκφρ$(δείκτης_σε_διάρθρωση, ι-πλ+1, πλ))+{
            }
            ΕξαγωγήΚειμένου$=δεκαεξ$(ι+1, 2)+" "
      τέλος αν
επόμενο
κ=1
ενώ ι υπολ πλ>0 : ΕξαγωγήΚειμένου$="ΧΧ ": ι++:κ++: τέλος ενώ
ΕξαγωγήΚειμένου$= " "+@Αλλαξεχαρ$(εκφρ$(δείκτης_σε_διάρθρωση, ι-πλ , πλ+1-κ))
Πρόχειρο ΕξαγωγήΚειμένου$
Γραμματοσειρά "Courier New"
Φόρμα 80, 25
Αναφορά ΕξαγωγήΚειμένου$
Τέλος
// Στατική συνάρτηση. Την καλούμε με @ΑλλαξεΧαρ$()
Συνάρτηση ΑλλαξεΧαρ$(Τι$)
      τοπικές ι, όλο$, ένα$, κωδ
      για ι=1 έως μήκος(Τι$)*2 ' ανά Byte -(ψηφίο)
            ένα$=χαρ$(μεσ$(Τι$, ι, 1 ως ψηφίο))
            κωδ=χαρκωδ(ένα$)
            Αν κωδ>=0 και κωδ<=31 τότε ένα$="."
            ολο$+=ένα$
      επόμενο
      =όλο$
Τελος Συνάρτησης


Αποτέλεσμα (πλ=10)

0000 31 E7 20 E3 F1 E1 EC EC DE 0D  1η γραμμή.
000A 0A 32 E7 20 E3 F1 E1 EC EC DE  .2η γραμμή
0014 0D 0A 33 E7 20 E3 F1 E1 EC EC  ..3η γραμμ
001E DE 0D 0A 34 E7 20 E3 F1 E1 EC  ή..4η γραμ
0028 EC DE 20 20 5C 5C 20 F0 DC F4  μή  \\ πάτ
0032 E1 20 E1 F0 EB DC 20 45 73 63  α απλά Esc
003C 0D 0A 31 E7 20 E3 F1 E1 EC EC  ..1η γραμμ
0046 DE 0D 0A 32 E7 20 E3 F1 E1 EC  ή..2η γραμ
0050 EC DE 0D 0A 33 E7 20 E3 F1 E1  μή..3η γρα
005A EC EC DE 0D 0A 34 E7 20 E3 F1  μμή..4η γρ
0064 E1 EC EC DE 20 20 5C 5C 20 F0  αμμή  \\ π
006E DC F4 E1 20 E1 F0 EB DC 20 45  άτα απλά E
0078 73 63 0D 0A ΧΧ ΧΧ ΧΧ ΧΧ ΧΧ ΧΧ  sc..

Αποτέλεσμα (πλ=16)

0000 31 E7 20 E3 F1 E1 EC EC DE 0D 0A 32 E7 20 E3 F1  1η γραμμή..2η γρ
0010 E1 EC EC DE 0D 0A 33 E7 20 E3 F1 E1 EC EC DE 0D  αμμή..3η γραμμή.
0020 0A 34 E7 20 E3 F1 E1 EC EC DE 20 20 5C 5C 20 F0  .4η γραμμή  \\ π
0030 DC F4 E1 20 E1 F0 EB DC 20 45 73 63 0D 0A 31 E7  άτα απλά Esc..1η
0040 20 E3 F1 E1 EC EC DE 0D 0A 32 E7 20 E3 F1 E1 EC   γραμμή..2η γραμ
0050 EC DE 0D 0A 33 E7 20 E3 F1 E1 EC EC DE 0D 0A 34  μή..3η γραμμή..4
0060 E7 20 E3 F1 E1 EC EC DE 20 20 5C 5C 20 F0 DC F4  η γραμμή  \\ πάτ
0070 E1 20 E1 F0 EB DC 20 45 73 63 0D 0A ΧΧ ΧΧ ΧΧ ΧΧ  α απλά Esc..

Αποτέλεσμα (πλ=8)

0000 31 E7 20 E3 F1 E1 EC EC  1η γραμμ
0008 DE 0D 0A 32 E7 20 E3 F1  ή..2η γρ
0010 E1 EC EC DE 0D 0A 33 E7  αμμή..3η
0018 20 E3 F1 E1 EC EC DE 0D   γραμμή.
0020 0A 34 E7 20 E3 F1 E1 EC  .4η γραμ
0028 EC DE 20 20 5C 5C 20 F0  μή  \\ π
0030 DC F4 E1 20 E1 F0 EB DC  άτα απλά
0038 20 45 73 63 0D 0A 31 E7   Esc..1η
0040 20 E3 F1 E1 EC EC DE 0D   γραμμή.
0048 0A 32 E7 20 E3 F1 E1 EC  .2η γραμ
0050 EC DE 0D 0A 33 E7 20 E3  μή..3η γ
0058 F1 E1 EC EC DE 0D 0A 34  ραμμή..4
0060 E7 20 E3 F1 E1 EC EC DE  η γραμμή
0068 20 20 5C 5C 20 F0 DC F4    \\ πάτ
0070 E1 20 E1 F0 EB DC 20 45  α απλά E
0078 73 63 0D 0A ΧΧ ΧΧ ΧΧ ΧΧ  sc..

Αν δώσουμε το Τοπικό 1033 (το 1032 είναι τα ελληνικά) τότε θα πάρουμε το παρακάτω γιατί η χαρ$() παίρνει τα ψηφία (bytes) και τα μετατρέπει σε UTF16 κωδικοποίηση βάσει του τοπικού (locale ID):

0000 31 E7 20 E3 F1 E1 EC EC  1ç ãñáìì
0008 DE 0D 0A 32 E7 20 E3 F1  Þ..2ç ãñ
0010 E1 EC EC DE 0D 0A 33 E7  áììÞ..3ç
0018 20 E3 F1 E1 EC EC DE 0D   ãñáììÞ.
0020 0A 34 E7 20 E3 F1 E1 EC  .4ç ãñáì
0028 EC DE 20 20 5C 5C 20 F0  ìÞ  \\ ð
0030 DC F4 E1 20 E1 F0 EB DC  Üôá áðëÜ
0038 20 45 73 63 0D 0A 31 E7   Esc..1ç
0040 20 E3 F1 E1 EC EC DE 0D   ãñáììÞ.
0048 0A 32 E7 20 E3 F1 E1 EC  .2ç ãñáì
0050 EC DE 0D 0A 33 E7 20 E3  ìÞ..3ç ã
0058 F1 E1 EC EC DE 0D 0A 34  ñáììÞ..4
0060 E7 20 E3 F1 E1 EC EC DE  ç ãñáììÞ
0068 20 20 5C 5C 20 F0 DC F4    \\ ðÜô
0070 E1 20 E1 F0 EB DC 20 45  á áðëÜ E
0078 73 63 0D 0A ΧΧ ΧΧ ΧΧ ΧΧ  sc..

Τα αλφαριθμητικά της Μ2000 κανονικά έχουν κωδικοποίηση UTF16. Όμως μπορούμε να βάλουμε ότι θέλουμε αρκεί να τα χειριστούμε σωστά. Στο παράδειγμα η χαρ$() περιμένει ένα αλφαριθμητικό (μια περίπτωση είναι αυτή) να έχει ANSI κωδικοποίηση δηλαδή bytes. Το μήκος ενός αλφαριθμητικού μπορεί να είναι ζυγός (αν έχουμε UTF16) ή μπορεί να είναι οτιδήποτε αν έχουμε ANSI ή UTF8. Μπορούμε να χειριστούμε ANSI με τα Αρισ$(), Δεξι$(), Μεσ$() βάζοντας τo ως ψηφίο. Η Μήκος() δίνει για τα αλφαριθμητικά αριθμό των Words (2 bytes). Οπότε δίνει και μισό, δηλαδή αν έχουμε 7 bytes θα μας δώσει 3.5 μήκος. Για να φτιάξουμε το ΑΒ ελληνικό σε ένα αλφαριθμητικό με μήκος 1 (2 Bytes ή ψηφία): Τοπικό 1032 (μπορούμε να το δούμε και με την Τύπωσε Τοπικό), μετά 

α$=γραφή$("Α"): α$=γραφή$(χαρ$(α$)+"Β"):τύπωσε μήκος(α$), χαρ$(α$)

θέλει πάλι μετατροπή για να δούμε:     1ΑΒ
Το + δουλεύει για UTF16.

Δυαδικά αρχεία
Άλλος τρόπος είναι να χρησιμοποιήσουμε μια διάρθρωση μνήμης και να βάζουμε τα αλφαριθμητικά στη θέση τους. Εδώ στη μετάθεση 0 βάζουμε το Α και στην 1 το Β. Οι διαρθρώσεις δίνουν πραγματικές διευθύνσεις, στο παράδειγμα το Όλα(0) δίνει την διεύθυνση στη μνήμη που γράφτηκε το Α. Για τις περισσότερες περιπτώσεις μας αρκεί να δουλεύουμε με μεταθέσεις (offsets). Όταν όμως θέλουμε να δώσουμε σε μια κλήση βιβλιοθήκης ή σε εκτέλεση γλώσσας μηχανής χώρο για ανάγνωση και εγγραφή στοιχείων, τότε δίνουμε την διεύθυνση. Και στις δυο περιπτώσεις δεν υπάρχει κάτι άλλο να δώσουμε! 

Διάρθρωση Ολα ως ψηφίο*2
Επιστροφή Όλα, 0:=γραφή$("Α"), 1:=γραφή$("Β")
Τύπωσε χαρ$(Εκφρ$(Όλα))

Το Εκφρ$(Όλα) γυρνάει όλη την διάρθρωση ως αλφαριθμητικό χωρίς να κάνει καμία μετατροπή. Ουσιαστικά φτιάχνει ο διερμηνευτής ένα αλφαριθμητικό με μήκος όσο η διάρθρωση και κάνει αντιγραφή!
Μπορούμε να γράψουμε τη διάρθρωση σε αρχείο. Οι εντολές Πάρε και Δώσε δέχονται και τρίτη παράμετρο που λέει σε ποιο σημείο στο αρχείο θα πάρουμε ή θα δώσουμε ψηφία (bytes) όσο το μήκος της διάρθρωσης. Στη Μ2000 τα bits λέγονται ψηφίδες και τα Βytes λέγονται ψηφία. 

Άνοιξε "δυοψηφία.txt" για εξαγωγή ως #Κ
Δώσε #Κ, Όλα ' μεταθέτει την επόμενη εγγραφή κατά το μήκος του Όλα
Κλείσε #Κ
Τύπωσε Αρχείου.Μήκος("δυοψηφία.txt")=2

Προσοχή η περίπτωση "για εξαγωγή" πρώτα καθαρίζει ένα υπάρχον αρχείο και μετά το γεμίζει. Οπότε μια μόνο φορά χρειάζεται η περίπτωση "για εξαγωγή" όταν θα γράψουμε για πρώτη φορά στο αρχείο. Πώς ξέρουμε ότι το αρχείο υπάρχει ήδη; Υπάρχει η συνάρτηση Υπάρχει() όταν παίρνει όρισμα τιμή αλφαριθμητικού, το όνομα του αρχείου.  Έστω ότι πράγματι υπάρχει το αρχείου. Για να το δουλέψουμε ή θα χρησιμοποιούμε δυο δρομείς (δηλαδή θα ανοίξουμε δυο φορές το ίδιο αρχείο, μια για εισαγωγή και μια για συμπλήρωση), ή μια φορά (για συμπλήρωση) όπως στο παράδειγμα:

Μ=Αρχείου.Μήκος("δυοψηφία.txt")
Άνοιξε "δυοψηφία.txt" για συμπλήρωση ως #Κ
      Τύπωσε μετάθεση(#κ)
      μετάθεση #κ, Μ+1
      Δώσε #Κ, Όλα, ' μεταθέτει την επόμενη εγγραφή κατά το μήκος του Όλα
      μετάθεση #κ, 1
      Πάρε #κ, Όλα
Κλείσε #Κ
Τύπωσε Αρχείου.Μήκος("δυοψηφία.txt")

Έστω ότι πριν ξεκινήσουμε το παραπάνω πρόγραμμα, έχουμε αποθηκεύσει μια φορά το Όλα, δηλαδή το μήκος του αρχείου είναι 2.  Θα μας τυπώσει τη θέση της συμπλήρωσης Μ+1 δηλαδή το 3 (που δεν υπάρχει για την ώρα), και η Δώσε θα βάλει στο 3 και στο 4 τα δυο ψηφία του Όλα. Οπότε το μήκος αρχείου θα γίνει 4 (θα το δούμε στη τελευταία τύπωσε). Με τη μετάθεση στο 1 παίρνουμε δυο ψηφία από την αρχή του αρχείου. Μπορούμε να πάρουμε από όπου θέλουμε γιατί η μετάθεση γίνεται ανά ψηφίο, έτσι το μετάθεση #κ, 2 θα μας πάει στο δεύτερο ψηφίο. Μια Πάρε από εκεί θα μας δώσει δυο ψηφία, το 2ο και 3ο του αρχείου. Αν ζητήσουμε ψηφία που δεν υπάρχουν (η ζήτηση περνάει το τέλος αρχείου) θα βγει λάθος! Η μόνη περίπτωση που βάζουμε τη μετάθεση σε στοιχείο που δεν υπάρχει είναι για να προσθέσουμε στο τέλος (όπως στο Μ+1 στο παράδειγμα).

Στα αρχεία δεν υπάρχει θέση 0. Το πρώτο ψηφίο (byte) είναι στην θέση 1.

Η εντολή Άνοιξε δουλεύει κύρια για σειριακά αρχεία. Εδώ όμως με τη χρήση των μετάθεση, μετάθεση(), Πάρε και Δώσε καθώς και το Αρχείου.Μήκος() και με πακέτα τις διαρθρώσεις (γράφονται και διαβάζονται στο μήκος τους), έχουμε αυτό που λέμε random access αρχεία αλλά και δυαδικά αφού δεν μας ενδιαφέρει η κωδικοποίηση κατά τη μεταφορά.
Οι βασικοί τρόποι ανοίγματος είναι τέσσερις: Εξαγωγή (σβήνει το αρχείο αν το βρει στο άνοιγμα), Εισαγωγή, Συμπλήρωση, Πεδία. Στα πεδία δίνουμε στο τέλος το Μήκος σε χαρακτήρες (1 ή 2 ψηφία ανάλογα το τρόπο ανοίγματος. Υπάρχουν δυο λέξεις που αλλάζουν το τρόπο ανοίγματος. Η λέξη Ευρεία δουλεύει για UTF16 (ειδικά για όσα γράμματα έχουν μόνο δυο ψηφία). Η Λέξη Αποκλειστικά δεν επιτρέπει σε άλλο πρόγραμμα να ανοίξει το αρχείο μέχρι να το κλείσουμε. Δείτε τη βοήθεια Άνοιξε.


Γιώργος Καρράς

Κυριακή 9 Αυγούστου 2015

Copy In - Copy Out

Διαβάζω για την ΓΛΩΣΣΑ του Λυκείου ότι έχει χρησιμοποιηθεί η τεχνική του Copy in - copy out στις διαδικασίες. Ουσιαστικά αυτή η τεχνική έχει νόημα όταν μιλάμε για πέρασμα τιμής σε καταχωρητή (ίσως και αλλού αλλά εδώ θα το προσπεράσω). Δηλαδή όταν ο μεταφραστής πρέπει να χρησιμοποιήσει μια παράμετρο τύπου μεταβλητής και μπορεί να τον μεταφέρει σε ένα εσωτερικό καταχωρητή που δουλεύει πολύ πιο γρήγορα από την μνήμη τότε κάνει ένα αντίγραφο στο καταχωρητή και όταν τελειώσει την διαδικασία ότι τιμή έχει ο καταχωρητής σώνεται ξανά στη μεταβλητή. Αν κάποιος περάσει με αναφορά την ίδια μεταβλητή δυο φορές και εφόσον ο μεταφραστής βρει δυο καταχωρητές, τότε μπορεί να βάλει την ίδια τιμή και ότι αλλαγές γίνουν η μεταβλητή θα πάρει την τελευταία από το σώσιμο του τελευταίου καταχωρητή! Γιατί να το κάνει κάποιος αυτό; Η ιδέα που διαβάζω (άλλων) είναι ότι στην πολυεπεξεργασία (η ΓΛΩΣΣΑ δεν έχει τέτοιο πράγμα), ενδέχεται να αλλάξει κάποιος τιμή σε μια μεταβλητή ενώ αυτή "δουλεύει" σε μια διαδικασία, περασμένη με αναφορά. Τα συστήματα πολυεπεξεργασίας δεν δουλεύουν έτσι ατάκτως ριγμένα, κοινές αποθήκες (πίνακες ας πούμε) δεν διαβάζονται από όλους αλλά με αιτήματα, κάνεις αίτημα, και περιμένεις τη σειρά σου για να πάρεις τιμές. Η Μ2000 χρησιμοποιεί κάτι ανάλογο με τα semaphores δηλαδή έχει μπλοκ εντολών που μπορούν να τρέξουν όταν μια μεταβλητή λέει "οκ", και την ώρα που τρέχουν αυτή η μεταβλητή λέει "οχι οκ" δηλαδή οποιοδήποτε άλλο μπλοκ εντολών με την ίδια μεταβλητή χειρισμού δεν μπορεί να τρέξει.
To Κ εδώ το φτιάχνει η Μερος {} ως μεταβλητή
\\ semaphore Κ
Μερος {
      τυπωσε Κ
      τυπωσε "εδώ τυπώνει"
      μερος {
            τυπωσε "δεν τυπώνει ποτέ"
      } ως Κ
} ως Κ

Όμως σαν άσκηση ας δούμε πως γίνεται στην Μ2000 η Copy-in Copy-out. Βάζω στα αγγλικά τα ονόματα των τμημάτων για να δείξω το πέρασμα όπως λέγεται (By Value με τιμή, By Reference με αναφορά). χρησιμοποιώ την αύξηση με το ++   (ίδιο με το +=1). Στην πρώτη περίπτωση περνάμε με τιμή άρα η α παραμένει ως έχει με τιμή μηδέν. Στη δεύτερη περίπτωση περνάμε με το τρόπο της ΓΛΩΣΣΑΣ δηλαδή με αντιγραφή στην είσοδο (copy in) και στην έξοδο (copy out). Εδώ βλέπουμε ότι η α πήρε την τελευταία τιμή που αλλάξαμε, το 1. Στην τελευταία περίπτωση, την κανονική για πέρασμα με αναφορά, έχουμε τιμή στο α το 2 γιατί δυο φορές αλλάξαμε την α, επειδή έχουμε δυο μεταβλητές που αναφέρονται στην α, άρα δυο ενέργειες ++ έδωσαν λογικά το 2.

τμημα ByValue {
       διάβασε α, β
      α++
       β++
}
τμημα ByReference {
       διάβασε,
      α++
       β++
}
τμημα CopyInCopyOut {
       Διάβασε,
      Στη α1=α, β1=β \\ copy in
       α1++
       β1++
       Στη α=α1, β=β1 \\ copy out
}
α=0
ByValue α, α
Τύπωσε α \\ 0
α=0
CopyInCopyOut &α,
Τύπωσε α \\ 1
α=0
ByReference &α,
Τύπωσε α \\ 2


Και επειδή είναι ωραίο να βλέπουμε και μια άλλη εικόνα στο πρόγραμμα, να μαθαίνουμε και κάτι, θα μπορούσε κανείς να φτιάξει μια συνάρτηση (φεύγουμε από τις διαδικασίες ή τμήματα στην Μ2000) που να αλλάζει την συμπεριφορά μιας συνάρτησης που την καλούμε ως τμήμα (γίνονται αυτά στην Μ2000).
Εδώ λοιπόν έχουμε δυο συναρτήσεις που παίρνουν τιμές με αναφορά, την Πρόσθεσε1 και την Πρόσθεσε2. Μπορούμε να τις καλέσουμε απευθείας, ώστε να αλλάζουν τιμές "κανονικά" ή να τις καλέσουμε μέσω μιας άλλης συνάρτησης που αλλάζει το πέρασμα με αναφορά σε πέρασμα CopyInCopyOut. Εδώ χρησιμοποιούμε την αναφορά σε συνάρτηση (δεν υπάρχει στη ΓΛΩΣΣΑ).
Η αναφορά σε συνάρτηση είναι μια αντιγραφή συνάρτησης οπότε στην Διάβασε &Συν2() φτιάχνεται μια νέα συνάρτηση με τον ορισμό που βρίσκει στο σωρό! Πραγματικά εδώ είναι μια copy in διαδικασία (χωρίς να έχει έννοια η copy out αφού δεν αλλάζουμε τον ορισμό της συνάρτησης που περνάμε με αναφορά). Στη βιβλιογραφία το πέρασμα με αναφορά πολλές φορές μπορεί να είναι πέρασμα με τιμή...απλά και μόνο επειδή οι έννοιες μπορούν κάλλιστα να επικαλύπτονται, όπως εδώ με την "αναφορά" στην συνάρτηση που είναι αντιγραφή ορισμού (άρα πραγματικά μια αναφορά, αφού ο ορισμός είναι η συνάρτηση).

Συνάρτηση ΣυνΣτηΣυν {
     Διάβασε &Συν2(),,
     στη α1=α, β1=β
     καλεσε Συν2(&α1, &β1)
      στη α=α1, β=β1
}
Συνάρτηση Προσθεσε1 {
       Διάβασε,
      α++
       β++
}
Συνάρτηση Προσθεσε2 {
       Διάβασε,
      α+=2
       β+=2
}
α=0
καλεσε ΣυνΣτηΣυν(&Προσθεσε1(), , &α)
Τυπωσε α \\1
α=0
καλεσε Προσθεσε1( &α, &α)
Τυπωσε α \\2
α=0
καλεσε ΣυνΣτηΣυν(&Προσθεσε2(), , &α)
Τυπωσε α \\ 2
α=0
καλεσε Προσθεσε2( &α, &α)
Τυπωσε α \\ 4




Για να φτιάξουμε μια συνάρτηση χωρίς όνομα:
Βάλε "{Διάβασε Χ : =Χ**2}" : Διάβασε &Κ() : Τυπωσε Κ(2) \\ 4
Βάλε "{Διάβασε Χ : =Χ**2+10}" : Διάβασε &Κ() : Τυπωσε Κ(2) \\14

Κανονικά δεν μπορούμε να αλλάξουμε αναφορά σε μια μεταβλητή που έχουμε δώσει αναφορά σε άλλη μεταβλητή. Στη αναφορά συνάρτησης μπορούμε γιατί έχουμε ουσιαστικά αντιγραφή ορισμού.

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

Πινακας Κ(20)=2, Ν(30)=3
Βαλε &Κ() : Διάβασε &Λ()
Βαλε &Κ() : Διάβασε &Μ() \\ αυτό γίνεται, να έχουμε διπλή αναφορά
Λ(10)+=10 \\ και το Μ(10) θα γίνει 12
για αυτό { \\ το μπλοκ για αυτο {} σβήνει κάθε νέο στο πέρας του
Δες ενταξει {
       Βαλε &Κ() : Διάβασε &Μ() \\ αυτό δεν γίνεται διότι ήδη υπάρχει...και βγάζει λάθος.
}
αν οχι εντάξει τότε Τύπωσε "Αυτό δεν γίνεται"
Βαλε &Ν() : Διάβασε &Μ() \\ αυτό θα φτιάξει μια νέα Μ() ενώ θα υπάρχει ήδη μια.
Τυπωσε Μ(10), Διάσταση(Μ(),1) \\ η νέα Μ() επισκιάζει την προηγούμενη
Βαλε &Μ() : Διάβασε &Κ() \\ εδώ φτιάχνουμε μια νέα Κ() που επισκιάζει την προηγούμενη Κ()
}
\\ τώρα τα νέα Μ() και Κ() δεν υπάρχουν και έχουν δώσει τη θέση τους στα παλιά
\\ λιστα   \\ με την εντολή λίστα βλέπουμε τι έχουμε σε μεταβλητές και πίνακες.
Τυπωσε Μ(10), Διάσταση(Μ(),1)

Σάββατο 8 Αυγούστου 2015

Μ2000 και εκπαιδευτική κοινότητα

Εδώ και δεκαπέντε χρόνια προσπαθώ να περάσω την "αναγκαιότητα" για μια εφαρμογή γλώσσας προγραμματισμού που να περιλαμβάνει διάφορες δραστηριότητες όπως χρήση γραφικών, βάσεων δεδομένων και πολυμέσων (βίντεο, ήχων και εικόνας).
Φυσικά αυτό μετά από δεκαπέντε χρόνια φαντάζει ακατόρθωτο. Και εδώ λοιπόν θα γράψω τις σκέψεις μου για το τι μπορεί να συμβαίνει!
Να ξεκαθαρίσω ότι δεν έχει σημασία η εργασία μου πάνω στην ιδέα μιας Ελληνικής γλώσσας προγραμματισμού, αλλά γενικά αν θα έπρεπε να φτιαχτεί κάτι τέτοιο.
Υπάρχει μάθημα στο λύκειο η ΑΕΠΠ που είναι μάλιστα και εξεταζόμενο πανελλαδικά, στις εξετάσεις για την εισαγωγή στη τριτοβάθμια εκπαίδευση. Για αυτό το μάθημα έχει γίνει πολύ καλή εργασία ετοιμασίας μιας γλώσσας προγραμματισμού απλής με σκοπό να μάθει ο μαθητής την αλγοριθμική, τον τρόπο να αναλύει ένα πρόβλημα με διακριτά απλά βήματα. Βεβαίως έχω ορισμένες ενστάσεις ως προς το πόσα θέματα αλγορίθμων πάνω σε ιδιαίτερες δομές δεδομένων είναι απαραίτητες να συμπεριληφθούν στην ύλη. Είναι ύλη που θα έπρεπε να ήταν στο πανεπιστήμιο! Αλλά δεν είναι πρώτη φορά που αναβαθμίζεται το λύκειο με την εισαγωγή εννοιών που διδάσκονται στην τριτοβάθμια εκπαίδευση. Ενώ δηλαδή φαντάζει καλή η αναβάθμιση εντούτοις αυτό που κάνει είναι να απαιτεί επιπρόσθετο κόπο και ίσως και χρήμα για ιδιαίτερα μαθήματα ώστε να ανταπεξέλθει ο μαθητής στις απαιτήσεις των εξετάσεων.
Μια γλώσσα προγραμματισμού σήμερα μπορεί να δίνεται δωρεάν από μεγάλες εταιρείες ή και ιδρύματα ή και από την κοινότητα των προγραμματιστών ελεύθερου λογισμικού. Υπάρχει μια διαφορά στο τι είναι αυτό που δίνουν ελεύθερα και το τι ακόμα χρειάζεται κανείς για να ολοκληρώσει μια εφαρμογή. Αυτό που δίνουν δεν είναι ένα μαγικό κουτί να πατήσεις δυο τρια κουμπιά και να πάρεις μια εφαρμογή. Απαιτεί πρώτα απ΄όλα ένα περιβάλλον ανάπτυξης, όπου θα γραφτεί ο πηγαίος κώδικας, θα δοκιμαστεί και θα διορθωθεί. Όμως ακόμα και αυτό το περιβάλλον απαιτεί εμπειρία για να το χρησιμοποίησει κανείς και σίγουρα κάποια μαθήματα ή και διάβασμα εγχειριδίου. Επιπλέον οι γλώσσες δίνονται με ένα μικρό αριθμό εντολών και για εξειδικευμένα θέματα ή θα πρέπει να ανακαλύψεις τον τροχό  (πράγμα αδύνατον) ή να συνδέσεις τη γλώσσα με έτοιμα εργαλεία, με κώδικα δηλαδή που κάνει αυτό που θέλεις.
Με απλά λόγια σε όλες αυτές τις δωρεάν γλώσσες το να φτιάξεις μια εφαρμογή που θα ανοίγει σε όλη την οθόνη μια φωτογραφία από ένα αρχείο στο δίσκο...για τον μην έμπειρο, για τον νέο δηλαδή αποτελεί μια προσπάθεια "βουνό", Η διαδικασία δηλαδή απαιτεί αρκετά βήματα, και η κατανόηση αυτών είναι δύσκολη, ίσως μηχανικά να είναι εύκολο αλλά θα πρέπει να ξέρει κανείς τι κάνει! Με καμία γλώσσα δεν μπορούμε να κάνουμε τα πάντα εύκολα. Η έννοια "εύκολο" δεν υπάρχει στο προγραμματισμό. Αυτό που υπάρχει είναι η έννοια "παραγωγικό". Δηλαδή αν κάτι θέλει πέντε βήματα σε σχέση με το άλλο που θέλει τρία είναι λιγότερο παραγωγικό. Φυσικά και ο χρόνος εκτέλεσης μετράει αλλά συνήθως περισσότερα βήματα σημαίνει περισσότερη καθυστέρηση με δεδομένο ότι οι εσωτερικές διαδικασίες στον υπολογιστή γίνονται γρήγορα. Στον αντίποδα όταν μειώνει κανείς τα βήματα μειώνει τις επιλογές, άρα χάνει σε ευελιξία, σε προσαρμογή. Το βέλτιστο είναι να πετύχει κανείς σε βάθος χρόνου να είναι και παραγωγικός και να προσαρμόζεται σε νέες απαιτήσεις στην εργασία του, και ο προγραμματισμός είναι μια εργασία. Έτσι ο γνώστης μπορεί να σχεδιάζει με περισσότερα βήματα (ευέλικτος) χωρίς καθυστερήσεις (παραγωγικός).
Ένα ερώτημα που μπαίνει εδώ είναι: "Τι εργασία είναι ο προγραμματισμός". Η απάντηση δεν είναι "η παραγωγή αλγορίθμων" και αυτό το αναφέρω γιατί σε επίπεδο γνώσεων λυκείου έχει περάσει η αντίληψη ότι πρόγραμμα είναι ο αλγόριθμος.  Ουσιαστικά το αντίθετο συμβαίνει, ένας αλγόριθμος μπορεί να προγραμματιστεί σε μια γλώσσα προγραμματισμού, αλλά δεν αποτελεί αυτός το πρόγραμμα. Το πρόγραμμα είναι το εργαλείο που το βάζουμε να μας κάνει μια δουλειά. Αν περιέχει ένα αλγόριθμο για να βάζει σε μια τάξη μερικά πράγματα τότε μπορούμε να λέμε ότι στο πρόγραμμά μας χρησιμοποιούμε τον τάδε αλγόριθμο. Υπήρχε μια εποχή που ο αλγόριθμος ήταν σαν μια εφαρμογή. Για παράδειγμα μέσα από το DOS μπορούσε κανείς να καλέσει ένα πρόγραμμα ταξινόμησης δίνοντας για παράμετρο ένα αρχείο ονομάτων και να πάρει γισ έξοδο (αποτέλεσμα), ένα αρχείο με ταξινομημένα τα ονόματα αλφαβητικά, και φυσικά το πρόγραμμα χρησιμοποιούσε έναν αλγόριθμο ταξινόμησης. Όμως ως πρόγραμμα είχε κάτι σημαντικά πραγματάκια που το έκαναν κάτι παραπάνω από έναν αλγόριθμο: Είχε ένα τρόπο να αναλύει την είσοδο και ανάλογα να ενεργήσει, και επιπλέον περιλάμβανε και μια λογική του τι θα γίνει αν δεν μπορεί να γράψει στο δίσκο, αν κάτι δηλαδή πάει στραβά. Ο αλγόριθμος ταξινόμησης δεν περιλαμβάνει το τμήμα αποκωδικοποίησης της εισόδου και το τμήμα λαθών κατά την εκτέλεση. Θα μπορούσε να πει κανείς ότι και αυτά αποτελούν αλγόριθμους, αλλά στην ουσία ένας αλγόριθμος οφείλει να είναι κάτι το γενικό, και για το λόγο αυτό του δίνουμε και ένα όνομα που αντιπροσωπεύει αυτό τον αλγόριθμο...οπουδήποτε. Έτσι ουσιαστικά η εργασία του προγραμματισμού είναι να φτιάχνει κανείς μια αυτοματοποιημένη διαδικασία, με χρήση γνωστών αλγορίθμων ή όχι, υπολογίζοντας όλες τις πιθανές καταστάσεις και τα προβλήματα που τυχόν θα προκύψουν. Αυτή η αυτοματοποιημένη διαδικασία λέγεται εφαρμογή και έχει όνομα που δηλώνει το αντικείμενό της. Έτσι ένας επεξεργαστής κειμένου είναι μια αυτοματοποιημένη διαδικασία με αντικείμενο το κείμενο. Κάθε εφαρμογή έχει όρια και αυτά πολλές φορές δεν είναι γνωστά στον χρήστη της εφαρμογής. Για το λόγο αυτό οι εφαρμογές "δίνονται ως έχουν" ή αγγλικά "AS-IS". Σημασία δηλαδή είναι για τις τρέχουσες  απαιτήσεις να ανταποκρίνονται. Εκείνος λοιπόν που φτιάχνει μια εφαρμογή, με μια γλώσσα προγραμματισμού, δουλεύει πάνω σε μια ιδέα του τι μπορεί να φορτώσει την εφαρμογή, τι μπορεί να προκύψει, τι λάθη πιθανόν θα κάνει ο χρήστης. Δεν μιλάμε δηλαδή για αλγόριθμους αλλά για πρόβλεψη καταστάσεων και προσδιορισμό απαιτήσεων. Ο προγραμματισμός λοιπόν είναι ουσιαστικά η "κατασκευή" μιας ιδέας.
Για να μπορείς να υλοποιείς όμως ιδέες πρέπει η γλώσσα που θα χρησιμοποιήσεις να σου παρέχει τα μέσα, και αυτά είναι κύρια οι έτοιμες βιβλιοθήκες ρουτινών. Οι ρουτίνες είναι μικρά προγράμματα εφαρμογές που μπορούμε να συνδέσουμε με το πρόγραμμά μας. Η κορυφαία γλώσσα C++ έχει μια μεγάλη συλλογή ρουτινών
Μέχρι εδώ ανέπτυξα το τι είναι εργασία προγραμματισμού και έδειξα την αναγκαιότητα για έτοιμα βοηθητικά προγράμματα. Οι μεγάλες γλώσσες (με μεγάλες βιβλιοθήκες ρουτινών) είναι μέρος της τριτοβάθμιας εκπαίδευσης. Στην πρωτοβάθμια και δευτεροβάθμια εκπαίδευση η δική μου πρόταση είναι μια γλώσσα προγραμματισμού με ενσωματωμένες εντολές γραφικών, βάσεων δεδομένων και πολυμέσων αντί για χρήση εξωτερικών βιβλιοθηκών, και ανάπτυξη εφαρμογών ώστε να μπορεί ο μαθητής να αντιληφθεί τι σημαίνει "προγραμματίζω", πώς σκέφτομαι να φτιάξω όχι απλά ένα τρόπο επίλυσης ενός προβλήματος αλλά μια αυτοματοποιημένη διαδικασία που θα συνδέεται με τις ενέργειες τους χρήστη.
Για την παραγωγικότητα λοιπόν του μαθητή μια γλώσσα πρέπει να έχει τα λιγότερα βήματα για τη δημιουργία μιας εφαρμογής. Επίσης πρέπει να δίνονται επιλογές στο μαθητή να ασχοληθεί με έναν τομέα όπως γραφικά, βάσεις δεδομένων και πολυμέσα. Για την επιτυχία της εργασίας του θα χρειαστεί να πειραματιστεί, να σχεδιάσει, να δοκιμάσει, πότε να εγκρίνει και πότε να απορρίψει μεθόδους προγραμματισμού. Μια γλώσσα προγραμματισμού με πολλά πεδία αλλά προσβάσιμα από τον μαθητή μαζί με προγράμματα εκπαίδευσης που θα ζητούν να εργαστεί ο μαθητής πάνω στην συγγραφή προγραμμάτων για την υλοποίηση μιας εφαρμογής, μόνος του ή με τη συμμετοχή άλλων (διαμοιρασμός εργασίας), μαθαίνει τον μαθητή όχι την χρήση της αλλά την συνεργασία, την αντίληψη του τι μπορεί να ζητάει κανείς από τον χρήστη, το πώς κάτι είναι εφικτό και πότε όχι, δηλαδή πολλά πράγματα που δεν έχουν να κάνουν με την γλώσσα την ίδια, τις ιδιοτροπίες της, αλλά με την χρήση της, με το αποτέλεσμά της, την εφαρμογή. Βάζουμε το μαθητή να υλοποιεί ιδέες και αντιμετωπίζει όλα τα προβλήματα που συμβαίνουν στη φάση της υλοποίησης. Δεν χρειάζεται να μάθει "απ' έξω" να εργάζεται. Αυτό θα το καταφέρει αν του γίνει συνήθεια. Ο μαθητής πρέπει να σκέφτεται πως μια ιδέα μπορεί να υλοποιηθεί και να ξεκινάει κάνοντας τα αρχικά βήματα, σχεδιάζοντας μια μικρή λύση, ελαττώνοντας τις απαιτήσεις. Κατόπιν αφού φτιάξει έναν σκελετό της κατασκευής, αρχίζει να την εμπλουτίζει μέχρι να πληροί τις απαιτήσεις. Αυτή η μετάβαση από την μη ικανοποιητική στην ικανοποιητική εφαρμογή είναι και η ουσία της εργασίας. Ο δάσκαλος πρέπει να κατευθύνει το μαθητή όχι στο πώς θα βρει τη λύση αλλά στο να του δείξει πόσο έξω είναι από τη λύση, να τον αναγκάσει δηλαδή να σκεφτεί πιο σωστά, να σκεφτεί το πώς και να πειραματιστεί.
Για να έχουμε όμως μια τέτοια διαδικασία εκπαίδευσης, πρέπει να υπάρχει το κατάλληλο εργαλείο, η κατάλληλη γλώσσα προγραμματισμού, ένα περιβάλλον στο οποίο θα τρέχει, εργαλεία ελέγχου που θα περιλαμβάνονται σε αυτό καθώς και τομείς πάνω στους οποίους η γλώσσα θα μπορεί να χρησιμοποιηθεί.
Η γλώσσα Μ2000 από το 2003 είχε ολοκληρώσει την αρχική ιδέα για την χρήση γραφικών, βάσεων δεδομένων και πολυμέσων (έκδοση 5), είχε πίνακες δέκα διαστάσεων, αναδρομή στις συναρτήσεις, χρήση αρχείων και βάσεων δεδομένων τύπου Access, και μπορούσε κανείς ότι παρήγαγε στην οθόνη (γραφικά και κείμενο) να τα παράγει και στον εκτυπωτή.
Η τωρινή έκδοση 8 έχει επιπλέον τύπο μεταβλητής το έγγραφο (όχι απλά ένα αλφαριθμητικό αλλά το κείμενο με τις παραγράφους του) και την ομάδα (μπορεί κανείς να βάλει μεταβλητές, πίνακες, τμήματα και συναρτήσεις και ομάδες σε μια ομάδα). Το έργο τελειώνει με το εγχειρίδιο χρήσης. Προς το παρόν τελειώνει το αγγλικό και ετοιμάζεται και το ελληνικό. Υπάρχει όμως ήδη ενσωματωμένη βοήθεια στα Ελληνικά και τα Αγγλικά (π.χ. γράφουμε Βοήθεια ΟΛΑ και παίρνουμε όλες τις εντολές σε μια φόρμα όπου με απλό κλικ με το ποντίκι βλέπουμε άμεσα κάθε εντολή με παραδείγματα).
Βεβαίως στο εκπαιδευτικό κομμάτι, πρέπει να γραφτούν "ιδέες" για εκπόνηση εφαρμογών. Προς το παρόν σε φροντιστήριο έχει χρησιμοποιηθεί η γλώσσα για εκμάθηση απλών εντολών σε παιδιά Τετάρτης δημοτικού και πολύ μικρών προγραμμάτων π.χ. βρες έναν αριθμό..όπου ο υπολογιστής θέτει έναν τυχαίο και ρωτάει τον χρήστη ποιος είναι και απαντάει αν είναι μεγαλύτερος ή μικρότερος ή αν τον βρήκε ο χρήστης. Οι εντολές γράφτηκαν με ελληνικά (η Μ2000 έχει όλες τις εντολές σε δυο γλώσσες, ελληνικά και αγγλικά). Επιπλέον οι μαθητές είδαν πως φτιάχνουμε διάφορα γραφικά, γραμμές και κύκλους και είδαν πως φτιάχτηκε μια σκακιέρα με πιόνια. Επιπλέον είδαν πώς γίνεται να έχουμε με μια μεταβλητή την σκακιέρα σε διάφορα μεγέθη! Ασφαλώς δεν βρήκαν οι μικροί μαθητές τη λύση, αλλά έδειξαν ενδιαφέρον και έγραψαν τις εντολές στον ενσωματωμένο διορθωτή και τις έτρεξαν. Ένα παιδί με μεγάλο πρόβλημα όρασης χρησιμοποίησε άνετα την Μ2000 αφού στις ρυθμίσεις βάλαμε μεγάλο μέγεθος γραμμάτων! Το κάθε παιδί διαμόρφωσε το δικό του περιβάλλον με τις επιλογές χρωμάτων. Είναι βασικό για τα παιδιά να μην περιορίζονται στα ίδια αλλά να έχουν αυτά που φτιάχνουν την προσωπική τους σφραγίδα, όπως είναι η ζωγραφιά τους!
Συνοψίζοντας: Το εργαλείο που έχω φτιάξει από μόνο του δεν μπορεί να ενταχθεί σε μια εκπαιδευτική διαδικασία. Πρέπει να φτιαχτούν ασκήσεις, και να το δει κανείς στην πράξη. Δεν είναι παράξενο πως δεν υπάρχει άλλη ελληνική γλώσσα προγραμματισμού με αυτήν την ολοκλήρωση της Μ2000 γιατί απαιτεί πολλά χρόνια ανάπτυξης. Έτσι η ουσιαστική ανυπαρξία ενδιαφέροντος εστιάζεται στο γεγονός ότι δεν "παραγγέλθηκε" μια γενικού σκοπού γλώσσα για την πρωτοβάθμια και την δευτεροβάθμια εκπαίδευση. Ακόμα και η ΓΛΩΣΣΑ στο λύκειο δεν παραγγέλθηκε ως μια υπαρκτή γλώσσα, αλλά απλά περιγράφονταν σε ένα βιβλίο, και ανεξάρτητα δυο Έλληνες έφτιαξαν ο καθένας την δική του εκδοχή της ΓΛΩΣΣΑΣ, η μια τελικά έγινε και επίσημα αποδεχτή από το σχολείο (την μια την έφτιαξε εκπαιδευτικός σε δημόσιο σχολείο και την άλλη εκπαιδευτικός στον ιδιωτικό τομέα, και τελικώς προτιμήθηκε η γλώσσα του πρώτου). Όμως όπως αναφέρθηκε και παραπάνω η ΓΛΩΣΣΑ εστιάζει στον αλγόριθμο, και όχι στο πρόγραμμα, δεν έχει βιβλιοθήκες ρουτινών ούτε εντολές για αρχεία, γραφικά, βάσεις δεδομένων και πολυμέσα. Μόνο πίνακες φτιάχνει και εκτελεί  συγκρίσεις και επαναλήψεις (όπως όλες οι γλώσσες). Οι δε έτοιμες συναρτήσεις είναι ελάχιστες.
Ουσιαστικά αν δεν υπήρχε ο Διερμηνευτής της Γλώσσας και η Γλωσσομάθεια το μάθημα θα γίνονταν στα χαρτιά. Εδώ δηλαδή έχουμε ασκήσεις μεν αλλά χωρίς το εργαλείο! Ασφαλώς σήμερα υπάρχει το εργαλείο (ο Διερμηνευτής της ΓΛΩΣΣΑΣ) αλλά δεν έχει τομείς δραστηριοτήτων εκτός από τους πίνακες!

Η ιδέα μου βασίζεται σε ένα υπολογιστή της δεκαετίας του 80 όπου στην Αγγλία φτιάχτηκε μετά από προκήρυξη ενδιαφέροντος για την παραγωγή εκπομπών τηλεόρασης. Το μοντέλο λέγονταν BBC Model B και καθιερώθηκε όχι μόνο στο κανάλι BBC αλλά και σε όλα τα σχολεία. Βρήκα τέτοια μοντέλα στο ΤΕΙ σε εργαστήριο χειρισμού εργαλειομηχανών CNC (computer numerical control). Τα πολύ καλά χαρακτηριστικά του μοντέλου το έκαναν χρήσιμο σε πολλές εργασίες. Εκτός από το Hardware εκείνο που είχε επίσης τη σημασία του ήταν το Software. Περιλάμβανε μια εκπληκτική Basic με δυνατότητες γραφικών και ήχου (δεν είχαμε πολυμέσα τότε). Έμαθα την χρήση του από το εγχειρίδιο και από το μηνιαίο Acorn User. Αγόρασα ξεχωριστό βιβλίο για γραφικά και το προχωρημένο εγχειρίδιο. Δεν είχα δάσκαλο και δεν υπήρχε διαδίκτυο για πληροφόρηση, μόνο περιοδικά. Σε αντίθεση στην Αγγλία είχαν τα πάντα! Σήμερα σκεφτόμαστε γιατί εμείς δεν είμαστε τόσο ανταγωνιστικοί όσο οι άλλοι. Και πώς να είμαστε όταν μας χωρίζουν χρόνια διαφοράς στην εκπαίδευση; Θυμάμαι ακόμα τον υπολογιστη ΚΑΤ της Gigatronics, το 1987, μιας ελληνικής εταιρείας που εκθείαζε ο Ανδρέας Παπανδρέου. Δεν περπάτησε. Δεν περπατάνε ιδέες στην Ελλάδα! Χωρίς ιδέες δεν πάμε μπροστά! Τα σημερινά αποτελέσματα δεν είναι τυχαία...έχουν αίτια στην κακή εκπαίδευση και την αντιμετώπιση του Έλληνα για κάθε νέα ιδέα.
Θέλω να είμαι αισιόδοξος ότι η δουλειά μου δεν θα πάει χαμένη (δεν συζητώ για υλική ανταμοιβή), και ότι κάποια στιγμή κάποια άτομα από την εκπαιδευτική κοινότητα δεν θα θελήσουν να ανακαλύψουν τον τροχό αλλά θα πάρουν κάτι έτοιμο και θα το αξιοποιήσουν!