<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=VisualWorksTutorial1%3APage06</id>
	<title>VisualWorksTutorial1:Page06 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=VisualWorksTutorial1%3APage06"/>
	<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=VisualWorksTutorial1:Page06&amp;action=history"/>
	<updated>2026-05-01T18:32:51Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://trans.onionmixer.net/wiki/index.php?title=VisualWorksTutorial1:Page06&amp;diff=2649&amp;oldid=prev</id>
		<title>Onionmixer: VisualWorksTutorial1 page06 추가</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=VisualWorksTutorial1:Page06&amp;diff=2649&amp;oldid=prev"/>
		<updated>2012-12-08T10:45:16Z</updated>

		<summary type="html">&lt;p&gt;VisualWorksTutorial1 page06 추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{CincomTop|{{CincomSmalltalkHeadBanner|웹로그 통계 레슨 5|집합(컬렉션)}}}}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border: none; width:100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;text-align:center;font-weight:bold; font-style: normal;font-size:110%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; | | 목차 | 레슨4 | 레슨6 |&amp;lt;hr style=&amp;quot;color:black;background-color:black;height:4px;&amp;quot;&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;width:60px;float:left;&amp;quot; | {{HeadImageOpenbook}}&lt;br /&gt;
| 정확하게 &amp;quot;웹Hit&amp;quot;을 얻기위해서는 먼저 웹서버 로그의 구조에 대해 살짝 이해해둘 필요가 있습니다. 그리고 무엇보다 중요한 것은 &amp;quot;웹Hit&amp;quot;의 의미를 엄밀히 정의하는 것입니다. 다음은 무언가에 IP 어드레스를 격납시켜두면 카운트 할 수 있게 됩니다.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;width:60px;float:left;&amp;quot; | {{HeadImageCertifacate}}&lt;br /&gt;
| {{CincomSmalltalkGreenBigFont|이 레슨에서는 Set라 불리우는 Collection 클래스(집합)를 소개합니다. Set을 사용하는 이유와, 이 문제에 대해서 어떠한 해결책을 이끌어낼 수 있는가를 설명하겠습니다.}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;width:60px;float:left;&amp;quot; | {{HeadImageDesign}}&lt;br /&gt;
| 다음과 같은 예를 생각해봅시다. 웹사이트에 어떤 사람이 오전 9:00에, 그리고 다시 오후 3:00, 마지막으로 오후 9:00에 Hit(방문)했다고 합시다. 이 경우, 이 사람은 3Hit라고 말 할지도 모릅니다. 혹은 그 사람이 같은 사람이니 1Hit라고 할지도 모릅니다. 이처럼 재방문한 사람을 어떻게 취급하느냐에 따라서 달라집니다. 이 워크샵에서는 재방문한 사람을 “Hit”로 취급하지 않기로 합니다. 그러니 계산은 사이트에 Hit한 서로 다른(유니크) 사람들의 수를 반영하기로 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음 문제는 로그파일의 구조입니다. 로그파일을 보면 첫 IP 어드레스(209.67.247.201)는 7회 발생한 것을 알 수 있습니다.(왜냐하면 그 사람은 사이트 안의 7가지 다른 페이지를 방문했기 때문입니다.) 다음 방문자(IP 어드레스 63.21.189.239)는 29회 발생했습니다만, 29회 전부 웹페이지에 들어온 것을 의미하는 것은 아닙니다. 이 파일은 시간순으로 배열되어 있으므로 IP 어드레스 중복이 존재합니다. 이번에는 관계 없지만, 입장자 수는 많은 요인에 의해 변합니다. 주된 문제는 IP 어드레스가 변경된 새(이전) 방문자가 사이트에 Hit했을 경우 발생합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
그럼 도전해봅시다. 파일 내용(IP 어드레스)을 순서대로 불러왔을 때, IP 어드레스가 변했다는 것은, 새로운(이전) 방문자가 사이트에 Hit했다는 것을 나타내기에 두 개의 IP를 구분할 필요는 없습니다. 따라서, 파일의 앞부분에서 시작해서(손계산 할 때 처럼) …&amp;quot;로직(사고)&amp;quot;은 다음과 같을 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* 파일에서 첫 IP 어드레스를 취득해서 격납합니다. 카운트가 증가합니다.&lt;br /&gt;
* 이 IP 어드레스와 다를때까지 파일을 계속 불러옵니다.&lt;br /&gt;
* 새로운(변경된) IP 어드레스를 격납합니다. 카운터가 증가합니다.&lt;br /&gt;
* 이 IP 어드레스와 다를때까지 파일을 계속 불러옵니다.&lt;br /&gt;
* 다음 IP 어드레스가 왔을 때, 격납된 IP 어드레스와 비교합니다. 만일 리스트에 없으면 카운터를 증가시킵니다. 만일 있다면 이 IP 어드레스와 다를때까지 파일을 계속 불러옵니다.&lt;br /&gt;
* 파일 끝에 도달할때까지 계속합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
여기서는 두 가지 도전이 기다리고 있습니다. 우선 IP 어드레스를 어디에 격납해야 좋을까요? 다음으로는, 새로운 IP 어드레스가 일람에 존재하고 있는지, 어떻게 확인해야 좋을까요?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
프로그래밍 경험이 있던 없던, &amp;quot;이러한 작업은 많은 프로그래밍 언어에 있어서 간단하지 않다&amp;quot;는 것은 틀림 없습니다. Smalltalk에서는 비상식적일 정도로 간단합니다. 이런 계산은 몇 번이고 실행되는 작업입니다. 그래서, Smalltalk 창시자들은 일반적으로 반복시키기 위한 &amp;quot;빌트인&amp;quot;기능(언어에 내장)으로 개발하였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
위에 말했듯이 &amp;quot;빌트인&amp;quot;기능은 Collection(컬렉션)이라 불리웁니다. 여기서는 Set이라 불리우는 컬렉션의 하나를 사용합니다. 만일 코드의 동작을 바르게 이해하고 싶으시다면 다음 과정으로 진행하기 전에 Set 입문서를 한 번 읽어보시기를 권합니다.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;width:60px;float:left;&amp;quot; | {{HeadImageDominos}}&lt;br /&gt;
| 입문서 : Set(셋)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;width:60px;float:left;&amp;quot; | {{HeadImageSteps}}&lt;br /&gt;
| 1. 아래 텍스트와 같이 수정 하십시오. 그리고 전부 반전시키고 {{HighlightBold|&amp;lt;오퍼레이트 클릭&amp;gt;}}후 실행을 선택해주십시오.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
| myFile myStream myLine addrIP mySet | &lt;br /&gt;
mySet := Set new. &lt;br /&gt;
myFile := &amp;#039;ws000101.log&amp;#039; asFilename. &lt;br /&gt;
myStream := myFile readStream. &lt;br /&gt;
[ myStream atEnd ] whileFalse: [ &lt;br /&gt;
myLine := myStream upTo: Character cr. &lt;br /&gt;
addrIP := myLine copyUpTo: $,. &lt;br /&gt;
mySet add: addrIP.]. &lt;br /&gt;
myStream close. &lt;br /&gt;
mySet inspect.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CincomSmalltalkBlueFont|새로운 {{HighlightBold|Inspector}} 화면이 표시됩니다. 화면 타이틀은 {{HighlightBold|a Set}}입니다.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. 그림 5-1에는 Set의 IP 어드레스의 컬렉션이 표시됩니다. 실제로 IP 어드레스의 집합을 확인할 수 있습니다. 그림 5-2에서는 {{HighlightBold|기본}}탭에서 {{HighlightBold|tally}}가 선택되어 그 내용을 표시하고 있습니다. {{HighlightBold|tally}}(이 집합의 단위수)의 값은 93입니다. 이것은 Set(집합), 위와 같은 경우에는 IP 어드레스, 혹은 “Hit”의 유니크한 항목수입니다.&lt;br /&gt;
&lt;br /&gt;
[[image:cincom_tutorial1fig51.gif|none|469px|thumb|그림 5-1. IP어드레스의 컬렉션(Set)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:cincom_tutorial1fig52.gif|none|465px|thumb|그림 5-2. 컬렉션의 사이즈(항목수)]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;width:60px;float:left;&amp;quot; | {{HeadImageLightbulb}}&lt;br /&gt;
| {{CincomSmalltalkBlueFont|기본적으로 이것으로 완성입니다.}} 이것은 로그파일에서 유니크한 웹Hit를 구하기 위한 9행의 코드였습니다. 친구나 친척중에 프로그래머가 있다면, 그 사람이 좋아하는 언어로 이와 같은 프로그램을 짜게 만들어봅시다. 과연 몇 행에서 위와 같은 결과를 도출해낼 수 있는지 보도록 합시다. 필시 더 많은 행을 필요로 할 것입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
우리는 업무상 멋진 프로그램을 짤 수 있는 근성이 있습니다. 더욱이, 이 코드를 더욱 연마해서 멋지게 만들어봅시다. 우선 {{HighlightBold|Inspector}} 화면이 아닌 다른 것에 결과를 표시하겠습니다. 두 번째로, 다른 로그파일도 그곳에 표시하겠습니다. 특정 로그파일만을 위해서 코드를 짠다면 재미 없겠죠? 그러니 시스템에 있는 어떠한 로그파일이라도 그 “Hit”수를 카운트 할 수 있게 만들겠습니다.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;width:60px;float:left;&amp;quot; | {{HeadImageSteps}}&lt;br /&gt;
| 3. 아래 텍스트와 같이 수정해주십시오. 그리고 전부 반전시켜 {{HighlightBold|&amp;lt;오퍼레이트 클릭&amp;gt;}}후 {{HighlightBold|실행}}을 선택해주십시오.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
| myFile myStream myLine addrIP mySet | &lt;br /&gt;
mySet := Set new. &lt;br /&gt;
myFile := &amp;#039;ws000101.log&amp;#039; asFilename. &lt;br /&gt;
myStream := myFile readStream. &lt;br /&gt;
[ myStream atEnd ] whileFalse: [ &lt;br /&gt;
myLine := myStream upTo: Character cr. &lt;br /&gt;
addrIP := myLine copyUpTo: $,. &lt;br /&gt;
mySet add: addrIP.]. &lt;br /&gt;
myStream close. &lt;br /&gt;
Dialog warn: (mySet size printString).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CincomSmalltalkBlueFont|마지막 행을 제외하고 전부 같습니다. 여기서 결과를 표시하기 위해 {{HighlightBold|Dialog}} 객체(클래스)를 사용합니다. {{HighlightBold|Set}} 객체에는 {{HighlightBold|size}} 메시지를 보냅니다. 그러면 {{HighlightBold|Set}} 객체에 있는 항목수가 돌아옵니다. {{HighlightBold|warn:}} 메시지는 숫자를 받아들이지 못합니다. 문자열만 받아들입니다. 때문에 문자열로 변환하기 위해 {{HighlightBold|mySet size}}에서 돌아오는 수치에 {{HighlightBold|printString}} 메시지를 보냅니다. 이것으로 {{HighlightBold|warn:}} 메시지가 작동되며, 다이얼로그 박스가 표시됩니다.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. 아래 텍스트와 같이 수정해주십시오. 그리고 전부 반전시켜 &amp;lt;오퍼레이트 클릭&amp;gt;후 실행을 선택해주십시오.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
| myFile myStream myLine addrIP mySet | &lt;br /&gt;
mySet := Set new. &lt;br /&gt;
myFile := (Dialog request: &amp;#039;파일입력&amp;#039; initialAnswer: &amp;#039;ws000101.log&amp;#039;) asFilename. &lt;br /&gt;
myStream := myFile readStream. &lt;br /&gt;
[ myStream atEnd ] whileFalse: [ &lt;br /&gt;
myLine := myStream upTo: Character cr. &lt;br /&gt;
addrIP := myLine copyUpTo: $,. &lt;br /&gt;
mySet add: addrIP.]. &lt;br /&gt;
myStream close. &lt;br /&gt;
Dialog warn: (mySet size printString).&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{CincomSmalltalkBlueFont|{{HighlightBold|Dialog}} 객체({{HighlightBold|리퀘스트}})의 새로운 메시지를 배우겠습니다. 이 식에서는 두 개의 콜론이 있습니다. 이 메시지는 두 개의 파라메터를 요구하고 있습니다. {{HighlightBold|Dialog}} 객체에는 실제 메시지로서 {{HighlightBold|request: initialAnswer:}}(단순히 &amp;quot;콜론&amp;quot; 메시지를 함께 연결하고 있음)가 보내졌습니다.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:cincom_tutorial1fig53.gif|none|410px|thumb|그림 5-3. 파일 이름에 대한 프롬프트]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[image:cincom_tutorial1fig54.gif|none|178px|thumb|그림 5-4. 로그파일에 대한 Hit수]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:right;width:60px;float:left;&amp;quot; | {{HeadImageCertifacate}}&lt;br /&gt;
| &amp;lt;font style=&amp;quot;text-align:center;font-weight:bold; font-style: normal;font-size:110%;&amp;quot;&amp;gt;정리&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
이 레슨에서는 IP 어드레스를 격납하기 위한 {{HighlightBold|Set}} 사용방법을 학습했습니다. 이번 학습으로 1개의 파일에서 Hit를 카운트하는 방법을 이해했으니, 다음 워크샵에서는 디렉토리에 있는 모든 파일에 대해서 해보겠습니다. 이것으로 주, 월, 년 단위 Hit수의 통계를 제공할 수 있을겁니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{HighlightBold|아래와 같은 내용을 학습하였습니다}}&lt;br /&gt;
* {{HighlightBold|Collection}}의 한 가지인 {{HighlightBold|Set}}&lt;br /&gt;
* {{HighlightBold|Collection}}에 항목 추가&lt;br /&gt;
* {{HighlightBold|Collection}}안에 있는 항목수 카운트&lt;br /&gt;
|- style=&amp;quot;text-align:center;font-weight:bold; font-style: normal;font-size:120%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&amp;lt;hr style=&amp;quot;color:black;background-color:black;height:4px;&amp;quot;&amp;gt; | 목차 | 레슨4 | 레슨6 |&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>