Log Puzzle alıştırmasında, iki bulmacayı çözmek için Python kodunu kullanacaksınız. Bu alıştırmada, Python Yardımcı Programları bölümünde gösterildiği gibi urllib modülü kullanılmaktadır. Bu alıştırmaya ilişkin dosyalar "logpuzzle" içindedir google-python-exercises içindeki dizin (önceden yapmadıysanız google-python-exercises.zip dosyasını indirin, ayrıntılar için Kurulum bölümüne bakın). Kodunuzu "logpuzzle.py" adresine ekleyin. dosyası olarak kaydedebilirsiniz.
Bir hayvanın resmi, çok sayıda dar dikey şerit resme bölünmüş. Çizgili resimler, her biri kendi URL'sine sahip, İnternet'te bir yerlerde bulunmaktadır. URL'ler, bir web sunucusu günlük dosyasında gizlidir. Göreviniz URL'leri bulup tüm resim şeritlerini indirerek orijinal resmi yeniden oluşturmak.
Dilim URL'leri, apache günlük dosyalarının içinde gizlenir (açık kaynak apache web sunucusu, internette en çok kullanılan sunucudur). Her günlük dosyası bir sunucudan alınır ve istenen dilim URL'leri günlüklerin içinde gizlenir. Günlük dosyası, hangi sunucudan geldiğini şu şekilde kodlar: Anime_code.google.com günlük dosyası, code.google.com sunucusundan alınır (formda, sunucu adının ilk alt çubuktan sonra geldiğini söyleriz). hayvan_code.google.com.tr günlük dosyası, "animal" özelliğine ilişkin verileri içerir. bir resimdir. Günlük dosyalarındaki veriler gerçek bir apache web sunucusunun söz dizimine sahip olsa da bulmaca için gerekli olanların ötesindeki veriler gerçek bir günlük dosyasından rastgele hale getirilmiş verilerdir.
Günlük dosyasındaki tek bir satır aşağıdaki gibi görünür (apache günlük dosyaları gerçekte olduğu gibidir):
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"
İlk birkaç numara, istekte bulunan tarayıcının adresidir. En ilginç bölüm, "GET path HTTP"dir. Sunucu tarafından alınan bir web isteğinin yolunu gösteren. Yolun kendisi hiçbir zaman boşluk içermez ve GET ile HTTP'den boşluklarla ayrılır (normal ifade önerisi: \S (büyük harf S), boşluk olmayan herhangi bir karakterle eşleşir). Günlükte "puzzle" dizesinin olduğu satırları bulun günlükte bulunan diğer birçok satır yok sayılarak yolun içinde görünür.
A Bölümü - Günlük Dosyasının URL'lere Kaydedilmesi
Bir günlük dosyasının içinden bulmaca URL'lerini çıkaran Read_urls(filename) işlevini tamamlayın. Tüm "bulmacaları" bulun path URL'lerini ekleyin. Her URL'nin yolunu, dosya adındaki sunucu adıyla birleştirerek tam bir URL oluşturun, ör. "http://www.example.com/path/puzzle/from/inside/file". Birden fazla görünen URL'leri filtreleyin. Read_urls() işlevi, tam URL'lerin listesini, alfabetik sırada ve yinelemeler olmadan döndürmelidir. URL'ler alfabetik sırayla alındığında, orijinal hayvan resmini yeniden oluşturmak için resim dilimleri doğru soldan sağa sırayla elde edilir. En basit şekilde, main() URL'leri her satıra bir tane gelecek şekilde yazdırmalıdır.
$ ./logpuzzle.py animal_code.google.com http://code.google.com/something/puzzle-animal-baaa.jpg http://code.google.com/something/puzzle-animal-baab.jpg ...
B Bölümü - Resimleri İndirme Bulmacası
URL'lerin ve bir dizinin sıralı bir listesini alan indirin_images() işlevini tamamlayın. Her URL'deki resmi, gerekirse önce dizini oluşturarak belirtilen dizine indirin (dizin oluşturmak için "os" modülüne ve bir URL indirmek için "urllib.urlretrieve()" öğesine bakın). Yerel görsel dosyalarını "img0", "img1", "img2" gibi basit bir şemayla adlandırın. "Alınıyor..." ibaresini yazdırmak isteyebilirsiniz. durum çıkış satırı ekleyin. Her resim, orijinalinden küçük bir dikey kesittir. Dilimleri bir araya getirerek orijinali yeniden oluşturmak için ne yapmalısınız? Bu sorun küçük bir html ile çözülebilir (HTML bilgisi gerekli değildir).
Download_images() işlevi ayrıca dizinde her bir yerel resim dosyasını göstermek için *img* etiketine sahip bir index.html dosyası oluşturmalıdır. Resim etiketlerinin tamamı, birbirinden ayrılmadan tek bir satırda yer almalıdır. Bu şekilde, tarayıcı tüm dilimleri birlikte sorunsuz bir şekilde görüntüler. Bu işlem için HTML bilgisine ihtiyacınız yoktur; şuna benzeyen bir index.html dosyası oluşturun:
<html> <body> <img src="img0"><img src="img1"><img src="img2">... </body> </html>
Hayvan bulmacasını indirdiğinizde aşağıdaki gibi görünür:
$ ./logpuzzle.py --todir animaldir animal_code.google.com $ ls animaldir img0 img1 img2 img3 img4 img5 img6 img7 img8 img9 index.html
Her şey çalıştığında, index.html dosyasını tarayıcıda açmak orijinal hayvan resmini göstermelidir. Resimdeki hayvan ne?
C Bölümü - Resim Dilimi Karmaşıklığını Çözme
İkinci bulmaca çok ünlü bir yerin resmini içeriyor, ancak bazı özel sıralamaya bağlı. İlk bulmacada, resimlerin doğru bir şekilde sıralanması için URL'ler alfabetik olarak sıralanabilir. Sıralamada URL'nin tamamı kullanılır. Bununla birlikte, url "-wordchars-wordchars.jpg" kalıbıyla bitiyorsa (ör. "http://example.com/foo/puzzle/bar-abab-baaa.jpg" URL'sini seçerseniz, url bu sıralamadaki ikinci kelimeyle (ör. "baaa") gösterilmelidir. Bu nedenle, her biri word-word.jpg kalıbıyla biten bir url listesi düzenlediğinizde, URL'ler ikinci kelimeye göre sıralanmalıdır.
Bu tür URL'leri doğru şekilde sıralamak için kodunuzu genişletin. Böylece, ünlü bir yeri gösteren ikinci Place_code.google.com bulmacasının kodunu çözebilirsiniz. Nereyi gösteriyor?
CC Atıf: Bu bulmacada kullanılan resimler, sahipleri tarafından bu tür içeriklerin remikslerini cömertçe teşvik eden Creative Commons Attribution 2.5 lisansı kapsamında sağlanmıştır. Hayvan resmi, flickr'daki kullanıcı zappowbang tarafından, yer resmi ise flickr'daki kullanıcı boole bölümünden alınmıştır.