« February 2005 | Main | April 2005 »

March 21, 2005

template usage case #1

template < typename T >
class T2
{
public:
// typedef typename T::value_type v_type;    // --- #1
 T2()
 {
  T::value_type a;      // --- #2
  a = 1;
 }
};

typedef int t1_value_type;

class T1 : public T2< T1 >
{
public:
 typedef t1_value_type value_type;
 void test() {}
 void test1( value_type ) {}
};

void func()
{
 T1 a;  // --- #3
}

 #1은 컴파일이 안되지만, #2는 컴파일이 된다. 왜냐하면 #1의 라인은 T1클래스가 Instantiation되기전에 T2클래스가 먼저 Instantiation된다. 따라서 T2클래스 입장에서 T1::value_type이 존재하는지 하지 않는지 알지 못한다. 하지만 #2의 경우는 이야기가 다르다. #2가 Instantiation되는 타이밍(POI=Point of Instantiation)은 #3의 구문을 보고 그제서야 T2의 생성자가 Instantiation되기 때문이다. 이 시점에서는 T1과 T2의 클래스의 타입은 이미 Instantiation되었기 때문이다. template의 강력함(?) 중 하나는 바로 이것이다. 

 멤버함수의 경우 실제로 참조하지 않으면 코드를 생성하지 않는 기능. 용량적으로도 코드크기가 줄어서 좋다.

 예제로 적은 스타일의 방식을 개인적으로 많이 사용한다. 뭐.. 쓰다보니 이 스타일이 왠지 유용하다. 일반적인 슈퍼클래스의 개념은 단순한 일에 치여 돈만 벌어다 주고 자식에게 관심이 없고 아이들이 혼자 스스로 성장하는 아빠의 느낌이랄까! 하지만 이 방식은 슈퍼클래스인 주제(-_-)에 서브클래스를 좌지우지 하는 이를테면 돈도 많이 버는 아빠지만 주말엔 꼭 아이와 놀아준다는 일도최고가정에도최고인 느낌. -_-;

fin.

March 19, 2005

Spore - 거대한 세계를 그리는 게임

심즈의 'Will Wright’씨의 새로운 화제작. SPORE.

이 게임은, 아메바 스테이지부터 시작하여, 진화를 거듭, 육지로 나온 후 그 개체들의 군락을 이루며 도시를 만든다. 그 후에 다른 생명체로부터의 침공을 받을 수 있다. 플래닛모드, 태양계모드, 갤럭시모드까지!

이른바, 미시의셰계부터 거시의세계까지 총망라하는 게임!

심지어 스크린샷도 존재한다. 스샷을 보고 느낀점은 엄청난 게임이 나올거 같다. 일단 진화 액션 시뮬레이터로 시작하여, 블랙&화이트, 심시티, 마스터오브오리온으로 거쳐간다는 느낌! 뭐... 진짜 게임은 나와봐야 알겠지만!

spore_amoeba.jpg
[ 아메바 스테이지 ]


spore_city.jpg 
[ 도시 모드 ]

기사#1: http://www.lameproof.net/zboard/zboard.php?id=bbs1&page=1&sn1=&divpage=3&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=13415

스크린샷 출처&몇장더: http://www.jesperjuul.dk/ludologist/index.php?p=171

스크린샷2#: http://www.gamingsteve.com/archives/2005/03/pictures_of_wil.php

March 17, 2005

인도 음악 #1

Thennevan


Vatta_vatta - Thennevan



듣기
| 듣기 - 최근 음악들


솔직히 이야기 하자면, 영화음악인데, 어느것이 영화제목인지, 어느것이 음악이름인지, 어느것이 작곡자나 싱어에 대한 것인지 알지 못한다. -_-;

단지, 인도에 대한 기억을 추억하기위해 싱가폴에 갔을때 사온 시디4장 짜리의, 영화 음악 뮤직비디오중 괜찮은거 하나를 골라서 wav추출후 wma변환한 것이다.

뮤직비디오도 예술-_-이라 올리고 싶지만 용량문제로 쉽지 않다.

:)

March 15, 2005

세상으로 공개된 인터페이스

 문득, 새삼스럽게 나는 겉과 속이 다른 사람이라는 생각이 들었다. 누구나가 어느정도 그런 면을 가지고 있을 것이라고 생각한다. 집단과 집단 사이에서의 내가 외부에 표출되는 인터페이스는 매우 다르다. 어떤 집단에 노출된 인터페이스가 100개라면 다른 집단에는 50개도 되지 않는다. 갯수 뿐만아니라 외부로 노출되는 내면의 정보량도 다르고 같은 인터페이스에서 매우 다른 데이터를 출력하기도 하는 것 같다.

 어디까지가 나일까?

 마치 DirectX같이 Direct3D6, Direct3D7, Direct3D8, DirectD9같이 IXecode1 IXecode1A IXecode1B 와 같은 식이라고 생각할 수 있을까? 가만히 생각해보면 라이브러리의 진화방식과 같다는 생각이 든다. 최초에 IXecode 라는 인터페이스를 제공하였다. 이 인터페이스에서 struct old_data_type; 이라는 데이터형을 외부로 노출하고 사용자가 이를 사용하게 하였다. 시간은 흘러 라이브러리는 진화하고 엔진 튜닝과정에서 old_data_type을 사용하면 극심한 퍼포먼스 저하가 생긴다는 사실을 발견하고 이를 없애고 싶어졌다. 하지만 이미 배포된 IXecode로 노출된 기존의 인터페이스를 제거하기는 불능. 어쩔수 없이 엔진은 바뀌었지만 하위호환을 위해 실행이 되고 결과만 정확한 수준에서 인터페이스를 유지한다. 시간은 흘러 IXecode 에서 IXecode9까지의 인터페이스가 존재한다. 기존의 것을 버리고 싶지만 버릴수 없다. 그렇게 된다면 기존의 인터페이스를 사용하던 유저들에게 혼란이 찾아오고 심하면 계약파기까지에 이르게 될수도 있을것이다.

 라이브러리가 그러는것처럼, 내가 처음으로 세상에 공개된 인터페이스는 지금도 존재하지만 이미 나의 내부는 변했다. 나는 가장 최근에 공개된 인터페이스를 사용하고 싶다. 하지만 이미 공개된 나의 인터페이스를 사용하는 다른 사람과의 관계에서 문제가 생기지 않고 최근의 인터페이스로 안전하게 마이그레이션하기위해 노력한다. 혹은, 전혀 새로운 인터페이스를 중간에 공개했다면 그 인터페이스는 계속 유지하기위해 노력할것이다. 기존의 사용자가 이 인터페이스를 알게된다면 혼란이 올것이다.

오늘은 지대로 헛소리-_-

interface IXecode
{
    gabage 똥싸기();
    void 밥먹기( 음식 );
    화냄_t 머리쓰다듬기(); 
};

interface IXecode2
{
    void 밥먹기( 음식 );
    화냄_t 머리쓰다듬기();
    // lots of new feature comes! 
private:
    gabage 똥싸기();
};

FIN

March 08, 2005

최근에 추가한 템플릿 유틸리티

#1 YetAnotherStringTokenizer;

뭐...특별한 커멘트가 필요하지 않을것이다. 인터페이스는 이렇다.

  LPCSTR string_buffer2
   = "killing me softly, \r\nm-flo nice, \r\n xecode  kfc-_-,owo";

  compat::StringTokenizer tokenizer(
   string_buffer2,
   strlen(string_buffer2),
   ",", // deliminator
   "\r\n\t" // spaces
   );

  while( T_LPCSTR tok = tokenizer.Next() )
  {
   Console::Log( "tok[%s]\r\n", tok );
  }

#2 template function, SafetyExecution

일단, 이름이 수상할 것이다. -_-; 실제 하는 행동도 수상하다. -_- 요는 이렇다. 잠재적으로 잘못된 연산을 수행할 위험요소가 있거나 믿을수 없다거나 (보안상의 의미가 아님)  하는 코드의 부분을 프로그램 비정상 종료의 위험없이 실행해주는 템플릿 함수다. 물론 win32 structured exception mechanism이 사용되었다. 그리고 당연한거지만 win32플랫폼이 아니면 일반 호출과 다를바 없다. 대략적인 최종적으로 고안된 인터페이스는 다음과 같다.

void* safety_execution_1_func( int a1, float a2 )
{
   int* p = 0; *p = 0; // runtime error
 return (void*)100;
}
DECLARE_FUNCTOR_2( safety_execution_1, safety_execution_1_func, int, float, void* );

bool safety_execution_2_func( )
{
   int* p = 0; *p = 0; // runtime error
 return true;
}
DECLARE_FUNCTOR_0( safety_execution_2, safety_execution_2_func, bool );

class safety_execution_3_helper
{
public:
 int safety_execution_3( LPCSTR data, int size )
 {
  int i = 100;
  int d = 0;

    i /= d; // 0으로 나눔
  return 0;
 }
};
  void* ret_1 =
   compat::SafetyExecution(
    0,  // failed return value
    safety_execution_1(),
    50,   // arg1
    100.0f ); // arg2

  bool ret_2 =
   compat::SafetyExecution(
    false,  // failed return value
    safety_execution_2() );

  safety_execution_3_helper se3_h;

  int ret_3 =
   compat::SafetyExecution(
    -1, // 비정상오류를 캐취했을시 리턴값
    compat::mem_fun2( safety_execution_3_helper::safety_execution_3 ),
    &se3_h,      // class pointer
    "safety_execution_3 test", // arg 1
    100 );      // arg 2

물론 오류가 났을시, callstack도 프린트 해준다. (msdn bugslayer 참조)

역시 프로그래밍관련 이야기가 아니면 딱히 쓸 이야기가 없구나!-_-

ps 글을 쓰고보니 , #1은 그냥 클래스군요!!

March 04, 2005

블로그를 남긴다는 것.

언제부턴가 무거워졌다.

언제부터 이렇게도 글을 쓰기가 무거워 졌을까?

여행블로그라는 만약 쓴다면 한달은 족히 써야 하는 분량의 숙제가

남아 있기 때문에 그런것인가?

아니면 여가시간에 WoW를 플레이 하는 것 이외의 모든 시간이

아깝게 느껴지는 것인가?

벌서 3월인데 금년에 뭘 했는지도 모르겠다.

물론 많은 일이 있었다. 쉬는 날이 많았다. 일을 핑계로 일주일간 출국도 했었다.

할머니가 돌아가셨다.

벌써 3월이 된게 퍽 이상한것 많은 아닌거 같은데, 일정을 대충 짰더니,

벌써 마감의 압박이 다가온다. 버럭!

일정을 짤땐 생각한 기간보다 2배 길게 잡자. 결론? 사실 그렇게 짰다고

그런데 "누가" 다 줄여놨어! 버럭!

KOKIA라는 일본뮤지션의 싱글앨범을 들었다. 감동받았다. 그런데

듣고 있으면 어느새 졸고 있는 나를 발견한다!! 어떻게 해야하지?

들어말어? 듣고 있으면 자는데!

작년에 여러 이벤트로 많은 사람들을 알게 되었다. 그런데 벌써 그중 일부

하고의 커뮤니케이션이 끊겼다. 지금은 새로 말걸기도 뻘쭘한 느낌.

어쩔수 없나, 그냥 언제나 처럼 잊혀져 가는건가. 서로에 대해 "필요"가

없어지면 어쩔수 없나. 수십년-_-간 그래와 놓고선 새삼스럽단 생각도

든다. 인생 별거 있나?

커피. 무척무척 땡긴다. 그런데 이제 주변의 대부분의 커피에 질렸다. 어떻게

해야하나? 커피는 계속 마시고 싶은데 대부분의 구할 수 있는 커피에 질리다니.

이런 낭패가 있나!

삐뚤어질테다!

▣EOF