Archive for the ‘Clojure’ Category

  1. Hello, COM(Clojure) World!

    Posted on 1月 21st, 2013 by cx20

    COM(Clojure)

    COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
    COM を用いて開発された部品であれば言語を問わず利用することができる。
    Clojure 自身には、COM を呼び出す機能を持っていないが、別途ライブラリを経由することで呼び出すことが可能である。
    以下は Clojure より JACOB(JAVA-COM Bridge) ライブラリを使用した COM クライアントの例となっている。

    ソースコード

    (import 
      (com.jacob.com Variant)
      (com.jacob.activeX ActiveXComponent))
     
    (def shell
       (ActiveXComponent. "Shell.Application"))
     
    (def hwnd
       (Variant. 0))
     
    (def title
       (Variant. "Hello, COM(JACOB) World!"))
     
    (def option
       (Variant. 0))
     
    (def rootFolder
       (Variant. 36))
     
    (def params
       (into-array [hwnd title option rootFolder]))
     
    (def folder 
       (.invoke shell "BrowseForFolder" params ))

    実行方法

    C:¥> SET CLASSPATH=jacob.jar;.;%CLASSPATH%
    C:¥> clojure Hello.clj

    実行結果

    +----------------------------------------+
    |Browse For Folder                    [X]|
    +----------------------------------------+
    | Hello, COM(JACOB) Wolrd!               |
    |                                        |
    | +------------------------------------+ |
    | |[Windows]                           | |
    | | +[addins]                          | |
    | | +[AppCompat]                       | |
    | | +[AppPatch]                        | |
    | | +[assembly]                        | |
    | |     :                              | |
    | |     :                              | |
    | |     :                              | |
    | +------------------------------------+ |
    | [Make New Folder]    [  OK  ] [Cancel] |
    +----------------------------------------+
  2. Hello, Win32 API(Clojure) World!

    Posted on 1月 11th, 2013 by cx20

    Win32 API(Clojure)

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

    ソースコード

    (import 
      (org.eclipse.swt.internal.win32 OS)
      (org.eclipse.swt.internal.win32 TCHAR))
     
    (def lpText
      (TCHAR. 0 "Hello, Win32 API World!" true))
     
    (def lpCaption 
      (TCHAR. 0 "Hello, World" true))
     
    (. OS (MessageBox 0 lpText lpCaption OS/MB_OK))

    実行方法

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

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  3. Hello, Java 3D(Clojure) World!

    Posted on 12月 6th, 2012 by cx20

    Java 3D

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

    ソースコード

    (import 
      (java.awt BorderLayout)
      (java.awt GraphicsConfiguration)
      (java.awt Font)
      (javax.swing JFrame)
      (javax.swing JPanel)
      (javax.media.j3d BranchGroup)
      (javax.media.j3d Canvas3D)
      (javax.media.j3d Transform3D)
      (javax.media.j3d Appearance)
      (javax.media.j3d Material)
      (javax.media.j3d Font3D)
      (javax.media.j3d FontExtrusion)
      (javax.media.j3d Text3D)
      (javax.media.j3d Shape3D)
      (javax.media.j3d DirectionalLight)
      (javax.media.j3d TransformGroup)
      (javax.media.j3d RotationInterpolator)
      (javax.media.j3d Alpha)
      (javax.media.j3d BoundingSphere)
      (javax.vecmath Vector3f)
      (javax.vecmath Color3f)
      (com.sun.j3d.utils.universe SimpleUniverse)
      (com.sun.j3d.utils.universe ViewingPlatform)
      (com.sun.j3d.utils.geometry ColorCube))
     
    (def frame
      (JFrame.))
     
    (defn create-text-shape []
      (let [
        textAppear (Appearance.)
        font (Font. "MS Pゴシック" Font/PLAIN 1 )
        fontEx (FontExtrusion.)
        font3D (Font3D. font fontEx)
        textGeom (Text3D. font3D "Hello, Java 3D World!")
        textShape (Shape3D.)]
     
        (.setMaterial textAppear (Material.))
        (.setAlignment textGeom Text3D/ALIGN_CENTER)
        (.setGeometry textShape textGeom)
        (.setAppearance textShape textAppear)
        textShape))
     
    (defn move-text-back []
      (let [
        transform3D (Transform3D.)
        vector3f (Vector3f. 0.0 0.0 -10.0)]
     
        (.setTranslation transform3D vector3f)
        (TransformGroup. transform3D)))
     
    (defn create-spinner []
      (let [
        spinner (TransformGroup.)]
     
        (.setCapability spinner (TransformGroup/ALLOW_TRANSFORM_WRITE))
        spinner))
     
    (defn set-lighting [objMove]
      (let [
        light (DirectionalLight.)]
     
        (.setInfluencingBounds light (BoundingSphere.))
        (.setDirection light (Vector3f. 0.0 0.0 -1.0))
        (.setColor light (Color3f. 1.0 1.0 1.0))
        (.addChild objMove light)))
     
    (defn create-scene-graph []
      (let [
        objRoot (BranchGroup.)
        mover (move-text-back)
        spinner (create-spinner)
        rotator (RotationInterpolator. (Alpha. -1 4000), spinner, (Transform3D.) 0.0 (* (Math/PI) 2))]
     
        (.addChild spinner (create-text-shape))
        (.addChild mover spinner)
        (.addChild objRoot mover)
        (.setSchedulingBounds rotator (BoundingSphere.))
        (.addChild spinner rotator)
        (set-lighting mover)
        objRoot))
     
    (def canvas
      (Canvas3D. (SimpleUniverse/getPreferredConfiguration)))
     
    (def universe
      (SimpleUniverse. canvas))
     
    (doto universe
      (.addBranchGraph (create-scene-graph)))
     
    (.setNominalViewingTransform (.getViewingPlatform universe))
    (.add (.getContentPane frame) canvas)
     
    (doto frame
      (.setDefaultCloseOperation
        javax.swing.WindowConstants/EXIT_ON_CLOSE)
      (.setSize 640 480)
      (.setTitle "Hello, World")
      (.setVisible true))

    実行方法

    C:¥> clj Hello.clj

    実行結果

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

    Posted on 12月 5th, 2012 by cx20

    Java 2D

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

    ソースコード

    (import 
      (javax.swing JFrame)
      (javax.swing JPanel)
      (java.awt Graphics)
      (java.awt Graphics2D))
     
    (defn create-panel []
      (proxy [JPanel] []
        (paintComponent [g]
          (.drawString g "Hello, Java 2D World!" 0 16))))
     
    (def panel
      (create-panel))
     
    (def frame
      (JFrame.))
     
    (doto frame
      (.setDefaultCloseOperation
        javax.swing.WindowConstants/EXIT_ON_CLOSE)
      (.add panel)
      (.setSize 640 480)
      (.setTitle "Hello, World")
      (.setVisible true))

    実行方法

    C:¥> clj Hello.py

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Java 2D World!                     |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  5. Hello, SWT(Clojure) World!

    Posted on 12月 3rd, 2012 by cx20

    SWT(Clojure)

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

    ソースコード

    (import 
      (org.eclipse.swt SWT)
      (org.eclipse.swt.widgets Display)
      (org.eclipse.swt.widgets Shell)
      (org.eclipse.swt.widgets Label)
      (org.eclipse.swt.layout FillLayout)
      (org.eclipse.swt.events ShellAdapter))
     
    (def display
      (Display.))
     
    (def shell
      (Shell. display))
     
    (def layout
      (FillLayout. SWT/VERTICAL))
     
    (def label
      (Label. shell SWT/BORDER))
     
    (doto label
      (.setText "Hello, SWT World!"))
     
    (doto shell
      (.setText "Hello, World")
      (.setLayout layout)
      (.setSize 640 480)
      (.addShellListener
        (proxy [ShellAdapter] []
          (shellClosed [evt]
            (System/exit 0))))
      (.open))
     
    (defn while-loop [display shell]
      (loop []
        (if (.isDisposed shell)
          (.dispose display)
          (do
            (if (not (.readAndDispatch display))
              (.sleep display))
            (recur)))))
     
    (while-loop display shell))

    実行方法

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

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, SWT World!                         |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  6. Hello, Swing(Clojure) World!

    Posted on 12月 2nd, 2012 by cx20

    Swing(Clojure)

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

    ソースコード

    (import (javax.swing JFrame)
            (javax.swing JLabel))
     
    (def frame
      (JFrame.))
     
    (def label
      (JLabel. "Hello, Swing World!"))
     
    (doto label
      (.setVerticalAlignment JLabel/TOP))
     
    (doto frame
      (.setDefaultCloseOperation
        javax.swing.WindowConstants/EXIT_ON_CLOSE)
      (.add label)
      (.setSize 640 480)
      (.setTitle "Hello, World")
      (.setResizable false)
      (.setVisible true))

    実行方法

    C:¥> clj Hello.clj

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, Swing World!                       |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  7. Hello, AWT(Clojure) World!

    Posted on 12月 1st, 2012 by cx20

    AWT(Clojure)

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

    ソースコード

    (import (java.awt Frame)
            (java.awt Label)
            (java.awt FlowLayout)
            (java.awt.event WindowAdapter))
     
    (def frame
      (Frame.))
     
    (def layout
      (FlowLayout. FlowLayout/LEFT))
     
    (def label
      (Label. "Hello, Swing World!"))
     
    (doto frame
      (.addWindowListener 
        (proxy [WindowAdapter] [] 
          (windowClosing [e] 
            (System/exit 0))))
      (.setLayout layout)
      (.add label)
      (.setSize 640 480)
      (.setTitle "Hello, World")
      (.setResizable false)
      (.setVisible true))

    実行方法

    C:¥> clj Hello.clj

    実行結果

    +------------------------------------------+
    |Hello, World!                    [_][~][X]|
    +------------------------------------------+
    |Hello, AWT World!                         |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    |                                          |
    +------------------------------------------+
  8. Hello, JDBC Type4(Clojure) World!

    Posted on 10月 15th, 2012 by cx20

    JDBC Type4

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

    ソースコード(Clojure + JDBC Type4 + SQL Server)

    (import '(java.sql DriverManager))
     
    (class com.microsoft.sqlserver.jdbc.SQLServerDriver)
    (def conn (. DriverManager (getConnection "jdbc:sqlserver://;serverName=localhost" "sa" "P@ssW0rd")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type4 World' AS Message"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    実行方法(Clojure + JDBC Type4 + SQL Server)

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

    ソースコード(Clojure + JDBC Type4 + Oracle)

    (import '(java.sql DriverManager))
     
    (class oracle.jdbc.driver.OracleDriver)
    (def conn (. DriverManager (getConnection "jdbc:oracle:thin:@localhost:1521:orcl" "scott" "tiger")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type4 World' AS Message"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    実行方法(Clojure + JDBC Type4 + Oracle)

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

    ソースコード(Clojure + JDBC Type4 + MySQL)

    (import '(java.sql DriverManager))
     
    (class com.mysql.jdbc.Driver)
    (def conn (. DriverManager (getConnection "jdbc:mysql://localhost:3306" "root" "P@ssW0rd")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type4 World' AS Message"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    実行方法(Clojure + JDBC Type4 + MySQL)

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

    実行結果

    Hello, JDBC Type4 World!
  9. Hello, JDBC Type2(Clojure) World!

    Posted on 10月 14th, 2012 by cx20

    JDBC Type2

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

    ソースコード(Jython + JDBC Type2 + Oracle)

    (import '(java.sql DriverManager))
     
    (class oracle.jdbc.driver.OracleDriver)
    (def conn (. DriverManager (getConnection "jdbc:oracle:oci:@orcl" "scott" "tiger")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type2 World' AS Message FROM DUAL"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    実行方法

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

    実行結果

    Hello, JDBC Type2 World!
  10. Hello, JDBC Type1(Clojure) World!

    Posted on 10月 13th, 2012 by cx20

    JDBC Type1

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

    ソースコード(Clojure + JDBC Type1 + ODBC + Jet データベース)

    (import '(java.sql DriverManager))
     
    (class sun.jdbc.odbc.JdbcOdbcDriver)
    (def conn (. DriverManager (getConnection "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=.\hello.mdb")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type1 World' AS Message"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    ソースコード(Clojure + JDBC Type1 + ODBC + ACE データベース)

    (import '(java.sql DriverManager))
     
    (class sun.jdbc.odbc.JdbcOdbcDriver)
    (def conn (. DriverManager (getConnection "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type1 World' AS Message"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    ソースコード(Clojure + JDBC Type1 + ODBC + SQL Server)

    (import '(java.sql DriverManager))
     
    (class sun.jdbc.odbc.JdbcOdbcDriver)
    (def conn (. DriverManager (getConnection "jdbc:odbc:Driver={SQL Server};SERVER=(local)" "sa" "P@ssW0rd")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type1 World' AS Message"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    ソースコード(Clojure + JDBC Type1 + ODBC + Oracle)

    (import '(java.sql DriverManager))
     
    (class sun.jdbc.odbc.JdbcOdbcDriver)
    (def conn (. DriverManager (getConnection "jdbc:odbc:Driver={Oracle in OraDb11g_home1};DBQ=ORCL" "scott" "tiger")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type1 World' AS Message FROM DUAL"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    ソースコード(Clojure + JDBC Type1 + ODBC + MySQL)

    (import '(java.sql DriverManager))
     
    (class sun.jdbc.odbc.JdbcOdbcDriver)
    (def conn (. DriverManager (getConnection "jdbc:odbc:Driver={MySQL ODBC 5.1 Driver};Server=localhost" "root" "P@ssW0rd")))
    (def stmt (.createStatement conn))
    (def rs (.executeQuery stmt "SELECT 'Hello, JDBC Type1 World' AS Message"))
    (if (.next rs)
        (do
            (println (.getString rs 1))
        )
    )
     
    (.close rs)
    (.close stmt)
    (.close conn)

    実行方法

    C:¥> clj Hello.clj

    実行結果

    Hello, JDBC Type1 World!