Kütük Bulmacası Python Alıştırması

Log Puzzle alıştırmasında iki bulmacayı çözmek için Python kodu 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ırmanın dosyaları google-python-exercises içindeki "logpuzzle" dizinindedir (daha önce yapmadıysanız google-python-exercises.zip dosyasını indirin, ayrıntılar için Kurulum'a bakın). Kodunuzu "logpuzzle.py" dosyasına ekleyin.

Bir hayvan resmi, dikey şeritli çok sayıda dar resme bölündü. Çizgili resimler internette bir yerlerde ve her birinin kendi URL'sinde bulunuyor. URL'ler bir web sunucusu günlük dosyasında gizlenir. Göreviniz URL'leri bulmak ve tüm resim şeritlerini indirerek orijinal görseli yeniden oluşturmak.

Dilim url'leri apache günlük dosyalarının içinde gizlenir (açık kaynaklı apache web sunucusu, internette en yaygın olarak kullanılan sunucudur). Her günlük dosyası bir sunucudan gelir ve istenen dilim url'leri günlüklerin içinde gizlenmiştir. Günlük dosyası hangi sunucudan geldiğini şu şekilde kodlar: hayvan_kodu.google.com günlük dosyası, code.google.com sunucusundan alınır (resmi olarak, sunucu adının ilk alt çubuğu izleyen ad olduğunu belirtiriz). hayvan_kodu.google.com günlük dosyası, "hayvan" bulmaca resmine ait verileri içerir. Günlük dosyalarındaki veriler gerçek bir Apache web sunucusunun söz dizimine sahip olsa da, bulmaca için gerekenlerin ötesinde veriler gerçek bir günlük dosyasından rastgele hale getirilmiş verilerdir.

Günlük dosyasındaki tek bir satır şu şekilde görünür (Apache günlük dosyaları tam olarak bu şekilde görünür):

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ç kısmı, sunucu tarafından alınan bir web isteğinin yolunu gösteren "GET path HTTP'dir. Yolun kendisi hiçbir zaman boşluk içermez ve GET ve 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ükteki diğer birçok satırı göz ardı ederek, günlükte "bulmaca" dizesinin yolun içinde göründüğü satırları bulun.

A Bölümü - Günlük Dosyası URL'lere

Bir günlük dosyasının içinden bulmaca URL'lerini çıkaran read_urls(filename) işlevini tamamlayın. Günlük dosyasındaki tüm "bulmaca" yol URL'lerini bulun. Her URL'deki yolu, dosya adındaki sunucu adıyla birleştirerek tam URL oluşturun.Ör. "http://www.example.com/yol/bulmaca/from/inside/file". Birden fazla görünen URL'leri filtreleyin. read_urls() işlevi, alfabetik sırada ve yinelemeleri olmadan tam URL'lerin listesini döndürmelidir. URL'ler alfabetik olarak sıralandığında, resim dilimleri, orijinal hayvan resmini yeniden oluşturmak için soldan sağa doğru doğru sırayla sıralayacaktır. En basit durumda, main() yalnızca url'leri her satırda bir tane olacak ş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ü - Resim İndirme Bulmacası

URL'lerin sıralı listesini ve bir dizini alan download_images() işlevini tamamlayın. Gerekirse önce dizini oluşturarak her URL'deki resmi belirtilen dizine indirin (bir dizin oluşturmak için "os" modülüne ve bir URL indirmek için "urllib.urlretrieve()" bölümüne bakın). Yerel resim dosyalarını "img0", "img1", "img2" gibi basit bir şemayla adlandırın. Resimler indirilirken "Alınıyor..." durum çıkış satırını yazdırmanız gerekebilir. Çünkü her resim yavaş olabilir ve programın çalıştığına dair bazı belirtiler göstermeniz yararlı olabilir. Her resim, orijinalinden küçük bir dikey dilimdir. Orijinali yeniden oluşturmak için dilimler nasıl birleştirilir? Bu sorun küçük bir html ile güzelce çözülebilir (HTML bilgisi gerekli değildir).

download_images() işlevi, her bir yerel resim dosyasını göstermek için dizinde bir *img* etiketiyle birlikte bir index.html dosyası da oluşturmalıdır. img etiketlerinin tamamı ayrılmaksızın, tek bir satırda yer almalıdır. Bu şekilde, tarayıcı tüm dilimleri sorunsuz bir şekilde birlikte görüntüler. Bu işlemi gerçekleştirmek için HTML bilgisine sahip olmanız gerekmez. Bunun için aşağıdaki gibi bir index.html dosyası oluşturmanız yeterlidir:

<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 işe yaradığında, index.html dosyasını bir tarayıcıda açmak orijinal hayvan resmini gösterir. Resimdeki hayvan ne?

C Bölümü - Resim Dilimi Çözme

İkinci bulmaca çok meşhur bir yerin resmini içeriyor, ancak bazı özel sıralamalara bağlı. İlk bulmacada URL'ler, resimlerin doğru bir şekilde sıralanması için alfabetik olarak sıralanabilir. Sıralamada, URL'nin tamamı kullanılır. Ancak, URL "-wordchars-wordchars.jpg " şeklinde bitiyorsa (ör. "http://example.com/foo/puzzle/bar-abab-baaa.jpg"), bu URL'nin ilgili ikinci kelimeyle (ör. "baaa") gösterilmesi gerektiğini belirtiriz. Dolayısıyla, her biri word-word.jpg kalıbıyla biten bir url listesi sıralandığında, URL'ler ikinci kelimeye göre sıralanmalıdır.

Bu tür URL'leri düzgün bir şekilde sıralamak için kodunuzu genişletin. Sonrasında, ünlü bir yeri gösteren ikinci yer_kodu.google.com bulmacasının kodunu çözebilmeniz gerekir. Ne yeri gösterir?

CC Atıfı: Bu bulmacada kullanılan resimler, sahipleri tarafından Creative Commons Atıf 2.5 lisansı kapsamında kullanıma sunulmuştur. Bu lisans, bu tür içeriklerin remikslenmesini cömertçe teşvik eder. Hayvan resmi, flickr'daki zappowbang adlı kullanıcıdan, yer resmi ise flickr'daki kullanıcının boolesplit'inden alınmıştır.