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(유명한 보드 및 그래픽 카드 제조업체, 국내에선 판매을 안하다가 최근들어 폭스테크놀러지에서 수입판매하고 있음)와 애너맥스 파워의 호환성이 별로라는 것이다.

 

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

 

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