Kategorien
SAP Schulung

Tipp: Multidimensionale Arrays PHP für UI5 Views

So etwas, sollte man vermeiden: Mehrfaches laden von Datensätzen in einem Kontext

Das mag im Schulungsumfeld „OK“ sein – Produktiv bedeutet das aber Umstand, Unübersichtlichkeit und Zeit. Schöner ist das bilden eines JSON Datensatzes. Das geht ganz einfach:

Einen Satz laden und durch den JSON Tree selektieren.

Kategorien
Allgemein

bash: SQL und JSON Datenquelle

Nextcloud Talk nutze ich nicht nur Privat, ich nutze es auch gerne produktiv um Werte zu beobachten und zu berichten.

Es ist Admin Alltag: Mal nimmt man sich die Zeit, Funktionen sauber zu schreiben – wie unten im Bild unter Punkt 1: Schön schnell, in C mit Postgres SQL Cursor programmiert – aber auch im selben Bash Script, Q&D in PHP und jq. In Bezug auf Sicherheit und Schnelligkeit werde ich den PHP/jq Part wohl rausnehmen.

Aber: Wichtig für den User ist, das es läuft. Und das tut es 😉 .

Was sind so Eure „Admin Sünden“?

Kategorien
Randnotiz

Retro Terminal

Der CCGL (Computer Club Bergisch Gladbach) sucht Ideen für eine neue Homepage. Mein Beitrag ist eine dynamische Homepage im DEC VT100 Style.

Kategorien
Randnotiz

Bash: Webhooks in MS 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:

#!/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.

 $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.

Kategorien
Randnotiz

PHP: PHP5.3 zu PHP5.4

Immer wieder kommt es zu Problemen, wenn PHP Versionen größer 5.3 installiert werden. Ab und an gehe ich auf Fehlersuche.

Log Dateien geben nicht unbedingt Auskunft – ich rufe mit der Konsole die index.php auf und arbeite mich, von da an im Gesamtwerk, weiter.

Integer Dezimal gedacht, Octal programmiert

Beschäftigt hat mich ein, im Browser nicht aufrufbaren Code, der diese Fehlermeldung erzeugte: Parse error: Invalid numeric literal in…………

Den „Fehler“, der keiner ist, findet man schnell. Seit PHP5.4 wird eine Zahl, mit vorangestellter 0 (Null) nicht als dezimal Integer sondern octal interpretiert. Für PHP ist 08 nicht 8 weil es Octal keine 8 gibt! Würde man 0x8 schreiben, ist die Zahl 8 Hexadezimal und auch dezimal 8 – octal allerdings 10.

Es muss also beim programmieren streng darauf geachtet werden, in welchem Zahlensystem man sich denn befindet. Abhilfe könnte ein Code Review mit suchen/ersetzen Bash Lauf sein, will man nicht File für File im VI Editor lesen.

Octales Zahlensystem im Vergleich zu dezimal, hexdezimal und binär. Quelle: Wikipedia

Kategorien
Randnotiz

PHP: inkompatibles ISPconfig

ISPConfig reagiert bei Update der PHP Pakete seltsam inkompatibel. In der Version, die ich produktiv nutze, geht nichts mit PHP > 5.6

Entgegen aller Empfehlung entwickle ich auf dem produktiven Systemen mit PHP7.4. Was ist zu tuen, will man nicht ISPConfig mit PHP7.4 updaten?

ISPConfig erzeugt Fehlermeldungen bzgl. mysqli und mbstring und stellt Betrieb ein.

Apache2 Mod PHP5 bleibt konfiguriert und ISPConfig kann über die server.sh Scriptdatei beeinflusst werden.

Verändert habe ich, das nicht der Default /usr/bin/php angesprochen wird – Default ist PHP7.4 – sondern explizit PHP5.

server.sh nicht auf Default /usr/bin/php stehen lassen

Jetzt funktioniert der User-Self-Support und es kann bei Gelegenheit ein Systemupgrade vollzogen werden.

Kategorien
Allgemein

KPI: pixi* API und Freeboard

Durch die Descartes pixi* API erhalten wir SOAP Array’s zur Weiterverarbeitung. Zur alternativen Darstellung von Kennzahlen – Descartes hat ein eigenes KPI Dashboard – habe ich mich für Freeboard entschieden. In einem Workshop habe ich die Vorzüge erläutert (Link).

Die Array’s aus der API speichere ich zwischen und extrahiere aus den mehrstufigen Array’s die Daten, die ich darstellen möchte. Interessant ist, das der Aufbau der Antworten stark unterschiedlich ist und deshalb kein einheitliches Vorgehen anzuraten ist.

getOptions());
$client->setTransportObject('\Pixi\API\Soap\Transport\CurlTransport');
$client->setResultObject('\Pixi\API\Soap\Result\ArrayResult');
//################################################################
// Liste aller Shops
$rs = $client->pixiGetShops()->getResultset();
// Verbindungsaufbau und Auswahl der Datenbank
$dbconn = pg_connect("host=localhost dbname=pixi user=a password=b")
    or die('Verbindungsaufbau fehlgeschlagen: ' . pg_last_error());
// durchlaufen aller Shops
foreach ($rs as $key => $res) {
//################################################################
    $time1 = date("Y-m-d", strtotime("-6 months"));
    $time2 = date("Y-m-d");
    $pixiParams = array('ShopID' => $rs[$key]['ShopID'],'FromTime' => $time1,'UntilTime' => $time2);
    $res2 = $client->pixiReportReceivedOrders($pixiParams)->getResultset();
//################################################################
// Postgres Insert
    $query = "Insert into orders (zeit,label,x) values('".$time2."','".$rs[$key]['ShopID']."',".$res2[0]['ReceivedOrders'].");";
    $result = pg_query($query);
//#################################################################                            

}
                            // Speicher freigeben
                            pg_free_result($result);
                            
                            // Verbindung schließen
                            pg_close($dbconn);

?>

Das Listing ist ein Beispiel für das Grundgerüst. In Zeile 15 holen wir uns alle konfigurierten Shops mit der Abfrage pixiGetShops. In einer foreach Schleife rufen wir in Zeile 25 für jeden Shop (‚ShopID‘ => $rs[$key][‚ShopID‘]) pixiReportReceivedOrders auf und speichern die Daten in einer Datenbank zwischen um eventuell später Durchnittswerte errechnen zu können.

Um die Daten – welche auch immer – in Freeboard sichtbar zu machen, müssen wir aus dem Array einen Datensatz im JSON Format generieren.

$time1 = date("Y-m-d H:i:s", strtotime("-24 hours"));
$time2 = date("Y-m-d H:i:s");
foreach($shops as $key => $su){
    $pixiParams = array('timePeriod' => 9999,'ShopID' =>  $su,'startDateTime' => $time1,'endDateTime' => $time2);
    $rs = $client->pixiReportScanInPerTimeQuant($pixiParams)->getResultset();
    $ergebnis[$key] = array($rs[0]['SUMScanIn'],$key);
}
$JSON = json_encode($ergebnis);
print('{ "data": '.str_replace('"','',$JSON).'}');

Ändern wir den Code einmal wie oben beschrieben ab und rufen die Werte der letzten 24 Stunden für pixiReportScanInPerTimeQuant auf. Entscheidend ist Zeile 9. Freebord kann in einer Linien- oder Balkengrafik nur „{ data: [5,0],[1,1],[5,2]}“ verarbeiten.

Wir werden hier noch genauer darauf eingehen. Freeboard hätte gerne für die verschiedenen grafischen Möglichkeiten, einen unterschiedlichen Datensatzaufbau. Es ist noch damit zu spielen, welche Zahl bzw. API Auswertung Sinn auf einem KPI macht und wie wir die Daten aufbereiten müssen.

Kategorien
Randnotiz Schulung

KPI: Dashboard

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.

Kategorien
Allgemein

Copyright mit aktuellem Jahr

Erstaunlich – WordPress und Magento haben das nicht vor gesehen: Die Copyright Information unten im Seitenfuss wird nicht automatisch aktualisiert. Zahlreiche How-To’s finden sich im Netz die dem Leser einen PHP Code zur Nachbessereung anbieten.

Bildschirmfoto - 01.09.2016 - 15:58:13
HTML JavaScript

Was ist aber mit denen die nicht in den Code einsteigen wollen oder eben nur auf die Schnelle über das Editorensystem ändern wollen? Dort wird nämlich bei beiden System nur HTML Code zugelassen.

Nach endlos langem suchen habe ich ich Lösung gefunden (mitschreiben, merken):