2016. 5. 24. 01:03

최근에 libzdb 를 사용하는 프로젝트를 진행하면서 언젠가 써먹을 데가 또 생길 것 같아 정리 한다.


DB는 oracle 지원에 관한 내용을 추가한다.


기본적으로 libzdb 컴파일 하는데 필요한 명령어는 단 3줄이면 끝난다.


[설치]

 # ./configure

 # make

 # make install

- 이대로 하면 일단 컴파일은 된다.



오라클DB를 사용할 경우, ./configure 목록에 ORACLE 이 ENABLE 되어 있어야 한다.


오라클 활성화를 위해 필요한 옵션 및 프로그램.

 # rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
 # rpm -ivh oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm


1번째 줄이 instant client 이고, 2번째 줄이 include 항목들이다.

모두 설치 하자.



configure 설정 시 필요한 옵션설정

 --with-oci=no
 --with-oci-include=/usr/include/oracle/12.1/client64
 --with-oci-lib=/usr/lib/oracle/12.1/client64/lib


단 3줄 인데, 간단한 설명을 첨부 하자면...

1번째 줄의 옵션을 yes 로 주면 하단의 2줄은 무효가 되는 듯 하다. 즉 ORACLE_HOME 의 환경변수를 따라간다는 뭐 그런 내용인것 같은데...;;


1번째 울의 옵션을 no 로 주면 2, 3번째 줄에서 지정한 include 경로와 lib 경로를 따라 간다.

여기서는 직접 찾아서 정의해 주고 가는 것으로 한다.


저 경로는 직접 찾은 것이므로 사용하는 운영체제의 버젼에 따라 다를 수도 있다.

RedHat Linux에 rpm 설치 한 결과 이다.


컴파일 결과물 설치 경로는 --prefix=/home/user/compile 과 같이 설정 에 추가하면 된다.


전부 종합하면 아래와 같이 된다.

 # rpm -ivh oracle-instantclient12.1-basic-12.1.0.2.0-1.x86_64.rpm
 # rpm -ivh oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm


 # ./configure --with-oci=no --with-oci-include=/usr/include/oracle/12.1/client64 --with-oci-lib=/usr/lib/oracle/12.1/client64/lib --prefix=/home/user/compile


 # make


 # make install

이렇게 정상적으로 모두 완료 되면 컴파일된 결과물이 /home/user/compile 로 들어가게 된다.




[참고]

README
./configure --help

http://docs.oracle.com/cd/B19306_01/server.102/b14357/ape.htm#CHDJCDFA




Posted by 해비
2015. 3. 15. 23:59


비트 연산자


&

 AND 연산

|

 OR 연산

^

 XOR 연산

~

 비트 반전 0 <-> 1

<<

 왼쪽으로 비트열 이동

>>

 *오른쪽으로 비트열 이동

* 음수의 경우 오른쪽으로 비트열 이동시 MSB가 바뀌어지는 경우가 있으므로 주의.




AND 연산

둘 다 1이면 1, 그렇지 않으면 0



OR 연산

둘 중 하나가 1이면 1, 둘다 0이면 0



XOR 연산(*)

다르면 1, 같으면 0



~ 연산

0 이면 1, 1이면 0




이게 뭐 ? 라고 생각할 수도 있겠지만...

간단히 말하자면 1 Byte 공간을 예로 들면 1 Byte = 8 Bit 이다.


예를들어 저 8개의 0 또는 1 조합을 이용하면, 우리는 8개의 True / False 값을 저장하는 변수를 단지 1 Byte 로 해결 볼 수 있다는 의미이다.





Posted by 해비
2015. 3. 15. 23:24



초기화 하지 않은 변수의 값을 출력하면 쓰레기 값이 출력된다고 알고 있었는데...


vs2013 에서는 변수가 초기화 되지 않았다고 빌드 자체를 거부한다.

1>------ Build started: Project: ex211, Configuration: Debug Win32 ------

1>  ex211.c

1>d:\vs2013\ex211\ex211\ex211.c(10): error C4700: uninitialized local variable 'num2' used

1>d:\vs2013\ex211\ex211\ex211.c(10): error C4700: uninitialized local variable 'num1' used

========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

 




<< 소스코드 >>

#include <stdio.h>

int main(void)

{


int num1;

int num2;


printf("%d %d", num1, num2);


return 0;

} 

- 초기화 하지 않은 변수 num1, num2를 사용하는 소스코드




vs2013 에서 확인된 내용인데... 다른 컴파일러에서는 어찌 반응할지 찾아봐야 겠다.


직접 시도 안해 봤으면 그냥 예전 지식 그대로 알고 있을 뻔 한 사건;;


역시 직접 부딪혀 보는게 최고~!!




Posted by 해비
2014. 7. 7. 17:30

실행파일 매개변수1 매개변수2 ... 여러개 넣어 실행하게 되면 이것을 출력해 주는 소스

#include <stdio.h>

int main(int argc, char **argv)
{
    int i;

    for (i=0; i < argc; i++)
    {
        printf("argv[%d] = %s\n", i, argv[i]);
    }

    return 0;
}



출력 예

> test0316.exe 1 2 3 "4 5 6"
argv[0] = test0316.exe
argv[1] = 1
argv[2] = 2
argv[3] = 3
argv[4] = 4 5 6




Posted by 해비
2014. 7. 7. 17:29


파일의 내용을 매개변수로 받아서 출력해 준다.

#include <stdio.h>
 
int main(int argc, char **argv)
{
    FILE *pFile = NULL;

    if(argc < 2)
    {
        printf("File Viewer v0.1 [USAGE] testcon1 [FILENAME]\n");
    }
    else
    {
        pFile = fopen(argv[1], "r");
    }

    if( pFile != NULL )
    {
        char strTemp[255];
        char *pStr;
 
        while( !feof( pFile ) )
        {
            pStr = fgets( strTemp, sizeof(strTemp), pFile );
            //printf( "%s", strTemp );
            printf( "%s", pStr );
        }
        fclose( pFile );
    }
    else
    {
        //에러 처리
        printf("Error - can not open file. \n");
    }
 
    return 0;
}


while 문 안에서 eof 가 아닌동안 계속해서 fgets 로 내용 읽어다가 출력을 반복하고 있다.

strTemp 의 크기가 255 이므로 254자(255번재는 마지막을 표시하는 문자) 단위로 읽어서 화면에 뿌려준다.



Posted by 해비
2014. 6. 11. 15:16



[1]

int main(int argc, char *argv[])


[2]

 int main(int argc, char **argv)


[1]로 하든 [2]로 하든 실제 컴파일 하여 실행해 보면 결과는 동일 했다.

인터넷 검색에서도 둘은 같은 내용이라는 것을 볼 수 있었으나, 직접 눈으로 확인하고 싶어서 아래의 과정을 거쳐 확인을 해 보았다.



확인방법은 gcc로 어셈변환 해서 어셈된 결과를 가지고 비교하는 것으로 하였다.

소스 는 아래와 같다.

argv.c

argv2.c

 #include <stdio.h>

int main(int argc, char *argv[])
{
        return 0;
}

 #include <stdio.h>

int main(int argc, char **argv)
{
        return 0;
}

표시된 부분이 차이점.



그리고 이것을 어셈변환한 결과 비교

어셈에 사용한 명령어
$ gcc -S -o argv.s argv.c



WinMerge로 비교 결과, 파일명을 제외한 모든 부분이 완전히 동일하다.

어셈코드가 동일하므로, 기계어로 컴파일되는 최종 결과물 또한 동일하다고 할 수 있다.





참고1. 두 구문의 동일성에 대한 내용은 StackOverflow 의 아래 링크에서 확인 하였습니다.
http://stackoverflow.com/questions/16666353/what-does-char-argv-means




Posted by 해비