تمرين بايثون للألغاز لتسجيل الدخول

بالنسبة إلى تمرين ألغاز التسجيل، ستستخدم شفرة بايثون لحل لغزين. يستخدم هذا التمرين وحدة urllib، كما هو موضح في القسم أدوات Python. توجد ملفات هذا التمرين في دليل "logpuzzle" داخل google-python-exercises (قم بتنزيل google-python-exercises.zip إذا لم يكن لديك ملف بالفعل، انظر الإعداد للحصول على التفاصيل). أضف التعليمة البرمجية إلى ملف "logpuzzle.py".

تم تقسيم صورة حيوان إلى عدة صور ذات خطوط عمودية ضيقة. تتوفر صور المخطط على الإنترنت في مكان ما، ولكل منها عنوان URL الخاص بها. يتم إخفاء عناوين URL في ملف سجل خادم الويب. ومهمتك هي العثور على عناوين URL وتنزيل جميع خطوط الصور لإعادة إنشاء الصورة الأصلية.

يتم إخفاء عناوين URL لشرائح الجمهور داخل ملفات سجلّ apache (خادم الويب apache ذي المصدر المفتوح هو الخادم الأكثر استخدامًا على الإنترنت). يكون كل ملف سجل من خادم ما، وتكون عناوين URL للشرائح المطلوبة مخفية ضمن السجلات. يشفّر ملف السجل الخادم الذي يأتي منه على النحو التالي: ملف السجل employee_code.google.com يأتي من خادم code.google.com (ويفترض رسميًا أن اسم الخادم هو ما يتبع أول شريط سفلي). يحتوي ملف سجلAnimal_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"

تشير الأرقام القليلة الأولى إلى عنوان المتصفّح الذي يقدّم الطلب. الجزء الأكثر إثارة للاهتمام هو "GET path HTTP" الذي يعرض مسار طلب الويب الذي يتلقّاه الخادم. لا يحتوي المسار نفسه على أي مسافات، ويتم فصله عن GET وHTTP بمسافات (اقتراح التعبير العادي: \S (الأحرف الكبيرة S) يتطابق مع أي حرف بدون مسافات). ابحث عن الأسطر في السجلّ التي تظهر فيها السلسلة "puzzle" داخل المسار، وتتجاهل الأسطر الأخرى العديدة في السجلّ.

الجزء (أ): تسجيل الملف إلى عناوين URL

أكمِل الدالة read_urls(filename) التي تستخرج عناوين URL للغز من داخل ملف السجل. ابحث عن جميع عناوين URL لمسار "الألغاز" في ملف السجلّ. يمكنك دمج المسار من كل عنوان URL مع اسم الخادم من اسم الملف لإنشاء عنوان URL كامل، مثل "http://www.example.com/path/puzzle/from/inside/file". استبعاد عناوين URL التي تظهر أكثر من مرة يجب أن تعرض الدالة read_urls() قائمة عناوين URL الكاملة، مرتبة بترتيب أبجدي وبدون تكرارات. سيؤدي استخدام عناوين URL بترتيب أبجدي إلى عرض شرائح الصورة بالترتيب الصحيح من اليسار إلى اليمين لإعادة إنشاء صورة الحيوان الأصلية. في أبسط الحالات، يجب أن تطبع main() عناوين 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 في المتصفح إلى الكشف عن صورة الحيوان الأصلية. ما هو الحيوان الذي يظهر في الصورة؟

الجزء (ج) - فك ترميز شريحة الصورة

تتضمن اللغز الثاني صورة لمكان مشهور، ولكنها تعتمد على تصنيف مخصص. بالنسبة إلى اللغز الأول، يمكن ترتيب عناوين URL أبجديًا لترتيب الصور بشكل صحيح. في عملية الترتيب، يتم استخدام عنوان URL بالكامل. ومع ذلك، لنفترض أنه إذا انتهى عنوان URL بالنمط -wordchars-wordchars.jpg"، مثل "http://example.com/foo/puzzle/bar-abab-baaa.jpg"، فيجب تمثيل عنوان URL بالكلمة الثانية في هذا الترتيب (مثل "baaa"). لذا، فإن ترتيب قائمة بعناوين URL التي تنتهي بنمط word-word.jpg يجب أن يرتب عناوين URL حسب الكلمة الثانية.

لذا عليك توسيع نطاق التعليمة البرمجية لترتيب عناوين URL هذه بشكلٍ صحيح، ومن ثم، يجب أن تتمكن من فك ترميز لغز المكان الثاني الذي يشير إلى مكان مشهور. ما هو مكان العرض؟

CC Attribution: أتاح مالكو هذه الصور استخدامهم في هذا اللغز بموجب ترخيص مؤسسة المشاع الإبداعي 2.5 الذي يشجّع الكثير من المحتوى المُعاد مزجه، مثل هذا المحتوى. تم إنشاء صورة الحيوان من قِبل المستخدم zappowbang عند f إعداد الوميض، أمّا صورة المكان فهي من التقسيم المنطقي للمستخدم عند استخدام fickr.