MFC7.0 계층도


급작스레, Dialog기반의 Utility Tool을 만들려던 중, 머리속에 까막까막해진 MFC 때문에 버벅대다가 일단 클래스 계층도부터 찾아보자 해서 찾은 것. 출처는 MSDN. 그리고 내가 필요했던 class는 파일을 열기 위한 대화창을 위한 “CFileDialog”. 이제 다시 CFileDialog에 대한 MSDN 도움말(F1)을 통한 Copy & Paste 그리고 MSDN에서 불충분한 정보는 Devpia를 통해 검색, 다시 Copy & Paste.

여기서 잠깐 MS의 우두머리인 회장 스티브 발머가 마이크로소프트가 현재 가장 중요시 여기고 있는 프로젝트는 온라인 서비스인 윈도우 라이브(http://www.live.com)라고  가트너 심포지엄/IT 엑스포에서 밝혔다고 한다. 다음의 http://www.kbench.com/news/?cc=0&no=34378&pg=2에서 [펀] 글이다. (갑작이 MFC7.0에서 엄청난 삼천포로.. ㅡ_ㅡ;)

발머는 라이브닷컴에 대해서 웹사이트같이 클릭만으로 구동되는 서비스로 소프트웨어가 이전되는 단계를 거치고 있다고 밝혔다. 현재 베타 서비스중인 라이브에는 윈도우 라이브 메신저, 레이브 엑스포 온라인 광고등의 다양한 서비스를 테스트중이다. 발머는 현재 가장 중요한 것이 바로 라이브 플랫폼이며 다음 세대의 수익은 인터넷 서비스와 제공에서 나오게 될 것이라고 밝혔다. 이는 가트너의 애널리스트가 곧 검색, 팟캐스팅, 주문형 비디오, 블로그와 같은 인터넷 서비스가 기업의 IT 인프라로 수년이내에 급속히 흡수될 것이라고 전망한 것과 일맥 상통하는 이야기다. 하지만 발머는 온라인으로 전환되는 과정에서도 강력한 클라이언트 시스템의 필요성도 여전히 줄지 않을 것으로 전망했다. 현재 마이크로소프트는 대부분의 소프트웨어 수익을 이러한 클라이언트 시스템에서 거두고 있다. 한편 비스타의 잦은 연기 후 늦장 출시에 대해서 발머는 개발과정 상의 복잡성을 줄여야할 필요성을 배웠다고 답변했다.

내가 여기서 흥미있게 느낀 요지는, 분명이 대세는 웹이기는 하지만, 그럼에도 불구하고 클라이언트 시스템의 필요성은 줄지 않을 것이라는 점… 그러나 역시 대세는 웹이다.

끝으로 웃으개 상황. 좋은 화상카메라를 하나 사려고 daum에서 검색해 보았다. 그런데 검색 결과가 황당했다.


성인 키워드.. ㅡ_ㅜ 난 황당하고 웃겼는데.. 이런 내가 황당하고 웃긴건지.. 여튼 지금도 난 황당하다. 어째서 화상 카메라가 성인 키워드가 되어 버린거지?

MFC에서 성인키워드까지… 지금까지 잡스런 글이였습니다.. ㅋ

[영화] Lady In The Water


예전에 좋은 책이란 그 작가가 능력이 있어서가 아니라 하나님께서 그에게 영감과 기회를 제공해 주신것이라고 생각했었다. 우연이도 이 영화가 예전에 내 생각과 조금 일치하는 부분이 있어서 깊게 빠져들어 무척 흥미롭게 본 영화이다.

ExampleFrameListener의 개념

ExampleFrameListener는 ExampleApplication 클래스와 마찬가지로 Ogre에서 기본적으로 제공하는 Framework 클래스 중 하나이다. KeyListener와 FrameListener로부터 다중상속을 받는 구조이며 기본적으로 갖는 책임 중에 가장 중요한 것은 마우스나 키보드로부터 입력을 받아 처리하고 Frame을 렌더링하데는 필요한 상태정보를 갱신하고, 렌더링을 계속할 것인지의 여부의 결정이다. 아래는 ExampleFrameListener 클래스 관계도이다.

또한 Overlay 클래스를 이용하여 FPS 정보 등을 나타내준다. 사용자가 마우스나 키보드의 입력을 buffer 방식인지, unbuffered 방식인지의 결정에 따라 buffered 방식인 경우, 사용자 입력에 대한 처리를 Event 방식(Callback 방식)으로 하기 위해 EventProcessor 클래스의 인스턴스를 생성해준다.

unbuffered 방식인 경우에는 InputReader 클래스의 인스턴스를 생성해서 사용자가 필요한 시점에서 InputReader의 인스턴스를 이용해서 키보드나 마우스의 상태를 Query할 수 있다. buffer 방식인 경우에도 InputerReader 인스턴스를 사용할 수 있다는 점도 알아 두길 바란다.

기본적으로 ExampleFrameListener 클래스는 unbuffered 방식의 경우에 대해 마우스와 키보드 입력에 대한 처리를 해 놓았다. 예를 들어 커서키를 누르면 화면이 이동한다든지, 마우스를 이용해 확대나 이동을 한다든지 말이다. 하지만 사용자가 원할 경우 이러한 처리를 재정의해서 쉽게 변경할 수 있다.

buffered 방식인지, unbuffered 방식인지의 결정은 ExampleFrameListener 클래스 생성자의 인자를 통해 결정한다.

사용자 입력 이외에 ExampleFrameListener 클래스에서 중요한 것은 FrameListener 클래스의 상속에 있다. FrameListener 클래스는 단지 frameStarted와 frameEnd 가상함수만을 가지고 있다. frameStarted는 하나의 frame을 렌더링 하기 직전에 호출하고 frameEnd는 하나의 frame에 대한 렌더링이 끝났을때 호출된다. 두개의 함수 모두 bool을 반환하는데, false일 경우 다음 frame을 렌더링하지 않는다. 즉, 계속 렌더링하려면 true를 반환해야 한다.

위의 말대로라면 Ogre3D의 main loop인 Root::startRendering 함수의 내용은 다음과 같을 것이고, 실제로 같다.

  1. Root 객체는 자신에 등록된 모든 FrameListener 객체의 frameStarted 함수를 호출
  2. Root 객체는 하나의 frame을 렌더링 함
  3. Root 객체는 자신에 등록된 모든 FrameListener 객체의 frameEnd 함수를 호출

입력이 unbuffered 방식일때 frameStarted나 frameEnd 함수안에서 InputReader 인스턴스를 이용해 키보드나 마우스의 상태를 Query 해서 회전상태나, 이동상태값들을 변경해서 물체를 회전시키고 이동시킬 수 있다. 클래스 관계도에서 ExampleFrameListener 클래스가 Camera 클래스와 관계를 맺고 있는 이유가 여기에 있는데, 입력에 따라 상태정보를 변경하고 다시 이 상태정보를 통해 Camera를 제어하기 위해서이다. RenderWindow와 연관을 맺는 이유는 다음과 같다.

  • FPS를 얻기
  • 개발을 위한 Debug 기능을 이용
  • 화면을 캡쳐화여 png 파일로 저장

마지막으로, 여러분들이 ExampleFrameListener 클래스의 소스를 열어놓고 기본적으로 입력에 대해서 구현해 놓은 것이 무엇인지를 살펴보길 바란다. 이 글을 읽은 후에 소스를 살펴보면 조금이라도 이해가 수월할 것이다.

[펌] 아키텍처 체크 리스트

1. 아키텍처의 개요와 설명을 포함해서 프로그램의 구조가 명확한가?
2. 기능과 다른 모듈과의 인터페이스를 고려해서 모듈이 잘 정의되었나?
3. 모든 기능들이 너무 많거나 적지않은 모듈에 의해 적절히 수행되는가?
4. 설계된 아키텍처가 변화에 적절히 대응할 수 있는가?
5. 구매와 개발에 대한 비교와 결정을 포함하는가?
6. 아키텍처가 다른 목적을 위해 만들어진 코드를 재사용할지를 기술하는가?
7. 중요 데이터 구조가 기술되고 확인되었는가?
8. 중요 데이터 구조가 루틴 액서스 뒤에 은폐되었는가?
9. 데이터베이스 구조와 내용은 설명되었나?
10. 중요 알고리즘이 기술되고 확인됐는가?
11. 중요 대상들이 기술된 것을 확인했는가?
12. 사용자 입력을 처리하는 방법이 기술되었나?
13. 사용자 인터페이스의 중요관점이 정의 되었나?
14. 변경시 프로그램의 다른부분에 영향을 끼치지 않게 사용자 인터페이스가 모듈화되었는가?
15. 메모리관리에 대한 메모리 사용량의 예측과 방법이 기술되고 확인됐는가?
16. 아키텍처는 각 모듈의 용량과 속도를 설정했는가?
17. 문자열 처리에 대해 기술했으며 문자-문자열-저장량에 대해 평가했는가?
18. 에러처리 방법에 대해 기술하는가?
19. 에러메시지는 명확한 사용자 인터페이스를 나타내기 위한 부분으로 처리되는가?
20. 견고성의 정도를 설명하는가?
21. 정도에 지나치거나 부족하게 설계되었나? 이 부분에 대해 명확하게 설명하는가?
22. 시스템의 중요목표가 명확하게 기술되었나?
23. 전체 아키텍처가 개념적으로 일치되었나?
24. 기본 설계가 앞으로 구현될 기종과 언어에 독립적으로 쓰여졌는가?
25. 모든 중요 결정에 대한 동기가 명시되었는가?
26. 시스템을 구현할 프로그래머로써 당신은 아키텍처에 만족하는가?

출처: Steve McConnell의 Code Complete(MS Press 1995)

이 체크 리스트를 읽은 후, 실제 Code Complete 책을 읽고 내가 느낀 아키텍쳐를 세가지로 나타낸다면 다음과 같다.

  1. 아키텍쳐는 산출물이기 이전에 실무 개발자가 코딩하는 매 순간 순간 마다 참고하고, 참고 해야만 하는 유연한(때로 아키텍쳐도 수정되어야 한다) 성서이여야 한다.
  2. 아키텍쳐는 DBMS와 Web Server 그리고 방화벽 등의 시스템의 구성도와 같은 A2 용지 크기의 한장짜리 문서를 포함해서, 시스템을 개발하기 위해 고려해야할 사항을 세부적으로 기술하거나 묘술하는 것이다.
  3. 아키텍쳐에서 어떤 선택 사항에 대한 이유가 반드시 있어야 한다. “예전에 그랬으므로..” 또는 “다른 시스템도 그랬으므로..” 라는 것은 이유가 될 수 없다.