Python Official Site의 Tutorial 에 대한 내용을 공부하면서 정리한 글.


기본적으로 이 글은 Tutorial의 각 챕터에 대한 간략한 설명과

노란색 박스 안에 있는 코드를 보는 것 만으로는 이해하기 어려운 부분이나,

매번 기억해 두어야 할 내용들 그리고 C/C++ 과는 좀 다른 부분

혹은 Python 2.x 버전과는 다른 부분 위주로 정리해 보려 함.

글의 순서는 원래 문서의 챕터에 따름.


이 글의 범위:

4. More Control Flow Tools




4. More Control Flow Tools

바로 이전 글에 보여준 while문 외에, 다른 control flow 문들에 대한 설명.


4.1. if Statements

기본적인 사용방법 예제. elif 부분이나 else 부분은 없어도 된다.

python에는 switch-case문은 없지만 if .. elif ... elif ... 문으로

switch-case문을 대체할 수 있다.

>>> x = int(input("Please enter an integer: "))

Please enter an integer: 42

>>> if x < 0:

...      x = 0

...      print('Negative changed to zero')

... elif x == 0:

...      print('Zero')

... elif x == 1:

...      print('Single')

... else:

...      print('More')

...

More


4.2. for Statements

python의 for 문은 C 나 Pascal과는 조금 다르다.

항상 iterable 을 사용하여 반복을 한다.

기본적인 사용법은 아래와 같다.

>>> # Measure some strings:

... words = ['cat', 'window', 'defenestrate']

>>> for w in words:

...     print(w, len(w))

...

cat 3

window 6

defenestrate 12

만약, for 루프 내에서 for 문의 iterating에 사용되는 데이터를 수정해야 한다면,

iteration에 사용되는 데이터는 아래와 같이 복사본을 사용해야 할 것이다.

>>> for w in words[:]:  # Loop over a slice copy of the entire list.

...     if len(w) > 6:

...         words.insert(0, w)

...

>>> words

['defenestrate', 'cat', 'window', 'defenestrate']


4.3. The range() Function

일정한 순서의 숫자들을 반복(iterate)해야 한다면,

range()라는 내장(built-in) 함수를 사용하면 된다.

다음의 사용예를 보자.

>>> for i in range(5):

...     print(i)

...

0

1

2

3

4


>>> a = ['Mary', 'had', 'a', 'little', 'lamb']

>>> for i in range(len(a)):

...     print(i, a[i])

...

0 Mary

1 had

2 a

3 little

4 lamb


>>> print(range(10))

range(0, 10)


>>> list(range(5))

[0, 1, 2, 3, 4]

첫번째 예제를 보면 range(10)으로 리턴되는 object가 list처럼 사용되지만,

실제로는 그렇지 않다. 예제의 마지막 부분을 보면 단순히 range(10)을 한다고 하여

list가 리턴되지 않는다. 하지만 range(10)에 리턴되는 object는 iterable 하기 때문에,

for 문에서도 사용할 수 있었던 것이다.

그리고 list() 함수를 통해 list로 만들 수 있다.


4.4. break and continue Statements, and else Clauses on Loops

break 와 continue 문의 사용법은 C 와 동일하게 사용된다.

루프문도 else 절을 가질 수 있다. 이 else 절은 break 가 아닌

정상적인 경우로 for 나 while 루프가 종료된 경우,

else 절이 수행된다.

(for 문은 list 를 모두 소진하여 루프가 종료된 경우,

 while 문은 조건이 false 가 되어 루프가 종료된 경우가 되겠다)

아래의 예제를 보자.

>>> for n in range(2, 10):

...     for x in range(2, n):

...         if n % x == 0:

...             print(n, 'equals', x, '*', n//x)

...             break

...     else:

...         # loop fell through without finding a factor

...         print(n, 'is a prime number')

...

2 is a prime number

3 is a prime number

4 equals 2 * 2

5 is a prime number

6 equals 2 * 3

7 is a prime number

8 equals 2 * 4

9 equals 3 * 3

python에서는 들여쓰기(identation)가 매우 중요하다.

위의 예제의 경우도 else 의 위치가 바로 이전의 if 문 보다 왼쪽에 위치해 있기 때문에,

if 에 대한 else 가 아니라 for 루프에 대한 else 로 해석된다.


4.5. pass Statements

pass 문은 아무것도 하지 않는다.

문법적으로 statement가 필요하지만, 아무것도 하지 않으려 할 때 사용된다.

예를 들면 빈 클래스나 아무일도 하지 않는 함수를 만들 때 사용할 수 있겠다.

>>> class MyEmptyClass:

...     pass

...


>>> def initlog(*args):

...     pass   # Remember to implement this!

...


4.6. Defining Functions

함수를 정의하는 방법에 대한 내용이다.

간단한 피보나치 수열을 구하는 함수예제를 살펴보자.

>>> def fib(n):    # write Fibonacci series up to n

...     """Print a Fibonacci series up to n."""

...     a, b = 0, 1

...     while a < n:

...         print(a, end=' ')

...         a, b = b, a+b

...     print()

...

>>> # Now call the function we just defined:

... fib(2000)

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

함수는 'def' 키워드로 시작하여 함수이름과 괄호로 묶인 파라메터 리스트가 나온다.

함수의 내용은 다음 줄 부터 시작되며 반드시 들여쓰기(ident)가 되어야 한다.

위 예제의 함수 본문의 첫 줄은 선택사항으로 함수에 대한 설명을 적는다.

이 문자열을 funtion's documentation string 혹은 docstring 이라 한다.

docstring을 잘 작성해 둔다면, API 문서 등을 생성하는 데 도움이 된다.

함수 내에서 사용되는 변수는 local symbol table에 저장되고,

함수를 벗어나게 되면 더 이상 사용할 수 없다.

global variable 을 사용하려 할 때는 C 처럼 바로 접근할 수 있는 것이 아니라,

'global' 키워드를 사용해야 한다.

>>> a=10

>>> def f():

a=20


>>> print (a)

10

>>> f()

>>> print (a)

10


>>> def f():

    global a

a=20


>>> print (a)

10

>>> f()

>>> print (a)

20

함수의 파라메터는 호출되는 함수의 local symbol table에 저장되기 때문에,

arguments는 call by value를 사용하여 전달된다고 할 수 있겠다.

단, 이 value는 항상 object에 대한 reference이다.

C++ 로 치면 아래의 예제에서 함수 원형은 void f(&l); 정도 되겠다.

아래의 예제를 보면 list object의 복사본이 함수로 전달되는 것이 아니고,

실제 list object에 대한 reference가 넘어가기 때문에,

함수내에서 list의 내용을 변경하게 되면,

함수 호출 전/후로 list의 내용이 바뀌게 된다.

(각주: 그렇게 때문에 call by object reference 라고 하는게  더 정확한 설명이 될 것이다)

>>> a=[10,20,30]

>>> def f(l):

l[0]=50


>>> print(a)

[10, 20, 30]

>>> f(a)

>>> print(a)

[50, 20, 30]

함수도 다른 변수에 할당하여 다른 이름으로 사용할 수 있다.

마치 C 의 함수포인터 같은데... 아래 예제를 보자.

>>> fib

<function fib at 10042ed0>

>>> f = fib

>>> f(100)

0 1 1 2 3 5 8 13 21 34 55 89

함수는 return 문을 통해 값을 리턴할 수 있다.

return 문이 없는 함수의 리턴값은 None이다.(None은 built-in name이다.)

>>> def fib2(n): # return Fibonacci series up to n

...     """Return a list containing the Fibonacci series up to n."""

...     result = []

...     a, b = 0, 1

...     while a < n:

...         result.append(a)    # see below

...         a, b = b, a+b

...     return result

...

>>> f100 = fib2(100)    # call it

>>> f100                # write the result

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]


>>> def f():

pass


>>> print (f())

None

result.append(a) 는 result = result + [a] 와 동일하지만 더 효율적이다.


4.7. More on Defining Functions

함수의 arguments는 3가지 형태가 있으며, 섞어서 사용을 할 수가 있다.


4.7.1. Default Argument Values

arguments에 default value를 지정해 두어,

함수 호출 시 default value가 지정된 argument가 생략되면

default value를 사용하도록 한다. 다음의 예제를 보자.

def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):

    while True:

        ok = input(prompt)

        if ok in ('y', 'ye', 'yes'):

            return True

        if ok in ('n', 'no', 'nop', 'nope'):

            return False

        retries = retries - 1

        if retries < 0:

            raise IOError('refusenik user')

        print(complaint)

위와 같이 정의된 함수라면 아래와 같이 호출 할 수 있다.

(위의 예제에서 if ~ in 의 사용법도 봐 두자.)

ask_ok('Do you really want to quit?')

ask_ok('OK to overwrite the file?', 2)

ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')

default value는 변수로 지정할 수도 있다.

함수가 정의되는 위치에서 evaluate되는 값을 사용한다.

예를 들어 아래 예제의 경우 '5'가 출력될 것이다.

i = 5


def f(arg=i):

    print(arg)


i = 6

f()

경고: default value는 단 한번만 evaluate된다. 

이것은 default value가 list나 dictionary 같은 mutable object인 경우,

다음과 같이 의도하지 않은 결과를 보여줄 수도 있다.

def f(a, L=[]):

    L.append(a)

    return L


print(f(1))

print(f(2))

print(f(3))

위의 예제는 아래와 같은 결과를 출력한다.

[1]

[1, 2]

[1, 2, 3]

만약 매번 f() 함수를 호출 할 때마다, L 이 초기화 되길 원한다면,

아래와 같이 사용해야 할 것이다.

def f(a, L=None):

    if L is None:

        L = []

    L.append(a)

    return L


4.7.2. Keyword Arguments

함수를 호출할 때, keyword arguments를 사용할 수 있다.

아래 예제를 보자.

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):

    print("-- This parrot wouldn't", action, end=' ')

    print("if you put", voltage, "volts through it.")

    print("-- Lovely plumage, the", type)

    print("-- It's", state, "!")

parrot(1000)                                          # 1 positional argument

parrot(voltage=1000)                                  # 1 keyword argument

parrot(voltage=1000000, action='VOOOOOM')             # 2 keyword arguments

parrot(action='VOOOOOM', voltage=1000000)             # 2 keyword arguments

parrot('a million', 'bereft of life', 'jump')         # 3 positional arguments

parrot('a thousand', state='pushing up the daisies')  # 1 positional, 1 keyword

위와 같이 직접 키워드와 값을 지정하여 함수를 호출 할 수 있다.

또한, 임의의 갯수를 argument로 받거나 dictionary를 argument로 받을 수도 있다.

*arguments - arbitrary argument는 **keywords - dictionary argument 보다

위치가 앞에 와야한다. 아래 예제를 보면 어떻게 사용하는지 알 수 있다.

def cheeseshop(kind, *arguments, **keywords):

    print("-- Do you have any", kind, "?")

    print("-- I'm sorry, we're all out of", kind)

    for arg in arguments:

        print(arg)

    print("-" * 40)

    keys = sorted(keywords.keys())

    for kw in keys:

        print(kw, ":", keywords[kw])


cheeseshop("Limburger", "It's very runny, sir.",

           "It's really very, VERY runny, sir.",

           shopkeeper="Michael Palin",

           client="John Cleese",

           sketch="Cheese Shop Sketch")


위의 실행 결과는 아래와 같다.

-- Do you have any Limburger ?

-- I'm sorry, we're all out of Limburger

It's very runny, sir.

It's really very, VERY runny, sir.

----------------------------------------

client : John Cleese

shopkeeper : Michael Palin

sketch : Cheese Shop Sketch


4.7.3. Arbitrary Argument Lists

함수에서 임의의 갯수의 arguments를 받기위해 사용하는 방법인다.

이 arguments는 tuple 데이터 타입이 될 것이다.

일반적으로 이 arbitrary argument는 일반적인 argument의 가장 뒤에 위치하지만,

위에서 본 dictionary argument나 아래 예제에서 볼 keyword argument는

arbitrary argument 뒤에 위치할 수도 있다.

def write_multiple_items(file, separator, *args):

    file.write(separator.join(args))

위는 일반적인 사용 법. 아래는 keyword argument와 함께 사용하는 예제.

>>> def concat(*args, sep="/"):

...    return sep.join(args)

...

>>> concat("earth", "mars", "venus")

'earth/mars/venus'

>>> concat("earth", "mars", "venus", sep=".")

'earth.mars.venus'


4.7.4. Unpacking Argument Lists

list 나 tuple을 unpack 하여 함수인자로 넘길 수 있다.

같은 방식으로 dictionary로 unpack하여 인자로 넘길 수 있다.

아래 예제를 참고하자.

>>> list(range(3, 6))            # normal call with separate arguments

[3, 4, 5]

>>> args = [3, 6]

>>> list(range(*args))            # call with arguments unpacked from a list

[3, 4, 5]


>>> def parrot(voltage, state='a stiff', action='voom'):

...     print("-- This parrot wouldn't", action, end=' ')

...     print("if you put", voltage, "volts through it.", end=' ')

...     print("E's", state, "!")

...

>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}

>>> parrot(**d)

-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !


4.7.5. Lambda Forms

많은 사람들의 요구에 의해 Lisp과 같은 functional programming language의 몇 가지 특징이

python에도 추가되었다. lambda 함수가 그 중 하나인데,

lambda 키워드로 작은 익명의 함수를 만들 수 있다.

lambda 형식은 function object가 필요한 어떤 곳이듯 사용될 수 있다.

그리고 문법적으로 항상 하나의 expression으로 제한된다.

아래의 예제를 참고하자.

>>> def make_incrementor(n):

...     return lambda x: x + n

...

>>> f = make_incrementor(42)

>>> f(0)

42

>>> f(1)

43


>>> f = lambda a,b:a+b

>>> f(10,20)

30


4.7.6. Documentation Strings

docstring의 내용과 형식에 대한 몇 가지 규칙이 있다.

첫 번째 줄은 object의 목적에 대해 짧고 간결하게 적는다.

짧게 만들기 위해 object의 이름이나 타입을 적지 않는다.

(단, 함수의 이름이 함수의 동작을 설명하는 동사가 되는 경우는 제외한다.)

이 줄은 대문자로 시작하여 마침표로 끝난다.


만약 docstring이 여러 줄이라면, 함수의 요약이 나머지 설명과 시각적으로 분리되도록,

두 번째 줄은 빈 줄이어야 한다.

이 후 줄들은 object의 호출 규칙, side effect 등을 설명하는

하나 이상의 문단으로 이루어진다.


python 파서는 multi-line 문자열에 대해서는 들여쓰기(identation)를 잘라내지 않기 때문에,

필요하다면 들여쓰기를 없애는 작업이 필요할 것이다.

이러한 작업은 다음과 같은 규칙을 사용한다.

첫 번째 줄 이후 처음으로 나타나는 내용이 있는 줄(non-blank line)의 들여쓰기를

전체 docstring의 들여쓰기로 결정한다.


아래는 multi-line docstring 의 예제이다. 들여쓰기를 주의깊게 보라.

>>> def my_function():

...     """Do nothing, but document it.

...

...     No, really, it doesn't do anything.

...     """

...     pass

...

>>> print(my_function.__doc__)

Do nothing, but document it.


    No, really, it doesn't do anything.


4.7.7. Function Annotations

이것은 완전한 선택사항이다.

python 이나 standard library 둘 다 이것을 사용하지 않는다.

자세한 것은 직접 tutorial을 참고 할 것.


4.8. Intermezzo: Coding Style

함수와는 관계 없으나 이제 더 길고 복잡한 python 코드를 작성하게 될텐데,

지금이 코딩 스타일에 대한 이야기를 하기에 좋은 타이밍이다.

PEP 8(Python Enhancement Proposals 8)는 대부분의 python projects가 준수하는

style guide를 나타낸다. 이것은 매우 가독성 있고 눈이 즐거운 코딩 스타일이다.

모든 python 개발자들은 반드시 읽어야 할 것이다.

여기는 가장 중요한 점만 뽑아놓았다.

- 4-space 들여쓰기를 사용하라. tab은 사용하지 말것.

  4 spaces는 더 적은 들여쓰기와 더 큰 들여쓰기의 적절한 타협점이다.

  tab은 혼란을 야기할 수 있으니 사용하지 않는 것이 좋다.


- 한 줄이 79 문자를 넘지 않도록 줄을 나누라.

  이것은 작은 화면을 가진 유저를 위한 것이고,

  더 큰 화면에서 여러 코드 파일을 동시에 볼 수 있게 해 준다.


- 함수와 클래스 그리고 함수 내부의 논리적 코드 블럭을 나누기 위해

  빈 줄을 사용하라.


- 가능하다면, 주석은 해당 코드와 같은 라인에 두라.


- docstrings를 사용하라.


- 연산자 앞뒤와 콤마 뒤에는 공백을 두라. 하지만 괄호 바로 안쪽은 붙여쓰라.

  a = f(1, 2) + g(3, 4)


- class 이름은 CamelCase 형태로, 함수는 lower_case_with_underscores 형태로 쓰라.

  class methon 의 첫 번째 argument의 이름은 항상 self 를 사용하라.


- 소스 파일의 인코딩은 UTF-8을 사용하라. 여의치 않다면 ASCII 도 잘 동작할 것이다.


- 마찬가지로, 식별자로 non-ASCII 문자를 사용하지 마라.



반응형

설정

트랙백

댓글

Python Official Site의 Tutorial 에 대한 내용을 공부하면서 정리한 글.


기본적으로 이 글은 Tutorial의 각 챕터에 대한 간략한 설명과

노란색 박스 안에 있는 코드를 보는 것 만으로는 이해하기 어려운 부분이나,

매번 기억해 두어야 할 내용들 그리고 C/C++ 과는 좀 다른 부분

혹은 Python 2.x 버전과는 다른 부분 위주로 정리해 보려 함.

글의 순서는 원래 문서의 챕터에 따름.


이 글의 범위

1. Whetting Your Appetite 3. An Informal Introduction to Python



1. Whetting Your Appetite

특별한 내용은 없음. C/C++/Java 나 Shell Script 보다 Python 이 나은 이유를 설명함.


2. Using the Python Interpreter

Python 인터프리터 사용에 대한 내용.


2.1. Invoking the Interpreter

2.1.1. Argument Passing

2.1.2. Interactive Mode

2.2. The Interpreter and Its Environment

2.2.1. Error Handling

2.2.2. Executable Python Scripts

Unix 시스템에서는 Python 스크립트를 바로 실행하기 위한 방법.

아래와 같은 줄을 넣으면 python file.py 형태가 아닌 ./file.py 형태로

바로 Python 스크립트를 실행할 수 있다. 물론 chmod +x 로 실행권한을 줘야한다.

#! /usr/bin/env python3.3

2.2.3. Source Code Encoding

기본적으로 Python 소스파일은 UTF-8로 처리가 되는데, 만약 사용하는 에디터가 UTF-8이 지원이 되지 않는다면,

(요즘은 웬만한 에디터는 다 지원한다. 윈도우의 기본 메모장이라도!)

아래와 같은 라인을 파일의 첫번째나 두번째 라인에 적어 소스파일의 인코딩을 직접 지정해 줄 수 있다.

# -*- coding: cp-949 -*-

지원하는 인코딩의 종류는 여기에서 확인할 수 있다.


2.2.4. The Interactive Startup File

2.2.5. The Customization Modules

3. An Informal Introduction to Python

Python에 대한 간단한 소개. 숫자, 스트링, 리스트에 대한 간단한 예제를 보여준다.


3.1. Using Python as a Calculator

3.1.1. Numbers

+, -, *, /, **, // 와 같은 연산자가 있다.

'/' 연산자의 경우 Python 2.x 과 3.x 가 조금 다르게 동작한다.

아래 예제 참고.

(Python 2.x)

>>> 3/4

0

>>> 3.0/4

0.75


(Python 3.x)

>>> 3/4

0.75

'//' 연산자는 나누셈 후 소숫점 부분을 버린 결과를 보여준다.

'**' 연산자는 제곱 연산

특별히 '_' 문자는 interactive 모드에서만 사용되는 것으로 마지막으로 계산의 결과를 저장한다.

(print 로 출력된 것이 아닌 순수한 계산결과.)


3.1.2. Strings

Python에서 문자열은 single quotes-작은따옴표('...')와 double quotes-큰따옴표("...")로 표현할 수 있고,

둘 다 같은 결과를 가진다. 작은따옴표 안에서 큰따옴표를 표시할 때나 반대의 경우에는 따로 escape 문자 '\'를

적을 필요가 없다. 작은따옴표 안에서 작은따옴표를 표시항 경우나 큰따옴표 안에서 큰따옴표를 표시할 때는 

'\'를 적어주어야 한다. 아래의 예제를 보면 좀 더 명확해진다.

>>> 'spam eggs'  # 작은 따옴표

'spam eggs'

>>> 'doesn\'t'  # 작은따옴표내에서 작은따옴표를 사용할 때 

"doesn't"

>>> "doesn't"  # 아니면 큰따옴표를 사용한다.

"doesn't"

>>> '"Yes," he said.'

'"Yes," he said.'

>>> "\"Yes,\" he said."

'"Yes," he said.'

>>> '"Isn\'t," she said.'

'"Isn\'t," she said.'

>>> print ('"Isn\'t," she said.')

"Isn't" she said.

마지막 바로 전의 예제는 다소 혼란스러운데, interactive 모드에서 문자열이 echo 될 때, 위와 같이 출력된다.

실제 스크립트에서 '"Isn\'t," she said.'라고 실행하더라도 해당 문자열이 표시(echo)되지는 않는다.

결국 print 명령으로 문자열을 출력해 보면 원하는 결과대로 출력이 된다.

따라서 크게 의미를 둘 필요는 없다.

만일, 문자열에서 '\'이 특수문자가 아닌 문자 그대로 해석이 되길 원한다면 아래와 같이 raw string을 사용한다.

>>> print('C:\some\name')  # here \n means newline!

C:\some

ame

>>> print(r'C:\some\name')  # note the r before the quote

C:\some\name

문자열이 여러줄인 경우 triple-quotes:"""...""" 혹은 '''...'''을 사용할 수 있다.

이 경우 한 줄의 끝에는 자동으로 new line 문자가 포함되는데,

'\'을 줄 끝에 붙이면 이것을 방지 할 수 있다. 아래의 예제를 보라.

>>> print("""\

Usage: thingy [OPTIONS]

     -h                        Display this usage message

     -H hostname               Hostname to connect to

""")

Usage: thingy [OPTIONS]

     -h                        Display this usage message

     -H hostname               Hostname to connect to

문자열내의 한 문자 혹은 부분문자열을 나타낼때는 아래와 같은 방법들이 있다.

>>> word = 'Python'


>>> word[0]  # character in position 0

'P'

>>> word[5]  # character in position 5

'n'


>>> word[-1]  # last character

'n'

>>> word[-2]  # second-last character

'o'

>>> word[-6]

'P'


>>> word[0:2]  # characters from position 0 (included) to 2 (excluded)

'Py'

>>> word[2:5]  # characters from position 2 (included) to 5 (excluded)

'tho'


>>> word[:2] + word[2:]

'Python'

>>> word[:4] + word[4:]

'Python'


>>> word[:2]  # character from the beginning to position 2 (excluded)

'Py'

>>> word[4:]  # characters from position 4 (included) to the end

'on'

>>> word[-2:] # characters from the second-last (included) to the end

'on'

Python 문자열은 변경할 수 없다.(immutable). 그러므로 아래와 같은 assigning은 에러가 발생한다.

>>> word[0] = 'J'

  ...

TypeError: 'str' object does not support item assignment

>>> word[2:] = 'py'

  ...

TypeError: 'str' object does not support item assignment


3.1.3. Lists

대괄호안에 콤마로 분리된 리스트로 씌여진다. 리스트는 다른 타입의 아이템을 가질 수 있지만,

일반적으로 같은 타입의 아이템을 가진다.

기본적인 사용법은 아래와 같다.

>>> squares = [1, 2, 4, 9, 16, 25]

>>> squares

[1, 2, 4, 9, 16, 25]


>>> squares[0]  # indexing returns the item

1

>>> squares[-1]

25

>>> squares[-3:]  # slicing returns a new list

[9, 16, 25]


>>> squares[:]

[1, 2, 4, 9, 16, 25]

마지막 명령은 리스트의 새로운 복사본을 생성하는데,

이것은 for 루프에서 iterable에 사용되는 리스트의 내용이 루프내에서 변경되는 경우,

iterable 을 리스트 자체가 아닌 리스트의 복사본으로 사용하려 할 때 편리하다.


3.2. First Steps Towards Programming

간단한 프로그램 예제. 기본적인 while 루프 및 print() 함수 사용법을 알 수 있다.

>>> # Fibonacci series:

... # the sum of two elements defines the next

... a, b = 0, 1

>>> while b < 10:

...     print(b)

...     a, b = b, a+b

...

1

1

2

3

5

8


반응형

설정

트랙백

댓글

이런저런 이유로 집에 리눅스 머신을 마련하려고 합니다.


그러나 리눅스를 설치할 컴퓨터를 사더라도 놔 둘 공간도 없고,

원래 컴퓨터에 파티션을 나눠서 쓰려니 그것도 별로 땡기진 않아서

기존 컴퓨터를 사용하되 가격이 저렴한 USB 에 설치하는 방법을 고민해 보았습니다.


여기서 부터 고민이 시작되었는데요,

일단 USB 2.0 은 너~~무 느리기에, USB 3.0을 지원하는 모델로 찾아봤습니다.


( 출처: http://en.wikipedia.org/wiki/USB_3.0 )

( USB 3.0 은 위 사진의 제일 왼쪽의 포트처럼 파란색으로 되어있습니다.)


8GB 는 너무 적은거 같고 무난한 16GB 정도로...

다나와를 찾아보면 가격대가 다양합니다.

대략 SLC, MLC, TLC 이 같은 제품이라면 가격이 비슷하긴 합니다만,

그래도 일단 어떤게 괜찮을 지 조사를 시작했습니다.



인터넷 서핑을 통해 아래 사이트를 찾았는데요,

http://www.whoratesit.com/16GB-USB-Flash-Drive/Ratings/4800


위 사이트에서 16GB Usb Flash Drive 의 CrystalDiskMark나 ATTO의 속도 테스트 결과를 볼 수 있습니다.

여기서 다나와에서 파는 물건들 적당히 추려서 검토해 보았습니다.

가격은 오늘 날짜의 가격을 기준으로 하였으며, 속도는 MB/sec으로 읽기속도/쓰기속도입니다.


1. Sandisk Extreme Z80 16GB

스펙 상 속도: 190/55

벤치마크 결과: 196/62
==> 배송비 포함 약 24,000


2. Transcend JetFlash 760 16GB

스펙 상 속도: ?/?

벤치마크 결과: 80/26
==> 배송비 포함 약 15,000


3. ADATA S102 PRO 16GB

스펙 상 속도: 100/?

벤치마크 결과: 90/23
==> 배송비 포함 약 17000


4. Transcend JetFlash 780 16GB

스펙 상 속도: 140/40

벤치마크 결과: 170/39

==> 배송비 포함 약 27,500.

( 다나와 최저가에 오류가 있어 신고하기 해 두었습니다.

  최저가가 12,920 원으로 검색 되어서 깜짝 놀랐습니다 ).


5. Verbatim Store n Go V3 USB 3.0 16GB

스펙 상 속도: 60/12

벤치마크 결과: 81/45 (혹은 45/19)

==> 배송비 포함 약 17,000
( 최고 속도는 박스가 아닌 UK 웹사이트에 표시되어 있습니다.
   다나와에 판매하는 버바팀 V3 Limited Edition USB 3.0와 동일한 것인지는 모르겠습니다만,

   USB 이미지 및 상자 이미지를 보니 동일한 모델인 듯 합니다.

   테스트 사이트의 코멘트를 보면 다른 사람의 테스트에서는 45/19 라는 결과를 얻었다고 되어 있습니다.)


6. Lexar JumpDrive Triton USB 3.0 16GB

스펙상 속도: 150/110

벤치마크 결과: 169/106

==> 다나와 검색 시 물건이 검색이 되지 않습니다. 정식 판매처가 없는 듯 합니다.

       해외 직구 시 대략 7-8만원 정도...

( 이건 속도를 보고 깜짝 놀라서 좀 찾아봤습니다.

  저의 USB 구매 이유에 비춰보면 이런 걸 살 바에야 SSD 를 하나 더 사서 달겠습니다. -_- )



결국 대략 Extream Z80이나 JetFlash 760 중에 고민하다가,

Sandisk Extream Z80 을 골랐습니다. 만원 아끼려다가 스트레스 받는 거 보다 나을거 같아서요.


참고로 USB 3.0을 지원하지 않는 USB 메모리 중 인기가 많은 Sandisk Cruzer Blade Z50의 경우

가격은 절반 정도지만 속도 차이는 안습입니다.

용량이 큰 파일의 경우 17/5 정도 512파일의 경우 17/1 정도 속도가 나옵니다.


http://www.whoratesit.com/32GB-USB-Flash-Drive/Ratings/4801


위 링크는 32GB USB Flash Drive에 대한 평가입니다.

혹시 구입 계획이 있으시다면 참고하시길 바라며..



반응형

설정

트랙백

댓글

Codex를 찾아가기 전에 더 구해야 할 것이 있다.

Codex를 원래대로 돌려놓기 위해서 필요한 물건이다.

가고일의 Vortex Lens는 가지고 있으니, 인간의 Vortex Lens가 있어야 한다.

또, 도둑들이 훔쳐간 Vortex Cube도 찾아야 한다.


1. Vortex Lens

(바로 이 친구. 유머감각도 있다.)


일단 브리타니아로 돌아와 인간이 만든 Vortex Lens를 만들고,

인간이 훔쳐간 Vortex Cube를 찾아보자.


브리타니아를 충실히 모험을 했다면, 렌즈같은 걸 만든다는 천문학자를 기억할 것이다.

이 친구는 Lycaeum 북동쪽에 있는데, 가서 가고일이 만든 Vortex Lens를 보여주고,

오목한 형태의 Vortex Lens를 만들어 달라고 하자.

그러면 Glass Sword가 필요하다고 한다. 지금까지 모험하면서 한 자루 정도는 구했을 것이다.

만약 없다면 Britain에서 Gem 5개를 구입해 Minoc의 Dale에게 가면 Glass Sword를 얻을 수 있다.



2. Vortex Cube

이제 Vortex Lens는 해결이 되었으니, Vortex Cube를 찾으러 가자.

가고일 Caretaker이 도둑들은 Lost Hope Bay를 지나갈 것이라고 말한 것을 기억하는가?

Lost Hope Bay는 Minoc을 끼고 있는 만이다. 그 만의 남쪽이 바로 Stonegate이다.


(어라? 깊은 산속에 웬 꼬마가? 하지만 밤에는 자러가서 보이지 않을 것이다.)


Lost Hope Bay를 헤메다 보면 해안가에서 웬 아이를 발견할 수 있는데,

이런 저런 대화를 나누다보면, 그 아이의 사정을 들을 수 있고 Stonegate에 대해서도 들을 수 있다.

성 주변에 여러가지 물건이 많이 있는 곳인데, Mama나 Papa에게 물어보라고 한다.


아이가 있는 곳에서 남쪽으로 가면 집이 하나 있는데, 웬 Cyclops가 살고 있다.

Cyclops들에게 Cube를 물어보면 지하실(Cellar)에 있는데 잠겨(Locked)있다고 한다.

그리고 열쇠를 원하냐고 물어보면서 그렇다면 물고기를 잡아오라고 한다.


집 안의 낚시대(fishing pole)를 가지고 물고기를 잡으러 가자.

물가로 가서 낚시대를 사용하면 된다. 잘 잡히지 않는다면 자리를 바꿔가면서 잡으면 된다. 

물고기를 가지고 Main Cyclops에게 가면 열쇠를 준다.



(숨겨진 문을 발견했다!)



3. Codex를 향하여...

(Sacred Quest를 받지 못했다면 지나갈 수 없다)


The Temple of Codex의 위치는 가고일 왕국으로 이어지는 Hythloth 던전의 북쪽에 있다.

물론 orb of the stone으로도 쉽게 이동할 수 있다.


안으로 들어가 Codex를 보면 Codex를 돌려놓는 방법을 친절하게 알려준다.

Codex가 시키는 대로 하면 엔딩이 시작된다.


(세팅 완료!)




(후기)

이 공략을 쓰느라 정상적인 루트로 엔딩을 3번은 본 거 같네요.

쓰면서 왜 이걸 시작했을까 후회하기도 했는데, 다 쓰고 나니 후련하군요.

다 쓰고 다시 한 번 공략 검증도 할겸 한 번 더 엔딩을 보려 했는데,

지금은 다시 하고 싶은 생각은 안 드는군요 ㅎㅎ


당분간은 회사 일에 집중하면서 보던 미드를 마저 보고,

얼마전에 받아둔 파판3나 즐겨야겠습니다.

반응형

설정

트랙백

댓글


이 책은 왜 기아 문제가 해결되지 않는가에 대한 진짜 이야기를 들려줍니다.
최초 책이 작성된 것은 1999년 이지만  이 책이 번역된 2007년에도,

지금 제가 글을 쓰는 2013년에도 여전히 같은 이유들로 세계의 많은 사람들이 기아로 고통을 받고 있죠.


제가 기부한 돈이 온전히 그들에게 도움이 되면 좋겠지만, 불행히도 그렇지 않다는게 문제입니다.

그 이유는 여러가지가 있습니다. 해당 국가의 정치적 문제, 다국적 기업의 탐욕, 구호단체의 예산 부족 등...


책에서 이야기하는 문제점들을 보고 있으면,

그 문제를 해결하기 위해 할 수 있는 것이 별로 없다는 것이 더욱 슬픕니다.

할 수 있는 건 그저 신자유주의 정책을 비판하고 그런 것을 신봉하는 정치인에게 투표하지 않으며,

더 나아질 것이라는 희망을 가지고 기부를 계속 해 나가는 것 정도?


하지만 이런 문제에 관심을 가지고 해결하기 위해 노력하는 것을 그만두면 안 되겠지요.

사람이라면 말이지요...



반응형

'책 이야기' 카테고리의 다른 글

오만과 편견  (0) 2013.08.13
우리들의 행복한 시간  (1) 2006.10.02

설정

트랙백

댓글

Codex가 있는 곳으로 가기 위해서는 The Temple of Singularity에서 Sacred Quest를 받아야 한다.

(분량상 Vortex Lens 와 Vortex Cube를 구하는 것은 따로 분리하여 마지막 편에 적겠다.)


Captain Bolesh가 The Temple of Singularity는 날아서 가야한다고 이야기 했는데,

인간은 어떻게 가야하는 걸까?


개인적으로 나는 처음 실마리는 Lycaeum의 도서관에서 발견했다.


(정상적인 입구는 없는거야?)

Lycaeum의 도서관 사서인 Thariand와 이야기를 나누다 보면 'The Lost Art of Ballooning'이라는

책이 있다는 것을 알게 된다. 일단 도서관으로 들어가 보자. 도서관을 뒤지다 보면

책을 찾을 수 있는데, 책에는 Minoc의 땜장이가 잊혀진 벌룬의 기술을 알아냈다고 적혀있다.


이제 Minoc에 가서 수소문을 하면, 시장인 Isabella가 기구를 타던 사람은 중요한 임무 때문에

날아간 뒤 돌아오지 않았다고 하며, Selganor가 거기에 대해 좀 더 말해줄 수 있을거라 한다.

옆 집의 Selganor를 찾아가서 물어보면, 그는 Sutek의 성으로 날아갔다고 말한다.

그리고 Sutek은 먼 남쪽의 섬에서 살고 있는데, Serpent's Hold의 동쪽에 있는 곳이라 알려준다.


(여기 토끼는 왜 이리 사나워?)


Sutek의 성으로 들어가면 요령 것(?) 길을 찾아서 Sutek에게 가자.

그에게 Balloonist에 대해 물어보면, 지하묘지에서 죽었다고 말한다.

숨겨져 있는 지하묘지의 입구를 찾아 내려가자.

지하 1층에서 길을 잘 찾아서 지하 2층으로 가면 머리가 둘 달린 말이 있는데,

알쏭달쏭한 퀴즈를 낸다. (그걸 풀면 제대로 된 길을 알려주는 지는 모르겠다.)

어쨌거나 지하 2층의 갈림길에서는 오른쪽 길로 가야 한다.


(왼쪽 길로 가면...)

(으악... 갈림길을 잘못 선택하면 다시 배를 타고 Sutek의 성으록 가야한다.)



(balloon plans 발견.)

지하 4층에서는 시체 한 구와 Balloon 제작 방법이 적힌 계획서를 발견할 수 있고,

동료로 맞이 할 수 있는 Gorn이라는 친구가 방황하고 있다.


계획서를 읽어보면, Balloon을 만들기 위해 다음과 같은 것들이 필요하다고 적혀있다.


1. 여러 명이 탈 수 있는 커다란 바스켓.

2. 뜨거운 공기를 만들어 내는 불을 피워둘 큰 철제 가마솥.

3. 뜨거운 공기를 담아둘 수 있는 실크로 만든 거대한 주머니.

4. 풍선을 바스켓에 단단히 묶을 충분한 밧줄.


위의 재료들을 전부 모으면 계획서를 사용(Use)하여 조립하라고 되어있다.

그리고 배의 닻이 있다면 언제 어디서든 원할 때 멈출수 있어

기구를 안정적으로 조작할 수 있다고 적혀있다.


이제 하나씩 찾으러 가보자.


Minoc의 Michell은 Basket을 팔고있다.

그녀와의 대화를 기억한다면 바로 이곳으로  와야한다는 사실을 알 수 있을 것이다.

그녀는 아버지가 8명이나 태울 수 있을 정도로 큰 바스켓을 만들지만,

그 계획서(plans)를 보여준 적이 없어 자신은 만들 줄은 모른다는 이야기를 한다.

하지만 아바타가 가져온 계획서를 보여주면 300gold에 거대한 바스켓을 만들어 준다.


이것으로 Balloon Basket 획득.


(이거 가져가면 안되나?)


이제 큰 철제 가마솥을 구할 차례이다.

계획서에서 Big Iron Cauldron이라고 적혀 있길래 이것도 뭔가 해야 되는 줄 알았는데,

그냥 보통 Cauldron을 사용하면 된다. (이거 때문에 대장장이들을 찾아 한참 해멨다.)

가장 쉽게 구할 수 있는 곳은 Brintain의 지하 1층이다.

다른 봐둔 데가 있다면 거기에 가서 구해도 무방하다.


계획서에 적혀 있는 Enough rope는... 1개면 된다.

(가마솥도 그렇고 헷갈리게 적어 놨다.)



이제 Huge silk bag을 구하러 가자.

Paw에 온 김에 Paw의 옷가게 부터 찾아가보자.


(이 할아버지는 아니다. 웬지 Huge silk bag을 만들기에는 힘들어 보이지 않은가?)


Marissa의 옷가게에 가서 풍선(balloon)에 대해 물어보면,

Large silk bag을 말하는 거라면 어렵지만 가능하다고 이야기한다.(이런 횡재가...)

하지만 실크천이 필요한데 멍청한 Arbeth가 spidersilk에서 실크실을 잣을수 있고,

New Magincia의 Charlotte가 실크실로 실크천을 짤수 있다고 말해준다.


(그 할아버지는 아니야...)

Arbeth는 Marissa와 같은 마을에 있다.

실크천을 만들기 위해서는 시약인 Spider's Silk 40개가 필요하다.

재료를 준비해서 Arbeth에게 가면 20gold를 받고 실크실타래를 만들어 준다.


(차칭 가장 겸손하다는 아가씨 Charlotte.)


이제 실크천을 만들기 위해 New Magincia의 Charlotte를 찾아가자.

10gold에 금방 만들어 준다.


실크천을 구했으니 다시 Paws의 Marissa에게 돌아가 Balloon을 만들어 달라고 하자.

75gold를 받고 계획서에 따라 Silk Bag을 만들어 준다.


이제 재료가 다 모였으니 기구를 제작하자.

모든 재료를 파티원 한 명에게 몰아주고 계획서(Plans)를 사용하면 기구 제작이 완료된다.

두근거리는 마음으로 시승을 해보자. 어어... 방향이 자기 멋대로 움직인다.

이걸 해결하려면 두 가지 방법이 있는 데, 손쉬은 4서클의 Wind change 마법을 추천한다.

하지만 이 마법의 문제는... 가고일 왕국에서는 원하는 방향의 반대 방향으로 간다는 것이다.

(나의 실험으로는 반대 방향으로 가던데, 이게 무작위인지는 모르겠다.)

사용할 때 마다 바람 방향을 시계방향으로 45도씩 바꿔주는 fan이라는 아이템을 구해야한다.

Hawkins의 보물 중에서 구하거나 Yew의 대장간에 있는걸 훔칠 수 있다.

(fan에 대한 힌트는 Yew의 대장장이 Utomo에게서 얻을 수 있다.)


(orb를 통해 이동하면 이곳으로 도착한다. 북동쪽에 기구로 넘어갈 수 있는 길이 보인다.)


이제 준비가 되었으면 The Temple of Singularity로 가자.

가고일 마을로는 orb of the stone을 통해 The Temple of Singularity으로 가는

산 바로 밑까지 바로 갈 수 있다. 그리고 기구를 이용해 산을 넘어 들어가자.


Dispel Field로 입구를 뚫고 안으로 들어가면 작은 돌 피라미드 형태의 제단이 보인다

이 제단에 말을 걸면 무엇을 찾느냐고 묻는다. 그러면 당신의 내면 깊은 곳을 보고 

다음 질문에 대답하라고 한다. "진정 누구를 위해 Codex를 찾는가?"

대답은... 직접 생각해 보길 바란다.

현명한 대답을 하면, 그렇다 하더라도 (가고일) 종족을 이해하지 못하는데 제대로 할 수 

있겠느냐고 하며 Control, Passion, Diligence 의 성소(지하묘지)로 가라고 한다.

거기에서 그 원칙들(principles)을 가장 잘 보여주는 존재가 묻힌 장소를 찾을 것이라 말한다.


각 원칙들에 대해 물어보면 그 곳으로 가는 방법을 알려주는데,

사실 orb of the stone으로 쉽게 이동이 가능하다.


(Shrine of Control의 퍼즐. 레버를 잘 조작해야 한다.)


1. Shrine of Control

많은 레버들과 2개의 스위치가 있다.

엉뚱한 레버나 스위치를 건드리게 되면 열린 문을 다시 닫아 버리게 되니,

하나씩 움직여 보면서 문을 하나하나 열어가도록 하자.

솔로 모드로 작업을 하면 좀 더 편리할 것이다.


철문과 프로텍션 필드를 지나면 Mondain의 조각상이 보일 것이다.

나는 이전 울티마 시리즈를 안 해서 잘 모르겠지만,

어쨌던 이전 울티마 시리즈에서 아바타의 적으로 등장한 인물이라고 한다.

(다른 Shrine도 마찬가지...)


어쨌거나 Mondain이 Principle of Control을 가장 잘 보여주는 존재라는 건가?

말을 걸어보면 이런 저런 이야기를 한다. 자기가 한 일은 Self-Control이 안되서라나...

가고일들은 Control을 이해하고 있다고 한다.

그리고 Mantra of Control이 'Un'이라고 알려준다.


이것으로 Shrine of Control에서의 할 일은 끝났다. 다음 Shrine으로 이동하자.


(Shrine of Passion으로 가는 길. 용암을 지나가야 한다.)


2. Shrine of Passion

Shrine of Passion의 조각상으로 가는 길은 용암과 파이어필드로 막혀있고 데몬들도 지키고 있다.

Mass Protection을 걸고 지나가 힘으로 데몬들을 뚫어도 되지만 

투명화된 데몬과 Charm 마법은 귀찮다.

편하게 가려면 그냥 아바타에게 Invisibility와 Protection을 걸고 솔로 모드로 다녀오자.


여기에는 Minax의 조각상이 있다. 말을 걸어보면 자기는 열정이 넘쳐서 그랬다나...

가고일들은 Passion을 잘 이해하고 있고, 동기가 부족한 이들을 이끌어 준다고 한다.

그리고 Mantra of Passion은 'Or'이라고 알려준다.


이제 마지막 Shrine으로 이동하자.


3. Shrine of Diligence

(Shrine of Diligence. 조각상을 찾아가려면 부지런히 찾아봐야겠군.)


Shrine of Diligence의 조각상으로 가는 길은 비밀문을 찾아야 하는데...


(비밀문 발견!)


이 곳에는 Exodus의 조각상이 있다. 물론 데몬들도 함께...

데몬들을 처리하고 조각상과 이야기를 하면, 너무 부지런해서 원래 목적을 잊어버렸다나...

목표가 없는 부지런함은 부지런함이 없는 목표만큼 가치가 없단다.

그리고 수단이 목적을 대신할 수 없고, 부지런함이 목표를 대신할 수 없다.

(목표가 없는데 부지런할 수가 있는지는 의문이지만,

 어쨌거나 행하지 않는 목표은 가치가 없는 법... 삶의 진리다.)

역시나 가고일들은 Diligence에 대해서 이해하고 있단다.

그리고 Mantra of Diligence는 'Us'라고 알려준다.



세 개의 Shrine을 모두 방문했다면, The Temple of Singuarity로 돌아가자.

가서 제단에 말을 걸면 Catacomb에는 다녀 왔냐고 묻는다.

그렇다고 대답하면 Mantra of Singularity가 무멋이냐고 묻는다.


Singularity의 사전적 의미를 보면, 단일성이라는 의미가 있다.

뭔가 감이 오는가? 여기에 잘 대답을 하면...

Final Quest가 시작되었다고 알려 준다.


이제 Sacred Quest를 받았으므로 Codex가 있는 곳으로 갈 수 있게 된다.




(다음 편에 계속...)

반응형

설정

트랙백

댓글

미닉스님의 IT 이야기 시즌2

(웹툰 주소)



(이미지출처: http://minix.tistory.com/433)

(이미지와 다르게 실제 책이 저 만큼 두껍진 않네요)


미닉스님의  보안 웹툰이 출간되었네요.

출판사에서 반응이 좋지 않아 직접 출간하신다길래,

한 권 구매 했습니다~ 게다가 싸인까지 들어있네요.


미닉스님의 블로그를 가시면 블로그에서 웹툰을 볼 수도 있고,

책을 구입할 수 있는 YES24 링크나 계좌번호를 알 수 있습니다.


개인적으로 미닉스님의 웹툰을 모두 잘 읽은터라 책도 구입하게 되었습니다만,

책을 구입하지는 않더라도 미닉스님의 웹툰을 다들 한 번씩 읽어보았으면 좋겠네요.


반응형

설정

트랙백

댓글

저번 주인가 Google Play에서 파판3를 할인한다고 하는 걸

보고 접속해 보니 50% 할인을 하고 있더군요.




할인해서 5000원인데, 살짝 고민을 하다가 과감하게 질렀습니다.

그런데!!!!


분명 스크린샷은 영문판이었는데, 실제 게임을 하니 한글로 나오는게 아니겠습니까?



한글로 나오는 것만으로 이미 5000원이 안 아까웠습니다.


옛날 패미컴으로도 그 뒤 NES 에뮬로도, NDS로도 모두 엔딩을 봤습니다만,

명작은 또 하고 싶은 마음이 들게 하네요.


하지만 다른 해야할 것들이 많아서 엔딩이나 볼지 모르겠네요.

그래도 스마트폰으로 할 수 있으니 틈나는 대로 하다보면 엔딩을 보겠지요..


반응형

설정

트랙백

댓글

(오랫만에 보는 Mariah. 내가 왜 왔는지 정녕 모른단 말이야?)


Silver Tablet의 반쪽을 구했으니 Moonglow의 북쪽에 있는 Lycaeum에 있는

Mariah에게 돌아가자. 마리아에게 Silver Talbet 조각을 가지고 왔다고 하면,

자신의 연구실에 있는 나머지 조각도 가지고 오라고 한다.

나머지 조각을 가지고 다시 Mariah에게 가서 이야기를 하면 이제 번역을 할 수 있다고 말한다.

그리고 Tablet을 잠시 조사한 뒤 예언의 서를 더듬더듬 읽기 시작한다.


"고대의 예언은 세계의 종말이 올 때의 날들에 대해 이야기 한다.

 종말이 오기 전에 3가지의 징후 있을 것이다.


 거대한 악의 존재가 우리의 땅으로 올 것이며, 이것은 종말이 가까워 오는 것이다.

 이 악한 존재는 다른 종족으로 그들에게는 위대한 예언자로 여겨진다.

 그러나 이 거짓 예언자는 Control, Passion, Diligence의 신념을 따르지 않는다.

 어느 날 거짓 예언자가 와서 우리의 가장 성스러운 장소를 더럽힐 것이다.

 그리고 거짓 예언자는 우리의 가장 성스러운 아티팩트인

 The Codex of Ultimate Wisdom을  훔쳐갈 것이다.

 이 것이 종말의 첫 번째 징후이다.


 그 다음에 이렇게 적혀 있는데, 거짓 예언자가 이 땅의 깊숙한 곳을 더럽힐 것이다.

 그리고 거짓 예언자는 지하세계를 멸망시킬 것이다.

 엄청난 지진이 우리 세계를 조각조각 찢을 것이고 돌림병과 굶주림의 나날들이 올 것이다.

 이 것이 종말의 두 번째 징후이다


 마지막은 거짓 예언자가 올 때이다.

 이 때에 거짓 예언자는 전사단과 함께 올 것이고 그들은 남은 가고일 종족을 모두 파과할 것이다.


 이 예언을 피할 방법은 단 한가지 뿐이다.

 그것은 바로 거진 예언자의 희생이다."


Mariah는 잠시 멈추고 깊은 생각에 빠진다.


"가고일들이 언급하고 있는 '거짓 예언자'는 당신을 말하는 것이 틀림없어요.

 그들의 관점에서 당신을 악이라 생각하는 이유가 있을거예요.

 해결하기 어려운 문제군요. 내 생각엔 여기에 대해 좀 더 알아보는 것이 좋을거 같군요.

 Sin'Vraal이라는 가고일의 사막의 외곽에 살고 있는데, 그는 우리의 말을 할 줄 알아요.

 아마도 그가 당신에게 이 책과 가고일들이 우리를 어떻게 생각하는 지에 대해

 좀 더 말해 줄 수 있을 것 같네요."


Mariah와의 긴 대화가 끝나면 Sin'Vraal을 만나러 가자.

지도를 얻기위해 The Dry Land에 갔을 때 본 가고일이 바로 Sin'Vraal이다.


(이제 이 무거운 것 필요없어!)


(또 만났네요?)


Sin'Vraal을 만나 예언의 서에 대해 물어보자.

예언의 서에는 거짓 예언자가 가고일 종족을 멸망시키러 올 것이라고 적혀있다고 한다.

오직 거짓 에언자의 희생(Sacrifice)만이 자신들을 구할 수 있을것이라 한다.

다시 희생이라는 것에 대해 물어보면, 자신들의 언어에는 희생이랑 많은 것을 의미한다고 말한다.

그라고 좀 더 알기 위해서는 가고일 학자를 찾아야 할 것이라 한다.

세계의 반대편을 여행하기 위해서는 한 가지를 찾아야 하는데,

Hythloth를 지나 아래로 내려가 가고일 왕국으로 가면 얻을 수 있을 것이라 이야기 해 준다.


역시나 Hythloth 던전도 위치에 대한 힌트를 얻을 수 없는데,

Hythloth의 입구는 브리타니아의 남동쪽에 있는 섬인 The Isle of Avatar에 있다.


(가고일 지역으로 이어지는 던전이다. 어째서 Shrine of Humility에 가고일이 많은지 이해가 된다.)


세계의 반대편으로 가는 길인 만큼 던전의 난이도도 상당한데, 

Dragon과 Daemon이 등장한다. 지하 3층에서는 용암지역을 지나가야 하기도 한다.

Captain John을 만나기 전까지 특별한 아이템도 없다.


(Captain John... 살아있었군.)


John에게 대화를 걸면 결국 인간이 이곳에 왔다며 좋아한다.

게다가 보통 인간이 아닌 아바타임을 알아보고 더 놀라는데...


John과 대화를 하면 이런저런 이야기를 해 주는데,

아바타의 행동으로 만들어진 힘들이 가고일의 땅을 폐허로 만들고 있다고 하며,

이제는 단 하나의 가고일 도시(city)만이 남아있다고 한다.

그리고 가고일 종족을 구하기 위해서 아바타에게 무엇인가 해야 한다고 말한다.

하지만 자신은 무엇을 해야 하는지 모르니 가고일들과 이야기(talk) 해 보라고 한다.

Beh Lem 이라는 어린 가고일의 도움으로 자신은 가고일의 말을 배웠다고 한다.

그리고 가고일의 언어를 배우고 싶냐고 물어본다. 그렇다고 하면 그는 스크롤을 하나 준다.

그리고 가고일 언어의 기본적인 단어가 적혀있는 스크롤을 사용하라고 한다.

그는 가고일(gargoyle)들은 대부분의 인간들이 믿고 있는 것처럼 악한 존재는 아니라고 하며,

자신은 그들과 만든 시간동안 대화를 했으며, 그들은 인간과 다르지 않았다고 한다.


이야기를 끝내고 가려하면, 잠깐 기다리라고 하며

Beh Lem을 만나 함께 가고일 땅을 여행하라고 한다.

그것이 아바타가 그들을 구할 수 있는 유일한 방법이고 아바타가 해야만 하는 일이라 한다.


(이걸로 언어를 배운거임?)


대화를 끝내고 John이 준 스크롤을 사용하자.

John의 은신처 북서쪽에 있는 출구로 나가면 가고일 왕국에 도착한다.

John에게 Beh Lem에 대해 물어보았다면 매일 정오에 만난다는 것을 알 것이다.


(이 어린 가고일이 마지막 동료가 될 Beh Lem이다.)


스토리 진행 상 Beh Lem은 반드시 동료가 되어야 한다.

만약 파티가 8명이라면 한 명은 내보내야 한다.


Beh Lem과 대화를 하면 아바타가 거짓 예언자(Prophet)임을 알아본다.

그리고 자신과 자신의 아버지 Valkadesh를 제외하고 모두가 아바타를 두려한다고 말한다.

자기는 아버지를 존경하며 아버지 같은 학자가 되려고 한다고 이야기하며

아버지를 만나고 싶냐고 물어본다.

만나고 싶다고 말하면, 아바타와 함께 가면서 알려주겠다(guide)고 하며 파티에 합류한다. 


가는 길은 산을 따라 서쪽으로 가다가 Hall of Knowledge이 보이면,

동쪽의 산을 따라 북쪽으로 올라가라고 한다. 북쪽으로 가다가 보면 산 사이에서

좁은 길을 찾을거라 한다. 그 길을 따라 가면 아버지가 있는 집을 찾을 수 있을 것이라 말한다.

육분의로 본다면 대략 남위 40도 동경 65도 쯤이라고 한다.


Valkadesh에게 말을 걸면 아바타가 이 쪽 세계로 오는 것을 기다려 왔으며 예언의 책은

틀리다고 믿는다고 말한다. 그리고 아바타는 명예와 존경의 존재임을 알 수 있고,

그러한 명예를 배반하지 말고 Codex를 돌려달라고 한다.

또 예언으로부터 자신들을 구해달라고 이야기한다.


일단 Valkadesh를 찾아온 목적인 예언의 책에 적힌 희생(Sacrifice)의 의미를 물어보자.


Codex를 원래대로 돌려놓지 않는다면, 아바타의 생명을 희생하는 것 말고

다른 선택(choice)은 없다고 말한다. 다른 선택에 대해 좀 더 자세히 물어보면,

희생은 3가지 의미가 있다고 말한다. 그것은 각각 자신의, 다른 사람의, 소중한 것의 희생을 

의미하며 아마도 3가지 의미 중 나은 해답(answer)을 찾아야한다고 말한다.

해답에 대해서 다시 물어보면, 가장 현명한 가고일인 Naxatilor를 찾아가 희생에 대해 물어보라 하며,

그리고 Naxailor는 Hall of Knowledge의 북동쪽 집에 살고 있다고 알려준다.


대화를 끝내고 떠나려 하면, 지금은 아바타는 모든 가고일로부터 핍박을 받고 있으니

왕에게가서 항복을 하라고 말한다. 그러면 더 이상 가고일들이 핍박을 하지 않을꺼라 하며

먼저 왕(Inquisitor)에게 항복을 해야 해답을 찾는 것이 쉬워질 것이라 한다.


자신들 종족의 왕인 Draxinusom은 Hall of Knowledge의 북서쪽 집에 있으며

자신들의 땅을 자유롭게 여행하려면 그에게 가서 항복하라고 말한다.


(거짓 예언자라고 말도 받아주지 않는다.)


그냥 Naxailor에게 가면 거짓 예언자라며 상대도 해 주지 않는다.

우선 Draxinusom를 찾아가자.


(어이없어 하면서도 말은 받아주는 가고일들의 왕.)


Naxailor에게에게 항복한다고 이야기하는 것 말고는 특별히 뭔가 이야기 할 것이 없다.

일단 Valkadesh가 말한대로 항복(surrender)한다고 이야기를 하면,

이곳에 항복을 하기 위해 왔냐고 묻는다.

그리고 자신들을 구하기 위해 기꺼이 죽을 것이냐 물어본다.

또, 자신에게 아바타의 생명을 줄 것이냐 물어본다.

전부 그렇다고 이야기를 하면 "왜?"냐며 이유를 물어본다.


지금까지 게임의 대화를 잘 읽으며 진행한 사람을 대답을 찾을 수 있을지도 모르겠다.

나의 대답은 "Sacrifice"였다.


어쨌든, Naxailor가 만족할 만한 대답을 하면 크리스탈 아뮬렛을 주며 입으라고 한다.

이 때 결사반대를 하는 우직한 동료 Dupre...

생명까지 걸겠다고 이야기 하는데 아뮬렛 쯤이야... 착용한다고 대답해 주자.


그러면 아바타가 보여준 고귀함에 대해 놀랐다고 하며,

더 이상 가고일들이 아바타를 귀찮게 하지 않을 것이라 말한다.

마지막으로 희생을 해야할 때가 오면 알려주겠다고 말한다.


(The Amulet of Submission. 한 번 착용하고 나면 벗을 수 없다.)


(확인해 보진 않았지만, 아마도 여기에서 카르마가 낮으면 진행이 안될 것 같다.)

이제 Naxailor에게 돌아가자. 말을 걸면 아바타는 이 세계를 파괴할 운명(fated)이라고 한다.

그리고 아바타가 훔쳐간 Codex 때문에 이 땅에 엄청난 혼란이 왔으며,

그것(Codex)을 돌려 놓는 것 외에는 다른 선택(choice)가 없다고 한다.

아니면 아바타의 생명을 포기해야 할 것이라 한다.


이 대화에서도 가고일 왕국을 혼란에서 구할 방법에 대한 힌트는 나왔는데...

좀 더 명확하게 알기 위해 원래 찾아온 목적인 희생(Sacrifice)에 대해 물어보자.

그러면 3가지 의미(self, others, value) 중 어떤 희생에 대해서 묻고 싶냐고 한다.


self와 others의 의미가 궁금하다면 직접 물어보도록 하고...(대충 짐작은 가지 않는가?)

value의 의미를 물어보면 진정한 가치를 가지 것은 Codex 뿐이라 답해준다.

그리고 Codex가 파괴되었냐고 물어본다.

그렇지 않다고 대답해 주면 Codex를 Vortex를 돌려 놓고,

인간과 가고일 두 종족 모두에게 똑같이 이득이 될 수 있도록

양쪽 세상에서 모두 Vortex를 볼 수 있도록 하라고 한다.


Vortex에 대해 물어보면, Hall of Knowledge의 남쪽방에 있으며

거기에 가서 The Book of Ritual을 읽고 Vortex Lens를 가지고 오라고 말한다.


(Vordex Chamber. Lens는 깨져있고, Cube는 없다.)


Hall of Knowledge의 남쪽방에는 깨진 렌즈가 있고, 서쪽방에는 The Book of Ritual이 있다.

The Book of Ritual를 읽어보면 예전에 Codex를 가져왔던 방법에 대해 적혀있다.

관리인에게 Cube에 대해 물어보면 몇 년전 인간 도둑들이 훔쳐갔다고 하며,

그들이 도망치면서 'Stonegate'라는 이름을 언급했다고 한다.

또 그들은 배를 타고 Lost Hope Bay를 지나가려고 한다는 것을 들었다고 이야기 한다.


일단은 깨진 렌즈를 가지고 Naxailor에게 가면, 북동쪽의 렌즈메이커에게 가서 고쳐오라고 한다.

렌즈를 고쳐서 다시 오면, The Book of Ritual을 읽어봤냐고 물어본다.

자기 스스로 의식을 바꿀 수는 없다고 하며, Codex가 어떻게 Vortex로 돌려놓지 말해줄 것이라고 한다.

그리고 인간이 만든 또 하나의 렌즈(lens)가 필요한데, 그 렌즈로 인간들도 Codex을 볼 수 있을거라 한다.

Vortex Lens를 인간 렌즈메이커에게 보여주고 렌즈를 만들어오라고 한다.

단, 그 렌즈는 오목한 형태의 렌즈여야 한다고 강조한다.


마지막으로 Codex에 대해 물어보면 Captain Bolesh가 Codex에서 막 돌아왔다고 이야기 해 준다.

그는 북쪽의 치료사의 집에 있으니 가 보라고 한다.


(이 가고일이 Captain Bolesh.)


치료사의 집에 있는 Captain Bolesh에게 Codex에 대해서 물어보면,

승리가 거의 발톱(?)사이에 들어왔으나, 마지막 순간에 방해를 받았다고 한다.

Codex주위로 통과할 수 없는 힘의 장벽을 만났다고 말한다.

자신들이 Codex를 가지고 있을 때도 그러한 장벽에 둘러 쌓여있었다고 하며

신성한 임무(quests)를 가진 현자만이 그것을 지나갈 수 있었다고 이야기한다.

신성한 임무는 The Temple of Singularity에서 받는다고 한다.

하지만 인간이 받을 수 있을지는 알 수 없다고 한다.

The Temple of Singularity는 북쪽의 산 중에 있으며, 그 곳으로 가려면 날아서 가야한다고 말한다.

자신들은 날개가 있으므로 날아가면 된다고 하는데... 인간은?


너무 많은 이야기를 들었더니 혼란스럽다. 정리를 해 보자.


가고일 왕국의 멸망을 막으려면 Codex를 돌려놔야 하는데,

여기에는 가고일과 인간이 만든 Vortex Lens와 도둑들이 훔쳐간 Vortex Cube가 필요하다.

또 날아서 가야 하는 The Temple of Singularity에서 Sacred Quests를 받아야만,

Codex가 있는 곳으로 들어갈 수 있다.


결국 가고일의 멸망과 인간 세계로의 침입은 아바타가 한 일로 인해서 발생한 것이니,

아바타 스스로 해결해야 할 것이다. 이제 인간과 가고일을 모두 구할 수 있는 방법을 알았으니,

마지막 모험을 떠나자.


P.S

(진정한 전사임을 증명하고 싶은가?)


가고일 왕국에 등장하는 몹은 Silver Serpent인데 무려 경험치는 91이다.

특히 마을의 남서쪽에 있는 Silver Horn을 사용하면 Silver Serpent가 나타난다.

마법에 약하니 마법(Disable 등)을 적절히 사용한다면 쉽게 잡을 수 있을 것이다.




(다음 편에 계속...)


반응형

설정

트랙백

댓글

8개의 지도 조각을 가지고 Buccaneer's Den에 있는 Homer에게 가서,

지도 조각을 다 모았다고 말을 하면 본격적으로 거래에 대한 이야기를 한다.


(이 자식, 전 세계를 헤매게 만들다니...)


일단 Silver Tablet은 가지라고 말한다. 그러면서 자신이 원하는 것은 단지 마법의 망토라고

이야기한다. 그 망토를 가져다 준다고 약속하면 9번째 지도 조각을 주겠다고 하며 그 외 나머지

보물들은 충분히 당신을 만족시켜 줄 것이라한다. 알겠노라 대답하면 마지막 지도 조각을 준다.

그리고 지도의 왼쪽위에 있는 섬이 Buccaneer's Den이라 말해주며 다시 한 번 망토를

가져다 달라는 다짐을 받는다. 다시 한 번 알겠노라 대답하면 그제서야 보물의 묻힌 정확한

위치를 알려준다. 'X'로 표시된 섬에 도착하면 3개의 돌이 있는데, 그 돌들의 가운데 서서

남쪽으로 3걸음, 서쪽으로 9걸음, 다시 남쪽으로 12걸음을 가면 죽은 고목이 오른편에 있고

그 곳의 바로 남쪽을 파면 보물을 찾을 수 있을거라 한다.


(지도 조각을 맞춰보자)


낑낑....


(지도 완성!!! 왼쪽아래는 X표가 아니라 삽과 곡괭이다.)


이제 위치를 파악했으면 지도를 챙기고(버려도 상관없다) 보물섬을 향해 출발하자.

묻혀있는 보물을 파려면 무엇이 필요할까? 당연히 삽이다. 반드시 삽을 챙겨가야 한다.

그리고 또 필요한 것은 Explosion 마법이나 Powder keg도 필요하다.


(오호라... 저 돌이군.)


보물이 묻힌 장소를 찾아 파 보면 보물을 숨겨둔 동굴로 이어지는 구멍이 생긴다.

이 동굴은 보물이 있는 장소 외에는 아이템이 없다.

지하 2층으로 내려가는 길은 여러 개가 나오는데 내려갔을 때, 호수가 보이는 길이 바른 길이다.

호수가 보이지 않는 쪽은 용암+드래곤 세트가 등장한다.

Skiff가 있다면 호수가 보이는 곳으로 내려와서 Skiff를 타고 남서쪽 육지로 가면 된다.

Skiff가 없다면 Mongbat과 Slime이 나타나는 곳에 있는 사다리를 이용해서 내려가자.


(이 곳이 지하 3층에서 지하 4층으로 갈 수 있는 구멍이다.)



(이것이 Captain Hawkins의 보물들.)


지하 4층에는 Captain Hawkins의 보물들을 모아둔 은신처가 있는데,

여기를 들어가려면 lockpicks로는 해결되지 않는다. 그냥 폭파시켜 버리자.

가장 중요한 Silver Tablet의 조각과 Homer가 원하던 Stormcloak도 챙기자.

다른 필요한 아이템이 있다면 챙겨서 떠나자.


Stromcloak를 Homer에게 갖다 주고 말고는 별 상관이 없는 듯 하다.

다만 Homer에게 말을 걸었을 때, Stormcloak를 발견했지만 주지 않겠다고 하면

카르마가 10 감소한다. 그리고 그걸 반복하면 계속 10씩 감소한다.

Stormcloak를 Homer에게 주면 카르마가 10 증가한다.


(볼 일을 다 보니 말도 안 받아 준다.)


이제 Silver Tablet 반쪽을 가지고 Mariah에게 돌아가자.




(다음 편에 계속...)

반응형

설정

트랙백

댓글