Skip to content

언제부턴가 없어진 프로그램들

요즘 프로그램어들은 어떤 프로그램에 열을 올리는지 궁금하다.
내가 이바닥 노땅(^^)이다 보니 요즘은 웹말고는 별로 개발하는 프로그램들을 볼수가 없다. 게임은 예외적으로 생각되지만…프로그램이라고 생각하기는 좀 다른 차원인거 같고..

과거 하이텔, 천리안 시절에 가장 인기있는 페이지가 바로 프로그램 다운로드페이지 였던걸로 기억한다. 요즘 다운로드 사이트를 가봐도 국산 프로그램은 비중이 10%도 안돼는거 같다..이게 IT강국인감..ㅠㅠ

개발자 사이트를 다녀봐도 외국의 경우 원천 기술이나 소스를 개발하는것도 많은데 국내 사이트들은 주로 소스를 구하는 글만 수두룩 한거 같다. 포럼이나 공동개발 같은건 뜨문뜨문 나오지만 그나마 뽀대나는 프로젝트는 그다지 눈에 안띤다.

요즘 컴퓨터를 재 설치해도 특별히 설치할 프로그램도 없는거 같다
워낙 인터넷 브라우져만 있으면 되는 세상이기도 하지만..ㅠㅠ

앞으로 5년 정도 뒤에는 프로그램이란 의미도 많이 바뀔거 같다.

아직도 도스모드, 커널, 데몬 이런 프로그램에 대한 미련을 버릴 수가 없고…과거 윈도우 프로그램이나 유틸리티도 참 많이 개발했었는데…

인트라넷을 도입하기전 고려할점

이메일과 메신저만으론 업무의 효율성을 기대할수는 있지만 업무의 정리나 관리가 불가능하여 많은 회사에서 인트라넷을 도입하게 된다.

시중에는 아주 고가에서 저렴한 제품까지 상당히 많은 제품들이 난립(??) 하고 있으며 많은 회사에서 인트라넷을 도입하기 위해 많은 시행착오를 하고 있다…특히 자체적으로 개발해서 쓸려는 어설픈(^^) 개발사들도 참고할 내용을 정리해 볼려고 한다.

인트라넷을 검토하는 가장 큰 이유로 자료 보관 및 메일 대체수단으로 생각하는 경향이 많다. 하지만 이런 접근 방식으로 하다보니 그다지 성공하는 회사를 찾아보기 힘든게 사실이다.
첨 도입단계에서는 너도나도 한번씩 업무에 적용하고자 하다고 결론적으로 게시판만 잔뜩 늘어난 블로그가 되가는 모습에 실망하고 예전으로 돌아가는 경우를 흔히 봐왔다.

간단한 예로 우리가 PDA나 개인일정 관리를 위해서 사용하는 PIMS계통의 프로그램을 안써본 사람은 거의 없을거다..하지만 그 프로그램을 1년이상 사용하고 자신의 업무를 관리하는 사람은 매우 드물다. 전화번호 하나만 봐도 PDA나 개인 컴퓨터 주소록에 등록하지 않는다. 이에 반해서 회사 회계 프로그램은 어느회사에서도 다 사용하는 프로그램이다. 이 둘의 차이를 자세히 살피면서 왜 인트라넷이나 PIMS프로그램들이 성공하기 힘든지 ….

1. 인트라넷 설계는 주로 IT를 하는 주도하고 회계 프로그램은 주로 회계나 경리업무 전문가가 설계한 경우가 많다. 그래서 인트라넷은 좀더 프로그램 스럽고 이쁜 반면 회계 프로그램은 좀 구식 터미널 느낌이 나는 경우가 많다.

2. 인트라넷 도입은 윗사람이 꼭 필요해서 하는 경우가 많지만 회계 프로그램은 실무 담당자가 꼭 필요하다고 해서 구매하는 경우가 많다.

3. 인트라넷에 입력된 자료는 윗사람이 잘 안보고 회계로 입력된 내용은 윗사람이 잘 본다.

4. 인트라넷은 제품마다 무진장 다른거 같이 홍보를 하고 서로간에 호환이 전혀 안돼지만 회계는 기존의 데이타 다 가지고 올수 있다는 기본 전제하에 제품이 많고 모든 프로그램들이 메뉴나 사용법이 비슷하다.

5. 인트라넷은 입력되는 자료에 비해서 출력되는 내용이 1:1 이다..거진 게시판 수준…회계 프로그램은 전표 입력 하나 하고 나면 외우지도 못할정도로 많은 보고서 종류가 나온다.

6. 인트라넷에 올려놓은 자료는 시간이 지나거나 담당자가 바뀌면 거진 자료를 찾을 수가 없는데 회계는 담당자가 바뀌어도 바로 찾는다.

7. 인트라넷은 무진장 비싸고 회계는 거진 정찰제 수준의 가격이다.

간단히 살펴만 봐도 그 차이가 크다는걸 느낄 수 있다.
인트라넷을 만드는 분들이 꼭 생각해야 하는 몇가지를 정리한다면.

1. 인트라넷 도입은 절대적으로 임원 또는 최고 관리자의 의지와 추진력으로 해야 한다.

2. 윗사람이 잘 안쓰는 인트라넷은 절대 성공하지 않는다.

3. 프로그램이 좋아서가 아니라 그 용도가 명확해야 한다.

4. 게시판 형태의 인트라넷은 절대 성공하지 못한다.

5. 각각의 개인이 업무에 절대적으로 필요하다고 느끼지 못하면 마치 개인일정관리 프로그램처럼 도태된다.

6. 인트라넷은 관리가 아닌 정리와 공유의 개념이 우선되야 된다.

7. 인트라넷에는 자료가 쌓이는 백업 장소가 아니라 여러부서와 인력이 투입되고 진행되는 과정과 히스토리의 툴로 이용되어야 한다.

8. 전자결재도입시 매우 신중하게 생각해야 한다. 천만원짜리 결재문서를 1,2백만원짜리 인트라넷으로 결재하는건 고려해봐야 한다. 물론 더 비싼 인트라넷이라도 크게 다른바가 없지만..

리눅스 데몬 개발 4/8

지난 3장까지는 기초적인 함수와 개녕이였고 이번 장부터는 실질 서버의 모습을 소개합니다.

첨부된 소스는 최소한의 코딩으로 만든 서버로 클라이언트가 접속한뒤 문자열을 송신하면 클라이어트에 받은 문자갯수를 돌려주고 종료하는 프로그램입니다.

테스트를 위해서는 telnet 을 클라이언트로 이용하시면 됩니다.
서버 기동시 포트번호를 파라메터로 입력하시면 되는데 주의할점은 1024 이하의 번호를 쓰기 위해서는 root로 로그인되어야 하고 이후번호의 경우는 무관합니다. linux의 기본 보안 정책이고..

tcp 서버를 만들기 위해서 가장 기본적으로 사용하는 함수는
socket, bind, listen, accept, recv, send, close

클라이언트라면
socket, connect, send, recv, close

서버의 경우는 bind, listen, accept 가 추가됩니다.

socket은 통신을 하기 위한 핸들을 생성하는 함수입니다.
파일 오픈과 동일한 기능이라고 생각하면 됩니다.
실재로 socket에서 리턴된 핸들에다 read, write와 같은 파일 명령으로 데이타를 송수신하여도 동일한 결과로 동작하게 됩니다.
close를 이용하는 걸 봐도 같다는걸 알수 있습니다.

bind는 뭔가를 묶는다는 뜻이므로 해당 어드레스와 포트를 시스템에게 예약하는 명령어입니다.

listen은 클라이언트가 젒속하도록 대기상태로 만드는 것입니다.
실제로 listen 이후부터는 클라이언트가 접속이 가능합니다.

일반적으로 listen( s, 5 )라고 5라는 숫자가 있는 리눅스의 기본 queue의 갯수가 5입니다. 변경할 필요도 없으면 크게 한다고 해서 실제로 커지지도 않습니다. 큐의 개념은 accept 로 빼내기전에 버퍼링되는 커넥션이라고 생각하면 됩니다.

accept라는것을 접속대기중인 클라이언트를 실제로 프로그램과 접속을 시켜주는 명령어입니다. accept의 리턴값이 소켓이고 새로운 소켓번호를 통해서 접속된 클라이언트와 송수신을 하게 되는 것입니다.

이후는 recv, read, send, write의 함수를 이용해서 통신을 하면됩니다.

샘플소스는 무조건 클라이언트를 기다라다가 접속이후 문자열을 기다리다가 문자열이 들어오면 문자열을 출력한뒤 클라이언트로 해당 문자열의 길이를 반환하고 종료하는 프로그랭입니다.

실제로 서버라기 보다는 수신 대기프로그램 및 수신 테스트 프로그램이라고 생각하면 됩니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h>  

#include <netdb.h> 
#include <sys/socket.h> 
#include <arpa/inet.h>  

int main( int argc, char *argv[] ) 
{ 
    if ( argc != 2 ) 
    { 
        printf( "Usage : %s port 
", argv[0] ); 
        return -1; 
    }  

    struct sockaddr_in  addr;  

    memset( &addr, 0, sizeof(addr) );  

    addr.sin_addr.s_addr = htonl( INADDR_ANY ); 
    addr.sin_port = htons( atoi( argv[1] ) );  

    int s = socket( AF_INET, SOCK_STREAM, 0 );  

    if ( !bind( s, (struct sockaddr *)&addr, sizeof(struct sockaddr_in) ) ) 
    { 
        if ( !listen( s, 5 ) ) 
        { 
            int S = accept( s, NULL, NULL );  

            if ( S != -1 ) 
            { 
                char buff[1024]; 
                int  size;  

                memset( buff, 0, sizeof(buff) ); 
                size = read( S, buff, sizeof(buff) );  

                printf( "Read : %s 
", buff );  

                sprintf( buff, "Read %d bytes 
", size ); 
                write( S, buff, strlen(buff) );  

                close( S ); 
                printf( "Disconnect 
" ); 
            } 
            else 
            { 
                printf( "accept error 
" ); 
            } 
        } 
        else 
        { 
            printf( "listen error 
" ); 
        } 
    } 
    else 
    { 
        printf( "bind error 
" ); 
    }  

    close( s );  

    return 0; 
}