그동안 해야지 해야지.. 하면서도 귀찮아서 못하고 있던 syntax highlighter 기능을 적용시켜 보았다..

샘플코드!
__int64 Gen_FileList(char* srcdir, vFilelist* flist, int *filecount)
{
	*filecount = 0;
	char buf[1024] = {0};
	strcpy_s(buf, srcdir);
	strcat_s(buf, "\\*");
	HANDLE hFind;
	WIN32_FIND_DATA ffd;
	__int64 TotalBytes = 0;

	hFind = FindFirstFile(buf, &ffd);
	if(hFind == INVALID_HANDLE_VALUE)
	{
		K4LOG(LOG_TRACE, "Gen_FileList:디렉토리가 존재하지 않습니다.");
		return -1;
	}

	do
	{
		if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
		{
			FILEDATA fdata;

			fdata.filesize.LowPart = ffd.nFileSizeLow;
			fdata.filesize.HighPart = ffd.nFileSizeHigh;

			memset(fdata.fullpath, 0, MAX_PATH);
			memset(fdata.filename, 0, MAX_PATH);

			strcpy_s(fdata.fullpath, srcdir);
			strcpy_s(fdata.filename, ffd.cFileName);
			
			flist->push_back(fdata);
			(*filecount)++;
			TotalBytes += fdata.filesize.QuadPart;	// 추후 계산할 때 사용하도록
		}
	}while(FindNextFile(hFind, &ffd) != 0);
	
	FindClose(hFind);
	return TotalBytes;
}
뭐.. 샘플코드라고 하긴 했지만.. 폴더 내의 파일 리스트를 작성하는 샘플코드이므로.. 추후에 잘 활용 해 보도록 하자. 이번 프로젝트에서 아주아주 요긴하게 잘 쓰고 있다. 잘 나와야 할텐데.. ^^
Posted by hopi
,
윈도우 명령에서 guidgen 등을 사용하면 UID를 구할 수 있다는건 알만한 사람들은 알 것이고..

프로그램에서 이걸 구현하려면... 다음과 같이 하면 된다.

#pragma comment(lib, "Rpcrt4.lib") 
#include 

typedef struct _GUID
{
  DWORD  Data1;
  WORD   Data2;
  WORD   Data3;
  BYTE   Data4[8];
} GUID;

typedef GUID UUID; 
{
    UUID uuid;
    if(UuidCreate(&uuid) == RPC_S_OK)
    {
        char *sz = NULL;
        if(UuidToString(&uuid, (BYTE**)&sz) == RPC_S_OK)
        {
            AfxMessageBox(sz); //"6B29FC40-CA47-1067-B31D-00DD010662DA" 등등..
            RpcStringFree((BYTE**)&sz);
         }
    }
}
Posted by hopi
,
예전부터 계속 생각하고 있었던 것인데...

실제로 화면속에 있는 계기를 손으로 조작할 수 있다면 얼마나 좋을까 하는 생각이 자꾸 들었다.
이걸 구현하려면.. 음.. 먼저 USB 로 조작 가능한 하드웨어를 만들어야 하고.. 이 하드웨어가 입력이 있을 때 키보드 입력을 해줘야 하고...

여러가지 생각이 많았는데.. 이번에 제대로 조사를 하면서 조금 알아 낸 것이 있다.

..

일단 DCS:BS와 이번에 나오는 DCS:A-10C에는 Lua라는 프로그래밍 언어 (스크립팅 언어)를 사용한다.
이 Lua는 월드오브 워크래프트 등의 게임에서도 사용할 정도로 강력한 스크립팅 언어라고 한다.

관련 정보는 아래 링크를 통해서 알아보자.
http://www.lua.org

가장 궁금했던 것이.. 계기판 등에 들어오는 불 (engine fire, fail 등등 시스템 정보를 나타내는 등)을 어떻게 구현하느냐 하는 것인데..
바로 이 Lua를 통해서 얻은 정보로 표현하면 되는 것이었다.
자세한 정보는 아래 링크에서...
http://www.digitalcombatsimulator.com/en/dev_journal/lua-export/



위의 정보를 토대로 검색 해 볼 때, 굳이 USB로 키 프로그래밍을 하지 않아도 된다.
그리고 내가 하드웨어 연동 프로그램으로 만든 가장 첫 작품이 바로 시리얼을 통한 프로그램이 아니었던가...
그래서.. 로컬 연결을 한 후에, 별도 프로그램에서 하드웨어 장비와 시리얼로 통신하여 처리하면 된다.

ㅇㅇ 이 얼마나 멋진 일일까...

일단 쓸데없는 감상은 집어치우고.. 필요한 첫 번째 보드를 알아보자.
http://www.icbank.com/shop/default.asp?file=product_detail.asp&prod_code=P000140206&catg_code=102117102118

가격은 둘째치고.. 초보자가 디버깅 하기에.. 구현하기에 가장 적합한 것이라고 추천받았다.
물론, 프로그래밍에 익숙해지면 좀 더 싼 녀석으로 구현해도 상관없다고 한다.


자.. 위에꺼로 뭘 할 수 있느냐고?

BS에서 시동을 걸 때, 각종 키를 마우스를 눌러가며 켜야 했다. (realistic 모드일때다 물론!)
이걸 전부 외부 키 스트록으로 바꿀 수 있다. 모양까지 똑같이 해서 말이다.

그리고 warning signal 등도 모두 설정이 가능하다.
기어를 올리고 내리는 것도 스위치로 가능하고, 기어의 포지션도 라이팅(red/green) 표현이 가능하다는 것.



아직 스위치도 제대로 된 넘을 찾아야 하고 (BS에는 위 아래의 on/off 스위치도 있지만, 중간까지 입력되는 3단스위치.. 좌우도 조절되는 스위치도 있다), 요 스위치들을 올려놓을 판넬 (아마도 아크릴)도 작성해야 하고.. 할 게 많다.
그래도.. 만들고 나면 뭔가 뿌듯할 것 같은 생각이...

이거 다 만들어지면 사실 warthog, 사이텍 시뮬장비 등도 안부러울 것 같다.
cougar MFD도 빠이빠이지 뭐...

어쨌든 지금은 계획만이고.. 곧 어떻게 할 지 하나하나 기회되면 올려보기로 하자.
Posted by hopi
,
요거.. 모르는 사람이 많던데..

콘텐츠 컨트롤 (왜 이렇게 꼭 발음해야 하는지는 알 수 없지만, 워드에서 '컨텐츠 컨트롤' 이라고 하면 검색조차 안된다.. 퐝당...)을 사용하게 되면 서식을 조금 더 깔끔하게 사용할 수가 있는데..

서식이 뭔지 모르는 사람은 살다보면 서식이 뭔지 알 수 있는 기회가 생길지도 모르므로, 한번 쯤 스쳐지나가듯 읽어보도록.

오늘의 서식 최종 목표는 다음과 같다.


요걸 서식으로 만들고자 하는데..
바로 콘텐츠 컨트롤이란 요 항목을 얘기하는 것


즉, 마우스를 갖다대면 전체가 선택되면서 입력 즉시 그 내용이 지워지는 것을 이야기한다.
사실, 위 항목 자체가 콘텐츠 컨트롤은 아니고, 항목 중 텍스트 항목일 뿐이다.



콘텐츠 컨트롤을 사용하기 위해서는 바로 위 처럼 [개발 도구] 항목이 메뉴에 있어야 하는데, 이게 안 보이는 사람이 분명 있을 것으로 안다.
왜냐하면 처음 설치했을 때는 위 항목이 보이지 않도록 설정되어져 있기 때문이다.
요걸 바꾸기 위해서는...


오피스 로고가 있는 동그란 버튼을 눌러 우측 하단에 있는 [Word 옵션(I)] 항목을 선택 해 주자.


Word 옵션에 보이는 항목 중 [리본 메뉴에 개발 도구 탭 표시(D)]를 체크 해 준다.


그렇담 이제 메뉴에서 이 [개발 메뉴]가 보일것이다.
이중에서 '서식있는 텍스트' 나 '텍스트'를 선택 해 주면 화면에 콘텐츠 컨트롤 텍스트 하나가 삽입되게 된다.



처음 추가 할 경우 '텍스트를 입력하려면 여기를 클릭하십시오' 라고 나오는데, 이걸 자신이 원하는 텍스트로 바꾸기 위해서는 디자인 모드를 클릭한 후 변경해야 한다.
기본적으로 있던 내용을 지우고 새로운 텍스트로 대체하면 자신이 정한 항목으로 텍스트가 변경되게 된다.
이후 디자인 모드를 다시 클릭하면 콘텐츠 컨트롤 텍스트가 완성된다.

(TIP:이후 [속성]을 눌러서 '입력 후 콘텐츠 컨트롤 삭제' 를 선택 해 주면 조금 더 완벽한 서식이 될 수 있다)


콘텐츠 컨트롤에는 이 외에도 프로그램에서나 구현이 가능하던 드롭다운 컨트롤, 그리고 다양한 tool에 있는 메뉴들을 이용할 수 있으므로, 서식을 조금 예쁘게 꾸며놓고 싶은 사람이 있다면 이러한 메뉴들도 구경 해 보면 좋을 것 같다.

그럼 이만...



Posted by hopi
,
컴파일 하고 빌드하는데 문제가 없었는데.. 실행시키니까 stack overflow란 메시지창을 본 사람은 여길 보기 바란다.


stack overflow란 쉽게 말하자면 stack이 넘쳐났다는 뜻인데.. 달리 얘기하자면 stack 에 제한이 있다는 얘기다.
위와같은 에러 메시지를 보려면 우선 실험을 해 보자.

간단한 다이알로그 프로그램을 만들어 두고 다이알로그 클래스 헤더파일 안에 다음과 같이 선언 해 본다.

UINT a[160000];

일단 빌드하고 실행.. 문제 없지? 그럼 일케 해보자.

UINT a[360000];

엥? 왠 스택 오버플로우?

이유를 말해주까? 기본적으로 정적 stack size는 1 Megabyte로 고정되어 있기 때문이다.
위를 계산해 보믄 UINT는 4바이트.. 즉 160000 * 4 = 640000 = 대략 640k. 360000 * 4 = 1280000 = 대략 1.2메가
이렇게 해서 스택 사이즈를 넘겨버리기 때문이다.

보통 네이년 지식즐에 보면 malloc을 하라는 답변이 많은데.. 다른 해결방법을 하나 알려주도록 한다.


해결법 1
네이년 지식즐의 malloc이든 new이든 동적으로 메모리를 할당해서 쓰면 아무런 문제가 없다. 대신 프로그램 죽을 때 꼭 지워주도록.

해결법 2
VC 6.0 기준으로 여길 보자.


프로젝트 세팅 화면인데.. 이중에 LINK 탭의 Reserve를 유심히 봐주기 바란다.
위의 얘기가 뭐냐면, 정적 스택 사이즈를 10 Megabytes로 늘려주세요.. 라는 곳이다.

근데 A00000 값이 뭐냐고?
1024 * 1024 * 10의 값을 헥사로 바꾸면 저게 된다. 의심가면 본인이 직접 해 보도록 할 것.

이후 OK를 누르고 닫으면 이후 이 프로젝트 스택 사이즈의 제한은 10메가로 상향 조정된다.
너무 크게한다고 좋은건 없으니 대충 이정도로 늘려놓고 필요한 메모리는 그때그때 할당 받아서 쓰는게 깔끔하다.

그럼 다들 수고~
Posted by hopi
,
아으.. 맨날 까먹어서 여기에다라도 적어놔야겠다.
테이블 조인하고자 할 때

select a.항목, b.항목 from 테이블A a join 테이블B b on a.필드1 = b.필드1

아웅.. 자꾸 까먹지 말자.

아래는 protector에서 사용하는 항목 중 쿼리스트링이랑 에러메시지 조인하는 쿼리

select a.querystring, b.errmsg from querys_201008091200 a join queryerrors_201008091200 b on a.sequencenumber = b.sequencenumber and a.sessionid = b.sessionid
Posted by hopi
,
PowerPoint 2010부터는 플래쉬파일(swf)을 동영상삽입 메뉴에서 바로 넣을 수 있습니다

하지만 2007 버전에서는 아래와 같이 작업을 해야 합니다.
 
PowerPoint 2007에서는 개발도구 리본메뉴에 [기타컨트롤]도구모음이 있습니다.
개발도구 리본메뉴를 표시하기 위해서는
오피스단추 > 파워포인트 옵션 > 기본설정에 보시면
'리본메뉴에 개발도구 표시하기'를 체크하시면 됩니다.

개발도구를 리본메뉴에 추가하셨으면
개발도구 리본 메뉴에 가셔서 [기타컨트롤]을 선택하십시오.

기타컨트롤에 포함되어 있는 항목이 표시되면 항목을 내리셔서 [Shockwave Flash Object]를 선택하신 다음
파워포인트 슬라이드에 원하는 크기만큼 드래그 앤 드롭해주십시오.

X가 표시된 사각형 박스가 슬라이드에 표시되면 마우스 우측버튼 클릭 > [속성]을 선택하십시오.
속성 창이 나타나면 중간부분의 [Movie] 칸에 다운받은 플래쉬의 경로를 입력해주십시오.

경로 입력이 끝났다면, F5 키를 눌러 슬라이드쇼를 진행하면 플래쉬가 동작될 것입니다.


-- 출처 네이년 즐
Posted by hopi
,
요건.. 아래쪽에 있는 문장의 응용 버전이다.
테이블을 모두 지우기가 정말 귀찮을 경우에 사용하는 방법인데.. 사이트 나가서 실행하면 안된다.

select object_name(id) from sysindexes where id in
(select id from sysobjects where name like 'logins%') and indid in (0, 1)

select object_name(id) from sysindexes where id in
(select id from sysobjects where name like 'loginerrors%') and indid in (0, 1)

select object_name(id) from sysindexes where id in
(select id from sysobjects where name like 'logouts%') and indid in (0, 1)

select object_name(id) from sysindexes where id in
(select id from sysobjects where name like 'querys%') and indid in (0, 1)

select object_name(id) from sysindexes where id in
(select id from sysobjects where name like 'queryerrors%') and indid in (0, 1)

select object_name(id) from sysindexes where id in
(select id from sysobjects where name like 'responses%') and indid in (0, 1)

select object_name(id) from sysindexes where id in
(select id from sysobjects where name like 'results%') and indid in (0, 1)

-- 아래 FOR 이후 부분을 모두 이것으로 교체 해 주고 실행하면 된다.

declare @tablename varchar(128) , @SQL varchar(2000)

DECLARE cur_droptable CURSOR
READ_ONLY
FOR select object_name(id) from sysindexes where id in
(select id from sysobjects where name like 'logins%') and indid in (0, 1)

OPEN cur_droptable

FETCH NEXT FROM cur_droptable INTO @tablename
WHILE (@@fetch_status <> -1)
BEGIN
    IF (@@fetch_status <> -2)
    BEGIN

    SET @SQL = 'DROP TABLE ' + @tablename
   
    EXEC (@SQL)

    END
    FETCH NEXT FROM cur_droptable INTO @tablename
END

CLOSE cur_droptable
DEALLOCATE cur_droptable
GO

관련해서 나중에 파일 첨부 해 둬야겠지만.. 일단 위에 것 만으로도 사용이 가능하다 싶다.
Posted by hopi
,

말보다 먼저 글로 보자.

select object_name(id) , rows from sysindexes
where id in (select id  from sysobjects where name = '****')
and indid in (0,1)



요게 무엇인고..

윗 문장은 다음과 같은 역할을 한다.

"****란 테이블에 들어가 있는 카운트 수를 리턴 해 준다."

엥?? 그럼 위의 쿼리문이 select count(*) from **** 과 도대체 다른게 모냥??
라고 반문하시는 분은 개발자 분들일 듯..

MS-SQL에는 (뭐 다른 DB도 마찬가지겠지만) 시스템이 가지고 있는 정보 중 참조해 볼 만한 정보를 가진 녀석이 바로 sysindexes와 sysobjects란 테이블이다.
sysindexes는 테이블이 가지고 있는 여러개의 정보.. 특히 해당 테이블에 적재된 아이템의 갯수를 가지고 있다.
단, 이곳에는 테이블을 하나의 ID로 보유하고 있는데, 이 ID를 확인할 수 있는 테이블이 바로 sysobjects 이다.

먼저 위의 문장을 하나하나 설명 해 본다.

select object_name(id) , rows from sysindexes
아이디의 이름과 로우수를 sysindexes에서 쿼리 할 것.

where id in (select id  from sysobjects where name = '****') and indid in (0,1)
그 조건으로는 sysobjects를 보았을 때 ****이란 이름을 가진 테이블일 것. 또한 index id가 0이나 1인놈만 - 중복 표현을 방지 해 준다.

자.. 하나를 볼 때는 굳이 저렇게 쓸 필요 없이 select count(*) from **** 를 사용해도 된다.
단, 카운트 수가 많을수록 시스템에 부하를 주는 것은 당연한 것이겠지만..
정보가 있는데 놔두고 굳이 처음부터 숫자를 다시 세도록 시킨다면 그건 작업을 시키는 사람이 잘못된 넘이다.

위 문장을 응용해 보자.

select object_name(id) , rows from sysindexes
where id in (select id  from sysobjects where name >= '****' and name <= '$$$$')
and indid in (0,1)

order by 1

하나의 테이블일 경우에는 굳이 위와 같이 할 필요가 없을지도 모른다.
그러나 위의 문장처럼 여러개의 테이블을 다 검토 해 보고자 한다면 sysindexes와 sysobjects를 아는사람과 모르는 사람의 차이는 어마어마 할 것이라 생각된다.
Posted by hopi
,

항상 헷갈린다.
C 개발자의 숙명이 아닐까?

몇번째인지 모르겠는데, 헷갈리는건 헷갈리는거다. 예전에는 머리가 잘 돌았는데, 이제는 그것도 잘 안된다.
각설하고,  인자로 넘길 때의 예제를 한 번 보자.

void inputfunction(int a, int* p, int& r)
{
   a = 1;
   *p = 2;
   r = 3;
}

요넘은 인자로 세 가지 타입을 받는 함수이다.
얘를 불러서 각각의 값을 넣은다음에 불러서 호출하면 어떻게 될까?

int a, b, c;
a = b = c = 0;

intputfunction(a, &b, *&c);

inputfunction(a, &b, c)
printf("a = %d, b = %d, c = %d\n", a, b, c);

정답은??

..
..

a = 0, b = 2, c = 3 가 나온다.
왜그럴까 왜그럴까???
글구 함수의 세 번째 인자는 왜 *&c라고 넣어야 하는가?
함수의 세 번째 인자는 왜 c 라고 넣어야 하는가?
이런거 생각하는게 재미있을수도, 지겨울 수도 있지만, 당신이 적어도 개발자를 숙명으로 삼아야 한다면, 생각해 보라.

음.. 위의 코드는 굉장히 위험하다라는.. 사실 제대로 알지 못하고 올린 속죄의 의미로 줄 그어놓은 것을 그대로 놔둔다.
왜 저당시에는 저렇게 글을 썼을까나.. ㅋㅋㅋ 어쨌든 제대로 코드 올린다

Posted by hopi
,