SNMP4J를 사용해서 SNMP Response를 처리하다 보면, 분명히 있는 테이블의 있는 컬럼인데 그 값을 제대로 읽어오지 못하고 timeout이 나버리는 경우가 있습니다. 가령 다음 그림을 보시면...
SNMP4J library does not handle null values for InetAddress columns or scalar values. Therefore, if you do GET or GETNEXT or GETBULK for the fields, your request will be timed out. But most of the MIB browsers do not. They handle the case without error.
MIB 브라우저로 보면 InetAddress 타입의 Table Column 값이 없을 경우 null 응답을 받아서 잘 보여주고 있는 점을 보실 수 있습니다. 그런데 SNMP4J 라이브러리는 InetAddress 타입 컬럼의 값이 null인 경우를 제대로 처리하지 못합니다. 즉, InetAddress 타입 컬럼의 값이 null로 채워진 응답을 받으면, 그냥 무시해버립니다. 그러다보니 SNMP Agent에서는 응답을 보냈어도 클라이언트 쪽에서는 Timeout 나 버리는 경우가 발생하죠.
Above picture shows that MIB browsers correctly handle null-value for InetAddress fields. But, as I already tolds you, SNMP4j does not.
이 문제를 교정하려면 org.snmp4j.smi.IpAddress 클래스를 다음과 같이 수정해야 합니다.
To remedy this problem, you should fix org.snmp4j.smi.IpAddress class as follows.
이렇게 수정하고 실행해보면 이제 SNMP Agent가 InetAddress 타입 column의 값을 null로 보내도 오류 없이 처리하는 것을 보실 수 있습니다. SNMP4J는 소스코드와 함께 Maven 프로젝트 형식으로 배포되기 때문에, 간단히 재컴파일해서 쓰실 수 있습니다.
As SNMP4J is distributed as a Maven project with source codes, you can easily recompile and detour the timeout problems. :-)
요즘 시스템 퍼포먼스 성능 튜닝을 하고 있습니다. 제가 개발에 참여한 시스템이 Java로 구현되어 있어서, Java 성능 튜닝을 하는 중입니다.
그런데 작업을 하다가 아주 재미난 현상을 발견했습니다. 쓰레드 (아주 작습니다) 를 아주 빠른 주기로 생성해서 프로세싱을 하는데 (하다가 성능이 잘 안나올 것 같아서 쓰레드 풀을 만들어 쓰고 있습니다) 쓰레드 객체가 new되어서 실제로 run 되는데 까지 16ms가 (정확하게는 15.5ms쯤 되는 것 같습니다) 걸리는 현상이 1초당 20~40회 정도 목격된 것이죠.
이 현상이 최초로 목격된 것은 Windows 2003 서버였는데, 비스타나 Windows 7에서도 똑같았습니다.
그래서 쓰레드를 만드는 부분의 코드만 아주 작은 테스트 프로그램으로 분리한 다음에 Windows 시스템들에서 각각 돌려봤습니다. 똑같더군요. ㅋㅋ
같은 프로그램을 Mac OS X에서 돌려봤습니다. 거기서는 그런 현상이 관측되지 않았습니다. Mac OS X에서 실행한 그래프는 다음과 같습니다. Eclipse를 썼습니다. 프로그램 초반에는 쓰레드 풀과 객체 풀이 초기화되느라 약간의 삽질을 하는 것이 보입니다만, sample 수를 감안한다면 적당한 성능을 보입니다.
Windows 플랫폼에서는 가로줄이 0과 16ms 위치에 두 줄 그어집니다. 이 문제를 해결하기 위해서 웹 써치를 좀 했는데, 아무래도 실제로 성능이 그렇게 나오기 때문에 그런 그래프가 그려진다기 보다는, System.currentTimeMillis() 의 resolution이 Windows에서 떨어지기 때문인 것 같더군요.
이 문제를 workaround하기 위한 한 가지 방법은, (measurement가 중요한 환경이라면) System.currentTimeMillis()를 쓰는 대신 System.nanoTime()을 쓰는 것입니다. 그러면 Windows XP 상에서 다음과 같이 성능 측정 결과가 개선되는 것을 볼 수 있습니다.
Y 축은 nanosecond를 millisecond로 변환한 결과입니다. 측정된 성능은 확연하게 나아졌습니다. (Mac OS X보다 낫다고 하긴 뭐합니다. 이 위에 Mac OS X에 대해 그린 그래프는 System.nanoTime을 써서 그린 그래프가 아니라서 정확한 비교자료가 될 수 없거든요.)
대략적인 작업 순서는 다음과 같다. (이 글은 "까먹기 전에 적어둔다"는 원칙을 지키기 위해 적은 것임을 미리 밝힌다. 그러므로 설명이 좀 덜 자세할 수도 있다. 필요하면 요청하시길...)
SVN 설치
sudo apt-get install subversion
SVN 저장소 생성
편한 곳으로 가서 svnadmin create repository 라고 치면, 그 디렉터리 아래에 repository라는 이름의 Subversion 저장소가 생성된다. 여기에 프로젝트 소스 코드를 등록하면 공유된다. 이 디렉터리 아래에 가면 conf 디렉터리가 있는데, 이 디렉터리에 있는 파일들을 수정하면 접속 가능한 사용자와 그 사용자의 패스워드를 설정할 수가 있다. 다음의 파일을 참고하자.
1. authz파일
### This file is an example authorization file for svnserve. ### Its format is identical to that of mod_authz_svn authorization ### files. ### As shown below each section defines authorizations for the path and ### (optional) repository specified by the section name. ### The authorizations follow. An authorization line can refer to a ### single user, to a group of users defined in a special [groups] ### section, or to anyone using the '*' wildcard. Each definition can ### grant read ('r') access, read-write ('rw') access, or no access ### ('').
[groups] developers=bjlee,ngen
[repository:/] @developers = rw * = r
[/] @developers = rw * = r
# [/foo/bar] # harry = rw # * =
# [repository:/baz/fuz] # @harry_and_sally = rw # * = r
2. passwd 파일
### This file is an example password file for svnserve. ### Its format is similar to that of svnserve.conf. As shown in the ### example below it contains one section labelled [users]. ### The name and password for each user follow, one account per line.
[users] bjlee=xxx ngen=yyy
# harry = harryssecret # sally = sallyssecret
3. svnserve.conf 파일
### This file controls the configuration of the svnserve daemon, if you ### use it to allow access to this repository. (If you only allow ### access through http: and/or file: URLs, then this file is ### irrelevant.)
[general] ### These options control access to the repository for unauthenticated ### and authenticated users. Valid values are "write", "read", ### and "none". The sample settings below are the defaults. anon-access = read auth-access = write ### The password-db option controls the location of the password ### database file. Unless you specify a path starting with a /, ### the file's location is relative to the conf directory. ### Uncomment the line below to use the default password file. password-db = passwd ### The authz-db option controls the location of the authorization ### rules for path-based access control. Unless you specify a path ### starting with a /, the file's location is relative to the conf ### directory. If you don't specify an authz-db, no path-based access ### control is done. ### Uncomment the line below to use the default authorization file. authz-db = authz ### This option specifies the authentication realm of the repository. ### If two repositories have the same authentication realm, they should ### have the same password database, and vice versa. The default realm ### is repository's uuid. # realm = My First Repository
SVN Server 실행
svnserve라는 프로그램을 실행하면 SVN 서버를 외부에서 svn://으로 시작하는 URL로 참조하여 사용할 수가 있다. 아까 생성한 repository 디렉터리로 가서, svnserve -d -r . 이라고 해 주자. -d는 daemon으로 띄우라는 소리이고, -r . 은 바로 여이가 repository 디렉터리란 뜻이다.
artifact id는 내 프로젝트의 ID라고 생각하면 된다. 위와 같이 실행하면 다음과 같은 디스크 레이아웃이 만들어지게 된다.
my-app
|-- pom.xml
`-- src
|-- main
| `-- java
| `-- com
| `-- mycompany
| `-- app
| `-- App.java
`-- test
`-- java
`-- com
`-- mycompany
`-- app
`-- AppTest.java
이제 여기에 소스 코드를 추가해 나가기만 하면 된다. 프로젝트가 여러 가지 다른 jar 파일에 의존하고 있다면, 그 파일에 대한 의존성도 역시 추가해 나가기만 하면 된다. Maven이 좋은 점은, 내 프로젝트가 의존하는 jar 파일을 어떻게 다운 받아서 어떻게 설치할 것인지를 고민하지 않아도, 대부분 알아서 다 해준다는 점이다. 의존성은 pom.xml 파일에 추가한다.
필자의 프로젝트는 저렇게 많은 3rd-party 프로젝트들에 의존하고 있다. 의존 대상이 되는 라이브러리의 group id와 artifact id를 적어주고, 버전 정보만 정확하게 적어주면 이 파일들을 어떻게 다운받아 어떻게 설치할 것인지는 Maven이 다 알아해 준다. 그런데 group id와 artifact id 등의 정보는 어떻게 알아내느냐고? www.mvnrepository.com 에 가서 프로젝트 이름으로 검색을 해 보면, 여러분의 POM 파일에 끼워넣어야 할 dependency 태그 코드를 버전 별로 다 알려준다.
그런데 한가지 귀찮은 것은, sun에서 배포하는 jar 파일 중에는 자동 설치가 되지 않는 놈이 있다는 사실이다. 그런 것이 발견될 경우, Maven은 친절하게 "그런 파일은 어떻게 어떻게 처리해 주십사"는 안내 메시지까지 보여준다.[각주:1]
코드를 적절히 작성했다면 컴파일 해 보고 싶을 것이다. mvn compile 하면 컴파일 되고, mvn test 하면 jUnit 테스트 코드가 실행된다.
SVN 서버에 프로젝트 코드 올리기
SVN 서버에 프로젝트 코드를 올리는 것은 간단하다.
svn import <ProjectName> svn://<서버주소>/<프로젝트 이름>
위와 같이 하면 된다. 프로젝트 이름을 URL 위에 꼭 붙여주는 것이 좋은데, 아까 만들었던 repository가 범용 리파지토리, 그러니까 여러가지 프로젝트가 동시에 등록될 수 있는 리파지토리이기 때문이다. 이 이름을 주지 않으면 나중에 프로젝트를 Eclipse를 통해 직접 체크아웃한 다음 빌드하려고 할 때 애로사항이 꽃피게 될 수도 있다. 그러니 반드시 주자. 아이디와 패스워드를 묻거든, authz파일과 passwd 파일에 설정한 대로 입력하자. 그러면 성공적으로 등록될 것이다.
SVN 서버에 올린 프로젝트 다운 받아 빌드하기
Eclipse에서 다운받아 빌드하는 것에는 대략 두 가지 방법이 있다. TortoiseSVN같은 툴을 써서 임의의 디렉터리에 프로젝트 코드를 통째로 checkout한 다음 eclipse 프로젝트로 임포트 해서 빌드하는 방법이 있고, Eclipse 안에서 SVN 연동기능을 사용해 직접 checkout 받아 빌드하는 방법이 있다.
첫 번째 방법을 쓰던 두 번째 방법을 쓰던 방법 자체가 너무 뻔해서 따로 설명하진 않겠다. 다만 Eclips에 Maven 2 플러그인을 설치해야 한다는 것에만 주의하자.
SVN 서버에 올린 프로젝트를 Hudson으로 빌드하기
이게 SVN 서버에 올라간 프로젝트를 Hudson을 통해 CI 할 수 있다. Hudson 설치는 너무 간단한 관계로 따로 설명하지 않겠지만 한가지만 언급하자면, 굳이 Hudson을 다른 웹 서버에 붙여 돌리려고 애쓰지 말기 바란다. 그래봐야 별 차이가 없는데다, standalone으로 돌리는 편이 훨씬 간단하다.
java -jar hudson.war 만 하면 hudson 서버가 실행되기 때문.
이렇게 실행시키고, 실행시킨 서버의 URL의 8080 포트번호로 웹 브라우저를 통해 접속해보면, 허드슨 main 페이지를 보게 된다. 여기에 새로운 죠브를 등록한다.
새로운 죠브를 등록할 때 SVN Repository의 URL을 입력하게 되는데, 여기에는 아까 SVN 서버에 프로젝트 코드를 올릴때 썼던 URL을 주면 된다. svn://<서버주소>/<프로젝트 이름> 이렇게 주면 된다는 것. 그러면 Hudson은 해당 이름의 프로젝트로 등록된 코드들을 쭉 받아서 빌드하게 될 것이다.
한가지 유의할 것은, compile 이외의 maven goal들을 실행하고자 하는 경우에는 Build 섹션의 goals and options 부분에 여러 가지 goal 들을 나열해주어야 한다는 것. 필자는 compile test findbugs:findbugs 를 적어주었다. compile은 컴파일하기 위한 것이고, test는 테스트를 수행하기 위한 것이고, findbugs:findbugs는 findbugs 리포트를 생성하기 위한 것이다. findbugs는 Maven 플러그인 중 한가지로, 이 플러그인을 사용하면 코드에 존재하는 잠재적인 버그를 검사할 수 있다. Maven 프로젝트를 정의할 때 pom.xml에 다음과 같이 적어주면 작동하도록 할 수 있다.
이렇게 한 다음에 Hudson의 project configuratiojn 부분에서는 Build Setting 섹션에 가서 Publish Findbugs Analysis Result를 세팅한다. 이렇게 하고 나면 빌드가 끝난 후에 그 결과가 성공이었는지 실패였는지의 여부 이외에도 다양한 정보와 버그 추이를 쉽게 확인할 수 있을 것이다. Publish Findbugs Analysis Result 항목이 보이지 않는 경우에는 Hudson에 findbugs 플러그인이 설치되어 있지 않은 것이므로, 설치해 주어야 한다. (정리해보자면, findbugs를 돌리기 위해서는 Maven 프로젝트에 설정을 해 주어야 하고, Hudson에도 플러그인을 설치해 주어야 하고, 최종적으로 Hudson 프로젝트 설정을 수정해야 하는 셈.) 플러그인 설치는 Hudson 관리 메뉴쪽으로 들어가보면 할 수 있다.
[그림이 업로드가 안되어서 (무슨조환지) 참고할만한 그림은 못올렸습니다. 나중에 시간나면 업데이트..]
Windows 환경에서 Eclipse 위에 Maven 2 플러그인을 돌리고 있는 사용자가 Maven 2 프로젝트를 임포트받아 컴파일하는 경우에는 그런 메시지를 받았을 경우 처리하기가 좀 난감한데, 다음과 같이 처리하면 된다. 우선, 자동 설치가 안되는 파일을 sun의 홈페이지에 가서 다운 받는다. (어디서 다운받아야 하는지는 Maven이 알려준다.) 다운 받은 파일을 C:Document and Settings<자기 사용자 이름>.m2repository 디렉터리의 적절한 위치에 옮긴다. 어느 위치로 옮겨야 하느냐는 역시 Maven이 보여주는 안내메시지를 보면 대략적으로 짐작할 수 있다. 옮긴 뒤에는, 해당 디렉터리 안에 있는 pom 파일명에 포함된 버전 번호와 같은 버전 번호를 갖도록 파일 이름을 적절히 바꾸어 주어야 한다. [본문으로]
SVN에 등록된 Maven 프로젝트를 checkout 받아서 빌드하는 과정은 아주 단순하다.
우선 다음과 같이 프로젝트를 checkout 한다.
svn co http://..../svn/pe/testapp testapp
이전 글과 마찬가지로, 붉은색으로 표시된 부분은 자신의 환경에 맞추어 바꾸면 된다.
co는 checkout의 약자이고, 그 뒤에 나오는것은 project의 URL이며, (이를 위해서 Apache에 SVN 서버가 통합되어 있어야 한다. 그 통합 방법은 이전 글에서 다룬 바 있다.) testapp는 checkout 받은 소스가 들어갈 디렉터리 이름이다.
이렇게 하면 testapp 디렉터리 안에 소스코드들이 쫙 깔린다.
이 디렉터리로 가서
mvn compile
위와 같이 하면 코드가 컴파일된다. 다음은 실행 결과이다.
bjlee@bjlee-ubuntu804:~/work/maven/testapp$ mvn compile [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Building testapp [INFO] task-segment: [compile] [INFO] ------------------------------------------------------------------------ [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Nothing to compile - all classes are up to date [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1 second [INFO] Finished at: Wed Jul 16 16:44:00 KST 2008 [INFO] Final Memory: 2M/6M [INFO] ------------------------------------------------------------------------
테스트를 실행하는 방법은 다음과 같다.
mvn test
위와 같이 하면 테스트가 실행된다. 다음은 실행 결과이다.
bjlee@bjlee-ubuntu804:~/work/maven/testapp$ mvn test [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Building testapp [INFO] task-segment: [test] [INFO] ------------------------------------------------------------------------ [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Nothing to compile - all classes are up to date [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Nothing to compile - all classes are up to date [INFO] [surefire:test] [INFO] Surefire report directory: /home/bjlee/work/maven/testapp/target/surefire-reports
------------------------------------------------------- T E S T S ------------------------------------------------------- Running re.etri.moncp.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.042 sec
이제 테스트 결과 fail된 테스트가 발견되었을 시, 그에 대한 issue를 Trac에 자동 등록하도록 하는 부분을 구성해야 한다. 그 부분이 가장 어렵다.
<self-question> 지금 생각으로서는 Maven 플러그인을 구현하면 좋을것 같기도 한데, 그 방법이 워낙 까다로와서 엄두가 나질 않는다. 하지만 시도해 볼 만한 가치는 있을 듯... (아니면 google 검색을 잘 하면 나올지도 *쿨럭*) </self-question>
여기까지 한 다음 sudo apache2ctl restart 한다. 간혹 /etc/apache2/conf.d/svn 파일에 문제가 있다는 오류 메시지가 뜨기도 할텐데, 대부분 LoadModule를 추가하지 않아서 생기는 문제일 것. http://www.pyrasis.com/main/Subversion-HOWTO#s-4.2 이 문서를 참고해서 /etc/apache2/conf.d/svn 맨 윗줄에 추가해주면 된다. 필자는 안넣어도 되길래 그냥 넣지 않았다.
Subversion, m2clipse 플러그인 설치 (+with Eclipse)
Subversion plugin을 Eclipse에 설치하면 SVN 서버와 연동할 수 있다. 물론 SVN 서버는 상기 절차를 거쳐 apache2 서버를 통해 외부와 연동할 준비가 되어 있어야 한다.
그런데 설치하려고 하다보면 equinox라는 플러그인에 대한 의존성을 해결할 수 없다고 불평할 때가 있음. 그런 경우에는 관련 플러그인들을 찾아서 설치하거나 Maven Integration for AJDT를 선택하지 않으면 문제를 해결할 수 있음.
Eclise에서 Maven 프로젝트를 생성하고 SVN 저장소에 등록해보자
프로젝트 생성 과정은 다음과 같다. File->New->Maven Project 첫 번째 창에서 use default workspace location을 선택하고, 두 번째 창에서 maven-archetype-quickstart를 선택한다. (Nexus Indexer가 선택된 상태라야 가능) 세 번째 창에서 필요한 값들을 입력하고 finish를 누르면 프로젝트가 생성된다.
프로젝트를 SVN 서버에 올리는 과정은 다음과 같다. 프로젝트 생성 후 프로젝트 이름 위에서 마우스 오른쪽 버튼 클릭 -> team -> share 선택하면 첫 번째 창에서 SVN 선택, 두 번째 창에서 리파지토리 위치 선택 (http://xxxx.../svn/pe) 그러고 나면 아이디랑 패스워드를 물어볼텐데, 그때는 적절히 아이디랑 패스워드를 입력해 주면 됨. (그에 대해서는 맨 위의 "SVN 서버 준비"의 관련 부분 참고.
맺으며
여기까지 하면 Eclipse를 통해 Maven 프로젝트를 생성하고, 중앙 저장소에 등록하는 준비가 끝난 셈이다. 이전 글에서 설명했던 MyLyn + Trac 연동만 제대로 되면, "이슈 추적 + 코드 공유"라는 큰 그림을 Eclipse를 통해 그리는 준비작업은 대략 끝난 셈이다.
이제 필요한 것은 SVN 저장소에 저장된 공유 코드들을 매일 빌드하고, 그 결과를 새로운 이슈로 만들어 Trac에 등록하는 작업을 어떻게 처리하느냐다.
위와 같이 해도 된다. 다만 주의할 것은... 이렇게 인스톨하면 egg cache를 Trac 프로젝트 디렉터리 (이 글의 경우에는 /home/bjlee/work/trac/pe) 아래에 .egg-cache라는 이름으로 만들어주어야 한다는 것. 권한은 777로 주면 된다.
trac을 설치한 다음에는 실행해주어야 할 명령들이 있는데 필자의 경우에는 대략 다음과 같았다. (붉은색으로 표시된 부분은 여러분들이 알아서 정해야 하는 부분.)
trac-admin /home/bjlee/work/trac/pe initenv
기존에 trac을 깔았는데 업그레이드 하신 분들은 다음과 같이.
trac-admin /home/bjlee/work/trac/pe upgrade
제대로 설치가 되었는지 확인해보려면 다음과 같이 해 보면 된다.
tracd --port 8000 /home/bjlee/work/trac/pe
그리고 나서 웹 브라우저를 띄워 접속해서 화면이 정상적으로 나오면 trac 설치는 제대로 된 것이다. tracd는 경량의 httpd 서버로, 엔간한 작업은 이것으로 할 수 있다. 하지만 mod_python등을 설치해서 뭔가 다른 작업을 하려면 한계가 있으므로, apache2를 설치한다. tracd는 ctrl+C로 종료시킬 수 있다.
위의 설정 파일을 보면 PYTHON_EGG_CACHE라는 환경변수를 정의하는 부분을 볼 수 있다. 나중에 Trac Plugin을 설치할 때 필요한 부분이다. 저 곳 말고 다른 곳으로 지정할 수도 있는데, 편한 곳으로 하면 된다. 단, 해당 디렉터리의 권한은 chmod 777로 설정해 주어야 한다는 점이 귀찮은 점. 단, 0.11대의 최신 버전의 trac을 설치한 경우에는 이 줄은 둘 필요가 없고, 생략하면 된다.
그 아래 줄에 보면 locale을 지정한 부분이 있는데, 그 줄은 날짜 형식 관련해서 trac 시스템이 오동작할 때 (무슨 말인지는 겪어보면 안다 ㅋㅋ) 해결해주기 위한 부분이다. 웹을 찾아보면 한글 로케일인 ko_KR.utf8을 시도해보라는 글이 있는데, 필자의 경우에는 그렇게 해도 해결이 되질 않아서 저렇게 해 두었다. 다행히 지금은 문제없이 동작한다.
또한 위의 설정 파일을 보면 trac.htpasswd라는 파일을 참조하는 부분을 볼 수 있다. trac 사용자와 그 패스워드를 설정하는 부분이다. 다음과 같이 하여 이 파일을 생성한다.
$ htpasswd -c /home/bjlee/work/trac/pe/trac.htpasswd bjlee New password: <type password> Re-type new password: <type password again> Adding password for user bjlee
다른 사용자의 설정을 추가하려면 위의 과정을 계속 반복하면 된다. 두번째 부터는 -c 플래그를 둘 필요는 없다.
TRAC_ADMIN 이외의 다른 권한을 주려면 http://<서버주소>/pe/wiki/TracPermissions에 접속하여 가능한 권한을 살펴보면 된다. trac이 깔리면 기본적으로 wiki 문서들이 같이 깔리므로, 브라우저로 문서들을 살펴볼 수 있다. 아. 브라우저로 보려면 아파치 웹 서버를 띄워줘야 한다. 다음과 같이 띄운다.
sudo apache2ctl start
이제 Trac 플러그인 설치를 위한 준비작업이 필요하다. (플러그인 설치는 반드시 해야할 사항은 아님) 이에 관해서는 http://<Trac 서버 주소>/pe/wiki/TracPlugins를 참고하면 된다. 하지만 간단히 요약해보면,
인터넷 찾아보면 여러가지 문서들이 나오지만... '가장 간단한 방법'은 3.3.x 대의 Eclipse 플랫폼을 사용하고, http://www.eclipse.org/mylyn/downloads/ 에 가서 download.eclipse.org/tools/mylyn/update/e3.3 (Eclipse 3.3)과 download.eclipse.org/tools/mylyn/update/extras (Eclipse 3.3 and 3.4) 옆의 디스크 모양 버튼을 눌러, 관련 zip 파일을 다운받아 설치하는 것이다.
(Eclipse 3.4의 경우에도 크게 다르진 않은데, MyLyn 코어에 해당하는 부분은 그냥 Help->Software Update에서 Avaliable Software탭을 누르면 나오는 맨 윗 필드에 MyLyn을 입력하면 필터링 되어 나오는 플러그인들을 전부 설치하는 식으로 하는 것이 젤 낫고, 위 download.eclipse.org/tools/mylyn/update/extras에 해당하는 부분은 Add Site 버튼을 누른 뒤 http://download.eclipse.org/tools/mylyn/update/extras를 등록한 다음에 설치하는 것이 낫다. extras에 해당하는 부분 만이라면, 직접 받아서 아래와 같이 깔아도 되긴 된다. ^^;;)
다운받은 파일들을 각각 압축을 풀면, 그 안에 features와 plugins 디렉터리가 만들어지는 것을 볼 수 있다.
이 두 디렉터리'만' (site.xml은 제외) 카피하여 eclipse가 깔린 디렉터리 바로 아래에 붙여넣기 한다. 이미 그 디렉터리 안에 features 디렉터리와 plugins 디렉터리가 있으므로, 파일들이 해당 디렉터리 아래로 옮겨질 것이다.
이렇게 한 다음에 eclipse를 다시 띄운다.
그런 다음 Window->Show View->MyLyn->Task Repositories를 선택하고 OK 버튼을 누른다. 그러면 화면 하단에 Task Repository들의 목록이 출력된다.
Trac과 연동하기 위해서는 이 목록의 한 항목으로 Trac Repository를 추가하여야 한다. Task Repository 창에서 마우스 오른쪽 버튼을 누르고 Add Task Repository...를 선택하면 다음과 같은 창이 뜬다.
여기서 Trac을 선택하고 Next > 를 누르면, 다음과 같은 창이 뜨는 것을 볼 수 있다.
여기서 Server에는 http://<호스트 주소>/... 로 표기되는 Trac Server URL을 끝까지 적어주면 된다. Label에는 아무 말이나 Repository 이름을 적어주면 되는데, 관계된 프로젝트 이름을 적어주면 좋다. 그 아래쪽에는 Trac Server에 접속하는 데 필요한 사용자 ID와 패스워드를 적어주면 되고, 나머지는 특별히 건드릴 일이 없을 것이다.
유의할 것은, Additional Settings에 보면 Trac 서버와 연동하는 방식으로 Automatic, XML-RPC plugin, Web의 세가지 중 하나를 선택할 있게 되어 있는데, 보통은 Automatic으로 두면 무방하지만 Trac Server에 XML-RPC 플러그인을 설치하지 않은 경우에는 Web 연동이 기본적으로 선택되리라는 점이다.
Web을 통해 Trac과 연동하게 되면 Trac의 기능을 Eclipse와 매끄럽게 연동하여 쓰는 것이 불가능해지므로 (궁금하면 한번 확인해보기 바란다. 거의 웹 브라우저를 한쪽에 따로 띄워놓고 Eclipse로는 코딩만 하는 것과 별반 차이가 없어진다) 가능하면 Trac 서버에 XML-RPC 플러그인을 설치하기 바란다.
이 이후에 해야 할 일들에 대해서는 http://dogfeet.tistory.com/7 여기에 대충 나와 있으니 역시 참고. 단 Europa DIscovery Site에 관계된 부분은 건너뛸 것. Subclipse 설치를 마친 다음에는 Team Synchronize view에 관계된 부분부터 읽어나갈 것. 그 다음 부터는 최근의 MyLyn + Trac 상황과 조금씩 차이가 있을 수 있으므로 (버전업 때문) 대충 감안해서 읽어나갈 것.
Java에서 MD5 hash를 하려면 MessageDigest 클래스를 이용합니다. MessageDigest 클래스에는 update 메소드가 있는데, 이 메소드를 호출할 때 마다 객체 내에 저장된 MD5 digest 값이 계속해서 갱신됩니다. 최종적으로 digest를 호출하면 그 값을 가져올 수 있습니다.
그렇기 때문에 digest를 계산하기 위해 미리 그 입력 값을 바이트 배열에 큼지막하게 잡아놓고 준비할 필요가 없습니다. 그 사실을 보여주는 테스트 코드를 잠시 보시면...
댓글을 달아 주세요