Latihan Python Teka-Teki Catatan

Untuk latihan Teka-teki Log, Anda akan menggunakan kode Python untuk menyelesaikan dua teka-teki. Latihan ini menggunakan modul urllib, seperti yang ditampilkan di bagian Python Utilitas. File untuk latihan ini ada di "logpuzzle" di dalam google-python-exercises (download google-python-exercises.zip jika belum, lihat Menyiapkan untuk detailnya). Tambahkan kode Anda ke file "logpuzzle.py" .

Gambar hewan telah dipecah menjadi banyak gambar garis vertikal sempit. Gambar garis tersebut ada di internet di suatu tempat, masing-masing dengan URL-nya sendiri. Url disembunyikan di file log server web. Misi Anda adalah menemukan URL dan mengunduh semua setrip gambar untuk membuat ulang gambar aslinya.

Url slice disembunyikan di dalam file log apache (server web apache open source adalah server yang paling banyak digunakan di internet). Setiap file log berasal dari beberapa server, dan URL irisan yang diinginkan disembunyikan dalam log. File log mengenkode server asalnya seperti ini: file log animal_code.google.com berasal dari server code.google.com (sebelumnya, kita akan mengatakan bahwa nama server adalah nama server yang mengikuti garis bawah pertama). File log animal_code.google.com berisi data untuk "animal" gambar teka-teki. Meskipun data dalam file log memiliki sintaksis server web apache yang sebenarnya, data yang melebihi apa yang dibutuhkan untuk teka-teki adalah data acak dari file log sungguhan.

Tampilan satu baris dari file log terlihat seperti berikut (sebenarnya seperti inilah tampilan file log 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"

Beberapa angka pertama adalah alamat browser yang meminta. Bagian yang paling menarik adalah "GET path HTTP" menunjukkan jalur permintaan web yang diterima oleh server. Jalur itu sendiri tidak pernah berisi spasi, dan dipisahkan dari GET dan HTTP dengan spasi (saran ekspresi reguler: \S (huruf besar S) cocok dengan karakter non-spasi apa pun). Temukan baris di log tempat string "puzzle" muncul di dalam jalur, mengabaikan banyak baris lainnya dalam log.

Bagian A - Mencatat File ke URL

Lengkapi fungsi read_urls(filename) yang mengekstrak url {i>puzzle<i} dari dalam {i>logfile<i}. Temukan semua "puzzle" {i>path <i}dalam logfile. Gabungkan jalur dari setiap url dengan nama server dari nama file untuk membentuk url lengkap, misalnya, &quot;http://www.example.com/path/puzzle/from/inside/file&quot;. Saring URL yang muncul lebih dari sekali. Fungsi read_urls() akan menampilkan daftar url lengkap, yang diurutkan sesuai abjad dan tanpa duplikat. Menggunakan URL dalam urutan abjad akan menghasilkan irisan gambar dalam urutan kiri-ke-kanan yang benar untuk membuat ulang gambar hewan asli. Dalam kasus yang paling sederhana, main() seharusnya hanya mencetak URL, satu per baris.

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

Bagian B - Mendownload Puzzle Gambar

Lengkapi fungsi download_images() yang mengambil daftar url dan direktori yang diurutkan. Unduh gambar dari setiap url ke dalam direktori yang diberikan, buat direktori terlebih dulu jika perlu (lihat modul "os" untuk membuat direktori, dan "urllib.url mengambil()" untuk mengunduh url). Beri nama file gambar lokal dengan skema sederhana seperti "img0", "img1", "img2", dan sebagainya. Anda mungkin ingin mencetak sedikit "Mengambil..." baris {i>output<i} status saat mengunduh setiap gambar karena proses tersebut menjadi lambat dan memang bagus bila ada indikasi bahwa program berfungsi. Setiap gambar merupakan irisan vertikal kecil dari gambar aslinya. Bagaimana cara menyatukan irisan untuk membuat ulang yang asli? Ini dapat diselesaikan dengan baik dengan sedikit html (pengetahuan tentang HTML tidak diperlukan).

Fungsi download_images() juga harus membuat file index.html dalam direktori dengan tag *img* untuk menampilkan setiap file gambar lokal. Semua tag img harus berada dalam satu baris tanpa pemisahan. Dengan cara ini, browser menampilkan semua irisan secara bersamaan. Anda tidak perlu pengetahuan tentang HTML untuk melakukan ini; cukup buat file index.html yang terlihat seperti ini:

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

Tampilannya akan terlihat seperti ini ketika kamu bisa mendownload puzzle hewan:

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

Ketika semuanya bekerja, membuka index.html di browser akan menampilkan gambar hewan asli. Hewan apa yang ada dalam gambar?

Bagian C - Menjelaskan Slice Gambar

Teka-teki kedua melibatkan gambar tempat yang sangat terkenal, tetapi tergantung pada beberapa penyortiran khusus. Untuk teka-teki pertama, URL dapat diurutkan menurut abjad untuk mengurutkan gambar dengan benar. Dalam pengurutan, seluruh URL digunakan. Namun, kita akan mengatakan bahwa jika URL diakhiri dengan pola "-wordchars-wordchars.jpg", misalnya "http://example.com/foo/puzzle/bar-abab-baaa.jpg", URL harus diwakili oleh kata kedua dalam pengurutan (misalnya "baaa"). Jadi, mengurutkan daftar URL yang masing-masing diakhiri dengan pola kata-word.jpg harus mengurutkan URL berdasarkan kata kedua.

Memperluas kode Anda untuk mengurutkan url tersebut dengan benar, kemudian Anda akan bisa memecahkan kode teka-teki place_code.google.com kedua yang menunjukkan tempat terkenal. Tempat apa yang ditampilkan?

CC Attribution: gambar yang digunakan dalam teka-teki ini disediakan oleh pemiliknya berdasarkan lisensi Creative Commons Attribution 2.5, yang dengan murah hati mendorong pembuatan remix konten seperti ini. Gambar hewan berasal dari pengguna zappowbang di flickr dan gambar tempat berasal dari boolean pecah dari pengguna di flickr.