프로그래밍 일반 2013. 8. 23. 15:46

그주의 특정 요일 날짜를 알아내기

날짜를 테이블 키로 사용하는 경우 


Day of week (1 = Sunday, 2 = Monday, ..., 7 = Saturday)


원하는 날짜 = 현재시간 - 현재시간.GetDayOfWeek()  +  원하는 요일 (Day of week)



예) 이벤트가 일주일에 한번 갱신되고 월요일에 시작한다. 금주는 주말을 포함한다.

// 일요일 처리

if ( current.GetDayOfWeek() == 1 ) {

COleDateTimeSpan span(6, 0, 0, 0);


monday = current - span;

}

else {

COleDateTimeSpan dayOfWeek(current.GetDayOfWeek(), 0, 0, 0);

COleDateTimeSpan spanMonday(2, 0, 0, 0);


monday = current - dayOfWeek + spanMonday;

}

프로그래밍 일반 2013. 7. 8. 12:56

윈도우 배치파일 문법 정리

- 도움말 확인하기
 해당 명령어 뒤에 /?
출력 결과를 텍스트 파일로 저장하기 > 파일.txt
예) FOR /? > "FOR 사용법.txt"

- 주석 작성
 @REM 블라블라블라

- 현재 작업 경로 알아내기

 %CD%를 하면 현재 작업 경로를 얻을 수 있다.

 @REM 현재 경로 저장

SET CurrentPath=%CD%

@REM 경로 이동

CD D:\DEV\Server

...코드

@REM 이전 경로로 복귀

CD %CurrentPath%



- 파일 복사

COPY


- 파일 이름을 변경한다.

RENAME [드라이브:][경로]파일이름1 파일이름2.

REN [드라이브:][경로]파일이름1 파일이름2.

서버 재시작시에 기존 기존 로그를 분리하는 등의 용도로 사용 가능

예) 

REN LoginError.log %date%_%time:~0,2%_%time:~3,2%_%time:~6,2%_LoginError.log

exit /b 0




배치파일을 만들면서 느낀 팁만 남기도록 한다.


어차피 배치파일 명령어 사용법은 /? 키워드를 사용하여 주석을 확인하는게 가장 정확하고 배치파일을 처음 접할 때 한가지만


잊지 않으면 배치파일 명령어는 간단하다. 바로 우리가 파일로 작성한 배치파일은 단순한 cmd.exe 에서 파일을 읽어 명령어를 사용한다는 사실이다.


한 예로 


@echo off

svn update .                            // 설정파일이 포함된 폴더의 svn을 업데이트하고

copy /Y Event.ini ..                  // 한단계 위로 파일 복사

copy /Y DurationEvent.ini ..

pause


배치 파일을 클릭해서 실행 시키면 해당 설정 폴더를 svn 업데이트하고 상위 폴더에 설정 설정파일들을 복사하는 배치 파일이 있다고하자.

 d:\server\public\배치파일


서비스 중에 이벤트 정보를 변경할 필요가 생겼을 때 모든 서버마다 수작업으로 해당 배치파일을 클릭해서 실행 시켜야한다면 매우 비효율 적이기 때문에 마스터서버에서 특정 명령어를 보내면 게임서버가 해당 배치파일을 실행 시키는 명령어를 만들었다고 치자.


명령어를 받은 게임 서버는 


::ShellExecute 등의 함수를 사용하여 배치파일을 실행 시키는데


이렇게되면 d:\server\.. 게임 서버의 모든 데이터가 update되고 

d:\server\Event.ini 파일이 -> d:\Event.ini 복사된다.


위와 같은 결과는 cmd.exe 에서 실행되는 과정을 보면 당연하다고 볼 수 있다.


서버파일이 존재하고 있는 경로 D:\Server\.. 에서 배치파일이 실행되었기 때문에 svn 업데이트 명령이나 파일 복사도 우리가 의도하지 않는 결과를 만들었다.


그러면 어떻게 해결할 수 있을까? 


위에서 이야기한 배치파일은 단순히 cmd.exe 에서 읽어들이는 명령어라고 생각하면 간단하다.


@echo off

cd public                                     // d:\server\public\.. 경로 이동..

svn update .                                // d:\server\public\.. 원하는 폴더만 업데이트

copy /Y Event.ini ..                      // 업데이트된 파일 상위로 복사

copy /Y DurationEvent.ini ..

pause

배치파일을 작성할 때는 항상 도스창에서 실행되는 명령어를 작성한다고 생각하면 의외로 단순하다는 사실을 잊지 말자.





웹서버 리스타트 배치 명령어

@echo off



@REM appcmd.exe 폴더로 경로 이동

cd %windir%\system32\inetsrv


@REM 사이트 종료

appcmd stop site /site.name:"사이트명"


@REM 응용 프로그램 풀 종료

appcmd stop apppool /apppool.name:"풀명"



@REM 퍼포스 업데이트



@REM appcmd.exe 폴더로 경로 이동

cd %windir%\system32\inetsrv


@REM 사이트 시작

appcmd start site /site.name:"사이트명"


@REM 응용 프로그램 풀 종료

appcmd start apppool /apppool.name:"풀명"




프로그래밍 일반 2013. 6. 5. 14:19

enum 간단한 코드로 의미있는 에러코드 출력하기

프로그램이 실행되는 도중에 에러코드가 숫자로 출력되면 해당 에러코드가 어떤 의미인지 코드를 찾아봐야하는 번거로움이 있다.


디파인 함수를 잘 이용하면 단순한 코드로 해당 문제를 상당부분 해소할 수 있다.



샘플 코드 


#define DO_TEXT(e) L#e,

#define DO_ENUM(e) e,


#define CRYPTO(NAME) \

NAME(ERROR_AUTH_SUCCESS) \

NAME(ERROR_AUTH_DECODING_FAILURE) \

NAME(ERROR_AUTH_TOKEN_IS_NOT_VALID)


enum eERROR_CJIJCRYPTO {

CRYPTO(DO_ENUM)

};



TCHAR* szError_CJIJCrypto[] = {

CRYPTO(DO_TEXT)

};



단점은 enum에 주석을 사용할 수 없는 없다는 점인데 의미있는 문자열을 사용하면 간단히 넘어갈 수 있는 문제이다.

프로그래밍 일반 2013. 6. 5. 11:36

MFC 함수를 이용해서 간단히 서브스트링 얻기

This global function can be used to extract a substring from a given source string.

BOOL AFXAPI AfxExtractSubString (
   CString& rString,
   LPCTSTR lpszFullString,
   int iSubString,
   TCHAR chSep = '\n'
);



샘플 코드


// The following example extracts a series of name, value pairs from a

// given source string:


// Input string consisting of a number of name, value pairs

LPCTSTR lpszSource = _T("\"Name\"=\"John Smith\"\n")

   _T("\"Company\"=\"Contoso, Ltd\"\n\"Salary\"=\"25,000\"");


CString strNameValue; // an individual name, value pair


int i = 0; // substring index to extract

while (AfxExtractSubString(strNameValue, lpszSource, i))

{

   // Prepare to move to the next substring

   i++;


   CString strName, strValue; // individual name and value elements


   // Attempt to extract the name element from the pair

   if (!AfxExtractSubString(strName, strNameValue, 0, _T('=')))

   {

      // Pass an error message to the debugger for display

      OutputDebugString(_T("Error extracting name\r\n"));

      continue;

   }


   // Attempt to extract the value element from the pair

   if (!AfxExtractSubString(strValue, strNameValue, 1, _T('=')))

   {

      // Pass an error message to the debugger for display

      OutputDebugString(_T("Error extracting value element\r\n"));

      continue;

   }


   // Pass the name, value pair to the debugger for display

   CString strOutput = strName + _T(" equals ") + strValue + _T("\r\n");

   OutputDebugString(strOutput);

}

프로그래밍 일반 2013. 6. 5. 11:25

실행파일 커맨드 라인 받기

CommandLineToArgvW Function


Parses a Unicode command line string and returns an array of null-terminated Unicode strings. The strings contain the individual arguments found in that command line, and a count of arguments, similar to the standard C run-time argv and argc values.


Syntax

LPWSTR *CommandLineToArgvW(      
LPCWSTR lpCmdLine, int *pNumArgs );



Example

The following example demonstrates how to parse a Unicode command-line string. The code frees the memory for the argument list at exit.

Hide Example

#include <windows.h>
#include <stdio.h>
#include <shellapi.h>

int __cdecl main()
{
   LPWSTR *szArglist;
   int nArgs;
   int i;

   szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
   if( NULL == szArglist )
   {
      wprintf(L"CommandLineToArgvW failed\n");
      return 0;
   }
   else for( i=0; i<nArgs; i++) printf("%d: %ws\n", i, szArglist[i]);

// Free memory allocated for CommandLineToArgvW arguments.

   LocalFree(szArglist);

   return(1);
}


프로그래밍 일반 2013. 3. 11. 17:53

telnet 사용 방법

특정 서버에 접근이 가능한지 확인해보는 간단한 방법으로 telnet 을 사용할 수가 있다.

telnet 설치 방법으로는 

제어판 -> 프로그램 -> Windows 기능 사용/사용 안 함 -> telnet 클라이언트 사용


명령어 

cmd 창에서

telnet 아이피 포트

접근이 허용된다면 화면이 바뀌고 커서가 깜빡인다.

접근이 불가능할 때는 접근 불가 메시지 출력!!


해외 서비스 시에 특정 서버에 접근 가능한지 확인해보는 가장 간단한 방법이다!!

프로그래밍 일반 2011. 2. 23. 12:43

GetTextExtentPoint32


글자의 가로, 세로 크기를 얻을 때 유용하다.
호출전에 반드시 SelectObject를 사용해서 폰트를 dc에 설정한 후 사용해야 한다.
프로그래밍 일반 2011. 2. 23. 12:42

IsDBCSLeadByte


멀티바이트를 구성하는 바이트가 2바이트를 구성하는 바이트의 첫번째 바이트인지 판단해서 true 리턴.
단순히 아스키코드 값이 127보다 큰지 작은지 알려주기 때문에 한글을 확인할 때는 2바이트로 짝을 맞추어서 확인하자.
프로그래밍 일반 2010. 12. 30. 12:31

파일 존재 여부 확인

int _access( const char* path, int mode )

- parameters
  psth
   File or directory path.
  mode
   Read/write attribute.

- header
 <io.h>

리턴값은 msdn과 일치하지 않는 듯하다. 실패시 -1을 리턴한다.
폴더와 파일 모두 확인하기 때문에 GetFileAttributes 함수와 같이 사용하면 좋을 듯, 아미녀 속성 검사 함수만 사용해도 되고..

DWORD GetFileAttributes( LPCTSTR lpFileName )

FILE_ATTRIBUTE_DIRECTORY 파일 속성이 폴더인 경우

프로그래밍 일반 2010. 12. 13. 09:56

동적 측면을 검증해 클래스 다이어그램 완성하기


모델링은 정적인 측면, 동적인 측면, 기능적인 측면에서 검증한 후, 클래스 다이어그램을 수정할 필요가 있다.

 정적인 측면에서 모델링한 것만으로는 모델링이 불충분한 이유는 시스템이 동작할 때에는 클래스 다이어그램에 표시된 클래스의
오브젝트가 생성되거나, 서로 협조하면서 변화 또는 소멸하는 동적인 변화가 있기 때문이다. 이 동적인 변화를 정적 모델에 작성된 클래스의 속성이나 조작의 조합에 의해 의도한 대로 다룰 수 있다는 것을 검증해야만 한다. 이것을 통과하지 못한 정적 모델은 가설적인 개념에 지나지 않으며, 시스템을 만들어도 제대로 동작한다는 보장이 없다.