PiHole im Linuxcontainer

Wer gerade einen Rapsberry Pi griffbereit hat, kann diesen natürlich für PiHole einsetzen. Obwohl für Testzwecke mehrere dieser Mini-Rechner zur Verfügung stehen, wollten wir wissen wie schnell ein PiHole unter Ubuntu 20.04 installiert werden kann. Um genau zu sein in einem Linunxcontainer (LXC) – eine komplette Linux-Distribution wäre wohl etwas übertrieben.

Die virtuelle Maschine mit 8GB Festplattenspeicher und 1 Core, 1 GB RAM war nach etwa 2 min eingerichtet – Voraussetzung hier ist eine schnelle Internetverbindung, vor allem für die Upgrades des Basissystems..

Anschließend erfolgt die Einrichtung von PiHole, was sich im Wesentlichen auf drei Zeilen in der CLI beschränkt:

apt install gamin
apt-install curl
curl -sSL https://install.pi-hole.net | bash

Anschließend folgt man den Anweisungen in der Kommandozeile.

Zu guter Letzt muss der DNS-Server noch auf die IP-Adresses des Linuxcontainers geändert werden. Hier bietet es sich an eine feste IP-Adresse zu vergeben oder die DHCP als dauerhaften Lease einzurichten. Hierzu findet man auch viele Hinweise im Internet.

Optimierung Schnittstelle – Teil II

Wie schon unter Optimierung Schnittstelle berichtet, konnte der Datenabruf über eine Schnittstelle von etwa 40min auf 3min Verarbeitungsdauer reduziert werden. Die Ursache für die lange Verarbeitungsdauer war die Nutzung einer String-Variable anstelle des StringBuilders in VB.net.

Allerdings waren wir auch der Ansicht, dass da noch viel Zeit verloren geht bei mehr als 260.000 Einzel-Inserts in die Datenbank. Also haben wir uns noch einmal ein halbe Stunde mit der Thematik beschäftigt und eine DataTable erstellt, die die Felder dynamisch ermittelt und die richtigen Datentypen setzt.

Diese wird dann zunächst mit den Daten aus dem Webservice befüllt und dann in 10.000er Blöcken per BulkInsert in die Zieldatenbank übertragen.

Der Effekt war dieser Modifikation besser als erhofft:
Anstelle der 3min geht die Verarbeitung damit nun in etwa 20s. Eine ordentliche Steigerung, wenn man sich die ursprünglichen 40min Verarbeitungszeit vor Augen führt.

So machen Optimierungen Spass!

Datenbanken optimieren – ein Rückblick

Vor ziemlich genau einem Jahr haben wir an vier Tagen in kleiner Runde vom fundierten Wissen von Torsten Strauss profitiert. Das Ergebnis kann sich sehen lassen wie wir finden – und kommt natürlich unmittelbar unseren Kunden zu Gute, für die wir IT-Dienstleistungen erbringen.

Danke Torsten!

MSSQL-Server unter Linux?

Den SQL-Server 2019 gibt es auch für Linux. Die Installation war so einfach, dass es gar nicht vieler Worte bedarf:

Ein kurzer Test mit der frei verfügbaren Developer-Edition in einem LinuxContainer (LXC) war auf Anhieb erfolgreich. Ebenso das anschließende Einspielen von Datenbank-Backups und der obilgatorische Zugriff darauf.

Optimierung Schnittstelle

Kürzlich kam ein Kunde auf uns zu, dem das Laufzeitzeitverhalten für eine Schnitsttelle nicht gefiel:

Ausgangsituation

Über einen Webservice werden täglich in einem Teilschritt rund 270.000 Datensäze abgerufen. Diese müssen zum Teil umformatiert werden und das Ergebnis (die Anzahl der Zeilen bleibt dabei unverändert) in eine Datenbanktabelle (MSSQL) eingefügt werden.

Erster Modifikationsversuch

Zunächst lag Nahe, dass das Schreiben mit Einzel-Inserts zu den langen Laufzeiten führt. Also wurde VB.net-Code derart modifiziert, dass immer 10.000 Zeilen zunächst in eine lokale DataTable im Arbeitsspeicher geschrieben wurden und diese dann per Bulk-Insert in die Zieltabelle eingefügt wurden.

Die Verarbeitung war zunächst “gefühlt” schneller, wurde dann aber zusehends langsamer. Also musste noch ein weiterer Grund für den Performanceeinbruch vorliegen.

Die Lösung

Zur Verarbeitung der Daten wurde der XML-Node als String verarbeitet. Dabei mussten Bestandteile der Daten per replace für die Aufbereitung der Zieldatenbank geändert bzw. neu formatiert werden.

Die Lösung bestand darin die Verarbeitung von Strings zu verhindern und die Daten, soweit es geht im StringBuilder zu verarbeiten. Erst am Ende ist eine Konvertierung zu einem String notwendig, um die Daten per split() in ein Array zu übernehmen.

Außerdem wurde die For…Next-Schleife derart modifziert, dass nicht erst der jeweilige XML-Node gesucht werden muss. Mit For..Each werden einfach der Reihe nach alle Knoten durchlaufen.

Im Gegensatz zum BulkInsert, gab es nun keinen Geschwindigkeitsverlust mehr. Die Verarbeitungszeit konnte damit von ursprünglich mehr als 40min auf etwa 4min gesenkt werden – und das noch ohne BulkInsert. Den Einfluss von BulkInsert testen wir aber auch noch in den kommenden Tagen.

' Vorher:
For i = 0 To colmax - 1

	result = XmlDecodeData(xmldoc.GetElementsByTagName("data:Result").Item(i).InnerXml.ToString)

	' Umstellung Trennzeichen damit Semikolons in Textfeldern nicht stören
	result = Replace(result, """;""", """||""")
	cols = Split(result, "||")
	
	' ...weiterer Code
	
Next

Im ursprünglichen Code, gab es durch die String-Variablen gleich mehrere Stellen, die in StringBuilder-Funktionen konvertiert werden mussten. Die XmlDecodeData wurde ebenfalls in eine StringBuilder-fähige Version umgebaut:

' Nachher:
Dim result As StringBuilder = New Stringuilder("")
Dim cols() As String

For Each XmlRow In xmldoc.GetElementsByTagName("data:Result")

	result.Clear()
	result.Append(XmlRow.InnerXml.Replace(""";""", """||""") 
	result = XmlDecodeDataSB(result)
    cols = Split(result.ToString(), "||")
	
	'... weiterer Code
Next

Weitere Vorschläge Willkommen! Update folgt..

WordPress gesprächig..

In der c’t 23/2020 wird darauf hingewiesen, dass WordPress in den meisten Fällen die JSON-API nicht ausreichend vor Zugriffen schützt. Um ungewollte Zugriffe zu verhindern wird eine Modifikation der functions.php empfohlen.

Der Code darf aber lt. Nutzungsbedingungen des heise-Verlages auf den ersten Blick nicht ohne Einverständnis zugänglich gemacht werden. Zum Glück findet man auch Hinweise dazu unter:
https://github.com/Tmeister/wp-api-jwt-auth/issues/6#issuecomment-298948710

Nachtrag 6.11.2020:

Unter den oben getroffenen Einstellungen leidet das “Contact Form 7”-Plugin. Dies kann aktuell mit dem “Disable Rest API”-Plugin korrigiert werden. Ein Beschreibung findet man hier:
https://www.sitefactor.de/wordpress-contact-form-7-plugin-versendet-keine-emails-mehr

Automatischer Datenabruf von Webseiten

Für eine maschinelle Verarbeitung von Rechnungsbelegen sollten wir eine Lösung finden, die zuverlässig und ohne Benutzereingriff täglich Daten von einer Portalseite im Internet einliest und diese dann nach bestimmten Kriterien klassifiziert und verarbeitet.

Die PDF-Dokumente, die für die weitere Bearbeitung relevant sind, werden dann abhängig vom Dateinamen automatisch an die entsprechenden Rechnungsempfänger versandt.

Durch eine webbasierte Benutzeroberfläche kann der Anwender die Kriterien bequem festlegen und verändern und ist so auch für zukünftige Anforderungen bestens gerüstet.

Sprechen Sie uns unverbindlich an

Umzug gelungen!

Nach mehr als 20 Jahren in der Abele Rößler Technologies GmbH geht es hier nun mit vielen frischen Ideen weiter!

Genauer gesagt der Software-Bereich der ehem. Abele Rößler Technologies firmiert nun unter der Rößler Developments GmbH.

Unser Schwerpunkt liegt in der Entwicklung, egal, ob es sich dabei um bestehende Systeme handelt oder eine vage Idee.

Wir freuen uns auf Ihre Anfrage!

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmen Sie dem zu.

Datenschutzerklärung