geek.log2009. 5. 21. 18:54
스타트렉. Two Thumbs Up! 지난 금요일에 마눌님 교육 끝나길 기다리면서 극장에서 혼자 봤는데, 난 트레키가 아님에도 불구하고 피를 끓게 만드는 무언가가 있었다.

(스포일러 경고!!!!!)

다만 역시, 자막 번역은 개판. 일단 나의 가장 큰 불만은 원작자가 구태여 'black hole'이라는 일반적인 용어를 선택하지 않고 'singularity'라는 현학적인 용어를 택한 것을 무시하고 그냥 '블랙홀'이라고 한 점. 그리고 내 생각으로는 'red matter'는 다분히 'dark matter'에서 차용한 용어선택인것 같은데 그냥 '적색시약'이라고 한 점. 그리고 커크-스팍-맥코이 등 주요 등장인물의 경어체 사용이 일관성이 없다는 점. 'warp'와 'beam transport'를 '순간이동'으로 헷갈리게 표기하는 점. 계급 표기가 제 멋대로인 점(해군에서 commander면 소령이나 중령쯤으로 번역해야 맞는거 아닌지? 부함장의 직책을 수행할 수도 있지만...). 등등등. 여기에 벌칸인들의 현학적인 말투가 안살아났다거나 하는 캐릭터 성격 해석까지 결부하면 끝도 없으므로, 불평은 여기까지 하고,

(스포일러 경고!!!!!!)

여하튼간, 영화 보는 내내 박수치고 탄성지르고 생쑈를 하게 만드는 영화였다는 점에는 변함이 없다. 다행히 내 앞줄에 양키 한 무리가 일렬로 앉아서 나보다 더 큰 주목을 끄는 행동을 했기에 나의 괴성은 가려졌다는 점이 다행. 특히 커크 함장의 이름을 지을 때, 엔터프라이즈의 자태가 드러날 때, 레너드 니모이가 등장할 때, 등등은 어렸을 때 가끔 보았던 TV시리즈의 추억이 되살아나면서 나도 모르게 박수를 치고 탄성을 내게 되더라는.

스타트렉을 보면서 내가 얼마나 SF를 좋아했었나를 다시금 깨달았다. "그렇지! 우주는 진공이므로 소리가 전달이 안돼!", "그렇지! 물체 전송할 때에도 운동량은 보존된다고!", 혹은 "그렇지! 블랙홀은 시공간의 구조에 영향을 끼친다고!" 이렇게 무릎을 탁 치게 만드는 장면들에서 SF 덕후의 감수성이 발동하기 시작. 후후후.

그리고 스타트렉 시리즈의 모토, 'Space, the Final Frontier'. 아직 알 수 없는 것들의 모습을 (그럴싸 하게) 그려 보는 것이 SF의 본래적 재미라고 본다면, 스타트렉의 이 모토가 SF 덕후의 피를 본격적으로 끓게 만드는 요소. 아직 인류가 경험해보지 못한 우주를 과학과 기술의 힘으로 알아나가며 문제를 해결한다-는 SF의 고전적 가치를 보여준 영화가 이제껏 몇이나 나왔었던가!

사실 난 스타트렉은 별로 좋아하지 않았는데, 이번 극장판은 나도 트레키가 되어볼까? 하는 생각까지 든다. 안본 사람들도 보라고 강추중이다. 커크/스팍/맥코이/스카티 정도의 핵심 캐릭터만 알고 있으면 (딱 내가 알고 있는 수준) 영화의 잔재미를 이해하는 데 전혀 문제가 없다고 본다.

SF의 탈을 쓴 액션영화와 판타지 영화가 판을 치는 와중에 오랜만에 보는 제대로 된 SF영화.

Posted by uhm
dev.log2009. 4. 9. 12:59
라이브러리, 특히 C++ 라이브러리 배포 시에 인터페이스'만' 배포하는 것은 상당히 귀찮은 일이다. 나같은 경우는 클래스에 nested type을 무척 많이 쓰고, 일부는 구현에만 사용하는 타입이기 때문에 nested type이 외부로 나가면 내부 구현을 까발리는 것과 다를 바가 없다. 물론 private 권한으로 숨겨놓을 수도 있지만, 뻔히 헤더 소스에 보이는 걸 숨겨놨다고 하기엔 옹색한 것도 사실이다. 그래서 만들고 있는 파일 스트림 라이브러리는 다음과 같이 하기로 했다.

배포용 헤더. 바이너리 라이브러리만 배포할 때는 요놈만 쓴다.
class stream
{
public:
    static stream* create( const string& strm_path );
    static stream* create();
    virtual ~stream();

    virtual int open( const string& strm_path ) =0;
    virtual int close() = 0;
    virtual int read( void* buffer, size_t size ) = 0;
    virtual int write( void* buffer, size_t size ) = 0;
    virtual size_t tell() = 0;
    virtual int seek( size_t offset ) = 0;

protected:
    stream() {}
    stream( const stream& ) {}
};
기본 생성자와 기본복사생성자를 protected로 막아놓고 Create로 쓰는 이유는, 어디까지나 인터페이스이기 때문. 구현 레벨에서 다형성 타입으로 생성하도록 한다.


구현용 헤더
class stream_impl
{
    virtual int open( const string& strm_path ) =0;
    virtual int close() = 0;
    virtual int read( void* buffer, size_t size ) = 0;
    virtual int write( void* buffer, size_t size ) = 0;
    virtual size_t tell() = 0;
    virtual int seek( size_t offset ) = 0;
};

class stream_file : public stream_impl
{
public:
    //...
protected:
    fstream _file;
};

class archive;
class archive_item;
class stream_pack : public stream_impl
{
public:
    //...
protected:
    archive* _pack;
    archive_item* _item;
};

class stream_class : public stream
{
public:
    stream_class();
    stream_class( stream_impl* impl );
    //...
protected:
    stream_impl* _impl;
};

class archive
{
    int open_pack( const string& path );
    int close_pack();

    archive_item* open( const string& path );
    int close( archive_item* item );
    int read( .. );
    int write( .. );
    int seek( .. );
    int tell( .. );
};
stream_class와 stream_impl을 분리한 이유는, 동일한 stream 객체를 서로 다른 종류의 스트림으로 다시 열 수 있도록 하기 위해서.

구현용 소스는 대략 다음과 같은 모양새가 된다.
stream* stream::create( const string& strm_path )
{
    stream_class* strm = new stream_class;
    strm->open( strm_path );
    return strm;
}

int stream::open( const string& strm_path )
{
    if ( _impl )
    {
        delete _impl;
        _impl = 0;
    }

    if ( search_package( strm_path ) )
        _impl = new stream_pack;
    else if ( search_file( strm_path ) )
        _impl = new stream_file;
    else
        return 0;

    return _impl->open( strm_path );
}

약간 귀찮긴 하지만 '싫어하는 사람'에게 라이브러리를 배포해야 할 때에는 유용할지도.. 생각해보면 위와 같은 모양새를 가리키는 디자인 패턴의 이름도 있을 거 같긴 한데, 찾아보기 귀찮다. ( ..)

Posted by uhm
geek.log2009. 3. 18. 14:44
정신을 차려보니...

상품정보
상품명 수량 가격
[별도증정] 은하수를 여행하는 히치하이커 노트
/ 알라딘 이벤트
1 개 0원
낯선 땅 이방인
로버트 하인라인 지음, 장호연 옮김 / GONZO(마티)
출고예상시간 : 통상 24 시간 이내
1 개 15,120원
노인의 전쟁 - 샘터 외국소설선 001
존 스칼지 지음, 이수현 옮김 / 샘터사
출고예상시간 : 통상 24 시간 이내
1 개 10,800원
다윈 종의 기원
찰스 다윈 지음, 송철용 옮김 / 동서문화동판주식회사
출고예상시간 : 통상 24 시간 이내
1 개 9,000원
사이버리아드 (반양장) - 렘 걸작선
스타니스와프 렘 지음, 송경아 옮김 / 오멜라스(웅진)
출고예상시간 : 통상 24 시간 이내
1 개 9,450원
솔라리스 (양장, 한정판) - 렘 걸작선
스타니스와프 렘 지음, 김상훈 옮김, 이부록 그림 / 오멜라스(웅진)
출고예상시간 : 통상 24 시간 이내
1 개 15,300원
신들의 사회 - 행복한책읽기 SF 총서 003, 개정판
로저 젤라즈니 지음, 김상훈 옮김 / 행복한책읽기
출고예상시간 : 통상 72 시간 이내
1 개 6,000원
아시모프의 과학소설 창작백과
아이작 아시모프 지음, 김선형 옮김 / 오멜라스(웅진)
출고예상시간 : 통상 24 시간 이내
1 개 19,800원
안드로이드는 전기양을 꿈꾸는가? - 환상문학전집 11
필립 K. 딕 지음, 이선주 옮김 / 황금가지
출고예상시간 : 통상 24 시간 이내
1 개 9,000원
장기하와 얼굴들 1집 - 별일 없이 산다
장기하와 얼굴들 노래 / 붕가붕가레코드
출고예상시간 : 통상 24 시간 이내
1 개 12,000원
최종 이론의 꿈 - 자연의 최종 법칙을 찾아서, 사이언스 클래식 10
스티븐 와인버그 지음, 이종필 옮김 / 사이언스북스
출고예상시간 : 통상 24 시간 이내
1 개 18,000원
플레바스를 생각하라
이언 M. 뱅크스 지음, 김민혜 옮김 / 열린책들
출고예상시간 : 통상 24 시간 이내
1 개 13,050원
하드 SF 르네상스 2 - The Hard SF Renaissance 2
그렉 이건 외 지음, 강수백 외 옮김 / 행복한책읽기
출고예상시간 : 통상 24 시간 이내
1 개 11,700원
하드 SF 르네상스 1 - The Hard SF Renaissance 1
데이비드 브린 외 지음, 홍인수 옮김 / 행복한책읽기
출고예상시간 : 통상 24 시간 이내
1 개 13,500원

SF팬들은 절판 강박증에 시달리기 때문에 조금만 정신줄 놓으면 어느새 결재중 -_-a
ㄷㄷㄷ
이로써 연말정산 환급금은 모두 날아가는구나..........


Posted by uhm