Apache2: BandWidth

Überwachungskameras in größerer Anzahl können das Netzwerk schon in die Knie zwingen.

Wenn 40 – 50 Kameras Livebilder produzieren, wird die Bandbreite des Internetanschlußes gerne mit ca. 250 MBit/s strapaziert. Es ist Unfug, wenn ein User alle Streams gleichzeitig nutzen will – kommt aber vor.

Das ist zu vermeiden. In einem Debian System kann das mod-bw bequem per Aptitude installiert werden.

In der conf des VHOSTs oder innerhalb der Location Konfiguration könnte es so aussehen:

Auch in dieser Konfiguration ist auf die Reihenfolge zu achten –> first match rules! In dem Fall begrenze ich die Bandbreite und die Anzahl der Verbindungen pro Session für das lokale Netztwerk nicht. Alle anderen Verbindungen haben nur eine Bandbreite von 1310762 Byte ( das sind 10 MBit ) auf 5 Verbindungen zur Verfügung. Im obigen iftop sieht man maximale 10 MBit/s für 5 Cams. Zum Vergleich, habe ich intern weitere 5 Cam Streams geöffnet:

30 MBit/s verbraucht die interne Verbindung. Selbe Anzahl an Streams, ist extern wirksam auf 10 MBit/s limitiert.

Weitere Verbindungsversuche enden mit dem Error 503

Was läuft?

Neben der Entwicklung einer SAPUI5 Anwendung sowie einem SAP ABAP Projekt, lese ich mich in ein Langzeitprojekt ein. Programmierung auf IBM Servern in RGP. Eine Business-Anwendung soll um Free-RPG erweitert und Code geändert werden.

Haben sie auch spannende Aufgaben? Ich bin für Sie da!

Datensicherung: sicher und einfach

Nutzer eines HALSYSTEM Servers merken nicht viel davon: Verschlüßelte, verteilte Datensicherung und Versionierung. Im Kern ist das mit Bordmitteln zu realisieren.

Über mögliche Szenarien einer Datensicherung lassen sich Bücher füllen. Bei der Planung eines HALSYSTEM werden Sicherung der Dateien und die des Systems getrennt betrachtet. Letztendlich sieht der Kunde nur eine Übersicht über die Datensicherungen und verfügbaren Versionen veränderter Daten. Egal wie man es auch betrachten mag, ist eine Datensicherung nur dann sicher, wenn sie auch nach einem „undenkbaren Desaster“ die Möglichkeit der Wiederherstellung zulässt.

„Datensicherung: sicher und einfach“ weiterlesen

Compiler Optimierung

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

Apache2: Auth hinter Proxy

Leitet man einen internen Dienst, der nur über eine interne IP erreichbar ist, über einen Apache2 Proxy weiter, kommt es bei Authentifizierungen zu Problemen. Einige Browser verweigern das senden der Authentifizierungsdaten, wenn die Empfängeradresse nicht der aktuellen Adresse entspricht. Das Einrichten einer Authentifizierung am Apache, der diese dann an den Proxy Endpunkt weiter leitet, bringt Abhilfe. Benutzername und Passwort sollte gleich lauten:

  ProxyRequests On
  ProxyVia On
<Proxy *>
    Order deny,allow
    Allow from all
    AuthType Basic
    AuthName „Passwort erforderlich“
    AuthUserFile /etc/httpd/.passwdfile
    Require valid-user
</Proxy>   ProxyPassMatch ^/xxx/(.*)$ http://$1/cgi-bin/faststream.jpg?stream=full&html

Im Fall der Weiterleitung von MOBOTIX Cam Streams, funktioniert die Konfiguration. (Link)

C Sub: Program Ping

Schnelle Prüfung ob eine IP an einem bestimmten Port erreichbar ist. Return Werte einfach 0 (falsch) oder 1 (wahr).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
int test(char *_SERVER) {
    int _PORT = 80;
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addr = {AF_INET, htons(_PORT), inet_addr(_SERVER)};
    struct timeval timeout;
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
    setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
    if (connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) != 0)
        return 0; 
    else
        return 1;
    close(sockfd);
}

Kopieren großer Datenmengen

Es ist zeitraubend hat man große Datenmengen in einer Cloud und möchte sie transportieren.

Je nach Internetverbindung kann man den Spass verlieren – Abgleich von Bibliotheken oder Datensicherungen in der Cloud.

Ein sehr praktisches Tool habe ich entdeckt und empfehle es. Ein Onlinedienst, der Cloudspeicher automatisch kopiert und sogar synchronisiert.

Cloud Synchronisation - automatisch von Cloud zu Cloud - https://www.multcloud.com/

Es ist aber zu empfehlen, die eigene Cloud nicht dauerhaft zu verbinden und das Passwort zu ändern. Das Unternehmen untersteht dem US Recht.

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.