En el ejercicio Log Puzzle, usarás código de Python para resolver dos acertijos. Este ejercicio utiliza el módulo urllib, como se muestra en la sección Utilidades de Python. Los archivos de este ejercicio están en “logpuzzle” dentro de google-python-exercises (descarga el archivo google-python-exercises.zip, si aún no lo hiciste, consulta Configuración para obtener más detalles). Agrega tu código a “logpuzzle.py”. .
La imagen de un animal se dividió en muchas imágenes angostas de rayas verticales. Las imágenes de franjas están en Internet, en algún lugar, cada una con su propia URL. Las URLs están ocultas en el archivo de registro del servidor web. Tu misión es encontrar las URLs y descargar todas las franjas de imágenes para recrear la imagen original.
Las URL de Slice están ocultas dentro de los archivos de registro de Apache (el servidor web de código abierto apache es el servidor más usado de Internet). Cada archivo de registro proviene de algún servidor, y las URLs de porciones deseadas están ocultas en los registros. El archivo de registro codifica de qué servidor proviene de esta manera: el archivo de registro animal_code.google.com es del servidor code.google.com (formalmente, diremos que el nombre del servidor es el que le sigue a la primera barra inferior). El archivo de registro animal_code.google.com contiene los datos del "animal" imagen del rompecabezas. Aunque los datos en los archivos de registro tienen la sintaxis de un servidor web de Apache real, los datos más allá de lo necesario para el rompecabezas son datos aleatorios de un archivo de registro real.
Así es como se ve una sola línea del archivo de registro (realmente así se ve los archivos de registro de 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"
Los primeros números representan la dirección del navegador solicitante. La parte más interesante es el método "GET path HTTP". que muestra la ruta de una solicitud web que recibió el servidor. La ruta de acceso en sí nunca contiene espacios y está separada de GET y HTTP por espacios (sugerencia de regex: \S (mayúscula S) coincide con cualquier carácter que no sea un espacio). Busca las líneas en el registro donde la string "puzzle" en la ruta, ignorando las demás líneas del registro.
Parte A: Registrar el archivo en las URL
Completa la función read_urls(filename) que extrae las URL de rompecabezas del archivo de registro. Encuentra el "rompecabezas" URL de ruta de acceso en el archivo de registro. Combina la ruta de acceso de cada URL con el nombre del servidor del nombre del archivo para formar una URL completa, p.ej., "http://www.example.com/path/puzzle/from/inside/file". Filtrar las URLs que aparezcan más de una vez La función read_urls() debe devolver la lista de URL completas, ordenadas alfabéticamente y sin duplicados. Si ordenas las URL en orden alfabético, obtendrás las porciones de la imagen en el orden correcto de izquierda a derecha para recrear la imagen original del animal. En el caso más simple, main() solo debería imprimir las URL, una por línea.
$ ./logpuzzle.py animal_code.google.com http://code.google.com/something/puzzle-animal-baaa.jpg http://code.google.com/something/puzzle-animal-baab.jpg ...
Parte B: descarga de acertijos con imágenes
Completa la función download_images(), que toma una lista ordenada de URL y un directorio. Descarga la imagen de cada URL al directorio en cuestión y, si es necesario, crea el directorio primero (consulta el módulo "os" para crear un directorio y "urllib.urlretrieve()" para descargar una URL). Nombra los archivos de imagen locales con un esquema simple, como “img0”, “img1”, “img2”, etcétera. Tal vez desees imprimir un poco "Recuperando..." línea de salida de estado mientras se descarga cada imagen, ya que puede ser lenta y es bueno tener alguna indicación de que el programa está funcionando. Cada imagen es una pequeña porción vertical de la original. ¿Cómo unir las porciones para recrear la original? Se puede resolver sin problemas con un poco de código HTML (no es necesario tener conocimientos de HTML).
La función download_images() también debe crear un archivo index.html en el directorio con una etiqueta *img* para mostrar cada archivo de imagen local. Las etiquetas img deben estar todas en una línea, sin separación. De esta manera, el navegador muestra todas las porciones juntas sin problemas. No necesitas tener conocimientos de HTML para hacerlo. solo crea un archivo index.html que se vea de la siguiente manera:
<html> <body> <img src="img0"><img src="img1"><img src="img2">... </body> </html>
A continuación, te mostramos cómo debería verse cuando puedas descargar el acertijo de animales:
$ ./logpuzzle.py --todir animaldir animal_code.google.com $ ls animaldir img0 img1 img2 img3 img4 img5 img6 img7 img8 img9 index.html
Cuando todo funcione, abrir index.html en un navegador debería revelar la imagen original del animal. ¿Cuál es el animal en la imagen?
Parte C - Descenso de porción de imagen
El segundo incluye la imagen de un lugar muy famoso, pero depende de un orden personalizado. Para el primer acertijo, las URL se pueden ordenar alfabéticamente a fin de ordenar las imágenes correctamente. En el orden, se usa toda la URL. Sin embargo, si la URL termina en el patrón "-wordchars-wordchars.jpg", p.ej., "http://example.com/foo/puzzle/bar-abab-baaa.jpg", la URL debe representarse con la segunda palabra del orden (p.ej., "baaa"). Por lo tanto, ordenar una lista de URL que terminan con el patrón word-word.jpg debería ordenarlas por la segunda palabra.
Amplía tu código para ordenar esas URL correctamente y, luego, deberías poder decodificar el segundo acertijo de place_code.google.com que muestra un lugar famoso. ¿Qué lugar se muestra?
Atribución CC: Las imágenes que se usan en este rompecabezas fueron disponibles por sus propietarios bajo la licencia Atribución 2.5 de Creative Commons, que fomenta generosamente los remixes de contenido como este. La imagen del animal es del usuario zappowbang en flickr y la imagen del lugar es del usuario booleansplit en flickr.