rein’s world

프로그래머, 독서가, 게이머 그리고 블로거

오늘의 자폭 코드  

void Agent::Connect( const string& address, uint16_t port )
{
    pSocket->Connect( address.c_str(), 33);
}

…이러시면 곤란하지 말입니다 (내가 짠거다).

o <-<


By rein

November 30th, 2007 at 4:23 pm

Posted in Computer

Tags: ,

리뷰: 똑똑하고 100배 일잘하는 개발자 모시기  

Rica로부터 대여한 조엘 스폴스키의 "똑똑하고 100배 일잘하는 개발자 모시기"를 읽었다.

똑똑하고 100배 일 잘하는 개발자 모시기 - 조엘 온 소프트웨어 시즌 2

일단 몇 가지를 지적하고 넘어가자면,

일단 이정도.

책 내용이 뛰어난 개발자를 어떻게 뽑을지에 대한 조엘 자신이 생각하는/사용하는 방법에 몰려있어서 개발자들이 직접 보기엔 좀 재미없을지도 모른다. (면접들어갈 일이 있다면 한 번쯤 다시 읽어도 좋을지도 모르지만 그 부분은 조엘 온 소프트웨어와 내용이 겹친다)

낚이지 말고 한 번 읽어본 정도로 족하다가 내 평가.(나는 인사담당자도 아니니 -_-;; )

ps. 괜히 태그에  프로그래밍이 안들어가있는게 아님


By rein

November 30th, 2007 at 4:19 pm

Posted in Computer,

Tags:

C/C++의 예외 모델 차이  

try { throw } catch {} & do { break } while (false) 에서 트랙백. C++의 예외 처리가 느리기 때문에 do while을 이용한 코드 블럭 탈출 / setjmp/longjmp를 이용한 함수간 예외 전달을 다뤘길래 문제가 있다고 생각하는 점을 지적하려고 포스팅.

C에서는 예외의 발생을 일반적으로 에러 번호를 통해서 전파하며, 특정 블럭의 실행을 끝내기 위해서

do
{
// do some thing
} while ( 0 );

같은 코드 블럭에서 break 문을 사용하는 방법을 많이 쓴다. (goto문과 비슷하지만 label 문제도 없고 상대적으로 보기가 쉬우면서도 C++에서 쓰기도 편하다)  혹은 setjmp / longjmp라는 어떤 의미에서는 악마의 자식(…)을 사용해도 된다. 이건 진정한 의미†의 goto문이기 때문에 C 에서도 매우 주의 깊게 사용해야하고 - 꼭 필요한지 3번은 되묻자 - C++에서는 사실상 사용이 금지 된다.

C++의 경우에는 예외적인 경우가 발생했을 때 말 그대로 예외exception을 생성시키고 이를 던진다throw. 문제는 C++의 경우 C 보다 강력한 표현력을 제공하고 OOP를 지원하기 위한 장치들이 들어가 있다는 것인데 가장 중요한 내용은 바로 stack-unwinding이라고 부르는 현상을 일으킨다는 것이다.(이것 때문에 많이 느려질 수 밖에 없다)

바로 예외가 블럭 스코프를 벗어날 때 해당 블럭에서 생성했던 - auto, register로 선언한 변수 - 들의 소멸자를 일일이 호출해주는 것인데, 이를 위해서 C++  컴파일러는 예외가 생길 수 있는 부분마다 이런 변수들의 위치와 소멸자를 추적해줘야한다. 그렇기 때문에 예외가 발생하게 되면 이런 정보를 토대로 일일이 변수를 찾아서 소멸자를 호출해주게 되는데, 이 과정은 "예외는 정말 가끔 일어나는 경우다" 라는 가정하에 그다지 최적화되지도 않고해서 굉장히 느리다.

트랙백한 글에서 이를 비교해서 문제 삼고 있다.(사실 문제인게 맞다) 그렇지만 do { code block } while( 0 ); 와는 달리 예외는 좀 더 단순하고 생각하기 쉬운 제어 경로를 보여주고, setjmp/longjmp의 문제를 안 일으킨다. setjmp/longjmp를 사용하는 경우 말 그대로 실행 경로만 바뀌기 때문에 stack 위에 쌓여있을 변수들이 소멸되지 않아서(…), 동적으로 할당했거나 혹은 추가한 참조등에 대해서 처리가 되지 않는다. 이런 코드가 있다고 치자.

{
    scope_based_lock( lock_name );// scope를 벗어나면 소멸자에서 lock을 해제한다.

    if( exception_condition )   longjmp( jmp_buf_var );
}

이런 코드인 경우에 longjmp는 재앙이다. 특정 리소스에 대한 lock이 해제되지 않는다. 그렇기 때문에 - 이 경우 말고도 메모리 할당 / 스마트 포인터의 참조 포인터 처리 등 소멸자에서 처리하는 부분이 있으면 - 여러가지 문제로 인해서 C++에서는 longjmp의 사용이 사실상 금지된다.

반면에 저 상황에서 longjmp가 아니라 예외를 던졌다면, stack-unwinding에 의해 소멸자가 적절히 호출되고 리소스 lock이 해지되지 않는 일은 발생하지 않는다. 예외를 주의깊게 정말 예외로 처리해야할 상황 에서 썼다면 예외 처리로 인한 속도 문제는 큰 무언가가 아니다. 암달의 법칙을 기억하라. 실제로 예외가 발생해서 해당 부분의 코드가 사용되는 시간은 실제 가동 시간의 아주아주아주아주 작은 일부분이다.  그러니 안심하고 C++ 친화적인 예외exception을 사용하자.

*

† setjmp로 특정 위치를 기록하고, longjmp를 호출하면 setjmp를 호출했던 장소로 즉시 이동한다. 같은 함수 혹은 스코프 안에서 setjmp/longjmp가 불릴 필요가 없기 때문에 함수 간에도 이동이 가능하다(…).


By rein

November 29th, 2007 at 4:08 pm

Posted in Computer

Tags: ,

리뷰: 라프 코스터의 재미이론  

흔히 울온이라고 부르기도하는 울티마 온라인;Ultima Online의 수석 기획자였던 라프 코스터;Raph Koster의 재미 이론을 다 읽었다. 원제가 A theory of fun for game design 인 것이 말해주듯이 컴퓨터/비디오 게임에서 재미란 어떤 것이고, 그것을 구성하는 것은 무엇이며, 우리 - 이 책에서 표현되는 “우리”는 게임 디자이너;기획자에 가깝다 - 가 해야할 일은 무엇인가에 관한 내용들이 담겨 있다.

라프 코스터의 재미이론

사실 게임의 전반을 이루는 재미라는 요소에 대해서 깊게 생각해보거나 배울 기회는 없었다. 친구나 동료들과 얘기할 때에도 보통은 “이런 점 때문에 이 게임이 재밌다/재미없다” 라는 형식의 대화를 하게 되고, 학부 컴퓨터 게임 수업†에서 배우는 내용도 기술적인 부분과 서사적인 부분에 중점을 두고 있다. 그런 상태에서 5throck님의 서평을 보고 이 책을 구매하고 읽게 되었다.

몇 일 전 포스팅에 살짝 쓰긴 했지만 번역 자체는 극히 일부분(그러니까 각주 번역)을 빼면 깔끔하다. 그렇지만 몇 몇 단어의 mis-reading 이라고 불러줄만한 부분은 조금 괴로웠다. 책 구성 자체는 왼쪽 페이지에 내용이, 오른쪽 페이지에 이에 해당하는 삽화/카툰?이 들어가 있다‡.

각설하고(…), 이 책에서 말하는 (게임의) 재미라는 것은,

어떤 패턴을 학습하게 되고, 이런 학습을 통해 느끼게 되는 쾌감

이라고 간단히 정의한다. 약간 고개를 갸웃거리게 만들면서도 묘하게 수긍이 가는 말인데, 사실 나는 이 보다 조금 더 있다고 믿긴하지만, 일단은 책은 재미있게 읽었다. 이 학습이라는 것을 잡음으로 부터 패턴을 발견하는 과정으로 풀이하는데, 이 말은 굉장히 설득력이 있었다. 이건 우리가 흔히 경험하는 게임의 재미다. 예를 들어서,

  • World of Warcraft에서 특정 레이드 보스에 대한 적절한 공략 방식(=패턴)을 발견한다거나,
  • Command and Conquer 3에서 멀티플레이어 게임에서의 특정 전략을 무력화 시킬 방법을 발견한다거나,
  • Eternal Sonata (=Trusty Bell)의 전투시스템을 이해하고 이를 반영하게 되었다거나(이건 전투 시스템에 관해서 나중에 포스팅 하나 할 듯),

이런 식으로 게임 내의 패턴을 발견하고 이를 뛰어넘게 되는 것들은 상당히 큰 쾌감으로 다가온다.

라프 코스터는 계속해서 게임에서 경험하는 것들이 실제로 재미를 주게되는 “학습의 경험”으로 바꿔주기 위해 필요한 요소들을 나열하고, 이를 설명한다. 그렇지만 내가 생각하기에 몰입감을 주는 요소로서 사용되는 일부 도구들에 대해서는 조금 약하게 생각한다라는 느낌이 있다. 문제점으로 지적한 “일부 플레이어가 지배적인 요소”가 되어버리는 현상 - FPS 장르의 게임에서 가끔 나타난다 - 에 대한 것도 조금 불확실한 해결책만 제시하고.(사실 이건 뭐라 그럴 문제는 아니고 각 게임에서 풀어나갈 수 밖에 없는 문제이긴 하지만)

뭐 그렇지만 게임의 재미를 분석한다는 것도 꽤 훌륭한 작업이었던 것 같다. 이런 점에 대해서 다시 한 번 생각해보게 만들어준 것도 좋았고, 그 동안 훌륭하다고 생각하거나 이건 정말 아니다 라고 생각했던 게임들에 대해서 다시 한 번 돌아볼 기회를 제공해 준 것 같기도 하다.

그런 의미에서 게임 개발자 - 프로그래머든 게임 디자이너;기획자든 - 라면 한 번 쯤 읽어봐도 손해는 아니라고 하겠다.

*

† 이제희 교수님과 권태경 교수님 두 분이 그래픽스, 네트웍, 그리고 게임 서사와 각종 구성 요소들을 강의하고, 실제 현업에서 일하는 분들의 강연도 들을 수 있는 학부 4학년 수업이다. 학기말에 팀 단위로 게임을 제출해야하기 때문에 약간 터프하지만 재미있는 수업이다.

‡ 사실 이 구성 자체는 오른쪽 페이지에 해당하는 부분이 2003년 Austin Game Conference 발표 자료로 사용되었다는 데에 기인한다.


By rein

November 29th, 2007 at 10:17 am

Posted in Game,

Tags: ,

SSH 터미널, SCP에서 한글 사용  

이 글은 동아리 linux 서버 사용을 위한 도움글로 작성되었습니다. MS Windows 환경에서 널리 사용되는 SSH 터미널인 PuTTY와 SCP 클라이언트인 WinSCP 를 기준으로 설명합니다.

현재 가동 중인 linux 서버인 그랑엘베르(IDC), 유리엘(넬방) 2대는 기본 설정에서 한국어(UTF-8)으로 설정되어 있다. 이 상태에서 쓴다고 가정하면 우선 터미널 셋팅은, (PuTTY 기준으로)

  • Window - Translation의 캐릭터 셋 항목을 UTF-8으로 해준다. (반면에 한국어 euc-kr; ko_KR.eucKR 을 쓰면 Font encoding으로)
  • Window - Appearance의 font를 한글이 가능한 고정폭 폰트로 설정한다. 그리고 스크립트가 한글인지 확인한다. (영어면 한글 입력이 보이지 않는다 )
  • 터미널 로그인을 한 후 쉘에서 $LANG, $LC_ALL † 환경 변수 값을 확인한다. 이 둘이 ko_KR.UTF-8 인지 확인할 것

여기까지 진행하면 PuTTY로 한글 입/출력이 가능한 상태로 서버에 로그인 할 수 있다.

덤으로 파일 이동을 위한 WinSCP 사용을 보자.

계속 읽기: “SSH 터미널, SCP에서 한글 사용” »


By rein

November 28th, 2007 at 12:13 am

Posted in Computer

Tags: , ,

Firefox에서 윈도우즈 인증(NTLM) 쓰기  

회사 내에서 사용되고 있는 게시판 (…및 기타 이슈 트랙킹, 작업 관리 등등등등)에 해당하는 툴이 있는데, 웹 기반이고 IIS위에서 동작하고 있다. 어제 저녁에 이 물건의 버젼이 올라가면서 인증 과정이 바뀌었는데 오전에 출근해보니 로그인이 안되는 사태 발생 Orz

조금 더 확인해보니 IE (7.0)에서는 제대로 접속이 되고 FF에서는 안되는 것이다. 그래서 해당 서버 응용을 개발하시는 분한테 여쭤보니 일일이 로그인 해야하는 것(HTTP Digest)을 사용자들이 싫어한다는 것이다. 그래서 윈도우즈 인증을 사용하기 시작했다고.

즉 원인과 현상은 이러했다.

  • (일명)윈도우즈 인증은 NTLM이란 것이다.
  • IE의 Trusted sites에는 해당 서버가 올라가 있다.
  • 따라서 IE는 잘 연결이되고 해당되는 FF의 목록에는 없으므로 안된다.

원인을 찾았으니 절반은 해결

계속 읽기: “Firefox에서 윈도우즈 인증(NTLM) 쓰기” »


By rein

November 27th, 2007 at 12:41 pm

Posted in Computer

Tags: ,

책 읽다 화낼 때  

…rein의 경우 제일 화내거나 짜증 낼 때는 저자와 생각이 정반대다 이럴 때가 아님. 아마도

  • 번역의 질이 나쁜 경우
  • 단어 선택이 부적절하거나 호응이 맞지 않는 경우

이 두 가지가 제일 심한데, 오전에 출근하면서 읽었던 "재미 이론"이란 책에 상당히 부분적이긴 하지만, 첫 경우에 해당하는게 있다.

사실 책 본문에 있는 것은 아니고 미주에 있는 내용이 문젠데 - 사실 이 책의 미주로 처리된 부분의 상당수는 각주로 처리되었어야 한다고 느껴진다 - 몇 몇 단어의 오역도 아니고 "잘못 읽었다" 수준의 것들이 있다.

바로 46페이지의 훈련에 달린 미주인데, 그대로 인용하면

현대 컴퓨팅의 아버지로 알려진 앨런 튜링은 ‘터닝의 정지문제’라는 것을 고안한 사람이기도 하다. (중략)

이미 계산된 적이 있는 것이라면 그 어떤 것도 계산될 수 있다고 말하는 처치-터닝 논문에 있다.(하략)

읽는 순간 "뭔가 이상하다"라는 느낌이 드는 당신은 전산학/컴퓨터공학 전공자 혹은 연관된 사람.

계속 읽기: “책 읽다 화낼 때” »


By rein

November 26th, 2007 at 1:56 pm

Posted in

Tags: ,

리뷰: 딥 심플리시티  

계속되는 11월의 도서 러쉬…의 한 부분으로 지른 딥 심플리시티Deep simplicity를 완독(구입한지 어느새 12일이나 지난 것을 발견(…)).

딥 심플리시티 - 카오스, 복잡성 그리고 생명체의 출현

Ordo ab chao

혼돈으로부터 질서가

정도로 요약하면 책 내용이 되겠습니다.(물론 질서로부터 혼돈이 생기는 부분도 설명하지만)

Rica의 리뷰에서처럼 자연 과학이나 공학을 전공한 사람이라면 누구나 재밌어할만한 내용을 다루고 있다. 우선 혼돈으로부터 질서를 뽑아낸 얘기들을 한다. 과학 혁명 이전부터 이뤄낸 과학의 승리들을 설명하고, 그 이후의 발견들도 설명한 후 본론 - 혼돈chaos와 복잡계의 세계로 - 으로 들어간다.

계속 읽기: “리뷰: 딥 심플리시티” »


By rein

November 25th, 2007 at 9:28 pm

Posted in

Tags: ,