--;; 거의 3시간은 헤맨것 같다.

대환님의 도움으로 정말 황당하게 해결했다.
로컬에서는 RMI 서버가 없을 경우 RMI client가 연결을 시도할 때, timeout exception이 잘 나는데... 서버에서 내 컴으로 테스트를 하면, lookup하는 부분에서 먹통이 되어 버렸다.

이 부분 찾는건 역시 최고의 debug 방법인 stdout을 이용했다 --;;

알고 보니 원인은 windows xp에 설치된 방화벽!!!

왜 그런지 모르겠지만 방화벽에 대고 lookup을 하면 connection timeout exception이 발생하지 않았다.
혹시 아시는 분 알려주시면 ㄳ...

참고로... vm에 rmi 관련 timeout 시간을 다 짧게 주고 해도 동일했다.


예전에 nbinside에 올렸던 리뷰...

<<서버에서 할 작업>>
local에서 띄울 땐 -Dcom.sun.management.jmxremote 이 옵션만 추가하고 jconsole를 띄우면 해결되지만 서버의 경우 몇 가지 옵션 설정이 더 필요하다.

-Dcom.sun.management.jmxremote.port=1818
이 옵션은 아마 빼게되면 rmi기본 port인 1099를 이용하겠지만, 내 경우는 내부적으로 사용하고 있어 다른 port 지정

-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
일단 언능 해 보기 위해 두가지 인증 절차 안거치게 설정

ant를 이용할 경우
           <jvmarg value="-Dcom.sun.management.jmxremote" />
           <jvmarg value="-Dcom.sun.management.jmxremote.port=1818" />           
           <jvmarg value="-Dcom.sun.management.jmxremote.authenticate=false" />
           <jvmarg value="-Dcom.sun.management.jmxremote.ssl=false" />

<<로컬에서 할 작업>>

jconsole 띄우고 서버 주소와 port 번호만 넣고 connect하면 성공



참고 url : http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#no_security

'programming > Java' 카테고리의 다른 글

RMI 연결 시 timeout이 안나는 문제  (0) 2006.07.07
Java Puzzlers : 1. Oddity  (0) 2006.07.03
jstat - Java 가상 머신 통계 데이터 감시 툴  (0) 2006.06.30
Amazon에서 구입한 책...

한 권만 딸랑 사기엔 왠지 아쉬워 같이 구입한 책...
짧게 짧게 보기 너무 좋다. 편집도 잘 되어 있어 앞에서 퀴즈 읽고 뒤에 정답이 있는 형태...

가급적이면 매일 하나씩만 풀어보면 좋을거 같은데..
될라나? ㅋㅋ

일단 오늘 공부한 내용 정리해서 올렸다.
전체가 대략 90개 정도 되니까... 한달을 20일로 잡았을 때 5개월이면 다 보겠지??
올해안에 다 보면 성공일 듯~~

Java Puzzlers link

열심히 부지런히 살자~
아래 코드가 제대로 작동 할 것인가?

-- CODE start --
   public static boolean isOdd(int i){
       return i % 2 == 1;  
   }
-- CODE end --

조금 주의 깊게 생각해 보면 쉽게 알 수 있을지 모르겠지만 --''


이상 오늘 공부한 내용 끝~




출처 : Java Puzzlers
예전부터 많이 고민해 온 부분이다.

web이 발전하면 발전할 수록 사람들이 접할 수 있는 정보들은 많아지고... 몰라서 못하는게 아니고 어디 있는지 못찾아서 못하는 것이 되어 버리는 것 같다.

del.icio.us에서 특정 tag 북마크들을 구독하고,
bloglines에서 여러 블로그들을 구독하며,
gmail로 여러 사이트의 메일을 받아보고,
검색 엔진을 통해 여러 좋은 사이트들을 돌아보며 모아 놓은 자료들...

sql server에 관한 정보는 naver cafe에 모아놓고...
여러 프로그래밍 정보는 naver blog에 모아놓고,
북마크들은 del.icio.us에 모아 놓고...
볼만한 pdf나 소스들은 내 회사 컴에 모아놓고..

이제는 뭐가 어디 있는지 조차 헷갈릴 정도...
음...
gmail의 넉넉한 용량을 이용해 파일들을 메일로 보내 tagging해서 관리해 보기도 하고..
시도는 여러 가지로 많이 해 봤지만, 영 맘에 안든다.

이런 서비스를 만들어 보고 싶기도 하고, 좋은 서비스가 있으면 당장 사용하고 싶기도 하고...

어디서 본 좋은 내용, 파일, 웹 주소, 프로그램 소스코드, 이미지, 갑자기 생각난 아이디어...
이런 모든 것들을 한 곳에 모아두고 관리하고 싶은데...

뭐 좋은 방법이나 좋은 곳 없을까?

목차는 아래와 같다.
  * 개요
  * 설명
  * 가상 머신 식별자
  * 옵션
       - 일반적인 옵션
       - 출력 옵션
  * 예
  * 관련 항목

출력 header 들에 대한 설명도 같이 나와 있다.

출처 : http://pllab.kw.ac.kr/j2seapi/tooldocs/share/jstat.html#examples

브라질에서 현지 직원들을 따라 갔었던 레스토랑 소개 책자이다. 우리나라로 비교하면 vips 같은 곳인데, 다른 점이 있다면 종업원들이 돌아다니며 소의 부위별로 바베큐한 고기를 들고 다니며 조금씩 잘라 준다는 점이다.

가져다주는 고기가 도대체 어느 부위인지 전혀 몰라서 좀 당황스러웠었는데, 다행이 테이블마다 아래와 같은 종이가 놓여 있었다.


완전 따봉(브라질 말로 알고 있는데 맞나?)이다.

우리나라 정육점에나 가야 볼 수 있는 그림이다. 부위별로 번호가 매겨져 있어, 해당 번호를 말 하면 그 부위 고기를 가져다 준다.
그러나!!! 안창살, 토시, 등심, 안심... 한글로나 알지 그림을 봐도 어디가 어딘지 알 수가 있나 --;;
대충 먹었다. but, 고기 맛은 정말 너무너무 좋았다.
오죽하면 한국에 체인점을 하나 내고 싶은 생각도 들었으니...
그 당시(2005년)에는 미국 4개도시와 브라질에 두곳 뿐이었다.

참고로 붉은 글씨로 표시된 부위들이 인기 있는 부위라고 했던것 같다.

또 하나의 tip
테이블 위에는 아래와 같이 생긴 종이가 하나 있었다.


















대충 분위기로 짐작했겠지만...
왼쪽 녹색은 써 있는데로 고기를 계속 먹을 생각이 있으니 권해달라는 의미
오른쪽 붉은 색은 권하지 말아달라는 뜻.

말도 통하지 않는 상태니 정말 좋은 도구가 아닐 수 없었다.

브라질...
엄청나게 취약한 치안을 제외하고는 좋은 기억들이 많았다.
다음엔 꼭 리우데자네이루에 가 보고 싶다.

최악의 치안이지만 최고의 도시라는 칭찬이 있는 곳...

amazone link



Java 1.5에 추가된 concurrent package에 관련된 reference가 별로 없기도 하고, 아마존에서 책도 함 사보고 싶고 해서 겸사겸사 구입한 책.

첨부터 끝까지 다 본 원서는 한권도 없었는데, 이 책이 1호를 기록하길 바라며...
생각보다 재미있게 읽고 있다.

책 보면서 알게된 새로운 내용들도 잘 정리해 봐야겠다.

lucene에 (YYYYmmDDHHMMSS) 형태로 저장된 컬럼에 대해 sort를 했는데, 결과가 정확히 소트가 되지 않는 문제가 있었다.

 

 

sort를 할 때는 여러 가지 형태로 가능한데.. 가장 간단한 형태인

- searcher.search(new TermQuery(new Term("dataname", "1")), new Sort("regdt");

 

 

이 경우 Sort객체 안에서 대상 컬럼을 소트하기 전 적절한 형태로 type casting을 하게 되는데, 아무 옵션이 없을 경우 lucene은 먼저 int 그 다음 float으로 그 다음 String으로 casting을 해 보게 된다.

 

위와 같이 YYYYmmDDHHMMSS 형태의 데이터는 두번째 float로 casting이 되어 버리면서 문제가 발생하게 된다.

 

Float.parseFloat("20051004130501")=2.00510045E13
Float.parseFloat("20051006102501")=2.00510066E13
Float.parseFloat("20051005102501")=2.00510045E13

 

그래서 정렬이 제대로 안되는 문제가 있다. 이 문제를 해결 하려면 아래와 같이 SortField를 생성하면서 type을 정해줘야 한다.

Sort sort = new Sort(new SortField("regdt", SortField.STRING, true));
searcher.search(new TermQuery(new Term("dataname", "1")), sort);

 

SortField.Auto라는 것이 있는데, 이 값이 default이고 그렇게 하면 역시 Float로 casting 되어 버리니 반드시 SortField.STRING으로 고정해줘야 한다.

 

아래는 위에 설명된 부분의 실제 lucene 소스 코드이다. (ver 2.0)

 

try {
       Integer.parseInt(termtext);
       ret = getInts(reader, field);
} catch (NumberFormatException nfe1) {
       try {
             Float.parseFloat(termtext);
             ret = getFloats(reader, field);
        } catch (NumberFormatException nfe2) {
             ret = getStringIndex(reader, field);
        }
}

 

** 참고로 String은 Int나 Float에 비해 성능이 떨어진다고 한다.

 

참고 사이트 : http://mail-archives.apache.org/mod_mbox/lucene-java-dev/200511.mbox/%3c729868946.1132944655882.JavaMail.jira@ajax.apache.org%3e

'programming > Java' 카테고리의 다른 글

jstat - Java 가상 머신 통계 데이터 감시 툴  (0) 2006.06.30
linux signal 처리하는 방법  (0) 2006.05.27
Java web app monitoring for JAMON  (0) 2006.05.16

Jamon 사용법

 

Jamon이란
The Java Application Monitor (JAMon) is a free, simple, high performance, thread safe, Java API that allows developers to easily monitor production applications

http://jamonapi.sourceforge.net

 


web app 모니터링을 위한 초간단 사용법
1. JAMon.jar를 Tomcat root/Common/lib에 넣는다
2. 모니터링을 원하는 web application web.xml에 아래의 filter를 추가한다.

 <filter>
    <filter-name>JAMonFilter</filter-name>
    <filter-class>com.jamonapi.JAMonFilter</filter-class>
   </filter>

   <filter-mapping>
    <filter-name>JAMonFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

뭐 내용을 보면 알겠지만 url-pattern을 수정해서 원하는 요청만 모니터링할 수도 있겠지만..

3. JAMon.war를 web root에 복사하면 준비 끝
4. http://host:port/JAMon/JAMonAdmin.jsp 여기에 접속하면 아래와 같은 모니터링 결과가 나온다.

 

응용
기본적으로는 웹 요청시작부터 결과를 받은 시점까지의 시간이 계산되므로, 내부 로직들의 수행 시간을 구체적으로 알고 싶으면,
아래와 같은 코드를 추가하면 된다.
import com.jamonapi.*;
...
Monitor mon=MonitorFactory.start("myFirstMonitor");
...Code Being Timed...
mon.stop();

그러면 start안에 넘긴 parameter이름으로 monitoring 항목이 하나 더 생긴다.


* 주의 사항
JAMon webappr와 내 web app가 같은 JAMon.jar를 이용해야만 모니터링 결과를 JAMon webapp에서 확인할 수 있으므로,
내 web app에서 build path와 classpath에 tomcat/common/lib를 잡아줘야만 결과를 확인할 수 있다.
(첨에 내 web app에 별도의 jamon.jar를 import하고 테스트 했다가 결과가 안나와서 잠시 당황했었음 --;;)

 

 


 
 
 
위 그림에서 RMIQuery와 ToXml 이 부분이 코드상에 추가한 모니터링 결과 임
 
이상~

 

RMI Clinet를 만들어 Tomcat에서 돌리다가 아래와 같은 에러가 발생했다.

java.rmi.UnmarshallException: error unmarshalling arguments; nested exception is:
java.net.MalformedURLException: no protocol: Files/Apache.

RMI client와 Server 테스트는 잘 됐는데 왜 안될까
거의 3시간 삽질하다가.. 겨우 알았다 --;;


http://forum.java.sun.com/thread.jspa?threadID=367368&tstart=0
여기 보면 사람들이 달아 놓은 답변들이 있는데...

해결책
1. tomcat을 space를 포함하지 않는 경로에 설치한다.(JRE는 상관없을라나 --;;)
2. 문제가 되는 경로의 space를 %20으로 바꿔 아래와 같이 사용한다.
 * file://c:/program%20files/some/other/path


내 경우에는 내가 사용하는 특정 경로의 문제라기 보다 내부적으로 사용되는 경로에 문제가 있는것 같아서, 어디 한 군데를 찾아 바꿔서 될 일이 아닌거 같아 1번을 선택해야 할 듯
함 해보고 결과를 다시 적을 생각이다.

위 글에 보면 아래 링크에 버그 리포팅이 되었다고 한다.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4496398
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4273532

이상



* 테스트 후기 *

역시 tomcat만 다시 깔았는데 잘 된다 --;;

삽질한거 생각하면 좀 열받지만... 결국 원인을 찾아 해결을 해서 기분은 좋다

<< class not found 에러 >>

MyRemote service = new MyRemoteImpl();
Naming.rebind("RemoteHello", service);

* 위와 같은 코드를 통해 RMI서버를 등록하는 과정에서 class not found 에러가 나는 경우가 있는데, 이 이유는 rmiregistry를 실행하는 쪽에 classpath에 rmi server 관련 class들의 classpath가 지정되어 있지 않은 경우 발생하므로 rmiregistry를 실행하기 전에 아래와 같이 classpath를 추가해 준 후에 실행하면 된다.

D:>set classpath CLASSPATH=D:\jdk1.5.0_06;D:\Source\RMIServerTest\bin


 

<< 원격서버 객체를 RMI 등록부에 등록할 때 사용하는 이름>>

Naming.rebind("Remote Hello", service);
위와 같은 코드를 통해 등록하게 되는데, 어떤 책에는 이름에 위와 같이 공백이 들어간 경우가 있는데 그러면 에러가 나므로 공백은 삭제

 

 

<< clinet쪽에 필요한 파일 >>

client쪽에는 rmic를 통해 생성된 xxx_Stub.class 파일과 RMI서비스에 사용되는 interface 두개가 필요하다.

rmic HelloImpl

 

여러 책이나 문서에 나온데로 꼴랑 위와 같이 명령을 내릴 경우 target이 되는 class의 classpath가 잡히지 않아서

 

"Class HelloImpl not found."

 

위와 같은 오류가 날 수 있다.

 

classpath 변경없이 아래와 같은 명령으로 한방에 해결할 수 있다.

 

rmic -classpath . -d . HelloImpl

 

 

* package 명이 있는 경우

class파일이 있는 디렉토리 root에서

 

rmic -classpath . -d . rmiTest.HelloImpl

 

위와같이 package 명까지 다 적어준다.

 

 

delicious를 활용하는 모든(?) 방법들을 모아 놓은 사이트인것 같네요

http://www.econsultant.com/delicious-by-function/index.html

'IT' 카테고리의 다른 글

서비스형 위키  (0) 2006.10.09
ibatis에서 where문에 in을 사용하는 경우  (0) 2006.03.29
[MS-SQL to MySQL] 상위 5개를 rand하게 뽑는 쿼리  (6) 2006.03.15

예전에 해 보고, 다시 하려다 기억이 안나서 --;;

 

정말 이건 거지 같다고 생각함... 찾기 너무 어려움

 

        DateFormat sdFormat = new SimpleDateFormat("yyyyMMdd");
       
        String birthdayStr ="19790806";
        Date birthDay = sdFormat.parse(birthdayStr);

 

'programming > Java' 카테고리의 다른 글

rmic로 Stub와 Skeleton 생성 시 오류  (0) 2006.05.11
서블릿에서 한글 처리  (2) 2006.03.21
[펌] JDBC Driver load 하는 3가지 방법  (3) 2006.01.10

  <dynamic prepend="WHERE">
  <isNotEmpty prepend="AND" property="categoryCode">
   TC.categoryCode in (#categoryCode#)
  </isNotEmpty>    
  </dynamic>

 

그냥 이렇게 하면 될 줄 알았는데,

 

categoryCode가 001,002 이렇게 되면 "001,002" 로 검색을 하더군요.

 

이런 경우 <iterate>를 이용해야 한다.

아래와 같이

 

  <dynamic prepend="WHERE">
   <isGreaterThan prepend="AND" property="categoryLength" compareValue="0">
    TC.categoryCode
    <iterate prepend="IN" property="categorys" open="(" close=")" conjunction=",">
               #categorys[]#
          </iterate>    
   </isGreaterThan>
  </dynamic>

 

하면 해결 되더군요.

 

출처 : http://www.jabook.org/jabook/jbjsp01/10000_40000_70000__10000_40000_70000.html

 


>더보기


일단 그냥 상위 5개만 뽑는 것

 

MS-SQL에서는

SELECT TOP 5 * FROM tTag

 

mysql에서는

SELECT * FROM tTag Limit 5

 

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

Random하게 상위 5개를 뽑는 것

 

MS-SQL에서는

SELECT TOP 5 * FROM tTag ORDER BY RAND() (X)

SELECT TOP 5 * FROM tTag ORDER BY NEWID() (O)

- 쩝 확인해보지 않고 생각나는데로 올렸더니 틀렸네여 ㅋㅋ 

 

mysql에서는

SELECT * FROM tTag ORDER BY RAND() Limit 5

 

Limit 키워드가 뒤쪽으로 계속 밀리는게 재미있다.. 그거 몰라서 에러 났었는데.. 음...

 

SQL Server에서 tsql test framework입니다.

 

http://tsqlunit.sourceforge.net/index.html

 

일단 tdd에 대한 개념이 있어야 쉽게 사용 가능 할 것 같은데...

tdd에 대한 개념은 이곳(http://www.xper.org/wiki/xp/TestDrivenDevelopment?action=show&redirect=TDD)을 참고하세요

 

전 사용을 해 볼 상황이 안되는 관계로..

사용해 보신 분 후기 부탁드려요

음... 공짜로 웹 호스팅을 제공하는 곳이 있네요..

 

사이트 주소는 http://www.aspspider.net/Index.aspx

 

제공되는 기능은 아래와 같다고 써 있네요

 

Web hosting package
For ASP.NET programmers

  • $0.00 monthly fee.
  • No advertisements in your site.
  • SQL Server Express support.
  • MS Access support.
  • Up to 100 MB disk space.
  • 2 GB monthly data transfer.
  • Your own domain name.
  •  

     

    사용해 보신 분 사용 후기 부탁드려요

    MySQL에는 MS SQL 처럼 DB 설계에 사용할 수 있는 기본 도구가 제공되지 않는다.

    최근에 추가된 MySQL Administator, MySQL Query Broswer에도 그런 기능은 없다.
    opensource 진영에서 제공하는 툴 중에 DBDesigner 4라는 넘을 많이 사용한다고 하던데,
    설치해 놓고 이것 저것 해 보는 데...

    MySQL에 연결이 안되는 문제가 있었다.


    그래서 http://www.fabforce.net/dbdesigner4/faq.php
    여기서 찾아보니, mysql 4와의 연결에 문제가 있으면 odbc를 사용하라는 말을 발견하고 문제를 해결했음.

     

    'programming > MySQL' 카테고리의 다른 글

    java, mysql stored procedure 호출  (0) 2006.09.22
    DECLARE @var1 int  (5) 2006.01.20
    MySQL 5.0 Standards Compliance  (5) 2006.01.16

    ... 쩝... MySQL을 계속 다뤄왔던 사람들이라면 다 알고 있는 내용이겠지만...

     

    MS-SQL을 계속 사용하다가 이번에 MySQL로 간단하게 뭘 좀 해 보려고 5.0을 설치해서 이것 저것 해 보고 있다.

     

    MS-SQL을 사용하는 사람이라면 당연히 자주 사용하게 되는 저장 프로시저가 MySQL의 경우 5.0에 새로 추가가 됐다.

    책을 하나 사서 보려 해도 5.0책은 없어서 걍 MySQL 도움말 보며 이것 저것 하다가...

     

    제목에 있는 저 문장 때문에 20분 정도는 해맸다..

    MS-SQL에서 저장 프로시저를 만들때, 일반적으로 쿼리 분석기에서 저장 프로시저의 내용들을 만들어 실행해 보고 문제가 없으면 CREATE PROCEDURE... 를 추가해서 저장 프로시저를 만든다.

     

    MySQL에서도 비슷하게 하려고.. 다 만들었는데 온통 문법에러 투성 --;;

    도움말에는 예제도 많지 않고...

     

    회사에도 5.0은 쓰지 않아 특별히 물어볼 사람도 없고...

    하나씩 찾다보니 맨 위의

    이 문장에서 오류가 났다..

     

    DECLARE @var1 int;

     

    도대체 이해가 되질 않았다.

    메뉴얼에도..

     

    DECLARE var_name[,...] type [DEFAULT value]

    이렇게 나와 있는데.. 도대체 틀린게 뭘까??

     

    한참 해매다가 메뉴얼을 제대로 읽어보고 허탈했다..

     

    DECLARE may be used only inside a BEGIN ... END compound statement and must be at its start, before any other statements.

     

    반드시 BEGIN과 END 사이에 기술해야 한다 --;;

    쩝... 저 한 줄만 미리 읽어봤더라도...

     

    이번 일로 여러 가지를 느꼈다.

     

    - 고정 관념을 깨자

    - 메뉴얼이 아무리 영어라도 제대로 읽자

     

    ^^''

     

    매일 매일 안하던거만 하니까 좀 막연하기도 하지만 재미있네요..

     

    'programming > MySQL' 카테고리의 다른 글

    java, mysql stored procedure 호출  (0) 2006.09.22
    DBDesigner 4와 MySQL 4.1의 연결  (2) 2006.01.25
    MySQL 5.0 Standards Compliance  (5) 2006.01.16

    ** ruby : array의 요소들을 random하게 섞는 방법

    ar = (1..10).to_a

    ar = ar.sort_by { rand }

     

    puts ar.inspect  #확인

     

     

    ** array의 index, value를 동시에 접근하면서 loop 도는 방법

    ar = (1..10).to_a

    ar.each_with_index {|x, y| puts x, y}

     

     

    MySQL 5.0 Manual 중에

    - What's New in MySQL 5.0

    - MySQL 5.0 Standards Compliance

     

    이 두 부분을 정리한 내용이다.

     

    MySQL을 한 번도 접해보지 않아서 공부하는 샘치고 보면서 정리한 내용


    >더보기


    'programming > MySQL' 카테고리의 다른 글

    java, mysql stored procedure 호출  (0) 2006.09.22
    DBDesigner 4와 MySQL 4.1의 연결  (2) 2006.01.25
    DECLARE @var1 int  (5) 2006.01.20

    쩝...

    정규식을 이용해서 html 소스에서 iframe들의 src 값들을 얻어오려고 Regexp Object를 가지고 이것 저것 해 봤으나... Regexp.match를 사용하면 match값이 하나밖에 안나와서 한참 해매다가...

     

    현승님의 도움으로 String.scan 을 통해서 해야 한다는 것을 알았다 --;;

     

    require 'net/http'

    h = Net::HTTP.new('www.keb.co.kr', 80)
    resp, data = h.get('/IBS/fx/rate/notice/current/current.jsp', nil )
    puts data.scan(/<iframe.+src="(.+)".+<\/iframe>/)

    위 예제는

    외환은행 환율 보여주는 페이지 소스에서 iframe 테그 안의 src 값만을 가져오는 방법.

     

    소스 정말 짧다 ^^''

     

    출처 : http://struts.linuxstudy.pe.kr/


    >더보기


    'programming > Java' 카테고리의 다른 글

    서블릿에서 한글 처리  (2) 2006.03.21
    [펌] Microsoft JDBC 시작하기  (0) 2004.06.04
    [펌] JAVA 성능 향상 팁.  (0) 2004.05.28

    + Recent posts