[C/C++] expression1 ? expression2 : expression3;

개발 노트 2009. 1. 5. 16:32 posted by 무병장수권력자



작성자 : 김문규
최초 작성일 : 2009. 1. 5

if(expression1)  var = expression2;
else var = expression3;

예를 들면....

if(y < 10) x = 20;
else x = 40;



x = (y<10) ? 20 : 40;

는 같다.


[C/C++] 가변 개수의 매개 변수 값 입력 받기

개발 노트 2009. 1. 5. 15:40 posted by 무병장수권력자


작성자 : 김문규
최초 작성일 : 2009. 1. 5

매우 허접한 소스코드이지만 실제로 사용법을 아는데는 전혀 문제가 없기에 그냥 올립니다.

3가지 api가 존재합니다.
 - va_start 로 변수 초기화
 - va_arg 로 변수 획득
 - va_end 로 변수 해제

#include <stdio.h>
#include <stdarg.h>

int function(const char* format, ...)
{
    va_list p_arg;
    printf("%s\n", format);
    va_start(p_arg, format);
    printf("%s\n", va_arg(p_arg, char*));
    printf("%s\n", va_arg(p_arg, char*));
    printf("%s\n", va_arg(p_arg, char*));
    printf("%s\n", va_arg(p_arg, char*));
    va_end(p_arg);
    return 0;
}
int main()
{
    function("%s", "kim", "moon", "kyu");
    return 0;
}

결과를 볼까요?
va_arg가 범위가 넘어가니깐 엉뚱한 곳을 가리킨다는 점에 주목하시기만 하면 됩니다.

그래서 대부분은 첫번째 인자를 예제 처럼 format으로 정의해서 형과 개수를 알아낸 후 이에 맞추어서 사용해야 합니다. (printf의 format을 사용하시는 것도 좋은 방법이 아닐까요? 이 부분은 실제 개발 시 적절하게 만들어서 사용하세요.)

[root@localhost Programming]# ./a.out
%s
kim
moon
kyu
U‰åWVSèPy


[C/C++] base64 인코딩과 디코딩 구현

개발 노트 2008. 12. 18. 17:12 posted by 무병장수권력자


작성자 : 김문규
최초 작성일 : 2008.12.18

인터넷을 뒤지다보니 좋은 소스를 발견했고, 그 소스를 이용하는 방법을 간단하게 소개합니다.
base64 인코딩의 원리에 대해서 알고 싶으시다면 아래 링크를 클릭하세요~
http://www.iamcorean.net/130



라이브러리 출처 :
http://wiki.kldp.org/wiki.php/CSocketFAQ

#include <stdafx.h>
#include <string.h>
#include <stdlib.h>
/*------ Base64 Encoding Table ------*/
static const char MimeBase64[] = {
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
    'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
    'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
    'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3',
    '4', '5', '6', '7', '8', '9', '+', '/'
};
/*------ Base64 Decoding Table ------*/
static int DecodeMimeBase64[256] = {
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 00-0F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 10-1F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,  /* 20-2F */
    52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,  /* 30-3F */
    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,  /* 40-4F */
    15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,  /* 50-5F */
    -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,  /* 60-6F */
    41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,  /* 70-7F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 80-8F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* 90-9F */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* A0-AF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* B0-BF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* C0-CF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* D0-DF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,  /* E0-EF */
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1   /* F0-FF */
    };
int base64_decode(char *text, unsigned char *dst, int numBytes )
{
  const char* cp;
  int space_idx = 0, phase;
  int d, prev_d = 0;
  unsigned char c;
    space_idx = 0;
    phase = 0;
    for ( cp = text; *cp != '\0'; ++cp ) {
        d = DecodeMimeBase64[(int) *cp];
        if ( d != -1 ) {
            switch ( phase ) {
                case 0:
                    ++phase;
                    break;
                case 1:
                    c = ( ( prev_d << 2 ) | ( ( d & 0x30 ) >> 4 ) );
                    if ( space_idx < numBytes )
                        dst[space_idx++] = c;
                    ++phase;
                    break;
                case 2:
                    c = ( ( ( prev_d & 0xf ) << 4 ) | ( ( d & 0x3c ) >> 2 ) );
                    if ( space_idx < numBytes )
                        dst[space_idx++] = c;
                    ++phase;
                    break;
                case 3:
                    c = ( ( ( prev_d & 0x03 ) << 6 ) | d );
                    if ( space_idx < numBytes )
                        dst[space_idx++] = c;
                    phase = 0;
                    break;
            }
            prev_d = d;
        }
    }
    return space_idx;
}
int base64_encode(char *text, int numBytes, char **encodedText)
{
  unsigned char input[3]  = {0,0,0};
  unsigned char output[4] = {0,0,0,0};
  int   index, i, j, size;
  char *p, *plen;
  plen           = text + numBytes - 1;
  size           = (4 * (numBytes / 3)) + (numBytes % 3? 4 : 0) + 1;
  (*encodedText) = (char*)malloc(size);
  j              = 0;
    for  (i = 0, p = text;p <= plen; i++, p++) {
        index = i % 3;
        input[index] = *p;
        if (index == 2 || p == plen) {
            output[0] = ((input[0] & 0xFC) >> 2);
            output[1] = ((input[0] & 0x3) << 4) | ((input[1] & 0xF0) >> 4);
            output[2] = ((input[1] & 0xF) << 2) | ((input[2] & 0xC0) >> 6);
            output[3] = (input[2] & 0x3F);
            (*encodedText)[j++] = MimeBase64[output[0]];
            (*encodedText)[j++] = MimeBase64[output[1]];
            (*encodedText)[j++] = index == 0? '=' : MimeBase64[output[2]];
            (*encodedText)[j++] = index <  2? '=' : MimeBase64[output[3]];
            input[0] = input[1] = input[2] = 0;
        }
    }
    (*encodedText)[j] = '\0';
    return size;
}

int _tmain(int argc, _TCHAR* argv[])
{
 char* plain_text = "테스트Test`1234567890-=\[];',./";
 char* b64encoded_text = NULL;
 printf("plain text\n");
 printf("%s\n\n", plain_text);
 // base 64 인코딩
 // base64_encode(평문을 가리키는 포인터, 평문 길이, b64 인코딩 결과문을 가리키는 포인터)
 // 3번째 인자는 이중 포인터임에 유의해야하며, base64_encode 함수 내부에서 메모리가 할당되므로, 외부에서 꼭 해제 시켜야 한다.
 int len_b64_encoded = base64_encode(plain_text, strlen(plain_text)+1, &b64encoded_text);
 printf("b64 encoded text\n");
 printf("%s\n\n", b64encoded_text);
 // base 64 디코딩
 // 적절한 길이의 메모리 공간을 확보하고
 // 해당 공간에 디코딩된 결과를 받습니다.
 unsigned char *dst = (unsigned char*)malloc(1000);
 int len_b64 = base64_decode(b64encoded_text,dst,1000);
 printf("b64 decoded tex\n");
 printf("%s\n\n", dst);
 if(dst != NULL) free(dst);
 if(b64encoded_text != NULL) free(b64encoded_text);
 getchar();
 return 0;
}


[Unix] VI에서 ^M 넌 누구냐?

개발 노트 2008. 12. 4. 10:58 posted by 무병장수권력자



작성자 : 김문규
최초 작성일 : 2008.12.04

아무래도 VI는 불편할 수 있습니다. 그래서 윈도우에서 소스코딩 작업을 하고 컴파일만 유닉스에서 하는 분들도 꽤 많지요.

이 때 가끔 나타나는 황당한 녀석이 있지요.

^M   <-- 넌 누구냐?


행의 끝마다 달려 있는 저 녀석! 시스템에 따라서는 저것때문에 에러가 나기도 합니다.
CR/LF 때문이지요. (CR:Carrige Return, LF:Line Feed)

해결책은 다음과 같습니다.

1. vi를 이용
:%s/^M//g
이걸 실제로 입력할 때는
:%s/(control을 누른채 v와 m을 차례로)//g

2. vi 5.0이상인 경우
:set fileformat=unix
:set fileformat=dos

3. 쉘에서
sh# dos2unix 문서명
sh# unix2dos 문서명

4. ultraedit
menu -> format -> Convert CR/LFs to Wrap
menu -> format -> Convert Wrap to CR/LFs

이제 고민 끝입니다. ^^


[Unix] find 명령어 잘쓰기

개발 노트 2008. 12. 4. 10:42 posted by 무병장수권력자


작성자 : 김문규
최초 작성일 : 2008.12.04

1. find는?
find는 파일 찾는 유틸입니다.

2. 사용법

Usage: find path-list [predicate-list]

검색 조건

 -name filename  파일 이름으로 찾는다.
 -atime +n  access time 이 n일 이전인 파일을 찾는다.
 -atime -n  access time이 n일 이내인 파일을 찾는다.
 -mtime +n  n일 이전에 변경된 파일을 찾는다.
 -mtime -n  n일 이내에 변경된 파일을 찾는다.
 -perm nnn  파일 권한이 nnn인 파일을 찾는다.
 -type x  파일 타입이 x인 파일들을 찾는다.
 -size n  사이즈가 n이상인 파일들을 찾는다.
 -links n  링크된 개수가 n인 파일들을 찾는다.
 -user username  user이름으로 찾는다.
 -group groupname  group 이름으로 찾는다.


처리 방법
 -print  찾은 파일의 절대 경로명을 화면에 출력한다.
 -exec cmd {};  찾은 파일들에 대해 cmd 명령어를 실행한다.


3. 예시
sh# find . -name *test* -print
-> 현재 폴더 아래에 있는 파일 중에 이름에 test를 포함하는 모든 파일을 화면에 출력한다.

sh# find . -type d -print
파일 타입이 d인 파일을 찾아 경로명을 화면에 출력한다.

sh# find . -perm 700 -print
파일 권한이 700인 파일을 찾아준다.

sh# find . \ ( -perm 400 -o -perm 200 ) -print
파일 권한이 400인 파일과 200인 파일을 찾아준다.
(주의 : "\"의 앞뒤에 space 가 반드시 있어야 한다.)

sh# find . -name core -exec ls -l {} \;
이름이 core인 파일을 찾아서 ls -l 한다.

4. 중요한 예시 하나 더

find . -type f | xargs grep "검색어"

검색어를 내용에 포함하는 파일을 찾아서 보여 줍니다.




HP-UX 에서 소프트웨어 설치/삭제 하기

개발 노트 2008. 12. 4. 10:19 posted by 무병장수권력자


작성자 : 김문규
최초 작성일 : 2008.12.04

HP-UX는 패키지 소프트웨어 설치/삭제하는 방식이 좀 특이해 보입니다.
그래서 이 부분을 설명하려 합니다.

1. 먼저 소프트웨어를 다운로드 받습니다.

아주 좋은 미러 싸이트
http://hpux.cs.utah.edu/

2.
xxxx.depot.gz 라는 파일을 다운로드 하시게 됩니다.
gz는 당연히 gzip 압축을 말하는 것이고, depot 은 뭘까요? depot은 HP의 독자적인 패키징 시스템입니다.

3.
다운로드 받은 폴더에서
sh# gzip -d xxxx.depot.gz
gz가 떨어져 나간 depot 만 남습니다.

4.
sh# swinstall -s /절대경로/xxxx.depot.gz
화려하진 않지만 나름 편한 설치 위저드가 뜹니다.
방법은 사용해 보시면 금방 아실 겁니다.

5.
그리고 마지막으로 이를 지우고 싶다면?
sh# swremove
이거는 정말 좋습니다. 윈도우 같은 느낌이랄까 ^^


'개발 노트' 카테고리의 다른 글

[Unix] VI에서 ^M 넌 누구냐?  (0) 2008.12.04
[Unix] find 명령어 잘쓰기  (0) 2008.12.04
Apache에 시스템 환경 변수 전달 하기  (0) 2008.12.02
Linux 랑 좀 다른 AIX 써보기  (0) 2008.11.24
초! 간단 CSS  (0) 2008.11.20


Apache에 시스템 환경 변수 전달 하기

개발 노트 2008. 12. 2. 15:58 posted by 무병장수권력자


작성자 : 김문규
최초작성일 : 2008.11.26

시스템의 공유 라이브러리를 사용할 경우,
아파치 웹서버 또는 톰캣이 공유 라이브러리를 찾도록 하게 하기 위해서는 LD_LIBRARY_PATH를 환경 변수로 인식해야 합니다.
이외에도 특정 모듈들을 사용할 경우에 원하는 환경 변수를 아파치 웹서버 또는 톰캣이 인식해야 할 경우가 있습니다.

이 때, 다음처럼 변수를 넘기시면 되지요.

1. 아파치 웹 서버
. 새로운 변수를 선언하고 싶은 경우

SetEnv LD_LIBRARY_PATH /usr/lib:.......

. 시스템 변수를 그대로 가져오고 싶은 경우

PassEnv LD_LIBRARY_PATH

이렇게 하시면 아파치 웹 서버를 구동시키는 계정의 환경변수에 있는 해당 값을 그대로 가져 옵니다.

2. 톰캣 서버
톰캣의 경우 실행하는 계정의 환경 변수가 그대로 인식이 됩니다.
즉, env 명령어로 확인하셨을 때 존재하는 환경 변수일 경우 그대로 인식이 됩니다.

'개발 노트' 카테고리의 다른 글

[Unix] find 명령어 잘쓰기  (0) 2008.12.04
HP-UX 에서 소프트웨어 설치/삭제 하기  (0) 2008.12.04
Linux 랑 좀 다른 AIX 써보기  (0) 2008.11.24
초! 간단 CSS  (0) 2008.11.20
apache에서 CGI 설정하기  (0) 2008.11.11


Linux 랑 좀 다른 AIX 써보기

개발 노트 2008. 11. 24. 13:33 posted by 무병장수권력자


AIX (Linux 랑 좀 다른...)

써보니 기존에 제가 Linux에서 사용하던 것과는 좀 다른 것들이 보입니다.
제가 무지해서일 수도 있습니다. ^^ 그냥 참고만 하세요.
생기는 데로 추가하도록 합니다.

1. tar.gz 해제

tar xvfz ***.tar.gz가 안 먹습니다. 그래서 찾아보니 아래와 같이 사용하는군요.. 흠 불편한걸요..
gzip -dc ***.tar.gz | tar -xvf -

2. tar.bz2 해제
마찬가지 입니다.
bzip2 -dc ***.tar.gz | tar -xvf -

3. 네트워크 관리자 실행
smitty mktcpip

4. 파일 시스템 관리
smitty j2fs
여기서 파티션의 사이즈도 원할 때 바꿀 수 있고 백업 등의 기능도 수행합니다.
이거 참 편합니다. 좀 찾아보니 이것을 저널링 파일 시스템이라고 하더군요. ^^;
(더 찾아보니 리눅스 ext3에서도 이를 사용할 수 있다고 합니다. 근데 몰랐습니다. ^^; 무지해서...
그런데 많은 분들이 불안하다는 군요...)







초! 간단 CSS

개발 노트 2008. 11. 20. 13:22 posted by 무병장수권력자


가끔 사용하지만 아주 유용하다는...
필요할 때 찾아쓰기! ^^

설명은 생략!

<style>
 BODY {background : #ffffff; margin : 10px; padding : 0px; }
 BODY,TD,DIV,LI,TABLE,INPUT {font : 12px tahoma,돋움,굴림; color : #444444; }
 TABLE { border-collapse:collapse; border-color:black; table-layout:fixed; word-break:break-all;}
 A:LINK {color: #0000ff; text-decoration: none; }
 A:VISITED {color: #0000ff; text-decoration: none; }
 A:ACTIVE {color: #0000ff; text-decoration: none; }
 A:HOVER {color: #813888; text-decoration: underline; }
</style>



apache에서 CGI 설정하기

개발 노트 2008. 11. 11. 20:19 posted by 무병장수권력자


httpd.conf 를 찾아서 다음의 내용을 수정해 주세요.

1. CGI 확장자를 처리하도록
아래의 내용을 검색하셔서 주석 해제하시고..
#    AddHandler cgi-script .cgi
--> 이것은 cgi로 끝나는 문서를 CGI로 처리하겠다는 뜻입니다.

2. CGI 실행 폴더 옵션 설정
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

이 부분 아래에 아래와 같은 형식으로 cgi를 허용해주고 싶은 디렉토리를 설정해주면 됩니다.
예를들어 /home 디렉토리이하에 cgi를 허용해주고 싶으면 아래와 같이....

<Directory /home>
    Options Includes ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>