Python-Übung für Logrätsel

Bei der Übung „Logpuzzle“ lösen Sie zwei Rätsel mithilfe von Python-Code. In dieser Übung wird das Modul urllib verwendet, wie im Abschnitt Python-Dienstprogramme gezeigt. Die Dateien für diese Übung befinden sich im Verzeichnis „logpuzzle“ in „google-python-exercises“. Laden Sie die Datei google-python-exercises.zip herunter, falls noch nicht geschehen. Weitere Informationen finden Sie unter Einrichten. Fügen Sie Ihren Code in die Datei „logpuzzle.py“ ein.

Ein Bild eines Tieres wurde in viele schmale vertikale Streifen unterteilt. Die Streifenbilder sind irgendwo im Internet zu finden, jedes mit eigener URL. Die URLs sind in einer Webserverprotokolldatei versteckt. Ihr Ziel ist es, die URLs zu finden und alle Bildstreifen herunterzuladen, um das ursprüngliche Bild nachzubilden.

Die Segment-URLs sind in Apache-Protokolldateien verborgen (der Open-Source-apache-Webserver ist der am häufigsten verwendete Server im Internet). Jede Protokolldatei stammt von einem Server und die gewünschten Segment-URLs sind in den Protokollen versteckt. Die Protokolldatei codiert den Server, von dem sie stammen: Die Protokolldatei „Animal_code.google.com“ stammt vom Server code.google.com. Der Servername ist der Name, der auf den ersten unter dem Balken folgt. Die Protokolldatei „Animal_code.google.com“ enthält die Daten für das Rätselbild „Tier“. Obwohl die Daten in den Protokolldateien die Syntax eines echten Apache-Webservers haben, werden die Daten, die für das Rätsel nicht benötigt werden, zufällig aus einer echten Protokolldatei abgerufen.

So sieht eine einzelne Zeile aus der Protokolldatei aus (so sehen die Apache-Protokolldateien eigentlich aus):

10.254.254.28 - - [06/Aug/2007:00:14:08 -0700] "GET /foo/talks/ HTTP/1.1"
200 5910 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"

Die ersten Zahlen sind die Adresse des anfragenden Browsers. Am interessantesten ist „GET path HTTP“, das den Pfad einer vom Server empfangenen Webanfrage angibt. Der Pfad selbst enthält niemals Leerzeichen und ist durch Leerzeichen von GET und HTTP getrennt. (Regex-Vorschlag: \S (großes S) entspricht allen Zeichen, die keine Leerzeichen sind). Suche die Zeilen im Protokoll, in denen die Zeichenfolge „puzzle“ im Pfad vorkommt, und ignoriere die vielen anderen Zeilen im Protokoll.

Teil A – Protokolldatei unter URLs

Vervollständigen Sie die Funktion read_urls(filename), mit der die Rätsel-URLs aus einer Logdatei extrahiert werden. Suche in der Logdatei nach den Puzzle-Pfad-URLs. Kombinieren Sie den Pfad jeder URL mit dem Servernamen des Dateinamens, um eine vollständige URL zu erstellen, z.B. "http://www.example.com/pfad/puzzle/von/inside/datei". Filtern Sie mehr als einmal angezeigte URLs. Die Funktion read_urls() sollte die Liste vollständiger URLs zurückgeben, die in alphabetischer Reihenfolge sortiert sind und keine Duplikate enthalten. Wenn Sie die URLs in alphabetischer Reihenfolge nehmen, erhalten Sie die Bildausschnitte in der richtigen von links nach rechts geordneten Reihenfolge, um das ursprüngliche Tierbild nachzubilden. Im einfachsten Fall sollte „main()“ nur die URLs ausgeben, eine pro Zeile.

$ ./logpuzzle.py animal_code.google.com
http://code.google.com/something/puzzle-animal-baaa.jpg
http://code.google.com/something/puzzle-animal-baab.jpg
...

Teil B – Bilderpuzzle herunterladen

Vervollständigen Sie die Funktion download_images() , die eine sortierte Liste von URLs und ein Verzeichnis verwendet. Laden Sie das Bild von jeder URL in das angegebene Verzeichnis herunter und erstellen Sie zuerst das Verzeichnis (siehe Modul "os" zum Erstellen eines Verzeichnisses und "urllib.urlretrieve()" zum Herunterladen einer URL). Benennen Sie die lokalen Bilddateien mit einem einfachen Schema wie „img0“, „img1“, „img2“ usw. Möglicherweise empfiehlt es sich, während des Herunterladens der einzelnen Bilder eine kleine Statuszeile mit dem Status "Wird abgerufen" auszudrucken, da dies langsam sein kann und es schön ist, einen Hinweis darauf zu geben, dass das Programm funktioniert. Jedes Bild ist etwas senkrecht vom Original entfernt. Wie füge ich die Segmente zusammen, um das Original neu zu erstellen? Es lässt sich mit ein wenig HTML gut lösen (HTML-Kenntnisse sind nicht erforderlich).

Die Funktion download_images() sollte auch eine index.html-Datei mit einem *img*-Tag im Verzeichnis erstellen, um jede lokale Bilddatei anzuzeigen. Die img -Tags sollten sich alle auf einer Zeile ohne Trennung befinden. Auf diese Weise werden im Browser alle Segmente nahtlos zusammen angezeigt. Hierfür sind keine HTML-Kenntnisse erforderlich. Erstellen Sie einfach eine index.html-Datei, die wie folgt aussieht:

<html>
<body>
<img src="img0"><img src="img1"><img src="img2">...
</body>
</html>

So sollte es aussehen, wenn Sie das Tierpuzzle herunterladen können:

$ ./logpuzzle.py --todir animaldir animal_code.google.com
$ ls animaldir
img0  img1  img2  img3  img4  img5  img6  img7  img8  img9  index.html

Wenn alles funktioniert, sollte beim Öffnen der Datei index.html in einem Browser das ursprüngliche Tierbild angezeigt werden. Was ist das Tier auf dem Bild?

Teil C: Entschlüsseln von Bildausschnitten

Das zweite Rätsel enthält ein Bild eines sehr berühmten Ortes, erfordert jedoch eine benutzerdefinierte Sortierung. Beim ersten Rätsel können die URLs alphabetisch sortiert werden, damit die Bilder richtig angeordnet sind. Beim Sortieren wird die gesamte URL verwendet. Endet die URL jedoch mit dem Muster „-wordchars-wordchars.jpg“, z.B. „http://beispiel.de/foo/puzzle/bar-abab-baaa.jpg“, sollte die URL durch das zweite Wort beim Sortieren dargestellt werden (z.B. „baaa“). Wenn Sie eine Liste von URLs sortieren, die jeweils mit dem Muster „word-word.jpg“ enden, sollten die URLs also nach dem zweiten Wort sortiert werden.

Erweitern Sie Ihren Code, um solche URLs ordnungsgemäß zu ordnen. Dann sollten Sie in der Lage sein, das zweite place_code.google.com-Rätsel zu entschlüsseln, das einen bekannten Ort zeigt. Welcher Ort wird angezeigt?

CC-Quellenangabe: Die in diesem Rätsel verwendeten Bilder wurden von ihren Inhabern unter der Lizenz Creative Commons Attribution 2.5 zur Verfügung gestellt. Dadurch werden Remixe von Inhalten wie diesem großzügig empfohlen. Das Tierbild stammt vom Nutzer-Zappowbang bei Flickr und das Bild für den Ort stammt aus dem booleschen Wert des Nutzers bei Flickr.