U E D R , A S I H C RSS

Small Talk/강좌From Hitel/강의4

nosmokmoin 으로 변경시에 이 페이지가 에러가 발생하는 대표적인 예이다. 이 외에도
Vim 도 에러가 발생한다.
~cpp 
                          Smalltalk 배우기 #4
                                                   1998. 11. 27. 김찬홍
                                              mailto:andrea92@hitel.net

        ======================================
        1. Smalltalk의 소개
          1.1. 프로그램과 프로그래밍 언어
          1.2. Smalltalk의 설치
          1.3. Smalltalk 맛보기 프로그램
          1.4. 몇 가지 준비해야 할 것들
        →1.5. Smalltalk 환경 둘러보기
            1.5.1. 알림판
            1.5.2. 일터
            1.5.3. 객체 탐색기
            1.5.4. 갈래씨줄 탐색기
            1.5.5. 길수 탐색기
            1.5.6. 꾸러미 탐색기
            1.5.7. 창맵씨
            1.5.8. 자원 탐색기
            1.5.9. 발자취 창과 벌레잡개
          ........
        =======================================

                          1. Smalltalk의 소개
                     ------------------------------

1.5. Smalltalk 환경 둘러보기
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Smalltalk를 실행해 보면 최소한 두 개의 창이 열려 있음을 볼 수 있습니다.
하나는 "System Transcript"라는  제목이 붙어있는  "알림판"(transcript)이 
있고, 나머지 하나는 "untitled -  workspace"라는 제목이 붙여진 "일터"가 
그것입니다. 물론 Smalltalk 환경에는 이 두 가지 창 말고도 다른 여러 가지
의 창이 있습니다. 각각은 저마다의 독특한 쓰임새를 가지고 있으며, 이들은 
모두 Smalltalk로 프로그램을 짜는데 꼭 필요한 역할을 수행합니다.
이제 이 마디[節]에서는 Smalltalk에는 어떤 창들이 있으며 이들이 대충  어
떤 일을 하는지를 알아봄으로써, Smalltalk 환경의 특징들을 여러분이  간단
히 알아볼 수 있도록 하겠습니다. 각 창들에 대해서 나중에 필요할 때 좀 더 
자세하게 설명할 것입니다. 여기서는 그냥 이러이러한 창이 있으며, 대충 이
렇게 생겼구나 하는 정도만 이해하도록 합시다.

아직까지 자료실에서 Dolphin Smalltalk를 내리받아 설치하지 않으신 분이라
면 지금부터는 조금 용량이 많기는  하더라도 Smalltalk 환경을 내리받아서 
공부를 계속하시라고 권합니다. 세상은 멀티미디어화 되어가고 있지만  아직
도 우리의 정겨운 통신 환경은 파란 바탕에 흰색 글자만 나타낼 수 있기 때
문에, 그림을 곁들이고 싶은 필자의 간절한 마음이 반영되지 못하기  때문입
니다. :)

1.5.1. 알림판
-------------
Smalltalk 환경에서  가장 중요한  창은 "알림판"(transcript)입니다.  원래 
'transcript'라는 낱말의 뜻은 '베껴낸  것, 사본, 등본'인데,  Smalltalk를 
깊이 공부하지 못한 필자로써는 왜 transcript라는 낱말이 이 창에 붙게  되
었는지를 이해하기가 어렵습니다. 아무래도  Smalltalk 시스템의 상태가  이 
창에 그대로 반영되기 때문이 아닌가 생각합니다.

여하튼 이 창은 Smalltalk 환경에서 가장 중요한 창입니다. 이 창이  열림으
로써  바로  Smalltalk  환경이   시작되는 것이고,   이 창이   닫힘으로써 
Smalltalk가 종료되는 것입니다. 즉 이 창은 Smalltalk 환경과 동고동락한다
고 해도 과언이 아닐 정도로,  Smalltalk 환경이 실행되어 있다면  언제든지 
열려있는 창입니다.

이 창은 뒤에서 설명할 '일터'(workspace)와 비슷한 기능을 합니다.  그러나 
알림판이 '일터'와 구별되는 가장 큰 특성은, Smalltalk 환경에서  사용자에
게 알려야 할 것이 있으면 언제든지 이 창에 표시된다는 것입니다.
프로그램을 실행하는데 중대한 잘못이 생겼다거나, 새로운 꾸러미를  불러왔
다거나 이미 있던 꾸러미나 객체를 지울 때 문제가 있었다는 등 이 알림판에
는 Smalltalk 환경이 우리에게 알려야 할 여러 가지 사항들이 기록됩니다.
물론 여러분이 이 알림판에 지시를 보내어 여러분만의 글줄을 찍게 할  수도 
있습니다만, 그것은 조금 뒤로 미루겠습니다.

Smalltalk 환경을 끝낼 때 File > Exit Dolphin 명령을 내리는 대신 알림판
을 닫게 되면 Smalltalk 환경을 끝낼 수 있습니다.


1.5.2. 일터
-----------
일터(workspace)란 Smalltalk 환경에서  알림판 다음으로 중요한  창입니다. 
여러분은 일터에서 무엇을 합니까? :) 일을 하지요? 일에 성격에 따라 좀 다
르겠지만, 몸을 많이 움직여야 하는 일이라면, 땀을 흘리면서 물건을 나르기
도 하고 뛰기도 하면서 이 일터를 누빕니다. 머리를 쓰는 일이라면 이 일터
에서 글을 쓰기도 하고 지우기도 합니다. 여러분이 회사의 사장이라면  일터
에서 아랫사람들에게 여러 가지 지시를 내립니다. 그리고 지시를 받은  사람
들은 자신이 처리한 일의 결과를 사장에게 되돌려 보내줍니다. 이렇듯  일터
는 분주한 곳입니다. 

Smalltalk의 일터 또한 마찬가지입니다.  여기서 여러분은 기본적으로  글을 
쓸 수 있습니다. 이 글이 Smalltalk에게 내리는 명령이 될 수도 있고, 명령
을 설명하는 풀이글이 될 수도 있으며, 그냥 아무런 관계없는 글이 될 수도
있습니다.
일터에서 여러분은 Smalltalk에서 명령을 내리고 그 결과를 시험합니다.  그
리고 프로그램의 어떤 부분을 만들기 전에 여기서 기본적으로 여러 가지  명
령을 내려봄으로써 논리를 세워 나갈 수도 있습니다.

새로운 일터를 만들기 위해서는 File > New 메뉴를 사용하거나, 도구 모음에
서 "흰 종이가 그려진 그림"을 누르면 됩니다. 알림판이 오직 하나밖에 존재
할 수 없는데 비해, 일터는 여러분이 필요한 수만큼 많이 만들 수 있습니다. 
그리고 각각의 일터에 기록된 글들을 따로따로 저장하거나 불러올 수 있습니
다. 그러므로 어떤 명령을 실행한  뒤에 나타나는 여러 가지 결과와  더불어 
여러분이 내린 명령을 따로 하나의 파일로 저장해 둘 수 있다는 말입니다.

앞서 우리는 알림판에 지시를 내림으로써 우리가 원하는 글줄을 찍을 수  있
다고 했습니다. 그럼 다음과 같이 명령해 보십시오.  글쇠를 사용해
서 아래 명령을 실행하십시오. (Smalltalk 명령을 실행하는 방법에 어려움을 
겪는 분이라면 "1.3" 마디를 참조하시기 바랍니다.)

        Transcript show: '안녕하세요?'.
        ☞ 안녕하세요?          "알림판에 이 내용이 표시된다."

---<잠깐!>----------------------------------------------------------
                         베끼기는 하지 맙시다!

앞으로 이 글을 진행하면서 무수히 많은 Smalltalk의 명령이 소개될  것입니
다. 그래서 저는 여러분에게 부탁을 드릴까 합니다.
이 글에서 제공되는 Smalltalk 명령을 복사하여 일터에 붙여 넣어서  실행하
시지 말았으면 하는 것이 제 부탁입니다.
좀 번거롭더라도 지금 여러분이 읽고 있는 명령을 그대로 일터에 글쇠판으로 
쳐 넣고 실행하여 결과를 관찰하는 것이 훨씬 좋습니다. 단순히 복사해서 붙
여 넣는 것 보다 실제로 글쇠판에서 명령을 치게 되면, 이 글에서 일단 명령
을 읽어서 머리에 기억되게 되고, 기억된 것을 글쇠판으로 치면서 일터에 나
타난 명령을 보게 되고, 명령을 실행하면서 세 번째로 명령을 보게  됩니다. 
그러나 명령을 복사하고 붙이는 것은 전혀 이러한 효과를 볼 수가 없습니다.

글을 어떻게 읽고 어떻게 실행하는지는 전적으로 여러분에게  달려있습니다. 
그러나 좀 더 효과적인 공부를 위해서는 모든 Smalltalk 명령을 여러분이 스
스로 쳐 넣으며 실행해야 합니다. 맹목적으로 명령을 쳐 넣는 것이  아니라, 
도대체 이 명령이 어떤 의미인지를  생각하면서 입력하면 Smalltalk 공부는
생각 외로 매우 쉬워질 것입니다. 이는 필자가 처음 "Smalltalk Tutorial"을 
공부할 때 직접 경험한 것이므로, 한 번 믿어보셔도 좋을 것입니다.
----------------------------------------------------------

어떻습니까? 방금 실행한 명령의 결과가 그대로 알림판에 나타났습니다.  이
렇게 일터에서 여러분은 Smalltalk에게 명령을 내릴 수 있습니다. 또한 다음
과 같은 명령을 사용하여 일터에 명령의 수행 결과를 출력할 수도 있습니다.

        3 + 4.  ☞ 7    

이처럼 일터는 여러분의 Smalltalk 프로그래밍에  있어서 가장 자주 접하게 
되는 창이므로, 그 사용 방법을 확실히 익혀두는 것이 좋을 것입니다.

참고로 일터에서 할 수 있는  대부분의 일을 알림판에서도 할 수  있습니다. 
그렇지만 관례적으로 Smalltalk에서 대부분의 작업은 알림판이 아닌  일터에
서 수행합니다. 알림판에는 주로 알림  사항이 기록되도록 하고, Smalltalk 
환경 전체에 영향을 줄 명령이 있다면 이 '알림판'에서 실행하는 것이  관례
로 되어 있습니다.


1.5.3. 객체 탐색기
------------------
객체 탐색기(object inspector)는 명령을 실행할 떄 나  글
쇠 대신  글쇠를 사용할 때 나타나는 창입니다. 이 창은 기본적으로
복잡한 구조를 가지고 있는 객체의 내용을 좀 더 잘게 쪼개어 탐색하기 편리
하도록 만들어진 도구입니다. 앞에서 우리가  탐색기를 사용한 예를 생각해 
보십시오. 아래의 명령은 Smalltalk 환경에 들어 있는 모든 갈래(class)들을 
가나다 순서로 늘어놓은 모듬을 되돌리는 명령입니다.

        Class allClasses asSortedCollection  ☞ "객체 탐색기 열림"

위의 명령을  글쇠로 실행해 보면 "Inspecting a SortedCollection"
이라는 제목이 붙은 창이 열릴 것입니다. 위의 명령을 실행하게 되면 500 개
가 넘는 원소들이 들어 있는 모듬이 결과값으로 돌아오게 되는데 이를 좀 더
쉽게 탐색하기 위해서는 객체 탐색기를 사용하는 것이 편리합니다.

객체 탐색기는 두 부분으로 이루어지는데, 왼쪽에는 그 객체에 속해있는  부
분 부분들의 이름이 표시되고, 오른쪽에는 현재 돋이된 부분의 값이  표시됩
니다. 맨 위의 "self"는 탐색하고 있는 객체 자신을 나타냅니다.

객체 탐색기는 복잡한 구조의 객체를 효율적으로 들여다보는데 매우 큰 몫을 
하고 있습니다.


1.5.4. 갈래씨줄 탐색기
----------------------
자, 여러분이 지금 어디에 있던지 Tools > Class Hierarchy Browser  메뉴를
실행시키거나  글쇠판에서   를  누르면   '갈래씨줄  탐색기'Class 
Hierarchy Browser)를 불러낼 수 있습니다. 갈래씨줄 탐색기를 줄여서 '갈래 
탐색기'라고도 부릅니다.

갈래는 홀로 떨어져서 있는 것이  아니라 다른 갈래와 관계를 맺고  있는데, 
이 갈래씨줄 탐색기는 이러한 갈래들의 씨줄(hierarchy)을 짚어가며  갈래들
을 탐색할 때 사용하는 도구입니다.  모두 크게 내 부분으로 이루어진  갈래 
탐색기가 매우  복잡해 보이겠지만,  이 창에  익숙해질 때쯤이면  여러분은 
Smalltalk의 절반 이상을 공부한 셈이 됩니다.

Smalltalk에서는 모든 것이 객체입니다.  그러므로 프로그래밍을 할  때에도 
이러한 객체를 사용하거나 아니면 새로 만들어야 합니다. 이 일을 이  '갈래 
탐색기'에서 할 수 있기 때문에, '일터'와 더불어 프로그래밍을 할 때  가장 
자주 사용되는 도구이기도 합니다.


1.5.5. 길수 탐색기
------------------
우리가 Smalltalk에게 어떤 명령을 내리면 Smalltalk는 길수(method)를 뒤져
서 이 명령을 어떻게 실행해야할지를 알아냅니다. 길수 탐색기는 이러한  길
수들을 따로 모아서 탐색할 때 쓰이는 도구입니다. 다음의 명령은 길수 중에
서 'Dolphin'이라는 낱말이 들어간 것을 지금 쓰고 있는 본(image)에서 죄다 
찾아내는 명령입니다. 약 3M 이상 되는 바탕글(source code)에서 글귀를  찾
는 것이므로 몇 초 정도 시간이 걸립니다.

        SmalltalkSystem current browseContainingSource: 'Dolphin' 
        ☞ "길수 탐색기 열림"

생각보다 많은 길수에 "Dolphin"이라는  글귀가 포함되어있습니다. 이  길수 
탐색기는 크게 두 부분으로 나누어져 있습니다. 위쪽 창에는 길수  이름들이 
표시되어 있고 각각의 길수를 돋이할 수 있도록 되어있습니다. 그리고  아래
쪽 창에는 위쪽 창에서 돋이되어있는 길수의 바탕글이 표시됩니다. 길수  탐
색기는 앞서 말한 것과 같이 주로 여러 갈래(class)에서 조건에 맞는 길수를 
뽑아내어 내용을 살펴보고자 할 때 사용합니다.


1.5.6. 꾸러미 탐색기
--------------------
Smalltalk 환경의 Tools > Package Browser 메뉴를 선택하면 꾸러미  탐색기
를 열  수 있습니다.  꾸러미(package)에는 Smalltalk의  갈래, 객체,  자원
(resource) 등이 함께 꾸려져서 들어있습니다. 주로 꾸러미는 하나의 커다란 
프로그램을 만들 때, 그 프로그램과 관계된 여러 가지 객체들을 넣어놓고 관
리하기 위해서 사용됩니다. 꾸러미 탐색기는 이러한 꾸러미를 새로 만들거나 
이미 있던 꾸러미를 들여오거나, 지우거나 고치는 일을 합니다. 

꾸러미 탐색기는 크게 세 부분으로 되어있습니다. 왼쪽에 세로로 길게  되어 
있는 창은 현재 Dolphin Smalltalk 환경에 설치되어있는 꾸러미들을  늘어놓
느 것입니다. 오른쪽 윗부분은 현재 꾸러미에 들어있는 것들을 살펴보기  위
한 곳으로써, 갈래, 길수, 넓은 꼬리표(global variables), 자원 등을  각각 
따로따로 볼 수 있는 고름(tab)이 달려있습니다. 오른쪽 아랫부분은  위에서 
돋이된 내용을 실제로  보여주는 곳입니다.  갈래가 돋이되어있다면  갈래꼴
(class definition)을, 길수가 돋이되어 있다면 바탕글 등을 보여줍니다.

꾸러미 탐색기는 Smalltalk 환경에서 움직이는  모든 객체를 관리하는 매우 
중요한 도구입니다.


1.5.7. 창맵씨
-------------
창맵씨(View Composer)는 사용자 접속 환경(User Interface)를 만드는  도구
입니다. Tools > View Composer 메뉴를  선택하면 이 창을 열 수  있습니다. 
여기서 여러분은 창(window)이나 대화 상자(Dialog box)를 만들어서  프로그
램을 사용하는 최종사용자가 자료를 입력할 수 있도록 해 줍니다.

넓은 부분이 실제로 창을 설계할  때 사용하는 부분이고, 아래에 위치한  세 
개의 창은 각각 현재 창의 뼈대, 현재 선택된 객체가 가지는 꼴(aspect), 그
리고 바로 왼쪽에 돋이되어있는 꼴이 갖고 있는 값을 표시하는 부분입니다. 

창맵씨에는 '연모통'(tool box)라고 하는 딸림창이 떠 있습니다. 이  창에는 
창을 만들 때  필요한 여러  가지 부품 자원이  들어있습니다. 글씨  꼬리표
(label), 입력 상자(edit box), 단추(push button)는 물론 이미 만들어진 창
도 여기에 표시됩니다.

Delphi나 Visual Basic에서는 창을 설계하는 것에 상당히 많은 비중을  둡니
다. 물론 Smalltalk에서도 창 만들기는 매우 중요한 위치를 차지하지만,  기
본적으로 창을 설계하기 전에 먼저 객체를 만들어야 합니다. 따라서  앞으로 
창맵씨를 사용하기까지 참으로 긴 여정이 여러분을 기다리고 있을 것입니다.


1.5.8. 자원 탐색기
------------------
Tools > Resource Browser를 선택하면 자원 탐색기를 열 수 있습니다.  앞서 
창맵씨를 설명하면서 '연모통'에 대해서 이야기한 적이 있습니다.  연모통은 
창을 만들 때 쓸 수 있는 여러 가지 부품 자원들이 들어있다고 했는데, 자원
탐색기는 이러한 자원을 관리하는 일을 합니다. 새로운 자원을 만들거나  이
미 있는 자원의 이름을 바꾸기도 하고, 자원이 연결된 갈래의 상태를 바꾸기
도 합니다. 창맵씨와 더불어 자원 탐색기도 사용자 접속 환경을 만드는데 매
우 중요한 역할을 수행하고 있습니다.


1.5.9. 발자취 창과 벌래잡개
---------------------------
사람은 누구나 실수를 하기마련입니다. 저도 그렇고 여러분도 그럴  겁니다. 
Smalltalk에게 명령을 내릴 때에도 여러분이나 저나 실수를 할 때가  있습니
다. "발자취 창"(walkback window)은 Smalltalk 프로그램이 실행되는 상태에
서 어떤 중대한 문제가 발생했을 때, 지금까지 어떤 길수들이 어떻게 실행되
어왔는지의 자취를 표시하고, 사용자가 알맞은 조치를 취할 수 있도록  돕는 
창입니다.

아래의 명령을  글쇠로 실행시켜 봅시다.

        5 hello  ☞ "발자취 창 열림"

위 명령을 실행하자마자 "SmallInteger does not understand #hello"라는 제
목이 붙은 발자취  창이 표시될 것입니다.  이 내용인즉슨  "SmallInteger는 
hello라는 지시를 알아듣지 못했다"는 것입니다.  즉 "5 hello"라는 명령을 
Smalltalk가(정확히는 숫자 '5'가) 알아듣지 못했다는 말입니다.

그리고 아래에 나타난 작은 상자 안에 여태까지 명령을 실행한 발자취를  표
시합니다.

---------------------------------------
        SmallInteger(Object)>>doesNotUnderstand:
        UndefinedObject>>{unbound}doIt
        CompiledExpression>>value:
        SmalltalkWorkspace>>evaluateRange:ifFail:
        SmalltalkWorkspace>>evaluateItIfFail:
        SmalltalkWorkspace>>evaluateIt
                ....(하략)
---------------------------------------

여러분 대부분이 아직 위의 내용이 무엇을 의미하는지 정확하게 이해하지 못
했을 것입니다. 그러나 Smalltalk에 익숙한 사람들은 위의 정보를 보고,  대
체 어떤 경로를 따라서 명령이 실행되었으며 어디서 문제가 발생헀는지를 추
측할 수 있게 됩니다. 물론  대부분의 경우는 발자취 창의 제목만  보고서도 
문제의 원인을 파악할 수 있습니다. 지금과 같은 경우에는 우리가 내린 명령
을 알아듣지 못했다는 것이 문제이겠지요.

이 발자취 창의 아래쪽에 네  개의 단추가 있습니다. 이 중에서  은 
문제를 무시하고 계속 프로그램을 실행시킬 때 쓰고, 는 지금 실
행시킨 명령 실행을 끝내라는 것이고,  마지막으로 은 현재 실행되고
있는 명령에 대한 정보를 깡그리 지워버리고 명령 실행을 중단할 때  사용합
니다.

여기서  단추를 누르면 "벌레잡개"(debugger) 창이 나옵니다. 이  창
은 여러 개의 명령을 하나씩 하나씩 실행하면서 명령을 실행할 때 마다 바뀌
는 여러 객체의 상태를 관찰하면서 문제의 원인을 탐색할 때 사용하는  도구
입니다. 쉽게 말해서, 탐정들이 사건이 일어난 것을 되짚으면서 원인을 찾는
것과 비슷하다고 하겠습니다. 벌레잡개 창은 그 구조와 동작이 매우  복잡하
게 이루어져 있어서, Smalltalk에서 명령이 어떤 방식으로 실행되는지를  알
아야만 제대로 활용할 수 있는 도구입니다. 그러므로 지금은 단순히  벌레잡
개가 이런 것이구나 정도로만 이해해 두면 될 것입니다. 나중에  벌레잡개를 
어떻게, 언제, 왜 사용해야 하는지에 대해서 자세하게 이야기할 기회가 있을 
것입니다.

---<잠깐!>----------------------------------------------------------
                        다른 Smalltalk에서는...

기본적으로 모든 Smalltalk 환경은 알림판과  일터, 갈래씨줄 탐색기, 객체 
탐색기, 발자취 창, 벌레잡개를 가지고 있습니다. 그리고 여기에 더해서  각
각의 Smalltalk마다 조금씩  다른 기능을 가지는  창이 추가되어  있습니다.
Dolphin의 경우 꾸러미 탐색기나 창맵씨, 자원 탐색기가 있으며,  Smalltalk 
Express라는 Smalltalk 환경에서는 Disk Browser가 있다고 합니다.
----------------------------------------------------------

---<잠깐!>----------------------------------------------------------
Windows와 같이 그림 위주의 사용자 환경(GUI)에서는 마우스가 필수적인  입
력장치로 생각되고 있습니다. 물론 이것은 맞는 말입니다. 그러나  마우스가 
언제나 편한 것만은 아닙니다. 어떤 때는 글쇠판이 마우스보다 편할  경우가 
있으니까요.
Smalltalk로 작업을 하다보면 여러 개의 창이 열려있고 각각의 창을  왔다갔
다해야 하는 일이 잦습니다. 이럴 때 일일이 작업 표시줄에 있는 창 제목을 
눌러서 이동하는 것보다는 이나  글쇠를 눌러서  이
동하는 것이 훨씬 편합니다. 글쇠를 누른 상태에서  글쇠를  눌러
보십시오. 그리고  글쇠에서 손을 떼어 보십시오. 그러면 화면  가운데 
작은 창이 뜨고, 현재 열려 있는 창들이 표시될 것입니다. 은 오른
쪽으로 이동하고,  은 왼쪽으로  이동합니다. 이는  Windows 
3.1 때부터 있던 '작업 전환'기능인데, 특히 Smalltalk처럼 많은 창을  가지
고 작업해야 할 때 편리하게 사용할 수 있을 것입니다.
----------------------------------------------------------

       ==========================================================

지금까지 우리는 Smalltalk란 대체 어떤  언어이고, 어떻게 동작하며, 또한 
Smalltalk 환경을 어떻게 설치하고 유지하는지에 대해서 알아보았습니다. 그
리고 Smalltalk 환경이 어떻게 생겼는지도 둘러보았습니다. 이 과정에서  우
리는 몇 가지 짧지만 Smalltalk의 특징이 잘 드러난 몇 개의 명령들을 실행
해 봄으로써, Smalltalk 환경에 친해질 수 있도록 했습니다.

이제 여기까지 온 여러분은 Smalltalk 환경에 대해서 어느 정도 익숙해 있어
야 합니다. Smalltalk를 시작하고 끝내고, 명령을 내리는 일 등은 Smalltalk
를 공부하면서 가장 기본적으로 알고있어야 할 사항들이기 때문입니다. 이제 
이런 것들을 바탕으로 다음 가름[章]에서부터는 Smalltalk 언어와  객체지향
에 대해서 본격적으로 알아보도록 하겠습니다.

                                                                계속...



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:03
Processing time 0.0184 sec