태그 미디어로그 위치로그
'개발자 세상'에 해당되는 글 25건
소셜 데이터 스크랩 잘하기
개발자 세상

블로그나 트위터, 소셜네트워크서비스(이하 SNS) 많이 사용하시죠?

SNS나 블로그에서 글이나 트윗을 읽다가 유익하다 싶고 재미있다 싶은 글 들을 스크랩 해본 경험이 있을 겁니다. 그러나! 이런 자료들을 스크랩하기 만만찮았죠. 복사해서 붙여 넣기도 한 두번이고, 이곳 저곳 저장하다 보면 나중에 찾기도 힘들고, 결국에는 나의 소중한 폴더를 더럽히는 쓰레기가 되는 안타까운 상황이 대부분입니다. 오늘은 이런 문제를 깔끔이 해결하고, 자료관리에 도움도 되는 유용한 서비스들과 활용하는 팁을 알려드리고자 합니다.

스크랩의 정석은?
스크랩의 정석은 첫째! 한 곳으로 여러정보를 모아두는 것입니다. 둘째! 잘 찾아서 쓰는 것이지요. 오늘은 첫번째 이야기를 하도록 하겠습니다.

스크랩북 고르기 
모으고 모을 자료는 인터넷에 널려있습니다만, 오늘 모을 자료의 소스는 두 가지만 고르겠습니다.
하나는 “트위터”, 다른 하나는 “구글리더” 입니다.
트위터는 단문 SNS이지요. 구글리더는 관심있는 블로그들을 모아 볼 수 있는 서비스입니다.
다음으로 스크랩 한 내용을 모아 놓을 저장소를 골라 봅시다. 바탕화면?, 내 문서? PC에서만 자료를 모으기에는 무언가 아쉽습니다. 또, 스마트폰에서만 쓰자니 작은 화면이 몹시 답답합니다.
이럴 때…! 답은 클라우드 서비스입니다.

저는 “에버노트”를 120% 추천합니다.

스마트폰, PC, 웹등의 다양한 도구로 언제든지 반짝 떠오른 좋은 생각을 기록할 수 있습니다. 물론, 스크랩에도 훌륭한 도구임에는 틀림없습니다. 웹 클립핑(스크랩)툴도 제공합니다. 스마트폰에서 기록하고, 여러분 앞의 PC에서도 볼 수 있죠.

저는 이것으로 골랐습니다.

일단 PC버젼을 설치하도록 합시다. 자세한 설치방법 및 소개는 여기서!
http://www.evernote.com/

트윗? 블로그? 어떻게 스크랩하지?

자료 소스(source)는 “트위터”와 “구글리더”, 스크랩북은 “에버노트”로 골랐습니다.

관심있는 트윗과 블로그 글을 어떻게 스크랩할까요?
‘복사&붙여넣기’ 우리 이제 이런거 쓰지 말자고요. 트위터와 구글리더 모두 관심있는 글을 체크해놓기 위한 방법을 제공합니다. 트위터의 Favorite과 구글의 stared 입니다. 물론 아이콘 모양은 둘다 별 모양입니다.
만약 여러분이 관심있는 트윗이나 블로그를 보게 된다면 이제 Favorite버튼과 별표를 누르자고요! 그러면 바로 에버노트로 스크랩이…. 물론 안됩니다. 헐…

서로 다른 서비스들을 연결해줄 무언가가 필요합니다.
그런 서비스가 여기있습니다.

바로 ifttt 입니다.
오늘 소개하는 서비스 중 마지막 4번째 서비스입니다.


“if this then that”라는 의미입니다. 간단히 설명하면 “this 상황이 발생하면 that을 실행해라.”라는 의미입니다. 예를 들어 “내가 트위터에서 favorite(별표)를 누르면, 에버노트에 저장해라.”와 같은 의미를 if this then that으로 표현할 수 있겠죠. 말로쓰면 복잡한 로직을 그림으로 간단하게 표현합니다.
이런 방식으로 만든 간단한 로직은 ifttt에서 태스크(Task)라고 합니다. 잊지마세요. Task!

우리가 이 서비스를 이용해서 만들 로직은 두 가지입니다.

“내가 트위터에서 favorite(별표)를 누르면, 에버노트에 저장해라.”
“내가 구글리더에서 stared(별표)를 누르면, 에버노트에 저장해라.”

1. 가입하기
여기서 가입합니다.
https://ifttt.com/join
가입까지 하셨나요? 처음 뜨는 화면은 사용방법입니다. 저는 영어 잘 못해서 해석은 넘어가도록해요.

2. 채널추가하기
채널은 this와 that에 들어가는 서비스들을 의미합니다. 우리가 사용하는 서비스는 ‘트위터’, ‘구글리더’, 그리고 ‘에버노트’입니다. 각각의 로고들을 클릭하고 “Active”하여 ifttt에서 사용할 수 있도록 인증 해봅시다. 서비스 마다 인증하는 방식은 조금씩 다를 수 있습니다. 인증이 성공하여 활성화 된 채널들은 아래 그림과 같이 컬러풀하게 변하게 됩니다.



/ifttt에서 사용가능한 서비스 들/

코끼리노트를 인증화면을 같이 볼까요? 아래 그림과 같습니다. 채널상태(Channel Status)는 ACTIVE로 나타내고 아래 Actions에 있는 행동들을 사용할 수 있게 됐습니다.



/인증된 코끼리노트/

3. 서비스 연결하기
이제는 서비스들을 연결할 차례입니다. 두 가지 방법이 있습니다. 하나는 남들이 만들어서 공개한 “Recipe”를 이용하는 방법. 다른 하나는 내가 필요한 것은 직접 만드는 방법. 간단한게 좋지 않겠습니까?

Recipe 메뉴로 갑시다. 아래 그림과 같이 보이는 것 두 가지를 클릭하여 선택합니다. 개별 페이지의 밑으로 내려가서 “Create Task”를 눌러줍니다. 다른 사람의 Recipe로 여러분의 Task가 만들어졌습니다.

/구글리더에서 별표친 것을 노트로 보내줘요/

/트위터의 좋아하는 트윗을 노트로 보내줘요/

만약 여러분의 Task가 회색이라면 동작중이 아닙니다. 전원 버튼 모양의 아이콘을 눌러 Task를 동작시켜주세요.
준비는 여기까지 입니다. 먼 길을 왔습니다.
조금더 구체적인 방법은 여기 블로그(http://neatgirl.tistory.com/87)를 참조하여 주세요.

유용하게 활용하기
** 활용1 **
자. 일단 화장실에 앉아서 빠르게 트위터를 흝습니다.
링크 내용까지 화장실에 앉아서 보긴 그렇고 관심있는 트윗들은 일단 ‘별’ 버튼을 눌러 기록해놓습니다.
자리에 돌아와서 PC에서 Evernote로 바로! 편하게 봅니다.

/아이폰에서 별 버튼 누르기/

/에버노트에서 편하게 봅시다~/

** 활용2 **
저는 회삿 일에 관심이 많습니다. 알티베이스 매니아! 구글리더로 회사 블로그도 열심히 스크랩~, 트위터도 열심히 스크랩~ 페이스북*도 열심히 스크랩~

/Altistory Blog/

/구글리더 스크랩, 에버노트에서../

*Facebook도 연결해 보세요!

마지막으로.
DBMS와 관계 없는 소셜 서비스를 다루는지 궁금하실 것 입니다. 마지막 한 문장으로 정리하겠습니다.
다음 포스팅을 기대해 주세요~ ;)


변하는 것과 변하지 않는 것을 구분하는 프로그래밍
개발자 세상
C언어는 컴퓨터 역사의 초기에 개발된 언어입니다. 최신 언어들이 개발 편의를 위해 제공하는 기능들도 없고 문법도 사람보다는 기계에 더 친화적입니다. 그래서 개발자 스스로 철학을 가지고 사용해야하는 언어입니다. C/C++로 개발하는 우리 회사에서 제가 배운 개발 철학중 하나는 “변하는 것과 변하지 않는 것을 구분하자” 입니다. 음과 양이 모든 사상의 밑바탕을 이루듯이 언어나 개발 제품에 상관없이 적용할 수 있는 철학이기도 합니다.
최신 언어들이 제공하는 기능들이나 프로그래밍 기법들을 보면 가장 밑바당에는 “변하는 것과 변하지 않는 것을 구분”하는 개념이 녹아들어있습니다. 객체지향 철학에서 객체가 가지는 속성은 변하는 것이고 속성을 변경하는 메소드는 변하지 않는 것입니다. 객체라는 틀은 변하지 않는 것이고 객체로 생성한 인스턴스는 변하는 것입니다. 함수형 언어들은 함수를 변하지 않는 것으로 생각하고 함수에 입력되는 데이터를 변하는 것으로 생각합니다. 디자인 패턴 기법들을 보면 변하지 않는 코드와 변하는 코드를 분리하는 것이 핵심 개념인 패턴들이 많습니다. 설계 원칙에도 Data driven design이라는 원칙이 있는데 이것또한 최대한 고정된 논리로 다양한 데이터를 처리한다는 원칙입니다. 바꿔 말하면 일정한 코드를 가지고 최대한 다양한 데이터를 처리하도록 하자는 것입니다.
이런 예들을 따져보면 형태가 변하지 않거나, 값이 변하지 않거나, 실제로 생성되는 것이 아니라 생성되는 것들이 공통적으로 가져야할 원칙이거나, 보이지 않게 밑바탕에서 일정하게 동작하는 것 등을 “변하지 않는 것”, 혹은 음적인 부분이라고 부를 수 있습니다. 그와 반대로 형태가 변하거나 값이 변하거나, 실제로 생성되어 각자 고유한 값이나 속성을 가지는 개체, 겉으로 드러나 사용자가 조정할 수 있는 값이나 속성들이 양적인 부분, “변하는 것”이라고 부를 수 있습니다.
예제 코드를 보면서 C언어로 프로그래밍에서 음과 양을 어떻게 나눌 것인지를 고민해보겠습니다. 정답은 없습니다만 고민하는 것 자체로 많은 생각을 이끌어낼 수 있는 실마리가 될 것이라 믿습니다. 비록 간단한 예제를 작성하는 단계에서 “변하는 것과 변하지 않는 것을 구분”하는 일을 연습하지만 사실은 제품을 설계할때부터 코드를 작성할 때까지 계속 고민해야할 사항입니다.
보통 if-else가 길어지면 안좋다고 합니다. 왜냐면 비교와 분기에 사용되는 어셈블리 명령어들이 실행 속도가 느리기 때문이라고 합니다. 그리고 분기 명령어가 사용되면 캐시나 파이프라인에 영향을 줘서 코드 전체의 실행 속도를 늦춘다고 말합니다.
그런데 비교나 분기에 사용되는 어셈블리 명령어들은 다른 명령어에 비해 느리지 않습니다. RISC에서는 당연하고 CISC머신에서도 명령어간의 실행 속도가 차이나던 시대는 지났습니다. 예전 i386 메뉴얼을 보면 명령어마다 실행 속도가 몇 클럭인지 표시되어있지만 최신 인텔 프로세서들은 실행속도에 대한 표시도 없어졌습니다. 명령어의 인자가 메모리를 읽어야되는 경우 메모리 읽기에 필요한 시간이 더 걸릴뿐 명령어 자체의 실행 시간은 다르지 않습니다.
그리고 분기 명령이 캐시나 파이프라인에 영향을 주는 것이 맞긴 하지만 그 영향은 다른 방법으로 줄일 수 있습니다. 컴파일러들의 최적화 기법들이나 프로세서가 지원하는 분기 예측, 분기되는 지점들을 기억하는 Branch Target Buffer 등 다양한 기술들이 개발되서 분기 명령이 성능을 저하시키는 것을 줄여주고 있습니다. 성능 측정 결과 병목이 되는 코드가 아니라면 if-else가 길어진다고해서 성능상에 큰 문제가 되지 않습니다.
제가 생각하는 if-else의 문제점은 코드가 유연해지지 못하게해서 변하는 것과 변하지 않는 것들이 섞여서 변하는 것들을 바꾸기 어렵게 만든다는 것입니다. 간단한 예제를 보여드리겠습니다.
void handle_error0(void)
{
    printf("Handle Error #0\n");
}
void handle_error1(void)
{
    printf("Handle Error #1\n");
}
void handle_error2(void)
{
    printf("Handle Error #2\n");
}
void handle_error3(void)
{
    printf("Handle Error #3\n");
}

void bad_error_process(int err)
{
    if (err == 0)
    {
        handle_error0();
    }
    else if (err == 1)
    {
        handle_error1();
    }
    else if (err == 2)
    {
        handle_error2();
    }
    else if (err == 3)
    {
        handle_error3();
    }
    else
    {
        printf("Unidentified error\n");
    }
}
함수를 호출하고 결과값을 확인하는 코드입니다. 특정 값마다 에러를 처리하는 함수가 따로 있어서 에러 값을 확인하고 에러 처리 함수를 호출합니다. 이정도의 if-else는 갯수도 적고, 읽기도 어렵지 않기때문에 이렇게만 작성하고 마는 경우가 많습니다. 그런데 여기에는 변하는 것과 변하지 않는 것이 섞여있습니다. 에러 코드와 에러 처리 함수는 에러 코드의 갯수가 늘어날 수도 있고 에러 처리 함수가 바뀔 수도 있기 때문에 변하는 것이고 에러 값에 따라 해당 처리 함수를 호출한다는 정책은 변하지 않는 것입니다. 에러 코드를 추가할 때는 else if를 추가해야하고, 에러 처리 함수의 이름이나 형태가 바뀌면 함수 호출 부분을 찾아서 수정해야합니다. 1번과 2번 에러 사이에 에러를 추가해서 2번 에러를 3번 에러로 바꾸려면 여러 줄의 코드를 수정해야합니다. 또 에러 처리 정책이 달라지면 코드 전체를 다시 써야할 수도 있습니다. 변하는 것이 변할수록 이 코드는 점점 더 변화하기 어렵고 위험한 코드가 될 것입니다.
변하는 부분과 변하지 않는 부분을 구분한 코드를 보겠습니다.
void good_error_process(int err)
{
    typedef struct err_table
    {
        int err_num;
        void (*err_handler)(void);
    } err_table;

    int i;

    err_table table[] =
    {
        {0, handle_error0},
        {1, handle_error1},
        {2, handle_error2},
        {3, handle_error3}
    };

    for (i = 0; i < sizeof(table)/sizeof(err_table); i++)
    {
        if (err == table[i].err_num)
            table[i].err_handler();
    }

}
에러 번호와 에러 처리 함수의 쌍을 따로 분리해서 관리함으로서 에러 자체에 대한 데이터와 에러를 처리하는 코드를 분리했습니다. 에러 코드나 처리 함수가 바뀔때마다 하나의 테이블만 수정하면 됩니다. 또 에러 처리 정책이 바뀌면 for 루프 부분을 수정하면 됩니다. 변화에 유연하게 대처할 수 있는 코드가 됩니다.
유연성을 더 늘릴 수 있는 방법이 많을 것입니다. 다음은 테이블 자체까지도 유연해지도록 시도한 코드입니다.
#define MAX_ERROR_NUM 3
typedef struct err_table
{
    int err_num;
    void (*err_handler)(void);
} err_table;
err_table global_err_table[MAX_ERROR_NUM+1];

#define SETUP_ERR_TABLE(num,handler) \
    global_err_table[num].err_num = num;                             \
    global_err_table[num].err_handler = handler;
#define CALL_ERR_HANDLER(num) global_err_table[num].err_handler()

void another_error_process(int err)
{
    /* separate table setup and table reference */
    SETUP_ERR_TABLE(0, handle_error0);
    SETUP_ERR_TABLE(1, handle_error1);
    SETUP_ERR_TABLE(2, handle_error2);
    SETUP_ERR_TABLE(3, handle_error3);

    CALL_ERR_HANDLER(err);
}
만약 에러 처리에 에러 코드와 처리 함수뿐이 아니라 추가적인 데이터가 필요하다고 한다면 에러 코드와 함수로 만들어진 테이블 구조또한 바껴야 할 것입니다. 그렇다면 good_error_process함수는 전체가 다 바뀔 수밖에 없습니다. another_error_process함수는 테이블의 설정에 대한 인터페이스를 만들었습니다. 따라서 테이블의 구조가 바뀌면 SETUP_ERR_TABLE 매크로 함수의 내부를 수정하면 되므로 another_error_process함수의 변화를 줄일 수 있습니다. 또 another_error_process함수 밖에서도 에러 테이블을 셋업할 수 있으므로 에러를 관리하기 위한 프레임이 생기기 시작합니다.
이렇게 변하는 것과 변하지 않는 것을 구분하고 변하는 것을 관리하는 인터페이스를 작성하고 좀더 추상화 레벨을 높이다보면 그것 자체가 프레임웍이 되는 것을 경험할 수 있습니다. 인터페이스나 프레임웍을 만들어야할 때 너무 머리속으로만 디자인하지말고 실제로 반복적으로 사용하는 코드를 만들어보고 변하는 것과 변하지 않는 것을 구분해보는 것도 좋은 방법이라고 생각합니다.


찰진 회의를 위한 알티베이스의 노력
개발자 세상

오늘 프로젝트 요구사항 수집 회의가 제 생각에 제법 잘 진행되서 이곳에 적어보려합니다. 알티베이스의 회의 문화 뿐 아니라 개발 문화에 대해서 어느정도 설명되는 일화라고 생각이 됩니다. 세부사항은 빼고 간단히 말씀드리겠습니다.

어떤 오래된 이슈가 있습니다. 제품 전체에 영향을 미치면서도 다양한 해결방법들이 개발된 상태입니다. ‘다양한’이라는 표현에서 알 수 있듯이 뾰족한 해결책은 없는 문제입니다. 오랫동안 이 이슈가 지속되어왔고 이번 기회에 통합적으로 해결해보고자 요구사항을 수집하기 시작했습니다. 일차적으로 글로 요구사항을 수집했습니다. 처음에는 늘 그렇듯이 애매모호한 요구사항들이 개발자들의 독특한(?) 문체로 기록되었습니다. 우리는 ‘빠른’, ‘효율적인’, ‘멀티코어에서’, ‘다양한’ 이런 단어들이 문장에 들어가면 전가의 보도같은 만능 솔루션이 된다는걸 잘 알고 있습니다. (개발자의 남다른 글쓰기 문화에 대해서도 한번 글을 써봤으면 좋겠다는 생각이 드네요. 아마 아주 다양한 사례들을 쓸 수 있을것 같습니다.)

어쨌든 저는 요구사항들을 보고 다음과 같은 메일을 보냈습니다.

“프로젝트 요구사항에 대한 리뷰 회의를 하겠습니다. 현재 개별적으로 수집된 요구사항들이 명확하지 않습니다.”

그리고 회의 시작전 저는 다음 질문에 대한 해답을 얻겠다는 다짐을 했습니다.

“문제가 무엇이고 프로젝트의 목표는 무엇인가? 우리는 문제를 옳바르게 이해하고 있는가? 우리가 문제라고 생각한 것이 진정한 문제인가? 우리가 생각한 문제의 원인이 진짜 원인이 맞는가? 우리가 제시한 요구사항이 문제 해결에 정말 필요한 요구사항인가? 요구사항중에 우선적으로 해결되야할 것은 무엇이고, 부가적인 요구사항은 무엇인가?”

요구사항을 제시한 분들이 모두 모였고, 각 사람이 돌아가며 자신이 제시한 요구사항을 다시 설명했습니다. 역시 각자의 기준과 관점에 따라 다르게 해석할 수 있는 사항들이 발견되었습니다. 그래서 우선 요구사항에 대해 각자의 기준을 맞춰야했습니다. 예를 들어 ‘빨라야한다’라는 요구사항은 결국 아무것도 요구하지 못합니다. 현재의 해결책이 그분에겐 느리지만 다른 누군가에게는 충분히 빠른 것일 수 있기 때문입니다. 또 ‘멀티코어에서 빨라야한다’도 아무런 의미가 없는 말입니다. 얼마나 어떻게 빨라야하는지 기준이 없기 때문입니다. ‘CPU갯수에 따라 선형적인 성능 증가가 있어야 한다’나 ‘초당 10만번 이상의 처리’, ‘10us 이하의 응답속도’와 같이 정확한 기준을 제시해야합니다. 그래야 개발된 솔루션이 요구사항에 맞는지 확인할 수 있습니다.

이렇게 모든 요구사항에 대해 모든 사람이 동일한 기준을 가지고 이해할 수 있도록 토론을 했습니다. 또한 진정한 문제가 무엇인지, 지금까지의 솔루션은 어떤 문제를 해결했고, 어떤 원인으로 현재의 문제가 발생했는지에 대해 시니어 개발자의 설명을 들었습니다. 그렇게 문제를 이해하고 요구사항에 대해 동일한 기준을 가지고나니 정작 중요한 요구사항을 간과하고 있었고, 제시된 요구사항들에 대해 수정이 필요하다는 것을 알았습니다. 만약 이런 회의가 없었다면 개발한 솔루션이 정말 필요한 해결책이 아닐 수도 있었을 것입니다.

회의가 끝나고 저는 회의 결과를 문서로 만들면서 사실상 솔루션의 디자인이 끝났음을 깨달았습니다. 모두가 문제를 정확하게 파악하고나니 (역시 개발자답게) 자연스럽게 해결책에 대한 이야기가 오고가서 저 혼자 고민할 필요없이 자연스럽게 여러 사람의 지혜가 모아져 개발 방향을 잡을 수 있었기 때문입니다. 남은 일은 실질적으로 문제를 해결할 알고리즘을 선정하고 요구사항에 맞게 인터페이스를 도출하는 일뿐이었습니다. 결국 생각했던 것보다 개발 기간을 단축할 수 있었고, 정말 다른 개발자들에게 도움이 되는 솔루션이 될것이라는 희망이 생겼습니다. 저는 제가 혼자서 기획한 것보다 더 좋은 솔루션을 만들 수 있어서 좋고, 회사는 정말 필요한 솔루션을 개발할 수 있어서 좋은 일입니다. 무엇보다도 저는 보람을 느끼고 행복해져서 좋았습니다.



지금 일하러 갑니다

옛날옛날 제가 대한민국 모처의 던전에서 전투(일)할때의 경험입니다. 회의 시간에 들어올땐 마음대로 들어왔겠지만 나갈땐 안되지요. 관계자도 아닌데 전체 공지메일을 받아서 눈치보며 참석한 사람들이 대부분이었습니다. 회의시간동안 여긴 어딘지 난 누군지 모른체 책상밑에 전화기만 멀뚱멀뚱보고 나오는 일이 많았습니다. 정확한 목표가 없이 시작된 회의는 당연히 말꼬리잡기와 감정싸움으로 채워지고, 다음 회의 시간을 잡는 것으로 끝났었습니다. 그리고 막내가 배포한 회의록이 회의 결과의 전부였습니다. 이걸 회의를 위한 회의를 한다고 말하기도 하지요.

그 던전에서 저는 앞으로 내가 회의를 이끌게되면 어떻게 회의를 해야할지 고민을 했었습니다. 그리고 오늘 이 원칙에 따라 회의를 했습니다. 대단한건 아니지만 소개해보겠습니다.

  • 회의의 목표에 대해 단정적인 명제로 설명한다.
  • 이 설명에 따라 공지를 본 사람은 자신이 관계자임을 스스로 판단해서 자발적으로 참석하도록 한다.
  • 회의가 끝날땐 반드시 대답이 되어야할 질문을 미리 준비한다.
  • 모든 참석자가 돌아가면서 준비된 질문에 대답한다.

우리 회사는 직급이 없고 서로를 ‘누구누구님’으로 호칭하며 나이도 묻지 않는 문화를 가지고있습니다. 이런 평등하고 자유로운 알티베이스의 개발 문화가 이런 대수롭지 않은 원칙하에서도 결론을 내는 회의를 할 수 있게 해주었습니다. 사실은 어떤 원칙을 가지고 있느냐가 중요한게 아닐것입니다. 어떤 분위기에서 회의를 하느냐가 더 중요할 것입니다. 개발자가 행복하려면 우선 사람으로써 행복한 일터에서 개발해야합니다. 그러면 개발자로써도 행복해질 수 있습니다. 사람이 사람답게 일하는 회사에서 개발자도 행복을 느끼며 개발할 수 있습니다. 저는 이 글을 보시는 모든 분께 던전을 클리어하시고 사람이 사는 곳으로 나오시길 권합니다.

이로써 행복에 대한 별것없는 글을 마치고 C프로그래밍 노하우에 대한 글을 연재할 계획입니다. 많이 읽어주시길 부탁드립니다.

개발자의 성장에 이어 개발자의 행복에 관해.
개발자 세상

 개발자도 사람이므로 사람으로써 성장하는 길이 개발자로써도 성장하는 일이다..라는 별로 재미없는 글을 올렸었습니다. 블로그 관리자님께서 글도 지루한데 이미지라도 하나 넣어야되지 않겠느냐라는 언론의 자유를 탄압하는 메시지를 주시네요^^. 어쩌겠습니까. 직장인이 까라면 까야지요.

이렇게 블로그에 글 하나 쓰는 것도 회사 분위기도 봐야되고 눈치도 봐야되고 직장인이란 힘든 것이지요. 그래서 어떻게하면 개발자로써 행복해질까에 대한 작은 의견을 제시해보고자합니다. 개인적인 의견이므로 정확한 해법을 알고싶으신 분은 전문가와 상담하시길 바랍니다. 사실성장은 해서 잘나가는 개발자가 되긴했는데 나는 디게 불행하고 사는 재미가 없다면 무슨 소용이 있겠습니까. 이왕이면 잘나가는 개발자이기도하면서 인생이 행복하면 좋겠지요. 성공한 연예인 재벌들이 잘못된 선택을 하는 것들을 우리는 많이 보고 있습니다. 우리가 봤을 때는 돈도많고 명예도 있고 부족할게없어 보이는데 그들 자신은 너무나 불행했었나봅니다.

사람이 어느때 행복할까요? 많은 심리학자, 철학자 분들께서 많은 정의를 내려주셨는데 저는 2가지를 가장 염두에 두고있습니다. 그 2가지가 인정과 가치입니다. 다른 사람들이 인정해주는 것은 남으로부터 얻을 수 있는 행복이고, 내가 가치있다고 생각하는 것을 하는 일이 내가 만들 수 있는 행복이라 생각합니다. 이 2가지, 인정과 가치라는 관점에서 개발자의 삶을 돌이켜보면 개발자의 행복에 대해 그 일부나마 알게되지 않을까요?

개발자로써 인정을 받는 일은 아무래도 회사에서 가장 기회가 많을 것 같습니다. 개발자로써 내가 일한 결과물이 주변 동료와 선후배의 칭찬을 받을 때, 일년간 나의 노력으로 회사가 성장해서 사장님이 연봉을 올려줄때 (혹은 보너스가 나올때..회사 생활에 최고의 행복입니다!!), 내가 만든 제품을 사용하는 사람을 만나서 내가 그 제품을 만들었다고 자랑할 수 있을 때 (오히려 욕먹으면??), 이렇게 누군가에게 인정을 받을 때 “아..개발시작하길 잘했다” 아니면 “그래도 노력한 결과가 나와서 좋다”같은 생각을 하게됩니다. 기분 좋은 일이지요.

그런데 문제가 있습니다. 회사에서 인정받을 기회가 너무 적습니다. 사실은 적다기보다는 욕만 안먹으면 다행입니다. 그래서 인정받을 때 더 기쁘지만 충분히 행복해지지 않습니다.

며칠전 승승장구라는 TV 프로에서 어떤 심리학 박사님이 말씀하시더라구요. 자신만의 행복한 일상을 찾으라구요. 그 박사님은 노천카페에서 수첩에 글을 쓸때, 아내가 아침밥을 차려줘서 아침을 먹을 때 행복을 느낀다고 하셨습니다. 그래서 매일 아침밥을 먹고 시간을 꼭 내서 글을 쓰고 수첩도 자주 바꾸고 글을 쓸 만년필도 수집한다고 하십니다.

우리 개발자들은 자신들만의 가치를 찾아야합니다. 업무외에 나름의 행복을 찾아야합니다. 어떤 분들은 오픈소스 개발을 합니다. 자신이 관심있고 깊이 파고들고싶은 분야나 제품을 골라서 깊이 연구하거나 개발해서 결과물을 공개합니다. 꼭 공개해서 널리 알려지거나 뭔가를 이루는게 재미가 아니라 그냥 내 자신이 내가 의미있다고 생각하는 일을 하는 것자체가 그 분들에게는 행복입니다. 어떤 분은 블로그에 IT관련 소식을 모아서 올리십니다. 우리 팀 팀장님은 운동을 하십니다. 좀더 무거운 쇠떵이를 드시면서 행복을 느끼십니다. 절대 대단한 것에서 찾으면 안됩니다. 너무 대단하면 평생 한번 행복할까말까합니다. 자주 행복할 수 있는것, 최대한 일상적이어서 늘 행복할 수 있는 것을 찾아야합니다.

지금 이 글을 읽고계신 당신은 어느때 행복을 느끼십니까? 솔직히 아주 솔직하게 남들 신경쓰지말고 돈생기는거 말고 그냥 순수하게 재밌고 신나는 순간이 언제입니까? 저를 포함해 과반수 이상이 아마 언뜻 생각나는 것이 없을것 같습니다. 사실은 내가 좋아하는 일이라고 생각했었지만 사실 별로 재미를 못 느끼는 것들도 있을 것이고, 별로 대수롭지 않는 일이라고 생각하던 것이지만 나도 모르게 재미를 느끼는 것이 있을 수도 있습니다.

지금부터라도 재밌는 것은 재밌다고 분명히 느끼면서 이걸 하니 행복하구나하고 행복을 찾으면서 즐깁시다. 재미없는 것은 재미없다는 것을 분명히 인식하면서 해도 좋습니다. 재미없는 것도 성실하게하고 내 자신이 이렇게 참았으니 상을 주면 됩니다. 행복한 것을 즐길 시간을 주는 것이지요. 행복을 즐기는 것이 재미없지만 불가피하게 해야할 것을 하도록 만드는 힘이 됩니다.

우리모두 행복합시다. 사람으로써도 개발자로써도 좋은 사람 좋은 개발자가 되고 행복한 사람 행복한 개발자가 됩시다.

마지막으로 제 인생 가장 큰 행복이자 가장 큰 골칫덩이를 소개합니다. 아빠들 힘냅시다!!

개발자로써 수명을 따지기보다 사람으로써 성장을 생각하자.
개발자 세상

 요즘 저는 개발자로서 얼마나 오래, 즉 나이가 많아도 일할 수 있을지가 고민입니다. 오래 개발자를 하고 싶은 이유는 아무래도 하던 일이니 경력으로 인정받을 수 있고 나한테 맞는 일인것 같기도하고, 사실은 변화가 두려워서이기도 하겠지요. 저는 오래하려면 일단은 잘해야하지 않을까 생각합니다. 그럼 어떻게해야 잘할 수 있을까? 그게 이 질문의 핵심인것 같습니다. 전 2가지를 생각하면서 일합니다.

1. 자주 발생하는 문제들의 카테고리를 분류해서 통합하고 각 카테고리마다 범용적인 해결책을 개발한다.

2. 내가 알지못하는 문제를 해결하거나 알지못하는 지식을 갖춰야할때 가장 근본적인 부분부터 파고든다.

이 2가지 문장의 공통분모는 고민인것 같습니다. 혹은 생각이라고도 할 수 있을것 같습니다. 2가지 문장을 합친 결론은 “일할때마다 좀더 고민하고 좀더 생각하면서 일하자.”입니다. 고민이라는 단어를 넣어서 다시 적어보겠습니다.

1. 자꾸 비슷한 문제가 생기면 유사한 문제들이 다시는 발생하지않게 그냥 넘어가지말고 해결하자.

2. 뭔가 배울때는 그 내부까지 좀더 고민하고 생각해서 깊게 이해하자.



고민하지말고 쉽게쉽게할까요?

그런데 쓰다보니 더 중요한게 있는것 같습니다. 소통도 그만큼 중요할것 같습니다. 소통의 중요성은 뭐 굳이 말로할 필요가 없겠지요. 저는 소통이란 “상대방 눈을 보고 상대방이 원하는 정보를 상대방이 이해할 수 있게 전달하는 것”이라고 생각합니다.

1. 상대방을 존중하는 자세 (사실은 안존중하지만 속마음을 숨겨야할때도 있지요^^;)

2. 상대방의 필요를 이해

3. 상대방의 수준을 배려

제가 소통에서 중요시하는 3가지입니다.

이렇게 따지고보니 지식노동자는 수신뿐 아니라 제가에도 힘써야합니다. 수신은 자신을 성장시키는 것이고 제가는 주변 사람들과 어울리는 것이니까요. 그런데 수신과 제가는 이미 수천년전부터 모든 사람이 가져야할 자세라고 강조되어온 것입니다. 지식노동자라고 특별할게없이 일하면서 먹고사는 직업중 하나라는 것이 아닐까요? 그래서 저는 제가 생각하는 고민과 소통이 개발자의 태도가 아니라 모든 사람의 태도라고 생각합니다. 결론은 사람이 사는데 필요한 모든 지혜를 갖추는 것이 곧 개발자로서 성장하는 길이다.

좀더 명확하게 말하면 “좋은 사람이 곧 좋은 개발자이다”라는 주장을 하고싶습니다.

뜬금없이 이상한 글을 올린 저는 알티베이스에서 개발일을 하고있는 김기오입니다. 앞으로 간간이 개발에 관련된 글을 올리겠습니다. 하지만 개발보다 중요한게 사람이고 지식보다 중요한게 인격이라고 생각합니다. 생각만하고 정작 제 인격은 조악하지만요. 어쨌든 좋은 사람이 되고 싶은 개발자입니다.

감사합니다.

국산 데이터베이스의 대명사, 알티베이스HDB 5.5.1을 설치해 보자.
개발자 세상

 작성: 알티베이스 CTO 김성진(sjkim@altibase.com)

알티베이스의 데이터베이스, ALTIBASE HDB는 지난 12년간 개발 및 상용화된 국산 데이터베이스이다.

실제로 통신, 금융, 제조업 등에서 주요 데이터베이스로 사용되어 있으며,  극한의 성능이 필요한 영역에서 그 진가를 나타내는 메모리 데이터베이스가 있으며, 오라클과 유사한 디스크 데이터베이스를 모두 지원한다.
위의 두개의 데이터베이스를 하나의 데이터베이스로 지원하는 하이브리드 타입을 지원함으로써 사용자는 극한의 성능과 대용량의 데이터를 모두 하나의 어플리케이션에서 처리할 수 있는 새로운 개념의 데이터베이스이다.

최근 알티베이스HDB 5.5.1이 새로 출시되었고, 성능과 안정성이 놀랄만하게 개선되었기에 한번 설치하고, 기존의 mysql과 같은 데이터베이스 어떠한 차이가 있는지 등을 살펴보는 재미있는 시간이 되기를 바란다.

그러한 의미에서 이 블로그는 알티베이스의 다운로드부터 실제 설치까지 전 과정에 대해서 설명하는 장이 될 것이며, 여러분의 호기심을 충족할 수 있는 기회가 되었으면 개인적으로 영광일 것이다.

하드웨어 및 운영체제에 확인
 
알티베이스HDB는 현존하는 대부분의 운영체제를 지원한다.
가장 흔히 볼 수 있는 리눅스부터 AIX, HP-UX,  Solaris, Windows 를 지원하며, 각 운영체제 및 CPU에 대한 자세한 정보는 알티베이스 공식 지원홈페이지(http://atc.altibase.com)을 참조하기 바란다.

오늘은 인텔 CPU기반의 리눅스 운영체제( ES 5.6)에 설치할 것이나, 우분투(8.04 이상)나 페도라에서도 문제없이 설치될 것이다. 단 CPU가 pentium 4 이상을 지원하므로, 참조하기 바란다. 

이 글을 쓰기 위해서 호스트웨이(http://www.hostway.co.kr)에서 제공하는 가상 리눅스 플랫폼을 사용하였으니 오해없으시길 바란다. 

우선 root로 로그인하여 하드웨어 환경을 검사해 본다.

 인텔 제온 CPU 기반에서 레드햇 ES 5.6 임을 확인하였다.
그리고, ls 프로그램이 64비트로 설치된 것으로 보아 64비트 운영체제 환경으로 설치되었음을 알 수 있다. (이 환경에서 32비트도 설치가능하나 혼란의 여지를 줄이기 위해 모두 64비트로 설치를 진행하겠다) 

알티베이스 설치 패키지 다운로드

공식적으로 알티베이스 패키지를 다운로드 받기 위해서는 앞에서 언급했던 알티베이스 공식 지원 홈페이지(http://atc.altibase.com)로 가면 된다.

그런데, 그곳에서 가면 회원가입을 해야 하고, 가입 이후에 패키지와 라이센스를 다운로드 받을 수 있다. 

 그러나, 마음이 급한 독자를 위해서 아예 전용 다운로드 홈페이지(http://altibase.dyndns.org) 를 만들었으니 그곳에서 관련 패키지를 다운로드 하시라. (혹시 문제로 받을 수 없으면, 위의 곳에서 다운로드 받아서 준비하시길 바란다)

화면에 Altibase Installation Package Page 를 누르면, 아래의 페이지로 이동한다.

이곳에서 64비트 서버 패키지(altibase-server-5.5.1.0-LINUX-X86-64bit-release.bin)와 자바 런타임 64비트 패키지 (jre-6u25-linux-x64.bin)를 시스템으로 다운로드 받아 놓자.

물론 라이센스 정보도 필요한데, 공식 홈페이지에서 회원 가입후에 받을 수 있다. 그럴 경우 제약없는 무한대 라이센스를 획득할 수 있는데, 그 과정이 귀찮은 분을 위해서 2012년 12월 말까지 모든 시스템에서 사용할 수 있는 임시 라이센스를 공개해 놓으니, 기억해 놓았다가 알티베이스 설치시에 이용하도록 한다. 

알티베이스 사용자 생성

이제 본격적으로 알티베이스를 설치해 보도록 하자.
우선 root로 사용하는 것은 관리나 보안에 문제가 크기 때문에 altibase 라는 계정을 만들도록 한다.

useradd 명령어로 쉽게 생성할 수 있으며, passwd 명령으로 altibase라는 패스워드로 똑같이 생성해 보자.

[root@localhost ~]# useradd altibase

[root@localhost ~]# passwd altibase

Changing password for user altibase.

New UNIX password: 

Retype new UNIX password: 

passwd: all authentication tokens updated successfully.

[root@localhost ~]# 

 

 

[root@localhost ~]# whoami

root

[root@localhost ~]# su - altibase

[altibase@localhost ~]$ ls -al

합계 68256

drwx—— 4 altibase altibase     4096  5월 10 13:22 .

drwxr-xr-x 4 root     root         4096  5월 10 13:23 ..

-rw——- 1 altibase altibase      119  5월 10 13:23 .bash_history

-rw-r–r– 1 altibase altibase       33  5월 10 13:16 .bash_logout

-rw-r–r– 1 altibase altibase      176  5월 10 13:16 .bash_profile

-rw-r–r– 1 altibase altibase      124  5월 10 13:16 .bashrc

-rw-r–r– 1 altibase altibase      515  5월 10 13:16 .emacs

drwxr-xr-x 4 altibase altibase     4096  5월 10 13:16 .mozilla

drwx—— 2 altibase altibase     4096  5월 10 13:20 .ssh

-rwxr-xr-x 1 altibase altibase 48589890  5월 10 13:22 altibase-server-5.5.1.0-LINUX-X86-64bit-release.bin

-rwxr-xr-x 1 altibase altibase 21180382  5월 10 13:22 jre-6u25-linux-x64.bin

[altibase@localhost ~]$ chmod +x *.bin  <== 실행 가능하도록 권한 수정

 사용자가 생성이 되었고, 패키지도 위와 같이 다운로드 받아 놓았다.

이제 설치를 하면 되는데, 차근 차근 따라가 보도록 하자.

자바 설치 

만약 JDBC를 사용해야 하는
환경이면  다운 로드했던 자바를 설치하도록 하자.  만일 필요치 않다면, 이 장은 건너뛰어도 무방하다. 만일 자세한 설치를 알고 싶다면, 이곳을 방문하길.

[altibase@localhost ~]$ ./jre-6u25-linux-x64.bin  <== 설치 패키지 수행

[altibase@localhost ~]$  

 ……….
  Creating jre1.6.0_25/lib/rt.jar

Creating jre1.6.0_25/lib/jsse.jar

Creating jre1.6.0_25/lib/charsets.jar

Creating jre1.6.0_25/lib/ext/localedata.jar

Creating jre1.6.0_25/lib/plugin.jar

Creating jre1.6.0_25/lib/javaws.jar

Creating jre1.6.0_25/lib/deploy.jar Done. <== 설치 완료

[altibase@localhost ~]$ ls -al <== 설치 확인

합계 68260

drwx—— 5 altibase altibase     4096  5월 10 13:36 .

drwxr-xr-x 4 root     root         4096  5월 10 13:23 ..

-rw——- 1 altibase altibase      119  5월 10

13:23 .bash_history

-rw-r–r– 1 altibase altibase       33  5월 10 13:16 .bash_logout -rw-r–r– 1 altibase altibase      254  5월 10

13:29 .bash_profile

-rw-r–r– 1 altibase altibase      124  5월 10 13:16 .bashrc

-rw-r–r– 1 altibase altibase      515  5월 10 13:16 .emacs

drwxr-xr-x 4 altibase altibase     4096  5월 10 13:16 .mozilla

drwx—— 2 altibase altibase     4096  5월 10 13:20 .ssh

-rwxr-xr-x 1 altibase altibase 48589890  5월 10 13:22 altibase-

server-5.5.1.0-LINUX-X86-64bit-release.bin

-rwxr-xr-x 1 altibase altibase 21180382  5월 10 13:22 jre-6u25-

linux-x64.bin

drwxr-xr-x 8 altibase altibase     4096  5월 10 13:36 jre1.6.0_25 <== 이곳에 설치됨. 

단지 디렉토리에 패키지 푸는 것 만으로 설치가 끝났다.  매뉴얼에 따라 PATH 와 LD_LIBRARY_PATH를 잡아주도록 하자. 

알티베이스 데이터베이스 서버 설치 

알티베이스 5.5.1 부터는 인스톨러 형태로 설치본이 제공이 되는데, 앞의 자바 설치와 유사하게 바이너리 실행화일을 수행하면 설치가 시작된다.

만일 자신의 환경이 X-window 환경이라면 구이 환경에서 설치를 수행할 수 있고, X-window가 없다면, 콘솔기반으로 설치가 자동적으로 진행되니  미리 설치환경을 고민할 필요는 없다.

여기에서는 보편적인 콘솔기반으로 설치가 진행되는 것을 가정하겠다.
그리고, 각 과정마다  하나씩 주석을 넣어서 진행하는 과정을 설명하도록 한다.

시스템 환경의 설정

[altibase@localhost ~]$ ./altibase-server-5.5.1.0-LINUX-X86-64bit-release.bin 

—————————————————————————-

Welcome to the Altibase DBMS Server 5.5.1 Setup Wizard.

 

—————————————————————————-

Pre-Installation requirements for Altibase DBMS

 

At first, it is necessary to set up system environments to ensure Altibase DBMS 

runs properly. Before installing Altibase DBMS, kernel parameter values must be 

set as the root user. The kernel parameter values may be modified after 

installation, however, must be set prior to operating the Altibase DBMS.

 

Please, refer to the installation manual and pre_install.sh script file

(pre_install.sh : ‘$Altibase_install_dir’/install/pre_install.sh)

 

================ LINUX ================

[ How to modify kernel parameter values ]

 

echo 512 32000 512 512 > /proc/sys/kernel/sem

echo 872415232 > /proc/sys/kernel/shmall

 

# shmall 

If it is desired to use the Altibase DBMS in shared memory mode, the value of 

’shmall’ must be set. This value determines the maximum size of an Altibase 

database.

 

These values are the values that must be set in order for the Altibase DBMS to 

Press [Enter] to continue :

 

 

설치본을 수행하면 위와 같은 메시지가 나오게 되는데, 이는 알티베이스에서 사용하는 공유메모리와 세마포어의 초기 설정값을 이렇게 설정하라는 것이다.

알티베이스는 멀티쓰레드 서버 구조라서 실제로 공유메모리와 세마포어를 서버의 서비스 용도로는 사용하지 않는다. 단지, 클라이언트와 서버의 통신 아키텍쳐에서 빠른 응답을 위해서 IPC 통신 기법을 사용하는데 이때 할당되는 통신 채널의 리소스가 부족하지 않도록 설정하는 것이다.

만일 굳이 IPC통신 기법을 사용하지 않는다면, 이 시스템 환경을 설치할 필요는 없다. 

위의 볼드체로 된 부분은 반드시 root 명령어로 수행해서 설정해야 하며, 다음과 같이 설정/확인할 수 있다.

아래는 다른 콘솔로 수정한 것이다. 그냥 알티베이스 설치가 끝난 이후에 아래의 설정과정을 거쳐도 무방하다.  

 

[altibase@localhost ~]$ su

암호:

[root@localhost altibase]# cat /proc/sys/kernel/sem 

250 32000 32 128

[root@localhost altibase]# cat /proc/sys/kernel/shmall 

4294967296

[root@localhost altibase]# echo 512 32000 512 512 > /proc/sys/kernel/sem

[root@localhost altibase]# echo 872415232 > /proc/sys/kernel/shmall

[root@localhost altibase]# cat /proc/sys/kernel/sem 

512 32000 512 512   <== 변경되었다!

[root@localhost altibase]# cat /proc/sys/kernel/shmall 

872415232 <=== 변경되었다.

[root@localhost altibase]# 

 
 
본격적인 알티베이스 설치 진행

설치를 계속해 보자. 엔터를 치면 다음 단계로 넘어간다.

 

Press [Enter] to continue :

 

—————————————————————————-

Installation Directory

 

Please, specify the installation directory for Altibase DBMS Server 5.5.1

 

Installation Directory [/home/altibase/altibase-server-5.5.1]: 

<== 알티베이스 설치된 기본 디렉토리를 지정한다.
       만일 디렉토리가 없으면 자동으로 생성한다. 
       여기에서는 디폴트로 놓아두었다.  

—————————————————————————-

Altibase DBMS Property settings:

Step 1: Basic database operation properties

 

Database Name [mydb]: 

 

Altibase DBMS Connection Port Number(1024-65535)  [20300]: 

<== 데이터베이스 클라이언트 서비스를 위한 기본 포트이다.
 

Maximum size of memory database  [4G]: 

<== 메모리 데이터영역의 최대 크기를 지정한다.
      알티베이스의 메모리 데이터베이스는 자동으로 증가하는데,
      여기에서 지정한 영역까지 증가된다. 
      디폴트로 놓아두도록 한다. 32비트에서는 2G가 최대한계이다.
 

Buffer area size for caching disk-based database pages [128M]: 

<== 이 영역은 디스크 데이터베이스의 버퍼풀 크기이다.
      해당 시스템의 메모리 크기를 고려하여 설정한다. 크면 클수록
      디스크 트랜잭션의 성능이 올라갈 것이다.
 

Do you want to create a database after installation?

 

[1] YES

[2] NO

Please choose an option [1] : 

<== 이 옵션은 알티베이스 설치가 끝난 후에 자동으로 데이터베이스
       인스턴스를 생성할 것인지 결정하는 것이다.  
       특별한 이유가 없다면 그냥 생성하도록 하는 것이 편안한 삶의 첩경이다. 

—————————————————————————-

Altibase DBMS Property settings:

Step 2: Database creation properties
Initialization Database Size [10M]:  <== 이 값은 메모리 데이터베이스의 초기 설정크기를 결정한다.
      즉, 사용자의 메모리테이블 사용량이 10M가 넘어가면 자동으로
      내부 공간이 확장되면, 이 확장은 위에서 지정한 4G까지 이루어진다.
      이 값의 의미는 10M 만큼의 메모리 테이블 리소스를 미리 할당한다는
      의미로 이해하면 된다.
  

Database archive logging mode
[1] NoArchivelog [2] Archivelog Please choose an option [1] :  <== 2번으로 설정하면 로그화일이 백업용도로 지워지지 않고, 
      무한대로 늘어난다. 따라서, 특별한 백업이슈가 없으면 1번으로 설정한다.
      1번은 알티베이스의 체크포인트시에 불필요한 로그화일을 지속적으로
      삭제하여, 디스크의 사용량을 유지시킨다. 

  Database Character-set
[1] MS949

[2] US7ASCII

[3] KO16KSC5601

[4] BIG5

[5] GB231280

[6] UTF-8

[7] SHIFT-JIS

[8] EUC-JP

Please choose an option [1] : 

<== 이는 데이터베이스 내부의 기본 캐릭터셋을 설정하는 것이다.
      현재 알티베이스는 8개의 캐릭터셋을 지원하며, 이를 데이터베이스 
      전체에 영향을 미치며, 이후에 수정할 수 없도록 되어 있다.
      여기에서는 마이크로소프트의 캐릭터셋을 이용하도록 한다. 
 

National Character-set
[1] UTF-16

[2] UTF-8

Please choose an option [1] : 

<== 알티베이스에서 제공하는 국제언어 캐릭터 타입인 
       NCHAR, NVARCHAR에 대한 엔코딩 방식을 지정한다. 
       2바이트 기반 유니코드인 1번을 설정하도록 한다. 
 

—————————————————————————-

Altibase DBMS Property settings: Step 3: Database operation directory properties Default Disk Database Directory [/home/altibase/altibase-server-5.5.1/dbs]: 

<==  디스크 데이터베이스의 데이터화일이 저장될 곳을 지정한다. 
       디폴트로 놓아두자.
  

Memory Database Directory [/home/altibase/altibase-server-5.5.1/dbs]: 

<== 메모리 데이터베이스의 데이터화일이 저장될 것을 지정한다.
      이 또한 디폴트로 놓아두자.
 

Archive Log Directory [/home/altibase/altibase-server-5.5.1/arch_logs]: 

<== 아카이빙 로그화일이 저장될 디렉토리를 지정한다.
      디폴트로 지정! 

Transaction Log Directory [/home/altibase/altibase-server-5.5.1/logs]: 

<== 현재 사용중인 로그화일이 저장될 디렉토리를 지정한다.
      디폴트로 지정한다. 

 [Log Anchor file Directories ] Three sets of log anchor files exist in the Altibase DBMS. They contain  important information about the database. By default, they are located under the  ‘logs’ folder.  The location can be changed by modifying the file  labeled  “altibase.properties”.

<== 대부분의 데이터베이스에서는 로그 앵커(혹은 컨트롤 화일)라는 이름으로 
      데이터베이스의 가장 중요한 기초 정보를 담고 있는 화일을 유지한다.
      이 화일이 손상을 받으면 데이터베이스 자체의 복구가 불가능하므로
      대부분 2개 이상의 복제본을 유지하게 된다.
      알티베이스에서는 3개를 기본으로 생성하도록 하고 있으며,
      아래의 디렉토리는 각각의 위치이다. 
      정말로 위험을 회피하기 위해서는 아래의 각각의 디렉토리의 위치가
      달라야 하나, 여기에서는 디폴트로 놓아둔다.

Directory 1. [/home/altibase/altibase-server-5.5.1/logs]:  <== 디폴트로 지정

Directory 2. [/home/altibase/altibase-server-5.5.1/logs]:  <== 디폴트로 지정

Directory 3. [/home/altibase/altibase-server-5.5.1/logs]:  <== 디폴트로 지정

—————————————————————————-

아래는 설정한 프로퍼티를 다시 한번 보여주는 단계이다.
혹시 확인해 보고 문제가 있다면 재시도하도록 하자.
 
Property report
Please check your property settings. 
To change these properties after installation is complete,  please modify the following file:   /home/altibase/altibase-server-5.5.1/conf/altibase.properties.

1. Altibase DBMS Property Settings:    

Step 1: Basic database operation properties
    1) Database Name :           [mydb]
    2) Altibase DBMS Connection Port Number(1024-65535)  :           [20300]
    3) Maximum size of memory database  :          [4G]
    4) Buffer area size for caching disk-based database pages :          [128M]

2. Altibase DBMS Property Settings:

Press [Enter] to continue :

Press [Enter] to continue :    

Step 2: Database creation properties
    1) Installation Database Size          [10M]
    2) Database archive logging mode          [noarchivelog]
    3) Database Character Set          [MS949]
    4) National Character Set          [UTF16]

3. Altibase DBMS Property Settings:    

Step 3: Database operation directory properties
    Database will not operate properly if one or more directories are removed. 
    1) Default Disk Database Directory :           [/home/altibase/altibase-server-5.5.1/dbs] 
    2) Memory Database Directory : Press [Enter] to continue :          [/home/altibase/altibase-server-5.5.1/dbs] 
    3) Archive Log Directory :           [/home/altibase/altibase-server-5.5.1/arch_logs] 
    4) Transaction Log Directory :           [/home/altibase/altibase-server-5.5.1/logs] 
    5) Log Anchor file Directories :          Directory 1 :           [/home/altibase/altibase-server-5.5.1/logs] 
         Directory 2 :           [/home/altibase/altibase-server-5.5.1/logs] 
         Directory 3 :           [/home/altibase/altibase-server-5.5.1/logs] 

 

Press [Enter] to continue :

————————————————————

Setup is now ready to install Altibase DBMS Server 5.5.1.
Do you want to continue? [Y/n]: 

<== 모두 설정되였으면 실제 설치로 들어가자!.
—————————————————————————-

Please, wait until the setup wizard finishes installing Altibase DBMS Server  5.5.1.
 Installing  0% ______________ 50% ______________ 100%  

#########################################

<== 설치 진행 화면을 보여준다.

—————————————————————————-

Registering Altibase DBMS License
If has not been issued or expired, Altibase DBMS services will not start. In this case, Please visit http://atc.altibase.com or contact Altibase Technical Support (license@altibase.com)

Choose a option for Altibase license registration.
[1] Input license key.    <== 직접 키를 입력하는 방식 

[2] Select License file.  <== 라이센스 키가 들어있는 화일을 지정하는 방식

[3] No license file exist. <== 키가 없을 경우 

Please choose an option [1] :  <== 이제 라이센스를 넣을 차례이다.
       알티베이스에서 혹시 받은 라이센스가 있다면 그것을 넣고,
       귀찮은 사용자를 위해서 미리 받아놓은 임시 라이센스를 넣도록 하자.
  —————————————————————————-

Obtaining Altibase License
Input Altibase license key.
 []: 55DA1FD889A604E5FC26BC1DE935FC67 <== 임시키를 넣는다. 
        2012년 12월 31일까지 상용을 제외한 모든 곳에 무제한 사용가능하다!
 

Info: License registration is complete.
Check your  /home/altibase/altibase-server-5.5.1/conf/license  file. Press [Enter] to continue :

—————————————————————————-

Altibase Quick Setting Guide <==  아래는 설치 정보 및 환경에 대한 설명이다. 참조하자.

[  Installation complete  ]

Please refer to the file listed below to verify the Altibase DBMS version.    

/home/altibase/altibase-server-5.5.1/APatch/patchinfo 

 

[ Quick Guide to Making Settings in Altibase ] 

Four steps are required before starting Altibase DBMS services.
1. Configure kernel parameters

2. Register a license.  

3. Configure user environment variables     

(using the account of Altibase installtion user)

4. Create a database

There are several setup script files that can be manually used to install 

the Altibase DBMS. 

To use a setup script file :

1. run the ‘/home/altibase/altibase-server-5.5.1/install/pre_install.sh’ file     

- This script helps your kernel parameter settings.
   <==  커널 환경 설정을 위한 스크립트가 준비되었다는 메시지
           필요시 사용하자. (우리는 앞에서 이미 설정했다) 

Press [Enter] to continue :

2. Register a license.      

Please, rename and locate license file as below.      

/home/altibase/altibase-server-5.5.1/conf/license     

<== 라이센스 정보가 담긴 화일을 알려준다. 
 

3. run the ‘/home/altibase/altibase-server-5.5.1/install/post_install.sh’ file     

under the ‘Altibase installation user’ account.    

This script performs post-installation configuration needed for starting     

Altibase DBMS.      <===  post_install.sh에는 아래의 두가지 역할을 하도록 설정되었다.     

1) Create the altibase user environment file and apply to the user profile.          

(/home/altibase/altibase-server-5.5.1/conf/altibase_user.env)
     <== 설치후 알티베이스 사용을 위한 환경을 담고 있는 화일이다.
            자동으로 등록된다.
     

2) Creating database.          

If the “database creation script” has been created before,           

post_install.sh performs databse create step.        

<===  데이터베이스가 생성된다. 

4. Create database      

If the “database creation script”has not been created before, it must be       

created prior to starting services by using following script.
         server create [DB Character-set] [National Character-set]      

<== 만일 데이터베이스를 생성하지 않았다면, 
            아래의 스크립트로 생성이 가능하다.
            예)  server create MS949 UTF-16 
5. Startup/Shutdown server    

shell> server start  <== 알티베이스를 구동하는 스크립트     

shell> server stop  <== 알티베이스를 종료하는 스크립트

 6. Connect to database using iSQL    

shell> isql -s 127.0.0.1 -u SYS -p MANAGER     <== 알티베이스의 interactive sql을 사용하는 명령어이다.

Press [Enter] to continue :
 Would you like to launch ‘post_install.sh’ now ?  

- It will create the Altibase user environment file and the database. [Y/n]: 

<== 자, 이제 데이터베이스를 생성할 차례다. 아래 Y를 선택하면
       자동으로 생성된다.  설정한 프로퍼티에 따라 몇십초에서 몇분까지 걸린다.

Result

[Linux Env.]

Target : /home/altibase/altibase-server-5.5.1/conf/altibase_user.env

created  ———————– Altibase environment setup file.

added    ———————– ALTIBASE_HOME

added    ———————– PATH

added    ———————– LD_LIBRARY_PATH

added    ———————– CLASSPATH        

export ———————– ‘altibase_user.env’ into  ‘/home/altibase/.bash_profile’

<== 이 화일에 알티베이스 초기 환경변수가 자동을 설정되었다. 
아래의 메시지는 알티베이스 데이터베이스가 생성되는 과정을 보여준다.

—————————————————————–      

Altibase Client Query utility.      

Release Version 5.5.1.0.0      

Copyright 2000, ALTIBASE Corporation or its subsidiaries.      

All Rights Reserved.

—————————————————————–

ISQL_CONNECTION = UNIX, SERVER = localhost, PORT_NO = 20300

[ERR-910FB : Connected to idle instance]

Connecting to the DB server… Connected.

Press [Enter] to continue :

 

TRANSITION TO PHASE : PROCESS

To be expired at 2012-12-31.

Command execute success.
DB Info (Page Size     = 32768)        

(Page Count    = 257)        

(Total DB Size = 8421376)        

(DB File Size  = 1073741824)
Creating MMDB FILES     [SUCCESS]
Creating Catalog Tables [SUCCESS]
Creating DRDB FILES     [SUCCESS]
  [SM] Rebuilding Indices [Total Count:0]  [SUCCESS]
DB Writing Completed. All Done.
Create success. <== 이 메시지가 나와야 성공이다. 혹시 이 과정에서 
                                실패가 나왔다면, 콘솔에서 직접 생성스크립트를 수행하자. 

 Press [Enter] to continue :
==============================================

Please perform [re-login] 

or [source /home/altibase/.bash_profile] 

or [. /home/altibase/.bash_profile]

==============================================

Press [Enter] to continue :

—————————————————————————-

Setup has finished installing Altibase DBMS Server 5.5.1 on your host.

<==  드디어 모든 복잡한 설치과정이 완료되었다!!!
        그러나, 실제로 라이센스를 넣는 부분외에는 그냥 리턴만으로 모든
        설정을 수행했기 때문에 큰 어려움은 없었을 듯 하다.

[altibase@localhost ~]$ 

 

 

 
 
환경변수 설정

이제 설치를 완료하였다.
마무리 작업을 수행하면 된다.  앞에서 설명이 나온 것과 같이 환경변수 정보를 업데이트하자.

 

altibase@localhost ~]$ source ~/.bash_profile <==  환경변수를 업데이트하자.

[altibase@localhost ~]$ which altibase  <== altibase 를 찾을 수 있다면 성공이다!

~/altibase-server-5.5.1/bin/altibase

[altibase@localhost ~]$ 

 
 
대망의 알티베이스 서버 구동 

드디어 모든 과정을 마쳤다. 이제 알티베이스를 구동해 보자.
큰 실수를 하지 않는 한 다음과 같은 구동 메시지가 뜰 것이다.

[altibase@localhost ~]$ 

[altibase@localhost ~]$ server start

—————————————————————–

     Altibase Client Query utility.

     Release Version 5.5.1.0.0

     Copyright 2000, ALTIBASE Corporation or its subsidiaries.

     All Rights Reserved.

—————————————————————–

ISQL_CONNECTION = UNIX, SERVER = localhost, PORT_NO = 20300

[ERR-910FB : Connected to idle instance]

Error: /proc must be mounted

  To mount /proc at boot you need an /etc/fstab line like:

      /proc   /proc   proc    defaults

  In the meantime, run “mount /proc /proc -t proc”

sh: /usr/ucb/uptime: 그런 파일이나 디렉토리가 없음
<== 이 메시지는 리눅스 간의 상이한 패키지 구조로 인해서 발생하는 것이다.
       동작에 큰 이슈는 없으므로, 무시하자.  다음버젼에서는  수정될 것이다.  

Connecting to the DB server… Connected.

 

 

TRANSITION TO PHASE : PROCESS

To be expired at 2012-12-31. <== 임시 라이센스 정보 출력

 

 

TRANSITION TO PHASE : CONTROL

 

 

TRANSITION TO PHASE : META

  [SM] Recovery Phase - 1 : Preparing Database

                          : Dynamic Memory Version => Parallel Loading

  [SM] Recovery Phase - 2 : Loading Database 

  [SM] Recovery Phase - 3 : Skipping Recovery & Starting Threads…

                            Refining Disk Table 

  [SM] Refine Memory Table : ……………………………………………………………………………………… [SUCCESS]

  [SM] Rebuilding Indices [Total Count:101] ……………………………………………………………………………………….. [SUCCESS]

 

 

TRANSITION TO PHASE : SERVICE

  [CM] Listener started : TCP on port 20300 [IPV4]

  [CM] Listener started : UNIX

  [RP] Initialization : [PASS]

 

— STARTUP Process SUCCESS —   

Command execute success.  <== 떴다!

 
 
알티베이스 메모리 테이블 사용해 보기

힘겹게(?) 설치를 했으니 한번 사용해 보도록 하자. 
사용해 보면 오라클 사용법과 크게 다르지 않다.
알티베이스의 interactive sql 도구인 isql을 사용한다. (내부적으로 is 라는 스크립트가 있고, is 만 수행해도 아래와 같이 로그인 된다) 

 

[altibase@localhost altibase-server-5.5.1]$ isql -s 127.0.0.1 -u SYS -p MANAGER

—————————————————————–

     Altibase Client Query utility.

     Release Version 5.5.1.0.0

     Copyright 2000, ALTIBASE Corporation or its subsidiaries.

     All Rights Reserved.

—————————————————————–

ISQL_CONNECTION = TCP, SERVER = 127.0.0.1, PORT_NO = 20300

iSQL> autocommit off;  <== non autocommit 모드로 수행한다.

Set autocommit off success.

iSQL> create table myalti (id integer primary key, name varchar(20)); Create success.
<== 이 myalti 은 메모리테이블로 생성된다.  

iSQL> insert into myalti values(1, ’sjkim’);

1 row inserted.

iSQL> insert into myalti values(2, ‘gamestar’);

1 row inserted.

iSQL> select * from myalti;

ID          NAME                   ————————————-

1           sjkim                 

2           gamestar              

2 rows selected.

iSQL> commit;

Commit success.

iSQL> insert into myalti values(3, ‘alti 5.5.1′);

1 row inserted.

iSQL> select * from myalti;

ID          NAME                  

————————————-

1           sjkim                 

2           gamestar              

3           alti 5.5.1            

3 rows selected.

iSQL> rollback;

Rollback success.

iSQL> select * from myalti;

ID          NAME                  

————————————-

1           sjkim                 

2           gamestar              

2 rows selected.

iSQL>  insert into myalti values(3, ‘alti 5.5.1′);

1 row inserted.

iSQL> insert into myalti values(3, ‘alti 5.5.1′);

[ERR-11058 : The row already exists in a unique index.]

iSQL> rollback;

Rollback success.

 iSQL>select * from myalti;

ID          NAME                  

————————————-

1           sjkim                 

2           gamestar              

2 rows selected. iSQL> quit  <== 종료

[altibase@localhost altibase-server-5.5.1]$   

 

알티베이스 디스크 테이블 사용해 보기 

아래는 디스크 테이블을 생성하는 예제이다. 

 

[altibase@localhost altibase-server-5.5.1]$ is

—————————————————————–

     Altibase Client Query utility.

     Release Version 5.5.1.0.0

     Copyright 2000, ALTIBASE Corporation or its subsidiaries.

     All Rights Reserved.

—————————————————————–

ISQL_CONNECTION = TCP, SERVER = localhost, PORT_NO = 20300

 

iSQL> select * from v$tablespaces; <== 사용가능한 테이블스페이스를 확인하자.

ID          NAME                                      NEXT_FILE_ID 

———————————————————————–

TYPE        STATE       EXTENT_MANAGEMENT     SEGMENT_MANAGEMENT    

————————————————————————-

DATAFILE_COUNT TOTAL_PAGE_COUNT     EXTENT_PAGE_COUNT ALLOCATED_PAGE_COUNT 

——————————————————————————–

PAGE_SIZE   ATTR_LOG_COMPRESS 

———————————

0           SYS_TBS_MEM_DIC                           0           

0           2                                                       

1           129                  128         129                  

32768       0           

1           SYS_TBS_MEM_DATA                          0           <== 메모리 테이블 스페이스

1           2                                                       

1           257                  128         257                  

32768       1           

2           SYS_TBS_DISK_DATA                         1            <== 기본 디스크 테이블 스페이스 

3           2           BITMAP                AUTO                  

1           12800                64          64                   

8192        1           

3           SYS_TBS_DISK_UNDO                         1           

7           2           BITMAP                CIRCULAR              

1           32768                32          16416                

8192        1           

4           SYS_TBS_DISK_TEMP                         1           

5           2           BITMAP                MANUAL                

1           12800                32          32                   

8192        1           

5 rows selected.

iSQL>  create table mydisk (id integer primary key, name varchar(20)) tablespace SYS_TBS_DISK_DATA; <== 디스크 테이블 생성 

Create success.

iSQL> autocommit off;

Set autocommit off success.

iSQL> insert into mydisk values(1, ’sjkim disk’);

1 row inserted.

iSQL> insert into mydisk values(2, ‘gamestar disk’);

1 row inserted.

iSQL> commit;

Commit success.

iSQL> select * from mydisk;

ID          NAME                  

————————————-

1           sjkim disk            

2           gamestar disk         

2 rows selected.

iSQL>  <==  디스크 테이블의 내용이 출력된다.

 

 

하이브리드 기능 맛보기

메모리와 디스크 테이블을 생성한 김에 두개의 테이블에 대해 EQ Join을 한번 해 보자.  이것이 진정한 하이브리드 데이터베이스의 면모이다.

 

iSQL> select a.id, a.name, b.name from myalti a, mydisk b where a.id = b.id;

ID          NAME                  NAME                  

————————————————————

1           sjkim                 sjkim disk            

2           gamestar              gamestar disk         

2 rows selected.

iSQL> 

 

Move 기능을 통해 메모리 테이블을 디스크 테이블로 이동 시키기

알티베이스 하이브리드 데이터베이스의 또 다른 강점은 메모리 테이블의 내용을 디스크로 직접 옮길 수 있다는 것이다.
아래는 메모리 테이블의 myalti 로 부터 디스크 테이블인  mydisk 로 1개의 레코드를 옮기는 예제이다.

 

iSQL> delete from mydisk;

2 rows deleted.

iSQL> commit;

Commit success.

iSQL> move into mydisk(id, name) from myalti (id, name) where myalti.id=2;

1 row moved. <== id가 2인 메모리테이블의 레코드 1건을 디스크로 이동!

iSQL> commit;

Commit success.

iSQL> select * from myalti;

ID          NAME                  

————————————-

1           sjkim                 <== 1건만 남음.

1 row selected.

iSQL> select * from mydisk;

ID          NAME                  

————————————-

2           gamestar           <== 1건이 옮겨옴.   

1 row selected.

iSQL> 

 

 
 

더 많은 예제 보기
 

혹시 알티베이스에 설치된 더 많은 샘플 예제를 보기 원하는 분은 아래의 디렉토리에 방문해보기 바란다.
 

 

[altibase@localhost SQLCLI]$ cd

[altibase@localhost ~]$ cd $ALTIBASE_HOME 

[altibase@localhost altibase-server-5.5.1]$ cd sample/

[altibase@localhost sample]$ ls <==  많은 샘플들이 있다.

ALA  APRE  CAPI  CHECKSERVER  ILOADERAPI  JDBC  SPATIAL  SQLCLI  UTIL

[altibase@localhost sample]$ cd SQLCLI/

[altibase@localhost SQLCLI]$ 

[altibase@localhost SQLCLI]$ ls

BLOB           demo_ex5.cpp     demo_meta3.cpp  demo_mt.cpp

CLOB           demo_ex5.sql     demo_meta3.sql  demo_plan.cpp

Fail-Over      demo_ex6.cpp     demo_meta4.cpp  demo_plan.sql

Makefile       demo_ex6.sql     demo_meta4.sql  demo_rtl.cpp

README         demo_ex7.cpp     demo_meta5.cpp  demo_rtl.sql

demo_dead.cpp  demo_ex7.sql     demo_meta5.sql  demo_tran1.cpp

demo_ex1.cpp   demo_info1.cpp   demo_meta6.cpp  demo_tran1.sql

demo_ex1.sql   demo_info2.cpp   demo_meta6.sql  demo_tran2.cpp

demo_ex2.cpp   demo_info2.sql   demo_meta7.cpp  demo_tran2.sql

demo_ex2.sql   demo_meta1.cpp   demo_meta7.sql  failovertest.cpp

demo_ex3.cpp   demo_meta10.cpp  demo_meta8.cpp  pooltest.cpp

demo_ex3.sql   demo_meta10.sql  demo_meta8.sql

demo_ex4.cpp   demo_meta2.cpp   demo_meta9.cpp

demo_ex4.sql   demo_meta2.sql   demo_meta9.sql

[altibase@localhost SQLCLI]$ make

……. build…..
 
demo_ex1 데모를 실행해 보자.
 [altibase@localhost SQLCLI]$  is -f demo_ex1.sql 

—————————————————————–      

Altibase Client Query utility.      

Release Version 5.5.1.0.0      

Copyright 2000, ALTIBASE Corporation or its subsidiaries.      

All Rights Reserved.

—————————————————————–

ISQL_CONNECTION = TCP, SERVER = localhost, PORT_NO = 20300

iSQL> drop table demo_ex1;

[ERR-31031 : Table not found : 

0001 : drop table DEMO_EX1

                  ^       ^

]

iSQL> CREATE TABLE DEMO_EX1 ( id char(8) not null, name varchar(20), age integer, birth date, sex smallint, etc numeric(10,3) );

Create success.

iSQL> insert into demo_ex1 values(’10000000′, ‘name1′, 10, to_date(’1990-10-11 07:10:10′,’YYYY-MM-DD HH:MI:SS’), 0, 100.22);

1 row inserted.

iSQL> insert into demo_ex1 values(’20000000′, ‘name2′, 20, to_date(’1980-04-21 12:10:10′,’YYYY-MM-DD HH:MI:SS’), 0, null);

1 row inserted.

iSQL> insert into demo_ex1 values(’30000000′, ‘name3′, 30, to_date(’1970-12-06 08:08:08′,’YYYY-MM-DD HH:MI:SS’), 0, 300.22);

1 row inserted.

iSQL> insert into demo_ex1 values(’40000000′, ‘name4′, 40, to_date(’1960-11-10 05:05:05′,’YYYY-MM-DD HH:MI:SS’), 0, 400.22);

1 row inserted.

[altibase@localhost SQLCLI]$ ./demo_ex1 

columnName = ID, nullable = 0

ID : CHAR(8)

columnName = NAME, nullable = 1

NAME : VARCHAR(20)

columnName = AGE, nullable = 1

AGE : INTEGER

columnName = BIRTH, nullable = 1

BIRTH : DATE

columnName = SEX, nullable = 1

SEX : SMALLINT

columnName = ETC, nullable = 1

ETC : NUMERIC(10,3)

==========================================================================

10000000 name1 10 1990/10/11 07:10:10 0   100.220

20000000 name2 20 1980/04/21 12:10:10 0 NULL

30000000 name3 30 1970/12/06 08:08:08 0   300.220

40000000 name4 40 1960/11/10 05:05:05 0   400.220

[altibase@localhost SQLCLI]$ 

 

 

마치며

짧지 않은 글이었지만, 알티베이스 5.5.1의 기본적인 설치와 간단한 사용법을 기술해 보았다.

지난 12년간 알티베이스의 개발자로서 혹은 관리자로서 근무하면서 아쉬웠던 것은 국내에도 정말 쓸만한 데이터베이스가 있음에도 불구하고 많이 알려지거나 사용되지 않은 것이다.

현재 많은 비영리 단체 혹은 개인들이 운영하는 중소규모의 데이터베이스로 mysql이 많이 사용되고 있다. 그러나, 기술적인 관점으로 볼 때 알티베이스는 이미 mysql의 기능, 안정성, 성능 등을 뛰어넘었고, 시장에서는 오라클과 대응한 수준으로 경쟁/사용되고 있다.

최근 근로복지공단에서 적용된 알티베이스의 사례는 기존의 관념을 뛰어 넘기에 충분하다.  디스크가 6T를 넘어서고 160개의 CPU에 3000개가 넘는 클라이언트와 30억건이 넘는 레코드를 실시간으로 처리하는 어마어마한 레퍼런스를 두고 있다. 

디스크 데이터베이스로도 이러한 훌륭한 레퍼런스를 가지고 서비스를 하고 있는 상황이고, 메모리 데이터베이스는 한국 뿐 아니라 중국의 3대 통신사를 비롯한 국내외 1000여곳의 레퍼런스, 하이브리드 데이터베이스로는  일본의 5개 이상의 주요 증권사를 비롯한 수백 곳에서 채택하여 훌륭하게 서비스하고 있다. 

천리길도 한걸음부터라고 했던가?

이질감이 없지는 않겠지만, 한번 설치해서 내 환경에서 사용해 보는 것은 어떨까?

아마 내가 보지 못했던 새로운 세상이 펼쳐지리라.

꼬리글)
혹시 이 글을 읽고,  본인의 서비스에 적용하신 분은 메일을 주면 좋겠다.  비영리 목적으로 사용될 경우에 대해서는 무료이기 때문에 걱정없이 사용할 수 있을 것이다. 
그리고, 기업을 제외한 개인 홈페이지에 적용된 사례는 아직 들어보지 못했기에 메일 주신 분은 아마도 국내에서  알티베이스 데이터베이스 개인 사용 1호의 영광을 안을 수 있을 듯 하다.  필요하면 알티스토리에서 인터뷰라도 한번…^^;;

꼬리글2) 
홈페이지에서 Altibase Value Pack이라는 것을 찾을 수 있다. 이는 알티베이스 데이터베이스를 지원하는 전용 유틸리티의 집합(번들)인데, 실제 알티베이스 사용성을 극대화 할 수 있는 도구를 모아놓은 것이다. 현재는 데이터 설계(엔코아 DA#), 응용 개발 및 모니터링(웨어벨리 Orange)를 번들링하였다. 윈도우 환경에서 설치해 사용해 보면 매우 편리하다는 것을 알 수 있다.  앞으로 확장해 나갈 예정이다.

Journey to the DSM
개발자 세상

 5월은 참 휴일이 많았습니다. 징검다리 휴일, 건강하게 보내셨나요? 저는 너무 푸욱 쉬었더니 머리가 살짝 쑤시네요. 오래 쉬는게 익숙치가 않아서 그런 것 같습니다. 여러분들도 휴식에 지친 심신에 나사 조이고 기름칠하여 즐거운 Working day를 시작하셔야죠?

저의 알티스토리 두번째 포스팅입니다. 한동안 ADS 소식이 궁금했을텐데 제가 요구를 충족시키지 못해 한편으로는 미안한 마음이 큽니다. 그간 많은 일들이 있었습니다. 그중 몇가지, 이야기를 전해드립니다.

그 중 첫번째 이야기

ADS의 이름이 바뀌었습니다. 바로 DSM입니다. Data Stream Middleware의 약어입니다. 새로운 명칭에는 알티베이스 HDB(Hybrid DB)와 더불어, 실시간 데이터에 대한 선처리(Pre-processing)를 통한 고성능 데이터처리 솔루션의 바탕이 되고자하는 의지가 담겨 있습니다. 자~ 이제부터 ADS를 알티베이스 DSM이라고 불러주세요.

[관련포스팅: 알티베이스, DBMS 신제품 발표, ALTIBASE HDB! ALTIBASE DSM!]

두번째 이야기


변명아닌 변명으로 시작하겠습니다. 2010년 말 부터 팀이 매우 바빴습니다. 저도 바빴습니다. 물론 DSM 때문이지요. 그 중 2개월 간의 하드코어불철주야(?) 작업이 있었습니다.(불철주야는 알티베이스에서는 비일상적인 일입니다.^^ 함께 일하실 분은 필히 기억해주세요.) 사정상 지금은 어렵지만 기회가 닿는 대로 그 이야기를 전해드리도록 하겠습니다. 기대하셔도 좋습니다.

그 6개월 간의 기록을 한 문장으로 말하자면…

DSM이 고객의 품에 안기기 위한 성장통을 겪었다고 해야 할까요?

마지막으로 세번째

2011년 올해의 DSM의 목표는 “고객에게 한 발 더 다가가기”라고 제 마음대로 정했습니다. 물론 DSM의 공식 목표는 아니고, 저의 올해 사명서라고 볼 수 있습니다. 이를 위한 구체적인 세부 역할도 정했지요.

a. High Quality Product Developer
b. DSM Activator

좋은 제품을 개발하고자 하는 개발자들의 마음은 다 같지요. 개발자 본연의 소임을 다하는 것이 그 첫째! 좋은 제품이라함은 고객에게 유용한 제품입니다. 고객에게 제품이 유용하려면, 고객이 그 제품을 잘 이해하는 것이 우선합니다. 그동안 DSM이 가지고 있는 물음표가 바로 이것이었습니다. 이 질문에 답을 하는 것이 두번째!

DSM의개념이 DB의 그것과 달리 고객에게 익숙하지 않아, DSM이 고객에게 다가가는데에 어려움이 있었습니다. 생소한 기술을 쉽게 설명하고, 고객의 요구에 비춰 우리의 DSM이 어떤 편익을 줄 수 있는지를 찾아가는 과정이 DSM Activator의 목표입니다.


자! 한 발 더 다가가는 첫 걸음으로 데이터스트림, 스트림 처리 등의 DSM 관련 주제로 비정기 연재가 시작됩니다. 앞으로의 포스팅에서 문제도 내고 선물도 오가며 DSM으로의 여행을 떠나봅시다. 크흣~


아바타와 뽀샾에는 뭔가 특별한 공통점이 있다.
개발자 세상

 2009년 12월 1일… 14년 동안 구상되고 4년에 걸쳐 제작된 영화 ‘아바타(Avatar)’가 개봉하였다. 당시에 ‘아바타 신드롬’이라는 단어를 만들어 낼 만큼 선풍적인 인기를 끌었다. 또한, 그간 세계 영화 흥행 순위 1위를 차지하고 있던 1997년에 개봉된 ‘타이타닉(Titanic)’을 꺾을 영화가 없을 것이라는 예상을 뒤엎고 ‘아바타’는 2010년 1월에 세계 최고 흥행 순위 1위를 탈환했다.


영화 ‘아바타’와 ‘타이타닉’ 포스터

2010년 12월 아바타의 흥행 총 수입은 27억 7950만 달러를 달성하고, 2위와의 격차를 더욱 벌리고 있다. (http://boxofficemojo.com/alltime/world/)

2010년 12월(현재’) 세계 영화 흥행 순위

주제를 바꿔, 요즘 젊은 사람들 중에 ‘뽀샾’이란 단어를 모르는 사람은 없을 것이다. 뽀샾은 일반적으로 Digital 사진을 편집하여, 좀 더 멋있고 예쁜 인물이 되도록 만드는 과정 및 결과물을 통칭하고, 실제로는 사진 편집 유틸인 ‘포토샾(Photoshop)’을 얘기한다. 이렇듯 대중들에게 포토샾은 상품명 또는 제품명이 아닌 하나의 현상을 나타내는 단어로 사용되고 있다.

위에서 얘기한 아바타와 뽀샾은 ‘유명하다’는 공통점외에 한가지가 더 공통점을 가지고 있다. 이제 부터 이부분에 대해 얘기를 시작하려한다.

아바타의 제작자 및 감독인 ‘제임스 카메론’은 위에서 언급한 ‘아바타’, ‘타이타닉’말고도 ‘터미네이터1/2′, ‘에이리언2′, ‘트루라이즈’ 등 흥행에 성공한 여러 영화를 제작한 것으로 유명하다. 그 중에 많이 알려지지 않은(흥행에도 실패?) 1989년 작 ‘어비스(Abyss)’라는 영화가 있다. (국내에서는 ‘어비스(심연)’이라는 제목으로 상영되었다.)

‘어비스’는 미핵잠수함이 정체불명의 물체에 의해 바다 깊숙이 침몰되는 사고가 발생하자 미해군이 침몰된 핵 잠수함의 생존자 수색을 명목으로 민간석유시추선 딥코어와 바다속에서 연합 수색전을 펼치며 벌어지는 얘기를 영화속에서 그려내고 있다.

영화 ‘어비스(Abyss) ‘포스터

1980년대에 영화에서 사용되는 특수효과 기술은 그렇게 발달되지 못했던 단계였기 때문에 제임스 카메론은 ‘어비스’를 통해 이전에 관객들이 보지못했던 새로운 바다속 세계를 보여주기위해서 많은 실패와 도전을 감행하게 되었다.(많은 에피소드 들이 있지만 내용상 이 글에서 다루지는 못한다.)

여하튼, 이러한 제임스 카메론의 노력으로 인해 그 당시 ‘충격’이라고 다루어질만한 두장면을 영화에 담아내게 된다.

첫번째 장면은 영화에서 흰 쥐가 산소가 농축되어 있는 ‘액체 산소’에서 숨을 쉬며 활동하는 장면이다.

액체 산소를 사용하여 호흡하는 장면

영화를 보는 내내 저 장면은 어떻게 찍었는지 또는 어떤 특수효과를 사용했는지 등 많은 사람들이 ‘가짜(fake)’장면이라고 생각 했을 것이다. 하지만 예상을 뒤엎고 위의 장면은 특수효과가 포함되지 않은 ‘진짜(REAL)’ 다.

이 장면에서 흰쥐는 실제로 ‘액체 산소(산소가 농축된 액체 플루오르화탄소(Liquid fluorocarbon))’를 통해 호흡한다. 이 장면에 촬영용으로 6마리의 쥐가 참여(?)하였는데 한마리도 죽지 않았다고 한다. 그리고, 실제 액체 산소는 물보다도 더 투명하지만, 영화에서는 촬영을 위해 핑크색의 무독성 염료를 첨가했다.

하지만, 영화에서 직접 사람이 액체 산소를 사용하여 호흡하는 장면이 나오는데 이 장면은 실제 액체산소를 사용한 것은 아니고 배우가 숨을 참고 있었다고 한다.

마치 액체산소로 숨을 쉬는 듯 연기하는 장면(으악! 살려주세요!!)

실제로 연기하는(?) 주인공

그리고 이 글의 중심이 되는 두번째 장면이다. 이 장면은 영화사에서 ‘현대 디지털 특수효과의 출발점’이 된 중요한 신(Scene)으로 외계 생명체가 물기둥으로 변해 시추선으로 들어와 사람과 조우하는 장면이다.

당시 충격적인 특수효과로 모두를 놀라게 했던 Abyss의 한 장면

제임스 카메론 감독은 만약 이 장면의 특수효과가 기대에 못미친다면 과감하게 삭제할 예정이었다. 왜냐하면 기존의 CG 장면은 어색하게 그지 없는, 배경과 대상이 따로 노는 장면이 대부분이였기 때문에 이 장면을 완벽하게 실제와 같이 만들어 낼 수 있을 것이라고는 생각하지 못했었다.

영화를 보신 분이나, 위의 사진을 보면 아시겠지만 이 장면은 영화에 삽입되었고,  기존의 특수효과와는 다르게 ‘실제(REAL)’와 같았다.  당시 불가능해 보이던 제임스 카메론 감독의 요구를 만족하게 하고, 모두가 놀랄만한 장면을 만드는데 중요한 역할을 한 사람은 ILM(Industry of Light & Magic)의 특수효과 전문가인 ‘존 놀(John knoll)’이었다.

특수 효과 전문가 ‘존 놀(John Knoll)’

‘이 사람이 누구냐?’ 하는 자세한 설명보다 아래 사진을 먼저 보면 알수 있을 것이다.



그렇다. ‘존 놀(John knoll)’은 포토샾의 제작자 중 한 사람이다. ‘어비스’의 물기둥 장면을 맡을 무렵 그는 형 ‘토마스 놀(Thomas knoll)’과 함께 맥킨토시용 이미지 편집 프로그램인 ‘포토샾(Photoshop)’, 일명 ‘뽀샾’을 상용화할 계획을 세우고 있었다. 그에게 ‘어비스’의 물기둥 장면은 프로그램 상용화에 앞서 프로그램의 문제점을 보완하고 다양한 기능을 부가하는 최적의 연습교제로 여겨졌다.




‘존 놀’은 이 장면을 ‘포토샾’을 사용하여 한 프레임(Frame), 한 프레임씩 제작하였다. 일반적으로 DVD에 1초당 24~27 프레임이 들어가니 약 1분동안의 장면을 위해서 1440~1620개의 장면을 편집하고 처리해야만 했고 엄청난 양의 일이였다. 결국 그는 실제와 같은 장면을 만들어 냈고, 이는 영화사상 길이 남을 만한 장면이 됐다. (영화는 기억못하더라도 이 장면은 기억하는 사람이 있을 것이다)

그후, ‘어비스’의 작업 경험을 토대로 ‘존 놀’,'토마스 놀’ 형제는 1990년 2월에 포토샾을 출시하게 되었고, 20년이 지난 지금 이 프로그램은 하나의 사회적 현상이 될 만큼 선풍적인 인기를 끌고 있으며 현재까지 계속 발전하고 있다.

글을 마치며…

전혀 공통점이 없을것 같아 보였던 영화 ‘아바타’와 ‘뽀샾’…. 과장을 섞어서 만약 ‘포토샾’이 없었더라면 ‘아바타’의 생생하고 멋진 장면은 생각할 수도, 만들어 낼 수도 없었을지 모른다. (실제로 영화 ‘아바타’의 엔딩 크레딧에서 ‘존 놀’은 Visual Effect Supervisor로 참여했다고 나와있었다.)

10년전 국내의 작은 회사에서 DBMS를 만든다고 했을때 많은 사람들은 ‘외산 제품을 사용하면 되지.’라고 생각했었고, 국내 제품은 제대로 돌아가지도 못할것이고, 정상적인 운영은 불가능이라고 생각했었다. 10년이 지난 지금 ‘Altibase’라는 DBMS는 많은 성장을 하였고, 많은 산업 분야에서 지금 이시간에도 정상적인 수행을 하며 여러분의 생활에 직/간접적으로 도움을 주고 있다. 앞으로 10년 뒤 Altibase도 ‘하나의 사회적 현상’으로 불릴만큼 많은 성장과 인기를 누렸으면 하는 꿈을 꾸며 글을 마친다.

P.S. 제작과정의 에피소드 및 포토샾 인용은 다음의 링크에서 볼 수 있습니다.

어비스 제작과정


프로그래머의 준비물
개발자 세상

 안녕하세요.  머무는여행입니다.   제가 ‘개발자 세상’ 메뉴에 글을 쓰게 되는 날도 다 있네요^^ 

저희 알티베이스 품질관리팀 김성재님의 특별 기고를 받았다고나 할까요? ㅎㅎ 사실은 다른 커뮤니티에 올리신 글을 보고 내용이 좋은 것 같아 퍼오고 싶다고 하니, 직접 새로 다듬어 주신 거랍니다.  성재님 넘 감사해요~~^^

그럼, 프로그래머의 준비물… 궁금하시죠?  이제 소개합니다.

——————————————————————————————————————————-

초등학교 시절에 연필을 안들고 가면 선생님이 늘 하던 말씀이 있다.  군인은 전쟁하는데 총을 들고 가는데 학생이 공부하는데 연필을 안들고 오면 어떡하냐?
그럼 프로그래머의 준비물은 무었일까요?  “컴파일러와 notepad 만 있으면 돼” 하는 하는 영웅들의 이야기가 아닙니다.
평범하고 우리 주변에 흔히 볼수 있는 프로그래머들을 위한 준비물을 알아 봅시다.

1장 개발 산출물 관리도구

개발시에 나오는 산출물을 관리하는 도구들을 알아봅니다.

1-1. 코드 관리툴


다른 말로는 형상관리툴이라고도 합니다.
간단하게 말하면 “우리가 작년에 코딩한 코드를 알고 있는 도구 입니다.”
코드 관리 툴을 사용하면 임요환이 마린 컨트롤 하듯이 코드를 컨트롤 할수 있습니다.

다른 사람과의 코드교환이나 코드 통합, 특정 시점에 발생한 버그 추적등을 간단히 할수 있습니다.
코드 관리툴은 간단한 코멘트를 저장할수 있지만 이것만으로는 부족하므로 다음에 설명한 버그관리툴과의 연동이 필수적입니다.

무엇을 사용할것인가? svn 추천합니다. 요즘 대부분 svn 을 사용하는듯 합니다.
또한 svn 은 커맨드 기반이므로 GUI 로 편리하게 쓸수 있는 도구를 사용합시다.
viewcc 등을 사용하면 웹에서 코드를 볼수 있는 기능을 제공합니다.

1-2. 버그 관리툴
예전에는 버그 관리툴이라고 불렀는데 요즘은 이슈관리툴이라고 합니다.


이슈는 버그보다 확장된 개념으로 기능추가나 고객이 제기한 버그가 아닌 문 제들까지 포함하는 개념입니다.
버그 관리툴에는 어떠한 논의가 있었고 어떻게 추적했으며 어떻게 수정했는지 를 기록합니다.
버그 관리툴을 도입하면 생산성을 저하시킨다라는 이유로 반발이 심합니다.
맞습니다 생산성이 저하됩니다. 하지만 버그 관리툴을 사용하면 시간이 지날 수록 빛을 발휘 합니다.
개떡이라는 단어가 있습니다. 우리 주변에서 흔히 볼수 있죠. 생각나십니까?
바로 당신이 보고 있는 코드죠.
개떡에도 삶의 이유가 있을진데 우리는 그것을 보고 같은 코드를 작성하면 안 되겠죠.
버그 관리툴은 신입교육에도 좋습니다. 신입 교육은 분명이 비용이 많이들고 그래서 경력같은 신입을 원하죠. 하지만 그런 사람은 없습니다.
경력자의 버그 추적 방법이나 수정 방법, 생각의 방식등이 버그 관리툴에 녹 아 있습니다. 신입은 그것을 읽기만해도 내공이 상승합니다.

무엇을 사용할것인가? 멘티스나 trac, 버그질라을 추천합니다.
코드 관리툴과의 연동방법을 제공하고 다양한 노하우가 녹아져 있습니다.
간단히 설명하면 svn ci -m “BUG-1000″ 을 수행하면 버그 관리툴의 BUG-1000 이란 게시물에서 제가 수정한 내용을 볼수가 있습니다.
버그의 히스토리까지 같이 볼수 있다는 장점이 있습니다.

1-3. 문서 관리툴
프로그램 개발을 하게 되면 코드와 버그만 생성해 내지 않습니다. 문서도 만 들어 내죠. 그래서 문서 관리툴이 필요합니다.
일반적으로 2가지 방법을 사용합니다.
첫째는 문서도 코드처럼 관리하는 방법입니다. 코드 관리툴에 저장을 하고 버 그 관리툴로 히스토리를 관리하는 방법입니다.
강력한 문서 편집툴을 사용할수 있는 장점이 있지만 검색이 안되고 버젼간 변 경사항을 보기 힘들다는 단점이 있습니다.
둘째는 wiki 를 이용하는 방법입니다. wiki 를 구성하여 접근성이 편리하게 문서를 생성하는 방법입니다.
wiki 문법을 익혀야 하고 편집이 강력하지 못하지만 접근성이 편리하고 문서 히스토리 관리가 편리하다는 장점이 있습니다.

 

2장 개발 시스템

1장에서는 개발과정에서 나오는 산출물에 대해서 설명했다면 2장은 개발하는 행위에 관한 내용입니다.

2-1. 코딩 규칙

우리 주변에서 흔히 볼수 있는 그런 프로그래머들이 이해할수 있는 산출물을 만들도록 노력해야 합니다.
그래서 규칙을 정하고 일정 시간을 들여서 규칙을 가르칩니다. 이것은 코드뿐 만이 아니라 모든 산출물에 대해서 적용되어야 합니다.
이러한 규칙을 통해서 모든 개발자들이 한눈에 산출물을 이해하고 바로 업무 에 투입한다는것은 환상에 가깝습니다.
하지만 그 기간을 충분히 단축시킬수 있습니다.

 

2-2. 리뷰 시스템
산출물를 수정하고 나서 다른 개발자와 검토해야 합니다. 산출물의 수정사항 을 보면서 토론을 하는것입니다.
참여자는 산출물의 수정량이나 중요도에 차등 적용하는것이 좋습니다. 코드 1 줄 고치는데 모든 팀원을 모으는것은 잘못된 것이죠 리뷰는 잘못하면 형식적으로 흐르기 쉽습니다. 관리자의 의지가 중요합니다.

2-3. 빌드 검증 시스템
개발자가 확인하고 코드를 반영해도 파일을 몇개 빼먹는다던가 하는 실수는
자주 일어납니다.
따라서 코드 관리도구에 코드가 반영될때마다 컴파일이 제대로 되었는지 확인 을 하는 시스템을 구축하면 좋습니다.
추가적으로 간결한 테스트를 자동으로 진행하면 좋습니다.
예를 들면 컴파일은 잘되었지만 실행이 안될수 있습니다. 실행은 되지만 아주 기본적인 기능이 동작하지 않을수 있습니다.
코드 관리도구의 기능을 사용하면 자동으로 컴파일하고 테스트를 수행하도록
할수 있습니다.

유닉스? unics? unix!
개발자 세상

IT 에서 일반적으로 사용하게 되는 단어에는 재미있는 일화가 많이 담겨져 있는 경우가 많다.

버그(Bug)라는 단어가 어떻게 프로그램 오류를 나타내는 단어가 되었는지, 왜 컴퓨터를 켤때 Booting 이라는 단어를 사용하게 되었는지 그리고, 식사 메뉴중에 하나인 SPAM이 왜 광고메일을 나타내는 단어가 되었는지.. 그 어원을 찾아가다보면 우리가 알지 못했던 그 시대의 생활상을 알 수 있을때도 있다.

이번에는 대표적인 운영체제인 UNIX가 어떻게 UNIX라는 이름을 갖게 되었는지에 대해서 알아보자.

– Unix는 1969년에 벨 연구소에서 인터랙티브 시분할 시스템으로서 만든것이 그 시초가 된 운영체계이다.

1960년대 MIT, 벨 연구소(AT&T Bell Lab.) 및 제너럴 일렉트릭(GE co.)은 “GE-645″ 메인프레임 컴퓨터 상에서 돌리기 위한 실험적인 운영체제인 멀틱스(MULTICS, MULTiplexed Information and Computing Service)를 함께 연구하고 있었다.

이 연구의 목적은 향상된 보안, 시분할 처리와 세그먼트라고 불리는 파일저장 방식 도입등 여러가지 혁신적인 기능들을 갖는 쌍방향 운영체제를 만드는 것이었다.

개발이 끝나고 MULTICS 운영체제가 릴리즈되어 “GE-645″에 탑재하였으나, 그 결과는 참담했다. 수행 속도가 너무 느리고, 사용하기 너무 복잡했기 때문에 사용하기 어렵다는 의견이 많이 나왔고, 결국 MULTICS 연구는 1969년에 중단되었다.

AT&T Bell Lab.은 MULTICS Project가 중단된 이후에 연구원들을 다른 업무에 배치하였다. MULTICS Project에서 시스템 프로그램 일원이었던 AT&T Bell Lab.켄 톰슨(Ken Thompson)은 Project의 실패 이후에 당시 유행하던 일괄처리 운영체제에 매달리거나, 실패작이었던 MULTICS를 다시 시작할 생각이 전혀 없었다.

이때 켄 톰슨이 관심을 갖고 있던것은 MULTICS에서 구현되었던 Space Travel이라는 게임이었다. 하지만, Space Travel은 GE-645 메인프레임 컴퓨터 상에서 매우 느리고, 게임을 하기 위한 비용이 많이 들었다(한번 돌릴때 마다 $75가 들었다고 한다).

켄 톰슨은 데니스 리치(Dennis Ritchie)의 도움으로 놀고 있던 미니(?) 컴퓨터 장비인 DEC(Digital Equipment Co-operation) PDP-7 어셈블리 언어로 다시 Porting을 했다.


켄 톰슨(왼쪽)과 데니스 리치

이 당시 개인적인 사정으로 인해 켄 톰슨의 아내가 어린 아들을 데리고 한달간 집을 떠나 있게 되고, 무엇인가 집중할게 필요했던 켄 톰슨은 한달동안 죽치고 앉아서 Space Travel 게임을 두명이 함께 할 수 있도록 하는 DEC PDP-7을 위한 새로운 운영체제를 개발하게 된다.

거대한 운영체제를 만들고자 한것이 아닌 단순히 Space Travel 게임을 데니스 리치와 함께 하기 위해서 였다.
이 운영체제는 MULTICS, CMAS(Cambridge Multiple Access System), CTSS(Compatible Time Sharing System)의 장점을 수용하여, PROJECT에 참여하는 여러 프로그래머 간에 DATA는 보호하면서, 공유해야할 DATA는 여러 사람이 쉽게 사용할 수 있도록 하는 것이였고, 그것이 최초 UNIX OS로 1969년에 PDP-7미니 컴퓨터 장비에서 동작하는 OS가 된것이다.

아이러니하게도, 이 운영제체를 개발할 당시 AT&T Bell Lab.에서는 개발에 대한 재정적인 지원을 따로 받지도 않았다고 한다.

PDP-7용 새로운 Multi-Tasking OS는 동시에 두 사용자를 지원해서 UNICS(Uniplexed Information and Computing System)라고 불렀다.

실제로는 브라이언 커니건(Brian Kernighan)은 멀틱스에 대한 반발로 “거세된 MULTICS”라는 “eunuchs(내시)”의 동음이의어인 UNICS라는 말장난으로 만들었다고 한다. 즉, 최초의 UNIX의 이름은 UNICS였다.


DEC PDP-7 (엄청 미니하다)

후에, Computer Science Research Group이 PDP-7보다 큰 컴퓨터에서 유닉스를 사용하기를 원했을 때까지도 벨 연구소로부터의 재정적인 지원은 없었다.
톰슨과 리치는 PDP-11/20 용 유닉스에 텍스트 처리 기능을 추가하겠다는 약속을 했고, 이에 따라 벨로 부터 약간의 재정적인 지원을 받게 되었다.
그리고 1970년, UNICS(eunuchs)의 좋지않은 발음때문에 이름을 UNIX로 바꾸었고, 유닉스 운영 체제 (Unix Operating System)라는 이름을 공식적으로 가지고 PDP-11/20에서 운영되었다.


켄 톰슨(seated)과 데니스 리치(Standing) at a PDP-11

이처럼 현재 운영체제에서 대표적으로 인식되는 UNIX가 UNIX라는 이름을 갖기까지 재미있는 일화가 있었다.

필자는 이 일화에서 느낀 점을 간단히 적어보고자 한다.
엄청난 인력과 자본력이 더해진 MULTICS Project의 실패를 보더라도 연구의 결과는 항상 성공이 아니다.

이는 연구는 일정한 Input이 있다고 반드시 일정한 Output이 나오는 그런 공식이 아니기 때문이다.

Project가 실패하더라도 Project를 진행했던 지식과 사람들만 있으면, 그것만으로도 회사의 재산이 될수 있을 것이다.

소프트웨어의 성공은 개발자를 공식에서 사용되는 하나의 INPUT으로 생각하지 않는 존중으로 부터 시작하는게 아닐까 생각하면서 재미없는 글의 마침표를 찍는다.