「オープンソース – 拡張ライブラリ」カテゴリーアーカイブ

コンテナからコントロールの検索

コンテナからコントロールの検索

あるコンテナ上からその下にあるコントロール(TextField, TextArea, ComboBoxなど)やコンテナ(Frame, Canvas, VBox, HBoxなど)を検索することができます。

 

       def root =
            {Frame
                {VBox
                    {TextField name=”name1″, value=”value1″},
                    {TextField name=”name2″, value=”value2″},
                    {Frame
                        {VBox
                            {TextField name=”name3″},
                            {TextArea name=”name4″, value=”value4″},
                            {TextField value=”value5″}
                        }
                    }
                }
            }

        {walk-graphics
 
           || 第1引数: 検索対象のコンテナ
            root,
            || 第2引数: Graphic(コンテナやコントロール)ごとに、以下のプロシージャが実行される
            ||        以下のサンプルでは、GraphicがValueControlの場合に、valueをコンソールに表示している例
            {fn g =>
                {if g isa ValueControl then
                    def v = g asa ValueControl
                    {dump v.name, v.value-as-any}
                }
            }
        }

 

データクラスとコントロール間での値セット

データクラスから各コントロールに一度に値をセットすることができます。これにはset-values-to-contorlsプロシージャを利用します。下記の例では、Fooクラスから、フィールド名がコントロールのnameが一致するものへ値をセットしています。

set-values-to-controlsのset-value-proc引数は、nameが一致しない場合や、コントロールのvalueとデータクラスのフィールドの型が一致しない場合に、変換ロジックを記載できるものです。

        def tf1 = {TextField name=”tf-1″}
        def tf2 = {TextField name=”tf-2″}
        def tf3 = {TextField name=”tf-3″}
        def tf4 = {TextField}
        def tf5 = {TextField name=”no-name”}
        def tf6 = {TextField name=”tf-1″}

        def td = {TextDisplay name=”td”}
        def df = {DateField name=”df”}
        def cb = {CommandButton name=”cb”}
       
        def root-graphic =
            {VBox
                {HBox tf1, tf2, tf3}, {HBox td, tf4, tf5, tf6}, df, cb
            }
        || set values of graphic
        {set-values-to-controls
            {Foo},
            root-graphic,
            set-value-proc =
                {fn v, p, c =>
                    {if p.name == c.name then
                        {if-non-null value = {p.get-value v} then
                            set c.value-as-any =
                                {if p.type == int and c.value-type == String then
                                    (value * 3) & “”
                                 else
                                    value
                                }
                        }
                    }
                }
        }

逆に、Fooオブジェクトからコントロールへ値をセットするには、set-values-from-controlsを使用します。

パッケージ名:COM.CURLAP.LIB.UI

数学関数

数学関数のAPIです

以下は最大公約数、最小公倍数のサンプルです。

        def (a,b,c) = (3,12,24)
        {gcd a,b,c} == 3

        def (a,b,c) = (2,3,12)
        {lcm a,b,c} == 12

パッケージ名:COM.CURLAP.LIB.MATH

都道府県ユーティリティ

都道府県ユーティリティ

都道府県の操作ができるユーティリティです。以下はサンプルとなります。

 

{get-japanese-prefecture-from-prefecture-code “40”}.name || “福岡県”

{get-japanese-prefecture-from-prefecture-code “40”}.capital-city || “福岡市”

{get-japanese-name-from-prefecture-code “40”} || “福岡県”

{get-japanese-prefectures-from-area “九州”}.size || 8

 

パッケージ名:COM.CURLAP.LIB.JAPAN

 

郵便番号ユーティリティ

郵便番号を操作するユーティリティ

これを利用するには、日本郵便のページから郵便番号CSVをダウンロードして利用します。from-csvでダウンロードしたCSVデータを取り込みます。

 

def pcs = {PostalCodes.from-csv
                     {url “file/postal-data/13TOKYO.CSV”},
                     {url “file/postal-data/09TOCHIG.CSV”}
              }
|| 検索
pc = {pcs.search-by-postal-code “1000004”}

 

パッケージ名:COM.CURLAP.LIB.JAPAN

オブジェクトの保存・読み込み

オブジェクトの保存・読み込み

オブジェクトをファイルに保存することができます。また、もとに戻すこともできます。

 

        let src:#HashTable = {HashTable “key1”, 10, “key2”, 20, “key3”, {DateTime}}
        def obj-url = {url “file/obj.bin”}

        || 保存
        {save-object-to-url obj-url, src}

        || 読み込み
        def dst = {read-object-from-url obj-url} asa HashTable

 

パッケージ名:COM.CURLAP.LIB.IO

 

RecordSetのファイル保存・読み込み

RecordSetのファイル保存・読み込み

RecordSetをファイルに保存、また、そのデータを読み込みすることができます。

        def record = {RecordSet
                         {RecordFields
                             {RecordField “c1”, domain = int, index-type = RecordFieldIndexType.unique},
                             {RecordField “c2”, domain = String},
                             {RecordField “c3”, domain = DateTime}
                         },
                         {RecordData c1 = 1, c2 = “v1”, c3 = {DateTime}},
                         {RecordData c1 = 2, c2 = “v2”, c3 = {DateTime}},
                         {RecordData c1 = 3, c2 = “v3”, c3 = {DateTime}},
                         {RecordData c1 = 4, c2 = “v4”, c3 = {DateTime}},
                         {RecordData c1 = 5, c2 = “v5”, c3 = {DateTime}}
                     }
        def path = “file/record.bin”
        {save-record-set-to-url {url path}, record}
        def restore = {read-record-set-from-url {url path}}

パッケージ名:COM.CURLAP.LIB.IO

 

 

ディレクトリ・ファイル検索ユーティリティ

DirectoryUtil

ディレクトリやファイルの検索を簡単にできる便利ツールです。

        || search by name
        def r1 =
            {DirectoryUtil.search-by-name
                {url “file”}, || directory
                “a-1.txt”,
                recurse? = true
            }
        
        || search by proc
        def r2 =
            {DirectoryUtil.search
                {url “file”}, || directory
                {proc {u:Url}:bool
                    def name = u.filename
                    {return name == “c-1.txt” or name == “test1”}
                },
                recurse? = true
            }

 

パッケージ名:COM.CURLAP.LIB.IO

簡単RecordSet定義

create-tableマクロ

CurlのRecordSetを定義するには、長いコードを記述しなければなりません。そこで、簡単に、かつSQLのCREATE TABLE文に似た構文でRecordSetを定義することができるマクロを用意しています。

    def rs = {create-table
                     col1 String   not null,
                     col2 int,
                     col3 DateTime NOT NULL,
                     col4 {StandardStringDomain},
                     col5 ,        || any
                     col6 not null || any
                 }

これは以下のものに相当します。

        def rs = {RecordSet
                        {RecordFields
                             {RecordField “col1” domain = String, nullable? = false},
                             {RecordField “col2” domain = int},
                             {RecordField “col3”, domain = DateTime, nullable? = false},
                             {RecordField “col4”, domain = {StandardStringDomain},
                             {RecordField “col5”},        || any
                             {RecordField “col6”, nullable? = false} || any
                        }
                 }

パッケージ名:COM.CURLAP.LIB.DATA-ACCESS

暗号・複合化ユーティリティ

メッセージダイジェスト

メッセージダイジェスト(SHA-1, MD5)を利用できます。以下のようにsha-1もしくはmd5プロシージャを実行することで、暗号化された文字列を取得できます。

def str = {sha-1 “abcd1234”}
def str = {md5 “abcd1234”}

またバージョン0.7から、SHA-1については、HMACにも対応しています。これにはhmac-sha-1プロシージャを利用してください。

将来的に、SHA-256,SHA-512などにも対応していく予定です。

秘密鍵暗号

秘密鍵暗号(トリプルDES、RC2、RC4)を利用できます。encrypt-with-common-keyで暗号化でき、decrypt-with-common-keyで複合化できます。

|| 暗号化
{encrypt-with-common-key
   
 ”key1234″, || かぎ
      “this is a text.”, || メッセージ
       {write-open-byte {url secret-file}} || OutputStream(書き出し先)
}   

|| 複合化
def result =
    {decrypt-with-common-key
       “key1234”, || かぎ
      {read-open-byte {url secret-file}} || InputStream 読み込み元
    }

パッケージ名:COM.CURLAP.LIB.CRYPTO

 

 

 

 

 

16進数ユーティリティ

hex-encode / hex-decode

これは、16進数のバイト列から文字列へエンコード、文字列から16進数のバイト列にデコードするユーティリティです。 

        {hex-encode {ByteVec 11, 7, 10}}   || == “0b070a”
        {hex-encode {ByteVec 255, 7, 10}} || == “ff070a”
        
        def b = {hex-decode “0b070a”}
        || b[0] == 11
        || b[1] == 7
        || b[2] == 10

パッケージ名:COM.CURLAP.LIB.CODEC

 

ボタンの2度押し防止

with-busy-viewマクロ

CommandButtonの2度押し防止をするためのマクロです。以下のサンプルのようにvというView内で、with-busy-view内に記述された処理が実行されている間は、CommandButtonがdisableとなり、押下することができません。

let v:View = …..
{with-busy-view v do
    {for i:int = 0 below 100000 do
        {output “押せない!!”}
    }
}

 パッケージ名:COM.CURLAP.LIB.UI

 

 

 

プロパティ(properties)ファイルの利用

Propertiesクラス

javaのpropertiesファイル形式を取り扱うためのクラスです。

hello.english=abcde
hello.test1=
hello.test2=jdbc.abc%s %d
hello.test3=jdbc.abc%s %d

 

def props = {Properties}
{props.load {read-open {url “file/properties/resource_ja.properties”}}}
props.size ||== 4
props[“hello.english”] ||== “abcde”

パッケージ名:COM.CURLAP.LIB.UTIL

経過時間の計測

stop-watchマクロ

stop-watchマクロを利用することで、stop-watchマクロ内のブロックのある処理からある処理までの実行速度を計測することができます。

           {stop-watch
                finish-proc =
                    {proc {elapsed-time:Time}:void
                        {output “elapsed time=” & elapsed-time}
                    }
             do
                {for i = 0 below 100000 do
                    {output “i = ” & i}
                }
            }

            || もしくはfinish-procを省略
            {stop-watch do
                {for i = 0 below 100000 do
                    {output “i = ” & i}
                }
            }
        }

上記結果は、「elapsed time=10s」のように出力されます。また、finish-procを省略できます。省略した場合は、実行時間のみコンソールに表示されます。

パッケージ名:COM.CURLAP.LIB.UTIL