1. 위에 설명한 것 처럼, 기존에 작성된 Stat 클래스를 가져옵니다. VisualWorks 메인 런쳐 윈도우에서 File>>File Browser 메뉴를 선택해주십시오.
2. 다이얼로그 박스가 표시됩니다. 상단에 있는 텍스트 박스에 st*를 입력하고 리턴 혹은 엔터를 눌러주십시오.
VisualWorks에서 st로 시작하는 모든 파일을 검색합니다. 우상단 창에 stat.st가 표시될 것입니다. 이 파일을 찾지 못할 경우, VisualWorks "표준" 디렉토리에 stat.st 파일을 카피하거나, 이 파일이 포함된 디렉토리로 이동시켜주십시오. 이 파일은 다른 튜토리얼 파일과 같은 장소에 있습니다.
만일 찾을 수 없는 경우엔 다운로드해주십시오. <다운로드>
3. stat.st 파일을 반전(선택)해서 <오퍼레이트 클릭>후 File In을 선택해주십시오.
4. System Browser를 열어주십시오. VisualWorks 메인 런쳐 윈도우에서 툴바에 있는 네 번째 버튼을 클릭하거나 Browser>>시스템 메뉴를 선택해주십시오.
5. 패키지 Pane(맨 좌측)에서 WebLogStats 패키지까지 스크롤해서 선택해주십시오.
네 가지 클래스(WebLog, WebLogGUI, WebLogAbout와 Stat)이 표시됩니다. 만일 표시되지 않는 경우엔, Browser>>최신 정보로 갱신 메뉴를 선택해주십시오. 이래도 네 가지 클래스가 표시되지 않는 경우엔 stat.st 파일이 올바르게 들어가지 않았을지도 모릅니다. 다시 한 번 File In을 실행해주십시오.
그림9-1. WebLogStats 패키지와 네 가지 클래스
6. 만일 탐구심이 있다면, Stat 클래스를 탐색해주십시오.
7. WebLog 클래스의 defineClass 메서드를 표시해서 아래의 행을 변경합니다.
instanceVariableNames: 'logDirectory filter status maxPages'
위의 내용을
instanceVariableNames: 'logDirectory filter status maxPages progress logFiles stats'
이 내용으로 변경합니다
progress 변수는 프로그레스 바에서 사용하는 소수값(0에서 1까지)을 격납합니다. logFiles 변수는 로그파일의 컬렉션을 격납하기 위해 사용합니다. 현재 startHits 메서드와 startPageCount 메서드는 여분의 템퍼러리 변수를 사용하고 있습니다. stats 변수는 Stat 클래스의 컬렉션을 포함합니다.(각 로그파일)
8. WebLog 클래그의 initialize 메서드를 아래와 같이 수정합니다.
initialize
"initialize the WebLog class by creating a stats instance."
stats := SortedCollection new.
GUI에서 실행하기 때문에, logDirectory 변수의 초기화는 삭제합니다. stats 변수는 특정 Collection 클래스의 인스턴스가 됩니다. 여기서는 컬렉션중 하나인 {HighlightBold이 가장 좋을것입니다.}}
9. accessing 프로토콜 하위에 아래와 같은 메서드를 추가해주십시오.
addStat: aStat
stats add: aStat
progress: aProgress
progress := aProgress.
self changed: #progress.
10. private프로토콜 하위에 아래와 같이 prettyUpTopPages 메서드를 추가해주십시오.
prettyUpTopPages: pages
| aString |
aString := String new.
1 to: (self maxPages) do: [:xx |
aString := aString , (pages at: xx) key printString.
aString := aString , ' '.
aString := aString , (pages at: xx) value.
aString := aString , '\'.].
^aString withCRs.
이 메서드는 인기 페이지의 컬렉션을 취득해서 String 오브젝트로 변환합니다. 이것은 파일이나 GUI 위젯에 인기 페이지 일람을 송신하기 쉽게 하기 위함입니다.
11. private 프로토콜 하위에 아래의 outputStats 메서드를 추가해주십시오.
outputStats
| out outFile|
self status: 'Writing results...'.
outFile := 'log_file_analysis_results.txt'.
out := (logDirectory , '\' , outFile) asFilename writeStream.
stats do: [:each |
out cr; nextPutAll: each name , ' ';
nextPutAll: each hits printString; cr;
nextPutAll: each pages; cr. ].
out close.
self status: 'Done'.
이 메서드는 stats의 컬렉션을 취득해서 외부 파일로 출력합니다. 원래 있던 어플리케이션에서는 복수의 외부 파일을 작성했었습니다. 이곳에서는 한 개 뿐입니다.
12. private프로토콜 하위에 아래와 같이 workHorse 메서드를 추가해주십시오.
workHorse
| count pages topPages p1 p2 |
p2 := logFiles size.
p1 := 0.
logFiles do: [:each |
self status: each.
count := self showHits: each.
topPages := self showPageCounts: each.
pages := self prettyUpTopPages: topPages.
self addStat:
(Stat name: each hits: count printString pages: pages).
p1 := p1 + 1.
self progress: (p1 / p2) asFloat]
이 메서드는 Hit나 인기 페이지를 정하는 로그파일의 컬렉션 요소를 반복해서, Stat클래스에 그 정보를 담아둡니다. 각 로그파일은 Stat 클래스의 인스턴스를 작성해서, stats 컬렉션에 모을 수 있습니다. p1과 p2의 변수는 실행한 비율을 계산하기 위해 사용되며, progress 인스턴스 변수에 놓여있습니다.
13. 아래와 같이 start메서드를 수정해주십시오.
start
filter size > 0
ifTrue:
[self status: 'Processing...'.
logFiles := self getLogFiles.
self workHorse.
self status: 'Processing Complete']
ifFalse: [Dialog warn: 'Please enter a filter']
이 메서드는, 필터 변수(실제로는 GUI상 filterUI필드)가 공백인 것을 확인하기 위해서 테스트합니다. 만일 공백이라면 다이얼로그 박스가 필터를 입력하기 위해서 표시될 것입니다. 만일 공백이 아니라면 어플리케이션 전체의 로직이 개시될 것입니다.
14. private 프로토콜에서 아래 메서드를 삭제해주십시오.(필요가 없으므로)
- startHits
- startPageCount
- getRootName
15. 캔버스로 돌아가십시오. 캔버스의 statusUI 입력 필드 아래에 프로그레스 바(팔레트 아랫 단 좌측에서부터 일곱번째)를 배치해주십시오.
16. 아래와 같이 속성을 설정해주십시오.
- 프로그레스 바의 Accept와 ID에 progressUI를 설정해주십시오
17. 적용을 클릭해주십시오.
18. GUI페인터 툴로 돌아가주십시오. 메인 윈도우(위젯 일람에서 첫 엔티티)를 선택해주십시오. 배치/사이즈 탭을 클릭 후, 아래와 같이 설정해주십시오.
- 어드벤스 라디오 버튼을 클릭해주십시오
- 배치 아래 있는 첫 번째 라디오 버튼(시스템 표준)을 클릭해주십시오
- 사이즈 아래 있는 두 번째 라디오 버튼(지정 사이즈)를 클릭 후, 지정 버튼을 클릭해주십시오.
19. 인스톨 버튼을 클릭후 다음에 표시된 다이얼로그 박스에 OK를 클릭해주십시오
20. {{HighlightBold|progressUI} 입력필드를 클릭해주십시오. GUI페인터 툴의 정의 버튼을 클릭해주십시오.
21. progressUI와 초기화를 추가에 있는 체크 마크를 그대로 둡니다. OK를 클릭해주십시오.
22. 메인 윈도우를 클릭(혹은 progressUI입력 필드를 선택하지 않음)후, Browse 버튼을 클릭해주십시오. WebLogGUI 클래스의 인스턴스 정의가 표시된 것을 확인해주십시오.
23. initialize 메서드를 아래와 같이 수정해주십시오.
initialize
aWebLog := WebLog new.
statusUI := AspectAdaptor subject: aWebLog sendsUpdates: true.
statusUI forAspect: #status.
progressUI := AspectAdaptor subject: aWebLog sendsUpdates: true.
progressUI forAspect: #progress.
self filterUI value: 'ws00'.
self logDirectoryUI value: 'c:\vw7.7\image'.
self progressUI value: 0.
self maxPagesUI value: 10.
progressUI의 프로그레스 바에 적용하기 위해 해야만하는 똑 같은 수정을 제외하고는 전부 남아있습니다. 우선 Aspect 어댑터를 작성하고 WebLog 클래스의 progress 변수에 접속합니다. 그리고 0에서 초기화합니다. 애스팩트 어댑터로 지정했습니다만, 벨류 홀더로도 그 값을 설정할 수 있습니다.
시스템에 logDirectory의 적절한 값을 사용하는 것을 잊지 마십시오.
24. startWebLog 메서드(actions 프로토콜)을 아래와 같이 수정해주십시오.
startWebLog
aWebLog filter: filterUI value.
aWebLog logDirectory: logDirectoryUI value.
aWebLog maxPages: maxPagesUI value.
Cursor wait showWhile: [aWebLog start.
aWebLog outputStats.].
외부 파일에 통계를 출력하기 위해서 마지막 행에 추가했습니다.
25. 윈도우 열기 버튼을 클릭해주십시오. 어플리케이션을 테스트합니다. 전부 동작하는지 확인해주십시오.
그림 9-2. 실행중인 어플리케이션의 스크린 샷
26. System Browser 윈도우로 돌아가십시오. 패키지 Pane(맨 좌측)에서 WebLogStats 패키지까지 스크롤해주십시오.
27. 패키지 Pane에서 WebLogStats를 클릭(선택)해주십시오. <오퍼레이트 클릭>후 Save to File을 선택합니다.
28. weblogstats_2_stage6.st를 입력해주십시오.
|