Was wurde aus RealPlayer?

Illustration eines roten Zebras mit blauer Mähne, das genervt auf einen alten Röhrenmonitor mit RealPlayer und der Meldung „Buffering“ blickt

Ein Mediaplayer, der uns alle traumatisiert hat – und trotzdem Kult ist

Damals: Streaming mit Buffer-Schmerz

In den späten 90ern war das Internet langsam, aber voller Hoffnung. Musik und Videos? Damals eher ein Abenteuer als ein Feature. Und mittendrin: RealPlayer – ein Pionier des Streamings.

Der Player wurde 1995 von RealNetworks (damals noch Progressive Networks) veröffentlicht und war der erste weitverbreitete Streaming-Client für Audio und später auch Video. Statt eine Datei komplett herunterzuladen, konnte man nun Inhalte „live“ übertragen.

Das klang futuristisch, hatte aber seinen Preis: geringe Bitraten, miese Qualität, lange Pufferzeiten und ein proprietäres Format namens .rm (RealMedia) bzw. .ra (RealAudio).

Die Technik dahinter

  • Streaming-Protokoll: RealPlayer nutzte das hauseigene Real Time Streaming Protocol (RTSP).
  • Formate: .rm, .ra, später .rv (RealVideo), teils mit DRM-Schutz.
  • Encoder: Nur mit spezieller Software von RealNetworks nutzbar, was Open-Source-Player ausschloss.
  • Bitrate: Oft unter 64 kbit/s Audio, 240p Video war normal.
  • Codec: Anfangs RealAudio G2, später Helix.

Trotzdem war das revolutionär: Nachrichten, Konzerte oder Radio über Web war auf einmal möglich.

Warum alle RealPlayer gehasst haben

  • 🐌 Performance-Killer: Der Player beanspruchte CPU und RAM wie ein ganzer Browser heute.
  • 🧲 Zwangsinstallation: Wurde gerne mal mit anderer Software gebündelt.
  • 🔊 Autoplay und Autoupdate: Nicht abschaltbar, oft mit Werbung.
  • 🔐 DRM und Formatzwang: Inhalte konnten nur im RealPlayer abgespielt werden.
  • 💸 RealPlayer Plus: Viele Standardfunktionen (z. B. Equalizer, CD-Ripping) waren nur kostenpflichtig verfügbar.
Screenshot des RealPlayer-Mediaplayers mit geöffneter „Welcome!“-Datei und 128 kbps Anzeige

Heute: RealPlayer lebt – irgendwie

Die Firma RealNetworks existiert immer noch. Der RealPlayer 24 wird aktiv weiterentwickelt:

Offizielle Seite von RealPlayer

Tatsächlich zielt RealPlayer heute mehr auf Medienmanagement und YouTube-Downloads als auf Streaming. Die DRM-Vergangenheit wurde still beerdigt.

RealPlayer vs. Moderne Medienplayer

FeatureRealPlayer (damals)VLC (heute)Plex (heute)
Codec-SupportSelektiv + DRMFast allesAlles + Streaming
WerbungJa (viel)NeinOptional
SystemfreundlichkeitNiedrigHochHoch
UILaut, blinkendMinimalistischModern
PreisShareware-ModellKostenlosFreemium

Nerd-Fazit

RealPlayer war seiner Zeit voraus, aber hat sich selbst überlebt. Er war der erste Schritt in Richtung Streaming-Zukunft, aber mit den falschen Entscheidungen zur falschen Zeit.

Er steht exemplarisch für Tech-Unternehmen, die lieber Kontrolle statt Kompatibilität wollten. VLC und Co. haben ihn letztlich durch Offenheit überflügelt.

Und doch bleibt er ein Stück digitaler Nostalgie:

„Kennst du noch .rm-Dateien? Dann bist du offiziell alt genug für einen eigenen Serverraum.“


Weiterlesen auf Prokrastinerd.de:

Vom ATmega32 zum ESP8266: Mikrocontroller damals und heute

Zwei stilisierte Zebra-Avatare blicken von links und rechts auf ein Mikrocontroller-Board mit vielen ESP-Modulen, das einen klassischen ATmega32 verdeckt.

In diesem Beitrag zeigen wir, wie sich ein einfaches Projekt – eine Temperaturanzeige mit LED-Ausgabe – über die letzten zwei Jahrzehnte entwickelt hat. Dabei geht es nicht nur um die Programmierung, sondern auch um die rasante Entwicklung der Hardware: Vom großen DIP-AVR mit externem Programmer bis hin zu kompakten All-in-One-Boards wie dem ESP8266 oder ESP32.

Was macht das Projekt?

Ein DHT11-Sensor misst die Temperatur. Zwei LEDs zeigen den Wert an – entweder in Helligkeitsstufen oder als An/Aus-Anzeige. Die Helligkeit wird per PWM geregelt, sodass die Temperatur visuell erkennbar ist.

Variante 1: AVR-C auf dem Pollin ATmega32-Board

Technikstand: ca. 2000–2005
Diese Variante kommt ohne Bibliotheken aus und verwendet direkte Registerzugriffe. Die PWM wird über Timer0 realisiert, der DHT11 per Bit-Banging abgefragt.

Hardware: Pollin ATmega32 Evaluationsboard mit 16 MHz Quarz, DHT11 an PC0, LED an PD6 (OC0)

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdbool.h>

#define DHT_DDR  DDRC
#define DHT_PORT PORTC
#define DHT_PIN  PINC
#define DHT_INPUTPIN PC0

uint8_t read_dht11(uint8_t *temperature) {
    uint8_t bits[5] = {0};
    uint8_t i, j;

    // Start signal
    DHT_DDR |= (1 << DHT_INPUTPIN);
    DHT_PORT &= ~(1 << DHT_INPUTPIN);
    _delay_ms(20); // >18ms
    DHT_PORT |= (1 << DHT_INPUTPIN);
    _delay_us(40);
    DHT_DDR &= ~(1 << DHT_INPUTPIN);

    // Wait for DHT11 response
    _delay_us(80);
    if (DHT_PIN & (1 << DHT_INPUTPIN)) return 1;
    _delay_us(80);
    if (!(DHT_PIN & (1 << DHT_INPUTPIN))) return 2;

    // Read 5 bytes
    for (j = 0; j < 5; j++) {
        for (i = 0; i < 8; i++) {
            while (!(DHT_PIN & (1 << DHT_INPUTPIN))); // wait for high
            _delay_us(30);
            if (DHT_PIN & (1 << DHT_INPUTPIN))
                bits[j] |= (1 << (7 - i));
            while (DHT_PIN & (1 << DHT_INPUTPIN)); // wait for low
        }
    }

    // Checksum
    if ((uint8_t)(bits[0] + bits[1] + bits[2] + bits[3]) != bits[4]) return 3;

    *temperature = bits[2]; // whole °C from byte 3
    return 0;
}

void init_pwm_timer0(void) {
    DDRD |= (1 << PD6);               // OC0 (PD6) als Ausgang
    TCCR0 = (1 << WGM00) | (1 << WGM01) // Fast PWM
          | (1 << COM01);              // Non-inverting
    TCCR0 |= (1 << CS01);              // Prescaler 8 → 16MHz/8 = 2MHz
}

int main(void) {
    uint8_t temp = 0;

    init_pwm_timer0();

    while (1) {
        if (read_dht11(&temp) == 0) {
            // Begrenzung des Temperaturbereichs auf 20–30°C
            if (temp < 20) temp = 20;
            if (temp > 30) temp = 30;

            // Mapping 20°C–30°C auf PWM 0–255
            OCR0 = (temp - 20) * 25;
        } else {
            OCR0 = 0; // Fehler → LED aus
        }

        _delay_ms(1000); // Messrate ca. 1 Hz
    }
}

Diese Art der Mikrocontroller-Programmierung war damals Standard und bot maximale Kontrolle bei minimaler Abstraktion. Externe Programmer wie LPT-Adapter waren damals die einzige Option – der heute beliebte USBasp kam erst später auf den Markt, ab etwa 2005. In den frühen 2000ern wurden oft selbst gelötete Parallelport-Programmieradapter eingesetzt, die direkt über PonyProg oder einfache Bit-Banging-Tools angesteuert wurden., um den Code überhaupt auf den Chip zu bekommen. Komfort: Fehlanzeige.

Pollin ATmega32 Evaluationsboard mit drei modernen ESP-Modulen im Vergleich, nebeneinander auf einem weißen Hintergrund.

Variante 2: ESP8266 mit Arduino-C++

Technikstand: 2015 bis heute
Hier nutzen wir moderne Bibliotheken wie DHT.h von Adafruit, komfortable Methoden wie analogWrite() und deutlich mehr Rechenleistung.

Hardware: ESP8266 (z. B. NodeMCU oder Wemos D1 Mini), DHT11 an D4 (GPIO2), LED an D5 (GPIO14)

#include <DHT.h>

#define DHTPIN D4      // GPIO2
#define LEDPIN D5      // GPIO14
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  pinMode(LEDPIN, OUTPUT);
  analogWriteRange(255);  // Standard für PWM auf ESP8266
  dht.begin();
}

void loop() {
  float temp = dht.readTemperature();

  if (!isnan(temp)) {
    // Mapping 20–30°C → 0–255 PWM
    int pwm = constrain((temp - 20) * 25, 0, 255);
    analogWrite(LEDPIN, pwm);
  } else {
    analogWrite(LEDPIN, 0); // Sensorfehler → LED aus
  }

  delay(1000);
}

Die Programmierung erfolgt per USB, ohne externen Programmer. Flashen, Debuggen und sogar OTA-Updates (Over The Air) sind möglich.

Variante 3: ESP8266 mit MicroPython

Technikstand: Minimalismus trifft Moderne
In nur wenigen Zeilen Python erreichen wir dasselbe Ergebnis. Ideal für alle, die lieber in Skriptsprachen arbeiten. Die MicroPython-Firmware wird per USB oder OTA aufgespielt und kann direkt über REPL oder Webinterface gesteuert werden.

Hardware: wie Variante 2

import dht
import machine
import time

sensor = dht.DHT11(machine.Pin(2))  # GPIO2 = D4
led = machine.PWM(machine.Pin(14))  # GPIO14 = D5
led.freq(1000)

while True:
    try:
        sensor.measure()
        temp = sensor.temperature()

        pwm = int((temp - 20) * 25)
        pwm = max(0, min(255, pwm))

        led.duty(pwm)
    except OSError:
        led.duty(0)  # Fehler → LED aus

    time.sleep(1)

Lesbarkeit und Einfachheit stehen hier im Vordergrund. Mehr zur MicroPython-Umgebung auf der offiziellen Seite: micropython.org

Variante 4: Assembler auf dem ATmega32

Technikstand: Nerd-Level over 9000
Wer maximale Kontrolle will (und den Schmerz nicht scheut), kann das Ganze auch in Assembler schreiben. Hier definieren wir die Bitmuster für Timer, LED und Sensorzugriff direkt.

.include "m32def.inc"     ; Register-Definitionen für ATmega32

; --------------------------------------------------------
; OC0 (PD6) = PWM-Ausgang für LED
; --------------------------------------------------------

        .org 0x00
        rjmp RESET

; --------------------------------------------------------
; Reset-Vektor
; --------------------------------------------------------

RESET:
        ; Stackpointer setzen
        ldi r16, high(RAMEND)
        out SPH, r16
        ldi r16, low(RAMEND)
        out SPL, r16

        ; PD6 (OC0) als Ausgang
        sbi DDRD, PD6

        ; Timer0: Fast PWM, non-inverting, prescaler 64
        ldi r16, (1&lt;&lt;WGM00)|(1&lt;&lt;WGM01)|(1&lt;&lt;COM01)|(1&lt;&lt;CS01)|(1&lt;&lt;CS00)
        out TCCR0, r16

        ; Initiale Helligkeit
        ldi r16, 0
        out OCR0, r16

MAIN:
        ; Erhöhe PWM-Wert langsam
        ldi r17, 0        ; Zähler

LOOP:
        mov r16, r17
        out OCR0, r16     ; PWM-Wert setzen

        rcall DELAY

        inc r17
        cpi r17, 255
        brne LOOP

        rjmp MAIN

; --------------------------------------------------------
; Einfache Delay-Routine (Software-Delay)
; --------------------------------------------------------

DELAY:
        ldi r18, 20
DELAY1: ldi r19, 255
DELAY2: dec r19
        brne DELAY2
        dec r18
        brne DELAY1
        ret

Diese Variante ist nichts für Einsteiger, aber hervorragend geeignet, um zu verstehen, wie Mikrocontroller intern arbeiten. Eine gute Referenz für Assembler-Einsteiger bietet AVR Freaks und die Original-Datenblätter vom Microchip.

BONUS: DHT11 in Assembler auslesen (Hardcore)

Ein kompletter DHT11-Bit-Banging-Reader in Assembler erfordert feingranulare Kontrolle von Mikrosekunden-Timing, Schleifen mit Timeout und Bitmanipulation. Die Umsetzung wäre ein eigener Beitrag für sich. Wer es wagen will, braucht:

  • Zyklenexakte WAIT_US-Schleifen
  • Schleifen zur HIGH-Phasen-Messung (für 0 vs. 1)
  • 5 Bytes Speicher (40 Bit) zum Zusammenbauen

Tipp: DHT11-Datenblatt genau studieren, dort stehen alle Timings. Wer sich daran wagt, verdient das Nerdabzeichen mit Goldrand.

Von der Backstein-Platine zum All-in-One-Modul

Der ursprüngliche ATmega32 war ein echter Brocken: 40 Pins, DIP-Gehäuse, externe Taktquelle, externer Programmer, keine Kommunikation ohne zusätzliche Schaltung. Im Kontrast dazu stehen moderne Boards wie der ESP32-S3 DevKit* (bezahlter Link), die WLAN, Bluetooth, USB-OTG, mehrere ADCs, DACs und SPI-/I2C-Interfaces auf kleinstem Raum vereinen – oft in der Größe eines USB-Sticks. Manche Boards, wie der LilyGO T-Display, haben sogar ein OLED- oder TFT-Display direkt mit auf dem PCB.

Was früher ein großes Steckbrett voller Kabel war, ist heute ein einziges Modul mit USB-C-Anschluss. Plug-and-play statt Kabelsalat.

Fazit: Vier Wege zur Temperaturanzeige

Ob du lieber klassisch mit direktem Registerzugriff arbeitest oder moderne Skriptsprachen bevorzugst – dieses Projekt zeigt, wie vielseitig Mikrocontroller heute einsetzbar sind. Und wer die Technik von damals noch kennt, weiß die heutigen Komfortfunktionen umso mehr zu schätzen. Aber weißt du, was noch älter als diese Schreibweise ist? XML und XSLT – ein Relikt aus der Zeit, als man Webseiten noch mit Stylesheets statt mit JavaScript animieren wollte. Wenn du denkst, Assembler sei archaisch, warte ab, bis du versuchst, eine Tabelle mit XSLT zu formatieren.

Und du?

Hast du selbst noch alte AVR-Boards in der Schublade? Oder bastelst du schon mit ESP32 und OLED direkt am Gerät?
Lass es mich wissen – kommentiere unter dem Beitrag oder schick mir deinen Aufbau per Mastodon oder E-Mail!

💬 Diskutiere mit auf nerdculture.de/@prokrastinerd

Das Zebra und die BIERCard – reverse engineering einer CF-Card

Cartoonhafte Darstellung einer CF-Karte mit einem Bierglas darauf, die Karte ersetzt die Zitronenscheibe

Wer sagt, dass Schatzsuchen nur was für Abenteurer mit Hut und Peitsche sind? Wir haben mit nichts weiter als einem Terminal, einem Linux-System und einem Hauch Forschergeist eine echte digitale Zeitkapsel geöffnet – willkommen zur ausführlichen Analyse einer BIERCard. Was es damit auf sich hat, wie wir tief in die Geheimnisse eingestiegen sind und warum selbst Root-Zugriff manchmal nicht reicht, erfährst du jetzt.

Was ist eine BIERCard überhaupt?

Auf den ersten Blick scheint es sich um eine typische Terminal-Steuerkarte zu handeln, wie man sie z. B. aus Kiosksystemen kennt. Auffällig waren allerdings zwei CompactFlash-Karten: eine mit der Aufschrift „Produktiv“ (4 GB) und eine mit der Aufschrift „Backup“ (2 GB).

Beide Karten stecken auf einer speziellen Trägerplatine, die über IDE, mehrere serielle Schnittstellen (COM1–3) und USB mit dem Mainboard verbunden ist. Zentral auf der Platine sitzt ein ATmega32A – das Gehirn hinter der BIERCard.

Die Backup-Karte heben wir uns für ein späteres Kapitel auf – denn die Produktiv-Karte hatte es bereits in sich.

Erschöpfter Zebra-Avatar mit dem Kopf auf einem Tisch voller CF-Karten, umgeben von Terminalfenstern mit Linux-Befehlen.

Die Produktivkarte unter der Lupe

Nach dem Einhängen (mount) zeigte lsblk, dass die Karte drei Partitionen enthält:

  • /dev/sdb1: vermutlich das Hauptsystem (Adminmodus)
  • /dev/sdb2: vermutlich der Kundenmodus (Kioskansicht)
  • /dev/sdb3: eine eigenständige Datenpartition, vermutlich zur Konfiguration und Sicherung

Ein Blick in /mnt/cf3 (also Partition 3) bestätigte unsere Annahme: Dort fanden sich Dateien wie biercard_version, copies, generate_from sowie ein ominöser oldimage. Alles deutet auf eine kontrollierte Verwaltung und Synchronisierung von Konfigurationen hin.

Zwei Welten auf einer Karte

Was sofort ins Auge fiel: Das System ist in mindestens zwei Modi aufgeteilt. Im Adminmodus (sdb1) gibt es klassische Systemzugriffe, Root-Zugriff, Logging und diverse Analysewerkzeuge. Im Kundenmodus (sdb2) hingegen scheint alles auf eine abgesicherte Anzeige reduziert – vermutlich ein Kiosksystem, das ohne direkte Eingriffe laufen kann.

Monitorerkennung und Grafik-Setup

Mit der PNY Quadro NVS 290 fiel der letzte Puzzlestein an seinen Platz: Zwei Monitore für den Kunden – robust, stromsparend, professionell. Keine Gaming-Karte, kein Schnickschnack – sondern ein Werkzeug, geschaffen für den Dauerbetrieb. Die parallele Anzeige von Quoten, Spielinformationen und Werbeanimationen war kein Zufall, sondern System.

Netzwerk und Peripherie – alles fest verdrahtet

Auch die Netzwerkverbindung ist hart kodiert: Die Datei iBet.conf nennt eine feste IP 192.168.100.11. Die Konfiguration erfolgt also zentral – vermutlich über ein internes Servernetzwerk. Auch der verwendete Drucker und Leser sind fix:

cashAcceptorDevice=/dev/ttyS2
receiptPrinterName=/dev/lp0
barcodeReaderDevice=/dev/ttyS0
chipCardReaderName="SCM SCR 333"

Automatenskripte mit Retro-Charme

Eines der ersten Highlights: das Skript automatHelper.sh. Es prüft Logdateien, mountet gegebenenfalls Konfigurationspartitionen, analysiert Systemzustände und zeigt beim Systemstart passende Screens an. Es wirkt wie der zentrale Boot-Dispatcher.

Das zweite wichtige Skript: copy_ibet_conf.sh. Es kopiert iBet.conf auf eine spezielle Partition und sichert so zentrale Konfigurationsdaten – automatisiert, robust und mit viel Shell-Magie:

mount "/dev/${AUTOMAT_DEVICE}${AUTOMAT_CONFIG_PARTITION_DEVICE_NO}" ${CONFIG_MNT}
cp /etc/automat/iDev/iBet.conf "${CONFIG_MNT}/copies/etc/automat/iDev/iBet.conf"

Ein drittes Skript – reset_barcode_scanner.sh – verrät: Selbst die Scannerhardware konnte aus dem Terminal heraus neu initialisiert werden.

Kryptografie, bitte einmal unknackbar

Die Datei iBet.conf enthält nicht nur einfache Konfigurationsdaten, sondern auch einen über 3000 Zeichen langen RSA-Block im DER-Format. Was wie ein einfacher Header aussieht, entpuppt sich als massiver Public Key mit fest kodierten Parametern:

id=308204BD020100300D0609...

Obwohl es sich „nur“ um einen Public Key handelt, suggeriert die Verwendung: Hier wird nichts dem Zufall überlassen. Eine Kombination aus agencyId, companyId und serverId lässt vermuten, dass die Terminals zentral ausgerollt und individuell verschlüsselt aktiviert werden.

Ein Reverse Engineering wäre selbst mit Root-Zugriff keine triviale Aufgabe – besonders da keine privaten Schlüssel auffindbar sind. Wir sprechen hier definitiv von industriellem Anspruch.

Die BIERCard im Code

Zwei BIERCard-Adapterkarten mit CF-Slots für Produktiv- und Rescue-Systeme, ideal für industrielle Anwendungen.

Mittels strings auf den Binaries automat und biertool fanden wir klare Bezüge zu einer C++-Klasse BierCard. Methoden wie BierCard::sendCmd() oder BierCard::switch2rescue() lassen vermuten, dass die Firmware modular auf das Umschalten zwischen Haupt- und Backup-System vorbereitet ist – vermutlich per seriellem Trigger über den ATmega:

BierCard::ReturnCode BierCard::switch2rescue()

Ein eindeutiger Cliffhanger für unser zukünftiges Kapitel, in dem wir uns die „Backup“-Karte vornehmen werden.

Besonders nerdig: Die Code-Pfade zeigen auf ../ibet/cashacceptor/biercard.cpp, was einen vollständigen C++-Quelltext vermuten lässt – leider natürlich nur als kompiliertes Binär vorliegend.

Die Fundstücke im Detail

Zu den spannendsten Fundstücken der Produktiv-Karte gehören:

  • automat – Hauptsteuerprogramm mit GUI-Funktionalität (vermutlich Qt-basiert)
  • biertool – Kommandozeilentool zur Kommunikation mit der BIERCard
  • Diverse Shellskripte zur Erkennung, Konfiguration und Reboot-Steuerung
  • Tools zur Barcodescanner-, Chipkarten- und Cashbox-Verwaltung
  • Feste Schnittstellen: /dev/ttyS0, /dev/ttyS2 und ein Chipkartenleser SCM SCR 333
  • Automatisiertes Speichern und Aktualisieren von Konfigurationen
  • Netzwerkbindung an eine feste Adresse 192.168.100.11
  • Hinweise auf Qt-basierte Architektur in den Binärdaten
  • Eine 3. Partition für Sicherungskopien und Versionsverwaltung (/mnt/cf3)
  • Eine Versionsdatei biercard_version mit Release-Informationen
  • Hinweise auf Debug- und Entwicklerfunktionen (u. a. elousbd, set_ibet_conf_option.sh, biertool, copy_config_files.sh)

Wer tiefer ins Thema Reverse Engineering alter Hardware eintauchen möchte, dem sei RetroReversing.com empfohlen – dort findest du fundierte Analysen und Community-Wissen zu klassischen Embedded-Systemen, Konsolen und Industrieelektronik.

Fazit: Reverse Engineering einer CF-Card mit Überraschungen

Die BIERCard entpuppt sich als modularer Embedded-Systemträger mit Sicherheitsfokus, Wartungsskripten und flexibler Systemstruktur – perfekt für Industrieumgebungen, aber auch für Nerds wie uns ein echter Schatz.

Ob wir das System je vollständig knacken? Vielleicht. Aber bis dahin bleibt uns ein würdiger Cliffhanger: BierCard::switch2rescue() – was passiert wohl, wenn wir die Backup-Karte aktivieren?

Stay tuned für Teil 2.


Lesetipp: Was wurde aus XML und XSLT? – weitere Technikarchäologie auf prokrastinerd.de

Affiliate-Tipp*: Wer ähnliche alte Systeme analysieren will, braucht solide Hardware – z. B. dieses CF-Kartenlesegerät* (bezahlter Link) oder einen günstigen USB-Seriell-Adapter* (bezahlter Link) für alte Steuerplatinen.

WAP – Das Internet auf dem Nokia 3310: Webseiten wie Kassenzettel

Cartoon eines Nokia-Handys mit WAP Browser, aus dem ein Kassenzettel mit Menüeinträgen herausragt

Stell dir vor, du öffnest eine Webseite – und sie sieht aus wie der Ausdruck eines Kassenzettels. Kein Bild, kein Layout, kein CSS, nur Text. Willkommen in der Ära des WAP Browser, dem Wireless Application Protocol – dem Versuch, das Internet auf ein Nokia 3310 zu stopfen. Ja, das Internet. Auf einem monochromen Display mit 84 × 48 Pixeln* (bezahlter Link).

Für alle, die sich gerade wundern: WAP war Anfang der 2000er eine große Sache. Oder sollte es zumindest werden. Mobilfunkanbieter überschlugen sich mit ihren „Internet-Angeboten“ für unterwegs. Die Realität? Scroll-Orgien auf pixeligen Displays mit Ladezeiten, die dir das Mittagessen verdarben.


Was ist ein WAP Browser? Einfach erklärt

WAP war ein Standardprotokoll, um Inhalte auf Mobiltelefonen zugänglich zu machen – und zwar zu einer Zeit, als „Smartphone“ noch nach Science-Fiction klang. Die Basis bildete eine eigene Sprache: WML (Wireless Markup Language), eine Art abgespecktes HTML mit weniger Funktionen als ein Toaster mit Display.

Webseiten mussten extra für WAP umgeschrieben werden. Bilder wurden durch ASCII-Smileys ersetzt, Layouts durch einfache Listen. Die Navigation bestand aus Menüpunkten, durch die man sich mit den Pfeiltasten quälte. Und trotzdem galt es als technisches Wunder.

Nokia-Handy mit WAP Browser auf monochromem Display, Menüeinträge wie Home, News und Weather sichtbar

Was konnte man mit einem WAP Browser machen?

Die Möglichkeiten waren überschaubar, aber für damalige Verhältnisse beeindruckend:

  • Aktuelle Nachrichten lesen (in 3-Zeilen-Abschnitten)
  • Wetter abrufen (wenn’s nicht schon vorbei war)
  • Klingeltöne oder Logos kaufen (Jamba Sparabo winkt)
  • Erste rudimentäre E-Mail-Dienste nutzen
  • Mobile Banking wagen (nur für besonders Mutige)

Das Ganze funktionierte ungefähr so flüssig wie ein 56k-Modem unter Wasser.


Technik hinter dem WAP Browser: So funktionierte es

Damit WAP funktionierte, brauchte es ein WAP-Gateway beim Mobilfunkanbieter, das die Inhalte vom Internet umcodierte. Eine Art Übersetzer von HTML in WML. Leider lag genau hier eine massive Sicherheitslücke: HTTPS-Verbindungen wurden am Gateway entschlüsselt – ein gefundenes Fressen für neugierige Netzbetreiber.

Die bekanntesten Geräte mit WAP-Unterstützung waren etwa das Nokia 7110 oder später das Siemens S45. Sie hatten eine „WAP-Taste“, die meist direkt ins kostspielige Datenchaos führte. Die Tarife? Abgerechnet wurde pro Minute oder pro KB – beides schmerzhaft.


Warum der WAP Browser gescheitert ist

Kurz gesagt: zu langsam, zu teuer, zu nutzlos. Das Web entwickelte sich rasant weiter, WAP blieb statisch. Entwickler mussten Inhalte doppelt pflegen (HTML & WML), was kaum jemand tat. Und sobald HTML-Browser auf Smartphones Einzug hielten (z. B. mit dem iPhone oder Blackberry), war WAP so überflüssig wie ein Faxgerät im Wald.


Was bleibt vom WAP Browser heute?

Die damalige Website des WAP-Forums ist heute nur noch über die Wayback Machine erreichbar – ein digitales Fossil der Frühzeit des mobilen Internets.

Und wer die gute alte Pixelgrafik aus Nokia-Zeiten vermisst, findet mit dem Divoom Pixoo Pixel Art Bilderrahmen* (bezahlter Link) ein stylisches Gadget, das Retro-Charme mit moderner Technik verbindet.

Nicht viel – außer einer seltsamen Mischung aus Nostalgie und Fremdscham. Aber WAP war ein Anfang. Der erste Versuch, Inhalte mobil zugänglich zu machen. In gewisser Weise der Vorfahre responsiver Webseiten. Und vielleicht ein Vorbote dessen, wie Technik manchmal läuft: mit guten Ideen, aber schlechter Umsetzung.


Fazit: Der WAP Browser als digitale Urform des mobilen Webs

WAP war wie ein Zettel mit Wetterbericht aus dem Faxgerät. Aber immerhin mobil. Heute lachen wir darüber, aber ohne diese Zwischenstufen wäre das mobile Internet nie dort angekommen, wo es heute ist.

Also danke, WAP. Auch wenn du die meisten Nutzer mehr gekostet als genutzt hast.

Und wer jetzt Lust auf noch mehr nostalgische Technik hat: Hier geht’s zu unserem Beitrag über XML und XSLT, dem Dreamteam der Formatierungstrauma.

Was wurde aus XML und XSLT?

Cartoonhafte Blätter mit Aufschrift XML und XSLT fliehen aus einer blauen Mülltonne

Die tote Webtechnologie, die keiner vermisst

Meta-Description:
XML und XSLT sollten einst das Web revolutionieren – doch was wurde wirklich aus den beiden? Ein zynischer Blick auf tote Technologien, überladene Tags und moderne Alternativen.


1. Einleitung: Der Traum vom semantischen Web

Es war einmal, im finsteren Zeitalter vor HTML5, da träumten Webentwickler von einer besseren Welt. Einer Welt, in der man sich seine Tags selbst aussuchen konnte. Einer Welt, in der Design und Inhalt so konsequent getrennt waren, dass man beide hassen lernte. Einer Welt… mit XML und XSLT.

XML – das Extensible Markup Language – klang nach Fortschritt, nach Struktur, nach Ordnung im HTML-Chaos. Und XSLT? Das war der Versuch, Stylesheets mit einer Gehirnverdrehung zu kombinieren. Wenn du jemals versucht hast, ein <xsl:for-each> mit einem Namespace zu debuggen, dann hast du wahrscheinlich heute noch Albträume in UTF-8.

Doch was wurde eigentlich aus dieser glorreichen Vision? Warum sieht das Web heute aus wie React-Komponenten mit CSS-Grütze – und nicht wie ein gepflegtes XML-Skulpturenmuseum?

Willkommen im Gruselkabinett der Webentwicklung.
Wir graben aus, was längst vergessen schien – und zeigen dir, warum das vielleicht auch besser so ist.


2. XML: Die Sprache der Hoffnung – und des Wahnsinns

In den späten 90ern war XML das neue heiße Ding. Die Idee: HTML ist zu fest verdrahtet, zu unflexibel. XML dagegen lässt dich selbst bestimmen, wie deine Tags heißen. Statt <div> und <p> konntest du plötzlich <produkt>, <preis> oder <superMegaDatenModul> verwenden.

Das versprach Semantik, Struktur, Zukunft – und endete in Chaos, Namespaces und nicht enden wollenden DTDs. Der Mensch war frei. Viel zu frei.

3. XSLT: Wenn Stylesheets Albträume bekommen

Dann kam XSLT – das „eXtensible Stylesheet Language Transformations“. Der Name allein klingt schon nach XML-Sekte. Die Idee war eigentlich clever: Statt HTML mit Layout zu schreiben, schreibst du XML mit Inhalt – und XSLT formt es zu hübschem HTML.

Oder zu dem, was man damals für hübsch hielt.

Aber XSLT war nicht CSS. Es war XPath, Templates, Bedingungshölle und eine Schreibweise, bei der jedes < doppelt und jedes </ dreifach gezählt werden musste. Wer damit arbeiten musste, lernte schnell: Das Web ist nicht freundlich.


4. 🧟 Das Gruselkabinett: Ein extremes, aber valides XML+XSLT-Beispiel

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rezept-style.xsl"?>

<kochbuch xmlns="https://prokrastinerd.de/rezept"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="https://prokrastinerd.de/rezept rezept.xsd">

  <rezept datum="2025-04-14T12:34:56" vegetarisch="true">
    <titel>XML-Auflauf mit XSLT-Kruste</titel>
    <autor>Gray The Zebra</autor>
    <zutaten>
      <zutat menge="200g">Verzweiflung</zutat>
      <zutat menge="100ml">Tränen von Entwicklern</zutat>
      <zutat menge="1 EL">Namespace-Magie</zutat>
    </zutaten>
    <zubereitung>
      Alles in eine Datei werfen, mehrfach validieren,
      bei Fehlern laut fluchen und dann im Browser servieren.
    </zubereitung>
  </rezept>

</kochbuch>

<!-- rezept-style.xsl -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:rez="https://prokrastinerd.de/rezept"
    exclude-result-prefixes="rez">

  <xsl:output method="html" encoding="UTF-8"/>

  <xsl:template match="/">
    <html>
      <head>
        <title><xsl:value-of select="//rez:titel"/></title>
        <style>
          body { font-family: monospace; background: #fffbf0; padding: 2em; }
          h1 { color: darkred; }
          ul { list-style-type: square; }
        </style>
      </head>
      <body>
        <h1><xsl:value-of select="//rez:titel"/></h1>
        <p><strong>Von:</strong> <xsl:value-of select="//rez:autor"/></p>

        <xsl:if test="//rez:rezept/@vegetarisch='true'">
          <p><em>Geeignet für Vegetarier</em></p>
        </xsl:if>

        <h2>Zutaten:</h2>
        <ul>
          <xsl:for-each select="//rez:zutat">
            <li><xsl:value-of select="@menge"/> <xsl:value-of select="."/></li>
          </xsl:for-each>
        </ul>

        <h2>Zubereitung:</h2>
        <p><xsl:value-of select="//rez:zubereitung"/></p>

        <footer>
          <small>Stand: <xsl:value-of select="//rez:rezept/@datum"/></small>
        </footer>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>


5. 🔁 Und heute?

// rezept.json
{
  "titel": "XML-Auflauf mit XSLT-Kruste",
  "autor": "Gray The Zebra",
  "vegetarisch": true,
  "datum": "2025-04-14T12:34:56",
  "zutaten": [
    { "menge": "200g", "name": "Verzweiflung" },
    { "menge": "100ml", "name": "Tränen von Entwicklern" },
    { "menge": "1 EL", "name": "Namespace-Magie" }
  ],
  "zubereitung": "Alles in eine Datei werfen, mehrfach validieren, bei Fehlern laut fluchen und dann im Browser servieren."
}

<!-- index.html -->
<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="UTF-8">
  <title>Rezept</title>
  <style>
    body { font-family: sans-serif; background: #f0f8ff; padding: 2em; }
    h1 { color: seagreen; }
    ul { list-style-type: disc; }
  </style>
</head>
<body>
  <div id="rezept"></div>

  <script>
    fetch('rezept.json')
      .then(response => response.json())
      .then(data => {
        const container = document.getElementById('rezept');
        container.innerHTML = `
          <h1>${data.titel}</h1>
          <p><strong>Von:</strong> ${data.autor}</p>
          ${data.vegetarisch ? '<p><em>Geeignet für Vegetarier</em></p>' : ''}
          <h2>Zutaten:</h2>
          <ul>
            ${data.zutaten.map(z => `<li>${z.menge} ${z.name}</li>`).join('')}
          </ul>
          <h2>Zubereitung:</h2>
          <p>${data.zubereitung}</p>
          <footer><small>Stand: ${data.datum}</small></footer>
        `;
      });
  </script>
</body>
</html>


6. Fazit: XML lebt – aber bitte im Maschinenraum

XML ist nicht tot. Es ist nur dahin zurückgekehrt, wo es hingehört: tief in die dunklen Eingeweide von Maschinenprotokollen, Konfigurationsdateien, E-Book-Formaten und Industrienormen.

Und XSLT? Hat sich dort in einer .xsl-Datei zusammengerollt und schläft. Hoffentlich für immer.

Aber wir danken ihnen für ihren Dienst.
Möge der Validator immer mit euch sein. Amen.

Comicstil-Grabstein mit Aufschrift XML & XSLT – „Zu strukturiert fürs echte Leben.“

Und falls du dir dieses Kapitel aus der Web-Geschichte ins Bücherregal stellen willst, gibt’s da noch XSLT Cookbook: Solutions and Examples for XML and XSLT Developers* (bezahlter Link) – über 700 Seiten Nostalgie und Schmerz.

Für besonders Mutige: Das offizielle XSLT-Tutorial vom W3C – mit eingebauter Frustgarantie.