비공개2012. 9. 25. 17:00

모니터를 사자 -> @@

이런분에게 유용 ㅎㅎ

 

 

http://garuia.tistory.com/8

Posted by 닭꽝
비공개2012. 8. 30. 17:30

 

 

 

첫번째 파일은 test_open.c로

open, close만 10,000,000번 한다.

두번째 파일은 test_fopen.c는

fopen, fclose만 10,000,000번 한다.

테스트는 test_open한번 실행하고 test_fopen실행하는 식으로 총 5번 시간을 측정했다.

test_open : avg 24.6/sec

test_fopen : avg 37.6/sec

open, close 함수가 fopen(fclose)함수에 비해 1.5배 정도 빠른것으로 보인다.

출처 http://blog.daum.net/jchern/12875160

 

 

Text 보다 binary로 파일 데이터를 읽는게 훨씬 빠름

 

파일 입출력 함수에 대한 속도차의 거의 느낄수 없다.

 

 

 내가 테스트한 결과... 멍미 자꾸 fopen이 젤 빠르게 나온다 ㅠ

그동안 내가 신뢰해온 CreateFile이 무너지는 순간인가 ㅜ.ㅡ

한번에 읽는 바이트 수에 따라 달라질라나

 

_sopen_s() 함수 추가 : fopen_s와 비슷한 속도차이를 냈다.

하지만, 때론 비용이 제로의 가깝게 거의 들지 않는다.

스트림을 생성유무의 차이가 있다는데... 좀 더 알아봐야징

 

 

'비공개' 카테고리의 다른 글

모니터에 대한 이야기  (0) 2012.09.25
함수 호출시 인자 전달에 대한 주의점  (0) 2012.08.20
[Game][Console] 배달맨  (0) 2012.08.17
[C++11] auto Keyword  (0) 2012.04.16
로그 데이터 남기기 ( 가변인자 활용 )  (0) 2012.03.20
Posted by 닭꽝
비공개2012. 8. 20. 16:20

class foo { public : foo() { printf("foo 생성자 호출\n"); } foo( const foo& _data ) { printf("foo 복사 생성자 호출\n"); } ~foo() { printf("foo 소멸자 호출\n"); }

 

// 반환값, 파라메타에 &를 뺀다면?

const foo operator = ( const foo _data ) { memcpy( a, _data.a, 100 ); return (*this); } int a[100]; }; int main() { foo a; // 생성자 호출 foo b; // 생성자 호출 a = b; // 복사 생성자 2번 호출

getchar(); return 0; }

 

 

 

헉

 

Posted by 닭꽝
비공개2012. 8. 17. 17:45


 

 생각나는데로 막짬 2시간 30분 ㅠ

역시 난 C 스타일

 

 OTL

 

 

 

#include <iostream>
using namespace std;

// 벽으로 이동하려고 하면 어떻게 되는가?
// 첫 번째 목표 지점에 둔 상자를 다시움직이려고 하면 어떻게 되는가?
// 상자를 두개 이상 밀면 어떻게 되는가?
// 상자를 벽 쪽으로 밀면 어떻게 되는가?

const int MAX_SPACE = 30;
const char g_Stage1[][MAX_SPACE] =	{
										{"########"},
										{"# .. p #"},
										{"# OO   #"},
										{"#      #"},
										{"########"}
									};

enum eObject {
	OBJ_NONE = 0,
	OBJ_SPACE,
	OBJ_WALL,
	OBJ_GOAL,
	OBJ_BLOCK,
	OBJ_BLOCK_ON_GOAL,
	OBJ_MAN,	
	OBJ_MAN_ON_GOAL
};

enum eDirection
{
	DIR_LEFT = 0,
	DIR_RIGHT,
	DIR_UP,
	DIR_DOWN
};

void MoveObject( int* _pBoard, int _pos, eDirection _eDir );

int main()
{
	/// 초기화
	int line = sizeof( g_Stage1 ) / MAX_SPACE ;

	int* pStage = new int[line * MAX_SPACE];
	memset(pStage, 0, line * MAX_SPACE );

	// 컨트롤 하기위한 배열 재구성
	for( int i = 0; i < line; i++ )
	{
		for( int j = 0; j < MAX_SPACE; j++ )
		{
			switch( g_Stage1[i][j] )
			{
			case ' ' : pStage[i * MAX_SPACE + j] = OBJ_SPACE;	break;
			case '#' : pStage[i * MAX_SPACE + j] = OBJ_WALL;	break;
			case '.' : pStage[i * MAX_SPACE + j] = OBJ_GOAL;	break;
			case 'O' : pStage[i * MAX_SPACE + j] = OBJ_BLOCK;	break;
			case 'p' : pStage[i * MAX_SPACE + j] = OBJ_MAN;		break;
			default  : pStage[i * MAX_SPACE + j] = OBJ_NONE;	break;
			}
		}
	}

	while(1)
	{	
		system("cls");

		// 배열 그리기
		for( int i = 0; i < line; i++ )
		{
			for( int j = 0; j < MAX_SPACE; j++ )
			{
				eObject objNum = (eObject)pStage[i * MAX_SPACE + j];
				if( objNum == 0 )
				{
					cout << endl;
					break;
				}

				char ch;
				switch( objNum )
				{
				case OBJ_NONE		:					break;
				case OBJ_SPACE		:		ch = ' ';	break;
				case OBJ_WALL		:		ch = '#';	break;
				case OBJ_GOAL		:		ch = '.';	break;
				case OBJ_BLOCK		:		ch = 'o';	break;
				case OBJ_BLOCK_ON_GOAL :	ch = 'O';	break;
				case OBJ_MAN		:		ch = 'p';	break;
				case OBJ_MAN_ON_GOAL :		ch = 'P';	break;
				}

				cout << ch;
			}
		}

		int nGoalTotalCount = 0;
		for( int i = 0; i < line; i++ )
		{
			for( int j = 0; j < MAX_SPACE; j++ )
			{
				// 골인 총 개수 파악( 클리어 체크용 )
				if( (eObject)pStage[i * MAX_SPACE + j] == OBJ_GOAL )
					nGoalTotalCount++;
			}
		}


		// 게임 클리어 판단
		int nBlockOnGoalCount = 0;
		for( int i = 0; i < line; i++ )
		{
			for( int j = 0; j < MAX_SPACE; j++ )
			{
				if( (eObject)pStage[ i * MAX_SPACE + j ] == OBJ_BLOCK_ON_GOAL )
				{
					if( nBlockOnGoalCount == nGoalTotalCount )
					{
						cout << endl << "Congraturation!!!" << endl;
						system("pause");
						return 1;
					}
				}
			}
		}

		// 설명
		cout << endl << "[a:left] / [d:right] / [w:up] / [s:down]" << endl;
		
		// 키 입력
		char ch;
		cin >> ch;

		// 입력받은 키 값에 대한 데이터 처리 및 갱신
		int manPos = -1;
		for( int i = 0; i < line; i++ )
		{
			for( int j = 0; j < MAX_SPACE; j++ )
			{
				// 플레이어 위치
				if( (eObject)pStage[i * MAX_SPACE + j] == OBJ_MAN || (eObject)pStage[i * MAX_SPACE + j] == OBJ_MAN_ON_GOAL )
					manPos = i * MAX_SPACE + j;
			}
		}

		switch( ch )
		{
						
		case 'a' : MoveObject( pStage, manPos, DIR_LEFT );
			break;
		case 'd' : MoveObject( pStage, manPos, DIR_RIGHT );
			break;
		case 'w' : MoveObject( pStage, manPos, DIR_UP );
			break;
		case 's' : MoveObject( pStage, manPos, DIR_DOWN );
			break;
		}


	}
	
	return 0;
}

void MoveObject( int* _pStage, int _pos, eDirection _eDir )
{
	int manMovePos = -1;

		 if( _eDir == DIR_LEFT )	manMovePos = _pos - 1;
	else if( _eDir == DIR_RIGHT )	manMovePos = _pos + 1;
	else if( _eDir == DIR_UP )		manMovePos = _pos - MAX_SPACE;
	else if( _eDir == DIR_DOWN )	manMovePos = _pos + MAX_SPACE;

	if( manMovePos < 0 ) return;

	// 이동가능한가?
	bool bMove = true;
	if( (eObject)_pStage[manMovePos] == OBJ_NONE			|| 
		(eObject)_pStage[manMovePos] == OBJ_BLOCK			||
		(eObject)_pStage[manMovePos] == OBJ_MAN				|| 
		(eObject)_pStage[manMovePos] == OBJ_WALL			|| 
		(eObject)_pStage[manMovePos] == OBJ_BLOCK_ON_GOAL )
	{
		bMove = false;
	}

	// 이동 하려는 지점이 블럭 일 경우 밀자!
	int objIndex = -1;
	if( (eObject)_pStage[manMovePos] == OBJ_BLOCK )
	{
		// 밀려는 방향으로 블럭 앞 체크
			 if( _eDir == DIR_LEFT )	objIndex = manMovePos - 1;
		else if( _eDir == DIR_RIGHT )	objIndex = manMovePos + 1;
		else if( _eDir == DIR_UP )		objIndex = manMovePos - MAX_SPACE;
		else if( _eDir == DIR_DOWN )	objIndex = manMovePos + MAX_SPACE;

		if( objIndex == -1 || objIndex < 0 ) return;

		if( (eObject)_pStage[objIndex] == OBJ_SPACE || (eObject)_pStage[objIndex] == OBJ_GOAL )
			bMove = true;
	}

	if( bMove )
	{
		// 기존 지점 상태 변경
		if( (eObject)_pStage[_pos] == OBJ_MAN_ON_GOAL ) _pStage[_pos] = OBJ_GOAL;
		else										    _pStage[_pos] = OBJ_SPACE;

		// 이동 지점 상태 변경
			 if( (eObject)_pStage[manMovePos] == OBJ_GOAL )		_pStage[manMovePos] = OBJ_MAN_ON_GOAL;
		else if( (eObject)_pStage[manMovePos] == OBJ_BLOCK )
		{
			_pStage[manMovePos]	= OBJ_MAN;	
			if( (eObject)_pStage[objIndex] == OBJ_GOAL ) _pStage[objIndex] = OBJ_BLOCK_ON_GOAL;
			else										 _pStage[objIndex] = OBJ_BLOCK;
		}
		else _pStage[manMovePos] = OBJ_MAN;		
	}
}
Posted by 닭꽝
비공개2012. 4. 16. 17:57


auto arrData[10]; // compile error! Array에 사용 불가! auto a; // compile error! 정의시 초기화 필요! // #1 auto b = 10; // Ok auto c = "auto 키워드 Test String"; // Ok // #2 auto d = 20; d = "auto 키워드 int->String 대입"; // compile error! 컴파일 시점에 데이터 타입 결정! // #3 auto e = 30; e = 40; // OK // #4 auto f = 40; f = 40.1; // OK(warning). double -> int. 데이터 손실. f = -1; // OK. 기본적으로 Signed로 생성 // #5 auto g = new auto(10); // OK. delete g; // Runtime Error. 자동으로 메모리 해제 // #6 auto h = new auto[10]; // compile error! Array에 사용 불가! // #7 auto i[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // compile error! Array에 사용 불가! // #8 auto j = 50; auto k = &j; // OK. 포인터 형태 가능. // #9 int data[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; auto l = data; // OK. 배열 원소의 포인터 자료형으로 생성 l[1] = 99; // OK. auto m = &data[2]; // OK. m[3] = 99; // OK.


- 인스턴스 시점에 초기화 필요. 메모리 공간 확보에 필요.

- 배열 인스턴스에 사용 불가.

- 한번 결정된 데이터 타입은 변경되지 않는다.

- delete 키워드 사용시 RunTime Error 를 발생시킨다.


Posted by 닭꽝
비공개2012. 3. 20. 12:30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void prtLog(char *strFile, char *strLog, ...)
{
	char PNT[1024] = {0,};	
va_list argptr; va_start(argptr,strLog); vsprintf(PNT, strLog, argptr); va_end(argptr); FILE *fp=fopen(strFile,"a+"); if( fp ) { fseek(fp,0,SEEK_END); fprintf(fp,"%s\n",PNT); fclose(fp); } }


문자열 strFile의 이름의 파일을 열어 마지막 위치에 입력한 데이터를 쓰기.

활용 ) 프로젝트 시 txt 파일로 Log를 남겨 활용하면 좋다 .

Tip ) 
Posted by 닭꽝
비공개2012. 1. 4. 09:56
올해 중학교 들어갈 딸 하나를 둔 아빠이며 제2금융권에서 일하는 이동빈(40)씨에게 지난 연말 국민연금공단에서 안내문 한 장이 왔다. '60세까지 불입할 경우 고객님의 예상 연금액은 매월 100만7000원입니다.' '국민연금은 물가 오름폭이 수령 연금액에 반영되기 때문에 안심해도 된다'는 설명도 눈에 띄었다. 이씨는 "그나마 월 100은 되는구나"라는 생각이 들었다.

찬찬히 통지서를 살펴보던 이씨의 눈에 만 65세가 돼야 비로소 연금을 받을 수 있다는 설명이 들어왔다. "내가 언제까지 회사에 다닐 수 있을까?" 이씨는 불안해졌다. 55세에 은퇴한다면 국민연금을 받기까지 이씨는 10년을 기다려야 한다. 이씨의 재산은 은행 대출 1억7000만원을 끼고 산 시가 4억원짜리 아파트 한 채와 3000만원 정도의 펀드가 전부이다.

'5565 마(魔)의 10년'

'직장에서 은퇴하고, 가진 재산이라곤 집 한 채, 국민연금은 10년 뒤에나 받는다.' 바로 현재의 30~40대가 55세가 되면 정면으로 맞닥뜨리게 될 현실이다.

본지와 삼성생명이 지난달 은퇴를 앞둔 전국 40~50대 남녀 500명에게 '은퇴 후 생활비를 어디서 조달할 계획인가' 물었더니 절반 이상(56.2%)은 연금으로 생활하겠다고 답했다. 근로소득(17.2%), 부동산 임대소득(14.0%)이 뒤를 이었다. 이자소득(6.0%), 투자소득(2.4%), 자녀의 지원(1.8%)은 답이 많지 않았다.

문제는 국민연금이 퇴직 후 바로 나오지 않는다는 것이다. 내년부터 국민연금 수급 연령은 5년마다 한 살씩 늦춰지게 된다. 1953~1956년생은 만 61세부터 연금을 받을 수 있고, 1957~1960년생은 62세, 1961~1964년생은 63세, 1965~1968년생은 64세부터 받을 수 있다. 1969년 이후에 출생한 연금 가입자는 만 65세가 되어야 연금을 받게 된다.

1969년 이후 태어난 사람이 55세에 퇴직한다면 연금을 받을 65세가 되기까지 '5565(55~65세)'의 '마의 10년'을 넘겨야 한다. 더구나 100세 시대의 5565시기는 아버지 세대의 5565시기와 다르다. 만혼(晩婚) 추세 때문에 오랫동안 함께 살아야 하는 자녀를 뒷수발하고 80~90대 부모 부양도 해야 한다. 우재룡 삼성생명 은퇴연구소장은 "은퇴 후 40년을 준비하는 가장 첫 단추는 바로 이 마의 10년의 재무 계획을 미리 탄탄히 세우는 것"이라고 말했다.

 이미지를 클릭하시면 스냅샷으로 크게 볼 수 있습니다. / 조선닷컴
족쇄를 채워라

은퇴 예비자들이 생각하는 은퇴 후 월 적정 생활비는 239만원이다(통계청 '가계금융조사'). 그 절반도 안 되는 100만원이라도 매달 손에 쥐려면 은퇴 전에 매달 어느 정도 저축해야 할까. 55세부터 10년 동안 매달 100만원을 받기 위해선 현재 40세라면 월 73만원, 45세라면 122만원, 50세라면 270만원을 매달 저축해야 한다(물가상승률 3%, 투자수익률 4% 가정). 〈표 참조〉

40세에 시작하면 50세에 시작하는 것보다 월 부담액이 200만원이나 줄어든다. 미리부터 은퇴자금을 적립하면 55세 이후 마의 10년을 버티기가 한결 수월해지는 것이다.

은퇴자금은 어떤 경우에도 손대지 않는 게 좋다. 아예 중도 인출이 어렵거나, 중도 인출 시 불이익이 많은 연금상품에 가입하는 방법도 있다. 퇴직연금·연금저축(펀드)·변액연금보험이 대표적이다.

가장 기본이 되는 것은 퇴직연금이다. 다니는 회사에서 직접 금융회사에 돈을 맡기는데다 원칙적으로 중간정산이 불가능하기 때문에 '없는 셈치고' 회사에 다니다 보면 어느새 상당한 노후자금이 쌓이게 된다. 연금저축(펀드) 또한 10년 이상 가입하지 않고 중도 환매할 경우 최종수령액의 22%를 기타소득세로 내야 하기 때문에 도중에 깨기가 쉽지 않아 '족쇄' 역할을 한다. 연 400만원 한도에서 소득공제도 받을 수 있다. 10년 이상 넣어야 비로소 세제 혜택이 주어지는 변액연금보험 또한 강제로 노후 자금을 모으는 방법 중 하나다.

물론 자기 나름대로 주식이나 부동산 투자 등으로 돈을 굴려 목돈을 만든 뒤 은퇴 이후 알뜰하게 빼쓸 수도 있다. 다만 이때도 '은퇴 때까지는 절대 건드려서는 안 되는 돈'이라는 사실을 잊어서는 안 된다.

자녀 교육비나 결혼비용 등의 목돈은 별도의 꼬리표를 붙여 관리하는 것이 좋다. 예를 들어 미성년자 자녀 명의로 펀드에 가입하면 심리적으로 손대기가 쉽지 않은 데다, 10년간 총 1500만원 한도 내에서 증여세가 면제된다.

김기홍 대한생명 강남FA센터장은 "월 소득의 일정 부분을 무조건 은퇴자금으로 저축하고, 은퇴 후 제2의 직업까지 준비한다면 마의 10년을 어렵지 않게 넘길 수 있을 것"이라고 말했다. 

'비공개' 카테고리의 다른 글

[C++11] auto Keyword  (0) 2012.04.16
로그 데이터 남기기 ( 가변인자 활용 )  (0) 2012.03.20
Visual Studio gallery  (0) 2011.12.08
넥슨 개인정보 유출과 대응책  (0) 2011.11.30
log 파일 실시간 검사 Utility  (0) 2011.11.30
Posted by 닭꽝
비공개2011. 12. 8. 12:14

다양한 활용 도구 

http://visualstudiogallery.msdn.microsoft.com/
Posted by 닭꽝
비공개2011. 11. 30. 10:42

넥슨의 ‘메이플스토리’를 플레이하는 이용자 정보가 해킹 당해 1320만명의 개인정보가 유출되었습니다.

이 사건을 통해 사용자의 이름과 계정, 암호화 된 비밀번호와 주민등록번호 등이 유출되었습니다. 이번

해킹사건은 내부자 PC에 악성코드를 침투시켜 회원 정보를 유출한 방법으로, 농협과 SK커뮤니케이션의

해킹 방식과 유사한 방식으로 이루어졌다고 합니다. 추가적인 2차 피해가 발생할 수 있으므로 아래의

대응책을 확인 하시여 주의하여 주시기 바랍니다.

 

- 대응책 -
 

1. 자신의 개인정보 유출여부를 확인해보시기 바랍니다. (넥슨 제공)

->http://maplestory.nexon.com/MapleStory/Page/Gnx.aspx?URL=Common/PrivateInfoNotice
 

2. KISA에서 제공하는'주민등록번호 이용내역 확인' 코너를 통해 계정 이용여부를 확인하고 자주 쓰지

않는 계정은 탈퇴하는 것이 좋습니다.

->http://clean.kisa.or.kr/mainList.do
 

3. 같은 아이디를 사용하는 계정들의 비밀번호를 변경해야 합니다.
 

4. 주민등록번호 대신 아이핀(i-PIN) 인증으로 변경합니다.

->http://i-pin.kisa.or.kr/kor/main.jsp
 

5. 개인정보유출과 관련된 피해는 개인정보 침해 신고 e콜센터 118에 전화해 문의해야 합니다.






아이핀 사용해볼까나 ㄷㄷ 

Posted by 닭꽝
비공개2011. 11. 30. 10:15

DebugView가 VS의 출력창을 커버(?)해준다면,


Unix의 Tail 기능( 파일의 끝 부분 읽기를 수행 )을 Windows에서 보기 쉽게 해주는 유틸리티 프로그램!


참고로, 현재 cmd 창 내에서 [-Tail -f log2.txt] 이런식으로 사용 가능합니다.


허나, 이 유틸리티의 장점은!

저희 Log2.txt 와 같은 실시간 갱신되는 log 파일들을 모니터링 해줍니다.

또한, 하일라이트 기능 및 분할창 등등의 다양한 기능을 제공하여 잘만 활용한다면

저희 디버깅용 다이얼로그보다도 더 유용하게 사용 가능하리라 봅니다.


다빼놓고 일단 화면이 넓고 조절가능해 맘에듬. 


제가 대충 찾아봤는데 다음과 같은 툴이 있네요.


- Win Tail

이건 무료버전과 상용버전이 따로 있는듯 ㅜ.ㅡ


무료버전은 딱 메모장과 동일하고

상용버전은 화려한 기능이 +.+


- Bara Tail


상용버전 밖에 못 찼음.


써보고 괜찮으면 정품 소프트웨어 사용을 권장합니다.
 

'비공개' 카테고리의 다른 글

Visual Studio gallery  (0) 2011.12.08
넥슨 개인정보 유출과 대응책  (0) 2011.11.30
Tool 배포시 유의점  (0) 2011.10.13
타입캐스팅 만들기( 변환 함수 )  (0) 2011.09.22
Direct3D Device Lost  (0) 2011.09.09
Posted by 닭꽝