oracle.java.com 가면 OSX용 JDK 1.6버젼대를 찾을 수 없는데,

JDK6은 아래 apple 사이트에서 받을 수 있네요.

https://developer.apple.com/downloads/index.action


그리고 dmg 패키지로 jdk를 설치하면


/Library/Java/JavaVirtualMachines


아래 경로에 설치가 됩니다.


XML관련 처리 로직에서 아래와 같은 에러가 났다.

java.lang.NoSuchMethodError: org.w3c.dom.Element.getTextContent()Ljava/lang/String;
    keron.client.xmlutil.SimpleDomBuilder.w3cElemenetToSimpleElement(SimpleDomBuilder.java:43)
    keron.client.xmlutil.SimpleDomBuilder.createSimpleDocument(SimpleDomBuilder.java:32)
    keron.client.xmlutil.SimpleDomBuilder.createSimpleDocument(SimpleDomBuilder.java:19)

대략 sun에서 정의해 놓은 interface를 구현한 외부 구현체를 이용해서 사용하는데, 같은 소스를 독립 app로 돌리면 문제가 없는데, tomcat위에서 돌리면 위와 같은 에러가 난다.
그렇다고 모든 tomcat위에서 예외가 발생하는 것은 아니다.

아마도 그 위에 돌아가는 web app와 관련된 어떤 문제려니... 추측만 무성하다. 회사 동료와 같이 살펴봤는데, 정확한 원인을 못 찾았다.

결국 구글신의 도움으로
http://www.velocityreviews.com/forums/t144510-problems-with-jboss-an-xerces.html
위 사이트에서 다음과 같은 도움을 받았다.

element.getTextContent() // 이 부분 대신

Text contents = (Text) element.getFirstChild();
result.setValue(contents.getNodeValue());

이렇게 변경해서 해결했다. 시간이 없어 정확히 찾아보진 않았지만, 혹시 같은 문제로 고생하는 분 도움이 되시길..

실제 이런 문제를 겪는 경우도 그리 흔치 않고, 아주 가끔 발생한다면 알아 채기도 힘들다.
그래서 그런지 해결책에 대한 논의를 많이 보지도 못했다.

추후 reference 용도로 링크를 하나 달고, 페이지가 삭제될 위험(?)에 대비해 내용을 파일로 저장해 둔다.


관련 글
- A Collection of JVM Options


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




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

Java에서 XML관련 예외  (2) 2007.01.30
Lucene 검색 시 and Query와 Filter의 차이점  (2) 2006.09.29
lucene의 Highlighter를 한글에 적용...  (2) 2006.09.12

Lucene 검색을 할 때,

특정 조건을 AND로 추가해서 Query할 수도 있고,
특정 조건을 Filter로 추가해서 Query할 수도 있다.

총 검색되는 갯수는 같지만, 간단하지만 보이지 않는 차이를 정리해 보면...
* AND로 검색을 하면 score에 해당 내용이 반영이 되어 정확도로 정렬할 경우 해당 내용이 반영된다.
* AND로 검색을 하면 별로도 추가로 검색을 하는 것이므로, 부하가 있는 쿼리의 경우는 AND조건 검색보다 Filter로 걸러내는 것이 속도가 빠르다. (검색된 것들 중에서 filtering을 하는 것이니 당연히 빠르겠죠? 전체 인덱스의 크기가 크면 클 수록 and query를 이용한 것 보다 훨씬 빠를테니까요.)

조금 더 자세히 몇 가지를 설명하자면...
Lucene in Action과 현재 licene 2.0 버젼이 filter 부분이 차이가 좀 있는데
DateFilter라는건 없어졌다.

그리고 내 경우는 기존에 사용하던 Filter도 있어서...
추가로 한가지 Filter를 추가한 case라서..

ChainedFilter에 두가지 filter를 추가해서 생성해서 사용했다.
참고 : http://lucene.apache.org/java/docs/api/index.html

Lucene에서는 numeric 범위 연산을 제공하지 않아, 숫자에 대해 범위 연산을 할 경우, 사용하는 자리수 많은 부족한 부분에 0을 채워줘야 한다.

간단하게 예를 들어 0~999까지의 숫자를 range검색하려면... 인덱싱할 때
1 -> 001
42 -> 042
999 -> 999

이렇게 인덱싱을 하고 검색할 때도 "032 TO 311" 이렇게 검색해 줘야만 제대로 검색이 가능하다.
그러므로 속도가 많이 느리다.

아래 출처에 보면, 음수를 포함하는 범위 검색을 하는 방법도 나와 있으니 필요한 분은 참고 하시길...

출처 : http://wiki.apache.org/jakarta-lucene/SearchNumericalFields

출처의 내용은 첨부 파일로 올려 놓는다.


SearchNumericalFields - Jakarta-lucene Wiki.mht



mysql에 stored procedure 만들기
delimiter //        

CREATE PROCEDURE getServerId(ip VARCHAR(15), OUT serverId tinyint)
BEGIN
SELECT id INTO serverId FROM tServer WHERE serverIp = ip;
END;
//

delimiter ;

- mysql에서는 ;가 command의 종료를 의미하는데 stored procedure의 경우 여러 query의 조합이라 중간에 ;가 들어갈 수 있는데, 그러면 문법 오류로 간주되므로 delimiter를 임시로 다른 걸로 바꾼 후 sp를 만들고 다시 예전 delimiter로 변경하는 것임.


java에서 call하는 코드
try {
   String CLASS_NAME = "com.mysql.jdbc.Driver";
   String DB_URL = "jdbc:mysql://localhost:3306/test";
   String USR = "id";
   String PASSWD = "pw";
  
   Class.forName(CLASS_NAME);
   Connection con = DriverManager.getConnection(DB_URL, USR, PASSWD);
             
   CallableStatement stat = conn.prepareCall("call getServerId(?, ?)");
   stat.setString(1, "127.0.0.1");
   stat.registerOutParameter(2, Types.TINYINT);
   stat.execute();
          
   System.out.println(stat.getByte(2));
} catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
} catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}

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

mysql에서 stored procedure 만들면서 주의 할 것  (2) 2006.09.22
DBDesigner 4와 MySQL 4.1의 연결  (2) 2006.01.25
DECLARE @var1 int  (5) 2006.01.20
검색 결과에서 검색어를 highlight 시키는 기능을 구현하는데, lucene의 sandbox의 Highlighter를 이용해 봤다.


샘플 소스와 동일하게하고 analyzer만 CJKAnalyzer로 변경했는데... 결과는

"학교에서 우리 선생님께서 나에게 좋은 대학교를 골라 주셨다."에서 "학교"를 검색했다고 가정하면

변환한 결과는 아래와 같이 나온다.
"<B>학교에서</B> 우리 선생님께서 나에게 좋은 <B>대학교를</B> 골라 주셨다"

검색한 단어만이 아닌 조사까지 포함해서 처리가 된다.
혹시 단어만 하일라이팅 시키는 방법을 알고 계신분 있으신가요???


드디어 Dell의 새 모니터와 새 시스템을 받아 기분 좋게 시스템 세팅 중에...
새로 3.2를 설치하고 테스트 하는데 ant build시 제목 표시줄과 같은 에러가 발생

원인은 eclipse 내에 ANT_HOME path가 잘못 걸려 있어서 발생했던 것.

'Window->Preferences->Ant->Runtime' 여기서 ANT_HOME 버튼 눌러 맞는 위치로 설정해 주면 해결~

참고 : http://www.herrodius.com/blog/?p=42

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

[갱신]lucene의 검색 값 escape  (0) 2006.09.11
java Date 관련 Quick reference  (0) 2006.07.27
Hibernate Quick Reference  (0) 2006.07.27

* 오늘 날짜 구하기
- new Date();
- Calendar now = Calendar.getInstance();
  now.getTime();

* 어제 날짜 구하기
  Calendar now = Calendar.getInstance();
  now.add(Calendar.DAY_OF_MONTH, -1);
  now.getTime();

* 날짜 포맷을 원하는 형태로 바꾸기
       Calendar now = Calendar.getInstance();
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      sdf.format(now.getTime());    // 결과는 String

* 지 맘데로의 날짜를 담은 문자열을 다른 형태로 convert

        String dateStr = "200707211541122";
        SimpleDateFormat oldFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       
        try {
            System.out.println(newFormat.format(oldFormat.parse(dateStr)));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

* yyyy-MMM-dd 형태 parse 시 주의 할 점
      String regDt = "27/Jul/2006:00:00:00";
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MMM/dd:hh:mm:ss",
               Locale.US);

       try {
           System.out.println(sdf.parse(regDt).toString());
       } catch (ParseException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

-> 위와 같이 Locale을 지정하지 않으면 한글 OS에서는 parse 오류가 난다.

* 특정날짜가 무슨 요일인지 알아보기
       String regDt1 = "2006-11-14";
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.US);

       Calendar cal = Calendar.getInstance();

       try {
           cal.setTime(sdf.parse(regDt1));
           System.out.println(cal.get(Calendar.DAY_OF_WEEK));
       } catch (ParseException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

주의: cal.DAY_OF_WEEK라고 하면 처음 생성했던 instance의 값을 리턴한다.

 * 날짜 간의 비교
   
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Calendar now = Calendar.getInstance();
        now.add(Calendar.HOUR, -3);
        Date before3hour = now.getTime();
       
        try {
            if (before3hour.before(sdf.parse(regdttm))) {
                return true;
            } else {
                return false;
            }
        } catch (ParseException e) {
            return false;
        }
Hibernate 사용하기

1. 객체를 이용하여 저장하는 방법
           Transaction tx = session.beginTransaction();
           Cafe cafe = new Cafe();
           cafe = new Cafe();
           cafe.setId(Id);
           cafe.setName(name);
           session.save(cafe);
           tx.commit();


2. key 값을 이용해 값이 존재하는지 확인한 후 저장하는 방법
       Session session = HibernateUtil.getCurrentSession();

       Cafe existCafe = (Cafe) session.get(Cafe.class, grpId);
       
       if (existCafe == null) {
           Transaction tx = session.beginTransaction();
           Cafe cafe = new Cafe();
           cafe = new Cafe();
           cafe.setId(id);
           cafe.setName(name);
           session.save(cafe);
           tx.commit();
           System.out.println("inserted");
       }
       else{
           System.out.println("already exist");
       }

       HibernateUtil.closeSession();

3. key가 아닌 값을 이용해 존재하는지 확인한 후 저장하는 방법
* createQuery 안의 문장은 SQL Query가 아니라 Hibernate에서 사용하는 HQL(Hibernate Query Language) 이다.
  * 자세한 문법은 http://www.hibernate.org/hib_docs/v3/reference/ko/html/queryhql.html

       Session session = HibernateUtil.getCurrentSession();

       Keyword k = (Keyword) session.createQuery(
               "select k from Keyword as k where keyword = ?").setString(0,
               keyword).uniqueResult();
       if (k == null) {
           Transaction tx = session.beginTransaction();
           Keyword kw = new Keyword();
           kw.setKeyword(keyword);
          
           session.save(kw);
           tx.commit();
           System.out.println("inserted");
       } else {
           System.out.println("already exist");
       }

       HibernateUtil.closeSession();

4. 자동 증가값 받기
* 걍 강제 casting
   int id = (Integer) session.save(kw);

5. DB의 identity 컬럼 관련 XML 설정
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.daum.cafe.search.weblog.entity">
   <class name="Keyword" table="tKeyword">
       <id name="id" column="id">
           <generator class="identity" />
       </id>
       <property name="keyword" type="string" column="keyword" />
   </class>
</hibernate-mapping>

6. 복합키 관련 XML 설정
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.daum.cafe.search.weblog.entity">
   <class name="DTBC" table="tableD">
       <composite-id>
           <key-property name="Id" type="int" column="Id" />
           <key-property name="keywordId" type="int" column="keywordId" />
       </composite-id>
       <property name="count" type="int" column="count" />
   </class>
</hibernate-mapping>
* 참고 : 복합키를 구현하려면 Serializable을 반드시 implements해 주어야 한다. 그렇지 않으면 'composite-id class must implement Serializable' 예외가 발생한다.

걍 5초가 걸리는 작업들 10개를 ThreadPool 5개에 넣고, 10개의 작업이 끝날 때까지 기다리는 코드

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class TestThread {

   private static ExecutorService indexLoadService = Executors
           .newFixedThreadPool(5);

   public static void main(String[] args) {
       for (int i = 1; i < 10; i++) {
           indexLoadService.execute(new TTest(i));
       }

       indexLoadService.shutdown();
       try {
            // 2초에 한번씩 check한다.
            // awaitTermination의 경우 작업이 종료되었으면 true를 그렇지 않고 timeout이 지났으면 false를 리턴한다.
           while(!indexLoadService.awaitTermination(2000, TimeUnit.MILLISECONDS)){
           }
       } catch (InterruptedException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }

       System.out.println("Done");
   }

   static class TTest implements Runnable {
       private int num;

       TTest(int num) {
           this.num = num;
       }

       public void run() {
           System.out.print(".");
           try {
               Thread.sleep(5000);
           } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
           System.out.println("finish " + num);
       }

   }
}

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

Hibernate Quick Reference  (0) 2006.07.27
Java Puzzlers : 9. Tweedledum  (0) 2006.07.19
Javolution  (0) 2006.07.14
요즘 점점 XML을 많이 사용해 가는 추세에 맞춰 java 진영에도 다수의 XML 관련 라이브러리들이 존재한다.

나 역시도 어떤 결과 값을 XML로 만들 필요가 생겼는데, 결과 Object를 알아서 XML로 만들어주면 얼마나 좋을까라는 생각에 관련 라이브러리들을 찾다가 아래와 같은 사이트를 발견했다.

XML data to Java classes 를 위한 라이브러리들에 대한 벤치마크를 한 사이트...
https://bindmark.dev.java.net/

눈에 띄는 두개의 라이브러리가 있으니,
JIBX와 Javolution

둘 다 간략하게 리뷰를 해 본 결과 실제 사용하는 사람 입장에서 좀 편한 것을 택하게 되었으니,
그 놈이 Javolution이었다.

Javolution은 단순히 XML관련 라이브러리만이 아니고, 기타 다른 여러 개의 라이브러리 묶음 중 XML관련 기능도 제공하는 것이었다.

이 넘을 이용해 잘 사용하고 있는데... 문제가 발생했다. 서버가 뻗는 --;;
여러 모로 원인을 찾다가... 아무래도 Javolution에 문제가 있는게 아닐까 하는 생각에 만든 사람한테 미친척 오늘 새벽에 메일을 보내봤다. thread dump뜬 내용과 간단한 상황설명과 관련 소스 조금...

그런데... 아침에 와보니 답변이 와 있었다.~~

답장 메일


한편으로 무지 반가웠지만 한편으로는 좀 원망스럽기도 했다. (그 간의 맘 고생을 생각하면...)

엉망으로 보낼 질문 메일의 원문은 공개하기 꺼려져 공개하지 않는다...

뭐... 위 메일대로 수정해서 테스트 중인데, 정말 해결될 지는 잘 모르겠지만...
잘 되길 바라며..

혹시 Javolution을 사용하고 있는 분 특히 CDATA 출력을 위해 CharacterData를 사용하시는 분 참고하시기 바랍니다.

이상~~ 


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

Java Puzzlers : 9. Tweedledum  (0) 2006.07.19
Java Tuning White Paper  (0) 2006.07.13
RMI 연결 시 timeout이 안나는 문제  (0) 2006.07.07
돌아댕기다 이런 문서도 발견했네요...

Java Tuning White Paper

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

Javolution  (0) 2006.07.14
RMI 연결 시 timeout이 안나는 문제  (0) 2006.07.07
linux 서버 app를 local jconsole에서 monitoring하기  (0) 2006.07.07
--;; 거의 3시간은 헤맨것 같다.

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

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

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

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

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


<<서버에서 할 작업>>
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

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

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

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

amazone link



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

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

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

+ Recent posts