Entwicklung

Catalysts Coding Contest Wien 2012

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Am Freitag, den 19. Oktober habe ich wieder am Catalysts Coding Contest, dem, nach eigenen Angaben härtesten Programmierwettbewerb Österreichs, teilgenommen. Zum ersten Mal war ich beim Herbsttermin in Wien dabei. Der Wettbewerb fand dieses Mal in der Volkshalle im Rathaus statt.

Wie man auch der offizielle Presseaussendung entnehmen kann, ging es dieses Mal um das “Lippenlesen”. Genauer gesagt war verlangt vom Computer bereits erkannte Bewegungen den Buchstaben zuzuordnen.

Bei mir hat es leider nur für das Level 2 gereicht, aber da ich mit dem Studium noch nicht begonnen habe, ist das nicht so schlimm. Genau genommen bin ich auf Platz 101 von 126 gelandet, wie der folgende Screenshot beweist:

Mein Ergebnis

Ich möchte im Folgenden kurz die Aufgabenstellungen und meine Lösung erläutern:

Level 1

Hier wurde eine Trainingsdatei mit den Buchstaben und den zugehörigen Bewegungen bereitgestellt:

26 a I U v o b I I i i c I ( i c d I ( i c e I U i c f I I i u g I ( i c h S S i ...

Am Anfang steht die Anzahl der Buchstaben und dahinter stehen Buchstaben mit den zugehörigen vier Zeichen, die die Bewegung darstellen. In diesem Beispiel gibt es 26 Buchstaben des Alphabetes und ein “a” bedeutet als Bewegung “I U v o”, “b” bedeutet “I I i i”, usw…

Hier musste man also zuerst die Übersetzungen einlesen, was ich mit folgendem Code erledigt habe:

$data = CCCHelper::stringToArray("26 a I U v o b I I i i c I ( i c d I ( i c e I U i c f I I i u g I ( i c h S S i c i I U v o j S S i c k I ( i c l D H v o m I I i i n I ( i c o - C i o p I I i i q o - i i r I ( i c s I ( i c t S S i c u - C i c v I I i u w o - i i x S S i c y I ( i c z I ( i c");

$dict = Array();

for($i = 1; $i < ($data[0]*5); $i = $i+5){
	$dict[$data[$i]] = $data[$i+1] . " " . $data[$i+2] . " " . $data[$i+3] . " " . $data[$i+4];
}

Zum Aufspalten der Buchstaben habe ich eine kleine, selbst geschriebene, Hilfsklasse namens CCCHelper verwendet, in der die folgende Funktion definiert ist:

public static function stringToArray($input){
  return explode(" ", $input);
}

Dadurch erhielt ich eine Auflistung der Buchstaben:

Array
(
    [a] => I U v o
    [b] => I I i i
    [c] => I ( i c
    [d] => I ( i c
    [e] => I U i c
    [f] => I I i u
    [g] => I ( i c
    [h] => S S i c
    [i] => I U v o
    [j] => S S i c
    [k] => I ( i c
    [l] => D H v o
    [m] => I I i i
    [n] => I ( i c
    [o] => - C i o
    [p] => I I i i
    [q] => o - i i
    [r] => I ( i c
    [s] => I ( i c
    [t] => S S i c
    [u] => - C i c
    [v] => I I i u
    [w] => o - i i
    [x] => S S i c
    [y] => I ( i c
    [z] => I ( i c
)

Wie man hier sieht, kommt die gleiche Abfolge bei mehreren Buchstaben vor.

Nun ging um die Erkennung der Buchstaben in mehreren Beispielen.

21 - C i o I ( i c - C i o o - i i S S i c I ...

Auch hier wurde an erster Stelle wieder die Anzahl der Buchstaben angegeben und dahinter befinden sich in Vierer-Gruppen die erkannten Bewegungen. “- C i o” bedeutet zum Beispiel ein “o”.

$speech = CCCHelper::stringToArray("21 - C i o I ( i c - C i o o - i i S S i c I ( i c I ( i c I I i u o - i i S S i c I I i u I ( i c I U i c I ( i c - C i c o - i i S S i c - C i o I ( i c S S i c S S i c");
        
for($i = 1; $i < ($speech[0]*4)+1; $i=$i+4){
	$res[] = array_keys($dict, $speech[$i] . " " . $speech[$i+1] . " " . $speech[$i+2] . " " . $speech[$i+3]);
}

Dieser Code sucht bei jeder Vierer-Gruppe nach Vorkommen in den Übersetzungen und schreibt diese in ein Array. Dieses sieht dann so auch:

Array
(
    [0] => Array
        (
            [0] => o
        )

    [1] => Array
        (
            [0] => c
            [1] => d
            [2] => g
            [3] => k
            [4] => n
            [5] => r
            [6] => s
            [7] => y
            [8] => z
        )

    [2] => Array
        (
            [0] => o
        )

    ...

    [20] => Array
        (
            [0] => h
            [1] => j
            [2] => t
            [3] => x
        )

)

Verlangt war diese Buchstaben so auszugeben, dass zuerst die Anzahl der möglichen Übersetzungen und dann die Buchstaben für jede Bewegung angegeben werden. Bei einem Buchstaben, der zum Beispiel entweder “a” oder “i” ist, wird “2 a i” ausgegeben. Diese müssen auch aufsteigend sortiert sein.

foreach($res as $char){
	echo count($char) . " ";
	sort($char);
	foreach($char as $item){
		echo $item . " ";
	}
}

Durch diesen Code habe ich bei jedem Eintrag die Anzahl und die möglichen Buchstaben ausgeben lassen, was zu folgendem Ergebnis führte:

1 o 9 c d g k n r s y z 1 o 2 q w 4 h j t x 9 c d g k n r s y z ...

Level 2

Bei Level 2, das ich leider nicht mehr fertigstellen konnte, was wohl an der schon zunehmenden Erschöpfung lag, mussten aus diesen Buchstaben alle möglichen Kombinationen aus einer ~18000 Wörter langen Wörterbuchdatei ausgegeben werden.

Wer sich selbst an den Beispielen versuchen will, der kann dies hier tun. Catalysts hat auch eine Infografik des Wettbewerbs veröffentlicht:

Ich freue mich schon wieder auf den nächsten Wettbewerb und hoffe, dass ich wieder dabei sein kann!

Entwicklung

async und await in .NET 4.5

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Da ich erst jetzt dazu kam das neue Visual Studio Express 2012 for Desktop zu installieren, nun eine kurze Erklärung der Schlüsselwörter async und await, wie sie im .NET-Framework 4.5 vorkommen.

Bis jetzt musste immer eine Callback-Funktion verwendet werden, wenn man beispielsweise Netzwerkanfragen senden will, um die Benutzeroberfläche nicht einfrieren zu lassen. Mit den beiden Schlüsselwörtern ist es nun endlich möglich auf die Antwort der Anfrage zu warten.

Beispielsweise funktioniert es mit dem folgenden Code einen String asynchron herunterzuladen:

private async String getData(){
	WebClient client = new WebClient();
	return await client.DownloadStringAsync("http://example.org");
}

Mit dem Schlüsselwort async deklariert man die Funktion als asynchron und stellt das Wort await vor die Aktion, auf die gewartet werden soll.

Eigenes Projekt

EAN13-Plugin für jQuery

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Vor ein paar Tagen habe ich eine von mir programmierte Bibliothek für jQuery zur Erstellung von EAN13 Barcodes auf Github veröffentlicht. Mit jQuery.EAN13 ist es möglich aus einer Nummer einen Barcode als HTML5-Canvas zu erstellen.

Barcode

[Demo](http://demo.johannes-mittendorfer.com/jquery-ean13)

Einbindung des Plugin

Zur Einbindung in eine HTML-Seite fügt man folgendes dem head-Bereich nach der Einbindung von jQuery ein:

<script type="text/javascript" src="js/jQuery.EAN13.min.js"></script>

Verwendung

Im body-Bereich muss an der gewünschten Stelle ein Canvas-Element mit der passenden Größe eingefügt werden:

<canvas id="ean" width="200" height="100">
Your browser does not support canvas-elements.
</canvas>

Nun kann man im JavaScript am Ende des body-Bereiches folgendes eintragen, um den Barcode anzuzeigen:

$("#ean").EAN13("9002236311036");

Weitere funktionen sind im Readme auf der Github-Seite des Projektes zu finden.

Security

Wie funktionieren die iOS 6 Maps?

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!

Mit iOS 6 wurde eine neue Kartenapp eingeführt. Diese kommt erstmals ganz ohne Google aus und verwendet jetzt Vektorkarten, die Apple eingekauft hat. Auch diese Daten werden jedoch aus dem Internet nachgeladen.

Screenshots

Eine Anfrage nach einer Kartenkachel sieht zum Beispiel so aus: (Ich habe die IDs gekürzt.)

http://gspa23.ls.apple.com/tile?style=13&size=2&scale=0&v=46&z=14&x=8820&y=5700&lang=de&sid=1628527042778230930310178...&tk=fb6f3cfbfcf47c40b20a44aacb...&mapkey=1348503588_3e8f1cd028503e1be44950cf0...

Ich habe versucht die Parameter richtig einzuordnen:

Parameter Bedeutung
style Art der Karte. Hier ist es “13”. Vergleichbar zu iPhoto-Karten mit dem Style “slideshow”
size Größe der Kachel?
scale Skalierung
v ?
z Zoom
x X-Koordinate. (Große Zahl ?)
y Y-Koordinate
lang Sprache
sid ? (ändert sich nicht)
tk ? (ändert sich)
mapkey Womöglich Hash der Anfrage (Teil nach Unterstrich ändert sich)

Auf solche Anfragen antwortet der Apple-Server mit den Kartendaten mit dem Mimetype x-protobuf. Es handelt sich dabei um das Protocol-Buffers-Format, das von Google entwickelt wurde.

Daten

Bis jetzt noch nicht gelungen diese Daten lesabar zu machen, da es sich um ein binäres Format mit benutzerdefiniertem Aufbau handelt.