tomcat 6 에서 동작하던 웹 어플리케이션을 tomcat 7 (7.0.25) 으로 올려보았다.  tomcat 7이 servlet 3.0의 comet을 지원하는 것외에 특별히 고쳤을까 싶었는데..

tomcat6의 catalina.sh를 그대로 사용할 때와 tag library쪽에 이슈가 있었다.

 

## catalina.sh start 되게

설정 파일 conf/server.xml과 bin/catalina.sh 는 tomcat 6에 있는 것으로 사용하려고 하다가 다음과 같은 에러를 만났다. (역시 tomcat 7의 catalina.sh을 사용하는 것이 맞을 듯.)

java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

 

tomcat7의 catalina.sh 에 classpath에 bin/tomcat-juli.jar 부분이 변경된 것 같다.

# Add tomcat-juli.jar to classpath
# tomcat-juli.jar can be over-ridden per instance
if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
  CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
else
  CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
fi

 

또한 입맛에 좀 맞게 catalina.sh를 변경해야 한다.  (CATALINA_JAVAOPTS, $CATALINA_LOGDIR, CATALINA_LOGFILE, CATALINA_HOME)

conf/server.xml은 그대로 수정해서 사용하니 잘 동작된다.

 

## catalina.sh  stop되게

stop 시에 대한 설정을 일부 수정해야 한다.

stop을 하면, sleep 5초를 한다. (디폴트) kill 하고, 안죽으면 force하게 죽는 작업이 되어 있다.

이 부분을 입맛에 맞게 변경

 

## catalina.sh configtest

아파치의 문법 체크(httpd -t )처럼 설정 문법을 테스트하는게 생겼다.

 

소스는 다음과 같다.

elif [ "$1" = "configtest" ] ; then
   
    eval \"$_RUNJAVA\" $JAVA_OPTS \
      -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
      -Dcatalina.base=\"$CATALINA_BASE\" \
      -Dcatalina.home=\"$CATALINA_HOME\" \
      -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
      org.apache.catalina.startup.Bootstrap configtest
    result=$?
    if [ $result -ne 0 ]; then
        echo "Configuration error detected!"
    fi   
    exit $result
fi

 

 

## Tomcat 이슈

tomcat6에서 잘 동작하는 소스를 tomcat 7에서 돌릴 때는 어떠할까. 태그 라이브러리쪽에 이슈가 있었다.

org.apache.jasper.JasperException: The absolute uri: http://taglib.google.com/hiu cannot be resolved in either web.xml or the jar files deployed with this application

at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:56)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:410)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:117)
at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:311)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:152)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:410)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:475)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1427)
at org.apache.jasper.compiler.Parser.parse(Parser.java:138)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:198)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)

 

tomcat 6에서는 기존에 tag library 파일들을 META-INF 디렉토리안에 넣으면 자동으로 인식하는 기능이 있었는데, 이 부분이 tomcat 7부터는 web.xml에 명시적으로 관련 정보를 넣는 구조로 바뀌었다.

 

즉 기존의 파일은 다음과 같이 사용했다.


src/main/java/META-INF/taglib/hiu-taglib.tld

<?xml version="1.0" encoding="UTF-8"?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">

    <description>HIU Custom Tags</description>
    <tlib-version>1.2</tlib-version>
    <short-name>hiu</short-name>
    <uri>http://taglib.google.com/hiu</uri>


<tag>

….

</tag>

…..

 

web.xml에 taglibarary에 대한 url와 location에 대해서 명확히 지정해야 한다.

(tld 파일을 META-INF가 아닌 WEB-INF 로 이동해야 잘 인식해서 WEB-INF 로 이동하니 잘된다.
/META-INF/taglib.tld 파일로 수정해도 인식 못한다. )

* web.xml에 추가할 내용

<jsp-config>
    <taglib>
        <taglib-uri>http://taglib.google.com/hiu</taglib-uri>
        <taglib-location>/WEB-INF/hiu-taglib.tld</taglib-location>
    </taglib>
</jsp-config>

WEB-INF 디렉토리 밑에 tag lib를 두면 자동으로 인식하기 때문에 꼭 저렇게 사용하지는 않아도 된다.

정확한 지식을 위해서 jsp 2.2 스펙을 참조한다.

 

 

* Java Server Page 2.2 specification (tomcat 7이 적용, jsp 2.2) 
http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index.html

스펙을 참조하니. 이해가 되었다. 역시 스펙의 힘이란…

 

예제가 설명이 되어 있다.

 

순서에 대한 정보도 있다.

자세한 내용은 아래를 참조하면 된다.

JSP.7.3.2 TLD resource path
JSP.7.3.3 Taglib Map in web.xml
JSP.7.3.4 Implicit Map Entries from TLDs
JSP.7.3.5 Implicit Map Entries from the Container
JSP.7.3.6 Determining the TLD Resource Path

Posted by 김용환 '김용환'

 

프로세싱(Processing) 개발 툴을 분석하고 나면,  아두이노 개발 툴 소스 분석은 더 쉽다. 
아두이노 개발 툴은 프로세싱 개발 툴 소스 depedency가 있거나 복사된 소스들이 많다.  (정확히 역사는 어떻게 되었는지는 모르지만..^^;)

1. 소스를 다운받는다.

http://www.arduino.cc/en/Main/software  페이지에서 소스를 다운받는다.

 

2. 이클립스 프로젝트 환경 구축

이클립스 프로젝트를 하나 생성하고 다운받은 소스를 복사한다. 아두이노 개발 툴 안에 이클립스 설정이 파일이 있다.

 

아두이노 개발 툴의 build path를 살펴보면, processing-core를 참조하고 있다. (processing.core 패키지를 참조하고 있다.)

 

프로세싱 소스는 아래 위치에서 git로 다운받는다.

http://code.google.com/p/processing/source/checkout

 

프로세싱 코드는 2.0으로 다운받으면, processing.app.RunnerListener 인터페이스를 모두 상속해서 구현하지 않았다고 아두이노 개발 툴 소스의 Editor 클래스 컴파일 에러가 난다. API 구현해주면 깨끗하게 컴파일 완료된다.

public class Editor extends JFrame implements RunnerListener {

…..


@Override
public void startIndeterminate() {
    // TODO Auto-generated method stub
   
}


@Override
public void stopIndeterminate() {
    // TODO Auto-generated method stub
   
}


@Override
public void statusHalt() {
    // TODO Auto-generated method stub
   
}


@Override
public boolean isHalted() {
    // TODO Auto-generated method stub
    return false;
}

 

컴파일 완료된 상태

<아두이노 소스>

 

빌드 연동

 

프로세싱 소스 (core/src 디렉토리의 소스만 잘 빌드되면 됨)

 

3. 소스 디렉토리 확인

UI 부분은 프로세싱과 거의 동일하다.

 

디버그 관련 패키지가 들어가 있다.  컴파일도 하고 실행했을 때 output 처리하는 것들. arduino 보드에 올리는 클래스들이 담겨 있다.

 

프로세싱 개발 툴은 java 기반이지만, 아두이노 개발 툴은 자바 기반 언어대신 C 언어의 특성을 가지고 있다.  (그래서 antlr는 사용할 필요가 없다.)
그러나 화면에 출력되는 문법에 맞는 색상을 칠해주는 패키지이다.

 

이 외. 운영체제(플랫폼)에 맞는 다양한 작업 패키지들이 있다. 여기도 프로세싱 개발 툴처럼  jna가 쓰이고 있다.

processing.app.linux, processing.app.windows, processing.app.macosx


4. 빌드

빌드는 build 디렉토리에 있는 build.xml를 가지고 ant 컴파일 하면 된다.

Buildfile: G:\workspace\arduino-1.0\build\build.xml
build:
revision-check:
windows-checkos:
subprojects-build:
compile:
....
 [launch4j] Compiling resources
 [launch4j] Linking
 [launch4j] Successfully created G:\workspace\arduino-1.0\build\windows\work\arduino.exe
BUILD SUCCESSFUL
Total time: 44 seconds


 

Posted by 김용환 '김용환'


php와 동시에 java를 하나로 묶는 소스에서 개발하는 이클립스 환경 셋팅이다.

1. php eclipse 설치

phpeclipse(http://www.phpeclipse.com) 는 죽어가고 있는 듯 제외하고, 이클립스 공식 싸이트를 이용
http://www.eclipse.org/projects/project.php?id=tools.pdt

버전은 2011년 6월에 나온 PDT 3.0을 이용하기로 결정했다.
15 Jun 11 PHP Development Tools 3.0 Release Review 
http://www.eclipse.org/pdt/downloads/

php와 eclipse가 동시에 내장되어 있는 방식을 이용하기로 했다.
"These downloads include Eclipse 3.7.1 and PDT 3.0.2" 선택

http://code.google.com/p/zend-sdk/downloads/list 여기주소로 들어가서
eclipse-php-3.0.2.v2011102768-Win32.zip를 다운로드 했다.

\php-development 디렉토리에 extract 하고, eclipse-php\eclipse-php.exe 파일을 실행하여 eclipse를 실행

workspace는 아래와 같이 지정.
\php-development\eclipse-php\workspace

자바 빌더 자체가 없어서 java  소스에 대해서 에러가 발생한다.

2. Subversion client 설치  

이클립스 subversion client 인 subversive plugin을 설치한다.
eclipse3.7은 helios 이니, Install ->
    http://download.eclipse.org/releases/helios 등록 -> Collaboration  -> subversive로 시작되는 것 모두
설치


3. java 빌드

이클립스 자동 자바 컴파일을 위해서 http://download.eclipse.org/releases/helios 위치에서 java ee developer tools 플러그인을 설치한다.





 

Posted by 김용환 '김용환'
TAG Eclipse, Java, php

jdk 1.7 이하의 app의 cpu 측정하려면 com.sun.management.OperatingSystemMXBean interface 의 getProcessCpuTime() 을 이용했었다.

jdk 1.7부터는 cpu load를 바로 호출할 수 있는 메소드가 추가되었다.

double getSystemCpuLoad() : system의 cpu load값을 0.0~1.0으로 리턴한다. 0.0은 0%, 1.0이면 100%를 의미
double getProcessCpuLoad() : jvm process의 cpu load값을 0.0~1.0으로 리턴한다. 0.0은 0%, 1.0이면 100%를 의미 
 
 
 
Posted by 김용환 '김용환'
TAG Java

jni vs jna

java core 2011.12.02 15:06

 

 

Cassandra는 최근에 JNI(Java Native Interface) 대신 JNA (Java Native Access) 방식을 이용해서 native 영역에 메모리를 copy 하는 작업이 많은 경우에 사용되어 플랫폼의 속도를 향상시키는 방법을 쓰고 있습니다. 또한 일부 임베디드 프로젝트나 서버프로젝트에서 JNA 기법을 사용하는 예들이 많아져 오픈소스를 활용하는 저희에게 좋은 정보이면서 점차적으로 알아야 할 정보가 될 것 같아서 관련된 내용을 공유하고자 합니다.  (참고로 SWIG 이라는 라이브러리도 있는데, 제가 아직 몰라서 살펴보고 공유하겠습니다.)

 

1.     JNI (Java Native Interface)

JNIJava 에서 native 영역(c, c++)으로 들어가 호출 또는 native (c, c++)에서 java로 호출하는 interface입니다. c, c++ 언어로 만든 라이브러리, 솔루션을 바로 java에서 사용할 수 있습니다. 웹 서비스의 경우라면 c, c++ 언어로 만든 이미지 합성 또는 동영상 라이브러리를 사용하여 서비스하는 경우라 할 수 있습니다. 안드로이드 프레임워크의 경우에는 open gl과 같은 영역에서 연동할 수 있도록 되어 있습니다.

 

리눅스에서 JNI를 간단히 테스트하는 코드를 보겠습니다.

자바 클래스는 간단히 리눅스 shared object (so) 을 읽어 native 지시자로 구현된 method를 호출합니다 .

HelloJNI.java

class HelloJNI {
 native void printHello();
 native void printString(String str);
 
 static {
  System.load("/work/
JniTest/hellojni
.so");
 }
 public static void main(String[] args) {
  HelloJNI myJNI = new HelloJNI();
  myJNI.printHello();
  myJNI.printString("Hello in C");
 }
}


 

먼저 컴파일을 하고, native 구현해야 할 함수를 정의하는 header 파일을 생성합니다.

# javac HelloJNI.java

# javah HelloJNI

  

 

 

 

  

HelloJNI.h 파일에는 구현해야 할 “Java_HelloJNI_printHello”, “Java_HelloJNI_printString” 함수를 정의하고 있습니다.

 

<HelloJNI.h>

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class HelloJNI */

#ifndef _Included_HelloJNI

#define _Included_HelloJNI

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     HelloJNI

 * Method:    printHello

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_HelloJNI_printHello

  (JNIEnv *, jobject);

/*

 * Class:     HelloJNI

 * Method:    printString

 * Signature: (Ljava/lang/String;)V

 */

JNIEXPORT void JNICALL Java_HelloJNI_printString

  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus

}

#endif

#endif


 

그 다음은 HelloJNI.h 의 함수를 구현한 HelloJNI.c 파일을 간단히 작성합니다. printHello 함수는 단순히 문자열을 출력하고, printString 함수는 자바로부터 받은 문자열을 그대로 출력합니다.

 

<HelloJNI.c>

#include "HelloJNI.h"

 

JNIEXPORT void JNICALL Java_HelloJNI_printHello(JNIEnv *env, jobject obj) {

 printf("Hello World !!! jni\n");

 }

 

JNIEXPORT void JNICALL Java_HelloJNI_printString(JNIEnv *env, jobject obj, jstring string) {

  const char *str = (*env)->GetStringUTFChars(env,string,0);

  printf("%s\n", str);

  return;

}


 

c코드를 컴파일하고 나서 shared object(so)로 만듭니다.

# gcc -c -I$JAVA_HOME/include -I$JAVA_HOME/include/linux HelloJNI.c

# gcc -shared -o HelloJNI.so HelloJNI.o

# ls -al HelloJNI.so

HelloJNI.so

 

이제는 마지막으로 자바를 실행합니다.

 

# java HelloJNI

Hello World !!!

Hello in C!!!

 

 

 

JNI 를 사용하기 위해서는 다음과 같이 6단계의 개발 단계를 거치게 됩니다. 번거롭지만 다들 JNI를 구현할 때는 이렇게 하고 있습니다.

  

 

JNI를 쓰는 이유는 java 영역에서 할 수 있는 부분을 Native 영역으로 이동하여 연동할 수 있고, 속도가 늦은 부분은 속도를 높일 수 있습니다. 안드로이드 플랫폼의 내부구조는 껍데기는 java이고, 내부는 JNI의 코드로 내부 모듈로 이루어져 있다고 할 수 있습니다.

JNI의 가장 큰 문제는 메모리 부분입니다. Native 로 구현한 공간에는 Auto GC를 하지 못하고 일일이 메모리 관리를 해야 하고, 잘못하면 메모리릭을 일어나게 할 수 있습니다. 또한 JVM 메모리를 침범하여 crash 가 되기도 합니다. 그래서 native 사용할 때는 항상 잘 사용해야 합니다.

 

2.     JNA (Java Native Access)

JNI 개발 측면에서는 번거로운 부분이 많은데, 이런 부분을 쉽게 해주는 API가 있는데, 바로 JNA 입니다. JNA libffi (Foreign function interface library)라 불리는 native library를 사용하여 dynamic하게 쓸 수 있게 합니다. Native 언어로 만들어진 함수를 사용하기 위해서  Header 파일 생성, Header 파일을 구현한 C소스, compile 과정이 없습니다. 번거로운 과정이 많이 생략 가능합니다.

어떻게 사용되고 동작되는지 살펴보겠습니다.

JNA 라이브러리는 원래 java.net(http://java.net/projects/jna/)에 있었는데, 지금은 github(https://github.com/twall/jna)로 옮겨진 상태입니다.

https://github.com/twall/jna/downloads 에 접근해서 jna.jar(https://github.com/downloads/twall/jna/jna.jar)를 다운받습니다.

 

위에서 언급했던 JNI 예제의 Native 코드를 생성합니다.

<myLib.h>

void printHello();

void printString(char* str);

 

<myLib.c>

#include <stdio.h>

void printHello() {

           printf("Hello World !!! jna\n");

}

 

void printString(char* str) {

           printf("%s\n", str);

}


 

이 파일들을 컴파일하여 shared object 파일로 만듭니다.

# gcc -c myLib.c

# gcc -shared -o myLib.so myLib.o

# ls myLib.so

 

이제는 myLib.so 파일을 정적으로 읽는 java 클래스를 하나 생성합니다. com.sun.jan.Library를 상속하는 interface 를 하나 만들고, shared object 를 읽어 자기 자신의 Instance 를 생성하여 header 파일을 생성하지 않고 바로 native 코드의 함수를 호출할 수 있도록 합니다.

 

<HelloWorld.java>

import com.sun.jna.Library;

import com.sun.jna.Native;

import com.sun.jna.Platform;

 

public class HelloWorld {

    public static void main(String[] args) {

        CLibrary.INSTANCE.printHello();

        CLibrary.INSTANCE.printString("Hi\n");

     }

}

 

interface CLibrary extends Library {

        CLibrary INSTANCE = (CLibrary) Native.loadLibrary(

            ("/home/kimyonghwan/myLib.so"), CLibrary.class);

           void printHello();

           void printString(String str);

}


 

그리고, 바로 classpath jna.jar와 현재 디렉토리를 추가하여 컴파일과 실행을 하면 예측한 대로 결과가 나옵니다.

 

# javac -classpath jna.jar HelloWorld.java

# java -classpath jna.jar:. HelloWorld

Hello World !!! jna

Hi

 

JNA 방식으로 코딩을 하니 훨씬 이해가 쉽습니다. 기존에 이미 만들어진 shared object를 바로 클래스만 작성해서 호출하는 방식이기 때문에 복잡한 interface가 필요가 없습니다. 또한 JAVA SRC 디렉토리에는 지저분한 C header 파일과 C 소스 파일은 더 이상 필요 없을 것입니다 .

 

 

그러나 jna의 한계가 있습니다. C++ 코드를 사용할 수 없습니다. (jnaerator라는 오픈소스가 C++로 변환하기는 합니다만, thirty party라 제외합니다.) 또한, api 특성상 JNI의 성경을 다 포함하지 못합니다. 예를 들어 native에서 jvm start하는 것은 JNA가 지원하지 않습니다.

단순히 Java단에서 C 코드로 일을 시킬 때 아주 편리합니다. 권한 만 있다면 리눅스 또는 윈도우 커널 라이브러리에 접근해서 interface에 바인딩하며 명령어를 실행할 수 있습니다. 또한 JNI에서 한 것처럼 C언어에서 함수에 Pointer를 연결하여 Java에서 쓸 수 있도록 있으며, Callback 이 일어나면 Java로 올려 처리도 가능합니다.

 

이해를 돕기 위해서 재미있는 예제를 하나 소개하겠습니다. 윈도우에서 제공하는 core library 중의 하나인 user32.dll 라이브러리를 읽어서 윈도우 OS의 현재 실행 중인 window 객체의 text를 얻어오는 예제입니다.

 

<User32Test.java>

import com.sun.jna.Native;

import com.sun.jna.Pointer;

import com.sun.jna.win32.StdCallLibrary;

 

public class User32Test {

           public interface User32 extends StdCallLibrary {

                     User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);

 

                     interface WNDENUMPROC extends StdCallCallback {

                                boolean callback(Pointer hWnd, Pointer arg);

                     }

 

                     boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);

 

                     int GetWindowTextA(Pointer hWnd, byte[] lpString, int nMaxCount);

           }

 

           public static void main(String[] args) {

                     final User32 user32 = User32.INSTANCE;

                     user32.EnumWindows(new User32.WNDENUMPROC() {

                                int count;

 

                                public boolean callback(Pointer hWnd, Pointer userData) {

                                          byte[] windowText = new byte[512];

                                          user32.GetWindowTextA(hWnd, windowText, 512);

                                          String wText = Native.toString(windowText);

                                          wText = (wText.isEmpty()) ? "" : "; text: " + wText;

                                           System.out.println("Found window " + hWnd + ", total "

                                                                + ++count + wText);

                                          return true;

                                }

                     }, null);

           }

}


 

Eclipse에서 소스를 복사하고, build path jna.jar를 넣어주고 Run 을 실행하면 재미있는 결과가 나옵니다.

<결과>

..

Found window native@0x1074c, total 58; text: 네이버 백신

Found window native@0x10580, total 59; text: Network Flyout

Found window native@0x103fe, total 61; text: N드라이브 탐색기

..


 

샘플 코드의 예제를 도식화하면 JavaDll proxydll 간의 관계로 풀어낼 수 있습니다.

 

 

만약 User32window lock api를 사용하면 java에서도 쉽게 window locking이 되게 할 수 있습니다. Kernel32도 사용 가능합니다.

 

3.     결론

JNI 의 불편함대신 간편하게 사용될 수 있는 JNA는 점차 보편화 되고 있어서, 오픈소스 코드를 분석하거나 또는 Native 모듈을 개발하는데 큰 도움이 될 것입니다.

 

 

Posted by 김용환 '김용환'
TAG Java, JNA, jni

테스트 해보니 java7 RC 버그로 알려졌던 WatchService 이슈가 여전히 update 1에도 나타났다. 
http://knight76.tistory.com/entry/Java-7-RC-버그-WatchService





그러나, jdk7 loop predicate 버그는 update1에서 fix되었다.  
http://knight76.tistory.com/1360


https://issues.apache.org/jira/browse/LUCENE-3346

Posted by 김용환 '김용환'
TAG Java, jdk


 rmi 서버를 종료했다가 rmi를 실행할 때, 유의할 점이 있다.

실행시, 

처음 실행할 때는 createRegistry를 사용한다.
 LocateRegistry.createRegistry(rmiPort);

rmi 서버를 종료하고 다시 실행할 때는 getRegistry를 사용하면 된다.

코드는 다음과 같다.



 


/**

 * A RMI Server class binds or unbinds <code>NetworkDataBase</code> class.   

 * 

 * @author Kim, Yong Hwan

 * @version 1.0

 * 

 */

public class RMIServer {

/**

* <code>NetworkDataBase</code> object to bind or unbind

*/

private static NetworkDataBase ndb;

/**

* RMI Server port

*/

private static int port;

/**

* Checks if connection is valid

*/

private static boolean isConnected;

/**

* Checks if rmi server is running in first time

*/

private static boolean firstTime = true;

 

    /**

     * Binds the remote RMI database on the specified port.

     * 

     * @param dbLocation 

     *   database file location.

     * @param rmiPort

     *            port on the server.

     * @throws RemoteException

     *            Thrown if the remote database, <code>NetworkDataBase</code> 

     *            class could not be accessed.

     */

    public static void register(String dbLocation, int rmiPort) throws RemoteException {

    Registry registry;

    port = rmiPort;

    ndb = new NetworkDataBase(dbLocation); 

    if (firstTime) {

    registry = LocateRegistry.createRegistry(rmiPort);

    firstTime = false;

    } else {

    registry = LocateRegistry.getRegistry(rmiPort);

    }

        registry.rebind("database", ndb);


        isConnected = true;

    }

    

    /**

     * Unbinds and unexports the remote RMI database 

     * 

     * @throws RemoteException

     *            Thrown if the rmi server is not shutdown.

     */

    public static void exit() throws RemoteException {

    try {

Naming.unbind("rmi://127.0.0.1:" + port + "/database");

} catch (Exception e){

throw new RemoteException(e.getMessage());

}

        ndb = null;

        port = 0;

        isConnected = false;

    }

    

    /**

     * Gets if connection is valid;

     * @return return true, if connection is alive. Otherwise return false.

     */

    public static boolean isConnected() {

    return isConnected;

    }

}

Posted by 김용환 '김용환'
TAG Java, RMI

http://www.jco.or.kr/b?cmd=boardView&viewType=RETRIEVE&boardNo=76&boardIdx=73&boardMasterId=board_notice


조금 관심이 가는 부분은 "Introducing Oracle Java Wireless Client" 정도였음.

j2me가 가장 안좋았던 부분이 UI 킷트와 퍼포먼스였다.
성능을 높이고, cldc+midp 조합에 webkit, wac 2.0을 넣은 모델이 눈에 띤다.
java-js bridge를 넣어서 자바와 웹을 이용하려는 시험에 박수~


Posted by 김용환 '김용환'
TAG Java, webkit



1. 자바 (자바/이클립스)
2. html (html5/websocket)
3. Big Data(nosql)
4. 컨퍼런스/세미나
5. 기타 (트렌드/보안/소식)


<자바>
Java without the GC Pauses
http://www.infoq.com/presentations/Java-without-the-GC-Pauses

이클립스 3.8 M1에서 java7 지원
http://www.infoq.com/news/2011/08/eclipse38-java7
http://download.eclipse.org/eclipse/downloads/drops/S-3.8M1-201108031800/

 

 

<html>

HTML5의 web storage(IndexedDatabase)를 구현하는 Pouch DB 프로젝트 시작 - Portable CouchDB JavaScript implementation
https://github.com/mikeal/pouchdb

리얼타임 웹 분석 툴 -Hummingbird (node.js, socket.io, mongdo DB 사용)
http://firejune.com/1688

웹 브라우저에 대해서 html5 지원 여부 점수 주기
http://html5test.com/

한눈에 보는 HTML5의 중요한 부분들
http://blog.n01se.net/?p=375

html문서에서 현재 어디를 보고 있는지에 보여주는 jquery lib (html5 브라우저 이용)
http://larsjung.de/fracs/

websocket을 이용해서 vnc(상대 서버에 접속)를 구현 (살펴보기)
https://github.com/kanaka/noVNC

html5 미디어(video/audio) js lib
http://html5media.info/

HTML5: Edition for Web Authors Final draft 공지
http://www.w3.org/TR/2011/WD-html5-author-20110809/


socket.io를 이용한 리얼타임웹 구현하기
http://firejune.com/1685

WPilot - 멀티유저 우주선 격침 게임  (html5)
http://jfd.github.com/wpilot/

예전 PC게임(세븐 몽키)을 크롬웹브라우져에서 실행 (플러그인 설치 필요)
http://www.naclbox.com/gallery


HTML5 모바일 App 분석(Anatomy)
http://pinchzoom.com/posts/anatomy-of-a-html5-mobile-app/anatomy-of-a-html5-mobile-app
http://www.readwriteweb.com/mobile/2011/08/html5-can-get-the-job-but-can.php?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+readwriteweb+%28ReadWriteWeb%29

 

 

<Big Data>

트위터 리얼타임 처리 방법 Storm ( Hadoop of Realtime) 소개 - 오픈 소스 공개 예정
http://engineering.twitter.com/2011/08/storm-is-coming-more-details-and-plans.html
http://tech.backtype.com/preview-of-storm-the-hadoop-of-realtime-proce
http://www.readwriteweb.com/enterprise/2011/08/twitter-will-open-source-storm.php?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+readwriteweb+%28ReadWriteWeb%29

sql->nosql->newsql 으로 진화?!  various new scalable/high performance SQL database vendors
http://blogs.the451group.com/information_management/2011/04/06/what-we-talk-about-when-we-talk-about-newsql/
http://highscalability.com/blog/2011/7/25/is-nosql-a-premature-optimization-thats-worse-than-death-or.html
( Clustrix, GenieDB, ScalArc, Schooner, VoltDB, RethinkDB, ScaleDB, Akiban, CodeFutures, ScaleBase, Translattice, and NimbusDB)

하둡을 이용해서 graph 엔진보다 성능 엄청 많이 나오게 하기 (천배)
http://dbmsmusings.blogspot.com/2011/07/hadoops-tremendous-inefficiency-on.html

Data Stack의  리얼 타임 처리 Brisk 솔루션 소개 (카산드라 + hadoop + Hive)
http://www.readwriteweb.com/hack/2011/08/all-about-brisk.php?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+readwriteweb+%28ReadWriteWeb%29

agamemnon - 카산드라 기반의 Graph DB
http://pypi.python.org/pypi/agamemnon/0.3.0.0

 

 


<서비스>
gmail의 outlook UI 사용 가능
http://mashable.com/2011/08/04/gmail-preview-pane/

page speed가 좋다고 하나. 한계는 존재 (https는 안됨 등등)
http://code.google.com/intl/ko/speed/pss/faq.html#baredomain

 

 

 


<컨퍼런스/세미나>
nosql2011 - nosql 컨퍼런스 -  (8/23~25)
http://nosql2011.wilshireconferences.com/

surge2011 - scalability 관련 컨퍼런스 (9/28~30)
http://omniti.com/surge/2011

strangeloop2011 컨퍼런스 - 언어, javascript, html5, java, cloud, 분산/병렬처리, 모바일
https://thestrangeloop.com/schedule


구글 기술 사용자 그룹 모임(요즘에 뜨는 모임)
http://www.gtugs.org/
한국 - http://seoul.gtugs.org/

 

 


<기타>
소셜 로그인 트렌드 (facebook > google >> yahoo > twitter > windows live)
http://www.trendbird.biz/5947

아이패드 출시 이후로 노트북의 성장세가 꺽인것은 사실임을 보여주는 객관적인 지표
http://www.trendbird.biz/5968

페이스북 messenser 출시
http://www.hankyung.com/news/app/newsview.php?aid=201108101168g&sid=0104&nid=004&ltype=1
http://think1more.kr/438

HTC가 미국 모바일 클라우드 업체 인수
http://news.inews24.com/php/news_view.php?g_serial=594346&g_menu=020800&rrf=nv

맥아피사에서 나온 보안 공격 사례 (미국이 많이 공격당함, 한국은 3건)
http://www.mcafee.com/us/resources/white-papers/wp-operation-shady-rat.pdf

특허 관련 구글의 위선
http://www.appleforum.com/mac-column/60765-%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%99%80-%ED%8A%B9%ED%97%88-%EA%B5%AC%EA%B8%80%EC%9D%98-%EC%9C%84%EC%84%A0.html#post532618

구글은 90만대 서버를 사용
http://www.datacenterknowledge.com/archives/2011/08/01/report-google-uses-about-900000-servers/

eBay는 100TB flash 저장장치를 설치/사용
http://gigaom.com/cloud/ebay-deploys-100tb-of-flash-storage/

facebook - tilera 칩셋 이야기
http://gigaom.com/cloud/facebook-tilera/

해외 주요 통신사업자의 소셜미디어 전략 (트위터:페이스북:이메일 = 5:3:1) , CS 점수 상승
http://www.digieco.co.kr/KTFront/report/report_strategy_view.action?board_seq=5616&board_id=strategy#

Google+의 전략적 Position 과 Circle 개념의 가능성
http://www.digieco.co.kr/KTFront/report/report_issue_trend_view.action?board_id=issue_trend&kind=a01&board_seq=5609&sort_order=#

M2M으로 영향력을 확대하는 구글 안드로이드
http://www.digieco.co.kr/KTFront/tb/board/5521.action

새로 나올 아이폰5
http://www.trendbird.biz/5980

시간장애인을 위한 윈도우 운영체제 쉽게 사용하기 (오픈소스) - 아직 한국어는 지원안함
http://www.nvda-project.org/

아마존, 웹앱으로 애플 울타리 뛰어넘다
http://www.hankyung.com/news/app/newsview.php?aid=2011081164671&intype=1
캡쳐 화면 -  http://www.eweek.com/c/a/Desktops-and-Notebooks/Amazons-Kindle-Cloud-Reader-Offers-Apple-Challenge-HTML5-Reading-829379/

아이폰 앱이 장벽이 되는 현실- html5로 이동
http://www.readwriteweb.com/archives/knocking_down_apples_walled_garden_html5_vs_ios_apps.php

지난10년 인터넷업계 지형변화 - NHN시장가치 2010년 인터넷 기업 세계 10위
http://www.seri.org/db/dbReptV.html?menu=db12&pubkey=db20110811001

구글 플러스에 게임 추가
http://googleblog.blogspot.com/2011/08/games-in-google-fun-that-fits-your.html

구글 Gmail이 아웃룩처럼 변경
http://googleblog.blogspot.com/2011/07/google-apps-highlights-7222011.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+blogspot%2FMKuf+%28Official+Google+Blog%29

MS 오피스를 HTML5로도 사용가능하게 함
http://news.naver.com/main/read.nhn?mode=LSD&aid=0001984976&oid=092&mid=sec&sid1=105

증강현실을 이용해서 여자 패션아이템을 쉽게 고를 수 있음
http://www.readwriteweb.com/archives/retailer_lets_online_shoppers_virtually_try_on_clothes_using_augmented_reality.php?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+readwriteweb+%28ReadWriteWeb%29

구글 웹 엔진, 구글 앱스 등이 미국 정부 표준 인증(SSAE-16, 3042)을 받음,
http://googleenterprise.blogspot.com/2011/08/security-first-google-apps-and-google.html


레드햇이 클라우드 사업 진출 (PAAS, Cloud 관리)
http://www.readwriteweb.com/cloud/2011/05/red-hat-ups-its-cloud-game.php

 

 

Posted by 김용환 '김용환'

오랜만에 쉽고 재미있는 Framework을 만나서 즐길 수 있어서 참 좋았다.
이렇게 프레임웍이 쉽고 간단하면 얼마나 좋을까, 어린 친구들도 쉽게 배울 수 있는 프레임웤이 나왔으면 좋겠다.

Jersey Frameworks는 JSR 311 표준을 바탕으로 만들어졌다. 그리고, JSON/XML/HTML mime type으로 결과를 REST를 통해 전달할 수 있다. 따라서, 무척 간단하다. OPEN API 서버로 쓰기에 적당해 보인다.

PPT 훓어보면, 5분이면 이해할 수 있을 것이다.


 





 

Jersey framework
 
Posted by 김용환 '김용환'