perl에 관하여 논문 형식으로 작성한 것이다.

 

대표적인 짜집기 논문이다 -0-;; 이러면 안되는데.. 후

 

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

 

문자열 처리 전문가 Perl


오치환*

*동명정보대학교 컴퓨터공학과


Specialist Perl at String Handling


Chy-Hwan Oh*

*Department of Computer Engineering, Tong-Myong University, Busan , Korea


요    약 : 본 논문에서는 Perl에 관하여 논한다. 특히 Perl은 문자열을 다루는데 최고의 언어라고 할수 있다. Perl에 관하여 알아보고, 사용 되는 분야에 대해서 논할 것이다. 그 중 문자열 처리에 관한 부분에 집중하여 논한다.


핵심용어 : 문자열 처리, perl


ABSTRACT :  In this paper, We describe about Perl. Especially perl is the best language for string handling. We inquire out perl and talk about where it using. Among them, We describe about String Handling


KEY WORDS : String handling, perl

1.서론

 Perl(Practical Extraction and Reporting Language)은 임의의 형태를 갖춘 텍스트 파일을 읽고, 이 파일에서 의미있는 정보를 추출하여 이 정보를 근거한 레포트를 출력하는 제반 작업에 최적화된 언어이며, 시스템 관리에도 매우 적절한 언어이다.

또 perl은 아름다운 언어보다는 실용적인 언어를 지향한다. perl은 (이 언어의 개발자가 말하기를) C, sed, awk 그리고 sh와 같은 언어나 프로그램들의 가장 좋은점들을 취합한 언어이므로, 이 언어, 프로그램들에 익숙한 사람들이라면 perl 사용에도 역시 큰 어려움을 느끼지 않을 것이다. (컴퓨터언어 사학자라면 perl의 문법이 아마 csh이나 Pascal 혹은 BASIC-PLUS와도 닮았다고 생각할 것 같다.)

문장구조는 C 언어와 상당히 흡사하다. 대개의 Unix용 프로그램들과는 달리, Perl은 우리가 사용할 데이터 크기에 한계를 두지 않는다. 메모리만 충분하다면 한 파일의 내용 전체를 변수하나에 넣을수 있다.. 재귀(Recursion)는 무제한 반복될 수 있다. 해쉬(혹은 조합배열)에서 사용하는 테이블은 성능저하를 일으키지 않으면서 무한대로 커질 수 있다. Perl은 섬세한 패턴일치(pattern matching) 기술을 이용하여 많은 양의 데이터를 빠르게 검색할 수 있다. 비록 텍스트 검색에 최적화되어 있긴하지만 이진데이터도 다룰 수 있으며 해쉬와 같은 형태의 dbm 파일도 만들어낼 수 있다. 또 setuid를 사용하는 스크립트의 경우 C 프로그램에서 사용하는 것보다 안전한데, 데이터 흐름을 추적하는 메커니즘이 말도 않되는 대부분의 보안상의 빈틈을 막아주기 때문이다.


만일 sed나 awk, sh (혹은 bash)를 사용한 프로그램을 만들어 문제를 풀어 나갈 때, 그 문제가 이런 프로그램의 능력으로는 극복하기 어렵다거나, 혹은 프로그램이 좀 더 빨랐으면 하는데, C언어를 사용해서 어리석게도 시간낭비를 하고 싶지 않다면, Perl이 해결책을 줄 것이다. 참고로, sed나 awk 스크립트를 Perl 스크립트로 바꿔주는 변환기들을 (인터넷에서) 찾을 수 있다.

Perl은 더구나 HTML이나 사용자입력과 같은 텍스트를 다루는데 아주 강력한 기능을 가지고 있으므로 문자열 위주의 데이터를 다루기에는 최적의 언어라 할 수 있으며, UN*X, MVS, VMS, MS-DOS, Macintosh, OS/2, Amiga, Windows NT 등 여러 가지 Operating system에 Porting되어 있으므로 소스파일의 이식성이 뛰어나다.

또 Perl은 강력한 사용자층을 가지고 있다. GURU급의 사용자, 개발자로부터 초보자에 이르기까지 Perl의 확장과 사용에 많은 시간과 정렬을 제공하는 사용자들이 CPAN의 많은 모듈을 만들고, 사용하고 고쳐나가면서 Perl의 발전에 힘쓰고 있다. 이 개발자, 사용자층이 있는 이상, Perl은 계속해서 발전할 것이다.

C, C++같은 언어를 써보면 그 언어에서 문자열과 메모리의 관리가 얼마나 짜증나는 일인지 안다. Perl은 그런 복잡한 것이 없다. 즉, 언어의 관리 보다는, 언어의 유용성에 초점을 맞춘 언어이다.

Perl은 무료이다. Perl을 빛내주는 모듈들도 99.9999%가 무료이다. 그리고 많은 프로그램들이 무료로 제공되고 있다.


1993년부터 시작해서 Perl 버젼 5는 거의 완전히 새로 만들어졌고, 그로 인하여 다음과 같은 내용들이 추가되었다.

- 수많은 모듈들을 이용한 모듈화(modularity)와 재사용성(reusability) : 이는 라이브러리를 좀 더 효율적으로 사용할 수 있는 방법이다.

- C 언어의 한부분으로 사용하거나, C 언어를 이용하여 확장 가능.(embeddable and extensible)

- 다른 데이터(DBM같은)를 변수에 통합하여 변수를 조작하는 것으로 원래의 데이터를 조작할 수 있는 기능. (roll-your-own magic variables (including multiple simultaneous DBM implementations))

- 서브루틴으로 내장 함수 재선언(override)하기. 서브루틴의 동적인 선언(autoload). 프로토타이핑.

- 단순한 scalar, 배열, 해쉬이상의 복잡한 데이터 구조와 익명의 함수. (arbitrarily nested data structures and anonymous functions)

- 객체지향적 프로그래밍(object-oriented programming)

- C 코드 또는 Perl 바이트코드로의 변환(compilability into C code or Perl bytecode)

- 쓰레드 지원(support for light-weight processes (threads))

- 국제화, 지역화, 유니코드(support for internationalization, localization, and Unicode)

- 변수의 사전적 범위지정(lexical scoping) - my 연산자를 이용한 변수의 접근범위 제한.

- 향상된 정규식(regular expression enhancements)

- 향상된 디버거와 내장 편집기를 사용하여 사용자와 상호작용 하는 환경 (enhanced debugger and interactive Perl environment with integrated editor support)

- POSIX 1003.1 호환 라이브러리(POSIX 1003.1 compliant library)


2. 사용분야

perl은 한 때 HTTP, HTML이 부상하면서 CGI를 위한 언어로 각광 받았다. 하지만, CGI로서의 역할은 PHP와 같은 언어나, JSP, ASP 등의 등장으로 미미해진다.

그러나, 웹의 부상과 CGI로서의 역할이라는 다소 표면적이고 번지르르한 허명뒤에는 또 다른 역할이 있었다.(물론 아직도 꼭 CGI가 필요한 곳에서는 막강한 힘을 발휘하고 있다. Apache 서버의 mod_perl이 바로 그 중 하나일 것이다.)

그 것이 바로 "관리"를 위한 역할이다. 관리는 시스템 관리만을 위한 것이 아니다. 시스템 관리는 물론이고, 데이터 관리, 웹 관련 관리 등 다양한 관리를 포함한다.


웹 관련 관리에 관해 간단히 말해 보자면, 실제적인 사용자와의 인터페이스는 다른 언어에 맡긴다지만, 가장 쉽게 생각할 수 있는 perl의 또 다른 역할이 웹사이트의 방문기록을 분석하는 것이다. 웹의 방문기록을 counter 프로그램을 이용하여 저장한다면, 그것은 약간 비효율적이다. 그 보다는 Log 파일에 저장된 내용을 추후에 분석하는 것이 대개는 좋다. 이럴 때 perl을 사용하면 일이 매우 쉬워진다. 다른 언어로 하기는 비효율적일 것이다. 왜냐하면 문자열을 다루는 데에는 perl이 최고이기 때문이다. 또, 만일 어떤 페이지의 내용이 30분이나 1시간에 한 번씩 바뀌어야 한다면(날씨관련 사이트처럼), 혹은 하루에 1, 2번 바뀌어야 한다면, perl을 이용하는 것이 가장 좋을 것이다. 주기적으로 어떤 조건에 따라서 새로운 페이지를 생성하여 HTML로 저장한 다음 사용하는 것이, 매번 php나 jsp를 이용하여 생성하는 것보다는 훨씬 경제적이고 속도도 많이 빠를 것이다. 서버가 아닌 클라이언트의 입장이 될 수도 있다. 어떤 페이지를 주기적으로 다운로드 받아서 분석한 후 데이터로 저장해야 한다면, 최고의 문자열처리 언어인 perl을 이용하는 것이 좋을 것이다. 게다가 대상 페이지가 자주 변하는 것이라면 융통성있는 perl이 막강한 힘을 부여해 줄 것이다.


시스템 개발에서도 prototype 언어로 활용할 수도 있고(예를 들어 메일 서버를 구현하기 전에 perl로 실제로 구현해 보고, 이를 C와 같은 언어로 porting 하는 경우), 다른 언어의 code 생성에 template 기반의 tool로 사용할 수도 있는 등 그 쓰임새가 엄청나다.


3. Perl as language

본 장에서는 perl 의 기초문법에 대해 알아본다.


3.1. 펄의 데이터 타입 및 특수변수

3.1.1 Perl

1986년 Unix 프로그래머인 Larry Wall이라는 사람이 자신이 맡은 업무를 보다 쉽게 처리할려고 하는 과정에서, 자신의 일을 해결할수 있는 가장 간결하고 적합한 유틸리티를 만들게 되었다, 그래서 그는 새로운 프로그래밍 언어를 발명하게 되었고, 그후 펄이란 이름으로 빠르게 번져나갔다고 한다.


3.1.2 Date Type

펄의 데이터 타입은 스칼라(scalars), 배열(arrays), 결합형 배열(associative arrays) 이렇게 세가지가 있다.

그리고, 모든 변수명을 대소문자를 구별한다. $temp와 $Temp는 서로 다른 변수가 된다.


3.1.2.1 스칼라(Scalars)

펄은 다른 언어와는 달리 모든 수와 문자열을 이 스칼라로 표현한다.

스칼라 변수명은 '$'표로 시작한다.


    $a = 2 ; - 숫자

    $b = "test" ; - 문자

    $temp = "My name is Soo" ; - 문자열


3.1.2.2 배열(Array)

스칼라의 집합을 배열이라 하며, '@'표시로 시작한다. 다음과 같이 괄호안에 ',(쉽표)'로 각 변수는 구별된다.


    @name = ("chanho", "unicorn", "jongbum", "Hongsun") ;

    @id = (1234, "unisoo", 0987) ;


또한 배열안에 또 다른 배열이 정의 될수 있다.


    @a = (1, 2) ;

    @b = (3, 4) ;

    @c = (@a, @b) ;

   

이렇게 하면 @c에는 1, 2, 3, 4의 값을 가지게 된다.

여기서 주의할 것은 배열을 스칼라에 할당 했을 경우이다.


    @a = (1, 2) ;

    @b = @a ; <-- @b는 당연히 1, 2의 값을 가지게 된다.

    $c = @a ; <-- $c는 1, 2 의 값이 아닌 2의 값을 가지게 된다.

    $c는 array내의 값을 가지는 것이 아니라, array 내의 값들의 개수를 가진다.

만일 배열내의 임의의 값에 접근하고자 할경우는,


    @a = ("name", "school", 4, "Korea") ;

    $temp1 = $a[0] <-- name

    $temp2 = $a[3] <-- Korea 의 값을 가지게 된다.


배열은 0번째부터 값을 가지게 된다. 그러니깐 위 경우는 값이 4개이므로 $a[0]은 'name'이 되고, $a[1]은 'school'이 되고, $a[2]는 '4'가 되고, $a[3]은 'Korea'의 값을 가지게 된다.


3.1.2.3 결합형 배열(Associative Arrays)

이 결합형 배열은 위의 배열과는 조금 다른 모습을 가진다. 위의 배열은 그냥 값만 가지는것에 비해, 결합형 배열은 키(key)와 이 키에 대응하는 값을 가진다. 결합형 배열은 '%'표시로 시작되며, 다음과 같다.


    %animal = ("name", "ppoby", "number", "two", "race", "jabjong") ;


이렇게 표현되어 지며, 배열의 각 요소들에 접근하기 위해서는


    $temp = $animal{"name"} ; <-- 'ppoby'

    $temp_1 = $animal{"number"} ; <-- 'two'

    $temp_2 = $animal{"race"} ; <-- 'jabjong' 의 값이 할당되어 진다.

즉 위의 예에서, 'name은 ppoby를 number는 two를 race는 jabjong' 과 쌍을 이루게 된다. 다시 말해서 위의 배열에서 키는 'name, number, race'가 되고, 각 키의 값으로는 'ppoby, two, jabjong'이 되는 것이다.


3.1.3 특수 변수(Special Variables)

여기서는 펄에서 대단히 많이 쓰이는 변수 몇가지만 소개하기로 한다.


3.1.3.1 환경 변수(Environment Variables) - %ENV

이 변수는 환경 변수를 가지고 있는 결합 배열이다. 이 변수를 이용해서 아주 쉽게 환경 변수의 내용을 얻을 수 있다. 폼으로 부터 보내어진 데이터나, 접속한 사용자의 브라우져 정보, 클라이언트의 IP 주소, 자신의 서버가 사용하고 있는 웹 프로토콜의 버젼 등 쉽게 그 정보를 얻을수 있다.

사용 방법은


    $ENV{'원하는 환경변수'} ;

    $temp = $ENV{'REMOTE_ADDR'} ; 접속한 사람의 IP주소를 알수 있다.

자주 쓰이는 변수를 정리해 보았다.

CONTENT_LENGTH

 폼과 함께 제출된 데이터 내용의 바이트 수

CONTENT_TYPE

 폼과 함께 제출된 데이터 내용의 타입

HTTP_USER_AGENT

 웹 브라우져 소프트웨의 버젼

PATH_INFO

 요청과 함께 웹 서버로 보내어진 경로

QUERY_STRING

 폼 제출로 부터 데이터를 담고 있는 문자열

REMOTE_ADDR

 클라이언트의 IP주소

REMOTE_HOST

 클라이언트의 호스트 이름

REQUEST_METHOD

 스크립트를 호출하는 방법(GET, POST)


3.1.3.2 프로그램 인자 - @ARGV

펄 명령 라인 내에서 지정된 인자들은 특수 배열인 @ARGV를 통해 펄 스크립트 내로 전달 되어 진다.


3.1.3.3 현재 라인 - $_

특수 변수 '$_'는 입력의 현재 라인을 저장한다.


3.1.3.4 $(숫자) - $1, $2, $3 .....

특수 변수 $n는 패턴에 의해 매칭된 변수를 저장할 때 사용 되어진다. 첫번째 매칭된 문자열은 $1에, 두번째 매칭된 문자열은 $2에... n 번째 매칭된 문자열은 $n 에 기록 된다.


3.2. 제어문, 파일제어

3.2.1 연산자(Operator)

우선 Perl에서 쓰이는 대표적인 논리적 연산자에 대해서 알아보겠다. 논리적 연산자로는 ||(or) 와 &&(and)가 있다.

이 두개의 연산자는 양쪽에 오는 값에 따라 참, 또는 거짓의 값을 되돌린다.

||(or)

|| 연산자는 '또는' 이란 뜻으로, 'A || B' 일 경우 'A 또는 B 가 ...' 라는 뜻이 되며, A,B 두 값중 하나만 참이 되더라도 전체의 값은 참이 된다. 두개의 값이 모두 거짓일 경우 전체의 값이 거짓이 된다.

&&(and)

&& 연산자는 '그리고' 이란 뜻으로, 'A && B' 일 경우 'A 그리고 B 가 ...' 라는 뜻이 되며, A,B 두 값중 하나만 거짓이 되더라도 전체의 값은 거짓이 된다. 두개의 값이 모두 참일 경우 전체의 값이 참이 된다.

그리고 이 두개의 연산자는 이런 비교의 경우가 아닌, 펄 문장들을 결합시키는 역할 또한 합니다. 이때 '||'연산자는 '그렇지 않다면..' 이 되고 '&&' 연산자는 '그렇다면..' 으로 해석될수 있다.

    $value > 5 || print "값이 너무 작습니다.";

    $value < 5 && print "값이 너무 작습니다.";

   

이 두 문장 모두 같은 역할을 하는데,

위의 예는 'value의 값이 5보다 크지 않다면...' 이 되고,

아래의 예는 'value의 값이 5보다 작다면....' 이 된다.


3.2.2 제어문(Flow Control)

Perl 에서 쓰이는 대표적인 제어문은 while, foreach, if등이 있고, 그 외에 until, for, unless등이 있다.


3.2.2.1 while

while()은 ()내의 조건문이 거짓이 될때 까지 문장을 반복 수행한다.


    $n=100;

    while ($n > 0) {

        print "$n\n";

    }


3.2.2.2 foreach

foreach 문은 배열을 처리할때, 아주 유용하다. foreach 다음에 오는 배열이 널값(아무런 값도 없을때)일때 까지 문장을 수행한다.


    @name = ("Kim", "young", "soo");

    foreach $temp(@name) {

        print "$temp\n";

    }


위 문장에서 $temp 변수는 처음에는 'kim'의 값을 가지며, 두번째는 'young'의 값을, 세번째는 'soo'의 값을 가지며, 네번째에서 $temp는 널값을 가지게 되므로 루프를 종료하게 된다.

@name 배열 값의 개수가 1000개라 하더라도, 위 3줄의 예로써 모든 @name 의 값을 출력할수 있다.



3.2.2.3 if... elsif.... else

if 문은 '만약 조건문이 참이라면' 의 뜻이 된다.

if... elseif.... else 가 모두 쓰인 상태라면, if(만약 이것이 참이라면...) elsif(그렇지 않다면....) else(위의 두 개 모두 아니라면...) 이런 식으로 쓰인다.


    $temp = 5;

    if ($temp == 5) { print "temp is $temp"; }

    elsif ($temp == 3) { print "temp is $temp"; }

    else { print "Not found temp"; }


3.2.2.4 조건부 표현 (Conditional Expression)

그럼 여기서 펄에서 쓰이는 관계형 연산자에 대해서 알아보겠다.


    같 음                ==  eq

    다 름                !=  ne

    부호를 가지는 다름  <=>  cmp

    보다 큼              >   gt

    보다 크거나 같음     >=  ge

    보다 작음            <   lt

    보다 작거나 같음     <=  le


3.2.3 파일 제어

여기서는 펄에서 파일의 접근에 대한 방법을 알아 보겠다. 펄에서 파일을 열기 위해 쓰는 명령어는 open()이 있다. 물론 사용하신 다음에는 close()로 닫아야한다. 여기선 텍스트 파일에 대한 이야기를 하겠지만, dbm 파일을 이용할수 있는 dbmopen()과 dbmclose()도 있다.


3.2.3.1 open(), close()

 open() 함수는 새로운 파일 핸들을 어떤 파일에 연계시키기 위해서 사용한다.


 open(FILE, "> /etc/guest.txt");

 close(FILE);

 open(FILE, ">> /etc/file.log");

 close(FILE);


이렇게 사용 될수 있다. 위 예에서 'FILE'은 새로운 파일 핸들이고, '.../filename'은 사용 할려고 하는 파일명이다.

그리고 `` '' 안의 파일명 앞에 여러가지 기호가 쓰이는데, 이것은 파일에 접근 방법을 지정할수 있다.


    '<'   읽기를 위한 파일 열기(기본값)

    '>'   쓰기를 위한 파일 열기

    '>>'  이어쓰기를 위한 파일 열기

    '+C<' 읽기와 쓰기를 위한 파일 열기

    '+>'  읽기와 쓰기를 위한 파일 열기

    '|'   (파일 이름 앞) 파일을 명령(펄에서 파일로 전송)처럼 다룬다

    '|'   (파일 이름 뒤) 파일을 명령(파일에서 펄로 전송)처럼 다룬다


open() 함수로 파일을 열었으면, 반드시 close() 함수로 닫아야 한다. 그리고 open (파일핸들, ``파일제어기호 파일명(경로포함)''); 에서 파일제어기호 와 파일명에는 콤마등의 기호가 없다.



3.3. 정규표현, 패턴매칭

3.3.1 정규 표현(Regular expression)

정규 표현(regular expression)은 일반화된 문자열을 설명하기 위한 규칙의 집합이다.

어떤 문자열이 정규 표현의 규칙을 따르고 있다면, 그 정규 표현은 그 문자열을 매치(match)한다고 한다.

예를 들면, 정규표현 'b.'는 문자열 'observe, body, abc'와는 매치를 이루고, 'b, Bell, Bob' 와는 매치하지 않다. 이 표현 'b.'는 '소문자 b가 문자열 내에 있어야 하며, 다른 문자가 뒤에 한 개 이상 있어야 하기(단,\n는 예외)' 때문이다.

펄에서는 많은 정규 표현들이 있는데, 그것들을 정리해 보았다.


3.3.1.1 정규표현 어써션(Assertions)


    기호   매치 영역            매치      매치함    매치안

    ----------------------------------------------------------------------------        '^'    문자열의 시작부분   ^fool      foolish   tomfoolery

    '$'    문자열의 끝 부분     fool$      April    fool foolish

    '\b'   단어 영역            be\bside    be       side beside

    '\B'   비단어 영역        be\Bside   beside    be side


3.3.1.2 정규표현 아톰 퀀티파이어(Quantifiers)


    기호      매치 영역           예     매치함    매치안함

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

    '*'     없거나 하나 이상     ab*c    ac, abc       abb

    '+'       하나 이상         ab+c     abc         ac

    '?'       없거나 하나         ab?c      ac, abc       abbc

    '{n}'     n개 만큼           ab{2}c      abbc      abbbc

    '{n, }'   적어도 n개 만큼   ab{2,}c    abbc, abbbc   abc

    '{nm}' 적어도 n개, 많아야 m개 ab{2,3}c   abbc, abbbc   abbbbc


3.3.1.4 특수문자(Special Characters)


    기호   매치 영역                예     매치함 매치안함

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

    '\d'   숫자                     b\dd   b4d    bab

    '\D'   비숫자                   b\Dd   bad    b4d

    '\n'   새 라인(줄바꿈)      

    '\r'   캐리지 리턴      

    '\t'   탭      

    '\f'   폼 피드      

    '\s'   공백 문자      

    '\S'   비공백 문자      

    '\w'   알파벳이나 숫자                 a\wb   a2b    a^b

    '\W' 알파벳이나 숫자를 제외한 문자  a\Wb   aa^b   aabb


3.3.2 매 칭(Matching)

위의 표현들은 펄 프로그래밍시 매우 많이, 그리고 매우 유용하게 쓰인다. 보통 매치 연산자는 두개의 '/'로 둘러싸인 정규표현으로 구성된다. 그리고 특수연산자 '=~'는 첫번째 값과 두번째 값이 매치하는지에 따라 참과 거짓으로 평가 한다.


    예) $filename =~ /dat$/ && die "Can't use. dat files. \n";

   

이 예의 뜻은 만약 $filename의 끝 문자열이 'dat'로 끝나지 않는다면 'die ~ '해라라는 뜻이 된다.


연산자 '!~'는 '=~'의 반대개념이다.


    예) $ENV{'PATH'} !~ /perl/ && warn "Not sure if perl is in your path...";

   

perl의 경로가 $ENV{'PATH'}와 매치되지 않는다면.... 의 뜻이 된다.


3.3.3 대 치(Substitution)

대치는 쉬우면서 강력한 기능을 제공한다. 대치 연산자는 '/.../.../' 를 사용한다. 첫번째와 두번째 '/'에 대치될 패턴이 오게되고, 두번째와 세번째 '/'에 대치할 패턴이 오게 된다.


    예)$name = "Kimyoungsoo";

       $name =~ s/Kim/Unicorn/;

       $name의 'Kim'을 'Unicorn'으로 대치하게 된다.


4. 문자열 처리에 관한 Perl 사용 예제

본 장에서는 perl을 이용 하여 문자열을 처리하는 방법들에 대해서 자세히 알아 본다.


4.1. 다른 프로그램을 실행시켜 출력내용 읽기

다른 프로그램을 실행시키고 그 출력 내용을 읽는 방법은 여러가지가 있다.


4.1.1. Backtick


역따옴표(`...`)는 그 안에 들어있는 내용을 shell을 통해 실행하고, 표준출력(STDOUT)으로 출력되는 내용을 반환한다. 따라서,


$content = `cat /etc/passwd`;


는 passwd 파일을 간단히 읽어들인다.

물론, 단순한 파일을 읽는데는 직접 open을 해서 읽어들이는 것이 좋다. 역따옴표를 사용하게 되면, 그 내부의 프로그램을 실행하기 위해서 별도의 프로세스가 생성되어야 하기 때문에 그만큼 시스템의 자원을 소모하게된다.


4.1.2. open 함수를 이용하는 방법


open 함수에서 파일이름분에 > 대신 | (파이프)기호를 뒤에 붙이면 해당 파일이름을 실행시키고 그 출력내용을 읽을 수 있다.


#!/usr/bin/perl

# prog.pl

print "$$\n";

warn "Exiting\n";



#!/usr/bin/perl

# opener.pl

$p = open(RUN, "./prog.pl |") || die $!;

@out = <RUN>;

close RUN;


print "opener: $p\n";

print map { "opener: $_" } @out;


opener.pl에서 prog.pl을 "./prog.pl |"와 같이 하여 열었다.(open)

그 후 일반 파일 읽기에서 하는 것처럼 <RUN>를 이용하여 출력내용을 읽는다. 참고로, open 함수가 반환하는 것은, 프로그램이 제대로 실행되었을 때, 새로운 프로세스의 프로세스 아이디이다.

만일 이 프로그램이 오랜시간동안 살아 있는 것(웹서버처럼)이라면 close를 하지 않을 경우 문제가 될 수 있다. 예를 들어, open은 계속해야 하는데, close를 해 주지 않는다면, 해당 프로세스가 죽지않고 계속 남아서 시스템자원을 차지하고 있어서 결국 시스템이 멈추는 상황이 발생할 수도 있게된다.

따라서 반드시 close를 해 주어야 합니다.

만일 표준에러(STDERR)까지 같이 읽어야 한다면


#!/usr/bin/perl

# prog.pl

print "$$\n";

warn "Exiting\n";



#!/usr/bin/perl

# opener.pl

$p = open(RUN, "./prog.pl 2>&1 |") || die $!;

@out = <RUN>;

close RUN; #


print "opener: $p\n";

print map { "opener: $_" } @out;


와 같이 2>&1를 추가합니다.


4.2. 문자열 안에 실행문 넣기

문자열 내에 실행문을 직접 삽입할 수 있다.

보통의 print 문에서는

print "수익대 비용 차액 : " . ($income - $outcome) . "\n";


와 같은 식이다.

만일 print문 안에 이런 계산식이 많이 들어가야 한다면, 조금 귀찮을 수도 있다. 이런 경우 문자열 내에 계산식을 직접 삽입하는 것이 간편하겠다고 생각되면 다음과 같은 형식을 사용한다.

print "수익대 비용 차액 : ${ \($income - $outcome) }\n";


문자열 내에서 ${스칼라변수리퍼런스}는 그 리퍼런스가 가리키는 변수의 값을 나타낸다. 예를 들면 다음과 같은 경우이다.

$var = 365;

$rvar = \$var;

print "var = ${$rvar}\n"; # 이 경우라면 "var = $$rvar\n"도 같은 결과이지만, 설명을 위해 위 ${ \($income - $outcome) }는 ${ }의 안에 \($income - $outcome)을 가지고 있다. 목록(list)을 나타내는 괄호앞에 \(백슬래쉬)를 두면 목록의 각 요소에 대해 리퍼런스를 만드는 것과 같다. 그래서

$what = \( $a, $b, $c )

$what = ( \$a, \$b, \$c );

와 같게 되고, 스칼라 문맥에서 목록이 사용되면 맨 뒤의 것만 사용되게 되어 맨 마지막 요소인 $income - $outcome의 결과 값에 대한 리퍼런스가 ${ }와 함께 사용되어 계산값이 출력 되는 것이다. 맨 마지막 값이 사용되는 것을 직접 확인하려면 괄호의 앞부분에 다른 값을 넣고 컴마로 구분해 보면 된다.

print "수익대 비용 비율과 차액 : ${ \($outcome / $income, $income - $outcome) }\n";


이 경우 $outcome / $income 부분은 사라져 알 수 없다.

배열 역시 문자열 안에 넣을 수 있다. 문자열 내에서 배열리퍼런스의 사용은 @{배열의리퍼런스}의 형식이다. 물론 "@$array_ref"와 같은 맥락이다.

print "수익대 비용 비율과 차액 : @{ [ $outcome / $income, $income - $outcome ] }\n";


이 경우에는 \() 대신 []를 사용한다. []는 이름없는 배열(anonymous array)의 레퍼런스를 나타낸다.


4.3.  첫 글자는 대문자로, 나머지는 소문자로 바꾸기

영문 문자열의 첫글자만 대문자로 만들고, 나머지는 소문자로 만드는 법이다. 사용자의 입력을 받았을 때, 다양한 사용자의 입력 습관을 무시하고, 적절히 바꾸는 방법중 하나라고 생각된다.

쌍따옴표를 사용할 때, \n이 개행문자(new line)로, \t가 탭문자로 사용된다는 것을 알 것이다. 이 외에도 다양한 특수문자들이 있다. 그 중에는

\U : 문자열의 끝 또는 \E가 나올 때 까지 모든 문자를 대문자로 바꿈

\L : 문자열의 끝 또는 \E가 나올 때 까지 모든 문자를 소문자로 바꿈

\u : 바로 다음의 문자만을 대문자로 바꿈

\l : 바로 다음의 문자만을 소문자로 바꿈

과 같은 특수문자들이 있다. 이 특수문자들을 이용하면, 원하는 바를 이룰 수 있다.

$str = "what A wAnderful Day!";

$badstr  = "\u$str";   # What A wAnderful Day!

$goodstr = "\u\L$str"; # What a wanderful day!


$badstr의 경우는 굳이 설명이 필요없지만, 자칫하면 위와 같이 생각할 수 있다. (사실 프로그래머는 사용자의 입력을 ``예단''하는 수가 상당히 많다)

$goodstr은 일단 \L로 모든 문자들을 소문자로 바꾼후에 \u로 첫 문자만 대문자로 바꿔주었다.


4.4. 문자열의 맨 처음과 맨 뒤의 공백 없애기

파일에서 텍스트를 읽어 들이거나 사용자의 입력을 받을 때 때로 반드시 처리해 주어야 하는 것이 문자열의 맨 앞이나 맨 뒤의 공백문자들을 지우는 것이다. 다음의

$str =~ s/^\s+|\s+$//g;


한 줄이면 맨 앞의 공백과 맨 뒤의 공백을 한 번에 없앨 수 있다. 물론 습관에 따라

$str =~ s/^\s+//;

$str =~ s/\s+$//;


해도 무관하다.


4.5. 한글을 깨끗하게 자르기

어떤 데이터를 받거나 얻은 후, 데이터베이스에 넣거나 웹상에 표출할 때, 그 것이 너무 길어서 데이터베이스에서 받아들이지 않거나, 웹 페이지의 모양이 이상한 경우가 있다.

이 때는 받은 데이터의 일부를 불가피하게 잘라내야 하는 데, 영문이라면 큰 문제가 없지만 한글의 경우에는 문제가 된다.

이유는, 한글 한 글자를 나타내는 데 2바이트를 사용하기 때문이다.

예를 들어 "우리나라 만세"를 10 바이트로 잘라내려면 "우리나라" 8바이트, 공백 1바이트, '만'자의 앞부분 1바이트가 남아서 출력될 때는 깨진 글자가 보여지게 된다.

이 때는 다음과 같은 코드를 사용하시면 된다.


if( length($text) > 60 ) {

      $text = substr($text,0,60);

      $text =~ s/(([\x80-\xff].)*)[\x80-\xff]?$/$1/;

}


일단 문자열을 원하는 길이만큼만 남기고 잘라낸다(substr).

남은 문자열의 끝부분에 대해서 정규식을 적용하는데, 한글의 첫 바이트는 항상 \x7f 보다 크므로 [\x80-\xff]., 즉 한글의 첫바이트일 수 있는 [\x80-\xff] 한 바이트와 '.' 한 바이트가 합쳐진 것을 '*' 하면 한글 0 또는 그 이상의 글자가 된다. 그리고 한글의 첫바이트인 [\x80-\xff] 하나만 남는다면 온전한 한글 문자열부분인 (([\x80-\xff].)*) 부분이 $1 이라는 변수에 남아있으므로 그것을 일치된 전체 텍스트에 대해서 치환한다.


4.6. 날짜 패턴검사와 후참조(Backreference)

날짜 입력값의 패턴 검사를 해 보겠다.

날짜 입력값이 yyyy-mm-dd나 yyyy/mm/dd는 인정하고 그 외의 패턴은 인정하지 않는다고 한다면 다음과 같이 간단한 정규식을 사용하면 된다.


if( $dateinput =~ m|^\d{4}([-/])\d{1,2}\1\d{1,2}$| ) {

      print "Good\n";

} else {

      print "Not good\n";

}


여기서 상세한 날짜 범위에 대한 검증은 생략하겠다.

얼핏생각하면 패턴 검사를


$dateinput =~ m|^\d{4}([-/])\d{1,2}[-/]\d{1,2}$|


와 같이 하면 될 것이라고 생각할 수 있다. 하지만, 이 경우는 yyyy-mm/dd나 yyyy/mm-dd도 옳은 것으로 인정해 주기 때문에, 썩 좋은 해법이라고 보기 어렵다. 그래서


$dateinput =~ m|^\d{4}-\d{1,2}-\d{1,2}$| or $dateinput =~ m|^\d{4}/\d{1,2}/\d{1,2}$|


라고 할 수도 있으나, 그 보다는 맨 위의


$dateinput =~ m|^\d{4}([-/])\d{1,2}\1\d{1,2}$|


가 훨씬 간결하다. \1은 후참조(backreference)라고 한다. 정규식 패턴 내에서 앞의 괄호가 일치할 때, 패턴 내부에서 다시 참조할 수 있도록 별도로 저장해둔 내용을 참조하는 것이다.

이 것은 패턴 외부에서 $1, $2, $3...를 사용하는 것과는 달리, 패턴 내부에서 사용한다. 그래서 년과 월의 사이에 사용되는 구분자가 똑같이 월과 일의 사이에서 사용된 경우에만 올바른 패턴으로 결정할 수 있게 된다.

후참조 역시 $1, $2, $3...와 같이 \1, \2, \3...로 사용된다. 만일 날짜 + 시간 패턴을 검사한다면, 다음과 같이 사용할 수 있다.


m|^\d{4}([-/])\d{1,2}\1\d{1,2} \d\d([-:])\d\d\2\d\d$|


5. 결  론

Perl 을 사용 하는 많은 사람들의 인식 속에는 perl 은 그저 인터넷 분야에서 널리 활용되고 있다. 그래서 “오직 CGI 만을 위한 언어다”라고 생각 할지도 모른다. 펄을 창시한 래리 월이 TMTOWTDI, 즉 “There is more than one way to do it" 이라는 슬로건을 내 걸었듯이, 인터넷 프로그래밍은 물론이고 유닉스 시스템 관리, 네트워크, 기타 컴퓨터 분야의 전반에 걸쳐 활용될 수 있는 Perl 의 풍부한 활용성을 알리고자 이렇게 이글을 쓰게 되었다. 특히 문자열 처리에 관한한 최고임을 자부하는 perl 을 사용자 입맛에 맞게 사용 하였으면 한다.


참고문헌


[1] 톰 크리스잔센, 네이던 토킹턴 저, 안계용 역, “Perl Cookbook" 2000.

[2] "http://www.perlmania.or.kr" 문서 모음 게시판

[3] “http://www.perl.or.kr” About perl, Tips 게시판

[4] http://www.softbrain.co.kr/perl/” Perl 이야기 게시판

[5] http://www.activestate.com/” 윈도우용 perl 자료

[6] http://perl.sshel.com/” Docs 게시판

[7] http://seoul.pm.org/

Posted by '김용환'
,

 

 

 

참조.

 

http://synergy2.sourceforge.net/

 

http://blog.daum.net/_blog/BlogView.do?blogid=02FOH&articleno=4529725#ajax_history_home

 

 

이기종 혹은 같은 운영체제내에서 마우스이동이 되고, 단순하게 스트링 복사가 가능하다..

 

넘 좋다.

 

쓸 때, 반드시 해당 문서를 꼼꼼히 보고 설치하도록 하자.

 

http://synergy2.sourceforge.net/

 

 

'general computer' 카테고리의 다른 글

Spring Batch JobInstanceAlreadyCompleteException 내용  (0) 2012.07.12
검색 공부  (0) 2010.01.29
synergy 한글 문제 해결  (0) 2007.10.10
Posted by '김용환'
,

ThreadLocal 클래스

java core 2007. 8. 2. 12:10

webwork의 ActionContext에 private static ThreadLocal 변수가 있었다.

내부적으로 map을 이용하여 thread별로 thread 변수를 가지게 하는 구조로 되어 있었다. 자세한 것은 api와 소스를 참조하면 될 것 같다.

 

글 참조할 것~

 

http://kr.sun.com/developers/techtips/core_12_12.html

쓰레드의 상태정보를 저장할 때 사용되는 THREADLOCAL 변수들

특정 쓰레드의 스코프에서 사용할 로컬변수가 필요했던 적이 있는가? 이때에 각각의 쓰레드는 고유의 스토리지를 갖고 하나의 쓰레드는 다른 쓰레드의 상태 정보를 액세스하는 것이 불가능할 것이다. 표준 라이브러리는 이러한 요구를 가능케 하는 ThreadLocalInheritableThreadLocal, 2개의 클래스들을 제공하고 있다.

클래스들이 사용되고 있는 예를 보자.

  import java.util.Random;
public class ThreadLocalTest1 {
 // Define/create thread local variable
 static ThreadLocal threadLocal = new ThreadLocal();
 // Create class variable
 static volatile int counter = 0;
 // For random number generation
 static Random random = new Random();
 // Displays thread local variable, counter,
 // and thread name
 private static void displayValues() {
  System.out.println(threadLocal.get() + "\t" + counter + "\t"
    + Thread.currentThread().getName());
 }
 public static void main(String args[]) {
  // Each thread increments counter
  // Displays variable info
  // And sleeps for the random amount of time
  // Before displaying info again
  Runnable runner = new Runnable() {
   public void run() {
    synchronized (ThreadLocalTest1.class) {
     counter++;
    }
    threadLocal.set(new Integer(random.nextInt(1000)));
    displayValues();
    try {
     Thread.currentThread().sleep(
       ((Integer) threadLocal.get()).intValue());
     displayValues();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  };
  // Increment counter, access thread local from
  // a different thread, and display the values
  //synchronized (ThreadLocalTest1.class) {
   counter++;
  //}
  threadLocal.set(new Integer(random.nextInt(1000)));
  displayValues();
  // Here's where the other threads
  // are actually created
  for (int i = 0; i < 5; i++) {
   Thread t = new Thread(runner);
   t.start();
  }
 }
}

ThreadLocal1클래스는 2개의 정적 변수를 갖는다. common integer primitive 타입인 counterThreadLocal 타입의 변수인 threadLocal이 바로 그것이다. 일반적으로 클래스 변수를 사용하면, 해당 클래스의 모든 인스턴스들은 동일한 값을 공유하게 된다. 하지만 ThreadLocal의 경우는 다르다. ThreadLocal클래스를 사용하면 동일한 쓰레드내에서만 같은 정적 정보를 공유하게 되는 반면, 서로 다른 쓰레드에서 ThreadLocal 클래스를 사용하면 서로 다른 정적 정보를 갖게 된다.

ThreadLocal1에서, ThreadLocal 인스턴스는 0에서 999사이의 랜덤한 숫자로 초기화된다.

   threadLocal.set(     new Integer(random.nextInt(1000)));

다수의 서로 다른 쓰레드가 생성되었다. 각각의 쓰레드 별로, 2개의 클래스 변수에 대한 상태 정보가 디스플레이된다. 그러면 이 쓰레드는 ThreadLocal이 랜덤한 숫자로 지정한 만큼의 밀리초동안 휴면한다. 이후, 2개의 클래스 변수의 상태 정보가 다시 디스플레이되고, ThreadLocal1를 실행하면, 아래와 같은 출력값을 보게 된다.

   828     1       main   371     2       Thread-0   744     3       Thread-1   734     4       Thread-2   189     5       Thread-3   790     6       Thread-4   189     6       Thread-3   371     6       Thread-0   734     6       Thread-2   744     6       Thread-1   790     6       Thread-4

여기에서 주목할 것은 세번째 컬럼에서 쓰레드의 이름이 같을 때를 살펴보면, 첫번째 컬럼의 ThreadLocal 변수값이 프로그램이 실행되는 동안 같은 상태를 유지한다는 것이다. 반면, 두번째 컬럼에서 보이는 정적 변수는 프로그램이 실행하는 동안 변화하고, 기존 쓰레드를 재검토할 때 그 바뀐 값을 유지한다. 이것이 바로 적절하게 동기화된 정적 변수가 해야 하는 일이다.

프로그램을 실행할 때마다 모든 컬럼에는 각기 다른 값이 생성되기 때문에 결과에서 보이는 첫번째 컬럼의 시간들이 위에서 보는 바와 다르다거나, 마지막 5개의 행의 이름의 순서가 다르다고 해도 놀랄 필요는 없다. 그 순서는 첫번째 컬럼에서 보여진 시간(times)에 기반한 것이다.

쓰레드 로컬 변수는 단순히 인스턴스 변수들의 또 다른 형태만이 아니다. 만약 특정 클래스의 10개의 인스턴스를 모두 일반적인 쓰래드내에서 접근한다면, 그것들의 ThreadLocal 정보는 모두 같을 것이다. 그러나, 만약 이러한 인스턴스들 중의 하나를 다른 쓰레드에서 접근하게 되면, ThreadLocal 정보는 바뀌게 될 것이다.

ThreadLocal 클래스는 오직 3개의 메소드만을 포함하고 있는데 get, setinitialValue가 바로 그것이다. ThreadLocal1 예제를 보면, set메소드는 인스턴스가 생성된 이후 호출되는 것을 알 수 있다. ThreadLocal의 상태를 이후에 다시 초기화하는 방법 대신에, ThreadLocal을 상속한 서브클래스에서 initialValue 메소드를 오버라이드할 수 있다. 다음의 ThreadLocal2 클래스가 바로 그 일을 하는데, 생성된 출력값은 ThreadLocal1의 경우와 비슷하다.

import java.util.Random;
public class ThreadLocalTest2 {
 // Create thread local class
 // Initial value is a random number from 0-999
 private static class MyThreadLocal extends ThreadLocal {
  Random random = new Random();
  protected Object initialValue() {
   return new Integer(random.nextInt(1000));
  }
 }
 // Define/create thread local variable
 static ThreadLocal threadLocal = new MyThreadLocal();
 // Create class variable
 static volatile int counter = 0;
 // For random number generation
 static Random random = new Random();
 // Displays thread local variable, counter,
 // and thread name
 private static void displayValues() {
  System.out.println(threadLocal.get() + "\t" + counter + "\t"
    + Thread.currentThread().getName());
 }
 public static void main(String args[]) {
  // Each thread increments counter
  // Displays variable info
  // And sleeps for the random amount of time
  // Before displaying info again
  Runnable runner = new Runnable() {
   public void run() {
    synchronized (ThreadLocalTest2.class) {
     counter++;
    }
    displayValues();
    try {
     Thread.currentThread().sleep(
       ((Integer) threadLocal.get()).intValue());
     displayValues();
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
  };
  // Another instance of class created
  // and values displayed
  displayValues();
  // Here's where the other threads
  // are actually created
  for (int i = 0; i < 5; i++) {
   Thread t = new Thread(runner);
   t.start();
  }
 }
}

ThreadLocalinitialValue 메소드는 각각의 쓰레드가 상태를 알아내기 위해 하는 첫번째 호출에서 사용된다. Set이 이미 호출된 상태라면, initialValue 메소드는 절대로 호출되지 않는다. initialValue 메소드를 사용할 때, public이 아니라 protected로 만들어야 한다는 것을 기억하자. 일반적으로 initialValue 메소드가 임의로 호출되는 것은 바람직하지 않기 때문이다. initialValue 가 오버라이드되지 않았을 경우, 쓰레드 로컬 변수를 나타내는 객체의 초기 값은 null이다.

ThreadLocal변수에 담을 컨텐츠는 어떤 Object 타입이든지 가능하다. ThreadLocal2에서 컨텐츠는 Integer이다. get을 이용해서 상태를 받아낼 때 Object를 적절한 타입으로 캐스팅해야 한다는 것을 기억하자.

InheritableThreadLocal라고 불리는 ThreadLocal의 두번째 타입을 보자. ThreadLocal과 같이, InheritableThreadLocal을 사용하는 각각의 쓰레드는 고유의 상태객체를 갖는다. ThreadLocalInheritableThreadLocal의 차이점은 InheritableThreadLocal의 초기값은 생성하는 쓰레드로부터 변수의 상태를 얻어낸다는 데에 있다. 상태의 변경은 다른 쓰레드를 제외한 로컬 쓰레드에서만 가능하다. InheritableThreadLocal의 새로운 childValue 메소드는 그것의 상태를 초기화하기위해 사용되는데 이는 상태를 얻어내려고 할 때가 아니라 자녀객체의 생성자에 의해 호출된다.

실제로 ThreadLocal의 사용을 검토하기 위해서는, java.nio.charsetCharset 클래스를 보거나 java.util.LoggingLogRecord를 참고한다. Charset의 경우에는, ThreadLocal가 캐릭터 세트 인코더와 디코더를 검색하기 위해 사용된다. 이것은 초기화하는 코드들이 절절한 시기에 사용되도록 조절하는 역할을 한다. LogRecord에서 ThreadLocal의 사용은 각각의 쓰레드에 Login을 위한 고유한 id가 할당되는 것을 보장해 준다.

Posted by '김용환'
,

/proc/net/tcp, udp, raw는 각각 열려있는 tcp, udp, raw 소켓을 알려준다.

 

참조

http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html

 

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                              
   0: 00000000:0203 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 335 1 c1674320 300 0 0 0
   1: 00000000:0025 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 310 1 c16799a0 300 0 0 0
   2: 00000000:0369 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 316 1 c1677ca0 300 0 0 0
   ...
   ...
  16: 0100007F:0408 0100007F:0017 01 00000000:00000000 00:00000000 00000000  1000       

 

[dev1:/home1/knight/perl] cat /proc/net/tcp | wc -l
   1331
[dev1:/home1/knight/perl] cat /proc/net/raw | wc -l
      1
[dev1:/home1/knight/perl] cat /proc/net/udp | wc -l
      1

 

 

'unix and linux' 카테고리의 다른 글

시스템 부팅시 프로세스 시작하기  (0) 2007.08.16
리눅스 부팅 순서  (0) 2007.08.16
/proc/net/dev  (0) 2007.08.02
Yum  (0) 2007.06.07
Virtual Box 설치하기  (0) 2007.06.07
Posted by '김용환'
,

/proc/net/dev

unix and linux 2007. 8. 2. 06:35

시스템 업무를 하면서 반드시 필요한 정보이다. 현재 네트웍 장비에 대한 정보와 트래픽 정보를 얻어 낼 수 있다.

모니터링시 네트웍 상황을 얻어올 때, 유용할 수 있다. rrd랑 쓰면 모니터링이 가능할 것이다.

 

참조자료.

http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html

 

cat /proc/net/dev 명령어를 치면 다음과 같이 나올 것이다.

Inter-|   Receive                                                |  Transmit face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed    lo:111787507 281326    0    0    0     0          0         0 111787507 281326    0    0    0     0       0          0  eth0:161543042 916321    0    0    0     0          0     43431 103791415 767750    0    0    0  8664       0          0
실제 필드의 내용은 다음과 같다.

bytes

The total number of bytes of data transmitted or received by the interface.

packets

The total number of packets of data transmitted or received by the interface.

errs

The total number of transmit or receive errors detected by the device driver.

drop

The total number of packets dropped by the device driver.

fifo

The number of FIFO buffer errors.

frame

The number of packet framing errors.

colls

The number of collisions detected on the interface.

compressed

The number of compressed packets transmitted or received by the device driver. (This appears to be unused in the 2.2.15 kernel.)

carrier

The number of carrier losses detected by the device driver.

multicast

The number of multicast frames transmitted or received by the device driver.

'unix and linux' 카테고리의 다른 글

리눅스 부팅 순서  (0) 2007.08.16
/proc/net/tcp 보기  (0) 2007.08.02
Yum  (0) 2007.06.07
Virtual Box 설치하기  (0) 2007.06.07
페도라 설치  (0) 2007.06.06
Posted by '김용환'
,

 

자바 역 컴파일을 이클립스 플러그 버젼인 jadclipse에서 쓰고 있기도 하다. 그런데, 사실 단순히 역컴파일을 위해서 이클립스를 쓰는건 좀 어렵지 않은가?

ㅎㅎ

 

그래서 하나 batch 파일 만들었다.

 

<jad.bat>

@echo off
jad -o -d. %*
notepad %~n1.jad
del %~n1.jad


<용도>

역컴파일을 선택된 모든 파일에 되게 해주고, 노트패드로 읽게 한다. 그리고, 읽고 나면, 디컴파일된 찌꺼기는 삭제한다.

 

 

<쓰임>

이렇게 파일 하나 만들어주고, 

 

1) path에 jad.exe가 들어있는 폴더에 패쓰를 지정하거나,

   bat파일안에 있는 jad에 절대패쓰를 걸어둔다.

2) notepad대신 딴 에디트를 쓰는 것도 괜찮다.

 

 

이런거 하나 만들어도...

 

회사사람들은  필요성을 안 느끼나 부다....

 

 

Posted by '김용환'
,

apache redirect 설정.

web 2007. 6. 14. 19:24

 

 

출처

http://blog.javastudy.co.kr/mgtech/tag/virtual%20host

 

 

■ Rewrite 사용예


1.www.ddobb.com:8000으로 들어오는 모든것을 leon.ddobb.com 으로 가도록 설정한 예 이다.

  : www.ddobb.com:8000 뒤에 붙는 모든것들은 그대로 두고 도메인만 변경되는 것이다.


<VirtualHost 192.168.1.100:8000>
  ServerAdmin webmaster@test.com
  DocumentRoot /supp1/webdocs/

  ServerName www.ddobb.com
  ServerAlias ddobb.com *.ddobb.co.kr
  RewriteEngine on
  RewriteRule     (.*)             https://leon\.ddobb\.com$1 [C]
  ErrorDocument 404 "http://www.ddobb.com/inedx.html"
</VirtualHost>


2. www.ddobb.com/aaa/bbb.jsp 라는 파일이 요청되면 www.ddobb.com/index2.html로 가도록 설정한 예이다.


<VirtualHost 192.168.1.100:80>
  ServerAdmin webmaster@test.com
  DocumentRoot /supp1/webdocs/

  ServerName www.ddobb.com
  ServerAlias ddobb.com *.ddobb.co.kr
  RewriteEngine on
  RewriteRule     /aaa/bbb.jsp             http://%{HTTP_HOST}/index2.html [C]
  ErrorDocument 404 "http://www.directsamsung.com/inedx.html"
</VirtualHost>

'web' 카테고리의 다른 글

session clustering  (0) 2007.08.22
쿠키 제한 값? size and length of cookie limit  (0) 2007.08.22
Trust in E-commerce  (0) 2006.07.20
FTP의 passive, active mode 설명  (0) 2006.02.20
[펌] Axis Webservice 설치및 테스트  (0) 2005.09.03
Posted by '김용환'
,

JSTL을 사용하면 EL이 되어 매우 편하다.

 

<c:out value="<%=request.getParameter("aaa")%>"/> 요런게

<c:out value="${param.aaa}"/> 일케 되니 보기도 좋고 얼마나 편한가!!

 

자신이 만드는 Custom Tags에서도 매우 쉽게 attribute 값을 받을 때 EL을 사용할 수 있다.

단 jstl 의 standard.jar 에 의존적이다.

 

* 입력값으로 null을 허용하지 않는 attribute에 대한 EL처리

   org.apache.taglibs.standard.tag.el.core.ExpressionUtil 사용

   JSTL의 out tag 소스를 살펴보면 다음과 같은 부분이 있다

this.value = ExpressionUtil.evalNotNull(
                    "out",           // 태그명 <c:out 이니까 out
                    "value",        // 속성명 
                    value,          // EL속성으로 넘어온 값(EL표현식)

                    Object.class,  // 반환될 값으로 기대되는 클래스타입
                    this,
                    pageContext)

 

* 입력값으로 null을 허용하는 attribute에 대한 EL처리  

  org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager 사용

   JSTL의 if tag의 소스중에는 다음과 같은 부분이 있다.

Object r = ExpressionEvaluatorManager.evaluate(
                  "test",          // 속성명

                   test,            // EL속성으로 넘어온 값(EL표현식)

                   Boolean.class,  // 반환될 값으로 기대되는 클래스타입

                   this,

                   pageContext);

 

요것이 value값을 받아서 EL 처리 (해당 el 파싱 및 적당한 scope에서 객체 얻어오기) 를 하는거이다.

 

저걸 내 CustomTag의 Attribute별 setter 에 넣어주면 된다.

예를 들자면 다음과 같겠다..

페이징 태그의 현재 페이지 값으로 EL을 사용할 수 있게 한 것이다.

    public void setPage(String page) {
        try {

            // page 값을 el 이라 생각하고 값 찾아봄. 없으면 JspException 이나 NullAttributeException 이 던져질것임
            Integer value = (Integer)ExpressionUtil.evalNotNull(
                                                         "paging",
                                                         "page",
                                                          page,
                                                         Integer.class,
                                                         this,
                                                         pageContext);

             this.cpage = value.intValue();
        } catch (Exception ex) {

            // EL에 실패하면 page값을 el이 아니라 생각하고 할당함

            try {
                this.cpage = Integer.parseInt(page);
            } catch (Exception e) {
                this.cpage = 1;
            }
        }       
    }

 

이렇게 하면 페이징 태그에서 <paging:page page="${qpage}" ..... />

이런식으로 사용가능하다, 물론 el이 알아서 4개 scope를 모두 뒤져서 알아서 찾아주니

qpage라는 name으로 4개 scope어디에 박아넣던 상관없다.

 

Posted by '김용환'
,

Create Code Templates for Logging

 

Java > Editor > Templates 에서 logger 템플릿을 생성한다.

 

 

 

입력창에서 Ctrl+Space 를 사용하면 코드 템플릿을 쓸 수 있다.

 

public class CatalogItem {
  private static Logger logger = Logger
      .getLogger(CatalogItem.class.getName());

 

 

 

특정 패키지는

 

Java > Type Filters 를 이용하여 특정 패키지를 추가할 때 ( Ctrl+Shift+M ) 제외시킬 수 있다.

Posted by '김용환'
,

Yum

unix and linux 2007. 6. 7. 21:29

 

 

세상 겁나 좋아졌다.

rpm-> 유분투의 모듈 업데이트 시스템 -> yum을 이용한 손쉬운 설치!!! 짱인데.

 

로그 확인

cat /var/log/yum.log

 

설치

yum install 패키지

 

변경

yum update 패키지

 

설치 여부 확인

yum search 패키지

 

설치 리스트 확인

yum list

 

http://www.phy.duke.edu/~rgb/General/yum_HOWTO/yum_HOWTO/

 

 

 

Next Previous Contents


Yum (Yellow dog Updater, Modified) HOWTO

Robert G. Brown, rgb at phy.duke.edu

Jonathan Pickard,fatboy at techno.co.za

0.3, 2003-09-24
This is a HOWTO for Yum: the Yellow dog Updater, Modified. Yum is an automatic updater and package installer/remover for rpm-based systems. It automatically computes dependencies and figures out what things should occur in order to safely install, remove, and update rpm packages. Yum also efficiently and easily retrieves information on any package installed or available in a repository to the installer. Yum makes it easier to maintain groups of machines without having to manually update each one using rpm or other tools. Yum can manage package groups, multiple repositories, fallback repositories and more to permit centralized package management performed by just one or two individuals to scale over an entire organization. Note Well! This HOWTO is in a state of total flux during its initial pre-release development. Lots of sections are empty, others are wrong, all is in a state of mediocre organization. Nevertheless, I cherish feedback from anybody on the basis of any snapshot you happen to see.

1. Introduction

2. HOWTO Organization

3. Useful Links:

4. Preliminaries

5. Planning a Yum Repository

6. Setting up an FTP server for yum.

7. Building Yum

8. Installing Yum

9. Yummifying your servers: yum-arch

10. Setting up the Yum Client

11. Using the Yum Client

12. Building RPMs for yum repositories

13. Security

14. Etc.

15. Further Information


Next Previous Contents

'unix and linux' 카테고리의 다른 글

/proc/net/tcp 보기  (0) 2007.08.02
/proc/net/dev  (0) 2007.08.02
Virtual Box 설치하기  (0) 2007.06.07
페도라 설치  (0) 2007.06.06
Richard Stevens  (0) 2006.07.20
Posted by '김용환'
,