Kategorien
Randnotiz

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

Kategorien
Randnotiz

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)

Kategorien
Schulung

COBOL: Report mit HTML Link

Schnelles Programm in COBOL mit Sub-Routine in C für die Generierung von HTML Code. 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.

       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 ''
      -    WERT8'
' 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.

Kategorien
Randnotiz

C Sub: Program Ping

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

#include 
#include 
#include 
#include 
 
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);
}