월별 글 목록: 2005년 6월월

시스템은 실천할때 시스템이 된다.

주위에 보면 팀내에 정해진 시스템을 무시하는 사람들을 종종 보게된다.
왜 그러냐고 물어보면, ‘안해도 될것같아서’, ‘불필요한 규칙이여서’ 와 같은 대답을 한다.


팀내에서 정한 규칙(시스템)은 공통의 규칙이다.
이런걸 개인이 무시하는 것은 곧 전체 팀 분위기를 망치는 것이다.
일단 정해진 규칙은 반드시 지키도록 노력해야 하며, 만일 그것의 불합리한 점이 발견된다면, 건의를 하고, 팀원과 함께 대안을 찾는 것이 옳은 방법일 것이다.
물론 그 대안은 규칙을 바꾸는데 드는 비용(인력, 습관, 백업, 변환 등등)에 비해 바꾸고 난 후의 규칙을 사용하는 것이 효용성이 더 높을 때, 바꾸어 지게 된다.

정해진 시스템은 반드시 실천하도록 하여야 하며, 실천이 곧 시스템을 다듬으며, 결국 팀의 목표에 한걸음 더 다가가는 것임을 …

사진은 아무 상관은 없는데.. 그냥 멋있어서..
[MG] ZGMF-X10A Freedom Gundam

난 ‘묵묵히 자기일만 잘하는 사람이 싫다.’

제목이 조금은 과격한것 같은데,
주위에 보면 일할때 자기일만 열심히 잘하면 된다고 생각하고, 또 그렇게 하는 사람들을 여럿 봐았다.


그런데 문제는 대부분의 사람들이 그런사람들을 보고 ‘참 일 잘하고, 똑똑한 사람’이라고 칭찬을 아끼지 않는 것 또한 봐왔다.
하지만 그런 사람들과 직접 같이 일해 보면, 진짜 일 잘하는 사람도 있지만, 주위사람들과 커뮤니티가 안되고, 자기 생각에만 빠져서 자기 일만 잘하는 사람들이 대부분이였다.
만약 당신이 혼자 일하는 사람이거나, 혼자 연구하는 사람이라면 묵묵히 자기일만 잘하는 것을 탓하진 않겠다.
하지만 팀 플레이 시에는 그런 사람은 정말 위험한 사람중에 한사람이다.
소위 말하는 ‘개인주의’, ‘영웅주의’에 빠져서 자기일만 하고, 자기 이익만 챙기는 사람은 결국 프로젝트 막바지에 팀 전체에 악영향(꼭 문제가 발생한다)을 끼치는 것을 수도 없이 봐왔기 때문이다.
팀 플레이는 곧 커뮤니티이고, 자기 희생이다. 팀을 위해서 희생할 줄 알고, 팀원들과 호흡하면서 개인의 승리가 아닌 팀의 승리를 이끌어 내며, 혼자만 하는 스타일의 사람을 팀으로 이끄는 것이 진정한 프로라고 생각한다.

자신을 뒤돌아 보자.. 당신은 어떠한 사람인가? 진짜 일 잘하는 사람이 되고 싶지 않은가?

외인구단에게 필요한것은??

만화가 이현세씨의 ‘공포의 외인구단’이라는 만화를 만화책이나 영화로 많이 보고 알고 있을것이다.
간단히 내용을 요약해 보자면.. 능력은 있는데, 말썽꾼들을 모아서 하나의 팀으로 만들고 훈련시켜서, 결국 자신들의 존재(?)감을 알리는 뭐.. 그런 내용이다.


필자가 여기서 되짚어 보고자 하는것은 그들의 존재감을 알리기 위해서 필요한 것중 한가지 이다. 구성원들은 각자가 능력은 있었으나, 뭔가 한부분이 삐딱하게 나가는 그런 사람들이었지만, 감독이 이들을 아우르고, 훈련시켜서 이들을 하나의 팀으로, 강력한 팀으로 만든다는 것이다. 물론 영화에서 이 역할을 맡은 ‘안성기’씨의 카리스마도 대단하지만, 원작에서도 이 감독의 카리스마는 대단했었다.
능력이 있건 없건.. 구성원들을 하나로 뭉치게 하고.. 하나의 팀으로 움직이게 하기위해서 강력한 카리스마를 가진 팀장이 필요한것은 새삼 강조하지 않아도 공감할 것이다.
개인이 최고가 될 필요는 없다(최고가 되면 더욱 좋겠지만). 하지만 팀은 최고가 되어야 한다. 자기가 능력이 없다고, 팀이 능력이 없는 것은 아니며, 이를 팀장은 팀원들이 느끼고 행동할 수 있도록 해주어야 한다.
팀장… 카리스마 있고, 팀을 리드할 수 있는 팀장…

결국 우리에게는 카리스마 있는 팀장이 절실히 필요한 때가 아닌가 한다.

9x계열에서 프로세스가 실행되는 것을 감지

VXD 드라이버를 만들어서 CREATE_PROCESS 에 대한 control dispatch 펑션을 등록해서 감지를 할 수 있습니다.

Begin_Control_Dispatch XXXX
Control_Dispatch CREATE_PROCESS _OnCreateProcess cCall
Control_Dispatch DESTROY_PROCESS _OnDestroyProcess cCall
End_Control_Dispatch XXX

콜백 함수로 등록된 OnCreate[Destory]Process 함수에는 프로세스가 생성[종료] 시점에 DWORD 형 Process ID 가 넘어오게 됩니다.

물론 드라이버를 만들지 않고도 가능할 것입니다. API Hook 을 한다면… (근데 이 방법은 제가 직접 해보지 않아서..)

vxd에서 로컬 시간 얻기

vxd에서 로컬 시간을 얻는 방법입니다.

DWORD VTD_Get_Date_And_Time(
PDWORD pDate
);

이함수 호출 후에
pDate에는 1980년 1월1일 부터의 현재까지의 날 수를 얻을 수 있습니다.
그리고 리턴값은 현재 날로 부터 경과된 밀리초입니다.

따라서
위 함수를 통해서 시간을 얻기 위해서는

Time = VTD_Get_Date_And_Time(&Day);
MillSeconds = Time % 1000;
Time /= 1000;
Seconds = Time % 60;
Time /= 60;
Minutes = Time % 60;
Hours = Time / 60;

이렇게 얻을 수 있습니다.
그러나 날짜를 얻기위해서는 pDate가 1980년 1월1일 부터의 일 수이므로 윤년계산을 통해서 얻어와야 합니다.
거기까지는 아직 안되어 있는데 직접 구현해 보심이.

매크로 __DATE__, __FILE__, …

__DATE__
__FILE__
__LINE__
__TIME__
__TIMESTAMP__

위 매크로는 Visual C++ 컴파일러에서 지원하는 매크로입니다.

다음은 DbgPrint()함수를 사용해 출력한 결과이다.

DbgPrint(“DATE [%s]\n”, __DATE__);
DbgPrint(“FILE [%s]\n”, __FILE__);
DbgPrint(“LINE [%d]\n”, __LINE__);
DbgPrint(“TIME [%s]\n”, __TIME__);
DbgPrint(“TIMESTAMP [%s]\n”, __TIMESTAMP__);

출력 결과
DATE[Jul 24 2003]
FILE[c:\DebugSample\Debug.c]
LINE[13]
TIME[12:24:56]
TIMESTAMP[Thu Jul 24 12:24:56 2003]

일반적인 윈도우 소멸 순서

일반적으로 윈도우 종료시에는 OnClose() 함수를 Call 하게되고 OnClose() 에서는 DestroyWindows() 를 호출하게 됩니다.
마지막으로 OnNcDestroy() 함수가 호출되게 되고, 이 안에서 PostNcDestroy()함수가 호출되게 됩니다.

OnClose()
– 단지 내부에서 DestoryWindows()를 호출한다.

DestroyWindow()
– CWnd내부에 있는 윈도우를 destroy 한다.
– 윈도우를 해제하고 입력 포커스를 제거하기 위한 적절한 message를 윈도우에게 보낸다.
– 윈도우의 메뉴 제거 –
– 어플리케이션 큐를 비운다.
– timer 제거
– clipboard의 소유주 제거
– Clipboard-viewer chain을 끊는다. ( CWnd가 viewer chain의 맨 위에 있을 경우 )
– WM_DESTROY( OnDestroy )와 WM_NCDESTROY( OnNcDestroy ) 메시지를 위도우에게 보낸다
(아직 CWnd 객체는 Destory 되지 않은 상태임)

OnDestory()
– CWnd에게 현재 CWnd가 소멸되고 있는 중이라고 알려 주기위하여 호출. OnDestroy함수는 CWnd 함수가 화면에서 사라진 다음에 호출됩니다.

OnNcDestroy()
– Client가 아닌 영역이 destroy될 때 불려지는 함수입니다.. 윈도우가 소멸될때 마지막으로 불려지는 함수임. PostNcDestroy 함수를 호출

PostNcDestory()
– 윈도우가 소멸된 후 OnNcDestroy함수에 의하여 불려지는 기본함수.

The End of DLL Hell

MSDN Technical Articles 에 보면 “Teh End Of DLL Hell” 이라는 글이 있네요.

요지는 우리가 dll 을 사용하는데, 아무생각 없이 dll 을 로드해서 사용하게 되면 시스템에 설치된 dll을 우선 사용하게 되어
공격당한(?) dll 을 사용하게 되는것을 막는 방법입니다.
즉.. 무조건 어플리케이션이 있는 디렉토리의 dll을 먼저 로드하게 하는 방법입니다.

예를 들어 실행파일이 Test.exe 이면 같은 디렉토리에 Test.exe.local 이라는 빈 파일을 같이 만들어 두면
무조건 dll을 자기 디렉토리부터 검색하게 됩니다. LoadLibary()에 절대 경로를 넘겨줘도 무조건 현재 디렉토리부터 검색하게 됩니다

GetSystemVersion() 같은 함수를 Driver단에서는?

이런식으로 사용하면 되겠네요.

ULONG MajorVersion;
ULONG MinorVersion;

ULONG GetWinVersion()
{
RTL_OSVERSIONINFOW lpVersionInformation;

lpVersionInformation.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOW);

if(RtlGetVersion(&lpVersionInformation) != STATUS_SUCCESS)
{
MajorVersion = lpVersionInformation.dwMjaroVersion;
MinorVersion = lpVersionInformation.dwMinorVersion;
}
else
{
PsGetVersion(&MajorVersion, &MinorVersion, NULL, NULL);
}

}

WIN32 – Thread 생성시 어떤 API를 사용해야 할까?

사실상 Windows 운영체제에서 thread를 생성하는 방법은 하나입니다. CreateThread() 를 사용하는 방법 말이죠. 하지만 이렇게 많은 경우의 수가 생긴 이유는 순수한 Windows SDK 만으로 프로그램을 작성하는 경우는 거의 없기 때문입니다.

대부분의 프로그램은 CRT( C 런타임 라이브러리)를 사용하고 있고 좀 크다 싶은 프로그램은 MFC를 사용하는게 사실입니다.

이런 대형 라이브러리들은 훌륭한 체계를 갖추고 있고 그 중에는 thread와 관련된 것도 있으므로 나름대로 thread의 생성과 관련하여 해줘야 될 일들도 많이 있을 겁니다.

그러므로, 우리는 다음과 같은 결론을 얻을 수 있습니다.

순수한 Win32 를 사용해서 작성되는 프로그램이라면 CreateThread()를 사용해야 할 것이며, CRT를 사용하는 경우라면( 대부분의 경우) _beginthread()/_beginthreadex() 를 사용해야 할 것이며, MFC를 사용하는 경우라면 AfxBeginThread()를 사용해야 합니다.