في تمرين لغز Log Puzzle، عليك استخدام رمز Python لحلّ لغزَين. يستخدم هذا التمرين وحدة urllib، كما هو موضح في القسم أدوات Python المساعدة. توجد ملفات هذا التمرين في "logpuzzle" الدليل داخل google-python-exercises (نزِّل google-python-exercises.zip إذا لم يسبق لك إجراء ذلك، راجِع الإعداد للحصول على التفاصيل). أضف التعليمة البرمجية إلى "logpuzzle.py" الملف.
تم تقسيم صورة حيوان إلى العديد من الصور ذات الخطوط العمودية الضيقة. تتوفّر الصور الشريطية في مكان ما على الإنترنت، ولكل منها عنوان URL خاص بها. عناوين URL مخفية في ملف سجلّ خادم الويب. مهمتك هي البحث عن عناوين URL وتنزيل جميع خطوط الصور لإعادة إنشاء الصورة الأصلية.
يتم إخفاء عناوين URL للشرائح داخل ملفات سجلّ apache (خادم الويب apache المفتوح المصدر هو الخادم الأكثر استخدامًا على الإنترنت). يكون كل ملف سجلّ من خادم ما، ويتم إخفاء عناوين URL للشرائح المطلوبة ضمن السجلات. يُشفِّر ملف السجل الخادم الذي تأتي منه على هذا النحو: ملف السجلAnimal_code.google.com من خادم code.google.com (سنقول رسميًا أن اسم الخادم هو ما يلي أول شريط سفلي). يحتوي ملف السجلAnimal_code.google.com على بيانات "animal" صورة لغز واحد. على الرغم من أن البيانات الموجودة في ملفات السجل تحتوي على بناء جملة خادم ويب حقيقي، فإن البيانات تتجاوز ما هو مطلوب للغز بيانات عشوائية من ملف سجل حقيقي.
إليك الشكل الذي يبدو عليه سطر واحد من ملف السجل (هذا في الواقع يبدو على شكل ملفات سجل 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"
الأرقام القليلة الأولى هي عنوان المتصفح الذي يطلب الوصول. الجزء الأكثر إثارة للاهتمام هو "GET path HTTP" يعرض مسار طلب الويب الذي تم استلامه بواسطة الخادم. لا يحتوي المسار نفسه على مسافات أبدًا، ومفصولاً عن GET وHTTP بمسافات (اقتراح التعبير العادي: \S (حرف كبير S) يتطابق مع أي حرف بدون مسافة). ابحث عن السطور التي تتضمّن الكلمة "puzzle" في السجلّ. داخل المسار، متجاهلاً العديد من الأسطر الأخرى في السجل.
الجزء (أ): ملف تسجيل في عناوين URL
أكمل الدالة read_urls(filename) التي تستخرج عناوين URL للغز من داخل ملف السجل. اعثر على كل "الألغاز" للمسار في ملف السجل. ادمج المسار من كل عنوان URL مع اسم الخادم من اسم الملف لإنشاء عنوان URL كامل، على سبيل المثال: "http://www.example.com/path/puzzle/from/inside/file". حجب عناوين URL التي تظهر أكثر من مرة. يجب أن تعرض الدالة read_urls() قائمة عناوين URL الكاملة، مرتبة بترتيب أبجدي وبدون تكرارات. سيؤدي أخذ عناوين 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 إلى الدليل المحدد، مع إنشاء الدليل أولاً إذا لزم الأمر (راجع وحدة "نظام التشغيل" لإنشاء دليل، و"urllib.urlretrieve()" لتنزيل عنوان URL). يجب تسمية ملفات الصور المحلية باستخدام مخطَّط بسيط، مثل "img0" و"img1" و"img2" وما إلى ذلك. قد ترغب في طباعة نص "جارٍ استرداد..." سطر نتائج الحالة أثناء تنزيل كل صورة لأنّها قد تكون بطيئة ومن الجيد الإشارة إلى أنّ البرنامج يعمل بشكل صحيح. كل صورة هي شريحة عمودية صغيرة من الصورة الأصلية. كيف يمكن تجميع الشرائح معًا لإعادة إنشاء الشريحة الأصلية؟ يمكن حل هذه المشكلة بشكل جيد باستخدام القليل من لغة html (لا يلزم الإلمام بـ HTML).
يجب أن تنشئ الدالة download_images() أيضًا ملف index.html في الدليل بعلامة *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 في المتصفح عن صورة الحيوان الأصلية. ما هو الحيوان الذي يظهر في الصورة؟
الجزء (ج): فك ترميز شرائح الصور
يتضمن اللغز الثاني صورة لمكان مشهور جدًا، ولكن يعتمد على بعض الترتيب المخصص. بالنسبة إلى اللغز الأول، يمكن ترتيب عناوين URL أبجديًا لترتيب الصور بشكل صحيح. في عملية الترتيب، يتم استخدام عنوان URL بالكامل. ومع ذلك، سنقول أنه إذا كان عنوان URL ينتهي بالنمط "-wordchars-wordchars.jpg"، على سبيل المثال. "http://example.com/foo/puzzle/bar-amab-baaa.jpg"، يجب أن يتم تمثيل عنوان URL بالكلمة الثانية في الترتيب (مثل "baaa"). لذا فإن فرز قائمة عناوين url التي تنتهي كل منها بنمط word-word.jpg يجب أن يرتب عناوين url حسب الكلمة الثانية.
عليك توسيع نطاق التعليمات البرمجية لترتيب عناوين URL هذه بشكل صحيح، ومن ثم يصبح بإمكانك فك ترميز اللغز الثاني Place_code.google.com الذي يعرض مكانًا مشهورًا. ما المكان الذي يعرضه؟
CC Attribution: تم توفير الصور المستخدمة في هذا اللغز بواسطة مالكيها بموجب ترخيص Creative Commons Attribution 2.5، ما يساعد كثيرًا على إعادة مزج المحتوى مثل هذا المحتوى. صورة الحيوان مأخوذة من zappowbang للمستخدم عند flickr وصورة المكان من عنصر الشريحة المنطقية في flickr.