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 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. Die akzeptierten Argumente sind der Name des Formats (string, hier "nes"), ein fixer Teil des Headers zur Bestimmung des Formats: magic (string, Fragezeichen (? …

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

Mit Bookmarklets Authentifizieren

Das Zentakel möchte ein Pastebin, aber keine Klage wegen Veröffentlichten Kreditkartendaten bekommen. Um am bestehenden Paste nicht all zu viele Änderungen vornehmen zu müssen, wäre eine Funktion zum authentifizieren schön, die bloß noch in entsprechenden Routen eingetragen werden muss. Ein sehr einfacher Weg dorthin geht über Bookmarklets. So wird hier bspw. CryptoJS eingebunden und, sobald geladen, verwendet, um einen Hash zu generieren und das Pastebin mit diesem aufzurufen: javascript:(function() { script = document. …

Posted on