Inception angewendet

Ihr habt doch bestimmt alle Inception gesehen, oder? Wehe wenn nicht, der ist wirklich gut ;)
Jedenfalls, dann kennt ihr auch das Konzept hinter den “Totems”, richtig? Gut, denn das sollte man, wenn man den Witz im folgenden finden will.

Folgende Situation: ich träume, und weiß das auch. Allgemein bekannt als Lucid Dream. Die Situation ist aber nicht grade rosig… in Inception würde man sagen, “the dream collapses”, also muss ich den irgendwie zusammenhalten. Aufwachen ist doof, die Umgebung ist so toll gebaut. Nun ist das nicht so einfach, irgendwas um sich drauf zu konzentrieren dass das ein Traum ist, wäre gut. Was macht meine Begleiterin (hey, ich träume üblicherweise Filme – männlicher Held, weiblicher Sidekick, klar!?)? (Übrigens, sie ist auch toll konstruiert: ich kenne sie im RL, und sie ist ein Japan-Fan, was bekomme ich also? Die Person, die eigentlich white caucasian ist mit japanischen Gesichtszügen :D ) Sie holt einen Spielwürfel (D6) raus, und lässt den auf einer Ecke rotieren wie einen Kreisel.

Er fällt nicht um.

Ich stelle also fest: “Das ist eindeutig ein Traum!” Woraufhin sie mich fragt, “jetzt müssen wir nur noch rausfinden ob deiner oder meiner.” (warum? Keine Ahnung. Sie hat wohl auch Inception gesehen^^) In dem Moment fällt der Würfel um, eine 4.
Ich nehme mir den also, stating the obvious “ah, eine 4″ und lasse den Würfel kreiseln, was er auch recht ungestört tut. Bis jemand der neben mir am Tisch steht (irgendein Statist) an den Tisch stößt (offenbar gehorcht er doch der Schwerkraft, wenn man nur genug drauf einwirkt) – während der Wüfel noch im Fallen ist, fange ich schon an zu sprechen: “Schon wieder eine 4″. Sobald der Satz raus ist, fällt er ganz um und zeigt – die 4.
“Hätten wir das geklärt, ist also mein Traum.”

Anscheinend reichte das, um mein Unterbewusstes davon zu überzeugen die Welt zusammenzuhalten, jedenfalls ging der Traum dann noch ziemlich lange weiter.

Merke: Reality Checks sind wichtig, funktionieren auch wenn man sie nicht selbst macht und erstaunlicherweise auch, wenn man sie nicht regelmäßig in der Reality macht. Nolan, you genius.

Manipulation der Welt hat sich übrigens ziemlich Minecraft-artig abgespielt – schon lustig, quadratische Löcher in Wände zu hauen :)

Ich bin ja immer noch ziemlich fasziniert davon, aber das solls hier erstmal gewesen sein. Man muss ja erstmal sehen, ob ihr mich jetzt für verrückt erklärt, wegen sowas wertvolle Bandbreite zu belegen :D

Jugendschutz vs. Zensur

Mal wieder Zeit für was politisches, hm? Aus gegebenem Anlass, kann man wohl sagen. Mittlerweile hat auch die FSM eine FAQ veröffentlicht, die zumindest die erste Hysterie mit “wird schon gutgehen” abbügeln wollen. Nicht, dass ich wirklich glaube dass die Befürchtungen der Netzgemeinde (wie es so schön heißt) sich nicht bewahrheiten werden – das haben sie immer. Nur zeigt diese Seite schön, dass offenbar die Idee nicht so schlecht wie der Entwurf zum JMStV war.

Um diese handwerklichen Mängel (umgangssprachlich: himmelschreiender Pfusch) soll es hier aber nicht gehen, denn unabhängig von der rechtlichen Schlangenteergrube voll mit Minen ist das Thema Jugendschutz in Deutschland ein ganz eigenes. Kein anderer westlicher Staat leistet sich so restriktive Regelungen und Straftatbestände zum Schutze der Jugend wie Deutschland. Das lässt doch die Frage aufkommen: warum ist das so? Sind wir besonders kinderlieb (darf man das heute überhaupt noch sagen oder ist die griechische Übersetzung schon stärker?) oder alle anderen Kinderhasser?

Gehen wir doch mal zu den Wurzeln. Die Wikipedia sagt in einem noch nicht gelöschten Eintrag:

In der Bundesrepublik Deutschland wurde erstmals 1951 das Gesetz zum Schutze der Jugend in der Öffentlichkeit (JÖSchG) erlassen. Danach wurde es mehrfach novelliert, bis es durch das neue Jugendschutzgesetz ersetzt wurde.

Ein Vorläufer des JÖSchG war das nach dem zweiten Weltkrieg aufgehobene Lichtspielgesetz von 1920, das die öffentliche Vorführung von Filmen erst nach der Überprüfung durch zentrale Prüfstellen erlaubte. Eine aufgrund der Strafandrohungen gegen Jugendliche umstrittene Polizeiverordnung aus dem Jahr 1943, die unter anderem Ausgangsbeschränkungen enthielt, wurde erst 1951 aufgehoben und floss in Teilen in die neuformulierten Regelungen ein.

Also: die das erste JSG in Deutschland war ein Gesetz, dass eine zentrale Prüfstelle für Filme eingeführt hat – viele Jahre später in der DDR gab es sowas für Drucksachen, damit keiner einfach Flugblätter oder andere staatsgefährdende Propaganda von der Druckerei machen lassen kann. Na, erkannt? Richtig, solche Stellen dienen IMMER der Zensur!

Das erklärt aber eins nicht: wie kann es sein, dass ein Volk, dass zwei Diktaturen überlebt hat, sich heute immer noch die gleichen Institutionen andrehen lässt? Wie kann es sein dass so etwas nicht nur passiv erduldet, sondern aktiv gefordert(!) wird?

In der Shoutbox der Entwickler-Ecke vertrat ich nun die Meinung, dass dies damit zu tun hat, was sich unsere Kultur unter Kindheit vorstellt: ein behütetes und von allem Bösen verschontes aufwachsen, möglichst bis zum 18. ohne jeden Außenweltkontakt. Aber warum wollen wir das? Sollte es nicht eigentlich das Ziel der Erziehung (durch Eltern UND Gesellschaft, nicht ODER!) sein, mündige Bürger auf die Welt vorzubereiten, die sie einmal erleben und womöglich verändern werden?
Dazu braucht es vor allem eins nicht: riesige undurchsichtige Vorhänge, die die Außenwelt abschirmen und eine Parallelwelt erzeugen, in denen unsere Kinder aufwachsen. Dazu braucht es Leitlinen, Führung und vor allem eins: Vertrauen. Es hilft nichts, als Eltern “das Böse (TM) Internet” zu verdammen und dem Kind jeden Kontakt damit zu verbieten. Es hilft nichts, stattdessen einen Fernseher ins Kinderzimmer zu stellen. Es hilft erst recht nichts, ein gesiebtes Internet zu erzeugen.
Was wichtig ist, ist die Medienkompetenz (hier würde ich auf Isotopp linken, wenn das denn noch gehen würde – danke JMStV!Mittlerweile ist der JMStV vom Tisch und Isotopp wieder da – also hier der versprochene Link) schon im frühen Alter zu erzeugen und dafür zu sorgen, dass die Bewertung des Inhaltes da passiert, wo sie hingehört: in das Moralbewusstsein des Rezipienten! Nirgendwo sonst kann irgendetwas erreicht werden als dort, wo Abstoßung und Fremdschämen entstehen. Und das am Besten schon vor dem Kontakt: wer Gewalt verabscheut, wird auch von gewaltverherrlichenden Inhalten nicht zum Berserker, sondern sich angeekelt abwenden.

Dabei liegt aber nicht nur das Kindheitsbild in Deutschland im Argen, auch an anderer Stelle haben wir ein (historisch bedingtes) Defizit: Meinungsfreiheit. Man sieht deutlich, dass jeder Staat, der in seiner Geschichte eine erfolgreiche Revolution von unten vorweisen kann auf die freie Meinungsäußerung einen größeren Wert legt, als Staaten die von oben geformt wurden. Das ist auch völlig logisch: wer weiß, welche Macht das Wort hat, will es entweder schützen oder eindämmen, je nach dem, auf welcher Seite er gerade steht. Vergleicht man zum Beispiel das Grundgesetz mit der Constitution der USA, fällt eins auf: im GG findet sich die Würde des Menschen in Art. 1, die Meinungsfreiheit erst in Art 5. Im Gegensatz dazu ist die freie Meinungsäußerung Teil des First Amendment und damit das erste und oberste Gut! Aus genau dieser Wertung begründet sich auch die Jugendschutzgesetzgebung in Deutschland, denn es wird eben nicht davon ausgegangen, dass der Konsument schon wissen wird, was er mit dem Input anzufangen hat, sondern eben im genauen Gegenteil das Filtern für ihn übernommen.

Womit wir wieder am Anfang angekommen wären: Jugendschutz (besonders Jugendmedienschutz) ist Zensur in dem Sinne, dass sie einen mündigen Heranwachsenden für unmöglich hält und dabei in Kauf nimmt, Erwachsene in ihrer Entfaltung der Persönlichkeit (Artikel 2, NACH der Menschenwürde) zu hindern. Diese Abwägung ist es, die es möglich gemacht hat dass wir heute auf dem besten Weg zu einem “Kindernet” sind, einem Netz, in dem der mündige selbst nachdenkende und bewertende Rezipient nicht mehr vorgesehen ist.

Brave New World.

Kleine Hacks erhalten die Freundschaft

Heute mal wieder was aus der Bastelkiste:

Unser Institut für Mechanik hat für Belege und Praktika ein schickes kleines Delphi-Programm, welches die Aufgabenblätter generieren kann. Das ganze hat den Zweck, dass die Aufgaben sich mit der Matrikelnummer personalisieren lassen (RandSeed) und man seine berechneten Werte mittels dieses Programms direkt auf Korrektheit prüfen lassen kann.

Nun sind die Aufgaben nicht immer so ganz ohne, und manchmal hilft es ungemein, nicht nur Eingabefelder zu haben, die einem sagen ob man richtig oder falsch lag, sondern auch mal spicken zu können, wo denn der Fehler liegt.

Aber erstmal eine kleine Anekdote.
Man sitzt also in einer Vorlesung, und macht nebenbei mit einem Kommilitonen ein solches Übungsbelegblatt. Die Gleichungen sehen auch erstmal alle ganz schön aus. Nun hat man ja einen Laptop dabei, kann also die Ergebnisse kontrollieren. Und siehe da: nix passt.
Was tut man also? Man versucht herauszubekommen, was das Programm denn als Zahlenwert erwartet. Irgendwie dachte ich mir (warum, weiß ich auch nicht; vielleicht wars ja Schicksal :P ) dass mir ein Hex-Editor weiterhelfen könnte. Konnte er natürlich nicht, hat aber soweit geholfen, als dass ich festgestllt habe, dass es zu jedem Aufgabenblatt 2 Definitionen gibt. Eine generiert die Aufgabenstellung, und eine generiert… Moment. Was ist das? Ein Lösungsweg!
Es gibt also nicht nur 2 Programmversionen (wie schon das _student im Dateinamen vermuten lässt), sondern zu allem Überfluss enthält die selbe Echse offenbar beide Teile. Irgendwo muss also umgeschaltet werden, was gemacht werden soll.

Nachdem man seinen IDA Pro wiedergefunden und gestartet hat, wird also mal das Programm hineingeworfen. Etwas warten, und die Programmstelle wieder finden. Das macht sich recht einfach, immerhin ist der Titel des Belegs ein sehr eindeutiges Merkmal (im Code-Segment jedenfalls). Nun muss man nur noch die XRefs zurückverfolgen, um rauszubekommen wo der wichtige Aufruf erfolgt. Der ist nämlich da, wo basierend auf einem Vergleich der eine oder andere Zweig (=Ausgabeanweisungen) aufgerufen wird. It always boils down to a simple comparision.
Der letzte Schritt (wo allerdings leider die Vorlesung zuende war; der Teil mit dem “IDA wiederfinden” hatte etwas lange gedauert) ist es nun nur noch, die Zuweisung an die überprüfte Variable zu finden. Auch hier hilft wieder die XRefs-Funktion. Es gibt nämlich nur eine, und die schreibt eine $00, also den Ordinalwert für false. Man könnte also sagen, die betreffende Variable ist sowas wie IsTutorenVersion.
Kurzer Patch in der Exe der (wir wissen ja: es ist Delphi) eine $01 (für true) stattdessen schreibt, und fertig.

Wer das liest und ein berechtigtes Interesse hat, der hat auch Wege mich nach dem Teil zu fragen. Das ist nun grade ein Hack, bei dem ich garantiert kein Responsible Disclosure machen werde. Das wäre nämlich sehr verantwortungslos. Mir selbst gegenüber :-D

Das wars erstmal von meiner Seite,
Martok

How to not be evil [Update]

Wer kennt sie nicht, die beliebte Funktion eval()? Chrome zum Beispiel :D

Das heißt auch, dass die bisher im Edgemonkey verwendete Kombination von eval/uneval zur (de)serialisierung von Einstellung und Speicherung dieser so in Chrome nie funktionieren wird (selbst wenn später einmal eine GM_setValue-Alternative zur Verfügung steht – stay tuned). Es muss also jedes Vorkommen davon durch die eigentlich viel schöneren und moderneren JSON.parse und JSON.stringify ersetzt werden. Was aber nicht so einfach ist, da die Migration bisheriger Daten natürlich funktionieren muss.
Was gar nicht so einfach ist – uneval erzeugt kein JSON, sondern nur etwas was so ähnlich aussieht!

Man muss also etwas tun, um die Daten in valides JSON zu konvertieren. Was nicht einfach geht, ohne uneval. Bleibt also nur, den String als solchen zu bearbeiten. And here’s how:
Weiterlesen

Hackfox – Foxhacks

Viele von denen, die hier lesen dürften mein Projekt EdgeMonkey kennen. Für die paar, die es nicht tun: es handelt sich um ein Userscript für Greasemonkey, welches die Entwickler-Ecke verschönert.
Jedenfalls: viele der dort eingesetzten Techniken waren schon immer Bleeding Edge, was Userscripts angeht. Deswegen wirds da auch schnell mal blutig, wenn sich irgendwo etwas ändert.

So ist das bereits mehrmals passiert – die neue Sandbox der Greasemonkey 0.8-Reihe war wohl das offensichtlichste. Aber das war ja noch einfach zu umgehen. Richtig spaßig ist das aber erst viel später auf Firefox 4 geworden, welcher mich auch dazu gebracht hat die hier besprochene Thematik mal genauer zu analysieren.
Weiterlesen

Ikarus

Eins scheint in letzter Zeit moderern zu sein: nein, nicht Zurücktreten.
Gut, das auch, aber das meine ich nicht.

Ich meine eher die Tendenz von “Autoritätspersonen” im rhetorischen Sinne sich selbst zu entschärfen.

Beispiele gefällig?
Weiterlesen

Aus dem Maschinenraum

Heute mal wieder so ein paar schöne WTF-Momente gehabt. Das ist zwar bei WordPress nix neues, weswegen ich heute auch mit Serendipity experimentiert hab. Das ist zwar toll, aber die Permalinkstruktur gefällt mir nicht wirklich, und der Import hat auch nicht geklappt (konsquent falscher Zeichensatz). Ist aber hier nicht das Thema ;)

Was mich heute zum wiederholten Mal verwundert hat, sind spontan nicht mehr funktionierende PHP-Skripte.
PHPExec meinte doch eben völlig unmotiviert (“I didn’t touch anything! *looks away*”), mir einen Fehler zu melden, eine Variable wäre nicht initialisiert. Das war sie zwar wirklich nicht, aber das Skript lief ohne Unterschied literally seit Jahren. Fehlerfrei. Ich hab eine glaubhafte Versicherung meines Hosters, dass er auch nix gemacht hat…

Sowas hatte ich schonmal: ein Datenbank-Wrapper, der schon Wochenlang genutzt wurde, meinte auf einmal, Bind-Variablen nicht mehr richtig übergeben zu wollen. Und Überraschung: laut Manual hätte es nie funktionieren können.

Hatte schonmal jemand ähnliche Effekte? Plötzlich veränderliches Verhalten ist etwas, was ich mir so gar nicht erklären kann.

Optimierung mal anders

Aus der Kategorie, “Spaß am Gerät, den man lieber nicht hätte”: Amoklaufende Optimierung im GCC.

Man lese folgenden Code, der alternierend ein LCD mit Zahlen, Buchstaben und “nichts” füllt:

while (1) {
	for (unsigned char k=0;k<4;k++)  {
		LCD_setCursorPos(k,0);
		LCD_write("1234567890123456");
	}
	delay(250);
	LCD_clear();
	delay(250);
	for (unsigned char k=0;k<4;k++)  {
		LCD_setCursorPos(k,0);
		LCD_write("abcdefghijklmnop");
	}
	delay(250);
}

What could possibly go wrong :?:

Gut, wir kennen ja Murphy: Alles, was schief gehen kann, geht schief. Und wenn schon der Code kaum Fehlerpotential hat, muss zwangsläufig der Compiler seinen Beitrag dazu leisten :!:

Genau das hat er dann auch getan… erstmal äußerte sich das ganze dann darin, dass wider erwarten nur Zahlen, leere Seite und wieder Zahlen kamen. Und dabei die Seite mit den Zahlen irgendwie “zu lang” zu sehen war.
Was war also los?
Wie in Blick in das praktischerweise im Makefile angeforderte Extended Listing verrät, ist avr-gcc der Meinung, die beiden Schleifen würden das Gleiche machen, und kombiniert die in eine Schleife. Durch Ausprobieren anderer Optimierungsstufen zwischen -Os und -O1 kann man dann gcc immerhin überreden, nicht mehr beides in einer Schleife zu erledigen, sondern die zweite komplett zu ignorieren (toll!)… auch nicht ganz das Wahre. -O0 erzeugt Warnungen in <util/delay.h>, fällt also leider aus.

Die einzige mir bekannte Lösung ist das verlegen der beiden Schleifen in separate Methoden:

void test1(void)
{
	for (unsigned char k=0;k<4;k++)  {
		LCD_setCursorPos(k,0);
		LCD_write("1234567890123456");
	}
	delay(250);
}
 
void test2(void)
{
	for (unsigned char k=0;k<4;k++)  {
		LCD_setCursorPos(k,0);
		LCD_write("abcdefghijklmnop");
	}
	delay(250);
}
while (1) {
	test1();
	LCD_clear();
	delay(250);
	test2();
}

Gut, man muss eingestehen, der gcc hier ist schon etwas (avr-gcc (WinAVR 20080610) 4.3.0) älter. Das ist in einigen Kompatibilitätsproblemen mit anderen Projekten geschuldet, die sich auf ein bestimmtes Verhalten verlassen (hey, ich hab das nicht erfunden, ok?)
Kann also sein, dass das mittlerweile nicht mehr so ist. Aber trotzdem toll, dass so ein Bug es tatsächlich in eine Produktiv-Version schafft. Ist das kein Testcase? Naja, gcc halt…

Chemiestunde

Willkommen zum monatlichen Alibi-Beitrag :D

Heute mal ein wenig Bildung direkt “aus dem Leben”. Zumindest aus meinem…

Wenn der Kaffee langsam komisch schmeckt, sollte man sich – grade wenn man in für Kalkhaltiges Wasser bekannten Gegenden wohnt – durchaus mal mit der Heizwendel des Wassererhitzungsgeräts beschäftigen. Weiterlesen