Einfache Animationen auf der Konsole mit PHP (1-Dimensional)

AnimationWenn man mit PHP Konsolenapplikationen schreibt, wäre es manchmal schön, eine pfundige Ausgabe mit etwas Bewegung erzeugen zu können. Solche Kleinstanimationen eignen sich auch für Aufgaben beim Erlernen von PHP, denn sie sind sehr unaufwändig und es tut sich trotzdem was.

Diese Ausgaben sind Eindimensional (auf einer Linie) und funktionieren unter Linux und Windows. Ich warte sehnsüchtig auf die PHP-Languagebindings für die aalib oder libcaca :-)…

Der Trick ist der Carriage Return (CR), der den Cursor an den Anfang der Zeile setzt, aber nicht vertikal weiterscrollt. in PHP wird dieses Zeichen mit \r codiert. Grundsätzlich ist der Ablauf wie folgt:

Bilderfolge in ein Array rendern
Solange man Lust hat:
    Zeige nächstes Bild
    Warte
  }
}

Unter Linux können zur weiteren Effektsteigerungen auch noch ANSI-Escapesequenzen verwendet werden. Mit diesen kryptischen Dingern kann man den einzelnen Zeichen Vorder- und Hintergrundfarbe verpassen und verwirrendes einschalten wie etwa ein Blinken. ESCAPE ist in PHP beispielsweise 33 in oktal und wird mittels \033 dargestellt.

Nun, zeig mal Code!

<?php
// Render Movie
$frames=array();
// 10 images for this movie
for($i=0;$i<10;$i++) {
    // The background consits of blue underscores
    $frame=array_fill(0, 10, "\033[34m_\033[0m");
    // One actor is a red star
    $frame[$i]="\033[31m*\033[0m";
    // The other a green dot
    $frame[9-$i]="\033[32m.\033[0m";
    // Join Background and actors
    $frames[]=join("",$frame);
}

// Output
for($i=0;$i<20;$i++) {
  foreach($frames as $frame) {
        // Rewind cursor and show frame
        print "\r".$frame;
        // Sleep a bit, because nights are hard these times...
        usleep(100000);
  }
}
print "\n";
?>

Systemnachrichten auf virtuelle Konsolen

Ich mag es wenn ich weiss, wie es meiner Computerin geht (dochdoch, die ist weiblich, ganz bestimmt!). Darum soll sie ausspucken was sie beschäftigt…. Am geilsten wäre ein serielles Terminal, aber das möchte ich neben meinem Schlepptop nicht immer mittragen, darum darf sie sich auf einer virtuellen Konsole ausdrücken. CTRL+ALT+F9 und CTRL+ALT+F10 zeigen mir, was sie so beschäftigt.

Syslog soll auf F9 gehen, dazu muss /etc/syslog.conf editiert werden:

daemon,mail.*;
news.=crit;news.=err;news.=notice;
*.=debug;*.=info;
*.=notice;*.=warn       /dev/tty9

Um auf F10 die „console“ zu haben, muss man dem Kernel beim Booten „console=tty10“ mitgeben. Mit Grub muss man das in /boot/grub/menu.lst einfügen:

[...]
kernel          /boot/vmlinuz-2.6.18-4-686 root=/dev/hda1 ro console=tty10
[...]