Kategorien
Schulung

COBOL: Auffrischung Z/OS

Kleine Auffrischung zum Handling von COBOL Jobs für Z/OS IBM Mainframes mit Microsoft’s Visual Code IDE.

Kategorien
Schulung

COBOL: neuer IBM Compiler

IBM setzt auf kompatibilität mit x86 Systemen und bietet hierfür einen Compiler zum Kauf an. Der Preis ist noch unbekannt – die 60 Tage Testversion haben wir als Podman Container getestet. Hier kleiner Merkzettel nach unserem CCGL Workshop:

Wir haben zunächst ein Dockerfile erstellt in das wir die relevanten RPM Files von IBM kopieren

FROM centos
COPY IBM_COBOL_V1.1.0_LINUX_EVAL.x86-64/images/rhel/cobol.cmp.1.1.0-1.1.0.0-210415.779.x86_64.rpm /cobol/
COPY IBM_COBOL_V1.1.0_LINUX_EVAL.x86-64/images/rhel/cobol.cmp.license-eval.1.1.0-1.1.0.0-210415.779.x86_64.rpm /cobol/
COPY IBM_COBOL_V1.1.0_LINUX_EVAL.x86-64/images/rhel/cobol.rte.1.1.0-1.1.0.0-210415.779.x86_64.rpm /cobol/

„podman build“ erstellt nun ein Image mit den RPM’s im Verzeichnis /cobol/. „podman images“ zeigt die ID. Starten wir das Ganze initial mit „podman run -it –mount type=bind,source=/austausch,target=/home/ –name=IBM_cobol 096972054812“. Mit dem initialen Kommando legen wir gleichzeitig einen Container mit dem Namen „IBM_cobol“ an und mounten ein Austauschverzeichnis. Hiernach kann der Container mit „podman start -ia IBM_cobol“ gestartet werden.

Im Container wechseln wir in das /cobol/ Verzeichnis und sorgen erst einmal für die Auflösung der Abhängigkeiten lt. IBM Installationsanleitung:

yum install perl gcc glibc.i686 glibc-devel.i686 libgcc.i686 libstdc++.i686 libquadmath.i686
rpm -Uvh cobol/*.rpm
ln -s /opt/ibm/cobol/1.1.0/usr/bin/cob2 /usr/bin/cob2
ln -s /opt/ibm/cobol/1.1.0/etc/cob2.cfg /etc/cob2.cfg

Das war’s schon. „cob2 -V“ sollte jetzt die Version des Compilers wiedergeben. Als erstes haben wir ein „Hello World“ Code geschrieben und diesen, ähnlich GNUcobol, mit „cob2 code.cbl -o test“ kompiliert. „test“ ist erfolgreich ausführbar und es wird per default ein Bericht generiert.

Im direktem Vergleich mit GNUcobol fällt die strengere Kontrolle der Code Formatierung auf. Code, den wir geschrieben haben, mit Link zu Librarys wie libq, müssen wir noch umschreiben.

Happy Coding!

Kategorien
Allgemein

Individuelle Anwendungen

Viele Geräte in ihrem Netzwerk können technisch angesprochen und befragt werden. Sie antworten mehr oder weniger freudig.

Es können Drucker, PC’s oder Fernsehgeräte sein. In meinem kleinen Beispiel sind es IP Kameras. Mit einem kleinen BASH Script, das alle 5 Minuten gestartet wird, sammle ich Daten über Zustand und Arbeit der IP Kameras, die Bestandteil einer Meldeanlage sind.

Kategorien
Randnotiz

Compiler Optimierung

Für schnelle Lösungen und „mal eben zeigen“ in Workshops und Schulungen verwende ich schnell die unbedachte Kompilierung von Quellcode mit GCC, G++, COBC oder NASM. Das sollte man sich in größeren Projekten abgewöhnen. Compiler Option sind mächtig und bringen viel (Link).

Nehmen wir den berühmten „Hello World“ Code als Beispiel (Link). In C und C++ innerhalb der Funktion „main“ ein simples printf bzw. std::out und in COBOL, in der „Procedure Division“, ein „DISPLAY“. Übersetzen wir alle Sources in Assembler und erzeugen ein ausführbares Programm.

Liste der erzeugten Code

Ohne Optimierung fällt einiges auf. „helloc“ und „test-03.s“ sind die Produkte aus dem C Source Code. Das daraus generierte Assembler ist 8,2k gross. Das Assembler aus dem C++ Code wiegt 18k und 41k bringt das Assembler aus dem COBOL Source auf die Speicher-Waage. Fertig kompiliert sind alle drei ausführbaren Programme 22k bzw. 23k groß.

Schreiben wir „Hello World“ einmal in Assembler

Assembler

und übersetzen, verlinken es mittels „nasm -felf64 helloa.asm && ld -o helloa helloa.o“

Kompilierung des Assemblercode

Wir sehen, da ist wahnsinniges Optmierungspotential. 352 Byte Quellcode und 4,8k für das ausführbare Programm. Ohne genaue Kenntnisse über den Compiler würde man in realen Projekten unter gehen – wir reden da durchaus über Mega- oder Giga-Byte die so verschwendet und zu einem Bottleneck in der Prozessierung werden kann.

Keep on Coding

Kategorien
Schulung

COBOL: Report mit HTML Link

Schnelles Programm in COBOL mit Sub-Routine in C für die Generierung von HTML Code. Vorhanden ist die OpenVPN Liste eines Servers die auch tote Verbindungen enthält. Erstellt werden soll eine Liste, die nur aktive Verbindungen enthält. Die OpenVPN Verbindung soll über eine Website der Welt zur Verfügung stehen.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. SLS.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT CAMS ASSIGN TO 'online.txt'
           ORGANIZATION IS LINE SEQUENTIAL.           
       DATA DIVISION.
       FILE SECTION.
       FD CAMS.
       01 CAMS-FILE PIC X(118).
       01 EOF PIC A(1).
       WORKING-STORAGE SECTION.
       01 STR-LEN PIC 9(3).
       01 SUB PIC 9(3).
       01 WS-EOF PIC A(1).
       01 WS-REC PIC X(118).
       01 WERT1 PIC X(4).
       01 WERT2 PIC X(20).
       01 WERT3 PIC X(5).
       01 WERT4 PIC X(20).
       01 WERT5 PIC X(15).
       01 WERT6 PIC X(1).
       01 WERT7 PIC X(20).
       01 WERT8 PIC X(20).
       01 RET PIC 9(1).
       PROCEDURE DIVISION.
           OPEN INPUT CAMS.
           PERFORM UNTIL WS-EOF='Y'
           READ CAMS INTO CAMS-FILE
            AT END MOVE 'Y' TO WS-EOF
            NOT AT END
            UNSTRING CAMS-FILE DELIMITED BY ALL SPACES
            INTO WERT1
                 WERT2
                 WERT3
                 WERT4
                 WERT5
                 WERT6
                 WERT7
                 WERT8
            END-UNSTRING
          MOVE LENGTH OF WERT5 TO STR-LEN
           PERFORM VARYING SUB FROM STR-LEN BY -1
           UNTIL WERT5(SUB:1) NOT = SPACE
           END-PERFORM
          CALL "test" USING
               BY REFERENCE WERT5(1:SUB)
               RETURNING RET
           END-CALL
          IF RET = 1
           THEN
           DISPLAY ''
      -    WERT8'
' END-IF END-READ END-PERFORM. CLOSE CAMS. STOP RUN.

Die Sub-Routine „test“ ist ein C Programm (Link) das einen Ping durchführt und wahr/falsch zurück gibt. Zeilen 28-42 lies eine Zeile mit 8 Spalten und legt die Werte in den Variablen WERT1 bis WERT8 ab. 43-46 entfernt Leerzeichen durch simples abzählen der Stellen bis „Leerzeichen“. Danach erfolgt durch Aufruf der Ping Routine eine Prüfung der Erreichbarkeit. Wenn wahr, wird ein HTML Link generiert.

Kategorien
Schulung

COBOL mit Sub C als CGI

Im letzten Workshop haben wir über Möglichkeiten der Programmierung für Terminal Consolen gesprochen. Im Moment haben wir keine Alternative zu den bekannten 3270 Terminal Programmen gefunden. Besonderheit ist, das Zeilen und Spalten aus dem Programm heraus direkt ansprechbar sind – die Bash ist ein rollierender Terminal, also ungeeignet.

Gespielt haben wir deshalb mit der Alternative Browser. Ein Apache2 Web-Server mit aktiviertem CGI Modul lässt unglaublich dynamische Programmierungen zu. Das Beispiel, das ich gezeigt habe, ist aus unseren Workshops zu den Themen „COBOL mit C Subroutinen“ und „Terminal“. Hier in Kurzform:

Da der COBOL Compiler über die Sprache C compiliert, können wir C Code einfach einbinden ( cobc -x list.cob list.c ). Wir haben getestet, dass mit dem CALL Variablen kopiert oder als Referenz übergeben werden können. In unserer einfachen Subroutine verändern wir die Variablen und sehen, das eben nur die referenzierte Variable geändert wird. Das Programm setzt aber die Bash voraus, die nicht jeder hat. Einen Browser hat jeder.

Anstatt printf(text) und DISPLAY Text können wir den Text mit HTML Steuerelementen schmücken. Mehr ist nicht nötig. Mehr Probleme bereitet die Tatsache, dass das Ereignis <button type=“submit“ >Send</button> in der Webpage, einen Stream zurück gibt. Diesem Stream müssen wir filtern und die eingebenen Werte durch UNSTRING aus dem Stream extrahieren.

Wir sehen das der BY REFERNCE übergebene Wert in der Subroutine verändert, zurück gegeben und als HTML Table ausgegeben wird. Beispiel ist hier Online.

Kategorien
Randnotiz

COBOL: Shared Library

Nach dem Download der Source von OpenCobol und dem Nachladen notwendiger Development Librarys, funktioniert die mitgelieferte MAKE Konfiguration ganz passabel.

./configure, make, make check, make test und make install laufen meisst fehlerfrei durch. Trotzdem erhält man nach dem ersten kompilieren und dem Start seiner Anwendung den Fehler „error while loading shared libraries: libcob.so.4“ o.ä.

Das liegt an fehlender Path Bekanntgabe. Im Verzeichnis /etc/ld.so.conf.d werden die Pfade zu diversen Libraries bekannt gegeben. In der MAKE Konfiguration ist vorgesehen, die Programm Bibliotheken im Verzeichniss /usr/local/lib abzulegen. Damit sie auch gefunden werden, ist also eine .conf anzulegen mit dem Pfad als Inhalt. Nach einem ldconfig ist der Pfad bekannt und cobc sowie das kompilierte Programm funktionieren einwandfrei.

Das Verhalten unterscheidet sich unter den Distributionen (Debian, RedHat, SuSe) und sogar von Release zu Release.