Pour l'exercice Log Puzzle, vous utiliserez du code Python pour résoudre deux énigmes. Cet exercice utilise le module urllib, comme indiqué dans la section Utilitaires Python. Les fichiers de cet exercice se trouvent dans le "logpuzzle" dans google-python-exercises (téléchargez le fichier google-python-exercises.zip si ce n'est pas déjà fait, ou consultez Configuration pour plus d'informations). Ajoutez votre code au fichier "logpuzzle.py". .
L'image d'un animal a été divisée en nombreuses images à rayures verticales étroites. Les images à rayures se trouvent sur Internet quelque part, chacune avec sa propre URL. Les URL sont masquées dans un fichier journal de serveur Web. Votre mission consiste à trouver les URL et à télécharger toutes les bandes pour recréer l'image d'origine.
Les URL des tranches sont cachées dans les fichiers journaux Apache (le serveur Web Open Source apache est le serveur le plus utilisé sur Internet). Chaque fichier journal provient d'un serveur et les URL des tranches souhaitées sont masquées dans les journaux. Le fichier journal encode le serveur d'où il provient comme ceci: le fichier journal animal_code.google.com provient du serveur code.google.com (formellement, nous disons que le nom du serveur est celui qui suit la première barre inférieure). Le fichier journal animal_code.google.com contient les données relatives à "animal". l'image du puzzle. Bien que les données des fichiers journaux aient la syntaxe d'un véritable serveur Web Apache, les données au-delà de ce qui sont nécessaires pour le puzzle sont des données aléatoires provenant d'un véritable fichier journal.
Voici à quoi ressemble une ligne unique du fichier journal (voici ce à quoi ressemblent les fichiers journaux Apache):
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"
Les premiers chiffres correspondent à l'adresse du navigateur à l'origine de la demande. La partie la plus intéressante est la requête HTTP "GET path". indiquant le chemin d'une requête Web reçue par le serveur. Le chemin lui-même ne contient jamais d'espaces. Il est séparé de GET et de HTTP par des espaces (la suggestion d'expression régulière: \S (S majuscule) correspond à tout caractère autre que des espaces). Recherchez les lignes dans le journal où la chaîne "puzzle" apparaît à l'intérieur du chemin, ignorant les nombreuses autres lignes du journal.
Partie A : Fichier journal des URL
Complétez la fonction read_urls(filename) qui extrait les URL de puzzle à partir d'un fichier journal. Trouver tous les "énigmes" dans le fichier journal. Combinez le chemin d'accès de chaque URL avec le nom du serveur à partir du nom de fichier pour former une URL complète (par exemple, "http://www.example.com/path/puzzle/from/inside/file". Filtrez les URL qui apparaissent plusieurs fois. La fonction read_urls() doit renvoyer la liste des URL complètes, triées par ordre alphabétique et sans doublons. Si vous prenez les URL par ordre alphabétique, les tranches de l'image seront affichées de gauche à droite afin de recréer l'image d'origine de l'animal. Dans le cas le plus simple, main() devrait simplement imprimer les URL, une par ligne.
$ ./logpuzzle.py animal_code.google.com http://code.google.com/something/puzzle-animal-baaa.jpg http://code.google.com/something/puzzle-animal-baab.jpg ...
Partie B : Jeu de réflexion sur le téléchargement d'images
Complétez la fonction download_images() qui utilise une liste triée d'URL et un répertoire. Téléchargez l'image à partir de chaque URL dans le répertoire donné, en créant d'abord le répertoire si nécessaire (consultez le module "os" pour créer un répertoire et la méthode "urllib.urlretrieve()" pour le téléchargement d'une URL). Nommez les fichiers image locaux en utilisant un schéma simple tel que "img0", "img1", "img2", etc. Vous pouvez imprimer le message "Récupération en cours..." de sortie d'état lors du téléchargement de chaque image, car cela peut être lent et il est bon d'avoir une indication que le programme fonctionne. Chaque image est une petite tranche verticale de l'original. Comment assembler les tranches pour recréer l'original ? Il est possible de résoudre le problème avec un peu de html (aucune connaissance du langage HTML n'est requise).
La fonction download_images() doit également créer un fichier index.html dans le répertoire avec une balise *img* pour afficher chaque fichier image local. Les balises img doivent toutes se trouver sur une ligne, sans séparation. De cette manière, le navigateur affiche toutes les tranches de façon transparente. Vous n'avez pas besoin de connaître le langage HTML pour ce faire. Il vous suffit de créer un fichier index.html qui ressemble à ceci:
<html> <body> <img src="img0"><img src="img1"><img src="img2">... </body> </html>
Voici ce à quoi cela devrait ressembler lorsque vous pourrez télécharger le puzzle sur les animaux:
$ ./logpuzzle.py --todir animaldir animal_code.google.com $ ls animaldir img0 img1 img2 img3 img4 img5 img6 img7 img8 img9 index.html
Lorsque tout fonctionne, ouvrez le fichier index.html dans un navigateur pour afficher l'image d'origine de l'animal. Quel est l'animal sur l'image ?
Partie C – Désembrouillage des tranches d'image
Le deuxième casse-tête comporte l'image d'un lieu très célèbre, mais nécessite un tri personnalisé. Pour le premier puzzle, les URL peuvent être triées par ordre alphabétique afin de classer les images dans le bon ordre. Dans le tri, l'URL complète est utilisée. Toutefois, nous indiquerons que si l'URL se termine par le format "-wordchars-wordchars.jpg". Exemple : "http://example.com/foo/puzzle/bar-abab-baaa.jpg", l'URL doit être représentée par le deuxième mot du tri (par exemple, "baaa"). Ainsi, si vous triez une liste d'URL se terminant par le format word-word.jpg, vous devez classer les URL par le deuxième mot.
Étendez votre code pour ordonner ces URL correctement. Vous devriez alors être en mesure de décoder le deuxième puzzle place_code.google.com, qui montre un lieu célèbre. Quel lieu s'affiche-t-il ?
Paternité CC: les images utilisées dans ce puzzle ont été mises à disposition par leurs propriétaires sous la licence Creative Commons Attribution 2.5, qui encourage généreusement les remix de contenus tels que celui-ci. L'image de l'animal provient de l'utilisateur "zappowbang" sur Flickr, tandis que l'image du lieu provient de la division booléenne de l'utilisateur sur Flickr.