लॉग पहेली Python व्यायाम

लॉग पहेली व्यायाम के लिए, आपको दो पहेलियां सुलझाने के लिए Python कोड का इस्तेमाल करना होगा. यह एक्सरसाइज़, urllib मॉड्यूल का इस्तेमाल करता है, जैसा कि Python Utilities सेक्शन में दिखाया गया है. इस कसरत की फ़ाइलें "लॉगपज़ल" में हैं डायरेक्ट्री, google-python-exercises में सेव की जाती है (अगर आपने पहले से ऐसा नहीं किया है, तो google-python-exercises.zip डाउनलोड करें, ज़्यादा जानकारी के लिए सेट अप देखें). "logpuzzle.py" में अपना कोड जोड़ें फ़ाइल से लिए जाते हैं.

किसी जानवर की इमेज को कई छोटी वर्टिकल स्ट्राइप इमेज में बांटा गया है. धारीदार इमेज इंटरनेट पर कहीं न कहीं मौजूद हैं और हर एक का अपना यूआरएल है. यूआरएल, वेब सर्वर लॉग फ़ाइल में छिपे होते हैं. आपका मिशन, ओरिजनल इमेज को फिर से बनाने के लिए यूआरएल ढूंढना और इमेज के सभी स्ट्रिप डाउनलोड करना है.

स्लाइस यूआरएल, apache लॉग फ़ाइलों में छिपे रहते हैं (इंटरनेट पर सबसे ज़्यादा इस्तेमाल किया जाने वाला ओपन सोर्स apache वेब सर्वर). हर लॉग फ़ाइल कुछ सर्वर से होती है और मनचाहे स्लाइस यूआरएल, लॉग में छिपे रहते हैं. लॉग फ़ाइल इस तरह से आने वाले सर्वर को कोड में बदल देती है: लॉग फ़ाइलAnimal_code.google.com, code.google.com के सर्वर से होता है (आम तौर पर, हम पहले अंडरबार के बाद जो भी सर्वर देंगे उसका नाम लिखेंगे). Animal_code.google.com की लॉग फ़ाइल में "जानवर" का डेटा होता है पज़ल इमेज. हालांकि लॉग फ़ाइलों के डेटा का सिंटैक्स असली अपाचे वेब सर्वर जैसा होता है, लेकिन इस पहेली के लिए जिस डेटा की ज़रूरत होती है उससे ज़्यादा डेटा, किसी असली लॉग फ़ाइल से बिना किसी क्रम के मिलने वाला डेटा होता है.

यहां देखें कि लॉग फ़ाइल में मौजूद एक लाइन कैसी दिखती है (वास्तव में अपाचे लॉग फ़ाइलें कुछ इस तरह दिखती हैं):

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 एचटीटीपी" सबसे दिलचस्प हिस्सा है जो सर्वर को मिले वेब अनुरोध का पाथ दिखाता है. पाथ में कभी स्पेस नहीं होता. इसे जीईटी और एचटीटीपी से स्पेस की मदद से अलग किया जाता है (रेगुलर एक्सप्रेशन सुझाव: \S (अपर केस S) बिना स्पेस वाले वर्ण से मेल खाता है). लॉग में वे लाइनें ढूंढें जहां स्ट्रिंग "पज़ल" है लॉग में कई अन्य पंक्तियों को अनदेखा करते हुए, पाथ के अंदर दिखाई देता है.

पार्ट A - यूआरएल पर लॉग फ़ाइल

Read_urls(filename) फ़ंक्शन को पूरा करें जो लॉग फ़ाइल के अंदर से पज़ल यूआरएल को एक्सट्रैक्ट करता है. सभी "पज़ल" ढूंढें लॉगफ़ाइल में पाथ यूआरएल शामिल करें. हर यूआरएल के पाथ को फ़ाइल नाम के सर्वर के नाम के साथ जोड़ें, ताकि वह एक पूरा यूआरएल बना सके, जैसे कि "http://www.example.com/path/puzzle/from/inside/file". एक से ज़्यादा बार दिखने वाले यूआरएल को हटाएं. Read_urls() फ़ंक्शन को, यूआरएल की पूरी सूची दिखानी चाहिए. इसे वर्णमाला के क्रम में रखा जाता है और डुप्लीकेट यूआरएल के बिना ऐसा किया जाता है. वर्णमाला के क्रम में यूआरएल लेने पर, इमेज के स्लाइस, बाएं से दाएं के क्रम में मिलेंगे. इससे जानवर की मूल इमेज फिर से बनाई जा सकेगी. सबसे आसान मामले में, Main() को हर लाइन में सिर्फ़ एक यूआरएल प्रिंट करना चाहिए.

$ ./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 - इमेज पहेली डाउनलोड करें

download_images() फ़ंक्शन को पूरा करें. यह फ़ंक्शन, यूआरएल की क्रम से लगाई गई सूची और एक डायरेक्ट्री लेता है. ज़रूरी होने पर पहले डायरेक्ट्री बनाते हुए, हर यूआरएल से दी गई डायरेक्ट्री में इमेज डाउनलोड करें (डायरेक्ट्री बनाने के लिए "os" मॉड्यूल देखें और यूआरएल डाउनलोड करने के लिए "urllib.urlretrieve()" देखें). लोकल इमेज फ़ाइलों को "img0", "img1", "img2" जैसी सामान्य स्कीम के नाम दें. आप चाहें तो थोड़ा "वापस हासिल किया जा रहा है..." प्रिंट कर सकते है स्टेटस आउटपुट लाइन होती है, क्योंकि इमेज धीमी हो सकती है. साथ ही, इस बात का संकेत देना अच्छी बात है कि प्रोग्राम काम कर रहा है. हर इमेज, ओरिजनल इमेज से थोड़ा वर्टिकल स्लाइस होती है. मूल वीडियो को फिर से बनाने के लिए, इन टुकड़ों को एक साथ कैसे रखें? इसे एक छोटे-छोटे html की मदद से अच्छी तरह से हल किया जा सकता है (HTML के बारे में जानने की ज़रूरत नहीं है).

हर लोकल इमेज फ़ाइल को दिखाने के लिए, download_images() फ़ंक्शन को *img* टैग के साथ डायरेक्ट्री में एक index.html फ़ाइल भी बनानी चाहिए. सभी img टैग को एक ही लाइन में रखा जाना चाहिए और उन्हें अलग-अलग नहीं किया जाना चाहिए. इस तरह से, ब्राउज़र सभी स्लाइस को बिना किसी रुकावट के दिखाता है. ऐसा करने के लिए आपको एचटीएमएल की जानकारी होना ज़रूरी नहीं है; बस एक 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-aबाबा-baaa.jpg" का इस्तेमाल करते हैं, तो यूआरएल को क्रम में दूसरे शब्द से दिखाया जाना चाहिए (जैसे कि "baaa"). इसलिए, शब्द-word.jpg पैटर्न के साथ खत्म होने वाले यूआरएल की सूची को क्रम में लगाने के लिए, यूआरएल को दूसरे शब्द के हिसाब से क्रम में लगाना चाहिए.

इस तरह के यूआरएल को सही तरह से क्रम में लगाने के लिए अपने कोड को बढ़ाएं. इसके बाद, आप दूसरीplace_code.google.com पहेली को डिकोड कर पाएंगे, जिसमें किसी मशहूर जगह के बारे में बताया गया है. यह कौनसी जगह दिखाता है?

CC एट्रिब्यूशन: इस पहेली में इस्तेमाल की गई इमेज को उनके मालिकों ने क्रिएटिव कॉमंस एट्रिब्यूशन 2.5 लाइसेंस के तहत उपलब्ध कराया था. इसके लाइसेंस के तहत, इस तरह के कॉन्टेंट को रीमिक्स करने के लिए लोगों को जागरूक किया जाता है. जानवर की इमेज फ़्लिकर पर उपयोगकर्ता ज़ैपोबैंग से है और जगह की इमेज फ़्लिकर पर उपयोगकर्ता के बूलियनस्प्लिट से ली गई है.