VisualWorksTutorial1:Page11

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

cincom_tutorial_vwlogo
cincom_tutorial_cincomlogo

웹로그 통계 레슨 10
모든 코드를 이행

cincom_tutorial_stlogo

| 목차 | 레슨9 | 레슨11 |
cincom_tutorial_openbook Smalltalk 사용 시간이 증가함에 따라 Workspace의 사용빈도가 줄어들며, System Browser 사용이 늘어납니다. 하지만 Smalltalk로 개발한다는 의미로 보면 대다수의 경우, 작업을 Workspace에서 진행합니다. 그리고 System Browser에 복사해서 새로운 메서드 작성에 사용합니다. 이 방법은 아주 옳은 방법입니다. 따라서, 이 레슨에서도 그렇게 할 것입니다. Workspace는 메서드에 코드를 카피하기 전에 작은 코드의 덩어리를 테스트하기 위한(동작확인) 장소입니다. 이 레슨은 그 연습을 하기 좋은 예가 될 것입니다.
cincom_tutorial_certificate 이 레슨에서는 주어진 디렉토리 수만큼 복수의 로그파일을 실행할 수 있도록, Wordspace에서 코드를 복사하여(로그파일에서 페이지 카운트를 수집한 것 처럼) WebLogClass의 새로운 메서드에 붙입니다. 지금까지 많은 기초를 쌓아왔습니다.(패키지, 클래스, 프로토콜, 클래스)그러니, 이번 레슨에서는 처음보다 간결하게 설명하겠습니다.


지금 코드에는 남아도는 무언가를 찾을 수 있을지도 모릅니다.(같은 것을 하는 것 처럼 보이는 메서드) 그것들을 결합하거나, 보다 일반화(효율이 좋고 재이용 가능)가 가능하다면 멋진 코드가 될거라 생각합니다. 다음 레슨에서는 그렇게 될 것입니다.

cincom_tutorial_steps 1. System Browser를 기동시켜주십시오.(VisualWorks 메인 런쳐 화면에서 툴바의 네 번째 버튼을 클릭하거나, 브라우저>>시스템 메뉴를 선택해주십시오.)


2. 패키지 창(맨 왼쪽)의 스크롤을 XML로 시작하는 패키지 위까지 움직여주십시오. WebLogStats 패키지를 선택(반전)해주십시오.


만일 WebLogStats 카테고리를 찾을 수 없는 경우, 파일인할 필요가 있습니다. 이번 레슨에서는 앞서 레슨에서 행했던 작업을 VisualWorks 개발환경에 로드할 필요가 있습니다.


3. 프로토콜 창의 상단에 있는 Instance 탭이 선택되어 있는지 확인해주십시오. private 프로토콜을 클릭(선택)해주십시오. 그리고 아래 그림과 같이 되었는지 확인해주십시오.

그림 10-1. System Browser에 표시된 WebLogClass 클래스


4. private 프로토콜이 선택되어있는 상태에서 아래의 내용을 메서드 뷰에 기술해주십시오.

showPageCounts: aFile 
| stream line bag xFound sort out| 
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)]. 
out := (logDirectory, '\' ,aFile , '.stats') asFilename writeStream. 
sort do: [ :each | out cr; nextPutAll: each printString.]. 
out close.


5. 메서드 코드 뷰에서 <오퍼레이트 클릭>Accept를 선택해주십시오. showPageCounts: 메서드가 메서드 창에 표시됩니다.


다음 화면과 같은지 확인해주십시오.

그림 10-2. 새로운 메서드(showPageCount)가 표시된 System Browser


6. private프로토콜이 선택된 상태에서 아래의 내용을 메서드 뷰에 기술해주십시오.

getLogFilesForPageCounts 

| workingDir contents xFound | 
Transcript clear. 
workingDir := logDirectory asFilename. 
contents := workingDir directoryContents. 
contents do: [ :each | 
xFound := each findString: filter startingAt: 1. 
xFound > 0 
ifTrue: [ self showPageCounts: each.].]. 
Dialog warn: 'Done'.


7. 메서드 코드 뷰에서 <오퍼레이트 클릭>Accept를 선택해주십시오. getLogFilesForPageCount 메서드가 메서드 창에 표시됩니다.


다음 그림과 같은지 확인해주십시오.

그림 10-3. 새로운 메서드(getLogFilesForPageCounts)가 표시된 System Browser


8. private 프로토콜이 선택된 상태에서 아래 내용을 메서드 뷰에 기술해주십시오.

startPageCount 

filter := (Dialog request: 'Please enter a filter ' initialAnswer: 'ws00'). 
(filter size) > 0 
ifTrue: [self getLogFilesForPageCounts]


9. 메서드 코드 뷰에서 <오퍼레이트 클릭>Accept를 선택해주십시오. startPageCount 메서드가 메서드 창에 표시됩니다.


다음 그림과 같은지 확인해주십시오.

그림 10-4. 새로운 메서드(startPageCount)가 표시된 System Browser


10. Workspace를 열고 아래 코드를 입역해주십시오.

WebLogClass new startPageCount

텍스트를 반전시키고 <오퍼레이트 클릭>실행을 선택해주십시오.


이 코드는 하나의 파일이 아닌, 디렉토리에 있는 모든 로그파일의 페이지 카운트의 통계를 취득한다는 것을 제외하면, 이전 레슨에서 했던 것처럼 동작합니다.


11. 파일 브라우저를 열고 로그파일이 있는 디렉토리를 지정합니다. 그러므로 인해 파일의 내용을 확인할 수 있습니다.


그림 10-5. 파일 브라우저에 의한 페이지 카운트와 파일 목록 표시
cincom_tutorial_design 현실적으로는, 아직 소프트 웨어로서 구성되어 있지 않습니다. 사용자는 일반적으로 보다 많은 개선을 요구합니다. 그리고 기능사양서까지도 개발도중 혹은 종료후에 변경할 수 있도록 요구합니다. 이것은 이례적인 것이 아닙니다.


누군가가 로그파일에 기록되어있는 ASP페이지를 더욱 개발했다고 합시다. 예를들어 HTM파일이 있다고 칩시다. 그러면 어떻게 될까요? 상사는 그것을 카운트하고 싶어 할겁니다. 상사는 단 한번밖에 Hit하지 않는 페이지에는 흥미를 나타내지 않습니다. 실제로, "TOP10" 이외의 페이지에는 흥미를 가지지 않을 것입니다. 이와 같은 변경은 그것들을 위해 필요합니다.

cincom_tutorial_steps 12. 프로토콜 창 상단에 있는 Instance 탭이 선택되어있는지 확인해주십시오. private 프로토콜을 클릭(선택)하고 showPageCounts: 메서드를 클릭(선택)해주십시오. 그리고 아래와 같이 변경해주십시오.
showPageCounts: aFile 
| stream line bag xFound sort out| 
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) + 
(line findString: '.htm' 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)]. 
out := (logDirectory, '\' ,aFile , '.stats') asFilename writeStream. 
1 to: 10 do: [ :each | out cr; nextPutAll: (sort at: each) printString.]. 
out close.


13. 메서드 코드 뷰에서 <오퍼레이트 클릭>Accept를 선택해주십시오. 입력된 코드가 "재컴파일(recompile)"됩니다. 타이핑 미스가 없고, 다이얼로그 박스가 표시되지 않는다면(즉 아무일도 일어나지 않는다면), Smalltalk는 코드를 변경해서 올바르게 컴파일했다는 것을 의미합니다.


14. 작업영역을 열고 아래의 코드를 입력해주십시오.

WebLogClass new startPageCount

텍스트를 반전시키고 <오퍼레이트 클릭>실행을 선택해주십시오.


주의 : 틀림없이 에러가 발생해서 그림-16(아래)과 같은 화면이 표시됩니다.

그림 10-6. 악명 높은 notify 화면


15. 로그파일로서 같은 장소에 통계 파일을 써냅니다. 통계 파일의 일부로서 로그파일명을 사용하고 있기 때문에, 필터(ws00 파일을 찾는)는 .STAT을 포함하고 있습니다. 이것들을 읽어들였기 때문에 에러가 발생했습니다. 이 문제를 해결하기 위해, 다음 레슨에서는 파일 출력명을 다르게 하겠습니다. 하지만 지금은 .STAT 파일을 삭제하는 것으로 이 문제를 해결합니다.


디버그 화면을 닫은 후, 최초의 .STAT 파일은 "Lock"되어 있습니다. VisualWorks가 닫힐때까지 파일을 삭제할 수 없습니다. 그렇기에, 아래와 같은 과정을 진행해주십시오.}}


  1. 모든 변경점을 파일로 출력해주십시오
  2. VisualWorks를 닫아주십시오.
  3. .log 파일이 존재하는 모든 ".STAT"파일을 삭제해주십시오
  4. VisualWorks를 기동해주십시오
  5. WebLogStats.st 파일을 파일인해주십시오


16. Workspace를 열고 아래 코드를 입력해주십시오.

WebLogClass new startPageCount

텍스트를 반전시키고 <오퍼레이트 클릭>실행을 선택해주십시오.


이 코드는 한 가지 파일이 아닌, 디렉토리에 있는 모든 로그파일의 페이지 카운트 통계를 취득한다는 점을 빼고는, 앞서 레슨에서 했던 것처럼 동작합니다. "통계"파일은 "HTM"파일의 카운트를 포함하고 있습니다. 그것들을 포함해서 "TOP10" 목록을 작성합니다.


17. 파일 브라우저를 열고 로그파일이 존재하는 디렉토리를 지정해주십시오. 그러면 파일의 내용을 확인할 수 있습니다.

그림 10-7. 파일 브라우저에 의한 새로운 페이지 카운트 파일의 목록
cincom_tutorial_question 코드를 약간 변경하였습니다. 그것들을 보고 동작을 이해하고, 확인해봅시다.
xFound := (line findString: '.asp' startingAt: 1) + 
(line findString: '.htm' startingAt: 1).

이 행은 매우 단순합니다.(line findString: '.asp' startingAt: 1)은 ASP 페이지를 발견하고, (line findString: '.htm' startingAt: 1)은 HTM 페이지를 발견합니다. 이 식의 돌아오는 값은 수치입니다.("ASP" 혹은 "HTM" 문자열의 개시위치) 그리고 두 개의 값을 더합니다. 다음 행은 제로보다 큰 것을 확인합니다.


1 to: 10 do: [ :each | out cr; nextPutAll: (sort at: each) printString.].

이것은 고정수의 반복(1 to: 10 do:) 예입니다. 1에서 10까지의 숫자는 임시변수 each에 설정(하나씩)되어, 블록의 코드 부분에서 사용됩니다. 컬렉션이 있기 때문에, 숫자나 인덱스를 가진 컬렉션의 요소로서 파악할 수 있습니다. 컬렉션의 각 요소의 참조로서 at: 메서드를 사용합니다. (sort at: each)식은 의외로 어려운 일을 합니다.

cincom_tutorial_certificate 정리

Workspace에서 클래스 라이브러리 안으로 어떻게 이행(자신의 클레스나 메서드를 작성)하는지를 학습한 의미 있는 레슨이었습니다. 분할한 부분을 때어내거나, 다시 결합하는 방법을 찾기 위해서, 무엇을 하고 있는지 이해하는 능력에만 의존합니다. 이것은 다른 기능과 같이 훈련에 의해 쉬워집니다.


경우에 따라서는 코드를 이행하는 동안 비슷한 메서드를 찾아내거나, 한 가지 메서드에 결합하기 위해 좀더 수정한다거나 하는 노력을 할 것입니다. 다음 레슨에서는 이러한 예를 바탕으로, 효율적이며 재이용 가능한 코드를 작성하기 위해 메서드끼리 연결해보겠습니다.


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

  • 고정횟수, 컬렉션을 반복하는 방법
  • Workspace에서 VisualWorks 이미지로 코드를 이행하는 방법
  • System Browser를 사용한 기존 메서드의 수정

| 목차 | 레슨9 | 레슨11 |