2009년 11월 19일 목요일

[CentOS] 시스템 시간 관리

(1) CMOS 시간 조절 명령

1. 리눅스 시스템 시각으로 CMOS 시간 설정하기

$ clock -r ( CMOS 시간 확인)
$ date (시스템 시간 확인)
$ clock -w ( 시간 변경 )

2. CMOS 시간으로 리눅스 시스템 시각 설정하기

$ date (시스템 시간 확인)
$ clock -r (CMOS 시간 확인)
$ clock -s (시간 변경)

3. 시스템 시간 설정하기

$ date 0217170207 (2009년 2월 17일 02분 07초로 설정)
$  rdate -s time.bora.net (원격지 타임서버로 부터 시스템 시간 설정)

4. 시간 동기화

$ crontab -e (하루에 한번씩 시간 동기화)



2009년 10월 11일 일요일

[01] 개요

1.1 작업을 동시에 실행하는 일에 대한 (아주)간략한 역사

동시작업의 필요성이 대두된 몇가지 요인
  • 자원 활용
    프로그램은 때때로 입출력과 같은 외부 동작이 끝나기를 대기하는 경우가 많은데 이 대기시간이 길어지면 자원을 한 프로그램이 지배하게 된다. 매우 비효율적인 방식이므로 자원 분배시 효율성을 위해 동시작업이 필요하다.

  • 공정성
    여러 프로그램은 사용자와 컴퓨터 자원에 대해 동일한 권한을 가질 수 있다. 즉, 한 프로그램이 끝나기를 대기하며 다음 프로그램의 실행을 제약하기 보단 작은 단위로 컴퓨터 자원을 공유하는 것이 더 효율적이다.

  • 편의성
    때때로 여러 작업을 전부 일괄적으로 처리하는 것 보다 각기 일을 하나씩 처리하고 필요할 때 프로그램 간에 조율을 하는 소프트웨어를 여러 개 만드는 개 더 쉽고 효율적이다.

동시작업에 대한 필요성으로 인해 스레드라는 개념이 고안됐다. 스레드는 메모리, 파일 핸들과 같이 프로세스에 할당된 자원을 공유하지만 각기 별도의 프로그램 카운터, 스택, 지역변수를 갖는다. 또한 프로그램을 스레드로 분리하면 멀티 프로세서 시스템에서 자연스럽게 하드웨어 병렬성을 이용할 수 있다.

스레드는 의도적으로 조율하지 않는 한 비동기적으로 실행되며, 자신이 포함된 프로세스의 메모리 주소공간을 공유함으로 프로세스 내 모든 스레드는 같은 변수에 접근하고 같은 힙에 객체를 할당한다. 이 때문에 공유데이터 접근시 적절하게 동기화하지 않으면 다른 스레드가 사용 중인 변수를 순간적으로 수정해서 예상치 못한 결과를 얻을 수도 있다.

1.2 스레드의 이점

(1) 멀티프로세서 활용

멀티프로세서 서버와 PC가 점차 대중화 되는 추세에서 단일 스레드 프로그램은 컴퓨터 자원의 낭비를 초래한다. 프로세서 스케줄링의 기본 단위는 스레드이기 때문에 여러개의 스레드를 사용하는 프로그램은 단일 스레드보다 보다 효율적인 처리를 할 수 있다.

(2) 단순한 모델링

복잡하면서 비동기적인 작업(JOB)을 더 단순하고 동기적인 작업 흐름으로 세분화하여 복잡한 순차작업을 단순화 할 수 있다. 이런 장점은 서블릿이나 RMI와 같은 프레임웍에서 종종 활용된다. 즉 프레임웍에서는 요청관리, 스레드 생성, 로드 밸런싱, 요청분배와 같은 일을 처리하고 서블릿 개발자는 서블릿 개발에만 집중할 수 있다.

(3) 단순한 비동기 이벤트 처리

이벤트 발생시 마다 스레드를 생성 할당하고 동기화를 적절히 수행하면 개발 작업이 쉬워진다.

(4) 더 빨리 반응하는 사용자 인터페이스

GUI 어플리케이션에서 사용자 입력 이벤트를 스레드로 처리하여 더 빨리 반응하는 UI를 개발 할 수 있다.

1.3 스레드 사용의 위험성

스레드가 소수만의 난해한 주제였을 때 병렬 문제는 '고급' 주제였다. 하지만 지금은 개발자라면 대부분 스레드 안정성에 대해 잘 알아야 한다.

(1) 안정성 위해 요소

@NotThreadSafe
public class UnsafeSequence {
private int value;

/** 유일한 값을 리턴해야 한다 **/
public int getNext() {
return value++;
}
}

[예제 1.1] 경제 조건 위험성 코드

상기 코드는 경쟁 조건(race condition)이라고 하는 흔한 위험성을 보여주는 좋은 예제다. 코드가 원하는 유일한 값을 리턴결과가 여러 스레드에서 호출되면 연산이 어떻게 간섭하느냐에 따라 결과가 달라질 수 있는 코드다.

멀티스레드 프로그램이 동작하는 모습을 예측하려면 스레드가 서로 간섭하지 않도록 공유된 변수에 접근하는 시점에 적절하게 조율해야 한다. (자바에서는 공유변수 접근을 조율하기 위한 동기화 수단을 제공한다)

@ThreadSafe
public class Sequence {
@GuardedBy("this") private int value;

public synchronized int getNext() {
return value;
}
}

[예제 1.2] 스레드 안전한 코드

(2) 활동성 위험

멀티스레드를 사용하면 단일 스레드 프로그램에서는 발생하지 않는 활동성(liveness)장애가 생길 수 있다. 안정성은 "잘못된 일이 생기지 않는다"는 것을 뜻하는 반면, 활동성은 "원하는 일이 결국 일어난다"는 보완적인 목표에 관한 것이다. 즉, 어떤 작업이 전혀 진전되지 못하는 상태에 빠질 때 활동성 장애가 발생했다고 한다. 예를 들면 무한 반복문을 생성하여 반복문 다음에 놓인 코드가 절대 실행되지 않는 경우를 들 수 있다. 스레드를 사용하면 활동성 관련 문제의 위험성이 더욱 높아진다. 즉 데드락, 소모상태, 라이브락 등 여러가지 활동성 장애를 일으킬 수 있다. 이런 활동성 장애 오류는 개발 초기에 파악하기가 무척 어렵다.

(3) 성능 위험

성능문제는 형편없는 서비스 시간, 반응성, 처리율, 자원 소모, 규모에 따른 확장성 등 넚은 범위의 문제들을 포괄한다. 또한 멀티 스레드 프로그램은 단일 스레드 프로그램에서 발생할 수 있는 모든 성능 위험뿐만 아니라, 스레드를 사용하기 때문에 생기는 추가 위험에도 노출된다.

스레드를 사용하면 실행 중에 어느 정보 부하가 생기는 것도 사실이다. 스레드가 많은 프로그램에서는 컨텍스트 스위칭이 더욱 빈번하여 상당한 부담이 생기며, 스레드가 데이터를 공유할 때는 동기화 수단도 사용해야 하는데 이 동기화는 컴파일러 최적화를 방해하고, 메모리 캐시를 지우거나 무효화하기도 하며 그 밖에 공유 메모리 버스에 동기화 관련 트래픽을 유발한다. 이런 모든 요인은 성능 측면에서 추가적인 손실을 유발한다.

1.4 스레드는 어디에나

현실에서 거의 모든 자바 프로그램이 멀티스레드로 동작하는 프로그램이고, 외부에서 프로그램 내부의 상태에 접근하는 과정을 적절히 조율하기 않아도 될 만큼의 기본적인 조율 기능을 프레임웍이 담당해 주지는 않는다.

프레임웍은 프로그램 컴포넌트를 호출할 때 프레임웍 내부의 스레드에서 호출하기 때문에 자동으로 프로그램이 스레드를 활용하는 것과 동일한 효괄르 준다. 컴포넌트는 언제나 프로그램 내부의 상태에 접근하기 때문에 해당 상태에 접근하는 모든 코드 경로에 해당하는 컴포넌트 역시 스레드 안전해야 한다.

아래 예시는 외부의 스레드에서 프로그램 코드를 호출하는 예시이다.

  • 타이머 (Timer)
  • 서블릿과 JSP
  • 원격메소드호출 (Remote Method Invocation)
  • 스윙과 AWT

2009년 10월 5일 월요일

[Windows]Windows Vista에서 Telnet 사용하기

0. Windows 비스타에서 Telnet 사용하기

제어판 -> "프로그램 및 기능"을 실행 -> 화면 왼쪽 메뉴 중 가장 밑단의 "Windows 기능사용/사용 안함"을 클릭 -> 여러 목록중 "Telnet Client"를 체크

명령프롬프트에서 start /w pkgmgr /iu:"TelnetClient"를 실행

[01] 개요

1.1 웹어플리케이션 개요
웹어플리케이션이라함은 브라우저를 통해 접근할 수 있는 소프트웨어 응용프로그램으로 통상 서버 측에서 비즈니스 로직을 실행하고, 클라이언트 측에서 웹 브라우저를 이용하여 운용할 수 있는 프로그램을 UI를 구현한다.

그림1. 전형적인 웹어플리케이션의 아키텍처


1.2 보안

[보안의 3요소]
  • 비밀성(Confidentially)
    정보는 소유자가 원하는 대로 비밀이 유지되어야 한다
    허가받지 않은 비인가자나 프로세스에게 정보가 노출되지 않도록 하는 것을 보장한다.
    인가받은 사람만이 정보에 접근할 수 있어야 한다.
    비밀성 보장을 위한 수단에는 접근통제, 암호화 등이 있음

  • 무결성(Integrity)
    비 인가된 자에 의한 정보의 변경, 삭제, 생성을 보호하여 정보의 정확성과 완전성이 보장되게 한다.
    무결성을 통제하기 위한 수단에는 물리적 통제, 접근 통제 등이 있음

  • 가용성(Availability)
    정보시스템은 적절한 방법으로 작동되어야 하며, 정당한 방법으로 권한이 주어진 사용자에게 정보서비스를 거부하여서는 안 된다는 원칙
    가용성 확보를 위한 통제 수단에는 데이터백업, 중복성 유지, 물리적 위협 요소로부터 보호등이 있다.
[보안의 평가 기준]
다음은 대표적인 보안 평가 기준이다.
  • TCSEC (Trusted Computer System Evaluation Criteria)
    Orange Book이라고도 부름
    1985년 미국방부 표준으로 채택된 컴퓨터 시스템 보안성 평가 기준
    다른 나라의 보안성 평가 기준서에 큰 영향을 미침
    등급 : (낮음)D, C1, C2, B1, B2, B3, A(높음)

  • ITSEC (Information Technology Security Evaluation Criteria)
    영국, 독일, 프랑스, 네덜란드 등에서 사용하는 보안성 평가 기준
    등급 : (낮음)E0 ~ E6(높음)

  • CC (Common Criteria)
    국제 공통 평가 기준
    세계 각국의 평가 기준이 상이하여 평가에 비용과 시간에 많이 소요되는 문제점을 해결하기 위함
    등급 : (낮음)EAL0 ~ EAL7(높음)

[보안및해킹 영역]
  • 시스템 보안
    운영체제 취약점 -> 패치 및 업그레이드
    환경설정 취약점 -> 주기적인 감사

  • 네트워크 보안
    네트워크 취약점 -> 방화벽, IDS(Intrusion Detection Systems : 침입탐지시스템), VPN(Virtual Private Network : 가상사설망), IPS(Intrusion Prevention Systems : 침입방지시스템)
    프로토콜 취약점 -> DoS(Denial of Service : 서비스 거부 공격), DDoS(Distributed Dos : 분산서비스 거부 공격), DrDoS(Distributed Reflection DoS : 분산 반사 서비스 거부 공격) 방지

  • 웹보안 (전체 해킹 중 80% 이상 비중 차지함)
    웹서버와 방화벽의 보안을 강화
    개발시 보안을 고려해서 코딩
    DBMS 취약성을 패치를 통해 보안을 강화

[최신 보안 이슈]

  • 키보드보안
    인터넷 뱅킹 및 쇼핑몰의 온라인 거래 시 필수적으로 입력되는 개인정보 유출
    유출시 금융사고로 직결
    사용자의 키보드 입력정보를 도청하는 것을 방지
    사용자 PC에 키보드 보안을 위한 Key device driver 설치
    사용자 Key 입력시 Filter driver나 Hooking driver를 통해 입력 값을 가로채서 암호화한 후 해당 어플리케이션에 전달
    키로거 기술은 키로거에 감염된 컴퓨터를 쓰는 사람들의 키보드 입력을 기록하는 것

  • 파밍(Pharming)
    범죄를 목적으로 하는 해커들이 인터넷 트래픽을 원래 사이트에서 동일해 보이는 다른 사이트로 리다이렉션하여 사용자가 가짜 사이트의 데이터베이스에 사용자 이름과 암호를 입력하도록 하는 수법
    가짜 웹사이트의 사용을 의미하는 파밍은 전자메일 피싱사기와 비슷해 보이나, 사용자의 참가 또는 지식이 전혀 없는 상태에서 가짜 사이트로 리다이렉션 될 수 있다는 점에서 좀 더 교활한 사기 수법
    DNS 서버를 공격하거나 사용자의 host 파일을 공격하여 URL의 IP를  크래커의 IP로 변조

  • 피싱(Phishing)
    개인정보를 낚시하듯  낚아챈다는 뜻에서부터 유래
    AOL 계정 도둑에서 유래 네티즌이 만드는 온라인 백과사전 위키피디아에 따르면 피싱은 1996년 처음 등장, 당시 해커들이 아메리카온라인(AOL)계정을 훔치려고 사용한 수법

[네트워크 보안]

  • DoS 공격
    시스템이나 네트워크의 구조적인 취약점을 공격하여 리소스를 고갈시켜 정상적인 서비스를 지연시키거나 마비시키는 공격
    => 방화벽 설치, IDS 운영, 안정적인 네트워크 설계

  • Spoofing
    사전적으로는 "속이기"라는 의미이며, 다른 시스템의 신뢰관계를 속여 침입하는 해킹기술

  • Sniffing
    컴퓨터 네트워크 상에 흘러 다니는 패킷을 엿듣는 도청과 같은 행위
    => 암호화, 스니퍼탐지

  • Session Hijacking
    클라이언트의 세션을 가로채서 일시적으로 클라이언트 세션을 끊고 세션을 빼앗아 인증을 회피하는 방법
[서버시스템 보안]

  • 슈퍼유저 통제
    슈퍼유저 권한에서 보안관리 권한을 분할하여 보안관리자에게 이관
    슈퍼유저의 로그인 위치 및 로그인 방법 통제
    일반 사용자의 su사용 통제
    슈퍼유저의 권한 중 필요한 부분을 일반사용자에게 이양
    핵심자원에 대한 접근 통제 (프로세스 kill 방지, 핵심파일 접근 통제)

  • 접근통제 강화
    모든 사용자에게 별도의 계정을 할다하여 개인별 책임 추적성 구현
    계정 보호 구현
    => 비 활동성 계정 정리, 임시 계정 발급 및 말소 절차 구현, 패스워드 강화 정책 구현
        반복적인 로그인 시도 통제
    파일 시스템 통제를 강화하기 위해 퍼미션 모드를 세분화 하여 접근 통제 정책을 수립
    백업 오퍼레이터는 특정 시간에 특정 백업 소프트웨어를 사용해서만 전체 시스템 읽을 수 있도록 함
    불필요한 TCP 서비스를 모두 제거하고 포트별로 서비스 대상 네트워크, 호스트, 터미널을 통제
    중요 위반 사항 발생시 감사 로그

  • 로그 보호
    분산되어 있는 시스템 파일들의 변경에 대한 감사 정책을 수립
    특정 로그 파일들은 반드시 관련 프로세스에 의해서만 변경되도록 하여 슈퍼유저 권한으로도 조작 할 수 없도록 통제 정책을 수립
    원척적으로 조작이 불가능한 별도의 감사로그의 운용

  • 관리 강화
    일관된 보안 관리 수준
    직무기반 접근 통제를 수립하여 통제 정책을 구현
    => 반복적인 통제 정책의 수립작업을 피한다.
    서버간 통제 정책의 자동 전파
    로그 필터링 및 라우팅
    => 정책 시뮬레이션 기능을 구현 - 통제 정책의 수립, 시험, 적용
[어플리케이션 보안]

  • 사용자 인증 및 접근 통제
    상호인증, 복합인증의 지원
    => SmartCard, OTP, 인증서 등

  • 권한별 접근 제어
  • 기밀성 유지를 위해 전송중인 데이터 암호화 및 무결성 보장
  • 감사 및 추적을 위한 로그
  • 어플리케이션 개발시 자체적인 취약성으로 발생할 수 있는 불법적인 접근을 차단하기 위해 개발 단계부터 보안 취약성을 고려한 개발
[데이터 보안]

  • 접근제어
    강력한 인증 시스템 필요
    모든 커넥션에 대한 접근 통제

  • 권한관리
    세부적인 권한 제어
    완벽한 통제를 위한 미리 등록된 SQL만 수행이 가능하도록 하는 기능

  • 데이터 암호화
    정보는 모두 암호화하여 저장
    암호화를 풀 수 있는 권한은 DB관리자에게는 주지 않고 보안 담당자만 가능하도록 함
    DB관리자나 시스템 관리자들이 사용하는 모든 툴은 서버와 통신을 할 때 데이터를 암호화

  • 감사
    사고 원인 추적을 위해 DB에서 사용된 SQL을 모두 기록하고 원하는 것을 추출할 수 있어야 함
    보안 규칙 위반시 경고할 수 있어야 함

[경계선 보안]

  • 시설 접근 통제
    잠금 장치

  • 인적 접근 통제
    piggybacking에 대한 예방, 마그네틱 카드
    [piggybacking - 승인된 사용자나 사람이 들어가는 경로를 몰래 같이 들어 가는 것으로 출입문이 열려 있을때 재빨리 들어가는 방법, 또는 전송회선이나 전화선에 인가된 경로로 비 인가된 라인을 연결하여 도청하는 방법 등을 의미]

  • 외부 경계 보호 매커니즘

[물리적 보안]
  • 관리적 통제
    시설선택 또는 건설
    시설관리
    인적 통제
    훈련, 비상 대응 및 절차

  • 기술적 통제
    접근 통제
    침입탐지, 경보, 모니터링
    난방, 통풍, 공기조절 통제
    전력공급
    화재 탐지 및 진압
    백업
    HVAC(Healing, Ventilating, and Air Conditioning)

  • 물리적 통제
    담장
    잠금 장치
    조명, 시설 건축 자재

1.3 인터넷 서비스 구성

[인터넷의 구성요소]

  • WWW (World Wide Web)
    초기 : 정적인 링크를 이동, 정적인 데이터 (HTML 문서)
    현재 : 동적인 데이터의 필요성, 웹을 이용한 데이터 처리
    최신 : Web 2.0 참여와 공유를 통한 정보의 유통

  • Hyper Text
    60년대에 테드 넬슨이 만들어낸 신조어
    다른 문서와 연관관계를 가지는 텍스트를 의미
    하이퍼텍스트를 이용하면, 문서를 읽는 사용자는 단어나 문구를 마우스를 클릭하여 관련제에 대한 정보를 추가로 얻을 수 있다.

  • HTML (Hyper Text Markup Language)
    하이퍼텍스트를 효과적으로 전달하기 위한 언어

  • HTTP (Hyper Text Transfer Protocol)
    웹서버와 웹 브라우저간에 정보를 교환할 목적으로 사용되는 프로토콜

[HTTP Protocol]

  • Stateless Protocol
    이전 상태를 기억하지 못함
    접속을 요청하는 사용자에게 서비스를 제공하고 즉시 세션을 끊음으로써 또 다른 요청을 처리할 수 있는 장점(효율적인 통신이 가능)
    쿠키 또는 세션 정보를 이용하여 사용자의 인증 정보를 유지
    FTP나 Telnet처럼 한번 접속하면 접속을 끊을 때까지 연결된 상태를 유지하는 것이 아니고, 요청이 있을 때 접속을 연결한 다음 응답을 받고 나면 접속을 끊는 프로토콜임

  • HTTP Version
    ▷ HTTP/0.9
    단순한 서버로부터의 읽기 기능만 지원


    ▷ HTTP/1.0
    하나의 문서에 그림이 하나 있더라도 최초 텍스트가 저장된 HTML 문서를 전송 받고 난
            뒤 연결을 끊고, 그림을 받기 위해 다시 연결을 설정 한 후 그림을 전송 받는다.

    ▷ HTTP/1.1
    2001년 공식적으로 출시
    연속된 연결 요청이 있을 경우에 HTML 문서를 받고 난 후 연결을 끊지 않고 바로 그림 파
            일을 요청한다
    HTTP/1.0 에 대해 추가된 내용
    - 계층적이지 않은 프락시 지원
    - 캐시의 지원
    - 부적절한 지속적인 연결과 가상 호스트 통제
    URL 형태
    1.0버전과 다른 가장 큰 특징은 질의를 통해 데이터를 전송하는 것을 지원한다는 것이다.
    동적인 웹 어플리케이션의 주요 부분이긴 하지만 공격의 주요 부분이 되기도 한다. 실제
    로 공격자들이 가장 좋아하는 공격 부분이 이 질의를 하는 부분이다.
[HTTP Request]

  • 구성
    GET http://localhost:8080 HTTP/1.0
    Accept: */*
    Referer: http://localhost:8080/sample/board/List.jsp
    Accept-Language: ko
    Content-Type: application/x-www-form-urlencoded
    Proxy-Connection: Keep-Alive
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1
    .4322; InfoPath.2) Paros/3.2.13
    Host:localhost:8080
    Content-length:0
    Pragma: no-chache
    Cookie: JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • Request 메소드
    - GET
       요청받은 정보를 검색해 온다.
       브라우저의 URL 창에 전달 변수 값이 보인다.
       보낼 수 있는 데이터의 크기가 최대 4KB

    - POST
       서버가 동봉된 정보를 받아들이고, 서버에서 동작하도록 하는 요청을 한다.
       URL에 요청 데이터를 기록하지 않고, 소켓을 이용해 데이터를 전송.
       보낼 수 있는 데이터의 크기 제한 없음

    - CONNECT
       HTTP/1.1 추가 요청 방식
       동적 모드로 터널 모드를 교환 할 수 있는 능력을 가진 프록시를 사용한다.

    - DELETE
       HTTP/1.1 추가 요청 방식
       명시된 리소스를 서버가 삭제 할 것을 요청한다. 기본적으로 이 기능은 대부분의 서버에서 비
       활성화 되어 있다.

    - HEAD
       GET 방식과 거의 같지만 요청받은 자료를 되돌려 주지 않는다.
       서버 측의 데이터를 검색하고 요청하는데 사용된다.

    - OPTIONS
       요청 받은 리소스에서 가능한 통신 옵션에 대한 정보를 요청한다.
       만일 "*"가 사용되면 요청받은 리소스는 일반적이라고 여겨지고, 오직 일반적인 것만 허용하
       는 이 요청 방식으로 응답한다.
       예를 들어 "*"를 사용하는 것은 오직 GET, HEAD, OPTIONS, TRACE 요청방식에서만 볼 수
       있다. 그러나 "/"는 모든 요청방식에서 허용한다.
       헤커들의 관점에서 상당히 유용한 정보를 제공해 줌

    - PUT
       내용이 제공되는 리소스에 저장되기를 바라는 요청

    - TRACE
       루프백 메시지를 위한 요청을 송신한다.
       요청은 목적서버로 송신되지만 프록시가 대신 응답하기도 한다.
       클라이언트가 보내는 요구 메시지가 거쳐가는 프록시나 게이트웨이의 중간 경로 및 최종 수
       신 서버까지 이르는 경로를 알아내는 데 쓰인다.

[HTTP Response]

  • 구성
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=EUC-KR
    Content-Length: 1866
    Date: Wed, 04 Jun 2008 06:39:03 GMT
    Connection: close

  • HTTP Response Code
    - 100번대 : 정보전송
    - 200번대 : 성공
    - 300번대 : 리다이렉션
    - 400번대 : 클라이언트 측 에러
    - 500번대 : 서버측 에러

[웹 프록시]

HTTP 프록시는 인터넷 사용자가 자신의 IP 주소를 숨김으로써 자신의 온라인 ID를 변장하는 데 사용될 수 있다. 즉, 사용자가 웹 서핑을 익명으로, 일종의 게이트웨이 역할을 수행하여 완전히 익명 사용자의 IP 주소 아래 웹사이트를 방문할 수 있도록 할 수 있다. 그러나 안전하지 않은 HTTP 프록시가 있다. 일부 열려있는 HTTP 프록시들 중에는 불법 복제 시도와 사기 등에 사용자가 노출될 수 있다.

[소개] 멀티 코어를 100% 활용하는 자바 병렬 프로그래밍

——————————————————————————————————————————————
저자 : 브라이언 케츠, 더그 리, 팀 피얼스, 조셉 보우비어, 데이빗 홈즈, 조슈아 블로쉬
역자 : 강철구 출판사 : 에이콘 ISBN : 978-89-6077-048-5
가격 : ₩35,000
——————————————————————————————————————————————
[목차]

펼쳐두기..



[소개] 웹 어플리케이션 보안

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

저자 : 허진경, 박승규 출판사 : 연학사
ISBN : 978-89-7000-404-4 가격: ₩18,000
——————————————————————————————————————————————
[목차]

펼쳐두기..


[01] 제1장 이클립스 SWT

제1장 이클립스 SWT

리치 클라이언트의 귀환

21세기로 넘어 오면서 웹 브라우져를 필두로 하여 웹페이지, 웹서버, CGI, 웹 애플리케이션과 같은 thin 클라이언트가 PC의 기본 플랫폼이 되었으며 많은 유지보수이슈와 무거운 동작성이라는 약점을 안고 리치클라이언트는 점점 사라져 갔다.
...
...
그러나 사용자 들은 점점 thin 클라이언트를 사용하면서 빈약한 사용자 체험, 웹 엔트로피의 증가, 다양한 플랫폼 및 다중 웹 브라우저에 대한 지원 부족 등의 문제들과 같은 제약을 뛰어 넘기 위해 DHTML, 자바스크립트, 액티브 X 컨트롤, 플래시가 범람하게 되었으며 이로 인해 thin 클라이언트는 다시 무거워 지기 시작했다.
...
이에 다시 리치 클라이언트가 귀환하게 되었으며, 각각의 비지니스 요구에 따라 thin 클라이언트와 Rich 클라이언트는 상호보완적 관계를 맺게 되었다.

리치 클라이언트 어플리케이션으로 일반적인 특징
  • 내부 인트라넷 애플리케이션 (사용자가 수백, 수천명으로 한정되어 있다.)
  • 폰트, 컬러, 위젯 등 UI에 대한 엄격한 요구사항이 존재
  • 파워유저 및 전문적인 이용자가 사용함으로 단축키 등의 빠른 반응을 필요
  • 매우 큰 데이터 셋을 갖고 있으며, 스크린에 많은 정보를 표시
  • 데스크탑과 다른 데스크탑 어플리케이션을 통합
  • 워크플로 유형 또는 협업 유형의 어플리케이션으로, 오픈라인에서 작업할 수 있는 환경이 중요

이클립스 리치 클라이언트 플랫폼
1. 이클립스 RCP
이클립스를 구성하는 컴포넌트와 이클립스 RCP를 구성하는 컴포넌트

이클립스RCP의 기본적인 구성 컴포넌트


2. 이클립스 RCP 리치 클라이언트 애플리케이션
리치클라이언트의 특징
  • 사용자 편의성을 높인 풍부한 사용자 체험제공
  • 플랫폼 독립적 실행
  • 하부 운영체제의 네이티브 위젯을 사용하여 네이티브 룩앤필을 제공
  • 드래그 & 드롭 기능과 같은 고급 사용자 인터페이스 제공
  • 통합된 업데이트 방식 제공
  • 확장성 제공

3. 이클립스 플러그인 아키텍처
이클립스 플러그인 아키텍쳐


4. 플러그인 vs. 제품

독립 어플리케이션인 스탠드얼론을 이클립스 RCP에서는 제품이라는 호칭으로 불린다.

5. 이클립스 SWT와 JFace

Standard Widget Toolkit는 다중 플랫폼에서 네이티브 리치 클라이언트 어플리케이션을 개발하기 위한 이클립스 컴포넌트로서 일종의 라이브러리이며 JFace는 SWT 코드의 반복과 복잡함을 간단하게 처리할 수 있도록 하기 위해 개발되었다.

이클립스 SWT

[02]제2장 제품 백로그 만들기

제2장 제품 백로그 만들기

제품 백로그는 우선순위가 매겨진 고객이 원하는 것(요구사항)에 대한 목록이며 이 백로그가 스크럼의 핵심이다. 고객이 원한는 것은 다른 말로 스토리 또는 백로그 아이템이라고 부른다.

[01]제1장 들어가는글

제1장 들어가는글

... 스크럼은 방법론이 아니라 프레임워크다. ... 스크럼의 장점이자 단점은 처한 상황에 맞게 융통성을 발휘해야만 한다...

주의
... 이 책에 담긴 모든 것은 나의 개인적이고 주관적인 의견을 반영한 것으로, ...

이 책을 쓴 이유
...'정말로 여러분이 어떻게 해야하는지'... 나의 실전 경험을 풀어놓는다...

그런데 스크럼이 뭐지?

 가을생각 ♬

적지않은 프로젝트를 겪으면서 한두가지 개발방법론을 적용하며 여러 시행착오를 겪었다. 새로운 일을 할때마다 마음가짐을 달리하며 '이번에는 잘해야지!', '이번에는 저번처럼 하지말자!!'라는 각오를 가지며 일을 하지만 매번 시지프스의 바위굴리기처럼 같은 실수를 반복하고 만다. 반복적인 실패는 한개인의 마음가짐의 문제는 아닌것 같다. 이젠 체계적인 방법으로 문제를 해결하는 시각이 필요한 때인것 같다.

[소개] 지속적인 통합 - 소프트웨어 품질을 높이고 위험을 줄이기

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

저자 : 폴 M. 듀발, 스티븐 M. 마티야스, 앤드류 글로버 역자 : 최재훈
출판사 : 위키북스 ISBN : 978-89-92939-13-3
가격 : ₩22,000
——————————————————————————————————————————————
[목차]

펼쳐두기..


2009년 9월 28일 월요일

[JAVA]자바 웹 스타트

(1) 자바 웹 스타트

기존에 어플리케이션 개발자들은 프로그램을 배포하고 유지 보수하는 일에 있으서 매우 골치아파하였다. 즉, 새로운 버젼의 소프트웨어가 출시되었을때 모든 사용자 컴퓨터에 설치된 소프트웨어를 업데이트하는 것은 쉽지 않은 작업이다. 이르 위해 선 마이크로시스템스에서는 자바 웹 스타트 기술을 개발하였으며  이 기술은 최종 사용자의 컴퓨터에 자바 어플리케이션을 배포하고, 유지보수하고, 업그레이드하는 작업을 획기적으로 간단하게 해 준다.

(2) 웹으로 어플리케이션 시작하기

자바 웹 스타트는 어플리케이션을 실행하기 위한 기본적인 툴로서 웹 브라우저를 사용하여 로컬에 선의 자바 런타임 환경에 포함되어 있는 자바 웹 스타트 클라이언트 프로그램을 이용하여 어플리케이션을 사용자의 컴퓨터에 설치한다. 사용자가 JNLP(Java Network Launching Protocol)파일을 엑세스할 때마다 자바 웹 스타트 클라이언트는 해당 어플리케이션을 자동으로 사용자의 컴퓨터에 다운로드하고 실행한다.

(3) 자바 웹 스타트 배포를 위한 보안 및 사이닝

SWT에서는 대부분의 실질적인 윈도우 그래픽 작업을 네이티브 운영체제에서 제공하는 기능을 그대로 사용하고 있어 로컬 컴퓨터의 파일 시스템, 시스템 라이브러리, 그리고 그래픽 자원과 같은 여러 시스템 자원을 엑세스할 수 있어야 하므로 이를 위해 어플리케이션을 구성하는 모든 JAR파일들을 반드시 디지털 사인을 해 주어야 한다. 따라서 상용제품은 공신력있는 베리사인 또는 서트 등과 같은 인증서 발급 회사로부터 인증서를 받기를 권장한다.

JDK에서 기본적으로 제공하는 툴을 이용하여 자체 인증서를 만들어 발급할 수 있다.

intsystem라는 사용자가 인증하는 인증서를 만들어  'certkey'파일에 저장한다.

keytool -genkey -keystore certkey -alias intsystem
keystore 암호를 입력하십시오: intsystem
이름과 성을 입력하십시오
[Unknown] : expert xml
조직 단위 이름을 입력하십시오.
[Unknown] : intsystem
조직 이름을 입력하십시오.
[Unknown] : RnD
구/군/시 이름을 입력하십시오.
[Unknown] : Seoul
시/도 이름을 입력하십시오.
[Unknown] : Seoul
이 조직의 두 자리 국가 코드를 입력하십시오.
[UnKnown] : 82

<intsystem>에 대한 키 암호를 입력하십시오.
(keystore 암호와 같은 경우 RETURN을 누르십시오.): intsystem0423

※ certkey 인증서 파일 내의 목록을 리스트하여 보기

keytool -list -keystore intsystem
keystore 암호를 입력하십시오: intsystem0423

(4) JNLP 파일 만들기

SWT 어플리케이션을 개발, 배포, 배치를 위한 자바 네트워크 론칭 프로토콜(JNLP) 스펙은 JCP(Java Community Process)에 의해 관리된다.

JNLP 파일은 자바 웹 스타트에서 자동 배포될 모듈에 대한 정보 및 어떻게 배포될 것인가에 대한 정보를 기술해 주는 파일이다. 즉 자바 웹 스타트 클라이언트는JNLP파일을 열어보고, JNLP파일에 기술된 대로 자바 어플리케이션을 구성하는 JAR파일 및 자원들을 다운로드하고, 로컬 컴퓨터에 있는 자바 가상 머신에서 JNLP에 설정된 메인 클래스를 실행한다.

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://localhost:8080/fileviewer" href="index.jnlp">
    <information>
        <title>File Viewer</title>
        <vendor>IBM developerWorks</vendor>
        <homepage href="index.html"/>
        <description>File Viewer</description>
        <description kind="short">File Viewer</description>
    </information>
    <security>
        <all-permissions />
    </security>
    <resources>
         <j2se version="1.4" />
         <jar href="lib/fileviewer.jar" />
         <nativelib href="lib/nativelib/nativelib.jar" />
    </resources>
    <resources>
         <jar href="lib/swt-win32.jar" />
    </resources>
    <resources>
         <jar href="lib/swt-linux.jar" />
         <jar href="lib/swt-pi.jar" />
    </resources>
    <!-- application-desc 엘리먼트 -->
    <!-- 'main-class' 속성을 이용하여 배포하는 자바  어플리케이션의 메인 클래스를 지정 -->
    <!-- 자바 웹 스타트 클라이언트는 이 메인 클래스를 실행하므로 반드시 지정해야 한다. -->
    <application-desc main-class="org.eclipse.swt.examples.fileviewer.FileViewer" />
</jnlp>

셈플1. JNLP 구현파일 [출처: 이클립스 SWT, 성인당]

※ 웹서버에 있는 JNLP 파일을 제대로 클라이언트가 다운로드 하려면 JNLP 확장자의 파일에 대한 마임 타입을 설정해 주어야 한다.

application/x-java-jnlp-file JNLP


[JAVA]JAVA 프로그램을 Windows에서 실행가능한 EXE로 만들기

(1) JSmooth를 이용한 EXE 파일 만들기

JSmooth는 JAR 형태의 자바 프로그램을 실행하기 위한 EXE형태의 윈도우 실행 파일을 만들어 주는 프로그램이다. 즉, EXE 래퍼 프로그램을 더블 클릭하여 실행하기만 하면 윈도우는 자신의 컴퓨터에 설치된 적당한 자바 런타임을 찾아 자바 프로그램을 실행해 준다. 만약 실행 가능한 자바 런타임이 없을 경우 사용자에게 다이얼로그 창을 띄워 자바 런타임을 다운로드 할 수 있도록 해 준다.






(2) JSmooth 사용방법

그림1. JSmooth 실행하면

  • Skeleton 설정 : 생성할 EXE 래퍼 프로그램을 콘솔 전용 또는 윈도우 전용으로 생성할지 여부를 설정하고, 자바 런타임이 없을 경우 필요한 파라미터 값을 설정한다.
  • Executable 설정 : 생성할 EXE 래퍼 프로그램의 실행 파일 이름, 아이콘, 실행 디렉토리 등의 정보를 설정한다.
  • Application 설정 : 메인 클래스, 명령 행 매개변수, 포함할 JAR 파일, 클래스 패스 등과 같은 자바 애플리케이션에 대한 정보를 설정한다.
  • JVM Selection 설정 : 자바 가상 머신의 최소/최대 버전, 번들로 포함할 경우 자바 가상 머신의 위치, 시스템에서 자바 가상 머신을 찾는 순서 등의 값을 설정한다.
  • JVM Configuration 설정 : 자바 가상 머신의 최대 메모리 크기, 시작 메모리 크기, 자바 가상 머신을 위한 프로퍼티 등을 설정할 수 있다.


[JAVA]내가 만든 JAVA 소스를 보호하자 - ProGuard

(1) 필요성

자바에서 *.class 파일 형태의 자바 바이트 코드는 역컴파일러 툴을 사용하여 쉽게 자바 클래스 파일을 소드 코드로 변환하는 것이 가능하다. 이를 방지하기 위해 일반적으로 자바 소프트웨어를 배포하기 전에 클래스 파일을 어퓨스케이트(obfuscate) 한다.

(2) 오픈소스 ProGuard

입력 JAR파일(WAR, EAR, ZIP, 또는 디렉토리)을 읽어 축소, 최적화, 어퓨스케이션 작업을 한 후 하나 이상의 출력 JAR파일을 생성한다.

프로가드는 명령 행에서 사용할 수 있는 툴로서 앤트를 이용한 빌드 자동화 프로세스체 추가하여 사용할 수 있다. 프로가는 미들릿, 애플릿, 자바 애플리케이션은 물론 SWT 애플리케이션까지 어퓨스케이트 할 수 있다.

일반적으로 앤트 자동화 프로세스에 어퓨스케이트하는 과정을 추가하여 빌드한다.

http://sourceforge.net/projects/proguard/ 홈페이지에서 다운로드 한다.

2009년 9월 24일 목요일

[우분투]Tomcat 설치

(1) 필요한 패키지 다운로드

$sudo apt-get install tomcat5.5 sun-java6-jdk tomcat5.5-webapps tomcat5.5-admin 

(2) 우분투 기본 자동 설정 수정

$sudo update-alternatives --config java
...
몇가지 목록중 /usr/lib/jvm/java-6-sun/jre/bin/java 를 설정

(3) Tomcat 설정파일에서 JAVA_HOME 변수의 위치를 설정

$sudo nano /etc/default/tomcat5.5
...
JAVA_HOME=/usr/lib/jvm/java-6-sun/

(4) Tomcat 기동, 정지, 재기동

$sudo /etc/init.d/tomcat5.5 start => 기동
$sudo /etc/init.d/tomcat5.5 stop => 정지
$sudo /etc/init.d/tomcat5.5 restart => 재기동

(5) 기본 포트
     Tomcat의 기본포트가 8080이 아니라 8180이다. (주의!)

(6) 톰켓의 경로
     기본 설치 경로는 /var/lib/tomcat5.5 이다.

2009년 9월 23일 수요일

[개발환경]Hudson에 대한 접근

1. 들어가며

지속적인 통합시스템(Continuous Integration System) 중 오픈소스 진영의 대명사인 Hudson에 대한 심도있는 학습을 진행한다.
관련 홈페이지는 https://hudson.dev.java.net/ 이다.

1.1 Hudson이 뭐지?
     Hudson은 반복적인 작업 실행을 관리해주는 도구이다. 특히 다음 두가지 작업에 촛점이 맞추어져
     있다.
  • 지속적인 소프트웨어 빌드와 테스팅
  • 영구적인 작업에 대한 실행 모니터링
     이런 특징을 바탕으로 빌드관리, 릴리즈관리, 배포자동화, 테스트통합에 응용될 수 있는 대표적인
     툴이다.

1.2 우분투에 설치
    
    

펼쳐두기..


     /etc/apt/sources.list 에 다음을 추가한다.
     ...
     deb http://hudson-ci.org/debian binary/
    
     $sudo apt-get update
     $sudo apt-get install hudson daemon
    


[방법론]스크럼, XP, 애자일 .. 이모든 방법론은 현실화를 위해 part1

1. 들어가며
최근 방법론에 대한 책을 많이 섭렵하고 있다. 여러번의 프로젝트 실패(?)와 프로젝트의 방법적 모순을 실감하면서도 쉽게 무언가를 변화시키기에는 항상 이론적 배경의 부재로 좌절하고 때로는 게으른 매너리즘에 빠져 허우적되면서 실천하지 못했던 일을 이론적 학습을 통해 다시 한번 열정을 가을하늘로 띄워보고자 한다.

[소개] 스크럼 : 팀의 생산성을 극대화시키는 애자일 방법론

——————————————————————————————————————————————
저자 : 켄 슈와버, 마이크 비들 역자 : 박일, 김기웅
출판사 : 인사이트 ISBN : 978-89-91268-47-0
가격 : ₩18,000
——————————————————————————————————————————————
[목차]

펼쳐두기..



[우분투]PHP 업로드 사이즈 증가

(1) php 업로드 사이즈 증가

$sudo vim /etc/php5/apache2/php.ini
...
upload_max_filesize=4M
...

(2) 아파치 재기동

$sudo /etc/init.d/apache2 restart



2009년 9월 22일 화요일

[우분투] trac DB를 SQLite에서 Mysql로 변경

(1) 데이터 베이스 생성

$sudo mysql -u root -p mysql
...
mysql>CREATE DATABASE trac DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

(2) 데이터 베이스 사용자 등록

mysql>CREATE USER tracuser IDENTIFIED BY 'intsystem'; mysql>GRANT ALL ON trac.* TO tracuser;

(3) python 연동 모듈 설치

$sudo apt-get install python-mysqldb


(4) Trac과 연동

$sudo trac-admin KLRI initenv
#프로젝트  입력
$Project Name [My Project]> KLRI
#DB 연결 설정
$Database connection string [sqlite:db/trac.db]>
mysql://tracuser:intsystem@192.168.1.101/trac
#소스 저장소 타입 설정
$Repository type [svn]> 엔터
#저장소 경로
$Path to repository [/path/to/repos]> /usr/svn-project/KLRI

(5) 변경이 안될 경우 trac.ini 수정

$sudo nano /usr/trac/KLRI/conf/trac.ini
...
[trac]
...
database=mysql://tracuser:intsystem@192.168.1.101:3306/trac
...
#저장후
$sudo /etc/init.d/apache2 restart


[우분투] trac 설치

(1) Trac 설치

$sudo apt-get install trac libapache2-mod-python python-setuptools

(2) 신규 저장소 생성

$sudo mkdir /usr/svn-project/KLRI
$sudo svnadmin create /usr/svn-project/KLRI

(3) Trac 설정

Trac 으로 관리할 프로젝트를 만든다. /usr/trac 디렉토리를 만들고 여기에 Trac 프로젝트를 만든다.
DB는 SQLite를 사용하며, 소스 저장소는 Subversion을 사용, 웹브라우저에서 접근 가능하도록 설정

$sudo mkdir –p /usr/trac
$cd /var/lib/trac
$sudo trac-admin KLRI initenv
#프로젝트  입력
$Project Name [My Project]> KLRI
#DB 연결 설정
$Database connection string [sqlite:db/trac.db]> 엔터
#소스 저장소 타입 설정
$Repository type [svn]> 엔터
#저장소 경로
$Path to repository [/path/to/repos]> /usr/svn-project/KLRI
$sudo chown -R www-data.www-data /usr/svn-project

설정 성공시 "Congratulations!" 문구가 나오면 성공적으로 설정완료

(4) Trac 관리자 계정 설정
관리자 계정 설정위한 사용자를 먼저 등록한다.

$sudo htpasswd -c /etc/apache2/dav_svn.passwd intsystem => 최초 등록시에만 -c 옵션
$sudo htpasswd /etc/apache2/dav_svn.passwd septemberman

$sudo trac-admin /usr/trac/KLRI permission add intsystem TRAC_ADMIN

(5) Trac 프로젝트 수정

 Trac 프로젝트 별 설정은 프로젝트에 conf 디렉터리의trac.ini 를 수정해서 조정

[header_logo] => 프로젝트 홈 URL 수정
alt=
height=-1
link=http://192.168.1.101/KLRI
src=common/trac_banner.png
width=-1

(6) dav_svn_conf 수정

$sudo nano /etc/apache2/mods-available/dav_svn.conf
<Location /svn>
   DAV svn
   SVNParentPath /usr/svn-project
   SVNListParentPath on
   AuthType Basic
   AuthName "Subversion Repository"
   AuthUserFile /etc/apache2/dav_svn.passwd
   Require valid-user
</Location>

(7) Trac 위한 설정

$sudo nano /etc/apache2/sites-available/default
...
<VirtualHost *:80>
   ServerName trac.taekgeun.com
   <Location />
      SetHandler mod_python
      PythonHandler trac.web.modpython_frontend
      PythonOption TracEnvParentDir /var/lib/trac
      PythonOption TracUriRoot /
   </Location>
   <LocationMatch "[^/]+/login">
      AuthType Basic
      AuthName "Trac Authentication"
      AuthUserFile /etc/apache2/dav_svn.passwd
      Require valid-user
   </LocationMatch>
</VirtualHost>

2009년 9월 21일 월요일

자전거 판매합니다

아내의 자전거 ...
선물받은 자전거를 임신과 출산으로 열번도 못타고 내어 놓는다..

제품은 스포시엘 Fleecy, 폴딩자전거로 유명한 자전거다. (절대 싸구려 자전거는 아니다.)

[비슷한 사양인 스포시엘 캐쥬얼은 구글링을 통해 쉽게 찾을 수 있다...]



 ==> 앞에서 본 모습...


==> 옆에서 본 모습 (미니벨로의 아담한 사이즈)


==> 거의 타지 안았음을 증명하는 타이어 상태(마모 제로...)


==> 기어의 대명사인 시마노 기어


==> 앞축과 패달 상태 (역시 거의 타지 안았음을 입증함 ... 기어에 때하나 없음)


==> 폴딩이 가능한 구조 (간혹 지하철을 탈때로 용이함)


==> 탈부착이 가능한 장바구니 (마트에도 가야지... )


==> 뒤에서 본 모습(뒷 받침대도 깔끔함)


==> 높낮이 조절이 가능한 안장



=> 장바구니 분해

==> 장바구니 분해



==> 나사 풀기(풀어진 상태로 배송)


==> 접힌상태와 배송 물품 (장바구니 + 잠금장치)


[JAVA]Apache Ant 사용하기

Ant에 대한 자세한 정보는 아파치 자카르타 앤트 프로젝트 사이트를 참고

<build.xml> 셈플파일

펼쳐두기..



# build.xml 파일의 기본구조

<?xml version="1.0" encoding="euc-kr"?>
<project name="projectName" default="defaultTargetName" basedir=".">
 <property name="" location=""/>
 <target name="">...</target>
 <target name="" depends="">...</target>
 <target name="" depends="">...</target>  
 <target name="" depends="" if="">...</target>
 <target name="" depends="" unless="">...</target>  
</project>

# project 태그
 1) name : 프로젝트의 이름
 2) default : Ant를 실행할때 target을 지정하지 않은 경우 기본적으로 사용할 target (필수)
 3) basedir : 경로 계산할때의 기준 디렉토리. 지정하지 않은 경우 현재 디렉토리가 basedir로 사용된다. basedir 프로퍼티의 값으로도 사용된다.

# target 태그
 1) name : 타켓의 이름 (필수)
 2) depends : 이 타겟이 의존하고 있는 타겟의 목록. 각 타켓의 이름은 ,(콤마) 로 구분한다.
 3) if : 지정한 프로퍼티가 설정되어 있는 경우 이 타겟을 수행한다.
 4) unless : 지정한 프로퍼티가 설정되어 있지 않은 경우 이 타겟을 수행한다.
 5) description : 타겟이 수행하는 기능에 대한 설명
 
# ant 경로 규칙 
 1) * : 0개 또는 그이상의 글자가 매칭
 2) ? : 한글자와 매칭
 3) ** : 다계층을 나타냄  예) dir/**/A => dir/dir1/A, dir/dir2/A, dir/dir1/dirA/A 다 포함.
 4) / 또는 \ 으로 끝날 경우  : /** 또는 \** 과 동일
 
# includes 속성 : 포함시킬 파일의 목록 (include 태그, includesfile 속성으로 사용 가능)

# excludes 속성 : 제외시킬 파일의 목록 (exclude 태그, excludesfile 속성으로 사용 가능)

# excludes 속성 명시 여부에 상관없이 제외 되는 것들 : 제외 시키고 싶지 않을 경우 defaulteexcludes = "no" 설정
 - **/*~, **/#*#, **/.#*, **/%*%, **/._*
 - **/CVS, **/CVS/**, **/.cvsignore
 - **/SCCS, **/SCCS/**
 - **/vssver.scc
 - **/.svn, **/.svn/**
 - **/.DS_Store

# fileset 태그 : 파일 집합
 1) dir : 파일 집합을 표시할 때의 루트 디렉토리 (dir 또는 file 중 한개 반드시 명시)
 2) file : 한 개의 파일을 명시할 때 사용하는 속성  (dir 또는 file 중 한개 반드시 명시)
 3) casesensitive : 대소분자 구분 여부 (true/false) 기본값 true
 4) followsymlinks : 심볼릭 링크를 따라갈지의 여부 (true/false) 기본값 true)
  사용 예)
 <fileset dir="${basedir}/src" defaultexcludes="no">
  <include name="**/*.java"/>
  <include name="**/*.properties"/>
  <exclude name="**/*.bak"/>
 </fileset>

# dir 태그 : 디렉토리 집합
 1) dir : 디렉토리 집합을 표시할 때의 루트 디렉토리 (필수)
 2) casesensitive : 대소분자 구분 여부 (true/false) 기본값 true
 3) followsymlinks : 심볼릭 링크를 따라갈지의 여부 (true/false) 기본값 true)
  사용 예)
 <dirset dir="" includes="" excludes=""/>
 
# patternset 태그 : 재사용 가능한 파일 집합
 사용 예)
 <patternset id="commonJar">
  <include name="servlet.jar"/>
  <include name="mail.jar"/>
  <include name="activation.jar"/>    
 </patternset>
 
 <fileset dir="j2eelib">
  <patternset refid="commonJar"/>
 </fileset>
 
# path 태그 : 재사용 가능한 경로 목록의 집합
 사용 예)
 <path id="project.class.path">
  <pathelement location="fileupload/WEB-INF/classes"/>
  <pathelement path="lib/servlet.jar;lib/commons-fileupload-1.0.jar"/>
 </path>
 
 <classpath refid="project.class.path"/>
 
 - location : 하나의 파일 또는 디렉토리 지정
 - path : 여러 경로를 지정 (; 또는 : 으로 구분)


# 아래의 build.xml 파일에서 ant makeZip 을 할경우 complie 은 두번이 아닌 한번만 실행되게 된다.
 <project name="build" default="makeZip" basedir=".">
  <target name="compile"/>
   <target name="srcCopy" depends="compile"/>
   <target name="classCopy" depends="compile"/>
   <target name="makeZip" depends="srcCopy, classCopy"/>
 </project>

# property 태그 : property 지정
 1) name : 프로퍼티의 이름
 2) value : 프로퍼티의 값을 지정 (name 속성 지정시 value 또는 location 둘중 하나 반드시 사용)
 3) location : 지정한 경로명의 절대 경로명을 값으로 지정 (name 속성 지정시 value 또는 location 둘중 하나 반드시 사용)
 4) resource : 프로퍼티 파일을 읽어 올 때 사용할 자원명을 지정 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 5) file : 지정한 파일로부터 프로퍼티 목록을 읽어 온다 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 6) environment : 환경 변수를 읽어 올때 사용할 접두어를 지정 (name 속성 사용않는 경우 resource, file, environment 중 하나 반드시 사용)
 7) classpath : 자원으로부터 프로퍼티 파일을 읽어 올 때 사용할 클래스 패스
 8) classpathref : 클래스패스로 사용할 경로를 path 태그 로 부터 가져온다.
 9) prefix : resource 또는 file 속성을 사용하여 읽어 온 프로퍼티를 참조할 때 사용할 접두어를 지정한다. 만약 접두어 맨뒤에 "." 가 포함되어 있지 않을 경우, 자동으로 "."이 접두어 뒤에 붙는다.
 사용 예)
 <property file="${basedir}/buildprop/global.properties"/>
 
 <property environment="env"/>
 <echo message="JAVA_HOME ${env.JAVA_HOME}"/>

# 기본 프로퍼티 : property 태그 사용하지 않아도 사용 가능한 프로퍼티
 - 모든 자바의 시스템 프로퍼티
 - basedir : 프로젝트의 기본 디렉토리의 절대 경로. project 태그의 basedir 속성에 명시된 값
 - ant.file : 빌드 파일의 절대 경로
 - ant.version : Ant 버전
 - ant.project.name : 현재 실행주인 프로젝트의 이름. project 태그의 name 속성에 명시된 값
 - ant.java.version : Ant 가 발견한 자바 버전.
 
# javac
 1) srcdir : 소스가 위치한 디렉토리 (src 태그로 지정가능. 둘 중 하나 필수)
 2) descdir : 생성된 클래스가 위치할 디렉토리를 지정. javac -d 옵션과 동일
 3) classpath : 컴파일할 때 사용할 클래스패스 (class 태그로 지정 가능)
 4) classapathref : path 태그로 지정한 경로를 클래스패스로 참조
 5) encoding : 소스파일의 인코딩을 지정. javac -encoding 옵션과 동일
 6) nowarn : 컴파일시 -nowarn 옵션 추가 (on) 기본값은 off
 7) deprection : 컴파일시 -deprecation 옵션 추가 (on) 기본값은 off
 사용 예)
 <javac srcdir="" descdir="">
  <classpath>
   <fileset>
    <patternset refid=""/>
   </fileset>
  </classpath>
 </javac>
 
# jar
 1) destfile : 생성할 jar 파일 지정
 2) basedir : jar 파일로 압축할 기본 디렉토리 지정

 사용 예)
  <jar destfile="${disc}/lib/app.jar" basedir="${build}/classes"/>
 
  <jar destfile="${disc}/lib/app.jar">
   <fileset dir="${build}/classes" exclude="**/test*.class"/>
   <fileset dir="${src}/resources"/>
  </jar>

# zip
 - 기본적으로 jar 사용법와 같이 사용 가능.
 - zipfileset 태그를 사용하여 압축되는 파일의 경로명을 변경할 수 있음.
 - zipfileset 의 속성
  1) prefix : ZIP 파일에 압축될 때 변경되어 들어갈 경로명
  2) fullpath : 특정 파일의 변경될 경로를 지정
  3) filemode : 유닉스 기반의 시스템에서 압축되는 파일의 모드를 지정. 기본값은 644
  4) dirmode : 유닉스 기반의 시스템에서 압축되는 디렉토리의 모드를 지정. 기본값은 775
 사용 예)
 <zip destfile="${dist}/example.zip">
  <zipfileset dir="build/api" prefix="docs/api"/>
  <zipfileset dir="${basedir}" includes="chang.log.20031227" fullpath="docs/chagelog.txt"/>
  <zipfileset dir="build/classes" prefix="classes"/>
  <zipfileset dir="build/src" prefix="src"/>
 </zip>

# war
  사용 예)
  <war destfile="main.war" webxml="src/metadata/web.xml">
   <fileset dir="src/mainapp/html"/>
   <fileset dir="src/mainapp/jsp"/>
   <lib dir="lib">
    <exclude name="logging2.jar"/>
   </lib>
   <classes dir="build/main/classes"/>
   <zipfileset dir="src/imagefile/images" prefix="images"/>
  </war>

# tar
 - 기본 사용 법 : <tar destfile="" basedir=""/>
 - tarfileset 태그
 - targileset 의 속성
  1) mode : 3자리 8진수값. 775 등의 값을 갖는다.
  2) username : 파일에 대한 사용자 이름을 지정한다. UID와는 다르다.
  3) group : 파일에 대한 그룹 이름을 지정한다. GID와는 다르다.
  4) prifix : tar 파일에 압축될 때 변경되어 들어갈 경로명
  5) fullpath : 특정 파일의 변경될 경로를 지정
  6) preserveLeadingSlashes : 맨 앞의 '/'를 유지할지의 여부를 지정. 기본값 : false
 사용 예)
 <tar destfile="${dist}/example.tar">
  <tarfileset dir="build/api" prefix="docs/api"/>
  <tarfileset dir="${basedir}" includes="chage.log.20031227" fullpath="docs/chagelog.txt"/>
  <tarfileset dir="build/classes" prefix="classes"/>
  <tarfileset dir="build/src" prefix="src"/>
 </tar>
 <gzip zipfile="${dist}/example.tar.gz" src="${dist}/example.tar"/>
 
 <tar destfile="${dist}/example.tar.gz" basedir="${build}" compression="gzip"/>

# javadoc
 1) sourcepath : 소스 파일의 경로 지정. 하위 디렉토리까지 모두 처리 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 2) sourcepathref : path 에서 지정한 경로를 소스 파일의 경로로 사용 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 3) sourcefiles : 소스 파일의 목록을 지정. 각 파일은 콤마(,)로 구분 (sourcepath, sourcepathref, sourcefiles 중 하나는 필수)
 4) destdir : 결과 파일이 생성될 디렉토리
 5) packagenames : 콤마로 구분된 패키지 파일의 목록. 패키지명이 *로 끝날 경우 그 하위 패키지까지 모두 처리한다.
 6) excludepackagenames : 문서를 생성하지 않을 패키지의 목록을 지정. 각 패키지는 콤마(,)로 구분. 패키지명이 *으로 끝날 경우 그 하위 패키지까지 모두 제외
 7) access : 접근 모드를 지정. public, protected, package, private 중 한 가지 값. 기본값 : protected
 8) public : 생성되는 API 문서에 public 클래스와 멤버만 보여준다.
 9) protected : 생성되는 API 문서에 protected/public 클래스와 멤버만 보여준다.
 10) package : 생성되는 API 문서에 package/protected/public 클래스와 멤버만 보여준다.
 11) private : 생성되는 API 문서에 private/package/protected/public 클래스와 멤버만 보여준다.
 12) encoding : 소스 파일의 인코딩을 명시.
 13) locale : ko_KR과 같이 사용할 로케일을 지정.
 14) charset : 생성된 문서를 보여줄 때 사용할 케릭터셋을 지정.
 15) version : @version 주석을 포함.
 16) author : @author 주석을 포함.
 17) nodeprecated : deprecated 정보를 포함하지 않는다.
 18) nodeprecatedlist : deprecated 목록을 생성하지 않는다.
 19) windowtitle : 문서를 위한 제목을 텍스트로 입력.
 20) overview : HTML 문서로부터 개략 문서를 읽어 온다.
 21) helpfile : 도움말로 사용할 HTML 파일을 지정.
 22) stylesheetfile : 스타일 시트로 사용할 파일을 지정.
 23) header : 생성될 HTML 파일의 헤더로 사용될 HTML 코드를 명시
 24) footer : 생성될 HTML 파일의 풋터로 사용될 HTML 코드를 명시
 
 사용 예)
 <javadoc destdir="{build}/api"
  sourcepath="src"
  packagenames="javacan.main.*"
  excludepackagenames="javacna.main.test.*"
  windowtitle="Main 웹 어플리케이션"
  encoding="euc-kr" />
 
 <javadoc destdir="{build}/api"
  windowtitle="Main 웹 어플리케이션"
  encoding="euc-kr">
  <packageset dir="src" defaultexcludes="yes">
   <include name="javacan/main/**"/>
   <exclude name="javacan/main/test/**"/>   
  </packageset>
 </javadoc>
 
# copy
 1) file : 복사할 파일을 지정 (fileset으로 복사할 파일 목록을 지정하지 않는 경우 필수)
 2) tofile : 복사될 파일을 지정
 3) todir : 원본을 복사할 디렉토리를 지정
 4) overwrite : 기존 파일 덮어쓰기 여부 (true/false) 기본값 : false
 5) preservelastmodified : 원본의 최종 수정 날짜 유지 여부(true/false) 기본값 : false
 6) includeEmptyDirs : 텅빈 디렉토리도 복사할지의 여부(true/false) 기본값 : true
 사용 예)
 <copy file="${workspace}/readme.txt.200312" tofile="${build}/readme.txt"/>
 <copy file="${workspace}/readme.txt.200312" todir="${build}"/>
 <copy todir="${build}/src">
  <fileset dir="${workspace}/src"/>
 </copy>
 
# mkdir
 사용 예)
 <mkdir dir="${build}/webapp/WEB-INF/classes"/>
 webapp/WEB-INF 또한 존재 하지 않는 경우 생성

# delete
 사용 예)
 <delete>
  <fileset dir="${build}"/>
 </delete>
 
 위의 경우 ${build} 와 그 하위 디렉토리의 모든 파일을 삭제. 그러나 디렉토리는 남아있음.(fileset 은 파일의 집합)
 아래와 같이 해주면 디렉토리도 전부 삭제
 
 <delete includeEmptyDirs="true">
  <fileset dir="${build}"/>
 </delete>
 
# ant : 또 다른 빌드 파일의 실행. 여러개의 서브 프로젝트로 구성되어 있을 경우 유용
 1) antfile : 사용할 빌드 파일을 지정. 명시하지 않을 경우 build.xml. dir 속성에 주어진 디렉토리에 대해 상대경로
 2) idr : 새로운 Ant 프로젝트의 basedir을 지정.
 3) target : 수행할 타켓을 지정
 4) output : 새로운 Ant 프로젝트의 수행 결과를 저장할 파일을 명시
 5) inheritAll : 새로운 Ant 프로젝트에 현재 Ant 프로젝트의 모든 프로퍼티 전달 여부(true/false). 기본값 : true
 6) inheritRefs : 새로운 Ant 프로젝트에 현재 Ant 프로젝트의 모든 참조 전달 여부(true/false). 기본값 : true
 사용예)
 <target name="makeSubProject">
  <ant dir="subproject/logging" target="prepare">
   <property name="module1.4" value="jdk1.4"/>
  </ant>
  <ant dir="subproject/common" target="prepare"/>
 </target>

# java
 1) classname : 실행할 클래스 이름 (classname, jar 둘중 하나 필수)
 2) jar : 실행할 jar 파일의 위치 (classname, jar 둘중 하나 필수)
 3) classpath : 사용할 클래스패스를 지정
 4) classpathref : 미리 지정한 path 태그를 참조
 5) fork : 세러은 가상머신에서 클래스 수행 여부 (true/false). 기본값 : false
 6) maxmemory : 포크된 가상 머신에 할당할 메모리의 최대 크기를 지정 (fork가 false인 경우 무시)
 7) dir : 가상 머신을 호출할 디렉토리 (fork가 false인 경우 무시)
 사용 예)
 <java classname="javacan.main.prepare.TableInitilizer">
  <classpath>
   <pathelement path="${java.class.path}"/>
  </classpath>
  <sysproperty key="module" value="test"/>
  <arg value="-init -d"/>
 </java>
 
# native2ascii : 유니코드로의 변환
 1) src : 변환할 파일들이 위치한 기준 디렉토리
 2) dest : 변환한 결과를 저장할 디렉토리
 3) encoding : 변환할 파일의 인코딩 (기본으로 JVM의 기본 인코딩 사용)
 4) reverse : 이스케이프된 유니코드를 지정한 인코딩을 사용하는 문자열로 변환.
 사용 예)
 <native2ascii src="${config}"
  dest="${build}/config"
  includes="**/*.properties"
  excludes="**/test/*.properties"
  encoding="EUC-KR"/>