Engine Room - V1N3 (German): Difference between revisions
No edit summary |
No edit summary |
||
Line 88: | Line 88: | ||
Richtig, sagen sie dem Anwender, daß er es verbockt hat, wenn er überhaupt | Richtig, sagen sie dem Anwender, daß er es verbockt hat, wenn er überhaupt | ||
nichts eingegeben hat. Sie können das so machen: | nichts eingegeben hat. Sie können das so machen: | ||
<pre>''' | <pre>''' | ||
If filename = "" then Do | If filename = "" then Do | ||
Say 'Sie müssen einen Dateinamen angeben, wenn sie COUNTWORDS aufrufen.' | Say 'Sie müssen einen Dateinamen angeben, wenn sie COUNTWORDS aufrufen.' | ||
Say 'Bitte versuchen sie es nochmal. . .' | Say 'Bitte versuchen sie es nochmal. . .' | ||
Exit | Exit | ||
End /* do */''' | End /* do */''' | ||
</pre> | </pre> | ||
Ok, halten wir mal kurz hier an. Zwei Probleme, die außerhalb Major Weenies | Ok, halten wir mal kurz hier an. Zwei Probleme, die außerhalb Major Weenies | ||
Line 106: | Line 104: | ||
also kommen sie mir nicht mit klassischem Zeug, wie "Nur ein Exit Punkt im einem | also kommen sie mir nicht mit klassischem Zeug, wie "Nur ein Exit Punkt im einem | ||
Programm". | Programm". | ||
So, das mußte gesagt werden - was nun ? Jetzt müssen sie die Datei öffnen. | So, das mußte gesagt werden - was nun ? Jetzt müssen sie die Datei öffnen. | ||
Die einfachste Möglichkeit, eine Datei in REXX zu verändern, ist nach Meinung | Die einfachste Möglichkeit, eine Datei in REXX zu verändern, ist nach Meinung | ||
des Majors ein einfaches LINEIN Kommando zu verwenden. Das sieht dann so aus: | des Majors ein einfaches LINEIN Kommando zu verwenden. Das sieht dann so aus: | ||
<pre>'''rc = LineIn(Filename,,0)''' | <pre>'''rc = LineIn(Filename,,0)''' | ||
</pre> | </pre> | ||
In diesem Fall speichert REXX den Rückgabewert in "rc". In diesem Beispiel | In diesem Fall speichert REXX den Rückgabewert in "rc". In diesem Beispiel | ||
Line 130: | Line 122: | ||
der Zeilen, die ich einlesen wollte. Hier habe ich keine Zeilen gelesen, | der Zeilen, die ich einlesen wollte. Hier habe ich keine Zeilen gelesen, | ||
sondern nur die Datei geöffnet. Aye Bursche, schau in das Handbuch. | sondern nur die Datei geöffnet. Aye Bursche, schau in das Handbuch. | ||
Was brauche ich noch ? Richtig! Irgendwo muß ich mir merken, wie viele Worte | Was brauche ich noch ? Richtig! Irgendwo muß ich mir merken, wie viele Worte | ||
Line 139: | Line 129: | ||
den drei Zählern Counter, Allwords und Longline arbeiten und sie gleich mal | den drei Zählern Counter, Allwords und Longline arbeiten und sie gleich mal | ||
auf Null setzen. Sie können das folgendermaßen machen: | auf Null setzen. Sie können das folgendermaßen machen: | ||
<pre>'''Counter = 0; Allwords = 0; Longline = 0''' | <pre>'''Counter = 0; Allwords = 0; Longline = 0''' | ||
</pre> | </pre> | ||
Das Semikolon trennt jeweils die einzelnen Anweisungen voneinander. | Das Semikolon trennt jeweils die einzelnen Anweisungen voneinander. | ||
Fassen wir also zusammen, was wir machen werden: | Fassen wir also zusammen, was wir machen werden: | ||
* Eine Zeile einlesen | * Eine Zeile einlesen | ||
* Die Worte in der Zeile zählen | * Die Worte in der Zeile zählen | ||
* Die Zeilenlänge feststellen und merken, wenn es die längste bisher gefundene Zeile ist. | * Die Zeilenlänge feststellen und merken, wenn es die längste bisher gefundene Zeile ist. | ||
Und so sieht das aus... | Und so sieht das aus... | ||
<pre>''' | <pre>''' | ||
Do While Lines(Filename) < > 0 /* 'Lines' arbeitet bis keine Zeilen mehr da sind. */ | |||
Do While Lines(Filename) < > 0 /* 'Lines' arbeitet bis keine Zeilen mehr da sind. */ | Inp = Linein(Filename) /* Inp enthält den Inhalt der Zeile */ | ||
Inp = Linein(Filename) /* Inp enthält den Inhalt der Zeile */ | Y = Words(Inp) /* 'Words' liefert die Anzahl der Worte in der Zeile */ | ||
Y = Words(Inp) /* 'Words' liefert die Anzahl der Worte in der Zeile */ | Z = Length(Inp) /* 'Length' stellt fest, wie lang die Zeile ist */ | ||
Z = Length(Inp) /* 'Length' stellt fest, wie lang die Zeile ist */ | if Z > Longline then LongLine = Z /* sie wissen schon... :-) */ | ||
if Z > Longline then LongLine = Z /* sie wissen schon... :-) */ | Counter = Counter + 1 /* Zähler erhöhen und */ | ||
Counter = Counter + 1 /* Zähler erhöhen und */ | Allwords = Allwords + Y /* die Anzahl der Worte in der Zeile speichern */ | ||
Allwords = Allwords + Y /* die Anzahl der Worte in der Zeile speichern */ | End /* do */ | ||
End /* do */ | |||
<br> | <br> | ||
''' | ''' | ||
</pre> | </pre> | ||
Ok, wir haben alle diese Informationen zusammengesucht, was machen wir jetzt damit? | |||
Nun, wir zeigen sie mit dem '''SAY''' Befehl an. Richtig, sie lesen | Nun, wir zeigen sie mit dem '''SAY''' Befehl an. Richtig, sie lesen | ||
Line 185: | Line 163: | ||
möchten, muß in einfache (') oder doppelte (") Anführungszeichen | möchten, muß in einfache (') oder doppelte (") Anführungszeichen | ||
eingeschlossen werden, mit Ausnahme von definierten Variablen. Wenn sie also | eingeschlossen werden, mit Ausnahme von definierten Variablen. Wenn sie also | ||
diese Befehle in ihr Programm schreiben: | diese Befehle in ihr Programm schreiben: | ||
<pre>''' | <pre>''' | ||
One = "Willkommen zu" | One = "Willkommen zu" | ||
Two = "meinem" | Two = "meinem" | ||
Three = "Alptraum" | Three = "Alptraum" | ||
Say Eins Zwei Drei | Say Eins Zwei Drei | ||
''' | ''' | ||
</pre> | </pre> | ||
Dann erscheint auf dem Bildschirm: | |||
Dann erscheint auf dem Bildschirm: | |||
<pre>'''Willkommen zu meinem Alptraum''' | <pre>'''Willkommen zu meinem Alptraum''' | ||
</pre> | </pre> | ||
Wenn sie Eins, Zwei oder Drei nicht definiert haben, bekommen sie: | Wenn sie Eins, Zwei oder Drei nicht definiert haben, bekommen sie: | ||
<pre>'''Eins Zwei Drei''' | <pre>'''Eins Zwei Drei''' | ||
</pre> | </pre> | ||
Wenn sie das hier vorher gemacht hätten: | |||
Wenn sie das hier vorher gemacht hätten: | |||
<pre>''' | <pre>''' | ||
Eins = 1 | Eins = 1 | ||
Zwei = 2 | Zwei = 2 | ||
Drei = 3 | Drei = 3 | ||
Say Eins + Zwei + Drei | Say Eins + Zwei + Drei ''' | ||
</pre> | </pre> | ||
würde ihr Programm anzeigen... nein, das würde ihnen ja den ganzen Spaß | würde ihr Programm anzeigen... nein, das würde ihnen ja den ganzen Spaß | ||
verderben. | verderben. | ||
Und so will ich das ganze verwenden: Zuerst müssen wir herausfinden, wie viele | Und so will ich das ganze verwenden: Zuerst müssen wir herausfinden, wie viele | ||
Line 231: | Line 201: | ||
Steinzeit hat, als Nadeldrucker üblicherweise nur 66 Zeilen auf einer Seite | Steinzeit hat, als Nadeldrucker üblicherweise nur 66 Zeilen auf einer Seite | ||
unterbringen konnten. Also definiere und berechne ich "Seite" so: | unterbringen konnten. Also definiere und berechne ich "Seite" so: | ||
<pre>'''Seites = Trunc((Counter/66),1); If Seites = 0 Then Seites = | <pre>'''Seites = Trunc((Counter/66),1); If Seites = 0 Then Seites = | ||
Trunc((Counter/66),2)''' | Trunc((Counter/66),2)''' | ||
</pre> | </pre> | ||
Das "Trunc" Kommando sorgt für eine handhabbare Anzahl Nachkommastellen. Die | Das "Trunc" Kommando sorgt für eine handhabbare Anzahl Nachkommastellen. Die | ||
Line 243: | Line 211: | ||
vorhanden ist, ist eigentlich Overkill. Andererseits... der Major bevorzugt | vorhanden ist, ist eigentlich Overkill. Andererseits... der Major bevorzugt | ||
Feuerkraft... | Feuerkraft... | ||
Nachdem wir das herausgefunden haben, schreibe ich noch folgendes: | Nachdem wir das herausgefunden haben, schreibe ich noch folgendes: | ||
'''Say Filename 'enthält 'Counter' Zeilen - das entspricht 'Seites' Seiten mit je 66 Zeilen.' | |||
Say 'Die längste Zeile in der Datei ist 'LongLine' Zeichen lang. Es gibt ' | |||
Say AllWords' Worte in der Datei.' | |||
''' | |||
''' | |||
Sicher werden sie die Datei, die sie geöffnet haben, auch wieder schließen | Sicher werden sie die Datei, die sie geöffnet haben, auch wieder schließen | ||
Line 259: | Line 224: | ||
beschäftigen können, anstatt nach Dienst die Schiffsenergie im Holodeck zu | beschäftigen können, anstatt nach Dienst die Schiffsenergie im Holodeck zu | ||
verbraten. (Ach, und wir haben dieses gewisse Programm gefunden...) Schauen | verbraten. (Ach, und wir haben dieses gewisse Programm gefunden...) Schauen | ||
sie sich mal den '''STREAM''' Befehl an. | sie sich mal den '''STREAM''' Befehl an. | ||
Wenn sie mir bis hierhin folgen konnten und CountWords mit der README Datei | Wenn sie mir bis hierhin folgen konnten und CountWords mit der README Datei | ||
laufen ließen, sollten sie ein Ergebnis bekommen haben, das etwa so aussieht: | laufen ließen, sollten sie ein Ergebnis bekommen haben, das etwa so aussieht: | ||
'''README enthält 851 Zeilen - das entspricht 12.8 Seiten mit je 66 Zeilen. | |||
Die längste Zeile in der Datei ist 74 Zeichen lang. Es gibt 3984 Worte in der Datei.''' | |||
''' | |||
Oh, hoppla, das ist der Captain, sie müssen mich entschuldigen. Sie haben es | Oh, hoppla, das ist der Captain, sie müssen mich entschuldigen. Sie haben es | ||
Line 274: | Line 236: | ||
Replikator kurzgeschlossen hat so daß er jetzt, wenn er nach Earl Grey | Replikator kurzgeschlossen hat so daß er jetzt, wenn er nach Earl Grey | ||
verlangt, etwas eher in der Art eines Duke of Earl bekommt. | verlangt, etwas eher in der Art eines Duke of Earl bekommt. | ||
Bis zum nächsten Mal bleibe ich ihr | Bis zum nächsten Mal bleibe ich ihr | ||
[[Major Weenie]] | |||
''Major Weenie ist Kent Rebman, ein Technischer Spezialist bei IBM. -ed'' | |||
---- | ---- | ||
[[Image:wollogos.gif|right|Warp Online]] | [[Image:wollogos.gif|right|Warp Online]] |
Revision as of 15:07, 10 November 2017

Major Weenie tendiert dazu, ein wenig mürbe zu werden, nachdem er die halbe
Nacht auf war, um mit Mr. Worf die verschiedensten klingonischen Delikatessen,
wie gakh zu probieren. Es ist dabei nicht einmal die Tatsache, daß das Essen
versucht vom Teller zu kriechen, während man versucht, es zu essen - es ist der
Pflaumensaft, mit dem man es runterspült, der mich fertigmacht.
Im Hinblick auf den heutigen geschwächten Zustand des Majors werden wir uns
daher auf eine kurze, einfache Lektion beschränken.
Ich glaube, das letzte mal verließen wir unsere Diskussion über REXX mit ein
paar sehr einfachen Beispielen. Nun laßt uns mal die Empfänger etwas
empfindlicher einstellen und das Dateihandling untersuchen.
Nun, die meisten Dateien, die sie mit REXX verändern werden, werden keine
Binärdateien sein - sie könnten zwar eine Datenbank Applikation in REXX
schreiben, aber sie sollten es nicht. Sie erinnern sich, soweit es den Major
betrifft, ist REXX am besten geeignet für relativ einfache Aufgaben, wie
Systemverwaltung. Wenn sie eine Datenbank möchten, empfiehlt der Major DB2/2
von IBM, Approach von Lotus Development oder nehmen sie sich einen Indelible
Blue Katalog und schauen sie sich andere Möglichkeiten an.
Also, welche Dateitypen werden sie höchstwahrscheinlich mit REXX bearbeiten?
Kommen sie, hören sie auf, mit dem Replikator zu spielen und denken sie mal
nach. Richtig, Textdateien. Was ist die eine Textdatei, die man auf jedem Warp
System findet, selbst, wenn es der Major installiert hat ? Richtig, README.
Nun, eine Eigenschaft die README mit fast jeder anderen einfachen Textdatei
gemeinsam hat, die aus einer beliebigen Ecke des Quadranten eingeflogen
kommt, ist die, daß sie nicht in einzelne Seiten unterteilt ist. Und wenn wir
von einer Seitenunterteilung reden, dann reden wir üblicherweise über das
Vorhandensein des ASCII Zeichens mit der Nummer 12, das nichts anderes als ein
Seitenvorschub ist. Wäre es nicht schön, wenn man vorher wüßte, wieviele
Seiten ein Ausdruck von README oder einer anderen einfachen Textdatei
benötigen wird ? Bäume wachsen nunmal nicht auf Bäumen, wie sie wissen.
Hier ist eine Möglichkeit, das mit einer einfachen REXX Datei herauszufinden.
Vergessen sie nicht, daß jede REXX Datei mit einem Kommentar beginnen muß (und
der Kommentar ist alles, was zwischen den Zeichen /* und */ zu finden ist).
Nachdem wir nun den Kommentar aus dem Weg geräumt haben, wie bekommen wir
unser Programm dazu, tatsächlich README oder eine andere Datei zu öffnen und
zu manipulieren. Ein einfacher Weg ist, den Dateinamen sofort beim Aufruf des
Programms zu erfassen. Das passiert mit dem ARG Befehl.
Leute, so fühlt sich mein Magen an nach all dem gakh...
Tatsächlich ist ARG der Befehl, mit dem sie in ihrem Programm all das erfassen
können, was der Anwender in der Kommadozeile eingetippt hat. Wenn ihr Programm
"countwords.cmd" heißt dann sieht die Zeile, mit der sie in countwords die
Datei erhalten können, mit der gearbeitet werden soll, so aus:
ARG filename
"filename" wird, im Rahmen des Programms, die Datei, mit der sie arbeiten,
sprich, ARG erfasst, was sie auf der Kommandozeile eingegeben haben und
speichert es in dem Variablennamen, den sie hinter ARG angegeben haben. Wenn
sie in diesem Beispiel "countwords readme" auf der Kommandozeile eingeben,
wird "readme" der variable "filename" zugewiesen.
So, jetzt haben sie den Dateinamen, und was jetzt ? OK, zuerst lege ich mal
diesen Disruptor weg oder lasse ihn sicher nicht so auf meinen Kopf zeigen...
Egal, was ist das Schlaueste, was man zu diesem Zeitpunkt machen kann ?
Richtig, sagen sie dem Anwender, daß er es verbockt hat, wenn er überhaupt nichts eingegeben hat. Sie können das so machen:
''' If filename = "" then Do Say 'Sie müssen einen Dateinamen angeben, wenn sie COUNTWORDS aufrufen.' Say 'Bitte versuchen sie es nochmal. . .' Exit End /* do */'''
Ok, halten wir mal kurz hier an. Zwei Probleme, die außerhalb Major Weenies
Kontrolle liegen: Zum einen das Problem, das hier für das Low-Tech Internet
auszulegen. Fragen sie nicht den Major, wenn es darum geht, all die TABs und
so weiter richtig zusammenzubasteln. Zum anderen ist REXX nicht C oder C++,
also kommen sie mir nicht mit klassischem Zeug, wie "Nur ein Exit Punkt im einem
Programm".
So, das mußte gesagt werden - was nun ? Jetzt müssen sie die Datei öffnen.
Die einfachste Möglichkeit, eine Datei in REXX zu verändern, ist nach Meinung des Majors ein einfaches LINEIN Kommando zu verwenden. Das sieht dann so aus:
'''rc = LineIn(Filename,,0)'''
In diesem Fall speichert REXX den Rückgabewert in "rc". In diesem Beispiel
sollte rc Null enthalten, wenn die Datei erfolgreich geöffnet werden konnte.
Wenn sie in der REXX Online Hilfe nachschlagen, werden sie sehen, daß LINEIN
das Format LineIn(name, line, count) hat.
Beachten sie, daß ich "line" nicht verwendet habe. Da die Datei nicht geöffnet
war, fing LineIn am Dateianfang an zu lesen und "count" bezeichnet die Anzahl
der Zeilen, die ich einlesen wollte. Hier habe ich keine Zeilen gelesen,
sondern nur die Datei geöffnet. Aye Bursche, schau in das Handbuch.
Was brauche ich noch ? Richtig! Irgendwo muß ich mir merken, wie viele Worte und Zeilen ich eingelesen habe. Und wenn wir gerade dabei sind, könnten wir auch gleich feststellen, welches die längste Zeile ist. (Warum ? Weil wir dann wissen, wie wir den Zeilenumbruch am besten bewerkstelligen). Wir werden mit den drei Zählern Counter, Allwords und Longline arbeiten und sie gleich mal auf Null setzen. Sie können das folgendermaßen machen:
'''Counter = 0; Allwords = 0; Longline = 0'''
Das Semikolon trennt jeweils die einzelnen Anweisungen voneinander.
Fassen wir also zusammen, was wir machen werden:
- Eine Zeile einlesen
- Die Worte in der Zeile zählen
- Die Zeilenlänge feststellen und merken, wenn es die längste bisher gefundene Zeile ist.
Und so sieht das aus...
''' Do While Lines(Filename) < > 0 /* 'Lines' arbeitet bis keine Zeilen mehr da sind. */ Inp = Linein(Filename) /* Inp enthält den Inhalt der Zeile */ Y = Words(Inp) /* 'Words' liefert die Anzahl der Worte in der Zeile */ Z = Length(Inp) /* 'Length' stellt fest, wie lang die Zeile ist */ if Z > Longline then LongLine = Z /* sie wissen schon... :-) */ Counter = Counter + 1 /* Zähler erhöhen und */ Allwords = Allwords + Y /* die Anzahl der Worte in der Zeile speichern */ End /* do */ <br> '''
Ok, wir haben alle diese Informationen zusammengesucht, was machen wir jetzt damit?
Nun, wir zeigen sie mit dem SAY Befehl an. Richtig, sie lesen
meine Gedanken: Schlagen sie mal im Handbuch unter dem SAY Befehl nach.
Einige Hinweise zum SAY Befehl: Das, was sie auf dem Bildschirm anzeigen
möchten, muß in einfache (') oder doppelte (") Anführungszeichen
eingeschlossen werden, mit Ausnahme von definierten Variablen. Wenn sie also
diese Befehle in ihr Programm schreiben:
''' One = "Willkommen zu" Two = "meinem" Three = "Alptraum" Say Eins Zwei Drei '''
Dann erscheint auf dem Bildschirm:
'''Willkommen zu meinem Alptraum'''
Wenn sie Eins, Zwei oder Drei nicht definiert haben, bekommen sie:
'''Eins Zwei Drei'''
Wenn sie das hier vorher gemacht hätten:
''' Eins = 1 Zwei = 2 Drei = 3 Say Eins + Zwei + Drei '''
würde ihr Programm anzeigen... nein, das würde ihnen ja den ganzen Spaß verderben.
Und so will ich das ganze verwenden: Zuerst müssen wir herausfinden, wie viele Seiten es gibt, indem wir die Anzahl der Zeilen durch 66 teilen. Sechundsechzig ist absolut willkührlich und ist eine Zahl, die ihren Ursprung weit in der Steinzeit hat, als Nadeldrucker üblicherweise nur 66 Zeilen auf einer Seite unterbringen konnten. Also definiere und berechne ich "Seite" so:
'''Seites = Trunc((Counter/66),1); If Seites = 0 Then Seites = Trunc((Counter/66),2)'''
Das "Trunc" Kommando sorgt für eine handhabbare Anzahl Nachkommastellen. Die
Zahl auf zwei Stellen abzuschneiden, wenn weniger als eine Seite Daten
vorhanden ist, ist eigentlich Overkill. Andererseits... der Major bevorzugt
Feuerkraft...
Nachdem wir das herausgefunden haben, schreibe ich noch folgendes:
Say Filename 'enthält 'Counter' Zeilen - das entspricht 'Seites' Seiten mit je 66 Zeilen.' Say 'Die längste Zeile in der Datei ist 'LongLine' Zeichen lang. Es gibt ' Say AllWords' Worte in der Datei.'
Sicher werden sie die Datei, die sie geöffnet haben, auch wieder schließen wollen, also werde ich ihnen eine kleine Aufgabe geben, mit der sie sich beschäftigen können, anstatt nach Dienst die Schiffsenergie im Holodeck zu verbraten. (Ach, und wir haben dieses gewisse Programm gefunden...) Schauen sie sich mal den STREAM Befehl an.
Wenn sie mir bis hierhin folgen konnten und CountWords mit der README Datei laufen ließen, sollten sie ein Ergebnis bekommen haben, das etwa so aussieht:
README enthält 851 Zeilen - das entspricht 12.8 Seiten mit je 66 Zeilen. Die längste Zeile in der Datei ist 74 Zeichen lang. Es gibt 3984 Worte in der Datei.
Oh, hoppla, das ist der Captain, sie müssen mich entschuldigen. Sie haben es vermutlich gehört - dieser Fisch, der aus dem Aquarium sprang und den Replikator kurzgeschlossen hat so daß er jetzt, wenn er nach Earl Grey verlangt, etwas eher in der Art eines Duke of Earl bekommt.
Bis zum nächsten Mal bleibe ich ihr
Major Weenie ist Kent Rebman, ein Technischer Spezialist bei IBM. -ed
