VisualWorksTutorial2:Page10

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

cincom_tutorial_vwlogo
cincom_tutorial_cincomlogo

웹로그의 통계2 레슨9
진행표시

cincom_tutorial_stlogo

| 목차 | 레슨8 | 레슨10 |
cincom_tutorial_openbook 다이얼로그 박스(어플리케이션의 진척을 나타내기 위해 사용)에 표시되던 메시지를 읽어오기 전용 입력필드로 치환합니다. 프로그램이 현재 작업중인 파일 이름을 표시하게 됩니다. 혹은, WebLog클래스에 의해 작성된 진척도를 그래피컬하게 표시하는 프로그래스 바(실행한 비율을 표시)도 최고입니다.
cincom_tutorial_certificate 이 레슨에서는 어플리케이션의 진척도를 추적하는 프로그레스 바를 집어넣겠습니다. 같은 방법으로, 상황 필드에 프로그램이 현재 작업중인 로그파일 이름을 표시합니다. 매우 간단합니다. 조만간 눈으로 직접 보게 되겠습니다만, 이전 어플리케이션에서 동작한 방법으로 많은 변경을 행할 것입니다.
cincom_tutorial_design 프로그레스 바는 WebLog 클래스에서 실행중인 진척도를 그래피컬하게 표시합니다. 프로그레스 바는 읽기 전용 상태의 필드 동작과 닮았습니다. WebLog 클래스는 프로그레스 바에 "링크"된 그 로직에서 변경된 변수를 보유합니다. 이것은, Aspect 어댑터의 예입니다. 프로그레스 바가 적절하게 동작하도록 WebLog 클래스에 필요한, 큰 수정을 행합니다. 이것은 프로그레스 바의 문제가 아니라, WebLog 클래스가 첫 튜토리얼에서 작성된 것에 그 원인이 있습니다.


비율 계산을 위해 두 가지 수가 필요합니다. 하나는 WebLog 클래스가 처리하는 로그파일의 합계수입니다. 이것은 Set 오브젝트를 반환하는 getLogFiles 메서드에서 취득할 수 있습니다. 이 수를 취득하기 위해서, set오브젝트의 size 메서드를 사용합니다. 그리고, getLogFiles 메서드는 두 번 호출되었습니다. startHits 메서드와 startPageCount 메서드입니다. 단 한 번만 호출해도 되도록 인스턴스 변수에 logFile 컬렉션을 추가합니다. 이것이 두 번째 문제입니다.


원래 있던 프로그램은 Hit와 페이지 카운트에서 로그파일을 두 번 읽어들입니다. 이 부분은 변경할 필요가 있습니다. 프로그램이 새로운 파일과 조우할때마다, Hit와 페이지 카운터 양쪽을 계산해야만 하며, 다시 똑 같은 파일을 두 번 다시 읽어오지 않습니다. 이것은 더욱더 큰 구조의 변화를 가져옵니다.


이 튜토리얼을 완료하기 전에, 유저는 GUI에 부여된 로그파일에 대한 통계를 표시할 것인지, 외부 파일로 통계를 출력할 것인지를 선택할 수 있습니다. 거기서, 어딘가에 통계를 격납할 필요가 있습니다. 그러므로 인해, GUI에 표시할것인지, 파일로 기록할 것인가에 대한 선택이 가능하게 됩니다.


로그파일의 이름이나 Hit, 인기 페이지의 일람을 포함한 Stat 클래스를 작성합니다. 이 튜토리얼은 타이핑 연습이 아니니, 그냥 이 클래스가 기술된 파일을 파일 인해주십시오. 이것을 실행함으로 인해, 새로운 메서드가 참가한 것과 같이, 기존의 메서드도 수정이 필요하게 됩니다.


이 레슨에서는, WebLog 클래스 수정에 시간을 할애하겠습니다. 이것들을 변경하는 것은 현재 작성중인 GUI를 서포트하기 위해 필요한 것이며, WebLog 클래스를 한 층 더 효율적으로 재이용할 수 있게 됩니다.


메서드 변경이 많이 이루어지기 때문에, 나중에 매번 하는 <오퍼레이트 클릭>Accept 하라는 지시는 생략하도록 하겠으니, 메서드(추가나 신규)의 작성 지시를 할 경우엔 이 액션을 반드시 실행하시기 바랍니다.

cincom_tutorial_steps 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, WebLogAboutStat)이 표시됩니다. 만일 표시되지 않는 경우엔, 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
stats 
^stats
progress: aProgress 
progress := aProgress. 
self changed: #progress.
progress 
^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 컬렉션에 모을 수 있습니다. p1p2의 변수는 실행한 비율을 계산하기 위해 사용되며, 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. 아래와 같이 속성을 설정해주십시오.

  • 프로그레스 바의 AcceptIDprogressUI를 설정해주십시오


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를 입력해주십시오.

cincom_tutorial_certificate 정리


캔버스에 위젯을 배치하고 Aspect를 설정하였으며, 다른 클래스 변수에 대한 Aspect 어댑터로서, 초기화와 지정하는 코드를 2행 기술하였습니다. 이 레슨에서 행한 작업의 대부분은 GUI를 서포트하기 위한 수정이었습니다. 이 덕분에, 지금 GUI 위젯과 WebLog 클래스가 손쉽게 상호작용할 수 있게 되었습니다. 통계는 컬렉션에 격납되어 일람에 표시가능합니다.


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

  • 캔버스에 프로그레스 바를 배치
  • Aspect 어댑터를 프로그레스 바로 만듦
  • 컬렉션을 String으로 변환

| 목차 | 레슨8 | 레슨10 |