VisualWorksTutorial1:Page06

From 흡혈양파의 번역工房
Jump to navigation Jump to search

cincom_tutorial_vwlogo
cincom_tutorial_cincomlogo

웹로그 통계 레슨 5
집합(컬렉션)

cincom_tutorial_stlogo

| 목차 | 레슨4 | 레슨6 |
cincom_tutorial_openbook 정확하게 "웹Hit"을 얻기위해서는 먼저 웹서버 로그의 구조에 대해 살짝 이해해둘 필요가 있습니다. 그리고 무엇보다 중요한 것은 "웹Hit"의 의미를 엄밀히 정의하는 것입니다. 다음은 무언가에 IP 어드레스를 격납시켜두면 카운트 할 수 있게 됩니다.
cincom_tutorial_certificate 이 레슨에서는 Set라 불리우는 Collection 클래스(집합)를 소개합니다. Set을 사용하는 이유와, 이 문제에 대해서 어떠한 해결책을 이끌어낼 수 있는가를 설명하겠습니다.
cincom_tutorial_design 다음과 같은 예를 생각해봅시다. 웹사이트에 어떤 사람이 오전 9:00에, 그리고 다시 오후 3:00, 마지막으로 오후 9:00에 Hit(방문)했다고 합시다. 이 경우, 이 사람은 3Hit라고 말 할지도 모릅니다. 혹은 그 사람이 같은 사람이니 1Hit라고 할지도 모릅니다. 이처럼 재방문한 사람을 어떻게 취급하느냐에 따라서 달라집니다. 이 워크샵에서는 재방문한 사람을 “Hit”로 취급하지 않기로 합니다. 그러니 계산은 사이트에 Hit한 서로 다른(유니크) 사람들의 수를 반영하기로 합니다.


다음 문제는 로그파일의 구조입니다. 로그파일을 보면 첫 IP 어드레스(209.67.247.201)는 7회 발생한 것을 알 수 있습니다.(왜냐하면 그 사람은 사이트 안의 7가지 다른 페이지를 방문했기 때문입니다.) 다음 방문자(IP 어드레스 63.21.189.239)는 29회 발생했습니다만, 29회 전부 웹페이지에 들어온 것을 의미하는 것은 아닙니다. 이 파일은 시간순으로 배열되어 있으므로 IP 어드레스 중복이 존재합니다. 이번에는 관계 없지만, 입장자 수는 많은 요인에 의해 변합니다. 주된 문제는 IP 어드레스가 변경된 새(이전) 방문자가 사이트에 Hit했을 경우 발생합니다.


그럼 도전해봅시다. 파일 내용(IP 어드레스)을 순서대로 불러왔을 때, IP 어드레스가 변했다는 것은, 새로운(이전) 방문자가 사이트에 Hit했다는 것을 나타내기에 두 개의 IP를 구분할 필요는 없습니다. 따라서, 파일의 앞부분에서 시작해서(손계산 할 때 처럼) …"로직(사고)"은 다음과 같을 것입니다.


  • 파일에서 첫 IP 어드레스를 취득해서 격납합니다. 카운트가 증가합니다.
  • 이 IP 어드레스와 다를때까지 파일을 계속 불러옵니다.
  • 새로운(변경된) IP 어드레스를 격납합니다. 카운터가 증가합니다.
  • 이 IP 어드레스와 다를때까지 파일을 계속 불러옵니다.
  • 다음 IP 어드레스가 왔을 때, 격납된 IP 어드레스와 비교합니다. 만일 리스트에 없으면 카운터를 증가시킵니다. 만일 있다면 이 IP 어드레스와 다를때까지 파일을 계속 불러옵니다.
  • 파일 끝에 도달할때까지 계속합니다.


여기서는 두 가지 도전이 기다리고 있습니다. 우선 IP 어드레스를 어디에 격납해야 좋을까요? 다음으로는, 새로운 IP 어드레스가 일람에 존재하고 있는지, 어떻게 확인해야 좋을까요?


프로그래밍 경험이 있던 없던, "이러한 작업은 많은 프로그래밍 언어에 있어서 간단하지 않다"는 것은 틀림 없습니다. Smalltalk에서는 비상식적일 정도로 간단합니다. 이런 계산은 몇 번이고 실행되는 작업입니다. 그래서, Smalltalk 창시자들은 일반적으로 반복시키기 위한 "빌트인"기능(언어에 내장)으로 개발하였습니다.


위에 말했듯이 "빌트인"기능은 Collection(컬렉션)이라 불리웁니다. 여기서는 Set이라 불리우는 컬렉션의 하나를 사용합니다. 만일 코드의 동작을 바르게 이해하고 싶으시다면 다음 과정으로 진행하기 전에 Set 입문서를 한 번 읽어보시기를 권합니다.

cincom_tutorial_dominoes.gif 입문서 : Set(셋)
cincom_tutorial_steps 1. 아래 텍스트와 같이 수정 하십시오. 그리고 전부 반전시키고 <오퍼레이트 클릭>후 실행을 선택해주십시오.
| myFile myStream myLine addrIP mySet | 
mySet := Set new. 
myFile := 'ws000101.log' asFilename. 
myStream := myFile readStream. 
[ myStream atEnd ] whileFalse: [ 
myLine := myStream upTo: Character cr. 
addrIP := myLine copyUpTo: $,. 
mySet add: addrIP.]. 
myStream close. 
mySet inspect.

새로운 Inspector 화면이 표시됩니다. 화면 타이틀은 a Set입니다.


2. 그림 5-1에는 Set의 IP 어드레스의 컬렉션이 표시됩니다. 실제로 IP 어드레스의 집합을 확인할 수 있습니다. 그림 5-2에서는 기본탭에서 tally가 선택되어 그 내용을 표시하고 있습니다. tally(이 집합의 단위수)의 값은 93입니다. 이것은 Set(집합), 위와 같은 경우에는 IP 어드레스, 혹은 “Hit”의 유니크한 항목수입니다.

그림 5-1. IP어드레스의 컬렉션(Set)


그림 5-2. 컬렉션의 사이즈(항목수)
cincom_tutorial_lightbulb
기본적으로 이것으로 완성입니다. 이것은 로그파일에서 유니크한 웹Hit를 구하기 위한 9행의 코드였습니다. 친구나 친척중에 프로그래머가 있다면, 그 사람이 좋아하는 언어로 이와 같은 프로그램을 짜게 만들어봅시다. 과연 몇 행에서 위와 같은 결과를 도출해낼 수 있는지 보도록 합시다. 필시 더 많은 행을 필요로 할 것입니다.


우리는 업무상 멋진 프로그램을 짤 수 있는 근성이 있습니다. 더욱이, 이 코드를 더욱 연마해서 멋지게 만들어봅시다. 우선 Inspector 화면이 아닌 다른 것에 결과를 표시하겠습니다. 두 번째로, 다른 로그파일도 그곳에 표시하겠습니다. 특정 로그파일만을 위해서 코드를 짠다면 재미 없겠죠? 그러니 시스템에 있는 어떠한 로그파일이라도 그 “Hit”수를 카운트 할 수 있게 만들겠습니다.

cincom_tutorial_steps 3. 아래 텍스트와 같이 수정해주십시오. 그리고 전부 반전시켜 <오퍼레이트 클릭>실행을 선택해주십시오.
| myFile myStream myLine addrIP mySet | 
mySet := Set new. 
myFile := 'ws000101.log' asFilename. 
myStream := myFile readStream. 
[ myStream atEnd ] whileFalse: [ 
myLine := myStream upTo: Character cr. 
addrIP := myLine copyUpTo: $,. 
mySet add: addrIP.]. 
myStream close. 
Dialog warn: (mySet size printString).

마지막 행을 제외하고 전부 같습니다. 여기서 결과를 표시하기 위해 Dialog 객체(클래스)를 사용합니다. Set 객체에는 size 메시지를 보냅니다. 그러면 Set 객체에 있는 항목수가 돌아옵니다. warn: 메시지는 숫자를 받아들이지 못합니다. 문자열만 받아들입니다. 때문에 문자열로 변환하기 위해 mySet size에서 돌아오는 수치에 printString 메시지를 보냅니다. 이것으로 warn: 메시지가 작동되며, 다이얼로그 박스가 표시됩니다.


4. 아래 텍스트와 같이 수정해주십시오. 그리고 전부 반전시켜 <오퍼레이트 클릭>후 실행을 선택해주십시오.

| myFile myStream myLine addrIP mySet | 
mySet := Set new. 
myFile := (Dialog request: '파일입력' initialAnswer: 'ws000101.log') asFilename. 
myStream := myFile readStream. 
[ myStream atEnd ] whileFalse: [ 
myLine := myStream upTo: Character cr. 
addrIP := myLine copyUpTo: $,. 
mySet add: addrIP.]. 
myStream close. 
Dialog warn: (mySet size printString).

Dialog 객체(리퀘스트)의 새로운 메시지를 배우겠습니다. 이 식에서는 두 개의 콜론이 있습니다. 이 메시지는 두 개의 파라메터를 요구하고 있습니다. Dialog 객체에는 실제 메시지로서 request: initialAnswer:(단순히 "콜론" 메시지를 함께 연결하고 있음)가 보내졌습니다.


그림 5-3. 파일 이름에 대한 프롬프트


그림 5-4. 로그파일에 대한 Hit수
cincom_tutorial_certificate 정리

이 레슨에서는 IP 어드레스를 격납하기 위한 Set 사용방법을 학습했습니다. 이번 학습으로 1개의 파일에서 Hit를 카운트하는 방법을 이해했으니, 다음 워크샵에서는 디렉토리에 있는 모든 파일에 대해서 해보겠습니다. 이것으로 주, 월, 년 단위 Hit수의 통계를 제공할 수 있을겁니다.


아래와 같은 내용을 학습하였습니다

  • Collection의 한 가지인 Set
  • Collection에 항목 추가
  • Collection안에 있는 항목수 카운트

| 목차 | 레슨4 | 레슨6 |