लॉग पहेली एक्सरसाइज़ के लिए, आपको दो पहेलियों को हल करने के लिए Python कोड का इस्तेमाल करना होगा. यह एक्सरसाइज़, urllib मॉड्यूल का इस्तेमाल करती है, जैसा कि Python Utilities सेक्शन में दिखाया गया है. इस एक्सरसाइज़ की फ़ाइलें google-python-व्यास में "logpuzzle" निर्देशिका में हैं (अगर आपके पास पहले से google-python-exercises.zip डाउनलोड नहीं है, तो ज़्यादा जानकारी के लिए सेट अप करें देखें). "logpuzzle.py" फ़ाइल में अपना कोड जोड़ें.
जानवर की इमेज को कई छोटी वर्टिकल स्ट्राइप वाली इमेज में तोड़ा गया है. स्ट्राइप इमेज कहीं इंटरनेट पर मौजूद हैं और हर इमेज का अपना यूआरएल है. यूआरएल, वेब सर्वर की लॉग फ़ाइल में छिपे होते हैं. आपका मिशन, मूल इमेज को फिर से बनाने के लिए, यूआरएल ढूंढना और सभी इमेज स्ट्राइप डाउनलोड करना है.
स्लाइस यूआरएल, Apache लॉग फ़ाइलों में छिपे होते हैं (ओपन सोर्स apache वेब सर्वर, इंटरनेट पर सबसे ज़्यादा इस्तेमाल किया जाने वाला सर्वर होता है). हर लॉग फ़ाइल किसी सर्वर से होती है और मनचाहे स्लाइस यूआरएल, लॉग में छिपे होते हैं. लॉग फ़ाइल इस तरह के सर्वर को कोड में बदलती है कि यह किस सर्वर से आती है: लॉग फ़ाइलAnimal_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 पाथ एचटीटीपी" सबसे दिलचस्प हिस्सा है. यह सर्वर को मिले वेब अनुरोध का पाथ दिखाता है. पाथ में कभी भी स्पेस नहीं होता है. साथ ही, इसे GET और एचटीटीपी से स्पेस से अलग किया जाता है (रेगुलर एक्सप्रेशन का सुझाव: \S (अपर केस S), बिना स्पेस वाले किसी भी वर्ण से मेल खाता है. लॉग की उस जगह पर लाइनें ढूंढें जहां पाथ में स्ट्रिंग "पज़ल" दिखती है. हालांकि, लॉग की कई अन्य लाइनों को अनदेखा कर दिया जाता है.
भाग A - यूआरएल को लॉग फ़ाइल करें
Read_urls(filename) फ़ंक्शन को पूरा करें, जो लॉगफ़ाइल के अंदर से पहेली के यूआरएल को एक्सट्रैक्ट करता है. लॉगफ़ाइल में सभी "पज़ल" पाथ यूआरएल ढूंढें. हर यूआरएल के पाथ को फ़ाइल नाम के सर्वर नाम के साथ जोड़कर, पूरा यूआरएल बनाएं. जैसे, "http://www.example.com/path/puzzle/from/inside/file". एक से ज़्यादा बार दिखने वाले यूआरएल को स्क्रीन से हटा दें. Read_urls() फ़ंक्शन को, पूरे यूआरएल की सूची देनी चाहिए. यह लिस्ट, वर्णमाला के क्रम में और डुप्लीकेट के बिना होनी चाहिए. वर्णमाला के क्रम में यूआरएल लेने पर, जानवर की मूल इमेज फिर से बनाने के लिए, इमेज के स्लाइस सही से बाएं से दाएं सही क्रम में मिलेंगे. सबसे सामान्य स्थिति में, men() को सिर्फ़ यूआरएल प्रिंट करना चाहिए, एक लाइन में एक.
$ ./logpuzzle.py animal_code.google.com http://code.google.com/something/puzzle-animal-baaa.jpg http://code.google.com/something/puzzle-animal-baab.jpg ...
पार्ट B - इमेज से जुड़ी पहेली डाउनलोड करें
डाउनलोड_images() फ़ंक्शन को पूरा करें, जो यूआरएल की क्रम से लगाई गई सूची और एक डायरेक्ट्री लेता है. हर यूआरएल से इमेज डाउनलोड करके उसे डायरेक्ट्री में डाउनलोड करें. अगर ज़रूरी हो, तो पहले डायरेक्ट्री बनाएं. डायरेक्ट्री बनाने के लिए "os" मॉड्यूल देखें और यूआरएल डाउनलोड करने के लिए "urllib.urlretrieve()" देखें. लोकल इमेज फ़ाइलों को आसानी से नाम दें. जैसे, "img0", "img1", "img2" वगैरह. हर इमेज को डाउनलोड करते समय, "वापस लाया जा रहा है..." स्थिति वाली आउटपुट लाइन को प्रिंट किया जा सकता है. हालांकि, यह धीमा हो सकता है. इसलिए, यह अच्छी बात है कि प्रोग्राम काम कर रहा है. हर इमेज, ओरिजनल इमेज का थोड़ा वर्टिकल स्लाइस है. मूल आइटम को फिर से बनाने के लिए स्लाइस को एक साथ कैसे रखें? इसे थोड़े से एचटीएमएल से अच्छी तरह हल किया जा सकता है (एचटीएमएल की जानकारी की ज़रूरत नहीं है).
डाउनलोड_images() फ़ंक्शन को हर लोकल इमेज फ़ाइल दिखाने के लिए, *img* टैग के साथ डायरेक्ट्री में एक 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 को खोलने से आपको जानवर की मूल इमेज दिखनी चाहिए. इमेज में दिख रहा जानवर कौनसा है?
पार्ट C - इमेज स्लाइस को विस्तार से बताना
दूसरी पहेली में किसी मशहूर जगह की इमेज शामिल की गई है, लेकिन उसे अपने हिसाब से क्रम में लगाने का फ़ैसला लिया गया है. पहली पहेली में इमेज को सही क्रम में लगाने के लिए, यूआरएल को वर्णमाला के क्रम में लगाया जा सकता है. क्रम से लगाने में, पूरे यूआरएल का इस्तेमाल किया गया है. हालांकि, अगर यूआरएल "-wordchars-wordchars.jpg" पैटर्न से खत्म होता है, जैसे कि "http://example.com/foo/puzzle/bar-abab-baaa.jpg", तो यूआरएल को क्रम में सेकंड शब्द से दिखाया जाना चाहिए (जैसे कि "baaa"). इसलिए, यूआरएल की एक सूची को Word-word.jpg पैटर्न के साथ क्रम में लगाने से, यूआरएल को दूसरे शब्द के हिसाब से क्रम में लगाया जाना चाहिए.
इस तरह के यूआरएल को ठीक से क्रम में लगाने के लिए, अपने कोड को बढ़ाएं. इसके बाद, किसी मशहूर जगह को दिखाने वाली दूसरी play_code.google.com पहेली को डिकोड किया जा सकेगा. यह कौनसी जगह दिखाता है?
सीसी एट्रिब्यूशन: इस पहेली में इस्तेमाल की गई इमेज, उनके मालिकों ने क्रिएटिव कॉमंस एट्रिब्यूशन 2.5 लाइसेंस के तहत उपलब्ध कराई थी. इसके तहत, इस तरह के कॉन्टेंट को रीमिक्स करने के लिए बढ़ावा दिया जाता है. जानवर की इमेज, फ़्लिकर पर zappow बंग के उपयोगकर्ता से ली गई है और जगह की इमेज, फ़्लिकर पर उपयोगकर्ता बूलियनस्प्लिट से ली गई है.