악의 추억


(스포일러 있습니다) 

우리 나라에서 발간된 추리 소설 자체가 매우 드물기 때문에 상당한 기대를 갖고 접했다. 결론부터 말하면, 기대가 너무 큰 탓일까. 기대에 크게 못 미치는 느낌이다.

우선 너무나도 단조롭고 상투적인 문체가 상당히 눈에 거슬린다. 관습적인 문장들이 상당히 자주 등장해서 읽다 보면 몰입에 방해를 줄 정도다. 게다가 재기 넘치거나 아름다운 문장도 거의 없어, 그저 사건을 전개하기 위한 수단으로 글을 사용한 듯한 기분이다. 심지어 등장하는 인물들의 이름마저도 어디서 한번쯤은 들어본 듯한 흔한 이름들이라 이러한 기분을 더욱 진하게 한다. (크리스, 라일라, 패트릭 등등..) 문학을 읽고 있는 게 아니라, 헐리우드 시나리오를 보는 기분이다. 

또한 추리소설답지 않게 전지적 시점을 사용한 것도 몰입에 상당히 방해를 준다. 일반적으로 추리소설의 경우 직접적인 심리 묘사는 최대한 피하고, 간접적인 인물의 묘사 등을 통해 심리를 조금씩 드러내기 마련이다. 그런데 이 '악의 추억'에서는 심리를 그냥 직접적으로 써버린다. 그것도 한 인물의 시각에서만 그런 것이 아니라 사건 전개 도중 거의 모든 인물의 심리를 서술해버리기 때문에, 긴장감이 상당히 떨어지고 몰입감이 떨어진다. 딱 잘라 말해서 읽는 재미가 너무 떨어진다. 개인적으로 추리소설은 글쓴이와 독자 간의 게임이라고도 볼 수 있다고 생각한다. 글쓴이가 얼마나 많은 패를 갖고 있다가, 독자의 뒤통수를 치느냐. 그런데 대부분의 패를 공개해버리면 재미가 없지 않은가. 아무리 가장 중요한 패를 하나 들고 있다고는 해도, 그걸 공개하는 건 결국 마지막 순간에 가서야 이루어지는 것인데. 그 시간까지 무슨 의욕을 가지고 이 단조로운 문장을 읽어내려 가라는 말인가?

결정적으로 사건 자체가 식상하고 어디선가 본 듯한 이야기라는 점이 가장 문제다. 기억을 잃어버려 이중 인격으로 행동하는 살인자? 물론 전체적인 사건의 구성 자체는 새롭게 짰지만, 기본 모티브 자체가 굉장히 익숙하다. 가뜩이나 문체도 단조롭고 네이밍 역시 눈에 익으며 심리 묘사도 직설적이라 긴장감이 떨어지는데, 핵심 사건 자체도 이처럼 흔하디흔한 모티브를 울궈먹었으니 재미가 있을 리가 없지 않나. 데니스와 크리스가 동일 인물이라는 마지막 반전을 통해 재미를 주려 했지만, 그까지 가는 과정이 지루하기 짝이 없고 그 반전 역시 흔하디흔해 진작부터 예측이 가능할 정도다. 이런데 읽을 맛이 나겠는가...

한 마디로 말해 책값이 아깝다. 

by 은엽 | 2009/12/04 16:03 | 감상 | 트랙백 | 덧글(0)
About IOCP

졸업 당시 제출했던 논문에서 그림 파일을 제외하고 올려둡니다.
올리는 이유는 하도 공부를 안 했더니 제가 헷갈려서;

1章. IOCP란 무엇인가?

일반적으로 (IO Completion Port)을 일컬어 IOCP라 한다.
이는 IO 작업[1] 을 수행하는 메커니즘 중의 하나이다. 보다 구체적으로 말하면, 비동기로 IO 작업을 수행해 오버헤드를 크게 줄이는 입출력 방식을 뜻한다. 즉, 지금까지의 입출력 방식이 프로그램을 수행하는 동안 입출력 작업을 수행하는 직렬 방식이었다면, 이 IOCP 방식은 프로그램의 수행과 입출력 작업을 분리해 병렬적으로 수행하는 것이다. 그 정의와 역할에 대한 설명은 이후 본문에서 계속하도록 한다.
이 IOCP라는 처리 방식의 특징은 모든 IO 작업을 오버랩시키면서 수행하는 입출력 방식, 즉 (Overlapped IO)를 통해 극명하게 드러난다고 볼 수 있다. (Overlapped IO)에 대해서는 차후 보다 자세히 언급할 것이다.
이러한 IOCP 처리 방식은 모든 입출력 작업에 적용될 수 있으나, 특히 IO 작업의 수가 대단히 많아 부하가 많이 걸리는 대규모 입출력 작업, 네트워크 작업과 같은 작업에 있어서 큰 효율을 보인다. 현재 대용량 윈도우 서버는 거의 대부분이 IOCP로 이루어져 있을 만큼, 이 IOCP는 동시에 많은 작업을 처리하는 경우에 최고의 효율을 자랑한다.
이 글에서는 IOCP가 어떠한 방식으로 작동하며, 왜 다른 입출력 방식보다 효율적이며, 실제로 코드상에는 어떤 식으로 구현되는가에 대해 살펴보도록 하겠다. 또한 이 IOCP를 보다 효율적으로 사용할 수 있는 알고리즘에 대해 논해보겠다.


2章. IOCP의 기반 지식

(1) Overlapped IO
IOCP에 대해 언급하려면, 먼저 (Overlapped IO)라는 것이 무엇인가부터 논해야 한다. IOCP에서 사용하는 것이 바로 이 (Overlapped IO)이기 때문이다. (Overlapped IO)라는 말은, 말 그대로 IO 작업이 서로 오버랩되어서, 즉 겹쳐져서 수행된다는 뜻이다. 즉, 다른 IO 작업이 수행되는 동시에 또 다른 IO 작업이 수행될 수 있는 기능을 말한다.
이처럼, 하나의 프로세스 내에서 여러 개의 IO 작업이 컨커런트하게 진행된다는 의미로 해석할 수 있다. 일반적인 입출력 작업에서 블럭되어 입출력을 기다리는 것과 달리, 여러 개의 IO 작업을 병렬적으로 수행할 수 있다는 뜻이다. 이러한 (Overlapped IO) 구조체를 넘겨받는 것으로 IOCP 작업이 수행된다. 각각의 (Overlapped IO) 구조체가 IOCP 작업의 단위라고 볼 수 있다.
이 (Overlapped IO)는 SCAN 방식[2] 이라는 스케줄링 정책을 선택해 보다 나은 성능을 보여준다. 즉, 반드시 IO 작업이 들어온 순서대로 수행하는 것이 아니라, 보다 빨리 수행할 수 있는 것부터 수행한다.

(2) Multithread Programming
 과거에 이용되어 왔던 멀티쓰레드 프로그래밍의 경우, 하나의 유저에 대해 하나의 쓰레드를 생성하는 것이 일반적이었다. 이는 IO 작업의 특성과 긴밀하게 맞물려 있다. 하나의 쓰레드가 어떤 IO 작업을 수행하려 한다면, 그 쓰레드는 IO 작업이 끝날 때까지 블럭되어 가만히 머물러 있어야 한다. 즉, 그러한 이유로 하나의 쓰레드가 여러 명의 유저를 처리해줄 수는 없다. 그래서 프로세스는 여러 명의 유저에 대해, 하나의 유저 당 하나의 쓰레드를 지녀야 한다.
 이것은 몇천 명의 유저가 접속하는 대용량 서버에 있어서 치명적인 오버헤드가 된다. 유저의 수만큼 쓰레드가 필요하므로, 이 쓰레드의 리소스만 해도 엄청난 오버헤드이다. 그것보다 더 큰 문제는 각각의 쓰레드를 빈번하게 교체하는 경우 발생하는 문제, 즉 Context Switching[3]에서 발생하는 오버헤드이다.

(3) Problem of Context Switching
Context Switching이란, 커널을 점유한 쓰레드 혹은 프로세스가 점유를 중단하고 다른 쓰레드에게 그 점유권을 넘겨주는 작업을 뜻한다. 이 작업은 쓰레드의 당시 상태를 모두 기록하고 레지스터를 다시 기록해야 하는 등, 아주 무거운 오버헤드를 발생시키는 작업이다. 되도록이면 피하는 것이 좋다.
그러나 멀티쓰레드 프로그래밍으로 대용량 서버를 구현할 경우, Context Switching은 엄청나게 빈번하게 발생할 수밖에 없다. 즉, 멀티쓰레드 프로그래밍은 Context Switching의 문제로 인해 대용량 서버에 적합한 모델이 되기 힘들다. 따라서 사람들은 멀티쓰레드 프로그래밍을 진행하면서도 최대한 이 Context Switching 문제를 줄이는 방법을 연구해왔다. 그 대안들로 Select-Poll과 같은 방법이 제시되긴 했지만, 아래 설명할 IOCP의 성능에는 미치지 못한다.
요약하자면, 저러한 문제들을 해결하기 위해 제시된 대안이 바로 IOCP라는 것을 알 수 있다.


3章. IOCP의 개념 및 역할

그렇다면 이제 IOCP가 무엇인가를 살펴보자. IOCP는, IO 작업을 위해 윈도우 운영 체제에서 제공하는 커널 오브젝트의 일종이다. (IO Completion Port)라는 이름의 의미는, 이 포트에 IO 작업들이 연결되고, 이 작업들이 완료되었을 때 특정한 방식으로 프로세스에 통지한다는 의미로 해석할 수 있다. 즉, 이 IOCP는 IOCP와 연결된 전반적인 IO 작업을 총괄하며, IO 작업들을 직접 핸들링한다.
이 IOCP 객체가 수행하는 일은 크게 두 가지로 나눌 수 있다.

(1) IOCP 쓰레드 풀 생성.
IOCP의 특성상, IOCP를 사용하면 IO를 관리하는 쓰레드들이 빈번하게 wake, 혹은 sleep를 반복한다. 그러한 경우 IOCP는 쓰레드를 일일이 생성하거나 소멸시키는 대신, 일정 수의 쓰레드들이 포함된 Pool을 미리 생성하고 그 Pool 속의 쓰레드들을 꺼내 썼다가 다시 집어넣는 식으로 사용한다. 이는 쓰레드를 생성하고 소멸시키는 데에 필요한 오버헤드를 크게 감소시키는 훌륭한 방식이다. 이는 사용자가 굳이 설계할 필요가 없이, IOCP 객체를 생성하고 이용함으로써 자동으로 생성된다.

(2) 활성화된 쓰레드의 숫자를 조절한다.
쓰레드를 사용하기 위해서는 그 쓰레드가 CPU를 점유해야 한다. 컨커런트하게 수행되는 프로그램이라고 해도, 어느 한 순간에 실제로 CPU를 점유하는 것은 하나뿐이다. 그래서 쓰레드들의 CPU 점유를 관리하기 위해 스케쥴러가 사용된다. Starvation[3]을 피하기 위해 쓰레드들을 스케줄링할 필요가 있기 때문이다. 하지만 이 쓰레드의 스케줄링은 그다지 가벼운 작업이 아니다. 쓰레드에 대해 (Context Switching)을 수행할 경우 이는 엄청난 오버헤드를 발생시킨다. 이것은 앞서도 말했던 고질적인 (MultiThread Programming)의 문제이다. 하지만 IOCP의 경우, 이러한 쓰레드의 숫자를 제한하고 적절한 숫자의 쓰레드만이 활성화되도록 컨트롤할 수 있다. 이는 대단히 중요한 IOCP의 장점이다.


4章. IOCP의 비교 우위

IOCP가 비교 우위에 서 있는 원리를 정리하면 다음과 같다. IOCP는 IO 작업을 수행하는 경우, 블럭되어 멈추어 있는 대신 바로 함수를 리턴해 버린 후, 그 IO 작업은 IOCP Queue에 삽입해 다른 쓰레드에게 맡겨버린다. 그리고 그 IO 작업이 완료된 이후의 진행은 다른 루틴에서 진행된다. 즉, 비동기로(Asynchronous) IO 작업을 수행함으로써, 많은 IO 작업을 수행하면서도 최소한의 쓰레드만으로 프로세스를 유지함으로써, IO 작업 처리의 효율성을 제고한다.
이에 비해 멀티쓰레드 프로그래밍의 경우, 하나의 IO 작업을 수행하면 그 IO 작업에 대해 계속 블럭되어 멈추어 있다가 그 아래 루틴에서 작업을 수행해야 한다. 그러므로 하나의 쓰레드가 동시에 하나의 IO 작업밖에 수행할 수 없다. 그래서 IO 작업이 필요한 객체 하나당 하나의 쓰레드가 필요하다. 이것은 동기(Synchronous) IO 작업 수행 방식의 특징이다. 이 방식은 수많은 클라이언트들로부터 수많은 요청들이 서버에 쏟아질 때, 엄청난 Context Switching을 수행해야 하는 치명적인 단점이 있다.


5章. IOCP 구현 메소드

IOCP의 실제 코드 상의 구현을 설명하기 위해서 IOCP와 관련된 메소드를 설명해보겠다. 실제로 IOCP가 IO 작업들 중에서도 소켓 통신에 많이 이용된다는 점을 감안, 소켓 통신에 사용되는 메소드들을 뽑아 예시로 사용했다.

(1) WSARecv & WSASend
각각 비동기로 입력, 출력을 수행하는 함수이다. 이는 IOCP와 연계되어 사용된다. 즉, 함수의 파라메터 중 m_overlappedRead/Write를 이용해 (Overlapped IO)를 지정할 수 있다. 이 함수는 여섯 번째 파라메터를 이용해 입출력 작업을 비동기로 수행하도록 명령할 수 있다. 이는 쉽게 말하자면, 루틴이 진행되는 가운데 프로그램과 상관없이 알아서 진행된다는 뜻이다. 이는 IOCP와 연결되었기 때문이다.
6, 7번 파라메터의 설정에 의해 IOCP와 연결이 가능하다. 6, 7번 파라메터를 NULL로 두면 동기로 수행된다. 일반적인 Recv와 Send와 같은 용법으로 사용된다고 볼 수 있다.
이 함수 아래의 루틴에서는 이 함수가 읽어들인 것을 처리하지 않는다. 이 함수는 바로 ERROR_IO_PENDING이 반환되어 버리며 종료된다.
ERROR_IO_PENDING의 의미는 동기화되지 않았기 때문에 차후 수행할 예정이라는 뜻이다. 차후 이 함수가 읽어들인 값은 GetQueuedCompletionStatus 함수에서 받아오게 된다.
이 함수에서 명령한 입출력 작업이 IOCP에 할당된 쓰레드에 의해 완료되는 순간, 예의 GetQueuedCompletionStatus 함수가 리턴하게 된다. 그 아래 루틴에서 이 GetQueuedCompletionStatus에서 수행한 작업이 어떤 작업인가를 m_overlappedRead와 CompletionKey를 통해 알아낼 수 있다.
이 함수가 수행되면 이 IO 작업은 비동기로 수행된다. 완료되었을 경우 (IOCP Queue)에 삽입되며, 처리는 차후 GetQueuedCompletionStatus가 호출될 때이다.

(2) CreateIOCompletionPort
일반적으로 두 가지 용도로 쓰인다. 순수한 IO Completion port의 생성의 용도와, 이 함수를 통해 생성된 IO Completion port에 입출력 Handle을 연결하는 용도이다. 이 함수는 네 개의 파라메터를 받는다.
첫 번째 인자는 붙일 IO 핸들을 의미한다. 소켓 통신이므로 Socket 구조체가 될 것이다.
두 번째 인자는 IOCP의 이름이다.
세 번째 인자는 사용할 객체의 포인터이다. 이는 차후 GetQueuedCompletionStatus 함수에서 지금 수행 중인 작업에 대한 객체가 어느 객체인가를 구분하기 위해 필요하다.
네 번째 인자는 이 IOCP에 붙일 쓰레드 수이다. 숫자를 지정하지 않으면 CPU 숫자에 2를 곱한 값에 다시 2를 더한 값으로 지정된다. 이처럼 소수의 쓰레드만을 사용하는 것이 오버헤드를 줄이는 힘이다. 다만 이 숫자를 정확하게 얼마로 하는 것이 좋은가, 하는 문제는 보다 연구해볼 가치가 있다.

(3) GetQueuedCompletionStatus
IOCP Queue에 완료된 결과가 들어왔을 경우 쓰레드를 깨우거나, 쓰레드가 없을 경우 쓰레드 풀을 생성하게 된다. 만약 너무 많은 쓰레드가 활성화되어 있으면 그 숫자를 제한한다.
이 함수는 쓰레드에서 일괄적으로 큐에서 결과를 읽어내기 위해 사용된다. 읽어들인 결과가 있을 때까지, 다시 말하자면 비동기 입력 작업이 완료될 때까지 계속 대기한다. 5번째 인자를 통해 너무 많은 시간이 지날 경우에 대해 타임아웃이 지정 가능하다.
즉 IOCP와 연결된 입출력 함수 (Ex. WSARecv) 등이 호출되는 경우 그 함수가 읽어들인 내용을 이 GetQueuedCompletionStatus 함수의 아래 루틴에서 실제로 처리하게 된다.

(4) PostQueuedCompletionStatus
PostQueuedCompletionStatus를 사용하면 GetQueuedCompletionStatus를 강제로 호출할 수 있다. 엄밀히 말하면 PostQueuedCompletionStatus를 사용해 IOCP Queue에 전달하는 것이고, 이것을 처리한 후 IOCP Queue에서 결과가 드러나면 GetQueuedCompletionStatus이 호출된다고 볼 수 있다.


6章. IOCP의 사용 예시

IOCPThread
// IOCP에서 읽어들인 결과를 전담하는 쓰레드이다.
{
             GetQueuedCompletionStatus(...);
             // 아래에서 읽어들인 바이트 처리
             // CompletionKey 검사 후 다른 function으로 분기
             // 혹은 Virtual Function을 사용
             // 어디서 왔는가를 판별 (WaitThread, IOThread(WSARecv), WSASend 등등)
             // 적절하게 읽어들인, 혹은 보낸 데이터를 처리.
             // 읽어들인 데이터는 저장하고 모자란 부분을 더 보내는 등의 작업.
}

WinMain
{
             CreateIOCompletionPort(...)
             // 포트를 생성한다.
             ...
             서버용 Socket 생성
             CreateIOCompletionPort(Socket, ...)
             // 소켓 생성 후 Accept하면 WaitThread에 연결
             ListenThread;
}

ListenThread
{
             WaitForMultipleObject 등 사용해서 다중 접속 대기.
             접속시
             {
                           socket = accept(...)
                           CreateIOCompletionPort(Socket, ...)
                           Recv();
                           // 여기서 데이터의 수신이 이루어진다.
                           // 이 함수는 받든 못 받든 IO_ERROR_PENDING으로 지나가버림
                           // 만약 IO작업이 이루어지면 IOCP Queue에 들어감.
                           // GetQueuedCompletionStatus 아래의 IOCPThread에서 처리하게 됨.
             }
}

Recv(...)
{
             WSARecv(...);
             // 비동기로 수행한다.
             // 파라메터의 적절한 세팅이 필수적으로 요구된다.
}

Send(...)
{
             WSASend(...);
             // 마찬가지로 비동기로 수행한다.
             // 파라미터를 적절히 세팅한다.
}

SendSomething
{
             Send();
             // 데이터를 보내려 할 때 쓰일 수 있다.
             // 이 함수를 호출해 필요한 데이터를 보내준다.
             // WSASend는 한번에 모든 데이터를 전송하는 반면,
             // WSARecv는 한번에 모든 데이터를 받을 수는 없다.
             // 반드시 이 점을 염두에 두고 프로그래밍해야 한다.
}


7章. 요약 및 참고 문헌

지금까지 IOCP에 대해 살펴보았다. 확인한 바와 같이, IOCP는 실제 상용 서버에서도 많이 사용되는 입출력 기술이다. 물론 IOCP가 어떤 경우에도 최고의 성능을 자랑하는 것은 아니다. 하지만 클라이언트로부터의 리퀘스트가 많고 부하가 큰 대용량 서버의 경우, 현재 IOCP의 성능을 따라갈 만한 기술은 없다고 해도 과언이 아니다. 즉, 종합하자면 다음과 같다. IOCP는 다수의 입출력 작업을 처리하기에 최적화된, 우수한 성능을 지닌 IO 메커니즘이다.

참고 문헌

[1]IO란 컴퓨터나 주변 장치로부터 데이터를 교환하는 모든 프로그램, 오퍼레이션, 장치를 통칭하는 용어이다. 마우스나 키보드와 같은 장치는 입력만을 위한 장치이며, 프린터와 같은 장치는 출력만을 위한 장치이다. 하드 디스크와 같은 장치는 입출력 작업 모드를 수행할 수 있다. http://www.webopedia.com/TERM/I/I_O.html

[2]기본적으로 현재 위치에서 가장 가까운 데이터를 우선적으로 처리하며, 한쪽 방향으로 진행하고 한쪽 끝에 도달하면 반대쪽 방향으로 진행하는 방법. http://www.webopedia.com/TERM

[3]OS에서 어떤 자원 목록에 대해 경쟁하는 프로세스가 많고, 이 프로세스들이 자원 목록에 대해 어떤 특정한 스케쥴링 방법대로 권한을 얻어갈 때, 프로세스가 필요한 자원의 권한을 영원히 얻지 못해 일을 하지 못하는 현상. http://www.webopedia.com/TERM


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

[1]Programming Server Side Applications for Microsoft Windows 2000, Jeff Richter, Microsoft Press

[2]Summary About IOCP, 이기탁, http://www.devpia.com

[3]Unix Network Programming, W. Richard Stevens, Addison-Wesley Professional

[4]Programming Applications for Microsoft Windows, Jeff Richter, Microsoft Press

[5]Programming Server Side Applications for Microsoft Windows 2000, Jeff Richter, Microsoft Press

by 은엽 | 2009/11/16 16:14 | 작업 | 트랙백 | 덧글(7)
죽은 왕녀를 위한 파반느

현대 사회에서, 아름다운 외모는 강력한 재산이다. 인간은 타인과 소통하지 않고는 살아갈 수 없는 동물이다. 이렇게 타인과 소통함에 있어, 외모의 중요성은 그 어느 시대보다도 더욱 심하다. 특히 현대 한국 사회에서는 병적이라고 해도 될 만큼 외모에 집착한다. 상대적으로 능력을 높게 평가받는 남자보다도, 여자의 경우가 더욱 그러하다. 이 21세기의 한국이라는 시공간은, 못생긴 외모를 지닌 여자에게는 지옥일 뿐이다.  

마이너한 것에 관심을 표해왔던 박민규의 이번 작품은 바로 그 못생긴 외모를 지닌 여자에 대한 이야기이다. 피부 한 장과 뼈 몇 조각에 불과한 그녀의 얼굴은, 피부 한 장을 벗겨내면 아무 의미도 없을 그 얼굴은, 그녀의 그 피부 아래에 존재하는 모든 것을 변형시켜 버릴 만큼 그녀의 인생을 쥐락펴락하게 된다. 그녀의 성격과, 습관과, 행동 방식과, 나아가서 결국 인생 자체가 모두 바뀌어 버린다. 그녀의 못생긴 얼굴, 그 하나 때문에. 적어도 현대 한국 사회라는 이곳에서, 그녀는 정상적인 삶을 살 수 없다. 인간에게 주어진 얼마 안 되는 가치를 누리는 것조차도 그녀에게는 과욕이었다. 처음으로 그녀에게 사랑이라는, 믿기 힘든 순간이 찾아왔을 때, 그녀는 수십번을 의심하고, 불안해한다. 그녀 자신에게 수십번은 되물었을 것이다.

내가, 이런 행복을 누려도 되는 걸까.
이 책은 "못생긴 여자의 사랑", 이 짧은 구문이 품고 있는 그 헤아릴 수 없는 눈물에 대한 이야기이다.  

박민규의 시선은 담담하다. 그는 동정하지 않는다. 그저 있는 그대로 바라본다. 못생긴 여자가 감당해야 할 그 모든 것들을 차분하게, 때로는 우스꽝스럽게 서술할 뿐이다. 그러나 그렇기 때문에 그 슬픔은 더욱 진하게 전해진다.  

추함을 죄로 여기는 세상을 바꿀 수는 없다. 그러나 인간이라면 누릴 수 있는, 아니 누려야만 하는 최소한의 가치가 있다. 박민규는 그녀에게도 그것이 주어졌다는 것을 일깨워준다. 그리고 그녀가 주인공을, 요한을 만날 수 있게 해준다. 아니, 바꿔 말하면 주인공이, 요한이 그녀를 만날 수 있게 해준다. 그를 통해, 어느샌가 이 현대 한국 사회를 살아가며 하루에도 수십번 추함을 단죄하는 우리에게, 말해준다.

그녀도 사랑받기 위해 태어난 인간이라는 그 당연한 사실을.
by 은엽 | 2009/11/10 10:39 | 감상 | 트랙백 | 덧글(4)
고백.

미야베 미유키의 아침 드라마 버전?
...은 너무 안 좋은 표현인 것 같고.

오랜만에 글을 쓰고 싶다, 는 생각을 들게 하는 책을 만난 것 같다.

미야베 미유키와 마찬가지로 어떻게 그랬나, 보다는 왜 그랬나에 보다 무게를 두면서도,
미야베 미유키의 풍경화를 보는 듯한 자세한 묘사 대신 선 굵은 크로키처럼 간결한 전개를 보여준다.
(이 조합이 가능할 줄이야...)

앞 이야기에 공감하던 나 자신을 당황스럽게 만드는 속도 있는 반전들이 인상적이다.
마치...

내가 더 못됐음
아님, 내가 더 못됐음
우왕ㅋ 굳ㅋ

이런 느낌?
아 간만에 감상을 쓰다 보니 내가 무슨 소리를 하는지... -_-

by 은엽 | 2009/10/28 00:40 | 잡담 | 트랙백 | 덧글(0)
남초현상.
찍은 지 오래 된 거지만...
요즘도 큰 차이는 없음.-_-;



by 은엽 | 2009/10/19 13:45 | 잡담 | 트랙백 | 덧글(6)
◀ 이전 페이지 다음 페이지 ▶



Fantasy Life...
by 은엽
카테고리
전체
마비노기
잡담

작업
감상
이전블로그
more...
이글루링크
박피디의 게임 아키텍트..
안녕 눈사람
요즘 뭐하고 사니
closed
Lost Space
sobre el horizonte
풀피리를 찾아서
솔선수범(率先垂範)..
All or Nothing Ver.1.25
OverHeats!
Tranquillity
라프텔
studio zenco 2007.
raram
금빛 달의 조각 : 검은 별빛
비를 마시고 자란 레이디
Your Erroneous Zone
잡담의공간
언이의 블로그
최근 등록된 덧글
네.. 제 기억에도 던전에..
by 은엽 at 12/05
대신 이게임은 디스크 ..
by nexpost at 12/05
헉.. 두번째랑 세번째는..
by 은엽 at 11/27
우리집에선 링크가 안 열..
by zenco at 11/27
우리집에선 링크가 안 열..
by zenco at 11/27
ㄱ-
by 은엽 at 11/26
얼렁 밀어내도 두어달 ..
by 로아슈 at 11/25
끄덕~ 한 6개월 된 듯해; ..
by 은엽 at 11/21
이 책.. 읽어야지 생각만..
by zenco at 11/21
응 -_-; 이 포스트는 얼..
by 은엽 at 11/20
이글루 파인더
rss

skin by zodiac47