리눅스 명령어 작업을 할 때는 자동으로 쉘을 사용하게 된다.
즉 리눅스 명령어를 입력하는 자체가 쉘을 사용한다는 것이다.
[ ※참고. TUI로 전환하시려면 Ctrl + Alt + F1 GUI로 전환하시려면 Ctrl + Alt + F7 ]
쉘을 변경하려면 먼저 그 쉘을 설치하고 /etc/shells에 등록해야한다.
view file -> 읽기 전용(read- only) 편집기로서 vi를 시작하여 지정한 파일 편집
vi -r -> 되살릴 수 있는 모든 파일 이름 보여주기
vi -r file -> vi를 시작하여 지정한 파일 되살리기
편 집 명 령
i -> 입력 모드로 전환, 커서 위치 앞에서 삽입
a -> 입력 모드로 전환, 커서 위치 뒤에서 삽입
I -> 입력 모드로 전환, 현재 줄의 앞에 삽입
A -> 입력 모드로 전환, 현재 줄의 끝에 삽입
o -> 입력 모드로 전환, 현재 줄의 아래에 전개
O -> 입력 모드로 전환, 현재 줄의 위에 전개
:e file -> 지정한 파일의 편집
:e! file -> 지정한 파일의 편집, 자동 점검의 생략
r -> 단지 한 글자만 변경(입력 모드로 바뀌지 않음)
R -> 입력하는 대로 겹쳐 써서 변경
s -> 삽입에 의해 한 단어의 변경
C -> 커서의 위치로부터 줄 끝까지 삽입에 의한 변경
cc -> 전체 줄을 삽입에 의한 변경
S -> 전체 줄을 삽입에 의한 변경
cmove -> 커서부터 move까지 삽입에 의해 변경
~ -> 대,소문자 바꾸기
u -> 편집 버퍼를 수정했던 마지막 명령을 취소
U -> 현재 줄을 저장
. -> 편집 버퍼를 수정했던 마지막 명령 반복
x -> 커서가 있는 문자 삭제
X -> 커서의 왼쪽 문자 삭제
D -> 커서부터 줄의 끝까지 삭제
dd -> 현재 줄의 전체 삭제
dmove -> 커서부터 move까지 삭제
dG -> 커서부터 편집 버퍼의 끝까지 삭제
d1G -> 커서부터 편집 버퍼의 맨 앞까지 삭제
:<line>d -> 지정한 줄의 삭제
:<line>,<line>d -> 지정한 범위의 삭제
:<line>co<target> -> 지정한 줄을 복사하여 target 줄 밑에 삽입
:<line>, <line>co<target> -> 지정한 범위를 복사하여 target 줄 밑에 삽입
:<line>m<target? -> 지정한 줄로 이동하여 target 줄 밑에 삽입
:<line>, <line>m<target> -> 지정한 범위로 이동하여target 줄 밑에 삽입
<n>!!command -> n번 줄에서 command의 실행
!move command -> 커서부터 move까지 command 실행
!move fmt -> 커서부터 move까지 줄들을 형식 맞추기
:w -> 원래의 파일로 데이터를 저장
:w file -> 지정한 파일로 데이터를 저장
:w>> file -> 지정한 파일에 데이터를 추가
:wq -> 데이터를 저장하고 종료
:q! -> 데이터를 저장하지 않고 종료
:set number -> 내부 줄 번호 디스플레이
:set nonumber -> 내부 줄 번호 디스플레이 않기
p -> 마지막으로 지워진 것을 커서의 뒤/아래에 삽입
P -> 마지막으로 지워진 것을 커서의 앞/위에 삽입
xp -> 두 문자를 바꿈
deep -> 두 단어를 바꿈
ddp -> 두 줄을 바꿈
/rexp -> 지정된 정규 표현식에 대해 앞으로 이동
/ -> 이전의 패턴에 대해 앞으로 검색을 반복
?rexp -> 지정된 정규 표현식에 대해 뒤로 이동
? -> 이전의 패턴에 대해 뒤로 검색을 반복
n -> /나 ?명령에 대해 같은 방향으로 반복
N -> /나 ?명령에 대해 반대 방향으로 반복
:ab short long -> short를 long에 대한 약어로 변경
:ab -> 현재 약어 목록을 표시
:una short -> 약어 short를 표시
r<Return> -> 문자를 뉴라인으로 변경
J -> 아래 line을 현재 line과 합치기
:set wm=n -> 오른쪽으로 n문자 위치에서 자동적으로 줄 나눔
h or <Left key> -> 커서를 한 칸 왼쪽으로 이동
j or <Down key> -> 커서를 한 줄 아래로 이동
k or <Up key> -> 커서를 한 줄 위로 이동
l or <Right key> -> 커서를 한 칸 오른쪽으로 이동
<Backspace> -> 커서를 한 칸 왼쪽으로 이동
<Space> -> 커서를 한 칸 오른쪽으로 이동
- -> 커서를 이전 줄의 처음으로 이동
+ -> 커서를 다음 줄의 처음으로 이동
<Return> -> 커서를 다음 줄의 처음으로 이동
0 -> 커서를 현재 줄의 맨 앞으로 이동
$ -> 커서를 현재 줄의 맨 끝으로 이동
^ -> 커서를 현재 줄의 첫글자(공백이나 탭이 아닌)로 이동
w -> 커서를 다음 단어의 첫 글자로 이동
e -> 커서를 다음 단어의 끝 글자로 이동
b -> 커서를 이전 단어의 첫 글자로 이동
W -> w와 같음(문장 부호 무시)
E -> e와 같음(문장 부호 무시)
B -> b와 같음(문장 부호 무시)
( -> 다음 문장의 처음으로 이동
) -> 이전 문장의 처음으로 이동
{ -> 다음 문단의 처음으로 이동
} -> 이전 문단의 처음으로 이동
H -> 커서를 화면 맨 위로 이동
M -> 커서를 중간으로 이동
L -> 커서를 맨 아래로 이동
^f -> 한 화면 아래로 이동
^b -> 화면 위로 이동
^d -> 반 화면 아래로 이동
^u -> 반 화면 위로 이동
n^d -> n줄만큼 아래로 이동
n^u -> n줄만큼 위로 이동
:!command -> vi를 중단하고 지정한 셸 명령을 실행
:!! -> vi를 중단하고 이전의 셸 명령을 실행
:sh -> vi를 중단하고 셸을 실행
:!csh -> vi를 중단하고 새로운 C-셸을 실행
:s/<pattern>/<replace>/ -> 현재 줄의 치환
:<line>s/<pattern>/<replace>/ -> 지정한 줄의 치환
:<line>,<line>s/<pattern>/<replace>/ -> 정한 범위의 치환
:%s/<pattern>/<replace>/ -> 모든 줄의 치환
:<line>r file -> file의 내용을 지정한 줄 다음에 삽입
:r file -> file의 내용을 현재의 줄 다음에 삽입
:<line>r !command -> command의 결과를 지정한 줄 다음에 삽입
:r !command -> command의 결과를 현재의 줄 다음에 삽입
:r !look pattern -> 지정한 pattern으로 시작된 단어 삽입
. -> 뉴라인을 제외한 모든 단일 문자와 대응
* -> 영 또는 그 이상의 선행 문자와 대응
^ -> 줄의 시작과 대응
$ -> 줄의 끝과 대응
\< -> 단어의 시작과 대응
\> -> 단어의 끝과 대응
[ ] -> 묶여진 문자중의 하나와 대응
[^ ] -> 묶여진 문자를 제외한 아무것하고나 대응
\ -> 이어지는 기호를 문자 그대로 해석
<n>G -> 줄번호 n으로 건너뛰기
1G -> 편집 버퍼의 첫 줄로 건너뛰기
G -> 편집 버퍼의 마지막 줄로 건너뛰기
:map g lG -> g가 lG와 같도록 매크로 정의
find tip
1. 모든파일검색(현재폴더 및 하위폴더로 부터 "ABC"란 문자를 찾아서 파일명(grep -H)과 포함된 라인을 같이 출력)
find ./ -name "*" -exec grep -H ABC {} \;
find ./ -type f -print | xargs grep -H "ABC" /dev/null
egrep -r ABC *
2. 부분파일명검색(*.conf 파일을 찾아서 출력)
find ./ -name "*.conf" -print
3. 파일사이즈검색(5Mb이상의 파일을 출력)
find /home -size +5000000c -print
4. 사용자검색(UID로검색 - 시스템부하줄 수 있음)
find / -user 501 -print
5. 마지막엑세스시간검색(최근 5분)
find / -cmin -5
6. 그룹검색(20인그룹의 파일과 폴더를 102로 소유그룹바꿈)
find / -group 20 -exec chown :102 {} \;
7. 권한검색 (쓰기가능한 디렉토리)
find / -perm -0002 -type d -print
8. 권한검색 (쓰기가능한 파일)
find / -perm -0002 -type f -print
find / -perm -2 ! -type l -ls
9. 사용자검색(파일소유주가 없는 파일)
find / -nouser -o -nogroup -print
10. 시간검색(마지막엑세스가 2일지난파일)
find / -mtime 2 -o -ctime 2
-atime : 파일을 열어본 시간 또는 디렉토리에 cd명령으로 접근한 시간
-mtime : 파일의 내용이 변경된 시간 ls -l 에서 나오는 시간
-ctime : 파일의 정보가 변경된 시간 chmod,chown과 연관성이 있음
파일명 예제
"~" or "a b c" 등의 이상한 파일등은 지울때 위험 하기도 하고 지우기도 힘들다
1. 정규표현
rm -rf \~
rm -rf "a b c"
2. i-node를 통해서 지우기
# ls -i
# 32471 a b c
# find . -inum 32471 -exec rm -rf {} ';'
or
# find . -inum 32471 -exec rm -rf {} \;
Eclipse 팁
#1 (코드 Style 설정)
Eclipse는 코드 형식화를 지원
해당 코드 위에서 [ Ctrl+Shift+F ] 누르면 코드가 정리된다.
Eclipse에서 설정된 Code Formatter의 설정에 따른 것.
프로젝트에서 개발된 모든 코드에 같은 코딩 규칙을 적용하고 싶다면
결정된 Coding Convention에 따라 Code Formatter의 설정을 바꾼 다음,
그것을 XML 파일로 Export하고, 개발자에게 Import 시켜 적용하도록 하면 된다.
Windows - Preferences 에서 "Java - Code Style - Code Formatter"를 선택
Eclipse 3.0은 기본적으로 2가지 코드 형식을 기본적으로 내장하고 있다.
Java Conventions를 선택하고, Show.. 버튼을 누르면 해당 설정을 커스터마이징 할 수 있다.
탭 사이즈와 괄호의 위치 등 모든 것을 변경할 수 있다.
Eclipse 팁 #2 (Import문 정리)
사용되지 않는 라이브러리를 import한 경우 Eclipse는 앞에 전구를 키고 표시해준다.
이때 [ Ctrl+Shift+O ] 버튼을 누르면 사용하지 않는 모든 import 문이 정리된다.
또 한가지 유용한 기능은 같은 패키지 내에서 여러 개의 클래스를 import할 경우.
예를 들어 한 패키지 내에서 4개 이상의 클래스를 import 한다면,
그것을 *로 합쳐서 표시하도록 하고 싶을 때, window - preference 로 가서 java - code style - organize import에서
Number of imports needs for .*의 수를 4로 해놓으면, 같은 패키지에서 4개이상의 클래스가 임포트되면 *로 합쳐서 표시해준다. (Apply 버튼 바로 위에 그 항목이 있다.)
Eclipse 팁 #3 (영역별 주석처리)
주석처리할 영역을 선택 한 다음 [ Ctrl+/ ]
주석을 해제하고 싶다면 다시 한번 더 [ Ctrl+/ ]
Eclipse 팁 #4 (에디터칸이동)
[ Alt+Tab ]과 같은 기능의 단축키 : [ Ctrl+F6 ]
바로 이전으로 이동할 때는 [ Ctrl+F6 ]이 편하지만,
여러 개 중 하나를 이동할 때는 [ Ctrl+F6 ]을 누른 후,
[Ctrl+화살표] 를 이용해서 원하는 에디터로 이동하는 것이 편하다.
Eclipse 팁 #6 (줄번호 표시 및 줄 이동하기)
해당 라인으로 이동하기 위한 단축키 [ Ctrl+L ].
윈도우와 같이 Ctrl+G 로 단축키를 변경해서 쓰시는 것도 좋을 듯.
줄번호가 항상 표시되도록 하고 싶다면 window - preference 에서, Java - Editor로 이동한 다음 "Show line numbers"를 체크하면 된다.
Eclipse 팁 #7 (변경사항 추적하기)
변경 사항을 추적하고자 하는 파일을 PackageExplorer에서 선택 후, 오른쪽 버튼을 눌러 컨텍스트 메뉴에서 [ compare with Local History ] 선택.
시간대 별로 이전의 작업 결과를 볼수 있다.
만일 이전의 코드로 되돌아가고 싶다면, 같은 방법으로 파일의 컨텍스트 메뉴에서 [ Replace with ] 를 선택하고, [ Local History ]에서 변경하면 된다.
Eclipse 팁 #8 (Javadoc 문서생성 )
JavaDoc 형태의 주석으로 소스코드 문서화가 된 상태라고 가정하고, Project 메뉴의 [ Generate Javadoc... ] 기능을 실행하면 간편한 마법사의 지원을 통해 Javadoc 문서를 생성할 수 있다.
일반적으로 프로젝트 루트 밑에 doc 이란 폴더 안에 JavaDoc으로 생성된 API 문서를 포함한다.
생성될 API 문서에 포함시킬 정보를 선택하는 것이 마법사의 다음 단계이다.
Finish 버튼을 누르면 Package Explorer에 아래와 같이 API 문서가 생성된 것을 확인할 수 있다.
Eclipse 팁 #9 (전체프로젝트 ZIP 백업)
전체 프로젝트를 백업하기 위해 압축을 해야 할때 유용한 기능.
File 메뉴의 Export 기능을 실행하면 아래와 같은 윈도우가 뜬다.
선택요소 중에서 ZIP 파일을 선택.
다음 화면은 백업할 요소들을 선택하는 것이다.
일반적으로 자동 생성되는 JavaDoc 문서나 Classes 파일들은 백업하지 않는다.
적당한 백업 파일 이름과 위치를 결정하고 Finish 버튼을 누르면 백업이 완료된다.
이클립스에서 유용한 단축키
Ctrl + e : 한줄지움
Ctrl + w : 메뉴보여줌
Ctrl + space : 클래스등 코드 도움
Ctrl + / : 한줄 주석 반대는 Ctrl + \
Ctrl + , : 찾기나, TASK항목 이동
Ctrl + . : 이동
Ctrl + F6 : Editor 선택
Ctrl + F7 : View 선택
Ctrl + F8 : Perspectieve 선택
Ctrl + F11 : 디버깅
Ctrl + 1 : QuickFix 실행
Ctrl + Shift + b : 브레이크 포인트
Ctrl + Shift + e : 현재 캐럿에서 끝까지 삭제
Ctrl + Shift + f : 코드 포맷팅
Ctrl + Shift + m : 자동 임포트
Ctrl + Shift + o : 임포트 자동 정리
Ctrl + Shift + space : 입력 파라미터 정보 보여줌
1. 소스편집
Ctrl + O : 모든 클래스, 프로퍼티 트리 보기, 선택가능
CTRL + o + o : 트리형태로 메소드 구성, 한번 더 누르면 메소드 상속위치 검색
Ctrl + Shift + R : 자원열기(폴더내용이 검색된다)
Alt + Shift + R : 변수 이름 변경하기 전에 누르면 변수를 사용한 모든 곳이 바뀐다.
Ctrl + Shift + F : 코드 포맷팅
(자바 코딩 규칙에 맞게 스타일을 변경해준다)
2. Alt + ->, Alt + <- : 이후, 이전
Ctrl + Shift + X : 대문자로
Ctrl + Shift + Y : 소문자로
Ctrl + PgUp (좌우창이동)
Ctrl + D 한줄 삭제
Alt + Shift + S : Source 메뉴
Ctrl + M : 전체화면토글
Ctrl + i : 소스정리
F4 : 클래스명을 선택하고 누르면 해당 클래스의 Hierarchy 를 볼 수 있다.
1. Ctrl + Space : 입력 보조장치(Content Assistance) 강제 호출 => 입력하는 도중엔 언제라도 강제 호출 가능하다.
2. F2 : 컴파일 에러의 빨간줄에 커서를 갖져다가 이 키를 누르면 에러의 원인에 대한 힌트를 제공한다.
3. Ctrl + l : 원하는 소스 라인으로 이동
로컬 히스토리 기능을 이용하면 이전에 편집했던 내용으로 변환이 가능하다.
4. Ctrl + Shift + Space : 메소드의 가로안에 커서를 놓고 이 키를 누르면 파라미터 타입 힌트를 볼 수 있다.
2.템플릿
1. sysout 입력한 후 Ctrl + Space 하면 System.out.println(); 으로 바뀐다.
2. try 입력한 후 Ctrl + Space 하면 try-catch 문이 완성된다.
3. for 입력한 후 Ctrl + Space 하면 여러가지 for 문을 완성할 수 있다.
4. 템플릿을 수정하거나 추가하려면 환경설정/자바/편집기/템플리트 에서 할 수 있다.
CTRL + 객체클릭(혹은 F3) : 클래스나 메소드 혹은 멤버를 정의한 곳으로 이동(Open Declaration)
CTRL + SHIFT + / : 선택영역 block comment 설정
CTRL + SHIFT + \ : 선택영역 block comment 제거
ALT + SHIFT + r : 변수 및 메소드 변경
SHIFT + ALT + s, r : getter/setter 자동생성
CTRL + F11 : 실행
F11 : 디버깅 시작
F4 : 상속구조 클래스 보기(메소드, 멤버)
F8 : 디버깅 계속
CTRL + . : 다음오류부분으로 가기
CTRL + , : 이전오류부분으로 가기
===== 문자열 찾기 =====
1. Ctrl + k : 찾고자 하는 문자열을 블럭으로 설정한 후 키를 누른다.
2. Ctrl + Shift + k : 역으로 찾고자 하는 문자열을 찾아감.
3. Ctrl + j : 입력하면서 찾을 수 있음.
4. Ctrl + Shift + j : 입력하면서 거꾸로 찾아갈 수 있음.
5. Ctrl + f : 기본적으로 찾기
===== 메소드 쉽게 생성하기 =====
1. 클래스의 멤버를 일단 먼저 생성한다.
2. override 메소드를 구현하려면 : 소스->메소드대체/구현 에서 해당 메소드를 체크한다.
3. 기타 클래스의 멤버가 클래스의 오브젝트라면 : 소스->위임메소드 생성에서 메소드를 선택한다.
===== organize import =====
1. 자바파일을 여러개 선택한 후 소스 -> 가져오기 체계화 해주면 모두 적용된다.
===== 주석 처리 =====
2. Ctrl + / 해주면 여러줄이 한꺼번에 주석처리됨. 주석 해제하려면 반대로 하면 됨.
===== 소스 코드 형식 및 공통 주석 설정 =====
1. 환경설정 -> 자바 -> 코드 스타일 -> 코드 포멧터 -> 가져오기 -> JYJ프로파일.xml 을 불러다가 쓰면 된다.
2. 또한 다수의 자바파일에 프로파일을 적용하려면 패키지 탐색기에서 패키지를 선택한 후 소스 -> 형식화를 선택하면 된다.
3. 환경설정 -> 자바 -> 코드 스타일 -> 코드 템플리트 -> 가져오기 -> JYJ템플리트.xml 을 불러다가 쓰면 된다.
===== 에디터 변환 =====
1. 에디터가 여러 파일을 열어서 작업중일때 Ctrl + F6 키를 누르면 여러파일명이 나오고 F6키를 계속 누르면 아래로
2. Ctrl + Shift + F6 키를 누르면 위로 커서가 움직인다.
3. Ctrl + F7 : 뷰간 전환
4. Ctrl + F8 : 퍼스펙티브간 전환
5. F12 : 에디터로 포커스 위치
===== JAVA Doc 생성 =====
1. 프로젝트 -> Javadoc 생성
===== 내보내기 =====
2. 해당 프로젝트를 zip 형태로 압축해서 보관할 수 있다.
===== 자바 찾아보기 perspective =====
3. 해당 프로젝트를 보다 편리하게 한번 둘러보는데 좋다.
===== 스크랩북 =====
1. 스크랩북을 이용하면 자바파일을 만들어 테스트 해보지 않고도 간단하게 테스트 해 볼 수 있다.
2. 패키지 탐색기에서 신규 -> 기타 -> 자바 -> 자바 실행/디버그 -> 스크랩북 페이지 선택
===== 디버그 =====
1. F5(Step Into) : 현재의 명령문이 호출되는 메소드 속으로 진행하여, 그 첫 문장을 실행하기 전에 멈춘다.
하지만 자바 라이브러리 클래스 수준까지 들어가므로 단계필터 사용을 체크(Shift+F5)를 하면 필터를 설정한
클래스에 대하서는 Step Over 기능과 같은 기능을 수행한다.
2. F6(Step Over) : 현재의 명령문을 실행하고 다음 명령문 직전에 다시 멈춘다.
3. F7(Step Return) : 현재의 메소드에서 리턴한 직후에 다시 멈춘다.
4. F8(Resume) : 멈추어 있던 쓰레드를 다시 계속 실행한다.
5. Display view(표시) : 창 -> 보기표시 -> 표시 선택하여 소스상에서 필요한 부분을 선택해서 실행시켜 볼 수 있다.
한 순간의 값만 필요할 때 볼 수 있는 반면에 아래놈은 계속적으로 값이 변하는 것을 확인 할 수 있다.
6. Expression view(표현식) : 복잡한 식 혹은 객체를 디버깅 하면서 계속 볼 수있는 창이다.
마우스 오른버튼 -> 감시 표시식 추가 선택한 후 사용한다.
환경설정 -> 자바 -> 디버그 -> 세부사항 포멧터 선택 후 보기 편한 식으로 편집하면 Expression View 에서 결과를
실시간으로 확인 할 수 있다.
7. 디버깅 하면서 소스를 수정하고 프로그램을 다시 시작할 필요 없이 계속 디버깅을 진행 할 수 있다.
다만 메소드를 추가하거나 필드를 추가하면 프로그램을 다시 시작해야 한다.
8. Drop to Frame(프레임에 놓기) 는 정말 모르겠다.
9. 디버깅 작업을 할때 해당 라이브러리의 소스코드를 첨부하지 않으면 진행상황을 볼 수 없을 경우
해당 라이브러리에 소스코드를 첨부할 수 있다. 해당 프로젝트 -> 특성 -> Java 빌드경로 -> 라이브러리 -> 소스참조
편집 버튼을 눌러서 첨부 한다.
===== 도움말 =====
"JDT 팁과 요령"이라고 치면 여러가지 흥미로운 팁이 나온다.
* Alt
> Alt + Shift + J : JavaDoc 주석
> Alt + ←→(좌/우) : 뷰 화면의 탭에 열린 페이지 이동
> Alt + ↑↓(상/하) : 커서가 있는 줄을 위 아래로 이동
* Ctrl
> Ctrl + 1 : Quick Fix
>> 구현하지 않은 메소드 추가
>> 로컬 변수 이름 바꾸기
>> Assignment 입력
>> 행 둘러싸기 (if/where/for이나 블록으로 둘러 싸려면 해당영역을 선택하고 Ctrl + 1)
> Ctrl + D : 한줄 삭제
> Ctrl + E : 뷰 화면의 탭에 열린 페이지 이동
> Ctrl + L : 라인 이동
> Ctrl + I : 자동 들여쓰기 수정
> Ctrl + K : 문자열 찾기 (찾고자 하는 문자열을 블럭으로 설정한 후...)
>> Ctrl + Shift + K : 역순으로 찾기
> Ctrl + M : 전체화면
> Ctrl + O : 현재 보고있는 파일의 아웃라인 (메소드 리스트 확인, 메소드나 필드 이동가능)
> Ctrl + W : 창 닫기
> Ctrl + , or. : 다음 Annotation(Error, Warning, Bookmark)으로 이동
> Ctrl + / : 주석 처리 (여러줄 블럭 처리 가능)
> Ctrl + Alt + ↑↓(상/하) : 한줄(블럭) 복사
> Ctrl + Shift + E : Switch to Editor (탭에 열려있는 Editor 이동)
> Ctrl + Shift + G : 클래스의 메소드나 필드를 Reference하고 있는 곳으로 이동
>> 반대 : F3 (Reference하는 클래스로 이동)
> Ctrl + Shift + L : 단축키 보기
>> Ctrl + Shift + L + L : 단축키 지정
> Ctrl + Shift + W : 열린 파일 모두 닫기
> Ctrl + Shift + O : 자동 import 처리 (사용하지 않는 Class는 삭제)
> Ctrl + Shift + R : Open Resource
> Ctrl + Shift + ↑↓(상/하) : 다음/이전 메소드로 이동
> Ctrl + Shift + / :JavaDoc주석 추가
> Ctrl + Shift + Space : 메소드 파라미터 힌트 (메소드에 입력해야 하는 파라미터 정보가 표시된다.)
> Ctrl + F3 : 클래스 아웃라인
> Ctrl + F6 : View 화면의 탭에 열린 페이지 이동
> Ctrl + F7 : View간 화면 전환
> Ctrl + F8 : Perspective간 화면 전환
> Ctrl + F11 : 바로 전에 실행했던 클래스 실행
> Ctrl + PageDown : 뷰 화면의 탭에 열린 페이지 이동
* Function Key
> F2 : 에러의 원인에 대한 힌트 (에러 라인에 커서를 위치시키고...)
> F3 : Java 편집기에서 Reference하는 클래스의 자바파일로 이동
>> Ctrl + 클릭
>> 반대 : Ctrl + Shift + G (클래스의 메소드나 필드를 Reference하고 있는 곳으로 이동)
> F4 : 해당 클래스의 Hierarchy
> F12 : Editor로 포커스
* E.T.C.
> CTRL + 휠 : 페이지 단위 이동
linux 시스템 구성 정보 확인 방법
하드디스크 시리얼넘버 확인
# hdparm -I /dev/sda5
mac 주소 확인
# ifconfig -a
▷ 호스트 네임 확인
# hostname
▷ 호스트 id 확인
# hostid
▷ OS 및 kernel 버전 확인
# uname ?a : kernel 버전 확인
# cat /etc/redhat-release : OS 종류 확인
예시) # uname -a
Linux DCS-install 2.6.18-194.32.1.el5PAE #1 SMP Wed Jan 5 18:43:13 EST 2011 i686 athlon i386 GNU/Linux
# cat /etc/redhat-release
CentOS release 5.5 (Final)
▷ CPU 정보 확인
# cat /proc/cpuinfo : 상세 CPU 정보 확인
예시) # cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 16
======== 생략 =============
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc nonstop_tsc pni cx16 popcnt lahf_lm cmp_legacy svm extapic cr8legacy abm sse4a misalignsse 3dnowprefetch osvw ibs ts ttp tm stc 100mhzsteps hwpstate [8]
bogomips : 1995.19
▷ Memory 정보 확인
# cat /proc/meminfo : 상세 메모리 정보 확인
# free ?m : 물리적 메모리 및 swap 사용량을 MB 단위로 확인
예시) # cat /proc/meminfo
MemTotal: 8305744 kB
MemFree: 292952 kB
Buffers: 7640 kB
Cached: 7887972 kB
SwapCached: 0 kB
========== 생략 =============
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
# free -m
total used free shared buffers cached
Mem: 8111 7824 286 0 7 7703
-/+ buffers/cache: 114 7996
Swap: 16386 0 16386
▷ Disk 구성 정보 확인
# fdisk ?l : 물리적 또는 논리적(LUN) 디스크 확인
예시) # fdisk -l
Disk /dev/sda: 146.1 GB, 146163105792 bytes
255 heads, 63 sectors/track, 17769 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 3837 30716280 83 Linux
/dev/sda3 3838 5926 16779892+ 82 Linux swap / Solaris
/dev/sda4 5927 17769 95128897+ 5 Extended
/dev/sda5 5927 17769 95128866 83 Linux
# df -h : 전체 file_system 각각 할당량 및 사용량(%) 을 MB 단위로 확인. (df : disk free)
예시) # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 29G 3.1G 24G 12% /
/dev/sda5 88G 71G 13G 85% /data
/dev/sda1 99M 17M 77M 18% /boot
tmpfs 4.0G 0 4.0G 0% /dev/shm
▷ Network 구성 정보 확인
# ifconfig -a : IP Address, network, MAC Address 확인
# route : 시스템 routing table 설정 정보 확인
▷ 패키지 구성 정보 확인
# rpm -qa : 설치된 패키지 리스트 확인
예시) rpm -qa | grep init
initscripts-8.45.30-3.el5.centos
SysVinit-2.86-15.el5
mkinitrd-5.1.19.6-61.el5_5.2
xorg-x11-xinit-1.0.2-15.el5
module-init-tools-3.3-0.pre3.1.60.el5_5.1
initscripts-8.45.30-2.el5.centos
pkinit-nss-0.7.6-1.el5
▷ 프로세스 정보 확인
# ps -ef : 현재 실행중인 프로세스 정보 확인
예시) # ps -ef | grep init
root 1 0 0 Jan12 ? 00:00:01 init [5]
root 4274 4239 0 Jan12 ? 00:00:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients"
root 4304 1 0 Jan12 ? 00:00:00 /usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients
root 26104 25827 0 14:42 pts/0 00:00:00 grep init
l 시스템 재구동 및 종료방법
▷ 프로세스 재구동 방법
리눅스에서는 프로세스의 번호를 찾아 죽이는 대신에 ``/etc/init.d'' 디렉토리에 스크립트를 모아놓고 필요에 따라 프로세스를 시작과 중단이 가능함. (start, stop, restart 옵션 사용)
사용예 >
# /etc/init.d/nfs start e 프로세스 시작
# /etc/init.d/nfs stop e 프로세스 중지
# /etc/init.d/nfs restart e 프로세스 재시작
Ø 참조 : 서비스 프로세스 앞에 service 명령어를 통해서 실행해도 동일하게 실행됨.
사용예 >
# service nfs start e 프로세스 시작
# service nfs stop e 프로세스 중지
# service nfs restart e 프로세스 재시작
▷ 시스템 재부팅 및 종료
시스템을 종료시키려면, "루트" 계정으로 로그인하거나 "su" 하여야 함.
Ø 시스템 리부팅
# sync e 메모리에 있는 데이터를 디스크로 저장
# reboot 또는 # shutdown ?r now
Ø 시스템 종료
# sync e 4,5 번 반복 실행 권장
# shutdown ?h now
l 시스템 모니터링 및 점검 방법
▷ CPU 사용률 점검
# top e 숫자 `1` 키로 개개의 Core 별 사용률을 확인 가능
# vmstat 1 e CPU Idle % 확인 가능
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 96 288936 8124 7891644 0 0 3 1 0 1 0 0 100 0 0
0 0 96 288936 8124 7891644 0 0 0 0 1006 3769 0 0 100 0 0
0 0 96 288936 8124 7891644 0 0 0 0 1004 3756 0 0 100 0 0
0 0 96 288936 8124 7891644 0 0 0 0 1004 3760 0 0 100 0 0
▷ 메모리 사용률 점검
# free ?m e 전체 메모리 용량, 사용 용량, free 용량, 캐시 및 버퍼로 사용되는 용량 확인 가능
# top e 각 process 가 점유하는 메모리 용량 확인 가능
▷ 파일시스템 사용률 점검
# df ?h e 파일시스템 사용률 확인 가능(읽기 편한 단위의 용량으로 출력)
# df ?i e Inode 사용률 확인 가능
▷ 시스템 로그 점검
기본적으로 syslog 데몬에 의해서 /var/log/messages 파일에 Log 기록
# cat /var/log/messages
내용이 많을 시에는 아래 특정 레벨의 Log 만 파악 가능
# grep ?i error /var/log/messages
# grep ?i warning /var/log/messages
# grep ?i critical /var/log/messages
# grep ?i fault /var/log/messages
# grep ?i fail /var/log/messages
▷ H/W 상태 점검 (명령어)
# omreport chassis e SEVERITY 값이 OK 이면 H/W 정상 상태임.
Health
Main System Chassis
SEVERITY : COMPONENT
Ok : Fans
Ok : Intrusion
Ok : Memory
Ok : Power Supplies
Ok : Power Management
Ok : Processors
Ok : Temperatures
Ok : Voltages
Ok : Hardware Log
Ok : Batteries
v omreport 명령어를 실행하기 위해서는 Dell에서 제공하는 OpenManage Server Administrator 패키지가 설치되어 있어야 가능함.
우분투 성능 향상
시스템 성능향상의 대부분은 디스크와메모리와 관련되어 있습니다.
왜냐면 디스크의 접근속도와는 비교할 수 없을 정도로 메모리 접근속도가 빠르기 때문이죠.
그래서 가능하면 디스크대신 메모리에서 작업하는것이 속도향상에 도움이 됩니다.
램디스크, 램드라이브 같은것도 같은 맥락입니다.
메모리와 디스크 사이에서 전환을 지원하는 방식으로는
디스크캐싱 (자주 접근한 디스크내용을 저장하고, 접근시 저장된 곳에서 먼저 찾는 방식),
스왑핑 (메모리가 부족할때 일정량의 메모리(메모리페이지)를 디스크에 저장하고 메모리를 회수해서 여유 메모리를 늘려주는것),
램디스크/램드라이브 (메모리의 일부분을 고정적으로 할당하여 디스크인양 사용하게 하는것)
등이 있습니다.
이것을 효율적으로 관리하면 속도를 엄청 향상시킬 수 있습니다.
컨셉은 여유메모리(free memory)가 많다는 것은 그만큼 메모리를 낭비하고 있다는 뜻도 됩니다.
최대한 여유메모리를 줄이고, 디스크접근도 줄여서 성능을 향상시키는 것입니다.
1) 스왑핑을 가능한 줄이자.
리눅스 시스템은 항상 일정량의 여유 메모리를 확보하려고 합니다.
그과정에서 여유메모리가 있음에도 스와핑을 하게 되고, 디스크접근이 이루어집니다.
하지만 얼만큼의 여유메모리를 항상 확보해야 될까요? 그건 리눅스시스템으로서도 알 수 없겠죠.
그래서 이것을 지정해줄 필요가 있습니다.
커널에 파라미터를 동적으로 넘겨주기 위한 것으로 sysctl명령과 /etc/sysctl.conf파일이 있습니다.
/etc/sysctl.conf 파일에 다음을 적어주면 재부팅시 적용됩니다.
이 값이 작을수록 스왑핑을 자주 안하게 됩니다.
기본값으로 60으로 설정되어 있지만, 리눅스 문서를 살펴보아도 데스크탑에서 추천하는 값은 10입니다.
더 안정적으로 하고 싶다면 20이면 충분할것입니다.
Code:
vm.swappiness=10
그리고 재부팅없이 적용하려면,
Code:
sysctl -p /etc/sysctl.conf
혹은
Code:
sysctl -w vm.swappiness=10
2) 디스크캐싱을 최대한 활용하자.
캐싱이라는 기법은 여러부분에 사용됩니다.
대부분 네트웍속도에 비해 디스크접근속도가 빠르므로, 전송된 내용을 디스크에 캐싱하기도 하고 (이 방식은 대부분의 웹브라우져가 구현하고 있지요),
메모리가 디스크에 비해 접근이 빠르기 떄문에, 디스크의 일부분을 메모리에 캐싱하기도 합니다.
하지만 디스크를 메모리에 캐싱하였다고 하였을때, 메모리가 부족해지면 어떻게 될까요?
이때 시스템은 디스크의 메모리캐시를 회수하거나, 이것도 여의치 않으면 메모리의 일부분(메모리페이지)를
디스크에 저장하고 해당메모리를 회수하여 응용프로그램에게 메모리를 할당해 주게 됩니다.
요럴때 디스크의 메모리캐시에서 회수하는 정도를 커널에 지정해 줄 수 있습니다.
Code:
vm.vfs_cache_pressure=50
기본값은 최대값인 100으로 되어 있으며, 가능한한 캐시메모리에서 강탈해갑니다.
이것을 40-100정도 사이에서 조정해 주시면 되는데..
웹서핑을 해보면 대부분은 50정도를 추천하지만, 일부는 40까지 적용한 예도 있고,
또 저의 경우는 80정도가 적당하더군요.
아래는 이것을 테스트하고, 적당한 값을 찾아 볼 수 있게 하는 스크립트입니다.
Code:
#!/usr/bin/sudo /bin/bash
TEST_FILE_SIZE=1024M
TEST_DIR=/usr/share
TEST_VALUES="100 90 80 70 60 50 40"
TEMP_DIR=${1:-$HOME}
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=$TEMP_DIR/testfile0 count=1 bs=$TEST_FILE_SIZE
i=1
for v in $TEST_VALUES;
do
sysctl -w vm.vfs_cache_pressure=$v
find $TEST_DIR> /dev/null
cp $TEMP_DIR/testfile0 $TEMP_DIR/testfile$i
echo "** vm.vfs_cache_pressure=$v **"
time find $DIR/ > /dev/null
((i++))
done
for ((v=0; v<$i; v++));
do
rm -f $TEMP_DIR/testfile$v
done
실행시 시간이 오래 걸릴 수 있으니,
파일크기와 테스트할 수치들을 좀 줄여서 실행하세요.
3) 스왑핑을 디스크가 아닌 메모리에..
메모리가 부족해서 스와핑하는데..
어째서 메모리에 메모리 내용을 저장하냐구요?
키워드는 압축입니다.
스왑영역에 자동압축알고리즘을 적용하여
메모리를 압축하는것이죠.
스왑영역은 여럿 존재할 수 있기 때문에..
압축으로도 부족할때 스왑파티션이나 스왑파일을 사용하면 되겠죠.
이것을 구현한것으로는 google의 compcache/ramzswap과 zramswap-enabler등이 있구요.
이미 우분투리눅스이미지에는 compcache적용되어 있을 겁니다.
/usr/share/initramfs-tools/hooks에 해당 스크립트가 있고,
update-initramfs나 update-grub명령 등으로 바뀐 내용을 적용할 수 있습니다.
하지만, 이것은 크기를 지정해주어야 하고 효율도 zramswap-enabler보다 떨어집니다.
단지 initramfs환경에서 구동하기 위해서 필요하겠죠. 일단 하드로 부팅한 후에는 zram을 사용하는것이 좋습니다.
설치 방법은
Code:
sudo apt-add-repository ppa:shnatsel/zram && sudo apt-get update
sudo apt-get install zramswap-enabler
따로 설정할 것은 없습니다.
다만 3.2커널을 사용할 경우 문제가 있으니, 수정을 요합니다.
Code:
#/etc/init/zramswap.conf
#.. 생략 ..
#modprobe zram num_devices=$num_cpus
#위의 부분을 아래로 바까주세요. 아마도 커널 파라미터 이름이 변경되었나 봅니다.
modprobe zram num_devices=$num_cpus 2>/dev/null || modprobe zram zram_num_devices=$num_cpus 2>/dev/null
#.. 생략 ..
zramswap을 사용하게 되면 스왑핑이 실제로 디스크로 거의 이루어지지 않게 되어서, 엄청 빨라집니다.
4) 부팅속도를 빠르게 해봅시다.
기본적으로 우분투에 uread-ahead라는 서비스가 있고, 이것은 디스크 정보를 저장해놨다가 부팅시에 미리 읽어들여서,
부팅속도는 떨어지지만 시스템의 전반적인 속도를 향상시키는 기능을 합니다.
그냥 넵두는것이 좋겠군요.
그러면 어떻게 부팅속도를 빠르게 할까요?
하이버네이션 또는 서스펜드를 이용하면 금새 부팅이 가능합니다.
그러나 이 기능을 사용하기 위해서는 스왑핑이 필요하고, 보통 스왑 용량이 메모리 총용량보다 커야 합니다.
그리고 스왑핑을 하기 위해서 용량 만큼의 디스크 접근이 필요합니다.
uswsusp라는 유틸리티를 추천합니다.
이름은 unswap suspend의 약자로서, 스왑을 이용하지 않고, 자체적으로 용량을 설정하고 압축해서 저장하게 됩니다.
소프트웨어 소스는 universe에 속해 있으므로 다음 명령으로 설치하시고,
sudo apt-get install uswsusp
서스펜드 모드로 들어가기 위해서 절전모드키 외에..
s2disk와 s2ram명령을 지원하고 있으며
s2disk는 상태를 저장하고 시스템 전원을 끄게 되고, 리부팅시에 바로 부팅됩니다.
s2ram은 실제 전원은 끄지 않고, 최대 절전 모드로 숨어있다가, 파워버튼을 누르면 짜잔하고 뜨게 되는겁니다.
만약 부팅시 어느부분에서 시간이 걸리는지 알아보려면,
bootchart를 설치해보세요
부팅상황을 분석해서 /var/log/bootchart/*.png파일을 만들어 줍니다.
그러나 이것도 부팅시간을 잡아먹기 때문에.. 그림을 확인한 후 서비스를 자동시작하지 않게 만들어 주는게 좋겠죠.
5) 램디스크의 활용?
램디스크를 만드는 방법은 부팅시 부팅메뉴에서 'e'키를 눌러 편집모드로 들어간 후
linux xxx.vmlinuz ... 뒷부분에 ram_disk_size=킬로바이트수치
로 변경해주고 부팅하면 램디스크가 사용가능하며,
참고로,
512 MiB=524288 KiB
256 MiB=262144 KiB
128 MiB=131072 KiB
64 MiB=65536 KiB
32 MiB=32768 KiB
/etc/default/grub파일에서
GRUB_CMDLINE_LINUX_DEFAULT= 부분뒷쪽에 ram_disk_size=xxx라고 적어주시고
sudo update-grub 명령을 주시면 다음 부팅때 램디스크가 생성됩니다.
부팅한 후에는 /dev/ram0는 메모리에서 일정량을 점유하는 램디스크 디바이스가 됩니다.
하지만 파일시스템이 없기 때문에 파일시스템을 만들어 주어야 하고, 디바이스이기 떄문에 마운트도 해주어야 합니다.
Code:
#/etc/rc.local
#...생략
mke2fs -m 0 /dev/ram0 2>/dev/null
if [ $? -ne 0 ]; then
mkdir -p /mnt/rd 2>/dev/null
mount /dev/ram0 /mnt/rd
chown 1000.1000 /mnt/rd
fi
이것은 전통적인 방법의 램디스크 생성법이지만, 약간 다르지만 tmpfs를 이용하여 부팅시 파라미터를 넘겨주지 않아도 간단히 램디스크를 만들 수 있습니다.
Code:
mount -t tmpfs -o size=[tmpfs size] tmpfs [mount point]
또는 /etc/fstab에
tmpfs [mount point] tmpfs size=[tmpfs size] 0 0
로 적어주고 마운트해주면 되는데 사실은 램디스크와는 조금 다릅니다.
공유메모리를 이용하는것이죠.
/dev/shm이것은 공유메모리를 뜻하는 디바이스입니다.
이제까지는 램디스크의 생성법이었구요.
일단 활용하는 방법은 웹브라우져등의 임시파일이나 캐시등을 해당 램디스크 마운트포인트로 설정해 놓으면
저장하고 읽는 과정은 모두 메모리에서 이루어지기 때문에 빠릅니다.
그러고 시스템이 종료되면 다 날아가겠죠?
다만 이것은 메모리의 일부분을 항상 차지하기 때문에.. 너무 크게 지정하거나 메모리가 적은 시스템의 경우는 오히려 좋지 않다고 봅니다.
저는 개인적으로 램디스크를 추천하지 않으며 오히려 앞서의 방법들을 이용해서 캐시메모리를 최대한 활용할 것을 추천합니다.
다만 램디스크가 정말 필요할 경우는..
리눅스ISO파일을 하드에 저장하고,
Code:
#/boot/grub/custom.cfg
menuentry "Boot to RAMDISK from Ubuntu ISO " {
insmod ext2
insmod fat
insmod ntfs
insmod loopback
set isofile=/ubuntu.iso
search -s isodev -f $isofile
loopback lo $isodev$isofile
linux (lo)/casper/vmlinuz boot=casper toram iso-scan/filename=$isofile quiet splash
initrd (lo)/casper/initrd.lz
}
로 편집 저장하고 부팅하면..
ISO내용을 몽땅 메모리에 복사하고, 디스크를 언마운트해서 포멧이 가능하게 하는 경우입니다.
오류 해결
JavaHL Library 오류
Failed to load JavaHL Library.
These are the errors that were encountered:
no libsvnjavahl-1 in java.library.path
no svnjavahl-1 in java.library.path
no svnjavahl in java.library.path
java.library.path = /usr/lib/jvm/java-6-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-6-openj
dk/jre/lib/amd64:/usr/lib/jvm/java-6-openjdk/jre/../lib/amd64:/usr/lib64/xulrunner-addons:/usr
/java/packages/lib/amd64:/usr/lib/jni:/lib:/usr/lib
subclipse를 설치하고 svn 관련 오류발생.. ok를 누르면 되지만 뜨지 않게 하려면
JavaHL를 설치하면 해결되는 문제
Subclipse Version에 맞는 JavaHL을 깔아야 한다는 것
JavaHL은 Subversion의 일부고 각 Subversion은 하나의 Subversion client version 만 지원한다
API 차이 때문
제대로 된 SVN/JavaHL Version을 설치하면 된다
Subclipse Version SVN/JavaHL Version
1.6.x 1.6.x
1.4.x 1.5.x
1.2.x 1.4.x
1.0.x 1.4.x
JavaHL ?
JavaHL은 서브버전(Subversion) 프로젝트의 일부. Java 언어를 서브버전 API에 바인딩하는 것. 서브버전은 계층적 API 디자인을 제공한다. 계층적 API 디자인은 (DLL 같은) 네이티브 라이브러리들로 제공된다. 서브버전 커맨드 라인은 이 API를 사용하는 한 방법일 뿐이다. API에는 풍부한 기능이 있다. 또한 하위 호환성도 유지된다. 굉장히 좋은 서브버전 클라이언트와 도구가 많은데, 그건 바로 필요한 모든 기능을 제공하는 풍부하고 안정적인 API가 있기 때문이다.
서브버전은 모든 플랫폼을 지원하기 위해 C로 만들어졌다. (Subversion is written in C to provide excellent cross platform support, but also because C produces libraries that are easy to consume from virtually any other language.) 서브버전 프로젝트는 자바, 펄, 파이썬 그리고 루비를 위한 언어 바인딩을 제공하고 유지하고 있다. 뒤쪽 세 개에 대해서는 SWIG 라이브러리와 기능을 제공한다. 네이티브 라이브러리로 인터페이스 언어 기능을 구현한 것이다. JavaHL은 “하이 레벨” API고 이것은 C++ 코드로 작성됐다. 자바 코드와 네이티브 라이브러리를 연결하는 JNI를 제공하기 위해서다. 이 디자인은 좋은 자바 API를 서브버전에 제공할 수 있게 해 준다.
JavaHL은 근본적으로 네 파트로 구성된다:
자바 쪽에서 말을 걸 수 있도록 해 주는 API를 제공하기 위한 상대적으로 얇은 자바 코드.
C++ 라이브러리 (JavaHL library 혹은 libsvnjavahl-1). 자바 레이어는 자바 네이티브 인터페이스(JNI) 호출(call)을 이용해 이 레이어에 말을 건다. C++ 계층은 “하이 레벨” API가 구현된 계층에 있다. 예를 들면, 자바는 “이 메세지와 함께 파일 목록을 커밋하라” 하고 말한다. C++ 계층은 메모리를 신경쓰면서 더 낮은 레벨의 서브버전 API 호출을 실행해 요청을 완료한다.
서브버전 라이브러리 자신. 커맨드 라인 클라이언트가 설치하고 사용하는 그 라이브러리와 같은 라이브러리다. 또한 TortoiseSVN이나 AnkhSVN 같은 다른 서브버전 클라이언트들도 이런 같은 라이브러리들을 사용한다.
서브버전 라이브러리 의존성. 서브버전은 작동하기 위해 다수의 외부 라이브러리가 필요하다. 가장 큰 부분은 아파치 포터블 런타임(APR)이고, Neon for the HTTP 클라이언트와 보안 제어를 위한 OpenSSL 등의 라이브러리도 필요하다.
JavaHL이 어플리케이션에 사용되고 작동하게 하기 위해 이 네 가지 계층이 필요하다.
왜 서브클립스에 JavaHL이 필요한가?
서브클립스은 자바로 만들어졌다. 그래서 서브버전 API를 사용하기 위해서는 JavaHL 라이브러리를 사용해야 한다. 서브클립스는 JavaHL의 자바 계층을 내장하고 있다. 바로 앞의 항목을 보면, 그게 실제로 작동하기 위해 세 개의 서로 다른 계층이 필요하다는 것을 알 수 있을 것이다. (근본적으로는 네이티브 라이브러리.)
왜 서브클립스가 JavaHL에 필요한 모든 것을 제공하지 않는가?
32비트 윈도우에서 우리는 필요한 모든 것을 제공한다. 그러나 다른 데서는 기술적 이유로 그렇게 할 수 없다. 네이티브 라이브러리들이 서로 다른 운영체제에서 로드되는 방법이 있어야 한다. 자바와 이클립스에서 사용될 때 서로 다른 세 계층을 그렇게 작동시킬 방법은 없다. 그렇게 하기 위해 찾을 수 있는 유일한 방법은 그게 운영체제가 찾을 수 있는 올바른 위치에 제대로 설치됐는지 확인하는 것이다. 윈도우 라이브러리 로딩에는 자바에서 이용할 수 있는 쿼크(quirk)가 있다. 기본적으로, 우리는 역 주문을 통해 의존성을 로드할 수 있고, 그렇게 함으로써 우리는 각각의 라이브러리를 불러올 수 있다. 의존성이 이미 메모리에 로드돼 있어서 로더가 더이상 그들을 불러오려고 시도하지 않기 때문이다.(뭔 말인지;;)
JavaHL을 어떻게 얻을 수 있나요?
운영체제에 따라 다양한다.
윈도우 32비트
서브클립스 자체에 필요한 모든 게 들어있다. 우리의 이클립스 업데이트 사이트에서 JavaHL 플러그인이 설치됐는지만 확인하면 된다.
윈도우 64비트
만약 32비트 JVM을 사용하고 있다면 서브클립스가 제대로 작동할 것이다. 만약 64비트 JVM을 사용하고 있다면 JavaHL 64비트 버전을 제공해야 한다. 그 중 하나는 SlikSVN이고 여기서 얻을 수 있다:
패키지를 설치하면, 서브클립스가 PATH에서 JavaHL을 찾을 것이고, 제대로 작동할 거다.
OS X
가장 쉬운 방법은 OSX 패키지를 다운로드해 설치하는 것이다. OSX 패키지는 openCollabNet을 제공한다. 이것은 JavaHL 라이브러리를 갖고 있는 서브버전을 설치한다. 위치는 /opt/subversion 이다. 그리고 나서 JavaHL 라이브러리를 위해 /Library/Java/Extensions에 심볼릭 링크를 만든다. 이 곳은 OSX JVM이 JNI로 라이브러리를 불러올 때 확인하는 글로벌한 위치다. 그래서 기본적으로, 이 패키지를 설치하면 더 할 게 없다. 서브클립스를 설치한 후 이것을 설치하면 괜찮다. 32비트와 64비트 모두에 사용할 수 있다. MacPorts 또한 손쉬운 서브버전과 JavaHL 패키지를 제공한다. 그러나 스노우 레오파드 MacPorts는 여전이 이 패키지들을 32비트 바이너리로 컴파일한다. 만약 기본으로 있는 64비트 스노우 레오파드 JVM를 사용하면 JavaHL이 로드됐을 때 아래와 같은 에러를 보게 될 것이다.
Failed to load JavaHL Library.
These are the errors that were encountered:
no libsvnjavahl-1 in java.library.path
no svnjavahl-1 in java.library.path
/opt/local/lib/libsvnjavahl-1.0.0.0.dylib: no suitable image found. Did find: /opt/local/lib/libsvnjavahl-1.0.0.0.dylib: mach-o, but wrong architecture
잘못된 아키텍쳐라는 에러 메세지를 주목하라. 이건 64비트 JVM이 32비트 네이티브 라이브러리를 로드할 수 없다는 얘기다. OSX CollabNet 바이너리에는 이런 문제가 없다. 거기엔 32비드와 64비트 버전이 모두 있기 때문이다.
물론 우분투 같은 많은 리눅스 배포판이 서브버전 패키지를 업데이트하기 위한 좋은 방법을 제공한다. 이런 방법을 사용하면 JavaHL이 대부분 잘 설치된다. 전형적으로 JavaHL 라이브러리는 메인 서브버전 패키지에 의존적인 분리된 패키지들에 들어 있다. 데비안/우분투에서는 패키지 이름이 libsvn-java다. 그래서 이런 커맨드만으로 라이브러리를 설치할 수 있다.
sudo apt-get install libsvn-java
일단 라이브러리를 인스톨하면, (이클립스를 사용할 때) 자바한테 어디서 그걸 찾을 수 있는지 말해 줘야 한다. 리눅스 JVM 많은 경우 라이브러리를 찾기 위해 표준 경로를 살피지 않는다. 이건 미래에 분명 바뀔 것이다. 예컨대, 데비안/우분투는 자바에 사용되는 라이브러리로 /usr/lib/jni라는 표준 경로를 사용한다. 그러나, 썬 JVM은 지금 이 경로를 살피지 않는다. 자바에 어디에서 JavaHL 라이브러리를 찾을 수 있는지 말해 주는 가장 쉬운 방법은 JVM이 시작할 때 아래와 같이 명기해 주는 것이다.
-Djava.library.path=/usr/lib/jni
CollabNet 서브버전은 /opt/CollabNet_Subversion 에 설치된다. 따라서 이 패키지를 사용할 경우 이렇게 써야 한다.
-Djava.library.path=/opt/CollabNet_Subversion/lib
라이브러리의 이름은 libsvnjavahl-1.so 다. 경로를 명기할 때 이 파일을 포함해야 한다.
이클립스는 이 세팅을 위해 자신의 매커니즘을 제공한다. 이클립스에는 eclipse.ini 라는 이름의 파일이 있다. 이 파일은 JVM이 실행될 때 살펴 보는 파일이고, JVM에 세팅을 추가한다. 특히, “-vmargs” 라는 라인을 찾아야 한다. 이 라인 아래쪽에 새로운 라인을 추가하고 위 라인을 추가해서 세팅이 JVM에 필요하다고 알려 준다. 한 줄에 인수 하나만 넣어야 한다. 즉, 반드시 새로운 줄에 넣어야 한다. 그리고 한 줄에 위에서 말한 내용을 다 넣어 줘야 한다. 이클립스 3.4에서 그렇게 한 예제다.
-showsplash
org.eclipse.platform
-framework
plugins/org.eclipse.osgi_3.4.0.v20080605-1900.jar
-vmargs
-Djava.library.path=/opt/CollabNet_Subversion/lib
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m
-XX:MaxPermSize=256m
기타 문제 해결
이클립스 Preferences 밑의 Team > SVN 에서 JavaHL이 로드됐는지 확인할 수 있다. 만약 라이브러리가 제대로 로드됐다면, 라이브러리 버전을 볼 수 있을 것이다. 그렇지 않다면 “Not available”이라고 나온다. 만약 버전이 사용하기 너무 오래된 거라면, 라이브러리를 로드할 수 없을 것이고 “Not available” 이라고 나올 것이다.
리눅스 사용자에게 나타나는 일반적인 문제는 eclipse.ini에 라이브러리를 로드하는 경로를 적어 넣기는 했지만 작동하지 않는 경우다. 이런 일이 벌어졌을 때 체크할 것은, INI 파일 안의 세팅이 실제로 사용되는지다. 많은 사용자들이 이클립스를 실행할 때 몇몇 커맨드 라인 옵션을 적어 넣어 런처를 커스터마이징한다. 그렇게 하면, 이클립스 런처는 INI 파일 중 몇몇 세팅을 사용하지 않게 된다. 이런 일이 벌어졌는지 확인하는 가장 쉬운 방법은 이클립스에서 Help > About 에 들어가서 Counfiguration Settings를 선택하는 거다. 거기 가면 JVM이 사용하고 있는 setting을 볼 수 있다. 만약 거기에 java.library.path 라인이 없다면, 그건 사용되지 않고 있다는 거다.
리눅스에서 클라이언트는 로드되는데, 이클립스가 첫 번째 작동에서 잠기거나(LOCKS) 충돌을(CRASHES) 일으킨다
이것은 현재 서브버전 1.6이 새로운 GNOME keyring을 지원하는 과정에서 생긴 버그다. 커맨드라인을 사용할 때는 정상적으로 작동하는데, 다른 사용자가 라이브러리를 사용하려고 하면 제대로 작동을 안 한다. 이게 수정될 때까지, 이 기능을 꺼서 문제를 회피할 수 있다. 그렇게 하기 위해, ~/.subversion/config 파일을 열고, 다음을 추가하라.
[auth]
### Set password stores used by Subversion. They should be
### delimited by spaces or commas. The order of values determines
### the order in which password stores are used.
### Valid password stores:
### gnome-keyring (Unix-like systems)
### kwallet (Unix-like systems)
### keychain (Mac OS X)
### windows-cryptoapi (Windows)
password-stores =
password-stores를 빈 칸으로 남겨 놓으면 이 기능을 끄는 거다. passwords는 모든 구버전 서브버전에서 권한 폴더에 플래인 텍스트로 저장된다.
JAVAHL LIBRARY 테스트하기
위의 모든 사항을 이행했는데도 JavaHL 라이브러리가 제대로 작동하지 않는다면, 서브버전 JavaHL JUnit 테스트가 설치를 도와줄 수 있다. 전형적으로, 이것은 서브클립스가 내는 에러와 같은 에러를 낸다. 그러나 시도하고 에러를 내고 문제를 진단하기 더 쉽다.
테스트를 실행하기 쉽게 만들기 위해, JUnit과 JavaHL 클래스를 하나의 Jar 파일에 넣은 서브버전 테스트를 번들로 제공한다. 서브버전 1.6용 테스트를 다음 링크에서 다운받을 수 있다.
javahltests.jar
이 Jar 파일은 JavaHL 라이브러리의 서브버전 1.6.x 버전에서만 작동한다. 테스트를 하기 위해 다음을 하면 된다:
$ java -jar javahltests.jar
....................?....................?.
.........
Time: 145.805
OK (50 tests)
The tests create a bunch of repositories and working copies, so run these from a folder you can easily delete or cleanup. Also, you will want to be sure you run the tests using the same JVM that you are using for Eclipse. Finally, you will need to make sure the JavaHL library is on your PATH. So you will probably need to run it something like this:
$ java -Djava.library.path=/opt/CollabNet_Subversion/lib -jar javahltests.jar
....................?....................?.
.........
Time: 145.805
OK (50 tests)
우선 윈도우 7(real OS) 설정
윈도우 탐색기에서 E드라이브 오른쪽 클릭 -> 속성 ->공유 탭 ->고급 공유 ->선택한 폴더 공유 체크 -> 확인
(권한이나 공유 이름은 원하는대로 변경하면 됨)
vmware 설정
VM -> Options -> Shared Folders -> Always enabled (입 맛대로 바꾸면 됨) -> Add -> Next -> Host path를 Browsing을 통해 E드라이브를 설정해 주면 됨 -> Next -> Finish
이 후에 우분투를 reboot하면 /mnt/hgfs/폴더이름 으로 연결이 된다. 만약 안될 경우 아래의 명령어를 터미널에서 입력 후 에러가 있는지 확인(에러 있으면 안됨)