Java에서 외부 프로그램을 실행하기 위해서는 그동안 Runtime.exec를 많이 사용해 왔다.

간단한 프로그램이나 script를 실행하는 데는 큰 무리가 없다. 본인도 유용하게 사용하고 있는 모듈이기도 하다.

 

그런데, Eclipse 플러그인에서 Runtime.exec를 사용하게 되면, (대부분)호출된 프로그램이 종료될때까지, eclipse를 사용할 수 없게 된다.

특히, 호출된 프로그램이 UI를 가진 프로그램이라면 당연히!!! 왜냐하면, 호출된 프로그램도 Eclipse JVM과 같은 Process 내에서 돌기 때문이다.

호출된 프로그램(특히 UI를 가진)이 끝날때까지, waitFor()를 실행시켜주지 않으면, UI 프로그램은 제대로 동작하지 않는다.

 

모 프로젝트에서 eclipse 플러그인 실행 중에, WinMerge 툴을 실행 시켜, Text를 비교하는 프로그램을 짜고 있었는데,

Runtime.exec를 사용한 경우, WinMerge가 실행되는 것 까지는 좋았으나, WinMerge를 실행시키고 나면, 정작 eclipse를 사용할 수 없어서,

WinMerge에서 Text를 Copy해서 Eclipse에 Paste하기가 쉽지 않았다.

 

여러가지 방법을 모색하던 중, Eclipse의 Java Launcher 또는 외부 실행 도구를 프로그램 적으로 호출하면 되지 않을까 생각하고 seach를 하던 중,

다음의 아주 좋은 article를 발견하여, 유용하게 활용했다.. Good!!!

 

Eclipse에서 WinMerge도 실행시키고, 둘다 서로 개별의 Process를 가질 수 있으니, 원활한 작업이 가능하게 된 것이다.

 

http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.user/concepts/concepts-exttools.htm

 

이중에서, "외부 도구 실행"을 위해 사용한 코드는..

            ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
            ILaunchConfigurationType type = manager.getLaunchConfigurationType(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.ID_PROGRAM_LAUNCH_CONFIGURATION_TYPE);
            ILaunchConfiguration[] configurations = manager.getLaunchConfigurations(type);

            for (int i = 0; i < configurations.length; i++) {
                ILaunchConfiguration configuration = configurations[i];
                if (configuration.getName().equals("Run Diff Tool")) {
                    configuration.delete();
                    break;
                }
            }
            ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(    null, "Run Diff Tool");
           
            workingCopy.setAttribute(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.ATTR_LOCATION, winMergeExe);
            workingCopy.setAttribute(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.ATTR_TOOL_ARGUMENTS, modelPath + " " + codePath);
            workingCopy.setAttribute(org.eclipse.ui.externaltools.internal.model.IExternalToolConstants.ATTR_WORKING_DIRECTORY, workDir);
           
            ILaunchConfiguration configuration = workingCopy.doSave();
            DebugUITools.launch(configuration, ILaunchManager.RUN_MODE);

 

의외로 코드는 간단하다.

1) LauncherManager인스턴스를 얻은 후, LaunchConfiguration 종류를 선택(IExternalToolConstants.ID_PROGRAM_LAUNCH_CONFIGURATION_TYPE)

2) 기존의 같은 이름으로 Launch configuration이 있다면 삭제하고(필요한 경우만), Launch Configuration 인스턴스를 생성한다.

3) 필요한 인수를 지정한다. 프로그램명(IExternalToolConstants.ATTR_LOCATION), 파라미터(IExternalToolConstants.ATTR_TOOL_ARGUMENTS) 등

4) Launch Configuration을 저장하고, 실행한다.

 

왓.. 정말 간단하다.

 

이를 Plugin에서 사용하자면, Dependency에 org.eclipse.debug.core, org.eclipse.debug.ui 등을 선언해야 하고,

"자바 어플리케이션 실행"을 사용하려면, 추가적으로 org.eclipse.jdt.launching 등을 선언해 줘야 한다.

 

 

Plugin Dependency에

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

 

Pluglet 프로젝트는 코딩 환경으로 보면, 거의 Java Project와 동일하게 느껴진다.

그래서, 외부 Jar(JDBC Driver등)를 사용할 때, Java Build 경로의 Library탭에만 JAR를 추가해 주면 컴파일 까지는 여느 Java프로젝트처럼 잘 된다.

하지만, 실행을 할라치면 (internal tools로), 클래스를 못 찾는 다는 에러를 보게된다.

 제일 좋은 방법은, 외부 jar를 plugin으로 만들어서, Pluglet 프로젝트에서 runtime에 plugin을 참조하게 하면 된다.

먼저 RSA70에서 신규 프로젝트 만들기에서 "Plug-in from existing JAR archive"를 선택하고, 포함될 JAR를 선택하여,

플러그인을 만든다.

그런다음 기존의 pluglet 프로젝트에 pluglet.xml에서 다음을 추가한다.

<import plugin="[방금 만든 Plugin ID]"/>
그런 다음 실행해 보자..
 
잘되지 않을까?

혹시나 해서 덧붙이자면, 당연히 코딩할 때는 Build Path에 해당 Jar를 따로 넣어줘야 한다.

pluglet.xml은 runtime에 대한 세팅과도 같은 것이니까...

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

요즘 Junior 동료들과 같이 일주일에 두번 스터디를 진행한다.

진행하면서, Java 기본에 관한 Quiz를 던지곤 하는데, 그러면서, 다시 옛날 기억을 더듬는 기회가 되곤 한다.

 

오랜만에 다시 Pass by Value 냐 Pass by Referece냐라는 질문에..

 

언제나 처럼.. Java는 "Reference를 Pass by Value로 던진다"라고 말한다.

 

참조 URL : http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

요사이 소스를 파싱하여, Meta 정보를 추려내는 기능에 대해 고민하고 있다.

 

자바 Bytecode를 분석하는 것은 ASM등의 라이브러리를 활용하면 되지만, 소스를 파싱하는 것은 그리 쉽지 않았다.

Queue, Stack 써가면서 , 노가다를 쓰면서 소스에서 Field 정보(사이즈, type, padding 등을 파싱하고 있다.)

 

그러던중, split 함수의 유용함을 알게되었다.

함수 이름만 봐서는 단순히 split만 하는 함수인 줄 알았는데, 정규식을 사용할 수 있었던 것이다.

 

문자 파싱에 있어서는 정규식 만한 것이 또 없지 않은가..

 

사실 정규식을 쓰는 것이 아니더라도, 이제까지 substring과 indexOf를 주로 사용해 왔던 나에게는 split이 참 유용하게 활용될 수 있었다.

예를 들어,

다음의 소스에서, 필드명(NextKey)을 추출한다고 생각해 보자.

        String test9 = "byteValue = FormatUtil.getNull(searchIcCardByCunoListRp.getNextKey()).getBytes();";

아래와 같이 간단히 split 두번이면 끝...
        System.out.print( test9.split(".get")[2].trim().split("\\(")[0] );

첫번째 split(".get")은 ".get"이라는 문자열 기준으로 원본 String을 쪼개서 배열를 반환한다.

  즉 [0]=byteValue = FormatUtil, [1]=Null(searchIcCardByCunoListRp, [2]=NextKey()), [3]=Bytes();

세번째 배열값을 받아 다시 split("\\(")을 해주면, NextKey 와 )) 로 나누어 준다.

 

뭐.. 당연하다고 생각할 수도 있으나, 해본 사람은 안다... ^^

 

그리고, 여기다가 정규식들을 써서 파싱한다면, 더욱 금상첨화....

 

예를 들어

다음과 같은 문자열에서, 숫자만 하나 뽑으면 이것이 위에서 찾아낸 Field 의 사이즈가 된다면,

        String test10 = "byteBuffer = FormatUtil.strToByte(byteBuffer, byteValue, 15 - byteValue.length , \"L\",\" \");";
다음과 같이 찾을 수 있다.
        Pattern p = Pattern.compile("(\\d+)");
        Matcher m = p.matcher(test10);
        System.out.println(m.find()? m.group() : 0);

결과는 15 이 된다.

 

그리고, "L"이 정렬에 대한 정보라면, 정규식 보다는 그냥 split을 쓰면

System.out.print( test10.split("\\\"")[1].trim() );

 

또한, " "이 padding 값이 된다면,

System.out.print( test10.split("\\\"")[3].trim() );

 

참조할 만한 링크는 http://www.tutorialspoint.com/java/java_regular_expressions.htm

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

[BCI] 관련 자료

2010/03/04 15:33

요즘 두가지 이유 때문에 ASM을 보고 있다.

하나는 모델과 소스(바이너리)의 비교 검증 기능 개발을 위해서,

또 하나는 APM 솔루션 개발을 위해서, 모니터링용 코드를 기존 어플리케이션에 쉽게 심는 방법을 찾기 위해서..

 

사실 첫번째 이유로의 ASM은 오래전부터 봐왔던 바이지만, 두번째는 좀 생소 하기는 하지만, 한번에 두마리 토끼를 잡는 다는 셈치고 열공 및 개발 중이다.

 

관련 자료/링크를 쭈욱 나열해 놓고, 나중에 한번에 정리해 보자.

 

 

The Power of Byte Code Instrumentation in Java 시리즈(From 욱짜의 Oracle 블로그) : http://ukja.tistory.com/17

 

ASM 홈페이지 http://asm.ow2.org/

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

다음을 참고해 보자.

 

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/tjmx_extend.html

 

시작/중지 = launchProcess/stopProcess

 

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

WAS의 자원에 접속하기 위해서는 JNDI를 사용하게 된다.

그런데, 그 JNDI를 통한 lookup을 하기 위해서는 해당하는 Provider의 Context Factory를 가져와야 한다.

이때, 사용하게 되는 접속 방식에는 두가지가 있다,

 

CORBA 객체 URL 방식 vs IIOP URL

http://publib.boulder.ibm.com/infocenter/wasinfo/v5r0/index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/rnam_example_prop2.html

 

요약하자면, COBRA 객체 URL방식(J2EE 1.3이후 지원, cobarloc)은 복수 서버에 대한 주소 리스트를 사용하여, Fail Over방식으로 접속을 할 수 있는 반면,

기존의 iiop방식은 지정한 단일 서버에 대해서만 접속이 가능하다.(그런데, WebSphere 6.1 환경에서 테스트한 결과 iiop의 경우도 fail over가 되는 것을 보이긴 했다.)

또한, corbaloc url 방식의 경우에는 Cluster로 묶인 서버만 지원(권장, 다른 경우는 장담할 수 없다는)한다는 제한이 있기는 하다.

 

여기서 잠깐, URL 방식이 CORBA 객체 냐 기존 iiop냐로 나뉘긴 하지만, 실제 통신은 둘다 IIOP 프로토콜을 이용하는 것은 변함이 없다.

 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

wsadmin.sh 을 이용하여 아래와 같이 명령을 날리면, MBean 리스트를 받아 볼 수 있다.

 

mbean.jython

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

apps = AdminControl.queryMBeans('NEFSS/SystemLibrary:type=SharedTable,*',None)
appArray = apps.toArray()

for app1 in appArray:
print app1.getObjectName().toString()

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

 

DMGR 서버에 붙어서, 전체 Application Server에 대해서 Query를 날리려면
/app/was/WebSphere/AppServer/bin/wsadmin.sh -username XXX -password XXXX -lang jython -f mbean.jython

 

특정, Application Server Instance에 붙어서 Query를 날리려면

/app/was/WebSphere/AppServer/bin/wsadmin.sh -host XXX -port XXXX -username XXX -password XXXX -lang jython -f mbean.jython

(여기서 포트는 SOAP 포트가 된다.)

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

1. java.sql.SQLException: XXXXXX Connection authorization failure occurred. Reason: Security mechanism not supported. ERRORCODE=-4214, SQLSTATE=28000DSRA0010E: SQL State = 28000, Error Code = -4,214

 

이런 오류가 나온다면, ID/PW를 의심해 보자, 특히, ID를 새로 만들었을 경우, 초기 한번은 TSO 등으로 로그인해서, 새로운 패스워드로 바꾸라는 메시지가 뜨지는 않는지 확인해 본다.

 

2. Error : DB2 SQL Error: SQLCODE=-805, SQLSTATE=51002, SQLERRMC=XXX.NULLID.SYSLN300.5359534C564C3031;DISTSERV;04, DRIVER=3.50.152

이런 오류가 나온다면,  다음의 명령을 실행하여, jdbc용으로 Bind를 해 줘야 한다.

    java com.ibm.db2.jcc.DB2Binder -url jdbc:db2://XX.XX.XX.XX:446/XXX -user userid -password passw0rd

    실행결과

    Package "XXXXX": Bind succeeded
    Package "YYYYY": Bind succeeded
    .....
    Package "ZZZZZ": Bind succeeded
    DB2Binder finished.

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스

 RRC서버가 깔린 리눅스에 워낙 CLOSE_WAIT가 많이 걸리고,

해제되지 않아 여기 저기 찾다가 발견한 사이트

 

http://tunelinux.pe.kr/bbs/read.php?table=linuxinfo&no=76

 

sysctl 명령어를 이용하란다~~

혹시, 링크가 깨질까봐, 원문을 copy해둔다.

 

## 질문
xxx 작성:

안녕하세요.전번에 netlog에 대한 답변들은 고마웠습니다.
요즘 SYN attack에 대한 생각을 정리중인데,도움을 좀 청할까 해서요..
리눅스나 원도우에서 SYN이 들어오면은최대 접속 SYN 갯수가 있을 것이고,
3상태 연결이 안되었을때, 연결이 취소될때까지의 시간이 있을건데,
이것은 리눅스 상에서 설정을 어디를 보면 되는지.좀 아시는 분 가르켜 주세
요.
그리고, window NT나 유닉스는 기본적인 값이 얼마인지궁금합니다.
아시는 뿐들은 꼭 좀 답변 올려주세요.


## 답변
Linux에서 IP Stack을 관리하는 명령어는 sysctl입니다.
사용법은 간단합니다.
usage:  sysctl -w variable=value ...  ; 설정
            sysctl -a                          ; 조회

timeout관련 정보는 grep으로 찾아보시기를 바랍니다.

그리고, Tuning과 관련하여 몇가지 정보를 추가하면(kernel 2.2기준)

- SYN attack 관련
  sysctl -w net.ipv4.tcp_max_syn_backlog=1280 ; socket queue 증가
  sysctl -w net.ipv4.tcp_syn_cookies=1             ; enable

- Routing table 변경
  sysctl -w net.ipv4.conf.all.send_redirects=0      ; disable
  sysctl -w net.ipv4.conf.all.accept_redirects=0

- Source Routing 관련
  sysctl -w net.ipv4.conf.all.accept_source_route=0  ; source route 패킷
드롭
  sysctl -w net.ipv4.conf.all.forwarding=0                 ; forwarding
disable
  sysctl -w net.ipv4.conf.all.mc_forwarding=0

- Timewait 값 조절 (DDOS 관련)
  sysctl -w net.ipv4.vs.timeout_timewait=60       ; 60초 이하로 설정 권


- Broadcast ECHO Response (smurf Attack 관련)
  sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1    ; 응답안함

등이 있습니다. 이외에 추가적으로 확인해 보시기 바랍니다.

자료참조: Rob Thomas, 이강석 "Unix IP Stack Tunig Guide"-센터내부자료 참
조.

.FIN.
 

## 추가답변
안녕하십니까?

저는 xxxxx의 홍석범입니다.


아래 메일로 말씀하신 부분에 조금만 추가를 하면....


1. 최대 접속 SYN 갯수에 대해

시스템에서 수용할 수 있는 최대 접속  SYN 패킷의 개수는 backlog queue 와
관련이 있습니다. 즉 backlog_queue 를 크게 늘렸을 경우에는 그만큼 많은
SYN 패킷을 수용할 수 있는 것이지요...

리눅스뿐만이 아니라 대부분의 시스템에는 이 값(kb 단위) 이 매우 낮게 설정
되어 있는데,
적절히 재설정하실 필요가 있습니다.
(현재 설정치는 sysctl -A|grep backlog로 확인해 보세요..)
일반적으로는 RAM 이 128M 이상일 경우 1024를 설정하면 되고
이하일 경우에는 128 을 설정하는데, 리누스의 부하가 많이 걸릴 경우에는
이 값을 적절히 늘려주면 됩니다.
그런데, 이 값을 무한정 늘릴 수 있는 것은 아니고 값이 1024 이상일 경우에

include/net/tcp.h 를 수정하여야 한다고 알고 있습니다..
그리고 경험적으로 이 값을 너무 크게 설정하였을 경우에는 syncookie 가
잘 적용되지 않는 것으로 알고 있습니다.
(그러니 syncookie 설정을 하였을 경우에는 backlog queue 를 그리 크게
하실 필요는 없습니다.)
아울러 말씀하신 자료에는

sysctl -w net.ipv4.tcp_syn_cookies=1  로 되어 있는데
sysctl -w net.ipv4.tcp_syncookies=1 이 맞습니다..
 


2. 연결이 취소될때까지의 시간에 대해

이 설정은  
sysctl -w net.ipv4.vs.timeout_synrecv=10    와
관련이 있는것 같습니다.
(syn 패킷을 받은후 half open 상태 대기는 10초정도가 적당합니다.)
이 설정을 하시려면 바로 이용하실 수는 없고 커널 패치를 하셔야 합니다.
vs 라는 것은 Virtual Server 의 뜻으로 말 그대로 clustering 등을
구성할 때 필요한 커널 패치입니다.
이는 http://linuxvirtualserver.org/ 에서 패치하시면
됩니다.
그런데, 제가 테스트해보기로는 이 설정이 그대로 잘 적용은 되지 않더군
요,..,.
(이외 vs 커널 패치를 하면 drop_entry, drop_packet 등 다른 몇가지 정책을
추가로
   설정할 수 있습니다.)




3. NT 등 Windows 계열의 SYN_Attack 에 대해

NT에서는 Registry값을 수정함으로써 튜닝이 가능합니다.
이 값에 대한 튜닝은 microsoft 의 technical page 나
http://packetstorm.securify.com/groups/rhino9/synflood.doc
참고하시기 바랍니다.



4. 그러나, 가장 확실한 방법은.....
제가 보기에는 서버 level 에서의 튜닝은 단지 공격을 감소시킬 수 있을뿐
근본적인 대책은 아닙니다.
이를 위해 라우터 level 에서 차단하는 것이 권장할만한 방법인데,
제가 테스트해 보기로는 몇가지 방법이 있더군요....
이 방법은 시간이 되는대로 정리를 해 보도록 하겠습니다.
 
 

이 글은 스프링노트에서 작성되었습니다.

Posted by 아프락사스
<< PREV : [1] : [2] : [3] : [4] : [5] : ... [16] : NEXT >>

BLOG main image

공지사항

카테고리

분류 전체보기 (159)
Architect이야기 (1)
Rational Products (94)
Patterns (0)
JEE Technologies (3)
Methodology (0)
Apache Project (0)
Open Project (4)
Knowhow (56)
Etc (0)