Δευτέρα 8 Ιουνίου 2015

Ρυθμίσεις Περιβάλλοντος Μ2000

Μπορούμε να σώσουμε ρυθμίσεις ώστε κάθε φορά που ξεκινάμε το περιβάλλον είτε από την γραμμή εκκίνησης m2000 είτε μετο πλήκτρο break μέσα από το περιβάλλον που κάνει επανεκκίνηση (του περιβάλλοντος, όχι του υπολογιστή).
Στην είσοδο εντολών όπου βγαίνει αυτό το σημάδι ">" ή στο Command promp στα αγγλικα γράφουμε ρυθμίσεις ή settings

>ρυθμίσεις


Στη φωτογραφία φαίνονται οι ρυθμίσεις που έκανα σε υπολογιστή που μόλις πέρασα τα Windows 7. Η φόρμα μπορεί να αλλάζει μέγεθος και την έχω μεγαλώσει για να φαίνεται!

Ξέχασα να γράψω το πώς κλείνουμε το περιβάλλον.

>Τέλος

Τέλος ή End για να κλείσουμε ή από το  εικονίδιο στην γραμμή εργασιών (taskbar) όπου υπάρχει η επιλογή close window.

>Σ Α
γράφουμε στο Α
Τίτλος "George", 0
Αναμονή 1000
Τίτλος "George", 1
και πατάμε Esc για να βγούμε από το διορθωτή. Γράφουμε Α για να τρέξει το πρόγραμμα.
Α
Τώρα το πρόγραμμα χάνεται για ένα δευτερόλεπτο και ξαναεμφανίζεται, παράλληλα εμφανίζεται το όνομα George ως τίτλος της "εφαρμογής'. Η δεύτερη Τίτλος κάνει ελαχιστοποίηση (minimize) στη γραμμή εργαλείων.

Τα προγράμματα καλούνται στη Μ2000 Τμήματα, και για να δούμε τι έχουμε γράφουμε:
>Τμήματα
Α

Μπορούμε να φτιάχνουμε συναρτήσεις, π.χ.
σ Εμβαδόν(
γράφουμε στο ΕΜΒΑΔΟΝ()  ..τα ονόματα γίνονται κεφαλαία χωρίς τόνους!
διάβασε Χ, Ψ
=Χ*Ψ
και πατάμε Esc για να βγούμε από το διορθωτή. Δοκιμάζουμε:
>Τύπωσε Εμβαδόν(10,20)
       200

Τέλος σκέτο το Σ ανοίγει την λίστα εντολών που γράφουμε μετά το >
Μπορούμε να επιλέξουμε προηγούμενη εντολή με τα βελάκια πάνω ή κάτω (και τα δύο το ίδιο κάνουν)
Δοκιμάστε είναι εύκολο
ΓΚ

Δοκιμή της έκδοσης 7 αναθ 18 σε Windows 7








Σήμερα έκανα δοκιμή σε κανονικά Windows 7 Home Premium. Από την σελίδα αυτή κατέβασα το zip αρχείο, έβγαλα τον αποκλεισμό (από τις ιδιότητες του αρχείου με δεξί κλικ), το άνοιξα και έβαλα τα αρχεία σε έναν φάκελο και έτρεξα το setup.
Μετά από τα προγράμματα στο μενού επιλογής βρήκα το M2000 programming language και εκεί υπάρχουν δυο επιλογές, η μία κάνει εγκατάσταση του πιστοποιητικού αυθεντικού κώδικα και η άλλη τρέχει το περιβάλλον Μ2000 Environment.

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


Για το πιστοποιητικό ρίζας.
Η εγκατάσταση πιστοποιητικού είναι χρήσιμη για τα Windows για να μην τρέξει κάποιο μη αποδεκτό πρόγραμμα κατά λάθος. Το επιλέγουμε και πατάμε Install Certificate. Εμφανίζεται ο Wizard, και εμείς επιλέγουμε το Place all certificates in the following store. Κάνουμ κλικ στο Browse και επιλέγουμε Trusted Root Certifications Authorities. Κλείνουμε και πατάμε Next και Finish.

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

Νέα αναθεώρηση 18 για την Μ2000, έκδοση 7

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

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

module flower {
      read posX, posY, size
      refresh 10000 \\  using big number refresh counter make faster the program
      move posX,posY
      \\ Pen variation that gives color for lines inside a block of code
      width 5 { \\ setting line width
            pen #AA6600 { \\using colors like html hex values
                  for q=pi/8 to 2*pi step pi/8 {
                        move posX, posY
                        path #FF66FF { curve angle pi/3+q, size/6,pi/4+q,size,pi+q,size*2/3 }
                  }
                  move posX,posY
                  circle fill #FFAA20, size/3
            }
      }
}
cls #1155AA, 0
refresh 10000
for i=1 to 30 { \\ x.twips and y.twips are the resolution of the displayed form in twips.
      call flower random(x.twips),random(y.twips), random(2,4)*1000
}
refresh 0 \\ now we set refresh counter to 0 so we get the final picture
copy "alfa.bmp"



Εδώ είναι μια εικόνα από τον διορθωτή. Έβαλα εμφάνιση πληροφοριών, τρία "σημάδια" για να πατάμε ένα από τα F6, F7, F8 και να πηγαίνουμε απευθείας.
Με F9 μετράει τις λέξεις (σε κλάσμα του δευτερολέπτου). Η Μ2000 τρέχει σε XP εδώ σε παράθυρο Virtual Box σε σύστημα με Ubuntu Studio.



Οι παραπάνω εντολές είναι γραμμένες στο τμήμα Α (το βλέπουμε στο τίτλο)
 Με τις παρακάτω γραμμές κάνουμε τον υπολογιστή μας να μας δίνει μπουκέτα λουλούδια....κάθε φορά διαφορετικά!

EVERY 100 {
       A
      IF INKEY$<>"" THEN EXIT
}

Κάθε δέκατο του δευτερολέπτου δίνει άλλα σύνθεση, από 30 λουλούδια!

Η τελευταία αναθεώρηση: Μ2000ver7rev18 μπορείτε να κατεβάσετε το πρόγραμμα
Μετά το setup,  το ξεκινάτε και γράφεται Σ Α και ανοίγει ο διορθωτής (Σ από το Συγγραφή, στα αγγλικά το έχω με Edit A). Μπορείτε να κάνετε επικόλληση από τη σελίδα αυτή.
Μετά πατάτε Esc και γράφετε Α και πατάτε enter. Αυτό ήταν
Αν θέλετε φτιάχτε και μια Β και βάλτε μέσα τις τέσσερις παραπάνω γραμμές για να παιζει σαν ταινία, τα λουλούδια!
ΣΩΣΕ ΛΟΥΛΟΥΔΙ (ή SAVE FLOWER)
και το ξαναφορτώνουμε με ΦΟΡΤΩΣΕ ΛΟΥΛΟΥΔΙ (ή LOAD FLOWER)

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

Την επόμενη βδομάδα...με περισσότερα νέα!
Γ.Κ.





Τετάρτη 3 Ιουνίου 2015

Ενσωμάτωση delegate functions στην Μ2000

Πολύ καλή αναθεώρηση της Μ2000. προστέθηκαν ωραία πράγματα

Παρακάτω είναι η δική μου έκδοση ενός παραδείγματος που υπάρχει σε C# (δείτε εδώ). Κατάφερα να αυξήσω τις δυνατότητες των ομάδων της Μ2000, ώστε να μπορούν να δέχονται μια ομάδα από την οποία καλούν μια συγκεκριμένη συνάρτηση και περνούν μια αναφορά της ομάδας ώστε αυτή η συνάρτηση να κάνει κάποιες αλλαγές ή πράξεις γενικότερα. Μπορούμε να δίνουμε άλλες ομάδες με ίδια συνάρτηση μόνο στο όνομα...αλλά όχι στη λειτουργικότητα. Αυτές οι συναρτήσεις λέγονται delegates.

Το πρόγραμμα το έχω γράψει στα αγγλικά (η Μ2000 τρέχει στα ελληνικά και στα αγγλικά, έχει διπλό λεξιλόγιο). Χρησιμοποιεί τέσσερις ομάδες: PrintTitle, PriceTotaller, bookDB, SecondbookDB. Τα δυο τελευταία τα φτιάχνουμε με το booktype$, ένα αλφαριθμητικό, δηλαδή δίνουμε έμμεσα ορισμό.

Στη Μ2000 δεν υπάρχουν αντικείμενα, αλλά ομάδες Μια ομάδα μπορεί να περάσει με αναφορά (και ό,τι ορίζουμε τοπικό δεν θα είναι προσβάσιμο μέσω της αναφοράς). Αυτό γίνονταν και πριν, αλλά δεν γίνονταν μια μέθοδος ή μια συνάρτηση μιας ομάδας να περάσει τον εαυτό της με αναφορά. Επιπλέον έγιναν πολλές διορθώσεις και προστέθηκε η εντολή φόρμα$() ή format$() δείτε την παρακάτω, και η πολύ καλή "Για"με όνομα ομάδας μόνο. Την χρησιμοποιώ εδώ κατά κόρο. π.χ.
αντί να γράψω αυτό
      call SecondbookDB.ProcessPaperbackBooks &PriceTotaller
γράφω αυτό, και όπου υπάρχει μια τελεία προστίθεται το SecondbookDB
for SecondbookDB {
      call .ProcessPaperbackBooks &PriceTotaller
}
Μπορούμε να έχουμε φωλιασμένα Για και στο εσωτερικό, έστω δεύτερο θα έχουμε αναφορά με διπλή τελεία, στο τρίτο εσωτερικό με τρεις...
Δείτε εδώ η p(i) έχει δυο τελείες, και αναφέρεται στο Anybook, ενώ η total έχει μια και αναφέρεται στο τρέχον (το αυτό ή this στα αγγλικά).
   function processBook { read &AnyBook, i : for this {.items++ : for Anybook {.total+=..p(i)  } }}



\\ Παράδειγμα με delegate functions
booktype$={
      local countme=0
      dim t$(1), a$(1), p(1), pb(1)
      function AddBook {
            for this {
                  newdim =.countme+1
                  dim .t$(newdim), .a$(newdim), .p(newdim), .pb(newdim)      
                  read .t$(.countme), .a$(.countme), .p(.countme), .pb(.countme)
                  .countme++
            }
      }
      module ProcessPaperbackBooks {
            read &ProcessBookDelegate
                  for this {
                        if .countme<1 then exit
                        for i=0 to .countme-1 {
                              if .pb(i) then call ProcessBookDelegate.processBook(&this, i)
                        }
                  }
      }
}
group PrintTitle {
      function processBook { read &AnyBook, i : Report format$("    {0}", AnyBook.t$(i) )}
}
group PriceTotaller {
      local items, total
      function processBook { read &AnyBook, i : for this {.items++ : for Anybook {.total+=..p(i) } }}
      \\  look the <= operator, if we use = then we define local variables. Items and total are like global but for group only
      module zero { for this { .total<=0 : .items<=0 } }
      function AveragePrice { for this {if .items>0 then =.total/.items }}
}
group bookDB type booktype$
report "First Book DB"
for bookDB {
      call .AddBook("The C Programming Language", "Brian W. Kernighan and Dennis M. Ritchie", 19.95, true)
      call .AddBook("The Unicode Standard 2.0", "The Unicode Consortium", 39.95, true)
      call .AddBook("The MS-DOS Encyclopedia", "Ray Duncan", 129.95, false)
      call .AddBook("Dogbert's Clues for the Clueless", "Scott Adams", 12.00, true)
      call .ProcessPaperbackBooks &PriceTotaller
      report  "Average Paperback Book Price: $" + str$(PriceTotaller.AveragePrice(),"#.##")
      call .ProcessPaperbackBooks &PrintTitle
}
report "Second Book DB"    \\report prints text  proportionally with justification
PriceTotaller.zero
group SecondbookDB type booktype$
for SecondbookDB {
      call .AddBook("Any Big Big and Big Tilte", "Any Author", 3.45, true)
      call .ProcessPaperbackBooks &PriceTotaller
      report  "Average Paperback Book Price: $" + str$(PriceTotaller.AveragePrice(),"#.##")
      call .ProcessPaperbackBooks &PrintTitle
}

Αυτή είναι η έξοδος!



Το παραπάνω τρέχει ως έχει και στην Έκδοση 8, αλλά τρέχει και έτσι! (με την εντολή Class ή Κλάση)


class booktype {
      local countme=0
      dim t$(), a$(), p(), pb()
      module AddBook {
                  newdim =.countme+1
                  dim .t$(newdim), .a$(newdim), .p(newdim), .pb(newdim)
                  read .t$(.countme), .a$(.countme), .p(.countme), .pb(.countme)
                  .countme++
      }
      module ProcessPaperbackBooks {
            read &AnyFunction()
            if .countme<1 then exit
            for i=0 to .countme-1 {
                  if .pb(i) then call AnyFunction(&this, i)
            }
      }
}
function PrintTitle {
      read &AnyBook, i : Report format$("    {0}", AnyBook.t$(i) )
}
class PriceTotaller {
      local items, total
      function processBook { read &AnyBook, i : for this {.items++ : for Anybook {.total+=..p(i) } }}
      module zero { .total<=0 : .items<=0 }
      function AveragePrice { if .items>0 then =.total/.items }
}
bookDB=booktype()
PriceTotaller1=PriceTotaller()
report "First Book DB"
for bookDB {
      .AddBook"The C Programming Language",  "Brian W. Kernighan and Dennis M. Ritchie", 19.95, true
      .AddBook"The Unicode Standard 2.0",  "The Unicode Consortium", 39.95, true
      .AddBook"The MS-DOS Encyclopedia", "Ray Duncan", 129.95, false
      .AddBook"Dogbert's Clues for the Clueless", "Scott Adams", 12.00, true
      .ProcessPaperbackBooks &PriceTotaller1.processBook()
      report  "Average Paperback Book Price: $" + str$(PriceTotaller1.AveragePrice(),"#.##")
      .ProcessPaperbackBooks &PrintTitle()
}
report "Second Book DB"   
PriceTotaller2=PriceTotaller()
SecondbookDB=booktype()
for SecondbookDB {
      .AddBook "Any Big Big and Big Tilte",  "Any Author", 3.45, true
      .ProcessPaperbackBooks &PriceTotaller2.processBook()
      report  "Average Paperback Book Price: $" + str$(PriceTotaller2.AveragePrice(),"#.##")
      .ProcessPaperbackBooks &PrintTitle()
}