1. VisualWorks 메인 런쳐 화면에서 툴바의 네 번째 버튼을 클릭하거나, 브라우저>>시스템 메뉴를 선택해주십시오.
2. 패키지 창(맨 왼쪽)에서 XML패키지까지 일람을 스크롤해주십시오. 그리고 WebLogStats 패키지를 반전(선택)해주십시오.
만일 WebLogStats 패키지를 찾지 못한 경우에는 파일인할 필요가 있습니다. 이 레슨에서는 앞서 레슨에서 행했던 작업을 VisualWorks 개발환경에 로드할 필요가 있습니다.
3. getLogFiles 메서드를 다음과 같이 바꿔주십시오.
getLogFiles
| workingDir contents xFound logFiles |
logFiles := Set new.
workingDir := logDirectory asFilename.
contents := workingDir directoryContents.
contents do: [ :each |
xFound := each findString: filter startingAt: 1.
xFound = 1
ifTrue: [ logFiles add: each. ] ].
^logFiles.
4. <오퍼레이트 클릭>후 억셉트를 선택해주십시오.
변경 이유는 매우 간단합니다. 오리지날 getLogFiles와 getLogFilesForPageCounts 메서드를 비교하면, 기본적으로는 같은 일을 합니다. 차이점은, Hit 계산에서 사용되는가, 페이지 카운트의 통계에서 사용되는가입니다. 이것은 여분의 코드이며, 좋은 것이 아닙니다. 메서드를 실행하는 지시가 실제로는 하나의 메서드가 아닌 것은 왜 일까요-getLogFile? 위의 코드가 그것을 하고 있습니다. 필터에 의해 디렉토리에 있는 파일을 모아 Set 객체에 격납합니다. 이로서 재사용 가능한 메서드가 되었습니다. 메서드가 다른 메서드를 잘 이해할 필요는 없습니다.
재사용 가능 개념에 대해 요약할 필요는 없겠지요. 얼마나 많은 사람이 이 사이트에 방문했는지, 로그파일을 검색하는 다른 루틴이 필요하다는 가정을 합니다. 그 경우, getLogFiles 메서드나 getLogFilesForPageCounts 메서드의 클론을 작성했던 것 처럼, showHit나 showPageCounts 어느쪽인가를 참조하고있는 행을 변경하여, getDutationTimes와 같은 무언가로 치환합니다. 여기서 문제가 발생합니다. 웹마스터가 로그파일을 복수의 디렉토리에 보존하기로 결정했다고 가정(의논 목적으로)합니다. 그리고, 이로인해 세 개의 메서드 변경을 강요받습니다. 위에서 논한 작업을 하기 위한 메서드 코딩을 하나의 메서드를 변경하는 것으로 끝내려 합니다.
마지막 주의 : 필터에 일치하지만 로그파일이 아닌 파일을 읽어들이는 문제를 피하기 위해서 xFound의 조건을 "0보다 큰"에서 0과 동일한으로 변경합니다. 조건은 1의 위치에서 ws00문자열을 검색하는 상태입니다. 다른 메서드에서 페이지 카운트가 포함되어있는 파일명의 일부로서 자신의 이름(ws00문자열을 포함)을 파일에 사용하고 있습니다. "0보다 큰"은 필요 없는 참이 되돌아옵니다.
5. 새로운 메서드를 작성합니다. 다음과 같이 메서드 코드 패널의 텍스트를 치환해주십시오.
getRootName: aFile
| line |
line := aFile copyUpTo: $..
^line.
6. <오퍼레이트 클릭>후 Accept를 선택해주십시오.
로그파일 이름(ws000101.log)은 이 메서드에 건내어집니다. 파일이름은 String 객체이기 때문에 문자열 조작이 가능합니다. 여기서는 파일 이름에서 확장자 ".log"를 삭제한 파일명이 필요하기 때문에, .까지의 문자열을 돌려줍니다. 이 작업에 의해 파일 이름에서 ".log"를 삭제하여, 의미있는 출력파일 이름에 문자를 추가하기 쉬워집니다.
7. showPageCount: 메서드를 선택하고 다음과 같이 바꿔주십시오.
showPageCounts: aFile
| stream line bag xFound sort |
bag := Bag new.
stream := (logDirectory, '\', aFile) asFilename readStream.
[ stream atEnd ] whileFalse: [
line := stream upTo: Character cr.
line := line copyFrom: 50 to: line size.
line := line copyFrom: (line indexOf: $/) to: line size.
line := line copyUpTo: $,.
xFound := (line findString: '.asp' startingAt: 1).
xFound > 0
ifTrue:[ bag add: line. ]. ].
stream close.
sort := SortedCollection sortBlock: [:a :b| a >= b].
bag valuesAndCountsDo: [ :each :count |
sort add: (Association key: count value: each)].
^sort
8. <오퍼레이트 클릭>후 Accept를 선택해주십시오.
출력 파일을 생성하는 코드를 삭제하고, 정렬된 컬렉션을 돌려주는 행에 치환합니다. 그 외의 메서드에서 외부파일에 컬렉션을 써냅니다.
9. 다른 신규 메서드를 작성합니다. 다음과 같이 바꿔주십시오.
startHits
| logFiles myHits count out outFile|
myHits := SortedCollection new.
logFiles := self getLogFiles.
logFiles do: [ :each |
outFile := '웹sitehits.txt'.
count := self showHits: each.
myHits add: (Association key: count value: each). ].
out := (logDirectory, '\' , outFile) asFilename writeStream.
myHits do: [ :each | out cr; nextPutAll: (each printString).].
out close.
Dialog warn: 'Site hits complete'.
10. <오퍼레이트 클릭>후 Accept를 선택해주십시오.
Association을 포함한 myHits라 불리우는 새로운 컬렉션을 생성합니다. 로그파일과 로그파일에서 얻은(count) Hit수를 연결합니다. 모든 로그파일이 처리되면, 컬렉션을 외부 파일로 출력하기 위한 준비가 됩니다.
11. startPageCount 메서드를 선택해주십시오. 이 메서드로의 변경은 매우 광범위하기 때문에 아래와 같은 메서드로 만드는 것이 가장 좋습니다.
startPageCount
| logFiles count rootName out |
logFiles := self getLogFiles.
logFiles do:
[ :each |
rootName := 'pagecounts_', (self getRootName: each) , '.txt'.
count := self showPageCounts: each.
out := (logDirectory, '\' , rootName) asFilename writeStream.
1 to: 10 do: [ :xx | out cr; nextPutAll: (count at: xx) printString.].
out close.
].
Dialog warn: 'Page Counts Complete'.
12. <오퍼레이트 클릭>후 Accept를 선택해주십시오.
모든 로그파일에 대해, ".log"에서 취득해서 ".txt"와 그 접두어로서 "pagecount_"로 치환합니다. "필터"문자를 가지지 않는, 중복되지 않는 파일명을 생성합니다. 그리고 페이지 카운트를 취득하는 메서드를 부르고, 정렬된 컬렉션이 돌아와 count에 격납됩니다. 이어서 외부 파일에 컬렉션 맨 처음 10가지 요소를 써냅니다.
13. 다음과 같이 start 메서드를 수정해주십시오.
start
filter := (Dialog request: '필터를 입력해주십시오'
initialAnswer: 'ws00').
(filter size) > 0
ifTrue: [ self startHits.
self startPageCount.
Dialog warn: '모든 통계를 실행하였습니다'. ]
ifFalse: [ Dialog warn: '이상없음, 안녕히계십시오'].
14. <오퍼레이트 클릭>후 Accept를 선택해주십시오
이 메서드는 필터를 요구합니다. 입력하면 통계를 수집하는 두 개의 메서드를 호출합니다. 지금까지 두 개의 메서드에서 사용된 필터의 요구였습니다만, 지금은 하나로 만들었습니다. 이것은 매우 좋은 작업입니다. 예를 들어, 웹마스터가 로그파일의 확장자를 "log"에서 ".wlg"로 변경하고 싶다고 가정합시다. 예전 같았으면, 두 개의 메서드 프롬프트 표시에 대해 변경하지 않으면 안되었습니다.
필터를 입력하면 Cancel을 실행할 수 없습니다. 양쪽 다 통계 메서드를 호출합니다. 이 코드들 가운데 새로운 내용은 한 가지밖에 없습니다. 전형적인 "If-Then-Else"구문의 예시입니다.
15. VisualWorks 표준 디렉토리의 모든 ".stat"필터가 삭제된 것을 확인해주십시오. ".stat"필터가 남아있으면 에러가 발생합니다. startPageCount메서드 안의 이 문제를 해결했기에, 삭제하는 작업은 맨 마지막이 될것입니다.
모든 텍스트를 반전시키고 <오퍼레이트 클릭>후 실행을 선택해주십시오.
이 코드는 웹Hit와 페이지 카운트 통계파일을 생성합니다. 그리고 다이얼로그 박스가 진행상태를 보고합니다.
16. 파일 브라우저 다이얼로그 박스를 열고 로그파일이 있는 장소로 이동해주십시오. 내용을 확인할 수 있습니다.
17. 지금까지의 작업을 보존합니다. 보존 방법을 잊어버렸다면 레슨 8을 참조해주십시오.
|