
GUEST
글
java 2008. 9. 2. 16:42[java]Pushlet
www.pushlet.com
stateless인 http 통신을 state 유지로 바꾸어 주기 위한 꼼수이다.
구글 웹채팅 구현 기술을 논의하다가 조현선 과장님이 생각해 내었던 아이디어인데
pushlet이란 기술로 명명되어서 많이 쓰이고 있었다.
jsp나 servlet에서 publish하지 않고 for문을 돌리는 것이다.
for문 안 쪽에는 thread.sleep(sec.)으로 실행 주기를 준다.
web서버의 session 유지 기간 설정에 의해 stateless가 되므로
client에서는 주기적으로 (보통 30분 이내) jsp나 servlet을 재호출해야 할 필요가 있다.
아래 코드를 보자
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<meta http-equiv="Pragma" content="no-cache">
</HEAD>
<BODY BGCOLOR="blue" TEXT="white">
<%
try {
for (int i=1; i < 10; i++) {
out.print("<h1>"+i+"</h1>");
out.flush();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
out.print("<h1>"+e+"</h1>");
}
}
} catch (Exception e) {
out.print("<h1>"+e+"</h1>");
}
out.print("<h1>DONE</h1>");
%>
</BODY>
</HTML>
간단한 아이디어지만 효과는 놀랍다.
트랙백
댓글
글
개발/Tool 2008. 7. 22. 15:20[Tech] AutoHotKey
AutoHotKey라는 게 있다.
잘 쓰면 무척 유용하게 쓰일 듯 하다.
소개
-AutoHotKey(이하 AHK)는 윈도우 오픈소스 유틸리티이며, 아래와 같은 작업들을 할 수 있다.
-키보드와 마우스를 이용한 거의 모든 것들의 자동화. 마우스/키보드 매크로를 직접 작성하거나 매크로 리더를 이용하여 만들 수 있다.
-키보드, 조이스틱, 마우스에 대한 핫키를 만들 수 있다. 모든 키, 버튼 또는 컴비네이션이 hotkey가 될 수 있다.
-원하는 대로 확장되는 단축. 예를 들면 btw가 자동으로 by the way로 될 수 있다.
-custom data entry form, UI, 메뉴바 등을 만들 수 있다. GUI 파트 참조
-키보드, 조이스틱, 마우스의 기능 재배열
-WinLIRC 클라이언트 스크립트를 통해 수제 리모트 콘트롤러로부터 신호를 받아 응답할 수 있다.
-AutoIt v2 스크립트를 사용하면서 새로운 기능들을 추가할 수 있다.
-AHK 인스톨없이 컴퓨터에서 사용할 수 있는 exe로 변환.
AHK는 키보드, 조이스틱, 마우스의 잠재성을 최대로 노출시킵니다.
평
Wofgang Reszel of c't Magazine : AHK는 여러 툴들을 은퇴시켜 버렸다. AHK는 핫키와 텍스트 매크로를 통합했고 스크립트 언어를 제공하는데 이는 다른 어떤 배치파일보다 강력하고 윈도우 스크립팅 호스트 보다 배우기 쉽다. AHK는 베이직과 유사하면서 매크로 레코더와 구문 검사기(systext checker)를 내장하고 있으므로 초심자가 배우기 쉽다.
Dmitri Popov at NewsForge : AHK를 구성하는 기능들의 조합은 AHK를 윈도우 자동화를 위하여 선택할 수 밖에 없게 하는 툴로 만들어준다. AHK는 강력하면서 사용하기도 쉽다. 윈도우 어드민에게나 일반 사용자에게나 AHK는 더 쉽게 컴퓨팅을 할 수 있게 해 준다.
ChronoTron : 지정하기만 하면, 키보드로 조작되는 윈도우의 숏컷(아이콘?)이 더 많은 일을 하게 할 것이다. AHK는 최고의 키보드 설정 프로그램이다.
Adam Pash of Lifehacker : AHK을 써서 답메일을 보내는 시간을 1/3으로 줄였다고 확신한다.
기능
사운드카드의 볼률, mute 등 설정의 변환
윈도우창의 투명화, 항상 활성화 또는 창의 가공
마우스를 조이스틱이나 키보드처럼 활용
시스템 모니터링. 예를 들면, 원하지 않는 윈도우가 나타나는 순간 닫기 등.
익스플로러 윈도우로부터 복사된 파일이름등의 클립보드 내용을 보존, 변환하기.
윈도우 자체 단축키(Win + E, R)을 재정의하거나 비활성화하기.
Alt-Tab을 대체함으로서 RSI감소
트레이 아이콘 메뉴를 기호에 따라 수정(아이콘, 툴팁, 메뉴 아이템 등)
시스템 로그오프나 셧다운시 특정 스크립트 실행
사용자 idle시간 측정. 예를 들어 CPU 집중작업을 시킬 수 있다.
이미지나 픽셀 컬러를 탐지하여 게임 액션을 자동화
다른 언어에서 텍스트 파일을 더 쉽게 읽고 쓰고 파싱할 수 있음
와일드카드 패턴(정규식?) 매치를 이용한 대량 파일 작업
레지스트리나 INI파일들을 이용한 작업
트랙백
댓글
글
java 2008. 7. 16. 15:57[java] ClassLoader
클래스로더라는 게 있단다. 프로그램에서 new라던지, 객체를 사용할 때 클래스를 적재하고 객체를 생생해 주는 일을 하는 것 같다. JVM이 기본적으로 부트스트랩이라는 클래스로더를 가지고 있으며 상속을 이용해 나름대로의 클래스로더를 구현할 수 있다고 한다.
아래는 j2se1.4 API doc의 ClassLoader의 내용이다.
클래스 로더는 클래스를 적재(load)하는 역할을 하는 객체이다. classloader 클래스는 추상클래스이다. 클래스의 이름을 받으면 클래스로더는 해당 클래스에 대한 정의를 구성하는 데이터를 찾거나 생산하려고 시도할 것이다. 전형적인(정해진?) 전략은 받은 이름을 파일 이름으로 바꾸고 나서 클래스의 이름에 해당하는 “class file”을 파일시스템으로부터 읽는다.
모든 클래스 객체는 자신을 정의한 ClassLoader에 대한 참조를 가지고 있다.
array 클래스의 Class객체는 class loader에 의해서 생성되지 않고 자바 런타임에 의해 요구되어질 때마다 자동적으로 생성된다. array 클래스에 Class.getClassLoader()를 실행하면 배열 요소 타입에 해당하는 클래스 로더가 리턴된다. 배열의 요소가 원시형이면 해당 배열 클래스는 클래스 로더가 없다.
응용프로그램은 자바 VM이 동적으로 클래스를 로드하는 방식을 확장하기 위한 목적으로 ClassLoader의 하위클래스를 구현한다.
클래스 로더는 보통, 보안 도메인을 지정하기 위하여 보안 관리자들에 의해 사용된다.
ClassLoader는 클래스와 자원들을 찾기 위하여 위임(delegation)모델을 사용한다. 각ClassLoader는 연관된 부모 클래스가 있다. 클래스나 자원(resource)를 찾으라는 요구를 받으면 ClassLoader 객체는 자신이 찾으려고 하기 이전에 부모 클래스 로더에 작업을 위임한다. VM에 내장된 클래스 로더 – “부트스트랩 클래스 로더(bootstrap class loader)” 는 부모 클래스로더를 가지고 있지 않으며, ClassLoader 객체의 부모로서 작업을 수행한다.
보통 자바 VM은 플랫폼 의존적인 방식으로 작동해, 로컬 파일 시스템으로부터 클래스들을 올리게 된다. 예를 들면 유닉스 시스템에서는 클래스패스 환경변수에 명시된 디렉토리로부터 클래스들을 읽어들인다.
그러나 어떤 클래스들은 파일로부터 기인하지 않는다. 네트워크와 같은 리소스로부터 발생하거나 애플리케이션에 의해 생성될 수도 있다. defileClass 메소드는 일련의 바이트 배열을 Class 클래스의 객체로 바꾸어 준다. 이렇게 새로 정의된 클래스의 객체는 Class.newInstance를 사용해서 생성할 수 있다.
클래스 로더에 의해 생성된 객체의 메소드와 생성자는 다른 클래스들을 참조할 수도 있다. 참조된 클래스(들)을 결정하기 위해서, 자바 VM은 그 클래스를 처음에 생성했던 클래스로더의 loadClass메소드를 실행한다.
예를 들어 애플리케이션은 서버로부터 클래스 파일들을 다운로드 받기 위해서 네트워크 클래스 로더를 생성할 수 있다. 아래 예제 코드를 보자.
ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();
네트워크 클래스 로더의 subclass는 네트워크로부터 클래스를 load하기 위해 findclass와 loadClassData 메소드를 정의해야 한다. 클래스를 생성하는 바이트코드를 다운로드받으면 클래스 로더는 클래스 객체를 생성하기 위해 defineClass 메소드를 사용해야 한다. 간단한 구현은 아래와 같다.
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}
정리하면,
각 클래스로더는 클래스를 찾아야 할 경우에 자신의 부모뻘 클래스로더에게 계속 작업을 위임한다. 결국 최상위 클래스로더로부터 클래스가 로딩되어 있는지 찾아 내려오고 없다면 자신이 생성하게 된다. 그러므로 모든 클래스는 한 번만 로딩되게 된다.
클래스의 객체 내부에서 다른 클래스를 찾는 경우, 그 클래스를 생성한 클래스로더가 그 클래스를 찾는다는 것...
참조 : http://crosscutter.info/tag/classloader
RECENT COMMENT