Halloween-Spaß mit flammendem Auge


Sein Blick durchbohrt Wolken, Schatten, Erde und Fleisch! Du weißt, wovon ich spreche. Ein großes Auge, lidlos, umrandet von Flammen.
Den Herr der Ringe und das flammende Auge von Sauron kennt vermutlich jeder. Und wer dieses Jahr an Halloween unbedarft an des Cypax' Hütte vorbei ging, durfte den durchdringenden Blick des dunklen Herrschers von Mordor auch mal persönlich kennenlernen:
Sauron sieht alles!
Ok, also wie kommt es, dass Sauron auf meiner Regentonne hockt und kleine Kinder verschreckt? Das fing alles mit einem Abend am PC, einer Pizza und ziellosem Browsen in den Tiefen des Internets an, wo ich auf das hier stieß:
Gakken Worldeye
Bild © by Gakken Educational Co., Ltd.
Ja, genau - das ist ein digitaler Globus! Mehr Infos zu dem Gerät z.B. hier auf Youtube. Ich habe ein riesen Faible für ausgefallene Displays, also musste ich den einfach haben. Und es kommt sogar noch besser: er hat einen HDMI-Eingang!!! Zusammen mit einem Raspberry Pi lässt sich dann allerhand cooles Zeug anstellen:
OH YESSSS!
Link zum Video
Und weil das natürlich zum Tüfteln geradezu einlädt, habe ich das Python-Skript noch etwas erweitert und um OpenCV zur Erkennung von Bewegungen im Bild einer angeschlossenen Kamera ergänzt. Herausgekommen ist letztlich das Auge von Sauron, welches auf der Regentonne montiert an Halloween für das richtige Ambiente sorgt:
Das Auge von Sauron thront auf dem Turm von Barad-dûr unserer Regentonne.
Link zum Video
Leider war es dann so dunkel, dass die Kamera des Raspberry Pi fast nichts gesehen hat und das Auge folglich nicht auf Bewegungen reagieren konnte. Somit hat Sauron dann eben nur vorbeifahrende Autos angeblafft. Aber es für etwas Halloweeen-Ambiente reicht das so auch. Mal sehen, was ich nächstes Jahr zu Halloween daraus mache. Vielleicht einen Horror-Kürbis oder so ...

• Gakken Worldeye Digital Globe Projector • Kostet ca. 160 € über eBay + Versand und Zoll bei Bestellung aus Japan (Stand 10/2017) • Technische Infos: hier • Tutorial Raspberry Pi + Worldeye = Animated eye • Tutorial Raspberry Pi3 + OpenCV • Noch ein Tutorial Raspberry Pi3 + OpenCV • Mein Pi_Eyes repository auf GitHub mit Erweiterung für animierte Iris und OpenCV Und für die Sprüche von Sauron lädt man sich Shadow of Mordor über Steam runter (~ 42 GB), entpackt die Sounddateien mit dem Ravioli-Game-Tool (ja, das heißt wirklich so), hört sich die 14190(!) Wave-Dateien durch und kopiert sich was man braucht. Da die Dateien urheberrechtlich geschützt sind, sollte das naheliegenderweise ausschließlich für private Zwecke geschehen.


Frühförderung im Computer-Club

Die Sendung mit der Maus veranstaltet jährlich einen "Maus-Türöffnertag", an dem Unternehmen, Vereine, Labore, usw. ihre Türen für interessierte Kinder öffnen. Und heute haben wir im Freiburger-Computerclub mitgemacht und ein buntes Programm für die Kids aufgelegt. Zu sehen gab es bei uns unter anderem 3D-Scanner, unser Elektronik-Labor, wo man LED-Figuren löten konnte und natürlich den Augmented Reality Sandkasten:
3D-Scan3D-Scan3D-Scan
Der Spaß darf aber auch nicht zu kurz kommen und darum konnte unter dem Stichwort "Retro-Gaming" der potentielle Hacker-Nachwuchs mal so richtig die Sachen zocken, die schon die Eltern gespielt haben.
3D-Scan3D-Scan
Spielhallen-Atmosphäre im Club - ob am uralten, noch rein mechanischen Flipper oder an der PlayStation 1 von 1994.
Neben dem Spielen vieler alter DOS-Klassiker konnte man am Computer aber auch selbst zum Entwickler werden - sei es per Baukastenprinzip einfache Games selbst zu erstellen oder am nostalgischen 286er wie vor 30 Jahren in QBasic die ersten Schritte im Programmieren zu üben.
3D-Scan3D-Scan
Die einen erstellen selber eigene Spiele, die anderen versuchen Papas alten Rundenrekord von damals zu brechen.
Nun mal sehen, ob vom Interesse etwas hängen bleibt und vielleicht sogar die ein oder andere technische Laufbahn angestoßen wurde.

Holpriger Start: Star Trek Discovery

Leute, ich muss jetzt mal ein bisschen motzen. Als Science-Fiction-Fan habe ich ein natürlich auch gewisses Faible für Star Trek, wie man vielleicht vermuten kann. Aber abgesehen davon, dass ich ein paar Worte Klingonisch kann, würde ich mich jetzt nicht gerade als Hardcore-Trekkie bezeichnen, der auswendig jedes Spezialdetail und alle Hintergründe zu jeder Episode aufsagen kann, in Spocks Uniform spazieren geht und zuhause Film-Requisiten hortet. Und doch kommt mir altem 90er-Jahre Fernsehkind beim Schauen der Next Generation Folgen immer noch Gänsehaut beim Intro und es stellt sich das vertraute Star-Trek-Feeling ein. Star Trek: Discovery LogoBei der neuen Star-Trek-Serie Discovery knüpft in den ersten beiden Folgen einzig die hervorragend gespielte Capt. Georgiou - "Die Sternenflotte schießt nicht zuerst!" - daran an, der Rest ist leider im Wesentlichen ein ziemlich beliebiges Weltraumgeballer. Und ich gehe hier natürlich davon aus, dass die Zielgruppe schon in erster Linie die Fans sind, denn für alle anderen fehlt komplett eine notwendige Einleitung, warum da so viele komische Kreaturen auf dem Schiff der Menschen sind, was überhaupt die Sternenflotte ist, wer die Klingonen sind und warum wir die nicht einfach über den Haufen schießen. Die zugegeben beeindruckende Bildgewalt vermag dann aber auch für die Fans nicht die vielen kleinen und großen Ungereimtheiten zu überdecken: Warum hat ein Sternenflottenschiff schon 10 Jahre vor Kirks rustikaler NCC-1701 Enterprise schicke Holo-Kommunikatoren und überall modern glänzende Touchscreens? Oder warum hat die erste Offizierin, die bei Vulkaniern aufwuchs, so viel emotionale Selbstkontrolle wie ein gereizter Klingone? Oh, und wo wir gerade bei Klingonen sind, warum zum Geier hat man das Erscheinungsbild der Klingonen so abartig verändert? Sollen diese kahlen Hallowen-Fratzen ein blöder Witz sein? toDuj 'oS rol - Ein Bart ist ein Symbol des Mutes, heißt es bei den Klingonen! Na wenigstens sprechen sie untereinander viel Klingonisch. Da kommen die Fans dann doch wieder etwas auf ihre Kosten. Ihren Anführer, T’Kuvma, würde ich jedoch gerne zum Logopäden schicken. Solange, bis er nicht mehr minutenlang. Jedes. Verdammte. Wort. Einzeln. In. Seinen. Fehlenden. Bart. Nuschelt. Ehrlich Leute, das klingt doch mehr nach Schlaganfall als nach Kriegsfürst! Ok, was haben wir sonst noch?
  • Ein phantasieloses Intro, das genauso gut ein Werbeclip für irgendein ein CAD-Tool sein könnte. Laaangweiliiig!
  • Kurios: das namensgebende Raumschiff taucht in den ersten beiden Folgen kein einziges Mal auf / wird nicht mal erwähnt.
  • Eine sich ewig hinziehende Eröffnungssequenz auf einem Wüstenplaneten, die rein überhaupt gar nichts mit der späteren Handlung zu tun hat. Wozu?
  • Bat'leths, die nicht wie Bat'leths aussehen. Hättet ihr doch nur jemanden gefragt!
  • Ein Sternenflottenschiff (USS Shenzhou), dessen Brücke nicht auf Deck 1 ist sondern unten an der Untertassensektion hängt. What!?
  • Ein Computer der Gefängniszelle des Schiffs, der sich überreden lässt dich freizulassen, wenn du nur genug jammerst. Ja, ernsthaft.
  • Jede Menge nervige Lens Flares in den Weltraum-Szenen.
  • Und, und, und ...
Discovery Werbeplakat
Ein großes Werbebanner im Stuttgarter Hauptbahnhof zeigt die neuen ... oh fuck ... also die neuen ... NEIN! Nein sorry, aber das sind einfach keine Klingonen! Vergesst es! Fertig, aus.
Kurz und milde gesagt: bis jetzt bleibt die neue Serie noch gaaaanz weit hinter den Erwartungen zurück und wirft mal eben alles über den Haufen, was Star Trek ausmacht. Gerade was die Integration in die bisherigen Filme betrifft, hat Star Wars mit Rouge One vorgemacht, wie der Übergang zwischen alt und neu viel bruchfreier und eleganter zu bewerkstelligen ist. Mal schauen, wie das weiter geht und ob Discovery dafür vielleicht doch noch an anderer Stelle punkten kann.

Warum man fremdem Code nicht trauen darf

main():
  1. int a = 0;
  2. printf("Der Wert von Variable 'a' ist %d.\n", a);
  3. BoeseFunktion(4711);
  4. a = 1;
  5. printf("Der Wert von Variable 'a' ist jetzt %d.\n", a);
Was meint ihr, gelingt es mir als Programmierer von BoeseFunktion() dass die Ausgabe in der zweiten Zeile Der Wert von Variable 'a' ist jetzt 0. lautet? Selbst wenn 'a' nur lokal der Main-Funktion bekannt ist? Ich sage ja:
BoeseFunktion():
  1. void BoeseFunktion(int tmp) {
  2.   int* pointer;
  3.   pointer = &tmp - 1;
  4.   *pointer = *pointer + 8;
  5. }
Das funktioniert eigentlich ganz einfach. Mit pointer = &tmp - 1; hole mich mir einen Zeiger auf den ersten Funktionsparameter und reduziere die Adresse um 1. Auf x86-Systemen bin ich nun an der Rücksprungadresse von BoeseFunktion() auf dem Stack. So sieht das im Speicher aus: Stack Und mit *pointer = *pointer + 8; erhöhe ich anschließend die Rücksprungadresse um 8 Byte, was gerade soviel ist um das a = 1; in main() zu überspringen. Solches Gehacke mit Pointer-Arithmetik ist natürlich sowieso pfui. Aber was uns dieses Beispiel eigentlich lehren soll ist, dass man fremden Funktionen nicht trauen soll. Es könnte schließlich sein, dass ich sie geschrieben habe... 😉

Schadensabwehr

Aber wie bekommt man nun das Problem in den Griff, dass Fremdcode, den man in so gut wie jedem Projekt findet, unbeabsichtigt oder beabsichtigt Unfug anstellt und Daten oder die Programmausführung beeinträchtigt? Da gibt es mehrere Möglichkeiten. Unter anderem:
  • Logische Programmablaufkontrolle Man stelle sich vor, jede eigene Funktion meldet sich bei ihrem Aufruf an einer zentralen Instanz mit einem eindeutigen Key. Die zentrale Instanz überprüft dann anhand einer Tabelle ob es in Ordnung ist, dass Funktion3 nun auf Funktion2 folgt oder nicht. Bringt fremder Code - zum Beispiel eine defekte DLL - den Ablauf durcheinander so wird dies schnell aufgedeckt. Voraussetzung für ein solches System ist natürlich eine deterministische Reihenfolge der Funktionsaufrufe.
  • Datenredundanz Zuerst einmal sollten alle Daten, die irgendwie wichtig sind, redundant vorliegen; am besten redundant-invers. Das heißt, es gibt nicht eine Variable 'a', sondern z.B. 'unsigned char u8VentilSollwert' und 'unsigned char u8VentilSollwertInvers'. Das hat nicht nur einen eingängigeren Namen als 'a' sondern informiert uns auch gleich noch über das Präfix u8, dass es eine unsigned 8-Bit-Variable ist mit Wertebereich von 0..255. In der einen steht dann z.B. 1 (binär 0000 0001) und in der anderen das Gegenteil, also 254 (1111 1110). Vor Verwendung wird jedes Mal geprüft, ob die beiden Variablen noch Bit-invers sind und falls nicht mit Fehlermeldung abgebrochen.
  • Datensicherung Wenn die Daten umfangreicher sind, gibt es die Möglichkeit sie mit einer Checksumme zu sichern. Wird die Checksumme oder die Daten beschädigt, so fällt dies auf, sobald man die Checksumme nachrechnet und mit dem Prüfwert vergleicht.