แบบฝึกหัด Python ของ Log Puzzle

สำหรับแบบฝึกหัด Log Puzzle คุณจะใช้โค้ด Python เพื่อไขปริศนา 2 ข้อ แบบฝึกหัดนี้ใช้โมดูล urllib ดังที่แสดงในส่วน Python Utilities ไฟล์สำหรับแบบฝึกหัดนี้จะอยู่ในไดเรกทอรี "logpuzzle" ภายใน google-python-exercises (ดาวน์โหลด google-python-exercises.zip ถ้าคุณยังไม่ได้ดาวน์โหลด โปรดดูรายละเอียดที่ตั้งค่า) เพิ่มโค้ดของคุณลงในไฟล์ "logpuzzle.py"

ภาพสัตว์ถูกแบ่งออกเป็นภาพแถบแนวตั้งแคบๆ หลายภาพ รูปภาพลายแถบอยู่บนอินเทอร์เน็ตที่ใดที่หนึ่ง โดยแต่ละภาพมี URL ของตัวเอง URL จะซ่อนอยู่ในไฟล์บันทึกของเว็บเซิร์ฟเวอร์ ภารกิจของคุณคือการค้นหา URL และดาวน์โหลดแถบรูปภาพทั้งหมดเพื่อสร้างรูปภาพต้นฉบับขึ้นใหม่

URL ของชิ้นส่วนจะซ่อนอยู่ในไฟล์บันทึก apache (เว็บเซิร์ฟเวอร์ apache แบบโอเพนซอร์สเป็นเซิร์ฟเวอร์ที่ใช้กันอย่างแพร่หลายบนอินเทอร์เน็ต) ไฟล์บันทึกแต่ละไฟล์มาจากบางเซิร์ฟเวอร์ และ URL ของสไลซ์ที่ต้องการจะซ่อนอยู่ในบันทึก ไฟล์บันทึกจะเข้ารหัสเซิร์ฟเวอร์ที่จะมาในรูปแบบดังนี้: ไฟล์บันทึก activity_code.google.com มาจากเซิร์ฟเวอร์ code.google.com (เราจะตั้งชื่อว่าชื่อเซิร์ฟเวอร์ตามหลังด้านล่างบาร์แรก) ไฟล์บันทึก activity_code.google.com มีข้อมูลของภาพปริศนา "สัตว์" แม้ว่าข้อมูลในไฟล์บันทึกจะมีไวยากรณ์เหมือนเว็บเซิร์ฟเวอร์ของ apache จริง แต่ข้อมูลที่นอกเหนือจากที่ต้องใช้ในการแก้ปริศนาจะเป็นข้อมูลแบบสุ่มจากไฟล์บันทึกจริง

นี่คือลักษณะของบรรทัดเดียวจากไฟล์บันทึก (นี่คือลักษณะของไฟล์บันทึก 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"

ตัวเลข 2-3 ตัวแรกเป็นที่อยู่ของเบราว์เซอร์ที่ส่งคำขอ ส่วนที่น่าสนใจที่สุดคือ "GET เส้นทาง HTTP" ที่แสดงเส้นทางของคําขอเว็บที่เซิร์ฟเวอร์ได้รับ ตัวเส้นทางเองจะไม่มีการเว้นวรรคและแยกออกจาก GET และ HTTP ด้วยการเว้นวรรค (คำแนะนำนิพจน์ทั่วไป: \S (ตัวพิมพ์ใหญ่ S) จะจับคู่กับอักขระที่ไม่ใช่ช่องว่าง) ค้นหาบรรทัดในบันทึกที่มีสตริง "puzzle" ปรากฏในเส้นทาง โดยไม่สนใจบรรทัดอื่นจำนวนมากในบันทึก

ส่วน A - ไฟล์บันทึกไปยัง URL

ใช้ฟังก์ชัน read_urls(filename) ที่แยก URL ปริศนาจากภายในไฟล์บันทึก ค้นหา URL เส้นทาง "ปริศนา" ทั้งหมดในไฟล์บันทึก รวมเส้นทางจากแต่ละ URL เข้ากับชื่อเซิร์ฟเวอร์จากชื่อไฟล์เพื่อสร้าง URL แบบเต็ม เช่น "http://www.example.com/path/puzzle/from/inside/file" คัด URL ที่ปรากฏมากกว่า 1 ครั้งออก ฟังก์ชัน read_urls() ควรแสดงรายการ URL แบบเต็มโดยเรียงลำดับตามตัวอักษรและไม่มีการทำซ้ำ การเรียงลำดับ URL ตามลำดับตัวอักษรจะทำให้มีชิ้นส่วนรูปภาพในลำดับที่ถูกต้องจากซ้ายไปขวาเพื่อสร้างรูปภาพสัตว์ต้นฉบับใหม่ ในกรณีที่ง่ายที่สุด main() ควรพิมพ์ URL หนึ่ง URL ต่อบรรทัด

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

ส่วน ข - ดาวน์โหลดปริศนารูปภาพ

กรอกฟังก์ชันdownload_images() ซึ่งจะใช้รายการ URL และไดเรกทอรีที่จัดเรียงแล้ว ดาวน์โหลดรูปภาพจากแต่ละ URL ลงในไดเรกทอรีที่ระบุก่อน หากจำเป็น (ดูโมดูล "os" เพื่อสร้างไดเรกทอรี และ "urllib.urlretrieve()" สำหรับดาวน์โหลด URL) ตั้งชื่อไฟล์ภาพในเครื่องด้วยรูปแบบง่ายๆ เช่น "img0", "img1", "img2" เป็นต้น คุณอาจต้องการพิมพ์บรรทัดเอาต์พุตสถานะ "กำลังเรียก..." เล็กๆ ขณะดาวน์โหลดแต่ละภาพ เนื่องจากภาพอาจช้าและเป็นการดีที่จะบอกว่าโปรแกรมกำลังทำงาน รูปภาพแต่ละรูปจะเป็นชิ้นส่วนแนวตั้งเล็กน้อยจากต้นฉบับ วิธีนำส่วนต่างๆ มาเรียงต่อกันเพื่อสร้างต้นฉบับใหม่ เครื่องมือนี้สามารถแก้ไขได้อย่างมีประสิทธิภาพด้วย HTML ขนาดเล็ก (ไม่จำเป็นต้องมีความรู้ HTML)

นอกจากนี้ ฟังก์ชันdownload_images() ควรสร้างไฟล์ index.html ในไดเรกทอรีพร้อมแท็ก *img* เพื่อแสดงไฟล์รูปภาพในเครื่องแต่ละไฟล์ แท็ก img ทั้งหมดควรอยู่ในบรรทัดเดียวกันโดยไม่ต้องแยกกัน วิธีนี้ทำให้เบราว์เซอร์แสดงส่วนต่างๆ ทั้งหมดเข้าด้วยกันอย่างราบรื่น คุณไม่จำเป็นต้องมีความรู้เกี่ยวกับ HTML ในการทำเช่นนี้ เพียงแค่สร้างไฟล์ index.html ที่มีหน้าตาดังนี้

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

เมื่อดาวน์โหลดปริศนาสัตว์ได้จะมีลักษณะดังนี้

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

เมื่อทุกอย่างทำงานได้แล้ว การเปิด index.html ในเบราว์เซอร์ควรจะแสดงภาพสัตว์ต้นฉบับ สัตว์ในภาพคืออะไร

ส่วน C - การถอดรหัสส่วนแบ่งการแสดงผล

ปริศนาที่สองเกี่ยวข้องกับภาพของสถานที่ที่มีชื่อเสียงมาก แต่ต้องอาศัยการจัดเรียงบางอย่างที่กำหนดเอง สำหรับปริศนาข้อแรก สามารถจัดเรียง URL ตามตัวอักษรเพื่อเรียงลำดับภาพได้อย่างถูกต้อง การจัดเรียงจะใช้ URL ทั้งหมด อย่างไรก็ตาม เราจะบอกว่าหาก URL ลงท้ายด้วยรูปแบบ "-wordchars-wordchars.jpg" เช่น "http://example.com/foo/puzzle/bar-abab-baaa.jpg" และ URL ดังกล่าวควรแสดงเป็นคำที่ 2 ในการจัดเรียง (เช่น "baaa") ดังนั้น การจัดเรียงรายการ URL และการลงท้ายด้วยรูปแบบ word-word.jpg ควรเรียงลำดับ URL ตามคำที่สอง

ขยายรหัสของคุณเพื่อจัดลำดับ URL ให้ถูกต้อง จากนั้นคุณควรจะสามารถถอดรหัสปริศนา Place_code.google.com ที่สองซึ่งแสดงสถานที่ที่มีชื่อเสียงได้ สถานที่นี้แสดงที่ไหน

การระบุแหล่งที่มาของ CC: เจ้าของภาพที่ใช้ในปริศนานี้ได้จัดเตรียมไว้ภายใต้ใบอนุญาต Creative Commons Attribution 2.5 ซึ่งส่งเสริมการนำเนื้อหาเหล่านี้มารีมิกซ์มากเกินไป รูปภาพสัตว์มาจากผู้ใช้ zappowbang ใน flickr และรูปภาพสถานที่มาจาก user booleansplit ใน flickr