RIFF WAVE

Busted and Blue Als im letzten Jahr Gorillaz’ Humanz erschien und ich darauf hingewiesen wurde, dass die Domain busted.blue noch nicht vergeben war, wusste ich noch nicht was ich damit tun sollte. Seit ein paar Monaten liegt dort nun eine relativ Dynamische Seite, die die Lyrics des Liedes Busted and Blue beim laden verstreut1. Das allein wird schnell langweilig. Die nächste Idee war es, die Zeilen einzeln zu animieren, das Lied im Hintergrund zu spielen und die aktuelle Zeile hervorzuheben. …

Posted on

Custom image.Image Format in Go

Nachdem ich vor ein paar Wochen über Sprites in NES ROMs geschrieben habe, wollte ich gerne eine standardisiertere API anbieten als die verwendete: Read(io.Reader) ([][]byte, error) Entschieden habe ich mich dazu, ROMs wie Bilder zu verarbeiten, wozu sich image.Decode(io.Reader) (image.Image, error) anbietet. Es wählt einen Decoder aus zuvor registrierten Formaten aus. Vor dem main()-Aufruf, werden alle zuvor erstellten init() Funktionen verarbeitet. Dort kann mit image.RegisterFormat ein neues Bildformat registriert werden. …

Posted on

NES Sprites

Ein bekanntes Format für NES-Roms ist iNES. Dessen erste drei Bereiche sind der Header, der Program ROM (PRG) und der Character ROM (CHR). PRG und CHR sind in Banks unterteilt, welche je 16 * 1024 Byte bzw. 8 * 1024 Byte groß sind. Der Header besteht aus 16 Byte. Die erste vier lauten immer 0x4e, 0x45, 0x53 und 0x1a, was in ASCII für NES(SUB) steht. Darauf folgen zwei Byte, welche je die Anzahl der PRG- und CHR-Banks beinhalten. …

Posted on

[] + {} = wat.

In den beiden großartigen Talks Wat und The Birth & Death of JavaScript werden ein paar witzige Eigenheiten von JavaScript gezeigt. Die meisten davon ergeben aber - zumindest ein wenig - Sinn. Array + Array = String › [] + [] ‹ '' Um zu verstehen, wieso Array + Array einen leeren String ergibt, sollte bekannt sein, dass JavaScript nur wenige Primitives besitzt - darunter Number und String. Laut Specification werden beide Seiten um den Addition-Operator + herum an ToPrimitive() übergeben. …

Posted on

CloudFlare DDoS Protection

Das Problem mit CloudFlare ist, dass man Seiten im I’m Under Attack Mode schlecht curlen kann. Beim ersten Aufruf sendet CF eine Seite mit Code 503 und einem __cfduid-Cookie die testen soll, ob JavaScript aktiv ist. Wenn ja, wird ein Formular gesendet: <form id="challenge-form" action="/cdn-cgi/l/chk_jschl" method="get"> <input type="hidden" name="jschl_vc" value="58d1a6f5ae5e8370f0ad39a57e24d4f9"/> <input type="hidden" name="pass" value="1446611501.924-p1DZPAloDm"/> <input type="hidden" id="jschl-answer" name="jschl_answer"/> </form> Interessanter ist aber der Weg zur jschl_answer. Im Header der Seite steht (hier leicht verschobenes) JavaScript: …

Posted on