تمرین پایتون پازل لاگ

برای تمرین Log Puzzle، از کد پایتون برای حل دو پازل استفاده خواهید کرد. این تمرین از ماژول urllib استفاده می کند، همانطور که در بخش Python Utilities نشان داده شده است. فایل‌های این تمرین در دایرکتوری "logpuzzle" در داخل google-python-exercises قرار دارند (اگر قبلاً google-python-exercises.zip را دانلود نکرده‌اید، برای جزئیات بیشتر به تنظیمات مراجعه کنید). کد خود را به فایل "logpuzzle.py" اضافه کنید.

تصویر یک حیوان به بسیاری از تصاویر راه راه عمودی باریک شکسته شده است. تصاویر راه راه در جایی در اینترنت هستند که هر کدام آدرس اینترنتی خاص خود را دارند. آدرس ها در یک فایل گزارش وب سرور پنهان می شوند. ماموریت شما این است که URL ها را پیدا کنید و تمام نوارهای تصویر را دانلود کنید تا تصویر اصلی را دوباره ایجاد کنید.

آدرس های برش در فایل های لاگ آپاچی پنهان می شوند (وب سرور آپاچی منبع باز پرکاربردترین سرور در اینترنت است). هر فایل log از برخی سرورها است و آدرس های برش مورد نظر در لاگ ها پنهان می شوند. فایل log کد سروری را که از آن می آید را به این صورت رمزگذاری می کند: فایل گزارش animal_code.google.com از سرور code.google.com است (به طور رسمی، ما می گوییم که نام سرور همان چیزی است که از زیر نوار اول می آید). فایل گزارش animal_code.google.com حاوی داده‌های تصویر پازل "حیوان" است. اگرچه داده‌های موجود در فایل‌های گزارش، نحوی شبیه یک وب سرور آپاچی واقعی دارند، داده‌های فراتر از آنچه برای پازل مورد نیاز است، داده‌های تصادفی‌شده از یک فایل لاگ واقعی است.

در اینجا یک خط منفرد از فایل log به نظر می رسد (در واقع این چیزی است که فایل های لاگ آپاچی به نظر می رسد):

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 جدا می‌شود (پیشنهاد regex: \S (حروف بزرگ S) با هر علامت غیرفضایی مطابقت دارد). خطوطی را در گزارش پیدا کنید که در آن رشته "پازل" در داخل مسیر ظاهر می شود، بدون توجه به بسیاری از خطوط دیگر در گزارش.

بخش A - ورود فایل به آدرس

تابع read_urls (نام فایل) را تکمیل کنید که آدرس های پازل را از داخل یک logfile استخراج می کند. همه url های مسیر "پازل" را در فایل لاگ پیدا کنید. مسیر هر url را با نام سرور از نام فایل ترکیب کنید تا یک URL کامل تشکیل دهید، به عنوان مثال "http://www.example.com/path/puzzle/from/inside/file". url هایی را که بیش از یک بار ظاهر می شوند، غربال کنید. تابع ()read_urls باید فهرستی از آدرس‌های کامل را که به ترتیب حروف الفبا و بدون تکرار مرتب شده‌اند، برگرداند. با گرفتن url ها به ترتیب حروف الفبا، برش های تصویر به ترتیب درست از چپ به راست ایجاد می شود تا تصویر حیوان اصلی دوباره ایجاد شود. در ساده ترین حالت، 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
...

قسمت ب - دانلود پازل تصاویر

تابع 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 - Descrambling برش تصویر

پازل دوم شامل تصویری از یک مکان بسیار معروف است، اما به مرتب‌سازی سفارشی بستگی دارد. برای اولین پازل، آدرس ها را می توان بر اساس حروف الفبا مرتب کرد تا تصاویر به درستی مرتب شوند. در مرتب سازی، از کل URL استفاده می شود. با این حال، ما می گوییم که اگر نشانی اینترنتی به الگوی "- wordchars - wordchars .jpg" ختم شود، به عنوان مثال، "http://example.com/foo/puzzle/bar-abab-baaa.jpg"، پس آدرس اینترنتی باید با کلمه دوم در مرتب سازی نشان داده شود (به عنوان مثال "baaa"). بنابراین مرتب‌سازی فهرستی از آدرس‌های اینترنتی که هر کدام با الگوی word-word.jpg ختم می‌شوند، باید آدرس‌ها را بر اساس کلمه دوم مرتب کنیم.

کد خود را گسترش دهید تا چنین آدرس های اینترنتی را به درستی سفارش دهید، و سپس باید بتوانید دومین پازل place_code.google.com را که مکان معروفی را نشان می دهد رمزگشایی کنید. چه مکانی را نشان می دهد؟

CC Attribution: تصاویر استفاده شده در این پازل توسط صاحبان آن‌ها تحت مجوز Creative Commons Attribution 2.5 در دسترس قرار گرفته‌اند که سخاوتمندانه ریمیکس‌های محتوایی مانند این مورد را تشویق می‌کند. تصویر حیوان از کاربر zappowbang در فلیکر و تصویر مکان از کاربر booleanssplit در فلیکر است.