'UNIX'에 해당되는 글 80건

  1. 2008.08.17 memcmp
  2. 2008.07.16 S_ISREG()
  3. 2008.03.05 cvs에 대해 잘 정리된 곳..
  4. 2008.02.25 유닉스 파일 문자열 바꾸기
  5. 2007.09.12 [TIP]네트워크 연결진단법
  6. 2007.08.17 ps와 grep과 awt의 만남
  7. 2007.03.13 XML 프로젝트들
  8. 2007.03.05 exec와 system
posted by 구름너머 2008. 8. 17. 21:08
[본문스크랩] memcmp | 나의 관심정보 메모 삭제 2008/08/17 21:07
damool2 http://memolog.blog.naver.com/damool2/113
출처 카페 > 김샘과 함께 하는 C 언어 | 사과쿵
원본 http://cafe.naver.com/applekoong/160

memcmp

메모리를 비교합니다.

Declaration

int memcmp( const void *buf1, const void *buf2, size_t count )

Return value

성공 - buf1이 크면 양수, 작으면 음수, 같으면 0 반환
실패 - 없음


Parameters

buf1 - 비교할 첫 번째 메모리
buf2 - 비교할 두 번째 메모리
count - 비교할 문자 개수


Detail descriptions

memcmp()는 메모리를 비교합니다. 모든 자료형에 대해 동작하도록 만들었기 때문에 비교 단위는 바이트가 됩니다. 간혹 memcmp()와 같은 비교 함수들의 반환값을 참 또는 거짓이라고 생각하는 사람들이 있습니다. 이러한 사람들은 원하는 것을 정확하게 찾길 바라는 공통점이 있습니다. 이름이나 주소를 찾을 때 완전히 일치하기를 바랍니다. 그러나, 실제 상황에서는 똑같은 것을 찾는 것도 중요하지만, 크거나 작은 데이터를 찾는 것도 중요합니다.

그래서, memcmp()와 같은 비교 함수들은 세 가지(>, <, ==) 결과를 반환합니다. "크다(>)"와 "작다(<)"를 알 수 있으면 데이터를 순서대로 배치할 수 있습니다. 이와 같은 작업을 자료 구조에서는 정렬(sort)이라고 부릅니다. 충분한 설명을 하지는 못하지만, 정렬 때문에 memcmp()는 세 가지 값을 반환할 수밖에 없습니다.

buf1이 buf2가 가리키는 값보다 클 때는 0보다 큰 값, 다시 말해 양수를 반환하고, buf1이 buf2가 가리키는 값보다 작을 때는 0보다 작은 값, 음수를 반환합니다. buf1과 buf2가 가리키는 값이 같을 때는 0을 반환합니다. 참과 거짓으로 따진다면, 같을 때 거짓을 반환하는 셈이 되므로 주의가 필요합니다. 같은 것을 찾는 코드는 이곳의 "Example codes" 항목에 있고, 문자열 배열을 정렬하기 위해 큰 것을 찾는 코드는 strcmp()에 있습니다.

memcmp()는 문자열을 제외한 모든 비교에서 사용합니다. 문자열 비교는 전담 함수인 strcmp()로 처리하지만, 그외의 모든 경우에는 memcmp()로 처리합니다. 대표적으로 배열과 구조체 비교에 사용합니다. 두 개의 배열이 있을 때 같은 요소로 채워져 있는지 검사한다던가 구조체 멤버의 내용이 같은지 검사할 때 주로 사용합니다. 그러나, 배열 요소나 구조체 멤버 중에 포인터(주소)가 있다면 memcmp()를 사용할 수 없습니다. memcmp()를 사용하는 목적은 데이터가 같은지 비교하는데 있습니다. 주소가 같은지 비교하는 것이 아닙니다. 제대로 된 비교라면, 주소가 가리키는 곳의 데이터를 비교할 수 있어야 하는데 memcmp()로는 할 수 없는 작업입니다. 주의하기 바랍니다.

참고로 문자열이 배열의 형태로 존재해도 안됩니다. null 문자 뒤에는 쓰레기가 있는데, memcmp()는 이들 쓰레기까지 같은지 검사하기 때문에 정확하게 동작하지 않습니다.


Remarks

다음은 비교 함수로 사용되어지는 몇 가지 함수들을 비교한 표입니다.

이름설명종료 반환
memcmp 메모리 비교지정 개수만큼 비교하면양수, 0, 음수
strcmp 문자열 비교null 문자를 만나면 양수, 0, 음수
strncmp 문자열 비교지정 개수만큼 비교하거나 null 문자를 만나면양수, 0, 음수


Header files

<string.h> <memory.h>


Example codes

  1. memcmp()를 사용해서 배열에 들어있는 요소들이 같은지 비교합니다.
  2. "같다"와 "다르다"라는 결과를 모두 만들기 위해 크기가 10인 배열(p1)을 처음부터 5개만 다른 배열(p2)에 복사합니다.
  3. 첫 번째 memcmp() 호출은 10개의 요소가 모두 같은지 비교합니다. 5개만 복사했으므로 같지 않기 때문에 memcmp()는 0이 아닌 값을 반환합니다. memcmp()는 같은 경우에만 0을 반환합니다.
  4. 두 번째 memcmp() 호출은 복사해 놓은 5개의 요소만 비교합니다. 호출 결과는 0이 되고 "같다"라고 출력됩니다.
  5. memcmp()나 memcpy() 등의 메모리 관련 함수를 사용할 때는 반드시 sizeof 연산자와 함께 사용합니다. 단위가 바이트이기 때문에 지금처럼 int 자료형이라면 4를 곱해야 처리하고자 하는 메모리 크기를 얻을 수 있습니다.

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

void main()
{
int p1[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int p2[10];

memcpy( p2, p1, 5*sizeof(p1[0]) );

if( memcmp(p1, p2, 10*sizeof(p1[0])) == 0 ) printf( "10개 : 같다\n" );
else printf( "10개 : 다르다\n" );

if( memcmp(p1, p2, 5 *sizeof(p1[0])) == 0 ) printf( " 5개 : 같다\n" );
else printf( " 5개 : 다르다\n" );
}

[출력 결과]
10개 : 다르다
5개 : 같다


  1. 좌표를 저장한 POINT 구조체 배열에서 memcmp()를 이용해서 좌표를 검색합니다.
  2. 여기서는 구조체 멤버가 단순하기 때문에 직접 비교하는 "array[i].x == point->x && array[i].y == point->y"를 사용해도 됩니다. 그러나, 구조체 멤버가 많아지면 memcmp()를 사용하는 것이 편하다는 것을 알게될 것입니다.
  3. 먼저 좌표를 5개 입력받고, 올바르게 입력받았는지 화면에 출력합니다. 그런 다음 검색할 좌표를 별도로 입력받습니다. 그리고, FindPoints()를 호출해서 찾고자 하는 좌표가 있는지 검사합니다.
  4. FindPoints()는 있다면 몇 번째에 있는지 알려주고, 없다면 -1을 반환합니다. 출력 결과에서는 3번째에 있다고 알려줍니다. 배열 인덱스는 0부터 시작하므로 맞는 결과입니다.

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

struct POINT
{
int x, y;
};

void ScanPoints( struct POINT* array, int size );
void ShowPoints( struct POINT* array, int size );
int FindPoints( struct POINT* array, int size, struct POINT* point );

void main()
{
struct POINT array[5], pt;
int find;

ScanPoints( array, 5 );
ShowPoints( array, 5 );

printf( "검색 : " );
scanf( "%d %d", &pt.x, &pt.y );

find = FindPoints( array, 5, &pt );

if( find < 0 ) printf( "결과 : 없음\n" );
else printf( "결과 : 성공[%d번째]\n", find );
}

void ScanPoints( struct POINT* array, int size )
{
int i;
printf( "[입력]\n" );

for( i = 0; i < size; i++ )
{
printf( "%d : ", i );
scanf( "%d %d", &array[i].x, &array[i].y );
}
}

void ShowPoints( struct POINT* array, int size )
{
int i;
printf( "[출력]\n" );

for( i = 0; i < size; i++ )
printf( "[%d, %d] ", array[i].x, array[i].y );

printf( "\n" );
}

int FindPoints( struct POINT* array, int size, struct POINT* point )
{
int i;
for( i = 0; i < size; i++ )
{
if( memcmp(&array[i], point, sizeof(struct POINT)) == 0 )
return i;
}

return -1;
}

[출력 결과]
[입력]
0 : 90 20
1 : 80 30
2 : 70 40
3 : 60 50
4 : 40 50
[출력]
[90, 20] [80, 30] [70, 40] [60, 50] [40, 50]
검색 : 60 50
결과 : 성공[3번째]
이 문서에 대한 모든 권리는 www.printf.co.kr에 있습니다. [최종 수정일: 2006.12.30.]

'UNIX' 카테고리의 다른 글

head와 tail의 만남  (0) 2008.09.03
Message Queues 조회 및 삭제  (0) 2008.09.03
S_ISREG()  (0) 2008.07.16
cvs에 대해 잘 정리된 곳..  (0) 2008.03.05
유닉스 파일 문자열 바꾸기  (0) 2008.02.25
posted by 구름너머 2008. 7. 16. 16:23

http://achiven.tistory.com/1175583524

S_ISREG() 함수는 일반적인 파일인지 확인하는 함수이다.

* POSIX 매크로는 파일 타입을 확인하는 것
S_ISLNK(m) is it a symbolic link?
S_ISREG(m) regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) fifo?
S_ISSOCK(m) socket?

'UNIX' 카테고리의 다른 글

Message Queues 조회 및 삭제  (0) 2008.09.03
memcmp  (0) 2008.08.17
cvs에 대해 잘 정리된 곳..  (0) 2008.03.05
유닉스 파일 문자열 바꾸기  (0) 2008.02.25
[TIP]네트워크 연결진단법  (0) 2007.09.12
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
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 구름너머 2007. 9. 12. 13:41
[TIP]네트워크 연결진단법
네트워크의 연결진단 방법
1. ping 명령을 사용하여 TCP/IP 구성 테스트
2. ping 명령과 net view 명령을 사용하여 TCP/IP 연결 테스트
3. tracert 명령을 사용하여 경로 추적
4. nbtstat 명령을 사용하여 NetBIOS 이름 테이블 보기
5. nbtstat 명령을 사용하여 NetBIOS 이름을 해제하고 새로 고치기
6. ARP(Address Resolution Protocol) 캐시 보기
7. 정적 ARP 캐시 항목 추가
8. 현재 TCP/IP 프로토콜 및 연결 통계 보기

1. ping 명령을 사용하여 TCP/IP 구성 테스트
1. 컴퓨터의 TCP/IP를 빠르게 구성하려면 명령 프롬프트를 연 다음 ipconfig를 입력합니다.
2. 명령 프롬프트에 ping 127.0.0.1를 입력하여 루프백 주소를 ping합니다.
ping 명령이 실패하면 TCP/IP가 설치되고 구성된 후 컴퓨터를 다시 시작하였었는지를 확인합니다.
3. 컴퓨터의 IP 주소를 ping합니다.
ping 명령이 실패하면 TCP/IP가 설치되고 구성된 후 컴퓨터를 다시 시작하였었는지를 확인합니다.
4. 기본 게이트웨이의 IP 주소를 ping합니다.
ping 명령이 실패하면 기본 게이트웨이 IP 주소가 올바르고 게이트웨이(라우터)가 작동되는지 확인합니다.
5. 원격 호스트(다른 서브넷 상의 호스트)의 IP 주소를 ping합니다.
ping 명령이 실패하면 원격 호스트 IP 주소가 올바른지, 원격 호스트가 작동되는지, 이 컴퓨터와 원격 호스트 간의 모든 게이트웨이(라우터)가 작동되는지 확인합니다.
6. DNS 서버의 IP 주소를 ping합니다.
ping 명령이 실패하면 DNS 서버 IP 주소가 올바른지, DNS 서버가 작동되는지, 이 컴퓨터와 DNS 서버 사이의 모든 게이트웨이(라우터)가 작동되는지 확인합니다.
참고
*명령 프롬프트를 열려면 시작을 클릭하고 프로그램, 보조프로그램을 차례로 가리킨 다음 명령 프롬프트를 클릭합니다.
*ping 명령이 없거나 실패하면 이벤트 뷰어를 사용하여 시스템 로그를 확인하여 설정 또는 인터넷 프로토콜(TCP/IP) 서비스에 의해 보고된 문제를 찾을 수 있습니다.

2. ping 명령과 net view 명령을 사용하여 TCP/IP 연결 테스트
1. ping 명령을 사용하여 TCP/IP 연결성을 테스트하려면 명령 프롬프트를 연 다음 IP 주소를 사용하여 원하는 호스트를 ping합니다.
ping 명령이 실패하여 "요청 시간이 초과되었습니다."라는 메시지가 표시되면 호스트 IP 주소가 올바른지, 호스트가 작동되는지, 이 컴퓨터와 호스트 간의 모든 게이트웨이(라우터)가 작동되는지 확인합니다.
2. ping 명령을 사용하여 호스트 이름 확인을 테스트하려면 해당 호스트 이름을 사용하고 이름 확인을 원하는 호스트를 ping합니다.
ping 명령이 실패하여 "알 수 없는 호스트"라는 메시지가 표시되면 호스트 이름이 올바른지, 사용자의 DNS 서버가 호스트 이름을 확인할 수 있는지를 확인합니다.
3. net view 명령을 사용하여 TCP/IP 연결을 테스트하려면 명령 프롬프트를 연 다음 net view computername을 입력합니다. net view 명령은 임시 NetBIOS 연결을 만들어 Windows 2000을 실행하는 컴퓨터의 파일 및 인쇄 공유를 목록으로 표시합니다. 지정된 컴퓨터에 파일 또는 인쇄 공유가 없으면 net view 명령은 "목록에 항목이 없습니다."라는 메시지를 표시합니다.
net view 명령이 실패하여 "시스템 오류 53이 발생했습니다."라는 메시지가 표시되면 computername이 올바른지, Windows 2000을 실행하는 컴퓨터가 작동되는지, 이 컴퓨터와 Windows 2000을 실행하는 컴퓨터 사이의 모든 게이트웨이(라우터)가 작동되는지 확인합니다.
이 연결성 문제를 더 자세히 해결하려면 아래와 같은 작업을 수행합니다.
*ping 명령을 사용하여 computername을 ping합니다.
ping 명령이 실패하여 "알 수 없는 호스트"라는 메시지가 표시되면 해당 IP 주소에서 computername을 확인할 수 없습니다.
*net view 명령 및 Windows 2000을 실행하는 컴퓨터의 IP 주소를 아래와 같이 사용합니다.
net view IP address
net view 명령이 성공하면 잘못된 IP 주소에 computername이 연결되어 있습니다.
Windows 2000을 실행하는 컴퓨터가 Microsoft 네트워크용 파일 및 프린터 공유 서비스를 실행하고 있지 않으면 net view 명령이 실패하여 "시스템 오류 53이 발생하였습니다."라는 메시지가 표시됩니다.
참고
*명령 프롬프트를 열려면 시작을 클릭하고 프로그램, 보조프로그램을 차례로 가리킨 다음 명령 프롬프트를 클릭합니다.
*ping 명령이 없거나 실패하면 이벤트 뷰어를 사용하여 시스템 로그를 확인하여 설정 또는 인터넷 프로토콜(TCP/IP) 서비스에 의해 보고된 문제를 찾을 수 있습니다.

3. tracert 명령을 사용하여 경로 추적
*명령 프롬프트를 연 다음 아래와 같이 입력합니다.
tracert host_name
또는 tracert ip_address를 입력합니다.
여기서 host_name 또는 ip_address는 각각 원격 컴퓨터의 호스트 이름 또는 IP 주소입니다.
예를 들어, 이 컴퓨터에서 www.microsoft.com으로 연결 경로를 추적하려면 명령 프롬프트에 아래와 같이 입력합니다.
참고
*명령 프롬프트를 열려면 시작을 클릭하고 프로그램, 보조프로그램을 차례로 가리킨 다음 명령 프롬프트를 클릭합니다.
*tracert 명령은 이 컴퓨터에서 다른 원격 컴퓨터까지의 TCP/IP 패킷의 경로를 추적합니다. tracert 명령은 ICMP echo 요청 및 응답 메시지(ping 명령과 비슷)를 사용하여 각 홉에 대한 왕복 이동 시간(RTT) 및 전달되는 각 라우터에 대한 명령줄 보고서를 출력합니다.
*tracert가 성공하지 못하면, 명령 출력을 사용하여 전달에 실패하거나 느려진 중간 라우터를 결정하는 것을 도울 수 있습니다.

4. nbtstat 명령을 사용하여 NetBIOS 이름 테이블 보기
1. 명령 프롬프트를 엽니다.
2. 명령 프롬프트에서 아래와 같이 입력합니다.
nbtstat -n
이 컴퓨터의 NetBIOS 로컬 이름 테이블은 명령줄 출력으로 표시됩니다. 이름 형식이 표시되어 각각의 이름이 고유 이름인지 또는 그룹 이름인지 나타냅니다. 또한 이름이 네트워크에 등록되었는지의 여부를 나타내는 각 이름의 상태가 표시됩니다.
참고
*명령 프롬프트를 열려면 시작을 클릭하고 프로그램, 보조프로그램을 차례로 가리킨 다음 명령 프롬프트를 클릭합니다.
*nbtstat 명령은 TCP/IP(NetBT) 연결에서 NetBIOS가 사용하는 통계 및 이름 정보를 표시합니다. -n 옵션은 이 컴퓨터에 대한 로컬 NetBIOS 이름만 목록으로 표시하는 데 사용됩니다. nbtstat를 사용하여 아래와 같은 작업을 수행할 수도 있습니다.
*원격 컴퓨터의 NetBIOS 이름 테이블 목록 표시
*이 컴퓨터 또는 다른 원격 컴퓨터에 NetBIOS 이름 캐시의 내용 표시
*Lmhosts 파일에 있는 항목을 #PRE 옵션과 함께 사용하여 NetBIOS 이름 캐시 수동으로 로드 또는 다시 로드
*TCP/IP 세션 통계에서 NetBIOS 목록 표시
*WINS에서 NetBIOS 이름 해제 및 새로 고침

5. nbtstat 명령을 사용하여 NetBIOS 이름을 해제하고 새로 고치기
1. 명령 프롬프트를 엽니다.
2. 명령 프롬프트에서 아래와 같이 입력합니다.
nbtstat -RR
해제 및 새로 고침 작업의 진행률은 명령줄 출력으로 표시됩니다. 이 정보는 이 컴퓨터에 대해 WINS에 현재 등록된 모든 로컬 NetBIOS 이름이 WINS 서버로 등록을 해제하고 갱신하였는지 나타냅니다.
참고
*명령 프롬프트를 열려면 시작을 클릭하고 프로그램, 보조프로그램을 차례로 가리킨 다음 명령 프롬프트를 클릭합니다.
*NetBIOS 이름은 WINS와 함께 등록되며 일반적으로 컴퓨터가 정상적으로 종료될 때 해제됩니다. 컴퓨터가 정상적으로 종료되지 않았거나 컴퓨터 이름을 종료 및 해제하는 동안 WINS 서버를 연결할 수 없었으면 이 명령을 사용하여 이 컴퓨터에 대한 로컬 이름을 WINS에서 새로 고치고 업데이트할 수 있습니다. 이것은 네트워크의 다른 위치들 사이에서 이동되는 이동식 컴퓨터 또는 휴대용 컴퓨터에 유용합니다.
*nbtstat 명령을 사용하여 아래와 같은 작업을 할 수도 있습니다.
이 컴퓨터 또는 다른 원격 컴퓨터에 등록된 NetBIOS 이름 목록 표시
이 컴퓨터 또는 다른 원격 컴퓨터에 NetBIOS 이름 캐시의 내용 표시
#PRE 옵션과 함께 Lmhosts 파일에 있는 항목을 사용하여 NetBIOS 이름 캐시 수동으로 로드 또는 다시 로드
TCP/IP 세션 통계에서 NetBIOS 목록 표시

6. ARP(Address Resolution Protocol) 캐시 보기
1. 명령 프롬프트를 엽니다.
2. 명령 프롬프트에 arp -a를 입력합니다.
예를 들어, 최근에 ping 명령을 사용하여 이 컴퓨터에서 IP 주소 10.0.0.99인 호스트 컴퓨터으로의 연결을 테스트 및 확인한 경우에는 ARP 캐시에 아래 항목이 표시됩니다.
인터페이스: 인터페이스 0x1의 10.0.0.1
인터넷 주소 실제 주소 형식
10.0.0.99 00-e0-98-00-7c-dc dynamic
이 예에서 캐시 항목은 10.0.0.99의 원격 호스트 컴퓨터가 원격 컴퓨터의 네트워크 어댑터 하드웨어에 지정된 미디어 액세스 제어 주소 00-e0-98-00-7c-dc로 확인됨을 나타냅니다. 미디어 액세스 제어 주소는 네트워크에서 컴퓨터가 이 원격 TCP/IP 호스트와의 실제 통신에 사용한 주소입니다.
참고
*명령 프롬프트를 열려면 시작을 클릭하고 프로그램, 보조프로그램을 차례로 가리킨 다음 명령 프롬프트를 클릭합니다.
*Windows 2000은 나중에 사용할 수 있도록 하드웨어-투-소프트웨어 주소 매핑의 캐시를 유지하여 네트워크에서 ARP 브로드캐스트 트래픽을 최소화합니다. 이 캐시에는 아래와 같은 두 가지 종류의 항목이 포함됩니다.
*동적 ARP 캐시 항목
이 항목들은 원격 컴퓨터에서 TCP/IP 세션을 정상적으로 사용하는 동안 자동으로 추가되고 삭제됩니다. 동적 항목은 2분 내에 다시 사용되지 않으면 캐시에서 만료됩니다. 동적 항목을 2분 내에 다시 사용하는 경우에는 동적 항목이 캐시에 남아 있을 수 있고 ARP 브로드캐스트 작업을 사용하여 제거하거나 캐시 갱신을 요청할 때까지 최대 캐시 수명인 10분까지 유지될 수 있습니다.
정적 ARP 캐시 항목
이 항목은 arp 명령을 -s 옵션과 함께 사용하여 수동으로 추가됩니다. 정적 항목은 컴퓨터가 다시 시작될 때까지 ARP 캐시에 남아 있습니다.

7. 정적 ARP 캐시 항목 추가
명령 프롬프트를 엽니다.
명령 프롬프트에서 아래와 같이 입력합니다.
arp -s ip_address mac_address
각각의 의미는 아래와 같습니다.
ip_address 같은 서브넷의 로컬 TCP/IP 노드의 IP 주소를 지정합니다.
mac_address 로컬 TCP/IP 노드에 설치되어 사용되는 네트워크 어댑터의 미디어 액세스 제어 주소를 지정합니다.
예를 들어, 00-10-54-CA-E1-40의 미디어 액세스 제어 주소를 확인하는 10.0.0.200의 IP 주소를 사용하여 로컬 TCP/IP 노드에 정적 ARP 항목을 추가하려면 명령 프롬프트에 아래와 같이 입력합니다.
arp -s 10.0.0.200 00-10-54-CA-E1-40
참고
*명령 프롬프트를 열려면 시작을 클릭하고 프로그램, 보조프로그램을 차례로 가리킨 다음 명령 프롬프트를 클릭합니다.
*정적 ARP 항목은 자주 사용되는 호스트에 대한 빠른 액세스를 도와 줄 수 있습니다.
*정적 항목은 Windows 2000이 다시 시작될 때 까지만 유효합니다. 정적 ARP 캐시 항목을 영구적으로 만들기 위해 arp 명령을 시스템이 시작할 때 실행되는 일괄 파일에 추가할 수 있습니다.

8. 현재 TCP/IP 프로토콜 및 연결 통계 보기
1. 명령 프롬프트를 엽니다.
2. 명령 프롬프트에서 아래와 같이 입력합니다.
netstat
참고
*명령 프롬프트를 열려면 시작을 클릭하고 프로그램, 보조프로그램을 차례로 가리킨 다음 명령 프롬프트를 클릭합니다.
*netstat 명령줄 옵션을 보려면 아래와 같이 입력합니다.
netstat /?

출처 : [기타] 인터넷 : http://tong.nate.com

'UNIX' 카테고리의 다른 글

cvs에 대해 잘 정리된 곳..  (0) 2008.03.05
유닉스 파일 문자열 바꾸기  (0) 2008.02.25
ps와 grep과 awt의 만남  (0) 2007.08.17
XML 프로젝트들  (0) 2007.03.13
exec와 system  (0) 2007.03.05
posted by 구름너머 2007. 8. 17. 16:09

Unix sh 명령어 : ps와 grep과 awt의 만남

1.ps -x 옵션 : 확장 포맷으로 조회

명령어가 길어서 ps로 보이질 않을 경우.

2.grep -v grep : grep 으로 조회한 것은 제외

-e a -e b : a 나 b를 조회

3.awk$0 전체 열

$1 첫번째 열

$2 두번째 열

ps -efx | grep -v grep |grep -e BCDC2A2B -e jr2A
echo "다른 방법 ...."

ps -ef | grep -v grep | grep -e jr2A -e BCDC2A2B | awk '{print "ps -efx | grep -v grep | grep " $2}' | sh

2005/02/17 21:12

http://blog.naver.com/norther80/80010302576

1 머리말 #

awk는 명령어를 사용하다보면, 의외로 자주쓰는데, 지금까지 얼추 맞춰서 쓰다가 문서는 찾았습니다만, 위키에 없어서 찾은것들을 정리해서 글을 씁니다. 공개되어있는 문서를 찾아서 했기에, 절대 창작문서가 아닙니다.



단지 내용정리일 뿐입니다.



우선적으로 내용을 옮겨놓기때문에 두서가 없을수도 있습니다.




조금 길어지다 보니.. 형식이 마구 틀어지고, 테이블 무서지고 있습니다... 그런데, 위키초보라서 잡기가 매우 힘들군요... 좀.. 도와주세요 ㅠ.ㅠ --maylinux





2 Awk 란? #

awk는 프로그램 툴이다. 이 툴은 상당히 배우기 쉽고, 사용하기가 편리하다. 왜 그럴까? awk는 기본적으로 데이터처리를 위한 상당히 잘 만들어진 프로그래밍 모델을 가지고 있다. 이 말은 돌려서 얘기한다면, 일반적인 프로그램을 짜기에는 불편하다는 얘기가 될수 있다. 즉 perl에서 지원하는 여러가지 API 함수를 이용한 프로그램이나, 복잡한 정규표현식을 처리하기에는 많은 어려움이 있다는 것이다. 즉, awk 는 awk 나름대로의 용도라는 것이 있다는 말이다. 물론 awk 가지고도 여러가지 복잡한 일반프로그래밍이 가능하지만, 솔직히 이러한 것을 처리할때에는 awk 보다는 다른 프로그램을 사용하는 것이 좋다.



일단 간단히 얘기하자면, awk는 데이터 양식의 문서나 또는 자료를 처리하여 다른 형태의 문서 또는 결과물을 출력하는데 쓰인다. 실제로 awk의 프로그램 동작 모델은 이것을 위해 아주 잘 만들어져 있다. 뭐, 잘 만들어져 있는지 아닌지는 다음의 글들을 읽어야 알겠지만, 일단은 그렇다는걸 기억해 두기 바란다.





3 awk의 구조(Model) #

awk는 위에서 언급한 바와 같이 데이터 처리를 위해 최적화 되어 있다고 했다. 그러면, 어떠한 모델이 데이터 처리에 적합한 것일까? 일단 아래의 내용을 보고 나서 계속 설명하겠다.



1. 시작(BEGIN) : 입력데이터를 실행하기에 적합한 형태로 바꾸어 주는 단계이다. 프로그램적인 말로는 preprocess라고 한다.



2. 실행(Routine) : ?시작 단계에서 잘 처리된(정규화된) 데이터를 실제 루틴으로 처리하는 것이다. 여기서 데이터는 처리 루틴에 따라 처리가 되며, 입력값이 루틴을 거쳐 결과값이 나오게 된다.



3. 끝(END) : ?시작 단계와 마찬가지로, 데이터가 처리된 후에 처리해야 할 내용들을 담고 있다. 결과의 추가 출력들을 예로 들수 있다.






4 awk 프로그램 #



4.1 일반적인 awk 의 용도 및 사용방법(Using Model) #

awk는 일반적으로 데이터 또는 유사 데이터양식의 파일 및 자료를 처리하는데 쓰인다. 예를 들어 통계 자료나, text 형식의 access(?MicroSoft), 실험식의 계산 결과 등을 통계를 낸다던지 비교 분석 한다던지 다른 형태의 문서(결과물)로 변환하는 등의 작업에 사용된다. 따라서 이러한 작업에 있어서 awk는 100%의 작업효율을 가져올수 있다. 물론 perl이나, 유사프로그램을 사용해도 좋지만, 특별하게 복잡한 구조를 가지지 않는다면, 굳이 "토끼 잡는데, 소잡는 칼을 쓸 이유는 없다"는 것이다. awk만으로 충분하며, 또한 sed나 다른 GNU 유틸을 병합하여 사용하는 것이 단일 perl 프로그램이나, 기타 데이터 처리 프로그래밍 언어를 사용하는 것보다 훨씬 낫기 때문이다.



개인적인 관점으로는 GNU 유틸들은 상당히 유연하고(flexible)하고, 간편하지만, 실제적으로 개개의 GNU 유틸로 작업을 하기에는 상당히 힘이 든다. 그러나, 이들 GNU 유틸들을 적절하게 조합하여 사용하면, 기존의 여타 프로그램들과 동등한 기능을 발휘하는 멋진 프로그램이 될수 있는 것이다.



그래서 보통의 작업은 awk 하나만 가지고, 모두 다 처리 할수가 없다. 하고자 하는 일의 일부분을 awk가 맡을수 있는 것이다. 보통의 일반적인 awk의 사용은 다음과 같은 단계를 거치게 된다.




egrep 및 grep 을 이용한 데이터 파일의 구조확인을 한다. 정규화가 가능한지를 확인하고, sed 로 테스트 해본다. awk가 처리할만큼 정규화가 되어 있다면, 바로 awk를 사용한다. sed로 정규화된 양식을 awk로 처리한다. 데이터의 양식 데이터는 일반적으로 Record와 Fields를 가진다. 일반적으로 한라인(한줄)이 1 record가 되고, Fields의 구분은 "□"(공백문자)를 구분자로 하게 된다. (레코드와 필드에 대해서 이해가 가지 않는 사람은 ?DataBase 에 대한 개요등을 참고 하기 바란다.)



일반적으로 awk가 처리 할수 있는 데이터의 형식은 다음과 같다.




■■■□■■■■□■■■□■■■□■■■■■■□■■■■

■■■■□■■□■■■■■■■□■■■■□■■□■■■■

■■□■■■■■■■■■□■■□■■□■■■■■■■■□■


위의 데이터는 아래의 형식으로 바뀌게 된다.





record1: ■■■ ■■■■ ■■■ ■■■ ■■■■■■ ■■■■

record2: ■■■■ ■■ ■■■■■■■ ■■■■ ■■ ■■■■

record3: ■■ ■■■■■■■■■ ■■ ■■ ■■■■■■■■ ■

Field 1 Field 2 Field 3 Field 4 Field 5 Field 6

$1 $2 $3 $4 $5 $6


( 위의 표가 잘 이해되지 않는다면, DB 입문서등을 읽어보도록 한다. )



각 라인이 한 레코드가 되며, 스페이스로 분리된 문자열이 Field(또는 Column)으로 나뉘게 된다. 실제로는 한 레코드가 한 라인과 일지 않을수도 있으며, Field 를 구분하는 것도 공백 문자가 아닐수도 있다. 자세한 내용은 다음의 예제를 보면서 이해를 할수 있을 것이다.







4.2 Example 1 - 간단한 awk 사용 #

# cat exam_result.dat

박종규 95점

이억운 98점

이훈강 99점

엄성기 100점

정영원 97점

박오근 98점

여기서 각 줄이 한 레코드가 된다. 그리고, "박종규 95점"이란 내용에서 "박종규", "95점"이란 문자열이 각각의 필드(항목)가 되는 것이다.



간단히 이름을 출력해 보기로 하자

# awk '{print $1}' exam_result.dat

박종규

이억운

이훈강

엄성기

정영원

박오근

print 명령은 간단히 처리중에 필요한 내용을 출력하는 함수이다. "$1"은 1st(첫번째) 필드를 지시한다. 마찬가지로 점수를 출력하려면, "$1" 대신에 "$2"를 입력하면 된다. 그러면, 라인의 전체 내용을 출력하려면 어떻게 해야하는가? "$0"를 사용하면, 라인의 전체 내용을 출력할수 있다.



이제 여기에서 시험친 사람들의 총점을 구하려고 한다. 어떻게 해야 할까? 일단 합계는 숫자만이 가능한데, 현재는 "95점", "98점"과 같이 "점"이라는 글자가 포함되어 있어, 필드로 구분해 내어도 계산이 불가능하다. 그러면, 일단 sed 프로그램을 사용해 "점"이라는 글자를 삭제하여 연산이 용이하도록 만들어보자.



sedscr의 내용

# cat sedscr

s/점$//



# sed -f sedscr exam_result.dat

박종규 95

이억운 98

이훈강 99

엄성기 100

정영원 97

박오근 98

자 이제 계산할수가 있을듯 하다. 그러면, 프로그램을 짜 보자.

# sed -f sedscr exam_result.dat | awk 'BEGIN{ sum = 0; print "총점 출력 프로그램"; } {sum += $2} END {print "합계 : " sum}'

총점 출력 프로그램

합계 : 587

위의 내용을 설명하도록 하면 다음과 같다.



BEGIN{ sum = 0; print "총점 출력 프로그램"; } 위에서 언급 awk 의 모델링에서 BEGIN 부분에 해당한다. 루틴이 돌아가기 이전에 필요한 작업을 이부분에 기재할수 있으며, 출력의 머릿말 등을 달아 둘수 있다. 합계를 내기위한 변수 sum을 지정하고, 그 값을 0 으로 초기화 하였다.



{sum += $2} 실제 프로그램 내용이다. 위에서 Routine(루틴)이라 설명한 곳이다. 이 부분은 한 필드마다 적용이 되며, 함수나 루틴을 사용하여 필요한 작업을 수행한다. 현재의



END {print "합계 : " sum} 위에서 언급한 END(마지막) 처리 부분이다. 모든 연산이 끝나고 난 다음 마지막 출력 양식이라든지 결과값을 출력한다. 현재 소스는 합계내역을 출력한다.



위의 소스는 알아보기 힘들기 때문에, awk 코드 부분을 파일로 저장하여 실행하는 방법을 써 보도록 하자.



아래의 내용으로 sum.awk 파일을 작성해 보자

# cat sum.awk


#!/bin/awk

#

# This Program is for Summing of exam_result.

#


# BEGIN : 프로그램 시작 처리

BEGIN {

sum = 0;

print "총점 출력 프로그램";

}


# ROUTINE : 프로그램 본문

{

sum += $2;

}


# END : 프로그램 마무리 처리

END {

print "합계 : " sum;

}

위에서 첫줄의 #!/bin/awk 는 앞으로의 내용들은 /bin/awk 프로그램을 사용해서 번역(처리)을 하겠다라는 지정 구문이다. 쉘스크립트의 "#!/bin/sh"와 같은 역할을 한다고 생각하면 될 것이다. 첫줄 이외에 "#" 으로 시작하는 문장들은 모두 주석이다. 프로그램의 설명이나, 함수, 루틴에 대한 설명을 적어둔다. 각 내용은 한줄이 끝날때마다 ";"(세미콜론)을 붙여서 분리를 한다.



자, 위의 awk 스크립트 파일로 실행을 해 보기로 하자.



# sed -f sedscr exam_result.dat | awk -f sum.awk



awk 스크립트 파일을 호출할때에는 "-f 파일이름" 옵션을 사용한다는 것을 기억해야 한다.



자, 그러면 이 프로그램에서 평균은 어떻게 구할수 있을까? 이미 눈치를 챈 사람들이 있을 것이다. sum.awk 파일을 수정해 보자.

# cat sum.awk


#!/bin/awk

#

# This Program is for Summing of exam_result.

#


# BEGIN : 프로그램 시작 처리

BEGIN {

sum = 0;

print "총점 출력 프로그램";

}


# ROUTINE : 프로그램 본문

{

sum += $2;

}


# END : 프로그램 마무리 처리

END {

print "합계 : " sum;

average = sum / 6;

print "평균 : " average;

}

실행을 하면 아래와 같이 된다.

# sed -f sedscr exam_result.dat | awk -f sum.awk

총점 출력 프로그램

합계 : 587

평균 : 97.8333





4.3 awk의 내부변수 #



awk에는 awk 가 내부적으로 가지는 변수들이 있다. 이 변수들을 사용하여, 필드 및 레코드의 구분을 좀 더 다양하게 할수 있으며, 좀 더 flexible(유연한)프로그램을 짤수가 있다. 아래에 각 내부 변수들에 대해서 설명해 두었다.




FS : 필드 구분자 - Fields Seperator



RS : 레코드 구분자 - Records Seperator



NF : 현재 레코드의 필드수(Number of Fields)



NR : 현재 파일에서 레코드 넘버(Number of Records)



FNR : 입력파일이 여러개인 경우에 현재 파일에서의 NF를 표시한다.



OFS : 출력시의 FS( Output Fields Seperator ). 이 값을 변경하게 되면, 출력시의 FS 가 바뀌게 된다.



ORS : 출력시의 RS( Output Records Seperator ). 이 값을 변경하게 되면, 출력시의 RS 가 바뀌게 된다.





4.4 Example 2 - awk 프로그램 응용 #

여기서 FS 와 RS 에 대한 부가 설명을 해야할것 같다. 일반적으로 데이터는 보통 한 라인이 한 레코드에 해당하고, 빈칸이나, 탭등이 필드를 구분한다. 그러나, 실제로 데이터파일에서 이런식으로 처리가 되지 않는 경우가 있으며, 굳이 데이터 파일만이 아니라, 다른 형식의 파일도 처리하기 때문에 FS, RS는 임의 설정이 가능해야 한다. 예를 들어 다음과 같은 명함 목록 파일을 보자.



# cat cards.dat

박종규

리눅스넷(주)

부산 광역시 연제구 연산동 한충 빌딩 000호

051-831-0000


김진억

이즈시스템

서울시 서초구 방배2동 400-0 0층

02-3000-0000

위의 데이터 파일은 한 한줄이 한 레코드가 되지 않는다는걸 알수 있다. 한 레코드는 한줄이 비워진 줄, 즉 정규식으로 표현하자면 "\n\n" 으로 구분되어 있으며, 레코드내에서 필드의 구분은 개행("\n")으로 구분된다. 따라서, 위의 데이터에서 이름과 전화번호만을 출력하고 싶다면, 다음과 같이 awk 스크립트를 작성할수 있다.



# cat block.awk


#!/bin/awk

BEGIN {

RS = "\n\n";

FS = "\n";

}

{

print $1, $NF;

}

위의 스크립트에서 BEGIN 부분에서 RS와 FS를 임으로 "\n\n" 과 "\n"으로 변경하였다. 또한 루틴부분에서는 첫번째 필드($1)와 마지막 필드($NF)의 내용을 출력하도록 하였다. NF현재 레코드에서 필드의 숫자를 나타낸다. 여기서 인자값을 호출하는 "$" 붙이게 되면, 마지막 필드값이 출력이 되는 것이다.




5 또다른 요약 페이지 #



awk는 직접 사용자로부터 입력을 받거나 아니면 지정한 파일을 가공하여 표준 출력한다. 표준 출력을 리다이렉션할 수 있다



사용법

awk ?옵션 '스크립트' ?-v 변수=값 ?파일(들)

awk ?옵션 -f 스크립트 파일 ?-v 변수=값 ?파일(들)

cf) 편집 스크립트 파일의 사용법

ed : ed -s(script) sourcefile < scriptfile

sed : sed -f(file) scriptfile sourcefile > outputfile

awk : awk -f(file) scriptfile sourcefile > outputfile



옵션

-Fc : field separator 지정

c는 필드 사이를 구분하는 구분자이다

직접 지정하지 않으면 공백을 기준으로 한다

시스템 변수 FS를 지정하는 것과 같은 효과를 지닌다

-v 변수 = 값

스크립트를 실행하기 전에 미리 변수를 지정하여 준다

-f 스크립트 파일

스크립트를 파일에서 가져온다

-f 옵션을 여러번 사용하여 여러개의 스크립트 파일을 동시에 불러와 지정한 파일에 적용할 수 있다


스크립트

패턴 { 동작 }

커맨드 라인에서는 패턴, 동작 전체를 단일 따옴표로 묶는다

패턴만 있는 경우 : 패턴과 일치하는 레코드(라인)를 화면에 출력한다

동작만 있는 경우 : 모든 레코드(라인)가 동작의 대상이 된다


패턴

/정규표현식/

sed가 지원하지 않는 +, ?, |, ( ) 등의 메타문자도 지원한다 또한 ^, $를 각 필드의 처음과 끝을 의미하도록 사용할 수도 있다

비교연산

숫자 기준, 알파벳 기준 모두 사용 가능하다

패턴 매칭 연산

~ : 일치하는 부분을 나타낸다 !~ : 일치하지 않는 부분을 나타낸다

BEGIN

첫 번째 레코드가 읽혀지기 전에 어떤 동작을 정의하여 사용하고 싶을 때 사용한다

END

마지막 레코드가 모두 읽혀진 후 어떤 동작을 정의하여 실행하고 싶을 때 사용한다


동작

동작은 모두 { }로 둘러싸야 한다

예제

good이라는 문자열을 포함하는 모든 레코드를 출력할 때

/good/

각 레코드의 첫 번째 필드를 출력할 때

{ print $1 }

good이라는 문자열을 포함하는 레코드의 첫 번째 필드를 출력할 때

/good/ { print $1 }

두 개 이상의 필드를 가지는 레코드를 전부 출력할 때(비교연산)

NF > 2

한 라인(\n)을 필드로, 빈 라인("")을 레코드로 구분할 때

BEGIN { FS = "\n" ; RS = ""}

첫 번째 필드가 good와 일치하는 레코드에 대해 세 번째 필드를 먼저 출력하고 두 번째 필드를 나중에 출력하고 싶을 때

$1 ~ /good/ { print $3 , $2 }

good이라는 문자열이 몇 개나 들어가 있는지 계산하여 마지막 부분에서 출력하고 싶을 때

/good/ { ++x } END { print x }

두 번째 필드를 모두 합하고 마지막 부분에서 두 번째 필드의 총합계를 출력하고 싶을 때

{ total += $2 } END { print "Total of $2: " , total }

레코드의 길이가 20자 이하인 것을 출력하고 싶을 때

length($0) < 20

네 개의 필드를 가지며 good이라는 단어로 시작하는 모든 레코드를 출력하고 싶을 때

NF == 4 && /^good/

빈줄을 제외한 모든 줄을 화면에 출력한다

NF > 0



awk 시스템 변수


FILENAME 현재 파일명 $0 입력 레코드

FS 입력 필드 구분 디폴트 : 공백 $n 입력 레코드의 N번째 필드

NF 현재 레코드 필드 갯수 ARGC 커맨드 라인의 인자 갯수

NR 현재 레코드 번호 ARGV 커맨드 라인 인자를 포함하는 배열

OFMT 숫자에 대한 출력 포맷 디폴트 : %.6g ENVIRON 환경 변수들을 모아둔 관계형 배열

OFS 출력 필드 구분 디폴트 : 빈줄 FNR NR과 동일 단지 현재 파일에 적용된다는 점이 다름

ORS 출력 레코드 구분 디폴트 : newline RSTART 지정한 매칭 연산을 만족하는 문자열의 맨 앞부분

RS 입력 레코드 구분 디폴트 : newline RLENGTH 지정한 매칭 연산을 만족하는 문자열의 길이






awk 연산자


산술 : =, +=, -=, *=, /=, %=

조건 : ? : 논리 : ||, &&, ! 패턴 : ~, !~

비교 : <, <=, >, >=, !=,==

증감 : ++, -- 필드참조 : $

제어문(C의 제어문과 같다)

break

continue

do {실행} while (조건)

exit

for (관계형 배열의 요소) {실행}

펄의 foreach와 같다

if (조건) {실행} else {실행}

return

while



awk 명령어

문자열 연산

gsub(reg,s)

입력 문자열의 전반에 걸쳐 정규표현식 r을 문자열 s로 대치한다

gsub(reg,s1,s2)

문자열 s2에서 정규표현식 r을 s1으로 대치한다

index(s1,s2)

s1에서 s2의 위치를 넘겨준다 만약 없다면 0을 넘겨준다

length(arg)

인자의 길이를 넘겨준다

match(s,r)

문자열 s에서 정규표현식 r과 매칭되는 부분의 위치를 넘겨준다

split(string,array[,seperator])

구분자를 기준으로(지정하지 않으면 공백 기준)해서 지정한 문자열을 배열로 만든다 배열[1], 배열[2], .......

sub(r,s), sub(r,s1,s2)

gsub과 동일하다 단지 정규표현식과 일치하는 문자열이 여러개라도 처음 문자열만 대치된다

substr(s,m)

문자열 s에서 m번째 위치에서 끝까지의 문자를 리턴한다

substr(s,m,n)

문자열 s에서 m번째 위치에서 n번째까지의 문자를 리턴한다

tolower(str)

toupper(str)


수치 연산

atan2(x,y)

y/x의 arctangent값을 라디안 단위로 넘겨준다

cos(x)

exp(arg)

int(arg)

log(arg)

rand()

0과 1사이의 난수를 발생한다

sin(x)

sqrt(arg)

srand(expr)

인자를 가지고 난수를 발생한다 인자가 주어지지 않으면 시간을 가지고 난수를 발생한다



입출력/프로세스

close(filename)

지정한 파일을 닫는다

close(cmd)

지정한 명령어 파이프를 닫는다

delete array?element

지정한 배열 요소를 지운다

getline()

다음 레코드를 읽어 들인다

getline?variable [< "filename"]

파일에서 읽어들인다

next

다음 레코드(라인)을 입력받는다 getline()과 유사하지만 /패턴/동작을 새롭게 시작한다 getline()은 다음 라인을 읽기만 한다

print ?args ?> "filename"

인자를 출력한다

printf "format" [,expressions] ?> "filename"

형식에 맞춰 출력한다

sprintf (format [,expressions])

printf와 마찬가지로 사용하는데 값을 리턴하기만 하고 출력은 하지 않는다

system(command)

시스템 내부 명령어를 실행한다


간단한 예

awk ' BEGIN { for (i = 1;i<=7,i++) print int(101*rand()) }'

화면에 1이상 100이하의 난수 일곱 개를 출력한다

ls -l file1 file2 file3 | awk ' { x += $5 } ; END { print "Total bytes : " x } '

파일들의 크기를 모두 합하여 총 바이트 수를 표시한다

awk ' END { print NR } ' filename

지정한 파일의 라인이 몇 개인지를 표시한다

awk ' NR % 2 == 0 '

지정한 파일의 짝수번째의 라인만을 출력해 준다




6 이야기 #

테이블 무너지고... 숫자 안매겨지고... 목록도 안나오네요... 아직 위키에 익숙하지 않아서, 고생하네요... 분명 특수문자의 문제라고 생각되는데.. 찾기가 힘듭니다...아시는분은 --; 수정좀 부탁드립니다. --maylinux



테이블의 경우 마지막의 "||" 뒤에 공백이 있으면 다음 줄하고 붙어버리는군요. feature 인지 bug 인지 모르겠습니다만. -- raymundo 2003-11-29 16:37:16


이걸 말씀하시는 건지 모르겠지만... 문서 상단에 ?TableOfContents를 추가하였습니다. -- 맹고이

'UNIX' 카테고리의 다른 글

유닉스 파일 문자열 바꾸기  (0) 2008.02.25
[TIP]네트워크 연결진단법  (0) 2007.09.12
XML 프로젝트들  (0) 2007.03.13
exec와 system  (0) 2007.03.05
crontab에 등록이 되었는데 실행이 안되는경우?  (0) 2007.02.14
posted by 구름너머 2007. 3. 13. 14:11

16. XML 프로젝트들

Apache XML 프로젝트사이트에 있으며 목적은 아래와 같다:

  • 열린 협동적인 양식으로 개발하기 위한 상업적 능력의 표준 기반 XML 솔루션을 제공하기 위하여

  • IETF나 W3C같은 표준에 대하여 구현전망으로부터 피드백을 제공하기 위해.

  • 아파치 프로젝트안에서 XML관련 활동의 초점이 되기 위해서

이 프로젝트의 홈페이지는 http://xml.apache.org에 있다. 이는 각각의 서브프로젝트를 위한 포괄체이다.

16.1. XML의 소개

이는 XML의 빠른 소개이다. XML에 대하여 더 많이 알고 싶다면 XML 홈페이지에서 시작하라. XML은 태그와 속성을 사용하여 구조화된 객체를 설명하는 마크업 언어이다(HTML을 생각하라) 내용은 가시화와는 분리되어있지만 디스플레이 방식(셀폰,HTML,텍스트)을 선택하거나 변경할 수 있다. XML표준은 단지 태그와 속성이 정렬되는 방법을 설명한 것이지 의미하는 이름을 설명한 것은 아니다. 아파치(그룹)에서는 아래의 절에 설명된 도구들을 제공한다.

16.2. Xerces

Xerces프로젝트는 자바, C, 펄을 포함하는 다양한 언어를 위한 XML파서를 제공한다. 펄 바인딩은 C++소스에 기반한다. Xerces의 TCL 바인딩은 Steve Ball이 만든TclXML 의 2.0버전에 있다. SourceForge 프로젝트 페이지를 통해서 가능하다. XML파서는 XML 문서를 표제 접근하는 데 사용하는 도구이다. 아래는 Xerces에 의해 제공되는 표준들에 대한 설명이다:

  • DOM: DOM이란 문서기반모델(Document Object Model)을 의미한다. XML문서들은 중첩된 태그들에 의해 계층적인 구조로 되어있다. XML문서들은 나무구조 비슷한 인터페이스로 접근할수 있다. 처리과정은 아래와 같다.

    • 문서 분석

    • 구조 작성

    • 노드 추가/삭제/변경

    • 구조 정렬

  • SAX:XML을 위한 단순 API. 이는 스트림기반의 API이다. 이는 계산된(encountered) 요소들로부터 콜백을 얻을수 있다는 것을 의미하며 이 콜백들은 예를 들어 DOM 트리를 생성하는데 사용할 수 있다.

  • XML 주소공간

  • XML Schema: XML 표준은 문서를 작성하는 신텍스를 제공한다. XML Schema는 XML 문서(semantics)의 contents를 정의하기 위한 도구를 제공한다. 이는 문서안에서 특정요소가 10과 20사이의 정수이이여야 한다고 정의하는 것을 허용한다.

Xerces XML 프로젝트의 초기 코드는 IBM에서 제안되었다. 이에대한 자세한 정보는 Xerces Java,Xerces Cand Xerces Perl홈페이지에서 찾을수있다.

16.3. Xalan

Xalan은 Java나 C++을 위한 XSLT 파서이다. XSL은 XML을 위한 스타일시트언어이다.여기서 T는 변환을 의미한다. XML은 구조적인 자료(정보)를 저장하는데 좋다. 때때로 이 자료를 사용자에게 표시하거나 다른 변환을 적용할 필요가 있다. Xalan은 원본 XML문서를 받아서 스타일시트를 이용한 변환정보를 읽은 후 HTML, 보통 텍스트나 또다른 XML 문서로 출력한다. Xalan에 대해서Xalan Java and Xalan C++프로젝트 홈에서 더 많은 것을 공부할수 있다..

16.4. FOP

웹사이트 에서, FOP는 형식화된 객체 트리를 읽고 이를 PDF문서로 변환하는 자바 프로그램이다.. 그래서 FOP는 Xalan이 HTML이나 텍스트를 이용하여서 하는 것과 비슷한 방법으로, XML문서를 읽고 PDF를 출력한다. FOP에 대해서는 이곳에서 더 자세히 알수 있다.

16.5. Cocoon

Cocoon은 이해가능한 출판물을 제공하기 위해 Xerces, Xalan과 FOP같은 다른 아파치 XML 기술들에 효력이 있다. 웹사이트에 설명한대로 내용과 로직과 표현방식을 분리한다:

  • XML 생성: XML 파일은 내용 소유자에 의해 만들어진다. XML 컨텐트는 특별히 선택된 DTD/namespace 보다는 오히려 처리하는데 특별한 지식을 요구하지 않는다. 이 계층은 항상 사람에 의하여 보통의 텍스트 편집기나 XML관련 도구/편집기를 이용하여 직접 수행된다.

  • XML 처리 발생기:논리적인 부분은 내용 파일과 분리되어있다.

  • XSL 변역: 만들어진 문서는 XSL 스타일시트를 적용하거나 특별한 형식(HTML, PDF, XML, WML, XHTML)로 형태화함으로서 변역된다.

cocoon에 대하여 더 알고 싶다면 Coon 홈페이지를 방문하라.

16.6. Xang

Xang프로젝트의 목적은 개발자들이 웹을 위한 상업적 성능을 가진 XML관련 응용프로그램을 만들기 쉽게 만드는데 있다. 프로그램 구조는 자바스크립트같은 것으로 쓰여진 계층적인 XML파일안에 정의되어있다. 이 파일은 (XML 파일, 자바 플러그인등등이 될 수 있는) 자료를 접근하는 방법을 정의한다. Xang 엔진은 HTTP 요청들을 적절한 취급자(핸들러)로의 사상을 처리한다. Xang에 대하여 자세히 알고 싶다면프로젝트 홈페이지를 방문하라.

16.7. SOAP

아파치 SOAP(단순 객체 접근 규약)은 W3C에 제출된SOAP submission의 구현이다. 이 것은 IBM의 SOAP4J의 구현에 기반하며 대체한다..

W3C 초벌 명세서에 의하면: SOAP는 분산 환경에서 정보의 교환을 위한 경량급 규약이다. 이 것은 다음의 세부분으로 구성된 XML 기반 규약이다.:

  • 메시지 표현방법과 처리방법을 위한 하부 구조를 정의한 구조,

  • 프로그램에 정의된 자료형의 객체를 표현하는 번역규칙 집합,

  • 그리고 원격 프로세스 호출과 응답을 나타내기 위한 규정.

SOAP는 XML기반 원격 프로시저 호출이나 CORBA 시스템을 생각할 수 있다. 이것은 HTTP와 XML기반이다. 이것은 다른시스템과 비교하는게 더 자세하고 느리다는 것을 의미한다. 다시 말해서 대부분의 언어는 HTTP와 XML을 위한 모듈을 가지고 있기 때문에 다양한 언어(C, Java, Perl, Python, Tcl, etc.)를 위한 클라이언트와 서버의 개발을 상호운영하거나 디버깅하는 것을 쉽게 한다. 더 많은 것을 배우려면아파치 SOAP 홈페이지을 방문하라.

관련된 이야기

  • W02: Rub-a-dub-dub-dubya: SOAP and the Web

16.8. Batik

Batik은 다양한 목적(보기,생성, 변형)을 위해서 Scalable Vector Graphics (SVG)에서 이미지를 사용하기 원하는 응용프로그램을 위한 자바기반 도구모음이다.

이는 XML 중심이고 W3C 명세서에 따른다. 그래픽관련 구성요소를 제공하여 다른 아파치 프로젝트와는 다른 전형적이 아니다. Batik는 사용자 태그를 통해 하부구조를 확장하는 고리를 제공하고 SVG로부터 JPEG나 PNG같은 다른 형식으로 변환하는 것을 허용한다.

Batik 홈페이지

관련된 이야기

  • W14: Batik 프로젝트 소개

16.9. Crimson

Crimson은 다양한 인터페이스를 통한 XML 1.0을 지원하는 선택적이고 자바 기반의 XML 파서입니다. 이 것은 Sun 프로젝트에 포함되어있는 파서이며 Xerces 2가 발표되기 전까지 임시 단계입니다.

Crimson 홈페이지

관련된 이야기

  • TH08: XML을 처리하는 자바 API(JAXP) 1.1

16.10. 다른 XML 프로젝트

아파치 XML 그룹하에 있지 않는 아파치와 XML 기반의 프로젝트 들이 있다.

  • mod_xslt.이것은 XML/XSL기반 문서를 전송하는 C기반의 모듈이다. 또한 GPL라이선스를 따른다.

  • AxKit는 mod_perl and Apache를 위한 XML기반의 응용서버이다.이는 컨텐트와 표현의 분리를 허용한다.

관련된 이야기

  • TH04: AxKit - 아파치를 위한 XML 문서 서버

'UNIX' 카테고리의 다른 글

[TIP]네트워크 연결진단법  (0) 2007.09.12
ps와 grep과 awt의 만남  (0) 2007.08.17
exec와 system  (0) 2007.03.05
crontab에 등록이 되었는데 실행이 안되는경우?  (0) 2007.02.14
gdb  (0) 2007.02.12
posted by 구름너머 2007. 3. 5. 11:43
exec()는 실행 결과 출력되는 Message를 arrary에 담는 것이고, system()은 출력되는 Message는 담기지 않고 실행결과(오류여부)만 bool(True/False)로 넘어옵니다.

예를 들어 test.sh 라는 실행 script의 출력 결과가
11
22
33
44
라면
$arr = exec("test.sh");
//$arr[0] = "11";
//$arr[1] = "22"; ....
와 같은 형태로 저장이 되고
if(!system("test.sh"))
echo "Error";
else
echo "Success";
와 같이 활용 할 수 있습니다.

'UNIX' 카테고리의 다른 글

ps와 grep과 awt의 만남  (0) 2007.08.17
XML 프로젝트들  (0) 2007.03.13
crontab에 등록이 되었는데 실행이 안되는경우?  (0) 2007.02.14
gdb  (0) 2007.02.12
Unix에서 100MB이상인 자료 찾기...  (0) 2007.01.19