· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
zeta


1. 읽어보기

이 페이지의 내용은 Zeta 패키지에 포함된 docs/README 문서의 내용과 같습니다. 대개 위키 페이지의 내용이 더 최신이며, 더 풍부합니다.

1.1. 개요

Zeta는 작은 미니 응용프로그램을 만들고 구동시킬 수 있는 툴입니다. 익숙한 자바 언어와 SWT로 손쉽게 프로그램을 만들 수 있으며, XML만을 사용할 수도 있습니다. 제작 방법은 홈페이지와 demo 디렉터리의 예제들을 참고하세요. Zeta Pure는 JDK와 SWT가 지원되는 모든 플랫폼에서 사용 가능하며, 윈도우용으로는 GCJ로 컴파일된 바이너리를 배포합니다.

현재 이 프로젝트는 GCJ, SWT, BeanShell, CookXML을 이용하며, 추후 Groovy, Jython, Javascript등을 기본 지원할 예정입니다.

1.3. 사용법

Zeta.exe나 Zeta.jar를 실행합니다.

1.4. 개발 환경

Zeta 0.1 - 0.2 :
  • javac/jar는 Sun J2SE 1.5.0_8을 사용합니다.
  • Windows 에서 제작되었으나, OS 종속적인 코드는 사용하지 않는 만큼 JDK와 SWT가 지원되는 모든 환경에서 사용할 수 있습니다.
  • 모듈 작성시에는 에는 OS 독립적인 코드라는 제한이 없습니다.
  • IDE 환경은 JEdit 4.3 pre6 입니다. 프로젝트 관리 기능을 사용하지 않으므로 무슨 에디터를 사용하든 상관은 없습니다. 단, 모든 소스 파일에 UNIX Line Separator / UTF-8 Encoding 이 원칙입니다.
  • 모든 zip 파일은 7-Zip 4.4.2로 작성되었습니다.
  • JAR 바이너리 작성을 위한 매크로는 zar.bat 이며, 네이티브 바이너리 생성을 위한 매크로는 zjc.bat 입니다. 조금 변경하면 다른 OS에서도 작성할 수 있습니다.
  • SWT
  • GCJ, UPX : javacompiler 프로젝트의 javacompiler 0.8에 포함된 것을 사용합니다. GCJ는 Windows와 Linux용이 포함되어 있습니다.
  • BeanShell
    • bsh-core-2.0b4.jar
    • bsh-classgen-2.0b4.jar
    • bsh-classpath-2.0b4.jar
    • bsh-commands-2.0b4.jar
    • bsh-reflect-2.0b4.jar
    • http://www.beanshell.org
  • CookXML: XML을 이용한 SWT 및 빈셸 스크립팅을 지원하기 위해 사용됩니다.

1.5. 저작권

Zeta는 GPL v2 하에 배포됩니다. 자세한 내용은 docs/LICENSE를 참고하세요.

1.6. 달라진 점

0.1 : 최초 공개 버전. 0.2 :
  • SWT 3.1 / CookSWT 1.1.2 -> SWT 3.2 / CookSWT 1.2.1 업데이트.
  • 세션 자동 관리 : 시작시 마지막 사용 후 종료하지 않은 모듈들을 불러옴 단, Shell을 리턴하는 스크립트 및 모듈에 한함.
  • 기본 Import 패키지 변경 (config/import.bsh)
  • bsh, xml 파일 내 한글 문제 해결(file.encoding=utf8)
  • 잡다한 콘솔 개선 및 데모 변경
  • 콘솔에 EvalError 외에 포괄적인 Exception 출력됨.
  • (Native) 파싱 문제 해결, XML 모듈 정상 사용 가능
  • (Native) Pentium 2 최적화 (-march=pentium2)

1.7. 알려진 문제점

  • (Native) gnu/regexp/MessagesBundle.properties 없이 실행되지 않는 문제 DIARY - 'Native/Win32 : MessagesBundle 클래스 문제(06.09.03)' 참고

2. Zeta용 프로그램 제작

현재 bsh와 cookswt를 사용한 xml로 만들 수 있습니다. 사용법은 트레이의 zeta 아이콘의 메뉴를 열어 Load를 선택한 뒤 파일을 선택하면 됩니다. 콘솔을 열면 프롬프트에서 빈셸 스크립팅 및 예외 발생 등에 대한 기록을 볼 수 있으며, 여러 셸을 띄운 상태에서 zeta 아이콘을 클릭하는 것으로 console을 제외한 모든 셸을 보이게 하거나 감출 수 있습니다.

2.1. 예제들

2.1.1. demo/HelloWorld1.bsh

zeta는 bsh 파일을 읽어들일 수 있습니다. 다음은 SWT로 간단한 창을 출력하는 bsh 스크립트입니다.
class Hello{
        public Hello(){
                Display d = Display.getCurrent();
                Shell s = new Shell(d, SWT.SHELL_TRIM | SWT.TOOL);
                Label l = new Label(s, SWT.CENTER);
                s.setLayout(new FillLayout());
                String str = "Hello, Zeta!";
                l.setText(str);
                s.setText(str);
                s.pack();
                s.open();
        }
}
new Hello();
클래스를 굳이 사용하지 않아도 되지만, 변수명 등의 충돌을 방지하기 위해 권장합니다.

2.1.2. demo/HelloWorld4.xml

zeta는 xml 파일을 cookswt를 이용해 파싱합니다. 다음과 같이 스크립트를 xml에 내장할 수 있습니다.
<!-- original source by http://cookxml.sourceforge.net/cookbsh/ -->
<shell style="SHELL_TRIM | TOOL" text="Hello World!" size="320,240">
        <filllayout type="VERTICAL">
                <clabel id="label" style="BORDER | CENTER" text="Hello, Zeta! 4"/>
                <button text="Click!">
                        <bsh func="addSelectionListener">
                                import org.eclipse.swt.events.SelectionListener;
                                import org.eclipse.swt.events.SelectionEvent;
                
                                widgetSelected( e )
                                {
                                        label.setText(e.source.getText () + " Pressed");
                                }
                                widgetDefaultSelected( e )
                                {
                                }
                                return (SelectionListener)this;
                        </bsh>
                </button>
                <!-- calling an external BSH code (identical to the bsh code above) -->
                <!--button text="Button 2">
                        <bsh func="addActionListener" src="examples/cookbsh/action.bsh"/>
                </button-->
        </filllayout>
</shell>
버튼을 클릭하면, Label의 텍스트가 "Click! Pressed"로 변경됩니다.

2.1.3. PropertyCat.xml

자바의 프로퍼티들을 출력하는 간단한 예제.
<shell style="SHELL_TRIM | TOOL" text="PropertyCat" size="320,240">
        <filllayout type="VERTICAL">
                <textarea style="BORDER | MULTI | V_SCROLL | H_SCROLL">
                        <bsh setas="text">
                                String getProperty(){
                                        java.util.Properties p = System.getProperties();
                                        java.util.Enumeration e = System.getProperties().propertyNames();
                                        StringBuilder sb = new StringBuilder();
                                        while(e.hasMoreElements()){
                                                String str = e.nextElement().toString();
                                                sb.append(str);
                                                sb.append(" : ");
                                                sb.append(p.getProperty(str));
                                                sb.append("\n");
                                        }
                                        return sb.toString();
                                }
                                return getProperty();
                        </bsh>
                </textarea>
        </filllayout>
</shell>

2.1.4. GlobalHook.bsh

SWT 내부 클래스를 이용한 윈도우 메시지 훅 예제입니다. W2K 이상에서 동작하며, 실행하면 윈도상에서의 모든 키보드 입력을 확인할 수 있습니다.

import org.eclipse.swt.internal.Callback;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.MSG;

class GlobalHook {
        static Shell s = new Shell(Display.getCurrent());
        static Text t = new Text(s, SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
        static int hHook = 0;
        
        Shell show(){
                s.setText("GlobalHook");
                s.setLayout(new FillLayout());
                s.setSize(500, 500);
                startHook();
                return s;
        }

        static int getMsgProc(int code, int wParam, int lParam) {
                MSG msg = new MSG();
                OS.MoveMemory(msg, lParam, MSG.sizeof);
                t.append(msg.message + "\n");
                
                return OS.CallNextHookEx(hHook, code, wParam, lParam);
        }
        
        void startHook(){
                Callback callback = new Callback(GlobalHook.class, "getMsgProc", 3);
                int address = callback.getAddress();
                int threadId = OS.GetCurrentThreadId();
                hHook = OS.SetWindowsHookEx(13, address, OS.GetLibraryHandle(), 0);
                if (hHook == 0) {
                        callback.dispose();
                        return;
                }
        }
}

new GlobalHook().show();

2.1.5. KLDP_Reader.bsh

[http]informa를 사용한 간단한 RssReader 예제. JRE상에서 구동되는 Zeta/Pure에서는 다음과 같이 외부 패키지를 불러올 수 있습니다.
addClassPath("demo/informa_0.6.5.jar");
addClassPath("demo/commons-logging.jar");
addClassPath("demo/jdom.jar");

import de.nava.informa.core.ChannelIF;
import de.nava.informa.core.ItemIF;
import de.nava.informa.impl.basic.ChannelBuilder;
import de.nava.informa.parsers.FeedParser;

Shell s = new Shell(Display.getCurrent(), SWT.SHELL_TRIM | SWT.TOOL);
s.setText("KLDP Reader");
s.setLayout(new FillLayout(SWT.VERTICAL));

ChannelIF channel = FeedParser.parse(
        new ChannelBuilder(), new URL("http://kldp.org/node/feed"));
Iterator i = channel.getItems().iterator();

Button btn;
while(i.hasNext()){
        ItemIF item = (ItemIF)i.next();
        btn = new Button(s, SWT.PUSH);
        btn.setText(item.getTitle());
        btn.addListener(SWT.Selection, new Listener(){
                URL url = item.getLink();
                public void handleEvent(Event event) {
                        Program.launch(url.toString());
                }
        });
}

s.pack();
s.open();

3. 스크린샷

  • Zeta 0.2와 시험중인 몇가지 모듈들
ZetaScreenshot2.PNG
[PNG image (146.2 KB)]

  • Zeta 0.1에 demo/HelloWorld 1, 2, 3, 4를 띄운 모습
ZetaScreenshot.PNG
[PNG image (67.41 KB)]

ID
Password
Join
You will be honored for contributing your time and skill to a worthy cause.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-09-10 03:17:41
Processing time 0.0140 sec