Dec 3, 2010 - vi 편집기 사용하기

vi는 리눅스를 비롯한 유닉스 계열 운영체제에서 많이 사용되는 텍스트 파일 편집 프로그램입니다.

‘#which vi’ 이라 명령어를 입력하면 vim 프로그램의 위치를 나타냅니다.
보통 vi 편집기는 alias 되어 있어 vi 명령어만 입력하면 텍스트 파일을 열어 편집할 수 있습니다.
vi 은 3가지 상태 모드가 있습니다.

  1. 명령 상태
    명령어를 입력하는 상태입니다. 내용을 검색하거나 이동할 때 사용하는 명령어 입력 상태입니다.
  2. 입력 상태
    텍스트 파일의 내용을 입력할 수 있는 상태입니다. 텍스트 파일을 수정할 수 있는 상태입니다.
  3. ex 상태
    파일 관련 처리 명령에 사용되며 명령 상태에서 ‘:’ 문자를 입력하면 ex 상태가 됩니다.

명령 상태는 vi 편집기를 실행하면 명령 상태로 실행됩니다. 어떤 상태이든 esc 버튼을 누르면 명령 상태로 돌아갑니다. 아래의 화면은 명령 상태로 vi 편집기가 실행된 화면입니다.

명령 상태의 키는 다음과 같습니다.

h,j,k,l : 왼쪽,아래쪽, 위쪽, 오른족으로 한 칸씩 이동합니다.
$ : 그 줄의 가장 마지막으로 이동합니다.
^ : 그 줄의 가장 처음으로 이동합니다.
H : 화면의 가장 위로 이동합니다.
L : 화면에 가장 아래로 이동합니다.
gg : 파일의 가장 처음으로 이동합니다.
G : 파일의 가장 마지막으로 이동합니다.
} : 다음 단락으로 이동합니다.
{ : 이전 단락으로 이동합니다.
:n : n 번째 줄로 이동합니다.  

명령 상태에서 텍스트 파일의 커서가 위치하는 곳에 텍스트 파일을 수정하기 위해서는 입력상태로 변경해야 합니다. 이 때 사용하는 키는 다음과 같습니다.

  • 입력 명령
i : 현재 커서가 위치한 곳부터 글자를 입력합니다.
I : 현재 작업 줄의 가장 처음에 글자를 입력합니다.
a: 현재 커서가 위치한 다음 칸부터 글자를 입력합니다.
A : 현재 작업 줄의 가장 마지막에 글자를 입력합니다.
  • 삭제 명령
x : 현재 커서가 위치한 곳에 글자 삭제
dw : 한 단어를 삭제
dd : 줄 전체를 삭제
d$ : 현재 커서가 위치한 곳부터 그 줄의 가장 마지막까지 삭제

  • 복제 및 붙이기 명령
yy : 현재 줄 전체를 메모리에 저장해 둡니다.
y0 : 현재 커서가 위치한 곳부터 그 줄의 가장 처음까지 메모리에 저장합니다.
y$ : 현재 커서가 위치한 곳부터 그 줄의 가장 마지막까지 메모리에 저장합니다.
p : 현재 커서가 위치한 곳에서 메모리의 내용을 붙여 넣습니다.
P : 현재 커서가 위치한 바로 다음 칸에 메모리의 내용을 붙여넣습니다.

참고로 v 키를 누른 후 이동 명령으로 커서를 이동하면 선택된 블록 영역이 반전된 색깔로 표시되며 영역이 선택됩니다.

dd 삭제 명령과 i G, gg 정도만 알면, 어느정도 vi 편집하는데 불편함은 업습니다.

Nov 5, 2010 - 윈도우 스케쥴러로 매시간 자바실행시키기

윈도우 스케쥴러로 매시간 자바실행시키기

부제 : 배치 프로세스

  1. javac 명령어로 클래스 파일 만들기 - 생략
  2. java 실행시킬 실행파일(BAT) 파일 생성
    패턴 1. classpath 에 모든 정보를 담은 뒤, java에서는 해당 클래스파일만 불러옵니다.
    set classpath=.;{불러올 패키지의 classes 및 jar 경로}
    
    set path=.;C:/project/java/jdk1.5.0_16/bin
    set classpath=.
    set classpath=%classpath%;C:/test/com.sec.admin_home/WEB-INF/classes
    set classpath=%classpath%;C:/test/com.sec.admin_home/WEB-INF/lib
    set classpath=%classpath%;C:/test/com.sec.admin_home/WEB-INF/lib/xxx.jar
    java com.sec.admin.batch.biz.process.TestProcess
    pause
    
패턴 2. 기본 classpath 만 설정한 후 java 명령어 중 classpath 설정하는 명령어로 class를 불러옵니다.
Java –cp {불러올 classes 및 jar 경로}
set path=.;C:/project/java/jdk1.5.0_16/bin
java -cp C:/test/com.sec.admin_home/WEB-INF/classes com.sec.admin.batch.biz.process.TestProcess
pause
  1. lib 설정
    패턴 1. java 자체 lib 안에 jar 파일을 넣어 인식시킵니다.
    set classpath=.;{불러올 패키지의 classes 및 jar 경로}
    
    C:/project/java/jdk1.5.0_16/jre/lib/ext
    jdk의 ext 폴더에 실행할때 필요한 jar 파일을 넣습니다.
    
    단점 : 서버의 lib 과 자바의 lib 이 충돌납니다. 독립적으로 사용할 경우에 추천합니다.
    
    패턴 2. 사용하는 모든 jar 파일을 classpath 로 불러옵니다.
    Java –cp {불러올 classes 및 jar 경로}
    
    set classpath=%classpath%;C:/test/com.sec.admin_home/WEB-INF/lib
    set classpath=%classpath%;C:/test/com.sec.admin_home/WEB-INF/lib/xxx.jar
    
  2. 윈도우 스케쥴러에 해당 bat 파일 등록 –생략

Jul 16, 2010 - String을 InputStream으로..

String을 InputStream으로 만들어야 하는 경우가 종종 발생합니다.
라이브러리가 파일이나 네트웍과 같은 곳으로부터 읽어서 처리할 수 있도록 전달인자를 InputStream으로 되어 있습니다.

하지만 이 파일의 내용이 DB와 같은 곳에 있다면?? DB에서 읽으면 문자열일텐데.. 이걸 다시 파일에 기록하고 InputStream을 열어서 전달하기는 좀 무리가 있습니다.

일단.. String으로 읽어서 String을 InputStream으로 바꾸는 방법을 찾아보면, JDK 1.0에 StringBufferInputStream라는 클래스가 있지만 이 녀석은 deprecated되었습니다. 대신 StringReader를 사용하라고 합니다.

InputStream과 Reader의 차이는 InputStream은 byte 단위로 읽는 녀석이지만, Reader는 문자(character) 단위로 읽는 녀석입니다.

ASCII의 경우는 동일하겠지만, 유니코드가 섞여 있다면 처리 방식이 달라질 수 있습니다.
문자열이라는 것은 인코딩이 되어 있으니까 String은 InputStream이 아닌 Reader로 읽는 것이 맞는 말입니다.

그래서 StringBufferInputStream은 말 그대로 폐기.. 또 다른 방법은.. Apache Ant 라이브러리에 있는 StringInputStream을 사용하는 방법이 있습니다.

사용 방법은 아주 간단합니다.
Ant를 다운받고 lib 경로 아래에 있는 ant.jar 파일을 CLASS_PATH에 넣어주고 쓰면 됩니다.

String 문자열을 생성자에 넣어주고 객체를 생성하면 그 문자열이 InputStream 처럼 동작합니다. (뭐.. 그야 InputStream을 상속받았으니까 =ㅅ=;;)

아래 예제는 LDIF 파일을 읽어서 처리하는 부분이다. LDIFReader는 InputStream을 필요로 합니다.

String ldifContent = "...";
StringInputStream is = new StringInputStream(ldifContent, "UTF-8");
LDIFReader reader = new LDIFReader(is, LDAPConnection.LDAP_V3);
LDAPMessage msg = reader.readMessage();

소스 코드를 보니 내부적으로는 Reader를 InputStream으로 변환해주는 org.apache.tools.ant.util.ReaderInputStream을 상속받아 org.apache.tools.ant.filters.StringInputStream을 구현했습니다.

이거 나중에 유용하게 사용할 수도 있겠네요.

그리고 이런 라이브러리가 귀찮거나 기능에 비해 거추장스럽다면.. 간단하게 byte 배열을 이용하는 방법도 있다. String을 byte 배열로 변환한 후 ByteArrayInputStream을 사용하면 되빈다.
위의 코드에서 InputStream을 생성해 주는 부분만 아래와 같이 바꿉시다!

ByteArrayInputStream is = new ByteArrayInputStream(ldifContent.getBytes("UTF-8"));

참조