일상/게임개발/드라마/영화/운동/음악/사진/애니메이션/육아 등.. 100년 후에도 남을 기록을 위하여 오늘도 끄적인다.
In: Programming
28 Apr 2010지난 주말에 와이프 일을 좀 도와준다고 프로그램을 하나 만들 일이 있었다. 가끔 업무 외적인 부분의 개발은 C#으로 개발을 해보기도 하는데, C++ 0x 연습도 할 겸, Visual Studio 2010을 써서 개발을 해 봤다.
확실히 Visual Studio 2010의 Beta나 RC에 비해 최적화가 굉장히 잘 되어 있다는 느낌이 든다. 베타나 RC 시절에는 최고사양 PC를 가지고도 버벅거린다는 느낌이 강했지만, 현재는 그런 걸 전혀 느낄 수 없다. 말 많은 WPF 에디터도 생각보다 괜찮은 듯… 특히, 흐릿했던 폰트 드로잉이 상당히 미려해졌다.
인텔리센스도 좋아졌다. 아직 제대로 된 컬러링은 Visual Assist가 있어야 하지만, 정확도는 예전에 비할 바가 아닌 듯. 재미있는 건, ncb 파일 등에 저장했던 내용을 이제는 SQL DB 파일로 저장한다… 겨우 1000 라인 수준의(MFC UI) 소스에 대한 인텔리센스 정보가 무려 80MB;;; 프로젝트 수십 개 되면, 1GB는 그냥 넘어갈지도 모른다. svn에 이런 파일 커밋하면 진짜 이젠 가서 한 대 때려주고 싶을 듯.
그 외에도 멀티 모니터 지원 등 편리한 기능들이 많이 생겼다. 참, 클래스 위저드도 확 바뀌었다.
이젠 클래스 위저드를 통해서 윈도우 메시지나 가상 함수 오버라이드 등을 할 수 있다. 이젠… 이라기 보단, 다시라고 해야겠군. Visual Studio .NET 이 나오면서 사라진 클래스 위저드에 대한 요구가 굉장했나 보다.
IDE 이야기는 이쯤하고…
얼마 전에 최종안이 제출된(확정된 건지는 잘…) C++ 0x에는 lambda와 auto가 있다. 둘 다 boost에서 lambda/any라는 템플릿 라이브러리로 제공된 것이긴 하지만, C++ 0x에서 언어 레벨의 기능으로 구현이 된 것이다. 사실 boost::lambda는… 솔직히 쓰기가 좀;;;
템플릿 및 stl을 쓰다 보면, 타이핑 하기가 겁나 귀찮아지는 순간이 찾아온다. 예를 들어, 간단히 벡터에서 어떤 객체의 멤버 변수 값이 특정 값인 녀석을 검색한다고 할 때, 함수자를 정의하고, 반복자를 마구 타이핑 해 줘야 한다.
1 2 3 4 5 6 7 8 9 10 | struct agent_finder { agent_finder(int index) : find_index_(index) {} bool operator()(Agent &agent) { return agent.id == find_index_; } int find_index_; } std::vector<Agent> agents; std::vector::iterator find_it = std::find_if(agents.begin(), agents.end(), agent_finder(1)); |
그런데, 이걸 람다와 auto 키워드를 쓰면, 다음과 같이 쓸 수 있다.
1 2 3 4 5 6 7 8 | std::vector<Agent> agents; auto find_it = std::find_if(agents.begin(), agents.end(), [=](Agent &agent) { return agent.id == find_id; } ); |
물론, 함수 객체가 여기저기서 사용된다면, 따로 정의하는 것이 좋겠지만, 그게 아니라면 람다를 사용해서 간편하게 로직 중간에 기술할 수 있다. 또한, auto 키워드를 사용함으로써, 타이핑이 너무 편해졌음!
안타깝게도… C++ 0x의 초기화 리스트 관련 내용은 이번에는 없는 듯 하다.
1 | std::vector<int> v = {0, 1, 2}; |
아마 올해 C++ 0x가 완전히 확정되고 난 후, 내년 즈음 2010 SP1 정도 나오면 다 지원되지 않을까 싶네. Visual Studio 2011이나 2012가 나올려나? -0-
In: Programming
27 Apr 2010사실 이미 2주전의 삽질인데… 드래프트로 저장해 놓고는 공개로 돌리는 걸 깜빡 했다.
오늘의 삽질 기록.
첫 번째.
MFC를 가지고 Windows UI 개발을 하다 보면, 자주 접하는 매크로가 있다. 바로 ON_MESSAGE, ON_NOTIFY, ON_COMMAND, ON_REGISTERED, ON_BN_CLICKED … 기타 등등…
이 중, 사용자 정의 메시지를 처리하기 위한 핸들러를 정의할 때 사용하는 것이 바로 ON_MESSAGE 매크로다. 이 매크로는 다음과 같다.
#define ON_MESSAGE(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_lwl, \
(AFX_PMSG)(AFX_PMSGW) \
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > \
(memberFxn)) },결국, CWnd의 멤버 함수 포인터인데, LRESULT를 리턴 타입으로 하고, WPARAM, LPARAM 파라미터를 가진다. 그런데, 보통 LRESULT 리턴 타입으로 핸들러를 선언하기 귀찮아서(함수 구현에 return 구문도 추가해야 하고) 그냥 void 타입으로 선언하는 일이 많았다. 그러다가, Visual Studio .NET 2005인가부터 ON_MESSAGE 타입 핸들러의 리턴 값이 void로 선언되어 있으면, 컴파일 에러를 발생시켜서 이를 모두 바꿨던 기억이 난다. 이 작업을 하면서, ON_MESSAGE_VOID 라는 걸 알게 되었는데,
// like ON_MESSAGE but no return value #define ON_MESSAGE_VOID(message, memberFxn) \ { message, 0, 0, 0, AfxSig_vv, \ (AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))&memberFxn },
주석을 보면, ON_MESSAGE와 비슷하지만 반환 값이 없다… 정도로 알 수 있다. 오호, 그럼 이런 생각이 든다. ‘이거 쓰면, 함수에 굳이 return 처리가 필요하지 않겠군. ‘. 맞긴 맞다. 문제는… ‘반환 값이 없다’라는 것만 보고 ON_MESSAGE를 대체할 수 있다고 생각한 것이다. 택도 없다… 함수 포인터의 원형을 보면, 이 녀석은 반환 값 만이 아니라, 아예 함수 호출 시, 파라미터 자체를 받지 않는다. 이러니 아무리 WPARAM, LPARAM에 데이터를 넣어봐야… -0-
두 번째.
TcpSessionManager::InitializeSession(SOCKET socket) { TcpSession *session = new TcpSession(socket); // 생성자에서 WSARecv를 호출한다. IOCPHandler::Instance()->Add(socket, session); // 소켓에 대한 IOCP 핸들 등록 AutoLock<WRITE> lock(&cs); session_list.push_back(session); ... }
이 코드도 한참을 보고야 문제를 알았다. 클라이언트가 접속을 요청하면 accept하고, 이에 대한 TcpSession 생성 시점에서 WSARecv를 부른다. 일반적인 상황에서는 TcpSession 내부에서 부르는 WSARecv는 받을 데이터가 없을 것이다. 하지만, 같은 PC 내에서 테스트 하는 경우, 접속과 동시에 클라이언트가 데이터를 보냈을 때는 이 WSARecv를 통해 데이터를 받을 수 있다. 하지만, WSARecv를 통해 데이터 수신을 요청한 후, IOCP 핸들에 등록하기 때문에, 해당 WSARecv의 완료 이벤트는 받을 수가 없는 것이다.
2번째 같은 경우, 일정 수준 이상 검증을 완료한 라이브러리를 사용했을 때는 결코 나올 수 없는 부분인데… 역시 처음부터 다시 날로 만들면 꼭 이런 실수를 거친다. –0-
다음에는 그냥 boost::asio를 써버리던지 해야겠다. ACE는 솔직히 너무 복잡해서 쓰기 힘들어… 물론, boost도 쓰기 힘들다는 사람이 많아서 팀에서 쓸 수 있을지는 모르겠네.
In: Diary
23 Mar 2010구글 리더에서 이것저것 읽고 있다가 발견한 실버라이트 페이스북 클라이언트.
처음 본 느낌은 일단 Zune 데스크탑 플레이어와 비슷하다. 아래 이미지는 처음 실행하면 기본적으로 나타나는 좌측 메뉴, 중앙 컨텐트, 우측 기타 등등(이미지)으로 3분할 컬럼으로 되어 있는 모습이다.
중앙 컨텐트 컬럼의 상단에 grid를 클릭하면, 아래처럼 보여준다. 흐음… 이렇게 그리드로 좍~ 배치하고 훑어볼 수 있게 되어 있는 건 마치 윈도우 폰의 UI와 비슷하네. 마우스 휠로 움직일 수 있으면 좋겠지만, 현재는 좌우로 마우스 커서를 가져다 놓으면 페이지를 그리드 뷰를 스크롤 할 수 있는 버튼이 나타난다.
이 데모도 그렇고, 윈도우 폰도 그렇고… 클라이언트 UI 개발은 실버라이트나 WPF 같은 .NET 기반으로 가야할지도… 근데, 이 클라이언트 메모리 사용량이 200MB네. 아무리 64bit 시스템이라도 그렇지, 너무 메모리 많이 먹는다. –0-
In: Diary
27 Jan 2010실용주의 프로그래머에서 나왔던 이야기인가 가물가물한데, 저자가 매년 새로운 프로그래밍 언어를 하나씩 익혀보면 어쩌고 저쩌고… 썰을 풀었던 기억이 난다. 그 뒤로 매년 그렇게 한 적은 없지만~ ㅎㅎ 어쨌든, 새로운 프로그래밍 언어 및 그 환경에 적응하는 것에 별로 거부감을 느낀 적은 없다.
새해가 되어서는 아니지만, 작년부터 워낙 함수형 언어 이야기가 많이 나오고 해서 함수형 언어 하나를 살펴 볼까 싶다. 사실, 함수형 언어에 대한 도전은 처음이 아니다. 작년에 나온 책 중에 Programming Erlang이라는 책을 구입해서 1/3쯤 읽다가, 회사 일로 잠시 덮었다가 몇 주 뒤에 다시 읽으니 기억이 전혀 안 났던 일이 있었다. 처음에 읽어 볼 때는, 왜 이런거지? 오호.. 이런 식으로 지나갔다가 몇 주 뒤에 다시 보니 예전에 거쳤던 의문들이 그대로 다시 올라오는 그런… 지겹다는 느낌에 그냥 덮어 버렸다.
MS에서도 그냥 시험삼아 내 놓은 거 같았던 F#이 끈질기게 계속 베타 릴리즈 되고, Visual Studio 2010에서는 아마도 정식으로 나올 거 같아서, F#이나 한 번 살펴볼까 싶다.
결론은 아직 스펙 읽어보지도 않았음… 망한 글이군. -0-
참, 언어 자체에 거부감을 느낀 적은 딱히 없는데, 디버깅 등의 IDE 환경에 적응하기는 꽤나 어렵다. F#이 땡기는 것도 Visual Studio에서 개발이 가능하기 때문이다. 에디팅은 vi 등에서 어떻게 한다고 쳐도, 디버깅 환경은 좀 강력하지 않으면 … -0- 개인적으로 이클립스의 CDT도 훌륭하긴 한데, 속도가 너무 거지 같다;;;
In: Programming
15 Jan 2010아는 사람이 VMWare에서 OSX (스노우 레퍼드)를 설치해 보니, 개발할만한데요? 이런 말을 해서… 에잉, 그럴 리가 없다. 전에 해봤는데, 설치도 좀 그렇고, 제대로 성능이 나오지 않아서 그냥 지워버렸다라고 했었다. 그런데, 생각해보니 그게 2007년이더라고… –0-
현재 내가 쓰는 PC는 i7 920이니, 예전에 비해 훨씬 높은 성능을 가지고 있고, VMWare 7.0이 나온 이후로는 설치도 그냥 리테일 설치 이미지를 가지고 바로 설치가 된다고 하길래, 오전에 한 번 설치해봤다.
ㄷㄷㄷ… 이건 뭐, 정말 Darwin 부트 로더와 스노우 레퍼드 리테일 이미지만 있으면 그냥 한 번에 설치가 된다. 삽질이고 뭐고 없고, 처음에 Guest OS를 FreeBSD 64bit로 한 다음, 이걸 수동으로 Darwin으로 변경하면 된다. 자세한 설치 방법(이랄 것도 없지만…)은 검색해보면 바로 나오니 패스.
성능은… 일단 그래픽 성능은 역시 그다지 나오지 않는다. UI의 전체적인 반응 속도가 좀 느리다는 생각이 들지만, XCode 띄워서 인터페이스 빌더로 UI 조작하고 XCode에서 편집하는데 전혀 문제가 없다. 디스크 I/O 작업도 역시 느리지만, 이건 지금 파티션을 파일 단위로 할당해서 그럴 듯. 경험상, 물리적인 디스크 하나를 통째로 잡아주면 훨씬 낫다. 정 아니면 인텔 40GB SSD 하나 달아도 되고…
맥에는 딱히 통합 벤치마킹 툴이 없어서, 흔히들 해 보는 GeekBench로 한 번 돌려봤다.
일반 SATA HDD에 40GB를 잡고 설치를 했으며, CPU는 i7 920(일단 노 오버)이다. 메모리는 OSX에 2GB를 할당했고, 프로세서 2개, 프로세서 당 코어는 2개로 설정했다. 결과는…
음… 이게 사실 어느 정도인지 알 수가 없다. 그래서 가장 최신의 맥북 프로와 비교해봤다.
사실 이 벤치는 디스크나 그래픽스에 대한 것은 없기 때문에 전체적인 체감 성능과는 차이가 있다. 위에서도 말했지만, 전체적인 UI 응답성, 특히 애니메이션 되는 효과에 대해서는 버벅인다는 느낌이 든다.
하지만, 위에서 말했듯이 아이폰 애플리케이션 개발하기엔 충분한 걸로 보인다. 뭐, i7 급 PC 구입 가격이 만만찮긴 하지만 맥북 최저가도 그보단 더 비싸니… 개인적으로 며칠 전에 2007년에 구입한 맥북의 메모리 업글을 했는데, 삽질이라는 생각이 마구 들고 있다. ㅠ.ㅠ
집에 가서 아이폰 시뮬레이터에서 OpenGL 관련 성능이 얼마나 나오는지도 한 번 테스트 해 보고 결과를 봐야겠다.
Recent Comments