Archive for the ‘Tcl/Java’ Category

  1. Hello, Win32 API(Tcl/Java) World!

    Posted on 1月 13th, 2013 by cx20

    Win32 API(Tcl/Java)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は Tcl/Java にて SWT の非公開 API を使用した Win32 API 呼出しの例となっている。

    ソースコード

    package require java
     
    java::import org.eclipse.swt.internal.win32.OS
    java::import org.eclipse.swt.internal.win32.TCHAR
     
    set lpText [java::new {TCHAR int java.lang.String boolean} 0 "Hello, Win32 API World!" true]
    set lpCaption [java::new {TCHAR int java.lang.String boolean} 0 "Hello, World" true]
    java::call OS MessageBox 0 $lpText $lpCaption [java::field OS MB_OK]

    実行方法

    C:¥> SET CLASSPATH=org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar;%CLASSPATH%
    C:¥> jaclsh Hello.tcl

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  2. Hello, Java 3D(Tcl/Java) World!

    Posted on 12月 18th, 2012 by cx20

    Java 3D(Tcl/Java)

    Java 3D は Java による 3D グラフィックライブラリである。
    以下は Tcl/Java による Java 3D の使用例となっている。

    ソースコード

    package require java
     
    java::import java.awt.BorderLayout
    java::import java.awt.GraphicsConfiguration
    java::import java.awt.Font
    java::import javax.media.j3d.Canvas3D
    java::import javax.media.j3d.BranchGroup
    java::import javax.media.j3d.Transform3D
    java::import javax.media.j3d.TransformGroup
    java::import javax.media.j3d.Appearance
    java::import javax.media.j3d.Material
    java::import javax.media.j3d.Font3D
    java::import javax.media.j3d.FontExtrusion
    java::import javax.media.j3d.Text3D
    java::import javax.media.j3d.Shape3D
    java::import javax.media.j3d.DirectionalLight
    java::import javax.media.j3d.RotationInterpolator
    java::import javax.media.j3d.Alpha
    java::import javax.media.j3d.BoundingSphere
    java::import javax.swing.JFrame
    java::import javax.vecmath.Vector3f
    java::import javax.vecmath.Color3f
    java::import com.sun.j3d.utils.universe.SimpleUniverse
     
    proc createCanvas3D { frame } {
        $frame setLayout [java::new BorderLayout]
        set config [java::call SimpleUniverse getPreferredConfiguration]
        set canvas3D [java::new Canvas3D $config]
        $frame add $canvas3D
        return $canvas3D
    }
     
    proc createSceneGraph {} {
        set objRoot [java::new BranchGroup]
        set mover [moveTextBack]
        set spinner [createSpinner]
        set rotator [java::new RotationInterpolator [java::new Alpha -1 4000] $spinner [java::new Transform3D] 0.0  [expr [java::field Math PI] * 2]]
        $rotator setSchedulingBounds [java::new BoundingSphere]
        $spinner addChild $rotator
        $objRoot addChild $mover
        $mover addChild $spinner
        $spinner addChild [createTextShape]
        setLighting $mover
        return $objRoot
    }
     
    proc createSpinner {} {
        set spinner [java::new TransformGroup]
        $spinner setCapability [java::field TransformGroup ALLOW_TRANSFORM_WRITE]
        return $spinner
    }
     
    proc moveTextBack {} {
        set transform3D [java::new Transform3D]
        $transform3D setTranslation [java::new Vector3f 0.0 0.0 -10.0]
        return [java::new TransformGroup $transform3D]
    }
     
    proc createTextShape {} {
        set textAppear [java::new Appearance]
        $textAppear setMaterial [java::new Material]
        set font3D [java::new Font3D [java::new Font "MS Pゴシック" [java::field Font PLAIN] 1] [java::new FontExtrusion]]
        set textGeom [java::new Text3D $font3D [java::new String "Hello, Java 3D World!"]]
        $textGeom setAlignment [java::field Text3D ALIGN_CENTER]
        set textShape [java::new Shape3D]
        $textShape setGeometry $textGeom
        $textShape setAppearance $textAppear
        return $textShape
    }
     
    proc setLighting { objMove } {
        set light [java::new DirectionalLight]
        $light setInfluencingBounds [java::new BoundingSphere]
        $light setDirection [java::new Vector3f 0.0 0.0 -1.0]
        $light setColor [java::new Color3f 1.0 1.0 1.0]
        $objMove addChild $light
    }
     
    proc connect { canvas3D scene } {
        set universe [java::new SimpleUniverse $canvas3D]
        set view [$universe getViewingPlatform]
        [$universe getViewingPlatform] setNominalViewingTransform
        $universe addBranchGraph $scene
    }
     
    set frame [java::new JFrame] 
    $frame setDefaultCloseOperation [java::field JFrame EXIT_ON_CLOSE]
    $frame setTitle "Hello, World"
    $frame setSize 640 480
    set canvas3D [createCanvas3D $frame]
    set scene [createSceneGraph]
    connect $canvas3D $scene
    $frame setVisible true
     
    vwait done

    実行方法

    C:¥> jaclsh hello.tcl

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Java 3D World!                     |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  3. Hello, Java 2D(Tcl/Java) World!

    Posted on 12月 17th, 2012 by cx20

    Java 2D(Tcl/Java)

    Java 2D は Java による 2D グラフィックライブラリである。
    以下は Tcl/Java による Java 2D の使用例となっている。

    ソースコード

    package require java
     
    java::import javax.swing.JFrame
    java::import java.awt.Canvas
    java::import java.awt.Graphics
    java::import java.awt.Graphics2D
     
    set frame [java::new JFrame] 
    $frame setDefaultCloseOperation [java::field JFrame EXIT_ON_CLOSE]
    $frame setTitle "Hello, World"
    $frame setSize 640 480
    set canvas [java::new Canvas]
    $frame add $canvas
    $frame setVisible true
     
    $canvas createBufferStrategy 2
    set strategy [$canvas getBufferStrategy]
    set g [$strategy getDrawGraphics]
    while { true } {
        $g {drawString java.lang.String int int} "Hello, Java 2D World!" 0 16
        $strategy show
    }
     
    vwait done

    コンパイル&実行方法

    C:¥> jaclsh hello.tcl

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Java 2D World!                     |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  4. Hello, SWT(Tcl/Java) World!

    Posted on 12月 15th, 2012 by cx20

    SWT(Tcl/Java)

    SWT(Standard Widget Toolkit) は Java で GUI を扱うためのライブラリである。
    IBM により AWT や Swing を置き換える目的で作成された。
    以下は Tcl/Java による SWT の使用例となっている。

    ソースコード

    package require java
     
    java::import org.eclipse.swt.SWT
    java::import org.eclipse.swt.widgets.Display
    java::import org.eclipse.swt.widgets.Shell
    java::import org.eclipse.swt.widgets.Label
    java::import org.eclipse.swt.layout.FillLayout
     
    set display [java::new Display]
    set shell [java::new Shell $display]
    $shell setText "Hello, World"
     
    set layout [java::new FillLayout [java::field SWT VERTICAL]]
    $shell setLayout $layout
     
    set label [java::new Label $shell [java::field SWT BORDER]]
    $label setText "Hello, SWT World!"
     
    $shell setSize 640 480
    $shell open
     
    while { ![$shell isDisposed] } {
        if { ![$display readAndDispatch] } {
            $display sleep
        }
    }
     
    $display dispose

    実行方法

    C:¥> SET CLASSPATH=bsh-2.0b4.jar;org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar;%CLASSPATH%
    C:¥> jaclsh hello.bsh

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, SWT World!                         |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  5. Hello, Swing(Tcl/Java) World!

    Posted on 12月 14th, 2012 by cx20

    Swing(Tcl/Java)

    Swing は AWT(Abstract Window Toolkit) を拡張したものであり Java で GUI を扱うためのライブラリである。
    J2SE 1.2 以降は AWT よりも Swing が使われることが多くなっている。
    以下は Tcl/Java による Swing の使用例となっている。

    ソースコード

    package require java
     
    java::import javax.swing.JFrame
    java::import javax.swing.JLabel
     
    set frame [java::new JFrame] 
    $frame setDefaultCloseOperation [java::field JFrame EXIT_ON_CLOSE]
    $frame setTitle "Hello, World"
    $frame setSize 640 480
    set label [java::new JLabel "Hello, Swing World!"] 
    $label setVerticalAlignment [java::field JLabel TOP]
    $frame add $label
    $frame setVisible true
     
    vwait done

    実行方法

    C:¥> jaclsh Hello.tcl

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Swing World!                       |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  6. Hello, AWT(Tcl/Java) World!

    Posted on 12月 13th, 2012 by cx20

    AWT(Tcl/Java)

    AWT(Abstract Window Toolkit) は Java で GUI を扱うためのライブラリである。
    J2SE 1.2 以降は AWT を拡張した Swing が使われることが多くなっている。
    以下は Tcl/Java による AWT の使用例となっている。

    ソースコード

    package require java
     
    java::import java.awt.Frame
    java::import java.awt.Label
    java::import java.awt.FlowLayout
     
    set frame [java::new Frame] 
    java::bind $frame windowClosing exit
    $frame setTitle "Hello, World"
    $frame setSize 640 480
    $frame setLayout [java::new FlowLayout [java::field FlowLayout LEFT]]
    set label [java::new Label "Hello, AWT World!"] 
    $frame add $label
    $frame setVisible true
     
    vwait done

    実行方法

    C:¥> jaclsh hello.tcl

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, AWT World!                         |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  7. Hello, JDBC Type4(Tcl/Java) World!

    Posted on 10月 21st, 2012 by cx20

    JDBC Type4

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type4 は DBMS のクライアントライブラリを使用しない Pure Java の DBMS ドライバである。
    以下は Tcl/Java による JDBC ライブラリの使用例となっている。

    ソースコード(Tcl/Java + JDBC Type4 + SQL Server)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    set conn [java::call DriverManager getConnection "jdbc:sqlserver://;serverName=localhost" "sa" "P@ssW0rd"]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type4 World!' AS Message"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    実行方法(Tcl/Java + JDBC Type4 + SQL Server)

    C:¥> SET CLASSPATH=sqljdbc4.jar;%CLASSPATH%
    C:¥> jaclsh Hello.tcl

    ソースコード(Tcl/Java + JDBC Type4 + Oracle)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "oracle.jdbc.driver.OracleDriver"
    set conn [java::call DriverManager getConnection "jdbc:oracle:thin:@localhost:1521:orcl" "scott" "tiger"]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type4 World!' AS Message FROM DUAL"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    実行方法(Tcl/Java + JDBC Type4 + Oracle)

    C:¥> SET CLASSPATH=ojdbc6.jar;%CLASSPATH%
    C:¥> jaclsh Hello.tcl

    ソースコード(Tcl/Java + JDBC Type4 + MySQL)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "com.mysql.jdbc.Driver"
    set conn [java::call DriverManager getConnection "jdbc:mysql://localhost:3306" "root" "P@ssW0rd"]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type4 World!' AS Message"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    実行方法(Tcl/Java + JDBC Type4 + MySQL)

    C:¥> SET CLASSPATH=mysql-connector-java-5.1.22-bin.jar;%CLASSPAH%
    C:¥> jaclsh Hello.tcl

    実行結果

    Hello, JDBC Type4 World!
  8. Hello, JDBC Type2(Tcl/Java) World!

    Posted on 10月 20th, 2012 by cx20

    JDBC Type2

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type2 は JDBC と DBMS クライアントの API をマップさせたブリッジドライバである。
    例えば、Oracle であればクライアントライブラリとして OCI が使用される。
    以下は Tcl/Java による JDBC ライブラリの使用例となっている。

    ソースコード(Tcl/Java + JDBC Type2 + Oracle)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "oracle.jdbc.driver.OracleDriver"
    set conn [java::call DriverManager getConnection "jdbc:oracle:oci:@orcl" "scott" "tiger"]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type4 World!' AS Message FROM DUAL"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    実行方法

    C:¥> SET CLASSPATH=ojdbc6.jar;%CLASSPATH%
    C:¥> jaclsh Hello.tcl

    実行結果

    Hello, JDBC Type2 World!
  9. Hello, JDBC Type1(Tcl/Java) World!

    Posted on 10月 19th, 2012 by cx20

    JDBC Type1

    JDBC(Java Database Connectivity)は、Java 用のデータベース接続 API である。実装方法によりType1~4の4つのタイプが存在する。
    Type1 は JDBC と ODBC の API をマップさせたブリッジドライバである。
    以下は Tcl/Java による JDBC ライブラリの使用例となっている。

    ソースコード(Tcl/Java + JDBC Type1 + ODBC + Jet データベース)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "sun.jdbc.odbc.JdbcOdbcDriver"
    set conn [java::call DriverManager getConnection "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=.\hello.mdb" "" ""]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type1 World!' AS Message"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    ソースコード(Tcl/Java + JDBC Type1 + ODBC + ACE データベース)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "sun.jdbc.odbc.JdbcOdbcDriver"
    set conn [java::call DriverManager getConnection "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb" "" ""]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type1 World!' AS Message"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    ソースコード(Tcl/Java + JDBC Type1 + ODBC + SQL Server)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "sun.jdbc.odbc.JdbcOdbcDriver"
    set conn [java::call DriverManager getConnection "jdbc:odbc:Driver={SQL Server};SERVER=(local)" "sa" "P@ssW0rd"]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type1 World!' AS Message"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    ソースコード(Tcl/Java + JDBC Type1 + ODBC + Oracle)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "sun.jdbc.odbc.JdbcOdbcDriver"
    set conn [java::call DriverManager getConnection "jdbc:odbc:Driver={Oracle in OraDb11g_home1};DBQ=ORCL" "scott" "tiger"]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type1 World!' AS Message FROM DUAL"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    ソースコード(Tcl/Java + JDBC Type1 + ODBC + MySQL)

    package require java
    java::import -package java.sql DriverManager
    java::call Class forName "sun.jdbc.odbc.JdbcOdbcDriver"
    set conn [java::call DriverManager getConnection "bc:odbc:Driver={MySQL ODBC 5.1 Driver};Server=localhost" "root" "P@ssW0rd"]
    set stmt [$conn createStatement]
    set rs [$stmt executeQuery "SELECT 'Hello, JDBC Type1 World!' AS Message"]
    while { [$rs next] } {
        puts [$rs {getString int} 1]
    }
    $rs close
    $stmt close
    $conn close

    実行方法

    C:¥> jaclsh Hello.tcl

    実行結果

    Hello, JDBC Type1 World!
  10. Hello, Tcl/Java World!

    Posted on 1月 16th, 2012 by cx20

    Tcl/Java

    Tcl/Java は Java から Tcl コマンドを利用できる「Jacl( Java Command Language)」と、Tcl スクリプトから Java ライブラリが使用できる拡張ライブラリ「Tcl Blend」からなるプロジェクトである。
    なお、Java ライブラリが使用できるスクリプト言語としては他に Groovy、JRuby、Jython などがある。

    ソースコード

    #!/usr/bin/env jaclsh
    puts "Hello, Tcl/Java World!"

    ソースコード(Java ライブラリを使用)

    #!/usr/bin/env jaclsh
    package require java
    [java::field System out] println "Hello, Tcl/Java World!"

    実行方法(スクリプトファイルを指定して実行)

    $ jaclsh hello.tcl

    実行方法(実行権限を付与して実行)

    $ chmod +x hello.tcl
    $ ./hello.tcl

    実行結果

    Hello, Tcl/Java World!