2009년 9월 29일 화요일

Online office view

씽크프리 온라인 사용법 동영상

 

제1편. "빠른 시작"

 


 

 한글과컴퓨터 씽크프리 온라인의 사용법 동영상 제1탄, "빠른 시작" 편입니다.

 

"빠른 시작" 즉, Quick Start 기능은, 로그인하지 않고도

씽크프리 온라인의 주요 기능을 사용할 수 있는 맛보기 프로그램입니다.


PC에 오피스 프로그램이 깔려있지 않아도

HWP를 비롯한 다양한 문서를 볼 수 있고, 또한 PDF 등의 포맷으로 변환도 가능합니다.


"빠른 시작"을 통해 씽크프리 온라인의 강력한 기능을 먼저 맛보세요!

 

 

 

출처: http://company.thinkfree.com/kr/views/jsp/user/company/articleList.jsp?type=N&seq=13

 

프로그래밍을 공부하다가 우연히 발견하게 되었다.

 

 이 프로그램은 웹상에서 WORD문서나 HWP, PowerPoint 문서등 다양한 문서들을 볼 수 있는

온라인 오피스 뷰어 이다.

 

PPT자료나 WORD 및 HWP 자료로 강의를 할때 유용하게 USB에 저장해서 가지고 다니는 번거로움이

없는점이 좋은 장점인듯 하다.

 

웹 페이지 주소는

 http://member.thinkfree.com/member/goLandingPage.action 

 

이곳이며, 기존 구글 이메일이 있는 사람이면 회원가입 없이 로그인이 가능하다.

까다로운 회원 가입방식이 아니며,

무료 회원가입후 1GB의 무료 저장공간을 제공한다.

 

 

2009년 9월 23일 수요일

최대공약수 / 최소공배수 구하는 프로그램

#include <stdio.h>

int main()

{

int A, B, GCM, LCM, BIG, SML, NMG;

 

printf("\t최소 공배수와 최대 공약수 구하기.\t\n");


printf("구하고자 하는 숫자를 입력하시오: ");
scanf("%d", &A);

printf("\구하고자 하는 숫자를 입력하시오: ");
scanf("%d", &B);

 

if(A > B)
{

BIG = A;
SML = B;

}
else
{

BIG = B;
SML = A;

}

aaa:

if(BIG % SML == 0)
{

GCM = SML;
LCM = A*B/GCM;
printf("GCM = %d, LCM = %d\n", GCM, LCM);

}
else
{

NMG = BIG % SML;
BIG = SML;
SML = NMG;
printf("NMG = %d, BIG = %d, SML = %d\n", NMG, BIG, SML);
goto aaa;

}

printf("GCM = %d, LCM = %d\n", GCM, LCM);

}

 

첨부파일은 윈도우에서 커맨드창을 실행하신 다음 커맨드에서 실행하시기 바랍니다.

 

2009년 9월 7일 월요일

[C/C++] 구조체란

 구조체(Structure)는 서로 다른 데이터형으로 구성된 여러 개의 항목이 모여 집단 항목을 이루는

복합 자료형이다.

 

 예를들어 시간을 저장하는 자료형이 필요하다고 하면, 이를 위해서는 세 개의 벼누가 필요하다.

그 이유는 시(Hour), 분(Minute), 초(Second) 정보를 저장해야 하기 때문이다.

이들은 독립된 정보가 아니라 시간을 언급할 때 늘 붙어 다녀야 하는 것이기에 하나의 정보를 나타낸다.

이렇게 늘 붙어 다니는 정보들은 하나로 묶어서 관리하는 것이 편리하다.

 

 시, 분, 초를 하나로 묶어서 관리할 수 있도록 새로운 자료형을 정의하기 위해서

구조체가 사용된다. 다음은 시간을 관리하는 구조체를 정의한 것이다.

 

struct time

{

int hour;       //시

int minute;    //분

int secind;   //초

};

 

※ 시간을 저장하는 구조체를 정의하고 사용하기 <code>

 

#include <stdio.h>

struct time
{

 int hour;
 int minunte;
 int second;

};

 

void main()
{

 struct time first;

 first.hour = 9;
 first.minunte = 51;
 first.second = 20;

 printf(" %2d시 %2d분 %2d초 \n", first.hour, first.minunte, first.second);

}

 

2009년 9월 4일 금요일

[C/C++] const 예약어

const는 상수를 선언할 때 사용하는 예약어이다. 상수는 프로그램 실행 중에 값을 변경할 수 없다.

그렇기 때문에 대입연산자 왼쪽에는 올 수 없다.

 

변수 선언문에서 예약어 const를 추가하면 변수를 상수화 할 수 있다.

const double pi = 3.141592;

pi는 변수 형태로 선언되었지만, const가 추가되었기에 초기값으로 준 3.141592 만을 가질 수 있다.

(* 프로그램이 진행되는 중간에 값을 변경할 수 없다.)

[C/C++] C 포인터와 함수_전달함수

* 함수에서 매개변수 전달하는 방식

 매개변수의 전달이란 함수에 사용될 데이터를 보내는 방법이다.

함수에서 매개변수를 전달하는 방법에는 다음 2가지가 있다.

1) 값 전달 방식(Call by Value)

2) 주소 전달 방식(Call by Address)

C언어에서는 함수의 전달 방식은 기본적으로 값 전달방식을 사용하고 있다.

 

 

※ 값 전달 방식 함수 정의하기 코드

#include <stdio.h>

int sum(int a, int b);

void main()

{

int a = 10, b = 20, c;

c = sum(a, b);

printf(" %d + %d = %d \n", a, b, c);

}

 

int sum(int a, int b)

{

int c;

c = a + b;

return(c);

}

※ 주소 전달방식으로 두 변수 값을 교환하는 함수 정의 코드

#include <stdio.h>

void swap(int *pa, int *pb);

void main()

{

int a = 10, b = 20;

printf("\t swap 함수 호출 전 \n");

printf("\t a => %d, \t b => %d \n", a ,b);

swap(&a, &b);

printf("\n\t swap 함수 호출 후 \n");

printf("\t a => %d, \t b => %d \n", a, b);

}

 

void swap(int *pa, int *pb)

{

int t;

t = *pa;

*pa = *pb;

*pb = t;

}

2009년 9월 2일 수요일

[C/C++] C 포인터1_2(포인터 변수)

 C언어에서는 주소만을 저장하는 포인터 변수가 별도로 제공된다. 일반적인 변수와의 구분을 위해서

포인터 변수를 선언할 때에는 반드시 * 기호를 사용한다.

 

형식) 자료형 *포인터변수명;

 일반 변수에도 특정 값을 저장하듯이 포인터 변수에도 값을 대입해야 하는데, 포인터 변수는

주소만을 저장할 수 있다.

형식) 포인터변수 = &변수;

다음의 코드는 서로 다른 자료형으로 3개의 변수가 선언되어 있고, 각 변수의 주소를 포인터 변수가

저장하고 있다.

char x='X';

int y=10;

double z= 3.14;

 

pX = &x;

pY = &y;

pZ = &z;

 

 

[C/C++] C 포인터1_1(선언된 변수의 메모리상의 주소 출력)

* 포인터에 대한 이해

 

아래 코드는 다양한 형태의 변수를 선언하고 그 변수들의 메모리 위치를 살펴보기 위해서

포인터 연산자 &를 사용한 예이다.

 

#include <stdio.h>

void main()

{

char a = 'A';

int b = 10;

double c = 2.6;

 

printf(" a의 값=> %c \t 주소=> %p \n", a, &a);

printf(" b의 값=> %d \t 주소=> %p \n", b, &b);

printf(" c의 값=> %.1f \t 주소=> %p \n", c, &c);

}

결과>

 

 

 

 

 

2009년 9월 1일 화요일

"故" 삼가 고인의 명복을 빕니다.

 

2009년 9월 1일 16시 3분께..

영화배우 장진영씨가 위암으로 투병중이다.. 별세 하셨다고 합니다...

여자 영화배우중 좋아하는 배우인데...삼가 고인의 명복을 빕니다.

2009년 8월 24일 월요일

[Linux] cd 명령어를 알아보자.



linux 에서 가장 흔하게 사용되는 cd 명령어의 대표적인 사용예들이다.

사용방법

 의미

 cd  자기 자신의 홈디렉토리로 이동하기(cd ~와 같음)
 cd /  루트디렉토리(/)로 이동하기
 cd .  현재 디렉토리(현재위치)로 이동하기
 cd ..  한단계 상위디렉토리로 이동하기
 cd ~  자기자신의 홈디렉토리로 이동하기(cd 와 같음)
 cd -  바로전에 위치했던 디렉토리로 이동하기
 cd /var  /var 디렉토리로 이동하기
 cd /etc/rc.d/

 /etc/rc.d/ 디렉토리로 이동하기

들이 있다.

2009년 8월 20일 목요일

Naver N드라이브.

목록
N드라이브 오픈베타 출시 안내
조회 26086
09.07.30 17:40

안녕하세요. N드라이브 서비스 운영팀입니다.

 

N드라이브 오픈베타 서비스가 오픈했습니다.

N드라이브는 여러분의 파일을 편리하게 저장하고 활용할 수 있는 웹 저장 공간입니다.

문서, 사진 등 각종 파일을 내 N드라이브에 저장해 놓으면 집, 회사, PC방 등 어느

컴퓨터에서나 네이버에 로그인만 하면 쉽게 파일을 확인해 활용할 수 있습니다.

이제, 온라인에서 여러분의 파일을 편리하게 관리하고 다양하게 활용해 보세요!

 

뛰어난 파일 접근성

당장 필요한 파일을 집이나 회사에 두고 와서 곤란했던 경험이 있으셨죠?

N드라이브를 사용하시면 온라인에서 언제나 파일을 올릴 수 있고, 필요한 순간에 바로

사용할 수 있습니다. 또한 N드라이브에 있는 문서 파일을 별도의 설치 프로그램 없이

문서뷰어로 바로 볼 수 있고, 사진 파일도 포토뷰어로 편리하게 감상하실 수 있습니다.

 

네이버 서비스와 연동

N드라이브에 있는 파일을 몇 번의 클릭으로 네이버 메일, 블로그, 카페로 보내

다른 사람과 쉽게 파일을 공유할 수 있고, 네이버 메일, 블로그, 카페에 글을 쓸 때

N드라이브에 있는 파일을 가져와서 첨부할 수도 있습니다. 네이버 서비스와의 연동

기능을 이용해서 N드라이브에 저장 중인 파일을 다양하게 활용해 보세요.

 

[N드라이브에 저장 중인 파일을 메일, 블로그, 카페로 보내기]  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[메일, 블로그, 카페에서 글을 쓸 때 N드라이브 파일 첨부하기] (8월 초 오픈 예정)

 

 

 

 

 

 

 

 

 

 

 

 

 

[받은 메일의 첨부 파일을 N드라이브에 저장하기] (8월 초 오픈 예정)

 

 

 

 

 

 

 

 

편리한 N드라이브 탐색기 (오픈 예정)

N드라이브 탐색기는 우선 클로즈드 베타 서비스로 여러분을 찾아 뵙게 됩니다.

N드라이브 탐색기를 설치하면 Windows 탐색기에 N드라이브(N:)이 생기고

웹 N드라이브의 내용을 동일하게 볼 수 있으며, 더 편리하게 파일을 올리고 내려받을 수 있습니다.

 

N드라이브 도움말과 N드라이브 영상 가이드에서

N드라이브 서비스에 대해 좀 더 자세히 안내를 받으실 수 있습니다.

N드라이브 영상 가이드 바로 가기

 

궁금하신 내용은 네이버 고객센터를 통해 친절히 안내해드리겠습니다.

N드라이브 고객센터 바로 가기

 

2009년 7월 31일

N드라이브 서비스 운영팀 드림

 

목록
인접글 목록을 가져오는 중입니다...
위로

2009년 8월 6일 목요일

[Linux] Fedora_Linux_nateon 설치하기



Linux Fedora에서 NateOn 소스 설치.



NateOn 메신져 최신 버젼을 설치하려면 소스 설치를 해야한다 .


NateOn 소스 다운로드 : http://kldp.net/frs/?group_id=1143


설치를위해 필요한 패키지들 .

$ yum install cmake
$ yum install kdelibs3-devel
$ yum install kdebase
$ yum install sqlite-devel


※ 필요하지만 기본적으로 설치되는 패키지들은 제외하였다 .


컴파일 환경설정
cmake -DCMAKE_INSTALL_PREFIX=/usr/local


컴파일
make


설치
make install


※ 설치 후 'nateongen'파일이 없다는 로그인 에러가 난다 .
  첨부파일을 다운받아서 '/usr/local/bin/'에 넣어주면 된다 .




※ 로그인 후 한글이 안써지는 경우가 있다 .
  다음 패키지를 설치하고 다시 실행하면 한글이 써진다 .

$ yum install scim-bridge-qt3




끝 !
피드백 주소: http://www.leewh.co.kr

2009년 8월 4일 화요일

[Linux] Fedora_10 root 계정 활성화

아따....이거 참 고생시럽게 하는구만...
기본적으로 페도라 10에서는 루트 계정으로의 로긴을 막고 있기 때문에 작업할 때 참으로 귀찮지 아니하지 않다...-ㅅ-

이를 해결할 방법.!!

물론...구글링으로 풀었다...(구글신기 만쉐이~~)
다음 주소로 가면 원문을 볼 수 있다.
http://rivviepop.wordpress.com/2008/11/27/enable-root-gdm-gnome-login-with-fedora-10/


그냥 자기 유저 아이디로 일단 로그인을 하고 su 명령어를 사용해서 터미널에서 로그인한다.

$ su - root


그 다음에 편집할 파일의 백업을 뜬다.

# cp -a /etc/pam.d/gdm /etc/pam.d/gdm.orig


이제 vi 편집기로 파일을 변경하도록 하자.

#vi /etc/pam.d/gdm


그럼 쭈욱 찾아 내려가다 보면 다음과 같은 줄이 나온다.

.

.

.

auth required pam_succeed_if.so user != root quiet


이걸 다음과 같이 바꿔준다.

auth required pam_succeed_if.so user quiet


이렇게 쓰고 저장해준 뒤에 현재 사용자에서 로그아웃 한 다음에 Gnome상태로 로그인을 해보자....


후후.....역시 루트로 접속할 수 있다...-_-v

이제부터 그놈에서 작업을 하면서 권한의 문제로부터 자유로워지길~~ㅎ

 

트랙백 주소: http://blog.naver.com/myrilke/150038822535

[Linux] rpm 명령어 사용법 설치 및 삭제

1.rpm 설치

  1. #rpm -Uvh test-1.2.3.src.rpm

      : test.src.rpm을 /usr/src/<vender_name_dir>/SPEC 에 SPEC 파일과

         /usr/src/<vender_name_dir>/SOURCES/ 에 소스를 설치 한다.

         기존에 설치된 패키지가 있을 경우 업그레이드를 한다. -ivh 보다 많이 사용한다.

    #rpm -Uvh test-1.2.3.rpm

       : test-1.2.3.rpm 을 설치 한다. 기존에 test 라는 낮은 버젼의 패키지가 있으면 업그레이드. 없으면 그냥 -ivh 처럼 설치가 된다.

    #rpm -ivh test-1.2.3.rpm

       : test-1.2.3 을 처음으로 설치 한다. 처음 설치가 아니더라도 -Uvh 를 사용해도 무관 하다.


  2. 설치된 rpm 제거

    #rpm -e test

      : test 라는 이름의 패키지를 제거 한다.

    #rpm -evv test

      : test 라는 패키지를 제거 하는 과정을 보여 준다.


  3. 설치된 패키지 정보 보기

    #rpm -qi test

       : test 가 설치 되어 있다면, test 패키지에 대한 설명이 주루룩 뜰것 이다. 아래는 예...


    #rpm -qi bash
    Name        : bash                                      Relocations: /usr
    Version     : 3.1                                         Vendor: (none)
    Release     : 6.2.1.by                                 Build Date:
    Install Date:                                               Build Host: build.i386
    Group       : System Environment/Shells     Source RPM: bash-3.1-6.2.1.by.src.rpm
    Size          : 5298761                                License: GPL
    Signature   : DSA/SHA1, 2006년 08월 31일 (목) 오후 02시 04분 38초, Key ID ed71c4b0ef24e3a8
    URL            : http://www.gnu.org/software/bash
    Summary    : The GNU Bourne Again shell (bash) version 3.1.
    Description :
    The GNU Bourne Again shell (Bash) is a shell or command language
    interpreter that is compatible with the Bourne shell (sh). Bash
    incorporates useful features from the Korn shell (ksh) and the C shell
    (csh). Most sh scripts can be run by bash without modification. This
    package (bash) contains bash version 3.1, which improves POSIX
    compliance over previous versions.

    ※각 필드 별로 값이 들어 있는데 이 값들만 추축 하는 방법을 알고 싶다면, 이 노트의 rpm querytag 을 참고 하도록 한다.

     

  4. 강제 설치

      #rpm -Uvh --force test-1.2.3.rpm

        : 기존에 설치된 동일 버젼의 동일한 릴리즈 번호의 패키지를 덮어 씌워 설치 한다.


5. 의존성 무시 설치

     #rpm -Uvh --nodeps test-1.2.3.rpm

     #rpm -ivh --nodeps test-1.2.3.rpm

        :  test-1.2.3.rpm 패키지의 의존성을 무시하고 설치 한다. 의존성으로 인한 문제가 발생할 수도 있다.


6. 패키지가 설치한 파일들 보기

    : -ql 옵션을 사용 하여 rpm 패키지가 설치한 파일리스트를 본다.

     #rpm -ql test-1.2.3

     아래는 예제...


     #rpm -ql coreutils

     /bin/basename
     /bin/cat
     /bin/chgrp
     /bin/chmod
     /bin/chown
           .

           .

           .

        중략

7. 파일이 어느 패키지에 들어 있는지 알아보기

     : -qf 옵션을 이용하여 파일이 어느 패키지에서 설치 된것인지 알아본다.


     #whereis diff
     diff: /usr/bin/diff /usr/share/man/man1p/diff.1p.gz /usr/share/man/man1/diff.1.gz
     # rpm -qf /usr/bin/diff
     diffutils-2.8.1-15.2.1.1.by


     diff 명령이 어디 있는지 알아보기 위해 whereis 를 사용 하고, 파란글씨 부분의 실행 파일이 어느 패키지에서 설치 된것인지 알아보기 위헤

     해당 경로를 입력 하였다. 결과 diff 라는 명령은 diffutils-2.8.1-15.2.1.1.by 에서 설치된 것임을 알 수 있다.

 

트랙백 주소 : http://itbaby.egloos.com/tb/4149531

2009년 7월 15일 수요일

카스퍼스키, Windows 7용 백신 공개



마이크로소프트에서 출시될 OS Windows 7가 올해 안으로 출시될 것으로 보이는데요.
이에 발맞추어 백신 업체인 카스퍼스키에서 Windows 7용 시험판을 선보일 예정입니다. 이 제품은 마이크로소프트로부터 공식 인정을 받은 제품이라고 하는데요. 카스퍼스키의 성능은 말씀 안드려도 잘 알겁니다. 새로운 신형 엔진을 탑재해 이전보다 손쉬운 사용 환경과 검사 속도가 향상된 점이 특징입니다.
이외에도 시만텍의 노턴 안티바이러스, AVG 안티바이러스는 이미 평가판을 개발했으며 맥아피와 국산 바이러스 V3는 Windows 7용 백신을 곧 선보일 예정이라고 합니다.
카스퍼스티, 노턴 안티바이러스, AVG을 시험판을 사용을 원하는 분은 아래의 사이트에서 참고하세요.

[
Windows 7용 백신]

-------------------------------------------------------------------------------------------

카스퍼스키 백신이 세계에서 1위의 바이러스 프로그램이라고 알고 있는데요
러시아에서 만들었다고 하던데
개인적으로 써보면 무겁다는 느낌이 많아서 SOD가 가벼워서 썼던 기억도 있네요
아주강한 바이러스 프로그램이래요^^

[출처]
http://kr.engadget.com/2009/01/21/kaspersky-windows-7/

[출처] http://powernara.egloos.com/4082792

 

--------------------------------------------------------------------------------------------

윈도우 98 사용하면서 블루스크린 때문에 무진장 고생했던것을 생각하면..

지금 정말 많이 좋아졌다라는 생각을 불현듯 하게 된다.

 

Winodws 7 에서.. 언제 또 상위의 OS가 출시가 될지.. 정말 빠르게 변화 하는 듯 하다.

2009년 7월 10일 금요일

[무림외전] 알려지지 않은 강호의 이야기

무림외전 비설서버 창캐릭(전호) 를 육성중 입니다.^ ^

저와 같이 플레이 하는 애인분과 탑승 시스템인 말을 타고 노을을 보며 스크린 샷을 하였습니다.

 

터미널 서비스 포트 변경방법

터미널 서비스포트 변경방법.

1.
Regedt32 또는 Regedit 실행
2. HKEY_LOCAL_MACHINESystemCurrentControlSetControlTerminalServerWdsRepwdTdsTcp

이름 종류 데이터
PortNumber REG_DWORD 0x00000d3d(3389)
10진수를 선택하고 다른 포트번호(xxxx)를 입력(xxxx 는 변경 하고자 하는 포트번호)

3.
HKEY_LOCAL_MACHINESystemCurrentControlSetControlTerminalServerWinStatio
nsRDP-Tcp

이름 종류 데이터
PortNumber REG_DWORD 0x00000d3d(3389)
10진수를 선택하고 다른 포트번호(xxxx)를 입력(xxxx 는 변경 하고자 하는 포트번호)

4. 클라이언트 연결 관리자로 새 연결을 만들때 기입한 단어가 연결 이름이 됩니다.

서버의 레지스터리를 포트 번호를 변경했기 때문에 클라이언트에서도
변경된 포트로 연결 될 수 있게 몇 가지 설정을 바꿔야 합니다.

1. 클라이언트 연결 관리자를 연다.

2. 파일 메뉴에서 새연결을 클릭
클라이언트 연결 관리자 마법사 시작창이 뜬다.
새 연결을 만들면 연결 관리자 목록에 아이콘이 하나 생성되 있다.

3. 새 연결을 이용해서 만든 아이콘을 클릭한후
파일 메뉴에서 내보내기를 누른다.
예로 "name" 이름을 지정하면 name.cns파일이 생성된다.
name이 연결을 위해 사용하는 이름이다.

4. name.cns 파일을 메모장으로 열고 편집을
Server Port=3389 에서 Server Port=6666
6666 이 터미날 서버에서 레지스트리 변경을 해서 새로 지정한 포트의 번호이다.

5. 이제는 클라이언트 연결 관리자를 이용해서 변경한 name.cns파일을 가져오기를 한다.
클라이언트 연결도 관리자가 터미날 서버 세팅에서 변경한 포트와 같게 세팅되었다.

아래의 문은 name.cns 파일의 내용입니다.
.....................................................................................................................
[-_-]
WinPosStr=0,1,0,0,640,480
Expand=1
Smooth Scrolling=0
Shadow Bitmap Enabled=1
Dedicated Terminal=0
Server Port=6666
Enable Mouse=1
Disable CTRL+ALT+DEL=1
DoubleClick Detect=0
Full Screen Hotkey=3
Icon Index=0
Desktop Size ID=1
Screen Mode ID=1
Compression=0
BitmapCachePersistEnable=0
Desktop=1
Auto Connect=1
Icon File=
Progman Group=터미널 서비스 클라이언트
MRU0=터미날 서버 IP
AutoLogon 50=0
UserName 50=00
MaximizeShell 50=1
Password 50=460F4E0E0EEC1398BF96E06A9DBF94C2F93496B4929C677A5082D6050D4F8C2D00
Salt 50=658BC7DB933FD314C2F3157670D460AD5F02E69900
Domain 50=00
Alternate Shell 50=00
Shell Working Directory 50=00
AutoLogon=0
UserName=00
MaximizeShell=1
Password=A2E2D4F2E53086058B1CB2353858663688FF9AAA6BA84B5F666A8C4F6231B96C00
Domain=00
Alternate Shell=00
Shell Working Directory=00
[-_-Hotkey]
CtrlEsc=36
AltEsc=45
AltTab=33
AltShiftTab=34
AltSpace=46
CtrlAltDelete=35
[Private Reserved Section]
....................................................................................................................

서비스로...

◆ 터미널 서비스에서 파일복사를 가능하게 하려면???



터미널 서비스를 이용하면 클라이언트와 서버 세션간에 텍스트와 이미지의 복사, 잘라내기, 붙여넣기 등을
할 수 있다. 하지만 아쉽게도 파일의 복사, 잘라내기, 붙여넣기를 지원하지 못하고 있는데 터미널 서비스 확장
기능을 이용하면 가능하다.

이 기사에서는 터미널 서비스의 확장판인 파일 복사기능을 이용해서 클라이언트와 서버세션간의 파일의 복
사, 잘라내기, 붙여넣기를 이용하는 방법에 대해서 알 수 있다.

File Copy를 사용하여 다음과 같은 작업을 수행할 수 있다.

여러 파일과 폴더를 복사, 잘라내기, 붙여넣기
Windows 32비트 또는 16비트 클라이언트 상에서 복사, 잘라내기, 붙여넣기.
File Copy를 사용하려면, 서버에서는 다음의 과정을 수행한다.

http://www.microsoft.com/
windows2000/techinfo/reskit/tools/hotfixes/rdpclip-o.asp에 접속한다.
오른쪽 Download 메뉴에서 dpclip_hotfix.exe 파일을 다운로드 한다.
시작 - 실행 - Regedit를 실행한다.
HKEY_LOCAL_MACHINESYSTEMCurrentControlSet
ControlTerminal ServerAddInsClip Redirector 로 이동한다.
Name을 더블 클릭한다.
RDPCLIP을 FXRDPCLP으로 바꾼다.
HKEY_LOCAL_MACHINESYSTEMCurrentControlSet
ControlTerminal ServerWdsrdpwd 로 이동한다.
Startup Programs 값을 더블 클릭한다.
RDPCLIP을 RXRDPCLP으로 바꾼다.
( 만약 드라이브 공유를 설치했다면 FXRDPCLP을 DRMAPSRV로 바꾼다.)
리소스 킷 폴더에 있는 rdpclip.exe 파일의 이름을 fxrdpclp.exe로 변경한다.
다음 그 파일을 %systemroot%System32 폴더에 복사한다.
리소스 킷 폴더에 있는 fxfr.dll 파일을 %systemroot%System32 폴더로 복사한다.
컴퓨터를 재시작한다.
클라이언트에서는 다음의 과정을 수행한다.

32-bit fxfr.dll 파일을 Program FilesTerminal Services Client 폴더로 복사한다.
Program FilesTerminal Services Client 폴더에 있는 rdpdr.dll 파일이름을 rdpdr.pss로 바꾼다.
32-bit rdpdr.dll 파일을 Program FilesTerminal Services Client 폴더로 복사한다.
File Copy를 사용하려면 단지 클라이언트나 Terminal Services session에 있는 파일 또는 파일들을 선택하고
Ctrl+C를 누른다음, 다른 Terminal Services 나 Client session에서 붙여넣기를 하면 된다.
 

CVS 사용하는 방법

김민식 <minskim@bawi.org>

1999년 12월 12일

소개

CVS는 각종 파일의 버젼을 쉽게 관리할 수 있도록 도와주는 도구이다. 독자들 중에는 아직 버젼 관리의 필요성을 크게 느끼지 못하는 사람도 많이 있을 것이다. 하지만 CVS가 제공하는 기능들을 직접 보고 그 편리함을 체험해 본다면, 앞으로는 CVS 없이 프로젝트를 진행한다는 것은 상상할 수도 없는 일이 될 것이다.

예를 들어 간단한 프로그램을 하나 작성한다고 하자. 비교적 간단해 보이는 문제여서 곧바로 코딩을 시작하여 하루만에 작업을 마쳤다. 하지만 실행해보니 의도한 바대로 결과가 나오지 않는다. 원인이 무엇인지 알아내기 위해 이부분 저부분을 뜯어고치다 보면 처음의 모습은 거의 찾아볼 수 없는 복잡한 코드로 변해버린다. 하지만 결국 발견하는 것은 사소한 실수, 이제 그 동안의 작업을 모두 원래대로 돌려놓으려 하지만 이것 역시 버그를 잡는 일 못지 않게 어려운 일이다. 나름대로 바뀌었다고 생각되는 부분을 복구해봐도 제대로 되지 않고, 결국에는 처음부터 다시 코딩해 버린다. 만일 이 때 처음의 코드를 백업해 놓았다면 찾아낸 버그만을 고치고 작업을 계속 진행할 수 있을 것이다. 하지만 그렇다고 해서 매 작업 단계마다 코드를 백업해 놓는다면 조금만 지나도 수없이 많은 파일들이 생겨날 것이다. 이런 파일들은 공간도 많이 차지할 뿐더러 그 많은 파일들을 관리하는 것 자체가 또다른 문제가 될 것이다. CVS는 바로 이러한 문제를 해결해 준다. CVS를 이용하면 매 작업 단계마다 코드를 저장할 수 있음은 물론, 원하는 단계의 코드를 언제라도 꺼내 볼 수 있다. 게다가 CVS는 각 단계에서 변경된 부분만을 저장하기 때문에 저장 공간도 많이 필요로 하지 않는다. 또한 각 단계마다 작업한 내용을 글로 적어 함께 저장할 수 있으므로 개발 내용을 한눈에 알아볼 수 있게 해 준다.

CVS의 또다른 장점은 여럿이 공동으로 진행하는 프로젝트에서 나타난다. 사실 여러명이 함께 작업하다 보면 각자 자기의 작업 파일을 갖게 되기 때문에 아무리 주의를 하여도 다른 사람이 변경해 놓은 것을 덮어 쓰는 일이 종종 발생하게 된다. 그렇다고 작업을 잘 나누어 각각이 서로 다른 파일만을 갖고 작업하도록 하는 것도 쉽지 않다. 처음에는 각기 다른 파일을 다루도록 일을 나누지만 조금 지나다보면 서로가 상대방의 파일을 고쳐야만 하는 경우가 발생하게 된다. 쉬운 대안은 한 파일을 작업하는 동안 다른 사람은 그 파일을 건드리지 못하게 하는 것이지만, 이럴 경우 파일을 수정하고 싶어도 다른 개발자가 그 파일을 수정하고 있다면 그 작업이 끝날 때까지 기다려야 하기 때문에 전체 작업 효율이 떨어지게 된다. 반면 CVS는 심지어 같은 파일도 여러 사람이 함께 작업할 수 있게 해 준다. 각자 한 파일 내의 다른 부분을 수정한다면 CVS가 그 내용을 하나로 합쳐 줄 것이다. 물론 두 사람이 동시에 같은 줄을 고친다면 CVS가 그것을 합쳐줄 도리는 없다. 하지만 그럴 경우라도 서로 같은 줄을 고쳤음을 개발자에게 알려주고 그 내용도 보여주어서 개발자가 적절한 조치를 취할 수 있도록 해 준다. 뿐만아니라 CVS는 Unix 환경은 물론, Windows나 Macintosh에서도 사용할 수 있어 각 개발자들이 원하는 환경에서 작업할 수 있다.

CVS는 이미 대다수의 공개 프로젝트에서 사용되어 그 효능을 입증하였다. 실제로 우리가 알고 있는 대부분의 공개 프로젝트가 CVS를 사용한다. Apache HTTP server, Mozilla 등이 대표적인 예이다. 이러한 공개 프로젝트들은 대부분 현재 개발 중인 내용을 CVS를 통해 모든 사람들이 받아 볼 수 있도록 하고 있다. 그렇기 때문에 CVS를 프로젝트에 도입하는 경우가 아니라 하더라도 이런 개발 버젼을 받아 보고 싶다면 CVS의 사용법을 익혀 둘 필요가 있다.

동작 방식

  저장소

여러 명이 함께 작업할 수 있는 환경을 제공하려면 어떠한 요소가 필요할까? 가장 먼저 떠오르는 것은 같이 작업하는 파일을 보관할 장소일 것이다. CVS는 이러한 역할을 하는 곳을 저장소(repository)라 부른다. 그렇다고 특별한 데이터베이스나 다른 저장 매체를 사용하는 것이 아니라 그저 하나의 디렉토리에 불과하다. 이 디렉토리에는 CVS의 전반적인 설정 사항과 각 프로젝트의 파일들(문서, 프로그램 등)은 물론, 각 파일의 버젼 관리에 필요한 정보, 파일별 작업 기록들을 저장하게 된다. 여기에 있는 파일들은 모두 CVS가 관리하므로 사용자는 이 파일들을 직접 건드릴 필요가 전혀 없다.

  프로젝트 시작

일단 저장소를 만들고 나면 이후로는 여러 프로젝트들이 그 저장소를 이용할 수 있다. CVS를 이용하려는 사용자는 처음 프로젝트를 시작하는데에 필요한 파일 및 기본 디렉토리 구조를 자신의 작업 디렉토리에 만들고, 이를 저장소로 옮길 수 있다. 그러면 저장소에는 새로운 디렉토리가 만들어지고 이 곳은 앞으로 프로젝트 진행을 위한 공간으로 사용된다. 여기까지가 완료되면 프로젝트 시작을 위한 모든 준비가 끝난 것이다. 이후로는 프로젝트에 참여하는 사람들 각각의 몫이다.

  개발자 각자의 프로젝트 진행

저장소에 프로젝트를 위한 공간이 마련되고 나면 실제로 프로젝트에 참여하는 개발자는 어떻게 CVS를 이용하면 될까? 저장소의 내용을 가지고 직접 작업할 수는 없으므로 우선 저장소에 있는 내용을 복사하여 자신의 작업 디렉토리를 만들어야 한다. 이 과정을 CVS에서는 checkout이라고 한다. checkout으로 만들어진 작업 디렉토리는 자신만의 작업 공간이 되며, 개발자는 그 파일들을 마음대로 변경할 수 있다. 이후로는 계속 작업을 진행하면서 CVS의 명령을 이용하여 자신의 작업 결과를 저장소로 옮기고, 다른 사람이 저장소에 올려 놓은 작업 결과를 받아오는 일만을 반복하면 된다. 공동 작업으로 인해 생길 수 있는 문제들의 대부분은 CVS가 해결해 줄 것이다.

  요약

CVS를 이용하여 프로젝트를 수행하는 절차는 다음과 같다.

  1. 저장소를 초기화한다. (CVS 관리자)

  2. 프로젝트를 초기화한다. (프로젝트 관리자)

  3. 작업 공간을 마련한다. (개발자)

  4. 실제 작업 (개발자)

  5. 자신의 작업 내용을 저장소에 저장하고 다른 개발자의 작업 내용을 받아온다. (개발자)

1번은 처음 CVS를 설치할 때 한 번만 해 주면 되고, 2번은 새로운 프로젝트를 시작할 때마다 필요한 작업이다. 각 개발자는 3번을 수행한 후 4번과 5번 과정을 되풀이하며 작업을 진행하게 된다.

기본적인 사용 방법

CVS가 어떤 것이고 어떻게 동작하는지를 알았으니 각 단계별로 CVS를 사용하는 법을 알아보겠다. 이 절에서는 CVS의 모든 기능을 설명하기보다는 자주 사용되는 기능을 예와 함께 설명한다. 여기에서 설명하는 내용 정도만 가지고도 실제 프로젝트에서 CVS를 사용하는 데에는 무리가 없을 것이다.

CVS는 대부분의 Linux 배포본에 포함되어 있으므로 Linux를 사용하고 있다면 이미 CVS가 설치 되어 있을 것이다. 만일 CVS 명령이 없다면 http://www.cyclic.com/에서 적당한 파일을 받아 설치하면 된다.

CVS를 이용하는 모든 과정은 cvs 명령을 통해 이루어진다. cvs 명령의 기본 형식은 다음과 같다.

$ cvs [cvs 옵션] 명령 [명령 옵션과 인자]
명령 부분에는 실제로 cvs에게 지시할 명령이 오게 되며, 각 명령마다 요구하는 인자가 있을 수 있다. 실제로 사용되는 명령의 종류와 기능에 대해서는 새로운 명령이 소개될 때마다 언급하도록 하겠다.

  저장소 초기화

CVS를 사용하기 위해서 가장 먼저 할 일은 각 프로젝트의 파일들을 저장할 저장소(repository)의 위치를 정하는 것이다. 저장소를 이용할 프로젝트들의 규모를 고려하여 충분한 공간을 가진 디렉토리를 저장소로 쓰도록 한다. 저장소를 /home/CVS에 만들기로 했다면 다음과 같이 초기화할 수 있다.

# cvs -d /home/CVS init
여기서 -d는 저장소의 위치를 나타내며, 마지막의 init가 CVS 명령이다. 물론 이 명령을 사용하기 위해서는 /home에 쓰기 권한을 갖고 있어야 한다. 그러므로 대개의 경우 저장소의 초기화는 root 권한을 가진 씨스템 관리자가 하게 된다. 명령이 실행되고 나면 /home에 CVS란 디렉토리가 생기고, 그 안에는 CVSROOT란 디렉토리가 있을 것이다. 이 CVSROOT 디렉토리는 CVS의 각종 설정 내용을 담고 있는 디렉토리이다. 다시 말하지만 저장소(/home/CVS)의 파일들을 직접 건드리는 것은 절대로 피해야 한다. 이 파일들을 변경하고 싶다면 cvs 명령을 이용해야 한다.

저장소를 만들었으면 CVS를 이용할 개발자들에게 저장소가 있는 디렉토리에 쓰기 권한을 주어야 한다. 그러기 위해 개발자들을 모두 같은 그룹(예: cvs)의 구성원으로 만든다. 이는 씨스템별로 존재하는 그룹 관리 도구를 이용하거나 groupadd와 같은 명령으로 cvs라는 그룹을 만들고, 그룹 관리 도구를 쓰거나 /etc/group 파일을 직접 수정하여 개발자들을 그 그룹에 추가하면 된다. 예를 들어 minskim과 sehkone이라는 사용자를 cvs 그룹에 추가한다면 다음과 같은 줄이 /etc/group에 생길 것이다.

cvs:*:510:minskim,sehkone
이제 다음 명령으로 디렉토리의 권한을 열어 주면 된다.
# chgrp -R cvs /home/CVS
# chmod -R g+w /home/CVS
이후로는 cvs 그룹에 속한 개발자는 이 저장소를 마음대로 이용할 수 있다.

  저장소 이용

모든 CVS 명령은 저장소의 위치를 알아야 수행될 수 있다. 앞에서 본 저장소 초기화의 예에서도 init 명령을 사용하면서 -d 옵션으로 저장소의 위치를 알려 주고 있다. CVS의 다른 명령들도 같은 옵션으로 저장소의 위치를 지정할 수 있다. 또다른 방법은 CVSROOT라는 환경변수의 값으로 저장소의 위치를 주는 것이다. 예를 들어 sh이나 bash를 쓴다면 다음의 내용을 초기화 파일(.bash-profile 등)에 넣어 놓으면 편리할 것이다.

CVSROOT=/home/CVS
export CVSROOT
csh이나 tcsh을 쓴다면 다음과 같이 한다.
setenv CVSROOT /home/CVS
이렇게 설정을 하고 나면 -d 옵션과 저장소의 위치를 매번 줄 필요 없이 바로 cvs 뒤에 원하는 명령을 주면 된다.

개발자가 CVS 명령을 이용하려 하는 경우 고려해야 할 사항이 하나 더 있다. 개발자가 어떤 방식으로 저장소가 위치한 기계에 연결하는가 하는 것이다. CVS는 다양한 연결 방식을 지원하는데, 여기에서는 주로 사용되는 세 가지 방식에 대해 저장소의 위치를 지정하는 방법을 알아보도록 하자.

    저장소와 개발자가 같은 기계를 쓸 경우

앞에서 저장소를 초기화한 것과 같은 경우이다. 같은 기계를 쓰기 때문에 저장소가 있는 디렉토리 이름을 주는 것으로 충분하다. 앞에서 만든 저장소에 CVS 명령을 내리려면 다음과 같이 한다.

$ cvs -d /home/CVS 명령

    개발자가 rsh을 이용하는 경우

개발자가 저장소와 다른 기계를 사용할 경우 일반적으로 쓰이는 방법이다. 여럿이 진행하는 프로젝트는 대부분 개발자들이 자신의 기계에서 작업을 하게 되는데, 이 방식을 이용하면 그러한 경우에도 쉽게 저장소를 공유할 수 있게 해 준다. 이 방법을 쓰려면 먼저 rsh을 사용할 수 있어야 한다. 예를 들어 저장소는 cvs.webdox.co.kr이란 기계에 있고, 개발자의 기계는 birch.webdox.co.kr이라고 하자. 개발자는 cvs.webdox.co.kr에 minskim이란 계정을 갖고 있고, birch.webdox.co.kr에 min이란 계정을 갖고 있다. 그러면 다음과 같은 방법으로 rsh을 쓸 수 있는지를 시험해 볼 수 있다.

rsh -l minskim cvs.webdox.co.kr 'echo $PATH'
뒤의 명령이 수행된다면 rsh을 쓸 수 있는 것이다. 만일 그렇지 않다면 cvs.webdox.co.kr에 로그인하여 .rhosts란 파일을 만들자. .rhosts에는 다음과 같은 내용이 있어야 한다.
birch.webdox.co.kr min
이제 다시 한 번 위의 rsh 명령을 시험해보자. 이번에도 안 된다면 cvs.webdox.co.kr에서 rsh을 통한 접속을 막아 놓았을 가능성이 크다. 이는 cvs.webdox.co.kr의 관리자에게 문의하여 해결하여야 한다. rsh을 쓸 수 있다면 CVS 명령을 다음과 같이 사용하면 된다.
$ cvs -d :ext:minskim@cvs.webdox.co.kr:/home/CVS 명령
만일 rsh과 같은 방식으로 동작하는 다른 명령이 있다면 그 명령을 사용할 수도 있다. 대표적인 것이 ssh이다. 특히 누군가 네트웍을 통해 전달되는 계정의 암호를 가로챌 위험이 있다면 rsh 대신 ssh을 사용하여 그 위험을 줄일 수 있다. 그러기 위해서는 CVS_RSH라는 환경변수를 ssh로 선언해주면 된다. 이 경우 저장소가 있는 기계에서는 .rhosts 파일을 만들 필요는 없는 대신 sshd 등이 돌고 있어야 한다.

    암호 인증 방식 이용

프로젝트에 직접 이용하지 않더라도 CVS가 필요한 경우는 CVS를 사용하는 여러 공개 프로젝트들의 최신 프로그램들을 받아 오는 경우일 것이다. 개발이 빨리 진행되는 프로젝트들은 대부분 CVS를 통해 프로그램을 받아 갈 수 있도록 하고 있다. 이런 프로젝트들의 홈페이지에서는 'CVSROOT를 ...로 설정하십시오'라는 문구를 볼 수 있는데, 이것이 바로 저장소의 위치이다. Mozilla의 최신 source를 받아 보고 싶다면 다음과 같이 하면 된다.

$ cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot login
그러면 암호를 물어오는데 암호는 anonymous이다. 일단 로그인을 하고 나면 인증 정보가 .cvspass란 파일에 저장이 되며, 이후로는 암호 없이 CVS 명령을 이용할 수 있다. 방법은 다음과 같다.
$ cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot 명령

  프로젝트 초기화

사용 가능한 CVS 저장소가 있고, 어떻게 저장소를 이용하는지 알고 있다면 프로젝트를 시작할 모든 준비가 끝난 셈이다. 더군다나 기존의 프로젝트에 CVS를 도입하려는 경우라면 이미 디렉토리와 파일들이 있을테니 이를 저장소에 저장하는 방법만 배우면 된다. 하지만 처음 시작하는 프로젝트를 CVS로 관리하려 한다면 먼저 디렉토리 구조를 잘 설계해야 한다. 물론 언제라도 CVS를 이용해서 파일의 위치를 옮기고 새로운 디렉토리를 만드는 등의 일은 가능하다. 하지만 처음부터 디렉토리 구조와 각 디렉토리에 들어갈 파일들을 잘 정해 놓는 것은 전체 프로젝트 관리에도 도움을 주므로 되도록이면 나중에 파일이나 디렉토리의 위치 변경이 생기지 않도록 설계를 하고 프로젝트를 시작하도록 하자.

먼저 할 일은 프로젝트의 이름을 정하는 것이다. 이 이름은 저장소에서 이 프로젝트 관련 파일들을 저장하는 디렉토리의 이름으로 쓰인다. 여기에서는 myprj란 이름으로 프로젝트를 만들어 보기로 하겠다. 이후에 나올 모든 예는 환경변수 CVSROOT가 제대로 설정되어 있다고 가정한다. CVSROOT를 어떻게 설정해야 하는가에 대해서는 앞 절의 내용을 참고하기 바란다.

myprj란 디렉토리가 다음과 같이 되어 있다고 하자.

$ cd myprj
$ ls
Hello.java     README
저장소에 새 프로젝트를 만들고 이 두 파일을 저장하기 위해서는 import 명령을 사용한다. import 명령의 사용법은 다음과 같다.
$ cvs import -m "메시지" 프로젝트이름 vender_tag release_tag
'메시지'는 프로젝트를 시작하면서 저장소에 기록하고 싶은 내용을 적어주면 된다. CVS는 파일을 저장할 때마다 메시지를 적도록 하고 있다. 이 내용을 원하는 때에 다시 볼 수 있으므로 개발자가 어떤 작업을 했는지를 적어 놓으면 다른 개발자들이 파일의 변경 내용, 작업 진척 상황등을 파악하는데에 도움을 줄 수 있다. 뒤의 두 태그는 지금 단계에서는 별 의미가 없으므로 적당한 말을 써 주면 된다. myprj란 프로젝트를 저장소에 만들기 위해서는 다음 명령을 사용한다.
$ cvs import -m "프로젝트 시작" myprj webdox start
N myprj/Hello.java
N myprj/README

No conflicts created by this import
앞에 말했듯이 뒤의 두 단어는 별 의미가 없으므로 크게 신경쓰지 말기 바란다. 이 명령을 실행하면 CVS는 저장소에 myprj란 디렉토리를 만들고, 거기에 README와 Hello.java를 저장한다. 이 외에도 옵션으로 준 메시지와 각 파일의 부가적인 정보를 기록하게 된다. 출력되는 메시지를 보면 각 파일 이름 앞에 N이란 글자가 있는 것을 알 수 있다. CVS는 특정 명령 수행시에 파일별로 수행 결과를 나타낸다. N은 새로운 파일이 추가된 것을 의미한다. 이후의 예에서 다른 경우들도 보게 될 것이다. 마지막 줄에서 conflict란 현재 디렉토리에 있는 파일을 저장소에 저장하게 되면 어떤 이유로 이미 저장소에 있는 파일과 충돌을 일으키는 경우를 뜻한다. 다른 사람이 작업해서 저장소에 저장해 놓은 것을 덮어쓰려 한다거나 하는 경우인데, 자세한 것은 뒤에서 conflict가 발생하는 경우를 예로 들어 설명하겠다. 여기에서는 저장소에 아무 파일도 없으므로 충돌(conflict)이 생기지 않는 것이 당연하다.

import 명령으로 프로젝트를 초기화하고 나면 더 이상 현재 디렉토리에 갖고 있는 것들을 사용하면 안 된다. 현재 디렉토리에는 CVS에 관련된 정보가 아무 것도 없기 때문이다. 대신 저장소에 모든 내용이 들어 있으므로 myprj 디렉토리 자체를 완전히 지워버려도 괜찮다. 다음 절에서 소개할 명령들을 이용해서 언제라도 다시 불러올 수가 있다. 이상으로 프로젝트 초기화는 모두 끝난 것이며, 이후로는 각 개발자들이 CVS를 이용하여 프로젝트를 진행시키는 일만이 남아 있다.

  프로젝트 진행

이제 프로젝트에 참여하는 개발자의 입장에서 프로젝트를 바라보자. 모든 필요한 파일들은 저장소에 갖추어져 있고, 프로젝트 관리자로부터 저장소의 위치와 프로젝트 이름도 통보받았다. 그러면 개발자는 앞으로의 작업을 위해 저장소의 위치를 환경변수 CVSROOT에 저장하고, 작업을 시작하면 된다. 단, CVS는 파일의 변경 시각을 참조하는 경우가 많으므로 각 개발자들이 사용하는 기계의 시간을 서로 맞추어 놓을 필요가 있다.

    작업 공간 생성 (checkout)

작업을 시작하기 위해서는 파일을 마음대로 변경하고 저장하여 테스트해 볼 수 있는 작업 공간이 필요하다. 저장소에 있는 파일들을 불러와 나만의 작업 공간을 만드는 명령이 checkout이다. 앞에서 만든 myprj를 checkout 명령으로 불러 오자.

$ cvs checkout myprj
cvs checkout: Updating myprj
U myprj/Hello.java
U myprj/README
checkout 대신 co만 써 주어도 된다. 앞에 붙은 U는 파일이 갱신(update)되었음을 의미한다. 명령을 수행하고 나면 현재 디렉토리에 myprj란 디렉토리가 생긴다. 이 디렉토리가 바로 작업 공간이다. 이 안에서 필요에 따라 파일들을 수정하고, 이를 다시 저장소로 저장하면 되는 것이다. 그러면 디렉토리 안에는 어떤 파일들이 들어 있을까?
$ cd myprj
$ ls
CVS    Hello.java    README
프로젝트를 초기화할 때 있던 파일들이 그대로 들어 있는 것을 볼 수 있다. 하지만 하나 달라진 것이 있다. CVS란 디렉토리가 바로 그것이다. 바로 이 디렉토리에 CVS가 파일들을 관리하는데에 필요한 정보가 기록된다. 예를 들면 각 파일들의 버젼, 최종 수정 시각, 저장소의 위치 등이 이에 속한다. 앞으로 여러 CVS 명령들을 사용하게 되는데, 그때마다 CVS는 이 디렉토리의 정보를 참고하여 각 명령을 수행한다. 하지만 개발자가 이 디렉토리의 내용에 신경쓸 필요는 전혀 없다. 관심이 있다면 살펴보는 것은 좋지만, 내용을 임의로 변경한다거나 해서는 안 된다.

    작업 내용의 저장 (commit)

만들어진 작업 공간에서 작업을 시작해보자. Hello.java의 내용이 다음과 같다고 하자.

public class Hello {
    public static void main(String args[]) {
    }
}
여기에 인사말을 출력하는 부분을 추가해보자. 아무 편집기로나 파일을 열어 작업하면 된다. CVS를 사용한다고 해도 특별한 에디터나 통합 개발 환경을 필요로 하지는 않는다. Hello.java에 '안녕하세요?'라고 출력하는 문장을 추가했다고 하자.
public class Hello {
    public static void main(String args[]) {
        System.out.println("안녕하세요?");
    }
}
컴파일을 해서 실행을 해 보고 예상대로 실행된다면 이제 작업 내용을 저장소에 저장해야 한다. 그래야 다른 개발자들도 인사말이 추가되었다는 것을 알게 될 것이다. 파일의 변동 사항을 저장소에 저장하는 명령은 commit이다.
$ cvs commit -m "인사말 추가" Hello.java
Checking in Hello.java;
/home/CVS/myprj/Hello.java,v  <--  Hello.java
new revision: 1.2; previous revision: 1.1
done
어떤 명령인지 쉽게 이해할 수 있을 것이다. -m은 앞의 예와 마찬가지로 메시지를 의미한다. 이 명령으로 Hello.java는 '인사말 추가'란 메시지와 함께 저장소에 저장된다. 그렇다고 이전의 Hello.java가 없어지는 것은 아니다. CVS는 각 버젼의 변경 내용을 파악하여 언제라도 개발자가 원하는 버젼을 꺼내 줄 수 있도록 파일들을 저장한다. 출력 결과를 보면 원래 있던 Hello.java는 1.1이고, 새로 저장된 Hello.java는 1.2임을 알 수 있다. 이 번호는 CVS가 자동으로 붙이는 것이며 변경 사항이 저장될 때마다 올라가므로 각 파일마다 다를 수 있다. 나중에 특정 버젼이 필요하다면 이 번호를 이용해서 불러 오면 된다.

맨 끝의 파일 이름은 생략할 수 있다. 파일 이름을 주지 않으면 CVS가 변경된 파일을 모두 찾아 저장소에 저장한다. 이때 저장되는 모든 파일에는 같은 메시지가 붙게 된다. 하지만 파일마다 다른 메시지를 붙이고 싶다거나 특정 파일의 변경 내용만을 저장하고 싶다면 위의 예처럼 파일 이름을 명시해 주어야 한다.

commit을 할 때 주의할 점은 반드시 제대로 동작하는가를 확인하고 commit을 해야 한다는 것이다. 일단 commit을 하면 다른 개발자들도 나의 작업 결과를 받아갈 수 있다. 그러므로 내가 제대로 컴파일조차 되지 않는 파일을 commit으로 저장소에 저장하면 이 파일을 받아간 다른 개발자들도 컴파일이 안 되는 결과를 가져올 것이다. 특히나 여러 파일을 변경하고 일부 파일만을 commit하는 경우라면 더욱 주의해야 한다. 공동 작업을 하는 경우라면 이렇게 자신의 부주의로 다른 개발자들에게 피해를 입히는 일은 절대로 삼가야 한다. 대개의 경우 변경 내용 전체가 서로 관련이 있는 경우가 많으므로 특정한 인자를 주지 않고 commit 명령을 사용하여 작업 공간 전체의 변경 내용이 한꺼번에 저장소에 저장되도록 하는 것이 좋다.

    저장소의 파일 받아오기 (update)

공동 작업에서 자신의 작업 결과를 저장하는 일 못지 않게 중요한 일은 다른 사람의 작업 결과를 받아오는 일이다. 자신이 작업한 내용을 모두 저장한 상태라면 작업 디렉토리를 지워버리고 checkout 명령으로 새로운 작업 공간을 만드는 것도 한 방법이 될 것이다. 하지만 이는 모든 파일을 새로 받아오므로 저장소와의 연결이 느릴 경우에는 상당한 시간을 기다려야 할 수도 있다. 보다 좋은 방법은 update 명령을 사용하는 것이다. 작업중이던 디렉토리에서 이 명령을 쓰면 CVS에 저장된 파일들 중 내가 받아온 이후로 변경된 것들만을 다시 받아 온다.

$ cvs update
cvs update: Updating .
현재 작업 공간에 있는 파일들이 저장소에 있는 파일과 모두 동일하면 위와 같이 별다른 출력 없이 끝날 것이다. 그렇다면 작업 공간에 있는 파일을 수정하고 commit을 하지 않은 상태라면 어떤 결과가 나오는지 보기 위해 Hello.java를 다음과 같이 수정해보자.
public class Hello {
    public static void main(String args[]) {
        System.out.println("안녕하세요?");
	System.out.println("반갑습니다.");
    }
}
원래의 파일에 "반갑습니다."를 출력하는 문장을 추가하였다. 이제 update 명령을 실행하면 다음과 같이 나올 것이다.
$ cvs update
cvs update: Updating .
M Hello.java
파일 이름 앞에 있는 영문자(이 경우는 M)가 각 파일별 상태를 알려준다. M은 파일이 변경된(modified) 상태임을 의미한다. 즉, 파일의 내용이 원래 저장소에 있는 것과 달라졌을 때 M을 써서 표시하게 된다.

저장소의 파일과 작업 공간의 파일이 달라질 수 있는 또 다른 경우는 다른 사람이 파일을 변경하여 commit 명령으로 저장소에 저장한 경우이다. 예를 들어 원래의 README 파일이 다음과 같았다고 하자.

$ cat README
이 파일은 매우 중요한 내용을 담고 있습니다.
그런데 다른 개발자가 README 파일을 다음과 같이 변경하여 저장소에 저장하였다.
$ cat README
이 파일은 매우 중요한 내용을 담고 있습니다.
1999년 12월 11일
$ cvs commit -m "날짜 추가" README
Checking in README;
/home/CVS/myprj/README,v  <--  README
new revision: 1.2; previous revision: 1.1
done
이제 내가 update를 하면 다음과 같은 결과를 볼 수 있다.
$ cat README
이 파일은 매우 중요한 내용을 담고 있습니다.
$ cvs update
cvs update: Updating .
M Hello.java
U README
README 앞에 붙은 U는 파일이 갱신된(updated) 것을 의미한다. 이제 내 작업 공간의 README가 저장소에 저장된 내용과 같게 갱신된 것을 볼 수 있다.

$ cat README
이 파일은 매우 중요한 내용을 담고 있습니다.
1999년 12월 11일

그렇다면 이 두 경우가 혼합된 경우는 어떤 일이 발생할까? 즉, 다른 개발자가 수정하여 저장소에 저장한 파일을 나 역시 수정한 후 update를 하는 경우이다. 다른 개발자가 Hello.java를 다음과 같이 main 함수 앞에 주석을 한 줄 추가하여 commit을 했다고 생각해보자.

$ cat Hello.java
public class Hello {
    // main 함수
    public static void main(String args[]) {
        System.out.println("안녕하세요?");
    }
}
$ cvs commit -m "주석 추가" Hello.java
Checking in Hello.java;
/home/CVS/myprj/Hello.java,v  <--  Hello.java
new revision: 1.3; previous revision: 1.2
done
그런 다음 내가 update를 하면 다음과 같이 된다.
$ cat Hello.java
public class Hello {
    public static void main(String args[]) {
        System.out.println("안녕하세요?");
	System.out.println("반갑습니다.");
    }
}
$ cvs update
cvs update: Updating .
RCS file: /home/CVS/myprj/Hello.java,v
retrieving revision 1.2
retrieving revision 1.3
Merging differences between 1.2 and 1.3 into Hello.java
M Hello.java
여기서 update 명령은 현재 디렉토리의 Hello.java는 1.2에서 수정된 상태이고, 저장소에 있는 Hello.java는 1.3이기 때문에 저장소의 내용을 가지고 1.2와 1.3의 차이를 파악하게 된다. 그 차이가 한 줄이 추가된 것임을 발견하고 나면 그 차이를 현재 디렉토리의 Hello.java에 반영한다. 하지만 Hello.java에는 "반갑습니다."를 출력하는 줄도 들어 있기 때문에 여전히 저장소에 있는 파일과는 다른 상태이다. 따라서 저장소에 있는 내용에서 변경되었다는 의미의 M을 출력하는 것이다. 실제로 Hello.java의 내용을 보면 다음과 같이 바뀐 것을 볼 수 있다.
$ cat Hello.java
public class Hello {
   // main 함수
   public static void main(String args[]) {
      System.out.println("안녕하세요?");
      System.out.println("반갑습니다.");
   }
}
다른 개발자가 추가한 주석이 들어 있으면서 내가 추가한 줄도 그대로 있음을 볼 수 있다. 이것이 CVS의 강력한 장점이다. 즉, 서로 다른 두 개발자가 같은 파일을 수정하였는데도, 서로의 작업을 하나로 합쳐주는 것이다. 한가지 주의할 점은, 만일 update를 수행할 때 Hello.java를 에디터에서 불러 작업중이었다면, 계속 에디터로 작업을 한 후 저장할 때 update에 의해 변경된 내용을 덮어 쓸 수가 있다는 것이다. 대부분의 에디터는 작업하고 있는 파일이 다른 프로그램에 의해 변경되면 이 사실을 사용자에게 알리고, 변경된 파일을 다시 불러올 수 있도록 하지만, 간혹 그렇지 못한 에디터도 있을 수 있으므로 조심하기 바란다.

    충돌의 해결

비록 CVS가 두 개발자의 작업 내용을 합쳐 주기는 하지만 여기에도 한계는 있다. 두 개발자가 같은 부분을 수정한다면 CVS는 누구의 변경 내용을 택해야 하는지 알 도리가 없다. 이런 경우를 충돌(conflict)라 하며, CVS는 이 사실을 개발자에게 알려 개발자가 적절한 조치를 취할 수 있도록 한다.

위의 예에서 다른 개발자가 작업을 계속하여 "환영합니다."를 출력하도록 만들고, 이를 저장소에 저장했다고 하자. 그러면 저장소에는 다음과 같은 내용이 들어 있을 것이다.

public class Hello {
   // main 함수
   public static void main(String args[]) {
      System.out.println("안녕하세요?");
      System.out.println("환영합니다.");
   }
}
이 때 내가 update를 하면 충돌이 발생한다.
$ cvs update
cvs update: Updating .
RCS file: /home/CVS/myprj/Hello.java,v
retrieving revision 1.3
retrieving revision 1.4
Merging differences between 1.3 and 1.4 into Hello.java
rcsmerge: warning: conflicts during merge
cvs update: conflicts found in Hello.java
C Hello.java
현재 디렉토리의 Hello.java는 1.3에서 변경된 상태("반갑습니다." 출력 추가)이다. 저장소에 저장되어 있는 것은 1.4이므로 CVS는 저장소에 있는 1.3과 1.4의 차이를 살핀다. 둘의 차이는 다른 개발자에 의해 "환영합니다."를 출력하는 줄이 추가된 것이다. 이를 현재디렉토리의 Hello.java에 추가하려고 시도하지만, 그 위치에 이미 다른 내용("반갑습니다." 출력)이 들어가 있음을 알게 된다. 결국 CVS는 충돌(C로 표시)이 생겼음을 알리고 수행을 마친다. Hello.java의 내용을 보면 어디에서 어떤 충돌이 발생했는지 CVS가 표시해 놓을 것을 발견할 수 있다.
$ cat Hello.java
public class Hello {
   // main 함수
   public static void main(String args[]) {
      System.out.println("안녕하세요?");
<<<<<<< Hello.java
      System.out.println("반갑습니다.");
=======
      System.out.println("환영합니다.");
>>>>>>> 1.4
   }
}
<<<<<<<와 >>>>>>> 사이가 충돌이 일어난 부분이다. 그 부분은 다시 두 부분으로 나뉘는데, ======= 이전까지가 현재 디렉토리에 있는 파일의 내용이고, 그 이후가 저장소에 있는 파일의 내용이다. 개발자는 이걸 보고 어느 한 쪽을 없애거나 두 내용을 적절히 합친 후 다시 commit을 해 주면 된다. 이 경우 "반갑습니다."가 더 마음에 들어 "환영합니다."를 삭제하기로 했다면 다음과 같이 고치고 commit을 한다.
$ cat Hello.java
public class Hello {
   // main 함수
   public static void main(String args[]) {
      System.out.println("안녕하세요?");
      System.out.println("반갑습니다.");
   }
}
$ cvs commit -m "인사말 변경" Hello.java
Checking in Hello.java;
/home/CVS/myprj/Hello.java,v  <--  Hello.java
new revision: 1.5; previous revision: 1.4
done
하지만 다른 개발자가 수정한 내용을 그대로 놔 두고 내가 고친 부분을 없애기로 했다면 따로 commit을 할 필요가 없다. 이미 저장소에 그 내용이 들어 있기 때문이다.

충돌은 commit 시에도 발생할 수 있다. 앞의 예에서 다른 개발자가 "환영합니다." 출력 문장을 추가하여 commit을 한 후, 내가 update 대신 commit을 하려 했다면, CVS는 다음과 같이 충돌이 발생했음을 알려 줄 것이다.

$ cvs commit -m "반갑습니다 추가" Hello.java
cvs commit: Up-to-date check failed for `Hello.java'
cvs [commit aborted]: correct above errors first!
이런 메시지를 보게 되면 update 명령으로 어디에서 충돌이 발생했는지를 확인하면 된다. 그 결과와 수정 방법은 앞에서 나온 것과 동일하다.

    파일의 추가/삭제 (add/delete)

지금까지는 저장소에 있는 파일을 수정하고, 그 결과를 다시 저장하는 방법을 알아보았다. 하지만 작업을 하다 보면 새로운 파일을 만들거나 기존의 파일을 지워야 할 경우가 생긴다. 이런 경우에 사용하는 명령이 add와 delete이다. 사용 방법은 매우 간단하다. Test.java란 파일을 새로 만들려면 먼저 현재 디렉토리에 Test.java를 생성한 후 다음과 같이 하면 된다.

$ cvs add Test.java
cvs add: scheduling file `Test.java' for addition
cvs add: use 'cvs commit' to add this file permanently
메시지에서 알 수 있듯이 add 명령만으로는 저장소에 Test.java가 생기지 않는다. 저장소를 변경하는 것은 commit 명령뿐이다. add 명령은 단지 commit 명령시에 Test.java를 추가해야 한다는 것을 기록해 놓을 뿐이다. 이 사실은 update로 확인해 볼 수도 있다.
$ cvs update
cvs update: Updating .
A Test.java
앞의 A는 추가될(added) 파일임을 의미한다. 그러므로 Test.java는 나중에 작업 내용 전체를 commit할 때 저장소에 추가될 것이다. 아니면 미리 Test.java를 인자로 commit을 하여 바로 추가되도록 할 수도 있다.
$ cvs commit -m "새 파일" Test.java
RCS file: /home/CVS/myprj/Test.java,v
done
Checking in Test.java;
/home/CVS/myprj/Test.java,v  <--  Test.java
initial revision: 1.1
done
추가된 파일은 다른 개발자가 update를 할 때 그 개발자의 작업 공간에도 생겨나며, 파일 내용이 갱신되는 것과 마찬가지로 U를 써서 표시한다.
$ cvs update
cvs update: Updating .
U Test.java

파일을 지우는 것도 마찬가지이다. Test.java를 지우려면 다음과 같이 한다.

$ rm Test.java
$ cvs delete Test.java
cvs remove: scheduling `Test.java' for removal
cvs remove: use 'cvs commit' to remove this file permanently
delete 명령을 사용하기 전에 반드시 먼저 파일을 작업 공간에서 삭제하여야 한다. 이제 commit 명령을 사용하면 Test.java는 저장소에서 삭제될 것이다. 이것도 update로 확인해 본다면 다음과 같이 나올 것이다.
$ cvs update
cvs update: Updating .
R Test.java
R은 삭제될(removed) 파일임을 나타낸다. 이제 commit으로 완전히 삭제해 보자.
$ cvs commmit -m "삭제" Test.java
Removing Test.java;
/home/CVS/myprj/Test.java,v  <--  Test.java
new revision: delete; previous revision: 1.1
done
이렇게 삭제된 파일은 이후로 다른 개발자가 update를 하게 되면 다음과 같은 메시지를 출력하면서 그 개발자의 작업 디렉토리에서도 삭제된다.
$ cvs update
cvs update: Updating .
cvs update: warning: Test.java is not (any longer) pertinent

    작업 기록 열람 (log)

그 동안의 예에서 본 바와 같이 CVS는 작업 내용을 저장소에 저장할 때마다 메시지를 적도록 하고 있다. 이 내용은 저장소에 함께 저장되어 log 명령을 이용하면 언제라도 꺼내 볼 수 있다. Hello.java를 예로 들어 보자.

$ cvs log Hello.java

RCS file: /home/CVS/myprj/Hello.java,v
Working file: Hello.java
head: 1.5
branch:
locks: strict
access list:
symbolic names:
        start: 1.1.1.1
        webdox: 1.1.1
keyword substitution: kv
total revisions: 6;    selected revisions: 6
description:
----------------------------
revision 1.5
date: 1999/12/12 04:04:23;  author: minskim;  state: Exp;  lines: +1 -0
인사말 변경
----------------------------
revision 1.4
date: 1999/12/12 04:03:50;  author: sehkone;  state: Exp;  lines: +0 -1
환영합니다 추가
----------------------------
revision 1.3
date: 1999/12/12 04:01:40;  author: sehkone;  state: Exp;  lines: +2 -1
주석 추가
----------------------------
revision 1.2
date: 1999/12/12 03:51:36;  author: minskim;  state: Exp;  lines: +1 -0
인사말 추가
----------------------------
revision 1.1
date: 1999/12/12 03:50:48;  author: minskim;  state: Exp;
branches:  1.1.1;
Initial revision
----------------------------
revision 1.1.1.1
date: 1999/12/12 03:50:48;  author: minskim;  state: Exp;  lines: +0 -0
프로젝트 시작
=============================================================================
매번 commit을 할 때마다 날짜와 시각, 저장한 사람, 메시지 등이 기록되는 것을 알 수 있다. 이렇게 log 명령을 쓰면 언제 누가 어떤 작업을 했는지를 한눈에 알 수 있기 때문에 그간의 작업 내용을 쉽게 파악할 수 있다. 이 기능을 잘 활용하기 위해서는 무엇보다도 매번 commit을 할 때 알기 쉽고 작업 내용을 잘 반영할 수 있는 메시지를 적는 것이 중요하다.

DDoS(Denial of Service attack, DoS) - 서비스 거부 공격

서비스 거부 공격 이란?

 

 서비스 거부 공격(Denial of Service attack, DoS)은 시스템을 악의적으로 공격해 해당 시스템의

리소스를 부족하게 하는 공격이다. 특정 서버에게 수많은 접속 시도를 만들어 다른 이용자가

정상적으로 서비스 이용을 하지 못하게 하거나, 서버의 TCP 연결을 바닥내는 등의 공격이

이 범위에 포함된다.

 

 통상적으로 DoS는 유명한 사이트를 상대로 이루어진다. 2002년 10월 22일과 2007년 2월 6일

DNS루트 서버에 대한 DNS 백본 DDoS공격은 인터넷 URL 주소 체계를 무력화시켜

인터넷 전체에 대한 공격이었다.

 

증상

 

 US-CERT에서는 DoS 공격으로 의심할 수 있는 증상을 다음과 같이 설명했다.

  1. 비정상적인 네트워크 성능 저하
  2. 특정 웹사이트의 접근 불가
  3. 특정 전자 우편의 급속한 증가

공격에 대한 대책

 

 DoS공격이 시작되면 즉시 조치를 시작해야 된다.

공격에 가장 쉽게 대처하는 방법은 물론 대안을 수립해 놓는 것이다.

핵심 서버들에 비상시의 IP를 준비하고 분산시켜 놓는 것이 매우 종요하다. 공격이 일어났을 때

우회할 수 있는 방법과 대처 할 수 있는 시스템에 대해 투자하는 것에 소홀히 해서는 안 된다.

 

 알약에서 제공하는 2차 DDoS 공격 차단을 위한 전용백신을 배포중에 있으므로 한번쯤

검사를 해 보도록 하자.

 

안녕하십니까?
이스트소프트 알약 긴급대응팀입니다.
이틀 전부터 시작된 1차 DDoS 공격에 이어, 2차 DDoS 공격이 발생했습니다.

알약 홈페이지에서는DDoS 악성코드의 제거를 위한 전용백신을 배포합니다.
전용백신에는 악성코드 패턴을 분석하여 탐지할 수 있는 기능이 탑재되어 있으며 추가로 발생하는 변종에 대비하기 위한 신고 시스템을 내장하고 있습니다.




국가적으로 문제가 되고 있는 DDoS 공격에 대응하기 위해 사용자 여러분들의 적극적인 협조와 제보를 부탁드립니다.


이미 알약이 설치되어 있는 PC에서는 최신 업데이트 및 검사를 통해 DDoS 악성코드를 진단 및 치료 할 수 있으며 실시간 감시를 활성화하여 악성코드의 실행을 실시간으로 차단할 수 있습니다.

알약이 설치되어 있지 않은 사용자는 아래 링크를 클릭하여 알약을 설치하고 DDoS 악성코드를 차단/치료합니다.


[ 공개용 무료버전 다운로드 ]




[ 기업,공공기관용 30일 무료버전 다운로드]




V.TRJ.DDoS.Agent 악성코드들은 사용자의 PC의 중요한 파일을 삭제하거나 과도한 시스템 점유율을 사용하지 않기 때문에 육안으로 내 PC가 감염되었는지 판단하는 것은 매우 어려우며, 알약과 알약 전용 백신으로 검사하는 것만이 가장 확실히 감염 여부를 알 수 있는 방법 입니다.

현재 이스트소프트는 1~2차 DDoS 공격 악성코드에 대응하기 위해 최신 DB 업데이트를 완료한 상태이며, 알약에서도 V.TRJ.DDoS.Agent 로 진단 및 치료가 가능합니다.

[전용백신을 이용한 치료 방법]
알약에서는 해당 악성코드에 대한 전용백신을 제공하고 있습니다.
아래의 전용백신을 다운로드 받아 실행합니다.
(실시간 감시 기능은 알약 전용백신에서는 제공하지 않습니다. 실시간 감시 기능을 이용하시려면
알약 최신버전 을 설치해주세요.)
V.TRJ.DDoS.Agent 전용 백신을 실행하여 "검사" 버튼으로 검사를 진행한 후
마지막으로 "치료" 버튼을 누릅니다.

유럽 판타지 MMORPG 룬즈 오브 매직 트레일러

유럽 판타지 MMORPG - 룬즈 오브 매직 트레일러

 

"09.07.10 textcube.com 에 첫발을 딛다.

 

This is Jae-Il's company~! Wecome To My Blog ~!!^ ^

 2009년 7월 10일 textcube.com 블로그의 새 장을 열었습니다.

이제부터 새롭게 시작 해 보는 겁니다.~^ ^