Ralf Hohoff

IT & Softwareentwicklung

image_pdfimage_print

If debugging is the process of removing bugs, then programming must be the process of putting them in.
– Edsger W. Dijkstra

Testing can only prove the presence of bugs, not their absence.
– Edsger W. Dijkstra

Ein Computerprogramm tut, was Du schreibst, nicht was Du willst.
– Edward A. Murphy

Es ist verwerflich, dass Informatiker viel mehr verdienen als Hartz-IV-Empfänger, wo doch beide den ganzen Tag vor’m Rechner sitzen.

– unbekannt

Siehe auch https://en.wikiquote.org/wiki/Programming

Geräteinformationen von Dell automatisch auslesen

image_pdfimage_print

Die Informationen über auslaufende Service-Verträge gelangten recht schwach strukturiert in unser Unternehmen und dies war seitens Dell auch nicht einfach änderbar. Der Abruf dieser und weiterer Informationen wie Gerätedaten über den Dell-Kundenbereich gestaltete sich auch als schwierig, weil das Dateiformat geändert wurde und Datumsangaben mal im deutschen und mal im amerikanischen Format angegeben wurden (in einer Spalte!).

Eine zentrale Verwaltung der Informationen in einer Datenbank und das automatische Aktualisieren der Gerätedaten musste her. Nach einiger Suche habe ich herausgefunden, dass es eine API gibt, die aber Probleme bereitet.

Hilfreich waren PHP: Querying Dell AssetService webservice to retrieve asset information und Get Dell System Warranty with PowerShell.

Ich habe erst versucht, die Daten mit Pentaho Data Integration direkt über den Webservice-Aufruf die Daten auszulesen. Das scheiterte, weil die im WSDL-File angegebene Adresse http://support.dell.com/WebServices/GetAssetInformation für die Funktion „GetAssetInformation“ nicht verfügbar war. Wenn man diese Adresse durch http://xserv.dell.com/services/AssetService.asmx überschreibt, erhält man die Daten. Das „Überschreiben“ ging nicht in Pentaho Data Integration und deshalb habe ich das mit PHP gemacht. Das PHP-Skript wird mit dem Service-Tag aufgerufen und gibt die Informationen im JSON-Format zurück.

$DELL_URL = "http://xserv.dell.com/services/assetservice.asmx?WSDL";
$soap = new SoapClient($DELL_URL, array('soap_version' => SOAP_1_2));
 
// Location muss überschrieben werden, weil die Url (die im WSDL angegeben wird!) nicht mehr korrekt ist!
// http://www.scconfigmgr.com/2013/06/23/get-dell-system-warranty-with-powershell/
$soap->__setLocation('http://xserv.dell.com/services/AssetService.asmx');
 
$tag = $_GET['ServiceTag'];
$response = $soap->GetAssetInformation(
	array(
	"guid" => "11111111-1111-1111-1111-111111111111",
	"applicationName" => "AssetService",
	"serviceTags" => $tag
	)
);
echo json_encode($response, JSON_PRETTY_PRINT);

Das Pentaho-Skript liest alle Service-Tags aus der Datenbank, ruft die PHP-Seite parametrisiert mit dem Service-Tag auf, verarbeitet das zurückgegebene JSON-Format und speichert die Informationen in der Datenbank.

Dell Servive-Tags auslesen

 

JSON-Beispiel für Service-Tag „4FL45W1“

{
    "GetAssetInformationResult": {
        "Asset": {
            "AssetHeaderData": {
                "ServiceTag": "4FL45W1",
                "SystemID": "optiplex-9010-aio",
                "Buid": "8270",
                "Region": "Asia \/ Pacific",
                "SystemType": "OptiPlex",
                "SystemModel": "OptiPlex 9010 All In One (Mid 2012)",
                "SystemShipDate": "2012-12-12T13:00:00-06:00"
            },
            "Entitlements": {
                "EntitlementData": [
                    {
                        "ServiceLevelCode": "HDD",
                        "ServiceLevelDescription": "For Non Returnable HDD",
                        "Provider": "",
                        "StartDate": "2012-12-12T00:00:00",
                        "EndDate": "2015-12-13T00:00:00",
                        "DaysLeft": 88,
                        "EntitlementType": "Active"
                    },
                    {
                        "ServiceLevelCode": "AD",
                        "ServiceLevelDescription": "Accidental Damage Service",
                        "Provider": "",
                        "StartDate": "2012-12-12T00:00:00",
                        "EndDate": "2015-12-13T00:00:00",
                        "DaysLeft": 88,
                        "EntitlementType": "Active"
                    },
                    {
                        "ServiceLevelCode": "NBD",
                        "ServiceLevelDescription": "Next Business Day response",
                        "Provider": "",
                        "StartDate": "2013-12-13T00:00:00",
                        "EndDate": "2015-12-13T00:00:00",
                        "DaysLeft": 88,
                        "EntitlementType": "Active"
                    },
                    {
                        "ServiceLevelCode": "POW",
                        "ServiceLevelDescription": "Parts Only Warranty",
                        "Provider": "",
                        "StartDate": "2013-12-13T00:00:00",
                        "EndDate": "2015-12-13T00:00:00",
                        "DaysLeft": 88,
                        "EntitlementType": "Active"
                    },
                    {
                        "ServiceLevelCode": "NBD",
                        "ServiceLevelDescription": "Next Business Day response",
                        "Provider": "",
                        "StartDate": "2012-12-12T00:00:00",
                        "EndDate": "2013-12-13T00:00:00",
                        "DaysLeft": 0,
                        "EntitlementType": "Expired"
                    },
                    {
                        "ServiceLevelCode": "POW",
                        "ServiceLevelDescription": "Parts Only Warranty",
                        "Provider": "",
                        "StartDate": "2012-12-12T00:00:00",
                        "EndDate": "2013-12-13T00:00:00",
                        "DaysLeft": 0,
                        "EntitlementType": "Expired"
                    }
                ]
            }
        }
    }
}

Machen

image_pdfimage_print

Es geht ums Machen und Beginnen mit einer Sache!

Nimm dir Zeit zum Nachdenken, aber wenn die Zeit zum Handeln kommt, hör auf mit dem Denken und geh’ los.
– Andrew Jackson

 

Ein Ziel ohne Plan ist nur ein Wunsch.
Antoine de Saint-Exupéry

Weiterlesen

Menschen

image_pdfimage_print

Ein Mensch,  der keine Wünsche mehr hat, ist eigentlich schon tot.

 

I speak to everyone in the same way, wheter he is the garbage man or the president of the university.
– Albert Einstein

 

Es zeichnet einen gebildeten Geist aus, sich mit jenem Grad an Genauigkeit zufrieden zugeben, den die Natur der Dinge zulässt, und nicht dort Exaktheit zu suchen, wo nur Annäherung möglich ist.

– Aristoteles

 

Kein großer Geist war ohne Beimischung von Tollheit.
(Aristoteles – No great mind has ever existed without a touch of madness.)

– Aristoteles

Italienisches Ragout

image_pdfimage_print

Nachdem ich bei Anthony Bourdain eine italienische „Mamma“ beim Kochen eines Ragouts gesehen hatte, wollte ich das unbedingt Nachkochen.

Rezept gesucht und gefunden:

Italienisches Ragout – Originalrezept

Originalrezept meiner neapolitanischen Schwiegermutter – super vorzubereiten und macht sich fast von alleine !
Habe mir alle Zutaten besorgt und habe nach Rezept gekocht. Es ist nicht schwierig, das Fleisch wurde superzart und die Kinder haben es auch gerne mitgegessen – es war bloss ein bischen fad.
Da habe ich mich an das Rezept für Tomaten von Jamie Oliver erinnert. Das Ragout habe ich am nächsten Tag noch einmal mit einer ganzen, frischen roten Chillischote (vorher einstechen, sonst fliegt sie um die Ohren) erhitzt. Das hat dem Ragout noch eine leichte Schärfe verliehen.

Zitronenhuhn mit Zutaten aus dem eigenen Garten

image_pdfimage_print

Das Zitronenbrathuhn mit gerösteten Rosmarinkartoffeln (Rezept von Jamie Oliver) ist ein sehr leckeres und immer wieder beliebtes Essen (die Kinder fragen danach!), was unserer ganzen Familie schmeckt.

Aber wenn man die ganz frischen Kartoffeln aus der eigenen Ernte zum Kochen nehmen kann und das noch mit Rosmarin und Thymian aus dem eigenen Garten ergänzt, ist das ein Traum 😉

Das Huhn (bzw. das Brathähnchen) kam auch ganz frisch vom Hof Hauswörmann in Osnabrück-Sutthausen mit dazu. Auch wenn ich letztens einen Artikel über Hühnerhaltung gelesen habe, die werde ich nicht im eigenen Garten halten …

 

Es geht so einfach: mehrere Excel-Dateien auf einmal einlesen!

image_pdfimage_print

Für einen Import musste ich auf Excel als Datenquelle zurückgreifen und das mache ich nicht gerne 😉 Aber die Daten lagen nun mal nicht in einer Datenbank vor.

Da beim täglichen Import nicht nur eine sondern auch mehrere Dateien bereitliegen konnten, wollte ich – recht umständlich – eine Schleife bauen, die die Dateien nacheinander einliest und den Datenstrom aufbaut.

Das ist aber nicht notwendig, das kann der „Microsoft Excel Input“ auch ganz alleine schon!

Ich habe nur noch das Verzeichnis und einen regulären Ausdruck „.*\.xlsx$“ angegeben, dann werden alle Excel-Dateien eingelen und in einen Datenstrom überführt. Die Excel-Dateien können unterschiedlich benannt sein, die Datenstruktur (Spalten) muss natürlich identisch sein.

Excel_Input_Regex

Kartoffelernte!

image_pdfimage_print

Heute war es endlich soweit, wir haben die Kartoffelernte eingefahren!

In unserem kleinen Gemüsegarten hatte ich dieses Jahr erstmalig mit einem Hügelbeet und einem Kartoffelturm (ist wie ein Spezial-Hochbeet für Kartoffeln und ich habe es mit einer Gabione gebaut) experimentiert. Das hat einwandfrei funktioniert, die Ernte war gut.

Kartoffelbauern-2

Die ganz kleinen Kartoffeln sind – ohne Umweg in den Keller – gleich gewaschen und gekocht worden. Die schmeckten auch mit Schale herrlich zart und mild, sehr lecker 😉

 

 

Urlaub ist zum Kochen da!

image_pdfimage_print

Während unseres Texel-Urlaubs gab es die Gelegenheit, zwei Rezepte von Jamie Oliver auszuprobieren.

Pikantes Wurst-Cassoulet

Vom Vorabend-Grillen waren noch grobe Bratwürschen über und da passte das Rezept für ein pikantes Wurst-Cassoulet aus dem Buch Cook clever mit Jamie Oliver ganz hervorragend. Auch die Kinder waren begeistert und griffen beherzt zu. So haben wir dann in der warmen Abendsonne auf der Terrasse die wunderbar verwerteten Bratwürstchen mit Tomaten und weissen Bohnen gegessen.

chicken tikka masala (Hühnercurry)

Einen Tag später gab es chicken tikka masala. Ich habe lange gezögert, dieses Gericht zu kochen, weil ich nicht ganz genau wusste, wie es wohl geschmacklich sein wird (indisch/britisch und scharf/nicht scharf) und wer es dann mit mir isst. Im Urlaub hatte ich nun fünf „Testpersonen“ und habe das Rezept nun zum ersten Mal ausprobiert. Bei den roten Chilischoten war ich noch etwas zurückhaltend (4-6 waren möglich und ich habe erstmal nur 4 genommen), Knoblauch (1 ganze Knolle!) und Ingwer (14cm frische Ingwerwurzel) sind aber tuto completo reingegangen. Obwohl ein Teil der -freiwilligen- Probanden ansonsten gar keinen Knoblauch mag (ja, so was gibt’s …), wurde das Essen sehr gut angenommen und es blieb nur wenig über. Das Gericht werde ich auf jeden Fall nochmal kochen.

Wichtig bei dem ganzen Rezept ist auch der letzte Halbsatz 😉

Dazu Basmatireis und Papadams (Fladen aus Linsenmehl) servieren – und jede Menge kaltes Bier!