Compiler Optimierung nicht vergessen

Für schnelle Lösungen und „mal eben zeigen“ in Workshops und Schulungen verwende ich schnell die nackte 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 zum Beispiel (Link). In C und C++ innerhalb der Funktion „main“ ein simples printf bzw. std::out und in COBOL lediglich 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

Einfacher Report mit HTML Link

Schnell Programm in COBOL mit Sub-Routine in C. 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.
Ich bin offen für Vorschläge, welche Anwendung wir so erstellen können. Das Beispiel ist Online (Link).

xtermjs – einfacher Terminal

Java ist eine Insel. Trotzdem muss man sich mit der Programmiersprache beschäftigen. Auf der Suche nach einer Möglichkeit, Terminaldaten auf einer Website darzustellen, stieß ich auf xterm.js

Tolles Beispiel dafür, eine einfache Sache möglichst kompliziert zu machen. xterm.js für sich, ist fast wertfrei. Es ist ein Render – es kann Text dargestellt werden und mit Javascript eine gewisse Logik programmiert werden. Nur im Zusammenspiel mit Anwendungen wie Node.js und socket.io kann es zumindest einfache Bash Befehle wiedergeben. Ein hoher Aufwand, weshalb ich das Projekt verworfen habe.

xterm auf Homepage

Für einfache Übungen aber ganz interessant. Als Demo bleibt es Online (Link). Im Netz finden sich einige Artikel, die etwas über die Programmierung erzählen – ich habe festgestellt, das sich die Syntax im Lauf der Jahre geändert hat. Bezüglich Instanzierung der Klasse und Referenzierung ist das Handbuch (Link) zu Rate zu ziehen.

Zum Code: Das Javascript, das den Terminal auf der Website darstellt, kann in simplen HTML Code aufgerufen werden. Zum Beispiel

Listing HTML Code

In Zeile 5 und 9 laden wir die Scripte. Unser Script ist term.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var term = new Terminal({theme: {
    background: '#808080',
    color: '#8000ff'},
    cursorBlink: 'true'});
 term.open(document.getElementById('terminal'));
 term.writeln('HALSYSTEM Term \r\n');
 term.write("==> ");
 var input = "";
 term.onData(function (data, ev) {
    const code = data.charCodeAt(0);
    if (code == 13) {
       term.write('\n\r');
       if (input == 'Test') {
         term.writeln('ok');
         }
         input = "";
         } else {
       term.write(data);
       input += data;
       };                                   
 });

Es ist zu erkennen, das es ein simples Anzeigen von Terminaldaten ist und einfache if then Logik angewendet wird. Es lässt sich so zumindest etwas spielen. Bedeutet aber auch, das programmiert werden muss. Das Verhalten bei „Enter“ oder Eingabe von Triggerworten kann und muss programmiert werden. Viel Spass.

Webhooks nutzen

Beispiel für die Nutzung von Webhooks in Microsoft Teams.

Microsoft Teams lässt sich hervorragend für den EDV Support nutzen. Wie wäre es wenn der Kunde von der Website aus, direkt in den Techniker Kanal im Teams posten kann? Oder der Kundenserver im Fall einer Warnung, diese direkt publiziert?

Ein Webhook läßt sich jedem Kanal in jedem Team hinzufügen – Wir haben im Workshop ausgiebig geübt. Bisher haben wir Webhooks genutzt, um via Microsoft Visual Code, ganze Listings oder einzelne Zeilen im Micosoft Teams zu publizieren und zu diskutieren. Kopieren wir uns die URL des Webhooks.

Einstellung / Verwaltung der Connectoren in einem Kanal

Wie überträgt man nun eine Nachricht über den Webhook an den Microsoft Teams Kanal? Kurz: curl -H „Content-Type: application/json“ -d JSON URL. Diese Zeile in einem Bashscript würde ausreichen um eine Nachricht, als JSON Datensatz formatiert, der Webhook URL zu übergeben. Als Beispiel ein Bash Script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
 
# Thomas Schilling Oktober 2019
# Testscript Webhook in Microsft Teams
 
WEBHOOK_URL="https://outlook.office.com/webhook/...."
TITLE=$1
shift
COLOR="#FF0000"
TEXT=$1
 
MESSAGE=$( echo ${TEXT} | sed 's/"/\"/g' | sed "s/'/\'/g" )
JSON="{\"title\": \"${TITLE}\", \"themeColor\": \"${COLOR}\", \"text\": \"${MESSAGE}\" }"
 
curl -H "Content-Type: application/json" -d "${JSON}" "${WEBHOOK_URL}"

Mit Aufruf des Bash Scripts übergeben wir eine Überschrift und einen Text. Das ist beliebig. Zum Beispiel möchte ich aktuelle Warnmeldungen der bund.de im Kanal veröffentlichen. In einem vorherigen Workshop haben wir mit den Wetterdaten bereits gespielt. Das PHP Script nutzen wir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$url = file_get_contents('https://warnung.bund.de/bbk.mowas/gefahrendurchsagen.json');
 
$json = json_decode($url);
$z = 0;
foreach ($json as $idx => $inhalt){
$m1 = $inhalt->info[0]->headline;
$m2 = $inhalt->info[0]->description;
        foreach ($inhalt->info[0]->area as $id2 => $in2){
                if ($in2->geocode[0]->value=='053780000000'){
                    $z++;
                    print('{"data": { "head": "'.$m1.'"}}');                
                    shell_exec('/teams.sh "'.$m1.'" "'.$m2.'"');
                } 
       }
}
if ($z==0){
print('{"data": { "head": "keine Gefahrenmeldung"}}');
}
?>

In den Zeilen 7 und 8 werden Überschrift und Gefahrenmeldung aus dem SOAP Array gelesen. In Zeile 13 rufen wir das obige Bash Script auf – In Zeile 8 des Bash Scripts teilen wir die übergebenen Texte. Die Farbe, der Meldung in Teams, ist im Bash Script in Zeile 13 im JSON Datensatz.

Meldung im Kanal
Gefahrenmeldung mit auffälliger Farbe im Kanal

Mit dem Bash Script lässt sich jeder Text publizieren. Zum Beispiel Fehlermeldungen oder Warnungen eines Kundenservers.

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

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.

Neue Workshops für KMU

Noch in diesem Jahr soll ein Workshop wiederholt werden: Ersteinrichtung Lexware Buchhalter und Faktura mit eigenem Rechnungsformular und belegloser Rechnungsversand.

Der Club sucht momentan nach einer festen Örtlichkeit. Auf Facebook ist in diversen Foren ein Aufruf gestartet worden.

Bis dahin werden wir Schulungen und den anstehenden Workshops wieder bei den interessierten Firmen selbst durchführen. Eine gute Kaffeemaschine voraus gesetzt! Die regelmäßigen Basteltage fallen erstmal kleiner aus.

Ich würde mich freuen, noch mehr (zukünftige) Kollegen mit einbinden zu können. Neueinsteiger und Greenhorns, die ihre Zukunft in der IT sehen, können hier Erfahrungen von hohem Wert sammeln.

Einfach mal rein schauen –> https://www.facebook.com/computerclubgl/

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. Ich lasse es auf meiner Page laufen und ich bin sicher, wir arbeiten im CCGL noch ein weilchen damit.

Check it out —> Link