Ghi nhật ký bài tập Python Puzzle

Đối với bài tập Log Puzzle, bạn sẽ sử dụng đoạn mã Python để giải 2 câu đố. Bài tập này sử dụng mô-đun urllib, như minh hoạ trong phần Tiện ích Python. Các tệp của bài tập này nằm trong "logpuzzle" thư mục bên trong google-python-exercises (tải tệp google-python-exercises.zip xuống nếu bạn chưa có, hãy xem phần Thiết lập để biết thông tin chi tiết). Thêm mã của bạn vào tệp "logpuzzle.py" .

Hình ảnh một con vật đã được chia thành nhiều hình ảnh sọc dọc hẹp. Những hình ảnh sọc này nằm ở đâu đó trên Internet, mỗi hình ảnh có URL riêng. Các URL bị ẩn trong tệp nhật ký máy chủ web. Nhiệm vụ của bạn là tìm các URL và tải tất cả sọc trong hình ảnh xuống để tạo lại hình ảnh ban đầu.

Các URL lát cắt được ẩn trong các tệp nhật ký apache (máy chủ web apache nguồn mở là máy chủ được sử dụng rộng rãi nhất trên Internet). Mỗi tệp nhật ký là từ một số máy chủ và các URL lát cắt mong muốn bị ẩn trong nhật ký. Tệp nhật ký mã hoá máy chủ nào xuất phát như sau: tệp nhật ký material.code.google.com đến từ máy chủ code.google.com (chính thức, chúng ta sẽ nói rằng tên máy chủ là bất kỳ tên nào theo sau thanh bên dưới đầu tiên). Tệp nhật ký Animals_code.google.com chứa dữ liệu về "animal" hình ảnh giải đố. Mặc dù dữ liệu trong tệp nhật ký có cú pháp của một máy chủ web apache thực sự, nhưng dữ liệu vượt quá những gì cần thiết cho câu đố là dữ liệu ngẫu nhiên từ một tệp nhật ký thực.

Dưới đây là giao diện của một dòng duy nhất từ tệp nhật ký (đây thực sự là hình thức của tệp nhật ký 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"

Một vài số đầu tiên là địa chỉ của trình duyệt yêu cầu. Phần thú vị nhất là "GET path HTTP" cho thấy đường dẫn của một yêu cầu web mà máy chủ nhận được. Bản thân đường dẫn không bao giờ chứa dấu cách, phân tách với GET và HTTP bằng dấu cách (đề xuất biểu thức chính quy: \S (chữ hoa S) khớp với mọi ký tự không có dấu cách). Tìm các dòng trong nhật ký chứa chuỗi "puzzle" xuất hiện bên trong đường dẫn, bỏ qua nhiều dòng khác trong nhật ký.

Phần A – Ghi nhật ký tệp vào Url

Hoàn tất hàm read_urls(filename) trích xuất các URL của câu đố từ bên trong một tệp nhật ký. Tìm mọi "câu đố" đường dẫn trong tệp nhật ký. Kết hợp đường dẫn của mỗi URL với tên máy chủ trong tên tệp để tạo thành một URL đầy đủ, ví dụ: "http://www.example.com/path/puzzle/from/inside/file". Lọc ra các URL xuất hiện nhiều lần. Hàm read_urls() phải trả về danh sách các URL đầy đủ, được sắp xếp theo thứ tự bảng chữ cái và không có các URL trùng lặp. Việc lấy các url theo thứ tự bảng chữ cái sẽ tạo ra các lát hình ảnh theo đúng thứ tự từ trái sang phải để tạo lại hình ảnh động vật ban đầu. Trong trường hợp đơn giản nhất, main() chỉ nên in các URL, mỗi URL một dòng.

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

Phần B – Tải hình ảnh giải đố xuống

Hoàn tất hàm download_images() để lấy một danh sách URL và thư mục được sắp xếp. Tải hình ảnh từ mỗi url vào thư mục đã cho, trước tiên hãy tạo thư mục nếu cần (xem mô-đun "os" để tạo thư mục và "urllib.urlRetrieve()" để tải xuống url). Đặt tên cho các tệp hình ảnh cục bộ bằng lược đồ đơn giản như "img0", "img1", "img2", v.v. Bạn có thể muốn in một chút "Đang truy xuất..." dòng đầu ra trạng thái trong khi tải xuống từng hình ảnh vì hình ảnh có thể chậm và tốt khi có một số chỉ báo cho biết chương trình đang hoạt động. Mỗi hình ảnh là một lát cắt dọc một chút so với ảnh gốc. Làm cách nào để ghép các phần với nhau để tạo lại bản gốc? Câu hỏi này có thể được giải quyết dễ dàng bằng một ít html (không bắt buộc phải có kiến thức về HTML).

Hàm tải_images() cũng phải tạo tệp chỉ mục.html trong thư mục có thẻ *img* để hiển thị từng tệp hình ảnh cục bộ. Tất cả các thẻ img phải nằm trên một dòng mà không có sự phân tách. Bằng cách này, trình duyệt hiển thị tất cả các lát cắt cùng nhau một cách liền mạch. Bạn không cần phải có kiến thức về HTML để làm việc này; chỉ cần tạo một tệpindex.html có dạng như sau:

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

Sau đây là giao diện của ứng dụng khi bạn có thể tải trò chơi xếp hình động vật xuống:

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

Khi hoàn toàn hoạt động, việc mở http://index.html trong trình duyệt sẽ hiển thị hình ảnh động vật ban đầu. Con vật trong hình ảnh là gì?

Phần C – Mô tả lát cắt hình ảnh

Câu đố thứ hai liên quan đến hình ảnh của một địa điểm rất nổi tiếng, nhưng phụ thuộc vào một số cách sắp xếp tuỳ chỉnh. Đối với câu đố đầu tiên, bạn có thể sắp xếp các URL theo thứ tự bảng chữ cái để sắp xếp hình ảnh chính xác. Trong chế độ sắp xếp, toàn bộ URL sẽ được sử dụng. Tuy nhiên, chúng tôi sẽ nói rằng nếu url kết thúc bằng mẫu "-wordchars-wordchars.jpg", ví dụ: "http://example.com/foo/puzzle/bar-abab-baaa.jpg", thì url phải được đại diện bằng từ thứ hai trong sắp xếp (ví dụ: "baaa"). Vì vậy, việc sắp xếp danh sách các URL, mỗi URL kết thúc bằng mẫu word-word.jpg phải sắp xếp các URL theo từ thứ hai.

Mở rộng mã của bạn để sắp xếp các URL như vậy đúng cách và sau đó bạn sẽ có thể giải mã câu đố thứ hai place_code.google.com hiển thị địa điểm nổi tiếng. Sản phẩm xuất hiện ở địa điểm nào?

Ghi nhận tác giả CC: hình ảnh dùng trong câu đố này do chủ sở hữu của chúng cung cấp theo giấy phép Creative Commons Ghi nhận tác giả 2.5, và rất khuyến khích việc phối lại nội dung tương tự như bản quyền này. Hình ảnh động vật được lấy từ ảnh zappowbang của người dùng tại flickr và hình ảnh địa điểm được lấy từ booleanSplit của người dùng tại flickr.