posted by 구름너머 2008. 3. 14. 23:00

2008년 03월 14일 (금) 16:21 머니투데이

[머니투데이] ['공시족' 급증 전망 속 환영·우려 시각 교차]

내년부터 공무원시험의 나이 제한이 사라져 이른바 '공시족'이 급증할 것으로 전망된다.

공무원이 선망의 직업으로 떠오르면서 나이에 걸려 공무원시험을 포기해야 했던 이들의 재응시 행렬이 줄을 이을 것으로 보이기 때문이다.

14일 행정안전부에 따르면 공무원 공채시험의 나이제한을 폐지하는 것을 골자로 하는 국가공무원법 개정안이 내주 중 국무회의를 거쳐 공포될 예정이다.

이에 따라 행안부는 하위법령 개정을 통해 내년부터 모든 공무원시험의 응시연령 상한제를 폐지할 방침이다. 현재는 공무원시험 응시연령이 △행정고시 20∼32세 △외무고시 20∼29세 △7급 20∼35세 △9급 18∼32세로 제한돼 있다.

공무원도 나이차별 안돼=행안부는 전면 폐지가 아닌 단계적으로 응시연령 상한선을 높이는 방안을 추진했지만 전면 폐지를 골자로 하는 공무원법 개정안이 의원입법으로 2월 임시국회를 통과함에 따라 당장 내년부터 나이 제한이 없어지게 됐다.

공무원시험 나이 제한은 국가인권위원회에 수차례 민원이 제기되고, 헌법재판소에도 '평등권과 공무담임권을 침해한다'는 이유로 헌법소원이 제기되는 등 논란이 이어져왔던 사안이다.

또 지난해 '고용상 연령차별금지 및 고령자고용촉진에 관한 법률'(연령차별금지법)이 제정되면서 민간기업에만 채용 때 나이제한 금지를 적용하는 것이 부당하다는 지적이 제기됐었다.

법조계와 경영계도 공무원시험만 나이 제한 철폐의 '예외지역'으로 두는 것에 대한 불만을 표시했었다. 민간기업은 연령차별금지법에 따라 빠르면 올해 말부터 채용 때 나이제한을 못하게 된다. 이를 어기면 3000만원의 과태료가 부과된다.

'환영', '우려' 시각 공존=공무원시험의 '나이 장벽'이 허물어지면서 공무원에 도전하려는 국민들이 급증할 것이 확실시된다.

'삼팔선'(38세 퇴직), '사오정'(45세 정년), '오륙도'(56세까지 일하면 도둑놈) 등이 유행어가 될 정도로 일반기업에서 이른 나이에 내몰리는 현상이 지속되고 있는 상황에서 정년이 보장된 공무원의 매력이 더해가고 있어서다.

상당수 직장인들은 안정적인 공무원으로의 전환을 꿈꾸며 공무원시험 대열에 가세할 것으로 보인다. 대학생 등 젊은층도 나이 제한이 사라지면 늦은 나이까지 공무원시험에 매달리는 이들이 훨씬 많아질 전망이다.

수년째 7급 공무원시험을 준비해오다 올해 만 32세로 턱에 걸린 권모씨는 "나이 때문에 인생을 걸었던 시험을 포기 안해도 돼 다행이다. 당락이 조그마한 차이로 결정된다는 점에서 올해 떨어져도 다시 도전할 것"이라고 환영했다.

반면 우려의 시각도 상당하다. 현재도 다른 인생을 개척하기 보다는 공무원시험에 매몰된 젊은층들이 급증해 사회문제로까지 비화되고 있는 마당에 나이 장벽마저 사라진다면 인생을 공무원시험에 거는 '공시족'만 양산하는 것이라는 걱정에서다.

행안부 관계자는 "공무원시험 응시 나이제한이 평등권을 제한하는 측면이 분명히 있지만 반대로 사회적 폐해를 줄이는 역할도 해왔다는 점에서 악영향도 무시 못할 것"이라고 말했다.



[관련기사]
☞ 공무원 5급 공채 '32세' 연량제한, 찬반 공방
☞ 핏대 올리는 MB,냉소적인 공무원
☞ 노량진 수험가, 지방공무원 채용 확대 희색
☞ 공무원준비생 34% "조직개편시 포기할수도"
☞ 직장인, 자녀 희망직업 1순위 '공무원'
여한구.송선옥 기자
제공 : 머니투데이
posted by 구름너머 2008. 3. 5. 17:04

http://wiki.kldp.org/wiki.php/CVS/FAQ#s-1.26

CVS/FAQ

CVS 사용에 대한 FAQ 모음

한글로 된 CVS 문서들이 여럿 나와 있지만 꼭 필요한 정보들이 여기저기 흩어져 있고 체계적이지 않은 경우가 있어, 처음 CVS를 접하는 분들이 비슷한 질문을 반복적으로 하게 되는 듯 합니다. 오픈소스 프로젝트 개발에 참여하고자 하는 분들에게 필요한 정보를 모아봤으면 합니다. CVS 사용하면서 이 간단한 걸 몰라서 참 고생했었지 싶은게 있으면 언제든지 추가해 주세요.

마침 KLDPconf 주제 응모에도 비슷한 얘기가 나와서 생각난 김에 일단 시작해 봅니다.

질문만 적어주셔도 물론 좋습니다.

Contents

[-]
1 질문과 답
1.1 CVS를 빨리 배워서 써야하는데 어떡하죠?
1.2 CVS가 뭐예요? / 어디에 쓰는 물건인가요?
1.3 CVS를 실제로 개발 과정에 사용하는 프로젝트가 있나요?
1.4 CVS를 쓰면 그래서 뭐가 좋은가요?
1.5 RCS는 또 뭐죠? / RCS 하고는 뭐가 다른가요?
1.6 SourceSafe와는 뭐가 어떻게 다른가요?
1.7 CVS에서 .......한 점이 마음에 들지 않습니다. 다른 프로그램은 없나요?
1.8 Windows에서 쓸 수 있는 CVS 클라이언트가 있나요?
1.9 Windows에서 쓸 수 있는 CVS 서버가 있나요?
1.10 CVSROOT 환경 설정을 어떻게 해야하나요?
1.11 Anonymous checkout 이 뭔가요? 어떻게 하죠?
1.12 로그인을 하라는데 어떻게 하나요?
1.13 저장소(Repository)의 디렉토리 구조를 알고 싶습니다.
1.14 새 Repository는 어떻게 만드나요?
1.15 새 프로젝트는 어떻게 만드나요?
1.16 checkout은 어떻게 하나요?
1.17 checkout한 이후에 Repository에서 바뀐 내용을 확인하고 싶습니다.
1.18 내가 작업한 내용은 어떻게 알 수 있나요?
1.19 지금까지 작업한 내용을 checkin하고 싶습니다.
1.20 Conflict가 생겼습니다! 어떻게 해야하나요?
1.21 소스에서 이 부분을 누가 만든 건지 좀 알아야겠습니다.
1.22 파일을 추가하고 싶습니다.
1.23 파일을 삭제하고 싶습니다.
1.24 파일 이름을 바꾸고 싶습니다.
1.25 디렉토리를 지우고 싶습니다
1.26 실수로 잘못된 소스를 checkin해 버렸습니다. 어떻게 고쳐야하나요?
1.27 checkout 받은 소스를 이제 그만 지워버리고 싶어요.
1.28 현재까지 작업 내역을 보고 싶습니다.
1.29 revision이 뭔가요?
1.30 tag가 뭔가요?
1.30.1 tag는 어떻게 붙이나요?
1.31 branch는 또 뭔가요?
1.31.1 branch는 어떻게 만들죠?
1.31.2 merge는 어떻게 하는 겁니까?
1.32 과거 특정 시점에 소스가 어땠는지 보고 싶습니다.
1.33 CVS 서버에 어떤 module이 있는지 어떻게 알 수 있나요?
1.34 CVSROOT/modules에 모듈 등록은 어떻게 하나요?
1.35 CVSROOT/passwd에 사용자를 어떻게 추가하나요?
1.36 익명 사용자는 어떻게 등록하나요?
1.37 CVS가 /root 아래 파일을 찾으려 듭니다! 이게 뭔가요?
1.38 Repository를 다른 기계로 옮기고 싶습니다.
1.39 CVS 서버에 있는 repository를 미러링할 수 없나요?
1.40 module들을 공유할 수 있는 방법이 있나요?
1.40.1 간단한 방법
1.41 Source file에 강제로 revision을 지정할 수 있나요 ?
1.42 CVS도 VSS처럼 배타적 락(Exclusive Lock)을 걸어 놓고 사용할 수 있나요?
1.43 Repository에 Attic 이란게 있던데 이건 뭔가요?
1.44 Unicode file을 지원하지 못하는가요?
1.45 이미 Text로 업로드 된 파일을 Binary로 바꿀 수 있는가요?
1.46 이미 Binary로 업로드 된 파일을 Text로 바꿀 수 있는가요?
1.47 로그를 잘못 적었는데 고칠 수 없을까요?
1.48 Tag에 comment를 붙이는것은 가능한가요
1.49 Unknown command 라는 에러가 납니다.
1.50 항상 최신버전의 소스를 유지하고 싶어요
1.51 이전버전으로 되돌리고 싶어요(Rollback)
1.52 CVS를 쓸까요 Subversion을 쓸까요?
2 help 사용법
3 용어
4 문서를 만들면서
5 관련 자료


1 질문과 답

1.1 CVS를 빨리 배워서 써야하는데 어떡하죠?

  1. 우선 DocbookSgml/CVS-KLDP 를 보고 한번 그대로 따라해 보세요.
  2. 아래 정리해둔 다른 한글로 된 문서들을 틈틈히 읽어 봅니다.
  3. CVS를 꾸준히 써야 하거나 여러가지 정석적인 사용 방법을 익히고 싶다면 [http]CVS-BestPractices 문서를 정독하시기를 권합니다.
  4. 큰 오픈소스 프로젝트에서 많은 개발자들이 같이 작업할 때 소스 버전 컨트롤이 어떤 방식으로 운영되는지에 관심 있는 분들은 [http]The CVS Book을 한번 보시기 바랍니다.

1.2 CVS가 뭐예요? / 어디에 쓰는 물건인가요?

CVS(Concurrent Versions System)는 프로그램 소스나 문서 파일 버전 관리를 쉽게 할 수 있도록 도와주는 프로그램입니다. 특히 여러 사람들이 동시에 작업을 진행해야하는 규모가 큰 개발 프로젝트에서 큰 효과를 기대할 수 있습니다. 이밖에도 꾸준히 업데이트되는 문서 관리라든가 웹사이트 관리 등에 유용하게 쓸 수 있고, 심지어 /etc 아래에 들어가는 설정 파일을 (원격) 백업하는 용도로도 사용 가능합니다. :-)

동시에 여러 유닉스 장비에서 작업하는 경우 등에 써볼만한 "홈디렉토리 몽땅 CVS에 넣어버리기"에 대한 LinuxJournal 기사([http]CVS homedir)도 한번 읽어 보세요.

1.3 CVS를 실제로 개발 과정에 사용하는 프로젝트가 있나요?

잘 알려진 유명한 오픈소스 프로젝트들은 대개 CVS나 이와 유사한 소스 관리 시스템을 갖추고 있습니다.

  1. OpenBSD : OS 및 시스템 전체 소스를 CVS로 관리하고 있습니다.
  2. OpenOffice : 총 3만 파일에 대략 9백만 라인 이상되는 C++ 코드를 CVS로 관리합니다.
  3. Mozilla : 전체 프로젝트 및 파생 프로젝트 소스 코드 및 릴리스/브랜치 관리를 CVS로 하고 있습니다.
  4. XFree86 : CVS 를 사용하는 유명 프로젝트중 하나입니다.
  5. Apache : 위와 동일합니다.

1.4 CVS를 쓰면 그래서 뭐가 좋은가요?

관리자는 :
  1. 프로젝트 참여자 개개인의 작업을 방해하지 않으면서 전체적인 진행 상황을 조절할 수 있다.
  2. 릴리스된 버전과 개발중인 버전을 뒤섞지 않고 분리해서 관리할 수 있다.
  3. 일정 기간에 진행된 작업 내용에 대한 리포트를 쉽게 만들어 낼 수 있다.
  4. 일정 기간에 진행된 변경 내역을 효과적으로 추적할 수 있다.
  5. 누가 일을 하고 누가 놀고 있는지 쉽게 감시할 수 있다. :-)

개발자는 :
  1. 소스 백업에 신경 쓸 필요가 없다.
  2. 새로운 코드를 작성할 때 기존 작업을 망칠 위험 없이 쉽게 시도할 수 있다.
  3. 문제가 생겼을 때 어느 지점에서 문제가 생겼는지 쉽게 추적해서 찾아낼 수 있다.
  4. 소스나 문서 특정 부분 작업을 누가 언제 했는지 쉽게 알아낼 수 있다.
  5. 별도 리포트 작성 및 문서를 써야하는 건수나 양이 많이 줄어든다.
  6. 맘먹으면 별로 한 일이 없어도 꾸준히 일하고 있는 것처럼 속일 수도 있다. :-)

1.5 RCS는 또 뭐죠? / RCS 하고는 뭐가 다른가요?

CVS는 RCS를 기반으로 작성된 버전 관리 시스템입니다. 쉽게 얘기하자면 RCS는 파일 하나하나에 대해 버전 관리를 해주는 것이고, CVS는 RCS 기능을 이용해 소스나 문서를 프로젝트/모듈 단위로 관리할 수 있도록 확장한 프로그램입니다. 이미 RCS를 쓰고 있고 익숙한 분이 아니라면 굳이 CVS를 새로 배울 필요는 없습니다. RCS로 할 수 있는 모든 것은 CVS로 할 수 있지만 그 역은 성립하지 않기 때문입니다.

CVS에서도 일부 기능(이미 써 놓은 로그 수정 등)은 RCS 명령을 사용해야 합니다. 궁금하다면
 $ cvs -H admin
해서 RCS 관련 명령어를 한번 살펴 보세요.

1.6 SourceSafe와는 뭐가 어떻게 다른가요?

1.7 CVS에서 .......한 점이 마음에 들지 않습니다. 다른 프로그램은 없나요?


대체할 만한 것들... Non-Free

1.8 Windows에서 쓸 수 있는 CVS 클라이언트가 있나요?


CVS를 처음 사용하는 분에게는 TortoiseCVS 를 권합니다. Java를 주로 사용하거나 좋은 IDE 환경을 원하시는 분은 Eclipse를 한번 써보세요.

DeleteMe 윈도우즈 환경에서 CVS를 사용하는 방법에 대해 아직 쉽게 참고할 만한 문서가 없는 것으로 압니다. 누군가 위에 제가 링크해 드린 두 개의 내용을 바탕으로 해서 윈도우즈 환경에서 CVS를 사용하는 방법을 다룬 별도의 문서를 만들어 주시면 참 좋겠네요. -- 권순선
WinCVS 페이지에서 새롭게 문서를 작성해 나갈까 합니다. 많은 관심과 도움 부탁드립니다. -- 쫑아

1.9 Windows에서 쓸 수 있는 CVS 서버가 있나요?

1.10 CVSROOT 환경 설정을 어떻게 해야하나요?

Local Repository
export CVSROOT=/usr/local/cvsroot

Remote Repository
export CVSROOT=:pserver:username@host.domain.com.:/var/cvsroot

Remote Repository w/ SecureShell
export CVS_RSH=sshexport CVSROOT=:ext:username@host.domain.com.:/var/cvsroot

1.11 Anonymous checkout 이 뭔가요? 어떻게 하죠?

익명 사용자에게 읽기 권한을 제공함으로써 소스나 문서 최신 버전을 손쉽게 업데이트할 수 있도록 해줍니다. 특히 컴파일이 필요없는 스크립트 기반 프로젝트에 유용합니다. [http]MoniWiki를 예로 들자면
$ cvs -d:pserver:anonymous@cvs.kldp.net:/cvsroot/moniwiki login$ cvs -z3 -d:pserver:anonymous@cvs.kldp.net:/cvsroot/moniwiki co moniwiki
와 같이 하면 됩니다. 이후에 새 버전이 나오거나 패치가 업데이트 되면
$ cvs update -dP
해서 간단히 최신버전으로 업데이트할 수 있습니다.

1.12 로그인을 하라는데 어떻게 하나요?

$ cvs login(Logging in to user@host.domain.com)CVS password:

$ cat ~/.cvspass:pserver:user@host.domain.com:/var/cvsroot XYZ123

$ cvs logout(Logging out of user@host.domain.com)

1.13 저장소(Repository)의 디렉토리 구조를 알고 싶습니다.

  /home/cvs/ .... (1)  /home/cvs/CVSROOT/ .... (2)  /home/cvs/CVSROOT/passwd .... (3)  /home/cvs/CVSROOT/readers .... (4)  /home/cvs/module_A/ .... (5)  /home/cvs/module_B/ .... (6)

(1) $CVSROOT 로 지정되는 CVS의 최상위 디렉토리

(2) CVS 저장소의 설정 파일들이 있는 디렉토리

(3) CVS 사용자 ID와 비밀번호

(4) CVS 읽기만 가능한 사용자

(5), (6) 프로젝트 디렉토리, 프로젝트에 따라 CVS 명령으로 생성됩니다.

1.14 새 Repository는 어떻게 만드나요?

$ export CVSROOT=/home/user/cvsroot$ cvs init$ ls /home/user/cvsrootCVSROOT/$ ls /home/user/cvsroot/CVSROOT/Emptydir/       config         editinfo,v  modules,v  taginfocheckoutlist    config,v       history     notify     taginfo,vcheckoutlist,v  cvswrappers    loginfo     notify,v   val-tagscommitinfo      cvswrappers,v  loginfo,v   rcsinfo    verifymsgcommitinfo,v    editinfo       modules     rcsinfo,v  verifymsg,v

1.15 새 프로젝트는 어떻게 만드나요?

$ ls proj/README  a.c  a.h$ cd proj/$ cvs import -m "this is the project" proj VENDOR INIT$ ls /var/cvsroot/CVSROOT/  proj/$ ls /var/cvsroot/proj/README,v  a.c,v  a.h,v

1.16 checkout은 어떻게 하나요?

$ cd ~/work$ cvs co projU proj/READMEU proj/a.cU proj/a.h

특정 태그를 지정해서 받고 싶다면 다음과 같이 합니다.
$ cvs co -r RELEASE_1_0_5 moniwiki

1.17 checkout한 이후에 Repository에서 바뀐 내용을 확인하고 싶습니다.

우선 내용 확인 (로컬에 아무 변화도 만들지 않음).
$ cvs -n update

그리고 이상이 없으면 변경된 사항을 받아온다.
$ cvs update -dP

1.18 내가 작업한 내용은 어떻게 알 수 있나요?

$ cvs diff$ cvs diff -r BASE$ cvs diff -r BASE -r HEAD$ cvs diff -c -r1.6 prog.c$ cvs diff -c -r1.6 -r1.7 prog.c

1.19 지금까지 작업한 내용을 checkin하고 싶습니다.

$ cvs ci -m "fixed bug #12345"
$ cvs com[mit] prog.c$ cvs ci -m "another bug fix in sheet.c" sheet.c

1.20 Conflict가 생겼습니다! 어떻게 해야하나요?

당황하지 마세요. 소스나 문서에서
<<<<....----....>>>>
이렇게 생긴 부분을 찾아서 고친 다음 다시 cvs update; cvs ci 하면 됩니다.

1.21 소스에서 이 부분을 누가 만든 건지 좀 알아야겠습니다.

$ cvs annotate a.c

1.22 파일을 추가하고 싶습니다.

$ cvs add newfile$ cvs add newdir

1.23 파일을 삭제하고 싶습니다.

$ cvs rm oldfile$ cvs rm -f badfile$ cvs rm -f olddir/badfiles$ cvs rm olddir

1.24 파일 이름을 바꾸고 싶습니다.

단순히 파일이름만 바꾸는 방법과 history 까지 보존하는 방법이 있습니다 (매뉴얼에서 발취)

일반적인 방법
$ mv old new$ cvs remove old$ cvs add new$ cvs commit -m "Rename old to new" old new
일반적인 만큼 방법도 쉽습니다. 기존 파일의 이름을 다른 이름으로 바꾼후 기존 파일을 cvs remove 로 제거하고

새로 바뀐 이름의 파일을 cvs add 로 추가합니다. 그 다음엔 remove와 add 만으로 파일이 지워지거나 추가된것이 적용되지 않으므로

이 두파일을 commit 해줘야 합니다

히스토리 까지 보존하는 방법

먼저 이 방법은 CVS repository 를 직접 접근하므로 조금은 위험하다고 메뉴얼에서 밝히고 있네요
$ cd $CVSROOT/module$ mv old,v new,v
CVS repository 의 수정할 module 디렉토리에서 이름을 변경할 파일의 이름을 직접 바꾸어 주는 방법입니다

이것은 아래와 같은 장단점을 가지고 있습니다 장점
  • change log가 그대로 보존됩니다
  • revision 역시 그대로 유지됩니다
단점
  • module 의 예전 release 나 tag 를 불러오기가 쉽지가 않다.
  • 이름이 변경되었다는 정보가 log 에 남지 않는다
  • 위의 작업($CVSROOT 에 들어가 파일을 직접 rename 하는..)을 하는 동안 누군가 cvs 작업을 한다면 난처한 일이 생긴다.

1.25 디렉토리를 지우고 싶습니다

CVS에서는 디렉토리 단위로 저장을 하기 때문에 히스토리를 유지하기 위해서는 그 디렉토리가 필요합니다. 따라서 진짜로 디렉토리를 지울 수는 없습니다. 대신 update 시에 받지 않는 방법이 있습니다. 먼저 파일을 지우기를 이용해서 해당 디렉토리의 파일을 모두 지웁니다. 그리고 나서 상위 디렉토리로 가서 해당 디렉토리를 지우고 나면 다음부터는 cvs update -P 로 업데이트 하면 해당 디렉토리가 보이지 않게 됩니다.
cd unneeddirrm *             # 이때 CVS 디렉토리는 남겨져 있어야 합니다.cvs removecvs commit  # 여기서 unneeddir의 모든 파일이 지워집니다cd ..cvs remove unneeddircvs update -P

또는 CVSROOT에 가서 직접 디렉토리를 지워 버리는 방법이 있습니다. 대신이 방법은 CVSROOT 디렉토리 관리 권한을 가지고 있어야 하고, 히스토리까지 사라진다는 단점이 있습니다.

1.26 실수로 잘못된 소스를 checkin해 버렸습니다. 어떻게 고쳐야하나요?


1.27 checkout 받은 소스를 이제 그만 지워버리고 싶어요.

$ cvs release -d proj

1.28 현재까지 작업 내역을 보고 싶습니다.

$ cvs st[atus] [-v] [prog.c]$ cvs log [prog.c]$ cvs ann[otate] [main.c]

1.29 revision이 뭔가요?

파일 하나하나에 붙어 있는 버전 번호를 말합니다.
$ cvs st README......   Working revision:    1.1......

1.30 tag가 뭔가요?

여러 파일이나 모듈에 버전을 표시하기 위해 한꺼번에 붙여둔 표시입니다.
$ cd moniwiki/$ cvs st -v README......   Existing Tags:        moniwiki-1_1                    (branch: 1.1.2)        RELEASE_1_0_5                   (revision: 1.1)......

1.30.1 tag는 어떻게 붙이나요?

$ cvs tag TAGNAME

1.31 branch는 또 뭔가요?

  • Development Branch
  • Release Branch
  • Maintenance Branch

  • Vender Branch

  • (Main) Trunk
  • HEAD

매뉴얼에서 빌려온 그림
                                                     +-------------+                          Branch 1.2.2.3.2 ->        ! 1.2.2.3.2.1 !                                                   / +-------------+                                                  /                                                 /                 +---------+    +---------+    +---------+    +---------+Branch 1.2.2 -> _! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !----! 1.2.2.4 !               / +---------+    +---------+    +---------+    +---------+              /             /+-----+    +-----+    +-----+    +-----+    +-----+! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !      <- The main trunk+-----+    +-----+    +-----+    +-----+    +-----+                !                !                !   +---------+    +---------+    +---------+Branch 1.2.4 -> +---! 1.2.4.1 !----! 1.2.4.2 !----! 1.2.4.3 !                    +---------+    +---------+    +---------+

1.31.1 branch는 어떻게 만들죠?

$ cvs checkout project; cd project$ cvs update foo.c$ cvs tag release-1 .$ cd ..; cvs release -d project$ cvs checkout -r release-1 project$ cvs release -d project

$ cvs rtag -b -r release-1 release-1-patches project$ cvs checkout -r release-1-patches project$ cvs commit -m "Fixed printf bug" foo.c$ cd ..;  cvs release -d project

cvs를 사용할 때 Branch를 해서 버젼을 만들고 메인 버젼이 올라가면 다시 메인버젼과 머지를 하고.. 등의 작업을 수행할 때, 먼저 브랜치를 할 파일들에 태그를 달아주고 태그를 기준으로 브랜치를 만드는 것이 편한 것 같습니다.

명령어는 다음과 같습니다.

cvs rtag -r arab -b arab_xxx ggg

이렇게 하면 ggg라는 프로젝트에서 arab 태그가 붙은 것을 arab_xxx 브랜치로 작성하겠다. 라는 의미가 됩니다. 태그는 먼저 달아주어야 하겠지요.

그리고 태그와 브랜치는 다르다는 점을 미리 아시면 좋겠고.. 만일 wincvs를 사용하신다면 graph를 보시게 되면 tag는 검정색 얇은 선 브랜치는 파란색 굵은 선으로 나뉘는 것을 알 수 있습니다. --최성우 / eatingstars.com

브랜치를 쉽게 만드는 방법입니다.
$ cvs tag -b BRANCHNAME
이 명령을 실행한 작업소는 앞으로 이 브랜치로 작업을 하게 됩니다.

1.31.2 merge는 어떻게 하는 겁니까?

$ cvs checkout -j release-1-patches project$ cvs commit -m "Merged patch"

1.32 과거 특정 시점에 소스가 어땠는지 보고 싶습니다.

태그를 붙여 두지 않았다면, 날자와 시간을 써서 다음과 같이 작업하는 것도 가능합니다.
$ cvs rtag -b -D "2000-01-01  00:00" first-millenium-release project$ cvs get -D "3 month ago" myproj$ cvs get -D "1999-11-23  09:00" oldproj

CVS가 지원하는 날자/시간 지정 형식 몇 가지는 다음과 같습니다.
"1971-04-30  04:35" (ISO format)"30  Apr  1971  04:35" (Internet format)"Tue Jan 25 08:45:45 UTC 2000""3/31/92 10:00:07 PST""January 23, 1987 10:05pm""22:00 GMT""1 month ago""2 hours ago""400000 seconds ago""last year""last Monday""yesterday""a fortnight ago"

1.33 CVS 서버에 어떤 module이 있는지 어떻게 알 수 있나요?

CVS에서 제공하는 명령어를 통해 정상적으로 알아낼 수 있는 방법은 없습니다. :-( 그렇지만 꼭 필요한 경우에 흔히 사용되는 방법이 몇 가지 있습니다.

  1. 프로젝트 관리자에게 물어보세요 :-)
  2. 프로젝트 관리자가 수동으로 CVSROOT/modules 에 등록해 놓으면 다음 명령으로 module의 목록을 볼 수 있습니다.
      $ cvs co -c  
  3. 잘 관리되는 프로젝트라면 일반적으로 cvsweb 이나 viewcvs 같은 웹 인터페이스를 제공할 것입니다. 그걸 이용하세요. 만약 없다면 서버 관리자에게 그런 프로그램을 설치해 달라고 요청하세요.
  4. 위 방법이 모두 안된다면, 다음 스크립트를 써서 간접적으로 알아낼 수도 있습니다.
      $ cvsls.sh HEAD .  
    #!/bin/sh# lists files and directories in the module(s) on the server without# checking them out# cvsls BranchName modules...# for main trunk use 'cvsls HEAD modules...'branch=$1; shiftcvs rdiff -s -D '01/01/1971' -r $branch "$@"  2>&1 \    | sed -e 's/File.//' \                  -e 's/is new; current revision./      (/' \                  -e 's/(\([0-9][\.0-9]*\)/(\1)/' \                  -e 's/cvs server: Diffing/cvs server: Listing/'


1.34 CVSROOT/modules에 모듈 등록은 어떻게 하나요?

sh
cvs co CVSROOT 하여서 modules 파일을 수정하신 후에 commit 하셔야 합니다. 이때 위와 같은 목적으로 활용하실 계획이라면 간단하게 다음과 같이 적으시면 됩니다.
module_A  module_Amodule_B  module_B
위의 내용은 module_A라는 것이 repository root에 존재하는 경우 입니다.

1.35 CVSROOT/passwd에 사용자를 어떻게 추가하나요?

몇 가지 방법이 있지만, 가장 간단한 방법 가운데 하나는 apache 패키지에 들어 있는 htpasswd 명령을 이용하는 것입니다.

  $ htpasswd -b passwd username password

1.36 익명 사용자는 어떻게 등록하나요?

$ cat $CVSROOT/CVSROOT/readerscvscvsguest

1.37 CVS가 /root 아래 파일을 찾으려 듭니다! 이게 뭔가요?

pserver 설정을 해줄 때 아래와 같은 에러가 나는 경우가 있습니다.

cvs server: cannot open /root/.cvsignore: Permission denied

이럴 땐 inetd 나 xinetd 설정을 해줄 때 cvs에 넘겨줄 인수에 '-f' 옵션을 추가해주면 해결됩니다. xinetd 라면 /etc/xinetd.d/cvspserver 내용을 아래와 같이 해 주면 됩니다.

# default: on# description: cvs pserverservice cvspserver{        disable         = no        flags           = REUSE        socket_type     = stream        wait            = no        user            = root        server          = /usr/bin/cvs        server_args     = -f --allow-root=/home/cvs pserver        log_on_failure  += USERID}

1.38 Repository를 다른 기계로 옮기고 싶습니다.

sh
Q : 만일 A 서버에 있던 repository 를 B 서버로 옮기고 싶다면 그냥 디렉토리를 통채로 복사하면 되려나요? 그게 안 된다면 죄다 update 후 새로 import 를 하라는 얘기인데... -_-;;

A : 네 그냥 옮기면 됩니다. 완벽한(?) 이전을 위해서라면 조금 신경써야할 것들이 더 있긴 하지만, 디렉토리를 통째 tar로 묶어서 새 기계게 풀어준 다음 permission 조절만 해줘도 웬만큼 됩니다.

1.39 CVS 서버에 있는 repository를 미러링할 수 없나요?

단순한 백업 이상을 의미하는 것이라면, CVS는 기본적으로 단일 repository를 바탕으로 설계되었기 때문에 자체적으로는 불가능합니다. 대규모 프로젝트 같은 경우에 전세계 곳곳에 미러를 하기 위해 CVSup 같은 보조도구를 이용하거나, 단순히 rsync 같은 미러링 툴을 이용하기도 합니다. 그러나 이 경우 하위 repository에 commit 한 내용을 다시 상위(upstream)로 merge 하는데 기술적인 어려움이 따릅니다. 그렇지만 경우에 따라 효과적인 개발 브랜치나 로컬 개발자 그룹 지원을 위해서는 꼭 필요한 기능이기 때문에, CVS가 가지는 근본적인 제약을 극복하고자 새로 개발되는 프로그램이 있습니다. 만약 꼭 계층적 repository를 구축해야 하는 상황이라면, 다음 프로그램을 사용하는 것을 고려해 보세요.

최근에 XFree86 프로젝트를 arch를 이용해 fork한 사례가 있습니다. : http://www.xouvert.org/

1.40 module들을 공유할 수 있는 방법이 있나요?

Q : 예를 들어서 libx라는 모듈이 있고, proj_a와 proj_b가 이를 모두 사용합니다. 이때 이 두 프로젝트가 유사하여서 libx를 한쪽에서 수정하면 다른 한쪽에서도 영향을 받아야 하는 경우라면 어떻게 해야 할까요? 서버에서 symbolic link를 걸어주거나, 클라이언트측에서 proj_a, proj_b에 모두 libx를 checkout해주면 되겠지만 다소 불편함이 없지 않아 있을것 같아서 여쭤 봅니다.

A : 가능합니다.

CVS에서는 프로젝트 관리를 위해 어떤 모듈을 checkout할 때 하위 모듈을 선별적으로 checkout하거나 가상 모듈을 만들어 실제 모듈을 여러개 동시에 checkout하는 것 등을 지원합니다. 기본적으로는 CVSROOT/modules 파일을 적절히 구성해서 프로젝트에 참여하는 개발자들이 필요한 부분을 잘 골라 받아갈 수 있도록 관리해줘야 합니다. 한가지 짚어두고 싶은 것은, CVS는 소스 버전 관리 프로그램이지 어떤 특정 프로젝트 구조를 정해둔게 아니기 때문에 실제 해결 방식은 진행하는 프로젝트 구성 및 정책에 따라 달라집니다.

간단하게 두가지 경우를 예로 들어보지요.

1. proj_a 와 proj_b, 그리고 libx를 더 큰 proj 으로 묶을 수 있는 경우

CVSROOT/modules 내용은
proj    proj  proj_a proj_b libxproj_a  proj  proj_a libxproj_b  proj  proj_b libxlibx    proj  libx
와 같이 되고, checkout을 하게 되면 proj 디렉토리가 먼저 생기고, 그 아래에 각 모듈이 생깁니다.

2. proj_a 와 proj_b 는 별개 프로젝트이고 libx 도 별개로 관리하는 경우

CVSROOT/modules 내용은
proj_a  -a  proj_a libxproj_b  -a  proj_b libxlibx    libx
이렇게 되고, 예를 들어 cvs checkout proj_a 를 하게 되면 proj_a와 libx라는 모듈이 각각 생성됩니다. 이 경우 libx에 autotools(libtool)을 채용하든가 proj_a와 proj_b 빌드하는데 연결되도록 적절히 구성해줘야 하겠죠.

두가지가 무슨 차이냐? 라고 혹시 생각하는 분이 있을지 모르겠는데, 전자에서는 최상위 디렉토리에 라이브러리를 포함한 빌드 시스템을 구축 관리할 수 있기 때문에 성격이 많이 달라집니다.

또, 경우에 따라
proj    projproj_b  proj  proj_aproj_a  proj  proj_blibx    libx
이런 식으로 구성하는 경우도 생기겠지요.

심볼릭 링크를 걸어주는 것도 편법으로 가능은 하지만, 모듈이나 라이브러리 관리라는 측면에서 본다면 그다지 바람직하지는 않습니다. 물론 불가피한 상황이 있을 수도 있으나 대개는 '라이브러리'라는 것 자체가 해당 코드를 별개로 독립시켜야할 만큼 여러 곳에서 쓰는 경우에 한해 만드는 것이므로 위에서 예를 든 두 가지 경우를 적절히 섞어서 구성하고, autotools 등을 잘 이용하면 해결할 수 있습니다. (DeleteMe 이 주제는 CVS/FAQ라는 범위를 벗어나는 것 같아 이정도만 적습니다.)

1.40.1 간단한 방법

단순히 어떤 모듈을 가져올 때 특정 하부 모듈을 같이 가져오도록 하려면 다음과 같이 하면 됩니다.
proj_a proj_a &libxproj_b proj_b &libxlibx libx
이렇게 하면 proj_a를 체크아웃할 때 proj_a 디렉토리 아래에 추가로 libx 디렉토리가 생깁니다.

1.41 Source file에 강제로 revision을 지정할 수 있나요 ?

Q : 예를 들어서 어떤 소스의 revision #가 1.12라고 할 때 어떤 계기로 인해서 이 번호의 제일 앞자리 숫자를 바꾸려고 하면 어떻게 하면 되나요 ?

A : 가능합니다.
cvs ci -m "revision set to 2.0" -r2.0 ohmysrc.c
해당 프로젝트/모듈 전체를 한번에 바꾸려면, checkout 받은 모듈 최상위 디렉토리에서
cvs ci -m "revision set to 3.1" -r3.1
와 같이 하면 됩니다.

그러나

가능하다고 해서 반드시 이렇게 하는게 좋다는 것은 아닙니다.

그러므로

Tag나 Branch를 써야하는 경우가 아닌지 다시 한번 생각해보세요.

1.42 CVS도 VSS처럼 배타적 락(Exclusive Lock)을 걸어 놓고 사용할 수 있나요?

cvs admin -l filename
을 이용하시면 됩니다. 이 경우 해당하는 사람이 lock을 제거하기 전까지는 commit이 불가능하게 됩니다. 하지만 이렇게 하는 것은 대부분 문서에서 그다지 권장하지 않더군요. cvs watch 이용하기를 권장하고 있습니다.

보통은 cvs edit를 써서 원하는 효과를 얻을 수 있습니다. cvs edit는 동시에 edit하는 것을 방지하지 않지만, cvs edit -c filename 을 모든 사람이 이용하게 된다면 그 순간에는 한 사람만이 작업을 할 수가 있게 됩니다. -c 옵션을 준 것을 reserved edit라고 하며, 이 경우에도 누구나 commit은 가능합니다.

1.43 Repository에 Attic 이란게 있던데 이건 뭔가요?

사용자가 지운(cvs rm) 파일을 보관해두는 곳입니다. Attic이 우리말로 하면 "다락"인데, 자주 쓰지는 않지만 버리긴 아깝고 혹시 필요하게 될지 모르는 물건을 저장한다는 점에서 보면 상당히 잘 지은 이름 같습니다.

사용자가 cvs rm을 해서 파일을 지우게 되면, 해당 파일들이 완전히 삭제되는게 아니라 Attic 아래에 옮겨집니다. 그리고 과거 버전을 checkout 하거나 할때 끄집어내서 쓰는 거지요.

1.44 Unicode file을 지원하지 못하는가요?

Q : 이러한 메시지를 만났습니다.
cvs import: Remote server does not support Unicode files.  Checkin may be invalid.
여러개의 파일을 한꺼번에 import할때 나왔으며, 이를 다시 수정하여 ci할때에도 나타났습니다. 음.. 첫번째 파일에서 이러한 문구가 나타났는데, 평범한 C++ code라서 다른 파일이 아닌가 합니다. 아울러 -ku라고 나타나는 메시지도 무엇인지 모르겠네요.
cvs commit: Remote server does not support Unicode files.  Checkin may be invalid.Checking in ***.cpp;cvs server: internal error: unsupported substitution string -ku/***.cpp,v  <--  ***m.cppnew revision: 1.2; previous revision: 1.1done
해당 파일 안에 유니코드로 된 텍스트가 들어있나요? 혹시 RCS keyword substitution 으로 쓰이는 내용이 들어있나요?

1.45 이미 Text로 업로드 된 파일을 Binary로 바꿀 수 있는가요?

바이너리로 업로드하려면 -kb옵션을 사용합니다. 예를들어,
$ echo '$Id: CVS_2fFAQ,v 1.99 2005/08/19 01:21:43 kss Exp kss $' > kotest$ cvs add -kb -m"A test file" kotest$ cvs ci -m"First checkin; contains a keyword" kotest
입니다.

만약 실수로 -kb옵션을 빠뜨리고 (텍스트로)업로드 했을경우, 바이너리로 복구하려면 cvs admin 옵션으로 아래의 예처럼 바꾸면 됩니다.
$ echo '$Id: CVS_2fFAQ,v 1.99 2005/08/19 01:21:43 kss Exp kss $' > kotest$ cvs add -m"A test file" kotest$ cvs ci -m"First checkin; contains a keyword" kotest$ cvs admin -kb kotest$ cvs update -A kotest# For non-unix systems:# Copy in a good copy of the file from outside CVS$ cvs commit -m "make it binary" kotest

1.46 이미 Binary로 업로드 된 파일을 Text로 바꿀 수 있는가요?

한글이 들어있는 파일을 WinCVS를 통해서 add/import를 하게 되면 binary를 권장합니다. 이때, 실수로 Binary로 add/import하게 되면 merge기능을 지원하지 않아 불편하게 되지요. 이럴 때, 위의 Text->Binary와는 반대의 작업이 필요하게 되는데, 위의 내용과 같고, 옵션만 -kb가 아닌 -kkv로 해 주면 됩니다.
$ cvs admin -kkv kotest

-- DeleteMe 이것으로 한참 고민하고 이것 저것 해 본 결과 알아 냈습니다만, 여기서 말하는 keyword라는 게 정확하게 의미하는 바를 모르겠습니다. 아시는 분은 설명 부탁드립니다. (-kkv의 help에는 Generate keywords using the default form.라고 되어 있습니다.) barmi

1.47 로그를 잘못 적었는데 고칠 수 없을까요?

$ cvs admin -m1.2:"new log" myprog.c

태그가 붙어 있는 경우라면
$ cvs admin -mV_1_0:"massive new log"
이렇게 한번에 바꾸는 것도 가능합니다.

1.48 Tag에 comment를 붙이는것은 가능한가요

AnswerMe 질문이 조금 애매한것 같습니다. 제목만 보고는 어떤 상황인지 정확히 알 수 없어 답변이 두루뭉실합니다. 조금더 상황을 설명해 주시지요?

tag를 붙이면서 거기에 대한 로그를 어딘가에 기록해둘 수 없냐는 얘긴가요? 그런거라면 대답은 불가능하다 입니다. CVS는 파일 별로 로그를 붙이게 돼 있는 RCS를 계승하기 때문에 각 checkin 별로 기록을 할 수 없다는 단점이 있습니다. 그래서 Subversion 같은 경우 아예 파일별 revision이 아니라 per-checkin revision을 모듈 단위로 붙여주는 방식을 채택했습니다.

만약 tag 자체에 대해 어딘가에 기록을 남기고 싶은 거라면 ChangeLog 나 README 등에 내용을 적어두는 것으로 대체할 수도 있습니다.

질문자입니다. 말씀해 주신 내용이 정확합니다. 제가 보기에도 file 단위로 log message를 남기는 것 같아서 여쭤 보았던 것입니다. 아직 익숙하지 못해서인지 좀 불편한 점으로 생각되어서 질문을 했던 것입니다. :)

http://www.cvstrac.org/ CVS mod인것 같은데 check-in 단위로 기록을 남길수 있습니다. http://www.sqlite.org 에서 사용 하는걸 보면 괜찮아 보입니다.

1.49 Unknown command 라는 에러가 납니다.

Q: 접속시에
cvs [login aborted]: unrecognized auth response from 127.0.0.1: Unknown command: `/home/cvs'
라고 나오네요.. 강좌대로 했다고 생각했는데.. passwd file 문제인가요? redhat 9.0을 쓰고 있읍니다.

A: -d 옵션 (CVSROOT) 줄 때 사용자@서버명:과 /디렉토리/경로 사이에 빈 칸이 들어가 있는 것 같습니다.
$ cvs -d :pserver:anonymous@anonymous.com:/cvsroot
이렇게 전부 붙여줘야 합니다.

1.50 항상 최신버전의 소스를 유지하고 싶어요

항상 최신의 버전을 유지하지 않고 작업을 하니 Commit시 자주 Conflict가 발생합니다. WinCVSTortoiseCVS를 써 보았는데 최신 버전으로 유지해 주는 기능을 안 보이던데요. 덧붙여 update시 발생하는 conflict를 줄이고 싶습니다. update시 merge를 선택적으로 할 수는 없나요? 예를 들어서 '이 파일은 더 최근의 것이 존재합니다. merge할까요? (Y/n)' 이런식으로요.

* WinCVS에서 우선 update합니다. 그럼 merge나 conflict 되어 있을겁니다. 다시 update하면서 update settings중 Get the clean copy를 체크하시면 됩니다.
Clean copy를 받고 싶은게 아니라 local modify 파일은 update를 받고 싶지 않은 경우를 말씀 드렸답니다. ^^ 그리고 update 명령을 자동으로 수행할 수 있는 방법이 있으면 좋겠다는거였습니다. 2가지가 상충된 질문을 드려서 헷갈리셨나 봅니다. _ 감사합니다.
그런 경우 Update query 해서 저장소에 변경된 파일을 확인한 후 그 파일들만 선택해서 업데이트 하시면 됩니다. 스크립트 하나 만들어 보시는 것도 좋을듯 합니다. :)

1.51 이전버전으로 되돌리고 싶어요(Rollback)

http://bbs.kldp.org/viewtopic.php?t=28936

1.52 CVS를 쓸까요 Subversion을 쓸까요?

Q : 이제서야 CVS라는 것에 대해 알게 되어 배워볼까 했더니 CVS의 불편한 점을 개선한 Subversion이 나왔다고 하네요. 처음 배우는 사람은 바로 Subversion을 익혀야 하나요? 아니면 CVS 를 먼저 익혀야 하나요?

A : 대부분의 오픈소스가 CVS로 진행 되니 CVS를 먼저 익히는것이 좋겠죠. Subversion이 안정적이라고 하긴 하나 공식적인 stable 버전은 언제쯤 나올지는... 요즘 한달에 두번씩 버전이 올라가는데 업데이트 해주기 좀 귀찮더군요. CVS에 불만이 생기면 그때 슬슬 바꾸시면 됩니다.

A : SubVersion은 CVS의 불편한 점을 개선했다기 보다는 완전히 다른 프로그램으로 보는게 맞습니다. 상호 호환성도 없고, 단지 SubVersion에서 기존에 CVS로 운영되던 프로젝트를 import할 수 있게 해놨을 따름입니다. revision/version 관리 모델 자체도 전혀 다릅니다. 시기상 나중에 만들어졌기 때문에 CVS가 가지는 단점들을 상당 부분 개선한 것은 사실입니다만, 개발 모델 자체에 대한 접근 방식이랄까 철학이랄까 그런게 다른 부분이 있어 보여서 제 경우엔 조금 관망하는 중입니다. 버전 컨트롤 프로그램을 전혀 써보지 않은 사람 입장에서 어느 쪽이 더 익히기 쉽다든가 하는 건 잘 모르겠군요. SubVersion도 CVS를 쓰던 사람은 쉽게 옮겨갈 수 있다고 얘기합니다만 그거랑은 별개라서 말이죠. --verotas

2 help 사용법

버전 확인
$ cvs --versionConcurrent Versions System (CVS) 1.11.2 (client/server)

그냥 cvs만 치면 help 사용법이 자세히 나온다.
$ cvsUsage: cvs [cvs-options] command [command-options-and-arguments]  where cvs-options are -q, -n, etc.    (specify --help-options for a list of options)  where command is add, admin, etc.    (specify --help-commands for a list of commands     or --help-synonyms for a list of command synonyms)  where command-options-and-arguments depend on the specific command    (specify -H followed by a command name for command-specific help)  Specify --help to receive this messageThe Concurrent Versions System (CVS) is a tool for version control.For CVS updates and additional information, see    the CVS home page at http://www.cvshome.org/ or    Pascal Molli's CVS site at http://www.loria.fr/~molli/cvs-index.html

특정 명령어 옵션을 자세히 보려면
$ cvs -H updateUsage: cvs update [-APCdflRp] [-k kopt] [-r rev] [-D date] [-j rev]    [-I ign] [-W spec] [files...]......

사용할 수 있는 명령어 생략형은 다음과 같다.
$ cvs --help-synonymsCVS command synonyms are:        add          ad new        admin        adm rcs        annotate     ann         checkout     co get        commit       ci com        diff         di dif        export       exp ex        history      hi his        import       im imp        log          lo         login        logon lgn        rannotate    rann ra        rdiff        patch pa        release      re rel        remove       rm delete        rlog         rl         rtag         rt rfreeze        status       st stat        tag          ta freeze        update       up upd        version      ve ver(Specify the --help option for a list of other help options)

3 용어

repository working file working directory (or area) checkout commit (checkin) RCS file modules revision tag branch "the trunk" HEAD / BASE merge conflict

4 문서를 만들면서

개인적으로, 몇 년 전 CVS를 처음 배우면서 제일 어려웠던게 간단한 소개 문서는 한글로 된게 있었지만 조금만 더 상세한 걸 찾아보려면 제대로 된 (영어든 한글이든) HOWTO 같은게 있지도 않았고, (지금도 있는지는 모르겠지만) Faq-O-Matic 으로 된 영어 FAQ 사이트가 레퍼런스로 쓸만한 유일한 곳이었습니다. 그래서 그때부터도 처음 오픈소스 세상을 접하는 개발자에게 CVS라는 장벽을 뛰어 넘는데 보탬이 되는 문서 같은게 꼭 필요하다고 느끼고 있었습니다.

그동안 CVS를 다룬 책도 출간되었고 CVS 다음 세대가 될만한 다른 프로그램들도 나왔고 해서 하려고만 든다면 상대적으로 자료 찾기나 배우기가 더 쉬워진 면도 분명 있습니다. 그렇지만 본래 좋은 HOWTO 들이 그러하듯이 처음 시작하는 사람이 딱 그 문서 하나만 찍어서 옆에 두고 손으로 짚어가며 따라하면 일단 ''시작'은 어떻게든 해볼 수 있는 글이 아쉬웠고, 글 서두에 밝혔듯이 현재 존재하는 한글로 된 CVS 관련 문서들은 담고 있는 정보가 가지는 유용성에 비해 집약도(?)가 떨어지고, 사용자에게 필요한 내용과 관리자에게 필요한 내용이 잘 구분이 되어 있지 않아 결과적으로 처음 접하는 사람에게 문턱을 낮추는 역할에 충실하지 못한 부분이 있다고 생각합니다.

장기적으로는 이런 것들을 해결할 수 있는 좋은 글이 나와야 하겠지만, 아쉬운 대로 "KLDP에 있는 문서를 보고 따라하다 보니 이런 문제에서 걸리는데 어떻게 하면 되는 거냐" 하는 질문에 대한 답 정도라도 생각나는 대로 정리해 보자 라고 생각해서 시작하게 됐습니다. 앞으로도 생각나는 대로 항목들 추가해 나가면서 정리해 나갈 생각입니다. --verotas

Thanks to 권순선, 쫑아, voxel, IrIz, Advanced

5 관련 자료





sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2005-08-19 10:21:44
Processing time 0.0516 sec


'UNIX' 카테고리의 다른 글

memcmp  (0) 2008.08.17
S_ISREG()  (0) 2008.07.16
유닉스 파일 문자열 바꾸기  (0) 2008.02.25
[TIP]네트워크 연결진단법  (0) 2007.09.12
ps와 grep과 awt의 만남  (0) 2007.08.17
WEB
posted by 구름너머 2008. 3. 3. 13:51
바이러스? 웜? 악성코드? 보안기초

2005/03/27 20:14

복사 http://blog.naver.com/akula21/40011641660

바이러스? 웜? 악성코드? 다 같은 거 아닌가요?

흔히 우리는 컴퓨터가 갑자기 느려졌거나, 잘되던 컴퓨터가 어느날 갑자기 먹통이 되어 버리면 "앗! 바이러스에 걸린거아냐?"라며 바이러스 감염을 의심하게 됩니다.

하지만 바이러스란 것이 정확하게 무엇일까요?

쉽게 말해 내 컴퓨터를 망가뜨리는 미지의 프로그램을 말합니다.

세상이 복잡해 지듯 바이러스도 복잡해 졌고, 그와 유사한 것들도 많이 나타나게 되었습니다. 이로 인해 바이러스나 기타 악성 프로그램의 정의는 몹시 복잡해졌습니다.

따라서 컴퓨터를 망가뜨리는 미지의 프로그램이라고 말한다면, 우리의 적인 바이러스에 대해 몇 %도 알지 못하는 것입니다.

지피지기면 백전불패라고 했습니다. 바이러스를 알면 그만큼 대처하기가 쉬워집니다.

따라서 우리가 흔히 바이러스라고 부르는 공공의 적을 보다 자세히 짚고 넘어감으로써 그에 대한 대처법도 함께 정리해 보도록 하겠습니다.

아래의 표를 보면 앞으로 설명할 내용에 대해 윤곽을 잡을 수 있습니다.


대분류중분류소분류치료방법
악성코드(Malicious Code)바이러스(Virus)V3등의 백신으로 진단 / 치료
웜(Worm)
트로이 목마(Trojan horse)백도어, DDOS, 해킹툴, 다운로더, 키로거
유해가능 프로그램(Potentially unwanted program)스파이웨어(SpyWare)애드웨어(AdWare)SpyZero같은스파이웨어/애드웨어 제거툴로 제거
트랙웨어, 다이얼러
기타조크, 스팸발송, IRC스크립트

[악성코드와 유해가능 프로그램의 분류]


나보안 씨는 어느날 인터넷 시작페이지가 이상한 싸이트로 고정되는 것을 발견했습니다.

"아! 바이러스에 걸렸나보다"라고 생각한 나보안씨는 백신 프로그램으로 검사를 해보았지만 발견되는 바이러스나 웜은 없었습니다.

매번 이상한 시작페이지가 뜨는 것에 격분한 나보안씨는 인터넷에서 애드웨어 제거툴을 다운로드 받아 검사해보았습니다. 그러자, 수 백개의 검사결과가 나왔습니다.

나보안씨는 "백신이 이런 것도 못잡나?" 하며 이후로 백신 제품을 믿지 않게 되었습니다. 하지만, 과연 올바른 생각이었을까요?

이러한 오해는 유해가능 프로그램에 대한 이해 부족에서 발생합니다.

위의 도표에 나와 있듯, 바이러스와 웜과 트로이 목마를 한데 묶어 악성코드라고 부릅니다. 또한 스파이웨어 등은 유해가능 프로그램이라고 부릅니다.

악성코드와 유해가능 프로그램은 치료방법이 다르기 때문에 바이러스를 SpyZero 같은 애드웨어 전용 제거툴로 잡으려고 하거나, 나보안씨 처럼 스파이웨어를 V3 같은 백신 제품으로 진단하는 것은 잘못된 대처방법입니다.

악성코드와 유해가능 프로그램은 성격이 각각 매우 틀리고, 따라서 그에 대한 대처방법도 다르기 때문입니다.

웜을 바이러스로 혼동하거나, 스파이웨어를 악성코드로 오인하는 경우가 많습니다.

뒤에서 자세하게 설명하겠지만, 웜은 삭제를 해야 하고 바이러스는 치료를 해야 합니다.

또한, 웜이나 바이러스 같은 악성코드는 V3같은 백신프로그램으로 진단 / 치료를 해야하며, 스파이웨어 같은 유해가능프로그램은 SpyZero같은 스파이웨어 제거 프로그램을 사용하여 제거해야 합니다.

개념만 정확히 이해하면, 간단히 해결할 수 있습니다.

악성코드와 유해가능 프로그램에 대한 자세한 설명과 대응 방안을 다음 편에서 자세하게 확인하시기 바랍니다.

악성코드와 유해가능 프로그램

악성코드와 유해가능 프로그램은 그 성격과 대처방안이 각각 다르기 때문에 각각의 개념을 정확하게 이해할 필요가 있습니다.
나쁜 프로그램들은 모두 바이러스라고 단순하게 생각하거나, 그런 프로그램들을 바이러스로 모두 치료할 수 있다는 잘못된 상식을 가지고 있다면 새롭게 등장하는 악성코드 들에 올바르게 대응할 수 없기 때문입니다

악성코드와 유해가능 프로그램, 어떻게 다른가요?

악성코드와 유해가능 프로그램을 분류하는 기준은 프로그램을 만드는데 악의적인 목적으로 우리를 괴롭히고자 만든 것인가 그렇지 않은가입니다.

악성코드악성프로그램이라고도 불리웁니다. 이것은 제작자가 나쁜의도를 가지고 다른 사람들 괴롭히기 위해서 만든 프로그램을 말합니다.

바이러스, 웜, 트로이 목마, 해킹툴 등이 여기에 속합니다.

이런 프로그램들은 만들 때부터 일반 사용자들을 어떻게 하면 더욱 더 골탕을 먹일 수 있을지 궁리를 하여 만든 프로그램입니다.

악성코드는 그 제작 기법이 워낙 다양 하므로, 프로그램의 범주로 묶을 수 없는 것들도 많습니다. 따라서 프로그램보다 더 넓은 의미인 "코드"라는 단어를 사용하여 악성코드라고 부릅니다.

악성코드와 유해가능 프로그램

악의를 가지고 다른 사람들에게 피해를 주기 위해 만들어진 프로그램을 악성코드 또는 악성프로그램이라 합니다. 이와 다르게 악의를 가지고 만들지는 않았으나, 사람들을 귀찮게 하거나 컴퓨터 이용에 불편을 주는 프로그램을 유해가능 프로그램이라 합니다.


유해가능 프로그램은 악성코드와는 다르게 제작자가 나쁜의도로 다른사람을 괴롭히기 위해서 만들었다고 보기 어려운 프로그램을 말합니다.

스파이웨어, 애드웨어 등이 여기에 포함됩니다.

애드웨어나 스파이웨어처럼 우리에게 이상한 광고 팝업을 띄운다거나 인터넷 익스플로러의 시작페이지를 고정시킨다거나 하는 증상은 우리를 괴롭히는 것임이 확실합니다.

하지만 유해가능 프로그램은 원래의 목적이 우리를 괴롭히기 위해서가 아니라, 광고를 통해 광고수익 올리거나 사이트 이용자를 늘리기 위한 목적으로 만들어졌습니다.

물론, 이로 인해 본의 아니게 우리에게 정신적인 피해를 입히고 있습니다.

유해가능 프로그램은 처음부터 악의적인 목적으로 만들어지지 않았기 때문에 주로 인터넷 익스플로러에서 실행되는 프로그램으로 제작됩니다.

또한 프로그램의 성격상 백신제품으로 "치료"하는 것이 아니라, 애드웨어 제거툴로 "제거"하여야 합니다.

사실 언론이나 보안업체쪽에서도 "악성코드"라는 단어는 상당히 잘못 사용되고 있습니다.

애드웨어를 악성코드로 정의하여 악성코드 제거프로그램 이라고 사용되는 제품도 있지만, 애드웨어는 말씀드린 것처럼 악성코드와 그 성격과 목적이 다릅니다.

바이러스(Virus)가 뭔가요?

바이러스(Virus)란?

바이러스는 여러 악성코드 중 여러분이 가장 친숙하게 많이 들어 보았던 단어일 것입니다. 하지만 바이러스는 악성코드의 일종일 뿐입니다.

바이러스는 악의적인 목적으로 제작되므로 악성코드로 분류됩니다.

초창기 바이러스 중에는 제작자들이 메모리 개선을 위해서, 혹은 압축파일의 효율을 늘리기 위한 선의의 목적으로 제작되었던 것도 있으나, 현재의 바이러스는 백해무익합니다.

바이러스는 주로 감염된 사람의 컴퓨터를 멈추게하거나, 이상한 현상을 일으키거나, 파일을 삭제하는 등의 현상을 일으킵니다.

주로 인터넷이 발달하지 않았던 도스 시절에 디스켓등의 저장매체를 통해 감염되는 것이 대부분이었습니다.


바이러스, 그리고 잠복기

생물학적인 바이러스와 컴퓨터에 기생하는 바이러스는 유사합니다. 그래서 바이러스라는 단어를 끌어다 썼을 것입니다.

감기 바이러스가 사람 몸속에 들어오면, 일단 잠복기를 거칩니다. 잠복기 동안 감염된 사람은 자기가 감기에 걸렸다는 것을 모릅니다.

감기 바이러스는 보통 몇시간에서 길게는 몇일을 잠복해 있다가 증상을 일으킵니다.

잠복기가 있는 이유는 무엇일까요? 바로 다른 사람에게 감염시키기 위해서입니다.

잠복기 동안은 감염된 사람은 바이러스에 걸린지 알수 없으므로, 감기든 사람은 여러사람을 만납니다. 잠복기 동안 만났던 사람들 중 면역이 없는 사람들은 대부분 감염이 됩니다.

증상이 나타나서 마스크를 쓰고 다닌다고 해도 이미 여러사람한테 감염을 시키고 난 후입니다.


컴퓨터 바이러스도 마찬가지 입니다.

바이러스가 컴퓨터에 감염되면 일정 기간의 잠복기를 거칩니다. 그 동안 증상이 없으므로, 우리는 컴퓨터의 감염된 파일을 다른 컴퓨터에 복사하기도 합니다.

바이러스는 내장된 기간이나 정해진 날짜가 되면, 증상을 일으킵니다. 증상이 발생하면 우리는 백신 프로그램으로 치료하지만, 이미 파일은 친구들과 학교 컴퓨터에 이미 복사되어 버리고 난 다음입니다.

잠복기가 없이 바로 바이러스가 증상을 일으킨다면, "아! 어제 철수한테 파일을 디스켓으로 복사해 왔는데 그때 걸렸구나!"하고 감염경로를 추측하기가 쉽습니다.

또한, "아! 감염됐구나, 복사하면 큰일이겠구나!"라고 우리에게 경각심을 주어 전파가 불가능해 집니다.

잠복기가 있는 근본적인 이유는 바이러스의 대부분이 네트워크 등으로 전파되는 것이 아니라서 파일 복사 등 이용자의 행위가 없으면 전파가 불가능하기 때문입니다.

바이러스란?

악성코드의 일종으로, PC에 이상증상을 발생시키거나 프로그램 오작동, 파일 삭제 등의 피해를 입히는 프로그램입니다. 백신프로그램으로 치료할 수 있습니다


어떻게 바이러스에 감염되나?

바이러스는 파일복사를 통해 감염되곤 했었습니다.

초창기의 바이러스의 경우는 파일 복사외에는 마땅히 전파할 수 있는 방법이 없었으므로 파일복사 방식을 사용했으나, 초고속 인터넷 망이 발달한 요즘에는 뒤에서 설명할 웜처럼 인터넷으로 감염되는 방식으로 변화되고 있는 것이 추세입니다.

바이러스가 인터넷으로 퍼질 때는 웜과 동일한 방식을 사용하는 경우도 있지만, 대부분 드롭퍼(Dropper)를 사용하는 경우가 대부분입니다.

드롭퍼는 쉽게 말해 고대신화에 나오는 트로이 목마같은 악성코드입니다.

우리의 컴퓨터를 함락시키기 위해 바이러스 제작자는 드롭퍼를 먼저 들여보냅니다. 우리의 컴퓨터에 도착한 드롭퍼는 바이러스 관련 파일을 외부에서 끌어들여 떨구어(drop) 놓게 됩니다.

뒤에서 자세히 설명되겠지만 이러한 이유로 드롭퍼도 역시 악성코드로 분류되며, 성격과 걸맞게 "트로이안 목마"로 세부 분류됩니다.

냉장고에 있는 간고등어를 냉장고 안에서 요리할 수는 없습니다. 요리를 하기 위해서는 냉장고에서 꺼내 도마위로 올려야 합니다.

마찬가지로 하드 드라이브에 저장되어 있는 프로그램을 하드 드라이브에서 실행할 수는 없습니다. 하드 드라이브에서 꺼내서 메모리로 올려 놓아야 합니다.

도마위에 오른 간고등어가 어머니에 의해서 고등어 찌게가 되기도 하고, 고등어 조림이 되기도 하듯이 메모리에 올라간 프로그램은 CPU의 명령에 따라 여러가지 작업을 하게 됩니다.

그런데 만약 잘 씻지 않아서 도마위에 세균이 득실득실한다면 어떻게 될까요? 도마위에서 요리한 모든 음식재료들이 상할 수 있습니다.

마찬가지로 바이러스는 주로 메모리에 올라와 있습니다. 메모리라는 도마위에 숨어있다가 올라오는 프로그램마다 자신의 바이러스를 감염시킵니다.

이렇게 메모리에 숨어 있는 것을 "상주(常住)한다"고 하며, 이러한 바이러스를 "메모리 상주형 바이러스"라고 합니다. 주로 도마위에 잘 숨는 세균을 말합니다.

냉장고에 있는 음식재료들이 도마위로 올라오면 올라올수록 세균은 모든 음식에 퍼지고 맙니다.

이러한 과정이 오래 지속되면 도마위에 올라갔다가 냉장고로 다시 돌아온 나머지 음식에 의해 냉장고의 모든 음식은 부패하게 될 것입니다.

마찬가지로 바이러스 감염 후 시간이 지나면 지날수록 많은 프로그램이 오동작을 일으키다가 심지어 부팅이 안되는 경우도 발생합니다.


바이러스의 치료방법

도마위에 세균이 감염되어 있다면 냉장고 청소를 하는 것으로만 음식이 상하는 것을 막을 수는 없습니다. 도마부터 우선 깨끗히 소독해야합니다.

바이러스를 치료하기 위해서도 백신프로그램은 먼저 메모리 검사를 통해 메모리에 숨어있는 바이러스 코드부터 제거합니다.

이제는 냉장고 청소를 할 차례입니다. 도마위에 한번 올라갔다 다시 냉장고로 들어간 음식들도 깨끗히 해야합니다.

여러가지 세균에 감염된 음식물을 처리해야 하는 방법에 있어 여러가지 치료기법들이 사용됩니다.

대부분의 바이러스는 식빵위의 곰팡이균과 같습니다. 식빵위에 곰팡이가 살짝 피었다면 곰팡이 핀 부분만 떼어 내면 먹어도 배탈이 나지 않습니다.

하지만 식중독 세균 때문에 음식이 상했다면 이야기가 다릅니다. 식중독 세균에 부패되었다면 차라리 그 음식을 버리는 것이 현명할 것입니다.

바이러스도 이와 유사합니다. 곰팡이균처럼 걷어낼 수가 있는 바이러스가 있는 반면, 식중독균처럼 정상 프로그램에서 걷어 낼수 없는 바이러스도 있습니다.

대부분의 바이러스는 곰팡이균처럼 걷어내면 감염되었던 프로그램은 다시 원래대로 돌아오지만, "겹쳐쓰기형 바이러스"는 식중독균처럼 정상파일의 덮어씌우기 때문에 감염된 파일을 복원할 수 있는 방법이 없습니다.

겹쳐쓰기형 바이러스에 감염이 되었을 경우에는 정상 파일을 삭제하는 수밖에 없습니다. 또한 겹쳐쓰기형 바이러스에 많이 감염되었을 경우에는 포맷밖에 방법이 없는 경우도 있습니다.


대표적인 바이러스

- Win32/FunLove
- VBS/Love_Letter
- Win32/Nimda

웜(Worm)이 뭔가요?

웜(Worm)이란?

일반적으로 웜을 바이러스로, 혹은 웜바이러스로 부르는 경우도 있는데 웜과 바이러스는 구분을 지어야 하며, 구분을 짓는 것이 올바르게 대처할 수있는 요령입니다.

웜은 PC통신과 인터넷이 등장하면서 나타난 악성코드입니다. 네트워크로 전파되는 방식은 바이러스 제작자들에게는 커다란 전환점이 되었을 것입니다. 더 이상 잠복기가 필요하지 않게 된 것입니다.

웜은 우리도 모르는 사이 다른 사람들에게 바이러스를 퍼뜨게 하기위해 잠복기를 거치지 않아도 됩니다.

모두들 초고속 인터넷에 연결되어 있으므로 한 명이 감염된 순간 인터넷을 통해 엄청난 속도로 퍼지게 됩니다.

웜은 감염된 PC에서 자신을 무한히 복제하고 퍼뜨리게 됩니다. 이로 인해 CPU에 과부하가 걸리게 되고, 인터넷 자원도 부족하게 됩니다.

따라서 사용자는 대단히 느려진 자신의 PC 때문에 분통을 터뜨리게 됩니다.

인터넷 자원이 심각하게 부족해지면, 익스플로러를 실행했을 때 아예 "페이지를 찾을 수 없습니다."라고 나오는 경우도 있습니다.

물론 개인 PC라면 그나마 다행이지만 공항이나 병원의 서버에 웜이 감염되었다면, 비행기 이착륙 업무가 마비되고 응급수술이 지연되는 등 소설에서나 나올법한 위험한 상황이 발생할 수도 있습니다.

웜이란?

자기 자신을 무한히 복제하여 퍼트리는 악성코드로, 바이러스처럼 다른 파일을 감염시키거나 파괴하는 기능은 가지고 있지 않습니다.
"삭제"만 하면 컴퓨터에서 제거할 수 있으며 백신프로그램으로 제거할 수 있습니다.


웜, 어떻게 감염되나?

웜은 주로 인터넷이나 네트워크로 감염됩니다.

인터넷에 연결되지 않은 컴퓨터는 웜에 감염되지 않습니다. 웜에 걸린 파일을 직접 디스켓으로 가져와 실행만 하지 않는다면 말입니다.

웜은 보통 다섯가지 방법으로 감염됩니다.

1. 이메일
2. 보안취약점
3. 공유폴더
4. 관리목적 공유폴더
5. 기타 경로

감염된 웜은 부팅이 되면 자신의 실행 파일이 실행되도록 시작프로그램에 자신의 실행파일을 등록합니다.

웜 파일이 실행되면 컴퓨터 속도와 인터넷 속도가 현저하게 느려집니다. 웜파일이 다른 컴퓨터로 자신을 퍼뜨리기 위해서 컴퓨터 자원과 인터넷 자원을 사용하기 때문입니다.

특이한 점은 웜은 잠복기가 없다는 것입니다.

바이러스는 파일 복사등으로 전파되었기 때문에 우리에게 감염 사실을 감추기 위해서 잠복기가 필요했지만, 최근의 인터넷 환경은 웜에게는 무한한 숙주를 제공하기 때문에 잠복할 필요가 없습니다.

웜은 감염된 순간부터 대놓고(?) 활동합니다. 감염되어 우리가 10분안에 검사해서 치료를 했다하더라도 이미 그 10분안에 초고속 인터넷을 통해 엄청난 숫자의 네티즌이 초고속으로 감염되어 버립니다.


웜의 치료방법

웜은 바이러스와 큰 차이가 있습니다. 웜은 다른 파일을 감염시키지 않는다는 것입니다.

이름에서도 알수 있듯이 웜(worm; 벌레)은 벌레입니다. 쉽게 말해 기생충에 비유할 수 있습니다.

바이러스의 경우 자신의 코드를 정상 프로그램에 감염시켜 이상한 프로그램으로 만들어 버립니다.

하지만, 기생충이 몸안에 들어와 정상세포를 감염시키지 않듯이, 웜은 컴퓨터에 들어와서 열심히 다른 곳으로 웜을 퍼뜨릴 뿐 정상 파일을 감염시키지는 않습니다.

기생충에 감염되었다면 수술까지 할 필요는 없습니다. 구충제를 먹고 몸안에 들어와 있는 기생충을 알까지 깨끗하게 제거하면 됩니다.

웜도 마찬가지 입니다. "삭제"만 하면 컴퓨터에서 제거할 수 있습니다.

즉, 바이러스는 균에 감염된 세포에서 균을 때어내는 "치료"를 해야하지만, 웜은 구충제로 "삭제"만 하면 됩니다.

바이러스만 익히 보아온 사용자들은 백신프로그램으로 웜을 치료한 후 "삭제"라는 메시지가 나오면 당혹해 하는 경우도 있습니다.

"어~! 중요한 파일인거 같은데 삭제되면 컴퓨터 망가지는 것 아닐까?" 라고 생각할 수도 있습니다. 웜의 경우 자신의 파일이름을 정상적인 윈도우 파일인 것 처럼 교묘히 위장합니다.

윈도우의 중요한 파일인 svchost.exe를 빗댄 scvhost.exe 혹은 svch0st.exe 들이 그러한 경우입니다.

winupdate.exe, mplayer.exe 같이 멀쩡한 이름도 자주 사용합니다.

하지만 일단 백신에서 웜으로 감지된 파일들은 외부에서 웜이 가지고 오거나 웜이 만들어 낸 파일이며 내 컴퓨터 안에 있을 존재가치가 없는 것들이므로 가차없이 삭제해야 합니다.


대표적인 웜

- Win32/Blaster.worm
- Win32/IRCBot.worm
- Win32/Bagle.worm

트로이안 목마(Trojan horse)가 뭔가요?

트로이안 목마(Trojan Horse)란?

그리스 병사들이 큰 목마를 만들어서 트로이를 정복했다는 고사는 유명한 이야기입니다.

트로이안 목마는 컴퓨터에 정상파일로 위장해 숨어들어와 컴퓨터의 성문을 열거나 뒷문을 만들어 놓고 정보를 빼내가거나 자신의 군사를 끌어들입니다.

일반적으로 트로이안 목마는 뒷문을 열어두는 데, 이것을 백도어(Back Door)라고 합니다.

백도어는 보통 해킹에서 주로 사용하는 방법입니다.

해커는 서버에 접근하여 권한을 가로채 정보를 빼내갑니다. 하지만 다음번에도 들어오려면 또다시 어려운 작업을 되풀이 해야합니다.

이러한 수고를 줄이고자 해커들은 컴퓨터에 자기만 아는 뒷문을 만들어 놓고 갑니다.

이러한 뒷문을 백도어라고 하며, 백도어가 존재할 경우 컴퓨터의 보안은 무척이나 취약해집니다.

트로이안 목마란?

컴퓨터에 몰래 숨어들어와서 이용자 몰래 중요한 정보를 빼내가는 악성코드를 말합니다. 다른 웜이나 바이러스를 끌어들이기도 하고 중요한 개인정보를 가로채 가기도 합니다. 백신프로그램으로 제거할 수 있습니다.


또한 트로이안 목마는 DDoS(Distributed Denial of Service : 분산 서비스 거부 공격)에도 사용됩니다.

인터넷 사이트에는 각각 최대 접속자수가 정해져 있습니다. 그 이상의 접속자가 폭주하면 그 페이지는 다운되어서 페이지를 열 수 없다는 창이 나오게 됩니다.

이러한 접속자 폭주 현상을 인공적으로 만들어 내는 것이 DDoS입니다. 서비스 거부 공격을 하기 위해서 해커나 바이러스 제작자는 트로이안 목마를 제작합니다.

이 트로이안 목마에 특정 서버에 계속 접속시도를 할 수 있도록 명령 코드를 넣어 두고 다른 컴퓨터에 전파시킵니다.

트로이안 목마에 감염된 컴퓨터는 지정된 서버에 계속 접속을 시도하게되며, 감염된 컴퓨터가 많아질 경우 공격은 성공하게 됩니다.

트로이안 목마는 우리의 정보를 빼 내가기도 합니다. 중요한 설정 파일을 뒷문으로 실어나르기도 하고, 우리의 키보드 입력정보를 가로채서 빼 내가기도 합니다.

이러한 키보드 입력을 가로 채는 프로그램을 키로거(Key-logger)라고 합니다.

또한 트로이안 목마는 다른 웜이나 바이러스를 끌어 들이기도 하는데, 이러한 것들을 다운로더드롭퍼라고도 합니다.

트로이안 목마에 감염되면, 감염에 그치는 것이 아니라 다른 웜이나 바이러스를 끌어들이고 우리의 정보를 빼내가는 등 정말 곤란한 피해를 입힙니다.


대표적인 트로이안 목마

- Win-Trojan/Hackarmy
- Win-Trojan/EggDrop
- Win-Trojan/PeepViewer

스파이웨어(Spyware)가 뭔가요?

스파이웨어(SpyWare)란?

스파이웨어는 일반적으로 우리의 정보를 빼내가거나 익스플로러의 시작페이지를 자신들의 싸이트로 고정시키거나 팝업창을 마음대로 띄우는 행위를 합니다.

이러한 일을 하는 이유는 자신들의 사이트 홍보나 광고를 위해서지만 당하는 우리들은 불쾌감 내지는 혈압상승을 느끼게 됩니다.

이러한 지나친 상술로 인한 피해가 늘어감에 따라 이들 프로그램을 스파이웨어라 정의하고 치료나 삭제를 위해 제공되는 프로그램도 현재 시중에 많이 나오게 된것입니다.


스파이웨어(SpyWare)는 어떻게 설치되나?

스파이웨어(SpyWare)는 주로 Active-X 프로그램으로 설치됩니다. Active-X 프로그램은 인터넷 익스프로러에서 실행되는 프로그램입니다.

인터넷 익스플로러에서 사용되는 태그(Tag)나 자바스크립트로는 멋진 웹컨탠츠를 보여주기에 한계가 있습니다.

따라서 인터넷 상에서 실행되는 프로그램이 널리 사용되며 이것이 Active-X 프로그램입니다. 인터넷을 하다보면 아래와 같은 메세지창이 나오는 경우가 있습니다.



를 눌러 설치하게 되면 이 컨텐츠를 이용할 수 있습니다.

하지만, 지금 설치를 하는 Active-X가 정상적인 프로그램인지 스파이웨어인지 구분하지 못하면, 스파이웨어를 설치하게 되는 경우가 많습니다.

구분 법은 무척 쉽습니다.



[정상적인 Active-X 설치시]




[스파이웨어 설치 시]

정상적인 Active-X 설치시 나오는 보안경고 창의 제조회사는 익히 알려진 공신력있는 회사들입니다. 또한, 문구를 비교해보면 쉽게 알수 있습니다.

정상적인 경우, "~가 게시자의 인증을 확인했습니다."라는 내용이 들어 있습니다.

Active-X 프로그램의 남용을 막기위해 MS에서는 인증제도를 두고 있고 여러 인증기관의 인증에 통과한 Active-X 제품에는 그에 따른 메세지를 보여줍니다.

하지만, 스파이웨어의 경우 인증을 받지 못했으므로, "테스트 루트가 신뢰된 루트로 사용 가능하게 되지 않았습니다."라는 부정적인 메세지가 나타나게됩니다.

이러한 경고를 무시하고 설치하면 스파이웨어로 인해서 상당한 정신적인 피해를 입을 수도 있습니다.

스파이웨어란?

원래 광고를 목적으로 만들어졌으나, 시작페이지를 고정시키거나 원치 않는 팝업 광고를 계속 띄우는 등 컴퓨터 이용에 불편을 주는 프로그램을 말합니다.
Active-X 프로그램을 설치할 때 조금만 주의하면 막을 수 있습니다.


설치된 스파이웨어는 아래와 같은 이상현상을 일으킵니다.


1. 인터넷 익스플로러의 시작페이지를 고정시킵니다.

인터넷 익스플로러의 [도구]-[인터넷옵션]을 눌러 시작페이지를 아무리 변경해도 다시 익스플로러를 실행하면 원치않는 페이지로 고정됩니다.


2. 원치않는 성인광고 팝업이 아무때나 튀어나옵니다.

시작페이지가 고정되는 현상은 그래도 참을만 하지만, 성인 광고 팝업이 아무때나 불쑥 나오는 것은 정말 참기 힘든일입니다.

성인사이트에 들어가지 않았더라도 스파이웨어로 인해 성인 광고 팝업창이 나올수 있으며 이 경우 상당히 억울할 것입니다.

가족과 함께 사용하는 PC나 직장 내의 PC라면 가정이나 직장에서 매장당할 위험도 있습니다.


3. 내 정보가 유출됩니다.

내 정보가 유출되는 것은 우리가 피부로 직접 느끼기 힘듭니다. 그만큼 교묘한 수법으로 우리의 정보를 빼내가기 때문입니다.

우리의 쿠키(cookie; 인터넷 익스플로러에서 사용자 정보를 담아놓은 파일)를 찾아내어 어느 사이트에 자주가는지, 어떤 아이디를 사용하는지 등등의 인터넷 사용기록을 빼내가기도 합니다.


스파이웨어(SpyWare) 제거방법

스파이웨어들은 일반적인 Active-X 프로그램과 마찬가지로 윈도우 설치 폴더 아래에 있는 [Downloaded Program Files] 폴더에 설치가 됩니다.

이 폴더는 폴더를 찾아서 열수도 있지만 간편하게 인터넷 익스플로러의 [도구]-[인터넷 옵션]을 눌러 나오는 창에서 - 를 눌러 열 수도 있습니다.



[인터넷 옵션창]




[설정창의 개체보기]

개체 보기를 누르면 아래와 같은 폴더가 나옵니다. 상태가 "알 수 없음"이나 "손상됨"인 경우 삭제하는 것이 좋습니다.

물론 제거해도 동일한 사이트에 접속하면 다시 보안경고 창이 나와 설치가 유도되므로 모두 삭제해도 큰 무리는 없습니다.

자세한 정보를 확인 하려면 항목에서 [속성]이나 [등록정보]를 누릅니다.



[Active-X 프로그램의 제거]

물론 제거해도 마찬가지 증상이거나, 마땅히 제거할 Active-X 프로그램이 없을 경우에는 스파이제로같은 전문적인 스파이웨어 제거 프로그램을 사용하여 제거하여야 합니다.



[스파이웨어가 진단된 모습]

조크(Joke)가 뭔가요?

유해가능 프로그램의 하나로 조크라는 것이 있습니다.

장난을 목적으로 제작된 프로그램이지만, 사용자가 바이러스로 오해하기도 합니다.

몇 년 전에 나왔던 피카츄 프로그램(피카츄 그림을 클릭했을때, 전체화면으로 홍콩할매 귀신이 음산하게 손짓하는 프로그램)이나, 하드를 포맷한다는 메세지 창이 나와 클릭하려 하면 메세지 창이 도망다니는 프로그램 같은 것들은 어떻게 보면 귀여운 장난이지만 우리에게 의도하지 않은 정신적인 데미지를 입힌다는 점에서 유해가능 프로그램으로 분류됩니다.

이러한 프로그램들도 마찬가지로 Win-Joke계열로 분류되어 치료나 삭제가 이루어집니다.


대표적인 Joke류 유해가능 프로그램

- Win-Joke/FlaGhost
- Win-Joke/FFormat
- Win-Joke/Ghost

'WEB' 카테고리의 다른 글

가상PC  (0) 2010.05.27
오픈소스 chart  (0) 2009.12.16
xp  (1) 2008.03.03
웹로직 에러 <BEA-101215>  (0) 2008.01.17
DAX 에러  (0) 2007.12.21

xp

WEB
posted by 구름너머 2008. 3. 3. 13:43
XP(EXtreme Programming)의 12가지 핵심 훈련
[방법론] XP(EXtreme Programming)의 12가지 핵심 훈련

http://xprogramming.com/

XP는 객체지향의 대가인 켄트 벡(Kent Beck)이 창시하였으며, 혁신적인 새로운 소프트웨어 개발 방법론이다. XProgramming.com의 편집주인 론 제프리(Ron Jeffries)는 XP를 위한 12가지 핵심 훈련을 다음과 같이 서술하였다.

1. 계획 절차(The Planning Process) : 고객이 요구하는 비즈니스 가치를 정의하고, 개발자가 필요한 것은 무엇이며 어떤 부분에서 지연될 수 있는지를 알려준다.

2. 소규모 릴리즈(Small Release) : 작은 시스템을 먼저 만들고, 짧은 단위로 업데이트한다.

3. 상징(Metaphor) : 공통적인 이름의 체계를 갖고 공통적인 시스템 서술서를 갖게 되면, 개발과 의사소통을 돕는다.

4. 단순 설계(Simple Design) : 현재의 요구사항에 들어맞는 가장 단순한 시스템을 설계한다. "미래를 위해서"라는 것은 필요 없다. 리팩토링을 통해서도 좋은 설계를 할 수 있다.

5. 테스팅(Testing) : XP는 항상 소프트웨어의 적합성에 초점을 두고 있다. 개발자는 테스트를 먼저한 후에 소프트웨어를 작성한다. 그렇게 되면 이미 테스트에서 요구사항을 충족하게 된다.

6. 리팩토링(Refactoring) : 개발하는 동안내내 시스템의 설계를 향상시킨다.

7. 짝 프로그래밍(Pair Programming) : 개발자 둘이서 짝으로 코딩한다. 짝 프로그래밍은 혼자 코딩하는 것보다 비슷하거나 혹은 더 적은 비용을 들인다고 한다.

8. 공동 소유(Collective Ownership) : 모든 코드는 모든 개발자에게 속해있다. 이는 팀을 최상의 속도로 움직이게 하며, 변경이 필요할 때에도 지연을 줄인다.

9. 지속적인 통합(Continous Integration) : 매일 여러 번씩 소프트웨어를 통합하고 빌드한다.

10. 주당 40시간 업무(40 hour Week) : 피곤한 개발자가 실수를 더 많이 한다.

11. 현장고객 지원(On site Customer) : 의사소통을 향상시키고 문서의 양을 줄일 수 있다.

12. 코딩 표준(Coding Standard) : 효과적인 공동 작업을 위해서는 모든 코드에 대한 코딩 표준을 정의한다.


발췌 : 이클립스 기반 프로젝트 필수 유틸리티 CVS, Ant, JUnit, 민진우, 이인선, 한빛미디어, 2004



1. 조금씩, 하지만 자주 발표한다.

2. 사이클을 반복해서 돌리면서 개발한다.

3. 스펙에 없는 것은 절대 집어넣지 않는다. (아무리 그 기능이 나중에 쓰일 것 같은 느낌이 들어도 그러지 않는 것이 좋다.)

4. 테스트 코드를 먼저 만든다.

5. 야근은 하지 마라. 항상 정규 일과 시간에만 작업한다.

6. 기회가 생기는 족족 언제 어디서든 코드를 개선한다.

7. 모든 테스트를 통과하기 전에는 어떤 것도 발표하지 않는다.

8. 조금씩 발표하는 것을 기반으로 하여 현실적인 작업 계획을 만든다.

9. 모든 일을 단순하게 처리한다.

10. 두 명씩 팀을 편성하고 모든 사람이 대부분의 코드를 알 수 있도록 돌아가면서 작업한다.

발췌 : Head First Java, 케이시 시에라, 버트 베이츠, 한빛미디어, 2004
내용 발취 : http://www.eve.or.kr/study/s_content.asp?idx=353&page=1

'WEB' 카테고리의 다른 글

오픈소스 chart  (0) 2009.12.16
바이러스? 웜? 악성코드?  (0) 2008.03.03
웹로직 에러 <BEA-101215>  (0) 2008.01.17
DAX 에러  (0) 2007.12.21
WebLogic 세션 클러스터링  (0) 2007.08.20
posted by 구름너머 2008. 3. 3. 13:12
가비지 컬렉션, Garbage Collection
개요
가비지 컬렉션Garbage Collection이란, 시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블럭 혹은 개체를 찾아 자동적으로 다시 사용 가능한 자원으로 회수하는 것을 말한다. 시스템에서 가비지 컬렉션을 수행하는 부분을 가비지 컬렉터Garbage Collector라고 하며, 최초의 가비지 컬렉터는 1958년에 존 매카시John McCarthy에 의해 리습Lisp 언어의 일부로 구현되었다. 가비지 컬렉션은 약자로 GC라고 부르기도 한다.

일반적인 가비지 컬렉터 알고리듬Algorithm은 다음과 같이 동작한다.

1. 더 이상 프로그램에서 사용하지 않을 개체Object를 찾아낸다.
2. 해당 개체가 사용하는 리소스를 회수한다.
그러나 실제로 어떤 개체가 마지막으로 사용되었고, 따라서 더 이상 사용되지 않을 것이란 사실을 알아내기는 일반적으로 불가능하다. 프로그램에 앞으로 주어질 입력을 무시하더라도 특정 개체가 유효한지 알아내는 일반적인 알고리듬은 없다. (정지 문제Halting Problem 참고) 따라서 더 이상 프로그램에서 사용하지 않을 개체를 찾아내기 위해서 가비지 컬렉터는 매우 확실하고 보수적인 방법을 사용하는데, 그것은 해당 개체를 참조할 수 있는 방법이 있는가를 알아내는 것이다. 프로그램에서 어떤 개체에 접근할 방법이 없는 이상 그 개체는 더 이상 누구도 사용할 수 없고, 따라서 그 개체는 유효하지 않다고 판단하는 것이다.

이것이 현재 구현되어 있는 가비지 컬렉터들이 사용하는 보편적인 전략이고, 이런 방법으로 참조 불가능한 개체를 회수하는 가비지 컬렉터를
트레이싱 가비지 컬렉터Tracing Garbage Collector라고 부른다. 레퍼런스 카운트Reference Count 역시 가비지 컬렉션의 일종으로 볼 수도 있지만 좁은 의미로 가비지 컬렉터라는 단어를 사용할 때는 트레이싱 가비지 컬렉터만을 의미하기 한다. 개체 간의 참조 관계를 살펴보고 참조할 수 없는 개체를 살펴보기 위해서 가비지 컬렉터는 개체 내의 포인터 레이아웃을 알 필요가 있고, 따라서 프로그래밍 언어에 통합되어 있는 경우가 많다.

가비지 컬렉션을 도입했을 때 가장 눈에 띄는 장점 중 하나는 가비지 컬렉션이 메모리 릭Memory Leak이나 이중 해제Double Free, 너무 빠른 해제Premature Free와 같이 수정하기 까다롭지만 저지르기는 쉬운 실수에 대한 강력한 방어 수단이 된다는 점이다. 이런 실수를 했을 때 프로그램이 어떤 문제를 일으킬 지, 또 언제 이런 문제가 발생할 지를 웬만해서는 알 수 없기 때문에 이 두 가지 버그들은 다른 일반적인 버그보다 대처하기가 어렵고, 그렇기 때문에 실제로 개발자들이 이런 버그들을 찾아내는 데 도움을 주는 작업만을 전문적으로 수행하는 도구(Compuware BoundsChecker, Rational Purify 등)가 많이 있다. 결과적으로 가비지 컬렉션은 이런 문제가 일어났을 때 추적하는 노력을 제거할 뿐 아니라 프로그램의 복잡도Complexity를 낮추기 때문에 전체적인 생산성에도 긍정적인 영향을 준다.

알고리즘
트레이싱 가비지 컬렉터는 가비지 컬렉션 사이클GC Cycle을 수행한다. 가비지 컬렉션 사이클은 보통 메모리가 부족해질 때, 즉 동적 할당이 실패할 때 수행되고,
삼색 표시Tri-Color Marking이라고 불리는 다음과 같은 과정으로 진행된다.

1. 백색, 회색, 검은 색 집합을 만든다. 이 집합들은 사이클 내내 유지된다.
2. 검은 색 집합은 초기에 비어있고, 회색 집합에는 루트Root라고 불리는 특별한 개체를 넣는다. 흰색 집합에는 그 외 모든 개체를 넣는다.
3. 회색 집합에서 개체 하나를 꺼내서, 이 개체에서 포인터 연산 한 번으로 닿을 수 있는 (보통은 멤버) 모든 흰색 개체를 회색 집합에 넣는다.
4. 회색 집합에서 꺼낸 개체를 검은 색 집합으로 옮긴다.
5. 회색 집합에 개체가 남아 있으면 3으로, 남아 있지 않으면 사이클을 종료한다.
여기서 루트는 프로그램이 즉각적으로 접근할 수 있는 특별한 개체들이고, 일반적으로 전역 개체, 스택Stack 내의 개체, 레지스터Register 내의 개체를 의미한다. 루트 내에 있는 개체로부터 참조 가능한 개체는 다시 접근 가능한 개체로 간주된다. 말하자면, 프로그램이 즉시 접근 가능한 개체로부터 포인터 연산을 반복하여 참조 가능한 개체는 모두 접근 가능한 개체인 것이고, 가비지 컬렉션 사이클은 루트로부터 참조 가능한 개체를 모두 찾아내는 과정으로 간주할 수 있다. 이 과정에서 흰색 집합은 자원 회수 대상이 되는 개체가 들어있는 집합이고, 검은 색 집합은 사용 가능성이 있으므로 회수하지 않는 개체의 집합이 된다. 사이클이 모두 종료되면 3번 과정에 의해서 흰색 집합에 있는 어떤 개체도 검은 색 집합에 있는 개체로부터 참조될 수 없다는 점에 주목하자. 이제 흰색 집합에 남은 개체는 프로그램에서 접근할 수 없는 개체이고 따라서 참조될 수 없으므로 가비지 컬렉터는 이 개체들을 해제하게 된다.

가비지 컬렉션 사이클을 수행하는 방법은 몇 가지로 구분할 수 있다.

표시하고 치우기Mark-and-Sweep는 각 개체에 현재 이 개체가 흰색인지, 회색인지, 아니면 검은 색인지를 표시할 수 있는 플래그를 만들어두고 가비지 컬렉션 사이클 동안 이 플래그를 마킹해서 결과적으로 남은 흰색 개체를 지워주는 방법인데, 메모리 상에서 개체의 배치가 달라지지 않기 때문에 추가적인 메모리를 필요로 하지 않지만 단편화Fragmentation가 생길 수 있다는 문제점이 있다.

멈추고 복사Stop-and-Copy는 메모리 상에 활성 영역과 비 활성 영역을 구분한 뒤, 활성 영역에 대한 가비지 컬렉션 사이클이 끝나면 검은 색 집합 내의 모든 개체를 비활성 영역으로 옮기고, 이전 활성 영역을 비활성 영역으로 표기하고, 비활성 영역을 활성 영역으로 사용한다. 표시하고 치우기에서 볼 수 있던 단편화가 해결되는 반면 가비지 컬렉션 사이클 동안 메모리 사용량이 두 배로 증가한다는 문제점이 있다. 또한 개체를 복사하는 데 상당한 양의 퍼포먼스 부담을 갖게 된다.

표시하고 압축Mark-and-Compact은 가비지 컬렉션 대상인 개체를 모두 수집한 뒤, 남아 있는 개체를 하위 주소로 이동하면서 빈 공간을 남기지 않는 방법이다. 단편화를 제거하면서도 멈추고 복사와 같이 메모리 사용량 부담을 지지 않을 수 있는 방법이다.
표시하고 치우기를 사용하는 가비지 컬렉터는 개체를 메모리 공간 상에서 실제로 이동하지 않으므로 고정 가비지 컬렉터Non-Moving Garbage Collector라고 부르고, 멈추고 복사나 표시하고 압축과 같은 방법을 사용하는 가비지 컬렉터는 이동 가비지 컬렉터Moving Garbage Collector라고 부른다. 이동 가비지 컬렉터를 사용할 경우 가비지 컬렉션 사이클마다 모든 개체의 참조를 조정할 수 없으므로, 개체 참조는 핸들을 가리키고 있고, 핸들을 다시 한 번 더 참조하면 실제 포인터를 얻어올 수 있도록 구현되어 있어야 한다. 이렇게 구현할 경우 메모리 공간 상에서 개체를 재배치한 뒤 핸들이 참조하고 있는 포인터만 바꾸면 실제 개체가 갖고 있는 참조를 수정하지 않고도 개체의 재배치를 완료할 수 있기 때문이다.

성능상의 문제점
트레이싱 가비지 컬렉션 알고리듬의 가장 문제점은 접근 가능한 개체를 알아내기 위해서 전체 개체를 모두 순회하는 데 상당히 오랜 시간이 걸린다는 점이다. 가비지 컬렉션이 필요한 상황이 언제일지 미리 알 수 없기 때문에, 이런 특성은 즉각적인 반응성을 요구하는 애플리케이션에서는 큰 문제점으로 간주될 수 있다. 성능상의 이유로 한 번에 모든 개체를 추적하지 않고 중단했다가 다시 시작할 수 있는 가비지 컬렉션 방법을 점진적 가비지 컬렉션Incremental GC이라고 한다.

가비지 컬렉션 사이클은 중간에 중단할 수 없으면서 완전히 수행되는 시간이 길다는 문제를 해결하기 위해서 여러가지 방법이 도입되는데, 보편적으로 사용되는 것 중 하나가 세대별 가비지 컬렉션Generational GC이다. 세대별 가비지 컬렉션은 다음과 같은 가정을 기반으로 동작한다.

1. 새로 생긴 개체는 오래 사용하지 않을 가능성이 클 것이다..
2. 개체가 오래 사용될수록 그 뒤로도 계속 사용될 가능성이 클 것이다.
3. 새로 생긴 개체는 특정 기간 동안 서로를 빈번하게 참조하는 경향이 있을 것이다.
4. 메모리의 일부만 정리하는 것은 전체를 정리하는 것보다 비용이 낮을 것이다.
세대별 가비지 컬렉션에서는 가비지 컬렉션 사이클 한 번을 거칠 때마다 수거되지 않은 개체들이 한 세대씩 나이를 먹는다. 다음 차례에는 가장 어린 세대에 대해서만 가비지 컬렉션을 수행할 수 있게 되는데, 이 때에는 흰색 집합에 가장 어린 세대의 개체만 넣어두고, 어린 세대로부터 상위 세대에 대한 참조가 발견될 경우, 가정 3에 의해서 상위 세대의 개체는 하위 세대의 개체를 참조할 가능성이 낮으므로 해당 상위 세대의 개체가 참조하는 개체는 추적하지 않는 방식으로 좀 더 적은 연산을 수행하게 된다. 이 때, 상위 세대의 개체가 하위 세대를 참조할 가능성이 전혀 없는 것이 아니기 때문에, 사용중인 어린 세대 개체를 해제하지 않기 위해서 상위 세대의 참조가 변경될 때마다 하위 세대를 참조하는지 확인하여 따로 추적해야 할 대상으로 간주하는 추가적인 연산이 필요하다.

가비지 컬렉터의 문제 중 또 다른 것은 이것이 참조 근접성Locality of Reference을 훼손한다는 점이다. 사용하지 않는 개체가 어떤 것인지 찾아내기 위해서, 오랫동안 사용하지 않은 개체들을 모두 순회하게 되는데, 가비지 컬렉터가 사용 여부를 판단하기 위해서 개체를 순회하는 것은 최근의 컴퓨터 시스템이 도입하고 있는 여러 단계의 캐시Cache 효율성을 심각하게 위협할 수도 있다. (순회하는 개체 중에는 심지어 가상 메모리 부족으로 페이지 파일에 저장된 것도 있을 수 있다) 따라서 가비지 컬렉션을 지원하는 언어를 사용할 때는 해당 언어가 사용하는 컴퓨터 아키텍처와 OS에 최적화되어 있는지 확인할 필요가 있다.

가비지 컬렉션을 지원하는 언어
가비지 컬렉션은 현재 많은 언어에 의해서 지원되고 있다. 대표적인 것으로 자바Java, Smalltalk, C#, VB.net, Managed C++ 등의 개체 지향Object-Oriented 언어들이 있고, 루아Lua, 파이선Python과 같은 스크립트 언어도 언어의 특성상 가비지 컬렉션을 지원한다. C/C++에서도 사용할 수 있는 공개 소스 가비지 컬렉터가 있다.

참고
메모리 관리
Jonathan Bartlett, 2004
A Garbage Collector for C and C++
Hans Boehm
Early Storage Reclaimation in a Tracing Garbage Collector
Tomothy Harris, 1999
Garbage Collection
Wikipedia
Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework : Part 1
Jeffrey Richter, MSDN Magazine, November 2000
Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework : Part 2
Jeffrey Richter, MSDN Magazine, December 2000
Java 애플리케이션 성능과 확장성 향상시키기 (1)
김경한, 한국 썬 2003년 소식지
Memory Management Glossary

'JAVA' 카테고리의 다른 글

객체지향설계5원칙  (0) 2010.05.24
RMI  (0) 2008.04.21
디자인 패턴  (0) 2007.10.09
WL81에서 BLOB 사용법  (0) 2007.03.23
자바 강좌 링크  (0) 2007.03.13
posted by 구름너머 2008. 2. 25. 17:49

유닉스에서

여러파일에 있는 특정 문자열 고치기...

find . -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \; 2>/dev/null

'UNIX' 카테고리의 다른 글

S_ISREG()  (0) 2008.07.16
cvs에 대해 잘 정리된 곳..  (0) 2008.03.05
[TIP]네트워크 연결진단법  (0) 2007.09.12
ps와 grep과 awt의 만남  (0) 2007.08.17
XML 프로젝트들  (0) 2007.03.13
posted by 구름너머 2008. 2. 1. 08:57
92세 할아버지, '0.1초'만에 물끓이는 주전자 발명
연합뉴스
올해 92세 된 뉴질랜드의 한 할아버지가 소리 에너지를 이용해 순식간에 물을 끓일 수 있는 음파 주전자를 발명해냈다.

뉴질랜드 언론들은 1일 크라이스트처치에 사는 노익장 발명왕 피터 데이비 할아버지가 지난 10여 년 동안 혼자 집중적으로 연구를 계속해온 끝에 음파 주전자 개발을 눈앞에 두고 있다며 이제 자신의 기술을 사갈 사업자를 찾고 있다고 밝혔다.

데이비 할아버지가 10여년의 노력 끝에 음파 주전자를 만들었지만 그가 이 주전자에 관심을 갖기 시작한 지는 50년도 넘는다.

2차 대전 때 영국 전투기 조종사로 활약했던 데이비 할아버지는 집에서 색소폰을 연주하면서 소리의 각기 다른 진동수에 따라 모든 물체가 공명한다는 사실을 알아내고 소리 에너지에 관심을 갖게 됐다고 설명했다.

그는 “어떤 음역에서는 유리잔들이 딸랑딸랑하고, 어떤 음역에서는 칼과 포크가 흔들린다는 사실을 알아냈다”면서 “그 이후 수 없이 시행착오를 거듭하면서 음파로 물 끓이는 장치를 연구해왔다”고 말했다.

그는 음파 주전자는 순식간에 물을 끓일 수 있고, 아무리 적은 양의 물도 끓일 수 있어 필요한 양만 빨리 끓일 수 있는 장점이 있다며 소리는 전기를 사용해 만들어 내게 된다고 밝혔다.

자신의 모토가 ’가능하면 젊게 오래 살다 죽는 것’이라는 그는 지금 자신의 기술을 사서 음파 주전자를 대량 생산할 사업자를 찾고 있다며 그렇기 때문에 현 단계에서는 자신의 기술에 대해 자세하게 설명해줄 수 없다고 말했다.

그러나 이 장치를 검토했던 아서 윌리엄슨 교수는 “소리로 물을 끓일 수 있다는 주장은 잘 믿어지지 않는다”면서 “그러나 어쨌든 통에 든 물이 40초 만에 끓는 등 제대로 작동했다”고 말했다.
입력 : 2008.02.01 07:13
posted by 구름너머 2008. 1. 21. 10:13

한겨울에도 반팔·반바지 … 우리 집은?

중앙일보|기사입력 2008-01-21 04:25 |최종수정2008-01-21 07:22


[중앙일보 강찬수.최형규.김동호.최지영.김영훈] 20일 오후 8시 서울 반포동 박찬일(40)씨 가족은 식사를 마치고 TV 앞에 모였다. 박씨 가족은 모두 반소매·반바지 차림이다. 거실 온도계를 보니 28도였다. 집안은 ‘여름 날씨’인 것이다. 박씨는 “면적에 따라 난방비를 똑같이 내기 때문에 기왕이면 따뜻하게 지낸다”고 말했다. “어떤 땐 좀 덥다는 생각도 든다”고 덧붙였다. 면적이 111㎡(34평형)인 박씨 집 한 달 난방비는 20만원 정도 나온다.

바깥 날씨가 영하 3.2도였던 18일 오후 10시 서울 충정로 유엔미 아파트 미국인 브라이언 브로하우스(37)의 집. 거실 바닥에는 얇은 이불이 깔려 있었다. 집안에 들어서자 약간 썰렁한 느낌이 들었다. 거실 온도는 22도였다. 브로하우스는 “고향인 미국 뉴욕의 롱아일랜드에 살 때는 집안 온도가 이것보다 훨씬 낮았다”며 “얼마 전 어머니가 다녀갔는데 우리 집이 너무 덥다고 하더라”고 말했다. 그는 이제 막 돌이 지난 딸 앤 때문에 온도를 조금 올렸다고 했다.

한국 가정은 겨울에도 덥다. 기름 한 방울 안 나는데 선진국보다 기름을 훨씬 더 많이 쓰기 때문이다. 한국의 국가 전체 에너지 소비 순위는 세계 7위다. 하지만 1인당 석유 소비는 세계 5위. 우리보다 석유를 더 쓰는 건 산유국인 사우디아라비아, 소비 대국인 미국, 자원 부국인 캐나다, 그리고 온실농업 국가인 네덜란드 국민뿐이다.

올해 초 배럴당 원유 가격은 100달러 가까이 치솟았다. 2006년 61달러 정도에서 두 배 가까이 올랐다. 그래도 한국인의 에너지 소비 행태는 달라지지 않았다. 올해 에너지 수입으로 쓰는 돈만 1000억 달러(약 95조원)가 넘을 것으로 예상된다.

온실가스를 세계에서 열 번째로 많이 배출하는 나라가 한국이다. 지난해 말 인도네시아 ‘발리 회의’ 결정에 따라 2013년 이후에는 우리도 온실가스 감축에 들어가야 한다. 하지만 지금 같은 에너지 소비 행태가 계속되면 혼란이 불가피하다.

재정경제부 임종룡 경제정책국장은 “에너지 사용 효율을 높이고, 에너지 유통 체계를 바꾸는 수밖에 없다”고 말했다. 정부는 2%대인 신재생에너지 보급률을 2011년까지 5%로 늘리고 서울시의 ‘자동차 요일제’를 전국으로 확대할 계획이다.

결국 시민의 참여가 관건이다. 이대로 흥청망청 에너지를 낭비하면 큰일 난다는 위기의식을 공유해야 한다. 중앙일보는 올 한 해 내내 에너지 절약 캠페인을 한다. 에너지는 우리와 후손들의 미래다. 에너지를 아껴야 환경을 구하고 경제도 살린다. 우리 손으로 반드시 그걸 해내야 한다.

◆특별취재팀=강찬수 환경전문기자, 최형규 홍콩특파원, 김동호 도쿄특파원, 최지영(국제부문) 김영훈(경제부문)·선승혜(사회부문) 기자 , 사진=박종근 기자