ログパズルの演習では、Python コードを使用して 2 つのパズルを解きます。この演習では、Python ユーティリティ セクションに示されているように urllib モジュールを使用します。この演習用のファイルは「logpuzzle」にあります。google-python-exercises ディレクトリ内にあります(まだ google-python-exercises.zip をダウンロードします。詳細については、設定をご覧ください)。コードを logpuzzle.py に追加します。表示されます。
動物の画像が、縦長のストライプの画像に分割されて表示されています。ストライプの画像はインターネット上のどこかに存在し、それぞれに独自の URL があります。URL はウェブサーバーのログ ファイルでは非表示になります。あなたの任務は、URL を見つけ、すべての画像ストライプをダウンロードして、元の画像を再作成することです。
スライス URL は Apache のログファイル内には隠されています(オープンソースの apache ウェブサーバーは、インターネットで最も広く使用されているサーバーです)。各ログファイルはあるサーバーからのもので、目的のスライス URL はログ内に非表示になっています。ログファイルには、次のように、どのサーバーからのものかがエンコードされています。ログ ファイルは code.google.com サーバーのものです(正式には、サーバー名は最初のアンダーバーに続く任意の名前になります)。Animal_code.google.com ログファイルには「animal」のデータが含まれているパズルの画像。ログファイルのデータには実際の Apache ウェブサーバーの構文が含まれていますが、パズルに必要なデータ以上のデータは、実際のログファイルからランダムに抽出されたものです。
ログファイルの 1 行は次のようになります(実際の 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」がある行を見つけます。ログ内の他の多くの行は無視されます。
パート A - URL へのログファイル
ログファイルの中からパズルの URL を抽出する read_urls(filename) 関数を完成させます。すべての「パズル」を見つけるパスの URL を特定します。各 URL のパスとファイル名のサーバー名とを組み合わせて完全な URL を作成します(例:"http://www.example.com/path/puzzle/from/inside/file".重複して表示される URL は除外します。read_urls() 関数は、重複のない完全な URL のリストをアルファベット順に並べ替えて返します。アルファベット順で URL を取得すると、画像のスライスが正しい順序(左から右)になり、元の動物の画像が再作成されます。最も単純なケースでは、main() は URL を 1 行に 1 つずつ出力するだけです。
$ ./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() 関数を完成させます。この関数は、URL とディレクトリの並べ替え済みリストを受け取ります。各 URL から指定のディレクトリに画像をダウンロードし、必要に応じて最初にディレクトリを作成します(ディレクトリを作成するには「os」モジュールを、URL をダウンロードする場合は「urllib.urlretrieve()」を参照)。ローカル画像ファイルには、「img0」、「img1」、「img2」などの単純なスキームで名前を付けます。「取得中...」という文字列を少し出力すると、各イメージのダウンロード中にステータス出力行を出力する方法を学習します。各画像は、元の画像を縦に少しだけスライスしたものです。スライスを組み合わせてオリジナルを再作成する方法は?これは、少しの HTML でうまく解決できます(HTML の知識は必要ありません)。
また、download_images() 関数は、各ローカル画像ファイルを表示するために、*img* タグの付いた index.html ファイルをディレクトリに作成する必要もあります。img タグはすべて、区切らずに 1 行にまとめてください。このようにして、ブラウザはすべてのスライスをシームレスに表示します。これを行うために 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 - 画像スライスのスクランブル解除
2 つ目のパズルには、有名な場所の画像が用いられていますが、なんらかのカスタム並べ替え機能が使用されています。最初のパズルでは、URL をアルファベット順に並べ替えて、画像を正しい順番に並べることができます。並べ替えでは URL 全体が使用されます。ただし、URL が「-wordchars-wordchars.jpg」というパターンで終わるとします。例:「http://example.com/foo/puzzle/bar-abab-baaa.jpg」と指定すると、URL は並べ替えの 2 番目の単語で表す必要があります(例: 「baaa」)。そのため、word-word.jpg パターンで終わる URL のリストを並べ替えると、2 番目の単語で URL を並べ替える必要があります。
このような URL を適切に並べ替えるようにコードを拡張すると、有名な場所を示す 2 つ目の place_code.google.com パズルをデコードできるようになります。表示される場所
CC 帰属表示: このパズルで使用されている画像は、クリエイティブ・コモンズの表示 2.5 ライセンスの下で所有者から提供されています。このライセンスでは、このようなコンテンツのリミックスを奨励しています。動物の画像は Fickr でのユーザー zappowbang からの、場所の画像は Flick のユーザーによるブール値分割からのものです。