RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'2006/09'에 해당되는 글 206
출처 블로그 > What you see is what you get
http://blog.naver.com/etwas0227/60021345880

패턴 문법

패턴 문법 -- PCRE 정규표현식 문법 설명

설명

PCRE 라이브러리는 아주 약간의 차이(아래를 참고)를 제외하고, 펄 5와 동일한 구문과 의미를 사용하여 정규표현식 패턴 매칭을 수행하는 함수의 집합입니다. 현재 수행은 펄 5.005에 대응합니다.

펄과의 차이

여기에서 설명한 차이는 펄 5.005 기준입니다.

  1. PCRE는 다른 문자 집합으로 컴파일할 수 있지만, 기본적으로 공백 문자는 C 라이브러리 함수 isspace()가 인식하는 모든 문자입니다. 보통 isspace()는 스페이스, 폼피드, 줄바꿈, 캐리지 리턴, 수평 탭, 수직 탭을 인식합니다. 펄 5는 공백 문자에 수직 탭을 포함하지 않습니다. 오랜 기간동안 펄 문서의 \v 이스케이프는 사실상 인정되지 않았습니다. 그러나 문자 자체는 적어도 5.002까지 공백으로 취급되었으며, 5.004와 5.005는 \s에서 인식하지 않습니다.

  2. PCRE는 lookahead 단정에서 반복 횟수를 허용하지 않습니다. 펄은 허용하지만, 생각하는 그대로의 의미를 갖지 않습니다. 예를 들어, (?!a){3}는 다음 세 문자가 "a"가 아닌 것을 의미하지 않습니다. 단지, 다음 문자가 "a"가 아니라는 것을 세번 확인할 뿐입니다.

  3. 부정 lookahead 단정 안에서 일어나는 서브패턴 검출을 카운트를 하지만, 시작 위치 벡터에 그 엔트리를 설정하지는 않습니다. 펄은 부정 lookahead 단정이 단 하나의 브랜치를 가지고 있을 경우에 한하여, 그 단정이 매치에 실패(결과적으로 성공)하기 전에 매치한 어떠한 패턴에 대해서만 그에 대한 숫자 변수를 설정합니다.

  4. 바이너리 제로 문자는 목표 문자열에서는 지원하지만, 패턴 문자열에서는 허용하지 않습니다. 패턴은 제로로 종료하는 보통의 C 문자열로 처리하기 때문입니다. 패턴에서 바이너리 제로를 표현하기 위해서는 이스케이프 시퀀스 "\\x00"로 사용할 수 있습니다.

  5. 다음의 펄 이스케이프 시퀀스는 지원하지 않습니다: \l, \u, \L, \U, \E, \Q. 사실, 이들은 펄의 일반 문자열 핸들링이며, 패턴 매칭 엔진의 부분이 아닙니다.

  6. 펄의 \G는 싱글 패턴 매치에 적절하지 않기 때문에 지원하지 않습니다.

  7. 당연하게도, PCRE는 (?{code}) 구조를 지원하지 않습니다.

  8. 패턴의 일부가 반복될 때, 잡아낸 문자열의 설정에 관해서, 펄 5.005_02에서 일부 이상한 동작이 존재합니다. 예를 들어, "aba"에 대해서 패턴 /^(a(b)?)+$/를 매칭하면 $2를 "b" 값으로 설정하지만, "aabbaa"에 대해서 /^(aa(bb)?)+$/를 매칭하면 $2를 설정하지 않습니다. 하지만 패턴을 /^(aa(b(b))?)+$/로 변경하면 $2(와 $3)를 설정합니다. 펄 5.004에서는 $2를 두 경우 모두 설정했으며, PCRE에서도 TRUE입니다. 앞으로 펄이 이 차이를 일관성 있게 변경한다면, PCRE는 그 변경에 따를 것입니다.

  9. 또다른 해결되지 않은 모순점은 펄 5.005_02가 패턴 /^(a)?(?(1)a|b)+$/를 문자열 "a"에 매치하지만, PCRE는 하지 않습니다. 그러나 펄과 PCRE 모두 /^(a)?a/를 "a"에 매치하고 $1을 설정하지 않습니다.

  10. PCRE는 펄 정규표현식 기능의 몇가지 확장을 지원합니다:

    1. lookbehind 단정은 고정 길이 문자열에만 매치해야하지만, 양자 택일의 lookbehind 단정에서는 다른 길이의 문자열을 매치할 수 있습니다. 펄 5.005에서는 모두 같은 길이를 가질 것을 요구합니다.

    2. PCRE_DOLLAR_ENDONLY를 설정하고 PCRE_MULTILINE를 설정하지 않으면 $ 메타 문자는 문자열의 가장 마지막에만 매치합니다.

    3. PCRE_EXTRA를 설정하면, 백슬래쉬 뒤에 특별한 의미를 가지지 않는 문자의 사용은 실패하게 됩니다.

    4. PCRE_UNGREEDY를 설정하면, 반복 수량어의 greediness가 뒤집어져서, 기본값으로 greedy하지 않게 됩니다. 하지만 뒤에 물음표가 붙으면 greedy하게 됩니다.

정규표현식 상세

소개

아래 설명은 PCRE가 지원하는 정규표현식의 문법과 의미입니다. 정규표현식은 펄 문서 및 많은 책들에 설명이 있으며, 그 중 일부에는 풍부한 예제를 가지고 있습니다. O'Reilly에서 출판한 Jeffrey Friedl의 "Mastering Regular Expressions"(ISBN 1-56592-257-3)는 예제들을 매우 자세하게 다루고 있습니다. 여기의 설명은 레퍼런스 문서에 따릅니다.

정규표현식은 주어진 문자열에 대하여 왼쪽에서 오른쪽으로 매치하는 패턴입니다. 문자열은 패턴으로 준비하고, 목표에서 대응하는 문자열에 매치합니다. 간단한 예로, 패턴 The quick brown fox는 목표 문자열의 동일한 부분에 매치합니다.

메타 문자

정규표현식이 강력한 이유는 패턴에 선택과 반복을 포함할 수 있다는 점입니다. 이는 특별한 방법으로 해석하는 메타 문자를 사용하여 패턴에 넣습니다.

메타 문자는 두가지 종류가 존재합니다: 대괄호 안을 제외하고 패턴의 어디에서라도 작동하는 종류와, 대괄호 안에서만 작동하는 종류입니다. 다음은 대괄호 밖에서 사용하는 메타 문자들입니다.

\

여러가지로 사용하는 일반적인 이스케이프 문자

^

목표의 처음 (멀티라인 모드에서는 줄의 처음)

$

목표의 마지막 (멀티라인 모드에서는 줄의 끝)

.

(기본값으로) 줄바꿈을 제외한 아무 문자

[

클래스 정의 시작 문자

]

클래스 정의 끝 문자

|

선택 브랜치 시작

(

서브패턴 시작

)

서브패턴 끝

?

( 의미 확장, 또는 0회나 1회, 또는 수량어 minimizer

*

0회 이상의 횟수

+

1회 이상의 횟수

{

최소/최대 횟수 시작

}

최소/최대 횟수 끝

대괄호 안쪽의 패턴은 "문자 클래스"라고 부릅니다. 다음은 문자 클래스에서 사용하는 메타 문자들입니다:
\

일반적인 이스케이프 문자

^

처음 문자로 올 때, 부정 클래스로 설정

-

문자 범위 지정

]

문자 클래스 종료

다음 섹션은 각 메타 문자의 사용을 설명합니다.

백슬래쉬

백슬래쉬 문자는 여러가지 사용법을 가집니다. 먼저, 뒤에 영숫자가 아닌 문자가 붙는다면, 그 문자가 가지고 있는 특별한 의미가 사라집니다. 이러한 이스케이프 문자로 백슬래쉬를 사용하는 것은 문자 클래스 안과 밖 양쪽에 모두 적용됩니다.

예를 들어, "*" 문자를 매치하길 원한다면, 패턴에는 "\*"로 써야합니다. 이는 따라오는 문자가 메타 문자이던 아니던간에 관계 없이 적용하기 떄문에, 영숫자가 아닌 문자에 그 자체를 사용하기 위해 "\"를 붙이는 것이 항상 안전합니다. 특히, 백슬래쉬를 매치하고자 한다면, "\\"로 써야합니다.

패턴에 PCRE_EXTENDED 옵션을 사용하면, 패턴에 존재하는 (문자 클래스 안이 아닌) 공백, 그리고 문자 클래스 밖의 "#"사이의 문자와 바로 뒤의 줄바꿈 문자를 무시합니다. 이스케이프하는 백슬래쉬를 공백이나 "#"문자를 패턴에 넣기 위해 사용할 수 있습니다.

백슬래쉬의 두번째 사용법은 패턴에서 출력할 수 없는 문자를 보여지게 인코딩하는 방법을 제공합니다. 바이너리 제로가 패턴 종료를 의미하는걸 제외하면, 출력할 수 없는 문자가 나타나는 제한은 존재하지 않습니다. 그러나 패턴을 텍스트 편집으로 준비할 때는, 다음의 이스케이프 시퀀스를 사용하는 편이 바이너리 문자를 직접 표현하는 것보다 간편합니다:

\a

알람, BEL 문자(hex 07)

\cx

"control-x", x는 임의의 문자

\e

이스케이프 (hex 1B)

\f

폼피드 (hex 0C)

\n

줄바꿈 (hex 0A)

\r

캐리지 리턴 (hex 0D)

\t

탭 (hex 09)

\xhh

16진 코드 hh 문자

\ddd

8진 코드 ddd 문자, 혹은 역참조

"\cx"의 효과는 다음과 같이 계산합니다: "x"가 소문자라면, 대문자로 변환합니다. 그 후, 문자의 6번째 비트(hex 40)가 뒤집어집니다. 즉 "\cz"은 hex 1A가 되고, "\c{"은 hex 3B, 그리고 "\c;"은 hex 7B가 됩니다.

"\x" 뒤에, 두개의 16진 숫자를 읽습니다. (대소문자는 구별하지 않습니다)

"\0"은 다음의 두자리의 8진수를 읽습니다. 양쪽 모두, 두자리가 되지 않을 경우, 그 표현을 그대로 사용합니다. 즉 "\0\x\07" 시퀀스는 두개의 바이너리 제로에 이어지는 BEL 문자를 정의합니다. 바로 뒤에 8진수로 인식되는 문자가 이어질 경우에는 처음의 제로 뒤에 두자리 수를 써야한다는 것을 잊지 마십시오.

백슬래쉬 뒤에 0이 아닌 수가 올 경우에 혼동할 수 있습니다. 문자 클래스 밖에서, PCRE는 그것과 따라오는 수를 10진수로 읽습니다. 수가 10보다 작거나, 표현식에서 수 이상의 묶음을 잡아냈다면, 이 시퀀스는 역참조가 됩니다. 이 작동에 관해서는 아래에, 묶음 서브패턴에 설명이 있습니다.

문자 클래스 안이나, 10진수 9 이상이 없고 서브패턴이 그만큼 존재하지 않을 경우, PCRE는 백슬래쉬 뒤의 세자리 8진수로 다시 읽어들여, 해당하는 8비트 값으로 하나의 바이트를 생성합니다. 어떠한 수라도 사용할 수 있습니다. 예를 들면:

\040

스페이스의 다른 표현 방법

\40

40개 미만의 서브 패턴을 검출하였을때, 동일한 의미

\7

항상 역참조

\11

역참조, 혹은 탭의 다른 표현 방법

\011

항상 탭

\0113

문자 "3"이 따라오는 탭

\113

8진 코드 113 문자 (역참조는 99까지입니다)

\377

1비트만을 제외한 바이트

\81

역참조이거나 "8"과 "1"의 두 문자가 붙는 바이너리 제로

100이상의 8진 값은 앞에 제로가 붙지 않아야만 합니다. 세자리를 넘어가는 8진 값은 읽지 않습니다.

하나의 바이트값을 정의하는 모든 시퀀스는 문자 클래스 내외, 어디에서도 사용할 수 있습니다. 추가로, 문자 클래스 안에서 "\b" 시퀀스는 백스페이스 문자(hex 08)로 해석합니다. 문자 클래스 밖에서는 다른 의미를 가집니다. (아래를 참고)

백슬래쉬의 세번째 사용법은 일반적인 문자 타입의 지정입니다:

\d

임의의 10진 숫자

\D

10진 숫자가 아닌 임의의 문자

\s

임의의 공백 문자

\S

공백이 아닌 임의의 문자

\w

임의의 "word" 문자

\W

임의의 "non-word" 문자

각 이스케이프 시퀀스 조합은 완전한 문자 세트를 두개의 개별 세트로 분리합니다. 주어진 문자는 각 조합의 한쪽에만 매치합니다.

"word" 문자는 어떠한 문자나 숫자, 혹은 언더스코어(_)입니다. 즉, 펄의 "word"에 해당하는 어떠한 문자입니다. 문자와 숫자의 정의는 PCRE의 문자 테이블이 제어하고, 로케일 특정 매칭이 존재할 경우에는 다양할 수 있습니다. (위쪽의 "로케일 지원" 참고) 예를 들어, "fr"(프랑스어) 로케일에서는, 128 이상의 몇몇 코드를 엑센트 문자를 나타내는데 사용하며, 이들은 \w에 매치합니다.

문자형 시퀀스는 문자 클래스 안과 밖에서 모두 사용할 수 있습니다. 각각 해당하는 형의 한 문자에 매치합니다. 현재 매칭 위치가 목표 문자열의 마지막이라면, 전부 실패하고, 어떠한 문자도 매치하지 않습니다.

백슬래쉬의 네번째 사용법은 간단한 단정입니다. 단정은 조건이 목표 문자열에서 다른 부분에 매치하지 않고, 특정한 위치에만 매치하도록 지정합니다. 복잡한 단정을 위한 서브패턴의 사용법은 아래에 설명이 있습니다. 백슬래쉬 단정은 다음과 같습니다.

\b

word 경계

\B

word 경계가 아님

\A

목표의 처음 (멀티라인 모드와 무관)

\Z

목표의 마지막이나 마지막에서 줄바꿈 (멀티라인 모드와 무관)

\z

목표의 마지막 (멀티라인 모드와 무관)

단정은 문자 클래스 안에서 사용할 수 없습니다. ("\b"가 문자 클래스 안에서는 백스페이스 문자를 나타내는 점에 주의하십시오)

word 경계는 현재 문자와 이전 문자가 둘 다 \w에 매치하지 않거나 둘 다 \W에 매치하지 않는 (즉, 하나는 \w에 매치하고 다른 하나는 \W에 매치) 목표 문자열의 위치이거나, 처음이나 마지막 문자가 \w에 매치할 경우는 문자열의 처음이나 마지막입니다.

\A, \Z, \z 단정은 전통적인 circumflex와 달러와는 달리 옵션과 관계 없이 목표 문자열의 가장 처음이나 가장 마지막에만 매치합니다. 이들은 PCRE_MULTILINE이나 PCRE_DOLLAR_ENDONLU 옵션에 영향을 받지 않습니다. \Z\z의 차이는, \Z가 문자열의 마지막뿐만 아니라 문자열 마지막 문자가 줄바꿈일 경우에는 바로 앞에도 매치하지만, \z는 마지막에만 매치합니다.





출처: http://www.php.net/manual/kr/pcre.pattern.syntax.php



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






array preg_grep ( string pattern, array input [, int flags])

preg_grep()은 주어진 pattern에 매치되는 input 배열의 요소를 포함하는 배열을 반환합니다.


EXAMPLE:
$food = array('apple', 'banana', 'squid', 'pear');
$fruits = preg_grep("/squid/", $food, PREG_GREP_INVERT);
echo "Food  "; print_r($food);
echo "Fruit "; print_r($fruits);

RESULTS IN:
Food  Array
(
  [0] => apple
  [1] => banana
  [2] => squid
  [3] => pear
)
Fruit Array
(
  [0] => apple
  [1] => banana
  [3] => pear
)

출처: http://www.php.net/manual/kr/function.preg-grep.php



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




preg_match -- 정규표현식 매치를 수행합니다.


예 1. 문자열 "php" 찾기

<?php
// 패턴 구분자 뒤의 "i"는 대소문자를 구별하지 않게 합니다.
if (preg_match("/php/i", "PHP is the web scripting language of choice."
)) {
  echo
"발견하였습니다."
;
} else {
  echo
"발견하지 못했습니다."
;
}
?>

예 2. 단어 "Web" 찾기

<?php
/* 패턴에서 \b는 단어를 지시합니다. 단어 "web"만 매치하고,
* "webbing"이나 "cobweb" 등의 부분적인 경우에는 매치하지 않습니다. */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice."
)) {
  echo
"발견하였습니다."
;
} else {
  echo
"발견하지 못했습니다."
;
}

if (
preg_match("/\bweb\b/i", "PHP is the website scripting language of choice."
)) {
  echo
"발견하였습니다."
;
} else {
  echo
"발견하지 못했습니다."
;
}
?>

예 3. URL에서 도메인 이름 얻기

<?php
// URL에서 호스트 이름 얻기
preg_match("/^(http:\/\/)?([^\/]+)/i"
,
 
"http://www.php.net/index.html", $matches
);
$host = $matches[2
];

// 호스트 이름에서 마지막 두 세그멘트 얻기
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches
);
echo
"도메인 이름은: {$matches[0]}\n"
;
?>

이 예제의 결과:

도메인 이름은: php.net



출처: http://www.php.net/manual/kr/function.preg-match.php



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






< 참고 >





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









1. ereg(string pattern, string string, array [regs])

   해당 문자열에서 주어진 정규 표현식 패턴과의 일치 되는 문자열을 검색합니다.

2. ereg_replace(string pattern, string replacement, string string)

   해당 문자열에서 주어진 정규 표현식 패턴과의 일치 되는 문자열을 검색하고 바꿀 문자열로 대체합니다.


3. eregi(string pattern, string string, array [regs])

   ereg() 함수와 동일하나 검색을 할 때 대, 소 문자를 구분하지 않습니다.


4. eregi_replace(string pattern, string replacement, string string)

   ereg_replace()와 동일하나 검색을 할 때 대, 소 문자를 구분하지 않습니다.

                                                       
5. split(string pattern, string string, int [limit])

   지정한 패턴과 일치하는 문자열을 경계로 해당 문자열을 나누고 배열에 저장합니다.


 
정규 표현식 패턴의 종류

                                                                        

정규 표현식은 주로 게시판의 입력 사항에서 사용 되어 집니다. 가령 비밀번호나 기타 이름 등을 입력할 때

주어진 조건에 맞게 입력하게끔 하는 것입니다.

   " . " - 이 표현은 c.y처럼 표현하기도 하고 .cy로 하기도 합니다.
             즉, 전자는 c로 시작 하면서 y로 끝나는 문자를 나타냅니다.
             (cry , cay , cat) 물론 여기서 . 은 한 문자만을 가리키는 것입니다.
             후자는 문자열이 cy로 끝나는 문자열을 나타냅니다(xcy, xcy). 잘못된 표현은 전자의 경우
             csdy, cfgy , cy입니다. " . " 은 한문자 만을 나타냅니다.

   " ? " - ?앞의 문자가 있거나 없음을 나타냅니다. 즉, sc?y 는 sy , scy , scyf , frsy …와 일치합니다.               

   " + " - +는 앞의 문자를 가리키며 최소 하나 이상의 문자임을 나타냅니다.
             즉, c+ry는 cry, ccry, cccry, cryhj … 와 일치합니다.

   " * " - * 는 앞의 문자가 없거나 하나 이상의 문자임을 나타냅니다.
             즉, c*ry 는 ry, cry, cccry … 과 일치합니다. 또 cry* 는 y가 없거나 하나 이상 문자임을 나타냅니다.
             cr, cry, cry, cryyy …. 와 일치합니다.

   " $ " - $는 해당 문자열의 마지막 부분을 가리킵니다. 즉, c?ry$ 는 ry로 끝나는 문자열에서 앞의 문자가 c가
             있거나 없는 문자열을 나타냅니다.
             cry , ry , skycry …와 일치합니다. c?r+$ 는 앞의 문자 c 가 있거나 없는 문자이며 r로 적어도 하나이상
             끝나는 문자열을 나타냅니다. r , cr , crr , crrr … 와 일치합니다.
                                                                                          
   " ^ " - ^ 는 뒤 문자열로 시작되는 모든 문자열을 나타냅니다.
             즉, ^cry 는 cry is good, cry is very good, crypdf … 와 일치합니다.
             또 ^cry?df는 y가 있거나 없는 crydf , crdf로 시작하는 모든 문자열을 나타냅니다.
             crydf is good, crdfgg …와 일치합니다.


   이렇게 이 기호들은 상호 같이 사용해서 문자열을 표현합니다.

                                                                                               
   " [ ] " - [ ] 는 이 안의 문자 중에 하나의 문자를 표현합니다. 그리고 [ ] 안의 문자의 표현은
            "-" 를 사용해서 합니다.
            즉, [a-z] 는 영문의 소문자 한글자를 포함하는 모든 문자열을 나타냅니다.
            A2sdr , skycry , cry , zzzz …. 와 일치합니다.
            또 [a-zA-Z0-9] 는 영문 대,소문자 와 십진수 한자를 포함하는 모든 문자열을 나타냅니다.
            a4df, Cry44 is passw , 4ded … 등과 일치합니다. 
            [cC][yY] 는 cy , cY , Cy , CY 를 포함하는 문자열을 나타냅니다. Cycap , Cyclub … 등과 일치합니다.
            만약 해당하는 문자를 제외한 문자열과의 일치를 나타내려면 ^기호를 [] 안에 사용합니다.
            [^a-z]는 영문 소문자를 제외한 한글자를 포함하는 문자열을 나타냅니다.
            Cry44, skycryGood, 444 is passw … 와 일치합니다.
            물론 영문 자체의 입력을 하지 못하게 하려면 [^a-zA-Z]로 표현할 수 있습니다.
            [ ] 는 일정한 문자의 표현은 간단하게 표현할 수도 있습니다. 클래스화된 방법을 사용합니다.
            즉, [[:space:]]는 공백 문자를 나타냅니다 ( ) 와 일치합니다.
            [[:digit:]]는 숫자 하나를 나타냅니다. [0-9]와 일치합니다.
            [[:alpha:]]는 영문 알파벳 하나를 나타냅니다. [a-zA-Z] , [a-Z]와 일치합니다.
            [[:alnum:]]는 영문 알파벳 문자와 숫자 중 하나를 나타냅니다. [a-zA-Z0-9]와 일치합니다.

                                                                                                                                                
   " { } " - { }는 {숫자}로 표현하며 중괄호 안의 숫자는 앞의 문자의 개수를 나타냅니다.
            C{4}ry는 C가 ry 앞에 4개 존재하는 문자열을 나타냅니다.
            CCCCry를 나타냅니다. C{4,}ry는 C가 ry 앞에 적어도 4개 이상인 문자열을 나타냅니다.
            CCCCry , CCCCCry , CCCCCCry … 와 일치합니다.
            C{1,4}ry 는 C 가 ry 앞에 1 ~ 4개 존재하는 문자열을 나타냅니다.
            Cry , CCry , CCCry , CCCCry 와 일치합니다.

   " ( ) " - ( ) 는 이 안의 문자를 그룹화합니다.
            sky(cry)* 는 sky 뒤에 cry 가 하나 이상 있거나 없는 문자열을 나타냅니다.
            sky , skycry is good , skycrycrydd …. 와 일치합니다.

   " | " - | 는 OR 연산을 나타내 줍니다.
            sky|cry 는 sky 나 cry 를 나타내는 문자열을 나타냅니다. sky is good , cry is good..와 일치합니다.
            sky(cry|g)* 는 sky 뒤에 cry 나 g 가 없거나 하나 이상 존재하는 문자열을 나타냅니다.
            sky , skycry , sky is good , skygjjh … 등과 일치합니다.

                                      
   특수 기호 패턴에 비교하기 -
            특수 기호 " ^  .  [ ]  $  ( ) |  *  +  ?  { }  \ " 앞에 \를 붙여 표현합니다.
            하지만 [ ] 안에서 특수 기호를 사용할 경우 \를 붙이지 않고 그냥 표현합니다.
            \$+ 는 문자열 앞에 $ 기호가 하나 이상 포함된 문자열을 나타냅니다.
            $cry , $$$sky … 등과 일치합니다.
            [^.[]?*{}/\] 는 문자열 중에 "^" , " ." , " [" , " ]" , "? " , " * " , " { " ,
            " } " , "/ " , "\"문자가 포함된 문자열을 나타냅니다. Hi? , {cry} , … 등과 일치합니다.



출처: http://www.junjaewoo.com/kldp/ApacheMySQLPHP_Guide-KLDP-html/ApacheMySQLPHP_Guide-KLDP-8.html#ss8.1







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








< 테스트 예제 >

위 내용들을 적용한 테스트 소스~ 문의는 http://blog.naver.com/etwas0227.do 에게루~


<?
  // ex) php 에서 해당 페이지 접속한 client ip 구하기 //
  $ip = $_SERVER['REMOTE_ADDR'];
  $fullhost = gethostbyaddr($ip);
 
  echo ("Client IP : $ip <br>");
  echo ("Fullhost  : $fullhost <br>"); 
  echo ("Server IP : $ServerIP <br><br>");
 
  
  // ex) php 에서 아이피 추출하기 //
  // preg_match 함수적용
  echo ("preg_match - Fullhost Sample : 123.10.101.102 <br>");   
 
  preg_match("/^([^\.]+)+\.([^\.]+)/i", "123.10.101.102", $matches);   //1,2 단계 아이피 추출
  echo ("1,2 단계 아이피 : $matches[0] <br>");  
 
  preg_match("/[^\.\/]+\.[^\.\/]+$/", "123.10.101.102", $matches);   //3,4 단계 아이피 추출
  echo ("3,4 단계 아이피 : $matches[0] <br>");
 
  preg_match("/^([^\.]+)+\.([^\.]+)+\.([^\.]+)/i", "123.10.101.102", $matches);  //1,2,3 단계 아이피 추출
  echo ("1,2,3 단계 아이피 : $matches[0] <br><br>");  //결과 : 123.10.101


  // preg_replace 함수적용
  echo ("preg_replace - Fullhost Sample : 123.10.101.102 <br>");
  $fullhost = "123.10.101.102";
  //$host = preg_replace("/*./", "*.*.", $fullhost);
  //$fullhost = preg_replace("/^[^\.]+\.[^\.]+/", "*", $fullhost);
  $fullhost = preg_replace("/^([^\.]+)+\.([^\.]+)/", "*.*", $fullhost);
  echo ("Fullhost 해당 패턴 변형 : $fullhost <br>");
 
?>


<br>


<?

  // 특정 아이피 접속자만 해당 페이지 보여주기
   $ip = $_SERVER['REMOTE_ADDR'];
   $client_ip = gethostbyaddr($ip);    //사용자 접속아이피
preg_match("/^([^\.]+)+\.([^\.]+)/i", $client_ip, $matches);   //두 단계 아이피를 추출
$match_ip = $matches[0]; 

if ($match_ip == "12.34.56.78") {   //추출한 아이피와 접속가능 아이피 비교
 echo ("Match IP : $matches[0] <br>");  //해당페이지 내용보여줌

else
 exit;   //해당페이지 내용보여주지 않음
?>

<br>

2006/09/08 16:23 2006/09/08 16:23
이 글에는 트랙백을 보낼 수 없습니다

thegrendel (at) theriver.com



차례

Part 1. 소개
1. 왜 쉘 프로그래밍을 해야 하죠?
2. #! 으로 시작하기
2.1. 스크립트 실행하기
2.2. 몸풀기 연습문제(Preliminary Exercises)
Part 2. 기초 단계
3. 종료와 종료 상태(Exit and Exit Status)
4. 특수 문자
5. 변수와 매개변수 소개
5.1. 변수 치환(Variable Substitution)
5.2. 변수 할당(Variable Assignment)
5.3. Bash 변수는 타입이 없다(untyped)
5.4. 특수한 변수 타입
6. 쿼우팅(quoting)
7. 테스트
7.1. 테스트(Test Constructs)
7.2. 파일 테스트 연산자
7.3. 비교 연산자(이진)
7.4. 중첩된 if/then 조건 테스트
7.5. 여러분이 테스트문을 얼마나 이해했는지 테스트 해보기
8. 연산자 이야기(Operations and Related Topics)
8.1. 연산자(Operators)
8.2. 숫자 상수(Numerical Constants)
Part 3. 중급 단계(Beyond the Basics)
9. 변수 재검토(Variables Revisited)
9.1. 내부 변수(Internal Variables)
9.2. 문자열 조작
9.3. 매개변수 치환(Parameter Substitution)
9.4. 변수 타입 지정: declaretypeset
9.5. 변수 간접 참조
9.6. $RANDOM: 랜덤한 정수 만들기
9.7. 이중소괄호(The Double Parentheses Construct)
10. 루프와 분기(Loops and Branches)
10.1. 루프
10.2. 중첩된 루프
10.3. 루프 제어
10.4. 테스트와 분기(Testing and Branching)
11. 내부 명령어(Internal Commands and Builtins)
11.1. 작업 제어 명령어
12. 외부 필터, 프로그램, 명령어
12.1. 기본 명령어
12.2. 복잡한 명령어
12.3. 시간/날짜 명령어
12.4. 텍스트 처리 명령어
12.5. 파일, 아카이브(archive) 명령어
12.6. 통신 명령어
12.7. 터미널 제어 명령어
12.8. 수학용 명령어
12.9. 기타 명령어
13. 시스템과 관리자용 명령어
14. 명령어 치환(Command Substitution)
15. 산술 확장(Arithmetic Expansion)
16. I/O 재지향
16.1. exec 쓰기
16.2. 코드 블럭 재지향
16.3. 응용
17. Here Documents
18. 쉬어가기
Part 4. 고급 주제들(Advanced Topics)
19. 정규 표현식(Regular Expressions)
19.1. 정규 표현식의 간략한 소개
19.2. Globbing
20. 서브쉘(Subshells)
21. 제한된 쉘(Restricted Shells)
22. 프로세스 치환(Process Substitution)
23. 함수
23.1. 복잡 함수와 함수의 복잡성(Complex Functions and Function Complexities)
23.2. 지역 변수와 재귀 함수(Local Variables and Recursion)
24. 별칭(Aliases)
25. 리스트(List Constructs)
26. 배열
27. 파일들
28. /dev 와 /proc
28.1. /dev
28.2. /proc
29. 제로와 널(Of Zeros and Nulls)
30. 디버깅
31. 옵션
32. 몇 가지 지저분한 것들(Gotchas)
33. 스타일 있게 스크립트 짜기
33.1. 비공식 쉘 스크립팅 스타일시트
34. 자질구레한 것들
34.1. 대화(interactive)형 모드와 비대화(non-interactive)형 모드 쉘과 스크립트
34.2. 쉘 래퍼(Shell Wrappers)
34.3. 테스트와 비교: 다른 방법
34.4. 최적화
34.5. 팁 모음(Assorted Tips)
34.6. 괴상한 것(Oddities)
34.7. 이식성 문제(Portability Issues)
34.8. 윈도우즈에서의 쉘 스크립팅
35. Bash, 버전 2
36. 후기(Endnotes)
36.1. 저자 후기(Author's Note)
36.2. 저자에 대해서
36.3. 이 책을 만드는데 쓴 도구들
36.3.1. 하드웨어
36.3.2. 소프트웨어와 프린트웨어
36.4. 크레딧
서지사항
A. 여러분들이 보내준 스크립트들(Contributed Scripts)
B. Sed 와 Awk 에 대한 간단한 입문서
B.1. Sed
B.2. Awk
C. 특별한 의미를 갖는 종료 코드
D. I/O와 I/O 재지향에 대한 자세한 소개
E. 지역화(Localization)
F. 샘플 .bashrc 파일
G. 도스(DOS) 배치 파일을 쉘 스크립트로 변환
H. 연습문제
I. Copyright
예 목록
2-1. cleanup: /var/log 에 있는 로그 파일들을 청소하는 스크립트
2-2. cleanup: 위 스크립트의 향상되고 일반화된 버전.
3-1. 종료/종료 상태
3-2. !으로 조건을 부정하기
4-1. 코드 블럭과 I/O 재지향
4-2. 코드 블럭의 결과를 파일로 저장하기
4-3. 최근 하루동안 변경된 파일들을 백업하기
5-1. 변수 할당과 치환
5-2. 평범한 변수 할당
5-3. 평범하고 재미있는 변수 할당
5-4. 정수? 문자열?
5-5. 위치 매개변수
5-6. wh, whois 도메인 네임 룩업
5-7. shift 쓰기
6-1. 이상한 변수를 에코하기
6-2. 이스케이프된 문자들
7-1. 무엇이 참인가?
7-2. [ ]test 의 동일함
7-3. (( ))로 산술식 테스트 하기
7-4. 산술 비교와 문자열 비교
7-5. 문자열이 인지 테스트 하기
7-6. zmost
8-1. 산술 연산자 쓰기
8-2. && 와 || 를 쓴 복합 조건 테스트
8-3. 숫자 상수 표기법:
9-1. $IFS 와 빈 칸
9-2. 타임 아웃 처리 입력
9-3. 타임 아웃 처리 입력, 한 번 더
9-4. 내가 루트인가?
9-5. arglist: $* 과 $@ 로 인자를 나열하기
9-6. 일관성 없는 $*$@의 동작
9-7. $IFS 가 비어 있을 때 $*$@
9-8. 밑줄 변수(underscore variable)
9-9. 그래픽 파일을 다른 포맷 확장자로 이름을 바꾸면서 변환
9-10. 매개변수 치환과 : 쓰기
9-11. 변수의 길이
9-12. 매개변수 치환에서의 패턴 매칭
9-13. 파일 확장자 바꾸기:
9-14. 임의의 문자열을 파싱하기 위해 패턴 매칭 사용하기
9-15. 문자열의 접두, 접미어에서 일치하는 패턴 찾기
9-16. declare를 써서 변수 타입 지정하기
9-17. 간접 참조
9-18. awk에게 간접 참조를 넘기기
9-19. 랜덤한 숫자 만들기
9-20. RANDOM 으로 주사위를 던지기
9-21. RANDOM 에 seed를 다시 지정해 주기
9-22. C 형태의 변수 조작
10-1. 간단한 for 루프
10-2. 각 [list] 항목이 인자를 두 개씩 갖는 for
10-3. Fileinfo: 변수에 들어 있는 파일 목록에 대해 동작
10-4. for 문에서 파일 조작하기
10-5. in [list]가 빠진 for
10-6. for 문의 [list]에 명령어 치환 쓰기
10-7. 이진 파일에 grep 걸기
10-8. 특정 디렉토리의 모든 바이너리 파일에 대해 원저작자(authorship)를 확인 하기
10-9. 디렉토리에 들어 있는 심볼릭 링크들을 나열하기
10-10. 디렉토리에 들어 있는 심볼릭 링크들을 파일로 저장하기
10-11. C 형태의 for 루프
10-12. 배치 모드로 efax 사용하기
10-13. 간단한 while 루프
10-14. 다른 while 루프
10-15. 다중 조건 while 루프
10-16. C 형태의 문법을 쓰는 while 루프
10-17. until 루프
10-18. 중첩된 루프
10-19. 루프에서 breakcontinue의 영향
10-20. 여러 단계의 루프에서 탈출하기
10-21. 더 상위 루프 레벨에서 계속하기(continue)
10-22. case 쓰기
10-23. case로 메뉴 만들기
10-24. case용 변수를 만들기 위해서 명령어 치환 쓰기
10-25. 간단한 문자열 매칭
10-26. 입력이 알파벳인지 확인하기
10-27. select로 메뉴 만들기
10-28. 함수에서 select를 써서 메뉴 만들기
11-1. printf가 실제로 쓰이는 예제
11-2. read로 변수 할당하기
11-3. read로 여러줄의 입력 넣기
11-4. read파일 재지향과 같이 쓰기
11-5. 현재 작업 디렉토리 변경하기
11-6. let으로 몇 가지 산술 연산을 하기.
11-7. eval의 효과 보여주기
11-8. 강제로 로그 아웃 시키기
11-9. "rot13" 버전
11-10. 위치 매개변수와 set 쓰기
11-11. 변수를 "언셋"(unset) 하기
11-12. export를 써서, 내장된 awk 스크립트에 변수를 전달하기
11-13. getopts로 스크립트로 넘어온 옵션과 인자 읽기
11-14. 데이타 파일 "포함하기"
11-15. exec 효과
11-16. 작업을 계속 해 나가기 전에 프로세스가 끝나길 기다리기
12-1. CDR 디스크를 구울 때 ls로 목차 만들기
12-2. Badname, 파일 이름에 일반적이지 않은 문자나 공백 문자를 포함하는 파일을 지우기.
12-3. inode 로 파일을 지우기
12-4. 시스템 로그 모니터링용 xargs 로그 파일
12-5. copydir. xargs로 현재 디렉토리를 다른 곳으로 복사하기
12-6. expr 쓰기
12-7. date 쓰기
12-8. 스크립트에서 두 파일을 비교하기 위해 cmp 쓰기.
12-9. 낱말 빈도수 분석
12-10. 10자리 랜덤한 숫자 만들기
12-11. tail로 시스템 로그를 모니터하기
12-12. 스크립트에서 "grep"을 에뮬레이트 하기
12-13. 목록에 들어 있는 낱말들의 유효성 확인하기
12-14. toupper: 파일 내용을 모두 대문자로 바꿈.
12-15. lowercase: 현재 디렉토리의 모든 파일명을 소문자로 바꿈.
12-16. du: 도스용 텍스트 파일을 UNIX용으로 변환.
12-17. rot13: 초허접(ultra-weak) 암호화, rot13.
12-18. "Crypto-Quote" 퍼즐 만들기
12-19. 파일 목록 형식화.
12-20. column 으로 디렉토리 목록을 형식화 하기
12-21. nl: 자기 자신에게 번호를 붙이는 스크립트.
12-22. cpio로 디렉토리 트리 옮기기
12-23. rpm 아카이브 풀기
12-24. C 소스에서 주석을 제거하기
12-25. /usr/X11R6/bin 둘러보기
12-26. basenamedirname
12-27. 인코드된 파일을 uudecode하기
12-28. 저당에 대한 월 상환액(Monthly Payment on a Mortgage)
12-29. 진법 변환(Base Conversion)
12-30. 다른 방법으로 bc 실행
12-31. seq로 루프에 인자를 만들어 넣기
12-32. 키보드 입력을 갈무리하기
12-33. 파일을 안전하게 지우기
12-34. m4 쓰기
13-1. 지움 글자(erase character) 세팅하기
13-2. 비밀스런 비밀번호: 터미널 에코 끄기
13-3. 키누름 알아내기
13-4. pidof 로 프로세스를 죽이기
13-5. CD 이미지 확인하기
13-6. 한 파일에서 한번에 파일 시스템 만들기
13-7. 새 하드 드라이브 추가하기
13-8. killall, /etc/rc .d/init.d 에서 인용
16-1. exec으로 표준입력을 재지향 하기
16-2. 재지향된 while 루프
16-3. 다른 형태의 재지향된 while 루프
16-4. 재지향된 until 루프
16-5. 재지향된 for 루프
16-6. 재지향된 for 루프(표준입력, 표준출력 모두 재지향됨)
16-7. 재지향된 if/then 테스트
16-8. 이벤트 로깅하기
17-1. dummyfile: 두 줄짜리 더미 파일 만들기
17-2. broadcast: 로그인 해 있는 모든 사람들에게 메세지 보내기
17-3. cat으로 여러 줄의 메세지 만들기
17-4. 탭이 지워진 여러 줄의 메세지
17-5. Here document에서 매개변수 치환하기
17-6. 매개변수 치환 끄기
17-7. upload: "Sunsite" incoming 디렉토리에 파일 한 쌍을 업로드
17-8. "아무개"(anonymous) Here Document
20-1. 서브쉘에서 변수의 통용 범위(variable scope)
20-2. 사용자 프로파일 보기
20-3. 프로세스를 서브쉘에서 병렬로 돌리기
21-1. 제한된 모드로 스크립트 돌리기
23-1. 간단한 함수
23-2. 매개변수를 받는 함수
23-3. 두 숫자중 큰 수 찾기
23-4. 숫자를 로마 숫자로 바꾸기
23-5. 함수에서 큰 값을 리턴하는지 테스트하기
23-6. 큰 두 정수 비교하기
23-7. 사용자 계정 이름에서 실제 이름을 알아내기
23-8. 지역 변수의 영역(Local variable visibility)
23-9. 지역 변수를 쓴 재귀 함수
24-1. 스크립트에서 쓰이는 별칭(alias)
24-2. unalias: 별칭을 설정, 해제하기
25-1. "and list"를 써서 명령어줄 인자 확인하기
25-2. "and list"를 써서 명령어줄 인자를 확인하는 다른 방법
25-3. "or lists""and list"를 같이 쓰기
26-1. 간단한 배열 사용법
26-2. 배열의 특별한 특성 몇 가지
26-3. 빈 배열과 빈 원소
26-4. 아주 오래된 친구: 버블 정렬(Bubble Sort)
26-5. 복잡한 배열 어플리케이션: 에라토스테네스의 체(Sieve of Erastosthenes)
26-6. 복잡한 배열 어플리케이션: 기묘한 수학 급수 탐색(Exploring a weird mathematical series)
26-7. 2차원 배열을 흉내낸 다음, 기울이기(tilting it)
28-1. 특정 PID와 관련있는 프로세스 찾기
28-2. 온라인 연결 상태
29-1. 쿠키 항아리를 숨기기
29-2. /dev/zero로 스왑 파일 세팅하기
29-3. 램디스크 만들기
30-1. 버그 있는 스크립트
30-2. test24, 버그가 있는 다른 스크립트
30-3. "assert"로 조건을 테스트하기
30-4. exit 잡아채기(Trapping at exit)
30-5. Control-C 가 눌렸을 때 깨끗이 청소하기
30-6. 변수 추적하기
32-1. 서브쉘 함정(Subshell Pitfalls)
34-1. 쉘 래퍼(shell wrapper)
34-2. 조금 복잡한 쉘 래퍼(shell wapper)
34-3. awk 스크립트 쉘 래퍼(shell wrapper)
34-4. Bash 스크립트에 내장된 펄
34-5. 하나로 묶인 Bash 스크립트와 펄 스크립트
34-6. 자신을 재귀적으로 부르는 스크립트
35-1. 문자열 확장
35-2. 간접 변수 참조 - 새로운 방법
35-3. 배열과 약간의 트릭을 써서 한 벌의 카드를 4명에게 랜덤하게 돌리기
A-1. manview: 포맷된 맨 페이지를 보는 스크립트
A-2. mailformat: 이메일 메세지를 포맷해서 보기
A-3. rn: 간단한 파일이름 변경 유틸리티
A-4. encryptedpw: 로컬에 암호화 되어 있는 비밀번호로 ftp 사이트에 파일을 업로드하는 스크립트
A-5. copy-cd: 데이타 CD를 복사하는 스크립트
A-6. days-between: 두 날짜 사이의 차이를 계산해 주는 스크립트
A-7. behead: 메일과 뉴스 메세지 헤더를 제거해 주는 스크립트
A-8. ftpget: ftp에서 파일을 다운로드 해 주는 스크립트
A-9. password: 8 글자짜리 랜덤한 비밀번호 생성 스크립트
A-10. fifo: 네임드 파이프를 써서 매일 백업해 주는 스크립트
A-11. 나머지 연산자로 소수 생성하기
A-12. tree: 디렉토리 구조를 트리 형태로 보여주는 스크립트
A-13. 문자열 함수들: C 형태의 문자열 함수
A-14. 객체 지향 데이타 베이스
F-1. 샘플 .bashrc 파일
G-1. VIEWDATA.BAT: 도스용 배치 파일
G-2. viewdata.sh: VIEWDATA.BAT 의 스크립트 버전

출처 : http://wiki.kldp.org/HOWTO//html/Adv-Bash-Scr-HOWTO/index.html

        http://blog.naver.com/misadamo.do?Redirect=Log&logNo=80001904458

2006/09/08 16:23 2006/09/08 16:23
이 글에는 트랙백을 보낼 수 없습니다
HTML/JAVASCRIPT  2006/09/08 16:04
출처 블로그 > VirusDesign 세포배양실
원본 http://blog.naver.com/goodvirus/40017546278

#언어 요소엘레멘트설명ECMA
HTML / DHTML 목록HTML / DHTML 엘레멘트들의 목록
Aa<A>웹문서 연결 엘레멘트 A을 참조한다.
acronym<ACRONYM>약어 엘레멘트 ACRONYM을 참조한다.
activeElements 개체의 최상위 활성 시간 자식 엘레멘트의 컬렉션 배열변수을 참조
ActiveXObject IE 자동화 개체 참조를 반환한다.x
address<ADDRESS>주소 블럭 엘레멘트 ADDRESS을 참조한다.
all 해당 개체의 모든 엘레멘트의 컬렉션 배열변수을 참조한다.
anchor<A name=...>연결 이름을 갖는 개체이다.x
anchors 문서의 모든 연결 이름들의 컬렉션 배열변수을 참조한다.
animate(시간)<t:ANIMATE>개체에 지정된 애트리뷰트를 애니메이션한다.
animateColor(시간)<t:ANIMATECOLOR>엘레멘트의 색상을 시간에따라 변환시킨다.
animateMotion(시간)<t:ANIMATEMOTION>엘레멘트의 부분을 시간에따라 애니메이션시킨다.
animation(시간)<t:ANIMATION>HTML 문서에서 애트리뷰트에 시간에 따른 애니메이션을 정의한다.
applet<APPLET>플레이 할수 있는 애플릿 개체를 참조한다.x
applets 문서의 모든 애플릿들의 컬렉션 배열변수을 참조한다.
area<AREA>이미지맵 연결 지역 개체를 참조한다.x
areas 이미지맵 지역 개체 엘레멘트 들의 컬렉션 배열변수을 참조한다.
arguments 기능함수에 전달된 인수 개체 argument들의 컬렉션을 참조한다.o
Array 배열변수 개체를 만들거나 참조한다.o
<PUBLIC:ATTACH>개체에서 이벤트가 발생되면 기능을 호출하도록 기능을 연결시킨다.
attribute 엘레멘트의 속성을 참조한다.
attributes 엘레멘트의 모든 속성들의 컬렉션 배열변수을 참조한다.
audio(시간)<t:AUDIO>HTML 문서에서 애트리뷰트에 시간에 따른 오디오를 정의한다.
Bb<B>글꼴 굴게 표시하는 엘레멘트 <B>을 참조한다.
base<BASE>문서의 기본을 지정하는 엘레멘트 <BASE>을 참조한다.
baseFont<BASEFONT>문서의 기본 글꼴을 지정하는 엘레멘트 <BASEFONT>을 참조한다.
bdo<BDO>지정된 부분의 글자 방향을 덮어 씌우는 엘레멘트을 참조한다.
behaviorUrns 엘레멘트에 첨부된 비헤비어 주소들의 컬렉션 배열변수을 참조한다.
bgSound<BGSOUND>문서의 배경음악을 지정하는 엘레멘트 <BGSOUND>을 참조한다.
big<BIG>큰 글자로 표현하는 엘레멘트 <BIG>을 참조한다.
blockFormats 모든 블럭양식 태그들의 문자열 컬렉션 배열변수을 참조한다.
blockQuote<BLOCKQUOTE>들여쓰기하는 블럭 엘레멘트 <BLOCKQUOTE>을 참조한다.
body<BODY>문서의 본체인 엘레멘트 <BODY>을 참조한다.
bookmarks 모든 북마크들의 컬렉션 배열변수을 참조한다.
Boolean 새 부울값을 만들거나 참조한다.o
boundElements 데이터세트에 반향되는 엘레멘트들의 컬렉션 배열변수을 참조한다.
br<BR>줄바꿈을 실행하는 엘레멘트 <BR>을 참조한다.
button<BUTTON>단추 엘레멘트 <BUTTON>을 참조한다.
button<INPUT type=button>엘레멘트 <INPUT type=button>을 참조한다.
Ccaption<CAPTION>테이블의 제목을 나타내는 엘레멘트 <CAPTION>을 참조한다.
cells 테이블 줄이나 전체 테이블의 칸(cell)들의 컬렉션을 참조한다.
center<CENTER>내용을 중앙에 표현하는 엘레멘트 <CENTER>을 참조한다.
checkbox<INPUT type=checkbox>입력폼의 체크박스 개체
childNodes 개체의 자식 엘레멘트나 텍스트노드들의 컬렉션을 참조한다.
children 개체의 직접 자식 엘레멘트들의 컬렉션 배열변수을 참조한다.
cite<CITE>기울여 쓰는 인용 문구 엘레멘트 <CITE>을 참조한다.
clientInformation IE 웹 브라우저 정보를 제공하는 개체를 참조한다.
clipboardData 잘라내기 데이터를 보관하는 양식 개체를 참조한다.
code<CODE>글자 간격이 일정한 라인모드 엘레멘트 <CODE>을 참조한다.
col<COL>테이블의 컬럼(col)을 지정한는 엘레멘트 <COL>을 참조한다.
colGroup<COLGROUP>테이블의 컬럼(col)들 묶음을 지정하는 엘레멘트을 참조한다.
컬렉션(collection) 목록개체들의 배열변수를 참조한다.
comment<COMMENT>수행되지 않고 표현되지 않는 주석 엘레멘트을 참조한다.
<PUBLIC:COMPONENT>파일의 내용을 HTC(HTML Component)로서 인식한다.
controlRange createControlRange/createRange 메서드로 생성된 개체 컬렉션 참조
currentStyle 공통, 인라인, 애트리뷰트등 종합적으로 적용되는 스타일쉬트 참조
currTimeState(시간) 시간(HTML+time timeline)에 관한 정보를 포함한 개체이다.
custom<CUSTOMTAG:className>작성자가 작성한 엘레멘트 <CUSTOM>을 참조한다.
DdataTransfer 드리그드롭 작업에서 클립보드에 접속을 제공한다.
Date 날짜와 시간 반환/저장o
dd<DD>엘레멘트 <DD>을 참조한다.
defaults<PUBLIC:DEFAULTS>에레멘트에 프로그램적으로 설정된 디폴트 속성들을 참조한다.
del<DEL>엘레멘트 <DEL>을 참조한다.
<DEVICERECT/>LAYOUTRECT 엘레멘트나 인쇄 템플릿의 용기를 제공한다.
dfn<DFN>엘레멘트 <DFN>을 참조한다.
Dialog IE 대화상자 개체를 참조한다.
dialogArguments 속성들에 접속, 미리보기 대화창에 전달하는 인쇄 템플레이트 제공
DialogHelper 색상, 블럭양식, 글꼴양식의 도움 대화창에 접속하는 개체를 참조
Dictionary IE 데이터 키-항목 쌍을 저장x
dir<DIR>엘레멘트 <DIR>을 참조한다.
div<DIV>엘레멘트 <DIV>을 참조한다.
dl<DL>엘레멘트 <DL>을 참조한다.
doctype<!DOCTYPE>문서에 맞는 DTD(Document Type Definition)를 참조한다.
document 문서 개체를 참조한다.
DOMDocument<XML>엘레멘트 <XML> 최상위 노드(node)를 참조한다.
Drive IE 드라이브나 공유 네트워크에 액세스 가능
Drives 컬렉션 IE 모든 드라이브의 읽기 전용 컬렉션
dt<DT>엘레멘트 <DT>을 참조한다.
Eelement 주 문서에 있는 behavior가 첨부된 태그의 참조를 반환한다.
elements 주어진 form 의 입력내용들의 컬렉션을 원본 순서로 참조한다.
em<EM>엘레멘트 <EM>을 참조한다.
embed<EMBED>엘레멘트 <EMBED>을 참조한다.
embeds 엠베드된 개체의 배열변수 컬렉션 배열변수을 참조한다.
Enumerator IE 컬렉션에 있는 항목들을 열거 가능x
Error IE 실행 중 발생하는 오류 정보x
event 마우스, 키입력등 이벤트
<PUBLIC:EVENT>모체 문서에 나타나는HTC의 이벤트를 정의한다.
excl(시간)<t:EXCL>한 자식 개체만 주어진 시간에 플레이하게 허용되는 시간용기 정의
external 호스트에서 제공한 추가적인 개체모델에 접속할 수있게 방식을 제공
fieldSet 필드세트에 포함된 텍스트와 엘레멘트들을 둘러싼 박스를 만듬
FFile IE 파일의 모든 속성에 액세스 가능
Files 컬렉션 IE 폴더 안에 있는 모든 File 개체의 컬렉션
FileSystemObject IE 컴퓨터 파일 시스템에 액세스x
FileUpload<INPUT type=file>입력폼의 file(화일 업로드) 개체
FileUploadControl 파일이나 폴더를 서버에 보낼 수 있게 제어
filter IE 필터 관련 개체(filter 속성)
filters 개체의 필터들의 배열변수 컬렉션 배열변수을 참조한다.
Folder IE 폴더의 모든 폴더, 화일에 액세스 가능
Folders 컬렉션 IE Folder 속의 모든 Folder 개체의 컬렉션
font<FONT>엘레멘트 <FONT>을 참조한다.
fonts 시스템이 지원하는 글꼴들의 컬렉션 배열변수을 참조한다.
form<FORM>입력폼 개체및 배열변수
forms form 개체들의 컬렉션 배열변수을 참조한다.
frame<FRAME>프레임 개체및 배열변수
frames frame 개체들의 컬렉션 배열변수을 참조한다.
frameSet<FRAMESET>엘레멘트 <FRAMESET>을 참조한다.
Function 새로운 기능함수를 만듬o
GGlobal 전역 메서드들을 모은 내부개체o
Hhead<HEAD>엘레멘트 <HEAD>을 참조한다.
<HEADERFOOTER/>인쇄 템플릿이 머릿글/바닥글 양식화할 수 있도록 도구를 제공
hidden<INPUT type=hidden>입력폼의 감춤 개체
history 방문한 기록의 개체및 배열변수
hn<Hn>엘레멘트 <H1>~<H6>을 참조한다.
hr<HR>엘레멘트 <HR>을 참조한다.
HTC HTC(HTML Components)에 대한 설명
HTA<HTA>엘레멘트 <HTML>을 참조한다.
html<HTML>엘레멘트 <HTML>을 참조한다.
HTML 주석HTML에서의 주석부분 <!--- .... -->을 참조한다.
Ii<I>엘레멘트 <I>을 참조한다.
iFrame<IFRAME>엘레멘트 <IFRAME>을 참조한다.
IHTMLElement 인터페이스를 제공한다.
images img 개체들의 컬렉션 배열변수을 참조한다.
Image, img<IMG>엘레멘트 <IMG> 이미지 개체를 생성하고 참조한다.
img<INPUT type=image>엘레멘트 <INPUT type=image>을 참조한다.
img(시간)<t:IMG>HTML 문서에서 애트리뷰트에 시간에 따른 이미지를 정의한다.
implementation 개체에 의하여 지원되는 모듈들에 대한 정보를 참조한다.
imports styleSheet 개체들로 도입된 스타일쉬트들의 컬렉션을 참조
input<INPUT>엘레멘트 <INPUT>을 참조한다.
(input) button<INPUT type=button>엘레멘트 <INPUT type=button>을 참조한다.
(input) checkbox<INPUT type=checkbox>엘레멘트 <INPUT type=checkbox>을 참조한다.
(input) FileUpload<INPUT type=file>엘레멘트 <INPUT type=file>을 참조한다.
(input) hidden<INPUT type=hidden>엘레멘트 <INPUT type=hidden>을 참조한다.
(input) img<INPUT type=image>엘레멘트 <INPUT type=image>을 참조한다.
(input) password<INPUT type=password>엘레멘트 <INPUT type=password>을 참조한다.
(input) radio<INPUT type=radio>엘레멘트 <INPUT type=radio>을 참조한다.
(input) reset<INPUT type=reset>엘레멘트 <INPUT type=reset>을 참조한다.
(input) submit<INPUT type=submit>엘레멘트 <INPUT type=submit>을 참조한다.
(input) text<INPUT type=text>엘레멘트 <INPUT type=text>을 참조한다.
ins<INS>엘레멘트 <INS>을 참조한다.
isIndex<ISINDEX>엘레멘트 <ISINDEX>을 참조한다.
JKkbd<KBD>엘레멘트 <KBD>을 참조한다.
Llabel<LABEL>엘레멘트 <LABEL>을 참조한다.
layer<LAYER>NS 레이어 개체및 배열변수
<LAYOUTRECT />인쇄나 인쇄 미리보기 템플릿에 용기 엘레멘트를 생성하고 참조
legend<LEGEND>엘레멘트 <LEGEND>을 참조한다.
li<LI>엘레멘트 <LI>을 참조한다.
link<LINK>연결 개체 엘레멘트 <LINK>을 참조한다.
links 연결 개체 link 개체들의 컬렉션 배열변수을 참조한다.
listing<LISTING>개체 엘레멘트 <LISTING>을 참조한다.
location 문서 주소 개체
Mmap<MAP>개체 엘레멘트 <MAP>을 참조한다.
marquee<MARQUEE>개체 엘레멘트 <MARQUEE>을 참조한다.
Math 계산기능과 상수를 제공하는 내부개체o
media(시간)<t:MEDIA>HTML 문서에서 애트리뷰트에 시간에 따른 메디어를 정의한다.
MediaItem 메디어 플레이어의 플레이 항목 중 한개의 항목을 참조한다.
menu<MENU>개체 엘레멘트 <MENU>을 참조한다.
meta<META>개체 엘레멘트 <META>을 참조한다.
<PUBLIC:METHOD>모체 문서에 나타나는HTC의 메서드를 정의한다.
mimeType Multipart Internet Mail Extension 개체x
mimeTypes 아직 적용되는 곳이 없다.
Nnamespace<HTML xmlns:newNS>이름자리 개체
namespaces namespace 개체들의 컬렉션 배열변수을 참조한다.
navigator 브라우저 개체
nextID<NEXTID>문서 편집기나 프로그램이 읽을 수 있는 유일한 인식자를 제공한다.
noBR<NOBR>개체 엘레멘트 <NOBR>을 참조한다.
noFrames<NOFRAMES>엘레멘트 <NOFRAMES>을 참조한다.
noScript<NOSCRIPT>엘레멘트 <NOSCRIPT>을 참조한다.
Number 숫자 데이터 개체o
OObject<OBJECT>모든 개체에 공통적인 기능함수 제공o
ol<OL>개체 엘레멘트 <OL>을 참조한다.
optGroup<OPTGROUP>개체 엘레멘트 <OPTGROUP>을 참조한다.
Option<OPTION>입력폼 선택 입력 개체및 배열변수
options option 개체들의 컬렉션 배열변수을 참조한다.
Pp<P>엘레멘트 <P>을 참조한다.
page<PAGE>엘레멘트 <PAGE>을 참조한다.
pages page 개체들의 컬렉션 배열변수을 참조한다.
par(시간)<t:PAR>애트리뷰트에 독립적으로 시간을 관리하는 새 시간 용기를 정의
param<PARAM>엘레멘트 <PARAM>을 참조한다.
password<INPUT type=password>입력폼 암호 입력 개체
plainText 아직 적용되는 곳이 없다.
playItem 연주 항목을 참조한다,
playList 연주 항목 playItem 개체들의 컬렉션을 참조한다,
PlaylistInfo 메디어 플레이어의 플레이 목록에 대한 정보를 참조한다.
plugin 플러그인된 개체 엘레멘트를 참조한다.
plugins plugin 개체들의 컬렉션 배열변수을 참조한다.
popup 메인 윈도우 이외의 대화창, 메시지창등 보조창 개체
pre<PRE>엘레멘트 <PRE>을 참조한다.
priorityClass(시간)<t:PRIORITYCLASS>excl의 일시중지/중지를 갖는 자식들 구룹을 정의한다.
<PUBLIC:ATTACH>개체에서 이벤트가 발생되면 기능을 호출하도록 기능을 연결시킨다.
<PUBLIC:COMPONENT>파일의 내용을 HTC(HTML Component)로서 인식한다.
<PUBLIC:DEFAULTS>엘레멘트 비헤비어에 디폴트값을 반환하거나 설정한다.
<PUBLIC:EVENT>모체 문서에 나타나는HTC의 이벤트를 정의한다.
<PUBLIC:METHOD>모체 문서에 나타나는HTC의 메서드를 정의한다.
<PUBLIC:PROPERTY>모체 문서에 나타나는HTC의 속성을 정의한다.
Qq<Q>엘레멘트 <Q>을 참조한다.
Rradio<INPUT type=radio>입력폼 레디오 단추 입력 개체
RegExp 정규식 패턴 검색에 관한 정보 저장x
ref(시간)<t:REF>HTML 문서에서 시간에 따른 엘레멘트의 참조를 정의한다.
Regular Expression 정규식 패턴을 포함함x
reset<INPUT type=reset>입력폼 재설정 단추 개체
rows row 개체들의 컬렉션 배열변수을 참조한다.
rt<RT>IE 엘레멘트 <RT>을 참조한다.
ruby<RUBY>IE 엘레멘트 <RUBY>을 참조한다.
rule 스타일쉬트에서 지정한 내용을 참조한다.
rules rule 개체들의 컬렉션 배열변수을 참조한다.
runtimeStyle 스타일쉬트에서 지정한 내용을 참조한다.
Ss<S>엘레멘트 <S>을 참조한다.
samp<SAMP>엘레멘트 <SAMP>을 참조한다.
screen 컴퓨터 스크린 개체
script<SCRIPT>엘레멘트 <SCRIPT>을 참조한다.
scripts script 개체들의 컬렉션 배열변수을 참조한다.
select<SELECT>입력폼 선택사항 개체
selection 입력폼 선택사항 개체
seq(시간)<t:SEQ>순차적으로 진행하는 시간 용기 엘레멘트를 정의한다.
set(시간)<t:SET>선택으로 선택에 따른 내용을 디스플레이 할 수 있게한다.
small<SMALL>엘레멘트 <SMALL>을 참조한다.
span<SPAN>엘레멘트 <SPAN>을 참조한다.
strike<STRIKE>엘레멘트 <STRIKE>을 참조한다.
String 문자열 서식, 조작, 문자열 발취등o
strong<STRONG>엘레멘트 <STRONG>을 참조한다.
style<STYLE>엘레멘트의 인라인 스타일(<ELEMENT style=...>)을 참조한다.
styleSheet<STYLESHEET>styleSheets 컬렉션의 개별 <STYLESHEET> 개체를 참조
styleSheets styleSheet 개체들의 컬렉션 배열변수을 참조한다.
sub<SUB>엘레멘트 <SUBG>을 참조한다.
submit<INPUT type=submit>입력폼 송신단추 개체
switch(시간)<t:SWITCH>사용자가 선택으로 선택에 따른 내용을 디스플레이 할 수 있게한다.
sup<SUP>엘레멘트 <SUP>을 참조한다.
Ttable<TABLE>엘레멘트 <TABLE>을 참조한다.
tBodies tBody 개체들의 컬렉션 배열변수을 참조한다.
tBody<TBODY>엘레멘트 <TBODY>을 참조한다.
td<TD>엘레멘트 <TD>을 참조한다.
TDC 테이블적 데이터 제어(Tabular Data Control)를 제공한다.
<TEMPLATEPRINGER />인쇄를 설정하고 인쇄작업을 제어하는 인쇄 템플레이트를 제공
text<INPUT type=text>입력폼 문자열 입력 개체
textArea<TEXTAREA>입력폼 여러줄 문자열 입력 개체
TextNode 문서의 계통도에서 노드(node)로서의 택스트 문자열을 참조한다.
TextRange HTML 엘레멘트의 택스트를 참조한다.
TextRanges TextRange 개체들의 컬렉션 배열변수을 참조한다.
TextRectangle 한줄 텍스트나 TextRange 개체에 포함된 사각형을 참조
TextRectangles TextRectangle 개체들의 컬렉션 배열변수을 참조한다.
TextStream IE 파일에 순차적으로 쉽게 액세스
tFoot<TFOOT>엘레멘트 <TFOOT>을 참조한다.
th<TH>엘레멘트 <TH>을 참조한다.
tHead<THEAD>엘레멘트 <THEAD>을 참조한다.
timeAll 시간 엘레멘트 개체들의 컬렉션 배열변수을 참조한다.
timeChildren 개체의 직접 자식 시간 엘레멘트들의 컬렉션을 찹조한다.
title<TITLE>엘레멘트 <TITLE>을 참조한다.
tr<TR>엘레멘트 <TR>을 참조한다.
transitionFilter(시간)<t:TRANSITIONFILTER>엘레멘트들에 표현된 내용의 애니메이션 변환을 진행
tt<TT>엘레멘트 <TT>을 참조한다.
Uu<U>엘레멘트 <U>을 참조한다.
ul<UL>엘레멘트 <UL>을 참조한다.
Url 웹문서 주소 개체x
userProfile IE 사용자 프로파일 개체x
Vvar<VAR>엘레멘트 <VAR>을 참조한다.
VBArray IE Visual Basic 안전 배열에 액세스x
video(시간)<t:VIDEO>HTML 문서에서 애트리뷰트에 시간에 따른 비디오를 정의한다.
Wwbr<WBR>엘레멘트 <VAR>을 참조한다.
window 윈도우, 프레임 개체
Xxml<XML>엘레멘트 <XML>을 참조한다.
xmp<XMP>엘레멘트 <XMP>을 참조한다.
YZ사용자 정의 개체 사용자정의 개체


자료출처 : http://koxo.com/lang/js/


2006/09/08 16:04 2006/09/08 16:04
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 플젝트 하면서 이것 저것
원본 http://blog.naver.com/btchae/80005155493

/*
Text
jsChangeComma( str ) ' -> ` 로 대치
jsStrCheck(checkStr, checkOK)
  들어가서는 안되는 데이타(checkOK)가 checkStr에 포함되어있는지 체크
jsMoveFocus( varTextObj, varLength, varFocusToObj )
  TextBox에서 조건이 만족하면 특정객체로 포커스를 이동
jsCheckNull( toCheck ) toCheck의 값이 Null값인지를 체크
jsDeleteComma( varNumber ) 컴마를 삭제하고 리턴
jsDeleteChar( varText, varDelete ) 문자열에서 해당 character를 지우고 리턴

CheckBox
jsCheckBoxSelectedCnt( FormObj, checkBoxName )
  FormObj에서 checkBox 가 몇개 선택되었는지  리턴한다.
jsToggle(FormObj, elemNm, checkYn)
  특정 폼안의 체크박스오브젝트를 전체선택하거나 전체반전시킴
 
SelectBox
jsCheckSelectBox ( sb ) SelectBox에서 선택된 값의 value를 리턴
jsCheckSelectBoxNm ( sb ) SelectBox에서 선택된 값의 Text를 리턴
cmInitSelectBox( varObjFullNm, varDeleteCnt )
  해당 SelectBox를 초기화 시킨다. varDeleteCnt가 1이면 첫번째값을 지우지 않는다.
cmMakeSelectBox( varObjFullNm, varText, varValue ) 해당 selectBox에 하나의 값을 추가시킴
  
날짜 
jsCheckYYYY(toCheck) 년도를 체크
jsCheckYYYYMM(toCheck) 년월을 체크
jsCheckMM(toCheck) 월을 체크
jsCheckDD(yyyy,mm,toCheck) 일을 체크
jsCheckDate( dateVal ) 날짜를 체크
jsAddYear( startDt, plusYear ) 날짜에 년수를 더함
jsAddMonths( startDt, plusMonth ) 날짜에 월수를 더함
jsGetBetweenDay( startDt, endDt ) 날짜와 날짜사이의 일수를 리턴
jsCheckTime( toCheck ) 시간포맷인지를 체크
jsMakeYyyyMm( varTextObj )
  해당 텍스트박스 객체필드에 YYYY/MM형식으로 [/]를 찍어서 채워준다.
jsMakeYyyyMmString( varText ) 넘어온 값에 날짜형식으로 [/]를 찍어서 리턴.
jsMakeDate( varTextObj ) 넘어온 Object의 값을 날짜형식으로 채워줌
jsMakeDateString( varText )넘어온 값을 날짜형식으로 리턴
toTimeString( varDateObj ) DateObj를 넘겨주면 년월일을 리턴  20030201
jsAfterThisDate( varStdDate , varYYYY , varMM , varDD )
  날짜형식의 문자열에 특정 년, 월, 일을 더한값을 리턴


날짜 체크 사용 예 호출하는 페이지에 다음 부분을 추가

<input ... onKeyUp='jsChkDate(this,lottSearchForm.txtEdate)' onBlur='compareDate()'>


function compareDate(){  

if( jsCheckNull(document.forms[0].txtSdate.value) ||

    jsCheckNull(document.forms[0].txtEdate.value) )
    return;
 
var from = document.forms[0].txtSdate.value.replace(/(\,|\.|\-|\/|\:)/g,'');
var to   = document.forms[0].txtEdate.value.replace(/(\,|\.|\-|\/|\:)/g,'');

if( jsGetBetweenDay(from,to) < 0 ) {
 alert("기간이 잘못 입력되었습니다. 다시입력하세요");
 document.forms[0].txtSdate.value = "";
 document.forms[0].txtEdate.value = "";
 document.forms[0].txtSdate.focus();
 return ;
}

}

function jsChkDate( valObj, nextPos ){

if( valObj.value.length == 8 ) {
 if( !jsCheckDate( valObj.value ) ) {
  alert("일자 입력오류입니다. 다시 입력해 주십시요.");
  valObj.value = '';
  valObj.focus();
  return;
 }  
 jsMakeDate( valObj );
 nextPos.focus();

}

           

 
주민등록번호
jsCheckJumin(toCheck) 주민등록번호 체크

사업자등록번호
jsCheckSaupJa(toCheck) 사업자등록번호 체크

문자열길이 체크
getByteLength(s) 한글2바이트, 영문 1바이트로 바이트수를 리턴

쿠키
setCookie( name, value, expireFlag ) Set Cookie
getCookie( name ) get Cookie

숫자
jsParseInt( varStr ) 문자를 숫자로 변환 null일때
jsConvertNumberToHangul( varNum ) 숫자를 한글로 변환
jsMakeCurrency( varTextObj ) 넘어온 숫자에 컴마를 찍어서 리턴 소숫점 허용안함
jsMakeForeignCurrency( varTextObj ) 넘어온 숫자에 컴마를 찍어서 리턴 소숫점 허용함
jsOnlyNumber( varTextObj ) 해당 텍스트박스 객체에 숫자만 입력받을수 있도록
jsOnlyFloat( varTextObj ) 해당 텍스트박스 객체에 숫자와 1개의 point만을 입력받게 해준다.
jsAddComma( varNumber )
  숫자를 받아서 comma를 찍어서 리턴한다 소수점 인식 숫자가 아닌값 -1을 리턴 음수표현가능
jsAddCommaAndZero( varNumber )
  숫자를 받아서 comma를 찍어서 리턴한다 소수점 인식 숫자가 아닌값 -1을 리턴 음수표현 불가능
jsCheckFloat(toCheck) Folat형인지를 체크 정수도 Float으로 인식
jsCheckPoint( toCheck , Positive , Negative ) 자리수 체크 정수 몇자리 소수 몇자리
jsCheckNumber(toCheck) Number타입인지 체크, 소수점은 Number타입으로 인식하지 않음 
getCutNumber(num, place) 소수점 아래 몇자리 이하 절삭
jsOnlyNumberKey() text 입력시 숫자이외의 키를 눌렀을때 무효화시킨다.
jsCheckFloatType( varNum, varLeft, varRight ) 정수부분자리수 소수부분자리수 체크 
 
기타
jsSplitCode(varString, varSplitChar, varIndex) 구분자로 구분해서 index의 문자를 리턴
jsCheckIp(toCheck) toCheck값이 정확한 IP Address인지 체크
jsCheckEmail( emailVal ) 이메일을 체크 - 보완요망
jsShowHelp( helpfile ) helpfile를 팝업으로 오픈
jsGetObjCnt( FormObj, varObjName ) 특정폼에서 해당오브젝트가 몇개인지를 리턴
jsClearFrame( fr ) 특정프레임에 공백 jsp를 띄워줌
jsDeleteCharAll( FormObj )
  해당 폼에 해당하는 모든 오브젝트의 값들에서 ',' and '/'문자를 지워준다.   
isAlphaNum(input) 영문과 숫자로만 이루어졌는지를 체크

IsHangul(field) 입력값에 한글이 있는지 체크
containsCharsOnly(input,chars) 입력값이 특정 문자(chars)만으로 되어있는지 체크
popup1( varAction, varWinName, varWidth, varHeight ) 팝업을 호출
jsBack() 이전 페이지로 이동
jsVisible( str ) 특정조건에 해당하면 모래시계를 보여줌
jsRunAfterTime() 설정한 시간뒤에 특정 function을 호출
trim(text) ltrim(text) rtrim(text) text의 좌우측, 좌측, 우측의 공백을 제거해서 리턴
*/


/*--------------------------------------------------
  기능   : Cookie Setting
  INPUT  : name, value
          expireFg : 'Y' : 2020년 까지 쿠키저장
          expireFg : 'N' : session이 끊어질때 쿠키지움
  RETURN : NONE
----------------------------------------------------*/
function setCookie( name, value, expireFg ) {
   var expireDate = new Date ( 2020, 1, 1, 1, 1, 1 ) ;

   if ( expireFg = 'Y' )
       document.cookie = name + "=" + value + "; expires=" + expireDate.toGMTString() ;
   else
       document.cookie = name + "=" + value + ";" ;

}
/*--------------------------------------------------
  기능   : Cookie Get
  INPUT  : name
  RETURN : 쿠키값( 없으면 "" )
----------------------------------------------------*/
function getCookie( name ) {
   var cookieFound = false ;
   var start = 0 ;
   var end   = 0 ;
   var cookieString = document.cookie ;

   var i = 0 ;

   // name에 해당되는 cookie를 찾는다.
   while ( i <= cookieString.length ) {
       start = i ;
       end = start + name.length ;
       if ( cookieString.substring( start, end ) == name ) {
           cookieFound = true ;
           break ;
       }
       i++ ;
   }

   // cookie를 찾았으면 해당하는 값을 그렇지 않으면 ""을 return ;
   if ( cookieFound ) {
       start = end + 1 ;
       end   = document.cookie.indexOf(";",start) ;
       if ( end < start )
           end = document.cookie.length ;
       return document.cookie.substring( start, end ) ;
   }

   return "" ;
}

/*-----------------------------------------------
' ->문자를 쿼리문에 사용시 에러가 발생하므로 `로 대치
INPUT  : str
RETURN : 문자열안의 문자중 ' 문자를 ` 로 변경한 문자열
-------------------------------------------------*/
function jsChangeComma( str ){
while( str.indexOf("'") != -1 ){
 str = str.replace("'","`");
}
   return str;
}

/*----------------------------------------------------------
  기능   : Split Code RETURN Splited code by varSplitChar
  INPUT  : varString 문자
     : varSplitChar 구분자
  : varIndex 구분자의 위치
  RETURN : Splited code by varSplitChar
  예     : jsSplitCode( "111^222^333", "^", 2 ) == "222"
-----------------------------------------------------------*/
function jsSplitCode(varString, varSplitChar, varIndex) {
var varArray = varString.split(varSplitChar) ;

return varArray[eval(varIndex)-1];
}

/*--------------------------------------------------
  기능   : Check Null RETURN T/F
  INPUT  : check  data
  RETURN : true  -> NULL
          false -> NOT NULL
----------------------------------------------------*/
function jsCheckNull( toCheck )
{
    var chkstr = toCheck + "";
    var is_Space = true ;

    if ( ( chkstr == "") || ( chkstr == null ) )
   return( true );

    for ( j = 0 ; is_Space && ( j < chkstr.length ) ; j++)
    {
     if( chkstr.substring( j , j+1 ) != " " )
        {
       is_Space = false ;
        }
    }
    return ( is_Space );
}

/*--------------------------------------------------
  기능   : Check IP address RETURN T/F
  INPUT  : toCheck  -> check data
  RETURN : true  -> IP address
          false -> not IP address
----------------------------------------------------*/
function jsCheckIp(toCheck)
{
    var chkstr = toCheck+"" ;
    var isIp = true ;

    if ( jsCheckNull(toCheck) )
         return false;

    for (j = 0 ; isIp && (j < toCheck.length) ; j++)
    {
         if ((toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
         {
             if ( toCheck.substring(j,j+1) == "." )
                 if ( j == 0 )
                     isIp = false ;
             else
                 isIp = false ;
         }
    }

    return isIp;
}

/*--------------------------------------------------
  기능   : Check Number RETURN T/F ( 소수점"."은 Number로 취급안함 )
  INPUT  : toCheck  -> check data
  RETURN : true  -> number ( "."이 포함안됨 )
          false -> not number
----------------------------------------------------*/
function jsCheckNumber(toCheck)
{
    var chkstr = toCheck+"" ;
    var isNum = true ;

    if ( jsCheckNull(toCheck) )
         return false;

    for (j = 0 ; isNum && (j < toCheck.length) ; j++)
    {
         if ((toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
         {
            if ( toCheck.substring(j,j+1) == "-" || toCheck.substring(j,j+1) == "+")
            {
               if ( j != 0 )
               {
                  isNum = false;
               }
            }
            else
      isNum = false;
    }
    }

    if (chkstr == "+" || chkstr == "-") isNum = false;

    return isNum;
}

/*--------------------------------------------------
  기능   : Check data RETURN T/F
  INPUT  : toCheck  -> check data
          checkOK  -> 들어가서는 안되는 data
  RETURN : false -> 들어가서는 안되는 data가 없다
          true  -> 들어가서는 안되는 data가 있다.
  예1    : jsStrCheck( '12345', 'ABab' )
          string '12345'에는 'ABab'가 없으므로
          false를 리턴
  예2    : jsStrCheck( '12$45', 'ABab$#%' )
          string '12$45'에는 '$'가 있으므로
          true를 리턴
----------------------------------------------------*/
function jsStrCheck(checkStr, checkOK) {
   for (i = 0; i < checkStr.length; i++) {
       ch = checkStr.charAt(i);
       for (j = 0; j < checkOK.length; j++)
       if (ch == checkOK.charAt(j))
          break;
       if (j == checkOK.length) {
               return false;
               break;
       }
   }
   return true;
}

/*--------------------------------------------------
  기능   : Check Float RETURN T/F (정수도 Float로 취급)
  INPUT  : toCheck  -> check data
  RETURN : true  -> number
          false -> not number
----------------------------------------------------*/
function jsCheckFloat(toCheck)
{
    var chkstr = toCheck+"" ;
    var isFloat = true;

    var chkPoint = false;
    var chkMinus = false;

    if ( jsCheckNull(toCheck) )
    {
          return false;
    }

    for (j = 0 ; isFloat && (j < toCheck.length); j++)
    {
        if ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
        {

           if ( toCheck.substring(j,j+1) == "." )
           {
              if ( !chkPoint ) chkPoint = true ;
              else  isFloat = false ;
           }
           else if ( toCheck.substring(j,j+1) == "-" || toCheck.substring(j,j+1) == "+")
           {
              if ( ( j == 0 ) && ( !chkMinus ) ) chkMinus = true ;
              else isFloat = false;
           }
           else isFloat = false;
       }
   }

   return isFloat;
}

/*--------------------------------------------------
  기능   : 자릿수 check RETURN T/F
  INPUT  : toCheck  -> check data
  RETURN : true  -> number
          false -> not number
----------------------------------------------------*/
function jsCheckPoint( toCheck , Positive , Negative )
{
    var strPos = toCheck + "" ;
    var isPoint = true ;

    if ( jsCheckFloat ( toCheck ) )
    {

        var inx = strPos.indexOf(".") ;

        if ( inx == -1 )
        {
             if ( strPos.length > parseInt(Positive) )
                isPoint = false ;
             else
                isPoint = true ;
         }
         else
         {
              var pos = strPos.substring( 0, inx ) ;
              var nev = strPos.substring(inx + 1) ;

              if ( pos.length > parseInt(Positive) )
                    isPoint = false ;
              else if ( nev.length > parseInt(Negative) )
                    isPoint = false ;
              else
                    isPoint = true ;
         }
     }
     else if ( jsCheckNumber (toCheck) )
           isPoint = true  ;
     else
           isPoint = false ;

     return isPoint ;

}

////////////////////////////////////////////////////////////////n
////////////    DATE  VALIDATION  CHECK    //////////////////////
/////////////////////////////////////////////////////////////////

/*--------------------------------------------------
  기능   : calender에서 사용할 월별 배열를 만든다.
  INPUT  : 각 인자의 값
----------------------------------------------------*/
function jsMonthArray(m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11)
{
     this[0] = m0;
     this[1] = m1;
     this[2] = m2;
     this[3] = m3;
     this[4] = m4;
     this[5] = m5;
     this[6] = m6;
     this[7] = m7;
     this[8] = m8;
     this[9] = m9;
     this[10] = m10;
     this[11] = m11;
}


/*--------------------------------------------------
  기능   : 년도를 check한다.
  INPUT  : toCheck
  RETURN : NONE
    MSG :
----------------------------------------------------*/

function jsCheckYYYY(toCheck)
{
  return ( ( toCheck.length == 4) && ( jsCheckNumber(toCheck)  ) && ( toCheck != "0000") );
}

/*--------------------------------------------------
  기능   : 년월을 check한다.
  INPUT  : toCheck
  RETURN : NONE
    MSG :
----------------------------------------------------*/

function jsCheckYYYYMM(toCheck)
{
    var isDate  = true ;

    if ( toCheck.length != 6 )
    {
         isDate = false ;
    }
    else
    {

          var yy = toCheck.substring(0,4) +"" ;
          var mm = toCheck.substring(4,6) +"" ;

          if ( !jsCheckYYYY(yy) )
             isDate = false ;
          else if ( !jsCheckMM(mm) )
             isDate = false ;
    }

    return isDate ;
}

/*--------------------------------------------------
  기능   : 월을 check한다.
  INPUT  : toCheck
  RETURN :
   MSG  :
----------------------------------------------------*/
function jsCheckMM(toCheck)
{
     return ((toCheck.length > 0) && (jsCheckNumber(toCheck)) && (0< eval(toCheck)) && (eval(toCheck) < 13));
}

/*--------------------------------------------------
  기능   : 일을 check한다.
  INPUT  : toCheck
  RETURN : NONE
    MSG :
----------------------------------------------------*/
function jsCheckDD(yyyy,mm,toCheck)
{
     var isYMD  = false;
     var monthDD= new jsMonthArray(31,28,31,30,31,30,31,31,30,31,30,31);
     var im     = eval(mm) - 1;
     if ( toCheck.length == 0 )  return false;
     if ( !jsCheckNumber(toCheck)  )  return false;
     var dd     = eval(toCheck);
     if ( ( (yyyy%4 == 0) && (yyyy%100 != 0) ) || (yyyy%400 == 0) )
     {
          monthDD[1] = 29;
     }
     if ( (0 < dd) && (dd <= monthDD[im]) ) isYMD = true;
          return isYMD;
}

/*--------------------------------------------------
  기능   : 날짜를 check한다.
  INPUT  : dateVal '20030321'
  RETURN : NONE
    MSG :
----------------------------------------------------*/
function jsCheckDate( dateVal )
{

    var isDate  = true ;

    if ( dateVal.length != 8 )
    {
         isDate = false ;
    }
    else
    {

          var yy = dateVal.substring(0,4) +"" ;
          var mm = dateVal.substring(4,6) +"" ;
          var dd = dateVal.substring(6,8) +"" ;

          if ( !jsCheckYYYY(yy) )
             isDate = false ;
          else if ( !jsCheckMM(mm) )
             isDate = false ;
          else if ( !jsCheckDD (yy,mm,dd) )
             isDate = false ;
    }

    return isDate ;

}

/*--------------------------------------------------
  기능   : 날짜에 년수를 더한다.
  INPUT  : startDt(YYYYMMDD), year
  RETURN : rtnValue : 날짜에 년수를 더한 날짜
          -1       : ERROR..!
          예) 20000110 + 1년 = 20010110
          예) 20000229 + 1년 = 20010228
    MSG :
----------------------------------------------------*/
function jsAddYear( startDt, plusYear ) {
var rtnValue = -1 ;

// input date의 날짜 체크
if ( !jsCheckDate(startDt) || !jsCheckNumber(plusYear) ) {
 rtnValue = -1 ;
 return rtnValue ;
}

var yyyy = startDt.substring(0,4) +"" ;
var mm   = startDt.substring(4,6) +"" ;
var dd   = startDt.substring(6,8) +"" ;

var newYyyy = (eval(yyyy) + eval(plusYear)) ;

// 윤달(29일) 인 경우 28일로 고침
// 예) 20000229 에 1년을 더하면 20000228
var isYoonYear = false ;
// 4 로 나누어 떨어지면 윤년
// 100 으로 나누어 떨어지면 윤년 아님
// 400 으로 나누어 떨어지면 윤년
if ( (eval(newYyyy)%4) == 0 ) isYoonYear = true ;
if ( (eval(newYyyy)%100) == 0 ) isYoonYear = false ;
if ( (eval(newYyyy)%400) == 0 ) isYoonYear = true ;

if ( (mm == '02') && (dd == '29') && !isYoonYear ) dd = '28' ;

rtnValue = newYyyy + mm + dd ;

return rtnValue ;
}

/*--------------------------------------------------
  기능   : 날짜에 월수를 더한다.
  INPUT  : startDt(YYYYMMDD), year
  RETURN : rtnValue : 날짜에 월수를 더한 날짜
          -1       : ERROR..!
          예) 20000110 + 3월  = 20000410
          예) 20000229 + 12월 = 20000228
    MSG :
----------------------------------------------------*/
function jsAddMonths( startDt, plusMonth ) {
var rtnValue = -1 ;

// input date의 날짜 체크
if ( !jsCheckDate(startDt) || !jsCheckNumber(plusMonth) ) {
 rtnValue = -1 ;
 return rtnValue ;
}

var yyyy = startDt.substring(0,4) +"" ;
var mm   = startDt.substring(4,6) +"" ;
var dd   = startDt.substring(6,8) +"" ;

var newMm = null;

// 월수를 더하여 1년이 넘는 경우
if ( (eval(mm) + eval(plusMonth)) > 12 ) {
 yyyy  = eval(yyyy) + 1 ;
 newMm = eval(mm) + eval(plusMonth) - 12 ;
} else {
 newMm = eval(mm) + eval(plusMonth) ;
}

// 윤년 처리
var isYoonYear = false ;
// 4 로 나누어 떨어지면 윤년
// 100 으로 나누어 떨어지면 윤년 아님
// 400 으로 나누어 떨어지면 윤년
if ( (eval(yyyy)%4) == 0 ) isYoonYear = true ;
if ( (eval(yyyy)%100) == 0 ) isYoonYear = false ;
if ( (eval(yyyy)%400) == 0 ) isYoonYear = true ;

// 윤년인 경우
if ( isYoonYear ) {
 if ( (newMm == '02') && ( dd=='30' || dd=='31' ) ) dd = '29' ;
// 평년인 경우
} else {
 if ( (newMm == '02') && ( dd=='29' || dd=='30' || dd=='31' ) ) dd = '28' ;
}

// 월의 자리수를 맞춘다. ( 2 월 -> 02 )
if ( eval(newMm) < 10 ) { newMm = "0" + newMm  } ;
rtnValue = yyyy + newMm + dd ;

return rtnValue ;
}

/*--------------------------------------------------
  기능   : 날짜와 날짜 사이의 일수를 리턴한다.
  INPUT  : startDt(YYYYMMDD), endDt(YYYYMMDD)
  RETURN : rtnValue : 날짜와 날짜 사이의 일수
          -1       : ERROR..!
    MSG :

----------------------------------------------------*/
function jsGetBetweenDay( startDt, endDt )
{
    var rtnValue = 0 ;

    // input date의 날짜 체크
    if ( !jsCheckDate(startDt) || !jsCheckDate(endDt) ) {
     rtnValue = -1 ;
    }
    else {
          var yyyy = startDt.substring(0,4) +"" ;
          var mm   = startDt.substring(4,6) +"" ;
          var dd   = startDt.substring(6,8) +"" ;
          var startDate = new Date(yyyy,(eval(mm)-1),dd) ; // 달 은 한달이 느리므로 1을 빼준다.

          yyyy = endDt.substring(0,4) +"" ;
          mm   = endDt.substring(4,6) +"" ;
          dd   = endDt.substring(6,8) +"" ;
          var endDate = new Date(yyyy,(eval(mm)-1),dd) ;

          // 1000분의 1초 단위를 일 단위로 바꾸기
          rtnValue = ((endDate-startDate)/60/60/24/1000) ;
    }

    return rtnValue ;

}
/*--------------------------------------------------
  기능   : Check Time RETURN T/F
  INPUT  : check  time
  RETURN : true  -> TIME
          false -> NOT TIME
----------------------------------------------------*/
function jsCheckTime( toCheck )
{
    var chkstr  = toCheck + "";

    if ( ( chkstr == "") || ( chkstr == null ) )
   return( false );

    var mm = chkstr.substring( 0 ,2 );
    var ss = chkstr.substring( 3 ,5 );

    if (( mm <= "23" ) && ( mm >= "00" ))
    {
        if (( ss <= "60" ) && ( ss >= "00" ))
        {
            if ( chkstr.substring( 2 ,3 ) == ":")
            {
             return( true );
            }
        }
    }
    return( false );
}

/*--------------------------------------------------
  기능   : Check 주민등록번호 RETURN T/F
  INPUT  : toCheck
  RETURN : true  -> 올바른 번호
          false ->
----------------------------------------------------*/
function jsCheckJumin(toCheck) {
   var isJumin = true;
   if ( jsCheckNull(toCheck) ) {
         return false;
   } else if ( toCheck.length < 13 || toCheck.length > 13 ) {
         return false;
   } else if ( toCheck.substring(2,3) > "1" || toCheck.substring(6,7) > "2" || toCheck.substring(6,7) == "0" ) {
         return false;
   } else if ( toCheck.substring(2,3) == "1" && toCheck.substring(3,4) > "2" ){
         return false;
   } else if (!(toCheck.substring(4,6) >= "01" && toCheck.substring(4,6) <= "31")){
         return false;
   }
  for (j = 0; isJumin && (j < toCheck.length); j++) {
      if ( ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9")) ) {
          isJumin = false;
      }
  }


 var a1=toCheck.substring(0,1)
 var a2=toCheck.substring(1,2)
 var a3=toCheck.substring(2,3)
 var a4=toCheck.substring(3,4)
 var a5=toCheck.substring(4,5)
 var a6=toCheck.substring(5,6)
 var check_digit=a1*2+a2*3+a3*4+a4*5+a5*6+a6*7
 var b1=toCheck.substring(6,7)
 var b2=toCheck.substring(7,8)
 var b3=toCheck.substring(8,9)
 var b4=toCheck.substring(9,10)
 var b5=toCheck.substring(10,11)
 var b6=toCheck.substring(11,12)
 var b7=toCheck.substring(12,13)

 var check_digit=check_digit+b1*8+b2*9+b3*2+b4*3+b5*4+b6*5
 check_digit = check_digit%11
 check_digit = 11 - check_digit
 check_digit = check_digit%10
 if (check_digit != b7){
  isJumin = false;
 }

  return isJumin;
}

/*--------------------------------------------------
  기능   : Check 사업자 등록번호 RETURN T/F
  INPUT  : toCheck
  RETURN : true  -> 올바른 번호
          false ->
----------------------------------------------------*/
function jsCheckSaupJa(toCheck) {
   var isSaupJa = true;
   if ( jsCheckNull(toCheck) ) {
         return false;
   } else if ( toCheck.length < 10 || toCheck.length > 10 ) {
         return false;
   }
   for (j = 0; isSaupJa && (j < toCheck.length); j++) {
      if ( ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9")) ) {
          isSaupJa = false;
      }
   }
   return isSaupJa;
}

/*--------------------------------------------------
  기능   : E-Mail를 check한다.
  INPUT  : emailVal
  RETURN : NONE
    MSG :
----------------------------------------------------*/
function jsCheckEmail( emailVal )
{
    if ( jsCheckNull(emailVal) ) return true;

    var inx = emailVal.indexOf("@") ;

    if ( inx <= 0 || inx==emailVal.length-1 ) return false;

    return true ;
}
/*--------------------------------------------------
  기능   :
  INPUT  : varNum : 실수
       varLeft : 정수부분 자리수
       varRight : 소수부분 자리수
  RETURN : true : 실수가 정/소수부분의 자리수를 초과하지 않는다.
       false : 실수가 정/소수부분의 자리수를 초과한다.
----------------------------------------------------*/
function jsCheckFloatType( varNum, varLeft, varRight ) {

var resultFlag = true ;

if ( varNum.charAt(0) == "-" ){
 varNum = varNum.substring(1,varNum.length);
}

var PointIndex = varNum.indexOf(".");

if ( PointIndex < 0 ){
 if ( varNum.length > varLeft )
  resultFlag = false ;
}else{
 var LeftLength = varNum.substring(0,PointIndex).length;
 var RightLength = varNum.substring(PointIndex+1, varNum.length ).length;

 if ( (LeftLength > varLeft) || (RightLength > varRight) )
  resultFlag = false ;
}

return resultFlag ;

}

/*--------------------------------------------------
  기능   :
  INPUT  : helpfile
  RETURN :
----------------------------------------------------*/
function jsShowHelp( helpfile )
{
     var helpstr = helpfile + "" ;
     var URL     = "" ;
     var cWin ;

     URL = "/help/"+helpfile+".html" ;

     cWin = window.open(URL,"help","toolbar=0,location=0,directories=0,status=0,menubar=1,scrollbars=1,resizable=1,width=560,height=320");

     cWin.focus();
}

/*--------------------------------------------------
  기능   : 한글이든 영문이든 제대로 갯수 체크를 해준다.
  INPUT  : String
  RETURN :
----------------------------------------------------*/
function getByteLength(s){
  var len = 0;
  if ( s == null ) return 0;
  for(var i=0;i<s.length;i++){
     var c = escape(s.charAt(i));
     if ( c.length == 1 ) len ++;
     else if ( c.indexOf("%u") != -1 ) len += 2;
     else if ( c.indexOf("%") != -1 ) len += c.length/3;
  }
  return len;
}

/*--------------------------------------------------
  기능   : FormObj에서 varObjName이 몇개 존재하는지 리턴한다.
  INPUT  : FormObj : FormName
     : varObjName : 객체명
  RETURN :
----------------------------------------------------*/
function jsGetObjCnt( FormObj, varObjName ){
var cnt = 0 ;
  for(var inx = 0; inx < FormObj.elements.length ; inx++ ) {
     if ( FormObj.elements[inx].name == varObjName ) {
      cnt++ ;
     }
  }
  return cnt;
}

/*--------------------------------------------------
  기능   :  SELECT OPTION BOX의 값을 RETURN 한다.
  INPUT  : sb = selectBoxName
  RETURN :
----------------------------------------------------*/
function jsCheckSelectBox ( sb )
{
   var temp = sb.options[sb.selectedIndex].value ;
   return ( temp );
}

function jsCheckSelectBoxNm ( sb )
{
   var temp = sb.options[sb.selectedIndex].text ;
   return ( temp );
}

/*--------------------------------------------------
  기능   :  해당 Frame을 공백페이지로 변경
  INPUT  : fr : FrameName
  RETURN :
----------------------------------------------------*/
function jsClearFrame( fr ) {
   fr.location = "/common/blank.jsp";
}

/*--------------------------------------------------
  기능   : checkBox를 전체선택 및 해제를 할수 있게 한다.
  INPUT  : FormObj FormName
       elemNm CheckBox name
       checkYn boolean
  RETURN :
----------------------------------------------------*/
function jsToggle(FormObj, elemNm, checkYn){
var i =0;
while (i < FormObj.elements.length)
{
 if (FormObj.elements[i].name== elemNm )
 {
  FormObj.elements[i].checked= checkYn;
 }
 i++;
}
}

/*--------------------------------------------------
  기능   : focus 옮기기
  INPUT  : varTextObj : TextBox 객체명
       varLength  : 조건에 맞는 textLength
       varFocusToObj : Focus를 옮겨갈 객체명
  RETURN :
----------------------------------------------------*/
function jsMoveFocus( varTextObj, varLength, varFocusToObj ) {
if ( varTextObj.value.length == varLength ) {
 varFocusToObj.focus() ;
 varFocusToObj.select() ;
 return ;
}
}

/*--------------------------------------------------
  기능   : 문자를 숫자로 convert 한다. 단,
       parseFloat 와 다른 점은 null 이 올때 0 으로 인식한다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsParseInt( varStr ) {
if ( varStr == null || varStr == "" )
 return 0 ;
else
 return parseInt(varStr) ;
}

/*--------------------------------------------------
  기능   : 숫자를 한글로 변환한다.
  예) 450,000,000 -> 사억오천만
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsConvertNumberToHangul( varNum )
{
// 리턴할 문자열
var returnStr = "" ;

// 음수일 때는 에러
if ( eval(varNum) < 0 ) {
 return returnStr ;
}

// 넘어온 숫자를 문자로 변환
var numLen = varNum.length ;
// 변환된 문자를 앞에서 부터 한자씩 잘라서 보관할 변수
var oneChar = null ;
var isDone1 = true ;
var isDone2 = true ;
var isDone3 = true ;
var isDone4 = true ;
var isDone5 = false ;
for ( var inx = 0 ; inx < numLen ; inx++ ) {
 oneChar = varNum.substring( inx, inx+1 ) ;
 isDone5 = false ;

 if ( oneChar == "0" ) {
  // 아무일도 안함
 } else if ( oneChar == "1" ) {
  returnStr = returnStr + "일" ;
  isDone5 = true ;
 } else if ( oneChar == "2" ) {
  returnStr = returnStr + "이" ;
  isDone5 = true ;
 } else if ( oneChar == "3" ) {
  returnStr = returnStr + "삼" ;
  isDone5 = true ;
 } else if ( oneChar == "4" ) {
  returnStr = returnStr + "사" ;
  isDone5 = true ;
 } else if ( oneChar == "5" ) {
  returnStr = returnStr + "오" ;
  isDone5 = true ;
 } else if ( oneChar == "6" ) {
  returnStr = returnStr + "육" ;
  isDone5 = true ;
 } else if ( oneChar == "7" ) {
  returnStr = returnStr + "칠" ;
  isDone5 = true ;
 } else if ( oneChar == "8" ) {
  returnStr = returnStr + "팔" ;
  isDone5 = true ;
 } else if ( oneChar == "9" ) {
  returnStr = returnStr + "구" ;
  isDone5 = true ;
 }

 if ( ((numLen-inx) % 4) == 0 && oneChar != "0" ) {
  returnStr = returnStr + "천" ;
 } else if ( ((numLen-inx) % 4) == 3 && oneChar != "0" ) {
  returnStr = returnStr + "백" ;
 } else if ( ((numLen-inx) % 4) == 2 && oneChar != "0" ) {
  returnStr = returnStr + "십" ;
 } else if ( ((numLen-inx) % 4) == 1 ) {
  if ( numLen >= 17 && isDone1 && isDone5 ) {
   returnStr = returnStr + "경" ;
   isDone1 = false ;
  } else if ( numLen >= 13  && isDone2 && isDone5 ) {
   returnStr = returnStr + "조" ;
   isDone2 = false ;
  } else if ( numLen >= 9  && isDone3 && isDone5 ) {
   returnStr = returnStr + "억" ;
   isDone3 = false ;
  } else if ( numLen >= 5  && isDone4 && isDone5 ) {
   returnStr = returnStr + "만" ;
   isDone4 = false ;
  }
 }
}

return returnStr ;
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 comma를 찍어서 comma 를 찍어서 채워준다.
      소수점 허용 안함
   예) 1000.00 -> 1,000   
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeCurrency( varTextObj ) {
varTextObj.value = jsDeleteComma( varTextObj.value ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
var isPointed = false ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
  varText = varText + varTextObj.value.substring(inx, inx+1) ;
 }
}

varTextObj.value = jsAddComma( varText ) ;
}


/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 comma를 찍어서 comma 를 찍어서 채워준다.
      소수점 허용 함   
   예) 1000.00 -> 1,000.00   
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeForeignCurrency( varTextObj ) {
varTextObj.value = jsDeleteComma( varTextObj.value ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
var isPointed = false ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) || (varTextObj.value.substring(inx, inx+1)=='.') ) {
  // 점이 안찍히고 처음으로 점이 들어왔을때
  if ( !isPointed && varTextObj.value.substring(inx, inx+1)=='.' ) {
   isPointed = true ;
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  // 숫자 일때
  } else if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  }

 }
}

varTextObj.value = jsAddComma( varText ) ;
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 객체필드에 숫자만을 입력받게 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsOnlyNumber( varTextObj ) {

var varLength = varTextObj.value.length ;
var varText   = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
  varText = varText + varTextObj.value.substring(inx, inx+1) ;
 }
}

// 앞에 붙은 0 없애기 (예) 00200 -> 200
varLength = varText.length ;
var varTempReturnNumber = varText;
var varReturnNumber = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
  // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
  if ( varLength == 1 ) varReturnNumber = "0" ;
  else if ( eval(jsDeleteComma(varTempReturnNumber)) == '0' ) {
   varReturnNumber = "0" ;
   break ;
  }
 } else {
  varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
  break ;
 }
}

varTextObj.value = varReturnNumber;
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 숫자와 1개의 point만을 입력받게 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsOnlyFloat( varTextObj ) {

varTextObj.value = jsDeleteComma( varTextObj.value ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
var isPointed = false ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) || (varTextObj.value.substring(inx, inx+1)=='.') ) {
  // 점이 안찍히고 처음으로 점이 들어왔을때
  if ( !isPointed && varTextObj.value.substring(inx, inx+1)=='.' ) {
   isPointed = true ;
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  // 숫자 일때
  } else if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  }

 }
}

// 앞에 붙은 0 없애기 (예) 00200 -> 200
varLength = varText.length ;

var varReturnNumber = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varText.substring(inx, inx+1) == '0' ) {
  // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
  if ( varLength == 1 ) varReturnNumber = "0" ;
  else if ( eval(jsDeleteComma(varText)) == '0' ) {
   varReturnNumber = "0" ;
   break ;
  }
 } else {
  varReturnNumber = varText.substring(inx, varLength+1) ;
  break ;
 }
}

varTextObj.value = varReturnNumber ;

}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 YYYY/MM형식으로 [/]를 찍어서 채워준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeYyyyMm( varTextObj ) {
varTextObj.value = jsDeleteChar( varTextObj.value, '/' ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
  varText = varText + varTextObj.value.substring(inx, inx+1) ;
 }
}

if ( varText.length < 6 ) {
 varTextObj.value = varText ;
} else {
 varTextObj.value = varText.substring(0,4) + "/" + varText.substring(4,6) ;
}
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 String에 날짜형식으로 [/]를 찍어서 리턴.
    예) 200103 -> 2001/03
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeYyyyMmString( varText ) {
if ( varText.length != 6 || !jsCheckNumber( varText ) ) {
 return varText ;
}

var varReturnText   = "" ;

varReturnText = varText.substring(0,4) + "/" + varText.substring(4,6) ;

return varReturnText
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 날짜형식으로 [/]를 찍어서 채워준다.     
    예) 20010301 -> 2001/03/01         
  INPUT  : Text Object
  RETURN :
----------------------------------------------------*/
function jsMakeDate( varTextObj ) {
varTextObj.value = jsDeleteChar( varTextObj.value, '/' ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
  varText = varText + varTextObj.value.substring(inx, inx+1) ;
 }
}

if ( varText.length < 8 ) {
 varTextObj.value = varText ;
} else {
 varTextObj.value = varText.substring(0,4) + "/" + varText.substring(4,6) + "/" + varText.substring(6,8) ;
}
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 String에 날짜형식으로 [/]를 찍어서 채워준다.     
    예) 20010301 -> 2001/03/01         
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeDateString( varText ) {
if ( varText.length != 8 || !jsCheckNumber( varText ) ) {
 return varText ;
}

var varReturnText   = "" ;

varReturnText = varText.substring(0,4) + "/" + varText.substring(4,6) + "/" + varText.substring(6,8) ;

return varReturnText
}

/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 찍어서 리턴한다. 음수도 표현가능
    예) 1000.00 -> 1,000.00
    예) 숫자가 아닌 값 -> -1 리턴     
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsAddComma( varNumber ){
// 숫자가 아니면 -1을 리턴한다.
if ( jsCheckNull(varNumber) ) return "" ;
if ( !jsCheckFloat(varNumber) ) {
 return -1 ;
}

// 소수 이상, 이하 부분을 따로 보관.
var PointIndex = varNumber.indexOf(".") ;
var varUnderPoint = "" ;
var isPointed = false ;
// 소수 이하가 없을때
if ( PointIndex < 0 ) {
 isPointed = false ;
 // 소수 이하 부분
 varUnderPoint = "" ;
 // 소수 이상 부분
 varOverPoint = varNumber ;
// 소수 이하가 있을때
} else {
 isPointed = true ;
 // 소수 이하 부분
 varUnderPoint = varNumber.substring(PointIndex+1, varNumber.length ) ;
 // 소수 이상 부분
 varOverPoint = varNumber.substring(0, PointIndex) ;
}

// 음수일때 앞의 "-" 따로 보관
var negativeFlag = false ;
if ( varOverPoint.substring(0,1) == "-" ) {
 negativeFlag = true ;
 varOverPoint = varOverPoint.substring(1,varOverPoint.length+1) ;
}

// 소수 이상 부분에 comma 넣기
var varLength = varOverPoint.length ;
var varCnt = 0 ;
var varTempReturnNumber = "" ;
for ( var inx = varLength-1 ; inx >= 0 ; inx-- ) {
 varCnt++ ;

 // 소수점 찍기
 if ( varCnt == 4 ) {
  varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + "," + varTempReturnNumber ;
  varCnt = 1 ;
 // 소수점 안찍기
 } else {
  varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + varTempReturnNumber ;
 }

}

// 앞에 붙은 0 없애기 (예) 00200 -> 200
varLength = varTempReturnNumber.length ;
var varReturnNumber = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
  // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
  if ( varLength == 1 ) varReturnNumber = "0" ;
  else if ( eval(jsDeleteComma(varTempReturnNumber)) == '0' ) {
   varReturnNumber = "0" ;
   break ;
  }
 } else {
  varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
  break ;
 }
}

// 소수점 이하 붙이기
if ( isPointed ) {
 varReturnNumber = varReturnNumber + "." + varUnderPoint ;
}

// 음수 붙이기
if ( negativeFlag ) {
 varReturnNumber = "-" + varReturnNumber ;
}

return varReturnNumber ;

}

/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 찍어서 리턴한다.
    예) 1000 -> 1,000.00
    예) 숫자가 아닌 값 -> -1 리턴  
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsAddCommaAndZero( varNumber ){
// 숫자가 아니면 -1을 리턴한다.
if ( jsCheckNull(varNumber) ) return "" ;
if ( !jsCheckFloat(varNumber) ) {
 return -1 ;
}

// 소수 이상, 이하 부분을 따로 보관.
var PointIndex = varNumber.indexOf(".") ;
var varUnderPoint = "" ;
// 소수 이하가 없을때
if ( PointIndex < 0 ) {
 // 소수 이하 부분
 varUnderPoint = "" ;
 // 소수 이상 부분
 varOverPoint = varNumber ;
// 소수 이하가 있을때
} else {
 // 소수 이하 부분
 varUnderPoint = varNumber.substring(PointIndex+1, varNumber.length ) ;
 // 소수 이상 부분
 varOverPoint = varNumber.substring(0, PointIndex) ;
}

// 소수 이상 부분에 comma 넣기
var varLength = varOverPoint.length ;
var varCnt = 0 ;
var varTempReturnNumber = "" ;
for ( var inx = varLength-1 ; inx >= 0 ; inx-- ) {
 varCnt++ ;

 // 소수점 찍기
 if ( varCnt == 4 ) {
  varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + "," + varTempReturnNumber ;
  varCnt = 1 ;
 // 소수점 안찍기
 } else {
  varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + varTempReturnNumber ;
 }

}

// 앞에 붙은 0 없애기 (예) 00200 -> 200
varLength = varTempReturnNumber.length ;
var varReturnNumber = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
 } else {
  varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
  break ;
 }
}

// 소수점 이하 붙이기
if ( varUnderPoint.length == 0 ){
 varReturnNumber = varReturnNumber + "." + "00" ;
}else if ( varUnderPoint.length == 1 ){
 varReturnNumber = varReturnNumber + "." + varUnderPoint + "0";
}else if ( varUnderPoint.length == 2 ){
 varReturnNumber = varReturnNumber + "." + varUnderPoint ;
}

return varReturnNumber ;

}

/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 없애고 리턴한다
    예) 1,000.00 -> 1000.00    
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsDeleteComma( varNumber ){
var varLength = varNumber.length ;

varReturnNumber = "" ;

for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varNumber.substring( inx, inx+1 ) != "," ) {
  varReturnNumber = varReturnNumber + varNumber.substring( inx, inx+1 ) ;
 }
}

return varReturnNumber ;
}

/*--------------------------------------------------
  기능   : 글자를 받아서 param를 없애고 리턴한다.
    예) 2001/01/01 -> 20010101    
  INPUT  : varText 문자열 varDelete 삭제하고자하는 Character
  RETURN :
----------------------------------------------------*/
function jsDeleteChar( varText, varDelete ){
var varLength = varText.length ;

varReturnText = "" ;

for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varText.substring( inx, inx+1 ) != varDelete ) {
  varReturnText = varReturnText + varText.substring( inx, inx+1 ) ;
 }
}

return varReturnText ;
}

/*--------------------------------------------------
  기능   : 폼 이름을 받아서 모든 text,hidden값에 comma, / 문자를 없애준다
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsDeleteCharAll( FormObj ) {
for ( i=0; i<FormObj.elements.length; i++ ) {
 if ( FormObj.elements[i].type == "text" || FormObj.elements[i].type == "hidden" ) {
  if ( !jsCheckNull(FormObj.elements[i].value) && jsCheckFloat(jsDeleteComma(FormObj.elements[i].value)) ) {
   FormObj.elements[i].value = jsDeleteComma(FormObj.elements[i].value);
  } else if ( !jsCheckNull(FormObj.elements[i].value) && jsCheckDate(jsDeleteChar(FormObj.elements[i].value,'/')) ) {
   FormObj.elements[i].value = jsDeleteChar( FormObj.elements[i].value, '/' );
  }
 }
}
}

/*--------------------------------------------------
  기능   : FormObj에서 checkBox 가 몇개 선택되었는지  리턴한다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsCheckBoxSelectedCnt( FormObj, checkBoxName ){
  var cnt = 0 ;
  for(var inx = 0; inx < FormObj.elements.length ; inx++ ) {
     if ( FormObj.elements[inx].name == checkBoxName && FormObj.elements[inx].checked ) {
      cnt++ ;
     }
  }
  return cnt;
}

/*--------------------------------------------------
  기능   : 영문 과 숫자로만 이루어 졌는지  체크를 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function isAlphaNum(input) {
   var chars = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
   return containsCharsOnly(input,chars);
}


//입력값이 한글이 포함되어있는지 체크

function IsHangul(field)
{
if ( field == "" ) return false;

   var rtnLen = 0 ;

   for (i=0; i<field.length; i++)
   {  
       // 한글인 경우 길이가 UniCode 값은 10000 이상이다.
       if(field.charCodeAt(i) > 10000 )
       {
        rtnLen++;
       }
   }
  
   if ( rtnLen > 0 )
    return true;
   else
    return false;
}


/*----------------------------------------------------
  입력값이 특정 문자(chars)만으로 되어있는지 체크
  특정 문자만 허용하려 할 때 사용
  ex) if (!containsCharsOnly(form.blood,"ABO")) {
         alert("혈액형 필드에는 A,B,O 문자만 사용할 수 있습니다.");
     }
------------------------------------------------------*/
function containsCharsOnly(input,chars) {
   for (var inx = 0; inx < input.value.length; inx++) {
      if (chars.indexOf(input.value.charAt(inx)) == -1)
          return false;
   }
   return true;
}

/*--------------------------------------------------
  기능   : POPUP OPEN Script
  INPUT  :
  RETURN :
----------------------------------------------------*/
function popup1( varAction, varWinName, varWidth, varHeight ){
var win = window.open( varAction, varWinName , "toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=1,resizable=1, width=" + varWidth + ",height=" + varHeight + ", left=50,top=50");
return win;

//var FormObj = document.dataForm;
//FormObj.target = varWinName ;
//FormObj.action = varAction ;
//FormObj.submit() ;
}


function toTimeString( varDateObj ) { //formatTime(date)
   var year  = varDateObj.getFullYear();
   var month = varDateObj.getMonth() + 1; // 1월=0,12월=11이므로 1 더함
   var day   = varDateObj.getDate();

   if (("" + month).length == 1) { month = "0" + month; }
   if (("" + day).length   == 1) { day   = "0" + day;   }

   return ("" + year + month + day );
}

function jsAfterThisDate( varStdDate , varYYYY , varMM , varDD ) {

   var varDateObj = new Date();

   varStdDate = jsDeleteChar( varStdDate, "/" );

   var yyyy = varStdDate.substring(0,4) +"" ;
   var mm   = varStdDate.substring(4,6) +"" ;
   var dd   = varStdDate.substring(6,8) +"" ;

   var startDate = new Date(yyyy,(eval(mm)-1),dd) ; // 달 은 한달이 느리므로 1을 빼준다.

   varDateObj.setFullYear(startDate.getFullYear() + eval(varYYYY) ); //년을 더함
   varDateObj.setMonth(startDate.getMonth() + eval(varMM) );       //월을 더함
   varDateObj.setDate(startDate.getDate() + eval(varDD)  );         //일을 더함

   return toTimeString(varDateObj);
}

/*--------------------------------------------------
  기능   : text 입력시 숫자이외의 키를 눌렀을때 무효화시킨다.
  INPUT  : 없음
  RETURN : 이벤트 무효화

  주의!  : onKeypress 이벤트만 사용할것
         예) <input type="text" onKeypress="jsOnlyNumberKey();">
----------------------------------------------------*/
function jsOnlyNumberKey() {
   if ( event != null) {
     if ( event.keyCode < 48 || event.keyCode > 57 ) {
       event.returnValue = false;
     }
   }
}

/* 이전페이지로 이동 */
function jsBack(){
history.go(-1);
}

/* 모래시계 보이게 하기 */
function jsVisible( str ){
if( str == '1' )
 document.body.style.cursor='wait'
else
 document.body.style.cursor='auto'
}

/* 15초후에 jsRefresh()라는 function을 호출 */
var timeId   = null ;

function jsRunAfterTime() {
//15초 후에 Refresh
timeId = setTimeout( "jsRefresh()", 15000 ) ;
}

/**
* 소수점 아래 몇자리 이하 절삭.
*
* @param num 숫자
* @param place 자리수
* @return 절삭된 숫자
*/
function getCutNumber(num, place) {
var returnNum;
var str = "1";

return Math.floor( num * Math.pow(10,parseInt(place,10)) ) / Math.pow(10,parseInt(place,10));
}

/* text의 좌우 공백을 제거해서 리턴*/
function trim(text) {
if (text == "") {
 return text;
}

var len = text.length;
var st = 0;

while ((st < len) && (text.charAt(st) <= ' ')) {
 st++;
}

while ((st < len) && (text.charAt(len - 1) <= ' ')) {
 len--;
}

return ((st > 0) || (len < text.length)) ? text.substring(st, len) : text;
}

/* text의 좌측의 공백을 제거해서 리턴*/
function ltrim(text) {
if (text == "") {
 return text;
}

var len = text.length;
var st = 0;

while ((st < len) && (text.charAt(st) <= ' ')) {
 st++;
}

return (st > 0) ? text.substring(st, len) : text;
}

/* text의 우측의 공백을 제거해서 리턴*/
function rtrim(text) {
if (text == "") {
 return text;
}

var len = text.length;
var st = 0;

while ((st < len) && (text.charAt(len - 1) <= ' ')) {
 len--;
}

return (len < text.length) ? text.substring(st, len) : text;
}

/*--------------------------------------------------
  기능   : select box 를 CLEAR 시킨다.
  INPUT  : varObjFullNm : select box 객체
          varDeleteCnt : 첫번째 아이템 삭제 여부 결정
  RETURN : NONE
----------------------------------------------------*/
function cmInitSelectBox( varObjFullNm, varDeleteCnt ) {
varObj = eval( varObjFullNm ) ;
varObj.length = varDeleteCnt ;
}

/*--------------------------------------------------
  기능   :  select box 를 만든다.
  INPUT  : varObjFullNm :  select box 객체
          varText      :
          varValue     : 
  RETURN : NONE
----------------------------------------------------*/
function cmMakeSelectBox( varObjFullNm, varText, varValue ) {
varObj = eval( varObjFullNm ) ;

var empOption = null ;

empOption = document.createElement("OPTION");
empOption.text = varText ;
empOption.value = varValue ;
varObj.options.add(empOption);
}


/*
Text
jsChangeComma( str ) ' -> ` 로 대치
jsStrCheck(checkStr, checkOK)
  들어가서는 안되는 데이타(checkOK)가 checkStr에 포함되어있는지 체크
jsMoveFocus( varTextObj, varLength, varFocusToObj )
  TextBox에서 조건이 만족하면 특정객체로 포커스를 이동
jsCheckNull( toCheck ) toCheck의 값이 Null값인지를 체크
jsDeleteComma( varNumber ) 컴마를 삭제하고 리턴
jsDeleteChar( varText, varDelete ) 문자열에서 해당 character를 지우고 리턴

CheckBox
jsCheckBoxSelectedCnt( FormObj, checkBoxName )
  FormObj에서 checkBox 가 몇개 선택되었는지  리턴한다.
jsToggle(FormObj, elemNm, checkYn)
  특정 폼안의 체크박스오브젝트를 전체선택하거나 전체반전시킴
 
SelectBox
jsCheckSelectBox ( sb ) SelectBox에서 선택된 값의 value를 리턴
jsCheckSelectBoxNm ( sb ) SelectBox에서 선택된 값의 Text를 리턴
cmInitSelectBox( varObjFullNm, varDeleteCnt )
  해당 SelectBox를 초기화 시킨다. varDeleteCnt가 1이면 첫번째값을 지우지 않는다.
cmMakeSelectBox( varObjFullNm, varText, varValue ) 해당 selectBox에 하나의 값을 추가시킴
  
날짜 
jsCheckYYYY(toCheck) 년도를 체크
jsCheckYYYYMM(toCheck) 년월을 체크
jsCheckMM(toCheck) 월을 체크
jsCheckDD(yyyy,mm,toCheck) 일을 체크
jsCheckDate( dateVal ) 날짜를 체크
jsAddYear( startDt, plusYear ) 날짜에 년수를 더함
jsAddMonths( startDt, plusMonth ) 날짜에 월수를 더함
jsGetBetweenDay( startDt, endDt ) 날짜와 날짜사이의 일수를 리턴
jsCheckTime( toCheck ) 시간포맷인지를 체크
jsMakeYyyyMm( varTextObj )
  해당 텍스트박스 객체필드에 YYYY/MM형식으로 [/]를 찍어서 채워준다.
jsMakeYyyyMmString( varText ) 넘어온 값에 날짜형식으로 [/]를 찍어서 리턴.
jsMakeDate( varTextObj ) 넘어온 Object의 값을 날짜형식으로 채워줌
jsMakeDateString( varText )넘어온 값을 날짜형식으로 리턴
toTimeString( varDateObj ) DateObj를 넘겨주면 년월일을 리턴  20030201
jsAfterThisDate( varStdDate , varYYYY , varMM , varDD )
  날짜형식의 문자열에 특정 년, 월, 일을 더한값을 리턴


날짜 체크 사용 예 호출하는 페이지에 다음 부분을 추가

<input ... onKeyUp='jsChkDate(this,lottSearchForm.txtEdate)' onBlur='compareDate()'>


function compareDate(){  

if( jsCheckNull(document.forms[0].txtSdate.value) ||

    jsCheckNull(document.forms[0].txtEdate.value) )
    return;
 
var from = document.forms[0].txtSdate.value.replace(/(\,|\.|\-|\/|\:)/g,'');
var to   = document.forms[0].txtEdate.value.replace(/(\,|\.|\-|\/|\:)/g,'');

if( jsGetBetweenDay(from,to) < 0 ) {
 alert("기간이 잘못 입력되었습니다. 다시입력하세요");
 document.forms[0].txtSdate.value = "";
 document.forms[0].txtEdate.value = "";
 document.forms[0].txtSdate.focus();
 return ;
}

}

function jsChkDate( valObj, nextPos ){

if( valObj.value.length == 8 ) {
 if( !jsCheckDate( valObj.value ) ) {
  alert("일자 입력오류입니다. 다시 입력해 주십시요.");
  valObj.value = '';
  valObj.focus();
  return;
 }  
 jsMakeDate( valObj );
 nextPos.focus();

}

           

 
주민등록번호
jsCheckJumin(toCheck) 주민등록번호 체크

사업자등록번호
jsCheckSaupJa(toCheck) 사업자등록번호 체크

문자열길이 체크
getByteLength(s) 한글2바이트, 영문 1바이트로 바이트수를 리턴

쿠키
setCookie( name, value, expireFlag ) Set Cookie
getCookie( name ) get Cookie

숫자
jsParseInt( varStr ) 문자를 숫자로 변환 null일때
jsConvertNumberToHangul( varNum ) 숫자를 한글로 변환
jsMakeCurrency( varTextObj ) 넘어온 숫자에 컴마를 찍어서 리턴 소숫점 허용안함
jsMakeForeignCurrency( varTextObj ) 넘어온 숫자에 컴마를 찍어서 리턴 소숫점 허용함
jsOnlyNumber( varTextObj ) 해당 텍스트박스 객체에 숫자만 입력받을수 있도록
jsOnlyFloat( varTextObj ) 해당 텍스트박스 객체에 숫자와 1개의 point만을 입력받게 해준다.
jsAddComma( varNumber )
  숫자를 받아서 comma를 찍어서 리턴한다 소수점 인식 숫자가 아닌값 -1을 리턴 음수표현가능
jsAddCommaAndZero( varNumber )
  숫자를 받아서 comma를 찍어서 리턴한다 소수점 인식 숫자가 아닌값 -1을 리턴 음수표현 불가능
jsCheckFloat(toCheck) Folat형인지를 체크 정수도 Float으로 인식
jsCheckPoint( toCheck , Positive , Negative ) 자리수 체크 정수 몇자리 소수 몇자리
jsCheckNumber(toCheck) Number타입인지 체크, 소수점은 Number타입으로 인식하지 않음 
getCutNumber(num, place) 소수점 아래 몇자리 이하 절삭
jsOnlyNumberKey() text 입력시 숫자이외의 키를 눌렀을때 무효화시킨다.
jsCheckFloatType( varNum, varLeft, varRight ) 정수부분자리수 소수부분자리수 체크 
 
기타
jsSplitCode(varString, varSplitChar, varIndex) 구분자로 구분해서 index의 문자를 리턴
jsCheckIp(toCheck) toCheck값이 정확한 IP Address인지 체크
jsCheckEmail( emailVal ) 이메일을 체크 - 보완요망
jsShowHelp( helpfile ) helpfile를 팝업으로 오픈
jsGetObjCnt( FormObj, varObjName ) 특정폼에서 해당오브젝트가 몇개인지를 리턴
jsClearFrame( fr ) 특정프레임에 공백 jsp를 띄워줌
jsDeleteCharAll( FormObj )
  해당 폼에 해당하는 모든 오브젝트의 값들에서 ',' and '/'문자를 지워준다.   
isAlphaNum(input) 영문과 숫자로만 이루어졌는지를 체크

IsHangul(field) 입력값에 한글이 있는지 체크
containsCharsOnly(input,chars) 입력값이 특정 문자(chars)만으로 되어있는지 체크
popup1( varAction, varWinName, varWidth, varHeight ) 팝업을 호출
jsBack() 이전 페이지로 이동
jsVisible( str ) 특정조건에 해당하면 모래시계를 보여줌
jsRunAfterTime() 설정한 시간뒤에 특정 function을 호출
trim(text) ltrim(text) rtrim(text) text의 좌우측, 좌측, 우측의 공백을 제거해서 리턴
*/


/*--------------------------------------------------
  기능   : Cookie Setting
  INPUT  : name, value
          expireFg : 'Y' : 2020년 까지 쿠키저장
          expireFg : 'N' : session이 끊어질때 쿠키지움
  RETURN : NONE
----------------------------------------------------*/
function setCookie( name, value, expireFg ) {
   var expireDate = new Date ( 2020, 1, 1, 1, 1, 1 ) ;

   if ( expireFg = 'Y' )
       document.cookie = name + "=" + value + "; expires=" + expireDate.toGMTString() ;
   else
       document.cookie = name + "=" + value + ";" ;

}
/*--------------------------------------------------
  기능   : Cookie Get
  INPUT  : name
  RETURN : 쿠키값( 없으면 "" )
----------------------------------------------------*/
function getCookie( name ) {
   var cookieFound = false ;
   var start = 0 ;
   var end   = 0 ;
   var cookieString = document.cookie ;

   var i = 0 ;

   // name에 해당되는 cookie를 찾는다.
   while ( i <= cookieString.length ) {
       start = i ;
       end = start + name.length ;
       if ( cookieString.substring( start, end ) == name ) {
           cookieFound = true ;
           break ;
       }
       i++ ;
   }

   // cookie를 찾았으면 해당하는 값을 그렇지 않으면 ""을 return ;
   if ( cookieFound ) {
       start = end + 1 ;
       end   = document.cookie.indexOf(";",start) ;
       if ( end < start )
           end = document.cookie.length ;
       return document.cookie.substring( start, end ) ;
   }

   return "" ;
}

/*-----------------------------------------------
' ->문자를 쿼리문에 사용시 에러가 발생하므로 `로 대치
INPUT  : str
RETURN : 문자열안의 문자중 ' 문자를 ` 로 변경한 문자열
-------------------------------------------------*/
function jsChangeComma( str ){
while( str.indexOf("'") != -1 ){
 str = str.replace("'","`");
}
   return str;
}

/*----------------------------------------------------------
  기능   : Split Code RETURN Splited code by varSplitChar
  INPUT  : varString 문자
     : varSplitChar 구분자
  : varIndex 구분자의 위치
  RETURN : Splited code by varSplitChar
  예     : jsSplitCode( "111^222^333", "^", 2 ) == "222"
-----------------------------------------------------------*/
function jsSplitCode(varString, varSplitChar, varIndex) {
var varArray = varString.split(varSplitChar) ;

return varArray[eval(varIndex)-1];
}

/*--------------------------------------------------
  기능   : Check Null RETURN T/F
  INPUT  : check  data
  RETURN : true  -> NULL
          false -> NOT NULL
----------------------------------------------------*/
function jsCheckNull( toCheck )
{
    var chkstr = toCheck + "";
    var is_Space = true ;

    if ( ( chkstr == "") || ( chkstr == null ) )
   return( true );

    for ( j = 0 ; is_Space && ( j < chkstr.length ) ; j++)
    {
     if( chkstr.substring( j , j+1 ) != " " )
        {
       is_Space = false ;
        }
    }
    return ( is_Space );
}

/*--------------------------------------------------
  기능   : Check IP address RETURN T/F
  INPUT  : toCheck  -> check data
  RETURN : true  -> IP address
          false -> not IP address
----------------------------------------------------*/
function jsCheckIp(toCheck)
{
    var chkstr = toCheck+"" ;
    var isIp = true ;

    if ( jsCheckNull(toCheck) )
         return false;

    for (j = 0 ; isIp && (j < toCheck.length) ; j++)
    {
         if ((toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
         {
             if ( toCheck.substring(j,j+1) == "." )
                 if ( j == 0 )
                     isIp = false ;
             else
                 isIp = false ;
         }
    }

    return isIp;
}

/*--------------------------------------------------
  기능   : Check Number RETURN T/F ( 소수점"."은 Number로 취급안함 )
  INPUT  : toCheck  -> check data
  RETURN : true  -> number ( "."이 포함안됨 )
          false -> not number
----------------------------------------------------*/
function jsCheckNumber(toCheck)
{
    var chkstr = toCheck+"" ;
    var isNum = true ;

    if ( jsCheckNull(toCheck) )
         return false;

    for (j = 0 ; isNum && (j < toCheck.length) ; j++)
    {
         if ((toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
         {
            if ( toCheck.substring(j,j+1) == "-" || toCheck.substring(j,j+1) == "+")
            {
               if ( j != 0 )
               {
                  isNum = false;
               }
            }
            else
      isNum = false;
    }
    }

    if (chkstr == "+" || chkstr == "-") isNum = false;

    return isNum;
}

/*--------------------------------------------------
  기능   : Check data RETURN T/F
  INPUT  : toCheck  -> check data
          checkOK  -> 들어가서는 안되는 data
  RETURN : false -> 들어가서는 안되는 data가 없다
          true  -> 들어가서는 안되는 data가 있다.
  예1    : jsStrCheck( '12345', 'ABab' )
          string '12345'에는 'ABab'가 없으므로
          false를 리턴
  예2    : jsStrCheck( '12$45', 'ABab$#%' )
          string '12$45'에는 '$'가 있으므로
          true를 리턴
----------------------------------------------------*/
function jsStrCheck(checkStr, checkOK) {
   for (i = 0; i < checkStr.length; i++) {
       ch = checkStr.charAt(i);
       for (j = 0; j < checkOK.length; j++)
       if (ch == checkOK.charAt(j))
          break;
       if (j == checkOK.length) {
               return false;
               break;
       }
   }
   return true;
}

/*--------------------------------------------------
  기능   : Check Float RETURN T/F (정수도 Float로 취급)
  INPUT  : toCheck  -> check data
  RETURN : true  -> number
          false -> not number
----------------------------------------------------*/
function jsCheckFloat(toCheck)
{
    var chkstr = toCheck+"" ;
    var isFloat = true;

    var chkPoint = false;
    var chkMinus = false;

    if ( jsCheckNull(toCheck) )
    {
          return false;
    }

    for (j = 0 ; isFloat && (j < toCheck.length); j++)
    {
        if ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9"))
        {

           if ( toCheck.substring(j,j+1) == "." )
           {
              if ( !chkPoint ) chkPoint = true ;
              else  isFloat = false ;
           }
           else if ( toCheck.substring(j,j+1) == "-" || toCheck.substring(j,j+1) == "+")
           {
              if ( ( j == 0 ) && ( !chkMinus ) ) chkMinus = true ;
              else isFloat = false;
           }
           else isFloat = false;
       }
   }

   return isFloat;
}

/*--------------------------------------------------
  기능   : 자릿수 check RETURN T/F
  INPUT  : toCheck  -> check data
  RETURN : true  -> number
          false -> not number
----------------------------------------------------*/
function jsCheckPoint( toCheck , Positive , Negative )
{
    var strPos = toCheck + "" ;
    var isPoint = true ;

    if ( jsCheckFloat ( toCheck ) )
    {

        var inx = strPos.indexOf(".") ;

        if ( inx == -1 )
        {
             if ( strPos.length > parseInt(Positive) )
                isPoint = false ;
             else
                isPoint = true ;
         }
         else
         {
              var pos = strPos.substring( 0, inx ) ;
              var nev = strPos.substring(inx + 1) ;

              if ( pos.length > parseInt(Positive) )
                    isPoint = false ;
              else if ( nev.length > parseInt(Negative) )
                    isPoint = false ;
              else
                    isPoint = true ;
         }
     }
     else if ( jsCheckNumber (toCheck) )
           isPoint = true  ;
     else
           isPoint = false ;

     return isPoint ;

}

////////////////////////////////////////////////////////////////n
////////////    DATE  VALIDATION  CHECK    //////////////////////
/////////////////////////////////////////////////////////////////

/*--------------------------------------------------
  기능   : calender에서 사용할 월별 배열를 만든다.
  INPUT  : 각 인자의 값
----------------------------------------------------*/
function jsMonthArray(m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11)
{
     this[0] = m0;
     this[1] = m1;
     this[2] = m2;
     this[3] = m3;
     this[4] = m4;
     this[5] = m5;
     this[6] = m6;
     this[7] = m7;
     this[8] = m8;
     this[9] = m9;
     this[10] = m10;
     this[11] = m11;
}


/*--------------------------------------------------
  기능   : 년도를 check한다.
  INPUT  : toCheck
  RETURN : NONE
    MSG :
----------------------------------------------------*/

function jsCheckYYYY(toCheck)
{
  return ( ( toCheck.length == 4) && ( jsCheckNumber(toCheck)  ) && ( toCheck != "0000") );
}

/*--------------------------------------------------
  기능   : 년월을 check한다.
  INPUT  : toCheck
  RETURN : NONE
    MSG :
----------------------------------------------------*/

function jsCheckYYYYMM(toCheck)
{
    var isDate  = true ;

    if ( toCheck.length != 6 )
    {
         isDate = false ;
    }
    else
    {

          var yy = toCheck.substring(0,4) +"" ;
          var mm = toCheck.substring(4,6) +"" ;

          if ( !jsCheckYYYY(yy) )
             isDate = false ;
          else if ( !jsCheckMM(mm) )
             isDate = false ;
    }

    return isDate ;
}

/*--------------------------------------------------
  기능   : 월을 check한다.
  INPUT  : toCheck
  RETURN :
   MSG  :
----------------------------------------------------*/
function jsCheckMM(toCheck)
{
     return ((toCheck.length > 0) && (jsCheckNumber(toCheck)) && (0< eval(toCheck)) && (eval(toCheck) < 13));
}

/*--------------------------------------------------
  기능   : 일을 check한다.
  INPUT  : toCheck
  RETURN : NONE
    MSG :
----------------------------------------------------*/
function jsCheckDD(yyyy,mm,toCheck)
{
     var isYMD  = false;
     var monthDD= new jsMonthArray(31,28,31,30,31,30,31,31,30,31,30,31);
     var im     = eval(mm) - 1;
     if ( toCheck.length == 0 )  return false;
     if ( !jsCheckNumber(toCheck)  )  return false;
     var dd     = eval(toCheck);
     if ( ( (yyyy%4 == 0) && (yyyy%100 != 0) ) || (yyyy%400 == 0) )
     {
          monthDD[1] = 29;
     }
     if ( (0 < dd) && (dd <= monthDD[im]) ) isYMD = true;
          return isYMD;
}

/*--------------------------------------------------
  기능   : 날짜를 check한다.
  INPUT  : dateVal '20030321'
  RETURN : NONE
    MSG :
----------------------------------------------------*/
function jsCheckDate( dateVal )
{

    var isDate  = true ;

    if ( dateVal.length != 8 )
    {
         isDate = false ;
    }
    else
    {

          var yy = dateVal.substring(0,4) +"" ;
          var mm = dateVal.substring(4,6) +"" ;
          var dd = dateVal.substring(6,8) +"" ;

          if ( !jsCheckYYYY(yy) )
             isDate = false ;
          else if ( !jsCheckMM(mm) )
             isDate = false ;
          else if ( !jsCheckDD (yy,mm,dd) )
             isDate = false ;
    }

    return isDate ;

}

/*--------------------------------------------------
  기능   : 날짜에 년수를 더한다.
  INPUT  : startDt(YYYYMMDD), year
  RETURN : rtnValue : 날짜에 년수를 더한 날짜
          -1       : ERROR..!
          예) 20000110 + 1년 = 20010110
          예) 20000229 + 1년 = 20010228
    MSG :
----------------------------------------------------*/
function jsAddYear( startDt, plusYear ) {
var rtnValue = -1 ;

// input date의 날짜 체크
if ( !jsCheckDate(startDt) || !jsCheckNumber(plusYear) ) {
 rtnValue = -1 ;
 return rtnValue ;
}

var yyyy = startDt.substring(0,4) +"" ;
var mm   = startDt.substring(4,6) +"" ;
var dd   = startDt.substring(6,8) +"" ;

var newYyyy = (eval(yyyy) + eval(plusYear)) ;

// 윤달(29일) 인 경우 28일로 고침
// 예) 20000229 에 1년을 더하면 20000228
var isYoonYear = false ;
// 4 로 나누어 떨어지면 윤년
// 100 으로 나누어 떨어지면 윤년 아님
// 400 으로 나누어 떨어지면 윤년
if ( (eval(newYyyy)%4) == 0 ) isYoonYear = true ;
if ( (eval(newYyyy)%100) == 0 ) isYoonYear = false ;
if ( (eval(newYyyy)%400) == 0 ) isYoonYear = true ;

if ( (mm == '02') && (dd == '29') && !isYoonYear ) dd = '28' ;

rtnValue = newYyyy + mm + dd ;

return rtnValue ;
}

/*--------------------------------------------------
  기능   : 날짜에 월수를 더한다.
  INPUT  : startDt(YYYYMMDD), year
  RETURN : rtnValue : 날짜에 월수를 더한 날짜
          -1       : ERROR..!
          예) 20000110 + 3월  = 20000410
          예) 20000229 + 12월 = 20000228
    MSG :
----------------------------------------------------*/
function jsAddMonths( startDt, plusMonth ) {
var rtnValue = -1 ;

// input date의 날짜 체크
if ( !jsCheckDate(startDt) || !jsCheckNumber(plusMonth) ) {
 rtnValue = -1 ;
 return rtnValue ;
}

var yyyy = startDt.substring(0,4) +"" ;
var mm   = startDt.substring(4,6) +"" ;
var dd   = startDt.substring(6,8) +"" ;

var newMm = null;

// 월수를 더하여 1년이 넘는 경우
if ( (eval(mm) + eval(plusMonth)) > 12 ) {
 yyyy  = eval(yyyy) + 1 ;
 newMm = eval(mm) + eval(plusMonth) - 12 ;
} else {
 newMm = eval(mm) + eval(plusMonth) ;
}

// 윤년 처리
var isYoonYear = false ;
// 4 로 나누어 떨어지면 윤년
// 100 으로 나누어 떨어지면 윤년 아님
// 400 으로 나누어 떨어지면 윤년
if ( (eval(yyyy)%4) == 0 ) isYoonYear = true ;
if ( (eval(yyyy)%100) == 0 ) isYoonYear = false ;
if ( (eval(yyyy)%400) == 0 ) isYoonYear = true ;

// 윤년인 경우
if ( isYoonYear ) {
 if ( (newMm == '02') && ( dd=='30' || dd=='31' ) ) dd = '29' ;
// 평년인 경우
} else {
 if ( (newMm == '02') && ( dd=='29' || dd=='30' || dd=='31' ) ) dd = '28' ;
}

// 월의 자리수를 맞춘다. ( 2 월 -> 02 )
if ( eval(newMm) < 10 ) { newMm = "0" + newMm  } ;
rtnValue = yyyy + newMm + dd ;

return rtnValue ;
}

/*--------------------------------------------------
  기능   : 날짜와 날짜 사이의 일수를 리턴한다.
  INPUT  : startDt(YYYYMMDD), endDt(YYYYMMDD)
  RETURN : rtnValue : 날짜와 날짜 사이의 일수
          -1       : ERROR..!
    MSG :

----------------------------------------------------*/
function jsGetBetweenDay( startDt, endDt )
{
    var rtnValue = 0 ;

    // input date의 날짜 체크
    if ( !jsCheckDate(startDt) || !jsCheckDate(endDt) ) {
     rtnValue = -1 ;
    }
    else {
          var yyyy = startDt.substring(0,4) +"" ;
          var mm   = startDt.substring(4,6) +"" ;
          var dd   = startDt.substring(6,8) +"" ;
          var startDate = new Date(yyyy,(eval(mm)-1),dd) ; // 달 은 한달이 느리므로 1을 빼준다.

          yyyy = endDt.substring(0,4) +"" ;
          mm   = endDt.substring(4,6) +"" ;
          dd   = endDt.substring(6,8) +"" ;
          var endDate = new Date(yyyy,(eval(mm)-1),dd) ;

          // 1000분의 1초 단위를 일 단위로 바꾸기
          rtnValue = ((endDate-startDate)/60/60/24/1000) ;
    }

    return rtnValue ;

}
/*--------------------------------------------------
  기능   : Check Time RETURN T/F
  INPUT  : check  time
  RETURN : true  -> TIME
          false -> NOT TIME
----------------------------------------------------*/
function jsCheckTime( toCheck )
{
    var chkstr  = toCheck + "";

    if ( ( chkstr == "") || ( chkstr == null ) )
   return( false );

    var mm = chkstr.substring( 0 ,2 );
    var ss = chkstr.substring( 3 ,5 );

    if (( mm <= "23" ) && ( mm >= "00" ))
    {
        if (( ss <= "60" ) && ( ss >= "00" ))
        {
            if ( chkstr.substring( 2 ,3 ) == ":")
            {
             return( true );
            }
        }
    }
    return( false );
}

/*--------------------------------------------------
  기능   : Check 주민등록번호 RETURN T/F
  INPUT  : toCheck
  RETURN : true  -> 올바른 번호
          false ->
----------------------------------------------------*/
function jsCheckJumin(toCheck) {
   var isJumin = true;
   if ( jsCheckNull(toCheck) ) {
         return false;
   } else if ( toCheck.length < 13 || toCheck.length > 13 ) {
         return false;
   } else if ( toCheck.substring(2,3) > "1" || toCheck.substring(6,7) > "2" || toCheck.substring(6,7) == "0" ) {
         return false;
   } else if ( toCheck.substring(2,3) == "1" && toCheck.substring(3,4) > "2" ){
         return false;
   } else if (!(toCheck.substring(4,6) >= "01" && toCheck.substring(4,6) <= "31")){
         return false;
   }
  for (j = 0; isJumin && (j < toCheck.length); j++) {
      if ( ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9")) ) {
          isJumin = false;
      }
  }


 var a1=toCheck.substring(0,1)
 var a2=toCheck.substring(1,2)
 var a3=toCheck.substring(2,3)
 var a4=toCheck.substring(3,4)
 var a5=toCheck.substring(4,5)
 var a6=toCheck.substring(5,6)
 var check_digit=a1*2+a2*3+a3*4+a4*5+a5*6+a6*7
 var b1=toCheck.substring(6,7)
 var b2=toCheck.substring(7,8)
 var b3=toCheck.substring(8,9)
 var b4=toCheck.substring(9,10)
 var b5=toCheck.substring(10,11)
 var b6=toCheck.substring(11,12)
 var b7=toCheck.substring(12,13)

 var check_digit=check_digit+b1*8+b2*9+b3*2+b4*3+b5*4+b6*5
 check_digit = check_digit%11
 check_digit = 11 - check_digit
 check_digit = check_digit%10
 if (check_digit != b7){
  isJumin = false;
 }

  return isJumin;
}

/*--------------------------------------------------
  기능   : Check 사업자 등록번호 RETURN T/F
  INPUT  : toCheck
  RETURN : true  -> 올바른 번호
          false ->
----------------------------------------------------*/
function jsCheckSaupJa(toCheck) {
   var isSaupJa = true;
   if ( jsCheckNull(toCheck) ) {
         return false;
   } else if ( toCheck.length < 10 || toCheck.length > 10 ) {
         return false;
   }
   for (j = 0; isSaupJa && (j < toCheck.length); j++) {
      if ( ( (toCheck.substring(j,j+1) < "0") || (toCheck.substring(j,j+1) > "9")) ) {
          isSaupJa = false;
      }
   }
   return isSaupJa;
}

/*--------------------------------------------------
  기능   : E-Mail를 check한다.
  INPUT  : emailVal
  RETURN : NONE
    MSG :
----------------------------------------------------*/
function jsCheckEmail( emailVal )
{
    if ( jsCheckNull(emailVal) ) return true;

    var inx = emailVal.indexOf("@") ;

    if ( inx <= 0 || inx==emailVal.length-1 ) return false;

    return true ;
}
/*--------------------------------------------------
  기능   :
  INPUT  : varNum : 실수
       varLeft : 정수부분 자리수
       varRight : 소수부분 자리수
  RETURN : true : 실수가 정/소수부분의 자리수를 초과하지 않는다.
       false : 실수가 정/소수부분의 자리수를 초과한다.
----------------------------------------------------*/
function jsCheckFloatType( varNum, varLeft, varRight ) {

var resultFlag = true ;

if ( varNum.charAt(0) == "-" ){
 varNum = varNum.substring(1,varNum.length);
}

var PointIndex = varNum.indexOf(".");

if ( PointIndex < 0 ){
 if ( varNum.length > varLeft )
  resultFlag = false ;
}else{
 var LeftLength = varNum.substring(0,PointIndex).length;
 var RightLength = varNum.substring(PointIndex+1, varNum.length ).length;

 if ( (LeftLength > varLeft) || (RightLength > varRight) )
  resultFlag = false ;
}

return resultFlag ;

}

/*--------------------------------------------------
  기능   :
  INPUT  : helpfile
  RETURN :
----------------------------------------------------*/
function jsShowHelp( helpfile )
{
     var helpstr = helpfile + "" ;
     var URL     = "" ;
     var cWin ;

     URL = "/help/"+helpfile+".html" ;

     cWin = window.open(URL,"help","toolbar=0,location=0,directories=0,status=0,menubar=1,scrollbars=1,resizable=1,width=560,height=320");

     cWin.focus();
}

/*--------------------------------------------------
  기능   : 한글이든 영문이든 제대로 갯수 체크를 해준다.
  INPUT  : String
  RETURN :
----------------------------------------------------*/
function getByteLength(s){
  var len = 0;
  if ( s == null ) return 0;
  for(var i=0;i<s.length;i++){
     var c = escape(s.charAt(i));
     if ( c.length == 1 ) len ++;
     else if ( c.indexOf("%u") != -1 ) len += 2;
     else if ( c.indexOf("%") != -1 ) len += c.length/3;
  }
  return len;
}

/*--------------------------------------------------
  기능   : FormObj에서 varObjName이 몇개 존재하는지 리턴한다.
  INPUT  : FormObj : FormName
     : varObjName : 객체명
  RETURN :
----------------------------------------------------*/
function jsGetObjCnt( FormObj, varObjName ){
var cnt = 0 ;
  for(var inx = 0; inx < FormObj.elements.length ; inx++ ) {
     if ( FormObj.elements[inx].name == varObjName ) {
      cnt++ ;
     }
  }
  return cnt;
}

/*--------------------------------------------------
  기능   :  SELECT OPTION BOX의 값을 RETURN 한다.
  INPUT  : sb = selectBoxName
  RETURN :
----------------------------------------------------*/
function jsCheckSelectBox ( sb )
{
   var temp = sb.options[sb.selectedIndex].value ;
   return ( temp );
}

function jsCheckSelectBoxNm ( sb )
{
   var temp = sb.options[sb.selectedIndex].text ;
   return ( temp );
}

/*--------------------------------------------------
  기능   :  해당 Frame을 공백페이지로 변경
  INPUT  : fr : FrameName
  RETURN :
----------------------------------------------------*/
function jsClearFrame( fr ) {
   fr.location = "/common/blank.jsp";
}

/*--------------------------------------------------
  기능   : checkBox를 전체선택 및 해제를 할수 있게 한다.
  INPUT  : FormObj FormName
       elemNm CheckBox name
       checkYn boolean
  RETURN :
----------------------------------------------------*/
function jsToggle(FormObj, elemNm, checkYn){
var i =0;
while (i < FormObj.elements.length)
{
 if (FormObj.elements[i].name== elemNm )
 {
  FormObj.elements[i].checked= checkYn;
 }
 i++;
}
}

/*--------------------------------------------------
  기능   : focus 옮기기
  INPUT  : varTextObj : TextBox 객체명
       varLength  : 조건에 맞는 textLength
       varFocusToObj : Focus를 옮겨갈 객체명
  RETURN :
----------------------------------------------------*/
function jsMoveFocus( varTextObj, varLength, varFocusToObj ) {
if ( varTextObj.value.length == varLength ) {
 varFocusToObj.focus() ;
 varFocusToObj.select() ;
 return ;
}
}

/*--------------------------------------------------
  기능   : 문자를 숫자로 convert 한다. 단,
       parseFloat 와 다른 점은 null 이 올때 0 으로 인식한다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsParseInt( varStr ) {
if ( varStr == null || varStr == "" )
 return 0 ;
else
 return parseInt(varStr) ;
}

/*--------------------------------------------------
  기능   : 숫자를 한글로 변환한다.
  예) 450,000,000 -> 사억오천만
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsConvertNumberToHangul( varNum )
{
// 리턴할 문자열
var returnStr = "" ;

// 음수일 때는 에러
if ( eval(varNum) < 0 ) {
 return returnStr ;
}

// 넘어온 숫자를 문자로 변환
var numLen = varNum.length ;
// 변환된 문자를 앞에서 부터 한자씩 잘라서 보관할 변수
var oneChar = null ;
var isDone1 = true ;
var isDone2 = true ;
var isDone3 = true ;
var isDone4 = true ;
var isDone5 = false ;
for ( var inx = 0 ; inx < numLen ; inx++ ) {
 oneChar = varNum.substring( inx, inx+1 ) ;
 isDone5 = false ;

 if ( oneChar == "0" ) {
  // 아무일도 안함
 } else if ( oneChar == "1" ) {
  returnStr = returnStr + "일" ;
  isDone5 = true ;
 } else if ( oneChar == "2" ) {
  returnStr = returnStr + "이" ;
  isDone5 = true ;
 } else if ( oneChar == "3" ) {
  returnStr = returnStr + "삼" ;
  isDone5 = true ;
 } else if ( oneChar == "4" ) {
  returnStr = returnStr + "사" ;
  isDone5 = true ;
 } else if ( oneChar == "5" ) {
  returnStr = returnStr + "오" ;
  isDone5 = true ;
 } else if ( oneChar == "6" ) {
  returnStr = returnStr + "육" ;
  isDone5 = true ;
 } else if ( oneChar == "7" ) {
  returnStr = returnStr + "칠" ;
  isDone5 = true ;
 } else if ( oneChar == "8" ) {
  returnStr = returnStr + "팔" ;
  isDone5 = true ;
 } else if ( oneChar == "9" ) {
  returnStr = returnStr + "구" ;
  isDone5 = true ;
 }

 if ( ((numLen-inx) % 4) == 0 && oneChar != "0" ) {
  returnStr = returnStr + "천" ;
 } else if ( ((numLen-inx) % 4) == 3 && oneChar != "0" ) {
  returnStr = returnStr + "백" ;
 } else if ( ((numLen-inx) % 4) == 2 && oneChar != "0" ) {
  returnStr = returnStr + "십" ;
 } else if ( ((numLen-inx) % 4) == 1 ) {
  if ( numLen >= 17 && isDone1 && isDone5 ) {
   returnStr = returnStr + "경" ;
   isDone1 = false ;
  } else if ( numLen >= 13  && isDone2 && isDone5 ) {
   returnStr = returnStr + "조" ;
   isDone2 = false ;
  } else if ( numLen >= 9  && isDone3 && isDone5 ) {
   returnStr = returnStr + "억" ;
   isDone3 = false ;
  } else if ( numLen >= 5  && isDone4 && isDone5 ) {
   returnStr = returnStr + "만" ;
   isDone4 = false ;
  }
 }
}

return returnStr ;
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 comma를 찍어서 comma 를 찍어서 채워준다.
      소수점 허용 안함
   예) 1000.00 -> 1,000   
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeCurrency( varTextObj ) {
varTextObj.value = jsDeleteComma( varTextObj.value ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
var isPointed = false ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
  varText = varText + varTextObj.value.substring(inx, inx+1) ;
 }
}

varTextObj.value = jsAddComma( varText ) ;
}


/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 comma를 찍어서 comma 를 찍어서 채워준다.
      소수점 허용 함   
   예) 1000.00 -> 1,000.00   
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeForeignCurrency( varTextObj ) {
varTextObj.value = jsDeleteComma( varTextObj.value ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
var isPointed = false ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) || (varTextObj.value.substring(inx, inx+1)=='.') ) {
  // 점이 안찍히고 처음으로 점이 들어왔을때
  if ( !isPointed && varTextObj.value.substring(inx, inx+1)=='.' ) {
   isPointed = true ;
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  // 숫자 일때
  } else if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  }

 }
}

varTextObj.value = jsAddComma( varText ) ;
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 객체필드에 숫자만을 입력받게 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsOnlyNumber( varTextObj ) {

var varLength = varTextObj.value.length ;
var varText   = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
  varText = varText + varTextObj.value.substring(inx, inx+1) ;
 }
}

// 앞에 붙은 0 없애기 (예) 00200 -> 200
varLength = varText.length ;
var varTempReturnNumber = varText;
var varReturnNumber = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
  // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
  if ( varLength == 1 ) varReturnNumber = "0" ;
  else if ( eval(jsDeleteComma(varTempReturnNumber)) == '0' ) {
   varReturnNumber = "0" ;
   break ;
  }
 } else {
  varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
  break ;
 }
}

varTextObj.value = varReturnNumber;
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 숫자와 1개의 point만을 입력받게 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsOnlyFloat( varTextObj ) {

varTextObj.value = jsDeleteComma( varTextObj.value ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
var isPointed = false ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) || (varTextObj.value.substring(inx, inx+1)=='.') ) {
  // 점이 안찍히고 처음으로 점이 들어왔을때
  if ( !isPointed && varTextObj.value.substring(inx, inx+1)=='.' ) {
   isPointed = true ;
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  // 숫자 일때
  } else if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
   varText = varText + varTextObj.value.substring(inx, inx+1) ;
  }

 }
}

// 앞에 붙은 0 없애기 (예) 00200 -> 200
varLength = varText.length ;

var varReturnNumber = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varText.substring(inx, inx+1) == '0' ) {
  // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
  if ( varLength == 1 ) varReturnNumber = "0" ;
  else if ( eval(jsDeleteComma(varText)) == '0' ) {
   varReturnNumber = "0" ;
   break ;
  }
 } else {
  varReturnNumber = varText.substring(inx, varLength+1) ;
  break ;
 }
}

varTextObj.value = varReturnNumber ;

}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 YYYY/MM형식으로 [/]를 찍어서 채워준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeYyyyMm( varTextObj ) {
varTextObj.value = jsDeleteChar( varTextObj.value, '/' ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
  varText = varText + varTextObj.value.substring(inx, inx+1) ;
 }
}

if ( varText.length < 6 ) {
 varTextObj.value = varText ;
} else {
 varTextObj.value = varText.substring(0,4) + "/" + varText.substring(4,6) ;
}
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 String에 날짜형식으로 [/]를 찍어서 리턴.
    예) 200103 -> 2001/03
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeYyyyMmString( varText ) {
if ( varText.length != 6 || !jsCheckNumber( varText ) ) {
 return varText ;
}

var varReturnText   = "" ;

varReturnText = varText.substring(0,4) + "/" + varText.substring(4,6) ;

return varReturnText
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 필드에 날짜형식으로 [/]를 찍어서 채워준다.     
    예) 20010301 -> 2001/03/01         
  INPUT  : Text Object
  RETURN :
----------------------------------------------------*/
function jsMakeDate( varTextObj ) {
varTextObj.value = jsDeleteChar( varTextObj.value, '/' ) ;

var varLength = varTextObj.value.length ;
var varText   = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( jsCheckNumber(varTextObj.value.substring(inx, inx+1)) ) {
  varText = varText + varTextObj.value.substring(inx, inx+1) ;
 }
}

if ( varText.length < 8 ) {
 varTextObj.value = varText ;
} else {
 varTextObj.value = varText.substring(0,4) + "/" + varText.substring(4,6) + "/" + varText.substring(6,8) ;
}
}

/*--------------------------------------------------
  기능   : 파라메터로 넘어온 String에 날짜형식으로 [/]를 찍어서 채워준다.     
    예) 20010301 -> 2001/03/01         
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsMakeDateString( varText ) {
if ( varText.length != 8 || !jsCheckNumber( varText ) ) {
 return varText ;
}

var varReturnText   = "" ;

varReturnText = varText.substring(0,4) + "/" + varText.substring(4,6) + "/" + varText.substring(6,8) ;

return varReturnText
}

/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 찍어서 리턴한다. 음수도 표현가능
    예) 1000.00 -> 1,000.00
    예) 숫자가 아닌 값 -> -1 리턴     
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsAddComma( varNumber ){
// 숫자가 아니면 -1을 리턴한다.
if ( jsCheckNull(varNumber) ) return "" ;
if ( !jsCheckFloat(varNumber) ) {
 return -1 ;
}

// 소수 이상, 이하 부분을 따로 보관.
var PointIndex = varNumber.indexOf(".") ;
var varUnderPoint = "" ;
var isPointed = false ;
// 소수 이하가 없을때
if ( PointIndex < 0 ) {
 isPointed = false ;
 // 소수 이하 부분
 varUnderPoint = "" ;
 // 소수 이상 부분
 varOverPoint = varNumber ;
// 소수 이하가 있을때
} else {
 isPointed = true ;
 // 소수 이하 부분
 varUnderPoint = varNumber.substring(PointIndex+1, varNumber.length ) ;
 // 소수 이상 부분
 varOverPoint = varNumber.substring(0, PointIndex) ;
}

// 음수일때 앞의 "-" 따로 보관
var negativeFlag = false ;
if ( varOverPoint.substring(0,1) == "-" ) {
 negativeFlag = true ;
 varOverPoint = varOverPoint.substring(1,varOverPoint.length+1) ;
}

// 소수 이상 부분에 comma 넣기
var varLength = varOverPoint.length ;
var varCnt = 0 ;
var varTempReturnNumber = "" ;
for ( var inx = varLength-1 ; inx >= 0 ; inx-- ) {
 varCnt++ ;

 // 소수점 찍기
 if ( varCnt == 4 ) {
  varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + "," + varTempReturnNumber ;
  varCnt = 1 ;
 // 소수점 안찍기
 } else {
  varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + varTempReturnNumber ;
 }

}

// 앞에 붙은 0 없애기 (예) 00200 -> 200
varLength = varTempReturnNumber.length ;
var varReturnNumber = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
  // '0' 이 넘어왔을 경우 '0'을 그대로 리턴해야 한다.
  if ( varLength == 1 ) varReturnNumber = "0" ;
  else if ( eval(jsDeleteComma(varTempReturnNumber)) == '0' ) {
   varReturnNumber = "0" ;
   break ;
  }
 } else {
  varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
  break ;
 }
}

// 소수점 이하 붙이기
if ( isPointed ) {
 varReturnNumber = varReturnNumber + "." + varUnderPoint ;
}

// 음수 붙이기
if ( negativeFlag ) {
 varReturnNumber = "-" + varReturnNumber ;
}

return varReturnNumber ;

}

/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 찍어서 리턴한다.
    예) 1000 -> 1,000.00
    예) 숫자가 아닌 값 -> -1 리턴  
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsAddCommaAndZero( varNumber ){
// 숫자가 아니면 -1을 리턴한다.
if ( jsCheckNull(varNumber) ) return "" ;
if ( !jsCheckFloat(varNumber) ) {
 return -1 ;
}

// 소수 이상, 이하 부분을 따로 보관.
var PointIndex = varNumber.indexOf(".") ;
var varUnderPoint = "" ;
// 소수 이하가 없을때
if ( PointIndex < 0 ) {
 // 소수 이하 부분
 varUnderPoint = "" ;
 // 소수 이상 부분
 varOverPoint = varNumber ;
// 소수 이하가 있을때
} else {
 // 소수 이하 부분
 varUnderPoint = varNumber.substring(PointIndex+1, varNumber.length ) ;
 // 소수 이상 부분
 varOverPoint = varNumber.substring(0, PointIndex) ;
}

// 소수 이상 부분에 comma 넣기
var varLength = varOverPoint.length ;
var varCnt = 0 ;
var varTempReturnNumber = "" ;
for ( var inx = varLength-1 ; inx >= 0 ; inx-- ) {
 varCnt++ ;

 // 소수점 찍기
 if ( varCnt == 4 ) {
  varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + "," + varTempReturnNumber ;
  varCnt = 1 ;
 // 소수점 안찍기
 } else {
  varTempReturnNumber = varOverPoint.substring( inx, inx+1 ) + varTempReturnNumber ;
 }

}

// 앞에 붙은 0 없애기 (예) 00200 -> 200
varLength = varTempReturnNumber.length ;
var varReturnNumber = "" ;
for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varTempReturnNumber.substring(inx, inx+1) == '0' ) {
 } else {
  varReturnNumber = varTempReturnNumber.substring(inx, varLength+1) ;
  break ;
 }
}

// 소수점 이하 붙이기
if ( varUnderPoint.length == 0 ){
 varReturnNumber = varReturnNumber + "." + "00" ;
}else if ( varUnderPoint.length == 1 ){
 varReturnNumber = varReturnNumber + "." + varUnderPoint + "0";
}else if ( varUnderPoint.length == 2 ){
 varReturnNumber = varReturnNumber + "." + varUnderPoint ;
}

return varReturnNumber ;

}

/*--------------------------------------------------
  기능   : 숫자를 받아서 comma를 없애고 리턴한다
    예) 1,000.00 -> 1000.00    
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsDeleteComma( varNumber ){
var varLength = varNumber.length ;

varReturnNumber = "" ;

for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varNumber.substring( inx, inx+1 ) != "," ) {
  varReturnNumber = varReturnNumber + varNumber.substring( inx, inx+1 ) ;
 }
}

return varReturnNumber ;
}

/*--------------------------------------------------
  기능   : 글자를 받아서 param를 없애고 리턴한다.
    예) 2001/01/01 -> 20010101    
  INPUT  : varText 문자열 varDelete 삭제하고자하는 Character
  RETURN :
----------------------------------------------------*/
function jsDeleteChar( varText, varDelete ){
var varLength = varText.length ;

varReturnText = "" ;

for ( var inx = 0 ; inx < varLength ; inx++ ) {
 if ( varText.substring( inx, inx+1 ) != varDelete ) {
  varReturnText = varReturnText + varText.substring( inx, inx+1 ) ;
 }
}

return varReturnText ;
}

/*--------------------------------------------------
  기능   : 폼 이름을 받아서 모든 text,hidden값에 comma, / 문자를 없애준다
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsDeleteCharAll( FormObj ) {
for ( i=0; i<FormObj.elements.length; i++ ) {
 if ( FormObj.elements[i].type == "text" || FormObj.elements[i].type == "hidden" ) {
  if ( !jsCheckNull(FormObj.elements[i].value) && jsCheckFloat(jsDeleteComma(FormObj.elements[i].value)) ) {
   FormObj.elements[i].value = jsDeleteComma(FormObj.elements[i].value);
  } else if ( !jsCheckNull(FormObj.elements[i].value) && jsCheckDate(jsDeleteChar(FormObj.elements[i].value,'/')) ) {
   FormObj.elements[i].value = jsDeleteChar( FormObj.elements[i].value, '/' );
  }
 }
}
}

/*--------------------------------------------------
  기능   : FormObj에서 checkBox 가 몇개 선택되었는지  리턴한다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function jsCheckBoxSelectedCnt( FormObj, checkBoxName ){
  var cnt = 0 ;
  for(var inx = 0; inx < FormObj.elements.length ; inx++ ) {
     if ( FormObj.elements[inx].name == checkBoxName && FormObj.elements[inx].checked ) {
      cnt++ ;
     }
  }
  return cnt;
}

/*--------------------------------------------------
  기능   : 영문 과 숫자로만 이루어 졌는지  체크를 해준다.
  INPUT  :
  RETURN :
----------------------------------------------------*/
function isAlphaNum(input) {
   var chars = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
   return containsCharsOnly(input,chars);
}


//입력값이 한글이 포함되어있는지 체크

function IsHangul(field)
{
if ( field == "" ) return false;

   var rtnLen = 0 ;

   for (i=0; i<field.length; i++)
   {  
       // 한글인 경우 길이가 UniCode 값은 10000 이상이다.
       if(field.charCodeAt(i) > 10000 )
       {
        rtnLen++;
       }
   }
  
   if ( rtnLen > 0 )
    return true;
   else
    return false;
}


/*----------------------------------------------------
  입력값이 특정 문자(chars)만으로 되어있는지 체크
  특정 문자만 허용하려 할 때 사용
  ex) if (!containsCharsOnly(form.blood,"ABO")) {
         alert("혈액형 필드에는 A,B,O 문자만 사용할 수 있습니다.");
     }
------------------------------------------------------*/
function containsCharsOnly(input,chars) {
   for (var inx = 0; inx < input.value.length; inx++) {
      if (chars.indexOf(input.value.charAt(inx)) == -1)
          return false;
   }
   return true;
}

/*--------------------------------------------------
  기능   : POPUP OPEN Script
  INPUT  :
  RETURN :
----------------------------------------------------*/
function popup1( varAction, varWinName, varWidth, varHeight ){
var win = window.open( varAction, varWinName , "toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=1,resizable=1, width=" + varWidth + ",height=" + varHeight + ", left=50,top=50");
return win;

//var FormObj = document.dataForm;
//FormObj.target = varWinName ;
//FormObj.action = varAction ;
//FormObj.submit() ;
}


function toTimeString( varDateObj ) { //formatTime(date)
   var year  = varDateObj.getFullYear();
   var month = varDateObj.getMonth() + 1; // 1월=0,12월=11이므로 1 더함
   var day   = varDateObj.getDate();

   if (("" + month).length == 1) { month = "0" + month; }
   if (("" + day).length   == 1) { day   = "0" + day;   }

   return ("" + year + month + day );
}

function jsAfterThisDate( varStdDate , varYYYY , varMM , varDD ) {

   var varDateObj = new Date();

   varStdDate = jsDeleteChar( varStdDate, "/" );

   var yyyy = varStdDate.substring(0,4) +"" ;
   var mm   = varStdDate.substring(4,6) +"" ;
   var dd   = varStdDate.substring(6,8) +"" ;

   var startDate = new Date(yyyy,(eval(mm)-1),dd) ; // 달 은 한달이 느리므로 1을 빼준다.

   varDateObj.setFullYear(startDate.getFullYear() + eval(varYYYY) ); //년을 더함
   varDateObj.setMonth(startDate.getMonth() + eval(varMM) );       //월을 더함
   varDateObj.setDate(startDate.getDate() + eval(varDD)  );         //일을 더함

   return toTimeString(varDateObj);
}

/*--------------------------------------------------
  기능   : text 입력시 숫자이외의 키를 눌렀을때 무효화시킨다.
  INPUT  : 없음
  RETURN : 이벤트 무효화

  주의!  : onKeypress 이벤트만 사용할것
         예) <input type="text" onKeypress="jsOnlyNumberKey();">
----------------------------------------------------*/
function jsOnlyNumberKey() {
   if ( event != null) {
     if ( event.keyCode < 48 || event.keyCode > 57 ) {
       event.returnValue = false;
     }
   }
}

/* 이전페이지로 이동 */
function jsBack(){
history.go(-1);
}

/* 모래시계 보이게 하기 */
function jsVisible( str ){
if( str == '1' )
 document.body.style.cursor='wait'
else
 document.body.style.cursor='auto'
}

/* 15초후에 jsRefresh()라는 function을 호출 */
var timeId   = null ;

function jsRunAfterTime() {
//15초 후에 Refresh
timeId = setTimeout( "jsRefresh()", 15000 ) ;
}

/**
* 소수점 아래 몇자리 이하 절삭.
*
* @param num 숫자
* @param place 자리수
* @return 절삭된 숫자
*/
function getCutNumber(num, place) {
var returnNum;
var str = "1";

return Math.floor( num * Math.pow(10,parseInt(place,10)) ) / Math.pow(10,parseInt(place,10));
}

/* text의 좌우 공백을 제거해서 리턴*/
function trim(text) {
if (text == "") {
 return text;
}

var len = text.length;
var st = 0;

while ((st < len) && (text.charAt(st) <= ' ')) {
 st++;
}

while ((st < len) && (text.charAt(len - 1) <= ' ')) {
 len--;
}

return ((st > 0) || (len < text.length)) ? text.substring(st, len) : text;
}

/* text의 좌측의 공백을 제거해서 리턴*/
function ltrim(text) {
if (text == "") {
 return text;
}

var len = text.length;
var st = 0;

while ((st < len) && (text.charAt(st) <= ' ')) {
 st++;
}

return (st > 0) ? text.substring(st, len) : text;
}

/* text의 우측의 공백을 제거해서 리턴*/
function rtrim(text) {
if (text == "") {
 return text;
}

var len = text.length;
var st = 0;

while ((st < len) && (text.charAt(len - 1) <= ' ')) {
 len--;
}

return (len < text.length) ? text.substring(st, len) : text;
}

/*--------------------------------------------------
  기능   : select box 를 CLEAR 시킨다.
  INPUT  : varObjFullNm : select box 객체
          varDeleteCnt : 첫번째 아이템 삭제 여부 결정
  RETURN : NONE
----------------------------------------------------*/
function cmInitSelectBox( varObjFullNm, varDeleteCnt ) {
varObj = eval( varObjFullNm ) ;
varObj.length = varDeleteCnt ;
}

/*--------------------------------------------------
  기능   :  select box 를 만든다.
  INPUT  : varObjFullNm :  select box 객체
          varText      :
          varValue     : 
  RETURN : NONE
----------------------------------------------------*/
function cmMakeSelectBox( varObjFullNm, varText, varValue ) {
varObj = eval( varObjFullNm ) ;

var empOption = null ;

empOption = document.createElement("OPTION");
empOption.text = varText ;
empOption.value = varValue ;
varObj.options.add(empOption);
}

    //디비에 저장되어있는값을 읽어올때 공백이 아니면서 공백처럼 보이는건 이문제

   // 반각 문자를 전각문자로
   function convert2ByteChar(x_char) {
       var x_2byteChar = ""; //컨버트된 문자
       var c = x_char.charCodeAt(0);
       if(32 <= c && c <= 126) { //전각으로 변환될수 있는 문자의 범위
           if(c == 32) { //스페이스인경우 ascii 코드 32
               x_2byteChar = unescape("%uFFFC");
           } else {
               x_2byteChar = unescape("%u"+gf_DecToHex(c+65248));
           }
       }
       return  x_2byteChar;
   }

2006/09/08 16:02 2006/09/08 16:02
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > Nothing...
원본 http://blog.naver.com/theblueweb/110004684145

javascript

php

typeof(string1)=="string"

string1의 타입값 확인

is_string(string1);

string1.length

문자열의 길이를 반환

strlen(string1);

String.fromCharCode(fromNum)
fromChar.charCodeAt(0)

chr(fromNum);
ord(fromChar);

string1.toLowerCase() 모두 소문자로
string1.toUpperCase() 모두 대문자로

strtolower(string1);
strtoupper(string1);

string1.indexOf( string2, fromNum )

strpos( string1, string2, fromNum );

string1.charAt(number)

substr(string1, number, 1);

string1.lastIndexOf( string2, fromNum )

function strposr($string='', $search='', $case=0){
if(!$case){$string=strtolower($string); $search=strtolower($search);};
return ( strpos($string, $search)===false )?false:
strlen($string) - strlen($search) - (strpos( strrev($string), strrev($search)));
}

string1.substring( fromNum, toNum )

substr( string1, fromNum, (toNum-fromNum) );

string1.substr( fromNum, length )

substr( string1, fromNum, length);

string1.substr(fromNum, length)
string1.substring( fromNum, (fromNum+length) )

substr( string1, fromNum, length );

string1.substring( string1.indexOf(string2) )

strstr( string1, string2 );

string1.split(stringSplitter)

explode(stringSplitter, string1);

string1.replace( findThis, replaceWithThis )

str_replace( findThis, replaceWithThis, string1 );

string1.replace( regularExpression, replaceWithThis )

preg_replace( regularExpression, replaceWithThis, string1 );

string1.replace( string1.substring( fromNumIndex, (fromNumIndex+length) ), replaceWithThis )

substr_replace( string1, replaceWithThis, fromNumIndex, length );

string1=string1.replace(/<[^>]*>/g, '');

string1=striptags(string1);

string1.replace( findThis, replaceWithThis )

str_replace( findThis, replaceWithThis, string1 );

string1.replace( regularExpression, replaceWithThis )

preg_replace( regularExpression, replaceWithThis, string1 );

string1.replace( string1.substring( fromNumIndex, (fromNumIndex+length) ), replaceWithThis )

substr_replace( string1, replaceWithThis, fromNumIndex, length );

typeof(array1)=="object"

is_array(array1)

array1.length 배열의 갯수 세기

sizeof(array1);

count(array1);

array1.join(stringJoiner)

implode(stringJoiner, string1);

array1.concat(array2, array3...)

배열의 병합

array_merge(array1, array2, array3...);
array_merge_recursive(array1, array2, array3...);

shift()

array_shift(array1);

unshift()

array_unshift(array1);

pop()

array_pop(array1);

push() 배열끝에 원소를 추가

array_push(array, mixed[,mixed...]);

array1.reverse() 배열의 역순

array_reverse(array1);

array1.slice(startIndex, endIndex)

array_slice( array1, startIndex, (endIndex-startIndex) );

array1.splice(startIndex, length)

array_splice( array1, startIndex, length );

array1.slice(startIndex, (startIndex+length))

array_slice( array1, startIndex, length );

array1.splice(startIndex, length, [item...])

startIndex 다음번 length 만큼 삭제 후 item을 삽입

array_splice( array1, startIndex, length );

array1.sort

sort(array1);

isNaN(number)

is_nan(number);
is_numeric(number);
is_integer(number);
is_double(number);

parseInt(string, [radix])

string을 radix에 해당하는 진수값으로 변환

(integer)string;

parseFloat(string)

(double)string;

Math.max(number1, number2)

max(number1, number2);

Math.min(number1, number2)

min(number1, number2);

(Math.random()*(max-min))+min

mt_rand(min, max);

Math.round(
(Math.random()*(max-min))+min
)

mt_srand((double)microtime()*1000000)

Math.pow(number, power)

pow(number, power);

Math.sqrt(number)

sqrt(number);

Math.sin();

sin();

Math.cos();

cos();

Math.tan();

tan();

Math.asin();

asin();

Math.acos();

acos();

Math.atan();

atan();

Math.PI;

pi();

Math.log(value)

log(value);

typeof(functionName)=="function";

function_exists("functionName");

functionName.arguments.length;

func_num_args();

functionName.arguments;

func_get_args();

functionName.arguments[Number];

func_get_arg(Number)


[원문] http://www.idsu.net/bbs/view.php?wuser_id=study&category_no=&u_no=55&pg=1&sn=&shs=&shn=&shm

2006/09/08 16:01 2006/09/08 16:01
이 글에는 트랙백을 보낼 수 없습니다
Web_developing/PHP  2006/09/08 16:00
출처 카페 > 플래시,Flash,포토샵,P.. / 나만봐
원본 http://cafe.naver.com/q69/9076

II. 배열함수

소개

이 함수는 다양한 방법으로 배열에 접근하고 배열을 조작할 수 있게 해 준다. 배열은 변수들의 집합을 저장, 관리, 처리하는데 있어서 핵심적이다.

일차원 뿐만 아니라 다차원 배열이 지원되고 있고, 사용자나 다른 함수에 의해 생성될 수 있다. 데이터베이스 질의문으로부터 배열을 생성하는 전용 데이터베이스 제어 함수와 배열을 반환하는 함수를 제공한다.

PHP에서의 배열 구현과 사용법에 대한 자세한 설명은 매뉴얼의 배열 섹션을 참고.

요구 사항

이 확장 모듈을 빌드할 때 외부 라이브러리가 필요하지 않습니다.

설치

이 함수들은 설치하지 않아도 사용할 수 있습니다; PHP 코어의 일부입니다.

런타임 설정

이 확장 모듈은 php.ini 설정이 존재하지 않습니다.

리소스 종류

이 확장 모듈은 리소스형을 정의하지 않습니다.

상수 정의

아래 상수들은 PHP 코어의 일부로, 항상 사용할 수 있습니다.

CASE_LOWER (integer)

CASE_LOWERarray_change_key_case() 함수에서 배열 키를 소문자로 변환하는데 사용된다. 또한 이 상수는 array_change_key_case()의 기본값이다.

CASE_UPPER (integer)

CASE_UPPERarray_change_key_case() 함수에서 배열 키를 대문자로 변환하는데 사용된다.

정렬 순서 플래그:

SORT_ASC (integer)

SORT_ASCarray_multisort() 함수에서 오름차순 정렬에 사용된다.

SORT_DESC (integer)

SORT_DESCarray_multisort() 함수에서 내림차순 정렬에 사용된다.

정렬 형태 플래그: 여러 정렬함수에 의해 사용됨.

SORT_REGULAR (integer)

SORT_REGULAR는 아이템들을 통상적인 방법으로 비교하는데 사용됨.

SORT_NUMERIC (integer)

SORT_NUMERIC는 아이템들을 수치로서 비교하는데 사용됨.

SORT_STRING (integer)

SORT_STRING는 아이템들을 문자열로서 비교하는데 사용됨.

COUNT_NORMAL (integer)
COUNT_RECURSIVE (integer)
EXTR_OVERWRITE (integer)
EXTR_SKIP (integer)
EXTR_PREFIX_SAME (integer)
EXTR_PREFIX_ALL (integer)
EXTR_PREFIX_INVALID (integer)
EXTR_PREFIX_IF_EXISTS (integer)
EXTR_IF_EXISTS (integer)
EXTR_REFS (integer)
차례
array_change_key_case -- 모두 대문자나 소문자화된 문자열 키를 갖는 배열로 반환한다
array_chunk -- 배열을 여러 덩어리로 분산시킨다
array_combine --  키를 위한 배열과 값을 위한 배열을 각각 사용하여 배열을 생성한다
array_count_values -- 배열 값의 수를 센다
array_diff_assoc -- 인덱스 검사와 함께 배열간의 차이를 계산한다
array_diff_uassoc --  Computes the difference of arrays with additional index check which is performed by a user supplied callback function
array_diff -- 배열간의 차이를 계산한다
array_fill -- 배열을 특정값으로 채운다
array_filter --  콜백함수를 사용하여 배열의 원소를 필터한다
array_flip -- 배열안의 모든 키를 각 키의 연관값으로 바꾼다.
array_intersect_assoc -- 인덱스 검사과 함께 배열의 중복을 계산한다
array_intersect -- 배열의 중복을 계산한다
array_key_exists -- 주어진 키와 인덱스가 배열에 존재하는지 확인한다
array_keys -- 배열의 모든 키를 반환한다
array_map --  Applies the callback to the elements of the given arrays
array_merge_recursive -- 두개 이상의 배열을 재귀적으로 병합한다
array_merge -- 두개 이상의 배열을 병합한다
array_multisort -- 여러개의 배열 또는 다차원 배열을 정렬한다
array_pad --  설정된 길이만큼 특정 값으로 배열을 채운다
array_pop -- 배열 끝의 요소를 뽑아낸다
array_push --  배열의 끝에 하나 이상의 원소를 넣는다.
array_rand --  배열안에서 하나 이상의 임의 원소를 뽑아낸다
array_reduce --  콜백 함수를 사용하여 배열을 반복적으로 단일 값으로 축소시킨다
array_reverse --  배열 원소를 역순으로 반환한다
array_search --  배열에서 주어진 값을 검색하고 성공하면 해당 키를 반환한다
array_shift --  배열의 맨 앞에 있는 원소를 옆으로 이동시킨다
array_slice -- 배열의 일부를 추출한다
array_splice --  배열의 일부를 삭제하고, 그 위치에 다른 내용을 대체한다
array_sum --  배열내의 값들의 합을 계산한다
array_udiff_assoc -- Computes the difference of arrays with additional index check. The data is compared by using a callback function.
array_udiff_uassoc -- Computes the difference of arrays with additional index check. The data is compared by using a callback function. The index check is done by a callback function also
array_udiff -- Computes the difference of arrays by using a callback function for data comparison.
array_unique -- 배열에서 중복된 값을 제거한다
array_unshift --  배열의 맨 앞에 하나 이상의 원소를 첨가한다
array_values -- 배열의 모든 값들을 반환한다
array_walk_recursive --  Apply a user function recursively to every member of an array
array_walk --  배열의 개개의 원소에 대해서 특정 함수를 적용하여 수행한다
array --  배열을 생성한다
arsort --  배열을 내림차순 정렬하고 인덱스의 상관관계를 유지한다.
asort -- 배열을 정렬하고 인덱스 상관 관계를 유지한다
compact --  여러 변수들과 값을 갖는 배열을 생성한다
count -- 변수의 원소 갯수를 구한다
current -- 배열의 현재 원소를 반환한다
each --  배열에서 현재의 키와 값 쌍을 반환하고 배열 커서를 전진시킨다
end --  내부 배열 포인터를 마지막 원소를 가리키게 한다
extract --  배열의 현재 심볼 테이블로 변수들을 입력한다
in_array -- 배열에서 값이 존재하는지 점검한다
key -- 연관배열에서 키를 꺼낸다
krsort -- 역순으로 키에 의해 배열을 정렬한다
ksort -- 키에 의해 배열을 정렬한다
list --  배열처럼 변수들을 지정한다
natcasesort --  대소문자를 구별하지 않고 "natural order" 알고리즘을 사용하여 배열을 정렬한다
natsort --  "natural order" 알고리즘을 사용하여 배열을 정렬한다
next --  배열의 내부 배열 포인터를 전진시킨다
pos -- 배열에서 현재 원소를 꺼내온다
prev -- 내부 배열 포인터를 앞으로 돌린다
range --  특정 범위의 원소를 갖는 배열을 생성한다
reset --  배열의 내부 포인터가 배열의 첫번째 원소를 가리키게 한다
rsort -- 역순으로 배열을 정렬한다
shuffle -- 배열을 뒤섞는다
sizeof -- count()의 별칭
sort -- 배열을 정렬한다
uasort --  사용자-정의 비교함수로 배열을 정렬하고 인덱스 연관성을 유지한다
uksort --  사용자-정의된 비교함수를 사용하여 키에 의해 배열을 정렬한다
usort --  사용자-정의된 비교함수를 사용하여 값들에 의해 배열을 정렬한다
2006/09/08 16:00 2006/09/08 16:00
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > Adidas Mania.
원본 http://blog.naver.com/jeiplife/120018148028
1. 일반적인 질문들
    1.1 han.comp.sys.sun 뉴스그룹은 어떤그룹인가요?
    1.2 Solaris에 관련된 FAQ는 어떤게 있나요?

  2. 시스템 관리에 관한 질문들
    2.1 루트파티션의 용량을 작게 잡아서 가득찼습니다.
    2.2 하드디스크 파티션은 어떻게 잡는게 좋나요?
    2.3 swap영역이 모자라는데 어떻게 추가할 수 있나요?
    2.4 inode full이 나옵니다.
    2.5 사용자마다 특정크기만큼만 하드디스크를 할당하는 방법이 있을까요?
    2.6 cachefs가 뭔가요?
    2.7 네트웍으로 root접속이 가능하게 하려면?
    2.8 로긴화면에서 나오는 메시지를 바꾸려면?
    2.9 한번만 접속을 하면 같은 이름으로 로긴을 막고싶습니다.
    2.10 floppy드라이버를 사용하려면 어떻게 해야 하나요?
    2.11 CD-ROM드라이버를 이용하려면 어떻게 하나요?
    2.12 다른 시스템의 CD-ROM드라이버를 이용하려면?
    2.13 Sun용 CD-ROM드라이버가 따로 있나요?
    2.14 새로운 장치를 달고 device file을 만들려면?
    2.15 Tape의 내용을 삭제하려면?
    2.16 Workstation의 화면 해상도와 색상수를 바꾸려면?
    2.17 Solaris 2.x에서 두 개이상의 Network Adapter를 설치하려면?
    2.18 프린터를 병렬포트에 연결하려면?
    2.19 모뎀을 달려면?
    2.20 Postscript파일을 출력하려면?
    2.21 네트웍을 지원하는 프린터를 설치하려면?
    2.22 JAZZ드라이버나 ZIP드라이버를 달려면?
    2.23 백업 하려면?
    2.24 Solaris 2.x에서 /dev/rmt/에 있는 장치파일들의 의미
    2.25 다른 시스템의 테잎 드라이버를 이용하려면?
    2.26 patch가 뭔가요?
    2.27 SunOS 4.x의 passwd파일을 Solaris 2.x시스템에 맞게 고치려면?
    2.28 /etc/passwd와 /usr/bin/passwd의 차이는 뭔가요?
    2.29 NT와 Solaris의 비밀번호를 같이 관리하려면?
    2.30 root 비밀번호를 잊었습니다.
    2.31 /home에 파일을 쓰려면 어떻게 해야 하나요?
    2.32 계정을 만들 때 자동적으로 .cshrc와 .profile등의 파일을 만들려면?
    2.33 /etc/passwd파일에서 삭제를 했는데도 로긴이 가능합니다.
    2.34 passwd를 실행했는데 없는 ID라고 나옵니다.
    2.35 package란 뭔가요?
    2.36 CDE는 뭔가요?
    2.37 CDE로긴(dtlogin)의 설정은 어떻게 하나요?
    2.38 부팅할 때 마다 어떤 일을 수행하려면 어떻게 하나요?
    2.39 부팅시 마운트되는 순서는?
    2.40 다른 시스템의 X Window 프로그램을 수행하고 싶습니다.
    2.41 로컬시스템의 X 프로그램을 실행했는데 display를 열수없다고 합니다.
    2.42 libX11.so.6.1이 없다고 에러가 납니다.
    2.43 최근 login한 사람들에 대한 정보를 알수 없나요?
    2.44 syslogd는 어떤 역활을 하나요?
    2.45 cron이 실행되지 않습니다.
    2.46 Solaris 2.x에서 시스템의 최대값을 알려면?
    2.47 Solaris에서 hostid를 변경하려면?
    2.48 Solaris 2.x는 y2k에 안전한가요?
    2.49 TT_DB/ 디렉토리는 뭔가요?
    2.50 Solaris 2.6에서 2GB이상의 파일을 사용하려면?
    2.51 talk에서 한글을 쓰려면?
    2.52 비밀번호 없는 계정을 만들려면?
    2.53 최대접속가능한 터미널 수를 늘이고 싶습니다.
    2.54 CD Writer를 사용하려면?

  3. 네트웍 관련 질문들
    3.1 허가된 IP에서만 네트웍접속이 가능하게 하려면?
    3.2 Shell을 바꾸었더니 ftp로 로긴이 안됩니다.
    3.3 비밀번호없이 ftp나 telnet으로 접속하는 방법이 있을까요?
    3.4 특정사용자는 ftp로 접속하지 못하게 하고싶습니다.
    3.5 텍스트 파일에서 줄의 끝에 ^M이 붙어있습니다.
    3.6 ftp 사용을 일괄적으로 처리하려면?
    3.7 ftp로 어떤 서버에 접속을 하니 파일이 하나도 보이지 않습니다.
    3.8 anonymous ftp를 설치하고 싶습니다.
    3.9 ftp로 접속해서 만든 파일의 모드는 어떻게 결정되나요?
    3.10 wu-ftpd 2.4에서 last명령으로 ftp접속기록이 나오게 하려면?
    3.11 wu-ftpd에서 접속시 메시지를 출력하려면?
    3.12 telnet으로 접속한 상태에서 잠시 local작업을 하려면?
    3.13 telnet등에서 내용을 암호화해서 전송하려면?
    3.14 telnet으로 하이텔등에서 프로그램을 다운로드 받으려면?
    3.15 웹서버를 설치하려면?
    3.16 웹사이트에 대한 접속통계를 내려면?
    3.17 시스템에 메일이 도착했을때 다른 계정으로 메일을 보내려면
         어떻게 하면 되나요?
    3.18 계정명에 대문자가 들어있는경우 메일을 받으려면?
    3.19 메일을 보내는 사람에게 자동으로 일정한 메시지를 답장으로 주려면?
    3.20 메일계정만 주고, shell계정을 안주는 방법
    3.21 tin에서 뉴스서버지정
    3.22 Windows환경의 자원을 UNIX에서 사용하려면?
    3.23 시스템의 IP Address를 변경하고 싶습니다.
    3.24 하나의 Adapter에 두개의 IP address를 할당하려면?
    3.25 gateway설정은?
    3.26 DNS서비스를 받으려면?
    3.27 공개 NMS를 구하려면?
    3.28 시간 서버를 사용하려면?
    3.29 메일 서비스를 하고 싶습니다.

  4. 개발환경에 관한 질문들
    4.1 컴파일 할 때 /usr/ucb/cc 가 작동하지 않습니다
    4.2 gcc를 설치하려면?
    4.3 /usr/include등에 header파일이 없습니다.
    4.4 gdb와 xxgdb는 어떤 프로그램입니까?
    4.5 SPARCompiler등을 설치했는데 license file이 없다고 합니다.
    4.6 gcc를 사용할경우 xmkmf가 정상적으로 작동하려면?
    4.7 make가 없다고 합니다.

  5. 사용자 환경에 관한 질문들
    5.1 DOS의 doskey와 같은 기능이 있나요?
    5.2 root의 shell은 어떻게 바꾸나요?
    5.3 프롬프트에 현재 디렉토리를 표시하려면?
    5.4 root계정의 환경설정은 어디에서?
    5.5 3벌식 자판을 사용하려면?
    5.6 vi에서 한글이 입력되지 않습니다.
    5.7 CDE의 스타일관리자에서 배경그림을 추가하고 싶습니다.

  6. 기타
    6.1 Netscape를 실행했는데 다음과 같은 Warning이 계속출력됩니다.
    6.2 Netscape의 메뉴등에서 한글이 보이지 않습니다.
    6.3 Netscape를 실행했는데 libresolv.so.2를 찾지못한다고 합니다.
    6.4 MP3파일을 듣고싶습니다.
    6.5 특정사용자가 실행한 프로세스를 한꺼번에 지우려면?
    6.6 파일을 여러개로 쪼개려면?
    6.7 X Window의 화면을 캡춰하려면?
    6.8 Letter용지로 설정된 ps파일을 A4 크기로 프린트하고 싶습니다.
    6.9 파일이 지워지지 않습니다.

  7. 문제점 해결
    7.1 일반 사용자는 socket: Permisson denied라고 나옵니다.
    7.2 login프롬프트가 굉장히 늦게 나옵니다.
    7.3 /etc/path_to_inst파일을 실수로 삭제한 경우 부팅이 안됩니다. 어떡하죠?
    7.4 vi를 실행했는데 Terminal Too Wide라고 나옵니다.
    7.5 Connected command timeout for Target 4.0 이라고 나옵니다.
    7.6 Target 4 reducing sync. transfer rate 라고 나옵니다.

  8. 감사의 글

  ______________________________________________________________________

  1.  일반적인 질문들

  일반적인 질문들에 관한 내용은 Casper Dik.에 의해 작성된 Solaris 2
  FAQ에 잘 설명되어 있습니다. 이 문서를 참고하시기 바랍니다. 여기에서는
  Solaris 2 FAQ에 없는 내용만 올리도록 하겠습니다.

  1.1.  han.comp.sys.sun 뉴스그룹은 어떤그룹인가요?

  han.comp.sys.sun 뉴스그룹의 성격은 그룹헌장에서 잘 설명하고 있습니다.
  아래는 han.comp.sys.sun 뉴스그룹의 그룹헌장입니다.

      이 그룹은 Sun Microsystem에서 만드는 모든 종류의 worksta

      tion과 서버, 그리고 clone 업체의 호환 기종에 대한 정보를
      다룹니다.  하드웨어, 주변 기기의 설치 및 사용, Sun OS 4.x 및
      5.x(aka Solaris 2.x), 등 Sun 기종에 탑재되어 돌아가는 OS,
      OpenWin,CDE 등 GUI, Sun용 소프트웨어의 설치와 사용, SunOS
      하에서의 프로그래밍 및 개발 환경, 시스템 관리에 대한 정보를
      교환합니다.

  1.2.  Solaris에 관련된 FAQ는 어떤게 있나요?

  Casper Dik.에 의해 작성된 Solaris 2 FAQ가 있습니다.  영문판은
  에서 구할 수 있으며 박창민님에 의해
  한글로 번역된글은  에서 구할 수 있습니다.

  Sun Manager 메일링리스트의 FAQ도
  에서 구할 수
  있습니다.

  Sun시스템에 관련된 FAQ는
  에 가시면
  볼 수 있습니다.

  2.  시스템 관리에 관한 질문들

  2.1.  루트파티션의 용량을 작게 잡아서 가득찼습니다.

  여러가지 방법이 있습니다. 가장 확실한 방법은 충분한 여유가 있는
  하드디스크를 붙여서 부트디스크를 복사하는 방법입니다. 하지만 이 방법은
  성공하기가 힘든(?) 단점이 있습니다. 임시방편으로는 몇개의 디렉토리를
  다른 파티션으로 옮기고 링크를 만드는 방법이 있습니다. 이때 많이
  애용(?)되는 파티션으로 /var가 있습니다. /var전체나 /var안에서 디스크를
  많이 차지하는 파티션을 다른곳으로 옮기고 링크를 만들어 주면 됩니다.
  (절대 /sbin이나 /etc같은 디렉토리를 옮기지 마세요. ^_^)

  2.2.  하드디스크 파티션은 어떻게 잡는게 좋나요?

  보통 관리자에 따라 두가지 형태로 파티션을 관리합니다. 한가지 방법은
  swap을 제외한 모든 디스크를 / 파티션에 두는 방법이고, 다른 방법은
  /usr등의 디렉토리를 각각 파티션을 나누어서 사용하는 방법입니다. 이
  두가지 방법 모두 장단점을 가지고 있어서 어느것이 좋다고 할 수는
  없습니다. 관리자가 편한 방법으로 선택하시면 됩니다.

  파티션을 여러개로 나눌 경우 개인적 취향(?), 사용하는 응용프로그램에
  따라 다릅니다. 아래는 안진수님이 뉴스그룹에 올려주신
  내용입니다.(참고하세요.)
  /       64MB
  /usr    400MB 이상 (최경렬님은 최소 600MB이고, 보통 1GB이상을 잡는게 좋다고
                     메일을 보내주셨습니다.)
  /var    128MB 이상 (Recommended Patches를 설치하려면 적어도 100MB가
                     필요합니다.)
  swap    물리적 메모리의 2배에서 4배
  /opt    400MB 이상
  /usr/local      분리권장

  저도 위와 비슷하게 파티션을 나누고 대부분의 프로그램은 /usr/local이나
  /opt에 설치합니다.

  2.3.  swap영역이 모자라는데 어떻게 추가할 수 있나요?

  Solaris 2.x에서는 초기에는 따로 파티션을 잡아서 swap영역을 사용하지만
  나중에 추가할 경우 swap파일을 만들어서 추가합니다. 이때 사용하는
  명령어가 mkfile 입니다. 만일 /opt/swap이라는 200MB짜리의 파일을
  만들어서 swap영역으로 쓰고 싶다면 아래와 같이 파일을 만들고
  swap명령어로 추가할 수 있습니다.

  % mkfile 200m /opt/swap
  % swap -a /opt/swap

  만일 항상 사용할 swap영역이라면 /etc/vfstab에 추가하면 됩니다. 다음은
  /opt/swap을 추가한 /etc/vfstab의 예제입니다.

  % cat /etc/vfstab
  .
  .
  swap    -       /tmp    tmpfs   -       yes     -
  /opt/swap       -       -       swap    -       no      -
  %

  2.4.  inode full이 나옵니다.

  파일시스템에서 사용하고 있는 inode를 모두 사용했기 때문입니다. 이렇게
  되면 더 이상의 파일을 생성할 수 없습니다. 파일들을 백업한 후(문제가
  되는 파일 시스템만 백업하면 됩니다.) newfs의 -i옵션을 사용하여 inode의
  갯수를 늘이고 백업한 파일들을 복구해야 합니다.

  2.5.  사용자마다 특정크기만큼만 하드디스크를 할당하는 방법이 있을까요?

  Solaris 2.x라면 quota를 설정하시면 됩니다. quota를 설정하는 방법은
  Solaris메뉴얼중 System Admin Guide Vol2에 보시면 잘 나와있습니다.How
  to enable user storage space quotas for Solaris in a mounted file
  system 간략하게
  설명드리면 아래와 같습니다.

  /etc/vfstab에서 quota를 설정하고자 하는 파일시스템의 마운팅 옵션에
  rq를 지정한다.

  $ cat /etc/vfstab
  ..
  /dev/dsk/c0t2d0s6 /dev/rdsk/c0t2d0s6 /home ufs 1 yes rq
  ..

  quota를 설정할 파일시스템에 quotas라는 파일을 만든다.

  $ touch quotas
  $ chmod 600 quotas

  각 사용자에게 quota를 할당하기 위하여 edquota라는 명령을 사용한다.

  $ edquota louis
  fs /home blocks (soft = 0, hard = 0) inodes (soft = 0, hard = 0)

  여기에서 할당하고자 하는 양만큼 soft와 hard부분에 적어준다. 만일
  20MB를 할당하려면 아래와 같이 해준다. (만일 quota를 제거하고자 한다면
  0을 적어주면 된다.)

  fs /home blocks (soft = 20000, hard = 20000) inodes (soft = 0, hard = 0)

  만일 다수의 사용자에게 같은 양의 quota를 할당하려면 하나의 사용자만
  할당하고 복사할 수 있는데 아래는 louis 사용자의 quota설정을 aaa, bbb,
  ccc 사용자에게도 똑같이 할당하는 예제이다.

  $ edquota -p louis aaa bbb ccc

  2.6.  cachefs가 뭔가요?

  를 읽어보세요. 설명과
  기본적인 설치법이 적혀 있습니다.

  2.7.  네트웍으로 root접속이 가능하게 하려면?

  기본적으로 Solaris 2.x에서는 네트웍으로 접속하고 root로 로긴하면
  아래와 같은 메세지를 출력하고 접속이 안됩니다.

  login: root
  Password:
  Not on system console
  Connection closed by foreign host.

  Solaris 2.x는 기본적으로 root사용자는 console에서만 로긴이 가능합니다.
  (su는 제외) 이것을 console이외에서도 가능하게 하려면
  /etc/default/login에서 CONSOLE=/dev/console에 주석을 달면 됩니다.

  참고로 CONSOLE=/dev/console의 의미는 root는 /dev/console에서만 login이
  가능하다는 의미입니다. 만일 root사용자로 로긴이 불가능하게 하려면
  CONSOLE= 와 같이 해 두면 됩니다. (하지만 이 설정은 기본적으로 설치된
  in.telnetd등에만 해당됩니다. 만일 ssh등을 사용한다면 이 파일과
  상관없이 root계정으로 로긴이 가능합니다.)

  2.8.  로긴화면에서 나오는 메시지를 바꾸려면?

  telnet으로 접속시 UNIX(r) System V Release 4.0 (white) 같은 메세지를
  바꾸고 싶다면 Solaris 2.6의 경우 /etc/default/telnetd에서 BANNER
  항목을 수정하면 되지만, 그 이외의 시스템에서는 특별한 방법이 없습니다.
  몇분들의 말을 따르자면 binary파일(in.telnetd)을 수정하면 가능하다고
  하더군요 :)

  콘솔에서의 white console login: 메시지는 /etc/inittab에서 수정할 수
  있습니다. 기본적으로 "`uname -n` console login: "으로 되어있습니다.

  로긴화면에 여러줄의 내용을 출력하려면 /etc/issue에 적어주면 됩니다.
  그리고 로긴후 여러줄의 내용을 출력하려면 /etc/motd에 적어주면 됩니다.

  로긴후 나오는 메시지들(motd내용, 최근접속일등)을 나오지 않게 하려면
  $HOME/.hushlogin 을 만들면 나오지 않습니다. (touch $HOME/.hushlogin)

  2.9.  한번만 접속을 하면 같은 이름으로 로긴을 막고싶습니다.

  기본적으로 지원해 주는건 아니지만 /etc/profile이나 /etc/.login에서
  간단한 script를 써서 구현할 수는 있습니다. 또한 Michael P. Crider가
  만든 idled를 사용하셔도 됩니다. idled는
  에서 구할 수 있습니다.

  2.10.  floppy드라이버를 사용하려면 어떻게 해야 하나요?

  Solaris 2.x에서는 vold(Volume Management Daemon)을 이용해서 floppy나
  CD-ROM을 마운트합니다. 따라서 floppy를 사용할때는 드라이버에 디스켓을
  넣고, volcheck명령어를 실행하면 마운트가 됩니다. 보통
  /floppy/floppy0에 마운트가 됩니다. 그리고 디스켓은 MS-DOS 포맷으로
  되어있어도 문제가 없이 마운트됩니다. 그리고 다 쓰고 났을때는 eject
  floppy를 입력하면 floppy가 빠져나오며 자동으로 마운트가 풀립니다.

  2.11.  CD-ROM드라이버를 이용하려면 어떻게 하나요?

  Solaris 2.x에서는 floppy와 마찬가지로 vold를 이용해서 마운트합니다.
  현재 vold가 수행중일때는 CD-ROM의 경우에는 CD를 삽입하기만 하면
  자동으로 /cdrom에 마운트가 되고, CD를 빼고 싶을때는 CD-ROM드라이버에
  있는 버튼을 누르거나, eject cdrom이라는 명령어를 입력하면 됩니다.
  (가끔 CD-ROM 드라이버의 버튼을 눌렀을 때 CD가 빠져나오지 않는경우가
  있습니다. 이때는 eject cdrom 이라고 입력하면 잘 빠져나옵니다.) 참고로
  vold의 설정파일 은 /etc/vold.conf이며, 자세한 사항은 vold(1M)의
  메뉴얼을 참조하시기 바랍니다.

  2.12.  다른 시스템의 CD-ROM드라이버를 이용하려면?

  만일 두대의 컴퓨터 A, B가 있는데, A에는 CD-ROM 드라이버가 있고, B에는
  없어서 B에서 A의 CD-ROM 드라이버를 이용하고 싶다면, A에서는
  /etc/rmmount.conf 의 마지막에 아래와 같이 추가하고 vold 데몬을 다시
  실행한 후

  share cdrom*  -o ro=B

  B에서는 /cdrom에 사용하고 싶다면

  % ln -s /net/A/cdrom /cdrom

  와 같이 연결해 두시면 됩니다.

  참고로 Solaris에서는 CD-ROM이나 floppy등은 vold(1M)가 관리합니다. 만일
  어떤 사용자가 CD를 넣으면 vold는 그 일을 감지하고 rmmount(1M)를
  호출해서 다시 마운트해줍니다. rmmount(1M)는 CD나, floppy와 같은
  장치들을 마운트할 때 사용하는데, 그 설정파일은
  /etc/rmmount.conf입니다. 자세한 내용은 rmmount.conf와 rmmount의
  메뉴얼을 참조하세요.

  2.13.  Sun용 CD-ROM드라이버가 따로 있나요?

  따로 있지는 않습니다. Sun에서는 SCSI CD-ROM드라이버중 버퍼가
  512K바이트인 것만 지원합니다. 잘 돌아가는 모델에는 소니의 경우
  CDU-8012모델(Sun 1배속 CD-ROM드라이버), 도시바의 4101TA모델(Sun 2배속
  CD-ROM드라이버), 3301B모델, 3401B모델, 애플의 CD 300i가 있으며,
  플랙스터의 CD-ROM드라이버의 경우 대부분 잘 돌아갑니다. 만일 구입을
  하신다면 플랙스터의 모델을 구입하시는것이 좋습니다.(최경렬님,
  이석찬님)

  2.14.  새로운 장치를 달고 device file을 만들려면?

  일단 다른 주변장치와 충돌하지 않는 SCSI번호(CD-ROM드라이버는
  일반적으로 6번을 사용하고, Tape드라이버는 일반적으로 4번을
  사용합니다.)를 할당하고, PROM prompt에서 probe-scsi명령으로 정상적으로
  인식이 되는지 확인합니다. 여기에서 잘 나오면 boot -r명령으로 /dev와
  /devices의 파일들을 갱신하면 됩니다.

  ok probe-scsi
  ok boot -r

  보통 외장형 Tape드라이버를 달고 이 작업을 수행하는데 이때 생기는
  장치파일은 Solaris 2.x의 경우 /dev/rmt/0 (SCSI 4번을 쓴경우),
  /dev/rmt/1 (SCSI 5번을 쓴 경우)이며, SunOS 4.x의 경우에는 /dev/rst0,
  /dev/rst1이 생깁니다.

  2.15.  Tape의 내용을 삭제하려면?

  Tape의 내용을 삭제하려면 mt명령을 사용하시면 됩니다. 만일
  Tape드라이버의 장치파일이름이 /dev/rmt/0 라면 아래와 같이 입력하시면
  됩니다.

  $ mt -t /dev/rmt/0 erase

  2.16.  Workstation의 화면 해상도와 색상수를 바꾸려면?

  Sun Workstations의 경우 화면해상도와 색상수등을 변형하려면 사용하는
  Video Card가 framebuffer를 지원해야 합니다. 보통 Creator 3D에서는
  사용가능합니다. 만일 콘솔의 해상도를 1280x1024로 변경하려면 PROM
  prompt에서 다음과 같이 입력하면 됩니다.

  ok setenv output-device screen:r1280x1024x64
  ok reset

  이렇게 PROM prompt뿐만 아니라 ffbconfig 프로그램을 이용할 수 있습니다.

  만일 Solaris x86에서 화면 해상도를 바꾸려면, kdmconfig 명령을 이용해서
  화면해상도를 변경할 수 있습니다. Solaris x86에서 화면해상도를 변경하기
  전에 현재 사용하고 있는 Graphic Adapter가 Solaris x86에서 지원하는지를
  확인한 후 실행하시기 바랍니다. (신제철님)
  색상수를 16bit색상으로 바꾸려 할때, openwin을 사용하신다면, openwin
  -dev [framebuffer 장치파일명] defdepth 16 과 같이 하시고, CDE를
  사용하시면 /usr/dt/config/Xconfig 파일에 Xsun -dev [framebuffer
  장치파일명] defdepth 16 과 같이 설정하시면 됩니다. 제가 사용하는
  Creator 3D의 경우엔 framebuffer 장치파일명이 /dev/ffb0 입니다. (당연히
  framebuffer가 원하는 색상수를 지원해야 합니다.)

  2.17.  Solaris 2.x에서 두 개이상의 Network Adapter를 설치하려면?

  Network Adapter를 달고, /etc/hostname.hme?,/etc/hostname.le? (100M
  Network Adapter이면 hme0, hme1, .. 10M Network Adapter이면 le0, le1,
  ..)에 각 Adapter의 호스트이름을 작성하고, /etc/hosts에 IP Address를
  설정하면 사용할 수 있습니다.

  2.18.  프린터를 병렬포트에 연결하려면?

  Sun Workstation의 병렬포트는 시스템의 종류에 따라 다릅니다. 일단
  병렬포트가 있는지 확인하시고 (그림에 // 와 같이 그려진 부분이
  병렬포트입니다.) 형태에 맞는 병렬케이블을 구입해서 사용하시면 됩니다.

  2.19.  모뎀을 달려면?

  을 참고하세요.

  2.20.  Postscript파일을 출력하려면?

  postscript을 지원하지 않는 대부분의 프린터에서 postscript파일을
  출력하려면 gs(ghost script)를 사용하면 됩니다. 그리고 postscript를
  지원하는 프린터일 경우에도 한글파일들을 출력하려면 gs를 사용하시는게
  좋습니다.

  gs를 필터로 사용하는 방법은
  를 참고하시기
  바랍니다.

  그리고 잉크젯 프린터를 이용하여 Color로 출력하려면 해당 프린터의 gs
  dev파일을 구하셔서 gs를 재 컴파일 하면 됩니다. stylus color프린터는
  dev파일이 기본적으로 들어있으므로 컴파일이 Makefile의 DEVICE_DEVS에
  stcolor.dev를 추가하면 됩니다. HP의 잉크젯은
  에서 dev파일을 구할 수
  있습니다.

  2.21.  네트웍을 지원하는 프린터를 설치하려면?

  HP의 제품인 경우 HP의 홈페이지에서 JetAdmin을 받아 패키지를 설치한 후
  (/usr/hpnp에 설치한 경우) /usr/hpnp/jetadmin으로 프린터를 추가하면
  됩니다. 물론 IP와 Netmask등은 설정해 두셔야 합니다. (서진수님
  이 정리해 주셨습니다.)

  2.22.  JAZZ드라이버나 ZIP드라이버를 달려면?

  JAZZ드라이버나 Zip드라이버는 SCSI를 사용하는경우 일반 디스크처럼
  사용하실 수 있습니다. 단지 주의하셔야 할 내용은 미디어를 뽑기전에
  umount를 하셔야 합니다.

  2.23.  백업 하려면?

  여러 가지 명령어가 있지만, 가장 기본적인 tar에 대해 말씀드리겠습니다.
  만일 /home 디렉토리 이하의 파일들을 /dev/rmt/0에 백업받으려 한다면
  다음과 같이 입력하시면 됩니다.

  % tar cvf /dev/rmt/0 /home

  나중에 백업한 내용을 restore하시려면 /에서 다음과 같이 입력하면
  됩니다.

  % tar xvf /dev/rmt/0

  tar를 사용하는경우 원하는 파일만을 restore하려면 아래와 같이
  사용하시면 됩니다. (man tar에서 가져옴)

  % tar xvf /dev/rmt/0 `tar tf /dev/rmt/0 | grep 'pattern'`

  이 외에도 restore하고자 하는 파일의 리스트를 파일로 만들고(e.g list),
  다음과 같이 사용하셔도 됩니다.

  % tar xvf /dev/rmt/0 -I list

  2.24.  Solaris 2.x에서 /dev/rmt/에 있는 장치파일들의 의미

  Solaris 2.x에서 Tape드라이버를 달고 device파일들을 만들고 나면
  /dev/rmt/디렉토리에 많은 파일들이 생깁니다. 이 파일들은 그 이름에 따라
  Tape을 사용하는 방법이 다른데 간단하게 알아보면 일반적으로 파일명은
  아래와 같이 생겼습니다.

  #[lmhc][b][n] (#는 숫자)

  l,m,h,c는 기록밀도입니다. 각각 low, medium, high, compress를
  의미합니다. 단순히 장치파일만 생겼다고 모두 지원하는건 아닙니다. com

  press를 지원하는 드라이버가 있고, 아닌 드라이버가 있습니다. 그리고 b는
  BSD호환의 의미이며, n은 no-rewind의 의미입니다. 따라서 n이 없는
  장치파일을 이용해서 백업을 하면 백업이 끝난 후 rewind를 하지만, n이
  붙은 장치파일을 이용하여 백업을 하면 rewind를 하지 않습니다. 따라서
  하나의 장치에 여러개의 볼륨을 백업하려면 n이 붙은 장치명을 사용해야
  합니다.

  2.25.  다른 시스템의 테잎 드라이버를 이용하려면?

  여러가지 방법이 있겠지만, 가장 간단한 방법은 rsh를 이용하는
  방법입니다. 먼저 테입드라이버가 있는 시스템에 .rhosts파일을 만들어서
  다른 시스템에서 rsh로 접속할 수 있게 한후 테입드라이버가 없는
  시스템에서 다음과 같이 입력하시면 백업할 수 있습니다.

  % tar cvf - [파일들] | rsh [테입드라이버가 있는 시스템] dd of=/dev/rmt/0

  만일 테입으로 부터 파일을 풀려고 하면 아래와 같이 입력하시면 됩니다.

  % rsh [테입드라이버가 있는 시스템] dd if=/dev/rmt/0 | tar xvf -

  2.26.  patch가 뭔가요?

  Sun Microsystems에서 처음 Solaris등의 프로그램을 배포한 후 그 이후에
  발견되는 버그들에 대해 수정한 파일을 patch파일이라고 합니다. 만일
  105393번을 patch하라고 한 경우 105393이 patch번호입니다. 위와 같은
  경우 105393번 patch파일을 구해와서 patch해주면 됩니다.

  patch중에는 일반 patch파일과 recommended patch가 있는데, recommended
  patch는 이름에서 알 수 있는 것 처럼 추천하는 patch입니다. 운영체제나
  프로그램의 보안상의 버그등 중요한 내용이므로 반드시 patch해주는 것이
  좋습니다.

  Sun Microsystems에서 patch파일을 배포하는 장소는
  이고, 국내에서도 여러곳에서
  미러링을 하고 있습니다. 대표적인 곳으로
 
  가 있습니다.
  가까운 곳에서 patch파일을 가져오시면 됩니다.

  patch파일을 설치하는 방법은 patch파일의 README에 잘 설명이
  되어있습니다. 일반 patch파일의 경우 압축을 풀고 디렉토리에 있는
  installpatch를 root권한으로 실행하면 됩니다.

  현재 시스템이 patch한 patch파일의 번호를 알기위해서는 showrev -p
  명령을사용합니다. 다음은 그 예제입니다.

  % showrev -p
  Patch: 105393-01 Obsoletes:  Requires:  Incompatibles:  Packages: SUNWcsu
  Patch: 105518-01 Obsoletes:  Requires:  Incompatibles:  Packages: SUNWcsu
  Patch: 105615-03 Obsoletes:  Requires:  Incompatibles:  Packages: SUNWcsu
  .
  .
  .
  Patch: 106125-02 Obsoletes:  Requires:  Incompatibles:  Packages: SUNWswmt
  Patch: 105407-01 Obsoletes:  Requires:  Incompatibles:  Packages: SUNWvolu
  %

  가끔 patch를 설치하려고 하는데, checkinstall이 실패했다고 나오는
  경우가 있습니다. Solaris 2.x에서 patch파일들은 nobody란 사용자가 읽을
  수 있어야만 설치가 됩니다. patch파일을 푼 디렉토리의 모드를 확인하시고
  nobody사용자가 읽을 수 없는 모드라면 다시 설정하시기 바랍니다.

  Solaris 2.x에서 patch에 관한 내용은  에서 박창민님이 잘 정리해
  두셨습니다. 한번쯤 읽어보기를 권합니다.

  2.27.  SunOS 4.x의 passwd파일을 Solaris 2.x시스템에 맞게 고치려면?

  SunOS 4.x까지는 계정관리를 위해 /etc/passwd파일을 사용했지만, Solaris
  2.x부터는 /etc/passwd와 /etc/shadow파일을 함께 사용합니다. 따라서
  SunOS 4.x에서 Solaris 2.x로 업그레이드를 했을때 계정을 관리하는
  /etc/passwd를 /etc/passwd와 /etc/shadow파일로 바꾸어야 하는데 이때
  사용하는 명령이 pwconv입니다. 단순히 pwconv라고 실행하면 바꿔줍니다.

  Solaris 2.x를 사용하시는 분들중에 가끔 /etc/passwd파일에만 계정을
  추가하고 pwconv 명령어를 사용하여 /etc/shadow파일을 갱신하는 분들도
  계십니다.

  2.28.  /etc/passwd와 /usr/bin/passwd의 차이는 뭔가요?

  /etc/passwd는 사용자의 정보(ID, UID, 홈디렉토리, shell, 주석등)의
  정보가 들어있는 파일이고, /usr/bin/passwd는 /etc/shadow파일에 있는
  사용자의 비밀번호를 변경할 때 사용하는 명령입니다.

  /usr/bin/passwd는 SUID가 설정되어 있습니다. 왜냐하면 /usr/bin/passwd가
  수정하는 /etc/shadow파일은 root만이 읽기/쓰기가 가능합니다. 따라서
  일반 사용자가 자신의 비밀번호를 수정할 때 suid가 설정되어 있지 않다면
  비밀번호의 변경이 불가능하겠죠? 다음은 제 시스템의 /usr/bin/passwd의
  ls결과입니다.

  $ ls -l /usr/bin/passwd
  -r-sr-sr-x   3 root     sys        96796 1997년  7월 16일 /usr/bin/passwd

  일반적으로 /etc/passwd의 모드는 444로 되어있는데, 가끔 관리자중에는
  일반사용자가 /etc/passwd파일을 읽지 못하도록 모드를 400로 변경하는
  경우가 있습니다. 이경우 비밀번호의 변경등은 별 문제없이 가능하겠지만,
  ls의 경우 사용자이름이 아닌 UID로 출력하게 됩니다. 왜냐구요? UID를
  사용자이름으로 바꾸지 못하니까요. :)

  다른 시스템에서는 그렇지 않지만 Solaris 2.x에서는 특이하게도
  /etc/passwd, /etc/group, /etc/hosts 의 내용들을 가지고
  응용프로그램들에게 이름서비스를 해 주는 nscd라는 서버 프로그램이
  있습니다. 이 프로그램때문에 /etc/passwd의 모드를 400로 해 두어도 UID가
  아닌 사용자 이름이 나옵니다. 만일 nscd를 띄우지 않고 /etc/passwd등의
  파일의 모드를 400로 한경우에는 UID만 나오게 됩니다.

  2.29.  NT와 Solaris의 비밀번호를 같이 관리하려면?

  (이 부분은 제가 잘 몰라서 뉴스그룹에 올라온 몇가지 글들을 종합해
  봅니다.) 우선 Solaris 2.6을 써야합니다. 그리고 Samba를 사용할 때 pam
  nt_dom이라는 모듈을 사용하시면 Solaris에서 NT의 비밀번호를 변경할 수
  있습니다. 그리고 반대로 NT에서 Solaris의 비밀번호등을 관리하려면
  Solstice Intranet Extension(Sun의 홈페이지를 보면 Solstice NFS Client
  3.1라고 되어있습니다.) 프로그램을 NT에 설치하면 됩니다. 이 프로그램을
  사용하면 Solaris가 NIS/NIS+를 사용하셔도 변경할 수 있습니다.

  2.30.  root 비밀번호를 잊었습니다.

  CD-ROM으로 부팅하셔서 하드디스크의 /etc/shadow 파일의 비밀번호부분을
  지우시면 됩니다. / 파티션이 /dev/dsk/c0t0d0s0인경우에 아래와 같은
  작업을 하시면 됩니다.

  ok boot cdrom -s
  ..
  # mount /dev/dsk/c0t0d0s0 /mnt
  # TERM=sun;export TERM
  # vi /mnt/etc/shadow
  # sync; reboot

  2.31.  /home에 파일을 쓰려면 어떻게 해야 하나요?

  Solaris 2.x에서는 /home을 automounter가 mount해서 사용하기 때문에
  root라 할지라도 디렉토리나 파일을 만들 수 없습니다. 하지만 실재로는
  automounter를 쓰지 않는 경우에도 /home을 쓸 수 없다면 문제가 되겠죠?
  이때 /home은 automount를 하지 않으려면 /etc/auto_master파일에서
  /home부분을 주석처리 하면 됩니다.

  2.32.  계정을 만들 때 자동적으로 .cshrc와 .profile등의 파일을
  만들려면?

  /etc/skel 디렉토리에 복사하고 싶은 파일들을 만들어 두고 useradd나
  admintool로 계정을 만들면 됩니다.

  2.33.  /etc/passwd파일에서 삭제를 했는데도 로긴이 가능합니다.

  만일 NIS를 사용하시면 NIS에서 계정을 삭제하고, NIS map을 rebuild해줘야
  합니다.자세한 내용은 NIS의 메뉴얼을 참조하세요.

  2.34.  passwd를 실행했는데 없는 ID라고 나옵니다.

  /etc/shadow나 /etc/passwd의 정보가 잘못되었을때, 비밀번호를 변경하기
  위해 passwd를 실행하면 아래와 같은 메세지가 나옵니다.

  % passwd
  passwd:  Changing password for id
  passwd(SYSTEM): id does not exist
  권한이 거부됨
  %

  따라서 이 두개의 파일을 찬찬히 살펴보신 후 필요없는 라인이 추가되지
  않았는지 아니면 계정에 들어갈 수 없는 글자가 있지는 않은지 확인해
  보시기 바랍니다.

  2.35.  package란 뭔가요?

  package는 원래 SVR4에서 프로그램의 설치와 삭제등을 쉽게하기 위해서
  필요한 파일을 묶어둔 것을 말합니다. 하지만 주로 Solaris에서 프로그램의
  배포에 사용되는 형식을 지칭합니다.

  package를 구할 수 있는 가장 대표적인 곳으로
  와 
  있습니다. 전자에서는 몇가지 대표적인(gcc등) 패키지와 sunfreeware에서
  배포하는 패키지를 미러링하고 있습니다. 국내에서는 대표적으로
 
  에서 미러링을 하고
  있습니다. 이 곳에는 sparc와 i86pc 디렉토리가 있는데, 각각 sun의
  sparc용 solaris와 solaris for x86용 package들이 있습니다. 그리고
  freeware 디렉토리에는 후자에서 배포되는 package들이 있습니다.

  package를 설치할 때는 pkgadd라는 명령을 사용하면 됩니다. 사용방법은
  pkgadd -d [디렉토리명] [pkg명]입니다. 일반적으로 자주 설치하는
  패키지인
 
의경우
  다음과 같이 입력하면 설치됩니다.

  % gzip -d GNUgcc.2.8.1.SPARC.Solaris.2.6.pkg.tgz
  % tar -xf GNUgcc.2.8.1.SPARC.Solaris.2.6.pkg.tar
  % pkgadd -d .

  가져온 패키지들을 gzip와 tar로 풀면 각각 디렉토리가 만들어지고, 필요한
  파일들이 그 디렉토리에 들어갑니다. 그리고 pkgadd명령을 실행하면
  설치가능한 패키지들이 나열됩니다.(만일 디렉토리는 분명히 있지만 화면에
  나열되지 않는다면 패키지의 디렉토리의 소유권이 적당한지 확인해 보시기
  바랍니다.) 사용자가 원하는 번호를 입력하면 설치를 시작합니다.일반적인
  패키지의 설치과정이 위와 같지만, 가끔 뉴스그룹으로 질문을 하시는
  분들중에  에서 받아온 패키지의 경우에는
  디렉토리가 만들어 지지 않고 pkgadd -d . 를 해도 화면에 나오지
  않기때문에 질문하시는 분이 많습니다. 이때는 pkgadd -d [파일명] 을
  입력하시면 됩니다. 간단하게 예를들어 보죠.

  % gzip -d bison-1.24.gz
  % pkgadd -d bison-1.24

  위와 같이 간단하게 입력하면 설치하실 수 있습니다.

  참고로  에서 가져온 패키지들은 특별한 언급이
  없는한 /opt에 설치됩니다. 그에비해 sunsite에서 가져온 패키지들은
  일반적으로 /usr/local에 설치됩니다.

  2.36.  CDE는 뭔가요?

  CDE(Common Desktop Environment) (아직 추가하지 못했습니다.
  죄송합니다.)

  CDE는 Solaris 2.6이라면 OS에 포함되어 있고, 그 이하 버전이면 OS와 같이
  들어있는 CD-ROM에서 구할 수 있습니다. 만일 CD-ROM에 없거나, CD가
  없을경우에는  에서 받을 수 있습니다.
  이 디렉토리에 가시면 파일이 여러가지가 있습니다. 파일이름중에 dev가
  들어간 것은 developer를 의미하며 ab가 들어간 것은 answerbook이
  포함되어있다는 의미입니다.

  2.37.  CDE로긴(dtlogin)의 설정은 어떻게 하나요?

  다음과 같은 문제를 생각해 보죠.

      처음 CDE를 설치할 때 영문으로 설치를 했습니다. 나중에
      한글환경을 쓰려고 CDE에서 ko로 설정을 했는데 한번뿐이고 다시
      로그아웃을 하면 영문으로 돌아갑니다. CDE의 기본언어를
      설정하려면 어떻게 하면 되나요?

  이경우 여러가지 방법이 있지만 다음의 방법을 이용해 보세요. 우선
  /etc/dt/config디렉토리를 만듭니다. (만일 디렉토리가 있다면 만들지
  마세요.) 그다음 /usr/dt/config/Xconfig를 만든 디렉토리로 복사합니다.
  (/usr/dt/config/Xconfig는 수정하시면 안됩니다.) 그리고 /etc/dt/con

  fig/Xconfig중에서 Dtlogin*language의 값을 ko로 바꾸시고 저장할 후에
  dtconfig -reset을 실행하면 됩니다.

  또한 CDE를 설치하면 기본적으로 dtlogin이 뜹니다. 이 화면대신에 원래
  로긴화면을 사용하려면 dtconfig -d 와 같이 입력하시면 됩니다. 만일
  CDE로긴화면이 뜨게 하려면 dtconfig -e 와 같이 입력하시면 됩니다.

  2.38.  부팅할 때 마다 어떤 일을 수행하려면 어떻게 하나요?

  Solaris에는 시작 스크립트가 /etc/init.d 에 모여있습니다. 이 스크립트는
  대부분 구성이 아래와 같이 되어있습니다.

  #!/bin/sh
  ...
  case "$1" in
  "start")
  # daemon 띄우는 명령어
  ;;
  "stop")
  # daemon 죽이는 명령어
  ;;
  *)
  # 사용설명
  ;;
  esac

  이와 같이 작성해 두시면 실행할때는 start인자를, 실행중인 프로세스를
  죽일때는 stop인자를 사용하실 수 있습니다.

  또한 Solaris는 /etc/rcX.d(X는 S, 0, 1, 2, 3)에서 필요한 스크립트를
  수행합니다. 만일 Single User모드로 부팅했다면 /etc/rcS.d에 있는
  파일들을, 보통때는 모두다 수행합니다. 따라서 이들중 한 디렉토리에
  SXXfilename(XX는 원하는 두자리 숫자, filename은 임의의 이름)이라는
  파일을 /etc/init.d에 만들어 둔 스크립트에 하드링크를 해 두면 됩니다.
  rc 프로세스는 숫자가 작은 스크립트부터 차례로 수행해 줍니다.

  그리고 SunOS 4.1.x에서는 /etc/rc.* 파일에 적어넣어면 됩니다.
  일반적으로 rc.local에 적는 경우가 많습니다.

  그리고 그냥 스크립트를 작성하면 root권한으로 수행됩니다. 하지만 몇몇
  프로그램의 경우에는 root가 아닌 일반 유저의 권한으로 수행되어야 하는
  경우가 있는데 이때는 su명령을 사용하시면 됩니다. 만일
  /some/where/daemon을 nobody권한으로 수행하고 싶다면 시작 스크립트에
  아래와 같이 적어주면 됩니다. (서진수님
  이 정리해 주셨습니다.)

  su nobody -c '/some/where/daemon'

  2.39.  부팅시 마운트되는 순서는?

  가장 먼저 /와 /usr는 읽기전용으로 마운트합니다. 이때 문제가 있다면
  커널이 이 두개의 파티션에 대해 fsck를 수행합니다. 그리고 문제가 없다면
  두번째로 swap을 마운트합니다. 세번째로 /와 /usr를 쓰기가 가능하도록
  다시 마운트합니다. 그 이후에 /usr/platform, /proc, /dev/fd등을
  차례대로 마운트합니다.

  /etc/vfstab을 보면 / /usr /var 파일시스템은 mount at boot항목이 no로
  되어있습니다. 따라서 이 파티션이 언제 마운트되는지 궁금해 하시는
  분들이 많은데,  / /usr /var는 부팅과정에 필요한 파티션이기 때문에
  커널이 미리 마운트합니다. 그래서 /etc/vfstab에서는 no로 설정이 되어
  있는것입니다.

  2.40.  다른 시스템의 X Window 프로그램을 수행하고 싶습니다.

  디스플레이를 사용하는 시스템에서 xhost로 프로그램이 있는 시스템을
  적어주고, 프로그램이 있는 시스템의 DISPLAY환경변수를 수정하면 됩니다.
  만일 A가 현재 사용하는 컴퓨터(X Server)이고 B가 응용프로그램이 있는
  컴퓨터라면 아래와 같이 입력하면 됩니다. (csh를 사용한다고 가정)

  [A]% xhost + B
  [A]% telnet B
  [B]% setenv DISPLAY A:0.0
  [B]% 응용프로그램

  2.41.  로컬시스템의 X 프로그램을 실행했는데 display를 열수없다고
  합니다.

  같은 시스템이더라도 telnet이나 su로 한번 거쳐서 접속한 경우에는 아래와
  같은 에러가 발생합니다.

  Error: Can't open display: unix:0

  이때는 su나 telnet전에 xhost + localhost등을 입력해 주고, su나
  telnet후 DISPLAY환경변수를 localhost:0.0으로 설정하시면 됩니다.

  2.42.  libX11.so.6.1이 없다고 에러가 납니다.

  Solaris 2.6이라면 openwindow가 X11R6를 지원합니다. 따라서
  /usr/openwin/lib/libX11.so.4 를 가리키는 libX11.so.6.1을 만들면
  됩니다.

  Solaris 2.5.1 이하라면 시스템의 버젼에 맞는 X11R6 패키지를 설치하시면
  됩니다.

  혹 LD_LIBRARY_PATH가 적절히 설정되지 않은경우도 있습니다. 이
  환경변수도 확인해 보시기 바랍니다. 참고로 LD_LIBRARY_PATH는
  동적라이브러리(libX11.so.6등의 라이브러리)가 있는 디렉토리들을
  지정하고 있습니다. 만일 /usr/local/X11R6/lib를 추가하고 싶다면 아래와
  같이 입력하면 됩니다.(csh이라고 가정)

  setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/X11R6/lib

  2.43.  최근 login한 사람들에 대한 정보를 알수 없나요?

  사용자들이 login하면 그 정보가 /var/adm/utmp에 저장됩니다. 이 파일에
  저장된 내용을 출력해주는 프로그램이 /usr/bin/last입니다. 그리고
  참고적으로 /var/adm에는 utmp, utmpx, wtmp, wtmpx가 있는데 utmp, wtmp는
  같은 파일이고 utmpx, wtmpx는 utmp의 확장파일입니다. 만일 어떤 사용자의
  최근 접속상황을 보려면 last id라고 하시면 됩니다.

  utmp, wtmp, lastlog등은 사용자가 시스템에 접속했을 때 로그가 기록되는
  파일로 /usr/bin/login프로그램에 의해 만들어집니다. 만일 만들고 싶지
  않다면 login프로그램을 수정(?)하시든지, 아니면 주기적으로 지워주는
  방법밖에 없습니다. 주기적으로 지워줄때는 cron등을 이용하시면
  편리합니다. 그리고 아예 만들지 않으려면 wtmpx등의 파일을 /dev/null의
  링크파일로 만드는 방법이 있습니다.

  2.44.  syslogd는 어떤 역활을 하나요?

  언제, 어디서, 누가, 어떤 서비스를 통해서 시스템에 접속을 시도했는지를
  기록해주는 서버입니다. 대표적으로 telnet, ftp, mail등에 대한 로그를
  만들어줍니다. 그리고 syslogd에 대한 설정파일은 /etc/syslog.conf입니다.
  syslogd에 의해 만들어진 log파일은 /var/log에 생성됩니다.

  /etc/hosts에 보면 loghost라는 부분이 있습니다. 이 부분은 syslogd에
  의해 사용됩니다. (추가설명 필요)

  2.45.  cron이 실행되지 않습니다.

  crontab에 등록하려고 하니 다음과 같은 메세지가 나옵니다. 이런경우에는

  cron may not be running - call your system administrator
  warning: commands will be executed using /usr/bin/sh

  cron을 사용하려면 cron.allow에 등록이 되어있어야 합니다. 첫번째
  메세지는 cron.allow에 등록이 되어있지 않기 때문에 생기는 메시지입니다.
  그리고 cron은 /bin/sh를 기본쉘로 사용하지만 /bin이 /usr/bin에
  링크되어있기 때문에 두번째와 같은 에러가 출력됩니다. 따라서 두번째
  메시지는 무시하셔도 됩니다.

  2.46.  Solaris 2.x에서 시스템의 최대값을 알려면?

  Solaris 2.x에서 시스템의 maximum값(maximum filesize, maximum stacksize
  등등)은 ulimit를 사용하면 알 수 있습니다. 이 값을 바꾸려면
  /etc/system파일에 합니다. 다음은 사용자당 사용할 수 있는 최대
  프로세스갯수와 시스템의 최대 프로세스갯수를 설정하는 예제입니다.

  set maxuprc=512
  set max_nprocs=1024

  시스템의 메시지큐 크기를 변형하려면/etc/system 에 msginfo_msgmnb xxx
  와 같이 (xxx는 큐의 크기) 적으면 됩니다.

  2.47.  Solaris에서 hostid를 변경하려면?

  host ID는 변경할 수 없습니다.(원칙) 하지만 가끔 변경하는 프로그램이
  나오곤 하죠.(Solaris 2.5의 hid2, SunOS 4.1.3의 sethostid 등) hid2는
  에서 구할 수 있습니다.

  2.48.  Solaris 2.x는 y2k에 안전한가요?

  에 가시면 Sun제품의 y2k 에 관한 내용을 알 수
  있습니다. 일반적으로 Recommended Patch를 설치하고, y2k Patch를
  설치하시면 됩니다.

  2.49.  TT_DB/ 디렉토리는 뭔가요?

  Solaris의 서비스중에 rpc.ttdbservd가 TT_DB 디렉토리에 데이터베이스를
  생성, 삭제합니다. 따라서 rpc.ttdbservd를 띄우지 않는다면, 삭제하셔도
  됩니다. (박창민님)
  2.50.  Solaris 2.6에서 2GB이상의 파일을 사용하려면?

  Solaris 2.6에서 프로그램이 2GB이상의 파일을 지원하려면 2.6에서 아래의
  옵션을 사용하여 컴파일해야 합니다. (이석찬님)

  CFLAGS = "`getconf LFS_CFLAGS`"
  DEFS = -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
  LDFLAGS = "`getconf LFS_LDFLAGS` -s"
  LIBS = "`getconf LFS_LIBS`"

  따라서 Solaris 2.6이 아닌 시스템에서 컴파일된 프로그램은 위의 옵션을
  사용하여 다시 컴파일 하셔야 합니다.

  2.51.  talk에서 한글을 쓰려면?

  LANG환경변수를 ko로 설정하고, /usr/SUNWale/bin/talk를 사용하면 됩니다.

  2.52.  비밀번호 없는 계정을 만들려면?

  SunOS 4.x까지는 /etc/passwd에 비밀번호란을 지우면 되지만, Solaris
  2.x에는 비밀번호를 관리하는 /etc/shadow의 비밀번호란을 지워도 로긴하면
  다시 입력하게 되어있습니다. 이때 로긴시 비밀번호를 입력하지 않도록
  하려면 /etc/default/login에서 PASSREQ=NO로 만들면 됩니다.

  2.53.  최대접속가능한 터미널 수를 늘이고 싶습니다.

  SunOS 5.x에서 최대 터미널 수는 /etc/system 에서 설정합니다. 만일 최대
  접속가능한 터미널 수를 100으로 하고 싶다면 set pt_cnt = 100 을
  /etc/system 파일에 넣어주면 됩니다.

  2.54.  CD Writer를 사용하려면?

  CD Writer를 이용할 수 있는 프로그램중 대표적인 프로그램으로 mkisofs가
  있습니다. 이 프로그램에 관한 자세한 정보는  를 참고하시면 됩니다.

  3.  네트웍 관련 질문들

  3.1.  허가된 IP에서만 네트웍접속이 가능하게 하려면?

  TCP Wrapper프로그램을 구하셔서 설치하시면 됩니다. 이 프로그램을
  이용하면 telnet, ftp등 대부분의 서비스에서 접근을 제어할 수 있습니다.

  3.2.  Shell을 바꾸었더니 ftp로 로긴이 안됩니다.

  ftp daemon은 /etc/shells에 등록된 shell을 사용하는 계정만 접속을
  허용합니다. 만일 /etc/shells파일이 없는경우에는 /usr/bin/sh,
  /usr/bin/csh, /usr/bin/ksh, /usr/bin/jsh /bin/sh, /bin/csh, /bin/ksh,
  /bin/jsh, /sbin/sh, /sbin/jsh만 접속을 허용합니다. 그래서 최근에 많이
  사용되는 bash나 tcsh는 파일에 적어주지 않으면 ftp로 접속이 되지
  않습니다.

  3.3.  비밀번호없이 ftp나 telnet으로 접속하는 방법이 있을까요?

  ~/.netrc파일을 사용하시면 됩니다. 자세한 내용은 man netrc로
  살펴보시고, 간단하게 말씀드리자면, ~/.netrc파일을 만들고 내용을 다음과
  같이 만듭니다.
  % cat ~/.netrc
  machine a.example.com
  login guest
  password 1234

  machine b.example.com
  ..
  %

  위와 같이 작성해 두시면 ftp로 a.example.com을 접속하면 ID와 비밀번호를
  묻지 않고 바로 login이 됩니다. 그리고 이 파일을 만들때 주의하실 사항은
  남들이 이 파일을 볼 수 없도록 chmod를 이용하여 소유권을 바꿔야 합니다.
  만일 적당하지 않은 소유권으로 되어 있는경우에는 작동하지 않습니다.
  일반적으로 400나, 600를 사용하시면 됩니다. 하지만 가능하면 이 방법은
  사용하지 않는게 좋습니다. :)

  rlogin을 사용하셔도 됩니다. 우선 접속하고자 하는 시스템의 홈디렉토리에
  .rhosts파일을 만들고 ([접속을 허용하는 시스템이름] [계정] 쌍으로
  만드시면 됩니다.) 접속할때는 rlogin [원격시스템이름] -l [계정]으로
  접속하시면 됩니다. 하지만 보안상 별로 좋은 방법은 아니니, 꼭
  필요할때가 아니면 쓰지 마세요.

  3.4.  특정사용자는 ftp로 접속하지 못하게 하고싶습니다.

  /etc/ftpusers파일에 적어주면 됩니다. 만일 aaa와 bbb사용자는 ftp로
  접속하지 못하게 하려면 아래와 같이 파일을 만들면 됩니다.

  % cat /etc/ftpusers
  aaa
  bbb
  %

  3.5.  텍스트 파일에서 줄의 끝에 ^M이 붙어있습니다.

  DOS와 UNIX간에 텍스트파일의 차이때문입니다. DOS에서는 라인구분을
  CR+LF를 사용하고, UNIX에서는 LF만을 사용합니다. 따라서 DOS의
  텍스트파일을 UNIX로 보내면 끝에 CR이 보이게 됩니다. (참고로 맥은
  CR만을 사용합니다.)

  ^M을 안나오게 하려면 전송할때 binary대신 ascii로 재전송하거나,
  dos2unix등의 프로그램을 이용하거나, vi, sed등을 이용해서 ^M을 제거하면
  됩니다.  vi를 사용할때는 :1,$s/^M$// 와 같이 입력하면 되고, sed를 쓸
  때는 sed 's/^M$//' oldfile > newfile과 같이 사용하면 각 줄의 끝에 있는
  ^M을 지워줍니다. (^M을 입력할때는 Ctrl키를 누른상태에서 v와 m을 누르면
  됩니다.)

  3.6.  ftp 사용을 일괄적으로 처리하려면?

  가끔 이런 생각을 할때가 있습니다. ftp를 이용해서 다른 서버에 있는
  파일을 가져오는데 항상 같은 파일을 가져온다면 매번 명령을 직접
  입력하는게 귀찮아서 한꺼번에 하는 방법이 없을까? 라구요. 물론 expect를
  써서 수행해도 되지만 ftp자체에 일괄적으로 처리하는 방법을 제공합니다.
  만일 hostname에 접속해서 userid와 passwd를 입력하고 something이란
  파일을 가져온 후 something2란 파일을 올리고 종료하려면 아래와 같은
  파일을 만들어서 ftp를 호출하면 됩니다.

  $ cat ftp.cmd
  open hostname
  user userid passwd
  get something
  put something2
  bye
  $ cat ftp.cmd | ftp -n

  3.7.  ftp로 어떤 서버에 접속을 하니 파일이 하나도 보이지 않습니다.

  아마도 특정내용을 한글로 출력해서 파일이 보이지 않는것 같습니다.
  사용자입장에서는 한글로 출력하는 내용을 잘 처리하는 ftp 프로그램을
  사용하시면 됩니다. 만일 서버에서 날짜정보를 한글로 출력하지 않으려면
  /etc/rc2.d/S72inetsvc에서 맨 밑줄의 /usr/sbin/inetd -s 앞줄에
  LANG=C;export LANG 을 추가하시면 됩니다. (이 문제는 Solaris 2.5의
  기본적인 in.ftpd에서 생기고, cute-ftp, Netscape에서 동일한 현상이
  났습니다.)

  3.8.  anonymous ftp를 설치하고 싶습니다.

  ftpd의 메뉴얼을 보면 잘 나와있지만, 간단히 설치하려면
  를 root디렉토리에서
  실행하시면 됩니다. Solaris 2.5 이상에서는 아래의 작업으로 두개의
  파일을 더 복사해 주시면 됩니다.(~ftp를 ftp가 설치된 디렉토리라고
  가정합니다.)

  % cp /devices/pseudo/tl@0:ticlts ~ftp/dev/ticlts
  % chmod 666 ~ftp/dev/ticlts
  % cp /usr/lib/libmp.so.* ~ftp/usr/lib

  3.9.  ftp로 접속해서 만든 파일의 모드는 어떻게 결정되나요?

  Solaris 2.6을 사용하고, 시스템의 기본적인 in.ftpd를 사용한다면
  /etc/default/ftpd에 UMASK= 부분을 수정하시면 원하는 umask를 설정하실
  수 있습니다.

  wu-ftpd를 사용한다면 wu-ftpd를 띄울때 -u 옵션을 사용하여 변경할 수
  있습니다.

  3.10.  wu-ftpd 2.4에서 last명령으로 ftp접속기록이 나오게 하려면?

  wu-ftpd 2.4는 기본적으로 utmpx 구조를 지원하지 않습니다. 그 때문에
  last명령으로 ftp접속기록이 나오지 않습니다. 만일 wu-ftpd 2.4에서
  wtmpx구조를 지원하게 하려면 
  있는 패치를 설치하면 됩니다.

  3.11.  wu-ftpd에서 접속시 메시지를 출력하려면?

  /etc/ftpaccess파일을 아래와 같이 편집하면 됩니다.

  message /.welcome login  # 사용자가 로긴할때 나오는 메시지
  message .message cwd=*   # 특정 디렉토리에를 접근할 때 나오는 메시지
  banner /.banner          # 서버에 접속할때 나오는 메시지

  3.12.  telnet으로 접속한 상태에서 잠시 local작업을 하려면?

  telnet으로 원격시스템을 사용하는 도중에  Escape character를 누르시면
  telnet prompt가 나타납니다. 여기에서 여러가지 telnet명령어들을 사용할
  수 가 있는데, 그중에서 z명령을 사용하시면 telnet프로세스가
  foreground에서 background로 전환됩니다.  이렇게 전환해 두시고
  local에서 필요한 작업을 하시고 jobs로 Job ID를 확인한 후 fg %JobID 로
  돌아오시면 됩니다.

  기본적으로 telnet에서 Escape character는 ^]로 되어 있습니다. 이럴경우
  몇군데 접속했다가 ^]를 사용하면 모두 빠져나오기 때문에 Escape
  character를 바꾸고 싶다면 telnet으로 접속하실때 -e 옵션을 사용하시면
  됩니다. 만일 Ctrl+p를 Escape character로 사용하시려면 다음과 같이
  입력하시면 됩니다.

  % telnet -e ^p hostname

  위에서 ^p 는 Ctrl이 아닌 단순한 ^키와 p키를 사용하시면 됩니다.

  -e 옵션 이외에 Escape character를 변경하는 방법으로는 telnet
  prompt에서

  ______________________________________________________________________
  set escape ^p
  ______________________________________________________________________

  3.13.  telnet등에서 내용을 암호화해서 전송하려면?

  telnet이나 rlogin등으로 원격시스템에 접속을 하면 비밀번호등이 평문으로
  전송되기 때문에 보안에 문제가 될 수 있습니다. 따라서 이 메시지를
  암호화 해서 보내는 프로그램들이 많은데 그중에서 대표적인 프로그램으로
  ssh(Secure Shell)가 있습니다.

  ssh를 양쪽 시스템에 설치하고 (ssh는 일반사용자도 설치해서 쓸 수
  있습니다.) ssh, slogin, scp등을 사용하시면 암호화해서 자료를 전송해
  줍니다. (Win95나 Mac에서는 ssh를 지원하는 터미널 프로그램을 사용하시면
  됩니다.) 이뿐만 아니라 X 프로그램을 Network에서 실행할 때도 암호화 해
  줍니다. ssh에 관한 내용은 
  를 참조하세요. (신정식님)

  3.14.  telnet으로 하이텔등에서 프로그램을 다운로드 받으려면?

  z-modem 프로토콜을 지원하는 ztelnet프로그램을 사용하시면 됩니다.
  ztelnet은  에서 소스를 받을
  수 있습니다. 하지만 일반적인 소스를 이용해서 Solaris에서 컴파일하기는
  힘듭니다. SPARC에서 돌아가는 바이너리도 SunOS 4.x에서 static으로
  컴파일 한 것들입니다. (바이너리가 있는 URL을 알려주시면 좋겠습니다.)

  3.15.  웹서버를 설치하려면?

  여러가지 웹서버를 설치할 수 있지만 가장 많이 사용되는 apache웹서버를
  설치하려면 Apache의 홈페이지  를 참조하는게
  좋습니다. 만일 영어에 익숙하지 않다면 한국 apache서버그룹
  를 참조하시기 바랍니다.

  3.16.  웹사이트에 대한 접속통계를 내려면?

  웹서버는 클라이언트로 부터의 요청을 log파일에 남겨둡니다.(apache의
  경우 access_log) 이 로그파일을 이용해서 보기쉬운 형태로 만들어주는
  프로그램들이 많이 있습니다. 최경렬님은 아래의 세가지를 추천하시더군요.
   
 

  3.17.  시스템에 메일이 도착했을때 다른 계정으로 메일을 보내려면 어떻게
  하면 되나요?

  홈디렉토리에 .forward파일을 만들어서 보낼 계정의 전자메일주소를
  적어주면 됩니다. 만일 aaa at bbb.com으로 메일을 보내려면 다음과 같이
  만들면 됩니다.

  % cat $HOME/.forward
  aaa at bbb.com

  이렇게 설정해 둔 경우 처음 받은 시스템에 메일이 없습니다.
  리다이렉션도하고 메일도 보관을 하려면 계정앞에 \ 를 쓰면 됩니다.
  아래는 louis@white로 메일이 왔을때 louis@taegu로 메일을 보내고
  white에도 보관해 두는 예제입니다.

  % cat ~/.forward
  \louis@white
  louis@taegu
  %

  메일이 도착했을때 자동으로 프로그램이 실행되게 하려면 | 를 사용하면
  됩니다. 홈디렉토리에 .forward파일을 만들고 아래의 형식으로 적어주시면
  됩니다.

  |program

  아래는 louis@white로 메일이 왔을때 /export/home/louis/ttt라는 파일 의
  내용을 louis at kebi.com으로 메일보내는 예제입니다.

  % hostname
  white
  % cat ~/.forward
  |/export/home/louis/act
  % cat /export/home/louis/act
  #!/sbin/sh

  PATH=/sbin:/usr/bin

  mail louis at kebi.com > /export/home/louis/ttt

  하지만 관리자가 보안상의 이유로 smrsh를 설치했다면 관리자가 지정한
  프로그램만 위의방법을 이용해서 실행할 수 있습니다. (최경렬님)

  3.18.  계정명에 대문자가 들어있는경우 메일을 받으려면?

  sendmail을 MTA로 사용하시는 경우에 sendmail.cf의 Mlocal로 시작하는
  부분에 보시면 F=이라고 된 부분이 있습니다. 이곳에 u를 추가하면
  대문자로 된 계정에서도 메일을 받아볼 수 있습니다. 그리고 procmail을
  사용하신다면 3.10이상으로 업그래이드하셔야 합니다.  하지만 계정에는
  대문자를 안 쓰시는게 좋습니다. (특히 NIS+를 쓸경우 말썽을 많이
  부립니다.)

  3.19.  메일을 보내는 사람에게 자동으로 일정한 메시지를 답장으로
  주려면?

  잠시 E-mail을 확인하지 못해서, 메일을 보내는 사람들에게 일정한
  메시지로 답장을 자동으로 보내고 싶을때가 있습니다. 이때는
  /usr/bin/vacation을 사용하면 됩니다. 만일 계정이 louis이라면
  .forward파일에 아래와 같은 줄을 삽입하면 됩니다. 그리고 편지의 내용은
  $HOME/.vacation.msg에 적어넣으면 됩니다.

  % cat $HOME/.forward
  \louis
  "|/usr/bin/vacation louis"
  %

  위와 같이 해 두면 받은 메일은 메일박스에 저장되고 자동으로 답장이
  보내집니다.  참고로 자세한 내용은 vacation의 메뉴얼을 참조하시기
  바랍니다.

  3.20.  메일계정만 주고, shell계정을 안주는 방법

  일반 계정에 shell을 noshell등으로 비정상적인 shell을 지정해두면 비슷한
  효과를 거둘 수 있습니다. 또한 uid가 같은 계정에서도 메일을 주고
  받는데는 상관이 없습니다.

  3.21.  tin에서 뉴스서버지정

  NNTPSERVER 환경변수에 지정하시면 됩니다. 만일 csh을 사용한다면 setenv
  NNTPSERVER [뉴스서버 이름] 과 같이 .cshrc에 지정해 두시면 됩니다.

  3.22.  Windows환경의 자원을 UNIX에서 사용하려면?

  Windows에서 사용하는 SMB프로토콜을 UNIX에서 사용할 수 있도록 만든
  Samba를 사용하시면 됩니다. Samba에 관한 내용은 박재호님의
  를 참고하시기
  바랍니다.

  Win98에서는 암호로 DES를 사용하기 때문에 로긴이 안됩니다. 이문제를
  해결하려면 Win98에서 DES를 사용하지 않도록 하면 됩니다.  NT에서는
  HKEY_LOCAL_MACHINE\system\current controlset\services\rdr\parameters
  에 EnablePlainTextPassword라는 REG_DWORD형의 변수를 만들고 값을 1로
  해주면 되고, Win98에서는 HKEY_LOCAL_MACHINE\system\current
  controlset\Services\VxD\VNETSUP 에 EnablePlainTextPassword라는
  DWORD형의 변수를 만들고 값을 1로 해주면 됩니다.

  3.23.  시스템의 IP Address를 변경하고 싶습니다.

  IP Address를 변경할때 시스템의 이름과 함께 변경하는 방법과, 이름은
  그대로 두고 IP Address만 변경하는 경우가 있습니다. 후자의 경우에는
  /etc/hosts에서 시스템의 이름에 해당하는 IP Address를 바꾸고 재부팅을
  하시면 됩니다. 만일 재부팅 할 환경이 안된다면 ifconfig명령으로 IP
  Address를 변경하시면 됩니다. 그리고 시스템의 이름과 함께 변경한다면
  /etc/hostname.hme0나 /etc/hostname.le0에 적힌 시스템의 이름을 변경하고
  /etc/hosts에 변경하면 됩니다. 참고로 IP Address의 설정은
  /etc/rcS.d/S30rootusr.sh에서 이루어집니다.

  3.24.  하나의 Adapter에 두개의 IP address를 할당하려면?

  ifconfig에서 네트웍 디바이스를 지정할 때 hme0:1 로 해 보세요. 하나 더
  추가를 하고 싶다면 hme0:2 로 하면 되겠죠?

  % ifconfig hme0:1 xxx.xxx.xxx.xxx 255.255.255.0 up

  3.25.  gateway설정은?

  Solaris 2.x의 default gateway의 설정은 /etc/rc2.d/S69inet에서 합니다.
  이때 /etc/defaultrouter파일의 내용을 읽어서 설정합니다. 따라서 default
  gateway의 설정은 /etc/defaultrouter파일을 수정하시면 됩니다.

  임시로 gateway를 설정하려면 route명령을 사용하면 됩니다.

  default gateway가 아닌 gateway설정을 영구히 하려면 /etc/rc2.d/S69inet
  에 route명령을 사용하여 추가하시기 바랍니다.

  3.26.  DNS서비스를 받으려면?

  Solaris 2.x에서 DNS서비스를 받으려면 /etc/resolv.conf파일과
  /etc/nsswitch.conf파일을 수정해야 합니다.

  % cat /etc/resolv.conf
  search [도메인이름]
  nameserver [서버의 IP주소]

  % cat /etc/nsswitch.conf
  .
  hosts: files dns
  .

  SunOS 4.x에서 DNS서비스를 받으려면 NIS관련 프로그램을 설치해야 합니다.
  아래의 절차를 따라해 보시기 바랍니다.

  # mkdir /var/yp
  # cp /usr/lib/NIS.Makefile /var/yp/Makefile

  이렇게 파일을 복사한 후 /var/yp/Makefile을 보면 B=-b와 B= 이라는
  부분이 있는데 DNS서비스를 받을려면 B= 에 주석을 달고 B=-b에 있는
  주석을 제거해야 합니다.  이렇게 설정해 두고 /etc/rc.local 에서 ypxfrd;
  echo -n ' ypxfrd'의 주석을 제거합니다.  그리고 domainname명령으로
  시스템의 도메인이름을 설정한 후 ypinit로 NIS 데이터베이스를
  설치합니다.

  # /usr/etc/yp/ypinit -m

  위와 같이 입력하면 몇가지 질문이 나오는데, 환경에 맞게 대답하면
  /var/yp에 여러가지 파일이 생성되고/var/yp/[도메인이름] 디렉토리가
  생깁니다. 마지막으로 /etc/resolv.conf파일에 DNS 서버를 지정한 후
  재부팅하면 DNS서비스를 받을 수 있습니다. 자세한 내용은 SunOS 4.1.3의
  메뉴얼중 NIS에 관련된 내용을 참조하시기 바랍니다.

  3.27.  공개 NMS를 구하려면?

  에 가시면 공개 NMS를 받을 수 있습니다.

  3.28.  시간 서버를 사용하려면?

  네트웍 서버로 부터 시간을 맞추려면 NTP(Network Time Protocol)을 구현한
  프로그램을 사용하면 됩니다. 자세한 정보는
  을 참고하시기 바랍니다.

  3.29.  메일 서비스를 하고 싶습니다.

  가장 기본적으로 메일서비스를 하려면 SMTP서버와 POP3서버를 제공해야
  합니다. 가장 대표적인 SMTP서버인 sendmail에 관한 정보는
  을 참고하시기
  바랍니다. POP3서버에 관한 정보도 같이 제공됩니다.

  4.  개발환경에 관한 질문들

  4.1.  컴파일 할 때 /usr/ucb/cc 가 작동하지 않습니다

  Sun에서는 SunOS 4.x.x까지는 C컴파일러를 OS의 일부로 주었지만,
  Solaris부터는 옵션으로 즉 따로 구입하게 만들었습니다. 그래서 Sparc C를
  구입하지 않은 시스템에서 cc hello.c라고 입력하면 /usr/ucb/cc: language
  optional software package not installed라는 메세지를 뿌려줍니다.
  따라서 많은 사람들이 무료로 사용할 수 있는 gcc를 설치해서 사용하는데
  gcc는 컴파일해서 설치할 수도 있고, 다른 사람들이 package로 만들어
  둔것을 설치하는 방법도 있습니다.

  4.2.  gcc를 설치하려면?

  만일 옛날버젼의 gcc가 이미 설치되어 있다면 컴파일해도 되지만, 그렇지
  않은경우에는 이미 컴파일되어있는 package를 가져와서 설치하시면 됩니다.
  package의 설치방법은 본 FAQ의 package설치부분을 참고하시기 바랍니다.
  소스를 받으려면 GNU 프로그램의 미러링사이트에서 받을 수 있습니다.
  Solaris 2.x용 패키지는  이나
  에서 받을 수 있습니다. 패키지의
  설지는 본 FAQ의 패키지란 뭔가요? 부분을 참고하시기 바랍니다.

  소스를 컴파일 하시는 경우 기본적인 컴파일러가 설치되어 있어야 하며
  일반 GNU 프로그램과 비슷하게 아래와 같은 과정을 거치면 됩니다.

  $ gzip -dc [gcc 소스파일] | tar xf -
  $ cd [gcc 소스파일 디렉토리]
  $ ./configure
  $ make
  $ make install

  SunOS 4.x의 경우에는 기본적인 BSD cc가 설치되어 있으므로 gcc를 컴파일
  할 수 있습니다. 소스 컴파일 과정을 거치면 됩니다.

  4.3.  /usr/include등에 header파일이 없습니다.

  아마도 처음 Solaris를 설치하면서 End User용으로 설치하셨나 보군요. End
  User용으로 설치할 경우 compiler에 관련된 파일들은 설치가 안됩니다. 이
  경우 아래 패키지를 설치하시면 됩니다. (서진수님
  이 정리해 주셨습니다.)

  SUNWdoc: Documentation Tools
  SUNWman: On-Line Manual Pages
  SUNWhea: SunOS Header Files
  SUNWarc: Archive Libraries
  SUNWtoo: Programming Tools
  SUNWbtool: CCS tools bundled with SunOS
  SUNWlibm: Sun WorkShop Bundled libm
  SUNWsprot: Solaris Bundled tools

  4.4.  gdb와 xxgdb는 어떤 프로그램입니까?

  gdb는 GNU에서 만든 debugger입니다. 그리고 xxgdb는 gdb를 X Window에서
  쓸 수 있도록 해 줍니다.

  4.5.  SPARCompiler등을 설치했는데 license file이 없다고 합니다.

  license file이 정상적으로 설치되지 않은경우 아래와 같은 에러가 납니다.

  License Error : Cannot find license file
  (/usr/local/flexlm/licenses/license.dat)
         for SPARCompiler C
  Cannot find license file (-1,73:2) No such file or directory

         The product has not been installed properly.
  Cannot find license file (-1,73:2) No such file or directory
         There are no license files in following path :

                 None

  Cannot find license file (-1,73:2) No such file or directory

  license file을 설치하려면 SPARCompiler와 같이 들어있는 License Man

  ager를 설치하시면 됩니다.

  4.6.  gcc를 사용할경우 xmkmf가 정상적으로 작동하려면?

  gcc를 사용하는 환경에서 xmkmf를 실행하면 Makefile이 SPARCompiler를
  기준으로 만들어집니다. 이 때문에 컴파일러 옵션등에서 Warning이 많이
  발생하는데 이 문제를 해결하려면 /usr/openwin/lib/config 파일을
  수정하면 됩니다. 보통 쉬운일이 아니지만 만일 Solaris 2.6이라면
  /usr/openwin/lib/config의 두파일을 아래를 기준으로 고치면
  됩니다.(이석찬님) (Solaris 2.6이 아닌 환경에서 해 보신분은 원래파일과
  고친파일을 보내주시면 FAQ에 올리도록 하겠습니다.)

  % diff site.def.orig site.def
  36d35
  < /*
  40d38
  < */
  42d39
  < /*
  46d42
  < */
  %diff sun.cf.orig sun.cf
  4c4
  < #define HasSunC YES
  ---
  > XCOMM #define HasSunC YES

  4.7.  make가 없다고 합니다.

  make는 기본적으로 /usr/ccs/bin에 있습니다. 자신의 PATH환경변수에
  /usr/ccs/bin이 들어있는지 확인해 보시고, 만일 /usr/ccs/bin에
  make파일이 없다면 가까운 GNU프로그램 미러사이트에서 GNU make를 받아서
  설치하시면 됩니다. 또는 SUNWsprot 패키지를 설치하시면 됩니다.
  (서진수님 이 정리해 주셨습니다.)

  5.  사용자 환경에 관한 질문들

  5.1.  DOS의 doskey와 같은 기능이 있나요?

  ksh을 사용하고, set -o emacs라고 설정해두었다면 ^P를 누르면 doskey의
  기능을 합니다. 만일 tcsh나 bash를 사용한다면 간단히 화살표만으로도
  doskey기능을 사용할 수 있습니다.

  5.2.  root의 shell은 어떻게 바꾸나요?

  root도 일반 사용자와 마찬가지로 /etc/passwd에서 수정하시면 됩니다.
  하지만 root의 shell은 /sbin/sh에서 다른 프로그램으로 바꾸지 마세요.
  다른 프로그램으로 바꾼경우 많은 문제점(?)들이 생길 수 있습니다. 차라리
  /sbin/sh으로 들어가서 다른 shell을 실행해서 사용하시는게 좋습니다.

  5.3.  프롬프트에 현재 디렉토리를 표시하려면?

  기본적으로 sh에서 프롬프트에 현재디렉토리를 표시하는 기능은 없습니다.
  하지만 sh에의 함수기능을 사용하면 흉내를 낼 수 있습니다. .profile에
  아래와 같은 줄을 입력하시기 바랍니다.

  cd() { chdir $*; PS1="`pwd` $ "; }

  참고로 csh은 여러가지 방법이 있습니다. dirs라는 명령어를 사용하려면
  아래와 같이 사용하시면 됩니다.

  alias cd 'cd \!*; set prompt="`dirs` %"'

  dirs명령 이외에도 cwd라는 변수에는 현재의 디렉토리가 들어있습니다. 이
  변수를 이용하려면 아래와 같이 사용하시기 바랍니다.

  alias cd 'cd \!*; set prompt="$cwd %"'

  bash를 사용하신다면 아래와 같은 한줄을 .bashrc에 삽입하시기 바랍니다.

  export PS1="\W $ "

  tcsh를 사용하신다면 아래와 같은 한줄을 .tcshrc에 삽입하시기 바랍니다.
  tcsh에서는 %/ 또는 %~ 가 prompt 에서 현재 디렉토리를 표시합니다.

  set prompt="%/ % "

  5.4.  root계정의 환경설정은 어디에서?

  일반 사용자의 경우에는 환경을 설정하려면 자신의 홈 디렉토리에 있는
  .cshrc .profile등등을 수정하면 됩니다. 이와 마찬가지로 root계정도
  root계정의 홈디렉토리의 .profile이나 .login등을 수정하면 됩니다.

  가끔 사용자중에 root의 환경설정은 일반 계정에게도 영향을 미친다고 알고
  계신데 그렇지 않습니다. 만일 전체 사용자에게 영향을 주려면
  /etc/profile이나 /etc/.login등을 수정하셔야 합니다.

  5.5.  3벌식 자판을 사용하려면?

  Solaris 2.x의 기본적인 한글 입력기인 htt는 2벌식만 지원합니다. 3벌식을
  사용하시려면 Mizi Research에서 개발한 hanIM을 사용해 보세요. hanIM은
  에서 받으실 수 있습니다.

  5.6.  vi에서 한글이 입력되지 않습니다.

  여러 가지 문제일 수 있지만 대표적으로 다음과 같은 두가지 때문입니다.
  만일 ">H3gGo" 같은 형태로 입력이 되지 않으면 쉘에서 8번째 bit가
  strip되기 때문에 stty -istrip을 입력하셔서 strip되지 않도록 하시고,
  "\276\236"와 같은형태로 나오면 쉘에서 환경변수 LANG을 ko로 설정하시기
  바랍니다. 만일 환경변수 LANG을 C로 해야 하는 경우에는 LC_CTYPE을
  iso_8859_1로 설정하시고 stty -istrip -parenb cs8을 설정해 두면 한글을
  사용할 수 있습니다.(최경렬님)

  5.7.  CDE의 스타일관리자에서 배경그림을 추가하고 싶습니다.

  그림 형식을 xpm으로 하고, 확장자를 pm으로 해서
  /usr/dt/share/backdrops에 저장하시면됩니다. 이때 그림에 따라 되는것도
  있고 안되는것도 있습니다. 그리고 그림이 너무 크면 목록에도 나오지
  않습니다.

  6.  기타

  6.1.  Netscape를 실행했는데 다음과 같은 Warning이 계속출력됩니다.

  Warning:
  Name: Text
  Class XmTextField
  2054-xxx character It is not supported in font. It is discarded

  신정식님의 FAQ에 따르면 Netscape에서 기본적으로 설정되어 있는
  adobe계열의 폰트의 문제라고 합니다. 자세한 내용은  를 참조하세요.

  6.2.  Netscape의 메뉴등에서 한글이 보이지 않습니다.

  위의 문제와 마찬가지로 신정식님의 FAQ인
  를 참조하시기 바랍니다.

  6.3.  Netscape를 실행했는데 libresolv.so.2를 찾지못한다고 합니다.

  Netscape는 libresolv.so.2 라이브러리를 사용하기 때문에 이 라이브러리가
  없는 시스템에서 실행하면 아래와 같은 에러가 납니다.

  ld.so.1: netscape: fatal: libresolv.so.2: can't open file: errno=2

  이 라이브러리를 설치하려면 Solaris의 버전에 맞는 Recommended Patch를
  설치하시면 됩니다.

  6.4.  MP3파일을 듣고싶습니다.

  에 가시면 여러가지 프로그램들을 받을 수 있습니다.

  6.5.  특정사용자가 실행한 프로세스를 한꺼번에 지우려면?

  다음과 같이 pipe를 이용하여 지우시면 됩니다. (사용자이름은 USERID라고
  가정)

  % kill -9 `ps -ef | grep USERID | awk '{print $2}'`

  6.6.  파일을 여러개로 쪼개려면?

  일반적인 Unix시스템에서 제공하는 split 명령을 사용하셔서 쪼개면 되고,
  나중에 붙일려면 cat file1 file2 .. filen > file 과 같이 하셔서 붙이면
  됩니다.

  6.7.  X Window의 화면을 캡춰하려면?

  xwd 명령어를 사용하면 됩니다.

  % xwd -out filename

  위와 같이 입력하고 원하는 창에서 마우스를 클릭하면(전체를 하고 싶으면
  root창을 클릭하면 됩니다.) filename이라는 파일이 생깁니다. 이 파일을
  xv등에서 불러서 원하는 파일형식으로 저장하면 됩니다.

  그리고 xv를 사용한다면 xv에서도 화면을 캡춰할 수 있습니다. 버튼중에
  Grab이라는 버튼을 이용하시면 됩니다.
  6.8.  Letter용지로 설정된 ps파일을 A4 크기로 프린트하고 싶습니다.

  특별한 방법은 없습니다. 변환프로그램을 사용해서 Letter를 A4로 변환할
  수 있다고 하지만, 안되는 파일도 많습니다.

  6.9.  파일이 지워지지 않습니다.

  보통의 파일의 경우 rm 명령으로 지울 수 있습니다. 하지만 몇몇의
  경우에는 파일이 지워지지 않고, 찾을 수 없다는 말만 나오는 경우가
  있습니다. 쉘에서 ls로 확인해 보면 있는데도요.

  여러가지 원인이 있을 수 있지만, 대표적인 경우가 파일 이름에 특수문자가
  들어간 경우입니다. 이 경우에는 파일이름이 이상하게 나오기 때문에
  원래의 이름을 확인하기 어려운 경우가 많습니다. 예를한번 들어보죠. 원래
  파일 이름은 filename인데, n다음에 backspace문자가 들어가 있다면 화면에
  보일때는 fileame과 같이 보입니다. 이 경우에 사용자가 rm fileame라고
  입력해 봐도 rm은 그런 파일이 없다고 투덜대기만 합니다.

  이런경우에 이 파일을 지우는 방법은 여러가지가 있습니다.

  1. '*'등을 사용해서 지우고 싶은 파일만 선택할 수 있는 방법을
  찾는것입니다.  예를들어 위의 경우 ls file* 이라고 해서 지우고 싶은
  파일만 나오는 경우에는 성공했다고 볼 수 있겠지요. 이런 방법을 찾았다면
  rm file* 과 같이 해서 지우시면 됩니다.

  2. 만일 이런 방법을 찾지 못했다면, ls -1A > filelist 로 filelist파일을
  만든 후 vi filelist로 들어가보면 무엇이 원인인지 알 수 있습니다.
  그렇다면 현재 상태에서 문제의 파일을 지울 수 있는 script를 간단히 만든
  후, 나와서 수행하면 되겠지요.

  이 항목은 한규진님이 정리해 주셨습니다.

  또는 ls -i 명령으로 문제가 되는 파일의 i-node 번호를 확인한 후 아래
  명령으로 지울 수 있습니다. (이 경우에 하위 디렉토리가 복잡한 경우에
  -prune 옵션을 사용하시면 유용합니다.)

  find . -inum -exec rm {} \;

  이 내용은 정재목님이 보내주셨습니다.

  또는 ls에서 -b 옵션을 사용하면 특수문자가 8진수로 나타납니다. 예를들어
  \010\010\010vrf 와 같이 나왔다면 rm ???vrf 와 같은방법으로 지울 수
  있습니다.

  이 내용은 경찬님 이 보내주셨습니다.

  7.  문제점 해결

  7.1.  일반 사용자는 socket: Permisson denied라고 나옵니다.

  /devices/pseudo/clone@0:tcp의 퍼미션을 666으로 수정하시기 바랍니다.

  7.2.  login프롬프트가 굉장히 늦게 나옵니다.

  어떤 시스템에서 접속을 하면 빨리 login 프롬프트가 나오는데, 어떤
  시스템에서는 굉장히 늦게 나옵니다. 이경우 대부분은 DNS의 설정이
  잘못되었거나, DNS서버에 문제가 있는경우입니다. 빨리 프롬프트가 나오는
  시스템은 /etc/hosts 등에 등록된 경우일겁니다. DNS의 설정을 찬찬히
  훑어보세요.

  7.3.  /etc/path_to_inst파일을 실수로 삭제한 경우 부팅이 안됩니다.
  어떡하죠?

  /etc/path_to_inst파일이 삭제되었다면 drvconfig(1M)으로 만들거나 CD-
  ROM으로 부팅하여 CD에 있는 path_to_inst파일을 복사하여 재 부팅하면
  됩니다. 또는 PROM prompt에서 boot a 로 부팅하면 됩니다.

  7.4.  vi를 실행했는데 Terminal Too Wide라고 나옵니다.

  vi에서 한줄에 입력할 수 있는 글자수에 한계가 있어서 터미널을 너무 크게
  만들어 두고 vi를 실행한 경우 Terminal Too Wide라고 나옵니다. 터미널을
  조금 줄인 후 수행하면 괜찮습니다. 제가 테스트 해 보니 가로로 영문자
  기준으로 164이상이 되면 Terminal Too Wide라고 나오더군요.

  7.5.  Connected command timeout for Target 4.0 이라고 나옵니다.

  부팅할 때 가끔 아래와 같은 메시지가 나오는 경우가 있습니다.

  WARNING: /sbus@1f,0/SUNW,fas@e,8800000 (fas0):
          Connected command timeout for Target 4.0

  이 경우 대부분은 SCSI터미네이터가 달려있지 않은경우입니다. 확인하시기
  바랍니다.

  7.6.  Target 4 reducing sync. transfer rate 라고 나옵니다.

  WARNING: /sbus@1f,0/SUNW,fas@e,8800000 (fas0):
         Target 4 reducing sync. transfer rate
        

  이 메시지는 SCSI 하드디스크의 전송속도가 틀린경우입니다. 이 경우
  /etc/system 파일에 아래와 같이 한 줄을 추가하시고 재부팅 하면 됩니다.

  set scsi_options=0x58

  8.  감사의 글

  일일이 나열할 수는 없지만, 많은 분들의 지적과 격려가 이 글을 쓰는데
  도움이 되었습니다.모든분들께 감사드립니다.


--
Woohyun JANG, louis at mizi.co.kr 
2006/09/08 16:00 2006/09/08 16:00
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 15:59
출처 블로그 > 몽크
원본 http://blog.naver.com/machoon/40003720775
1. Tcpdump란? tcpdump는 Lawrence Berkley Nation Lab의 Network Rearch Gruop에서 만든 것으로 네트워크의 패킷을 출력해주는 프로그램이다. 주어진 조건식을 만족하는 네트워크 인터페이스를 거치는 패킷들의 헤더들을 출력해 주는 프로그램이다. 주로 쓰임은 지정된 상대방 호스트로부터 들어오는 패킷을 체크하는 데 있다.2. tcpdump의 사용법 (1) 사용법   tcpdump [options] [host]
(2) tcpdump의 결과보기 [root@www root]# tcpdump 01:37:09.744959 203.xxx.xxx.10.4847 > linux.co.kr.ftp: S 2082495566:2082495566(0) win 16384 (DF) => (결과설명) 01:37:09.744959 : Timestamp로 보통 '시간.특정한숫자값'형태로 부여된다. 203.xxx.xxx.10.4847 : Source_address.source_port로 소스의 IP주소와 Port번호를 나타낸 다. > : Traffic direction으로 방향을 나타낸다. linux.co.kr.ftp : destination_address.destination_port로 도착지 IP주소와 Port번호를 나타낸다. S : TCP flag로 특정한 표시문자를 일컫는다. 2082495566:2082495566(0) : sequence number이다. win 16384 : window size이다. : various options 이다. (DF) : Don't fragment
3. tcpdump 플래그(flags) 
TCP 플래그 TCPDUMP 플래그 플래그의 의미
SYNS SYN패킷, 접속요청을 할 때 보내는 패킷을 말한다.
TCP접속시에 가장먼저 보내는 패킷이다.
ACKack ACK패킷, 상대방으로부터 패킷을 받은 뒤에 알려주는
패킷을 말한다. 다른 플래그와 같이 출력되는 경우도
있다.
FINF 접속종료를 위한 플래그로 이 패킷을 보내는 곳이
현재 접속하고 있는 곳과 접속을 끊고자 할 때 사용한다.
RESETR 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시
연결을끊고자 할 때 사용한다.
PUSHP 데이터를 즉시 목적지로 보내라는 의미이다. 텔넷과
같이 상호작용이 중요한 프로그램의 경우 빠른 응답
이 중요한다. 이때 사용하는 플래그이다.
UGENTURG 긴급한 데이터는 다른 데이터에 비해 우선순위가
높아야 한다. 예를 들어 ftp로 자료를 받고 있는 도중
[CTRL]+[C] 를 받으면 즉시 자료받기를 중단해야 하는
것처럼 이 때 사용하는 플래그이다.
Placeholder. 패킷이 SYN, FINISH, RESET, PUSH등의 플래그가 없는
경우이 플래그가 세팅된다. 이 플래그는 ACK플래그와
함께 사용되는 경우도 있다.
4. tcpdump의 옵션 -h: 버전 및 기본 사용법을 보여준다. -a : Network & Broadcast 주소들을 이름들로 바꾼다. -c Number : 제시된 수의 패킷을 받은 후 종료한다. -d : compile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다. -dd : packet-matching code를 C program의 일부로 출력한다. -ddd : packet-matching code를 숫자로 출력한다. -e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다. -f : 외부의 internet address를 가급적 심볼이 아닌 숫자로 출력한다.(Sun의 yp server와의 사용은 가급적 피한다.) -F file : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다. -i device : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의 인터페이스 리스트를 검색하여 가장 낮은 번호를 가진 인터페이스를 선택한다.(이 때 loopback은 제외된다.) 예) tcpdump -i eth0 -l : 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이 터를 받고자 할 때 유용하다. 보통 'tcpdump -l | tee dat' 나 'tcpdump -l < dat & tail -f dat' 명령으로 연계해서 사용하면 편리하다. -n : 모든 주소들을 번역하지 않는다(port,host address 등등) -N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다. -O : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다. -p : 인터페이스를 promiscuous mode로 두지 않는다. -q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다. -r file : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준 입력을 통해서 받아들인다. -s length: 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다.(Sun OS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하 나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃 게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아 주어야 한다. -T type : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp (Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board) -S : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다. -t : 출력되는 각각의 라인에 시간을 출력하지 않는다. -tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다. -v : 좀 더 많은 정보들을 출력한다. -vv : '-v'보다 좀 더 많은 정보들을 출력한다. -vvv : 16진수값 형태로 정보를 보여준다. 보통 -X옵션과 사용되어 -w : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다. -x : 각각의 패킷을 헥사코드로 출력한다. -X : 헥사코드와 ascii형태 모두 출력해준다. 보통 -x 옵션과 같이 사용된다. -조건식(expression) 옵션의 제일 마지막인 조건식은 어떤 패킷들을 출력할 지를 선택하는 데 쓰인다. 조건식이 주어지지 않는다면 모든 패킷들이 대상이 된다. 조건식들은 하나 또는 여러 개의 primitive들로 구성되어 있고 primitive들은 다시 하나 또는 여러 개의 qualifier들 다음에 오는 하나의 값으로 이루어진다. *qualifier type : 주어진 값의 종류가 무엇인지를 나타낸다. 가능한 type들은 'host', 'net', 'port'가 있다. type이 없는 값들은 type을 host라 가정한다. dir : id로 부터의 어떤 특정한 전송 방향을 나타낸다. 가능한 방향은 'src', 'dst', 'src or dst', 'src and dst'이다. 만약 방향이 정해지지 않았다면, src or dst라 가정한다. "For `null' link layers (i.e. point to point protocols such as slip) the inb ound and out bound qualifiers can be used to specify a desired direction." proto : 매칭을 특정 프로토콜에 한해서 수행한다. 가능한 프로토콜들은 ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp, udp이다. 만약 프로토콜이 명시되지 않았다 면, 해당하는 값의 type에 관련된 모든 프로토콜들이 그 대상이 된다. *위의 패턴을 따르지 않는 primitive : gateway, broadcast, less, greater, 산술식이 있으며 참고 로 더 정교한 조건식을 사용하려면 'and(&&)','or(||)','not(!)' 을 사용할 수 있다. *사용가능한 primitive들 dst host HOST => packet의 IP destination 항목이 HOST일때 참이 된다. src host HOST => packet의 IP source 항목이 HOST일때 참이 된다. host HOST => IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다. ether dst ehost => ethernet destination 주소가 ehost일 때 참이다. ether src ehost => ethernet source 주소가 ehost일 때 참이다. ether host ehost => ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다. gateway host => 패킷이 host를 게이트웨이로 사용하면 참이다. 이 말의 의미는 ethernet sour ce나 destina tion 항목은 host이지만, IP source와 destination은 host가 아닐 때를 말한다. dst net NET => 패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이다. src net NET => 패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다. net NET => 패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을 때 참이다. net netmask mask => IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다. net net/len => IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다. dst port PORT => 패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다. port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다. 만약 이름이 사용 됐다면 port 번호와 프로토콜이 같이 체크될 것이다. 만약 숫자나 불 확실한 이름이 사용됐을 경우에는 port 번호만이 체크될 것이다. src port PORT => 패킷의 source port의 값으로 PORT를 가지면 참이다. port PORT => 패킷의 source, destination port 중에 하나라도 PORT이면 참이다.
less length => 패킷이 length보다 짧거나 같으면 참이다.(len <= length) greater length => 패킷이 length보다 짧거나 같으면 참이다.(len >= length) ip proto protocol => 패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다. Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다. 주의할 점은 tcp, udp, icmp들은 '\'로 escape되어야 한다. ehter broadcast => 패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다. ip broadcast => 패킷이 IP broadcast 패킷이라면 참이다. ether multicast => 패킷이 IP multicast 패킷이라면 참이다. ether proto protocol => 패킷이 ether type의 protocol이라면 참이다. protocol은 ip, arp, rarp 중에 하나 혹은 몇 개가 될 수 있다. ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다. decnet src host => 만약 DECNET의 source address가 host이면 참이다. 이 어드레스는 '10.123'이 나 DECNET의 host name일 수 있다. DECNET host name은 DECNET에서 돌아가도록 설정된 Ultrix 시스템에서 만 사용 가능하다. decnet dst host => DECNET destination address가 host이면 참이다. decnet host HOST => DECNET source, destination address중의 하나라도 HOST이면 참이다. ip, arp, rarp, decnet => ether proto [ip|arp|rarp|decnet]의 약어 lat, moprc, mopdl => ether proto [lat|moprc|mopdl]의 약어 tcp, udp, icmp => ip proto [tcp|udp|icmp]의 약어 expr relop expr => EXPR proto [expr:size]의 형식을 띤다. proto, expr, size에 올 수 있는 것들은 다음과 같다. proto : ether, fddi, ip, arp, rarp, tcp, udp, icmp expr : indicate Byte offset of packet of proto size : optional. indicate the size of bytes in field of interest default is one, and can be two or four => RELOP !=, =, <=, >=, etc. 이 조건식을 사용하기 위해서는 먼저 해당하는 Protocol(proto)의 헤더에 관련된 것들을 자세 히 알아야만 한다. proto에는 대상이 될 프로토콜을 지정한다. expr에는 프로토콜 헤더의 처음 부터의 Byte Offset을 지정하는 식이 들어가게 된다. Size는 Option이며 지정이 안 되어 있을 경우에는 자동으로 1byte를 지칭한다. 따라서 이 조건식을 사용하게 되면 헤더에 포함된 정보 를 Bitmask를 사용하여 직 접 원하는 패킷인지를 가려낼 수 있기 때문에, 보다 정밀한 사용이 가능하게 된다.
5. tcpdump 기본사용예
(1) [root@www root]# tcpdump => 현재 서버의 모든 패킷을 보여준다. (2) [root@www root]# tcpdump port 21 tcpdump: listening on eth0 01:25:43.833276 203.xxx.xxx.100.4828 > xxx.com.ftp: S 1910472596:1910472596(0) win 16384 203.247.40.244.4828: S 4108025962:4108025962(0) ack 1910472597 ) => 21번 포트로 들어온 패킷만 보여준다. (3) [root@nanajjang /root]# tcpdump -c 2 host neuro.hannam.ac.kr Kernel filter, protocol ALL, datagram packet socket tcpdump: listening on all devices 11:09:44.576419 eth0 B arp who-has 203.247.40.247 tell neuro.hannam.ac.kr 11:09:44.576507 eth0 > arp reply 203.247.40.247 (0:c0:26:1:11:77) is-at 0:c0:26) => neuro.hannam.ac.kr의 패킷 2개만 보여준다. (4) tcpdump -v -e broadcast => broadcast 의 정보를 자세히 출력하고 출력되는 각각의 행에 대해서 link-level헤더를 출력 한다.
6. tcpdump로 패스워드 알아내기
(1) 설명: telnet을 이용하여 서버에 접속을 하면 패킷전송시에 암호화하지 않기 때문에 쉽게 내용 을 볼 수 있다. tcpdump를 이용하여 패스워드를 알아낼 수 있다. (2) 사용예 1) 실행명령 [root@www root]# tcpdump port telnet -l -vvv -x -X >dumpdata & tail -f dumpdata 2) 패킷분석: 패킷의 양이 많으므로 잘 찾아야 한다. 먼저 연결된 포트를 확인한다. 20:38:22.395281 xxx.com.telnet > 210.xxx.xxx.100.35383: P [tcp sum ok] 175:182(7) ack 81 win 5792 (DF) [tos 0x10] (ttl 64, id 59193, len 59) 0x0000 4510 003b e739 4000 4006 ca41 cbf7 28fc E..;.9@.@..A..(. 0x0010 d27b c1c2 0017 8a37 2992 16d8 2041 b972 .{.....7)....A.r 0x0020 8018 16a0 5fec 0000 0101 080a 04d1 f156 ...._..........V 0x0030 0223 7825 6c6f 6769 6e3a 20 .#x%login:. => 서버(xxx.com)에서 클라이언트(210.xxx.xxx.100에게 'login'이라는 것을 보여줌을 알 수 있다. 또한 연결된 클라이언트의 포트번호가 35383임을 알 수 있다. 이 포트번호를 확인해 야 패킷을 찾아갈 수 있다. ---중략--- 20:38:23.979306 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 81:82(1) ack 182 win 5840 (DF) [tos 0x10] (ttl 56, id 49475, len 53) 0x0000 4510 0035 c143 4000 3806 f83d d27b c1c2 E..5.C@.8..=.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b972 2992 16df ..(..7...A.r)... 0x0020 8018 16d0 5130 0000 0101 080a 0223 78c3 ....Q0.......#x. 0x0030 04d1 f156 70 ...Vp => 클라이언트에서 서버로 전송하는 부분만을 확인하면 된다. P 다음에 존재하는 81:82와 ack 다음에 182라는 번호를 꼭 확인한다. 다음 패킷번호는 82:83이 되고 ack 183번이 되므로 ack 183이라는 부분을 찾아가면 된다. 여기서 클라이언트에서 서버로 전송한 글자는 맨 마지막에 표시된다. 즉 'p'이다. ---중략--- 20:38:24.162490 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 82:83(1) ack 183 win 5840 (DF) [tos 0x10] (ttl 56, id 49477, len 53) 0x0000 4510 0035 c145 4000 3806 f83b d27b c1c2 E..5.E@.8..;.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b973 2992 16e0 ..(..7...A.s)... 0x0020 8018 16d0 4ef0 0000 0101 080a 0223 78d6 ....N........#x. 0x0030 04d1 f481 6f ....o ---중략--- 20:38:24.322785 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 83:84(1) ack 184 win 5840 (DF) [tos 0x10] (ttl 56, id 49479, len 53) 0x0000 4510 0035 c147 4000 3806 f839 d27b c1c2 E..5.G@.8..9.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b974 2992 16e1 ..(..7...A.t)... 0x0020 8018 16d0 4a80 0000 0101 080a 0223 78e6 ....J........#x. 0x0030 04d1 f4df 73 ....s ---중략--- 20:38:24.445142 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 84:85(1) ack 185 win 5840 (DF) [tos 0x10] (ttl 56, id 49481, len 53) 0x0000 4510 0035 c149 4000 3806 f837 d27b c1c2 E..5.I@.8..7.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b975 2992 16e2 ..(..7...A.u)... 0x0020 8018 16d0 5820 0000 0101 080a 0223 78f2 ....X........#x. 0x0030 04d1 f531 65 ...1e ---중략--- 20:38:24.532360 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 85:86(1) ack 186 win 5840 (DF) [tos 0x10] (ttl 56, id 49483, len 53) 0x0000 4510 0035 c14b 4000 3806 f835 d27b c1c2 E..5.K@.8..5.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b976 2992 16e3 ..(..7...A.v)... 0x0020 8018 16d0 53d6 0000 0101 080a 0223 78fb ....S........#x. 0x0030 04d1 f570 69 ...pi ---중략--- 20:38:24.624350 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 86:87(1) ack 187 win 5840 (DF) [tos 0x10] (ttl 56, id 49485, len 53) 0x0000 4510 0035 c14d 4000 3806 f833 d27b c1c2 E..5.M@.8..3.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b977 2992 16e4 ..(..7...A.w)... 0x0020 8018 16d0 4e9f 0000 0101 080a 0223 7904 ....N........#y. 0x0030 04d1 f59c 6e ....n ---중략--- => posein이라는 글자를 알 수 있다. 즉 사용자 ID가 posein이다. 20:38:24.932380 xxx.com.telnet > 210.xxx.xxx.100.35383: P [tcp sum ok] 190:200(10) ack 89 win 5792 (DF) [tos 0x10] (ttl 64, id 59201, len 62) 0x0000 4510 003e e741 4000 4006 ca36 cbf7 28fc E..>.A@.@..6..(. 0x0010 d27b c1c2 0017 8a37 2992 16e7 2041 b97a .{.....7)....A.z 0x0020 8018 16a0 d40b 0000 0101 080a 04d1 f669 ...............i 0x0030 0223 7923 5061 7373 776f 7264 3a20 .#y#Password:. => 서버에서 클라이언트에서 Password라는 글을 보내어 출력시킨다. ---중략--- 20:38:25.300524 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 89:90(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49490, len 53) 0x0000 4510 0035 c152 4000 3806 f82e d27b c1c2 E..5.R@.8....{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97a 2992 16f1 ..(..7...A.z)... 0x0020 8018 16d0 557f 0000 0101 080a 0223 7947 ....U........#yG 0x0030 04d1 f669 66 ...ip ---중략--- 20:38:25.454778 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 90:91(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49491, len 53) 0x0000 4510 0035 c153 4000 3806 f82d d27b c1c2 E..5.S@.8..-.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97b 2992 16f1 ..(..7...A.{)... 0x0020 8018 16d0 489e 0000 0101 080a 0223 7957 ....H........#yW 0x0030 04d1 f739 72 ...9a ---중략--- 20:38:25.659340 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 91:92(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49492, len 53) 0x0000 4510 0035 c154 4000 3806 f82c d27b c1c2 E..5.T@.8..,.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97c 2992 16f1 ..(..7...A.|)... 0x0020 8018 16d0 554e 0000 0101 080a 0223 796b ....UN.......#yk 0x0030 04d1 f774 65 ...ts ---중략--- 20:38:25.777475 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 92:93(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49493, len 53) 0x0000 4510 0035 c155 4000 3806 f82b d27b c1c2 E..5.U@.8..+.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97d 2992 16f1 ..(..7...A.})... 0x0020 8018 16d0 54d8 0000 0101 080a 0223 7977 ....T........#yw 0x0030 04d1 f7dd 65 ....s ---중략--- 20:38:26.049208 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 93:94(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49494, len 53) 0x0000 4510 0035 c156 4000 3806 f82a d27b c1c2 E..5.V@.8..*.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97e 2992 16f1 ..(..7...A.~)... 0x0020 8018 16d0 887f 0000 0101 080a 0223 7992 .............#y. 0x0030 04d1 f81a 31 ....w ---중략--- 20:38:26.243634 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 94:95(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49495, len 53) 0x0000 4510 0035 c157 4000 3806 f829 d27b c1c2 E..5.W@.8..).{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97f 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 86df 0000 0101 080a 0223 79a6 .............#y. 0x0030 04d1 f8a5 32 ....o ---중략--- 20:38:26.442302 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 95:96(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49496, len 53) 0x0000 4510 0035 c158 4000 3806 f828 d27b c1c2 E..5.X@.8..(.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b980 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 8768 0000 0101 080a 0223 79b9 .....h.......#y. 0x0030 04d1 f908 31 ....r ---중략--- 20:38:26.540930 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 96:97(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49497, len 53) 0x0000 4510 0035 c159 4000 3806 f827 d27b c1c2 E..5.Y@.8..'.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b981 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 80f7 0000 0101 080a 0223 79c3 .............#y. 0x0030 04d1 f96e 37 ...nd ---이하생략--- => 패스워드가 password라는 것을 알 수 있다.출처 : http://www.attikorea.com/secuutil/tcpdump.html
2006/09/08 15:59 2006/09/08 15:59
이 글에는 트랙백을 보낼 수 없습니다
출처 카페 > CrazyJava / 플그래머
원본 http://cafe.naver.com/autocrat/75

Vi 사용하기

Vi 시작하기

  • $ vi : vi 시작하기
  • $ vi aaa.txt : aaa.txt 파일을 편집하면서 vi 시작
  • $ vi -R aaa.txt : 읽기 전용으로 열기
Esc : 또는 /
편집상태
명령대기상태
(Esc모드)

명령줄상태
삽입명령어
i,a,A,I,o,O
Esc 또는 Enter
  • 명령대기상태 → 편집상태 : 삽입명령어 (아래참조.)
  • 편집상태 → 명령대기상태 : Esc글쇠.
  • 명령대기상태 → 명령줄상태 : : 또는 / (아래참조)
  • 명령줄상태 → 명령대기상태 : Esc 또는 Enter (아래참조)

커서의 이동

  • h, l, j, k : 왼쪽(←, Back space), 오른쪽(→, space), 위(↑), 아래(↓)
  • b, w : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동.
  • B, W : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동. (문장부호 무시)
  • e : 다음 단어의 끝 글자로 이동.
  • E : 다음 단어의 끝 글자로 이동. (문장부호 무시)
  • H, M, L : 화면의 맨 위/ 중간 / 맨 아래로
  • 0 : 그 줄의 맨 처음으로 (숫자 0이다.)
  • $ : 그 줄의 맨 끝으로
  • + : 다음 줄의 처음으로
  • - : 윗 줄의 처음으로
  • 3| : 현재 줄의 3번째 열로
  • 4H : 화면 상의 처음 줄부터 4줄 밑으로
  • 4L : 화면 상의 마지막 줄부터 4줄 위로
  • (, ) : 이전 문장의 시작으로 / 다음 문장의 시작으로
  • {, } : 이전 문단의 시작으로 / 다음 문단의 시작으로
  • [[, ]] : 이전 섹션의 시작으로 / 다음 섹션의 시작으로

편집 버퍼를 통한 이동

  • ^F, ^B : 한 화면 앞으로 / 뒤로 (^는 Ctrl글쇠를 의미.)
  • ^D, ^U : 반 화면 앞으로 / 뒤로
  • 4^B : 4화면 위로 이동
  • 4^F : 4화면 아래로 이동
  • 7^U : 7줄 위로 이동
  • 7^D : 7줄 아래로 이동
  • ^Y : 커서는 현재 위치 그대로 화면만 한 줄씩 아래로 이동
  • ^E : 커서는 현재 위치 그대로 화면만 한 줄씩 위로 이동

행 단위 이동

  • :0 : 파일의 첫 번째 행으로 가기 (숫자 0)
  • :10 : 10번째 행으로 가기
  • :$ : 파일의 마지막 행으로 가기
  • G : 파일의 마지막 행으로 가기
  • 10G : 10번째 행으로 가기

삽입명령어

  • i : 커서 위치부터 삽입 시작
  • a : 커서 위치 오른쪽부터 삽입 시작
  • A : 현재 줄의 맨 끝 부터 삽입 시작
  • I : 현재 줄의 맨 처음 부터 삽입 시작
  • o : 커서 아래에 행 삽입
  • O : 커서 위에 행 삽입

삭제명령

  • x : 현재 커서위치의 한 문자 삭제
  • X : 현재 커서 왼쪽의 한 문자 삭제
  • dd : 한 줄 지우기
  • 4dd : 4 줄 지우기
  • dw : 한 단어 지우기
  • d2w : 2 단어 지우기
  • D : 커서 오른쪽 행 삭제
  • :5 d : 5 째 행 삭제
  • :5,10 d : 5-10 째 행 삭제

파일의 저장 및 종료

  • :wq : 저장 후 vi 종료
  • :w : 저장 (종료는 하지 않고 계속 편집)
  • :q! : 저장하지 않고 vi 빠져나가기
  • :w filename : filename으로 저장 후 계속 편집
  • ZZ : 변경사항 저장 후 vi 종료

내용의 복사 및 이동

  • yy : 현재의 행 복사
  • 5yy : 현재의 행 위치부터 5행 복사
  • p : 아래(오른쪽)에 붙여넣기
  • P : 위(왼쪽)에 붙여넣기
  • f4yy : 현재의 행 위치부터 4행을 'f'라는 이름의 버퍼에 복사
  • fp : 'f'라는 이름의 버퍼에 복사된 내 용을 현재 행 위치에 붙여넣기
  • :3 co 7 : 3 행을 7행 다음으로 복사
  • :1,3 co 7 : 1-3 행을 7행 다음으로 복사
  • :3 m 7 : 3 행을 7행 다음으로 이동
  • :1,3 m 7 : 1-3 행을 7행 다음으로 이동

내용 고치기

  • J : 현재 행과 아래 행 결합
  • 3J : 3줄 합치기
  • u : 이전 명령 취소
  • cw : 단어 변경
  • cc : 행 변경
  • C : 커서 오른쪽의 행 변경
  • s : 커서가 위치한 문자열 대체
  • r : 한 글자만 변경 (입력 모드로 바뀌지 않음)
  • R : 입력하는 대로 겹쳐써서 변경
  • xp : 커서 위치 문자와 오른쪽 문자 교환
  • - : 문자형(대,소문자) 변경
  • U : 행 변경사항 취소
  • :u : 이전의 최종행 취소

명령 취소 및 반복

  • . : 마지막 명령 반복
  • 2. : 마지막 명령 2회 반복
  • u : 마지막 명령 취소
  • U : 현재 줄을 저장

행 번호 설정 및 화면표시

  • :set nu : 행 번호 표시
  • :set nonu : 행 번호 숨기기
  • := : 현재 줄번호 보여주기
  • :/pattern/ = : pattern이 위치한 줄번호 보여주기

시스템이 다운된 후에 파일 되살리기

  • vi -r : 되살릴 수 있는 모든 파일 이름 보여주기
  • vi -r file.txt : vi를 시작하여 지정한 파일 되살리기

다른 파일을 파일 내로 삽입

  • :r filename : 커서 다음에 파일 삽입
  • :20 r filename : 파일을 20번째 행 다음에 삽입

새로운 파일 편집하기

  • :e fine.txt : file.txt 편집하기
  • :e! : 현재의 편집중인 내용 무시하고 가장 최근에 편집한 내용 다시 편집하기

다중 편집하기

    % vi file1 file2 file3
    혹은
    :e file1 file2 file3
    했을 때,
  • :args : 편집 중인 파일목록 보여주기
  • :n[ext] : 다음 파일로 넘어가기
  • :prev[ious] : 이전 파일로 넘어가기 (단 편집 중인 파일이 저장되지 않으면 다음 파일로 넘어갈 수 없다.)

문자열 탐색

  • /aaa : 'aaa' 찾기 (현재 위치부터 뒤로)
  • ?aaa : 'aaa' 역방향 찾기 (현재 위치부터 앞으로)
  • / : 가장 최근에 검색한 문자열 다시 검색
  • ? : 가장 최근에 검색한 문자열 다시 역방향 검색
  • :set noh : 문자열 검색 후 문자열 강조 끄기

치환

vi에서 치환은 정규표현식이 이용된다. (실제로 이 상태에서 실행하는 명령어는 ed나 ex라는 프로그램이 처리하게 된다. 그래서 보통 이 상태를 "ed-모드"라고 한다.) 문서에서 원하는 패턴을 찾으려면 바로 위에 '문자열 탐색'에서 설명된 바와 같이 /문자열 이나 ?문자열 을 사용한다. 문자치환 명령은 다음과 같다.

[형식] :범위s/변경전/변경후/수정자  

'범위'는 명령이 실행될 범위(예: 10,20 이면 10행 부터 20행 까지)를 나타낸다. 's'는 치환(substitute)의 약자이며 '수정자'는 치환 명령의 세부사항을 결정한다. 필요한 것만 뒤에 적어주면 된다. (중복 가능)

  • g (global) - 한 줄에서 일치하는 부분을 여러개 찾았을 때 전부 치환한다. 이것을 사용하지 않으면 처음 것만 치환.
  • c (confirm) - 만족하는 정규표현식을 찾았을 때 치환하기 전에 확인한다.
  • i (ignore-case) - 대소문자를 구별하지 않는다.

"변경전"과 "변경후"에 치환할 내용을 입력한다. "변경전"에 정규표현식을 적는다. 정규표현식으로 ., *, ^, $, [], \(...\), \<...\>, POSIX.2 단축 표현을 사용할 수 있다. 여기서 여러 문자를 묶여서 단위를 만들고 찾은 내용을 기억하는 특수문자가 \(, \)임을 주의해야 한다. 반대로 (, )가 일반문자이다. vim(VI iMproved)에서는 vi에 추가로 |, +, (?와 같은) =, {n,m}을 사용할 수 있지만, 앞에 \ 를 붙여야 한다. 또, vim에는 \i, \k, \p, \s 등의 단축 표현들이 있다.

"변경후"에 \n & 를 사용할 수 있다. \n 는 "변경전"에서 n번째 \(...\) 에 대응하는 부분이고, & 는 "변경전"에 만족한 전체를 나타낸다. 예를 들어,
:%s/\([0-9][0-9]*\) \([Cc]hapter\)/\2 \1/
는 문서에서 12 Chapter같은 부분을 Chapter 12와 같이 치환하고,
:%s/F[1-9][12]*/&/g
는 HTML 문서에서 "F1" ~ "F12"란 단어 모두를 굵은 체로 바꿉니다. (주의! &는 정규표현식의 특수문자는 아니지만 vi의 특수문자이므로, 문자그대로의 &를 사용하려면 대신 \& 를 사용해야 한다.) 이외에도 (뒤를 모두 대문자로) \u 나 (뒤를 모두 소문자로) \l 같은 기능이 있다.

    :%s/aaa/bbb/g - 파일 전체(g)에서 'aaa'을 'bbb' 로 치환
    :%s/^M//g - 파일 전체(g)에서 ^M 을 삭제. ^M은 Ctrl+V+Enter로 입력한다.
    :s/aaa/bbb/ - 현재 행에서 'aaa'을 'bbb' 로 치환
    :1,10 s/aaa/bbb/ - 1행부터 10행 까지 'aaa'을 'bbb' 로 치환
    :1,. s/str/rep/ - 1부터 현재행까지 'aaa'를 'bbb' 로 전부 바꾸기
    :g/감자/s//바위/gc - 각 발생 확인 후 대체

주의할 점은 치환명령어가 / 문자로 각 부분을 구분하기때문에 "변경전"이나 "변경후"에 / 문자를 사용하려면 \/ 같이 써야한다.
필요하다면 / 대신 다른 문자를 사용해도 된다. 예를 들어,
:%s/\/usr\/local\/bin\//\/usr\/bin\//g
대신
:%s#/usr/local/bin/#/usr/bin/#g
가 알아보기 더 쉽다.



출처 블로그 > 오순도순
원본 http://blog.naver.com/putter/20757276

vi 환경에서 코딩 작업 등을 할때 사전에 설정해 두면 편리한 기능 들을 정리 해 보았습니다.

1. ": set" 으로 변경

   :set ai (autoindeant)

   --> 윗라인과 같이 자동으로 들려쓰기를 해 줍니다.

  

   :set ts=4 (tabstop)

   --> [tab] 키를 입력 하였을때 이동하는 크기를 조정 합니다.

         (보통 "ts=4" 일때가 가장 적당한 듯 합니다.)

   :set et (expandtab)

   --> [tab] 키를 입력 하였을때 tab에 대당하는 space 만큼 이동 됩니다.

         (Python 언어 코딩 할때 매우 편리 합니다.)

   :set si

   --> 코딩 할때 if, for 같은 것을 입력 하고 다음 라인으로 이동시 들려쓰기를 해줍니다.

   :set sw=4 (shiftwidth)

   --> "set si" 했을 경우 들려쓰기 하는 깊이를 설정 합니다.

   :set encoding=cp949 or utf-8

   --> 작업 하는 컴퓨터 또는 개발 언어에서 기본 인코딩 타입을 설정 할 수 있습니다.

[참고]

* 알고 있겠지만 모든 명령의 취소는 no를 앞에 붙여 주시면 됩니다. 예)  :set noai


* 항상 같은 설정이 되도록 하려면 UNIX는 홈디렉토리 아래에 .vimrc 에 넣어 주시구요

    windows 는  vim 설치 디렉토리에 _vimrc 파일에 넣어 주시면 됩니다.

   예) set ts=4

        set si

        set ai

        set sw=4

        set encoding=cp494



2. vi 편집 작업시

1) 화면 스크롤

   ^F : 한 화면 앞으로 스크롤

   ^B : 한 화면 뒤로 스크롤

   ^D : 반 화면 앞으로 스크롤

   ^U : 반 화면 뒤로 스크롤

   ^E : 한줄 앞으로 스크롤

   ^Y : 한줄 뒤로 스크롤

    H : 화면의 맨 윗줄로

    M : 화면의 중간 줄로

     I : 화면의 맨 아랫줄로

 

2) 화면 나누기

   : vs  수직으로 나눔

   : sp  스평으로 나눔

   * 화면간 이동은 ^ww

3) 마크 이동

  m[a~z] --> 현재의 위치를 기록

  '[a~z] --> 기록한 위치로 이동


4) 접기

  V 로 블럭 설정을 한후에 'zf' 하면 접힘

  'zo' 를 하면 다시 펴짐


5) 함수/변수명 자동 완성

   호출 하고자 하는 변수명이나 함수명의 앞글자만 쓰고서 ^p 를 입력 하면 자동 완성 됨


6) 잠시 쉘로 나가기

    ^z, 들어 올때는 fg



기본 명령어는 기술 하지 않았으며, 잘 알려지지 않았고 알면 편리한 기능 위주로 정리 했습니다.

상세한 정보는 기존에 스크랩 해놓은 자료나 vim.org 에서 확인 하시기 바랍니다.


작성 : 마그마(필명)


아래 웅자꺼를 쓸려면 프로그래밍 코딩 시 해당 코드가 활성화 되지 않는다. 이유는 vim 버전이 라이트버전이라서 기본적인 기능들만 포함되어져 있다.

$ sudo apt-cache search vim-full

$ sudo apt-get install vim-full

$ vi .vimrc

syntax on

추가하면 된다.




웅자가 쓰는 vimrc.

set nocompatible " VI 오리지널과 호환하는 모드를 사용하지 않음(VIM확장)

set number " 라인번호를 붙임

set backspace=indent,eol,start " BS로 라인끝과 처음 자동들여쓰기한 부분을 지날수 있음

set tabstop=4 " 탭문자는 4컬럼 크기로 보여주기

set shiftwidth=4 " 문단이나 라인을 쉬프트할 때 4컬럼씩 하기

set autoindent " 자동 들여쓰기

set visualbell " Alert 음을 화면 깜박임으로 바꿔보여주기

set laststatus=2 " 최종상태 2개 기억하기

set statusline=%h%F%m%r%=[%l:%c(%p%%)] " 상태표시줄 포맷팅

set hlsearch  " / ? 명령 등으로 찾은 문자열을 하일라이트 해준다.

syntax on " 적절히 Syntax에 따라 하일라이팅 해주기

set background=dark " 이건 터미널 모드에선 영향이 없다.

set hi=1000 "명령어 기록을 남길갯수 지정

set hlsearch " / ? 명령 등으로 찾은 문자열을 하일라이트 해준다.

set bs=indent,eol,start " 백스페이스 사용



set ru " 커서의 위치를 항상 보이게 함.

set ts=8 "탭 길이

set sts=4 "들여쓰기 탭 간격

set sw=4 " 들여쓰기 탭 간격

set noet " 탭 -> 공백 변환 기능 (사용 안함)

set sol "여러가지 이동 동작시 줄의 시작으로 자동 이동

set hls "검색어 강조 기능

set scs "똑똑한 대소문자 구별 기능 사용


imap <F2> <C-X><C-O>

map <F3> :set paste<CR>

map <F4> :set nopaste<CR>

vmap <F5> :norm i// i;<CR>

vmap <F6> :norm xx<CR>

vmap <F9> zf

map <F10> zo

map <F11> zc

map <C-b> :tabprevious<CR>

map <C-n> :tabnext<CR>

map <F12> :tabnew<CR>:e .<CR>

2006/09/08 15:58 2006/09/08 15:58
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 15:57
출처 블로그 > maxoverpro 블로그
원본 http://blog.naver.com/maxoverpro/140008222477

/etc/rc.d/rc3.d/S22nospoof에 위치시키고 방화벽 또는 라우터에 설치

/etc/rc.d/init.d/S22nospoof로 연결

#/bin/sh

#Turn on Source Address Verification on all interface

if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then

   echo -n "Enabling IP spoofing blocking..."

   for f in /proc/sys/net/ipv4/conf/*/rp_filter; do

       echo 1 > $f

   done

   echo "done"

else

   echo "ERROR : CANNOT SET UP IP SPOOF BLOCKING!"

   sleep 30

fi

2006/09/08 15:57 2006/09/08 15:57
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2006/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)