Esercizio Python per il puzzle dei log

Per l'esercizio Log rompicapo, utilizzerai codice Python per risolvere due rompicapi. Questo esercizio utilizza il modulo urllib, come mostrato nella sezione Utilità di Python. I file per questo esercizio si trovano nella directory "logpuzzle" all'interno di google-python-exercises (scarica il file google-python-exercises.zip, se non l'hai ancora fatto, vedi Configurazione per i dettagli). Aggiungi il tuo codice al file "logpuzzle.py".

L'immagine di un animale è stata suddivisa in tante immagini strette a strisce verticali. Le immagini a strisce si trovano su Internet da qualche parte, ciascuna con il proprio URL. Gli URL vengono nascosti in un file di log del server web. La tua missione è trovare gli URL e scaricare tutte le strisce delle immagini per ricreare l'immagine originale.

Gli URL delle sezioni sono nascosti all'interno dei file di log di Apache (il server web open source apache è il server più diffuso su Internet). Ogni file di log proviene da un server e gli URL delle sezioni desiderati sono nascosti all'interno dei log. Il file di log codifica il server da cui proviene, come segue: il file di log animal_code.google.com proviene dal server code.google.com (formalmente, diremo che il nome del server è quello che segue il primo underbar). Il file di log animal_code.google.com contiene i dati relativi all'immagine del puzzle "animal". Sebbene i dati nei file di log abbiano la sintassi di un server web Apache reale, i dati oltre a quelli necessari per il puzzle sono dati randomizzati da un vero file di log.

Ecco l'aspetto di una singola riga del file di log (è davvero l'aspetto dei file di log di 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"

I primi numeri corrispondono all'indirizzo del browser che effettua la richiesta. La parte più interessante è "GET path HTTP" che mostra il percorso di una richiesta web ricevuta dal server. Il percorso stesso non contiene mai spazi ed è separato da GET e HTTP da spazi (suggerimento regex: \S (S maiuscola) corrisponde a qualsiasi carattere che non sia lo spazio). Individua le linee nel log in cui compare la stringa "puzzle" all'interno del percorso, ignorando le tante altre righe presenti nel log.

Parte A - Registra file negli URL

Completa la funzione read_urls(filename) che estrae gli URL del puzzle dall'interno di un file di log. Trova tutti gli URL dei percorsi per i "rompicapi" nel file di log. Combina il percorso di ogni URL con il nome del server del nome del file per formare un URL completo, ad esempio "http://www.example.com/path/puzzle/from/inside/file". Escludi gli URL che vengono visualizzati più di una volta. La funzione read_urls() dovrebbe restituire l'elenco degli URL completi, ordinati in ordine alfabetico e senza duplicati. Se gli URL sono in ordine alfabetico, le sezioni dell'immagine verranno visualizzate nell'ordine corretto da sinistra a destra per ricreare l'immagine originale dell'animale. Nel caso più semplice, main() dovrebbe semplicemente stampare gli URL, uno per riga.

$ ./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 - Download del puzzle di immagini

Completa la funzione download_images() che prende un elenco ordinato di URL e una directory. Scarica l'immagine da ciascun URL nella directory fornita, creando prima la directory se necessario (vedi il modulo "os" per creare una directory e "urllib.urlretrieve()" per scaricare un URL). Assegna un nome ai file immagine locali con uno schema semplice come "img0", "img1", "img2" e così via. Potresti voler stampare una piccola riga di output dello stato "Recupero..." durante il download di ogni immagine, poiché l'operazione può essere lenta ed è utile avere un'indicazione che il programma sta funzionando. Ogni immagine è una piccola sezione verticale rispetto all'originale. Come unire le sezioni per ricreare l'originale? Può essere risolto bene con un po' di codice HTML (non è richiesta la conoscenza del linguaggio HTML).

La funzione download_images() deve inoltre creare un file index.html nella directory con un tag *img* per visualizzare ciascun file immagine locale. I tag img devono trovarsi tutti su un'unica riga senza separare. In questo modo, il browser visualizza tutte le sezioni senza problemi. Non è necessaria alcuna conoscenza del codice HTML per eseguire questa operazione; è sufficiente creare un file index.html simile al seguente:

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

Ecco l'aspetto che dovrebbe avere quando puoi scaricare il puzzle degli animali:

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

Se tutto funziona, l'apertura di index.html in un browser dovrebbe mostrare l'immagine originale dell'animale. Qual è l'animale nell'immagine?

Parte C - Descrambling delle sezioni dell'immagine

Il secondo rompicapo prevede l'immagine di un luogo molto famoso, ma dipende da un ordinamento personalizzato. Per il primo rompicapo, gli URL possono essere in ordine alfabetico in modo da rendere le immagini corrette. Nell'ordinamento viene utilizzato l'intero URL. Tuttavia, se l'URL termina con il pattern "-wordchars-wordchars.jpg", ad es. "http://example.com/foo/puzzle/bar-abab-baaa.jpg", l'URL deve essere rappresentato dalla seconda parola dell'ordinamento (ad es. "baaa"). Di conseguenza, ordinando un elenco di URL che terminano ogni con il pattern parola-parola.jpg, gli URL devono essere ordinati in base alla seconda parola.

Se estendi il codice per ordinare questi URL correttamente, dovresti riuscire a decodificare il secondo puzzle di place_code.google.com che mostra un luogo famoso. Quale luogo viene mostrato?

Attribuzione CC: le immagini utilizzate in questo rompicapo sono state messe a disposizione dai rispettivi proprietari ai sensi della licenza Creative Commons Attribution 2.5, che incoraggia generosamente a remixare i contenuti come questo. L'immagine dell'animale proviene dall'utente zappowbang a flickr e l'immagine del luogo proviene dall'utente booleansplit at flickr.