Linux2013. 5. 8. 11:17

In order to run ProFTPd as a Windows service under Cygwin the following needs to be set in the /etc/proftpd.conf file:

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

:

# Port 21 is the standard FTP port.
#Port                           21
Port                            2122
:

# Set the user and group under which the server will run.
User                            SYSTEM
Group                           Administrators

# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
DefaultRoot ~

:

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

 

The server can then be run as a service:

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

cygrunsrv --install proftpd \
          --path /usr/sbin/proftpd.exe \
          --args "--nodaemon" \
          --type manual \
          --disp "CYGWIN proftpd" \
          --desc "ProFTPd FTP daemon"

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

 

Then it needs to be run:

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

cygrunsrv --start proftpd

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

 

'Linux' 카테고리의 다른 글

Cygwin 설치 및 개발환경 구축  (0) 2013.04.19
RPM 패키지 설치 및 삭제방법  (0) 2012.08.31
init와 Runlevel  (0) 2012.08.31
유니티 각 부분의 명칭 및 키보드 단축키  (0) 2011.07.20
유니티(unity) 초기화  (0) 2011.07.20
Posted by iWithJoy
Linux2013. 4. 19. 11:22



회사에서의 개발환경은 cygwin + gcc + gmake이다.  따라서 cygwin을 설치한다.

http://www.cygwin.com/setup.exe 를 다운받아놓도록 한다. 
향후 패키지를 추가/제거할 때도 사용하여야 하니까 그냥 다운 받아놓는 것이 낫다.  용량도 400KB 정도...

이걸 실행시키면 어디를 통해서 install 할 것인지를 물어본다. 
여기에서 Install from Internet을 사용한다.

Root Directory는 기본 설정인 C:\cygwin을 그냥 사용하는 것이 제일 무방할 듯 싶다. 
검색해본 결과 많은 사람들이 여기에 기반을 두고 작업을 하였기 때문에 헷갈리지 않을터이다. 
밑의 설정은 All Users와 Unix/binary에 체크한다. (기본 설정)

여기서 다음을 누르면 어디에 다운을 받을 것인지, 어떤 방법으로 받을 것인지 물어보는데 기본값을 쓰면 되고,
download site는 http://ftp.daum.net을 추가해서 쓰면 괜찮을 듯 하다.

기본값은 진짜 기본만 설치하게 되므로 나중에 되는게 하나도 없다
All 옆에 Default를 몇 번 클릭하여 Uninstall로 바꾸고, 원하는 패키지의 Unintall을 Install로 바궈서. 필요한 패키지만 설치하자.

직감적으로 gcc나 make, gdb, vim 등등은 당연히 해야할 것이라는 느낌이 온다.  
다음은 필요하다고 생각되는 package들을 정리한 것이다.

Admin - cygrunsrv (sshd 등을 bg로 돌릴 유틸)
Devel - gcc, make, ctags 관련
Editors - vim 관련
Net - openssh 관련 (ssh를 사용할 것이라면)
Shell - rxvt 관련 (xterm을 사용할 것이라면)

위에서 열거한 package 말고도 필요한 패키지들을 선택하도록 하고,
나중에 또 추가가 되므로 크게 신경 쓸 일은 아닌듯 하다.

어쨌거나 설치가 끝나면 환경변수를 설정하도록 한다. 
내 컴퓨터 우클릭하여 '속성'->'고급'->'환경변수'를 선택하여 사용자 변수와 시스템 변수를 추가하도록 한다.

사용자 변수
HOME=d:\home (linux에서의 ~ 를 말함)
LOGNAME= (windows 계정과 동일하게)

시스템 변수
CYGWIN (ntsec binmode)을 새로 만들고
PATHC:\Cygwin\bin을 추가한다 (당연히 항목과 항목 사이는 ;으로 구분한다).






만약 cygwin 자체의 terminal을 쓴다면 상관은 없지만, cygwin의 xterm을 사용하고 싶다면, 추가의 작업이 필요하다.

c:\cygwin을 보면 cygwin.bat가 있다.  autoexec.bat 이후로 bat 파일은 진짜 오랜만이다.  어쨌거나 이거 내용을 보면 다음과 같다.

@echo off

C:
chdir C:\cygwin\bin

bash --login -i

이거를 응용해서 rxvt,bat를 하나 만든다 (xterm용)

@echo off

C:
chdir C:\cygwin\bin

rxvt.exe -tn xterm -rv -sr -sw -bg gray -fg black -sl 1000 -sbt 15 -fn "Dotumche" -e /bin/bash --login -i

rxvt의 각 항목의 값들이 궁금하다면 cygwin에서 rxvt --help를 해보면 알 수 있다.  대충 xterm으로 띄우는데 scrolling이 가능하도록 하고 검은 배경에 회색글씨를 쓰겠다... 폰트는 Dotumche를 쓰겠고.. 뭐 이런 거다.

이게 끝난 다음에 만든 rxvt.bat를 실행시키면 익숙한 shell prompt를 확인할 수 있다.

cygwin에서 개발하려면 다른 editor도 있겠지만, 아무래도 vim을 가장 많이 사용하지 않을까 싶다.  cygwin에서 vim을 사용하려면 이거저거 걸리는게 많다.  일단 기본적으로 설정 파일이 없기 때문에 원 리눅스에서의 컬러풀(?)한 터미널을 기대하면 안된다.  또 한글입력에 문제가 많아서 요거 2가지 처리를 해줘야 한다.

먼저 vim을 설정해야 되는데, 항목이 워낙 많으니 그냥 /usr/share/vim/vim71/vimrc_example.vim을 home 디렉토리에 .vimrc로 복사하고, 좀 손을 봐준다.  쭉 내리다보면 다음과 같은 부분이 있다.

if has("vms")
  set nobackup
else
  set backup
endif

요 부분을 주석처리한다.  vimrc에서의 주석은 " (double quotation mark)를 맨 앞에 붙여주면 된다.  이거 안하면 저장하고 나올때마다 backup 파일이 생기는 짜증나는 (필요하긴 하지만) 현상을 목격하게 된다.  어쨌거나 이거 됐으면 다음 작업을 진행한다.  역시 .vimrc에 다음과 같은 항목을 추가하여 준다.

set fileencoding=euc-kr
set encoding=cp949

vi에서 한글을 사용하기 위한 설정이다.  이렇게 다 됐으면 저장하고 다시 vi로 아무 c파일이나 짜본다.

#include <stdio.h>

int main (void)
{
  printf ("헬로, 시그윈 월드\n");

  return 0;
}

잘 된다.  하지만 이렇게 하면 vim에서만 한글이 잘 보일뿐, 막상 쉘에서 ls해보면 잘 안나온다.  요것도 수정해야 하는데, 홈 디렉토리에 .bash_profile을 다음과 같은 내용을 추가한다.

alias ls='ls -F --color=auto --show-control-char'

쉘에서 ls를 해도 한글이 무리 없이 잘 나오게 된다.  후아... 이정도 했으면 큰 문제 없이 cygwin을 사용할 수 있을 것 같다.  헌데, 작업하다보면 새로운 terminal을 띄워야 할 때가 있는데 이때마다 마우스로 손이 가는건 상당히 부하가 큰 작업(-_-?)이다.  요거를... 키보드에서만 해결하도록 다음과 같은 alias도 하나 추가한다.

alias rxvtTerm='/cygdrive/c/cygwin/bin/rxvt -tn xterm -rv -sr -sw -bg gray -fg black -sl 1000 -sbt 15 -fn "Dotumche" -e /bin/bash --login -i &'

이러면 그냥 쉘 프롬프트에서 rxvtTerm을 실행시켜서 새로운 xterm 하나를 더 얻을 수 있게 된다.

 

 

CYGWIN SSH 설치

 

< 윈도우 초기 설정 >

- Administarator 계정으로 로그인
- 현재 Administarator 계정과, 다른 User 계정에 Password를 지정해준다.


< CYGWIN 설치 >

- C:\cygwin 폴더를 생성한후, http://www.cygwin.com/ 에서 다운로드 받은 setup.exe 파일을 폴더에 저장한다.
(Cygwin의 setup.exe 파일은 초기 설치 후에도 cygwin package들을 추가하고 삭제하고 재설치 할때 사용된다.)
- setup.exe 파일을 실행시켜 cygwin을 설치한다.

1) 설치 정보 화면
2) Choose A Download Source 화면에서 Install from Internet 선택
3) Select Root Install Directory 화면 에서 Root Directory 는 C:\cygwin 으로 Install For 는 All User 선택, Default Text File Type 은 Unix/Binary 선택
4) Local Package Directory 는 C:\cygwin -> Select Your Internet Connection 은 DirectConnection 선택
5) Select package to install 화면
+ View 버튼을 클릭하면 버튼 옆에 Full 이라고 표시된다.
+ 목록 중에 openssh, tcp_wrappers, diffutils, zlib 패키지 중 New 칼럼에 skip 이라고 표시되있는 상태이면 skip을 클릭하여 설치 상태로 변경한다.

< 시스템 환경 변수 설정 및 기타 설정 >

- 시스템 등록 정보 화면에서 고급탭의 환경 변수 설정
-> 새로운 변수 설정 : 변수 이름 - CYGWIN, 변수 값 - ntsec tty
-> Path 변수 수정 : 뒤에 ;c:\cygwin\bin  를 추가한다.


< Cygwin 설치후, 실행 및 설정 >

- 권한 문제가 발생할 가능성이 있으므로 아래 세 명령어 실행
# chmod +r  /etc/passwd
# chmod +r  /etc/group
# chmod  755  /var

- ssh 설정 스크립트 실행
# ssh-host-config  -y

privilege separation -> yes
create a local user sshd on this machine -> yes
install sshd as a service -> yes
environment variable CYGWIN= ->  ntsec tty

- Windows 사용자 정보와 cygwin좨의 사용자정보를 싱크(중요)
# mkpasswd   -cl   >   /etc/passwd
# mkgroup   --local    >   /etc/group

- ssh 서비스 실행

# net start sshd 
or
# cygrunsrv  --start  sshd

- ssh 서비스 로컬 테스트

#whoami
#ssh    localhost
or
#ssh  -vvv  localhost
or
#ssh    "$USERNAME@127.0.0.1"
(사용자 명이 스페이스가 존재한다면, 스페이스 자리에 \[space]를 대신한다. ex> ab cd -> ab\ cd )

처음 접속시, The authenticity of host '....<xxx.x.x.xx>" can't be established......
라는 문구가 나오는데.. 이는 yes라고 답하고 계속 진행한다.

그리고 명령어 입력 프롬포트가 나타나면 다음과 같이 명령한다.

cd   /cygdrive/c
ls

ls 명령이 정상적으로 수행이 되, 디렉토리와 파일 리스트가 출력되면 정상이다.

- 윈도우(XP SP2 기준) 방화벽 설정 : 제어판 - 보안센터 - Windows 방화벽 - 예외 탭

1) 포트 추가 설정
: 포트추가 화면에서 이름 SSH 포트번호 22 로 설정하고 TCP 선택
2) 프로그램 추가 설정
: 프로그램 추가 설정에서 프로그램 경로를 C:\cygwin\bin\ssh.exe 를 설정

- 원격지에서 접속 테스트

-> 원격지에서 Putty나 기타 클라이언트 프로그램에서 접속 확인
-> 접속이 되지 않을 경우, /etc/hosts.deny, /etc/hosts.allow 파일확인(참조 링크 확인)

예를 들어, 특정IP에게 거절되지 않게 설정하려면,

/etc/hosts.deny 를 편집기로 열어서, 아래의 내용을 추가하면 된다.

ALL:ALL EXCEPT 특정IP:DENY

 

-> 참고사항 : SSHD 가 실행된 이후로, 윈도우의 환경 변수(특히 PATH)를 변경하면 적용되지 않는다.  윈도우 서비스의 SSHD를 재시작하거나, 윈도우를 재시작하면 된다. 

더욱정리가 잘되어있는 사이트는 요아래에 있으니 참고해주세요~~

Cygwin 설치

cygwin이라는 프로그램을 windows에 설치하면 Linux 명령과 bash sell을 사용 할 수 있습니다.
보통 개인적 취향이나 학습의 목적으로 cygwin을 자신의 컴퓨터에 설치하여 사용하고는 하는데,
나아가서 원격머신 흔히 서버로 사용할 머신이 windows 계열일때의 불편을 해소하고자 할 때
이 보다 좋은 방법은 없는듯 합니다.

목차 :
  1. cygwin을 깔면 무얼 할 수 있나?
  2. cygwin 설치 방법
  3. 한글 설정
  4. sshd 띄워 원격에서 접속하기
 
1. cygwin을 깔면 무얼 할 수 있나?
 cygwin이라는 프로그램은 windows에 설치하여 Linux와 같은 환경을 제공합니다.

cygwin을 실행한 모습


위의 그림처럼 cygwin을 실행시키면 Dos창과 비슷한 콘솔이 열리는데, 이것을 이용해서 Unix 명령과 각종 Shell을 실행 시킬 수 있습니다.
물론 이미 설치되어 있는 모든 프로그램의 실행도 가능합니다.  GUI를 갖는 윈도우 프로그램도 포함해서 말이죠.(물론 그렇게 할 필요는 없어 보이지만..)

IT, 특히 개발자로서는 grep, find, tail 명령만으로도 이 프로그램을 사용하는 충분한 이유가 될 수 있을듯 합니다.
Unix 환경에 익숙하지 않은 사람은 이것을 이용해서 학습을 할 수 있을 것이구요.

제가 이와 같이 개인적 성향이나 학습의 가능성을 알리기 위해 이렇게 글 까지 쓰지는 않았을 겁니다. 자기 혼자 사용하는 개인용 PC인 경우라면 grep이나 find가 없어도 알아서 잘들 쓰고 있고, 이런게 있는데 좋으네 마네 설명하고 자시고 할 필요는 없어 보입니다.

그런데, 서버 환경이 Windows인 경우에는 문제가 다릅니다.
원격 서버에서 실행되어야 하는 각종 서버 데몬의 실행과 중단 명령, 원격 서버에 쌓이고 있는 로그파일의 tail, 원격 서버의 CPU, Memory 사용률과 Process List를 확인 하려 할때, 윈도우 원격 데스트탑 연결(mstsc.exe)이나 VNC를 이용해야 하는것은 무척 불편하고 퇴근시간을 늦추는 요인이 됩니다.

CecureCRT로 cygwin을 이용한 ssh 접속모습


cygwin의 sshd를 이용하면 원격에서 telnet과 같이 ssh를 이용하여 모든 콘솔 명령을 이용할 수 있으니 소스적용이나 시스템 모니터링에서 windows와 Unix의 차이를 모르고 작업 할 수 있게 해줍니다.
자 어때요. 이정도면 cygwin 쓸만 한가요? 그렇다면 설치와 환경 설정 방법을 설명해 드릴께요.

2. cygwin 설치 방법
  cygwin을 설치 하기 위해서는 ftp가 열려 있어야 합니다.
금융사 내부에서 인터넷을 할때는 대부분 ftp가 닫혀 있기 때문에 설치 프로그램이 필요한 패키지를 다운로드 하지 못하는 경우가 있읍니다. 이 경우에는 첨부한 설치 프로그램과 패키지를 이용해서 설치해야 합니다.

 가. FPT가 가능하다면 http://www.cygwin.com에 방문하여 설치 프로그램을 다운로드 받습니다.
FTP가 불가능하다면 첨부 파일인 setup.exe를 다운받습니다.

http://www.cygwin.com


 나. 설치 프로그램을 실행하여 평소처럼 "다음"을 눌줍니다.
 

cygwin installer


 다. 만약 FTP가 가능하다면 "Install from Internet"을 선택하고 "다음"을 클릭합니다.
   만약 FTP가 불가능 하다면 "Install from Local Directory"를 선택합니다.

  라. 설치할 경로와 설치 환경을 설정합니다. 왠만하면 그대로 두시면 됩니다.

  마. 패키지 경로를 지정합니다.
   FTP가 가능한 경우는 패키지를 다운받을 경로를 지정하시면 되고,
   FTP가 불가능한 경우는 첨부파일 release.zip을 다운받아 압축해제한 경로를 지정하시면 됩니다.

 바. FTP 접속 방법 선택
  FTP가 불가능한 경우에는 해당 사항 없는 화면입니다.
  FTP로 다운받아 설치하는 경우에 FTP를 어떻게 접속할지를 선택하는 방법입니다.
   어떤걸 선택할 지는 알아서 판단 해야 겠죠.

  사. 다운로드 사이트 선택
   release.zip을 다운받으신 경우에은 마찬가지로 해당 사항 없는 화면입니다.
   어느 미러 사이트에서 받을지 묻는 것인데, ftp://ftp.kaist.ac.kr 가 제일 빠르다고 합니다.

   아. 설치 패키지 선택
   어떤 패키지를 설치 할지 선택하는 것인데요, 이부분은 모두 해당 되는 부분입니다.
    패키지를 설명하고 자시고 할 자신은 없으니 모두 설치를 하십시요.
   이때!! "All Default"라고 되어있는 "Default"를 클릭하여 "Install"로 바꾸시는 것은 매우 중요합니다.
 

  자. 설치 진행 및 종료
    나머지는 굳이 설명 안드리겠습니다. 그냥 놔두면 설치하고 "마침" 클릭하시면 되겠습니다.

 자 이제 생성된 아이콘을 클릭하여 cygwin을 실행하고 Unix 처럼 사용하시면 됩니다.
  
  • C: D: 드라이브 변경은 Dos에서 처럼  "cd c:" , "cd d:" 하시면 되고 /(root) 디렉토리는 cygwin이 설치된 경로, 다시말해 디폴트로 설치했다면 "c:\cygwin" 이 되게 됩니다.
    ~(home) 디렉토는  "c:\document and settings\계정이름" 입니다.

 
3. 한글 설정
cygwin을 설치하고 바로 쓰면 한글 파일명이나 디렉토리명이 물음표(?)로 표시되고, 한글 입력도 잘 되지 않습니다. 그래서 설치 후 한글 설정 작업이 필요합니다.

 가. c:\cygwin\Cygwin.bat 파일을 노트패드로 열어 굵은 글씨로 된 문장을 추가 합니다.
... 생략
set CYGWIN=tty

bash --login -i

 나. cygwin콘솔에서 vi로  ~/.bashrc 열어 아래 내용을 맨 아래에 넣습니다.
alias ls='ls -ahF --color=tty --show-control-char'
 그 밖에 alias를 추가 하거나 수정하셔도 됩니다.

다. cygwin 콘솔에서 vi로 ~/.inputrc 를 열어 아래 내용을 맨 아래에 추가합니다.
set meta-flag on
set convert-meta off
set output-meta on

자. 이제 한글 입/출력도 잘 될것입니다.
로칼에서만 사용하실 꺼라면 이대로 잘 사용하시면 됩니다.


4. sshd 설정하여 원격에서 접속하기
  가. 환경변수 설정
 내컴퓨터 아이콘의 속성을 선택해서 "시스템 등록정보" 창을 열어 봅니다.
"고급" 탭의  "환경변수"를 클릭하여 환경변수를 추가합니다.

저장할 변수내용은 다음과 같습니다.
CYGWIN=ntsec tty

    나. cygwin 콘솔에서 다음 명령을 실행합니다.
 
ssh-host-config
CYGWIN=ntsec tty

  다. cygwin 콘솔에서 sshd 데몬을 실행합니다.
cygrunsrv --start sshd
 
이와 같이 하고 나면 윈도우 서비스에 sshd 가 추가 되어 실행되고 있는 것을 확인 할수 있습니다.


라. ssh 접속

 Putty 또는 SecureCRT와 같은 ssh를 지원하는 콘솔 프로그램을 이용해서 원격에서 접속해 봅니다. 
 계정은 windows 로그인 계정과 같습니다. 대부분 Administrator 이겠죠.


자 이제 윈도우 시스템을 원격에서도 Unix와 같이 사용해서 퇴근 시간이 빨라지길 바랍니다.
X를 띄워 쓰는 분도 있으니 더 쓸모 있는 방법이 있지 않알까 생각도 됩니다.

 

Cygwin 설치

cygwin이라는 프로그램을 windows에 설치하면 Linux 명령과 bash sell을 사용 할 수 있습니다.
보통 개인적 취향이나 학습의 목적으로 cygwin을 자신의 컴퓨터에 설치하여 사용하고는 하는데,
나아가서 원격머신 흔히 서버로 사용할 머신이 windows 계열일때의 불편을 해소하고자 할 때
이 보다 좋은 방법은 없는듯 합니다.

목차 :
  1. cygwin을 깔면 무얼 할 수 있나?
  2. cygwin 설치 방법
  3. 한글 설정
  4. sshd 띄워 원격에서 접속하기
 
1. cygwin을 깔면 무얼 할 수 있나?
 cygwin이라는 프로그램은 windows에 설치하여 Linux와 같은 환경을 제공합니다.

cygwin을 실행한 모습


위의 그림처럼 cygwin을 실행시키면 Dos창과 비슷한 콘솔이 열리는데, 이것을 이용해서 Unix 명령과 각종 Shell을 실행 시킬 수 있습니다.
물론 이미 설치되어 있는 모든 프로그램의 실행도 가능합니다.  GUI를 갖는 윈도우 프로그램도 포함해서 말이죠.(물론 그렇게 할 필요는 없어 보이지만..)

IT, 특히 개발자로서는 grep, find, tail 명령만으로도 이 프로그램을 사용하는 충분한 이유가 될 수 있을듯 합니다.
Unix 환경에 익숙하지 않은 사람은 이것을 이용해서 학습을 할 수 있을 것이구요.

제가 이와 같이 개인적 성향이나 학습의 가능성을 알리기 위해 이렇게 글 까지 쓰지는 않았을 겁니다. 자기 혼자 사용하는 개인용 PC인 경우라면 grep이나 find가 없어도 알아서 잘들 쓰고 있고, 이런게 있는데 좋으네 마네 설명하고 자시고 할 필요는 없어 보입니다.

그런데, 서버 환경이 Windows인 경우에는 문제가 다릅니다.
원격 서버에서 실행되어야 하는 각종 서버 데몬의 실행과 중단 명령, 원격 서버에 쌓이고 있는 로그파일의 tail, 원격 서버의 CPU, Memory 사용률과 Process List를 확인 하려 할때, 윈도우 원격 데스트탑 연결(mstsc.exe)이나 VNC를 이용해야 하는것은 무척 불편하고 퇴근시간을 늦추는 요인이 됩니다.

CecureCRT로 cygwin을 이용한 ssh 접속모습


cygwin의 sshd를 이용하면 원격에서 telnet과 같이 ssh를 이용하여 모든 콘솔 명령을 이용할 수 있으니 소스적용이나 시스템 모니터링에서 windows와 Unix의 차이를 모르고 작업 할 수 있게 해줍니다.
자 어때요. 이정도면 cygwin 쓸만 한가요? 그렇다면 설치와 환경 설정 방법을 설명해 드릴께요.

2. cygwin 설치 방법
  cygwin을 설치 하기 위해서는 ftp가 열려 있어야 합니다.
금융사 내부에서 인터넷을 할때는 대부분 ftp가 닫혀 있기 때문에 설치 프로그램이 필요한 패키지를 다운로드 하지 못하는 경우가 있읍니다. 이 경우에는 첨부한 설치 프로그램과 패키지를 이용해서 설치해야 합니다.

 가. FPT가 가능하다면 http://www.cygwin.com에 방문하여 설치 프로그램을 다운로드 받습니다.
FTP가 불가능하다면 첨부 파일인 setup.exe를 다운받습니다.

http://www.cygwin.com


 나. 설치 프로그램을 실행하여 평소처럼 "다음"을 눌줍니다.
 

cygwin installer


 다. 만약 FTP가 가능하다면 "Install from Internet"을 선택하고 "다음"을 클릭합니다.
   만약 FTP가 불가능 하다면 "Install from Local Directory"를 선택합니다.

  라. 설치할 경로와 설치 환경을 설정합니다. 왠만하면 그대로 두시면 됩니다.

  마. 패키지 경로를 지정합니다.
   FTP가 가능한 경우는 패키지를 다운받을 경로를 지정하시면 되고,
   FTP가 불가능한 경우는 첨부파일 release.zip을 다운받아 압축해제한 경로를 지정하시면 됩니다.

 바. FTP 접속 방법 선택
  FTP가 불가능한 경우에는 해당 사항 없는 화면입니다.
  FTP로 다운받아 설치하는 경우에 FTP를 어떻게 접속할지를 선택하는 방법입니다.
   어떤걸 선택할 지는 알아서 판단 해야 겠죠.

  사. 다운로드 사이트 선택
   release.zip을 다운받으신 경우에은 마찬가지로 해당 사항 없는 화면입니다.
   어느 미러 사이트에서 받을지 묻는 것인데, ftp://ftp.kaist.ac.kr 가 제일 빠르다고 합니다.

   아. 설치 패키지 선택
   어떤 패키지를 설치 할지 선택하는 것인데요, 이부분은 모두 해당 되는 부분입니다.
    패키지를 설명하고 자시고 할 자신은 없으니 모두 설치를 하십시요.
   이때!! "All Default"라고 되어있는 "Default"를 클릭하여 "Install"로 바꾸시는 것은 매우 중요합니다.
 

  자. 설치 진행 및 종료
    나머지는 굳이 설명 안드리겠습니다. 그냥 놔두면 설치하고 "마침" 클릭하시면 되겠습니다.

 자 이제 생성된 아이콘을 클릭하여 cygwin을 실행하고 Unix 처럼 사용하시면 됩니다.
  
  • C: D: 드라이브 변경은 Dos에서 처럼  "cd c:" , "cd d:" 하시면 되고 /(root) 디렉토리는 cygwin이 설치된 경로, 다시말해 디폴트로 설치했다면 "c:\cygwin" 이 되게 됩니다.
    ~(home) 디렉토는  "c:\document and settings\계정이름" 입니다.

 
3. 한글 설정
cygwin을 설치하고 바로 쓰면 한글 파일명이나 디렉토리명이 물음표(?)로 표시되고, 한글 입력도 잘 되지 않습니다. 그래서 설치 후 한글 설정 작업이 필요합니다.

 가. c:\cygwin\Cygwin.bat 파일을 노트패드로 열어 굵은 글씨로 된 문장을 추가 합니다.
... 생략
set CYGWIN=tty

bash --login -i

 나. cygwin콘솔에서 vi로  ~/.bashrc 열어 아래 내용을 맨 아래에 넣습니다.
alias ls='ls -ahF --color=tty --show-control-char'
 그 밖에 alias를 추가 하거나 수정하셔도 됩니다.

다. cygwin 콘솔에서 vi로 ~/.inputrc 를 열어 아래 내용을 맨 아래에 추가합니다.
set meta-flag on
set convert-meta off
set output-meta on

자. 이제 한글 입/출력도 잘 될것입니다.
로칼에서만 사용하실 꺼라면 이대로 잘 사용하시면 됩니다.


4. sshd 설정하여 원격에서 접속하기
  가. 환경변수 설정
 내컴퓨터 아이콘의 속성을 선택해서 "시스템 등록정보" 창을 열어 봅니다.
"고급" 탭의  "환경변수"를 클릭하여 환경변수를 추가합니다.

저장할 변수내용은 다음과 같습니다.
CYGWIN=ntsec tty

    나. cygwin 콘솔에서 다음 명령을 실행합니다.
 
ssh-host-config
CYGWIN=ntsec tty

  다. cygwin 콘솔에서 sshd 데몬을 실행합니다.
cygrunsrv --start sshd
 
이와 같이 하고 나면 윈도우 서비스에 sshd 가 추가 되어 실행되고 있는 것을 확인 할수 있습니다.


라. ssh 접속
 Putty 또는 SecureCRT와 같은 ssh를 지원하는 콘솔 프로그램을 이용해서 원격에서 접속해 봅니다.

 계정은 windows 로그인 계정과 같습니다. 대부분 Administrator 이겠죠.


자 이제 윈도우 시스템을 원격에서도 Unix와 같이 사용해서 퇴근 시간이 빨라지길 바랍니다.
X를 띄워 쓰는 분도 있으니 더 쓸모 있는 방법이 있지 않알까 생각도 됩니다.

 

 

한글사용을 위해 아래의 파일의 내용을 확인하여 추가 및 수정한다.

 

.bash_profile

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

# source the users bashrc if it exists
if [ -f "${HOME}/.bashrc" ] ; then
  source "${HOME}/.bashrc"
fi

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
        INPUTRC=/etc/inputrc
fi

#export PS1='[\u@\h \w]\$ '
export PS1='[\w]\$ '

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

 

.bashrc

--------------------------------------------------------------------------------
# Some shortcuts for different directory listings
# alias ls='ls -hF --color=tty'                 # classify files in colour
 alias ls='ls --color=tty --show-control-char'
 alias dir='ls --color=auto --format=vertical'
 alias vdir='ls --color=auto --format=long'
 alias ll='ls -l'                              # long list
 alias la='ls -A'                              # all but . and ..
 alias l='ls -CF'                              #

if [[ "${COLORTERM}" == "rxvt-xpm" || "${TERM}" == "cygwin" ]]; then
  #export LANG=ko_KR
  export LANG=ko_KR.eucKR
  #export LANG=C.eucKR
  #export LANG=ko_KR.UTF-8
fi
--------------------------------------------------------------------------------

 

.inputrc

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

# equivalent to "\C-?": delete-char
"\e[3~": delete-char

# VT
"\e[1~": beginning-of-line
"\e[4~": end-of-line

# kvt
"\e[H": beginning-of-line
"\e[F": end-of-line

# rxvt and konsole (i.e. the KDE-app...)
"\e[7~": beginning-of-line
"\e[8~": end-of-line

# VT220
"\eOH": beginning-of-line
"\eOF": end-of-line

# Allow 8-bit input/output
set meta-flag on
set convert-meta off
set input-meta on
set output-meta on
--------------------------------------------------------------------------------

 

.minttyrc

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

Font=Fixedsys
BoldAsFont=no
Locale=ko_KR
Charset=eucKR
--------------------------------------------------------------------------------

 

.profile

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

# Set user-defined locale
export LANG=$(locale -uU)

# This file is not read by bash(1) if ~/.bash_profile or ~/.bash_login
# exists.
#
# if running bash
if [ -n "${BASH_VERSION}" ]; then
  if [ -f "${HOME}/.bashrc" ]; then
    source "${HOME}/.bashrc"
  fi
fi
--------------------------------------------------------------------------------

 

Posted by iWithJoy
JAVA/Regular Expression2013. 3. 22. 17:31

HTML 을 XML 파서로 파싱해서 객체화 시킬 일이 있어 여러 가지 실험해 보다가 쓸만한 팁을 정리합니다.

HTML 의 경우는 XML 과는 다르게 태그를 닫지 않거나 attribute 를 큰 따옴표로 감싸지 않아도 브라우저에서 확인이 가능합니다. 이렇기 때문에 HTML 을 XML 파서로 파싱하려면 큰 따옴표로 묶이지 않은 부분을 변경해 주어야 합니다.
(실제로 작업을 해보지는 않았으나 태그를 닫지 않는 것을 수정하려면 문서 전체를 문자열 단위로 파싱을 해야 가능할 것 같습니다.)

[TYPE_A]

<P class=PStyle0>
...
</P>


[TYPE_B]

<P class="PStyle0">
...
</P>


간단하게 이야기 하자면 [TYPE_A][TYPE_B] 로 변경하는 것이 목적입니다.

자바에서는 replaceAll 메소드와 정규식을 이용하면 쉽게 변환이 가능합니다.

1 String html = "...";
2   
3 String replaceHtml = html.replaceAll("(class=)([^\\p{Space}\\>\\\"]+)", "$1\"$2\"");


우선 replaceAll 의 첫번째 파라미터를 설명하겠습니다.
'class='로 시작을 하고 스페이스, '>', 큰 따옴표가 나오기 전까지의 모든 문자들의 연속을 찾습니다. 괄호로 묶음은 그룹을 뜻하는데 여기서 그룹 1 은 'class=' 이며, 그룹 2 는 위의 [TYPE_A] 에서 라면 'PStyle0' 까지 입니다.

두번째 파라미터는 간단합니다. '$그룹번호' 로 변경하겠다는 이야기 입니다.
'$1\"$2\"' 을 단계별로 변환하면 그룹 1 이 교체되면 'class=\"$2\"' 가 되고 그룹 2 가 교체되면 'class=\"PStyle0\"' 이 됩니다.

정규식은 역시 활용만 잘하면 단순 노가다 작업을 간단하게 줄여줄 수 있는 강력한 무기가 됩니다.

 

출처: http://vicki.tistory.com/851

'JAVA > Regular Expression' 카테고리의 다른 글

Java 정규 표현식 사용하기  (0) 2013.03.06
정규식과 보안  (0) 2013.03.04
Posted by iWithJoy
카테고리 없음2013. 3. 12. 17:55
본 문서의 저작권은 anti-nhn license에 따릅니다.
*본 페이지에는 자바스크립트가 많이 들어있습니다. 자바스크립트가 실행되지 않으면 제대로 보이지 않습니다.
*본 페이지는 IE용 태그를 사용하였으므로, firefox 등에서는 정상작동하지 않을 수 있습니다.
*테스트를 해보실라문 요기를 클릭

차례

1. 정규식이란?

  • String의 검색, 치환, 추출을 위한 패턴.
  • 언어별 사용법은 대동소이함.
  • 패턴예>전화번호 형식, 이메일 형식 등.

2. 정규식 만들기

  1. Javascript
    • var regexp = /pattern/[flags] ;
      var test = regexp.test(to be checked)
    • var regexp = new RegExp("pattern"[, "flags"]);
      var test = regexp.test(to be checked)
    • flags for javascript
      • g : global match, 일반적으로 패턴이 1번만 발견되면 찾기를 종료하지만, g flag가 있으면, 문자열 내에서 모든 패턴을 찾는다.
      • i : ignore case, 대소문자를 고려하지 않고 체크한다.[a-z]와 [A-Z]는 같은 표현이 된다.
      • m : match over multiple lines, 여러 줄에 걸쳐 체크를 한다.
  2. Java
    • java.util.regex package
    • Pattern p = Pattern.compile("pattern");
      Matcher m = p.matcher("string to be checked");
      boolean b = m.matches();
    • boolean b = Pattern.matches("pattern", "string to be checked");

3. 정규식 표현법

*는 valid, 는 invalid
*형광 초록 바탕 부분은 매칭되는 부분.
*예제는 javascript 기준이며, 언어에 따라 다소 차이가 발생할 수 있다.

문자 용도 예제
\
  • 특수문자를 의미
  • 특수문자의 사용을 제외(특수문자 앞에서)
  • b는 b라는 글자를 의미 하지만 \b는 단어 경계를 의미
  • *은 0번이상 반복이라는 의미이지만, \*는 *이라는 글자를 의미.
^ 문자열의 시작. []안에서는 not의 의미
* ^A는 "A로 시작"이라기 보다는 "시작 직후에 A가 나온다"는 의미로 해석하는 것이 좋다. 즉, 시작과 끝과 같은 빈 공간을 하나의 문자로 간주하는 것이 좋다.
/^A/g
  • A string
  • an A
/[^A]/g
  • A string
  • an A
$ 문자열의 마지막
/t$/
  • eat
  • GREAT
* 0번 이상 반복 /ab*d/g
  • ad
  • abd
  • abdcdeabbbbdedb
  • ab
  • axd
+ 1번 이상 반복 ( = {1,} ) /ab+d/g
  • ad
  • abd
  • abdcdeabbbbdedb
  • ab
  • axd
? 0번 이나 1번 /e?le?/g
  • angel
  • angle
  • element
/abc\-?d/g
  • abc-d
  • abcd
. new line 을 제외한 모든 글자 /.n/g
  • nay, an apple is on the tree
  • nay
(x) x를 체크하고 체크한 값을 변수로 저장 /(f..) (b..)/
  • foo bar
    1th :foo
    2th :bar
(?:x) x를 체크하고 체크한 값을 변수로 저장하지 않음 /(?:f..) (b..)/
  • foo bar
    1th :bar
  • bar foo
x|y x 또는 y /green|red/
  • green apple
  • red apple
  • yellow apple
x(?=y) x후에 y가 나오고, x부분만 매칭되는 부분으로 간주 /blah(?=soft|hard)/
  • blahsoft
  • blahhard
  • blah soft
/blah(?=soft).*/
  • blahsoft
  • blahhard
  • blah soft
x(?!y) x가 나오고 그 뒤에 y가 있으면 안 됨 /blah(?!hard)/
  • blahsoft
  • blahhard
  • blah soft
{n} 앞에 지정한 것이 n개 /.{3}/
  • ab
  • abc
  • abcd
  • 홍길동
{n,} 앞에 지정한 것이 n개 이상 /.{3,}/
  • ab
  • abc
  • abcd
{n,m} 앞에 지정한 것이 n~m개 /.{3,5}/
  • ab
  • abc
  • abcd
  • 홍길동
[xyz] x나 y나 z. []안에는 얼마든지 쓸 수 있다. /[abc]{2}/
  • ab
  • abc
  • adbd
[x-z] x에서 z까지 /[a-z]{4,}/g
  • She sells sea shells by the sea shore는 Very 어렵다!
[^xyz] x,y,z를 제외한 나머지 모든 것 /[^a-z]{2,}/g
  • I'm a good man
  • I am A good Man
[\b] 백스페이스. \b와 혼동하지 말것. /[\b]/g
  • abcd
일반적인 String에서는 \b가 백스페이스를 의미한다.
\b 단어의 경계.[\b]와 혼동하지 말것. /\bn[a-z]/g
  • I am not a boy
  • online
  • nope
\B \b 를 제외한 전부 /\Bn[a-z]/g
  • noonday
  • online
  • nope
\cX 컨트롤X와 매칭. \cM은 컨트롤M과 매칭
\d 숫자.[0-9]와 같음 /\d/g
  • 7 eight 9
  • 123
/^0[0-9]{2}/g
  • 0120
  • 12011
\D \d 를 제외한 전부 /\D/g
  • 7 eight 9
  • 12?3
\f form-feed
\n new line
\r carriage return
\s white space
ex>탭, 띄어쓰기, \n, \r
/k\s/g
  • korea
  • blank is
  • blank
\S \s 를 제외한 전부 /k\S/g
  • korea
  • blank is
\t
\v vertical tab
\w 알파벳+숫자+_. [A-Za-z0-9_]와 동일 /\w/g
  • !@#$%^&*()+_-[]{}\|"':;,.<>?/
\W \w 빼고 전부 /\W/g
  • !@#$%^&*()+_-[]{}\|"':;,.<>?/
\n \n이 자연수일때, ()로 지정한 n번째 정규식 /(.{2})e tru\1 is out \1ere/
  • the truth is out there ...
    1th :th
(th)가 \1로 지정된다.
\xhh hh는 hexacode, /[\x21-\x40]/g
  • !@#$%^&*()po
Code table 보기
\uhhhh hhhh는 hexacode, /[\u3131-\u3163\uac00-\ud7a3]/g
  • blah .
코드 번호> 3131:ㄱ 3163:ㅣ ac00:가 d7a3:힣 (javascript, java)

4. 정규식 사용 예제

/^[0-9]/
  • 09없다
  • 100점
  • 집이 10평
/^\w+$/
  • blahsoft
  • blah(co)
  • blah soft
/^[a-zA-Z][\w\-]{4,11}$/
  • blah2010
  • blah-2010!
  • 2010blah
  • ILikegoooooooooooooooooogle
/^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}/
  • 02-6288-2114
  • 031-779-7114
  • 12-1234-5678
  • 02-6288-2114545
  • 02-0288-2114
/^0\d{1,2}-[1-9]\d{2,3}-\d{4}$/
  • 02-6288-2114
  • 031-779-7114
  • 12-1234-5678
  • 02-2123-12314545
  • 02-0288-2114
/^[\.a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/
  • r-d.blah.co.kr
  • r-d.blah.co.kr입니다.
  • blah..co.kr
  • a.com
/^(?:[\w\-]{2,}\.)+[a-zA-Z]{2,}$/
  • r-d.blah.co.kr
  • r-d.blah.co.kr입니다.
  • blah..co.kr
  • a.com
/^[_a-zA-Z0-9\-]+@[\._a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/
  • abc@haha.co.kr
  • abc@haha..co.kr
  • hwang@a.com
/^[\w\-]+@(?:[\w\-]{2,}\.)+[a-zA-Z]{2,}$/
  • abc@haha.co.kr
  • abc@haha..co.kr
  • hwang@a.com
/^([a-z]+):\/\/((?:[a-z\d\-]{2,}\.)+[a-z]{2,})(:\d{1,5})?(\/[^\?]*)?(\?.+)?$/i
  • http://www.blah.co.kr/main/index.jsp?var=value
    1th :http
    2th :www.blah.co.kr
    3th :
    4th :/main/index.jsp
    5th :?var=value
  • http://www.blah.co.kr/main/index.jsp
    1th :http
    2th :www.blah.co.kr
    3th :
    4th :/main/index.jsp
    5th :
  • http://blah.co.kr/
    1th :http
    2th :blah.co.kr
    3th :
    4th :/
    5th :
  • http://blah.co.kr
    1th :http
    2th :blah.co.kr
    3th :
    4th :
    5th :
  • http://blah.co.kr:8088/main/
    1th :http
    2th :blah.co.kr
    3th ::8088
    4th :/main/
    5th :
/^[ㄱ-ㅣ가-힣]+$/
  • 티맥스소프트
  • ㅜㅜ
  • ㅎㅎ

5. Javascript 정규식 함수

함수 코드예제 코드설명
Array RegExp.exec (to be checked)
var myRe=/d(b+)(d)/ig;
var myArray = myRe.exec("cdbBdbsbz");

/d(b+)(d)/ig

  • cdbBdbsbz
myArray.index =1 ; (처음으로 매칭되는 위치, 컴터가 늘 그렇듯 위치는 0번째부터 센다.)
myArray.input = cdbBdbsbz; (체크할 대상)
myArray[0] = dbBd;(검사에 통과한 부분)
myArray[1] = bB;(1번째 괄호에서 체크된 부분)
myArray[2] = d;(2번째 괄호에서 체크된 부분)

myRe.lastIndex =5 ; (다음번 체크를 하기위한 위치.)
myRe.ignoreCase = true; (/i 플래그 체크)
myRe.global = true; (/g 플래그 체크)
myRe.multiline = false; (/m 플래그 체크)

RegExp.$_ = cdbBdbsbz;(입력한 스트링)
RegExp.$1 = bB;(1번째 괄호에서 체크된 부분 )
boolean RegExp.test(to be checked)
var myRe=/d(b+)(d)/ig;
var checked = myRe.test("cdbBdbsbz");
document.write("checked = " + checked +";<br>");

/d(b+)(d)/ig

  • cdbBdbsbz
실행결과: checked = true;
String RegExp.toString()
var myRe=/d(b+)(d)/ig;
var str = myRe.toString();
document.write(str);

실행 결과: /d(b+)(d)/ig
String String.replace(pattern or string, to be replaced)
var str = "abcdefe";
document.write(str.replace("e" , "f"));
실행 결과: abcdffe

e가 2번 있지만, 첫번째 인자가 정규식이 아니라 문자열일 경우는 첫번째 것만 바꾼다.
var str = "aba";
document.write(str.replace(/^a/ , "c"));
실행 결과: cba
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
실행 결과: Smith, John

re에 의해서 찾아진 문자열 들은 re에서 ()로 표현된 순서대로 $1, $2와 같이 변수로 저장된다.
var re = /\s(?:http|https):\/\/\S*(?:\s|$)/g;
var str = "url is http://iilii.egloos.com/ !!\n";
str += "blah home: http://www.blah.co.kr";
newstr = str.replace(re, function (str,p1,offset,s) {
     return "<a href='" + str + "'>" + str + "</a>";
  }
).replace(/\n/, "<br>");
document.write(newstr);
url is http://iilii.egloos.com/ !!
blah home: http://www.blah.co.kr

str: 찾은 문자열
p1: ()에서 검색된 1번째 문자열. 마찬가지로 p2,p3 등도 가능
offset: str을 찾은 위치
s : 원본 문자열.
Array String.match(regular expression
var str = "ABCdEFgHiJKL";
var myResult = str.match(/[a-z]/g );
for(var cnt = 0 ; cnt < myResult.length; cnt++){
    document.write(cnt +":" + myResult[cnt] +"<br>");
}

document.write("비교<br>");

var str = "ABCdEFgHiJKL";
var myResult = /[a-z]/g.exec(str);
for(var cnt = 0 ; cnt < myResult.length; cnt++){
    document.write(cnt +":" + myResult[cnt] +"<br>");
}
실행 결과:
0:d
1:g
2:i
비교
0:d

String.match(RegExp) =>g flag가 있으면 다 찾아낸다.
RegExp.exec(String) =>g flag가 있어도, 한 개만 찾고 끝낸다.
Array String.split([separator[, limit]])
var str = "ABCdEFgHiJKL";
var myResult = str.split(/[a-z]/g , 3);
for(var cnt = 0 ; cnt < myResult.length; cnt++){
    document.write(cnt +":" + myResult[cnt] +"<br>");
}
실행 결과:
0:ABC
1:EF
2:H

주어진 문자열을 separator를 기준으로 limit 만큼 자른다.

6. 정규식으로 만든 유용한 Javascript 함수

String removeTags(input)

HTML tag부분을 없애준다
function removeTags(input) {
    return input.replace(/<[^>]+>/g, ""); 
};
example>
var str = "<b>blah</b> <i>soft</i>";
document.write(str +"<br>");
document.write(removeTags(str));
result>
blah soft
blah soft

String String.trim()

문자열의 앞뒤 공백을 없애준다.
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ''); 
};
example>
var str = "         untrimed string            ";
document.write("========" + str+ "==============<br>");
document.write("========" + str.trim() + "==============");
result>
======== untrimed string ==============
========untrimed string==============

String String.capitalize()

단어의 첫 글자를 대문자로 바꿔준다.
String.prototype.capitalize = function() {
    return this.replace(/\b([a-z])/g, function($1){
        return $1.toUpperCase();
    }) ;  
};
example>
var str = "korea first world best";
document.write(str.capitalize());
result>
Korea First World Best

String number_format(input)

입력된 숫자를 ,를 찍은 형태로 돌려준다
function number_format(input){
    var input = String(input);
    var reg = /(\-?\d+)(\d{3})($|\.\d+)/;
    if(reg.test(input)){
        return input.replace(reg, function(str, p1,p2,p3){
                return number_format(p1) + "," + p2 + "" + p3;
            }    
        );
    }else{
        return input;
    }
}
example>
document.write(number_format(1234562.12) + "<br>");
document.write(number_format("-9876543.21987")+ "<br>");
document.write(number_format("-123456789.12")+ "<br>");
result>
1,234,562.12
-9,876,543.21987
-123,456,789.12

7. Java 정규식 함수

Pattern p = Pattern.compile("(a*)(b)");
Matcher m = p.matcher("aaaaab");
if (m.matches()) {
    for (int i = 0; i < m.groupCount() + 1; i++) {
        System.out.println(i + ":" + m.group(i));
    }
} else {
    System.out.println("not match!");
}

result>
0:aaaaab
1:aaaaa
2:b
0번째는 매칭된 부분.
String a = "I love her";
System.out.println(a.replaceAll("([A-Z])", "\"$1\""));

result>
"I" love her
자바도 $1을 쓸 수 있다.
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "dog");
    System.out.println(sb.toString());
}
m.appendTail(sb);
System.out.println(sb.toString());

result>
one dog
one dog two dog
one dog two dogs in the yard

Posted by iWithJoy
JAVA/Regular Expression2013. 3. 6. 13:58

어플리케이션들을 만들다 보면 종종 단어 검색, 메일 주소 점검, XML 문서의 무결성 확인 등과 같은 복잡한 문자열 처리 기능이 필요한 경우가 있게 마련이다. 이런 때에 패턴 매칭(pattern matching)이 자주 사용된다. Perl과 sed, awk와 같은 언어들은 일치하는 텍스트를 검색하기 위해, 패턴을 정의하는 문자들과 정규표현식을 사용해 향상된 패턴 매칭 능력을 제공해 주고 있다. 자바에서 패턴 매칭을 사용하려면 StringTokenizer 클래스와 수많은 charAt, substring 메소드를 동원해야만 한다. 하지만 이런 방식은 종종 아주 복잡하고 지저분한 코드를 만들어내곤 한다.

 

하지만모두지금까지의이야기일Java 2 Platform, Standard Edition(J2SE)1.4넘어오면서정규표현식을다룰있는java.util.regex라는새로운패키지가추가되었다.이제자바에도정규표현식의강력함을맛볼있는메타캐릭터들을사용할있게되었다.

 

이번글에서는정규표현식에대해간단히설명하고,아래의과정에따라java.util.regex패키지를통해정규표현식을활용하는방법에대해자세히설명하도록하겠다.

 

l       단어바꾸기

l       메일주소점검

l       파일에서제어문자제거

l       파일검색

 

(글의예제들을실행시켜보려면J2SE 1.4호환컴파일러와가상머신이필요함)

 

정규표현식만들기

정규표현식이란여러문자열들의공통적인특성을기술하는문자들의패턴이다. java.util.regex패키지를보면입력데이터로부터패턴을찾고수정할있는다양한방법들이제공됨을확인할있을것이다.

 

정규표현식의가장단순한형태는‘Java’, ‘programming’같은일반적인문자열이다.또한메일주소와같이특수한포맷을갖는문자열을검증등도가능하다.

 

정규표현식에는일반문자들과특수문자들이혼용되어사용된다.

 

\$

^

.

*

+

?

[

]

\.

 

 

 

 

‘\’시작하는문자열을제외한모든문자들은보통문자를의미한다.

 

특수문자들은물론고유한기능을갖고있다.예를들어‘.’경우라인종결문자를제외한어떤문자와도대응될있다.따라서정규표현식s.n‘sun’, ‘son’등과같이‘s’시작하고‘n’으로끝나는자로문자열어떤것이든있다.

 

이와같이우리는정규표현식에서제공되는여러특수문자들을통해줄의시작단어를찾거나,특정범위의문자찾기,대소문자구별없이찾기,정확히일치하는단어찾기등의작업을쉽게처리할있다.

 

java.util.regex패키지에서제공하는정규표현식은Perl언어에서의정규표현식사용법과같기때문에Perl익숙한사용자라면같은문법을그대로자바에도적용할있다.만약정규표현식에익숙하지않다면아래표가많은도움이것이다.

Construct

Matches

Characters

 

X

The characterx

\\

The backslash character

\0n

The character with octal value0n(0 <= n <= 7)

\0nn

The character with octal value0nn(0 <= n <= 7)

\0mnn

The character with octal value0mnn(0 <= m <= 3, 0 <= n <= 7)

\xhh

The character with hexadecimal value 0xhh

\uhhhh

The character with hexadecimal value 0xhhhh

\t

The tab character ('\u0009')

\n

Thenewline(line feed) character ('\u000A')

\r

The carriage-return character ('\u000D')

\f

The form-feed character ('\u000C')

\a

The alert (bell) character ('\u0007')

\e

The escape character ('\u001B')

\cx

The control character corresponding tox

 

 

Character Classes

[abc]

a,b, orc(simple class)

[^abc]

Any character excepta,b, orc(negation)

[a-zA-Z]

athroughzorAthroughZ, inclusive (range)

[a-z-[bc]]

athroughz, except forbandc:[ad-z](subtraction)

[a-z-[m-p]]

athroughz, except formthroughp:[a-lq-z]

[a-z-[^def]]

d,e, orf

 

 

Predefined Character Classes

.

Any character (may or may not match line terminators)

\d

A digit:[0-9]

\D

A non-digit:[^0-9]

\s

Awhitespacecharacter:[ \t\n\x0B\f\r]

\S

A non-whitespacecharacter:[^\s]

\w

A word character:[a-zA-Z_0-9]

\W

A non-word character:[^\w]

보다자세한설명과예제는J2SE 1.4 API문서의java.util.regex.Pattern참조하도록하자.

 

클래스와메소드

 

Pattern클래스

Pattern객체는Perl문법과비슷한형태로정의된정규표현식을나타낸다.

 

문자열로정의한정규표현식은사용되기전에반드시Pattern클래스의인스턴스로컴파일되어야한다.컴파일된패턴은Matcher객체를만드는사용되며, Matcher객체는임의의입력문자열이패턴에부합되는여부를판가름하는기능을담당한다.또한Pattern객체들은비상태유지객체들이기때문에여러개의Matcher객체들이공유할있다.

 

다음은Pattern클래스의주요메소드들에대한설명이다.

 

static Pattern compile(Stringregex):주어진정규표현식으로부터패턴을만들어낸다(이를컴파일한다표현한다).
static Matchermatcher(CharSequenceinput):
입력캐릭터시퀀스에서패턴을찾는Matcher객체를만든다.
String[] pattern():
컴파일된정규표현식을String형태로반환한다.
String[] split(CharSequenceinput):
주어진입력캐릭터시퀀스를패턴에따라분리한다.

 

/*

 * split메소드를이용해입력시퀀스를콤마(‘,’)공백문자를기준으로

 *나눈다.

 */

import java.util.regex.*;

 

public class Splitter {

   public static void main(String[] args) throws Exception {

       //이상의연속된‘,’공백문자를의미하는패턴을만든다.

       Pattern p =Pattern.compile("[,{space}]+");

       //패턴에따라입력문자열을쪼갠다.

       String[] result =

                p.split("one,two, three  four , five");

       for (inti=0;i<result.length;i++)

           System.out.println(result[i]);

   }

}

 

Matcher클래스

Matcher객체는특정한문자열이주어진패턴과일치하는가를알아보는데이용된다. Matcher클래스의입력값으로는CharSequence라는새로운인터페이스가사용되는데이를통해다양한형태의입력데이터로부터문자단위의매칭기능을지원받을있다.기본적으로제공되는CharSequence객체들은CharBuffer, String,StringBuffer클래스가있다.

 

Matcher객체는Pattern객체의matcher메소드를통해얻어진다. Matcher객체가일단만들어지면주로가지목적으로사용된다.

 

l       주어진문자열전체가특정패턴과일치하는가를판단(matches).

l       주어진문자열이특정패턴으로시작하는가를판단(lookingAt).

l       주어진문자열에서특정패턴을찾아낸다(find).

 

이들메소드는성공true실패false반환한다.

 

또한특정문자열을찾아새로운문자열로교체하는기능도제공된다.

 

appendRepalcement(StringBuffersb, String replacement)메소드는일치하는패턴이나타날때까지의모든문자들을버퍼(sb)옮기고찾아진문자열대신교체문자열(replacement)채워넣는다.또한appendTail(StringBuffersb)메소드는캐릭터시퀀스의현재위치이후의문자들을버퍼(sb)복사해넣는다.다음절에나오는예제코드를참고하도록하자.

 

CharSequence인터페이스

 

CharSequence인터페이스는다양한형태의캐릭터시퀀스에대해일관적인접근방법을제공하기위해새로생겨났다.기본적으로String,StringBuffer,CharBuffer클래스가이를구현하고있으므로적절한것을골라사용하면되며,인터페이스가간단하므로필요하면직접이를구현해새로하나만들어도된다.

 

ExampleRegexScenarios

아래코드는J2SE 1.4도큐먼트의예제를완성한것이다.

 

/*

 *코드는"One dog, two dogs in the yard."라는문자열을

 *표준출력을통해출력한다.

 */

import java.util.regex.*;

 

public class Replacement {

   public static void main(String[] args)

                        throws Exception {

       // ‘cat’이라는패턴생성

       Pattern p =Pattern.compile("cat");

       //입력문자열과함께매쳐클래스생성

       Matcher m =p.matcher("one cat," +

                      " two cats in the yard");

       StringBuffersb= newStringBuffer();

       booleanresult =m.find();

       //패턴과일치하는문자열을‘dog’으로교체해가며

       //새로운문자열을만든다.

       while(result) {

           m.appendReplacement(sb, "dog");

           result =m.find();

       }

       //나머지부분을새로운문자열끝에덫붙인다.

       m.appendTail(sb);

       System.out.println(sb.toString());

   }

}

 

메일주소포맷확인

다음코드는주어진입력시퀀스가메일주소포맷인가를판단한다.코드는가능한모든형태의메일주소를확인하는것은아니니필요하면코드를추가해사용하자.

 

/*

*메일주소에서잘못된문자검사

*/

public classEmailValidation{

  public static void main(String[] args)

                                throws Exception {

                                

     String input = "@sun.com";

     //메일주소가‘.’이나‘@’같은잘못된문자로시작하는확인

     Pattern p =Pattern.compile("^\\.|^\\@");

     Matcher m =p.matcher(input);

     if (m.find())

        System.err.println("Email addresses don't start" +

                           " with dots or @ signs.");

     //’www.’으로시작하는주소를찾는다.

     p =Pattern.compile("^www\\.");

     m =p.matcher(input);

     if (m.find()) {

       System.out.println("Email addresses don't start" +

               " with \"www.\", only web pages do.");

     }

     p =Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+");

     m =p.matcher(input);

     StringBuffersb= newStringBuffer();

     booleanresult =m.find();

     booleandeletedIllegalChars= false;

 

     while(result) {

        deletedIllegalChars= true;

        m.appendReplacement(sb, "");

        result =m.find();

     }

 

m.appendTail(sb);

 

     input =sb.toString();

 

     if (deletedIllegalChars) {

        System.out.println("It contained incorrect characters" +

                          " , such as spaces or commas.");

     }

  }

}

 

파일에서제어문자제거

 

/*

*지정된파일에서제어문제를찾아제거한다.

*/

import java.util.regex.*;

importjava.io.*;

 

public class Control {

   public static void main(String[] args)

                                throws Exception {

                                

       //파일객체생성

        File fin = new File("fileName1");

       Filefout= new File("fileName2");

       //입출력스트림생성

       FileInputStreamfis=

                         newFileInputStream(fin);

       FileOutputStreamfos=

                       newFileOutputStream(fout);

 

       BufferedReaderin = newBufferedReader(

                      newInputStreamReader(fis));

       BufferedWriterout = newBufferedWriter(

                     newOutputStreamWriter(fos));

 

       //제어문자를의미하는패턴생성

       Pattern p =Pattern.compile("{cntrl}");

       Matcher m =p.matcher("");

       StringaLine= null;

       while((aLine=in.readLine()) != null) {

           m.reset(aLine);

           //제어문자들을문자열로대체

           String result =m.replaceAll("");

            out.write(result);

           out.newLine();

       }

       in.close();

       out.close();

   }

}

 

파일검색

 

/*

 * .java파일에서주석을찾아출력한다.

 */

import java.util.regex.*;

importjava.io.*;

importjava.nio.*;

importjava.nio.charset.*;

importjava.nio.channels.*;

 

public classCharBufferExample{

   public static void main(String[] args) throws Exception {

       //주석을나타내는패턴생성

       Pattern p =

           Pattern.compile("//.*$",Pattern.MULTILINE);

       

       //소스파일

       File f = new File("Replacement.java");

       FileInputStreamfis= newFileInputStream(f);

       FileChannelfc=fis.getChannel();

       

       //소스파일로부터CharBuffer생성

       ByteBufferbb =

           fc.map(FileChannel.MAP_RO, 0, (int)fc.size());

        Charsetcs=Charset.forName("8859_1");

       CharsetDecodercd=cs.newDecoder();

       CharBuffercb=cd.decode(bb);

       

       //매칭작업수행

       Matcher m =p.matcher(cb);

       while (m.find())

           System.out.println("Found comment: "+m.group());

   }

}

 

출처: 복연 [wegra@wegra.org] 자바스터디 네트워크[http://javastudy.co.kr]

'JAVA > Regular Expression' 카테고리의 다른 글

replaceAll 정규식 팁!  (0) 2013.03.22
정규식과 보안  (0) 2013.03.04
Posted by iWithJoy
JAVA/Regular Expression2013. 3. 4. 17:53

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

 

 

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

 

정규식

 

[abc]
 a, b, or c (simple class) -- a나 b나 c중의 하나
 
[^abc]
 Any character except a, b, or c (negation) -- a나 b나 c만 아니면 된다.
 
[a-zA-Z]
 a through z or A through Z, inclusive (range) -- 정규식은 대소문자를 구분한다.
 
[a-d[m-p]]
 a through d, or m through p: [a-dm-p] (union) -- 위에 것과 같다 a~d 혹은 m~p의 값이 들어오면 참이다
 
[a-z&&[def]]
 d, e, or f (intersection) -- 소문자 a~z까지 범위중 def중 하나와 같은것 이면 참이다. 즉 교집합과 같다.
 
[a-z&&[^bc]]
 a through z, except for b and c: [ad-z] (subtraction) -- 소문자 a~z까지의 범위중 b나 c가 아니면 참이다
 
[a-z&&[^m-p]]
 a through z, and not m through p: [a-lq-z](subtraction) -- 소문자 a~z까지의 범위중 m~p사의 것이 아니면 참이다.
 

 
.
 Any character (may or may not match line terminators)
 
\d
 A digit: [0-9] -- 0~9까지의 숫자 면 참
 
\D
 A non-digit: [^0-9] -- 0~9의 숫자가 아닌것이면 참
 
\s
 A whitespace character: [ \t\n\x0B\f\r]
 
\S
 A non-whitespace character: [^\s]
 
\w
 A word character: [a-zA-Z_0-9]
 
\W
 A non-word character: [^\w]
  

while(cnt != 3){

String str = sc.next();

boolean boo = str.matches("1-9"); -- 1-9만 받아들인다 equals와 같아진다.

System.out.println(boo);

cnt++;

}

   

 XY
 X followed by Y
 
X|Y
 Either X or Y
 
(X)
 X, as a capturing group -- 괄호 사용시 하나의 묶음이 된다.
 

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

 

 ip주소 자바 정규식

 

public static final String IPV4_REGEX = "\\A(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z"; 

 

public static final String IPV6_HEX4DECCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z"; 

 

public static final String IPV6_6HEX4DEC_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)(\\.(25[0-5]2[0-4]\\d[0-1]?\\d?\\d)){3}\\z";

 

 public static final String IPV6_HEXCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z"; public static final String IPV6_REGEX = "\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z";
 

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

 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>업로드 파일확장자 검사</title>
<script language=javascript>

 

function checkExt()
{

    var IMG_FORMAT = "\\.(bmp|gif|jpg|jpeg|png)$";

 

    if((new RegExp(IMG_FORMAT, "i")).test(document.form1.text1.value)) return true;

 

    alert("이미지 파일만 첨부하실 수 있습니다.   ");
    return false;
}

 

</script>
</head>
<body>
<form name=form1 method=post onsubmit="return checkExt()"

    encType="multipart/form-data">
<input type=file name=text1>
<input type=submit>
</form>
</body>
</html>

 

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

 

□ JSP

 o 취약한 파일 업로드 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
<%
String savePath="/var/www/uploads";// 업로드 디렉토리
int sizeLimit = 5 * 1024 * 1024 ;// 업로드 파일 사이즈 제한

try
MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());
Enumeration formNames=multi.getFileNames();// 폼의 이름 반환
String formName=(String)formNames.nextElement();
String fileName=multi.getFilesystemName(formName);// 파일의 이름 얻기

if(fileName == null)
out.print("Error");
 else
fileName=new String(fileName.getBytes("8859_1"),"euc-kr");
out.print("User Name : " + multi.getParameter("userName") + "<BR>");
out.print("Form Name : " + formName + "<BR>");
out.print("File Name  : " + fileName);


 catch(Exception e)
out.print("Error");
 
%> 

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


 o 안전한 파일 업로드 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
<%
String savePath="/var/www/uploads";// 업로드 디렉토리
int sizeLimit = 5 * 1024 * 1024 ; // 업로드 파일 사이즈 제한

try
MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, "euc-kr", new DefaultFileRenamePolicy());
Enumeration formNames=multi.getFileNames();  // 폼의 이름 반환
String formName=(String)formNames.nextElement();
String fileName=multi.getFilesystemName(formName); // 파일의 이름 얻기

String file_ext = fileName.substring(fileName.lastIndexOf('.') + 1);
if(!( file_ext.equalsIgnoreCase("hwp") || file_ext.equalsIgnoreCase("pdf") || file_ext.equalsIgnoreCase("jpg")) )
out.print("업로드 금지 파일");


if(fileName == null)
out.print("파일 업로드 실패");
 else
fileName=new String(fileName.getBytes("8859_1"),"euc-kr"); // 한글인코딩
out.print("File Name  : " + fileName);

 catch(Exception e)

 

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

 

download.jsp

<%@ page contentType="application;" %>

<%@ page language="java" import="java.util.*,java.io.*,java.sql.*,java.text.*" %>

<%@ include file="boardcfg.jsp" %>

<%

String mask = request.getParameter("mask");


String fileP = request.getRealPath("/")+"upload/";
String fileN1 = "", fileN2 = "";
long fSize = 0;

String queryw = " WHERE maskname = ? ";
String query = "SELECT filename, filesize from "+tableName+" " + queryw;
String query2 = "update "+tableName+" SET download = download + 1 " + queryw;

Connection pconn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
%>

<%@ include file = "db.jsp"%>

<%
pstmt = pconn.prepareStatement(query);
pstmt.setString(1,mask);
rs = pstmt.executeQuery();

if(rs.next()) {
        fileN1 = mask;
        fileN2 = rs.getString("filename");
        fileN2 = new String(fileN2.getBytes("euc-kr"),"8859_1");
        fSize = rs.getInt("filesize");
}

rs.close();
pstmt.clearParameters();

pstmt = pconn.prepareStatement(query2);
pstmt.setString(1,mask);
pstmt.executeUpdate();

pstmt.close();

} catch(Exception e){
} finally {
 if (pstmt!=null) pstmt.close();
 if (pconn!=null) pconn.close();
}

// Download file
String ut = fileP+fileN1;

File file = new File(ut); // 절대경로입니다.
byte b[] = new byte[(int)file.length()];
 String strClient=request.getHeader("User-Agent");
           if(strClient.indexOf("MSIE 5.5")>-1) {
 response.setHeader("Content-Disposition", "filename=" + fileN2 + ";");
           } else {
 response.setHeader("Content-Disposition", "attachment;filename=" + fileN2 + ";");
           }
if (fSize > 0 && file.isFile())
{
 BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
 BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
 int read = 0;
 try {
  while ((read = fin.read(b)) != -1){
             outs.write(b,0,read);
  }
  outs.close();
  fin.close();
 } catch (Exception e) {
  System.out.println(e.getMessage());
 } finally {
  if(outs!=null) outs.close();
  if(fin!=null) fin.close();
 }
}
%>

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

파일명을 특정 규칙에 맞는지 검사하는 javascript

/* 영문, 숫자, 언더바(_), 하이픈(-)만 가능 */
function checkInputFileName(fileName) {
var fileNameMatch = new RegExp(/^[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/);

if(fileNameMatch.test(fileName)) {
return true;
}
return false;
}

정규식을 이용하였기 때문에 여러가지로 응용이 가능할 듯 하다.

정규식을 살펴 보면
/^[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/
=>입력의 시작부터 A-Z, a-z, 0-9, _, - 중 하나 이상의 문자가 포함되고 . 이후에 다시 A-Z, a-z, 0-9, _, - 중 하나 이상의 문자가 포함되며 이후 입력이  종료 된다.
ex) a.b (O), aabc01.bbdd0 (O), abcc. (X) , #a.b (X)
#a.b의 경우 /[A-Za-z0-9_\-]{1,}\.[A-Za-z0-9_\-]{1,}$/ 이 정규식을 적용하면 true가 되나 ^ 가 포함된 위의 정규식을 적용하면 정규식에 매칭되는 a.b 앞에 아무 문자도 없어야 하므로 false가 된다.

/ reg exp / : /를 사용하여 정규식의 시작과 끝을 알린다.
^ : 입력의 시작 부분을 찾는다.
[abc] : 괄호 안의 문자중 하나를 찾음. 예를 들어 [ab]는 "plain"의 "a"를 찾는다.
[a-z] : a부터 z를 포함하는 문자를 의미한다.
\ : 다음에 오는 문자를 특수 문자로 표시함. [a-z]는 a부터z를 의미하지만 [a\-z]는 a와 -와 z를 의미한다.
{n,[m]} : n,m은 음이 아닌 정수. 최소n번 최대 m번 일치하는 문자열

 

'JAVA > Regular Expression' 카테고리의 다른 글

replaceAll 정규식 팁!  (0) 2013.03.22
Java 정규 표현식 사용하기  (0) 2013.03.06
Posted by iWithJoy
카테고리 없음2012. 12. 22. 11:55

성경일독표

◀ 성경읽기표 ▶                     주의 말씀은 내 발에 등이요 내 길에 빛이니이다 (시119:105)

1주

창1~3

창4~6

창7~9

창10~12

창13~15

창16~18

창19~21

 

27주

잠25~27

잠28~31

전1~3

전4~6

전7~9

전10~12

아1~4

2주

창22~24

창25~27

창28~30

창31~33

창34~36

창37~39

창40~42

 

28주

아5~8

사1~3

사4~6

사7~9

사10~12

사13~15

사16~18

3주

창43~45

창46~48

창49~50

출1~3

출4~6

출7~9

출10~12

 

29주

사19~21

사22~24

사25~27

사28~30

사31~33

사34~36

사37~39

4주

출13~15

출16~18

출19~21

출22~24

출25~27

출28~30

출31~33

 

30주

사40~42

사43~45

사46~48

사49~51

사52~54

사55~57

사58~60

5주

출34~36

출37~40

레1~3

레4~6

레7~9

레10~12

레13~15

 

31주

사61~63

사64~66

렘1~3

렘4~6

렘7~9

렘10~12

렘13~15

6주

레16~18

레19~21

레22~24

레25~27

민1~3

민4~6

민7~9

 

32주

렘16~18

렘19~21

렘22~24

렘25~27

렘28~30

렘31~33

렘34~36

7주

민10~12

민13~15

민16~18

민19~21

민22~24

민25~27

민28~30

 

33주

렘37~39

렘40~42

렘43~45

렘46~48

렘49~50

렘51~52

애1~2

8주

민31~33

민34~36

신1~3

신4~6

신7~9

신10~12

신13~15

 

34주

애3~5

겔1~3

겔4~6

겔7~9

겔10~12

겔13~15

겔16~18

9주

신16~18

신19~21

신22~24

신25~27

신28~30

신31~34

수1~3

 

35주

겔19~21

겔22~24

겔25~27

겔28~30

겔31~33

겔34~36

겔37~39

10주

수4~6

수7~9

수10~12

수13~15

수16~18

수19~21

수22~24

 

36주

겔40~42

겔43~45

겔46~48

단1~3

단4~6

단7~9

단10~12

11주

삿1~3

삿4~6

삿7~9

삿10~12

삿13~15

삿16~18

삿19~21

 

37주

호1~3

호4~7

호8~11

호12~14

요엘

1~3

아모스

1~3

아모스4~6

12주

룻1~4

삼상

1~4

삼상

5~8

삼상

9~12

삼상

13~16

삼상

17~20

삼상

21~24

 

38주

아모스

7~9

오바댜1

요나

1~4

미가

1~3

미가

4~7

나훔

1~3

하박국

1~3

13주

삼상

25~28

삼상

29~31

삼하

1~4

삼하5~8

삼하

9~12

삼하

13~16

삼하

17~20

 

39주

스바냐

1~3

학개

1~2

스가랴

1~4

스가랴5~7

스가랴8~10

스가랴11~14

말라기

1~4

14주

삼하

21~24

왕상

1~4

왕상5~7

왕상

8~10

왕상

11~14

왕상

15~18

왕상

19~22

 

40주

마1~3

마4~6

마7~9

마10~12

마13~15

마16~18

마19~21

15주

왕하

1~4

왕하5~8

왕하

9~12

왕하

13~16

왕하

17~20

왕하

21~25

대상

1~4

 

41주

마22~24

마25~26

마27~28

막1~3

막4~6

막7~9

막10~12

16주

대상5~8

대상

9~12

대상

13~16

대상

17~20

대상

21~24

대상

25~29

대하

1~4

 

42주

막13~16

눅1~3

눅4~6

눅7~9

눅10~12

눅13~15

눅16~18

17주

대하5~8

대하

9~12

대하

13~16

대하

17~20

대하

21~24

대하

25~28

대하

29~32

 

43주

눅19~21

눅22~24

요1~3

요4~6

요7~9

요10~12

요13~15

18주

대하

33~36

1~4

스5~7

스8~10

느1~3

느4~7

느8~10

 

44주

요16~18

요19~21

행1~3

행4~6

행7~9

행10~12

행13~15

19주

느11~13

에1~3

에4~6

에7~10

욥1~3

욥4~6

욥7~9

 

45주

행16~18

행19~21

행22~24

행25~26

행27~28

롬1~3

롬4~6

20주

욥10~12

욥13~15

욥16~18

욥19~21

욥22~24

욥25~27

욥28~30

 

46주

롬7~8

롬9~11

롬12~13

롬14~16

고전

1~3

고전

4~6

고전

7~9

21주

욥31~33

욥34~36

욥37~39

욥40~42

시1~5

시6~10

시11~15

 

47주

고전

10~12

고전

13~14

고전

15~16

고후

1~3

고후

4~6

고후

7~9

고후

10~13

22주

시16~20

시21~25

시26~30

시31~35

시36~40

시41~45

시46~50

 

48주

갈1~3

갈4~6

엡1~3

엡4~6

빌1~4

골1~4

살전

1~3

23주

시51~55

시56~60

시61~65

시66~70

시71~75

시76~80

시81~85

 

49주

살전

4~5

살후

1~3

딤전

1~3

딤전

4~6

딤후

1~4

딛1~3

몬1

24주

시86~90

시91~95

96~100

101~105

106~110

111~115

116~120

 

50주

히1~3

히4~6

히7~9

히10~11

히12~13

약1~2

약3~5

25주

121~125

126~130

131~135

136~140

141~145

146~150

잠1~3

 

51주

벧전

1~2

벧전

3~5

벧후

1~3

요일

1~2

요일

3~5

요이,삼/유

계1~3

26주

잠4~6

잠7~9

잠10~12

잠13~15

잠16~18

잠19~21

잠22~24

 

52주

계4~6

계7~9

계10~12

계13~15

계16~18

계19~20

계21~22


* 하루 3장 밀리면 그것도 쉽지 않죠. 열심히 일독합시다.

 

갓피플 성경: http://bible.godpeople.com

 

 

성경 통독(1년 1독)을 위한 프로그램

   

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주

31주

32주

33주

34주

35주

36주

37주

38주

39주

40주

41주

42주

43주

44주

45주

46주

47주

48주

49주

50주

51주

52주

 

 

 

 

 

Posted by iWithJoy
Server2012. 12. 14. 11:29

Wowza에서는 관리툴인 JConsole을 사용하여 메모리, CPU사용, application별 connection 현황 등을 파악할 수 있다.
Wowza에서 JConsole을 사용하기 위해서는 Server.xml 파일의 <JMXRemoteConfiguration> 태그 단을 수정해야 한다.
그리고 JConsole 접속 admin 패스워드도 수정한다. 디폴트는 admin/admin으로 잡혀 있다.

# vi /usr/local/WowzaMediaServer/conf/Server.xml

  
 <Root>
   <Server>
      <JMXRemoteConfiguration>
         <Enable>true</Enable>
            <IpAddress>localhost or 서버IP</IpAddress>
               <RMIServerHostName>서버IP</RMIServerHostName> 
  

 

# vi /usr/local/WowzaMediaServer/conf/jmxremote.password

  
 admin admin => 관리자 아이디와 패스워드를 스페이스로 구분해서 수정  
 

JConsole 실행 후 나타나는 접속 입력 창에서

Remote Process 선택 후

 

service:jmx:rmi://서버IP:8084/jndi/rmi://서버IP:8085/jmxrmi

 

입력하고, 위의 jmxremote.password 에서 수정한 아이디와 패스워드를 입력한다.

 

Posted by iWithJoy
Server2012. 12. 13. 17:03

 

Wowza Media Sever2 설치는 시키는 데로만 하면 되므로 어려운 것은 없습니다.

 

1. http://www.wowzamedia.com/store.html 에서 설치파일을 다운로드 합니다.

 

2. Wowza Server Developer edition의 GET FREE를 통해 등록하고 키를 이메일로 받는다.

 

3. 설치파일을 실행합니다.

 

4. Java Runtime 이 없다면 1.5 이상을 설치합니다. http://www.java.com/ko

 

5. Wowza Startup 을 실행합니다.

 

6. http://localhost:1935/ 로 접속해서 Wowza Media Server 버전이 표시된다면 성공입니다.!

Wowza Media Server 2 Developer 2.0.0 build22912

 

이제 설치 및 실행은 끝난 상태... 테스트를 해 보겠습니다.

 

[설치폴더]\application 에 vod 폴더를 생성합니다.

 

[설치폴더]\conf 에 vod 폴더를 생성합니다.

 

[설치폴더]\conf 의 application,xml 파일은 vod 폴더에 복사합니다.

 

/conf/vod/Application.xml에 iPhone용 Streamer인 cupertinostreaming이 설정되어 있는지 확인합니다.

 

<HTTPStreamers>sanjosestreaming,cupertinostreaming,smoothstreaming</HTTPStreamers>   

 Wowza Server를 시작한 후 아이폰 또는 아이팟터치에서

 

<html>
<video src="http://[SERVER-IP]:1935/vod/mp4:Extremists.m4v/playlist.m3u8" width=120 height=90 controls=true />
</html>

 

과 같은 웹페이지에 접속하면 재생되는 것을 확인할 수 있습니다.

안드로이드폰이나 퀵타임플레이어 에서 재생하기 위해서는

먼저 /conf/vod/Application.xml 의 RTP/Authentication/PlayMethod 를 none으로 해주어야 합니다.

  <RTP>

   <Authentication>
    <PublishMethod>digest</PublishMethod>
    <PlayMethod>none</PlayMethod>
   </Authentication>

 

접속은 rtsp://[SERVER-IP]:1935/vod/mp4:Extremists.m4v 와 같이 하면 됩니다.

 

안드로이드에서 재생이 안될 경우에는 vhost.xml에서 포트 554를 함께 열어주시고, rtsp://[SERVER-IP]/vod/mp4:Extremists.m4v 과 같이 접속하여 재생하여 보시기 바랍니다.

 

    <Port>1935, 554</Port>

또는 [설치폴더]\examples\SimpleVideoStreeaming\Client\ 의 소스를 실행하여

 

Server에는 "rtmp://[SERVER-IP]:1935/vod

 

Stream에는 mp4:Extremists.m4v 를 넣어주고 Play 버튼을 눌러주면 재생을 확인할 수 있습니다.

 

 

테스트가 끝나고 실제 서비스시에는

 

윈도우 :

[서비스 - Wowza Media Server] - 시작,

시작유형 - 자동

 

리눅스 :

/etc/init.d/WowzaMediaServer start

chkconfig --level 345 WowzaMediaServer on

 

출처: http://cafe.naver.com/wowzamedia/17

 

vhost.xml에서 포트 554여는 방법은 어떻게 하는 건가요?

Vhost.xml의 hostport에 <Port>1935, 554</Port> 과 같이 554를 추가해주면 됩니다.

 

"재생할 수 없는 동영상입니다"의 경우,

application.xml 의 <playmethod>digest</playmethod>를
<playmethod>none</playmethod>으로 바꿔줘야 한다.

 

아이폰 실행 성공!
<video src=http://[SERVER-IP]:1935/vod/mp4:Extremists.m4v/playlist.m3u8" width=120 height=90 controls=true />

 

c:\Program Files (x86)\Wowza Media Systems\Wowza Media Server 2.2.2\conf\Application.xml

Line 26:

  <Streams>
   <StreamType>default</StreamType>
   <StorageDir>d:\asfRoot</StorageDir>
   <KeyDir>${com.wowza.wms.context.VHostConfigHome}/keys</KeyDir>
   <!-- LiveStreamPacketizers (separate with commas): cupertinostreamingpacketizer, smoothstreamingpacketizer, sanjosestreamingpacketizer, cupertinostreamingrepeater, smoothstreamingrepeater, sanjosestreamingrepeater -->
   <LiveStreamPacketizers></LiveStreamPacketizers>   
   <!-- Properties defined here will override any properties defined in conf/Streams.xml for any streams types loaded by this application -->
   <Properties>
   </Properties>
  </Streams>

Line 54:

   <Authentication>
    <PublishMethod>digest</PublishMethod>
    <PlayMethod>none</PlayMethod>
   </Authentication>

c:\Program Files (x86)\Wowza Media Systems\Wowza Media Server 2.2.2\conf\VHost.xml

Line 10:

    <Port>1935, 554</Port>

 

C:\Program Files (x86)\Wowza Media Systems\Wowza Media Server 2.2.2\examples\SimpleVideoStreaming\client\simplevideostreaming.html

Server: rtmp://localhost/vod/121209

Stream: mp4:121209_2_bh.mp4 [Play]

 

Wowza Media server로 스트리밍 재생 시, 디폴트값으로 한글파일명의 동영상은 재생이 안된다.

한글파일을 인식하기 위해서는 /Wowza 디렉토리/conf/log4j.properties 파일을 수정하면 가능해진다.

 # vi /서버 디렉토리/conf/log4j.properties
Line 16:

#log4j.appender.[appender].encoding=UTF-8 -> 주석 해제

http://www.wowzamedia.com/forums/showthread.php?t=6029

 

 

한글 폴더나 한글 파일을 사용하셔야 하는 경우,

http://www.wowza.com/forums/content.php?116 에서

해당 버전의 StreamNameAlias AddOn 을 다운로드 받아 설치하고,

 

사용할 어플리케이션의 Application.xml에

 

   <Module>
    <Name>ModuleStreamNameAlias</Name>
    <Description>ModuleStreamNameAlias</Description>
    <Class>com.homux.wms.plugin.streamnamealias.ModuleStreamNameAlias</Class>
   </Module>

 

과 같이 추가하여 사용하시거나 기존에 ModuleStreamNameAlias를 사용하셨다면 대체하시면 됩니다.

 

기존에 ModuleStreamNameAlias를 사용하지 않으셨던 분들은

 

Application.xml 파일의 끝부분의 Properties에

 

   <Property>
    <Name>aliasMapFileStream</Name>
    <Value>${com.wowza.wms.context.VHostConfigHome}/conf/aliasmap.stream.txt</Value>
   </Property>
   <Property>
    <Name>aliasMapFilePlay</Name>
    <Value>${com.wowza.wms.context.VHostConfigHome}/conf/aliasmap.play.txt</Value>
   </Property>
   <Property>
    <Name>aliasMapPathDelimiter</Name>
    <Value>/</Value>
   </Property>
   <Property>
    <Name>aliasMapNameDelimiter</Name>
    <Value>=</Value>
   </Property>
   <Property>
    <Name>aliasMapDebug</Name>
    <Value>false</Value>
    <Type>Boolean</Type>
   </Property>

 

를 추가하시고 aliasmap.play.txt, aliasmap.stream.txt를 /conf 폴더에 복사하셔야 합니다.

 

제가 컴파일을 2.1.2.04에서 했기 때문에 이전 버전에서는 작동안할 수도 있습니다.

 

**********

RTSP URL의 한글 문제는 Wowza Media Server 2.1.2 patch8에서 수정되었습니다.

**********
출처: http://cafe.naver.com/wowzamedia/29

 

Posted by iWithJoy
Server2012. 12. 11. 09:19

1. http://strawberryperl.com/ perl을 먼저 설치한다.

파일명 : strawberry-perl-5.12.2.0.msi

 

2. http://dss.macosforge.org/downloads/에서 최신 Windows installer를 다운받는다.

파일명 : DarwinStreamingSrvr5.5.5-Windows.exe


3. DarwinStreamingSrvr5.5.5-Windows.exe를 실행하게 되면 c:\DarwinStreamingSrvr5.5.5 폴더로

압축파일이 풀린다.


4. 반드시 Administrator로 로그인한 상태에서 Install.bat를 실행한다.

그러면 자동으로 C:\Program Files\Darwin Streaming Server에 서버가 설치되며,

중간에 관리자ID 및 Password를 설정하는 화면이 나타난다.


5. 설정을 완료하면 프롬프트창이 활성화되는데, 종료하지 말고 그대로 두어야 관리자페이지가 실행된다.


6. http://localhost:1220 으로 접속을 시도할 때, 관리자페이지가 실행되면 성공적으로 설치가 된 것이다.

 

7. 만약, 관리자페이지가 실행되지 않으면, 아래의 서버실행구문을 Command창에서 실행한다.

C:\Program Files\Darwin Streaming Server> perl streamingadminserver.pl

 

Installing Darwin Streaming Server (Windows 2000/2003 Server)

1.The Streaming Admin requires ActivePerl 5.8 (or later) to be running on the server machine.
   You must install a Perl interpreter in order to use the web-based administration software.

To install Darwin Streaming Server software, follow these steps on the server computer:

Stop any Darwin Streaming Server related processes.
When the Server package is unzipped, a folder with Darwin Streaming Server and associated files will be created.

 
2.Inside this folder is an Install script, named "Install.bat".
Double-click this file to install the server and its components on the server machine.
The installer also starts up the Streaming Server Admin, so keep the command prompt window open.
 
The Install script will create the following directory:

3.c:\Program Files\Darwin Streaming Server\

Inside this directory you will find:

DarwinStreamingServer.exe - Server executable
PlaylistBroadcaster.exe - PlaylistBroadcaster executable
MP3Broadcaster.exe ? MP3 Broadcaster executable
qtpasswd.exe - Command-line utility for generating password files for access control
StreamingLoadTool.exe - RTSP simulated client stress tool
streamingadminserver.pl - Admin Server that is used for administering the Streaming Server
streamingserver.xml- Default server configuration file
relayconfig.xml-Sample - Sample relay configuration file
QTSSModules\ - Folder containing QTSS API modules
Movies\ - Media folder
Playlists\ - Folder containing Playlist configuration
Logs\ - Folder containing access and error logs
AdminHtml\ - Folder containing the CGIs and the HTMl files required by the Admin Server
Documentation\ - Documentation folder

The Install script also installs Darwin Streaming Server as a service in the Service Manager.
It is possible to start, stop, and check server status from the Service control panel.

The Install script will attempt to launch the Admin Server. Make sure that the Perl interpreter installed on your machine is in the system PATH.

The Admin Server can be launched from the command prompt by typing:

C:\> perlpath "C:\Program Files\Darwin Streaming Server\streamingadminserver.pl"

where perlpath is the path to the Perl interpreter on your machine.

    If you are installing for the first time,  you will be asked to create a user name and password for administering the server.  You must complete this step to administer the server from a remote system using a web browser.
   
Set Up (Windows 2000/2003 Server)

    After creating an administrator user name and password,  you can connect to the Darwin Streaming Server from your web browser.

   Enter the URL for your Darwin Streaming Server:
http://localhost:1220 on the same local system or
http://myserver.com:1220 from a remote system

Replace "myserver.com" with the name of your Darwin Streaming Server computer.
1220 is the port number.
 For help on using Streaming Server Admin, setting up secure administration (SSL), and setting up your server to stream hinted media, refer to the online Help by selecting the Question Mark button from the Streaming Server Admin.

Posted by iWithJoy