2009년 12월 31일 목요일

3DMark06 기록을 세우다.

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

 

 

처음 노오버일 때 18463점 정도였으니, CPU, NB, Memory만 오버를 했는데, 가장 중요한 GPU는 아직 오버를 안해봤다. 솔직히 컴퓨터 내부가 너무 뜨거워서 엄두가 안난다.

 

 

미친 듯이 코딩을 하고 싶은가?

그렇다면, 의자를 사라.

 

의자가 편해야 오래 앉아서 집중하고 코딩을 할 수 있기 때문이다.

 

그래서 NHN이 분당으로 사옥 이전을 했을 때,

 

개인마다 100만원이 넘는 의자를 산 것일 지도......

 

위의 사진이 그 유명하다는 허먼밀러의 에이론 의자이다.

 

스페셜버전이 거의 120만원정도 하는데, 그게 가장 저렴한 가격이다.

 

진짜 앉아본 사람 말로는 짝 달라붙어서 편하다는데......

 

PS. 소문으로 들리던 엔씨소프트 아이폰 지급이 사실이라고 한다.

 

괜히 그만뒀어~~~ 괜히 그만뒀어~~~

 

 

2009년 12월 30일 수요일

Intel vs NVidia

NVidia가 GPGPU용 언어인 CUDA를 공개해서 CPU를 대신할 컴퓨팅의 대안으로 마켓팅을 시작했고, 또 올해 테슬라 칩을 공개해서 Intel의 아톰 프로세서의 영역을 넘보고 있다.

 

이제 더 이상 둘의 관계가 우호적일 수 없다는 것을 의미하는 것이다. 결국 Intel쪽에서도 반격에 나서는데, 그 시작인 Westmere 기반 프로세서인 CPU + GPU인 Clarkdale이다.

 

이미 리테일 버전이 용산에 풀렸고 내년 1월 3일 발매를 하는 걸로 알고 있는데, 내장 GPU성의 성능은 지금까지 알려진 바로는 HD4850을 약간 상회하는 정도라는데,

 

솔직히 이 정도면 가장 많이 판매되는 저가격 그래픽 카드들과 경쟁을 하는 것이다.

 

어쨋든 내년에 비메모리 반도체 회사들의 경쟁을 구경하는 것도 상당한 재미를 줄 것 같다.

 

 

2009년 12월 28일 월요일

컴퓨터를 애완동물처럼 꾸미고 싶다면......

최근들어, 컴퓨터 튜닝족들이 많이 늘고 있는 것 같다.

 

남자들은 일반적으로 애들을 싫어하고

 

애들을 싫어하는 남자는 당연히 애완동물도 싫어하고,

 

전자기기들과 노는 것을 좋아하는 현대 남자들에게,

 

취미로 꾸미기 가장 좋은 물건이 바로 컴퓨터인 것이다.

 

http://www.performance-pcs.com/catalog/index.php

 

이 사이트에서 상품들을 보면서,

 

왠지 나도 내 컴퓨터를 꾸미고 싶다는 생각이 든다면

 

당신도 PC를 애완동물처럼 기를 수 있을 것이다.

 

8월부터 이래저래 컴퓨터 때문에 바꿈질을 한 것이

 

벌써 300만원 정도가 든 것 같은데, 지름신은 가장 힘든

 

시기에 강림하시여, 주머니를 다 털어간다.

 

2009년 12월 26일 토요일

torchlight

 

PSP의 펌웨어 문제로 인해서 PC로 즐기고 있는 Torchlight라는 게임이다.

 

디아블로와 헬게이트를 만들었던 개발자들이 모여서 만든 Runic Games에서 본래 MMO로 만들고 있는 작품의 PC용 싱글플레이를 스팀을 통해서 공개한 것이다.

 

본래 스팀에서 가격이 $19.99였는데 지금 크리스마스 시즌이라서 할인을 하고 있어서 $4.99에 구매를 할 수 있다.

 

게임에 대해서 이야기를 하자면 3D 디아블로이다. 대부분의 요소가 디아블로와 동일하다. 나오는 클래스들이 디아블로와 다르다는 것과 디아블로에 비해서 편의적인 요소들이 있어서, 좀더 게임하기 편하다는 정도......

 

그래도 저사양 그래픽을 추구하지만, 개성있는 모델링과 NPR렌더링은 괜찮은 분위기를 연출하고 있고 타격이나 카메라 연출들도 상당하다.

 

디아블로를 재미있게 해본 분들이라면 재미있게 즐길 수 있는 수준급의 게임이라고 할 수 있겠다.

 

ps.

이 게임은 오픈소스 3D엔진인 오우거 엔진을 이용해서 만들어진 상업용 타이틀이다. 이 게임으로 인해서 오픈소스 3D엔진도 활성화될 수 있길 바래본다. 또한 MOD제작을 위한 맵툴도 포함되어있다.

2009년 12월 24일 목요일

이런 난감할 때가......

오늘 회사로 지난번에 포스팅을 했던 픽셀정크 몬스터가 배송되었다.

 

연휴동안 열심히 해볼 생각으로 집으로 가져왔는데,

 

실행으로 해보니 80020148 오류 코드가 뜨는 것이다.

 

결국 네버 지식인에게 헬프를 요청했더니,

 

나의 커펌된 PSP의 펌웨어 버전이 이 게임이 요구하는 펌웨어 버전보다

 

낮아서 발생하는 오류란다.

 

커펌 버전을 업그레이드해야하는데, 난 USB케이블이 회사에 있고, 연휴라서 가기 귀찮고

 

두둥~~~

 

연휴동안 뭐하나 ㅜ..ㅜ

 

ps. 커펌 관련 블로그 http://popotz.textcube.com/

2005년도의 뜻 깊은 카드

 

2005년도에 Epic에서 날아왔던 크리스마스와 신년 인사 카드.

 

아직도 보관을 하고 있다.

 

오른쪽에 검은색 글씨로 싸인된 것이 EpicCEOtim sweeny의 친필 사인이다.

2009년 12월 23일 수요일

JAVS nano/S를 구입하다.

 

요즘 PC-Fi가 유행인데, 가장 필요한 것이 바로 DAC다.

 

최근에 nano/S라는 작고 아담한 PC용 DAC가 출시되었다.

 

작고, 쉽고, 사용하기 편한이 모토인 이 모델은 USB와 연결하고 3.5mm 이어폰을 출력부에 꼽고 그냥 들으면 된다. 너무 작은 녀석이라서 외부 전원도 필요없다.

 

뭐 워낙 귀가 막 귀라서 정확하게 뭐가 다르게 들리는지 모르겠지만, 확실히 음역이 풍부해진 느낌이 들긴한다.

 

사진 출처 : http://blog.naver.com/luric?Redirect=Log&logNo=110066975520

 

ps.

펼쳐두기..

 

overclocking

겨울은 오버를 위한 계절이다.

 

전체적인 공기의 온도가 낮아진 상태여서, 공랭이든 수랭이든 여름에 비해서 오버가 잘된다.

 

그래서 최근들어서 열심히 다시 오버를 하고있는데,

 

 

8월에 세웠던 기록은 경신했다. 그때 20063점이었으니, 667점이 오른 것이다.

 

그 때와 차이가 있다면,

 

CPU Clock 3.6GHz->3.7GHz로 NB Clock   2.0GHz->2.4GHz 좀 더 오버에 성공한 것 뿐이다.

 

2009년 12월 22일 화요일

타워디펜스는 이제 장르로 인정해야하는건가?

 

주문을 해놓은 픽셀 정크 몬스터라는 게임이다.

 

겉 표지를 보면 도대체 어떤 게임일지 궁금증을 야기한다.

 

하지만 정체는 타워디펜스다.

 

거의 모든 핸드헬드 기기와 웹 게임, 스타크래프트 모드, 워크래프트 모드 등등

 

타워디펜스 형태의 게임이 없는 곳이 없다.

 

형태도 다 비슷비슷하다. 그런데 어떤 것은 재미있고 어떤 것은 재미없다.

 

구조와 형태가 간단해서 쉽게 모작을 만들 수 있다고 하더라도,

 

재미마저 쉽게 따라할 수는 없는 것이다.

 

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판도 번역하자는 얘기가 있었지만, 그쪽도 그냥 해본 소리였었던 것 같고, 진심이었어도 내가 안했을 것이다.

 

2009년 12월 21일 월요일

fibonacchi 수열

fibonacchi 수열의 n번째 항을 구하는 코드를 작성해보자.

f(1) = 1,

f(2) = 2,

f(n) = f(n-1) + f(n-2) ( if n > 2 )

 

순차적인 방법

펼쳐두기..


재귀적인 방법

펼쳐두기..

 

템플릿 메타프로그래밍

펼쳐두기..



 

 

성탄절이

콘돔이 가장 많이 팔리는 날이라고 한다.

 

어제 개콘을 보니, 남보원에서 성탄절이 두럽다고 하던데, 이벤트 준비하고 선물 고르고 힘들겠지만, 그래도 여성분들과 S*x 이벤트가 있지 않나?

 

세상은 give and take인거다.

 

커플 남성들이여 찌찔거리지마라!!!

Custom Build Rules 파일 작성하기......

가끔 프로젝트를 진행하다보면, 스크립트나 메타프로그램 파일과 같이 별도의 컴파일러로 컴파일을 해야할 경우가 생긴다.

 

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을 사용하고 있어서 예로 들었다.

2009년 12월 17일 목요일

덕심을 부르는 컨셉은???

원작자께서 우리의 캐릭터 중 하나를 보고 덕심이 부족하다고 해서 원화가가 다시 설정을 고치고 있다. 이미 게임에서 돌아다니는 캐릭터를 고쳐야 하다니, 시간과 돈 낭비 아닌가???

 

난 지금 캐릭터도 좋은데 말이지...

 

새로운 후보들은 다음과 같다.

 

 

어떤 컨셉이 덕심을 부르는가???

 

 

 

 

2009년 12월 16일 수요일

드디어 내일 NHN 관계자의 방문날

pre-alpha version을 만든지 이번 달 말이면 4개월째인데, 회사 사람들과 우리 겜을 플레이한지 3주 정도 된 것 같다.

 

솔직히 처음 테스트 플레이를 할 때는 정말 암울했는데, 이제는 많이 게임같은 모습을 갖추기 시작해서 다행이라고 생각한다.

 

하지만, 솔직히 내부 사람이 자신이 만들고 있는 게임을 객관적인 시각에서 바라본다는 것이 거의 불가능에 가깝다.

 

게임 플레이도 시끌벅적한 분위기 때문에 으레 재미있게 느껴지고 개발자들도 자신이 작업한 부분들 때문에 특히 애정의 느끼기 때문이다.

 

그래서 NHN에서의 방문을 개인적으로 상당히 기대하는 이유는 이제 객관적인 시각에서 우리 겜에 대해서 이야기를 해줄 첫 번째 외부 사람이기 때문이다.

 

물론 사업에 관련된 분들이 겜을 뭐 알겠냐? 이런 말을 하는 사람도 있겠지만 말이다.

 

P.S 올만에 11시에 출근을 해야한다. 요즘 오후 1시에서 3시사이에 출근을 하다가 11시는 아마 안드로메다보다 멀게 느껴진다.

2009년 12월 14일 월요일

아키블레이드

 

월야환담으로 유명하신 판타지 소설가 홍정훈 작가의 올해 신작 판타지 소설 아키블레이드다. 그리고 현재 내가 만들고 있는 게임의 세계관을 담고있다.

 

그런데 소설을 읽어보면 왠지 정통 환타지 소설이라기 보다는 정치,경제,사회에 대한 홍작가의 불만이 녹아있는 블랙코미디라는 느낌을 받게된다.

 

그렇게 게임하고 소설하고 싱크로율을 높이기 위해서 자주 찾아와서, 살펴보라고 해도 워낙 바쁜 사람이라서 자주 찾아오지 않는다.

 

결국 게임하고 소설하고 따로 국밥이 될 수도 있을 것 같다.

 

2009년 12월 13일 일요일

모던워페어2

국내에 PS3판만 심의통과 후 XBOX360, PC판을 다 유통하다가, 걸려서 재심의동안에 Steam으로 구매를 할까말까 하다가 스팀에서 판매 가격이 $59.55(국내 가격은 52,000원)라서 기다리고 있었는데 다시 유통되기 시작했다.

 

그런데 구매는 결국 Steam에서 했는데, DVD없이 실행이 되는 것이 좋고, 따로 DVD 미디어를 보관하지 않아도 계정에 구매한 게임이 저장되어있어서 편하다.

 

콜오브듀티6(모던워페어2)는 발매전부터 전세계 게이머들의 기대작이었는데, 역시나 발매하자마자, 1일 판매량이 북미 역대 모든 엔터테인먼트 산업을 통틀어 최고액을 기록했다(이전 1위도 역시 게임인 GTA4). 지금까지 6000억원이상의 매출을 기록한 걸로 알려져있다. 또 11월 게임 전체 매출의 25%를 차지했는데, 2004년 헤일로2 이후 첨이라고 한다.

 

지금 스팀으로 다운로드 중인데 스팀 열라 느리다. 빨리 플레이 해보고 싶다.

 

 

 

인텔 Mainstream G2 X25-M 80GB 사용

전체적으로 저소음의 쿨링을 갖추게 되면서 가장 귀에 거슬리는 것이 하드디스크 공진음이여서,

 

게임할 때 성능향상과 함께 정숙함을 위해서 오늘 쿨러와 함께 장착

 

 

write 성능이 다른 업체 SSD에 비해서 좀 떨어지는 편이지만, 그래도 HDD에 비해서 월등하기 때문에 별 상관이 없었다.

 

사용해본 소감은 부팅이 진짜 빨라졌다는 것, Windows vista 64bit를 사용하고 있는데 지렁이가 두번가기도 전에 부팅이 된다. 돈이 된다면 80GB를 하나 더 사서 RAID RING0로 구성한다면 진짜 장난아닐 듯 하다.

H50장착

오늘 일체형 수냉 쿨러인 H50을 장착했다.

 

 

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

 

이전에 사용하던 쿨러가

녹투아 NF-P12인데, 공랭 쿨러중에는 최상위품이다. H50이 이 녀석과 가격이 비슷하다.

 

이미 H50 사용기나 성능에 대해서 알고서 샀기때문에 그렇게 큰 기대를 하지는 않았지만, 왠지 NF-P12보다 성능이 떨어지는 것 같다. 또 소음도 약간 더 심한 것 같고......

 

단 한기지 좋아진 점은 커다란 알루미늄 히트싱크가 없어져서, 내부가 넓어보인다는 것뿐.

 

장착은 설명서가 약간 엉성하다는 문제가 나사가 8개가 있는데,

설명서 상으로는 Intel이나 AMD나 동일한 나사를 사용하는 것으로 나오는데

실제로는 나사의 헤드 굵기가 다르다. 얇은 것이 AMD용이고 굵은 것이 Intel용 이었다.

또 리텐션 링에 나사를 장착하기 위한 어댑터가 역 방향으로도 장착이되서

모르고 잘못 장착했다가, 뽑는데 엄청 고생을 했다.

 

 

 

2009년 12월 12일 토요일

우리 회사의 출근 시간

NHN쪽에서 Epic Korea에 언리얼3를 사용해서 겜을 만드는 회사를 소개시켜달라고 해서 우리 회사를 소개시켜줬다고 한다.

 

다음 주 중에 NHN에서 회사로 한번 방문을 한다고 하는데, 시간이 오전 10시다.

 

우리 출근 시간은 오전 11시인데......

 

또 사장 혼자서 손님을 맞이하는 기염을 토할지도

 

이미 Scaleform 담당자의 방문때도 사장 혼자였고

 

Epic Korea 방문때는 그 쪽은 3명이 왔는데

 

우리는 사장과 나 둘 뿐이었다는 그 때는 방문이 오전 11시였는데 ㅋㅋ

 

2009년 12월 11일 금요일

요즘 날씨가

너무 따뜻하다.

 

내가 알던 겨울이라는 친구가 외계인한테 납치되었나보다.

 

기쁘다.

2009년 12월 10일 목요일

3N+1문제 template metaprogramming으로 풀기

어떤 정수 n에서 시작해 n이 짝수면 2로 나누고, 홀수면 3을 곱한 다음 1을 더한다. 이렇게 해서 새로 만들어진 숫자를 n으로 놓고 n=1이 될 때까지 같은 작업을 계속 반복한다.

 

임의의 n이 주어졌을 때, 1이 나올 때까지 만들어진 수의 개수(1 포함)를 구하는 함수를 작성하라.

순차적인 방법

펼쳐두기..


재귀적인 방법

펼쳐두기..


템플릿 메타프로그래밍

펼쳐두기..

 

 

MORE JOEL ON SOFTWARE(조엘 온 소프트웨어를 넘어서)

 

 책 제목 그대로, 이전 편인 조엘 온 소프트웨어를 넘어섰다. 너무 빨리 넘어서서 더 이상 프로그래머에게 추천할 만한 책이 아닌 것 같다. 여전히 촌철살인과 해박한 지식이 가득하지만 말이다.

  환경과 처우를 개선해줘야 일을 더 잘 할 수 있다고 말하며 이 책을 당신의 팀의 관리자와 사장에게 보여줘라. 아마 스타트 업에서 일하고 있다면 100%로 다음과 같은 이야길 들을 것이다.

 

돈 벌면 해줄께~~~

학교에서 배웠는데 잊어버렸네요.

최근 프로그래머를 구인하기 위해서 게임잡의 이력서를 살펴보다.

 

보유 기술이 엄청난 신입 구직자가 있길래. 면접을 보았다.

 

개인적으로는 면접을 보는 당사자의 긴장도가 있기 때문에 간단한 문제를 출제하는 것이 낫다고 생각을 하는 편이라서, 이 날도 즉흥적으로 쉬운 문제를 하나 내보았다.

 

나 : factorial 아시죠?

면접자 : 예.

나 : 그럼 factorial을 구하는 함수를 화이트 보드에 작성해 보실래요?

면접자 : 알겠습니다.

 

한참을 화이트 보드에 서있더니,

 

면접자 : 재귀 함수로 구현해야하나요?

나 : 아니요. 그냥 순차적으로 구현해도 됩니다.

 

다시 한참이 흐르고

 

면접자 : 학교에서 3학년 때, 배웠었는데 잊어버렸네요.

 

프로그래밍이 케이스별로 배우는 것인가?

 

당황스러웠다.

 

본래 의도는 factorial 함수를 순차적인 방법으로 작성해보고, 통과하면

재귀 함수로 구현해보라고 하고, 또 통과하면

템플릿 메타프로그래밍으로 구현해보라고 하려했는데......

성격 검사

아래가 이 포스트를 읽고 계신 분의 성격 검사 결과입니다.

펼쳐두기..


얼마나 비슷한가요?

2009년 12월 9일 수요일

singleton 이야기 I.

// 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의 문제점과 간단한 해결 방법에 대한 이야기이다.

 

각주

펼쳐두기..


 

 

overclocking

현재 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

 

 

 

2009년 12월 8일 화요일

실용주의 프로그래머

도대체 언제 썼던 서평인지 기억이 나지 않지만, 최근 들어 가장 프로 개발자들에게 추천을 해주고 싶은 책이기에 지난 서평을 올려본다.

 

 

책제목 실용주의 프로그래머


지은이 앤드류 헌트, 데이비드 토머스
김창준, 정지호 옮김
출판사 인사이트

 

 

 

 

 

 

 

서평

펼쳐두기..


 

2009년 12월 7일 월요일

outter(vector, cross) product 증명

첫번째 증명

펼쳐두기..


두번째 증명

펼쳐두기..


 

 

CppCheck를 버리다.

// some code.

if( x = 1 ) <---

{

    // some code.

}

 

<--- 표시의 문제를 알려주질 못한다. 역시 모든 공개용 소프트웨어가 쓸만한 것은 아니거나 CppCheck가 아직 많이 개발이 되지 않아서 그렇겠지만, 나는 상용 소프트웨어를 만들고 있는 입장이라서 맘 편히 기다리고만 있을 수는 없어서 CppCheck를 버린다.

 

PC-lint 견적서가 오면 PC-lint를 구매해서 쓰는 것이 좋을 것 같다.

2009년 12월 6일 일요일

게임의 복고 열풍

 80년대 아케이드 게임장에서 볼 수 있었던 도트가 눈에 확들어오는 게임들의 그래픽을 일명 레트로 스타일이라고 하는데, 최근들어 핸드헬드기기의 게임들에서 이런 레트로 스타일의 게임들이 다시 유행하는 것 같다.

 

 솔직히 나도 그 당시에 게임을 하던 사람이라서 옛 향수도 일어나고 왠지 더 친근감이 느껴져서 구매욕구가 쏟아 오른다.

 

 전자 오락의 역사가 그리 오래되지 않았지만, 그래도 이제 연령대 세대분포에서 어느 정도 스펙트럼을 가지게 되면서 복고 스타일의 게임이 경쟁력을 가질 수 있게 된 것 같다.

 

 최근에 발매된 게임 중에 가장 하이엔드 게임기인 PS3에서 발매된 3D 도트 히어로즈가 대표적인 예라 할 수 있을 것 같다. 핸드헬드기기야 성능문제로 인해서 당연히 과거의 게임들을 답습하게 될 수 밖에 없지만, PS3는 현존하는 최강의 게임 머신아닌가?

 

 그런데 아머드 코어로 유명한 프롬 소프트에서 올드 유저의 향수를 공략하기 위해서 발매했다고 밖에 설명할 수 없는 타이틀을 출시한 것이다. 개인적으론 언챠티드2보다 PS3기기를 사야겠다는 구매욕을 더 일으킨 타이틀이다.

 

 

 

inner(scalar, dot) product 증명

첫번째 증명

펼쳐두기..


두번째 증명

펼쳐두기..


세번째 증명

펼쳐두기..


 

2009년 12월 4일 금요일

어머니의 말씀

12월은 크리스마스를 생각나게 하는 달이지만, 개인적으론 어머니가 돌아가신 달이라서 어머니 생각이 난다.

 

어머니가 해주신 말 중에 다음과 같은 말이 기억난다.

사람은 운명을 가지고 태어나서 운명의 길을 따라간다. 하지만 아무리 좋은 운명을 가지고 있어도, 열심히 일하지 않고 남을 돕지 않으면 그 운명이 사라지고 아무리 좋지 않은 운명을 가지고 있어도 열심히 일하고 남을 도우며 살아간다면 좋은 운명으로 변한다.

참 많이 보고싶네요. 어머니 열심히 일하고 남을 도우며 살아가겠습니다.

2009년 12월 3일 목요일

두 가지 상태 전환하기

프로그램을 하다보면, 단순하게 두 가지 상태를 전환하는 문제가 많이 생겨난다. 예를 들어 불을 끄고 키는 것처럼 말이다. 그런데 이러한 상태를 전환하는 간단한 문제에 비교 구문을 이용하지 않고 작성하는 좋은 방법이 있을까?

 

일반적으로는 아마 다음과 같이 프로그램을 작성할 것이다.

 

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; } 이런 방법도 있져 ^^;

 

 

2009년 12월 2일 수요일

프로그래밍을 시작한지 20년이 넘었다.

 초등학교6학년때 첨으로 컴퓨터의 존재를 알게되고, 88년 중학교 1학년때 MSX를 갖게되면서 나의 프로그래밍의 역사는 시작되었다.

 

 BASIC으로 프로그래밍을 첨 했었는데, 중3때 파주시 프로그래밍 경진대회에서 최우수상을 받았지만, 내가 첨으로 출전했다는 이유만으로 도대회는 내가 아닌 다른 학교 아이가 나가는 비운의 경험도 해봤다.

 

 고등학교때부터 C언어를 익히기 위해 줄곧 노력했지만, 결국 포인터때문에 좌절만 맛보고 대학에서 전자계산학을 전공하면서 결국 C언어를 배우게된다. 솔직히 1학년 이후에는 학교의 모든 과제를 다 배껴서 제출했고, 프로그래밍에 대한 자신감은 제로에 가까웠다.

 

 97년 4학년때 학교를 중퇴하고 그해 첨으로 게임회사에 취직해서 많은 부담을 가지고 일을 시작했다. 일은 곧 생계였기 때문에, 그 부담감은 말로 할 수 없었다. 내가 진짜 프로그래밍을 할 수 있을까?

 

 그래도 운이 좋아서 그 뒤로도 지금까지 게임 프로그래머로서 일을 해오고 있다. 초창기 게임 프로그래밍 온라인 커뮤니티를 통해서, 이름도 많이 알려졌었고, 지금 유명한 오프라인 스터디인 KASA의 전신을 만드는데 1등공신이었다.

 

 주변에서 프로그래밍을 잘한다는 입에 침바린 소린 많이들었고, 한때 재능과 능력을 모두가지고 있다고 착각한 적도 있지만, 20여년이 지나면서 최근에 느끼는 솔직한 심정은 그래도 지금까지 살아오면서 유일하게 몰입을 느껴본 일이 프로그래밍이고 중3때부터 천직이라고 생각했었기 때문에 계속 이 일을 하지않을까하는 생각과 아직도 너무 모르는게 많다는 사실과 이제 갓 프로그래밍의 대문을 열고 고개만 내밀어 주위를 살피고 있다는 사실이다.

왜 orthonormal은 M의 전치행렬이 역행렬인가?

간단하게 용어의 의미에서 유추할 수 있는 사실은 - 행우선 행렬이라고 했을 때 -

 

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 행렬의 전치행렬은 자기 자신의 역행렬이 됨을 알 수 있다.

CppCheck를 VS에 연동하기......

메뉴에서 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를 작성해서 키바인딩을 바꿔놓으면 더욱 편하게 사용할 수 있을 것이다.

2009년 12월 1일 화요일

미신에 대해서......

올해 여름부터 오버클럭에 관심을 가지면서 하드웨어에 부쩍 신경을 많이쓰고 부품들에 대해서 이것저것 알아보고 있는데, 확실히 컴퓨터쪽에도 미신이 많은 것 같다.

 

parkoz와 함께 유명한 컴퓨터 부품, 오버클럭 관련 사이트인 쿨엔조이에서 파워서플라이 관련 글을 있다가, EVGA(유명한 보드 및 그래픽 카드 제조업체, 국내에선 판매을 안하다가 최근들어 폭스테크놀러지에서 수입판매하고 있음)와 애너맥스 파워의 호환성이 별로라는 것이다.

 

어떤 근거가 있을까? 근거에 대한 이야기는 없고 미신으로 떠도는 이야기가 댓글에 호환성이 별로라던데, 라고 달리면, 질문은 했던 당사자도 그런가요? 하고 받아들인다.

 

정보혁명의 선봉장이자, 인터넷으로 인해 생활의 필수품이 되어버린 컴퓨터가 더 이상 과학의 발명품이 아닌 미신의 영역에서 다루어지고 있는 것이다.

2009년 11월 27일 금요일

이산적인 시간과 연속적인 시간

우리의 삶은 연속적이다. 모든 시간과 모든 날은 우리의 편의를 위해서 이산적으로 나누어지고 있지만, 그래도 우리의 생은 연속적으로 진행되는 것이다. 우리는 컴퓨터가 하는 이산적인 계산을 딱딱한 것으로 취급하지만, 역설적으로 우리도 시간을 이산적으로 쪼개서 모두 소중한 시간을 어떤 날, 어떤 시간은 더 특별하게 취급하면서 산다.

 

무덤덤하게 모든 날을 똑같이 살아가는 내가 남들을 질투해서 그렇게 느껴지는 걸지도......

barycentric coordinate

bary centric coordinate가

다음과 같이 u, v를 두 축으로 가지는 평면 좌표계를 구성하는데

v
|
|
|
|
|
|
+---------------- u

u + v <= 1이기 때문에 결국 삼각형의 영역만을 나타낼 수 있는 좌표계가 됩니다.

삼각형을 이루는 정점 세 개를 v1, v2, v3라고 하고 v1이 원점이고
v2-v1이 u축을 이루고, v3-v1이 v축을 이루면 다음 그림과 같아지고

v3
|
|
|
|
|
|
+----------------- v2
v1

coordinate frame으로 나타내면 u*(v2-v1) + v*(v3-v1) + v1이 됩니다.

풀어서 정리를 하면 v*v2 + v*v3 + (1 - u - v) * v1으로 bary centric coordinate의 표현이

됩니다(1 - u - v = w라고 하자).

이제 u, v, w가 삼각형의 어떤 영역인지를 알아봅시다.

임의의 점 (u', v')를 위의 좌표계 상에 나타내보면, 다음과 같이 됩니다.

v3
|
|
|
|           +(u', v')
|
|
+------------------ v2
v1

u,v 축이 단위길이이므로, v1, v2, (u',v')로 이루어지는 삼각형은 1/2 * v'의 크기를 가지고 v1, v3, (u',v')로 이루어지는 삼각형은 1/2 * u'의 크기를 가지고 나머지 영역인 w는 1/2 - 1/2(v' + u')의 크기를 가지게 됩니다.

면적비를 구해보면 v', u', (1-u'-v')가 되므로 v1, v3, (u',v')가 이루는 영역이 u좌표가 되고, v1, v2, (u',v')가 이루는 영역이 v좌표가 되고 나머지 영역이 w가 됩니다.

설명이 잘되었는지 모르겠네요.^^
 

2009년 11월 26일 목요일

프로젝트가 서쪽으로 간 까닭은

 

 이 책은 소프트웨어 개발팀에서 드러나는 안좋은 행동 패턴에 대한 모음집이다. 원제가 첫 번째 패턴인 아드레날린 정키와 마지막 패턴인 템플릿 좀비를 합쳐놓은 아드레날린 정키와 템플릿 좀비인데, 번역서의 제목이 솔직히 더 재미있게 느껴지고 가슴 속으로 심금을 울렸다.

 

 사람의 사고는 자유롭다. 그렇지만 언어적인 한계인지 아니면 학습에 의한 정형화인지 사회적인 관계의 따른 제약때문인지, 모든 사고와 행동은 그룹화가 가능한 것 같다. 그래서 개인이나 조직이나 행동의 패턴이 있기 마련이다. 뭐 이런 패턴화때문에 프로파일링이라는 것이 가능하고 그래서 멘탈리스트나, 라이투미와 같은 재미있는 미드가 나오는 것이고, 실제적으로는 범죄 수사에 도움이 되는 것이기도 하겠지만 말이다.

 

 책을 읽으면서 역시 소프트웨어 개발에서 게임개발팀이 가지는 특수성이 있다라는 생각도 들긴했다. 항상 가까운 곳에서 고객이 같이 호흡을 하고 있고, 이질적인 팀원들과 대화의 창구가 항상 열려있다는 게임 개발의 특징들로 인해서 공감이 가지 않는 몇 가지 패턴들이 있긴 했지만  대부분의 내용에서 공감이 가는 부분이 많아서  너무 재미있게 읽었고, 많은 도움을 받은 것 같다.

2009년 11월 25일 수요일

TargetProcess

 팀에서 agile 방법론으로 개발을 하고 있다면, TargetProcess를 사용하면 많은 도움을 받을 수 있다. 그 전에는 일일이 포스트잇에다 사용자 스토리와 태스크들을 적고, 화이트보드에 붙여서 진행중,완료구역으로 트레킹을 수작업으로 일일이 하느라 불편하고 무엇보다, 상태를 저장할 방법이 적당하지 않다는 것이었다.

 

 이 모든 것들을 해결해주는 Web-based 툴이 바로 TargetProcess이다. 유명한 게임 개발사인 Bioware에서도 사용하는 것인데, 평가판으로 몇개월 사용해보니 장점이 많은 것 같아서 정식라이센스를 하고 팀에 도입하기로 결정했다.

 

 그런데 솔직히 가장하고 싶은 이야기는 TargetProcess가 좋다라는 이야기가 아니라 화이트보드에서 수동으로 관리할 때도 태스크를 생산하고 트레킹을 잘하지 못하던 개발자는 여전히 똑같았다. 모든 방법론에서 가장 중요한 가치중 하나가 실천이라고 하는 이유를 다시 한번 느끼게 된다.

 

 또 단점이라면, 화이트보드가 있을때는 지나다니면서 가끔 보기라도 하기때문에 전체적인 업무에 대한 가시성이 높았는데 TargetProcess는 접속을 잘하지 않는 경우가 많아서 가시성이라는 면에서 봤을 때는, 화이트보드보다 못하다는 생각이 든다.

 

 

 

2009년 11월 18일 수요일

규범의 디자인

펼쳐두기..

 

지하철의 에스칼레이터를 보면 오른쪽 줄은 서있는 줄이고 왼쪽은 이동을 하는 줄이라는 규범이 디자인되어 있다. 이러한 규범을 디자인해서 정착하는데 그렇게 오랜 시간이 걸린 것 같지는 않다. 그런데 이 디자인을 엇갈려서 양쪽 모든 서있는 것으로 고치려한 서울지하철공사의 노력은 헛수고인 것 같다. 한번 적용된 규범은 다른 규범으로 그렇게 쉽게 대체되지 않는 것 같다.

 

 이런 이야기를 꺼낸 것은 최근 오른쪽 보행 규범의 디자인에 대해서 이야기를 하려고 하기때문이다. 역사가 짧은 에스칼레이터의 규범 조차도 이미 자리잡고 있는 규범을 대체하지 못하는데, 언제부터 시작된지 모르는 좌측통행을 우측통행으로 바꾸려하는 우매함으로 인해서, 과장해서 말하면 지하철 역사내에서 이동은 항상 아비규환이다.

 

 사람의 행동 유도를 위해서 이곳저곳에 우측으로 보행이라는 스티커들을 붙쳐놓았지만, 오랫동안 머릿속에 규범으로 인식된 좌측통행의 지배력을 능가하지는 못하는 것 같다.

 

 우매한 규범의 디자인이 혼란만 가중시키고 있다는 느낌을 지울 수 없다.

아 오로라를 보러가고 싶구나

 

겨울철 노르웨이에서 오로라를 볼 수 있는 확률이 가장높다고 하던데......

 

후띠루튼 크루즈를 타고 노르웨이 서해안을 따라 떠나느 여행이라. 오로라는 정말 보고싶다. 어디 멀리로 떠나본지도 오래됐고, 5박7일에 2,790,000원이라...... 이번 겨울이 지나기전에 한번쯤 가고싶은 여행지다.

2009년 11월 13일 금요일

override keyword

 어제 VUTPP의 구글 테스트용 Bind코드가 구글 테스트 1.4버전과 호환되지 않아서, 고치면서 고생했던 것이 VUTPP용 Listener class를 만들 때,

 

 이전 버전에선 본래 void OnNewTestPartResult라는 이벤트를 발생시키는데, 1.4버전에선 그 event의 이름이 OnTestPartResult로 바뀌어서 교체를 하고 다른 수정부분들도 수정을 하고 당당히 컴파일을 성공해서 실험을 하는데 왠일인지,

 

 함수가 호출되지 않아서 bRun의 값이 false인 상태로 있어서 모든 테스트들이 다 can't find test에러를 발생시키는 것 아닌가?

 

 좌절하고 있었는데, 가상 함수를 다시 잘 살펴보니 이전 버전은 인자가 포인터였는데 이제는 레퍼런스로 바뀐 것 아닌가? 결국 함수가 오버라이드되지 않고 새로운 함수를 정의한 것이 되었으니 이벤트 함수가 호출되지 않았던 것이다.

 

 나는 오버라이드하고 싶었는데 그 의도를 컴파일러한테 알려줄 수가 없으니 컴파일러가 오류를 알려주지 못하는 것이라서, 컴파일러한테 의도만 전달할 수 있으면 쉽게 발견할 수 있는 오류였던 것이다. 그런데 그런 역활을 해주는 keyword가 visualstudio 2005에서 추가되었는데 그것이 바로 override 키워드다.

 

 이것만 알았어도, 고생 덜했을텐데......

 

 

2009년 11월 12일 목요일

다시 VUTPP

GoogleTest 1.4버전과 Sample로 들어있는 GoogleTest Bind용 main.cpp가 호환되지 않아서 컴파일이 되지 않는다. 그 사이 GoogleTest의 소스 구조가 좀 바뀌었나보다. 뭐 간단한 일이라서 직접 수정해서 첨부한다. 뭐 이 블로그에 방문할 사람이 있을까 하지만, 필요한 분이 있다면 가져다 쓰시길......

Borderland

최근 열심히 즐기고 있는 게임. 흔히 FPS 디아블로라고 부르는 게임임. 헉슬리가 FPS+RPG가 잘못 혼합된 형태라면 이 게임은 잘된 케이스임. 발매될 때까지도 모르고 있었던 게임인데, 정말 물건임!!!

 

지금 회사에서 Unreal을 사용해서 NPR느낌으로 게임을 만들고 있어서 Unreal을 사용해서 첨으로 NPR느낌의 게임을 만드는지 알았는데, 이 녀석이 나오면서 이제 그냥 따라쟁이 게임이 되겠군.

동생이야기

 

 작년에 Daum에서 웹툰 작가로 데뷔해서 이런저런 집안 사정으로 연재 내내 악플로 시달려오다가 한 동안 다음 작품을 준비하는 기간이 길어졌지만, 올해 다시 시작한 연재물이 바로 Hang-off다. 형인 나도 황당하게도 바이크 만화였던 것이다. 물론 동생이 바이크를 좋아해서 고등학교때도 바이크로 등교를 하긴 했지만, 어떻게 이야기를 진행할지 궁금했는데 26화나 진행 중......            


헝가리언 표기법의 무용론

실용주의 프로그래머를 읽다보니, 저자가 헝가리언 표기법은 객체지향 시스템에서 전혀 적절하지 못하다는 이야기가 나오는데, 전적으로 동의한다.


사용자가 타입을 정의할 수 있는 언어들에서 각 타입마다 일대일 대응이 되는 접두어를 할당하는 것은 사실상 힘겨운 일이며, 결국 여러 타입들이 하나의 접두어에 대응되는 중복이 생겨난다. 이러한 중복은 의미상의 오류를 발생시킬 소지가 크고 의미상의 오류는 정말 가장 발견하기 힘든 버그가 되는 경우가 많다.

 

imays

 그래서 제 회사에서는 프로그래머들이 primitive type을 제외하고 접두어에 변수 타입을 안넣는걸 권장하고 있습니다.

CppCheck

http://www.thisisgame.com/board/view.php?id=302087&amp;category=106&amp;subcategory=2

에서 발췌.

 

NCSoft에 다닐 때 들었던 이야기 중에 삼성은 코드품질을 분석하는 툴이 있어서 그 툴로 코드를 분석해서 프로그래머들의 고과점수를 매긴다는 소문이 있었는데 바로 그 소문의 툴이 Coverity Prevent이라는 정적분석툴 소프트웨어 시장 점유율 25%를 차지하고 있는 어마어마한 녀석이다. 물론 가격도 어마어마해서 현재 우리 벤처기업에선 엄두도 내지 못하는 녀석인 것이다.


UnitTest는 특정 행위에 대한 결과가 정확한지 확인하고 객체의 상태 중심적인 테스트인 것이지, 언어적인 측면에서 실행시 발생할 수 있는 잠재적인 오류를 알려주지는 못하기때문에 개인적으로 정적 분석툴에 대해서 관심이 많이 있었는데, Visual Studio에 /analyze라는 옵션이 있어서 컴파일때 정적 분석을 할 수 있다는 것은 알지만, Team Suite버전에 있다라는 씁쓸한 소식과 Tema Suite의 가격을 알아보니 Coverity Prevent보다는 진짜진짜 저렴한 가격이지만 그래도 1300만원대여서 Professional버전을 사용하고 있는 우리의 실정으로는 그것조차 먼 하늘에 떠 있는 별과 같아서 꿈만 꾸었는데, 여기 저기 블로그들을 돌아다니다 알게된 것이 바로 CppCheck라는 오픈소스 정적 분석툴인 것이다. 상용툴에 비해서 아직 부족한 기능이지만 아무 것도 확인하지 않는 것보다는 나을 것 같아서 프로젝트에 도입 결정......


되도록이면 빠르게 업데이트되어서 정말 멋진 녀석으로 성장하길 기도해야겠다. 몰론 항상 바쁘다는 핑계로 오픈소스 프로젝트이지만 기여할 생각은 전혀없다. 솔직히 얘기하면 기여할 능력이 없다라는 것이 정답일 듯......

VUTPP를 사용해보고......

서버 개발을 위해서 개발 환경을 구축하면서, TDD를 위해서 UnitTest++를 쓰려고 Google에서 검색하다가 발견한 Add-in 프로그램인 VUTPP, 지겨운 콘솔 Output이나 XML Reporter에서 벗어나 GUI로 TEST들의 결과와 실패 이유를 볼 수 있다는 엄청난 장점을 가지고 있지만 사용을 하면서 몇몇 가지 단점들을 발견했다.


솔직히, 시간을 내서 OpenSource로 이런 프로그램을 만든 분들의 노고를 생각하면 이런 단점들을 가지고 왈가왈부하는 것이 참 쫌스러운 행동이지만, 그래도 항상 구경꾼이 할말이 더 많은 법이라서......


단점을 적어보자면 다음과 같다.

  • 우선 Project의 설정이 NMake로 되어있으면 PreprocessorDefinitions에서 VUTPP_UNITTEST++ define을 읽어오지 못하지만, 약간의 소스 수정으로 정상적으로 동작하게 고칠 수 있다.
  • 그 다음은 마찬가지로 NMake일 때 Run All, Run Selected가 다 작동하지 않는다. 실행파일 경로를 얻어올 때, bind설정이, application, dynamiclibrary이렇게 두 가지 밖에 없어서 실행파일 경로가 null로 세팅되기 때문이다.
  • 마지막으로 x64 플랫폼으로 컴파일을하면 Bind Failed(Timeout) 오류가 난다. 같은 프로젝트를 win32로 컴파일해서 해보면 정상적으로 동작한다.

개인적으로 Custom BuildTool을 만들어서 사용을 하고 있기때문에, 위의 단점이 엄청크게 느껴지긴 하지만, 누군가를 위해서 이런 공개용 프로그램을 만들어 본 적이 없기때문에, 스스로의 무능력함을 책망할 뿐이다.