แบบฝึกหัด 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 ของส่วนแบ่งที่ต้องการจะซ่อนอยู่ในบันทึก ไฟล์บันทึกจะเข้ารหัสเซิร์ฟเวอร์ที่มาจากเซิร์ฟเวอร์ ดังนี้ ไฟล์บันทึก model_code.google.com มาจากเซิร์ฟเวอร์ code.google.com (เดิมเราจะตั้งชื่อว่าชื่อเซิร์ฟเวอร์เป็นอะไรก็ได้ที่ตามหลังอันล่างอันแรก) ไฟล์บันทึกของ an_code.google.com มีข้อมูลสำหรับ "animal" รูปภาพปริศนา แม้ว่าข้อมูลในไฟล์บันทึกจะมีไวยากรณ์ของเว็บเซิร์ฟเวอร์ 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 ตัวแรกคือที่อยู่ของเบราว์เซอร์ที่ส่งคำขอ ส่วนที่น่าสนใจที่สุดคือ HTTP "GET path" แสดงเส้นทางของคำขอเว็บที่เซิร์ฟเวอร์ได้รับ ตัวเส้นทางเองจะไม่มีช่องว่าง และจะถูกแยกออกจาก GET และ HTTP ด้วยการเว้นวรรค (คำแนะนำนิพจน์ทั่วไป: \S (S) จะตรงกับอักขระที่ไม่ใช่ช่องว่าง) ค้นหาบรรทัดในบันทึกที่มีสตริง "ปริศนา" ปรากฏภายในเส้นทาง โดยจะไม่สนใจบรรทัดอื่นๆ ในบันทึก

ส่วน 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 บรรทัดละ 1 รายการ

$ ./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 - การถอดรหัสส่วนแบ่งรูปภาพ

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

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

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