Δευτέρα, 17 Νοεμβρίου 2014

Η επέκταση της Quick Sort

Quick Sort extended
ή ελληνικά Μέθοδος ταξινόμησης Quick Sort με μια παραλλαγή δική μου!

Δημοσιεύτηκε εδώ: http://www.vbforums.com/showthread.php?781043-VB6-Dual-Pivot-QuickSort

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

Η πρότασή μου περιλαμβάνει μια προσθήκη στο κώδικα της ταξινόμησης Quick Sort, όπου κάποιες φορές την κάνει πιο γρήγορη. Σε κάθε περίπτωση το πρόβλημα των εναλλαγών 1 και 0 καθώς και των σταθερών τιμών το ξεπερνάει σε ελάχιστο χρόνο.

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

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

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

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

αν παραστήσουμε τα όμοια με 1 και θεωρήσουμε αυτή την λίστα
11111101111001001
τότε  θα πάρει το σύστημα την μεσαία τιμή (εδώ 1) θα δει ότι είναι όμοια
και θα την παρατήσει! Θα ξεκινήσει από την αρχή+1 και θα κοιτάξει που σταματούν τα όμοια! θα βρει το 0 και θα το αλλάξει..
01111111111111001
οπότε το 0 είναι σε σωστή θέση και συνεχίζει την κανονική quick sort με μεσαία τιμή το 1 στη θέση 7.
Ας το δούμε αναλύτικά:
ελέχγει από το 17 (το τέλος) αν έχει τιμή μεγαλύτερη από το 1, δεν έχει και πάει για αλλαγή (τζούφια) και αλλάζει τους δείκτες 8 και 16.
τώρα ελέγχει αν στο 8 υπάρχει μικρότερη τιμή...δεν υπάρχει
πάμε για το 16 αν υπάρχει μεγαλύτερη τιμή...δεν υπάρχει...και αλλάζει τιμές
01111110111111011 και έχει δείκτες 9 και 15
στο 9 δεν βρίσκει μικρότερη τιμή...στο δεκαπέντε δεν βρίσκει μεγαλύτερη
κάνει αλλαγή
01111110011111111 και έχει δείκτες 10 και 14
τώρα κάνει τζούφιες αλλαγές ...και αλλάζει δείκτες 11 και 13, 12 και 12 και 13 και 11...
τώρα βγαίνουμε από την επανάληψη και πάμε σε δυο κλήσεις τις ίδιας ρουτίνας (αναδρομική διαδικασία), όπου οι λίστες είναι
1 εως 11 και 13 εως 17 (το 12 είναι στην θέση του...)
01111110011 και 111111
η δεύτερη λίστα με τη προσθήκη που έχω βάλει με μια εξέταση ότι δεν υπάρχει άλλη τιμή από 1 τερματίζει (δεν κάνει καθόλου αλλαγές).
Η πρώτη λίστα δίνει μεσαίο  1 στην θέση 6 είναι διαφορετικός από το στοιχείο στη θέση 0 οπότε πάμε σε κανονική εκτέλεση της quicksort με δείκτες 1 και 11
βρίσκει ότι στην 1 έχει μικρότερη τιμη και αυξάνει το δείκτη σε 2
τώρα κοιτάει στο 11 δεν βρίσκει μεγαλύτερη τιμή και πάει σε τζούφια αλλαγή...και δείκτες 3 και 10...ομοίως και πάμε σε 4 και 9..εδώ δεν έχουμ τζούφια αλλαγή:
01101110111  και δείκτες 5 και 8 πάλι αλλαγή
01100111111 και 6 και 7...τζούφια αλλαγή και 7 και 6 (7>6 βγαίνουμε από την επανάληψη).
πάμε πάλι σε δυο λίστες
την 1 εως 6 και την 7 εως 11
011001 και 11111 η δεύτερη με την προσθήκη κάνει απλά έναν έλεγχο και τερματίζει χωρίς καθόλους αλλαγές.
η δεύτερη  πέρνει μεσαίο το 3 δηλαδή το 1 και φτιάχνει δείκτες 1 και 6
στο 1 έχει μικρότερο και το αφήνει πάμε σε 2 και 6 και κάνουμε τζούφια αλλαγή...και πάμε σε 3 και 5...όπου
010011 και πάμε στα 4 και 4 το 4 γίνεται 5 (αφου το 0<1) και δεν γίνεται
καμία αλλαγή και βγαίνουμε σε δυο λίστες 1 - 4 και 5-6
0100 και 11 η δεύτερη λιστα είναι η περίπτωση που εξετάζει η επέκταση που έχω βάλει και βγαίνει αμέσως από την ρουτίνα.
τώρα βρίσκει το μεσαίο το 2 και παίρνει το 1 και φτιάχνει τους δείκτες 1 και 4
ο δείκτης 1 γίνεται 2 και κάνει την πρώτη αλλαγή μεταξύ 2 και 4
0001 και αλλάζει τους δείκτες σε 3 και 3...και κάνει μια ζούφια αλλαγή και 4 και 2 οι δείκτες
βγάζει μόνο μια λίστα την 00 (το τελευταίο 0 και το 1 τα θεωρεί στη θέση τους ο αλγόριθμος και είναι) και καλεί πάλι την ρουτίναι, η οποία βάση της προσθήκης την τερματίζει αμέσως..

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

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

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


Public Sub NaiveQuickSortExtended(Arr() As Long, ByVal LB As Long, ByVal UB As Long)
Dim M1 As Long, M2 As Long
Dim Piv As Long, Tmp As Long '<- adjust types here, when switching to something different than Long
     If UB - LB = 1 Then
     M1 = LB
      If Arr(M1) > Arr(UB) Then Tmp = Arr(M1): Arr(M1) = Arr(UB): Arr(UB) = Tmp
      Exit Sub
     Else
       M1 = (LB + UB) \ 2
             If Arr(M1) = Arr(LB) Then
                M2 = UB - 1
                M1 = LB
                Do
                    M1 = M1 + 1
                    If M1 > M2 Then
                        If Arr(UB) < Arr(LB) Then Tmp = Arr(LB): Arr(LB) = Arr(UB): Arr(UB) = Tmp
                        Exit Sub
                    End If
                Loop Until Arr(M1) <> Arr(LB)
                Piv = Arr(M1)
                If M1 > LB Then If Arr(LB) > Piv Then Arr(M1) = Arr(LB): Arr(LB) = Piv: Piv = Arr(M1)
            Else
                Piv = Arr(M1)
                M1 = LB
                Do While (Arr(M1) < Piv): M1 = M1 + 1: Loop
            End If
    End If
    M2 = UB
    Do
      Do While (Arr(M2) > Piv): M2 = M2 - 1: Loop
      If M1 <= M2 Then
        Tmp = Arr(M1): Arr(M1) = Arr(M2): Arr(M2) = Tmp 'swap
        M1 = M1 + 1
        M2 = M2 - 1
      End If
      If M1 > M2 Then Exit Do
      Do While (Arr(M1) < Piv): M1 = M1 + 1: Loop
    Loop
    If LB < M2 Then NaiveQuickSortExtended Arr, LB, M2
    If M1 < UB Then NaiveQuickSortExtended Arr, M1, UB
End Sub








Σάββατο, 18 Οκτωβρίου 2014

Nice TextBoxes

Επιτέλους μετά από προσπάθεια μερικών ημερών κατάφερα να φτιάξω μια συλλογή στοιχείων ελέγχου, τα οποία μπορούν να χρησιμοποιηθούν στην Visual Basic 6.

Δύο πράγματα τα κάνουν ξεχωριστά. Ένα είναι ότι δεν απαιτούν βιβλιοθήκες και δεν αλλάζουν ανάλογα με το λειτουργικό (όπως όταν χρησιμοποιούμε τα στάνταρ στοιχεία ελέγχου των Windows). Το δεύτερο είναι η αλλαγή σχεδίασης, όπου όλα τα στοιχεία είναι ένα βασικό  και μερικές κλάσεις που το τροποποιούν παρέχοντάς μας ιδιότητες και γεγονότα για να τα χειριστούμε.
Πέρα από αυτά επιπλέον σχεδιαστικά καλούδια είναι η δυνατότητα χρήσης Unicode γραμματοσειρών χωρίς όμως δυνατότητα γραφής από δεξιά προς αριστερά. Μπορούμε όμως να εμφανίσουμε κυριλλικό αλφάβητο με ευρωπαϊκό και ελληνικό. Επίσης το υπόστρωμα, το στοιχείο δηλαδή που πράγματι εμφανίζεται, το glist, έχει την δυνατότητα να χειρίζεται την απόσταση των στοιχείων του, ή αλλιώς το line spacing. Είναι βασικό αυτό για να φαίνονται περισσότερο όμορφα τα στοιχεία, και τα κάνει ξεχωριστά. Τα αντίστοιχα της Microsoft...δεν έχουν απόσταση γραμμής, αντί αυτού ορισμένα έχουν ύψος γραμμής αλλά αυτό δεν είναι το ίδιο, η απόσταση γραμμής εδώ είναι το άνω και κάτω περιθώριο κάθε γραμμής -  TextBlock Class .NET Framework 4.5

Αποκορύφωμα των κλάσεων είναι η TextViewer κλάση που διαχειρίζεται ένα στοιχείο glist (αυτό χωρίς χρήση κλάσης είναι ένα στοιχείο που μοιάζει με το listbox), και με την χρήση μια κλάσης MyDOC (αυτή κρατάει κείμενο με παραγράφους σε μια διπλή συνδεδεμένη λίστα), προβάλει και δίνει για επεξεργασία κείμενο. Παράλληλα λειτουργούν πλήκτρα όπως Ctl X, Ctrl C & Ctrl V για αποκοπή, αντιγραφή και επικόλληση, αλλά και τα Ctrl A, επιλογή όλων, shift Ctrl A, καμία επιλογή, Ctrl Z αναίρεση (Undo), και Ctrl Y αναίρεση αναίρεσης (Redo) - μάλιστα υποστηρίζει πολλαπλά undo/redo. Επίσης δουλεύει το drag and drop,  ή ελληνικά οι ενέργειες σύρε και άφησε.

Η συλλογή των στοιχείων περιλαμβάνει διαμορφώσεις του glist ως button όπου η ενεργοποίηση γίνεται με διπλό πάτημα ή με σύρσιμο δεξιά, το checkbox όπου μια κουκκίδα αριστερά δηλώνει την  θέση διακόπτη (ανοικτός - κλειστός), το infobox που δηλώνει απλά μια ένδειξη αλλά μπορεί να αλλάξει σε εισαγωγή κειμένου για κάποια ρύθμιση. Άλλες διαμορφώσεις είναι το spin box όπου δέχεται αριθμητική τιμή και η οποία αλλάζει η με τη μπάρα ολίσθησης και τα βελάκια του πληκτρολογίου, ή αν θέλουμε με απευθείας εγγραφή τιμής. Στο παράδειγμα φαίνεται μια λίστα που τροφοδοτεί τιμές το spin box. Τέλος ένα επίσης ωραίο στοιχείο είναι το combobox όπου δυο λίστες glist συνδέονται, η μία ως ένα textbox μιας γραμμής με την προσθήκη ενός χειριστή αριστερά ο οποίος ανοίγει μια δεύτερη λίστα, μια λίστα τιμών. Μπορούμε να γράψουμε στο πρώτο textbox και αυτόματα θα εμφανίζεται το υπόλοιπο της λέξης από όποια λέξη βρεθεί στη δεύτερη λίστα. Αυτό λέγεται αυτόματη συμπλήρωση.

Όλα τα στοιχεία ελέγχου μπορούμε να τα χειριστούμε μόνο με πληκτρολόγιο (εκτός του drag & drop που απαιτεί ποντίκι εξ ορισμού). Έχει δοκιμαστεί το παράδειγμα σε Linux και Wine. Αν και στην έκδοση που έχω το Wine ενώ δίνει ελληνικά δεν αφήνει να περάσουν γράμματα με τόνο απευθείας στις φόρμες (πιστεύω σε νεότερη έκδοση του Wine, θα το έχουν λύσει το θέμα).


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


Το στοιχεί ελέγχου change wrapping αλλάζει την αναδίπλωση γραμμής, και το Show Paragraph δείχνει ή κρύβει το σημάδι παραγράφου (φαίνεται στην εικόνα). Οι μπάρες ολίσθησης στις λίστες (και στο TextViewer) φαίνονται όταν πάμε στην άκρη το ποντίκι ή όταν κάνουμε ολίσθηση με σπρώξιμο - με πατημένο το αριστερό πλήκτρο κουνάμε το ποντίκι και μετακινούμε τη λίστα, με αυξανόμενη ταχύτητα ανάλογα με την κίνηση που κάνουμε - και αυτό δεν υπάρχει στα στάνταρ στοιχεία ελέγχου).



Εδώ υπάρχει ο κώδικας (δείτε στο τέλος την τελική έκδοση) Δημοσιευμένος Κώδικας

Δευτέρα, 13 Οκτωβρίου 2014

Βασικές γνώσεις για τα Ubuntu Studio #1

Βασικές γνώσεις για τα Ubuntu Studio

Τα δυο πράγματα που πρέπει να μην ξεχάσουμε και έχουμε εμείς ορίσει είναι  τα Όνομα χρήστη και κωδικός. Για να ανοίγει κανείς τον υπολογιστή δεν είναι απαραίτητα. Όμως όποτε υπάρχει λόγος να αλλάξει το σύστημα μας ζητείται το οκ για την πρόσβαση και αυτό δίνεται με την επίδοση του κωδικού χρήστη.

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

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

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

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

Η κονσόλα ή τερματικό είναι κάτι που μας απασχολεί ελάχιστες φορές σε όλη τη χρήση του Ubuntu. Η είσοδος στην κονσόλα δεν σημαίνει και είσοδο σε κατάσταση αλλαγών. Για να γίνουν αλλαγές και από την κονσόλα ζητείται κωδικός χρήστη (με δικαιώματα αλλαγών).

Παρακάτω γράφω μια αναφορά για το τι μου συνέβη στα πρώτα βήματα στο Ubuntu (όπως ακριβώς το έγραψα):

Ευτυχώς θυμήθηκα ότι οι εφαρμογές έχουν pid (μάλλον program id) και πως υπάρχει εντολή που τις κλείνει από την κονσόλα.
Το πρόβλημα είχε ως εξής. Ξεκίνησα μια εφαρμογή με τρισδιάστατα γραφικά και ενώ άκουγα ήχο δεν έβλεπα τίποτα και επιπλέον...δεν μπορούσα να αλλάξω επιφάνεια εργασίας! Τελικά μπαίνω στην κονσόλα 1 με ctrl+alt+1 δίνω όνομα χρήστη και κωδικό και αρχίζω να ψάχνω...γράφω help...διαβάζω την man την εντολή που δίνει πληροφορίες για εντολές γράφω μια με την λέξη shutdown μου δίνει μερικές απαντήσεις κύρια όμως να χρησιμοποιήσω το -κ μετά το man για να ψάξει να βρει αλλού...Τελικά έβαλα με το pid και βρήκα την top ναι με τρια γράμματα top ξεκινάει μια εφαρμογή που δείχνει όλες τις εφαρμογές με όνομα και pid. Με h δίνει βοήθεια και με k κάνει kill δηλαδή στέλνει μήνυμα να τερματίσει μια εφαρμογή αφού όμως δώσουμε τον αριθμό της. Βλέπω ότι η εφαρμογή που είχα ανοίξει είχε δυο συνεχόμενα pid. Το παλιό, μικρό νούμερο, ήταν η φόρμα επιλογής που έτρεξε το άλλο, που μαύρισε την οθόνη. Με το που έφυγε κάνω έναν έλεγχο...πατάω alt-ctrl-7 και γυρνάω στο γραφικό περιβάλλον. Εντάξει είχε φύγει...
Κλείνω την “αδελφή” φόρμα, πάω στο κέντρο λογισμικού και καλώ την απεγκατάσταση του προγράμματος. Μετά γυρνάω με alt+ctrl+1 στην κονσόλα και πατάω το q για να τερματίσει το top και γράφω logout για να γυρίσει η κονσόλα στην αρχική της θέση, στην αναμονή ονόματος και κωδικού..για νέα συνεδρία. Γυρίζω στο γραφικό περιβάλλον. 

Με αυτόν τον τρόπο λοιπόν ξέφυγα από μια περίπτωση που σε windows απλά θα είχα πατήσει reset...με ότι ζημιά θα είχε προκαλέσει (λόγω ανοικτών αρχείων). Εδώ η όποια ζημιά περιορίστηκε στο πρόγραμμα που έκλεισε από την εφαρμογή top.

Η κοσνόλα υποστηρίζεται από ένα κέλυφος, το πρόγραμμα δηλαδή που τρέχει πίσω από το ορατό πράγμα που λέμε κοσνόλα (ή τερματικό). Το κέλυφος λέγεται bash. Με μια αναζήτηση στο διαδίκτυο μπορούμε να βρούμε περισσότερες πληροφορίες. Μέσα από το γραφικό περιβάλλον μπορούμε να ανοίξουμε έναν εξομοιωτή τερματικού. Όμως μπορούμε να πάμε απ΄ευθειας με τα alt+crl + νούμερο από 1 μέχρι 6. Το 7 μας βγάζει στο γραφικό περιβάλλον. Όλα τα νούμερα μπορούν να τρέχουν προγράμματα σε διαφορετικό χρήστη. Να γιατί λέγεται multiuser το σύστημα.
Εδώ παραθέτω ένα κείμενο που είχα γράψει για την δική μου βοήθεια:

Χρήσιμες οδηγίες από το τερματικό


Προσοχή μικρά ή κεφαλαία γράμματα έχουν διαφορά στο Linux (άρα και στο Ubuntu)
Όταν θέλουμε σε ένα όνομα να συμπεριλάβουμε το διάστημα βάζουμε την \ πίσω από ένα διάστημα, έτσι από το κατάλογο ~ πάμε με το cd Επιφάνεια\ εργασίας στην Επιφάνεια εργασίας
Οι κατάλογοι χωρίζονται με / και όχι με \ όπως στα Windows
Η τελεία στην αρχή ενός ονόματος δηλώνει ότι είναι κρυφό! Οπουδήποτε αλλού είναι απλά ένας ακόμα χαρακτήρας. Τα αρχεία δεν συσχετίζονται με εφαρμογές με την κατάληξη π.χ. txt. Μπορεί όμως να βάλει κανείς μια “κατάληξη” και ο Διαχειριστής αρχείων μπορεί να μάθει τις καταλήξεις...(όμως αυτή η εργασία δεν είναι του λειτουργικού)
Γιατί λέμε ότι τα παρακάτω είναι οδηγίες και όχι εντολές; Επειδή οι εντολές απαιτούν έναν μεταφραστή, δηλαδή είναι ενσωματωμένες σε ένα πρόγραμμα μετάφρασης μαζί με τις διαδικασίες στις οποίες αναφέρονται..οι μεταφράσεις. Ορισμένες οδηγίες είναι εντολές του bash, και άλλες είναι προγράμματα, δηλαδή υπάρχουν έξω από το bash.
lsb_release -a
Εμφανίζει την έκδοση του λειτουργικού
exit
Έξοδος από τη συνεδρία (σε εξομοιωτή κλείνει τον εξομοιωτή)
dmesg
Μας δείχνει τις τελευταίες εντολές που εκτέλεσε το κέλυφος. (δείτε με παράμετρο -h τις διαμορφώσεις που δέχεται)
cd
Αλλαγή καταλόγου (Change Directory)
Προσοχή επειδή είναι πρόγραμμα δεν δέχεται κολλητά όπως στα Windows παραμέτρους
έτσι το CD.. δεν θα τρέξει!
cd -
Εναλλαγή μεταξύ δυο τελευταίων καταλόγων.
ls
Δείχνει τα περιεχόμενα ενός κατάλογου
ls -lh
Δείχνει τα περιεχόμενα με περισσότερες πληροφορίες
ls -aD
Δείχνει ότι το ls αλλά και τα κρυφά αρχεία (ξεκινούν με τελεία).
mv
Μετακίνηση αρχείων αλλά και μετανομασία!




Συνεχίζεται...



 



Δευτέρα, 29 Σεπτεμβρίου 2014

Bash Bug

Το Σεπτέμβριο του 2014 βρέθηκε ένα λάθος στο κέλυφος εντολών του Linux αλλά και του OS Χ (Mac), όπου μπορεί να εκτελεστεί κώδικας χωρίς την θέληση του χρήστη.

Το γιατί υπήρχε αυτό το "άγνωστο" λάθος τόσο καιρό είναι ένας προβληματισμός που δεν έχει βρει τη λύση του. Οπωσδήποτε ο κώδικας του BASH, του κελύφους δηλαδή επεξεργασίας εντολών, δεν είναι ένας κρυφός κώδικας. Υπάρχει όμως ένας κανόνας στο Linux και την γλώσσα C και κατ' επέκταση της C++ που λέει ότι ποτέ δεν γράφουμε για το ίδιο πράγμα νέο κώδικα. Έτσι όλα τα προγράμματα κτίζονται από κομμάτια που βρίσκονται σε μια βιβλιοθήκη έτοιμων λύσεων.

Η κοινή χρήση λύσεων στο Linux και στο OS X έχει ως αποτέλεσμα να περνάει τα τυχόν σφάλματα αυτών σε νέα σύνθετα προγράμματα.

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

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

Εδώ θέλω να θυμίσω ότι στα λειτουργικά της Microsoft υπήρχαν δυο δυνατότητας. Η χρήση κοινών ρουτινών αλλά και η χρήση ιδιωτικών. Στην πρώτη περίπτωση μάλιστα  μέσω του COM ενός προτύπου διαχείρισης αντικειμένων μπορούσε κανείς να διατηρεί κοινές ιδιωτικές ρουτίνες, δηλαδή κοινές για τις εφαρμογές εκείνες που έχουν το "δικαίωμα" να τις χρησιμοποιήσουν. Το δικαίωμα ή άδεια χρήση σε ένα εσωτερικό σημείο είχε έναν πολύ μεγάλο αριθμό ο οποίος ήταν αδύνατο να βρεθεί για να ξεκλειδώσει το αντικείμενο COM και να το χρησιμοποιήσει. Στο λειτουργικό Linux οι βιβλιοθήκες είναι κοινές, και ως αρχεία έχουν περιορισμούς ως προς το ποια ομάδα χρηστών μπορεί να τα χρησιμοποιήσει. Με απλά λόγια βλέπουμε τη διαφορά φιλοσοφίας. Στα μεν Windows...ο παραγωγός λογισμικού αγοράζει άδειες...ενώ στα Linux είναι όλα ελεύθερα και τακτοποιημένα ανά χρήστη.

Οπότε τώρα ήρθε η ώρα να κατανοήσουμε τι σημαίνει έκδοση λογισμικού. Στα μεν Windows με την φιλοσοφία "αγοράζεις λειτουργικότητα"...το σύστημα διατηρεί για τον ίδιο σκοπό διάφορες εκδόσεις ενός λογισμικού, ενώ στο Linux επειδή η φιλοσοφία είναι "διαθέτεις τη λειτουργικότητα που χρειάζεσαι επιλέγοντας ελεύθερο λογισμικό" απλά διατηρείς "φρέσκιες" τις βιβλιοθήκες και έχεις όλα τα προγράμματα αναβαθμισμένα. Στα linux δεν θα "επέμενε" ένα πρόγραμμα να χρησιμοποιήσει την παλιά ρουτίνα (βιβλιοθήκης) επειδή δεν είχε ανανεώσει την άδεια χρήσης ο παραγωγός αυτού του λογισμικού. Απαιτείται φυσικά απόλυτη συμβατότητα..και αυτή μπορεί να επιτευχθεί όταν το λογισμικό είναι ανοικτό, ο κώδικάς του.

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

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

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

Το Bash Bug λοιπόν είναι ένα από τα λάθη που υπήρχαν για χρόνια και ήταν μη παρατηρήσιμα....Υπάρχουν άλλα; Ποιος ξέρεις...σίγουρα; Αν είναι σπάνιο να βρεθεί ένα τέτοιο σφάλμα, είναι περισσότερο σπάνιο αυτός που θα το βρει να θέλει να επωφεληθεί δημιουργώντας το χάος..





Τετάρτη, 24 Σεπτεμβρίου 2014

Νέα στοιχεία ελέγχου - για φόρμες της VB6



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

Στην εικόνα παραπάνω είναι ένα στοιχείο ελέγχου σε διάφορες μορφές. Η πιο κοπιαστική μορφή είναι αυτή του επεξεργαστή κειμένου. Εδώ έχουμε έναν επεξεργαστή κειμένου χωρίς μίξη γραμματοσειρών και μεγεθών/τύπου χαρακτήρων, αν και μπορούμε να αλλάξουμε οποτεδήποτε αυτά για όλα μαζί. Αυτό που προσφέρει είναι ότι χρησιμοποιεί εμφάνιση UNICODE χαρακτήρων, αλλάζει την απόσταση γραμμών, αλλάζει όποτε θέλουμε την αναδίπλωση λέξεων, μπορούμε να αποκόψουμε ή αντιγράψουμε προς το πρόχειρο ή να επικολλήσουμε από το πρόχειρο, μπορούμε να μεταφέρουμε σε άλλο ίδιο ή ακόμα και στο Word το κείμενο με "σύρε και απέθεσε" ενέργεια (Drag & Drop). Υπάρχει μπάρα οριζόντιας ολίσθησης που εμφανίζεται όταν πάμε στην δεξιά πλευρά και όταν μετακινήσουμε τις γραμμές πάνω ή κάτω με ώθηση κρατώντας πατημένο το αριστερό πλήκτρο του ποντικού. Μπορεί να χειριστεί τεράστιο κείμενο και σε μια φόρμα που αλλάζει μέγεθος μπορεί να αλλάξει την αναδίπλωση λέξεων άμεσα χωρίς καθυστέρηση. Υποστηρίζει απλή αναίρεση (αν μεταφέρουμε τον κέρσορα και δεν έχουμε πατήσει κάποιο πλήκτρο τότε ισχύει η αναίρεση της προηγούμενης ενέργειας με ctrl z). Δεν μπορούμε να αναιρέσουμε την προσθήκη πάνω από μια παράγραφο (αυτό θέλει περισσότερο προγραμματισμό). Αντί αυτού μπορούμε να μαρκάρουμε το κείμενο που θέλουμε να αφαιρέσουμε και να το κάνουμε και άμεσα μπορούμε να το επαναφέρουμε...

Επιπλέον υπάρχουν στοιχεία ελέγχου όπως, το Check Me, ή ελληνικά το Επίλεξέ Με όπου η επιλογή ή η μη επιλογή εμφανίζεται ως κουκκίδα τετράγωνη. Στην επιλογή του στοιχείου έχουμε αλλαγή χρωματισμού, στην εικόνα φαίνεται πράσινο. Με το πλήκτρο "διάστημα" μπορούμε να εναλλάσσουμε την τιμή του (την εμφάνιση ή απόκρυψη της κουκκίδας), και κάθε αλλαγή δίνει ένα "γεγονός" στο πρόγραμμα για να "εξυπηρετηθεί". (event service routine, event programming). 

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

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

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

Τέλος υπάρχει ένας συνδυασμός δυο στοιχείων ελέγχου που δίνει το Combobox, όπου μπορούμε να γράψουμε με αυτόματη συμπλήρωση από μια λίστα τιμών (εδώ  λέξεων πόλεων/μερών). Με τα άνω και κάτω βελάκια ανοίγουμε την λίστα, όπως και με πάτημα και τράβηγμα του πρώτου στοιχείου ελέγχου. Μπορούμε να επιλέξουμε από τη λίστα με Enter ή αν θέλουμε να τροποποιήσουμε την επιλογή στο κύριο στοιχείο χωρίς να κλείσουμε την λίστα. Η λίστα φεύγει αν πατήσουμε TAB για να κινηθούμε στο επόμενο στοιχείο ή SHIFT TAB στο προηγούμενο, ή απλά αν επιλέξουμε άλλο στοιχείο (ακόμα και με επιλογή από το ποντίκι του πρώτου στοιχείου πάλι κλείνει η λίστα, ουσιαστικά δεν κλείνει αν πληκτρολογούμε κάτι στο πρώτο στοιχείο ενώ είναι ανοικτή, με τα βελάκια άνω και κάτω πάμε στη λίστα και με τα δεξιά και αριστερά στην διόρθωση της επιλογής)

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

Τα παραπάνω καλούδια είναι γραμμένα με VB6, και το πρόγραμμα επίδειξης τρέχει σε XP, 7, Linoux με WINE. Ο κώδικας είναι ανοικτός και βρίσκεται εδώ:
http://www.vbforums.com/showthread.php?776741-Nice-Textboxes-version2







Παρασκευή, 22 Αυγούστου 2014

Vb6 File Selector





http://www.vbforums.com/showthread.php?774329-A-custom-compact-and-resizable-Open-File-Save-File-Folder-Select

Στο φόρουμ αυτό έχω αναρτήσει το κώδικα του επιλογέα αρχείων σε Visual Basic 6. Το παράδειγμα τρέχει και σε linux.
Εδώ είναι το εκτελέσιμο αρχείο του παραδείγματος


Τετάρτη, 13 Αυγούστου 2014

Net πλατφόρμα σε όλα τα λειτουργικά συστήματα.

Ο προγραμματισμός σε .Net, δηλαδή σε γλώσσες που υποστηρίζουν τον κώδικα Net της Microsoft, μπορεί να γίνει σε διάφορα λειτουργικά, ακόμα και στο Linux.


Για το σκοπό αυτό υπάρχει το MonoDevelop ένα σύστημα που μπορεί να δημιουργήσει εφαρμογές για Linux, Windows και Mac OSX. Παρέχεται ένα ενσωματωμένο περιβάλλον ανάπτυξης (IDE). Λέγεται ενσωματομένο γιατί μέσα από αυτό δημιουργούμε την εφαρμογή και την τρέχουμε με χρήση σημείων διακοπής (ώστε να εξετάζουμε τι γίνεται). Αν και φαντάζει πιλοτίριο αεροπλάνου...δεν είναι τόσο πολύπλοκο.


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

Οι γλώσσες συγγραφής είναι δυο τύπου ΝΕΤ, η C# και η VB (καμία σχέση με την vb6) και οι βαριές C και C++. Οι δυο τελευταίες είναι για προχωρημένους προγραμματιστές. Ουσιαστικά οι δυο πρώτες είναι εδώ οι ενδιαφέρουσες, γιατί συνδιάζονται με το σύστημα συγγραφής και παρέχονται όλα τα καλούδια για να φτιάξουμε γρήγορα και με καλό έλεγχο αποσφαλμάτωσης, λύσεις για εφαρμογές.

H C# όπως και η VB εδώ ανοίκουν στις λεγόμενες γλώσσες κοινής υποδομής, έτσι ο τελικός κώδικας τόσο της πρώτης όσο και της δεύτερης γλώσσας τρέχουν στο ίδιο περιβάλλον, στο περιβάλλον ΝΕΤ, όπου αυτό παρεμβάλλεται μεταξύ του χρήστη και του κώδικα. Ουσιαστικά οι γλώσσες αυτές δεν παράγουν προγράμματα σε γλώσσα μηχανής. Παλαιότερα αυτό ήταν ένα ζήτημα. Διότι ό,τι δεν παρήγαγε γλώσσα μηχανής έτρεχε αργά. Δεν συμβαίνει αυτό σήμερα γιατί στην ουσία ο ενδιάμεσος κώδικας είναι πολύ αποτελεσματικός. Και με τις δυο γλώσσες κάνουμε τα ίδια πράγματα. Η διαφορά είναι στο πώς φαίνεται στο χρήστη. Δηλαδή αν αρέσει ο απλός περιγραφικός τρόπος της VB, ή ο σπαρτιάτικος τύπου C της C#. Συγκρίνοντας αυτές τις γλώσσες με τη C, η τελευταία είναι μεν  "τα πάντα όλα", αλλά στερείται της χρήσης των αντικειμένων, άμεσα, ενώ η C++ ενώ έχει υποστήριξη αντικειμένων στερείται μια τυποποίηση για αυτά. Η ελευθερία δηλαδή των C και C++ στις επιλογές δημιουργεί πρόβλημα προσαρμογής, διερεύνησης και επιλογής των κατάλληλων μερών της εφαρμογής.

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

Συνέπεια αυτής της απαίτησης για γνώση πέρα από ένα μικρό λεξιλόγιο (όπως στη C), είναι να μένει στα αζήτητα για τους νέους προγραμματιστές, ένα κατά τα άλλα θαυμάσιο σύστημα παραγωγής λύσεων.

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

Γ.Κ.

Δευτέρα, 9 Ιουνίου 2014

Έκδοση 6.5

Αισίως έχω φθάσει στην έκδοση 6.5 της γλώσσας Μ2000. Παράλληλα όμως έχω στήσει και την 6.6 η οποία ακόμα βρίσκεται σε στάδιο ανάπτυξης.
Όμως η έκδοση 6.5 θα διατηρηθεί με οποιοδήποτε αναθεώρηση κρίνω ότι χρειάζεται.

Προς το παρόν έχω την έκδοση 6.5 rev 6. Ο κώδικας βρίσκεται στο Vbforums: Δες εδώ

Υ.Γ (25/11/2015)
To IDE έχει καταργηθεί πια. Δεν είχε δυνατότητα αναδίπλωσης λέξεων, και αποφάσισα να φτιάξω ενσωματωμένο διορθωτή. Στην εκδοση 8 και αναθεώρηση 95 έχουμε όχι μόνο έγχρωμο κώδικα αλλά και εξαγωγή στο πρόχειρο HTML Format.

Πέμπτη, 15 Μαΐου 2014

Ημερολόγιο Προγραμματισμού

Έφτασα στην έκδοση 6.4 της Μ2000. Ουσιαστικά στοχεύω στην 7η έκδοση με την ενσωμάτωση κλάσεων και αντικειμένων.
Εκτός από την προεργασία που έχω κάνει για την τελική έκδοση έκανα μερικές προσθήκες:

Περιβάλλον Μ2000

Ο Διερμηνευτής εκτελεί το πρόγραμμα (σε μορφή κειμένου) μέσω του περιβάλλοντός του. Μπορούμε να ανοίξουμε το περιβάλλον και να δώσουμε εντολές για να εκτελεστούν άμεσα ή να δημιουργήσουμε τμήματα και συναρτήσεις ή να φορτώσουμε τμήματα από το δίσκο.

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

Μια καλή προσθήκη είναι και η λίστα εντολών. Κάθε φορά που δίνουμε μια εντολή για άμεση εκτέλεση το σύστημα την καταγράφει σε μια λίστα και με τα βελάκια μπορούμε να τη  ξαναβρούμε (είτε το πάνω είτε το κάτω βελάκι πάντα δείχνει τα προηγούμενα και αν εκτελέσουμε κάποιο από αυτά τότε μπαίνει πρώτο στη λίστα). Επειδή ο διορθωτής γραμμής άμεσων εντολών δεν επιτρέπει την μετακίνηση προς τα πίσω  (έχω λόγο που το δεν το επιτρέπω), με την EDIT ή ΣΥΓΓΡΑΦΗ ή Σ χωρίς όρισμα θα ανοίξει η λίστα εντολών, όπου εκεί μπορούμε να προσθέσουμε εντολές, να σβήσουμε, να αλλάξουμε και με τη επιστροφή (με Esc) βρίσκουμε τις αλλαγές με τα βελάκια.
Στο περιβάλλον οποτεδήποτε διορθώνουμε κείμενο, είτε είναι πρόγραμμα, είτε αρχείο κειμένου, είτε είναι εισαγωγή μεταβλητής αλφαριθμητικής με κείμενο, δεν αλλάζει την οθόνη του περιβάλλοντος γιατί όλη η εργασία γίνεται σε ένα ξεχωριστό πλαίσιο που εμφανίζεται για αυτή τη δουλειά, πάνω από την οθόνη. Έτσι πάντα στην οθόνη θα μένουν, αν υπάρχουν, δηλαδή αν δεν έχουν σβηστεί με άλλες εντολές, οι άμεσες εντολές και όποια εκτύπωση έχουμε από αυτές.

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

Επίσης μπορεί κανείς να μειώσει την ένταση των χρωμάτων με μια άμεση εντολή ΕΠΙΦΑΝΕΙΑ 100, όπου η ΕΠΙΦΑΝΕΙΑ είναι ένα νέο επίπεδο πίσω από το  ΠΕΡΙΘΩΡΙΟ και έχει πάντα το μέγεθος της οθόνης. Στην ΕΠΙΦΑΝΕΙΑ μπορούμε να αντιγράψουμε μια εικόνα, ή ακόμα μπορούμε να την κρύψουμε ενώ έχουμε δώσει αδιαφάνεια στο ΠΕΡΙΘΩΡΙΟ...(και όλα πάνω σε αυτό ΟΘΟΝΗ και κάθε ΕΠΙΠΕΔΟ). Η επιφάνεια ξαναέρχεται με την εντολή ΕΠΙΦΑΝΕΙΑ και με ένα ή δυο αριθμούς, ο πρώτος αν είναι 255 σημαίνει 100% αδιάφανα όλα τα χρώματα, ενώ με 0 σημαίνει 100% διάφανα όλα τα χρώματα, και το δεύτερο νούμερο λέει ποιο χρώμα θα είναι πραγματικά 100% διάφανο, χωρίς να το αλλάζει το πρώτο νούμερο! Η παλιά εντολή ΕΠΙΦΑΝΕΙΑ χωρίς όρισμα, κάνει ότι έκανε και στις άλλες εκδόσεις, γεμίζει το περιθώριο με την εικόνα της επιφάνειας εργασίας.

Σε αυτήν την έκδοση μπορούμε να διαβάζουμε πληκτρολόγιο και ποντίκι για το αν πατήθηκαν  την ώρα που διαβάζουμε και όχι αν είναι πατημένα (αυτό γίνονταν). Ειδικά για το πληκτρολόγιο μπορούμε να διαβάσουμε όλα τα πλήκτρα ακόμα και το Esc χωρίς να πυροδοτήσει την "Διαφυγή" (που τερματίζει τμήματα και νήματα), ούτε το Break που καθαρίζει τον διερμηνευτή!

Έγινε επέκταση της εντολής ΑΝΑΝΕΩΣΗ με ένα όρισμα ώστε αν θέλουμε να αλλάζουμε τον ρυθμό ανανέωσης της οθόνης. Μια ολίσθηση προκαλεί ανανέωση όπως και να έχει το πράγμα.

Πίνακες
Πρόσθεσα πίνακες που μπορούν να οριστούν ξανά, και χωρίς να χάσουν τα δεδομένα τους. Πχ. DIM A$(10,4) και έστω ότι η πρώτη διάσταση λέμε να είναι γραμμές, με DIM A$(20,4) βάζουμε άλλες δέκα γραμμές χωρίς να σβήσουμε ότι είχε πριν ο πίνακας! Μπορούμε να αλλάζουμε ένα πίνακα ακόμα και όταν τον περνάμε με αναφορά σε τμήμα ή συνάρτηση (Στη Μ2000 προς το παρόν δεν περνάει με αντιγραφή ένας πίνακας, αλλά μεμονωμένα στοιχεία του). Οπότε έφτιαξα και μια συνάρτηση για να βρίσκουμε πόσες διαστάσεις έχει ένας πίνακας και το εύρος της κάθε διάστασης (το πρώτο στοιχείο είναι στο 0, άρα με εύρος 10 θα έχουμε από 0 έως 9 οι σωστοί δείκτες).

ΠΙΝΑΚΑΣ Α(10,3)
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α())  ' ΤΥΠΩΝΕΙ 2
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α(),1) ' ΤΥΠΩΝΕΙ 10
ΤΥΠΩΣΕ ΔΙΑΣΤΑΣΗ(Α(),2) ' ΤΥΠΩΝΕΙ 3

Μπορούμε να αλλάζουμε όχι μόνο τον αριθμό του εύρους των διαστάσεων αλλά και τον αριθμό των διαστάσεων. Δηλαδή μπορούμε ένα μονοδιάστατο πίνακα να τον κάνουμε δυο διαστάσεων και το ανάποδο!
Παραμένει το "κόλπο" που έπαιζε και στο ξεκίνημα της  6ης έκδοση, να μπορούμε να περάσουμε με αναφορά σε άλλο τύπο, δηλαδή ενώ έχουμε ορίσει αριθμητικό πίνακα να φτιάξουμε μια αναφορά στον πίνακα και να την μεταφέρουμε σε αλφαριθμητικό ώστε τελικά να μπορούμε ταυτόχρονα σε άλλα στοιχεία να βάζουμε αριθμό και σε άλλα αλφαριθμητικό!  Μάλιστα αν το αλφαριθμητικό είναι χαρακτήρες που δηλώνουν αριθμό, τότε αν το ζητήσουμε ως αριθμό θα το μετατρέψει ο μεταφραστής αυτόματα σε αριθμό! Παραμένει εσωτερικά ο πίνακας που αντιστοιχεί στον πίνακα της Μ2000 να έχει στοιχεία τύπου Variant (δες Visual Basic 6)

Προς το παρόν δεν μπορούμε να σβήσουμε ένα πίνακα (θα σβήσει με το πέρας του τμήματος ή της συνάρτησης που το δημιούργησε), μπορούμε όμως να τον ορίσουμε με ένα μόνο στοιχείο ΠΙΝΑΚΑΣ Α(1)



Δομές
Εμπλουτίστηκε η ΑΝ  συνθήκη ΤΟΤΕ { εντολές } ΑΛΛΙΩΣ {εντολές} με την προσθήκη του ΑΛΛΙΩΣ.ΑΝ συνθήκη {εντολές}, όπου { εντολές } μπορεί να είναι ένα μπλοκ πολλαπλών εντολών - σε πολλές γραμμές. Μπορούν να μπουν πολλά ΑΛΛΙΩΣ.ΑΝ αλλά μόλις βρεθεί συνθήκη που ικανοποιείται τα υπόλοιπα και το ΑΛΛΙΩΣ θα αγνοηθούν.

Σε μπλοκ εντολών η ΔΙΕΚΟΨΕ τερματίζει ένα τμήμα άμεσα, χωρίς να σταματήσει το τμήμα που κάλεσε το τρέχον τμήμα, εκτός από την περίπτωση να βρίσκεται σε ένα μπλοκ μέσα στην ΕΠΙΛΕΞΕ ΜΕ. Στην ΕΠΙΛΕΞΕ ΜΕ η ΔΙΕΚΟΨΕ έχει το νόημα, διέκοψε την λειτουργία σου, και εκτέλεσε κάθε περίπτωση μέχρι τέλους ή να βρεθεί μια ΣΥΝΕΧΙΣΕ (τις συνθήκες δεν τις εκτελεί σε κάθε ΜΕ)
Οι εντολές ΚΥΚΛΙΚΑ, ΕΞΟΔΟΣ, ΞΕΚΙΝΑ, ΔΙΕΚΟΨΕ, ΣΥΝΕΧΙΣΕ, ΛΑΘΟΣκατευθύνουν την ροή εντολών σε ένα μπλοκ εντολών που προσδιορίζεται με αγκύλες. Και ένα τμήμα είναι ένα μεγάλο μπλοκ, οπότε μια ΚΥΚΛΙΚΑ οπουδήποτε στο σώμα των εντολών θα κάνει το τμήμα να ξανατρέξει στο πέρας των εντολών. Μια ΞΕΚΙΝΑ ξανατρέχει άμεσα το τμήμα (είναι σαν μια ΚΥΚΛΙΚΑ και μια ΣΥΝΕΧΙΣΕ μαζϊ). Μια ΔΙΕΚΟΨΕ όπως και η ΕΞΟΔΟΣ  διακόπτει τη ροή, αλλά η ΕΞΟΔΟΣ έχει βάθος που ενεργεί σε ένα μπλοκ ενώ η ΔΙΕΚΟΨΕ αρκετά..αλλά σταματάει μέχρι το Τμήμα στο Τμήμα που θα τρέξει. Τώρα πια η ΕΞΟΔΟΣ σταματάει και την ΓΙΑ όπως και έκανε για τις  ΕΝΩ και ΕΠΑΝΑΛΑΒΕ - οι δομές αυτές είναι ΕΝΩ συνθήκη { εντολές } και ΕΠΑΝΑΛΑΒΕ { εντολές} ΜΕΧΡΙ συνθήκη ή ΠΑΝΤΑ χωρίς συνθήκη.  (υπάρχει και το ΕΠΑΝΕΛΑΒΕ  )
Η εντολή ΣΥΝΕΧΙΣΕ κάνει το εξής...αδειάζει ότι έχει άλλο το μπλοκ να εκτελέσει και αν ετρεξε μια ΚΥΚΛΙΚΑ στο ίδιο μπλοκ τότε ενεργεί σαν την ΞΕΚΙΝΑ διαφορετικά τερματίζει το μπλοκ και συνεχίζει μετά από αυτό.  Η ΛΑΘΟΣ τερματίζει όλα τα τμήματα (σε οποιοδήποτε βάθος και αν έχουν φτάσει) εκτός από την περίπτωση της δομής ΔΕΣ μεταβλητήΕλέγχου {μπλοκ εντολών} όπου αυτή πιάνει τα λάθη και σε περίπτωση λάθους συνεχίζει άμεσα και το αναφέρει (κάνει ψευδες την μεταβλητή ελέγχου, δηλαδή την κάνει 0).
Τέλος η ΑΠΟ παράστασηΑριθμητική ΠΡΟΣ ετικέτα1, ετικέτα2.... τώρα λειτουργεί και με νούμερα (από 1 ως 99999) τα οποία μπορούμε να βάζουμε σε οποιαδήποτε γραμμή. Όμως τα άλματα και σε αυτή την δομή ή με το απλό ΠΡΟΣ πρέπει να είναι εντός μπλοκ εντολών. Μάλιστα δεν υπάρχει διάκριση ως προς το τι είναι η γραμμή που θα βρεθεί η ετικέτα, ή αν υπάρχουν δέκα ίδιες, πάντα θα βρίσκει την πρώτη. Είναι στην ευχέρεια του προγραμματιστή...να κάνει λάθος. Δεν μπήκε έλεγχος για να μην καθυστερεί το άλμα, αφού η γλώσσα κάθε φορά το ψάχνει!

Χειρισμός μεταβλητών
Αντί να δώσουμε α=α+1 μπορούμε να δώσουμε αυτό:
α++
αλλά και τα παρακάτω:
α--
α+=10
α-=3
α*=12
α/=2
χ-! αλλαγή προσήμου.
Τα παραπάνω δεν μπορούν να είναι στην δεξιά πλευρά μιας αντικατάστασης και δεν λειτουργούν για πίνακες (ίσως σε άλλη έκδοση)

Μπορούμε να χειριστούμε αλφαριθμητικά με τις αγκύλες
α$= {"ασαδ"}+{
α}+{σδφσ
σδφσφ
σδφσ  }

Νήματα
Εδώ φτιάχτηκαν μερικά πράγματα: δυο άμεσα νήματα, που φτιάχνονται χωρίς να  πάρουμε αριθμό χειρισμού νήματος.
ΜΕΤΑ αριθμητικήΠαράσταση { εντολές}
Μετά από τον αριθμό των χιλιοστών δευτερολέπτου θα εκτελεστούν οι εντολές μια φορά. Βεβαίως αν το τμήμα που δημιουργήθηκε το νήμα τερματίσει πριν ξεκινήσει το μπλοκ εντολών της ΜΕΤΑ τότε θα χαθεί (επειδή τα τμήματα τερματίζουν όλα τα νήματα πριν κλείσουν).
ΚΥΡΙΟ.ΕΡΓΟ αριθμητικήΠαράσταση {εντολές}
Αυτή η δομή είναι ίδια "εξωτερικά"με την εντολή ΚΑΘΕ, αφού εκτελεί και αυτή τις εντολές σε τακτά χρονικά διαστήματα, αλλά η διαφορά είναι στο ότι το ΚΥΡΙΟ.ΕΡΓΟ είναι νήμα και πως αν κάνουμε ΕΞΟΔΟ τότε θα κλείσει όλα τα νήματα. Η δομή ΚΑΘΕ δεν είναι νήμα. Για να συμπεριφερθεί σαν αυτή τη δομή η ΚΥΡΙΟ.ΕΡΓΟ εκτελεί εκτός νήματος μια εσωτερική επανάληψη να δει πότε θα τερματίσει. Με την ΚΥΡΙΟ.ΕΡΓΟ όλα τα μπλοκ εντολών είναι νήματα και ο χρόνος τους είναι διαχειρίσιμος από το σύστημα!
Αναβάθμισα το σύστημα και μπορούν με το Esc να διακοπούν άμεσα τα νήματα. Τα νήματα καλούνται ξεχωριστά από τα Windows με χρονιστή. Αν ένα νήμα δεν δίνει χρόνο στα άλλα τότε φρακάρει το σύστημα. Για το λόγο αυτό οι εργασίες που καλούνται να κάνουν θα πρέπει να είναι μικρές, να προχωρούν με βήματα. Παρόλα αυτά τα νήματα ενδέχεται να τρέξουν το ένα μέσα στο άλλο. Αυτό που δεν γίνεται είναι να τρέξει ταυτόχρονα ένα νήμα δυο φορές και αυτό γιατί κάθε νήμα βγαίνει από την λίστα προς εκτέλεση και πάει σε μια λίστα των υπό εκτέλεση νημάτων! Τα νήματα ανήκουν στο χώρο του τμήματος που τα δημιούργησε, βλέπουν τις μεταβλητές του τμήματος και τις γενικές. Μπορούν όμως να δημιουργήσουν τμήματα, άρα και άλλα νήματα! Τα οποία όμως για να τρέξουν πρέπει να δώσει το τμήμα χρόνο άρα να καθυστερήσει το  νήμα. Το σύστημα της Μ2000 διαχειρίζεται το πότε μπορεί ένα νήμα να ξεκινήσει και πότε μπορεί να έχει χρόνο το σύστημα να ανανεώνει φόρμες και άλλα "γεγονότα"! Αυτά τα δυο δηλαδή στην έκδοση 6.4 διαχωρίστηκαν, με συνέπεια βέβαια να χαθεί λίγο η ακρίβεια χιλιοστού του χρονιστή εκκίνησης  των νημάτων (τα νήματα καλούνται με μέτρημα χρόνου).


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






Παρασκευή, 9 Μαΐου 2014

Περί γλωσσών προγραμματισμού τα βασικά!

Σήμερα αποφάσισα να κάνω ένα διάλειμμα από την συγγραφή της 7ης έκδοσης της Μ2000, για να γράψω μερικά πράγματα για τις γλώσσες προγραμματισμού και τις εφαρμογές τους, σε αυτό εδώ το Blog.

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

Οι προηγούμενες αναρτήσεις μου δεν ήταν τυχαίες. Σε τρεις αναρτήσεις δείχνω το πως από  τον αριθμό φτάσαμε στα δεδομένα και από εκεί στο πρόγραμμα, με την έννοια της εφαρμογής. Ήθελα να δείξω την σωστή αντίληψη, ότι οι αριθμοί στον υπολογιστή έχουν αξία κάθε στιγμή. Αν δεν υπολογίσουμε την αξία των αριθμών τότε ο υπολογιστής θα βγάλει λάθος! Η να το δώσω αλλιώς: Το λάθος είναι η προσμέτρηση των αριθμών (δεδομένων) με διαφορετική αξία από αυτή που έχουν.

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

Στα πρώτα χρόνια λοιπόν χρήσης υπολογιστών οι προγραμματιστές ασχολήθηκαν με την αναζήτηση του σωστού προγράμματος που θα "εκτιμήσει" σωστά τα δεδομένα. Μπορεί να φαίνεται αυτό αρκετό αλλά δεν είναι! Αν τα δεδομένα ήταν πιάτα και το πρόγραμμα το πλυντήριο τότε θα σκεφτεί κανείς .."αυτό το πράγμα πλένει όλα τα πιάτα;".  Γιατί υπάρχουν πιάτα με διαφορετικές ποιότητες, άρα θα απαιτούν ειδική μεταχείριση. Οι προγραμματιστές πήγαν παραπέρα. Σκέφτηκαν να ονομάσουν το πλύσιμο ως μια μέθοδο για κάθε πράγμα που πλένεται, ανεξάρτητα από τη συσκευή πλύσης. Στην κυριολεξία βγήκαν εφαρμογές που δέχονταν "αρχεία" ανεξάρτητα από τη συσκευή "επίδειξης". Ακόμα και η έννοια "προσωπικός υπολογιστής" εμπεριέχει την έννοια του "χειρισμού" ανεξάρτητων δεδομένων. Εκεί χάθηκε η γνώση ότι τα δεδομένα είναι εντολές και πέρασε το κομμάτι των εντολών στον χειρισμό του χρήστη επί των δεδομένων. Αργότερα επανήλθαν τα πράγματα, με την έννοια των μεταδεδομένων, των δεδομένων που πάνε παρέα με στοιχεία για την επίδειξή τους και χρήση τους, άρα με εντολές! Για παράδειγμα ένα αρχείο φωτογραφικής μηχανής λέει μεν τι χρώματα θέλει να δείξει στην εμφάνισή της αλλά δίνει και πρόσθετες πληροφορίες για το αν θα πρέπει να την βλέπουμε οριζόντια ή κάθετα, δηλαδή μια εντολή του τι θα γίνει πριν δούμε η φωτογραφία αλλά δεν έχει γίνει ήδη στο αρχείο η προεργασία!

Στα μετέπειτα χρόνια λοιπόν ο προγραμματισμός στράφηκε στο αντικείμενο που κάτι γίνεται χωρίς να ορίζει τι είναι το αντικείμενο, αρκεί να εφαρμόζουν σε αυτό  οι ιδέες μας για την εκτίμησή του, δηλαδή το τι ιδιότητες θα έχει και με ποιες μεθόδους θα χρησιμοποιείται. Σε αυτή τη περίπτωση ο ένας προγραμματιστής φτιάχνει το "ενδιάμεσο" πρόγραμμα, μια προσαρμογή ή ένα πρότυπο, και αρκεί στον τελικό χρήστη προγραμματιστή να πάρει τη προσαρμογή ή πρότυπο και να προσθέσει, θα κατασκευάσει, πραγματικά αντικείμενα στο πρόγραμμά του! Σε περίπτωση που ο χρήστης προγραμματιστής θέλει το αντικείμενό του να κάνει κάτι πρόσθετο τότε μπορεί να επεκτείνει την λειτουργικότητά του. Αυτός ο τρόπος προγραμματισμού λέγεται "αντικειμενοστραφής".


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

Δεν σταμάτησε όμως η εφευρετικότητα του ανθρώπου σε αυτά! Με το διαδίκτυο αναπτύχθηκαν οι περιφραστικές γλώσσες όπως η Html, όπου δεν περιλαμβάνουν υποχρεωτικά διαδικασίες αλλά αποτελούν τα προγράμματά τους τα δεδομένα με τα καλοπιστικά τους στοιχεία και "ζωντανά" στοιχεία όπως οι υπερσυνδέσεις και τα γεγονότα. Αν δεν υπήρχαν τα ζωντανά στοιχεία στην Html θα μιλάγαμε για μια φόρμα, για μεταδεδομένα. Τα ζωντανά στοιχεία δίνουν λειτουργικότητα και τότε ακριβώς μιλάμε για πρόγραμμα.


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


Το τελικό ερώτημα εδώ είναι: Υπάρχει η γλώσσα προγραμματισμού που τα κάνει όλα; Όχι δεν υπάρχει. Αν υπήρχε θα είχε αντικαταστήσει τις άλλες. Δεν είναι μόνο σκοπός να φέρει αποτέλεσμα ένα πρόγραμμα αλλά και αν ο κόπος και το κόστος που θα κάνει για να το φέρει θα είναι υποφερτός για μας. Οι γλώσσες προγραμματισμού δεν είναι ελεύθερες γλώσσες κατ' ανάγκη. Και αυτό γιατί για να τις χρησιμοποιήσει κανείς πρέπει να αγοράσει το περιβάλλον ανάπτυξης μαζί με τις συνοδευτικές βιβλιοθήκες διαδικασιών ή και αντικειμένων. Μεγάλες εταιρείες σου δίνουν δωρεάν την βασική έκδοση, που αν θες με αυτή μπορείς να ανακαλύψεις πάλι τον τροχό. Για να φτιάξεις  όμως εδώ και τώρα μια "λύση" για το πρόβλημα που θες λύσεις προγραμματιστικά ή θες να προσφέρεις μια Εφαρμογή για όμοια προβλήματα ή ένα γενικευμένο αντικείμενο, τότε θα πρέπει να πληρώσεις για να έχεις πρόσβαση  σε ιδιωτικό λογισμικό.


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


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

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

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

Τετάρτη, 7 Μαΐου 2014

Περιορισμός στο Προγραμματισμό!

Στο Ασκησιολόγιο του Νικολαΐδη (SpiNet) έχω αναρτήσει μερικά προγράμματα για κάθε ενδιαφερόμενο. Εδώ παραθέτω ένα. Ο χρωματισμός έχει γίνει αυτόματα από τη σελίδα του SpiNet. Εκεί έχω το όνομα χρήστη Bugman.
Η γλώσσα του σχολείου είναι απλή και σκοπό έχει να μάθει το μαθητή αλγόριθμους, δηλαδή μια σειρά εντολών που σε πεπερασμένο χρόνο δίνουν μια εξαγωγή για δοσμένη εισαγωγή δεδομένων. Με άλλα λόγια ασχολούνται το πολύ με πίνακες αριθμών. Εδώ το πρόγραμμα παίρνει δυο ακέραιους και τους διαιρεί με τον αριθμό δεκαδικών που έχουμε σε σταθερά γράψει και δεν αλλάζει κατά τη διάρκεια εκτέλεσης. Δίνεται μαζί και μια βοηθητική συνάρτηση όπου επιστρέφει το πρόσημο ενός αριθμού ως μονάδα με πρόσημο και για το μηδέν δίνει το μηδέν (κατατάσσεται στις συναρτήσεις χρήστη, σε αυτή τη γλώσσα, σε όλες τις άλλες αυτή η συνάρτηση είναι ενσωματωμένη).

Η γλώσσα έχει εδώ την Α_Τ() συνάρτηση που σημαίνει ακέραια τιμή. Μερικές γλώσσες όταν διαβάζουν ακέραιο λογαριάζουν μόνο την εισαγωγή χαρακτήρων που κάνουν ένα ακέραιο..και έτσι μεταβιβάζουν το πρόβλημα της σωστής εισαγωγής στοιχείων στον χρήστη. Άλλες γλώσσες το πλεόνασμα το πετάνε! Δηλαδή διαβάζουν ό,τι εισαγωγή δώσει ο χρήστης και από αυτήν βγάζουν ένα αποτέλεσμα. Ουσιαστικά ο περιορισμός υφίσταται στη γλώσσα και απλά εδώ συζητάμε για το χειρισμό. Γιατί όμως να έχει η γλώσσα περιορισμούς, και αφού μιλάμε για τον χειρσμό, άρα μιλάμε για τον προγραμματισμό, αυτό δηλαδή που δίνει εκείνο που θα χειριστούμε;

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

ΠΡΟΓΡΑΜΜΑ διαιρεση
ΣΤΑΘΕΡΕΣ
  ΑΡΙΘΜΟΣ_ΔΕΚΑΔΙΚΩΝ=12
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α,Β, ΘΕΣΗ
  ΑΚΕΡΑΙΕΣ: ΑΡΧΙΚΟ_Α, ΑΡΧΙΚΟ_Β
  ΧΑΡΑΚΤΗΡΕΣ: Π[3], ΑΠ

ΑΡΧΗ
   ! Πινακας Π μετατροπής προσήμου σε χαρακτήρα
  Π[1] <-- '-'
   ! στο μηδέν λέμε πρόσημο (+) στην εμφάνιση
   ! διότι μας ενδιαφέρει τα +/-, το μηδέν θα φανεί!
  Π[2] <-- '+'
  Π[3] <-- '+'
  ΓΡΑΨΕ '---------------ΕΠΙΔΕΙΞΗ ΔΙΑΙΡΕΣΗΣ-----------'
  ΓΡΑΨΕ 'ΔΩΣΕ ΑΚΕΡΑΙΟ ΩΣ ΔΙΑΙΡΕΤΕΟ'
  ΔΙΑΒΑΣΕ Α
  ΑΡΧΙΚΟ_Α <-- Α

  ΓΡΑΨΕ 'ΔΩΣΕ ΑΚΕΡΑΙΟ ΩΣ ΔΙΑΙΡΕΤΗ'
  ΔΙΑΒΑΣΕ Β
  ΑΡΧΙΚΟ_Β <-- Β
  ΓΡΑΨΕ 'ΠΡΟΣΗΜΟ ΑΠΟΤΕΛΕΣΜΑΤΟΣ=', Π[ΠΡΟΣΗΜΟ(Α)*ΠΡΟΣΗΜΟ(Β)+2]
  Α <-- Α_Τ(Α)
  Β <-- Α_Τ(Β)
   ! Η εξαγωγή της ΠΡΟΣΗΜΟ() μας δίνει τρια πιθανά αποτελέσματα
   ! και εδώ χρησιμοποιούμε το ένα, αν και με ένα Β=0 θα είχαμε το ίδιο αποτέλεσμα

  ΑΝ ΠΡΟΣΗΜΟ(Β)=0 ΤΟΤΕ
    ΓΡΑΨΕ 'ΔΙΑΙΡΕΣΗ ΜΕ ΤΟ ΜΗΔΕΝ - ΛΑΘΟΣ'
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ 'ΔΙΑΙΡΕΣΗ=', (Α DIV Β)
    ΓΡΑΨΕ 'ΥΠΟΛΟΙΠΟ=', (Α MOD Β)
    ΓΡΑΨΕ 'ΥΠΟΛΟΓΙΣΜΟΣ ΔΕΚΑΔΙΚΩΝ'
    ΘΕΣΗ <-- 0
    Α <-- (Α MOD Β)
    ΟΣΟ  (ΘΕΣΗ <  ΑΡΙΘΜΟΣ_ΔΕΚΑΔΙΚΩΝ ) ΚΑΙ (Α>0)  ΕΠΑΝΑΛΑΒΕ
      ΘΕΣΗ <-- ΘΕΣΗ+1
      Α <-- Α*10
      ΓΡΑΨΕ (Α DIV Β)
      Α <-- (Α MOD Β)
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΓΡΑΨΕ 'ΕΠΑΛΗΘΕΥΣΗ:', ΑΡΧΙΚΟ_Α/ΑΡΧΙΚΟ_Β
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

   ! Στην BASIC υπάρχει η SGN() που δουλεύει ακριβώς όπως η ΠΡΟΣΗΜΟ()
   ! Η διαφορά είναι ότι σε επιστημονικούς υπολογισμούς μπορεί κανεις
   ! να κάνει έτσι την ΠΡΟΣΗΜΟ ώστε σε ένα μικρό διάστημα γύρω από το μηδέν
   ! να δίνει μηδέν π.χ. ( ΑΝ -.00000000000000005<ΑΛΦΑ<.00000000000000005 ΤΟΤΕ ΑΛΦΑ=0)
   ! Στους αυτοματισμούς το λέμε DEAD ZONE:
   ! όσο αυξάνουμε τη νεκρή περιοχή τόσο αναίσθητο κάνουμε το σύστημα!!!!

ΣΥΝΑΡΤΗΣΗ ΠΡΟΣΗΜΟ(ΑΛΦΑ):ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ:  ΑΛΦΑ
ΑΡΧΗ
  ΑΝ ΑΛΦΑ=0 ΤΟΤΕ
    ΠΡΟΣΗΜΟ <-- 0
  ΑΛΛΙΩΣ_ΑΝ ΑΛΦΑ>0 ΤΟΤΕ
    ΠΡΟΣΗΜΟ <-- 1
  ΑΛΛΙΩΣ
    ΠΡΟΣΗΜΟ <-- -1
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Τρίτη, 6 Μαΐου 2014

Περί της Μ2000

Η γλώσσα Μ2000 σχεδιάστηκε το 1999 σε μια προσπάθεια να φτιάξω  μια εφαρμογή ασχολίας με το προγραμματισμό, κύρια για εκπαιδευτικούς λόγους.
Γράφω ασχολίας διότι δεν ήθελα να είναι ένα εργαλείο επαλήθευσης αλγορίθμων.  Τέτοιο εργαλείο χρειάζονται οι καθηγητές πληροφορικής και υπάρχει η απλή ΓΛΩΣΣΑ και εφαρμογές πολύ καλές όπως η ΓΛΩΣΣΟΜΑΘΕΙΑ για παράδειγμα, και ο Διερμηνευτής της Γλώσσας.

Επιπλέον στόχο είχα βάλει να περιλαμβάνει διπλό σύνολο εντολών, Ελληνικών και Αγγλικών. Άλλη "προδιαγραφή" ήταν να χρησιμοποιεί το λειτουργικό σύστημα για τις περισσότερες εργασίες παρά εξειδικευμένες βιβλιοθήκες. Έπρεπε να φτιάξω ένα περιβάλλον που θα θύμιζε υπολογιστή της δεκαετίας του 80. Έτσι το πρώτο πράγμα που έφτιαξα ήταν τον μεταφραστή γραμμής και την εντολή ΤΥΠΩΣΕ.

Ασφαλώς υπάρχουν γλώσσες προγραμματισμού "τεράστιες". Όμως είναι πολύ "Αφηρημένες" δηλαδή αφήνουν πολλά πράγματα στην πρωτοβουλία του προγραμματιστή, πράγμα που δεν μπορεί να έχει ένας νέος στο χώρο! Από την άλλη πλευρά δεν γίνεται να φτιάξει κανείς κάτι καλό αν δεν εξειδικεύσει σε αυτό που απλά λέμε δυνατότητες του συστήματος. Έτσι η Μ2000 είχε σαν στόχο από την αρχή να δίνει δυνατότητες μέσα στην "κονσόλα" της να μπορεί κανείς να χαράζει γραμμές, καμπύλες, πολύγωνα και κύκλους. Επίσης να γεμίζει την οθόνη με σχήματα από αρχεία emf και wmf , να φορτώνει εικόνες jpg σε μεταβλητές αλφαριθμητικών, να μετακινεί την "Οθόνη" πάνω στο "Περιθώριο" και το τελευταίο να μετακινείται στην οθόνη του υπολογιστή. Άλλες "προδιαγραφές" ήταν η χρήση χαρακτήρων ο ένας κάτω από τον άλλο, όπως στις κονσόλες εντολών και επιλογή τύπου γραμματοσειράς (όλες οι γραμματοσειρές ακόμα και οι αναλογικές μπορούν να χρησιμοποιηθούν με μη αναλογική γραφή). Φυσικά μπορούσε κανείς να βάλει και επιγραφές με αναλογική γραφή και μάλιστα και με γωνία σε ακτίνια. Επιπλέον ήθελα και ένα ωραίο χαρακτηριστικό, την χωριστή οθόνη, όπου ένα μέρος της πάνω δεν ολισθαίνει όταν "ζητάμε" γραμμή, καθώς γεμίζει η οθόνη. Δεν έμεινα μόνο σε αυτά για την οθόνη.  Οι εντολές εκτύπωσης οδηγούνται ή στην Οθόνη, ή στο Περιθώριο ή στον Εκτυπωτή.

Επιπλέον στις πρώτες εκδόσεις έβαλα και την διαχείριση βάσεων δεδομένων τύπου MDB. Με απλές εντολές μπορούμε να χτίσουμε μια βάση και με ερωτήματα SQL ή πιο απλά , να πάρουμε στοιχεία. Παρακάτω είναι το σύνολο εντολών για τις βάσεις δεδομένων. Περιλαμβάνει την ΔΟΜΗ για την ανάγνωση της Δομής της, τις ΒΑΣΗ, ΠΙΝΑΚΑΣ και ΤΑΞΗ που δημιουργούμε τα βασικά (μια βάση με πίνακες και σε κάθε πίνακα τον τρόπο  ταξινόμησης)
 Αναζητηση, Search, Ανακτηση, Retrieve, Αρχειο, Table, Αφαιρεση, Delete, Βαση, Base, Δειξε, View, Δομη, Structure, Επιστροφη, Return, Προσθηκη, Append, Συμπιεση, Compress, Ταξη, Order

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

          α = Στηλη ' κρατάμε στο α το πλάτος νοητής στήλης στην οθόνη
          Τυπωσε $( 0, 8 ) ' ορίζουμε πλάτος 8
          Επιλογη ' σβήνουμε την λίστα επιλογών
          Αρχεια + "mdb" ' βάζουμε στην λίστα επιλογών όλα τα αρχεία τύπου "mdb"
                                    ' από τον τρέχον κατάλογο
          Αν Επιλογες > 0 Τοτε {' αν υπάρχουν επιλογές στην λίστα
                Τυπωσε "Επέλεξε ένα αρχείο:" ;
                Επιλογη ! ' εμφάνιση της λίστας για να επιλέξουμε
                Αν Επιλογη > 0 Τοτε {
                      ΒΑΣΗ$ = Επιλογη$( Επιλογη )
                      Τυπωσε Πεζ$( ΒΑΣΗ$ ) + ".mdb"
                      Τυπωσε "Δομή"
                      Τυπωσε "Αρχεία:" ;
                      Δομη ΒΑΣΗ$
                      Διαβασε Αρχεια ' εδώ δεν έχουμε την εντολή ΑΡΧΕΙΑ
                               'αλλά φτιάχνουμε μια μεταβλητή με το ίδιο όνομα και δίνουμε τιμή
                               ' από τον σωρό
                      Τυπωσε Γραφη$( Αρχεια )
                      Αν Αρχεια > 0 Τοτε {
                            Για Ι = 1 Εως Αρχεια {
                                  Διαβασε ΟΝΟΜΑΤΑ$
                                  Τυπωσε Ι, ") " + ΟΝΟΜΑΤΑ$
                                  Δομη ΒΑΣΗ$, ΟΝΟΜΑΤΑ$
                                  Διαβασε Πεδια
                                  ΤΑΞΕΙΣ = 0
                                  Αν Ειναρ Τοτε Διαβασε ΤΑΞΕΙΣ
                                              ' αν υπάρχει αριθμός στο σωρό και όχι λέξη τότε...
                                  Αν Πεδια > 0 Τοτε {
                                        Για Π = 1 Εως Πεδια {
                                              Διαβασε ΠΕΡΙΓΡΑΦΗ$, ΤΥΠΟΣ$, Μηκος
                                              Τυπωσε "", Π, ") " + Πεδιο$( ΠΕΡΙΓΡΑΦΗ$, 17 ), "", ΤΥΠΟΣ$, Μηκος
                                        }
                                  }
                                  Αν ΤΑΞΕΙΣ > 0 Τοτε {
                                        Τυπωσε "", "ΤΑΞΗ:"
                                        Διαβασε Πεδια
                                        Αν Πεδια > 0 Τοτε {
                                              Για Π = 1 Εως Πεδια {
                                                    Διαβασε ΠΕΡΙΓΡΑΦΗ$, ΤΥΠΟΣ$, Μηκος
                                                    Τυπωσε "", Π, ") " + Πεδιο$( ΠΕΡΙΓΡΑΦΗ$, 17 ), "", ΤΥΠΟΣ$, Μηκος
                                              }
                                        }
                                  }
                            }
                      }
                }
          }
          Τυπωσε $( 0, α )


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

Τα σημεία που άλλαζαν την έκδοση ήταν: Η δεύτερη έκδοση απέκτησε την SELECT CASE (ΕΠΙΛΕΞΕ ΜΕ) και άλλες βελτιώσεις. Η τρίτη βελτίωσε τα γραφικά με πρόσθετες εντολές όπως γέμισμα χρώματος. Η τέταρτη έφερε την ενσωματωμένη βοήθεια. Η πέμτη έφερε τις συναρτήσεις χρήστη με δυνατότητα αναδρομής (κλήση του εαυτού της), τους πολυδιάστατους πίνακες. Σε αυτήν την έκδοση χώρισε ο σωρός, έτσι ώστε οι συναρτήσεις να μπορούν να έχουν τμήματα στο δικό της σωρό. Ο σωρός είναι το μέρος που από την πρώτη έκδοση πέρναγαν από και προς τα τμήματα τιμές, αριθμοί και αλφαριθμητικά (by value, με τιμή όπως λέμε). Μέχρι εδώ δεν υπήρχε μεταφορά τιμών με αναφορά. Πέρασαν αρκετά χρόνια (πάνω από δέκα) όπου ξεκίνησα να φτιάχνω την έκτη έκδοση. Από θέμα εντολών "κόρμού" μπήκε το πέρασμα με αναφορά. Με κλήση π.χ. ΟνομαΤμηματος &Α() αφήνει στον σωρό ένα αλφαριθμητικό που δηλώνει τον δείκτη που δείχνει τη θέση της "γνήσιας" μεταβλητής ή πίνακα. Έτσι με μια Διαβασε &Β() κάνουμε την Β() να δείχνει ότι και η Α(). Από την 6.2 μπορούμε να αλλάζουμε μέγεθος στον πίνακα Β() και θα αλλάξει (αφού είναι ο ίδιος) και στην Α(), και έτσι φτιάχτηκε και εντολή που "ρωτάει" για το πόσες διαστάσεις έχει ένας πίνακας και τι μέγεθος έχει σε κάθε μία!
Μια ιδιότητα που βρήκα. χωρίς να την είχα υπολογίσει είναι ότι επειδή οι πίνακες και οι μεταβλητές τουλάχιστον μέχρι την 6η έκδοση είχαν τιμές σε έναν δυναμικά αναπτυσσόμενο πίνακα τύπου variant, ώστε όπου ήθελα έβαζα αλφαριθμητικά και όπου ήθελα αριθμούς, μέσα από τον μηχανισμό αναφορών το εξέθεσα καλώς!
Να ένα παράδειγμα. Ένας μόνο πίνακας υπάρχει ο a(), ενώ ο b$() είναι η αναφορά στον α() αλλά επειδή είναι αλφαριθμητικός περνάει τιμές αλφαριθμητικών! Αυτόματα έχουμε μετατροπή από αριθμό σε αλφαριθμητικό όταν ζητάει ο b$() και το ανάποδο, μετατροπή του  aaaa σε αριθμό (0). Αν αντί του "aaaa" είχα δώσει ας πούμε το 123 θα έδινε αριθμό 123 η a(3)

          Dim a( 10 )
          a( 2 ) = 1000
          Push "aaaa"
          Push &a( )
          Read &b$( )
          Read b$( 3 )
          ? b$( 2 ), b$( 3 )
          ' τυπώνει 1000 και aaaa ως αλφαριθμητικά
          ? a( 2 ), a( 3 )
          ' τυπώνει 1000 και 0 (επειδή τα βλέπει ως τιμές).
     
  Η έκτη έκδοση έγινε λοιπόν 10 χρόνια μετά και προστέθηκαν εκτός από αυτό τον μηχανισμό, τα νήματα δηλαδή πολυεπεξεργασία, αυλοί επικοινωνίας, 32 επίπεδα (σαν hardware sprites), μουσική με νότες και επιλογή οργάνων, καθώς και η Repeat Until που δεν την έβαλα από την αρχή αφού υπήρχε τρόπος να στηθεί "περιφραστικά". ειδικά τα νήματα άλλαξαν τα πάντα. Στην έκδοση που φτιάχνω το σύστημα αντέχει να τρέχει "πολυεπίπεδα" νήματα, δηλαδή νήματα σε διαφορετικά τμήματα (αν το κάνει κανείς στην έκδοση έξι, ρισκάρει να δημιουργήσει μεταβλητές με ένα νήμα , και ενώ το τμήμα που το δημιούργησε έχε καλέσει ήδη ένα άλλο τμήμα). Ο κανόνας μέχρι την έκδοση έξι έλεγε ότι όταν ένα τμήμα τερματίζει ότι έχει φτιαχτεί από τον χρόνο που ξεκίνησε...θα σβήσει. Αν όλα τα νήματα τρέχουν στο ίδιο τμήμα δεν φοβάται κανείς το σβήσιμο, αφού αυτό θα γίνει όταν τερματίοει το τμήμα! Ο άλλος τρόπος είναι όπως αυτός που σχεδιάζω τώρα..όπου  τα τμήματα δημιουργούν μεταβλητές στο δικό τους χώρο Έτσι φαίνονταν και παλιά αλλά η διαφορά είναι ότι παλιά ο τρόπος που έβρισκε κανείς τις μεταβλητές τις έκανε να ξεχωρίζουν και όχι ο τρόπος αποθήκευσης και αυτό γιατί δεν είχα την ιδέα πώς να πετύχω την πολυεπεξεργασία. Την οποία κάπου τη βρήκα βέβαια αλλά αυτός που την έφτιαξε δεν είχε καν κάνει το κόπο να κάνει κάτι με αυτή, ήταν ένα απλό ομιχλώδες σχέδιο! Εγώ ξεκίνησα να την χρησιμοποιώ με τη μουσική και μετά σκέφθηκα τα νήματα επεξεργασίας.

Αυτό είναι από την βοήθεια των εντολών Φωνη και Παιξε

          Score 3, 1000, "C5F#@2B@2C5F#@2B"
               Score 1, 1000, "D@2E@2C#3 @2D5@2V90 @3F#4V127"
                              '/ C C# D D# E F F# G G# A# B
                              '/
               Play 1, 19, 3, 22 ' VOICE, INSTRUMENT
         
          'Υπάρχουν 16 φωνές Φωνη 12, 1000,"C5"
          'βάζουμε στη φωνή 12 να παίξει μια νότα Από την 5η οκτάβα για 1000 χιλιοστά
          'Αν βάλουμε @2 θα παίξει σε χρόνο 1000/2, μέχρι @6 δηλαδή 1000/32
          'Αν βάλουμε V και έναν αριθμό Από 1 μέχρι 127 αλλάζουμε την Ενταση
          'Αν δεν βάλουμε γράμμα νότας και βάλουμε διάστημα Τότε παίζει παύση Με το διαιρέτη @ Αν υπάρχει
          'Για να παίξουμε τη κάθε φωνή αρκεί να δώσουμε μια εντολή Παιξε Η Play
          'όπου συνδιάζουμε φωνή και όργανο
          'Η Παιξε 0 κλείνει την μουσική.
          'Η Ενταση αλλάζει την Ενταση του ήχου συνολικά.
          'Η Επιλεξε.Οργανο δίνει το νούμερο στο όργανο που θα επιλέξουμε από μια λίστα οργάνων
          'Για να το χρησιμοποιήσουμε στην Παιξε (το διαβάζουμε με την Επιλογη)
         
Συνεχίζεται...