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

Offizielle RBTV Api

Gestern Abend wurde während Bohn Jour endlich die offizielle Rocket Beans TV App - Pocket Beans - vorgestellt und damit auch endlich ein offizieller, maschinenlesbarer Sendeplan! Woohoo! Leider sind die APIs (Ja, es gibt mehrere) nicht so ganz öffentlich. Die eigentliche API scheint auf api.rocketmgmt.de zu liegen. Außerdem exististieren mindestens zwei Wrapper auf einer Domain der Appentwickler (refreshbutton.net), über welche Dinge wie der Sendeplan, eine Liste der Sendungen und - am wenigsten spannend - einem scheinbar bei jedem User-Request neu geparsten JSON-Äquivalent zum offiziellen RSS Feed zu finden sind (Reddit). …

Posted on