Clojure Cup 2014 (Luduverse)
TL;DR:
Die Bildergalerie auf Ludum Dare ist extrem groß und unübersichtlich. Mit einer besseren Darstellung und einer guten Suchfunktion wären die Spiele viel zugänglicher und einfacher zu finden. Dieses Problem wollte ich beim Clojure Cup 2014 lösen. Leider reichte die Zeitvorgabe von 48 Stunden nicht aus, um ein stabiles Ergebnis zu liefern. Dennoch ist durch dieses Projekt eine nützliche Bibliothek entstanden. Sollte ich Zeit finden das Projekt abzuschließen, habe ich bereits alle Daten.
Das Projekte bestand aus drei Teilen: Der Scraper, der den Content von der Ludum Dare Webseite herunterlädt und aufbereitet, die Such-Engine mit entsprechendem Index und das Web-UI, über das die Daten zugänglich gemacht werden.
Scraping
Die Ludum Dare Webseite ist ein Wordpress mit angepasstem Theme und Bildergallerie-Plugin. Der HTML-Code ist extrem chaotisch, doch es gibt ein gewisses Muster, über das die entsprechenden Attribute gefunden werden können. Der Scraper arbeitet in mehreren Schritten: Zuerst werden die einzelnen Gallerie-Seiten geladen, von dort aus werden die einzelnen Profil-Seiten der Spiele geladen. Diese Links werden dann in eine Datenbank geschrieben und parallel abgearbeitet. Jede Profilseite wird geladen, die relevanten Informationen entnommen (Titel, Autor usw.), sowie die Links zu den Bildern gespeichert. Die Bild-Links werden separat heruntergeladen und alle auf eine einheitliche Größe gebracht und in drei unterschiedlichen Größen gespeichert (quadratisches Thumbnail, kleines Bild und großes Bild). Alle gewonnen Informationen werden in einer Datenbank gespeichert. Der Scraping-Prozess kann jederzeit unterbrochen und wiederaufgenommen werden. So konnte ich die Datengewinnung rund um die Uhr laufen lassen und bei Gelegenheit unterbrechen.
Such-Engine
Für die Suche habe ich Elastisch verwendet (eine Bibliothek für Elastic Search). Hierbei wird ein Index angelegt, der den kompletten Inhalt der Datenbank enthält. Über die Query-DSL können dann Suchanfragen gestartet werden. Die Clojure Bibliothek macht dies extrem einfach, so dass dieser Teil relativ schnell erledigt war. Natürlich lässt sich in den Such-Index noch mehr Energie stecken (Stemming, mehrere Sprachen, Synonyme, ...), doch für meine Zwecke genügte so.
Web-UI
Die Weboberfläche kam leider etwas zu kurz, deshalb ist dieses Projekt auch nicht komplett fertig geworden. Ich habe begonnen mit der genialen Bibliothek Enlive und Compojure das Frontend zu bauen. Clojure ist mit Ring extrem flexibel, aber auch extrem vielfältig. Es gibt nicht den einen Weg wie man es aus anderen Programmiersprachen kennt (Ruby/Rails, PHP/Symfony, Python/Django). Es gibt auch kein Framework in diesem Sinne. Man ist dazu angehalten, die für das Projekt benötigten Komponenten nach Belieben zusammenzustecken. Es gibt zwar Luminus, doch dies ist nur eine Ansammlung an Bibliotheken und einer Getting started
-Dokumentation. Zudem möchte man in Clojure-World seine Komponenten selbst zusammenstellen. Deshalb macht es die Auswahl recht schwierig, da es so viele verschiedene Bibliotheken gibt.
Wenn ich Zeit finde, werde ich dieses Projekt noch zuende führen.