로그 퍼즐 연습에서는 Python 코드를 사용하여 두 가지 퍼즐을 해결합니다. 이 연습에서는 Python 유틸리티 섹션에 표시된 대로 urllib 모듈을 사용합니다. 이 연습을 위한 파일은 'logpuzzle' google-python-exercises 내 디렉토리로 이동합니다 (아직 다운로드하지 않은 경우 google-python-exercises.zip을 다운로드하고 자세한 내용은 설정을 참고하세요). 'logpuzzle.py'에 코드 추가 파일에서 참조됩니다.
동물 이미지가 여러 개의 좁은 세로 줄무늬 이미지로 나누어져 있습니다. 줄무늬 이미지는 인터넷 어딘가에 있으며 고유한 URL이 있습니다. URL은 웹 서버 로그 파일에 숨겨져 있습니다. 여러분의 임무는 URL을 찾고 모든 이미지 줄무늬를 다운로드하여 원본 이미지를 다시 만드는 것입니다.
슬라이스 URL은 Apache 로그 파일 내에 숨겨져 있습니다 (오픈소스 apache 웹 서버는 인터넷에서 가장 널리 사용되는 서버입니다). 각 로그 파일은 일부 서버에서 생성되며, 원하는 슬라이스 URL은 로그 내에 숨겨져 있습니다. 로그 파일은 다음과 같이 소스 서버를 인코딩합니다. 로그 파일 game_code.google.com은 code.google.com 서버에서 가져옵니다 (일반적으로는 첫 번째 언더바 다음에 오는 서버 이름이라고 함). 동물 코드.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' 문자열이 있는 줄을 찾습니다. 경로 안에 표시되며 로그의 다른 많은 줄을 무시합니다.
파트 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을 한 줄에 하나씩 출력합니다.
$ ./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 - 이미지 퍼즐 다운로드
정렬된 URL 및 디렉터리 목록을 가져오는 download_images() 함수를 완료합니다. 각 URL의 이미지를 주어진 디렉터리로 다운로드하여 필요한 경우 먼저 디렉터리를 생성합니다. 디렉터리를 만들려면 'os' 모듈을, URL을 다운로드하려면 'urllib.urlretrieve()'를 참고하세요. 'img0', 'img1', 'img2' 등 간단한 스키마를 사용하여 로컬 이미지 파일의 이름을 지정합니다. 간단한 '검색 중...' 각 이미지를 다운로드하는 동안 상태 출력 라인이 느릴 수 있고 프로그램이 작동 중임을 나타내는 표시가 있으면 좋습니다. 각 이미지는 원본에서 약간 세로로 떨어져 있습니다. 슬라이스를 합쳐 원본을 다시 만드는 방법 약간의 html로 문제를 해결할 수 있습니다 (HTML 지식이 필요하지 않음).
또한 download_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 - 이미지 슬라이스 디스크램블링
두 번째 퍼즐에는 매우 유명한 장소의 이미지가 포함되어 있지만 일부 사용자 지정 정렬에 따라 달라집니다. 첫 번째 퍼즐에서는 이미지를 알파벳순으로 정렬하여 이미지를 정확하게 정렬할 수 있습니다. 이 정렬에는 전체 URL이 사용됩니다. 그러나 URL이 '-wordchars-wordchars.jpg' 패턴으로 끝나는 경우에는 'http://example.com/foo/puzzle/bar-abab-baaa.jpg'이면 URL은 정렬 시 두 번째 단어로 표현되어야 합니다 (예: 'baaa'). 따라서 word-word.jpg 패턴으로 각각 끝나는 URL 목록을 정렬하면 두 번째 단어를 기준으로 URL을 정렬해야 합니다.
이러한 URL의 순서를 올바르게 지정하도록 코드를 확장하면 유명한 장소를 표시하는 두 번째 place_code.google.com 퍼즐을 디코딩할 수 있습니다. 어떤 장소가 표시되나요?
CC 저작자 표시: 이 퍼즐에 사용된 이미지는 소유자가 크리에이티브 커먼즈 저작자 표시 2.5 라이선스에 따라 제공한 것이며, 이 라이선스는 이와 같은 콘텐츠의 리믹스를 적극적으로 권장합니다. 동물 이미지는 flickr의 사용자 zappowbang에서 가져온 것이며 장소 이미지는 flickr의 사용자 booleansplit에서 가져옵니다.