· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linuxdoc Sgml/Java-CGI-HOWTO

Java CGI HOWTO

Java CGI HOWTO

by David H. Silber javacgi-document@orbits.com

1998년 12월 1일 버전 0.5 옮긴이: 박주희(jhpark@osnn.hanyang.ac.kr)
이 HOWTO 문서는 어떻게 자바로 작성된 CGI 프로그램이 서버에서 사용가능 하도록 설정 하며 또 CGI 프로그램을 작성하기 위해 어떻게 자바를 사용하는지를 설명한다. HOWTO 문서들은 리눅스 운영체제에서의 사용을 목적으로 작성되지만, 특정한 유닉스 버전에 상관 없이 적용된다.

1. 소개

자바가 디자인된 방식 때문에 프로그래머는 시스템의 환경 변수들을 쉽게 액세스할 수 없다. Java Development Kit (JDK)가 셋업된 방식 때문에, 프로그램을 호출하기 위해서는 여러 개의 토큰을 이용해야 하며, 이것도 표준 HTML폼/CGI 작동방식과 잘 맞지 않는다. 이러한 한계에 대한 몇 가지 방법이 있으며, 필자가 그 중 하나를 구현하였다.자세한 것은 뒤를 더 읽어보길 바란다. 이전의 문단을 1996년에 작성한 이래로 자바의 기술에도 많은 변화가 있어왔다. 서버-측(server-side) 자바 프로그램을 실행시키는 것이 더 나은 방법일 수 있으며 -- 서브릿쪽을 살펴보아도 괜찮을 것이다.

1.1 사전 지식

필자는 독자들이 HTML과 CGI 개념들에 관한 일반적 지식과 최소한의 HTTP서버에 관하여 기본적인 지식을 갖고 있다고 가정한다. 물론 자바로 프로그램을 작성하는 법을 알아야 하며 그렇지 못하면 이 문서는 이해하기 힘들다.

1.2 본 문서에 관하여

본 문서의 최근 판은 http://www.orbits.com/software/Java_CGI.html에서 읽을 수 있다.

1.3 패키지

본 문서에서 설명하는 패키지는 다음의 anonymous FTP에서 엑세스할 수 있다. ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz. 패키지에는 본 문서의 SGML 소스도 포함되어 있다. 본 패키지는 GNU Library General Public License 조항에 의거해 배포된다. 본 문서는 리눅스 HOWTO 판권(copyright) 주의사항에 의거해서 배포된다.

만약 본 소프트웨어를 사용한다면, 다른 사람들이 Java CGI클래스를 찾을 수 있도록 http://www.orbits.com/software/Java_CGI.html를 참조하기 바란다.

필자가 본 패키지를 유지하고 지원하는데 사용할 시간이 없어서 본 문서가 아마 마지막 판이 될 것이다. 아무라도 본 소프트웨어를 아끼어 유지보수를 인수하려 한다면, javacgi-document@orbits.com으로 연락 바란다.

1.4 메일링 리스트

사람들이 본 소프트웨어를 인스톨하고 사용하는데 있어서의 상호의 문제점들을 서로 돕고자 필자가 majordomo (역자주:메일링 리스트 메니저의 하나) 리스트를 만들었다. subscribe라는 말을 적어서 javacgi-request@orbits.com로 메시지를 보내기 바란다.

2. 자바 CGI프로그램을 실행하기 위해 서버 셋팅하기 (설명 첨부)

이 부분은 설치 작업이 어떤 영향을 끼치는지 여러분 자신이 알게 하기 위해 풍부한 설명과 함께 필자의 Java CGI 패키지를 인스톨 할 것이다. 만약 본 프로그램을 인스톨만 하고 왜인지 그리고 왜 그래야만 하는지에 대한 것은 신경 쓰 지 않는다면, 다음으로 넘어가라. 자바 CGI프로그램을 실행하기 위해 서버 셋팅하기 (요약).

2.1 시스템 요구사항

본 소프트웨어는 Java Development Kit이 인스톨된 대부분의 유닉스 형태의 웹 서버에서 작동할 것이다. 필자는 apache를 HTTP 데몬으로 실행시키며 Debian Linux를 사 용하고 있다. 만약 실행되지 않으면, 메일링 리스트를 찾아보길 바란다. 자세한 것은 메일링 리스트를 참조하라. 불행히도 자바 런타임 인터프리터는 메모리를 많이 필요로 하는 것 같다-- Java CGI 프로그램들을 여러 번 실행한다면 램이 더 필요할 것이다.

2.2 Java CGI 애드-온 소프트웨어

본 문서에서 설명하려는 소프트웨어는 Java CGI라고 한다. ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz에서 얻을 수 있다. 버전이 변했을지도 모른다.

2.3 소스 압축 풀기

본 패키지를 풀어 둘 적당한 디렉토리를 찾는다. (다른 패키지를 풀어 둔 일정한 곳이 없다면, /usr/local/src를 사용하라.) 다음의 명령으로 배포판을 푼다.

gzip -dc java_cgi-0.5.tgz | tar -xvf -
java_cgi-0.5디렉토리가 생성될 것이다.. 거기에 이 다음 단계부터 참조 파일이 있을 것이다. (버전이 바뀌었다면, 지금부터는 그 배포판의 설명을 참고하라)

2.4 지역 경로(local path)에 관한 방침을 정하라

Java CGI프로그램들을 어디에 둘지 결정한다. 보통, cgi-bin디렉토리에 같이 둘 것이다. 필자의 apache 서버는 cgi-bin 디렉토리로써 /var/www/cgi-bin을 사용하게 설정되어 있어서, Java CGI 프로그램들을 넣어둘 디렉토리로는 /var/www/javacgi를 사용한다. 지정된 CLASSPATH 디렉토리에 Java CGI 프로그램들을 깔고 싶지 않을 지도 모른다. 시스템 설정을 반영하기 위해 Makefile을 편집한다. root로 로그인 한 것을 확인하고 make install 을 실행한다. 이 명령이 자바 프로그램들을 컴파일하고, java.cgi 스크립트를 시스템에 맞게 변경하고 적당한 곳에 그 프로그램들을 인스톨한다. 추가로, 본 문서의 HTML 버전이나 HTML테스트 문서를 원한다면, 대신 make all 을 실행한다.

2.5 인스톨 테스트하기

배포판으로부터 인스톨된 것은 javacgitest.html, javaemailtest.htmljavahtmltest.html이라는 HTML문서들이다. 앞장에서 all로 인스톨했다면, Makefile에서 WEBDIR로 설정된 디렉토 리에 이 문서들이 있을 것이다. 그렇지 않다면 javacgitest.html-dist, javaemailtest.html-distjavahtmltest.html-dist로부터 빌드(build)하기 위해make test를 실행해 도 된다. 인스톨한 것이 정확하게 동작할 때, JAVACGI 디렉토리로부터 CGI_Test.class, Email_Test.classHTML_Test.class를, WEBDIR 디렉토리로 부터는 javacgitest.html, javaemailtest.htmljavahtmltest.html을 지우고 싶을지도 모른다. 보통 서버에게만 사용 가능한 사용자 정보를 보여주기 때문이다.

3. Java CGI 프로그램을 실행시키기 위하여 서버 세팅하기(요약형태)

  • ftp://ftp.orbits.com/pub/software/java_cgi-0.5.tgz로부터 Java CGI패 키지를 얻는다. (버전이 변했을지도 모른다)
  • 다음 명령어로 배포판을 푼다:
    gzip -dc java_cgi-0.5.tgz | tar -xvf -
    
    (버전이 바뀌었다면, 지금부터는 그 배포판의 설명을 참고하라)
  • 새로이 생성된java_cgi-0.5 디렉토리에서 시스템에 맞게Makefile을 편집한다.
  • root로써 make install을 실행한다. 이 명령이 자바 프로그램을 컴파일하고, 여러분의 시스템에 관련된 정보들을 적용(apply)시키고 다양한 파일들을 인스톨 한다. 만약 HTML로된 본 문서와 HTML테스트 문서를 원한다면, 대신 make all을 실행한다.
  • 이제 준비가 되었다.

4. Java CGI 프로그램 실행하기

4.1 CGI 모델 상에서 자바 프로그램의 실행을 막는 장애물

웹 서버에서 자바 프로그램을 실행시키는데 있어서 두 가지 문제점이 있다:

자바 프로그램을 보통 실행파일처럼 실행시킬 수 없다.

커멘드 라인상에서 자바 런타임 인터프리터를 실행하고 (프로그램이 실행될 수 있도록) 초기화 클래스가 있어야 한다. HTML 형태로는 커멘드 라인을 웹 서버에 보낼 수 없다.

자바는 환경(변수)에 대해 일반적인 액세스할 수 없다.

자바 프로그램이 필요로 하는 개개의 환경변수는 정확이 넘겨져야(pass) 한다. C 에서의 getenv() 함수 같은 메소드는 없다.

4.2 Java CGI프로그램을 실행할 때의 문제점 극복

위의 장애물을 처리하기 위해, 자바 인터프리터에게 필요한 정보를 제공하는 쉘 CGI프로그램을 작성하였다.

java.cgi 스크립트

이 쉘 스크립트는 사용하고자 하는 Java CGI프로그램과 HTTP데몬 사이의 상호작용(interaction)을 관리한다. 이 스크립트는 실행하고자 하는 프로그램의 이름을 서버가 제공하는 데이타로부터 뽑아내며 임의의 임시 파일 안에 환경 데이타(environment data) 모두를 모은다. 그리고나서 커멘드 라인에 덧붙여진 환경 정보 파일의 이름과 프로그램 이름을 가지고 자바 런타임 인터프리터를 실행시킨다. java.cgi스크립트는 지역 경로에 관한 방침을 정하라 에서 구성되었으며 인스톨되었다.

HTML form으로 부터 java.cgi 호출하기

Java CGI 프로그램을 사용하는 필자의 폼은 다음과 같이 form action을 명시한다:

<form action="/cgi-bin/java.cgi/CGI_Test" method="POST">
여기서 /cgi-bin/ 은 여러분의 CGI 바이너리 디렉토리이며, java.cgi는 웹상에서 Java 프로그램을 실행시키게 해주는 자바 front-end 이며, CGI_Test는 실행시킬 자바 프로그램 이름의 예이다.

5. Java CGI클래스 사용하기

현재 세개의 메인 클래스가 제공된다. CGIEmailHTML이다. 필자는 MIME 형태의 입출력을 다루는 각각의 클래스- MIMEin 과 MIMEout - 를 추가할 생각이다.

지원용클래스와 테스트 클래스도 몇 개 있다. CGI_Test, Email_TestHTML_Test는 인스톨을 테스트하기 위한 것이다. 이들 클래스는 이 클래스 라이브러리는 사용하는 자바 프로그램에서 시작점(starting- point)처럼 사용될 수도 있을것이다. Text 클래스는 EmailHTML 클래스의 수퍼클래스이다.

5.1 CGI

클래스 문법

public class CGI

클래스 설명

CGI 클래스는 "CGI 정보" (웹 서버가 정한 환경 변수들과 submit 동작이 선택되었을 때 form으로부터 보낸 name/value)를 가진다. 모든 정보는 Properties 클래스 객체에 저장된다. 이 클래스는 "Orbits.net" 패키지에 들어있다.

멤버 요약


        CGI()         //  생성자.
        getNames()    //  이름들의 리스트를 얻는다.
        getValue()    //  이름을 명시함으로써 form의 value를 얻는다.

참조

CGI_Test.

CGI()

목적

사용 가능한 CGI 테이타를 가진 객체를 생성한다.

문법

public CGI()

설명

CGI 객체가 생성 되었을 때, 모든 사용 가능한 CGI정보가 그 객체에 대해 로컬인 저장소로 보내진다.

getNames()

목적

해당하는 value를 갖도록 정의된 name들을 보인다.

문법

public Enumeration getKeys ()

설명

해당하는 value가 정의된 name의 전체 리스트를 제공한다.

리턴

정의된 모든 이름의 Enumeration

getValue()

목적

name이 명시된 value를 취한다.

문법

public String getValue ( String name )

설명

HTML form으로부터 보내진 namevalue사이에 대응하는 것을 리턴함.

파라메터

name

value를 선택하는 키

리턴

value를 담고 있는 String

5.2 CGI_Test

이 클래스에는 CGI클래스를 어떻게 사용하는지에 관한 예제와 Java CGI 패키지가 정확하게 동작하는지 확인하는데 사용되는 테스트 프로그램이 들어 있다.

멤버요약


        main()      //  프로그램 main().

참조

CGI.

main()

목적

main() 메소드를 제공한다.

문법

public static void main( String argv[] )

설명

사용 가능한 name/value 쌍의 리스트와 현재 값을 리턴하는 CGI 프로그램에 대한 진입점(entry point)이다.

파라메터

argv[]

java.cgi 스크립트에 의해 프로그램에 전달되는 인자들. 현재 사용 안함

5.3 Email

클래스 문법

public class Email extends Text

클래스 문법

메시지는 Text클래스의 add* () 메소드와 이 클래스에 의해 추가된 e-mail 관련(e-mail-specific) 메소드로 만들어진다. 다 마치면, 메시지는 목적지로 보내진다. 이 클래스는 "Orbits.net"패키지에 들어있다.

멤버 요약


        Email()      //  생성자.
        send()       //  전자메일 메시지를 보낸다.
        sendTo()     //  메시지에 목적지를 추가한다.
        subject()    //  메지지에 주제(Subject:)를 정한다.

참고

Email_Test, Text.

Email()

목적

전자메일 메시지를 담은 개체를 생성한다.

문법

public Email()

설명

Email메소드로서 완성(complete)될 빈 메시지를 셋업한다.

참조

Text.

send()

목적

전자메일 메시시를 보낸다.

문법

public void send ()

설명

메지시를 정형화(format)하고 보낸다. 목적지가 정해지지 않았으면, 아무 일도 발생하지 않는다.

sendTo()

목적

메시지에 목적지를 추가한다.

문법

public String sendTo ( String address )

설명

이 메소드의 목적지 리스트에 주소 를 추가한다. 전자메일 메시지가 가질 수 있는 목적지의 수에는 정해진 한계가 없다. 리스트의 크기를 충분히 크게 만든다면, 메일 전송 에이전트(Mail Transport Agent) 가 허용할 수 있는 파라메터 리스트의 사이즈를 초과할 수 있으며 그렇지 않다면 메모리를 다 써버릴 것이다.

파라메터/

address

메시지를 보낼 목적지.

subject()

목적

메시지의 주제를 정한다.

문법

public void subject ( String subject )

설명

전자메일의 Subject: 줄의 텍스트를 정한다. 만약 한번 이상 호출되면, 맨 마지막에 정한 subject가 사용된다.

파라메터

subject

메시지의 Subject: 줄의 텍스트

5.4 Email_Test

이 클래스는 Email 클래스를 어떻게 사용하는지에 관한 예제와 Java CGI 패키지가 정확하게 동작하는지 확인하는데 사용되는 테스트 프로그램 예제가 들어있다.

멤버 요약


        main()      //  프로그램 main().

참조

Email.

main()

목적

main() 메소드를 제공한다.

문법

public static void main( String argv[] )

설명

사용 가능한 name/value 쌍과 현재 그 쌍의 리스트를 리턴하는 CGI 프로그램에 대한 진입점(entry point)이다. Email 변수에 명시된 주소에도 이 리스트를 보낸다.

파라메터

argv[]

java.cgi 스크립트에 의해 프로그램에 전달되는 인자들. 현재 사용 안함.

5.5 HTML

클래스 문법

public class HTML extends Text

클래스 설명

메시지는 Text클래스의 add* () 메소드와 이 클래스에 의해 추가된 HTML관련(HTML-specific) 메소드로 만들어진다. 완성되면, 메시지는 목적지로 보내진다. 현재, 리스트를 만드는 메소드들이 정확한 순서로 사용되었는지 확신할 에러 체킹을 하지 않아서, 프로그래머가 HTML 문법을 어기지 않도록 주의해야 한다. 이 클래스는 "Orbits.net"패키지에 들어있다.

멤버 요약


        HTML()                  //  생성자.
        author()                //  문서 저자의 이름을 정한다.
        definitionList()        //  정의 리스트를 시작한다.
        definitionListTerm()    //  정의 리스트에 용어(term)를 추가한다.
        endList()               //  리스트를 끝맺는다.
        listItem()              //  리스트에 엔트리를 추가한다.
        send()                  //  HTML메시지를 보낸다.
        title()                 //  문서 제목용 텍스크를 정한다.

참조

HTML_Test, Text.

HTML()

목적

HTML메시지를 담을 객체를 생성한다.

문법

public HTML()

설명

HTML 메소드에 의해서 완성될 빈 메시지를 만든다.

참조

Text.

author()

목적

문저 저자의 이름을 정한다.

Syntax

public void author ( String author )

설명

문서의 저자를 author로 정한다.

파라메터/

author

메시지의 저자로 사용될 텍스트.

참조

title().

definitionList()

목적

정의 리스트를 시작한다.

문법

public void definitionList ()

설명

정의 리스트를 시작한다. 정의 리스트는 리스트 안의 각각의 엔트리가 그 용어(term)의 정의 텍스트(text) 다음에 나오는 항목인 리스트이다. 정의 리스트의 시작은 (최소한) 하나의 용어/텍스트 쌍을 생성하고 endList() 메소드가 한번 호출된 이후 이어야 한다. 현재 리스트들은 네스트(nest)될 수 없음을 주의하라.

참조

definitionListTerm(), endList(), listItem().

definitionListTerm()

목적

정의 리스트에 하나의 용어를 추가한다.

문법

public void definitionListTerm ()

설명

정의 리스트에 하나의 용어를 추가한다. 현 리스트 엔트리의 용어 부분의 텍스트는 이 메소드가 호출되고 해당되는 listItem메소드가 호출되기 전에 메시지에 덧붙여져야 한다.

참조

definitionList(), listItem().

endList()

목적

리스트를 끝맺는다.

문법

public void endList ()

설명

리스트를 끝맺는다. 이 메소드는 한 리스트를 끝낸다. 현재 리스트들은 네스트될 수 없음을 주목하라.

참조

definitionList().

listItem()

목적

리스트에 엔트리 하나를 추가한다.

문법

public void listItem ()

public void listItem ( String item )

public boolean listItem ( String term, String item )

설명

리스트에 엔트리 하나를 추가한다. 만약 첫번째 폼(form)이 사용된다면, 현 리스트 아이템의 텍스트는 이 메소드가 호출된 다음에 그리고 다른 리스트 메소드가 호출되기 전에 메시지에 붙여져야 한다. 두번째와 세번째 폼에서는, item 텍스트는 이 메시지에 덧붙여지는 대신에(혹은 추가로) 메소드의 파라메터로써 명시된다.세번째는 정의 리스트에 관련되고(specific), 용어와 리스트 엔트리의 정의를 제공한다.

파라메터

item

리스트 엔트리의 텍스트.

term

정의 리스트 엔트리의 용어 부분의 텍스트.

참조

definitionList(), definitionListTerm(), endList().

send()

목적

HTML메시지를 보낸다.

문법

public void send ()

설명

HTML 메시지를 보낸다.

title()

목적

문서 제목의 텍스트를 정한다.

문법

public void title ( String title )

설명

문서 제목의 텍스트를 정한다.

파라메터

title

메시지 제목의 텍스트.

참조

author().

5.6 HTML_Test

이 클래스에는 HTML클래스를 어떻게 사용하는지에 관한 예제와 Java CGI 패키지가 정확하게 동작하는지를 확인하는데 사용되는 테스트 프로그램이 들어있다.

멤버 요약


        main()      //  프로그램 main().

참조

HTML.

main()

목적

main() 메소드를 제공한다.

문법

public static void main( String argv[] )

설명

HTML문서에서 정의 리스트 원소에서 각각의 name/value의 쌍을 보이며 사용 가능한 name/value의 쌍의 리스트를 리턴하는 CGI프로그램에 대한 진입점이다.

파라메터

argv[]

java.cgi스크립트에 의해 프로그램에 전달되는 인자들. 현재 사용 안함.

5.7 Text

클래스 문법

public abstract class Text

클래스 설명

이 클래스는 EmailHTML 클래스의 수퍼클래스이다. 메시지는 이 클래스안의 메소드에 의해 만들어지고 서브클래스의 메소드로써 완성되며(completed) 형식화(formatted)된다. 이 클래스는 "Orbits.text"패키지 안에 들어있다.

멤버 요약


        Text()            //  생성자.
        add()             //  이 객체에 텍스트를 추가한다.
        addLineBreak()    //  계행 추가.
        addParagraph()    //  단락계행 추가.

참고

Email, HTML.

add()

목적

아이템에 텍스트를 추가한다.

문법

public void add ( char addition )

public void add ( String addition )

public void add ( StringBuffer addition )

설명

텍스트 아이템의 내용에 addition를 추가한다.

파라메터

addition

텍스트 아이템에 추가될 텍스트.

참조

addLineBreak(), addParagraph().

addLineBreak()

목적

현 시점에서 텍스트에 계행을 한다.

문법

public void addLineBreak ()

설명

현 시점에서 텍스트에 계행을 한다.

참조

add(), addParagraph().

addParagraph()

목적

새로운 단락을 시작한다.

문법

public void add ()

설명

텍스트 흐름의 현 시점에서 새 단락을 시작한다.

참조

add(), addLineBreak().

6. 향후 계획

  • Email 클래스에 추가:
    Email( int capacity )

    메시지가 할당되기 위해서 얼마나 많은 공간이 필요한지 알고 있을 때 사용.

    sendTo( String [] address )

    전자메일 메시지에 주(primary) 목적지 리스트 추가.

    sendCc( String address )

    전자메일 메시지에 카본카피(복사본) 목적지 추가.

    sendCc( String [] address )

    전자메일 메시지에 카본카피(복사본) 목적지 추가.

    sendBcc( String address )

    전자메일 메시지에 블라인드 카본 카피(익명 복사본) 목적지 추가.

    sendBcc( String [] address )

    전자메일 메시지에 블라인드 카본 카피(익명 복사본) 목적지 추가.

  • HTML 클래스에 추가:
    HTML( int capacity )

    메시지가 할당되기 위해서 얼마나 많은 공간이 필요한지 알 때 사용.

    public void unorderedList()

    무정렬 리스트를 시작.

    public void orderedList()

    무정렬 리르트를 시작.

    public void directoryList()

    목록 리스트를 시작.

    public void menuList()

    메뉴 리스트를 시작.

    void anchor( String anchorName )

    anchor를 명시.

    void link( String url, String text )

    링크를 명시.

    void applet( String url, String altText )

    애플릿 링크를 명시.

  • HTML리스트가 네스트 되게 한다.
  • HTML 리스트 포맷팅(formatting) 코드의 올바른 정렬을 수행할 에러 체킹 코드를 추가한다.
  • Makefile에서 환경 데이타 파일의 위치를 조정할 수 있게 한다.
  • 데이타 전송인 GET메소드를 사용할 때 리스트에서 나타나는 빈 name/value 쌍을 없앤다.
  • 계속해서 변수 이름을 제공할 java.util.Enumeration 인터페이스의 CGI로의 구현을 생각중.
  • 이 패키지에 있는 모든 메소드를 사용하는, Test 클래스를 추가한다.
  • 디버깅 목적으로 점진적인 테스트를 하기 위해 CGI_Test, Email_TestHTML_Test 서로가 어떻게 빌드 되는지 문서화한다.
  • 어떻게 Test가 이 패키지에서 가능한 모든 기능을 이용하는지 문서화한다.

7. 변화

7.1 0.4에서 0.5간의 변화

  • 마지막 판을 반영하는 변화된 문서화와 주석

7.2 0.3에서 0.4간의 변화

  • 최소한의 기능을 제공하는 HTML 클래스의 골자 배포.
  • HTML_Test 클래스와 javahtmltest.html-dist 작성.
  • 정의 리스트를 다루기 위한 HTML 메소드를 추가.

7.3 0.2에서 0.3간의 변화

  • Text 와 Email 클래스를 추가. HTML 클래스도 추가되었으나, 이 시기에는 시작 단계 정도.
  • 패키지에 다양한 클래스를 넣음. 주된 클래스는 Orbits.net.*에 들어 있으며, 지원 클래스 TextOrbits.text.Text안에 있음.
  • CGItest 가 CGI_Test 로 바뀜.
  • Email_Test 클래스 추가.

7.4 0.1에서 0.2간의 변화

  • 환경변수를 자바 인터프리터의 커멘드 라인 안에 넣는 대신에 임시 파일에 놓임. CGI 클래스와 java.cgi가 수정되었음.
  • Javacgitest.html 문서가 배포판에 포함됨.
  • 인스톨 과정의 make에 의해 수정된 텍스트 파일에 -dist로 끝나는 이름을 붙임.




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2003-08-10 11:52:30
Processing time 0.0178 sec