Atomstrom

Schon Loriot hat ja gewusst: wenn man was politisches sagen will, braucht man nur Atomstrom zu sagen und hat zumindest eine schöne Kontroverse angeleiert. Das gute da dran ist: man muss überhaupt keine Ahnung vom Thema haben, eine Meinung reicht völlig. Wenn es die richtige ist, wird man sofort zum Experten deklariert… und wenn man zufällig weiß über was geredet wird, hat man vollständig verloren.

Und genau deswegen werde ich heute mal in textueller Form das tun, was ich in diversen Diskussionen auch schon mündlich getan habe: nämlich mich unbeliebt machen. Das geht nämlich sehr einfach, wenn man an dieser Stelle als Techniker argumentiert 😉
Ich möchte unbedingt darauf hinweisen, dass dieser Beitrag entweder ganz oder gar nicht zu lesen ist – halb lesen führt dazu dass man einen völlig falschen Eindruck meines Standpunktes bekommt.
Continue reading „Atomstrom“

Punkteverteilung

Manchmal, nur ganz selten, verhält sich ein Code anders als man denkt, weil man was anderes programmiert hat als man denkt.

Man nehme z.B. eine KI mit Negamax+AlphaBeta, die immer irgendwelche völlig behämmerten Züge ausführt. Irgendwann ist mir dann mal gedämmert, dass man sich ja mal die Score-Werte ausgeben lassen könnte.

next move
  h1 to g1 score: 9
  h1 to g2 score: 9
  h1 to i2 score: 9
  h1 to h2 score: 9
  h1 to f1 score: 9
  h1 to f3 score: 9
  h1 to h3 score: 9
  i1 to h2 score: 9
  i1 to i2 score: 9
  i1 to g1 score: 9
  i1 to g3 score: 9
  i1 to i3 score: 9
  a9 to b8 score: 9
  a9 to b9 score: 9
  a9 to a8 score: 9
  a9 to c7 score: 9
  a9 to c9 score: 9
  a9 to a7 score: 9

Huch! Alles das gleiche. Wie kann das sein?

    function Score(ABoard: TBoard; Perspective: TField): TScore;
{...}
          if Board[c,r]=Perspective then
{...}

M( M( M( M( M( M( M(

Board ist ein Member von TGame, und damit an dieser Stelle durchaus ein gültiger Bezeichner. Nur leider nicht der den ich will, denn damit habe ich immer das Brett vom Startpunkt bewertet, niemals das nach einem Zug. Sehr schön, es sollte mal einer intelligente Compiler entwickeln, die mir sowas direkt sagen…

Review – TRON:Legacy

Ich komme eben frisch aus der Abendvorstellung von TRON:Legacy in der RealD-Fasssung, und allein schon um das mal etwas zu ordnen, was ich davon jetzt halte, schreibe ich also mal eine Review direkt aus dem Kurzzeitgedächtnis.

Dabei versuche ich mal so spoilerfrei wie möglich zu sein, denn eins vorneweg: ich halte ihn für sehenswert. Eventuell auch mehrmals, um die (siehe später) unglaublich vielen Referenzen und Geek-Schmankerl zu finden.

Der Film beginnt in 2D mit leichten 3D-Einstreuungen. Ähnlich wie in Avatar wird auch hier dem Zuschauer erstmal die Möglichkeit gegeben, sich daran zu gewöhnen, dass er durch eine Brille mit ziemlich breitem Gestell gucken muss. Aber nicht nur das: dieser Teil spielt in der realen, unsererer Welt, was durch eben dieses Stilmittel dargestellt werden soll. Hier ist alles wie wir (also 2D-gewohnte Kinogänger) gewohnt sind, im Gegensatz zur Anderern Seite.
Hier wird uns Sam Flynn vorgestellt als ein Rebell, dem zwar die größte Softwareschmiede der Welt gehört, der diese aber nicht leiten will. Warum er im Aufsichtsrat einen Freund hat, erschließt sich kaum, wenn man das Original nicht gesehen hat. Auch wird man nicht verstehen, warum ihn diese Figur dann dazu bewegen kann, das zu tun, was ihn im Endeffekt in die – tadaaaa – 3-dimensionale (imposante!) Welt des Raster (ja, die Begriffe sind teilweise seltsam aber konsistent mit dem 1982er übersetzt) bringt. Der Soundtrack von Daft Punk fängt hier an, zum tragenden Element zu werden. War er am Anfang zwar präsent, so geht er hier vom cinematisch-instrumentalen hin zur völligen Elektrifizierung.
Die Arena des Disc Wars hat sich massiv verändert. War früher der Kreis das tragende Element, ist es jetzt das Hexagon – direkt gefolgt von Freiformflächen. Auch das Spiel ist schneller und packender – aber auch schneller vorbei.

Wer sich vorher etwas informiert hat, weiß in der Szene danach bereits mehr als Sam – was aber nicht weiter stört, denn auch wenn der sich etwas zum Löffel macht, wird die Situation nicht schlimmer als sie vorher war. Man könnte sagen, die Autoren sind dem „satan ex machina“ sehr gut ausgewichen.

Als nächstes finden wir uns auf dem Lichtrenner-Feld wieder – mit neueren und schickeren Lightcycles. Jetzt nicht nur in 90°-Winkeln, sondern auf bis zu 3 Ebenen! Sam schlägt sich gut, hier hilft ihm seine im Intro unterhaltsam porträtierte Leidenschaft für das Motorrad(zuschnell-)fahren, woher er auch ein Manöver übernimmt. Nicht gänzlich erfolgreich, aber sonst hätte 13Quorra ja auch keinen Grund, ihn zu retten 😉

Darauf folgt das große Wiedersehen von Vater und Sohn und die zu erwartende awkward silence beim gemeinsamen Abendessen. Dann schlägt wohl der Sex Sells-Faktor zu: 2 völlig sinnfreie Shots von Olivia Wilde im Bodysuit, ausgestreckt auf dem Sofa. Nicht, dass ich was dagegen hätte, sehr lecker, aber: wäre das im Plot eingebaut, hätte ich auch gern mehr davon genommen 😉

Nachdem Sam das gemacht hat, was er am besten kann (kriminell sein und schnell fahren) kommt die mit Abstand beste Szene des gesamten Films, die Bar „End Of Line“. Geführt von einem sehr exzentrischen Castor, der auch Jonny Depp gut zu Gesicht gestanden hätte trifft sich hier alles, um… ähm… Powerade zu trinken? Romulanisches Ale? Verdünnter Curacao? Man weiß es nicht.
Jedenfalls geht einiges nicht so wie gedacht und es entspinnt sich ein Kampf, der in seiner Choreografie wohl das genialste ist, was ich in letzter Zeit gesehen hab. Man stelle sich vor, Kurt Wimmer und Milla Jovovich.. oh, gibts ja schon. Naja, darauf jedenfalls noch ein paar Faktoren drauf.
Das Ganze unter den wachsamen Helmen von Daft Punk höchstpersönlich, die im EOL offenbar Resident DJs sind – klar, dass der Club so gut besucht ist!
Wenn sie nicht von Obi-Wan gerettet werden würden, wären unsere Helden hier zwar ganz schön verloren. Werden sie aber, und deswegen verabschiedet man sich recht schnell um auf ein altbekanntes Gefährt zu treffen: einen Solar Sailer, der im gegensatz zum Lichtrenner nicht weiter (abgesehen von der Bezeichnung als „Güterzug“) vorgestellt wird. Hier ist es also völlig an den Fans ihn zu erkennen, was nicht unbedingt gut ist.

Die Reise führt uns an einen Ort, wo man lieber nicht wäre, der aber nochmals Gelegenheit zu einigen spektakulären Stunts bietet und in einer Zehntelsekunde einen ziemlich miesen Opportunisten entlarvt, nur um diesen Twist sofort zu vergessen. Es bekommt ihm zwar nicht sonderlich gut, aber man hat den Eindruck, hier wurde was geschnitten.

Die Flucht hin zum Portal (hey, warum genau ist der Ausgang so extrem weit vom Eingang entfernt??) hätte Luke Skywalker alle Ehre gemacht und auch das Ende könnte direkt aus Star Wars stammen – wer hat sonst Architekten, die unendlich tiefe Schächte mit einer 1m breiten Planke ohne Geländer überbrücken?
Ein gutes, unerwartetes aber erhofftes Happy End bringt uns für einige Szenen zurück in die Reale Welt – die in ihrer Flachheit zumindest kurzzeitig die Frage aufwirft, was realer ist. Die End Titles sind gut gemacht, nur… diese Art kennen wir jetzt schon, spätestens nach 300 und Spider Man 1-3 hat das jeder schonmal gesehen.

Oh und, a propos (ir)reale Welt: mir jedenfalls ging es auch nach Verlassen des Kinos noch ein paar Minuten so… kann gut sein, dass das irgendwas mit Post3d-Stress-Syndrom zu tun hat, aber da das meine 3D-Langfilm-Premiere war (IMAX-Kurzfilm vor ein paar Jahren), weiß ich das noch nicht.

Fazit jedenfalls: nicht nur der Hauptwerbeträger „Wir haben Musik von Daft Punk“ ist es wert, den Film gesehen zu haben. Anders als viele Kritiker finde ich nicht, das die Story dünn wäre. Jedenfalls nicht dünner als im ersten Teil, durch eine neue Klasse Programme eher noch dichter, denn jetzt hat alles wenigstens einen Grund und ist nicht reiner Selbstzweck.
Nebenbei bemerkt: der Soundtrack ist so gut, dass ich den während dem Schreiben laufen lasse und den Film komplett im Kopfkino hab. Das ist selbst für mich selten, und ich bin einer, der Musik und Bilder sehr stark (fast synästhetisch, aber nur im Gedächtnis) koppelt.

Zu den Referenzen und Geek-Geschenken:
Bisher gefunden habe ich nur die offensichtlichsten, die ich hier aber ohne Position angebe, damit ihr schön selber suchen könnt:
-Wargames-Zitat
-Star Wars an mehreren Stellen
-Ubuntu-Logo
-Filmplakate und Merchandise vom Original-TRON
-Seitenhiebe auf große Software-Firmen
-Linux-Hacking
-Dicke Türen vs. einfach zu knackende Schlösser
-Go und der Mensch ein Programm besiegen kann
-Marvin aus dem Hitchhiker?

Dazu noch zwei Sachen, die ich zwar weiß, aber das Original mir grade nicht einfällt:
-der Angeber-Sprung von Rinzler
-die von oben herabfahrbaren „Glocken“ über den Wächtern in CLUs Schiff

Und damit bin ich am Ende und falle jetzt gleich ins Bett. Ciao!

Stand back – I know CMD!

Ich merke das schon, Psychologie läuft nicht so gut wie Programmierung und Politik…

gnuplot hält sich für ein sehr gutes Diagramm-Plot-Programm – und das stimmt meistens auch. Wenn es darum geht, Daten aus Dateien einzulesen wird das Skript zwar sehr schnell sehr hässlich, aber es funktioniert. Zumindest, wenn man die Daten vorkocht, denn filtern kann man sie in gnuplot selbst nicht mehr vernünftig. Das ist aber grade dann von Nöten, wenn man lange Messreihen hat, aber zum Beispiel nur an den letzten N Messwerten interessiert ist. Eigentlich doch ein nicht grade seltenes Problem, aber fertige Lösungen jenseits von `tail -n` sind nicht wirklich auffindbar.
Continue reading „Stand back – I know CMD!“

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 😀 ) 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 😀

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 😛 ) 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 😀

Das wars erstmal von meiner Seite,
Martok

How to not be evil [Update]

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

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:
Continue reading „How to not be evil [Update]“

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.
Continue reading „Hackfox – Foxhacks“

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…