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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
       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 '<a href="https://Seite.COM/xxx/'WERT5(1:SUB)
      -    '/" target="_blank" rel="noopener noreferrer">'
      -    WERT8'</a><br>'
           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.

Workshop: Web Excel in Teams

Im letzten Jahr gab es einen Workshop den ich mit meiner These, man brauche als Kleinunternehmer theoretisch keine weitere Software als denn Windows, begonnen hatte.

Viele Lösungen haben wir in dem Workshop im April 2019 im Microsoft Live.com erarbeitet und bewiesen, das für die Unternehmensführung eines Kleinbetriebes nicht mehr Software nötig ist. Konkret habe ich gezeigt, das EXCEL selbst in der sehr einfachen Web Version unglaublich vielseitig einsetztbar ist. „Einfach“ deshalb, weil die Web Version auf keine Datenbanken zugreifen, keine Regeln für bedingte Formatierungen editieren und nicht programmiert werden kann. Wir können lediglich auf einfache Mittel der Datenüberprüfung, bedingte Formatierung und Formeln – wichtig ist der SVERWEIS – zurück greifen.

Mit erscheinen von Microsoft Teams, das kostenlos zur Verfügung steht, hat der Unternehmer ein unverzichtbares Arbeitsmittel. Die Frage, ob das EXCEL im Live.com und das innerhalb des Teams gleich sind, kann mit „Ja“ beantwortet werden. Ich habe die damals erarbeiteten Lösungen wie zB das Kassenbuch, die Kaffeekasse und eine einfache Einnahmen-Überschuss-Rechnung in Teams mit mehreren Teilnehmern gleichzeitig geteilt.

Neben dem Kassenbuch ist auch eine EÜR problemlos möglich. Durch die fehlende Datenbank ist aber zu empfehlen, je nach Menge der Geschäftsvorfälle, die Daten nach Periode in einzelnen Worksheets abzulegen. Mit Hilfe der Pivot Tabelle, ist eine Auswertung nach Periode in jeder Art und Weise möglich.

Das und einiges mehr hat jeder PC Nutzer mit dem Kauf einer Windows 10 Lizenz mit erworben. Gerne können wir darüber nachdenken, welche Lösungen möglich sind.

COBOL mit Sub C als CGI

Kurze Demo wie der Browser als Terminalersatz verwendet werden kann.

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.

OpenSAP: Qualifizierung

Es sind noch ein paar Wochen bis zum nächsten Projekt. Ich nutze die Zeit zum programmieren und lernen. hat neben dem Community Bereich auch einen Schulungsbereich. Zwischendurch lassen sich hier kleinere Themen vertiefen. Gutes Schulungsmaterial und Videos – so wie man es von SAP gewohnt ist, aussergewöhnlich gut!

Kürzlich erworben:

Grundlagen Updates Netweaver

KPI: Dashboard

Eines von vielen Dashboards näher betrachtet. Nebenbei kann man hier einiges über Datenbeschaffung und Verarbeitung zeigen. Hier die Zusammenfassung unseres Workshops.

Freeboard hat einige Vorteile. Es ist schlicht, komplett offen programmierbar und leicht mit HTML oder JavaScript einstellbar. Um den Workshop nachvollziehen zu können, hier ein paar Eckpunkte.
Nach der Installation von Freeboard auf unserem Debian 9 System mit Apache2, muss noch eine Weile gesucht werden um sinnvolle Erweiterungen zu finden – je nachdem welche Darstellungen man zeigen möchte.

Im Bild oben ist unsere Finale index.html in der verschiedene JavaScript Widgets eingebunden sind. Das altgauge.js haben wir verändert.

zu grün ändernde Anzeige

In Zeile 29 ändern wir die Farbreihenfolge von rot über gelb nach grün. Besonderst interessant sind das HighChart, das einzelne Werte auf einer Zeitachse darstellt und die FLOT Widgets, die saubere Linien und Balkendiagramme ermöglicht. Grundsätzlich „versteht“ Freeboard JSON Datenquellen und ist per JavaScript einstellbar. JSON Datensätze sehen grundsätzlich gleich aus, unterscheiden sich aber je nach eingesetztem Chart. Mal werden einzelne Werte erwartet, mal x,y Werte.Einzelne Werte für Tachoanzeigen und/oder Text/HTML. Geschachtelte Werte für Linien- oder Balkengrafik.

Natürlich versteht Freeboard auch mehrdimensionale JSON Array’s. In der Praxis haben wir die Daten aus https://warnung.bund.de/bbk.dwd/unwetter.json genutzt. Dort werden Warnmeldungen nach Art und Ort ausgegeben. Es empfiehlt sich die Daten vor Darstellung lokal aufzuarbeiten, da die Darstellung aller Daten in einer nicht vorhersehbaren Reihenfolge nicht empfehlenswert ist. Wie sieht das im einzelnen aus:

Im PHP Code durchsuchen wir das Array in der ersten und zweiten Dimension – die Menge können wir nicht beeinflussen. Wir nehmen Unwetterwarnungen nur für unsere Geolokation die so übergeben wird: value“094780000000″. Welcher Ort welchem Wert entspricht kann unter (Link) gesucht werden. In unserem Fall rufen wir nur Unwettermeldungen für den Rheinisch-Bergischen-Kreis heraus.

Das Dashboard (Link) bleibt auf dem Server und wer Einzelheiten aus dem Code wissen möchte oder noch Fragen zur Datenaufbereitung hat, mag mich einfach fragen. Sendet doch Beispiele eurer Dashboards – wir können sie hier veröffentlichen.

IBM Watson Chat Bot

IBM Cloud – Watson Lite Chat Bot.

Diesen Sonntag haben wir uns mit der IBM Cloud, genauer, mit dem Watson Chat Bot beschäftigt. Wir haben gesehen, das wir einen Gesprächsverlauf abhängig von Worten und Sätzen, die unterschiedlich bewertet werden können, an unterschiedlichen Stellen im Gesprächsverlauf, mit grundsätzlich unterschiedliche Reaktionen, programmieren können.

IBM Watson Online IDE

In der Lite Version des Watson Chat Bot’s können (müssen) wir Synonyme oder Redewendungen selbst definieren, wenn wir darauf reagieren wollen. In der Online IDE findet sich praktischer Weise, ein Test-Bot „Try it out“ mit dem eine recht schnelle Entwicklung möglich wird.

Ein riesen Spass und ein tolles Angebot von IBM.

Check it out —> Link

Standard: Datenschleuse

Ich arbeite gerne mit Datenschleusen. Zugriff durch unsichere Anwendungen, von Extern oder von Windows Client verhindern. Interesse nach dieser Art und Weise der Konfiguration kam nach den jüngsten Erpressungsfällen durch den Verschlüßlungs-Trojaner auf. Diese Konfiguration verhindert das.

Diese Technik findet jetzt in meinen Pauschalsystemen der HALSYSTEM Anwendung.

Lasst uns in einem Workshop die unterschiedlichen Config-Sets (GPO, Scripte und Virenscanner) untersuchen und eine Doku zu Papier bringen.

Python: Automatisierung Belegablage

Belege zu scannen und zu archivieren ist Standard. Wie weit lässt sich das automatisieren?

Belege scannen und archivieren ist Dauerthema in der Systementwicklung. In den Workshops taucht schon einmal die Frage nach den Diensten für automatisierte Belegverarbeitung auf. Also: Belege scannen, verbuchen und archivieren. Natürlich habe ich mich damit vor längerem beschäftigt – nehmen wir das als neuen Workshop im CCGL auf.

Ich persönlich halte nicht viel davon, da es doch sehr fehleranfällig ist. Die Systeme müssen ständig trainiert und kontrolliert werden. Auch in Top-Systemen beschäftigt sich der Buchhalter mit Korrekturbuchungen wenn die Belege tatsächlich als Papier mit der Snail-Mail im Unternehmen ankommen. Ich zeige auch warum; meine Gedanken möchten Initalfunke für den Workshop sein. In der Realität arbeiten wir immer öfter mit der eRechnung.

Zwei Wege zur automatischen Verarbeitung sehe ich. Die bekannten Dienste lesen Kreditor, Belegnummer, Belegdatum und Summe aus dem Beleg. Wie findet man die Angaben?

Die einfach Art lehnt sich an eine schon früher besprochene Vorgehensweise an (Link). Der Scan liegt da als Fließtext vor. Mit entsprechenden awk und perl Scripten können Schlüßelwörter gefiltert werden.

Die anspruchsvollere Lösung habe ich vor 15 Jahren programmiert und wurde produktiv genutzt. Es basiert auf der Vermutung, das die wesentlichen Angaben einer Rechnung oft an der selben Stelle zu finden sind. Es existiert eine Norm (Link).

Beispielrechnung mit markiertem Feld Belegart und Nummer

Schauen wir uns den Beispielbeleg an. Der Beleg hat eine Breite und eine Länge in Pixeln. Anstatt den gesamten Text zu durchsuchen, kann ich auch nur einen definierten Ausschnitt betrachten. Wird nur der Ausschnitt gelesen, haben wir Belegart und Belegnummer. Hier verwende ich Python – sehr flexibel und eigentlich selbsterklärend:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from pdf2image import convert_from_path
image = convert_from_path("test.pdf")[0]
 
 
import pytesseract
import re
snummer = re.compile("[^0-9]")
sbart = re.compile("[^a-zA-Z]")
 
beleg = image.crop((52,500,800,600))
 
text = pytesseract.image_to_string(beleg)
 
def sauberenummer(text):
	text = re.sub(snummer,"",text)
	return text
 
def sauberebeleg(text):
	text = re.sub(sbart,"",text)
	return text	
 
print(sauberebeleg(text))
print(sauberenummer(text))

Schauen wir in Zeile 10: direkte Position des Ausschnitts in Pixel! Also Beginn x,y und Ende x,y in absoluten Pixeln. Zum Beispiel GIMP zeigt die Cursorposition in der Statusleiste in Pixeln an. Produktiv würde ich mit dem Verhältnis zur Gesamtgröße arbeiten. pytesseract ist nicht so flexibel wie das Paket tesseract selbst, dennoch sehr schnell und sicher.

Python und tesseract lesen Belegart und Nummer

Ich wende hier zum lesen zwei verschiedene Filter an. Zeile 7 definiert einen Filter der nur Zahlen zwischen 0 und 9 zurück gibt – Zeile 8 nur Buchstaben ohne Umlaute. Die Funktionen in den Zeilen 14 und 18 wenden den Filter an und ersetzen jedes andere Zeichen durch „“ (Nichts).

Hier sehen wir die Problematik. „BarverkaufNr“ ist keine Belegart. Es müssen einige Routinen geschrieben werden um hier eine Rechnung verarbeiten zu können. Die Belegnummer kann so weiter verarbeitet werden.

Ich bin sehr gespannt auf Eure Vorschläge!

LOCKSS: Langzeitarchivierung

Auch Anfang des 21ten Jahrhundert besteht das Problem der Archivierung von digitalen Daten.

Wir entwickeln derzeit Möglichkeiten, wie unsere Kunden digitale Daten archivieren können. CD oder DVD mag für die Archivierung der steuerlich relevanten Daten ausreichend sein – WENN man das Medium optimal lagert, geht das für den Zeitraum von 10 Jahren gut.

Aber selbst mein privates Archiv umfasst 30 Jahre an Daten. Wichtige Unterlagen, Patente oder Verträge manch einer Firma, sollen Jahrhunderte überleben. Das geht – es existieren verschiedene Ansätze und Lösungen.

Im voran gegangenen BootCamp zum Workshop „Langzeitarchive“ habe ich die OpenSource Initiative LOCKSS vorgestellt. Sie ist Grundlage des Bundesdeutschen Projekts LuKII mit dessen Hilfe sogar die Stasi-Akten digital archiviert werden.

Für unsere Kunden ist die wirtschaftliche Effektivität, Sicherheit und Automatisierung wichtig. In den nächsten Versionen der HALSYSTEM sollen die ersten Archivsysteme realisiert sein. Ich freue mich, unsere Lösungen hier dokumentieren zu können.

Bildquelle: CC BY-SA 3.0, Link

Docker: RHEL8 – Entwicklungshilfe

Großartiges Geschenk der Firma RedHat für Entwickler.

Das neue RedHat Enterprise Linux 8 ist für Entwickler kostenfrei nutzbar. Die Entwicklungen haben wir bisher nur mit Debian und SuSe Distributionen durchgeführt.

Ohne Registrierung und in weniger als 5 Minuten einsatzbereit:
docker run –rm -it registry.access.redhat.com/ubi8/ubi

RHEL8 im Docker Container

Bis Ende 2019 haben wir noch reichlich Entwicklungsarbeit für HALSYSTEM vor uns und berichten dann über die Erfahrungen mit RHEL8 und SLES12.