티스토리 툴바


들어가기

간혹 파일에 읽기 전용이가 권한을 변경해서 삭제되지 않은 파일이 있다. 정말 짜증난다. 혹시 이상한 파일로 의심이 되기도 한다. 이런 파일은 설치되는 프로그램이나 사용자 부주의로 소유권에 문제가 발생한 경우가 많다.


삭제하기

여기서 삭제하는 방법은 dos창에서 수행하는 방법이다. GUI로 가능하지만, 이렇게 한 것은 자동으로 스크립트를 생성하기 위한 목적이 있다. 그리고 GUI보다 간단하게 작업을 처리할 수 있다.


takeown /r /f 파일또는디렉토리명

icacls 파일또는디렉토리명 /grant 사용자ID:F /t


각 명령의 옵션은 인터넷을 검색하면 자세히 나온다. 혹은 각 명령어의 도움말 옵션을 사용해본다.


그리고 해당 파일이나 디렉토리를 삭제해본다. 잘 된다.


간혹 중요한 시스템 파일이 보호되어 있는데, 이런 방식으로 삭제할 경우 시스템에 문제가 발생할 수도 있다. 각자 알아서 정확히 사전에 확인하여 삭제하기 바란다.


위의 명령은 디렉토리를 지정할 경우 서브디렉토리까지 모두 변경되는 것이기에 유용하게 사용할 수있다.

2012-01-09 ospace.




저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > Utility' 카테고리의 다른 글

Windows에서 지워지지 않은 파일 삭제하기  (0) 2012/01/09
Xming에서 Xwindow 설정과 eclipse 실행  (0) 2012/01/09
Xwindow에서 한글 폰트  (0) 2010/03/26
Regular Expression Tip & Tech  (0) 2009/09/28
Spec1  (0) 2009/07/25
도스창 팁: Command Prompt Tip  (0) 2008/12/24
Posted by ospace

댓글을 달아 주세요


들어가기


여기서는 전체 설정을 다루지는 않고  Xwindow에서 창 모드로 실행하는 경우를 살펴보겠다. 즉, XDM이나 GDM 등으로 전체 윈도즈를 사용하는게 아니라 필요한 윈도우 하나만 뛰우기 위한 것이다.



설치하기


Xming을 설치한다.



설정하기


그리고 환경설정이 필요하다. 직접 접속해서 창 모드로 뛰우는 경우는 Xming에서는 접근 제한을 한다.
이때 설정하는 파일이 X0.hosts이다. 이 파일에 자신이 원격으로 실행되는 Xwindow 시스템의 ip 주소를 입력한다.

그리고 Xming이 실행되고 있다면 다시 재 실행한다.

Xwindows 시스템에서는 추가로 작업이 필요할 수 있다. XDM 등을 사용하는 경우 윈도우 시작할 때 자동으로 쿠키를 생성해서 암호화를 하지만 XDM을 사용하지 않은 경우 생성되지 않는다고 한다. 이를 위한 다음 명령이 필요하다.

먼저 DISPLAY을 설정한다. 이 값은 Xming이 동작 중인 시스템이다.
본인은 .bashrc라는 파일에 넣었다. 다른 분들은 자신의 시스템 환경에 맞춰서 설정하면 된다.

export DISPLAY=x.x.x.x:0.0


제가 사용하는 쉘이 본쉘이기에 위와 같이 설정했다. 이제 MAGIC-COOKIE을 생성할 차례이다.

xauth generate $DISPLAY .

xauth -i -f ~/.Xauthority list


"."은 MIT-MAGIC-COOKIE-1을 의미한다.



그리고 잘 되지 않는다면 Xming인 경우는 Xming아이콘에서 RMB을 누르면 "View Log" 메뉴를 선택하면 된다.

"client 3 rejected ..."라는 메시지가 보인다면 X0.hosts를 설정하지 않은 문제이다.

그리고 Xwidnow시스템에서는 쿠키까지 잘 생성되었는데 "no protocol specified"가 보이는 경우도 X0.hosts에 등록하지 않은 경우도 있다.



그냥 Eclipse 뛰우기


원격에서 eclipse으로 개발할 경우 굳이 xwindow을 설치하지 않고 xwindows용 프로그램만 뛰우고 싶을 경우가 있다. 그때 xming을 사용하는데, xwindow가 설치되지 않았다면 라이브러리 오류로 실행이 안된다.

eclipse을 실행하는 경우가 마찬가지. eclipse가 실행할 때 필요한 xwindow용 라이브러리가 libgtk이다.

데비안이면

apt-cache search libgtk*

라이브러리를 검색하면 "libgtk2.0-0"가 있을 것이다. 이를 설치하면 된다. 다른 플랫폼이라면 해당 라이브러리가 들어있는 패키지를 찾아서 설치하면 된다.

실행시 발생하는 오류는 configuration 디렉토리에 있는 *.log 파일을 살펴보기 바란다.


Network Issue


간혹 네트워크 문제로 오류가 발생할 가능성이 있다. 무슨 말이냐면, NAT환경에서 사용할 경우 접속이 불가하다.

이는 시스템이 NAT이 있고 로컬 PC가 다른 네트워크에 있다면 xming인 xwindow server로 접속하는 방향이기 때문에 NAT 환경에서 접속이 안될 가능성이 있다. 그때 eclipse가 실행할 경우 다음과 같은 에러 메시지가 보일 수 있다.

(eclipse:13808): GLib-GObject-WARNING **: invalid (NULL) pointer instance


(eclipse:13808): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed


이때에는 네크워크 관리자에게 요청을 해야 한다.



Too large dialog


xming + eclipse 조합으로 사용할 경우 갑자기 Search dialog, Find/Replace dialog, Debug Configurations dialog 등이 갑자기 화면 가득 보이는 경우가 발생한다.

이 원인은 물론 버그로 인한 문제로 근본적인 해결은 힘들 듯 하다. 구글링해도 명확한 답변이 없고 제대로 수정하려면 XMing에 기부하여 수정하도록 만들수 밖에 없다는 듯 하다.

그래도, 임시방편으로 해결할 수 있는 방법이 다음과 같다.

http://superuser.com/questions/300555/problem-with-resizing-subwindows-in-eclipse-xming-combination에서 참조한 내용으로 직접 eclipse의 실행 환경에서 dialog 크기를 조절하는 옵션을 수정하는 것이다.

일단 eclipse을 종료하고 작업할 workspace로 이동한다. workspace 안에 .metadata라는 디렉토리 안에 .plugins 디렉토리로 이동한다. 그 밑에 각종 dialog에 대한 설정 정보가 저장되어 있다. 우리가 원하는 것은 dialog의 크기이다.

grep을 이용하여 WIDTH나 HEIGHT로 검색을 한다. 그러면 해당 xml파일이 검색될 것이다. 해당 파일에서 WIDTH와 HEIGHT로 검색하여 적당한 값을 수정하면 된다.

$ cd workspace/.metadata/.plugins

$ grep WIDTH */*.xml

.....


내가 수정한 값은 다음과 같다.

Debug Configurations dialog

  • 파일명: org.eclipse.debug.ui/dialog_settings.xml
  • 항목: org.eclipse.debug.ui.LAUNCH_CONFIGURATIONS_DIALOG_SECTION
  • 설정값:
    • "DIALOG_WIDTH": 800
    • "DIALOG_HEIGHT": 600


Search dialog

  • 파일명: org.eclipse.search/dialog_settings.xml
  • 항목: DialogBounds_SearchDialog
  • 설정값:
    • "DIALOG_WIDTH": 800
    • "DIALOG_HEIGHT": 600


크기는 자신의 해상도에 맞게 적당히 수정하면 된다. 그리고 위의 파일이나 항목은 없을 수도 있다. grep을 이용한 정보를 바탕으로 수정해야한다.


다른 방법으로 간단하게 현재 .metadata 디렉토리를 삭제하거나 이동하여 다시 eclipse을 실행한다.

당연히 .metadata가 삭제되었기 때문에 project 정보나 기타 eclipse에서 설정한 정보는 모두 사라지게 된다.

eclipse을 잘 알고 있다면 이전 .metadata에서 원하는 설정정보만 가져다가 사용할 수도 있지만, 필자는 포기하고 걍 쓰려고 한다. ㅡ.ㅡ;



2012-01-09 ospace.


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > Utility' 카테고리의 다른 글

Windows에서 지워지지 않은 파일 삭제하기  (0) 2012/01/09
Xming에서 Xwindow 설정과 eclipse 실행  (0) 2012/01/09
Xwindow에서 한글 폰트  (0) 2010/03/26
Regular Expression Tip & Tech  (0) 2009/09/28
Spec1  (0) 2009/07/25
도스창 팁: Command Prompt Tip  (0) 2008/12/24
Posted by ospace

댓글을 달아 주세요

작성: http://ospace.tistory.com/,2011.12.23 (ospace114@empal.com)

 

들어가기

NSIS은 내가 좋아하는 설치 프로그램 만들어주는 스크립트이다. 무료이다. 기능은 강력하지 않지만 있을 것은 다 있다.

InstallShield 부럽지 않다. 정말? ㅡ.ㅡ;

급하게 플러그인이 필요하여 만들게 되었다. 뭐 이전에 모아둔 자료가 아주 유용했다. 코드도 간단해서 분석하는데도 어렵지 않다.

간단하게 사용해본 정도라 내용에 오류가 있을수 있으니 양해바란다.

 

기본 구조

기본적으로 DLL을 사용한다. MFC용이 아닌 일반 C용 임을 주의하자. 자세한 코드 설명은 생략하겠다.

내용은 아래 보면  대충 알 수 있다. 그리고  아래 내용은 Andrei Ciubotaru의 process 코드를 참조하여 재구성하였다.

전역 변수를 사용하지 않고 nsis_t 구조체를 만들어서 사용했다.

 

#include <Windows.h>

#include <Strsafe.h>

 

typedef struct _stack_t {
    struct _stack_t    *next;
    char             text[1]; // this should be the length of string_size
} stack_t;

typedef struct _nsis_t {
    int string_size; //문자열 기본 할당 크기
    char *variables; // 사용자 변수
    stack_t **stacktop; // 스택 변수
} nsis_t;

typedef enum _variable_t
{
    INST_0,         // $0
    INST_1,         // $1
    INST_2,         // $2
    INST_3,         // $3
    INST_4,         // $4
    INST_5,         // $5
    INST_6,         // $6
    INST_7,         // $7
    INST_8,         // $8
    INST_9,         // $9
    INST_R0,        // $R0
    INST_R1,        // $R1
    INST_R2,        // $R2
    INST_R3,        // $R3
    INST_R4,        // $R4
    INST_R5,        // $R5
    INST_R6,        // $R6
    INST_R7,        // $R7
    INST_R8,        // $R8
    INST_R9,        // $R9
    INST_CMDLINE,   // $CMDLINE
    INST_INSTDIR,   // $INSTDIR
    INST_OUTDIR,    // $OUTDIR
    INST_EXEDIR,    // $EXEDIR
    INST_LANG,      // $LANGUAGE
    __INST_LAST
} variable_t;

int pop_string(nsis_t *self, char *str, size_t str_size) {
    stack_t *th;

    if(!self || !self->stacktop || !*self->stacktop )
        return 1;

    th = (*self->stacktop);
    if (0!=StringCchCopy(str, str_size, th->text))
        return 1;

    *self->stacktop = th->next;
    GlobalFree( (HGLOBAL)th );

    return 0;
}

void push_string(nsis_t *self, char *str) {
    stack_t *th;

    if (!self || !self->stacktop) return;
        return;

    th = (stack_t*)GlobalAlloc(GPTR, sizeof(stack_t) + self->string_size);
    if (S_OK!=StringCchCopy(th->text, self->string_size, str))
        return;
    //push stack
    th->next = *self->stacktop;
    *self->stacktop = th;
}

char *get_user_variable(nsis_t *self, variable_t var_idx) {
    if( !self || var_idx < 0 || var_idx >= __INST_LAST )
        return NULL;

    return (self->variables + var_idx*self->string_size);
}

void set_user_variable(nsis_t *self, variable_t var_idx, char *var) {
    if(!self || var == NULL) return;

    if( !self || var_idx < 0 || var_idx >= __INST_LAST )
        return;

    StringCchCopy(self->variables + var_idx*self->string_size, self->string_size, var);
}

 

extern "C" __declspec(dllexport) void myFunction(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) {

nsis_t nsis={string_size, variables, stacktop};

//char * var_r0 = get_user_variable(&nsis, INST_R0);

//char buf[1024];

//pop_string(&nsis, buf, sizeof(buf));

//set_user_variable(&nsis, INST_R0, "10");
//push_string(&nsis, "20");

}

 

BOOL APIENTRY DllMain (HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
    return TRUE;
}

 

 

기본 작동 방식

위의 코드에서 myFunction 함수로 구현해야할 함수이다. 함수 명이 NSIS에서 호출되는 함수이다. 호출 방식을 살펴 보자.

일단, 만들어진 DLL파일 명이 abc.dll 이고 구현된 함수 명이 myFunction이라고 하자. 그리고 DLL은 NSIS의 Plugins폴더에 복사해 놓는다.

 

NSIS 스크립트에서 아래와 같이 작성하면;

;...

abc::myFunction

;...

 

  1. 위의 호출에 의해 abc.dll이라는 파일을 찾고 있다면 동적로딩을 한다.
  2. 그리고 로딩한 dll에서 myFunction을 찾고 있다면 호출을 한다.
  3. 호출할 때에는 총 4개의 인자를 넘긴다. 여기서 중요한 것은 뒤쪽 3개 인자이다. NSIS와 값을 주고 받기 위해 사용된다.
  4. 호출된 함수는 결과를 스택 혹은 변수에 저장한다.
  5. NSIS에서 결과를 반환받아서 처리한다.

 

값을 주고 받는 방식은 변수 사용법과 스택 사용법이 있다. 변수는 0~9, R0~R9, CMDLINE, INSTDIR, OUTDIR, EXEDIR, LANGUAGE를 사용한다. 또는 스택을 이용하여 push, pop을 통해서 값을 서로 주고 받는다.

 

;변수를 사용한 방식

$R0 = 10

abc::myFunction

MessageBox MB_OK "Result: $R0"

;스택을 사용한 방식

Push 10

abc::myFunction

Pop $R0

MessageBox MB_OK "Result: $R0"

 

참조

http://nsis.sourceforge.net/Processes_plug-in

 

결론

사실 알고 보니 별거 아니다. 그냥 사용하면 된다. 그리고 값을 넘겨주고 받는 부분이 조금 복잡하지만 별거 없다. 문자열 처리하는데 힌트를 더 주면 string_size 인자는 nsis에서 사용하는 문자열 할당 크기이다. 즉, 모든 문자열 할당 크기는 기본값으로 string_size을 사용한다.

윈도우의 기능을 사용하여 쉽게 NSIS을  확장할 수있다는 장점이 있다. 그것도 쉽게...

 

모드 즐프~~

2011.ospace.

 

 

이 글은 스프링노트에서 작성되었습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > 개발도구들' 카테고리의 다른 글

NSIS Plugin 맹글기  (0) 2011/12/23
[UnitTest++] 사용하기 기초  (0) 2009/11/11
[NSIS] 다국어 라이센스 표시  (0) 2009/09/28
NSIS에서 윈도우 방화벽 제어 플러그인  (0) 2009/07/16
Eclipse용 Plugin  (0) 2009/06/19
Bash shell coloring  (0) 2009/01/05
Posted by ospace

댓글을 달아 주세요

성:http://ospace.tistory.com/(ospace114@empal.com) 2010.03.26

 

 아래는 네이버에서 공식 지원하는 폰트체를 사용한 화면이다.

 

네이버 사전체

 

네이버에서 폰트에서 사용되는 글꼴이다. 특수기호 등이 보이지 않을때 사용하면 된다고 한다.

 

다운로드 위치: http://krdic.naver.com/font.nhn.

 

Screenshot

  


 

 네이버 나눔글꼴

네이버에서 2008년 한글날 기념으로 무료배포하는 한글 글꼴이다. 개인적으로 마음에 글꼴 중에 하나이다.

고딕과 명조가 있는데, 고딕이 갈끔하고 이쁘다. 명조도 나름대로 매력적이다. ^^

 

 다운로드위치: http://hangeul.naver.com/share.nhn.

 

 Screenshort 나눔고딕


 

Screenshot 나눔명조


 

 XWindow의 폰트 설치하기

 

폰트를 설치하기 위해서는 root권한이 필요하다. 이점에 유념하길 바란다.

추가로 우분투에서는 별도로 root로 변경할 수 없다. 즉, root 권한이 필요한 모든 명령은 sudo로 실행하면 된다.

이때 물어보는 암호는 자신 로그인 암호를 입력하면된다.

 

우분투(ubuntu)에서

 

 폰트설치하는 방법은 두가지가 있다. XWindow에서 조작하는 법과 Console에서 입력하는 법이 있다.

먼저 XWindows에서 설치하는 방법은 다음과 같다.

 

압축 풀기

앞에서 다운로드 받은 폰트를 적당한 위치에 압축을 푼다. 그리고 파일 브라우저를 열고 압축을 푼 위치로 가면 아래와 같이 보인다.

폰트이름은 원래 한글로 되어 있으나 영어로 변경하였다. 변경한 이유는 압축을 푼 이후에 이름이 깨져보여서 영어로 변경하였다.

 

 

 

 폰트설치

폰트 설치는 간단하다. 앞에서 원하는 폰트를 더블클릭하면 아래와 같이 폰트 미리보기 화면이 뜬다.

그리고 오른쪽에 "Install Font"라는 버튼을 클릭하면 root권한 패스워드 입력하면 바로 설치된다.



 

폰트 사용하기

 

이것으로 폰트 설치가 끝났고 XWindows에서 폰트 변경해서 설정하면 된다. Ubuntu는 따로 데몬을 재실행하거나 추가적인 작업이 없다는 게 정말 편하다.

 

Console로 설치

Console로 설치하는 법도 간단하다. 폰트로 설치하는 법은 아래 그림처럼 하면 된다.

순서는

  1) Font 압축 파일을 푼 위치로 이동

  2) Root권한으로 /usr/share/fonts로 이동(또는 복사)

  3) XWindow에 폰트 설정을 한다.




 

참조

[1] 네이버 국어사전, http://krdic.naver.com/font.nhn

[2] 네이버 나눔글꼴, http://hangeul.naver.com/share.nhn

[3] 꿈틀꿈틀, 우분투 글꼴설치와 글꼴설정, http://noneway.tistory.com/132

 

 

 

이 글은 스프링노트에서 작성되었습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > Utility' 카테고리의 다른 글

Windows에서 지워지지 않은 파일 삭제하기  (0) 2012/01/09
Xming에서 Xwindow 설정과 eclipse 실행  (0) 2012/01/09
Xwindow에서 한글 폰트  (0) 2010/03/26
Regular Expression Tip & Tech  (0) 2009/09/28
Spec1  (0) 2009/07/25
도스창 팁: Command Prompt Tip  (0) 2008/12/24
Posted by ospace

댓글을 달아 주세요

 

작성:
http://ospace.tistory.com/(ospace114@empal.com) 2009.11.11

들어가기

 

CUnit를 작성하고 오랜만에 작성해봅니다. UnitTestC++는 최재훈님의 "테스트 프레임워크 도입하기"라는 글을 읽고 선택하게 되었습니다. 해당 글에는 설치와 설정에 관한 내용이 없어서 추가로 필요한 내용을 정리해볼려고 합니다. 처음 설치와 설정에 관한 내용이고, 테스트에 대한 노하우나 방법론에 대해서는 다루지 않습니다. 그리고 아래 글은 Windows환경에서 Visual Studio 2005(이하  VS 2005)를 고려해서 작성되었습니다. 물론 Visual Studio 2003(이하 VS 2003)이나 Visual Studio 2008(VS 2008)에서 가능합니다. UnitTestC++은 Win32, Linux, Mac OS X를 지원합니다.

 

필요한 파일

 

Lightweight unit testing framework for C++

UnitTest++: http://unittest-cpp.sourceforge.net/

Download: http://sourceforge.net/projects/unittest-cpp/files/

 

VisualStudio Addin for UnitTest

vutpp: http://code.google.com/p/vutpp/

Download: http://code.google.com/p/vutpp/downloads/list

 

 

환경 구성

 

  1. 먼저 UnitTest++를 다운 받아서 특정 폴더에  압축을 푼다. 독립적으로 구성된 SDK 폴더나 혹은 같은 솔루션의 프로젝트로 구성합니다.
  2. 압축을 푼 UnitTest++ 폴더에 가면 VS 2003과 VS 2005용 솔루션 파일이 있다. 자신이 사용하는 솔루션 파일을 열어서 모든 프로젝트 빌드한다. Batch build를 사용하면 편리하다. VS 2003과 VS 2005 둘다 사용하고 있다면 각각 솔루션 파일을 열어서 빌드하면 된다. 그러면 각각 다른 라이브러리 이름으로 생성된다.
  3. UnitTest++ 폴더에서 release와 build 폴더를 보면 VS 2003이면 UnitTest++.vsnet2003.lib가 VS 2005이면 UnitTest++.vsnet2005.lib가 생성된 것을 확인했다면 설치가 완료된 것이다.
  4. 이제 UnitTest++를 테스트 프로젝트에 적용해보자. 이때 필요한 기본 환경 설정이 include 폴더와 library 폴더 위치를 지정하는 것이다. 아래 설정은 본인의 설정 취향이므로 개인적인 취향에 맞춰서 설정하면 된다.
  5. VS 2005라고 가정해서 하며 반드시 모든 설정은 Debug와 Release에 동시에 설정하며 설정 대화상자에서 Configuration이 All Configurations인지 확인한다.
  6. 프로젝트 설정에서 Configuration Properties>C/C++>General에서 Additional Include Directories에 "C:\SDK\UnitTest++\src\" 입력.
  7. 사용할 라이브러리 지정은 Configuration Properties>Linker>Input>Additional Dependencies에 "C:\SDK\UnitTest++\$(ConfigurationName)\UnitTest++.vsnet2005.lib"를 입력한다.
  8. 다음은 UnitTest++를 위한 애드온 프로그램인 vutpp를 설치한다. 설치 프로그램이므로 다운받아서 바로 설치하면 된다.
  9. 설치가 끝나서 VS 2005를 실행하면 상단 메뉴에 "VUTPP"가 생성된다. VUTPP메뉴에서 UnitTestBrower를 실행하면 vutpp 프로그램이 실행되면 적당한 위치에 넣으면 된다.
  10. vutpp에서 UnitTest++를 사용하기 위해서는 VUTPP_UNITTEST++라는 전처리 설정이 프로젝트에 필요하다. 이는 프로젝트 속성에서 Configuration Properties>C/C++/Preprocessor에서 Preprocessor Definitions 항목 마지막에 VUTPP_UNITTEST++를 추가하면 된다. 이것 역시 Release와 Debug에 추가하면 된다.
  11. 테스트할 코드를 작성하면 된다.

 

 

테스팅 코딩

 

테스트할 대상이 되는 함수나 객체들은 반드시 DLL이나 정적 라이브러리로 되어 있어야 한다. 테스트 프로젝트에서 해당 DLL이나 정적 라이브러리를 지정하여 사용할 수 있다.

 

테스트 코딩 예제는 http://unittest-cpp.sourceforge.net/money_tutorial/를 살펴보기 바란다.

 

vutpp에서 작성된 테스트 코드를 실행하기 위해서 추가 작업이 필요하다. 즉 vutpp가 자동으로 단위 테스트를 불러올 수 없다. 물론 앞에 전처리기에 VUTPP_UNITTEST++를 선언함으로서 단위 테스트 목록정도는 가져올 수 있지만 이를 바인드해서 호출 결과를 가져올 수는 없다.

이를 위한 테스트 프로젝트의 main함수가 있는 파일에 아래 코드를 추가해야 한다.

 

  1. #include "TestReporter.h"

    using namespace UnitTest;
  2. class VUTPP_Reporter : public TestReporter
    {
    private:
        HANDLE m_WritePipe;

    public:
        VUTPP_Reporter(HANDLE writePipe) : m_WritePipe(writePipe){}
        ~VUTPP_Reporter() {}

        void ReportTestStart(TestDetails const& test) {}
        void ReportFailure(TestDetails const& test, char const* failure)
        {
            char writeBuffer[1024];
            sprintf( writeBuffer, "%d,%s,%s", test.lineNumber, test.filename, failure );
            DWORD dwWrite;
            if( WriteFile( m_WritePipe, writeBuffer, 1024, &dwWrite, NULL ) == false || dwWrite != 1024 )
                exit(-1);
        }
        void ReportTestFinish(TestDetails const& test, float secondsElapsed) {}
        void ReportSummary(int totalTestCount, int failedTestCount, int failureCount, float secondsElapsed) {}
    };
  3.  
  4. int main(int argc, _TCHAR* argv[])
  5. {
  6.     for( int i = 1; i < argc; i++ ) {
            if( strncmp (argv[i], "--vutpp:", 8 ) == 0) {
                std::string strVutppParam = argv[i] + 8;
                const size_t seperator = strVutppParam.find (',');
                if( seperator == std::string::npos )
                    return -1;

                HANDLE readPipe, writePipe;
                sscanf (strVutppParam.substr( 0, seperator ).c_str (), "%d", &readPipe);
                sscanf (strVutppParam.substr( seperator+1 ).c_str (), "%d", &writePipe);

                char readBuffer[1024], writeBuffer[1024];

                DWORD dwSize = 0;
                strcpy (writeBuffer, "connect");
                if( WriteFile (writePipe, writeBuffer, 1024, &dwSize, NULL) == false || dwSize != 1024 )
                    return -1;

                TestList& rTestList = Test::GetTestList ();

                while( true ) {
                    if( ReadFile (readPipe, readBuffer, 1024, &dwSize, NULL) == false || dwSize != 1024 )
                        return -1;

                    if( strncmp (readBuffer, "__VUTPP_FINISH__", 16 ) == 0)
                        break;

                    const char* pSeperator = strchr (readBuffer, ',');
                    std::string suiteName (readBuffer, pSeperator - readBuffer ), testName( pSeperator+1);

                    bool bRun = false;
                    Test* pTest = rTestList.GetHead ();
                    while( pTest != NULL ) {
                        if( pTest->m_details.testName == testName && pTest->m_details.suiteName == suiteName ) {
                            VUTPP_Reporter reporter (writePipe);
                            TestResults testResult (&reporter);
                            CurrentTest::Results () = &testResult;
                            pTest->Run();
                            strcpy (writeBuffer, "-1,");
                            bRun = true;
                            if( WriteFile (writePipe, writeBuffer, 1024, &dwSize, NULL) == false || dwSize != 1024 )
                                return -1;

                            break;
                        }

                        pTest = pTest->next;
                    }

                    if( bRun == false ) {
                        sprintf (writeBuffer, "%d,,%s", -2, "can't find test");
                        if( WriteFile (writePipe, writeBuffer, 1024, &dwSize, NULL) == false || dwSize != 1024 )
                            return -1;
                    }
                }
                return 0;
            }
        }

        return UnitTest::RunAllTests();
  7. }

 

위의 코드를 그냥 가져다가 붙이면 된다. 단위 테스트는 다른 파일로 구성해서 같이 링크만 하면 알아서 불러온다.

 

참고

[1] UnitTest++, http://unittest-cpp.sourceforge.net/

[2] vutpp, http://code.google.com/p/vutpp/

[2] 최재훈, 실전! 지속적인 통합 6편: 단위 테스트 1편 테스트 프레임워크 도입하기, http://kaistizen.net/EE/index.php/imaso/continuousintegration_2008_06/

 

 

 

이 글은 스프링노트에서 작성되었습니다.


크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > 개발도구들' 카테고리의 다른 글

NSIS Plugin 맹글기  (0) 2011/12/23
[UnitTest++] 사용하기 기초  (0) 2009/11/11
[NSIS] 다국어 라이센스 표시  (0) 2009/09/28
NSIS에서 윈도우 방화벽 제어 플러그인  (0) 2009/07/16
Eclipse용 Plugin  (0) 2009/06/19
Bash shell coloring  (0) 2009/01/05
Posted by ospace

댓글을 달아 주세요

작성일: 2009.09.28 (http://ospace.tistory.com/), ospace114@엠팔.컴


인터넷에 떠도는 Regular Expression 을 간단하게 정리해 보았다. 물론 좋은 것이 있다면 계속 정리할 계획이다.




전자우편 주소
/^[a-z0-9_+.-]+\\@([a-z0-9-]+\\.)+[a-z0-9]{2,4}$/

URL
/^(file|gopher|news|nntp|telnet|https?|ftps?|sftp):\\/\\/([a-z0-9-]+\\.)+[a-z0-9]{2,4}.*$/

XML 태그
/\\<(/?[^\\>]+)\\>/

전화 번호
/(\\d{3}).*(\\d{3}).*(\\d{4})/

날짜 - 예, 3/28/2007:
/^\\d{2}\\/\\d{2}\\/\\d{2,4}$/

jpg, gif 또는 png 확장자를 가진 그림 파일명:
/([^\\s]+(?=\\.(jpg|gif|png))\\.\\2)/

1부터 50 사이의 번호 - 1과 50 포함:
/^[1-9]{1}$|^[1-4]{1}[0-9]{1}$|^50$/

16 진수로 된 색깔 번호:
/#?([A-Fa-f0-9]){3}(([A-Fa-f0-9]){3})?/

적어도 소문자 하나, 대문자 하나, 숫자 하나가 포함되어 있는 문자열 - 올바른 암호 형식을 확인할 때 사용될 수 있음:
/(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,15}/




크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > Utility' 카테고리의 다른 글

Xming에서 Xwindow 설정과 eclipse 실행  (0) 2012/01/09
Xwindow에서 한글 폰트  (0) 2010/03/26
Regular Expression Tip & Tech  (0) 2009/09/28
Spec1  (0) 2009/07/25
도스창 팁: Command Prompt Tip  (0) 2008/12/24
[FreeMind] Flash Browser Testing  (0) 2008/12/10
Posted by ospace

댓글을 달아 주세요

작성일: 2009.09.28 (http://ospace.tistory.com/), ospace114@엠팔.컴


들어가기

다국어 라이센스라고 했지만, 언어별 인식을 하여 그때 필요한 파일을 읽어 온다. 추가 해당 언어마다 메시지를 정의해서 언어별로 사용는 방법도 간략하게 기술하겠다.


다국어 라이센스

사용법은 단순한다. 다음과 같다.

LicenseLangString license ${LANG_ENGLISH} license-english.txt
LicenseLangString license ${LANG_FRENCH} license-french.txt
LicenseLangString license ${LANG_GERMAN} license-german.txt
LicenseData $(license)

license라는 인자에 언어별로 정의해두었다.

다국어 메시지

다국어 역시 비슷하다.
LangString message ${LANG_ENGLISH} "English message"
LangString message ${LANG_FRENCH} "French message"
LangString message ${LANG_KOREAN} "Korean message"

MessageBox MB_OK "A translated message: $(message)"

message 인자에 각 언어별로 정의되어 있다.


결론

이를 파일을 나눠서 모듈화시킬 수 있지만, 각 언어별로 조금 지저분해지는 단점이 있습니다. 매번 LangString와 ${}를 붙여하는 것이지요. 아직 이를 분리해서 쉽게 사용하는 법은 아직 알지 못했습니다. 혹시 아시는 분이 게시면 메일로 날려주시면 매우 고맙겠습다.

내용이 허접한 것에 대해 죄송합니다. ㅡ.ㅡ; ospace.


참조

NSIS Help 문서


크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > 개발도구들' 카테고리의 다른 글

NSIS Plugin 맹글기  (0) 2011/12/23
[UnitTest++] 사용하기 기초  (0) 2009/11/11
[NSIS] 다국어 라이센스 표시  (0) 2009/09/28
NSIS에서 윈도우 방화벽 제어 플러그인  (0) 2009/07/16
Eclipse용 Plugin  (0) 2009/06/19
Bash shell coloring  (0) 2009/01/05
Posted by ospace

댓글을 달아 주세요



이상하게 Hyper Pi가 시장되지 않는다. 0.98에서는 실행까지 되는데, 중간에 이상 반응이 나타나면서 시작되지 않는다. 그래서  Super Pi를 2개 실행해서 선호 CPU를 선택하여 강제적으로 테스트했다.

크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > Utility' 카테고리의 다른 글

Xwindow에서 한글 폰트  (0) 2010/03/26
Regular Expression Tip & Tech  (0) 2009/09/28
Spec1  (0) 2009/07/25
도스창 팁: Command Prompt Tip  (0) 2008/12/24
[FreeMind] Flash Browser Testing  (0) 2008/12/10
DXVAChecker로 확인한 지원 HD 코덱  (0) 2008/10/31
Posted by ospace

댓글을 달아 주세요

작성일: 2009.07.16 (http://ospace.tistory.com/), ospace114@엠팔.컴

NSIS에서 제공되는 플러그인
  1. Simple Filewall: http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin
  2. NsisFirewall: http://nsis.sourceforge.net/NsisFirewall_plug-in
  3. Firewall Disabler: http://nsis.sourceforge.net/Firewall-Disabler_plug-in

그 중에서 3번은 방화면 사용 중지 시키는 것이므로 거의 필요 없기에 건너 뛴다. 그럼 1, 2번 플러그인을 사용하면 될 듯한다.
그중에서 2번 NsisFirewall을 선택했다.

그 이유는 Simple Firewall은 기능은 많지만 DLL파일 크기(175.5KB)가 크고, 언어가 Parscal로 되었으며, 사용법이 복잡하다.
NsisFilewall은 DLL파일 크기(8.0KB)가 작고, 언어가 C++로 되어 있으며, 사용법이 간단하다.


NsisFirewall 사용법(NSIS Plugin의 내용을 번역했습니다.)
방화벽에 응용프로그램을 허용리스트에 추가.
nsisFirewall::AddAuthorizedApplication "<application path>" "<rule name>"

방화벽에 응용프로그램을 허용리스트에서 제거.
nsisFirewall::RemoveAuthorizedApplication "<application path>"

<application path>은 네트워크를 사용하거나 혹은 접속요청을 처리하는 응용프로그램의 절대 경로를 사용한다.
<rule name>은 방화벽 제어판 목록에 표시되는 예외 목록에 표시되는 제목이다.

반환값
위의 두가지 함수를 정수형의 상태 값을 스택의 탑으로 반환한다.
가능한 상태 값으로:
0: 성공적으로 수행
<0: 에러 발생(이 값은 HRESULT 에러 코드로 MSDN에서 자세한 정보를 찾아볼수 있다.) >0: 절대 반환되지 않은 값( 양의 HRESULT 값은 성공을 의미한다)
참조

[1] Category:Plugins - NSIS, http://nsis.sourceforge.net/Category:Plugins
[2] NsisFirewall plug-in, http://nsis.sourceforge.net/NsisFirewall_plug-in



크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > 개발도구들' 카테고리의 다른 글

[UnitTest++] 사용하기 기초  (0) 2009/11/11
[NSIS] 다국어 라이센스 표시  (0) 2009/09/28
NSIS에서 윈도우 방화벽 제어 플러그인  (0) 2009/07/16
Eclipse용 Plugin  (0) 2009/06/19
Bash shell coloring  (0) 2009/01/05
[CUnit]C에서 Unit test 하기  (0) 2008/12/31
Posted by ospace

댓글을 달아 주세요


Visual Swing Designer





크리에이티브 커먼즈 라이선스
Creative Commons License

'5.개발환경 및 도구 > 개발도구들' 카테고리의 다른 글

[NSIS] 다국어 라이센스 표시  (0) 2009/09/28
NSIS에서 윈도우 방화벽 제어 플러그인  (0) 2009/07/16
Eclipse용 Plugin  (0) 2009/06/19
Bash shell coloring  (0) 2009/01/05
[CUnit]C에서 Unit test 하기  (0) 2008/12/31
프로그래밍용 폰트  (0) 2008/12/11
Posted by ospace

댓글을 달아 주세요