Aby rozwiązać 2 łamigłówki, użyj kodu Pythona. W tym ćwiczeniu używany jest moduł urllib widoczny w sekcji Narzędzia w Pythonie. Pliki do tego ćwiczenia znajdują się w „logpuzzle” w katalogu google-python-exercises (pobierz plik google-python-exercises.zip, jeśli jeszcze go nie masz, w sekcji Konfiguracja dowiesz się więcej). Dodaj swój kod do pliku „logpuzzle.py”. .
Zdjęcie zwierzęcia zostało podzielone na kilka wąskich pionowych pasów. Pasujące obrazy są gdzieś w internecie, a każdy z nich ma własny adres 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ć oryginalny obraz.
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 wybrane adresy URL wycinków są ukryte w dziennikach. W pliku dziennika znajduje się kod serwera, z którego pochodzi dane: plik dziennika zwierzęta_code.google.com pochodzi z serwera code.google.com (oficjalny nazwa serwera będzie widoczna po pierwszym pasku poniżej). Plik logu zwierząt_code.google.com zawiera dane dotyczące słowa „animal” obraz układanki. Chociaż dane w plikach dziennika mają składnię prawdziwego serwera WWW Apache, oprócz danych potrzebnych do rozwiązania łamigłówki są losowe dane z prawdziwych plików dziennika.
Tak wygląda pojedynczy wiersz z pliku dziennika (w rzeczywistości pliki dziennika Apache to tak):
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. Najciekawszym elementem jest metoda „GET path HTTP” na którym widać ścieżkę żądania internetowego odebranego przez serwer. Sama ścieżka nie zawiera spacji i jest oddzielona spacjami od metod GET i HTTP (sugestia wyrażenia regularnego: \S (wielkie S) pasuje do wszelkich znaków bez spacji). Znajdź w dzienniku wiersze, w których znajduje się ciąg „łamigłówka” jest wyświetlany wewnątrz ścieżki, ignorując wiele innych wierszy z dziennika.
Część A – plik dziennika do adresów URL
Wykonaj funkcję read_urls(filename), która wyodrębnia adresy URL łamigłówki z pliku logu. Znajdź wszystkie łamigłówki ścieżki w pliku dziennika. Połącz ścieżkę każdego adresu URL z nazwą serwera z nazwy pliku, aby utworzyć pełny adres URL, np. "http://www.example.com/path/puzzle/from/inside/file". Filtruj adresy URL, które występują więcej niż raz. Funkcja read_urls() powinna zwrócić listę pełnych adresów URL posortowanych w kolejności alfabetycznej i bez duplikatów. Jeśli wpiszesz adresy URL w kolejności alfabetycznej, wycinki zdjęć zostaną wyświetlone w prawidłowej kolejności od lewej do prawej, co pozwoli odtworzyć oryginalne zdjęcie zwierzęcia. W najprostszym przypadku funkcja main() powinna po prostu wyświetlać 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 – łamigłówka do pobrania obrazów
Wykonaj funkcję download_images(), która pobiera posortowaną listę adresów URL i katalog. Pobierz do danego katalogu obraz z każdego adresu URL, w razie potrzeby najpierw utwórz katalog (skorzystaj z modułu „os” do utworzenia katalogu i „urllib.urlretrieve()”, aby pobrać adres URL). Nazwij lokalne pliki obrazów prostym schematem, np. „img0”, „img1”, „img2” itp. Możesz wydrukować tekst „Pobieram...”. stanu podczas pobierania każdego obrazu, ponieważ może on działać wolno i dobrze mieć informację, że program działa. Każdy obraz to mały pionowy wycinek oryginału. Jak połączyć wycinki, aby odtworzyć oryginał? Można ją łatwo rozwiązać przy użyciu odrobiny kodu HTML (nie wymaga znajomości języka HTML).
Funkcja download_images() powinna też utworzyć w katalogu plik index.html z tagiem *img*, aby pokazywać każdy lokalny plik graficzny. Wszystkie tagi img powinny znajdować się w jednym wierszu, bez rozdzielania. Dzięki temu przeglądarka płynnie wyświetla wszystkie wycinki. Nie musisz znać kodu HTML, aby to zrobić. utwórz plik index.html podobny do tego:
<html> <body> <img src="img0"><img src="img1"><img src="img2">... </body> </html>
Oto jak powinno wyglądać możliwość pobrania łamigłówki 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
Kiedy wszystko będzie już działać, po otwarciu pliku index.html w przeglądarce powinno wyświetlić się oryginalne zdjęcie zwierzęcia. Jakie jest zwierzę na zdjęciu?
Część C – usuwanie zakodowania wycinka obrazu
Druga łamigłówka wymaga zdjęcia bardzo znanego miejsca, ale zależy to od niestandardowej kolejności. W pierwszej kolejności adresy URL można sortować alfabetycznie, aby poprawnie uporządkować obrazy. Przy sortowaniu używany jest cały adres URL. Załóżmy jednak, że jeśli adres URL kończy się ciągiem „-znaki słowne-znaki słowne.jpg”, np. „http://example.com/foo/puzzle/bar-abab-baaa.jpg”, adres URL powinien być reprezentowany przez drugie słowo w kolejności (np. „baaa”). Posortowanie listy adresów URL, z których każdy kończy się wzorcem word-word.jpg, powinno uporządkować adresy według drugiego wyrazu.
Rozbuduj kod, aby odpowiednio ułożyć takie adresy URL. Powinno być możliwe odkodowanie drugiej łamigłówki place_code.google.com, która pokazuje znane miejsce. Gdzie się wyświetla?
Uznanie autorstwa: użyte w tej łamigłówce obrazy zostały udostępnione przez ich właścicieli na licencji Creative Commons Attribution 2.5, co zachęcamy do tworzenia remiksów, takich jak ten. Zdjęcie zwierzęcia pochodzi od użytkownika zappowbang w flickr, a zdjęcie miejsca pochodzi z pola podziału użytkownika we flickr.