올 8월부터 틈틈히 해온 오버클럭으로, 올해 마지막 날인 오늘 최고 점수를 기록했다. 동일한 머신에서 오버클럭만으로 이 정도로 컴퓨터가 빨라질 수 있다는 것이 참으로 재미있는 것 같다.

처음 노오버일 때 18463점 정도였으니, CPU, NB, Memory만 오버를 했는데, 가장 중요한 GPU는 아직 오버를 안해봤다. 솔직히 컴퓨터 내부가 너무 뜨거워서 엄두가 안난다.
올 8월부터 틈틈히 해온 오버클럭으로, 올해 마지막 날인 오늘 최고 점수를 기록했다. 동일한 머신에서 오버클럭만으로 이 정도로 컴퓨터가 빨라질 수 있다는 것이 참으로 재미있는 것 같다.

처음 노오버일 때 18463점 정도였으니, CPU, NB, Memory만 오버를 했는데, 가장 중요한 GPU는 아직 오버를 안해봤다. 솔직히 컴퓨터 내부가 너무 뜨거워서 엄두가 안난다.
그렇다면, 의자를 사라.
의자가 편해야 오래 앉아서 집중하고 코딩을 할 수 있기 때문이다.
그래서 NHN이 분당으로 사옥 이전을 했을 때,
개인마다 100만원이 넘는 의자를 산 것일 지도......

위의 사진이 그 유명하다는 허먼밀러의 에이론 의자이다.
스페셜버전이 거의 120만원정도 하는데, 그게 가장 저렴한 가격이다.
진짜 앉아본 사람 말로는 짝 달라붙어서 편하다는데......
PS. 소문으로 들리던 엔씨소프트 아이폰 지급이 사실이라고 한다.
괜히 그만뒀어~~~ 괜히 그만뒀어~~~
NVidia가 GPGPU용 언어인 CUDA를 공개해서 CPU를 대신할 컴퓨팅의 대안으로 마켓팅을 시작했고, 또 올해 테슬라 칩을 공개해서 Intel의 아톰 프로세서의 영역을 넘보고 있다.
이제 더 이상 둘의 관계가 우호적일 수 없다는 것을 의미하는 것이다. 결국 Intel쪽에서도 반격에 나서는데, 그 시작인 Westmere 기반 프로세서인 CPU + GPU인 Clarkdale이다.
이미 리테일 버전이 용산에 풀렸고 내년 1월 3일 발매를 하는 걸로 알고 있는데, 내장 GPU성의 성능은 지금까지 알려진 바로는 HD4850을 약간 상회하는 정도라는데,
솔직히 이 정도면 가장 많이 판매되는 저가격 그래픽 카드들과 경쟁을 하는 것이다.
어쨋든 내년에 비메모리 반도체 회사들의 경쟁을 구경하는 것도 상당한 재미를 줄 것 같다.
최근들어, 컴퓨터 튜닝족들이 많이 늘고 있는 것 같다.
남자들은 일반적으로 애들을 싫어하고
애들을 싫어하는 남자는 당연히 애완동물도 싫어하고,
전자기기들과 노는 것을 좋아하는 현대 남자들에게,
취미로 꾸미기 가장 좋은 물건이 바로 컴퓨터인 것이다.
http://www.performance-pcs.com/catalog/index.php
이 사이트에서 상품들을 보면서,
왠지 나도 내 컴퓨터를 꾸미고 싶다는 생각이 든다면
당신도 PC를 애완동물처럼 기를 수 있을 것이다.
8월부터 이래저래 컴퓨터 때문에 바꿈질을 한 것이
벌써 300만원 정도가 든 것 같은데, 지름신은 가장 힘든
시기에 강림하시여, 주머니를 다 털어간다.

PSP의 펌웨어 문제로 인해서 PC로 즐기고 있는 Torchlight라는 게임이다.
디아블로와 헬게이트를 만들었던 개발자들이 모여서 만든 Runic Games에서 본래 MMO로 만들고 있는 작품의 PC용 싱글플레이를 스팀을 통해서 공개한 것이다.
본래 스팀에서 가격이 $19.99였는데 지금 크리스마스 시즌이라서 할인을 하고 있어서 $4.99에 구매를 할 수 있다.
게임에 대해서 이야기를 하자면 3D 디아블로이다. 대부분의 요소가 디아블로와 동일하다. 나오는 클래스들이 디아블로와 다르다는 것과 디아블로에 비해서 편의적인 요소들이 있어서, 좀더 게임하기 편하다는 정도......
그래도 저사양 그래픽을 추구하지만, 개성있는 모델링과 NPR렌더링은 괜찮은 분위기를 연출하고 있고 타격이나 카메라 연출들도 상당하다.
디아블로를 재미있게 해본 분들이라면 재미있게 즐길 수 있는 수준급의 게임이라고 할 수 있겠다.
ps.
이 게임은 오픈소스 3D엔진인 오우거 엔진을 이용해서 만들어진 상업용 타이틀이다. 이 게임으로 인해서 오픈소스 3D엔진도 활성화될 수 있길 바래본다. 또한 MOD제작을 위한 맵툴도 포함되어있다.
오늘 회사로 지난번에 포스팅을 했던 픽셀정크 몬스터가 배송되었다.
연휴동안 열심히 해볼 생각으로 집으로 가져왔는데,
실행으로 해보니 80020148 오류 코드가 뜨는 것이다.
결국 네버 지식인에게 헬프를 요청했더니,
나의 커펌된 PSP의 펌웨어 버전이 이 게임이 요구하는 펌웨어 버전보다
낮아서 발생하는 오류란다.
커펌 버전을 업그레이드해야하는데, 난 USB케이블이 회사에 있고, 연휴라서 가기 귀찮고
두둥~~~
연휴동안 뭐하나 ㅜ..ㅜ
ps. 커펌 관련 블로그 http://popotz.textcube.com/

2005년도에 Epic에서 날아왔던 크리스마스와 신년 인사 카드.
아직도 보관을 하고 있다.
오른쪽에 검은색 글씨로 싸인된 것이 Epic의 CEO인 tim sweeny의 친필 사인이다.
요즘 PC-Fi가 유행인데, 가장 필요한 것이 바로 DAC다.
최근에 nano/S라는 작고 아담한 PC용 DAC가 출시되었다.
작고, 쉽고, 사용하기 편한이 모토인 이 모델은 USB와 연결하고 3.5mm 이어폰을 출력부에 꼽고 그냥 들으면 된다. 너무 작은 녀석이라서 외부 전원도 필요없다.
뭐 워낙 귀가 막 귀라서 정확하게 뭐가 다르게 들리는지 모르겠지만, 확실히 음역이 풍부해진 느낌이 들긴한다.

사진 출처 : http://blog.naver.com/luric?Redirect=Log&logNo=110066975520
ps.
펼쳐두기..
PC-Fi에 입문을 하기 위해서 구입했다기 보다.
개인적으로는 프로그래밍을 할 때 집중력을 높이기 위해서 어떤 메신저도 로그인을 하지 않고 작업을 한다.
그런데 최근 주변의 소음이 거슬리기 시작해서 음악을 들어야 겠다는 생각을 많이하고 있었다.
그렇지만, 가사가 있는 음악이 언어중추를 자극하기 때문에 음악을 들으면서 프로그래밍을 하면 약간 문제가 있지 않을까? 하는 걱정으로 실제로 음악을 들으면서 작업을 하진 않고 있었다.
결국 주변 소음보다 음악이 나을 것 같다는 결론을 내리고 집에 있는 연주곡 위주의 타이틀을 itunes를 이용해서 무손실 압축을 하면서, 역시 무손실 음원을 제대로 들으려면 DAC가 필요하지 않을까? 하는 생각에 PC용 DAC를 알아보다가 styleaudio의 carat시리즈 중에 하나를 고를까? 하다가 마침 다나와에서 상품을 알아보다 우연히 발견하게 되서 구입해본 녀석이다.
겨울은 오버를 위한 계절이다.
전체적인 공기의 온도가 낮아진 상태여서, 공랭이든 수랭이든 여름에 비해서 오버가 잘된다.
그래서 최근들어서 열심히 다시 오버를 하고있는데,

8월에 세웠던 기록은 경신했다. 그때 20063점이었으니, 667점이 오른 것이다.
그 때와 차이가 있다면,
CPU Clock 3.6GHz->3.7GHz로 NB Clock 2.0GHz->2.4GHz 좀 더 오버에 성공한 것 뿐이다.

주문을 해놓은 픽셀 정크 몬스터라는 게임이다.
겉 표지를 보면 도대체 어떤 게임일지 궁금증을 야기한다.
하지만 정체는 타워디펜스다.
거의 모든 핸드헬드 기기와 웹 게임, 스타크래프트 모드, 워크래프트 모드 등등
타워디펜스 형태의 게임이 없는 곳이 없다.
형태도 다 비슷비슷하다. 그런데 어떤 것은 재미있고 어떤 것은 재미없다.
구조와 형태가 간단해서 쉽게 모작을 만들 수 있다고 하더라도,
재미마저 쉽게 따라할 수는 없는 것이다.
PS. 디스이즈게임의 아이두게임 포토카툰에서도 청강대학교 T3W팀이 타워디펜스를 만들던데, 그들이 만든 타워디펜스는 재미있을지 궁금하다.

오, 2008년도에도 강컴어워드 선정도서였는데,
올해도 선정되었다.
이 책이 내가 게임 프로그래밍관련 서적을 번역한 마지막 책이다. 2008년 1월 12일에 출간되었다.
이 책을 포함해서 3권의 책을 번역했는데, 이 책이 유일하게 강컴에서 주간,월간 판매량 1위도 했었고 또 2008,2009 강컴어워드 선정도서였다.
하지만 이 책이 3권 중에 가장 돈이 안된 서적이다.
이 전 두권은 번역료를 받았고, 이 책은 번역서지만 인세를 받았는데, 내가 받은 인세라고는 고작 1000권에 해당되는 돈밖에 안된다.
그래서 번역은 접었다. 물론 번역 실력도 한참 부족한 것도 이유지만......
PS. 원서 정보

Essential Mathematics for Games and Interactive Applications : A Programmer's Guide
Morgan Kaufmann | James Van Verth
솔직히 3D나 클라이언트 프로그래밍을 희망하거나 현업에서 종사하는 분들은 꼭 보길바라는 책이다. 물론 번역서말고 원서로 말이다. 영서로는 2판이 나왔다.
물론 지&선에서 2판도 번역하자는 얘기가 있었지만, 그쪽도 그냥 해본 소리였었던 것 같고, 진심이었어도 내가 안했을 것이다.
fibonacchi 수열의 n번째 항을 구하는 코드를 작성해보자.
f(1) = 1,
f(2) = 2,
f(n) = f(n-1) + f(n-2) ( if n > 2 )
순차적인 방법
펼쳐두기..
int fibonacchi(int n)
{
int f1 = 1, f2 = 2;
int result;
n -= 2;
while( n > 0 )
{
result = f2 + f1;
f1 = f2;
f2 = result;
--n;
}
return result;
}
재귀적인 방법
펼쳐두기..
템플릿 메타프로그래밍
펼쳐두기..
콘돔이 가장 많이 팔리는 날이라고 한다.
어제 개콘을 보니, 남보원에서 성탄절이 두럽다고 하던데, 이벤트 준비하고 선물 고르고 힘들겠지만, 그래도 여성분들과 S*x 이벤트가 있지 않나?
세상은 give and take인거다.
커플 남성들이여 찌찔거리지마라!!!
가끔 프로젝트를 진행하다보면, 스크립트나 메타프로그램 파일과 같이 별도의 컴파일러로 컴파일을 해야할 경우가 생긴다.
Visual Studio에서 컴파일러가 인식하지 못하는 소스들을 첨가할 때마다, 일일이 Custom Build Setting을 해주는 것은 참으로 귀찮은 일이다.
이걸 한번에 끝내는 방법이 있으니 그것이 바로 rules파일을 만드는 것이다.
형식은 다음과 같이 XML파일이다.
펼쳐두기..
원하는 룰을 만들고 싶으시다면 위의 XML파일에서 볼드체로 설명이 들어간 부분을 바꾸면 된다.
이렇게 룰 파일을 작성한 다음, 그 소스들을 포함하고 있는 프로젝트에 룰 파일을 추가하면된다.
우선 룰을 추가하고자하는 vcproj파일을 오픈한다. 그런 다음과 같은 XML파일이 나올 것이다. 그러면 아래 볼드체로 나오는 element를 추가하고 세이브하면 된다.
펼쳐두기..
각 파일마다 커스텀 빌드 속성을 지정해주면 <File RelativePath=""></File> element 사이에 <Tool></Tool>이라는 element가 하나하나 추가되서 지저분하다. 하지만 룰파일을 사용하면 깔끔하다(물론 누가 vcproj파일을 메모장으로 열어서 보는 것도 아닌데 괜한 걱정이다).
이제 VS에서 그 프로젝트를 빌드해보면, 룰이 지정된 확장자를 가진 파일들도 제대로 컴파일되는 것을 볼 수 있다.
PS. 예시는 ProudNet의 RMI메서드를 생성해주는 PIDL이라는 메타프로그램이다. 우리 프로젝트에서 ProudNet을 사용하고 있어서 예로 들었다.
원작자께서 우리의 캐릭터 중 하나를 보고 덕심이 부족하다고 해서 원화가가 다시 설정을 고치고 있다. 이미 게임에서 돌아다니는 캐릭터를 고쳐야 하다니, 시간과 돈 낭비 아닌가???
난 지금 캐릭터도 좋은데 말이지...
새로운 후보들은 다음과 같다.
어떤 컨셉이 덕심을 부르는가???

pre-alpha version을 만든지 이번 달 말이면 4개월째인데, 회사 사람들과 우리 겜을 플레이한지 3주 정도 된 것 같다.
솔직히 처음 테스트 플레이를 할 때는 정말 암울했는데, 이제는 많이 게임같은 모습을 갖추기 시작해서 다행이라고 생각한다.
하지만, 솔직히 내부 사람이 자신이 만들고 있는 게임을 객관적인 시각에서 바라본다는 것이 거의 불가능에 가깝다.
게임 플레이도 시끌벅적한 분위기 때문에 으레 재미있게 느껴지고 개발자들도 자신이 작업한 부분들 때문에 특히 애정의 느끼기 때문이다.
그래서 NHN에서의 방문을 개인적으로 상당히 기대하는 이유는 이제 객관적인 시각에서 우리 겜에 대해서 이야기를 해줄 첫 번째 외부 사람이기 때문이다.
물론 사업에 관련된 분들이 겜을 뭐 알겠냐? 이런 말을 하는 사람도 있겠지만 말이다.
P.S 올만에 11시에 출근을 해야한다. 요즘 오후 1시에서 3시사이에 출근을 하다가 11시는 아마 안드로메다보다 멀게 느껴진다.
![]() | ![]() |
월야환담으로 유명하신 판타지 소설가 홍정훈 작가의 올해 신작 판타지 소설 아키블레이드다. 그리고 현재 내가 만들고 있는 게임의 세계관을 담고있다.
그런데 소설을 읽어보면 왠지 정통 환타지 소설이라기 보다는 정치,경제,사회에 대한 홍작가의 불만이 녹아있는 블랙코미디라는 느낌을 받게된다.
그렇게 게임하고 소설하고 싱크로율을 높이기 위해서 자주 찾아와서, 살펴보라고 해도 워낙 바쁜 사람이라서 자주 찾아오지 않는다.
결국 게임하고 소설하고 따로 국밥이 될 수도 있을 것 같다.
국내에 PS3판만 심의통과 후 XBOX360, PC판을 다 유통하다가, 걸려서 재심의동안에 Steam으로 구매를 할까말까 하다가 스팀에서 판매 가격이 $59.55(국내 가격은 52,000원)라서 기다리고 있었는데 다시 유통되기 시작했다.
그런데 구매는 결국 Steam에서 했는데, DVD없이 실행이 되는 것이 좋고, 따로 DVD 미디어를 보관하지 않아도 계정에 구매한 게임이 저장되어있어서 편하다.
콜오브듀티6(모던워페어2)는 발매전부터 전세계 게이머들의 기대작이었는데, 역시나 발매하자마자, 1일 판매량이 북미 역대 모든 엔터테인먼트 산업을 통틀어 최고액을 기록했다(이전 1위도 역시 게임인 GTA4). 지금까지 6000억원이상의 매출을 기록한 걸로 알려져있다. 또 11월 게임 전체 매출의 25%를 차지했는데, 2004년 헤일로2 이후 첨이라고 한다.
지금 스팀으로 다운로드 중인데 스팀 열라 느리다. 빨리 플레이 해보고 싶다.

전체적으로 저소음의 쿨링을 갖추게 되면서 가장 귀에 거슬리는 것이 하드디스크 공진음이여서,
게임할 때 성능향상과 함께 정숙함을 위해서 오늘 쿨러와 함께 장착

write 성능이 다른 업체 SSD에 비해서 좀 떨어지는 편이지만, 그래도 HDD에 비해서 월등하기 때문에 별 상관이 없었다.
사용해본 소감은 부팅이 진짜 빨라졌다는 것, Windows vista 64bit를 사용하고 있는데 지렁이가 두번가기도 전에 부팅이 된다. 돈이 된다면 80GB를 하나 더 사서 RAID RING0로 구성한다면 진짜 장난아닐 듯 하다.
오늘 일체형 수냉 쿨러인 H50을 장착했다.

펌프, 자켓, 라디에이터, 호스가 결합되서 나오는 제품이라서 일반 수냉에 비해서 설치가 엄청 간편하고, 가격도 저렴하다.
이전에 사용하던 쿨러가

녹투아 NF-P12인데, 공랭 쿨러중에는 최상위품이다. H50이 이 녀석과 가격이 비슷하다.
이미 H50 사용기나 성능에 대해서 알고서 샀기때문에 그렇게 큰 기대를 하지는 않았지만, 왠지 NF-P12보다 성능이 떨어지는 것 같다. 또 소음도 약간 더 심한 것 같고......
단 한기지 좋아진 점은 커다란 알루미늄 히트싱크가 없어져서, 내부가 넓어보인다는 것뿐.
장착은 설명서가 약간 엉성하다는 문제가 나사가 8개가 있는데,
설명서 상으로는 Intel이나 AMD나 동일한 나사를 사용하는 것으로 나오는데
실제로는 나사의 헤드 굵기가 다르다. 얇은 것이 AMD용이고 굵은 것이 Intel용 이었다.
또 리텐션 링에 나사를 장착하기 위한 어댑터가 역 방향으로도 장착이되서
모르고 잘못 장착했다가, 뽑는데 엄청 고생을 했다.
NHN쪽에서 Epic Korea에 언리얼3를 사용해서 겜을 만드는 회사를 소개시켜달라고 해서 우리 회사를 소개시켜줬다고 한다.
다음 주 중에 NHN에서 회사로 한번 방문을 한다고 하는데, 시간이 오전 10시다.
우리 출근 시간은 오전 11시인데......
또 사장 혼자서 손님을 맞이하는 기염을 토할지도
이미 Scaleform 담당자의 방문때도 사장 혼자였고
Epic Korea 방문때는 그 쪽은 3명이 왔는데
우리는 사장과 나 둘 뿐이었다는 그 때는 방문이 오전 11시였는데 ㅋㅋ
어떤 정수 n에서 시작해 n이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다. 이렇게 해서 새로 만들어진 숫자를 n으로 놓고 n=1이 될 때까지 같은 작업을 계속 반복한다. 임의의 n이 주어졌을 때, 1이 나올 때까지 만들어진 수의 개수(1 포함)를 구하는 함수를 작성하라.
순차적인 방법
펼쳐두기..
int cycle(int N)
{
int count = 0;
while(1)
{
++count;
if( N == 1 )
break;
if( !(N%2) )
{
N /= 2;
}
else
{
N = 3*N+1;
}
}
return count;
}
재귀적인 방법
펼쳐두기..
int selector(int N)
{
if( !(N%2) )
{
return N/2;
}
return 3*N+1;
}
int cycle(int N)
{
if( N == 1 )
return 1;
return 1 + cycle(selector(N));
}
템플릿 메타프로그래밍
펼쳐두기..
template<bool COND, int N>
struct selector
{
enum{ next = N / 2 };
};
template<int N>
struct selector<false, N>
{
enum{ next = 3*N+1 };
};
template<int N>
struct series
{
enum{ cycle = 1 + series<selector<!(N%2),N>::next>::cycle };
};
template<>
struct series<1>
{
enum{ cycle = 1 };
};

책 제목 그대로, 이전 편인 조엘 온 소프트웨어를 넘어섰다. 너무 빨리 넘어서서 더 이상 프로그래머에게 추천할 만한 책이 아닌 것 같다. 여전히 촌철살인과 해박한 지식이 가득하지만 말이다.
환경과 처우를 개선해줘야 일을 더 잘 할 수 있다고 말하며 이 책을 당신의 팀의 관리자와 사장에게 보여줘라. 아마 스타트 업에서 일하고 있다면 100%로 다음과 같은 이야길 들을 것이다.
돈 벌면 해줄께~~~
최근 프로그래머를 구인하기 위해서 게임잡의 이력서를 살펴보다.
보유 기술이 엄청난 신입 구직자가 있길래. 면접을 보았다.
개인적으로는 면접을 보는 당사자의 긴장도가 있기 때문에 간단한 문제를 출제하는 것이 낫다고 생각을 하는 편이라서, 이 날도 즉흥적으로 쉬운 문제를 하나 내보았다.
나 : factorial 아시죠?
면접자 : 예.
나 : 그럼 factorial을 구하는 함수를 화이트 보드에 작성해 보실래요?
면접자 : 알겠습니다.
한참을 화이트 보드에 서있더니,
면접자 : 재귀 함수로 구현해야하나요?
나 : 아니요. 그냥 순차적으로 구현해도 됩니다.
다시 한참이 흐르고
면접자 : 학교에서 3학년 때, 배웠었는데 잊어버렸네요.
프로그래밍이 케이스별로 배우는 것인가?
당황스러웠다.
본래 의도는 factorial 함수를 순차적인 방법으로 작성해보고, 통과하면
재귀 함수로 구현해보라고 하고, 또 통과하면
템플릿 메타프로그래밍으로 구현해보라고 하려했는데......
아래가 이 포스트를 읽고 계신 분의 성격 검사 결과입니다.
펼쳐두기..
얼마나 비슷한가요?

// header
class singleton
{
public:
static singleton* instance();
private:
singleton();
singleton(const singleton&);
singleton& operator=(const singleton&);
~singleton();
static singleton* instance_;
};
// implementation
singleton* singleton::instance_ = NULL;
singleton* singleton::instance()
{
if( instance_ == NULL )
{
instance_ = new singleton;
}
return instance_;
}
singleton을 구현한다면, 아마도 위와 같은 idiom을 따를 것이다①. 그리고 이미 잘 알려진대로 멀티쓰레드 환경에서 이 구현은 문제점을 가지고 있다.
singleton* singleton::instance()
{
if( instance_ == NULL )
{ <- shit!
instance_ = new singleton;
}
return instance_;
}
만약 A와 B 쓰레드가 있는데 A쓰레드가 instance함수에 진입해서 <-shit!이라고 표시된 곳에서 suspend된다면, B 쓰레드가 instance()함수에 진입해서 instance_가 아직 NULL이기때문에 객체를 초기화하고 그 주소를 반환할 것이다. 이후 A가 resume되서 <-shit이후 구문을 실행하기 때문에 당연히 또 객체를 초기화하고 그 주소를 반환할 것이다.
인스턴스가 두 개나 생기다니, 뭐가 singleton이란 말인가? 가상의 인물 tk군은 싱글쓰레드 환경에서 잘 작동하던 singleton 클래스를 멀티쓰레드 환경에서도 잘 작동하도록 하기 위해서 instance함수에 lock객체를 추가한다.
singleton* singleton::instance()
{
lock guard;
if( instance_ == NULL )
{
instance_ = new singleton;
}
return instance_;
}
휴, 이제 하나의 인스턴스만 생긴다. 하지만 instance_가 한번 초기화되고나면 바로 그 주소를 반환하면되는데, instance_가 초기화된 이후에도 어떤 쓰레드가 이미 선점하고 있으면 대기를 해야하는 상황이니, 성능저하가 이만저만이 아니다.
그래서 tk군은 instance_객체를 초기화할 때만 보호가 필요하므로, lock객체의 생성 위치를 변경하면 문제가 해결될 것이라 생각하고 lock객체의 생성 위치를 바꾼다.
singleton* singleton::instance()
{
if( instance_ == NULL )
{
lock guard; <- in series
instance_ = new singleton;
}
return instance_;
}
그런데 만약 A쓰레드가 lock을 걸고 초기화를 하기전에 B쓰레드가 이미 if문 블럭안으로 들어가서 대기한다면, 처음 구현이랑 똑같은 상황이다. tk군 바보짓했다.
잘생각해보면, lock객체로 인해서 <-in series부터는 순차적인 실행이된다. 그러므로 A,B쓰레드 중 누가되었건 lock을 획득했다면, 그 뒤에 대기하고 있는 쓰레드는 객체가 생성된 이후에 진입이 허용될 것이다. 그러면 그 곳에서 한번 더 instance_가 NULL인지 비교한다면 instance_가 두 번 초기화되지 않을 것이다.
아하! tk군이 위의 생각대로 함수를 다시 작성한다.
singleton* singleton::instance()
{
if( instance_ == NULL )
{
lock guard; <- in series
if( instance_ == NULL ) <- 2nd test
instance_ = new singleton;
}
return instance_;
}
A쓰레드가 lock을 하고 2nd test를 하면 당연히 instance_는 NULL이므로 초기화한다. 그 다음 대기하고 있던 B쓰레드가 2nd test를 수행하면 이미 instance_는 NULL이 아니므로 두 번 초기화되지 않는다.
휴 문제 해결~~~
지금까지 GoF책②에 소개된 singleton pattern이 멀티쓰레드 환경에서 발생하는 문제점때문에 그 해결 방법으로 Douglas C. Schmidt에 의해서 소개된 Double-Checked Locking Pattern(DCLP)③에 대한 이야기였다.
다음에는 컴파일러들이 CPU아키텍쳐에 최적화된 코드를 생성하다보니 발생하는 DCLP의 문제점과 간단한 해결 방법에 대한 이야기이다.
각주
펼쳐두기..

현재 Parkoz사이트 3DMark06 AMD 순위다.

위의 스크린샷은 8월 본인의 컴퓨터로 돌린 3DMark06의 점수.
20067점으로 비공식으로 5위에 해당하는 성적이다.
사양은
CPU : AMD Phenom2x4 955BE 3.2->3.6으로 오버
RAM : EKMEMORY DDR3 1333MHz 4GB
MB : ASUS CROSSHAIR III FORMULA
GPU : ATI HD4870 CF
도대체 언제 썼던 서평인지 기억이 나지 않지만, 최근 들어 가장 프로 개발자들에게 추천을 해주고 싶은 책이기에 지난 서평을 올려본다.

책제목 실용주의 프로그래머
지은이 앤드류 헌트, 데이비드 토머스
서평
펼쳐두기..
첫번째 증명
펼쳐두기..
지난 번에 3가지 방법으로 a' dot b' = |a'||b'|cos(theta) 임을 증명했는데 비슷한 방법으로
|a' cross b'| = |a'||b'|sin(theta) 임을 증명해 보자.
먼저 x - y 축에 길이가 a이고 x축과 사이각이 thetaA인 벡터와 길이가 b이고 x축과 사이각이 thetaB인 벡터가 있다고 하자. 여기서 thetaB > thetaA일 때,
벡터 a'은 (a*cos(thetaA),a*sin(thetaA),0) 이고
벡터 b'은 (b*cos(thetaB),b*sin(thetaB),0) 이다.
a' cross b' = (0, 0, a*b*sin(thetaB)*cos(thetaA) - a*b*cos(thetaB)*sin(thetaA)) 이고
a*b*sin(thetaB)*cos(thetaA) - a*b*cos(thetaB)*sin(thetaA)) 식은
a*b*(sin(thetaB)*cos(thetaA)-cos(thetaB)*sin(thetaA))인데 sin의 뺄셈 법칙에 의해서
a*b*sin(thetaB-thetaA)가 되고 여기서 thetaB - thetaA는 두 벡터 사이의 사이각 theta이고
결국 a*b*sin(theta)가 된다.
그러면 |a' cross b'| = root(0^2 + 0^2 + (a*b*sin(theta))^2) 이므로
|a' cross b'| = a*b*sin(theta)가 되고
a = |a'|, b = |b'| 이므로 최종적으로 식을 정리하면
|a' cross b'| = |a'||b'|sin(theta) 이다. 증명 완료.
두번째 증명
펼쳐두기..
|a' cross b'| = |a||b|sin(theta) 라는 공식을 좀 더 간단하게 증명해 보자.
다시 x-y 평면 위에 두 벡터 a', b'가 있고 a'벡터가 x축 위에 있다고 하면
a' = (ax,0,0)이 될 것이고 |a'| = ax가 된다.
b' = (bx,by,0)이다.
그러면 a' cross b' = (0, 0, ax*by)가 되고
a'과 b'의 사이각이 theta라고 하면 by = |b'|sin(theta)가 된다.
그러면
|a' cross b'| = root((ax*by)^2) = ax*by이고
ax = |a'|, by = |b'|sin(theta)였으므로
결국 |a' cross b'| = |a'||b'|sin(theta)임을 알 수 있다. 증명 완료.
// some code.
if( x = 1 ) <---
{
// some code.
}
<--- 표시의 문제를 알려주질 못한다. 역시 모든 공개용 소프트웨어가 쓸만한 것은 아니거나 CppCheck가 아직 많이 개발이 되지 않아서 그렇겠지만, 나는 상용 소프트웨어를 만들고 있는 입장이라서 맘 편히 기다리고만 있을 수는 없어서 CppCheck를 버린다.
PC-lint 견적서가 오면 PC-lint를 구매해서 쓰는 것이 좋을 것 같다.
80년대 아케이드 게임장에서 볼 수 있었던 도트가 눈에 확들어오는 게임들의 그래픽을 일명 레트로 스타일이라고 하는데, 최근들어 핸드헬드기기의 게임들에서 이런 레트로 스타일의 게임들이 다시 유행하는 것 같다.
솔직히 나도 그 당시에 게임을 하던 사람이라서 옛 향수도 일어나고 왠지 더 친근감이 느껴져서 구매욕구가 쏟아 오른다.
전자 오락의 역사가 그리 오래되지 않았지만, 그래도 이제 연령대 세대분포에서 어느 정도 스펙트럼을 가지게 되면서 복고 스타일의 게임이 경쟁력을 가질 수 있게 된 것 같다.
최근에 발매된 게임 중에 가장 하이엔드 게임기인 PS3에서 발매된 3D 도트 히어로즈가 대표적인 예라 할 수 있을 것 같다. 핸드헬드기기야 성능문제로 인해서 당연히 과거의 게임들을 답습하게 될 수 밖에 없지만, PS3는 현존하는 최강의 게임 머신아닌가?
그런데 아머드 코어로 유명한 프롬 소프트에서 올드 유저의 향수를 공략하기 위해서 발매했다고 밖에 설명할 수 없는 타이틀을 출시한 것이다. 개인적으론 언챠티드2보다 PS3기기를 사야겠다는 구매욕을 더 일으킨 타이틀이다.

첫번째 증명
펼쳐두기..
고등학교 수학 시간에 우리는 극좌표계(polar coordinate)를 배운 적이 있는데 극좌표계는 좌표를 길이 r, 그리고 사이각 theta로 표현한다. 그리고 우리가 잘 알고 있는 직교 좌표계로의 변환은 다음과 같다.
polar coordinate (r, theta) -> Cartesian coordinate (r*cos(theta),r*sin(theta))
그러면 이제부터 이 사실을 바탕으로 a dot b = |a||b|cos(theta) 임을 증명해보자.
두 벡터 a, b를 각각 극좌표계로 표현했을 때,
a = (r1, theta1), b = (r2, theta2)라고 하고 theta2 > theta1이라고 하면
두 벡터 사이의 사이각은 theta = theta2 - theta1인 것을 알 수 있다.
그러면 두 벡터 a, b의 내적을 구하기 위해서 먼저 극좌표계를 직교 좌표계로 표현해 보자.
그러면
a = (r1 * cos(theta1), r1 * sin(theta1)),
b = (r2 * cos(theta2), r2 * sin(theta2))가 되고
이제 a dot b = r1 * r2 * cos(theta1) * cos(theta2) + r1 * r2 * sin(theta1) * sin(theta2)가 됨을 알 수 있다.
여기서 공통인자인 r1 * r2를 뽑아내면 식은
r1 * r2 * (cos(theta1)*cos(theta2) + sin(theta1) * sin(theta2))가 되는데
cos 덧셈 법칙에 의해서
cos(theta1)*cos(theta2) + sin(theta1) * sin(theta2) = cos(theta2-theta1)이 된다.
결국 a dot b = r1 * r2 * cos(theta2-theta1)이 되는데
위에서 theta2-theta1은 theta라고 했으닌깐
a dot b = r1 * r2 * cos(theta)가 되고
r1은 벡터 a의 길이이고 r2는 벡터 b의 길이이므로
최종적으로 a dot b = |a||b|cos(theta)가 됨을 알 수 있다.
두번째 증명
펼쳐두기..
주의 볼드체 소문자가 벡터고 그냥 소문자가 선분이라는 것을 기억하자.
지난 번 글에서는 극 좌표계를 이용해서 a dot b = |a||b|cos(theta)임을 증명했는데 이 번에는 코사인 법칙을 사용해서 증명을 해보겠다.
삼각형의 세 변의 길이가 a, b, c라고 하고 변 a, b의 사이각이 theta라고 할 때 코사인 법칙에 의해서 다음의 공식이 성립한다.
c^2 = a^2 + b^2 - 2abcos(theta)
여기서 theta가 90도 이면 피타고라스 정리가 된다.
위의 삼각형의 세 점을 A, B, C라고 하고 A - B = a 라고 하고 C - B = vector b라고 하자.
그러면 벡터 c = a - b가 되므로 벡터 c의 길이는 선분 c와 같다.
|c| = root((a-b) dot (a-b))이므로
|c|^2 = |a|^2 + |b|^2 - 2*(a dot b)가 된다.
그러면 c^2 = |c|^2이 같으므로
|a|^2 + |b|^2 - 2*(a dot b) = a^2 + b^2 - 2abcos(theta)이고
|a| = a, |b| = b임을 알고 있으므로,
결국 a dot b = |a||b|cos(theta)임이 증명된다.
세번째 증명
펼쳐두기..
2차원 데카르트 좌표계에서 벡터 a'이 x축 위에 있다고 하자. 그러면 a'는 아마 (ax,0) 이런 좌표를 가지고 있을 것이다(물론 시점은 원점이다). 그리고 x축과 각 theta만큼 회전한 임의의 벡터 b'가 있다고 하자.
그러면 두 벡터 a', b'의 내적은
a dot b = ax * bx + 0 * by일 것이고,
결국 ax * bx가 된다.
그런데 bx = |b'|cos(theta)이고
ax = |a'|이므로
결국 a dot b = |a'||b'|cos(theta)이다.
12월은 크리스마스를 생각나게 하는 달이지만, 개인적으론 어머니가 돌아가신 달이라서 어머니 생각이 난다.
어머니가 해주신 말 중에 다음과 같은 말이 기억난다.
사람은 운명을 가지고 태어나서 운명의 길을 따라간다. 하지만 아무리 좋은 운명을 가지고 있어도, 열심히 일하지 않고 남을 돕지 않으면 그 운명이 사라지고 아무리 좋지 않은 운명을 가지고 있어도 열심히 일하고 남을 도우며 살아간다면 좋은 운명으로 변한다.
참 많이 보고싶네요. 어머니 열심히 일하고 남을 도우며 살아가겠습니다.
프로그램을 하다보면, 단순하게 두 가지 상태를 전환하는 문제가 많이 생겨난다. 예를 들어 불을 끄고 키는 것처럼 말이다. 그런데 이러한 상태를 전환하는 간단한 문제에 비교 구문을 이용하지 않고 작성하는 좋은 방법이 있을까?
일반적으로는 아마 다음과 같이 프로그램을 작성할 것이다.
int switch(int flag)
{
if(flag)
return 0;
else
return 1;
}
뭐 위의 예제는 0,1을 전환하는 함수가 되는데, 조건하고 반환하는 값만 바꾸면 다른 값들의 전환도 가능할 것이다.
이제 생각을 전환해 보기위해서 잠시 swap함수에 대해서 살펴보자. swap함수는 잘 알고 있는 것처럼 두 값을 바꾸어주는 함수이다. 일반적으로는 다음과 같이 작성한다.
void swap(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}
그런데 임시 변수를 사용하지 않고 swap함수를 작성할 수 있을까? 불가능한가? 물론 가능하닌깐 물어본 것이다. 먼저 프로그램을 작성해 보면 다음과 같을 것이다.
void swap(int& a, int& b)
{
b = a + b;
a = b - a;
b = b - a;
}
위의 이상한 수식은 무엇인가. 만약 두 가지 원소를 가지고 있는 집합 A를 생각해 보자. 집합 A가 {a, b}라는 두가지 원소(여기서는 그냥 정수라고 하자)를 가질 때 원소가 a뿐인 집합 B로 차집합을 하면 당연히 원소 b만 가지는 새로운 집합이 나오고 원소가 b뿐인 집합 B로 차집합을 하면 마찬가지로 원소 a만 가지는 새로운 집합이 나올 것이다. 아하! 무언가 떠오르지 않는가? a,b 원소를 가지는 집합을 a+b라고 하고 a를 가지는 집합으로 차집합 (a+b) - a를 하면 원소 b를 가지는 집합이 나오고 (a+b) - b를 하면 원소 a를 가지는 집합이 나온다. 두 가지 상태가 전환되는 것을 알 수 있다.
그러면 이 것을 아까 위의 switch함수에 적용하면 두가지 원소가 0, 1이므로 다음과 같은 함수가 될 것이다.
int switch(int flag)
{
flag = 1 - flag;
return flag;
}
두 원소의 합은 0 + 1이므로 1이고 원소를 하나만 가지는 부분 집합이 flag이므로 flag가 0이면 1이 그 다음에는 1이 들어올 것이므로 flag는 0이 된다.
백승지
flag가 0과 1만 가능하다면 bool flag로 놓고 flag=!flag; 가 더 간단하지 않을까요?
kwanny
swap의 경우 int에 한정해서 void swap(int &a, int &b) { a^=b^=a^=b; } 이런 방법도 있져 ^^;
초등학교6학년때 첨으로 컴퓨터의 존재를 알게되고, 88년 중학교 1학년때 MSX를 갖게되면서 나의 프로그래밍의 역사는 시작되었다.
BASIC으로 프로그래밍을 첨 했었는데, 중3때 파주시 프로그래밍 경진대회에서 최우수상을 받았지만, 내가 첨으로 출전했다는 이유만으로 도대회는 내가 아닌 다른 학교 아이가 나가는 비운의 경험도 해봤다.
고등학교때부터 C언어를 익히기 위해 줄곧 노력했지만, 결국 포인터때문에 좌절만 맛보고 대학에서 전자계산학을 전공하면서 결국 C언어를 배우게된다. 솔직히 1학년 이후에는 학교의 모든 과제를 다 배껴서 제출했고, 프로그래밍에 대한 자신감은 제로에 가까웠다.
97년 4학년때 학교를 중퇴하고 그해 첨으로 게임회사에 취직해서 많은 부담을 가지고 일을 시작했다. 일은 곧 생계였기 때문에, 그 부담감은 말로 할 수 없었다. 내가 진짜 프로그래밍을 할 수 있을까?
그래도 운이 좋아서 그 뒤로도 지금까지 게임 프로그래머로서 일을 해오고 있다. 초창기 게임 프로그래밍 온라인 커뮤니티를 통해서, 이름도 많이 알려졌었고, 지금 유명한 오프라인 스터디인 KASA의 전신을 만드는데 1등공신이었다.
주변에서 프로그래밍을 잘한다는 입에 침바린 소린 많이들었고, 한때 재능과 능력을 모두가지고 있다고 착각한 적도 있지만, 20여년이 지나면서 최근에 느끼는 솔직한 심정은 그래도 지금까지 살아오면서 유일하게 몰입을 느껴본 일이 프로그래밍이고 중3때부터 천직이라고 생각했었기 때문에 계속 이 일을 하지않을까하는 생각과 아직도 너무 모르는게 많다는 사실과 이제 갓 프로그래밍의 대문을 열고 고개만 내밀어 주위를 살피고 있다는 사실이다.
간단하게 용어의 의미에서 유추할 수 있는 사실은 - 행우선 행렬이라고 했을 때 -
orthonormal 행렬의 각 행은 축을 나타낸다.
| X |
| Y |
| Z |
각 축의 길이는 normal이라고 했으니 단위길이이고,
ortho라고 했으니 각 축들의 내적은 X dot Y = X dot Z = Y dot Z = 0이다.
그러면 위의 행렬의 전치행렬은 [X Y Z]가 되고 두 행렬의 곱은
| X | | X dot X X dot Y X dot Z |
| Y | [ X Y Z] = | Y dot X Y dot Y Y dot Z |
| Z | | Z dot X Z dot Y Z dot Z | 일 것이다.
X dot X 는 X축의 길이 이므로 1이고 마찬가지로 Y dot Y, Z dot Z도 1일 것이다.
또한 위의 성질에서 각 축들의 내적이 0이라고 했기 때문에 위의 결과는 항등행렬이 된다.
RR' = I 이므로 R은 R'의 역행렬이고 R'은 R의 역행렬이다.
결국 orthonormal 행렬의 전치행렬은 자기 자신의 역행렬이 됨을 알 수 있다.
메뉴에서 Tools->External Tools를 선택하면

위의 창이 나온다.
Title: 항목에 CppCheck라고 입력.
Command: 항목에 설치된 CppCheck의 실행파일 위치를 지정.
Arguments: 항목에 검사를 수행할 소스트리의 루트디렉토리(일반적으로 $(SolutionDir)일 경우가 많다)를 지정 하고 원하는 인자를 세팅하면 되는데, 꼭 지정해야하는 인자는 --template "{file}({line}) : {message}"이 렇게 출력 템플릿을 지정하는 것이다. 이 출력형식이 VS IDE 표준형식이라서 출력창에서 메세지를 더블클릭하면 해당 소스파일의 라인으로 이동가능해지므로 꼭 설정하자.
Initial directory: 항목은 비워둔다.
체크 박스 중에 Use Output window는 체크해야, VS 출력창에 결과가 출력된다. 꼭 체크하자.
그리고 OK 버튼을 누르면 끝.
이제 Tools->CppCheck메뉴를 누르면 멋지게 CppCheck가 실행되고 결과가 출력되는걸 볼 수 있을 것이다.
컴파일 단축키인 F7에 우선 CppCheck를 하고 컴파일을 수행하는 Macro를 작성해서 키바인딩을 바꿔놓으면 더욱 편하게 사용할 수 있을 것이다.
올해 여름부터 오버클럭에 관심을 가지면서 하드웨어에 부쩍 신경을 많이쓰고 부품들에 대해서 이것저것 알아보고 있는데, 확실히 컴퓨터쪽에도 미신이 많은 것 같다.
parkoz와 함께 유명한 컴퓨터 부품, 오버클럭 관련 사이트인 쿨엔조이에서 파워서플라이 관련 글을 있다가, EVGA(유명한 보드 및 그래픽 카드 제조업체, 국내에선 판매을 안하다가 최근들어 폭스테크놀러지에서 수입판매하고 있음)와 애너맥스 파워의 호환성이 별로라는 것이다.
어떤 근거가 있을까? 근거에 대한 이야기는 없고 미신으로 떠도는 이야기가 댓글에 호환성이 별로라던데, 라고 달리면, 질문은 했던 당사자도 그런가요? 하고 받아들인다.
정보혁명의 선봉장이자, 인터넷으로 인해 생활의 필수품이 되어버린 컴퓨터가 더 이상 과학의 발명품이 아닌 미신의 영역에서 다루어지고 있는 것이다.
우리의 삶은 연속적이다. 모든 시간과 모든 날은 우리의 편의를 위해서 이산적으로 나누어지고 있지만, 그래도 우리의 생은 연속적으로 진행되는 것이다. 우리는 컴퓨터가 하는 이산적인 계산을 딱딱한 것으로 취급하지만, 역설적으로 우리도 시간을 이산적으로 쪼개서 모두 소중한 시간을 어떤 날, 어떤 시간은 더 특별하게 취급하면서 산다.
무덤덤하게 모든 날을 똑같이 살아가는 내가 남들을 질투해서 그렇게 느껴지는 걸지도......

이 책은 소프트웨어 개발팀에서 드러나는 안좋은 행동 패턴에 대한 모음집이다. 원제가 첫 번째 패턴인 아드레날린 정키와 마지막 패턴인 템플릿 좀비를 합쳐놓은 아드레날린 정키와 템플릿 좀비인데, 번역서의 제목이 솔직히 더 재미있게 느껴지고 가슴 속으로 심금을 울렸다.
사람의 사고는 자유롭다. 그렇지만 언어적인 한계인지 아니면 학습에 의한 정형화인지 사회적인 관계의 따른 제약때문인지, 모든 사고와 행동은 그룹화가 가능한 것 같다. 그래서 개인이나 조직이나 행동의 패턴이 있기 마련이다. 뭐 이런 패턴화때문에 프로파일링이라는 것이 가능하고 그래서 멘탈리스트나, 라이투미와 같은 재미있는 미드가 나오는 것이고, 실제적으로는 범죄 수사에 도움이 되는 것이기도 하겠지만 말이다.
책을 읽으면서 역시 소프트웨어 개발에서 게임개발팀이 가지는 특수성이 있다라는 생각도 들긴했다. 항상 가까운 곳에서 고객이 같이 호흡을 하고 있고, 이질적인 팀원들과 대화의 창구가 항상 열려있다는 게임 개발의 특징들로 인해서 공감이 가지 않는 몇 가지 패턴들이 있긴 했지만 대부분의 내용에서 공감이 가는 부분이 많아서 너무 재미있게 읽었고, 많은 도움을 받은 것 같다.
팀에서 agile 방법론으로 개발을 하고 있다면, TargetProcess를 사용하면 많은 도움을 받을 수 있다. 그 전에는 일일이 포스트잇에다 사용자 스토리와 태스크들을 적고, 화이트보드에 붙여서 진행중,완료구역으로 트레킹을 수작업으로 일일이 하느라 불편하고 무엇보다, 상태를 저장할 방법이 적당하지 않다는 것이었다.
이 모든 것들을 해결해주는 Web-based 툴이 바로 TargetProcess이다. 유명한 게임 개발사인 Bioware에서도 사용하는 것인데, 평가판으로 몇개월 사용해보니 장점이 많은 것 같아서 정식라이센스를 하고 팀에 도입하기로 결정했다.
그런데 솔직히 가장하고 싶은 이야기는 TargetProcess가 좋다라는 이야기가 아니라 화이트보드에서 수동으로 관리할 때도 태스크를 생산하고 트레킹을 잘하지 못하던 개발자는 여전히 똑같았다. 모든 방법론에서 가장 중요한 가치중 하나가 실천이라고 하는 이유를 다시 한번 느끼게 된다.
또 단점이라면, 화이트보드가 있을때는 지나다니면서 가끔 보기라도 하기때문에 전체적인 업무에 대한 가시성이 높았는데 TargetProcess는 접속을 잘하지 않는 경우가 많아서 가시성이라는 면에서 봤을 때는, 화이트보드보다 못하다는 생각이 든다.
펼쳐두기..
펼쳐두기..
지하철의 에스칼레이터를 보면 오른쪽 줄은 서있는 줄이고 왼쪽은 이동을 하는 줄이라는 규범이 디자인되어 있다. 이러한 규범을 디자인해서 정착하는데 그렇게 오랜 시간이 걸린 것 같지는 않다. 그런데 이 디자인을 엇갈려서 양쪽 모든 서있는 것으로 고치려한 서울지하철공사의 노력은 헛수고인 것 같다. 한번 적용된 규범은 다른 규범으로 그렇게 쉽게 대체되지 않는 것 같다.
이런 이야기를 꺼낸 것은 최근 오른쪽 보행 규범의 디자인에 대해서 이야기를 하려고 하기때문이다. 역사가 짧은 에스칼레이터의 규범 조차도 이미 자리잡고 있는 규범을 대체하지 못하는데, 언제부터 시작된지 모르는 좌측통행을 우측통행으로 바꾸려하는 우매함으로 인해서, 과장해서 말하면 지하철 역사내에서 이동은 항상 아비규환이다.
사람의 행동 유도를 위해서 이곳저곳에 우측으로 보행이라는 스티커들을 붙쳐놓았지만, 오랫동안 머릿속에 규범으로 인식된 좌측통행의 지배력을 능가하지는 못하는 것 같다.
우매한 규범의 디자인이 혼란만 가중시키고 있다는 느낌을 지울 수 없다.

겨울철 노르웨이에서 오로라를 볼 수 있는 확률이 가장높다고 하던데......
후띠루튼 크루즈를 타고 노르웨이 서해안을 따라 떠나느 여행이라. 오로라는 정말 보고싶다. 어디 멀리로 떠나본지도 오래됐고, 5박7일에 2,790,000원이라...... 이번 겨울이 지나기전에 한번쯤 가고싶은 여행지다.
어제 VUTPP의 구글 테스트용 Bind코드가 구글 테스트 1.4버전과 호환되지 않아서, 고치면서 고생했던 것이 VUTPP용 Listener class를 만들 때,
이전 버전에선 본래 void OnNewTestPartResult라는 이벤트를 발생시키는데, 1.4버전에선 그 event의 이름이 OnTestPartResult로 바뀌어서 교체를 하고 다른 수정부분들도 수정을 하고 당당히 컴파일을 성공해서 실험을 하는데 왠일인지,
함수가 호출되지 않아서 bRun의 값이 false인 상태로 있어서 모든 테스트들이 다 can't find test에러를 발생시키는 것 아닌가?
좌절하고 있었는데, 가상 함수를 다시 잘 살펴보니 이전 버전은 인자가 포인터였는데 이제는 레퍼런스로 바뀐 것 아닌가? 결국 함수가 오버라이드되지 않고 새로운 함수를 정의한 것이 되었으니 이벤트 함수가 호출되지 않았던 것이다.
나는 오버라이드하고 싶었는데 그 의도를 컴파일러한테 알려줄 수가 없으니 컴파일러가 오류를 알려주지 못하는 것이라서, 컴파일러한테 의도만 전달할 수 있으면 쉽게 발견할 수 있는 오류였던 것이다. 그런데 그런 역활을 해주는 keyword가 visualstudio 2005에서 추가되었는데 그것이 바로 override 키워드다.
이것만 알았어도, 고생 덜했을텐데......

최근 열심히 즐기고 있는 게임. 흔히 FPS 디아블로라고 부르는 게임임. 헉슬리가 FPS+RPG가 잘못 혼합된 형태라면 이 게임은 잘된 케이스임. 발매될 때까지도 모르고 있었던 게임인데, 정말 물건임!!!
지금 회사에서 Unreal을 사용해서 NPR느낌으로 게임을 만들고 있어서 Unreal을 사용해서 첨으로 NPR느낌의 게임을 만드는지 알았는데, 이 녀석이 나오면서 이제 그냥 따라쟁이 게임이 되겠군.
작년에 Daum에서 웹툰 작가로 데뷔해서 이런저런 집안 사정으로 연재 내내 악플로 시달려오다가 한 동안 다음 작품을 준비하는 기간이 길어졌지만, 올해 다시 시작한 연재물이 바로 Hang-off다. 형인 나도 황당하게도 바이크 만화였던 것이다. 물론 동생이 바이크를 좋아해서 고등학교때도 바이크로 등교를 하긴 했지만, 어떻게 이야기를 진행할지 궁금했는데 26화나 진행 중......
실용주의 프로그래머를 읽다보니, 저자가 헝가리언 표기법은 객체지향 시스템에서 전혀 적절하지 못하다는 이야기가 나오는데, 전적으로 동의한다.
사용자가 타입을 정의할 수 있는 언어들에서 각 타입마다 일대일 대응이 되는 접두어를 할당하는 것은 사실상 힘겨운 일이며, 결국 여러 타입들이 하나의 접두어에 대응되는 중복이 생겨난다. 이러한 중복은 의미상의 오류를 발생시킬 소지가 크고 의미상의 오류는 정말 가장 발견하기 힘든 버그가 되는 경우가 많다.
imays
그래서 제 회사에서는 프로그래머들이 primitive type을 제외하고 접두어에 변수 타입을 안넣는걸 권장하고 있습니다.

http://www.thisisgame.com/board/view.php?id=302087&category=106&subcategory=2
에서 발췌.
NCSoft에 다닐 때 들었던 이야기 중에 삼성은 코드품질을 분석하는 툴이 있어서 그 툴로 코드를 분석해서 프로그래머들의 고과점수를 매긴다는 소문이 있었는데 바로 그 소문의 툴이 Coverity Prevent이라는 정적분석툴 소프트웨어 시장 점유율 25%를 차지하고 있는 어마어마한 녀석이다. 물론 가격도 어마어마해서 현재 우리 벤처기업에선 엄두도 내지 못하는 녀석인 것이다.
UnitTest는 특정 행위에 대한 결과가 정확한지 확인하고 객체의 상태 중심적인 테스트인 것이지, 언어적인 측면에서 실행시 발생할 수 있는 잠재적인 오류를 알려주지는 못하기때문에 개인적으로 정적 분석툴에 대해서 관심이 많이 있었는데, Visual Studio에 /analyze라는 옵션이 있어서 컴파일때 정적 분석을 할 수 있다는 것은 알지만, Team Suite버전에 있다라는 씁쓸한 소식과 Tema Suite의 가격을 알아보니 Coverity Prevent보다는 진짜진짜 저렴한 가격이지만 그래도 1300만원대여서 Professional버전을 사용하고 있는 우리의 실정으로는 그것조차 먼 하늘에 떠 있는 별과 같아서 꿈만 꾸었는데, 여기 저기 블로그들을 돌아다니다 알게된 것이 바로 CppCheck라는 오픈소스 정적 분석툴인 것이다. 상용툴에 비해서 아직 부족한 기능이지만 아무 것도 확인하지 않는 것보다는 나을 것 같아서 프로젝트에 도입 결정......
되도록이면 빠르게 업데이트되어서 정말 멋진 녀석으로 성장하길 기도해야겠다. 몰론 항상 바쁘다는 핑계로 오픈소스 프로젝트이지만 기여할 생각은 전혀없다. 솔직히 얘기하면 기여할 능력이 없다라는 것이 정답일 듯......
서버 개발을 위해서 개발 환경을 구축하면서, TDD를 위해서 UnitTest++를 쓰려고 Google에서 검색하다가 발견한 Add-in 프로그램인 VUTPP, 지겨운 콘솔 Output이나 XML Reporter에서 벗어나 GUI로 TEST들의 결과와 실패 이유를 볼 수 있다는 엄청난 장점을 가지고 있지만 사용을 하면서 몇몇 가지 단점들을 발견했다.
솔직히, 시간을 내서 OpenSource로 이런 프로그램을 만든 분들의 노고를 생각하면 이런 단점들을 가지고 왈가왈부하는 것이 참 쫌스러운 행동이지만, 그래도 항상 구경꾼이 할말이 더 많은 법이라서......
단점을 적어보자면 다음과 같다.
개인적으로 Custom BuildTool을 만들어서 사용을 하고 있기때문에, 위의 단점이 엄청크게 느껴지긴 하지만, 누군가를 위해서 이런 공개용 프로그램을 만들어 본 적이 없기때문에, 스스로의 무능력함을 책망할 뿐이다.