Engine Room - V1N3 (German): Difference between revisions
(Created page with "Engage <br> Major Weenie's Machinenraum<br> Major Weenie tendiert dazu, ein wenig mürbe zu werden, nachdem er die halbe Nacht a...") |
(No difference)
|
Revision as of 14:04, 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<br> Say 'Sie müssen einen Dateinamen angeben, wenn sie COUNTWORDS aufrufen.'<br> Say 'Bitte versuchen sie es nochmal. . .'<br> Exit<br> 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. */<br> Inp = Linein(Filename) /* Inp enthält den Inhalt der Zeile */<br> Y = Words(Inp) /* 'Words' liefert die Anzahl der Worte in der Zeile */<br> Z = Length(Inp) /* 'Length' stellt fest, wie lang die Zeile ist */<br> if Z > Longline then LongLine = Z /* sie wissen schon... :-) */<br> Counter = Counter + 1 /* Zähler erhöhen und */<br> Allwords = Allwords + Y /* die Anzahl der Worte in der Zeile speichern */<br> End /* do */<br> <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"<br> Two = "meinem"<br> Three = "Alptraum"<br> Say Eins Zwei Drei<br> <br> '''
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<br> Zwei = 2<br> Drei = 3<br> Say Eins + Zwei + Drei<br> <br> '''
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
Major Weenie ist Kent Rebman, ein Technischer Spezialist bei IBM. -ed