Κυριακή, 24 Μαΐου 2015

Επιστροφή στο Blogging

Έχουν περάσει μήνες από το Νοέμβριο του 2014, από τότε που έγραψα στον ιστότοπο εδώ.

Στο διάστημα αυτό ασχολήθηκα με την γλώσσα Μ2000, όπου το Γενάρη του 2015 ανέβασα την έκδοση 7 αναθεώρηση 16. Μάλιστα βρήκα και μαθητές που ήθελαν να δουν τι είναι προγραμματισμός, να κάνουν κάτι. Θα ανεβάσω άλλη ανάρτηση για την εκπαίδευση.

Τους τελευταίους μήνες ψάχνω για γλώσσες προγραμματισμού να εντάξω στην εκπαιδευτική διαδικασία. Δεν είναι μόνο η γλώσσα το κριτήριο επιλογής αλλά και το περιβάλλον ανάπτυξης καθώς και οι δυνατότητες που προσφέρονται για ανάπτυξη εφαρμογών σε διάφορα λειτουργικά και με χρήση διεπαφής με διαλόγους-παράθυρα. Κατέληξα σε δυο γλώσσες στην python και την java. Ξεκίνησα από την java αλλά θέλησα να την διαβάσω κανονικά (να την ξαναδιαβάσω για την ακρίβεια), δηλαδή να την μάθω!

Η ανακάλυψη λοιπόν της περιόδου ήταν το πρόγραμμα της SoloLearn για τη java με βίντεο και ασκήσεις. Βλέπεις τα βίντεο και απαντάς στις ερωτήσεις είτε γράφεις κάτι είτε απλά επιλέγεις είτε αλλάζεις τη διάταξη των εντολών!
Δείτε εδώ το πρόγραμμα  (εγώ το κατέβασα σε android ταμπλε) Java Tutorial
Μετά την επιτυχή εκπαίδευση, "ζεστάθηκα" και άρχισα να φτιάχνω την Μ2000 στην αναθεώρηση 17. Δεν έχει τελειώσει ακόμα αλλά μπορώ να γράψω λίγα πράγματα γι΄αυτήν:

Μ2000 Έκδοση 7, Αναθεώρηση 17 (ακόμα δεν έχει τελειώσει..)

1. Διόρθωσα ένα Bug στην συνάρτηση ΡΩΤΑ() ASK() η οποία ανοίγει ένα παράθυρο διαλόγου για να δείξει κάτι ή να δείξει κάτι και να πάρει μια τιμή. Όταν κάνουμε αλλαγή μεγέθους τότε εμφανίζεται το πεδίο εισαγωγής ενώ δεν το θέλουμε (όταν δεν ρωτάμε κάτι δηλαδή), και τώρα διορθώθηκε.

2. Ξανακοίταξα το θέμα της βάσης δεδομένων. Πρόσθεσα τις εντολές DB.PROVIDER ή ΒΑΣΗ.ΠΑΡΟΧΟΣ και DB.USER ή ΒΑΣΗ.ΧΡΗΣΤΗΣ  και επιπλέον σε όλες τις εντολές μπορεί αντί για όνομα βάσης να δοθεί ένα συνθηματικό όνομα με παρενθέσεις ώστε να μην χρησιμοποιείται ως όνομα αρχείου αλλά ως όνομα σύνδεσης. Με αυτό το τρόπο μπόρεσα να αλλάξω το σύστημα και να κάνω τη Μ2000 να συνδέεται με βάσεις ODBC και άλλες που υποστηρίζει το σύστημα και απαιτούν όνομα χρήστη και κωδικό.

Μπορούμε για παράδειγμα να χρησιμοποιήσουμε αυτό: 

ΒΑΣΗ.ΠΑΡΟΧΟΣ  "Microsoft.ACE.OLEDB.12.0","Jet OLEDB"
 
 για όνομα βάσης θα βάλουμε κατάληξη .accdb  και έτσι έχουμε μια βάση δεδομένων σε Access 2007 και άνω (ανάλογα τι υπάρχει στον υπολογιστή).

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

db.provider "dsn=testme;Uid=toor;Pwd=alfa;", "ODBC","encryptionpass"  
basename$ ="(anyname)"  
Retrieve basename$,"UNI", 1, "key","Greek"

3. Ανάπτυξη εντολών και συναρτήσεων για τον Σωρό (Stack).
Η γλώσσα χρησιμοποιεί ένα σωρό τιμών (αλφαριθμητικών και αριθμών) για πολλούς λόγους, κύρια όμως για προσωρινή αποθήκευση και πέρασμα τιμών. Παλιά ο σωρός ήταν απλή κατασκευή, ήταν ένα αλφαριθμητικό, ενώ στις τελευταίες εκδόσεις (από την έξι) είναι συλλογή αντικειμένων. Έτσι κάθε στοιχείο στο σωρό είναι εσωτερικά ένα συνδεδεμένο αντικείμενο. Δεν θα αναπτύξω εδώ όλη τη λειτουργικότητα του σωρού - καθώς και πότε υπάρχουν άλλοι ξεχωριστοί σωροί. Αυτό που έχει σημασία είναι ότι έφτιαξα έναν τρόπο να έχω παραμέτρους σε ένα τμήμα (η διαδικασία στην Μ2000 λέγεται τμήμα), χωρίς όνομα. Αντί για όνομα οι παράμετροι έχουν θέσεις στο σωρό.
Από την αναθεώρηση 17 μπορούμε να διαβάσουμε την τιμή από οποιαδήποτε θέση στο σωρό χωρίς να την "σηκώσουμε". Μέχρι την αναθεώρηση 16 μπορούσαμε να κάνουμε αυτό:
ΒΑΛΕ 1,2,3,4,5 ' το 5 είναι στην κορυφή του σωρού
ΔΙΑΒΑΣΕ Α,Β
ΤΥΠΩΣΕ Α, Β
    5   4
ο σωρός έχει τώρα κορυφή το 3 και είναι έτσι 3 2 1

τώρα μπορούμε να παραλείψουμε τη ΔΙΑΒΑΣΕ
ΒΑΛΕ 1,2,3,4,5
ΤΥΠΩΣΕ ΣΩΡΟΥΤΙΜΗ(), ΣΩΡΟΥΤΙΜΗ(2)
    5    4
ο σωρός έχει κορυφή το 5 και είναι έτσι 5 4 3 2 1
Δηλαδή διαβάζουμε τιμές χωρίς να τις σηκώνουμε από το σωρό!

η συνάρτηση ΣΩΡΟΥΤΙΜΗ() ισοδυναμή με την ΣΩΡΟΥΤΙΜΗ(1)

Υπάρχει και η αντίστοιχη για αλφαριθμητικά (γράμματα λέγονται στην Μ2000)

ΒΑΛΕ 1, "γεια"
ΤΥΠΩΣΕ ΣΩΡΟΥΤΙΜΗ$(), ΣΩΡΟΥΤΙΜΗ(2)
Για να πετάξουμε τις τιμές (έστω και τις δυο από τις πέντε) χρησιμοποιούμε την ΠΕΤΑ (υπήρχε αλλά εμπλουτίστηκε με τον έλεγχο λαθών, δηλαδή να βγάζει λάθος όταν δώσουμε αρνητικό αριθμό ή μεγαλύτερο του αριθμού των στοιχείων του σωρού...)
ΠΕΤΑ 2

Επιπλέον μπήκαν τρεις ακόμα εντολές:
ΦΕΡΕ SHIFT, ΦΕΡΕΠΙΣΩ SHIFTBACK, ΠΑΝΩ OVER

ΒΑΛΕ 1,2,3,4,5
ΣΩΡΟΣ
 5 4 3 2 1
ΦΕΡΕ 4 ' φέρνει στη κορυφή το στοιχείο στην 4η θέση
ΣΩΡΟΣ 2 5 4 3 1
ΦΕΡΕΠΙΣΩ 4 ' πάει τη κορυφή στη 4η θέση
ΣΩΡΟΣ
5 4 3 2 1
ΠΑΝΩ 2 ' φέρνει στη κορυφή ένα αντίγραφο του στοιχείου της 2ης θέσης
ΣΩΡΟΣ
4 5 4 3 2 1

Για να αλλάξουμε τιμή, έστω στη θέση τρία θα κάνουμε:
ΦΕΡΕ 3
ΒΑΛΕ ΑΡΙΘΜΟΣ+100
ΦΕΡΕΠΙΣΩ 3
ΣΩΡΟΣ
 5 104 3 2 1

Μια ιδιαιτερότητα της ΠΑΝΩ που δεν φαίνεται άμεσα είναι ότι όταν φτιάχνει αντίγραφα...αντιγράφει μόνο αναφορές στο αντικείμενο.
Ο σωρός 15 18 21 έχει τέσσερα αντικείμενα:
το αντικείμενο του σωρού και από ένα για τις τιμές 15, 18 και 21
όταν κάνουμε ΠΑΝΩ 2 (OVER 2) τότε το  αντικείμενο με την τιμή 18 εμφανίζεται σε δυο θέσεις, στην 1 και στην 3 (η 2 έγινε με την προσθήκη νέας κορυφής 3). Όταν θέλουμε να αλλάξουμε τιμή στην ουσία το σύστημα δεν μας επιτρέπει να το κάνουμε άμεσα αλλά έμμεσα. Δηλαδή πρέπει να διαβάσουμε την κορυφή για να βγει η τιμή από το σωρό και μετά να φτιάξουμε μια νέα κορυφή με την νέα τιμή. Αυτό γίνεται σε μια γραμμή! ΒΑΛΕ ΑΡΙΘΜΟΣ+100. Η ΑΡΙΘΜΟΣ είναι εσωτερική μεταβλητή που διαβάζει την κορυφή και την πετάει ταυτόχρονα! Το αντίστοιχο για αλφαριθμητικά είναι η ΓΡΑΜΜΑ$, η οποία πετάει την κορυφή αμέσως αφού την διαβάσει. Ουσιαστικά και οι δύο πετάνε την αναφορά στο αντικείμενο. Αν δεν υπάρχει άλλη αναφορά στο αντικείμενο τότε το αντικείμενο διαγράφεται (είναι ο μηχανισμός αντικειμένων της VB6, σε αυτή τη γλώσσα έχει γραφτεί η Μ2000).

Θα μπορούσαμε δηλαδή να έχουμε έναν σωρό με 1000 θέσεις του αυτού αντικειμένου με τιμή "(άδειο)".  Η λέξη "(άδειο)" θα υπάρχει μια φορά ως αντικείμενο και 1000 φορές ως αναφορά στο αντικείμενο του σωρού!

Για να χειριστούμε το σωρό με την ΠΕΤΑ πρέπει να ξέρουμε πόσα αντικείμενα θα πετάξουμε (στην ουσία πόσες αναφορές σε αντικείμενα). Υπάρχει λοιπόν η ΜΕΓΕΘΟΣ.ΣΩΡΟΥ (STACK.SIZE) η οποία μπορεί να μπει σε μια μεταβλητή και μετά την επέκταση του σωρού να χρησιμοποιηθεί ως ΠΕΤΑ ΜΕΓΕΘΟΣ.ΣΩΡΟΥ-ΠΑΛΙΟ.ΜΕΓΕΘΟΣ και έτσι επιστρέφουμε στην προ της επέκτασης του σωρού (και υποτίθεται ότι τα στοιχεία τα διαβάσαμε με τις ΣΩΡΟΥΤΙΜΗ() και ΣΩΡΟΥΤΙΜΗ$().

Τέλος μπορούμε να γνωρίζουμε τι έχει ο σωρός σε τύπους με την ΦΑΚΕΛΟΣ$() ή ENVELOPE$() (αυτή υπήρχε) που δίνει ένα αλφαριθμητικό με N ή S (λατινικό N και S) στις θέσεις με κορυφή το πρώτο στο αλφαριθμητικό. Άλλος τρόπος είναι με τις ΕΙΝΑΡ (ISNUM) και ΕΙΝΓΡ (ISLET) (οι οποίες όμως φέρνουν λάθος αν είναι άδειος ο σωρός). Υπάρχει λοιπόν το ΑΔΕΙΟ (EMPTY), από την πρώτη έκδοση μάλιστα, για να ελέγχουμε αν είναι άδειος ο σωρός ή ελέγχουμε το ΜΕΓΕΘΟΣ.ΣΩΡΟΥ.

(Η M2000 έχει διπλό σετ εντολών, στα ελληνικά και στα αγγλικά).