Zapisz ćwiczenie w Pythonie

W ćwiczeniach z logami musisz rozwiązywać 2 łamigłówki z użyciem kodu w Pythonie. To ćwiczenie korzysta z modułu urllib, tak jak w sekcji Python Utilities (Narzędzia w języku Python). Pliki do tego ćwiczenia znajdują się w katalogu „logpuzzle” w google-python-exercises (pobierz plik google-python-exercises.zip, jeśli jeszcze go nie masz; szczegółowe informacje znajdziesz w sekcji Konfiguracja). Dodaj kod do pliku „logpuzzle.py”.

Zdjęcie zwierzęcia zostało podzielone na kilka obrazów w wąskie pionowe pasy. Obrazy w paski są gdzieś w internecie, każdy z osobnym adresem URL. Adresy URL są ukryte w pliku dziennika serwera WWW. Twoim zadaniem jest znalezienie adresów URL i pobranie wszystkich pasków obrazu, aby odtworzyć oryginalne zdjęcie.

Adresy URL wycinków są ukryte w plikach dziennika Apache (serwer WWW typu open source apache jest najczęściej używanym serwerem w internecie). Każdy plik dziennika pochodzi z jakiegoś serwera, a odpowiednie adresy URL wycinków są ukryte w dziennikach. Plik dziennika zawiera informacje o tym, z jakiego serwera pochodzi: plik logu zwierzęta_code.google.com pochodzi z serwera code.google.com (formalnie mówimy, że nazwa serwera jest taka, jak na pierwszym pasku poniżej). Plik logu zwierzęta_code.google.com zawiera dane dotyczące obrazu łamigłówki „zwierzę”. Mimo że dane w plikach dzienników mają składnię prawdziwego serwera WWW Apache, dane wykraczające poza zakres niezbędny do rozwiązania łamigłówki to losowe dane z prawdziwego pliku dziennika.

Tak wygląda pojedynczy wiersz w pliku dziennika (tak naprawdę wyglądają pliki dziennika 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"

Kilka pierwszych cyfr to adres przeglądarki, która wysłała żądanie. Najciekawszą częścią jest „GET ścieżka HTTP” wskazująca ścieżkę żądania internetowego odebranego przez serwer. Sama ścieżka nie zawiera spacji i jest oddzielona od żądań GET i HTTP spacjami (sugestia dotycząca wyrażenia regularnego: \S (wielkie S) odpowiada dowolnemu znakowi niebędącemu spacją). Znajdź w dzienniku wiersze, w których znajduje się ciąg znaków „łamigłówka”, ignorując wiele innych wierszy w dzienniku.

Część A – plik dziennika do adresów URL

Wykonaj funkcję read_urls(filename), która wyodrębni adresy URL łamigłówki z pliku dziennika. Znajdź wszystkie adresy URL ścieżek „puzzle” w pliku dziennika. Połącz ścieżkę z każdego adresu URL z nazwą serwera z nazwy pliku, aby utworzyć pełny adres URL, np. „http://www.example.com/sciezka/łamigłówka/z/wewnątrz/pliku”. Filtruj adresy URL, które występują więcej niż raz. Funkcja read_urls() powinna zwracać listę pełnych adresów URL posortowaną w porządku alfabetycznym bez duplikatów. Pobranie adresów URL w kolejności alfabetycznej spowoduje wyświetlenie wycinków obrazu w odpowiedniej kolejności od lewej do prawej, co pozwoli odtworzyć oryginalne zdjęcie zwierzęcia. W najprostszym przypadku funkcja main() powinna po prostu drukować adresy URL, po jednym w wierszu.

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

Część B – pobierz łamigłówkę graficzną

Wykonaj działanie funkcji download_images(), która pobiera posortowaną listę adresów URL i katalog. Pobierz obraz z każdego adresu URL do danego katalogu, w razie potrzeby najpierw utwórz katalog (aby to zrobić, zapoznaj się z modułem „os”, aby utworzyć katalog, lub „urllib.urlretrieve()”, aby pobrać adres URL). Nadaj lokalnym plikom obrazów prosty schemat, np. „img0”, „img1”, „img2” itd. Podczas pobierania każdego obrazu warto wydrukować krótki wiersz stanu „Pobieram...”, ponieważ obraz może działać wolno i miło jest mieć pewną informację, że program działa. Każdy obraz jest małym pionowym wycinkiem oryginału. Jak poskładać te fragmenty, aby odtworzyć oryginał? Można łatwo rozwiązać ten problem za pomocą niewielkiej ilości kodu HTML (nie musisz znać języka HTML).

Funkcja download_images() powinna też utworzyć w katalogu plik index.html z tagiem *img* wskazującym każdy lokalny plik obrazu. Wszystkie tagi img powinny znajdować się w jednym wierszu bez rozdzielania tagów. W ten sposób przeglądarka płynnie wyświetla wszystkie wycinki. Nie musisz znać się na języku HTML – wystarczy utworzyć plik index.html podobny do poniższego:

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

Gdy możesz pobrać łamigłówkę ze zwierzętami:

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

Jeśli wszystko działa, otwórz plik index.html w przeglądarce i wyświetl oryginalne zdjęcie zwierzęcia. Jakie jest zwierzę na obrazku?

Część C – odszyfrowywanie wycinka obrazu

Druga łamigłówka obejmuje zdjęcie bardzo znanego miejsca, ale wymaga odpowiedniego sortowania. W pierwszej łamigłówce adresy URL można posortować alfabetycznie, aby poprawnie uporządkować obrazy. Podczas sortowania używany jest cały adres URL. Trzeba jednak pamiętać, że jeśli URL kończy się wzorcem „-charakterystyka-słowakluczowe.jpg”, np. „http://example.com/foo/puzzle/bar-abab-baaa.jpg”, to adres URL powinien być reprezentowany przez drugie słowo w rodzaju (np. „baaa”). Dlatego sortowanie listy adresów URL kończących się wzorcem słowo-słowo.jpg powinno spowodować uporządkowanie adresów URL według drugiego słowa.

Gdy to zrobisz, powinno być możliwe zdekodowanie drugiej łamigłówki Place_code.google.com pokazującej znane miejsce. W jakim miejscu się wyświetla?

Uznanie autorstwa: obrazy użyte w tej łamigłówce zostały udostępnione przez ich właścicieli na licencji Creative Commons Uznanie autorstwa 2.5, która zdecydowanie zachęca do remiksowania takich treści. Zdjęcie zwierzęcia pochodzi od użytkownika zappowbang w flickr, a obraz miejsca pochodzi z podziału logicznego użytkownika w flickr.