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…
Too much standard compliance
Hi!
Ich hab mich hier und anderswo ja schon öfter drüber beschwert, dass sich gewisse Browser nicht an Standards halten. ‘Gewisse’ war dabei meist der IE
Nun, offenbar tritt auch mal das Gegenteil auf… aber zum Anfang.
Ein Uber-1337-Web2.0-Projekt benutzt unter anderem DOM-Manipulation, dabei werden auch <style>-Nodes injected. Und zwar unterhalb des <body>s. Das funktioniert prima im Firefox(3) und in Opera, aber NICHT in IE und Safari/Webkit/KHTML/whatever. Woran liegt das? Nun, laut Standard darf ein <style>-Node nur unterhalb von <head> stehen. Meines Wissens sind Firefox und Opera die einzigen, die das ignorieren und die Dinger auch anderswo parsen. Schade eigentlich, denn meine so einfache Lösung wird jetzt durch Sonderbehandlung für die, die sich an Standards halten wieder komplizierter.
Was mich zum Fazit bringt: auch das W3C hat die Weisheit nicht gepachtet, für mich ist dieser Standard inkonsequent: die an sich ähnlich auszulegenden <script>s darf man schließlich auch überall verwenden.
Wer aber ne gute Idee hat, wie man das so hinkriegt, dass die Styles auch da geparst werden, oder wer mir sagen kann wie ich in IE/Webkit DOM-Änderungen Hooken kann (brauch ich fürs aufräumen, wenn ich doch in den <head> injecten muss), der kriegt ein Bienchen und eine About-Erwähnung
cu,
Martok
Wordpress: wpautop(), der einfachere Weg
Hallo!
Ich melde mich mal wieder, diesmal mit etwas relativ wichtigem. Vor kurzem wurde Wordpress 2.6 freigegeben, im Zuge des Updates musste ich mal wieder den wpautop()-Fix einspielen.
Dabei sind mir einige Unzulänglichkeiten aufgefallen, unter anderem dass er sinnlos kompliziert ist
Die neue Version kommt mit grade mal 7 neuen und einer geänderten Zeile aus.
Hier die Diff (wir sind wieder in wp-includes/formatting.php):
@@ -65,10 +65,15 @@ } function wpautop($pee, $br = 1) { + $preserving = strpos($pee, '<preserve>') !== false; + if ($preserving) { + $pee = preg_replace_callback('!<preserve>(.*?)</preserve>!is', create_function('$matches', 'return "<revert>".base64_encode($matches[1])."</revert>";'), $pee); + } + $pee = $pee . "\n"; // just to make things a little easier, pad the end $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee); // Space things out a little - $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)'; + $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr|revert)'; $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee); $pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee); $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines @@ -99,6 +104,9 @@ $pee = preg_replace( "|\n</p>$|", '</p>', $pee ); $pee = preg_replace('/<p>\s*?(' . get_shortcode_regex() . ')\s*<\/p>/s', '$1', $pee); // don't auto-p wrap shortcodes that stand alone + if ($preserving) { + $pee = preg_replace_callback('!<revert>(.*?)</revert>!is', create_function('$matches', 'return base64_decode($matches[1]);'), $pee); + } return $pee; }
Bei der Gelegenheit habe ich den Tag von <nowpautop> in <preserve> geändert, hier gegebenfalls betreffende Posts/Seiten anpassen.
Die angesprochenen anderen Unzulänglichkeiten hatten damit zu tun, dass nur p und br-Tags verhindert wurden. Alles andere wurde trotzdem munter verändert. Jetzt ist das Verhalten das erwartete: per php generierter HTML-Code wird genau so übernommen wie er aus dem Interpreter kommt. Technisch liegt das daran, dass ich jetzt nicht mehr einzelne Zeichen schütze, sondern alles, indem der Code base64-Codiert vor wpautop() versteckt wird.
Viel Spaß damit ![]()
Martok
Neue Sparte: SA:MP
Den aktuellen Querelen um SA:MP kann man immerhin ein positives abgewinnen: Ich habe mich dazu entschieden, eine Kategorie dafür zu erstellen.
Und bitteschön, da ist sie: SA:MP San Andreas Multiplayer
Demo1 – Release
Hallo!
Meine angekündigte Demo ist trotz ersten Problemen doch noch irgendwie fertig geworden. In Konkurrenz zu Farbrausch trete ich hier nicht gerade, aber immerhin zeigt sie, dass man mit Delphi auch recht kleine Demos schreiben kann, auch ohne wie blöd zu optimieren. Interessant finde ich ja, dass die ganzen Funktionen die ich in den letzten paar Tagen eingebaut habe sich kaum in der Dateigröße niederschlugen: immer noch 47KByte, nach UPX allerdings.
Musik hab ich allerdings keine drin, was aber nur da dran liegt, dass ich keine Lust hab noch was zu komponieren. Den Tracker gibt es ja in Form von BlitzTracker bereits.
Download hier (42 KByte ZIP)
Einfach auspacken und starten. Wer sie im Vollbild-Modus genießen will, kann treeD.exe mit dem Parameter -fullscreen aufrufen.
Ach ja, und die Wartezeit am Anfang ist kein Crash, sondern da werden die Texturen & das Terrain generiert.
Für die, die es interessiert: der ganze Spaß basiert auf einem Timeline-System, dass Kamerafahrten, Scene-Renderer und Overlay-Renderer entsprechend der aktuellen Zeit (angezeigt als DT im Window-Mode) auswählt und ggf. interpoliert.
Der Inhalt ist übrigens an keiner stelle statisch, jedes mal wenn man die Demo startet, sieht man eine komplett andere Welt
Tja. Dann sagt mal was dazu. Aber bitte nicht nur die künstlerischen Aspekte bewerten, ich weiß dass das nicht sooo der Renner ist…
mfg
Martok
Prozedurale Texturen….
Mal wieder was von mir
In der letzten Zeit habe ich mich mal wieder einem Projekt aus dem bereich der 3D-Grafik gewidmet. Und zwar bastle ich an einer Demo. Beziehungsweise an einem Testprojekt für ein Delphi-Demo-Framework, so wirklich Demo nennen kann man das heutzutage fast nicht mehr.
Sieht auch alles schon ganz nett aus, aber mit den Texturen hab ich noch so meine Probleme. Prozedurale Texturen sind ja eine ganz tolle Erfindung, aber so gut bin ich dann auch nicht…
Und zwar benutzt mein Framework Callback-Routinen à la
procedure _GroundTexGen(X,Y:single; var Value: TRGBA);
X und Y erstrecken sich von 0 bis 1, sind also gleichwertig den OpenGL-Texturkoordinaten. TRGBA ist ein array[0..3] of single, dessen Komponenten die einzelnen Farben Rot, Grün, Blau und Alpha (hier nicht benutzt) wieder im Bereich von 0 bis 1 enthalten.
Was ich bräuchte wären Texturen bzw. die Prozeduren für Himmel (Y>0.5 -> Oberirdisch), Holz/Baumrinde und “Boden”, also Gras, Erde usw. Wären alles prima Kandidaten für Perlin Noise, aber da blick ich nicht so ganz durch…
Falls jemand Langeweile haben sollte und gern in die Credits möchte… sagt Bescheid!
mfg
Martok
Das Brain – Chatbot
Eigentlich hab ich den ja schon länger in meiner ICQ-Liste… aber nachdem ich mich fast weg geschmissen hab grade bei einigen Dialogen, sag ich euch jetzt auch mal was über diesen Chatbot. Zuerst aber der Link: Das Brain – Chatbot
Brain ist ein deutschsprachiger selbstlernender Chatbot. Brain besitzt künstliche Intelligenz: Während du mit ihm chattest, lernt er ständig hinzu – er merkt sich dabei jedes von dir geschriebene Wort!
Dadurch gibt Brain zum Teil verblüffend passende Antworten, manchmal aber auch völlig abwegiges, oder einfach nur bizarres, amüsantes und witziges.
Ein paar Dialoge:
(mehr…)
Warum SA:MP nicht Skripterfreundlich ist
Tja. Lange kein Posting hier, weil ich jetzt auch für SA-MP skripte. Das heißt, ich versuche es. Wenn der Supprot nicht so katastrophal wäre.
Hier werde ich mal ausbreiten, warum das so ist.
(mehr…)
Wordpress wpautop() Bug gefixt
Ich hatte ja das Problem, dass mit PHPexec erzeugter Code immer von wpautop() immer verhackstückt wurde.
Irgendwie hatte ich jetzt doch noch die richtige Idee. Ich führe einfach ein neues HTML-Element ein…
Die Lösung basiert auf ein paar kleinen Änderungen des Moduls wp-includes/formatting.php.
(mehr…)
