프로젝트 생성후에 메뉴바에 보면

프로젝트 -> Porjcet Options -> Run Option을 선택 하면 아래와 같은 화면이 나옵니다.


2번 옵션을 꺼주면 Application에 출력화면나온다...
저 옵션은 콘솔 화면을 따로 출력할때 세팅해야하는건데 따로 콘솔창을 띄우기 위해서는 콘솔창 프로그램을 설치해줘야 한다.
서버 프로그래머라면 거의 입력하는 일이 없기에 2번 옵션을 끄고 진행하면 될꺼 같다...

1번 같은 경우는 실행 위치를 지정 하는것이기에 저걸로 옵션 맞춰줘야 한다.

by 널부러 2009. 10. 7. 14:44

Windows가 @#!^!%!@#$%!@.exe에서 중단점을 트리거했습니다.

힙이 손상되었거나 @#!^!%!@#$%!@.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다.

자세한 진단 정보는 [출력] 창을 참조하십시오.

---------------------------------------------------------------------------------------
위와 같은 에러가 난다면 보통 DLL에서 동적 메모리 생성한걸 Exe에서 삭제하거나
그 반대 경우에 발생하는 에러이다

하지만 DLL를 쓰지 않은 상황에서 에러가 난다면 다음 상황을 먼저 생각하라

나는 lib라이브러리를 사용하여 exe프로젝트를 생성했는데 위와 같은 에러가 발생했다..

에러의 원인은 동적으로 할당한 크기보다 더 크게 초기화를 하는 작업을 하여 할당한 크기보다 힙을 더 사용한 상황이고
그런 상황에서 삭제를 하면서 저런 에러가 발생했다..

다시 정리하자면 동적으로 할당한 메모리 크기가 10이라고 하면
초기화(Zeromemory 함수 사용)할때 20으로 초기화 하고
삭제를 하면서 발생한 문제이다.

고로 DLL(혹은 lib)쪽 에러를 의심하기 전에 초기화를 할당한 크기만큼 제대로 초기화 하고
삭제 했는지 확인해보자
!!!

이 에러를 잡아주신 회사 실장님에게 감사드리며...

에러 원인을 알았을때 좀 쪽팔렸다..

아무튼 프로그램의 보통 큰 원인은 이런 단순 실수로 발생하는게 많으니 앞으로 주의하며 코딩해야겠다 ㅠ.ㅠ






by 널부러 2009. 8. 21. 12:08
에 정말 할줄 몰라서 정말 애먹었네 -_-
아무튼 처리한방법에 대해서 일단 정리해 둔다.

일단 svn 서버 파일을 받아야 한다.
Subversion 다운로드 경로 : http://subversion.tigris.org/ (설치 파일 찾을려면 좀 뒤저야 한다.)
Subversion Manager 다운로드 경로 : http://www.pyrasis.com/ (메인 화면에 바로 있다.)

일단 2개의 파일을 받으면 먼저 Subversion을 설치 한다.
그 다음에 Subversion Manager를 설치 한다.

설치하고 나면 저장소를 만들어야 하는데 command 명령으로 아래와 같이 입력 해주자.
아래와 같이 저장소를 만들면 파일시스템으로 저장한다.
(버클리 DB를 이용할라면 svnadmin create --fs-type bdb sample 실행해줘야한다.)
C:\Documents and Settings\Administrator>cd \

c:\>mkdir repos

c:\>cd repos

c:\repos>svnadmin create sample
그럼 폴더가 sample 폴더에 저장소가 생긴다.
그럼 권한 설정이나 이런걸 해줘야한다.
생성한 저장소 폴더 하위 폴더중에 conf 폴더가 있다.
그럼 authz, passwd, svnserve.conf 3개의 파일이 있는데 세팅을 바꿔줘야한다.

먼저 svnserve.conf 파일을 열어보면 아래와 같은 세팅이 되어있다.
초기에 아래내용은 다 #으로 주석 처리 되어있다 풀어주어야 원하는데로 세팅 가능하다.
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = sample Repository
#익명의 사용자 접근을 막는다.
#접근 가능한 사용자는 쓰기 권한을 준다.
#접근 가능 계정 목록과 비밀번호 관리하는 파일명
#경로 기반 접근 제어를 위한 인증 규칙을 설정하는 파일명
#저장소 이름(프로젝트가 여러개면 꼭 바꿔주자 UID 역활함)

계정을 만든다면 passwd 파일을 열어서 아래와 같이 넣어주자
계정 = 비밀번호
예) test = 1111

authz 파일은 계정의 폴더 접근 권한을 세팅하는데 이건 생략한다.

세팅이 끝나면 매니저를 실행해서 폴더 위치를 설정해주고 Start로 실행하면 된다
(자세한 설명은 http://www.pyrasis.com/ 가면 볼수 있다.)

서버는 세팅이 끝났으면 클라이언트 깔아서 접속하면 된다..
하는 방법은 그닥 어렵지 않으니 클라이언트 설명은 생략한다...
(메뉴도 한글로 나오니 좀 삽질 해보면 답나옴..)
by 널부러 2009. 5. 22. 15:44

에... 혹시 압축하는 일이 있으면 이걸 사용 하면 된다.

zlib 1.2.3 버전 (출처 : http://www.zlib.net/ )

프로젝트 속성에서 ( C/C++ -> 코드 생성 -> 런타임 라이브러리) 설정은
각 컴파일 상태에 따라 세팅 해주어야 합니다.
그래야 충돌 메시지가 나오지 않습니다.

debug   컴파일 : 다중 스레드 디버그(/MTd)
release 컴파일 : 다중 스레드(/MT)

- 기본 파일
zlib.lib  <- Visual Studio 2005에서 LIB Release 컴파일한 lib 파일
zlibd.lib <- Visual Studio 2005에서 LIB Debug 컴파일한 lib 파일
zconf.h   <- minigzip 프로젝트의 헤더파일
zlib.h    <- minigzip 프로젝트의 헤더파일
vc80.pdb  <- debug로 컴파일시 없으면 link4099 에러남..
vc80.idb  <- debug로 컴파일시 없으면 link4099 에러남..

- 내가 만든 파일 - 압축 함수를 class로 구성한것밖게 없음...
zlibManager.cpp 
zlibManager.h

샘플코드는 귀찮아서 안만들련다..
CZlibmanager 클레스에 보면 함수가 딱 2가지 있는데..
그거 사용 하면 된다... 어렵지 않으니까 그냥 쓰면 될듯...

link4099 에러 나는것때문에 pdb,idb 파일을 넣어뒀다...
솔직히 무시해도 되는 에러인데 링크에러는 pragma를 이용해서는 무시가 되지 않는다. -_-;
(참 그지같아 MS 링크 에러도 막아줘야 할꺼 아냐 -_-;)

아무튼 필요하면 쓰기 바란다...

by 널부러 2009. 5. 21. 18:01

< 문제 현상 >

mysql> delimiter |
mysql> CREATE FUNCTION bonjour (s CHAR(20)) RETURNS CHAR(50)
    -> RETURN CONCAT('Bonjour, ',s,'!');
    -> |
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)


 

< 문제 해결 >

show global variables like 'log_bin_trust_function_creators';

-> 옵션이 ON인지 OFF인지 알수 있다.


SET GLOBAL log_bin_trust_function_creators = 1; 하면 ON
SET GLOBAL log_bin_trust_function_creators = 0; 하면 OFF


ON일때만 function을 생성할 수 있는 것입니다.

출처 : http://blog.daum.net/z-dream/16803946
by 널부러 2009. 4. 28. 13:56
유니코드와 멀티코드(안시코드)를 쉽게 바꿀때 사용 하는 USES_CONVERSION 매크로가 있는데
사용할때 #include <atlconv.h> 링크 하고 아래와 같이 사용하면 된다.
#include <atlconv.h>

USES_CONVERSION;

TCHAR widechar[]=L"sample";
char ansichar[10];
ansi = W2A(widechar);

하지만 간혹 헤더만 링크 시키고 아래와 같은 에러가 발생할때가 있다.
 1>xxxxx.obj : error LNK2001: "unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)" (?g_pfnGetThreadACP@ATL@@3P6GIXZA) 외부 기호를 확인할 수 없습니다.

이런 에러가 발생할 경우에는 라이브러리 파일이 링크가 안되서 발생하는 문제이다
아래와 같이 라이브러리 파일을 링크 해주면 된다.
#pragma comment (lib, "atls.lib")


by 널부러 2009. 4. 20. 17:39
에 템플릿을 사용하면서 발생하는 문제가 생겨서 정리 해본다.

template < class T >
calss test
{
     std::queue< T > m_queue;
     T Pop()
     {
        if( m_Queue.empty() )
            return NULL;

        T data = m_Queue.front();
        m_Queue.pop();
        return data;
    }
}

예를 들어 위와 같은 template가 있다고 치자
그래서 아래와 같이 사용한다.
 int temp;
test<int> val;
temp = val.pop();
이런식으로 정적인 자료형을 선언 하면 값을 받아오는것이 가능하다
위에서는 queue에 값을 넣은게 없으니 그냥 NULL 값을 받을것이다.

하지만 문제가 되는건 아래와 같은 상황이다
 struct testTemplet
{
     int a;
     int b;
}

testTemplet temp;
test<testTemplet> val;
temp = val.pop();
코드상으로는 이상이 없어보이지만 컴파일러에서는 에러가 발생한다.

컴파일러 에러 내용은 아래와 같다.
 원인: 'int'에서 'const testTemplet'(으)로 변환할 수 없습니다.
소스 형식을 가져올 수 있는 생성자가 없거나 생성자 오버로드 확인이 모호합니다.

에러원인으로 생각되는것은 구조체형은 NULL이라는 값을 알수가 없기에 발생하는 문제이다.
동적으로 생성한다면 이와 같은 문제는 발생하지 않는다.
하지만 정적일 경우에는 위와 같은 코드로는 프로그램을 작성할수가 없다

일단 임시 방편으로 값을 받아오는 방법을 바꾸서 처리하니 해결은 되었지만 뭔가 그리 깔끔하지 않은거 같아 찝찝하긴 하다
아래는 내가 해결한 방법에 대해서 적어보겠다.
 template < class T >
calss test
{
     std::queue< T > m_queue;
     bool Pop( T& data )
     {
        if( m_Queue.empty() )
            return false;

        data = m_Queue.front();
        m_Queue.pop();
        return true;
    }
}

 struct testTemplet
{
     int a;
     int b;
}

testTemplet temp;
test<testTemplet> val;
if( true == val.pop( temp ))
{
    printf("정상적으로 값을 받음");
}
else
{
    printf("값을 받지 못했음");
}

이방법 말고 해결 방법이 있다면 누가 좀 알려주기 바란다.


by 널부러 2009. 3. 26. 16:23
음 이것에 관련해서는 온라인서버제작모임에 명예의전당에 올라온 "Ciritical Section을 이용한 동기화 처리법"
을 보고 좀 고민하다가 리플에 GPG에 관련 또 글이 있어서 그거보고 제가 초금 개조 해봤습니다..

GPG에서 참고 한 글 링크 : http://www.gpgstudy.com/forum/viewtopic.php?t=10593
코딩할때 참고 한 글 링크 : http://ricanet.com/new/view.php?id=blog/050807
                                     http://ricanet.com/new/view.php?id=blog/050811a

class는 CCriticalSection 과 CSynchronized 2가지를 이용합니다.
 class CCriticalSection
{
private:
    CRITICAL_SECTION m_cs;

public:
    CCriticalSection(void)
    {
        ::InitializeCriticalSection( &m_cs );
    }
   
    virtual ~CCriticalSection(void)
    {
        ::DeleteCriticalSection( &m_cs );
    }

    void Lock(void)
    {
        ::EnterCriticalSection( &m_cs );
    }

    void Unlock(void)
    {
        ::LeaveCriticalSection( &m_cs );
    }
};

 class CSynchronized
{
private:
    CCriticalSection* m_pLock;

public:
    CSynchronized(CCriticalSection* _pLock) : m_pLock(_pLock)
    {
        m_pLock->Lock();
    }

    virtual ~CSynchronized(void)
    {
        m_pLock->Unlock();
    }

    operator bool()
    {
        return false;
    }
};

그리고 좀 깔끔하게 쓰기 위해서 define을 사용 하는데 아래와 같습니다.
 #define SYNCHRONIZED_BLOCK(CSif(CSynchronized _lock = CS) {} else   

자 이것에 대한 설명을 하자면
CriticalSection을 사용하다보면 EnterCriticalSection()걸고 LeaveCriticalSection()를 실행하지 않아 데드락에 빠지는
상황이 발생 할수 있습니다. 그것을 코드적으로 방지 하기 위해 생성자와 소멸자를 이용해서 만든것이 CCriticalSection 과 CSynchronized 입니다.


일단 간단하게 사용 방법을 설명하자면 아래와 같이 class에 CriticalSection을 상속 받습니다.
 class CTest :public CCriticalSection
{
public:
    CTest(void);
    ~CTest(void);

    char temp[128];
};

CriticalSection을 이용 할때는 아래와 같이 사용합니다.

CTest
test;                                                          // 변수 선언

{
     CSynchronized sync( &test );                           // EnterCriticalSection 실행

     sprintf( test.temp, "테스트 아햏햏");                   //  작업
     printf("%s\n", test.temp);
}                                                                       // LevelCriticalSection 실행


하지만 위와 같은 방식은 코드를 보기에 뭔가 좀 직관적이지 않아서 (직관적이지 않다는것은 중괄호 안에 Lock를 사용한다고
선언하는것을 말함) Define을 사용해서 요것을 좀 바꿔본것입니다.
 
CTest
test;                                                          // 변수 선언

SYNCHRONIZED_BLOCK( &test )                          // EnterCriticalSection 실행
{
     sprintf( test.temp, "테스트 아햏햏");                   //  작업
     printf("%s\n", test.temp);
}                                                                       // LevelCriticalSection 실행


by 널부러 2009. 3. 11. 18:03
에 오늘 아는 횽님이 http로 파일 다운로드 하는 모듈 함 만들어 봐라 해서
집에와서 씻고 한 3시간 만에 대충 어떻게 만들어야 하는지 알아낸거 같다 -_-
그래서 정리 해본다.

일다 사용한것은 wininet 함수를 사용하였다.
대략 함수의 중요 요점만 정리 해보겠다.

1. InternetOpen() 함수
   웹서버에 접속하기 위해 최초로 만드는 핸들이다. 이건 뭐 특별할꺼 없으니 패스

2. InternetOpenUrl() 함수
   url 경로를 입력해주면 url에 걸려있는 파일을 바로 열수 있는 함수다 이놈은 초금 중요하다
   보통 3,4 인자값은 NULL, 0 값을 주는데 이놈에게 값을 주면 이어 받기가 가능하다.
   주는 방법은 소스를 정리해서 나중에 주석으로 설명해주겠다.

3. InternetQueryDataAvailable() 함수
   위대한 win32api 정복에는 다음과 같이 설명되어있다.
   요청된 파일의 몇 바이트나 전송할 준비가 되었는지를 두번째 인자에 리턴 해준다 라고
   뭐 웹서버에서 보낸 패킷의 크기가 얼마나 되는지 알려주는거 같다.

4. InternetReadFile() 함수
   요함수는 따로 책에는 설명이 없는데 웹서버가 보낸 패킷을 받는 부분 같다
   뭐 정확하게는 모르겠지만..

5. HttpQueryInfo() 함수
    음 이건 InternetOpenUrl()가 리턴한 인스턴스 핸들 가지고 이용하면 되는건데
    파일의 크기를 알아낼수 있는 함수 인거 같다 다른 기능도 있는거 같은데
    파일 크기는 이걸로 알아낼수 있는거 같다.

일단 필요했던 http 다운로드 기능은 요 5가지 함수를 이용하면 금방 만들꺼 같다
뭐 거기에 더 필요한건 파일 쓰기 정도 -_-
아까 이어 받기 테스트 하는데 가끔 파일을 이상하게 받을때가 있던거 같은데
수작업으로 해서 그렇수도 있으니까
뭐 클래스로 만드는건 천천히 하면 될꺼 같다...

아무튼 한번도 안해봐서 못할줄 알았는데 역시 책보고 데브피아 찾아보고 하면 안되는건 없다...
다음에 올리면 클래스로 만든 소스를 함 올려보도록 하겠다 언제가 될진 나도 잘 모르지만..


by 널부러 2009. 2. 4. 01:26
출처 : http://unix.co.kr/

1. vi의 시작

명령어

작업 설명

vi filename

파일 열기, 작성

vi +18 filename

18행으로 파일 열기

vi +/"string" fn

"string"의 처음발생 단어부터 열기

vi -r filename

손상된 파일 회복

view filename

읽기 전용으로 파일 열기


2. 커서의 이동 명령

명 령 어

작 업 설 명

h(←)
j(↓)
k(↑)
l(→)

왼쪽으로 커서 이동
아래로 커서 이동
위로 커서 이동
오른쪽으로 커서 이동

w
b

한 단어 오른쪽으로 커서 이동
한 단어 왼쪽으로 커서 이동

^
$

라인의 처음으로 이동
라인의 마지막으로 이동

H
M
L

화면의 맨 위로 이동
화면의 중간으로 이동
화면의 맨 아래로 이동

Ctrl+F
Ctrl+D
Ctrl+B
Ctrl+U

한 화면 뒤로 이동
반 화면 뒤로 이동
한 화면 앞으로 이동
반 화면 앞으로 이동


3. 문자와 행삽입

명 령 어

작 업 설 명

a

커서 오른쪽에 문자 삽입

A

커서 오른쪽, 행의 끝에 문자 삽입

i

커서 왼쪽에 문자 삽입

I

커서 왼쪽, 해의 처음에 문자 삽입

o

커서 아래에 행 삽입

O

커서 위에 행 삽입

<ESC>

작업 종료후 <ESC> 입력


4. 텍스트 변경

명 령 어

작 업 설 명

cw (종료 :ESC)

단어 변경

R (종료 :ESC)

현재 커서 위치부터 대체

r

커서 위치 문자를 다른 문자로 대체

~

문자형(대, 소문자)변경

J

현재 행과 아래 행 결합

u

이전 명령 취소


5. 텍스트 삭제

명령어

작 업 설 명

x

문자 삭제

dw

단어 삭제

dd

행 삭제

D

커서 오른쪽 행 삭제

;5, 10 d

5-10번째 삭제


6. 텍스트 복사 및 이동

명 령 어

작 업 설 명

yy

행 yank

Y

행 yank

p

yank되거나 삭제된 행 현재 행 아래에 삽입

P

yank되거나 삭제된 행 현재 행 위에 삽입

:1,2 co 3

1-2행을 3행 다음으로 복사

:4,5 m 6

4-5행을 6행 다음으로 이동


7. 행 번호 설정

명 령 어

작 업 설 명

:set nu

행 번호 표시

:set nonu

행 번호 숨기기


8. 행 찾기

명 령 어

작 업 설 명

G

파일의 마지막 행으로 가기

21G

파일의 21번째 행으로 가기

:n

n 라인으로 가기


9. 탐색 및 대체

명 령 어

> 작 업 설 명

/string

> string 탐색

?string?

> string 역방향 탐색

n

> string의 다음(이전) 계속 탐색

:g/search-string/s//

replace-string/gc

각 발생 탐색 후 확인하고 대체

:s/str/rep/

> 현재 행의 str을 rep로 대체

:1,.s/str/rep/

> 1부터 현재 행의 str을 rep로 대체

:%s/str/rep/g

> 파일 전체 str을 rep로 전부 대체

10. 파일을 파일로 삽입

명령어

> 작 업 설 명

:r filename

> 커서 다음에 파일 삽입

:34 r filename

> 파일을 34번째 행 다음에 삽입

 


by 널부러 2008. 10. 22. 14:04
| 1 ··· 3 4 5 6 |