無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

ERBでソースコード生成

ERBRuby標準添付のテンプレートエンジンです。

  • テンプレートはeRuby(任意の文書にRubyスクリプトを埋め込む書式)で記述します。
  • モデルにはBindingを指定します。テンプレート内では、Bindingに封入されたローカル変数や関数にアクセスできます。
require 'erb'

# モデル
model = {
  :name => "mii",
  :age  => 1
}

# テンプレート
template = <<TEMPLATE
<%= model[:name] %> : <%= model[:age] %>
TEMPLATE

# テンプレートを処理
erb = ERB.new(template, nil, "%" )
puts erb.result(binding) # 引数でバインディングを渡す。
                         # 現在使用可能な変数がテンプレート内でも使用できる。

実行結果です。

mii : 1
ソースコード生成

近辺ではソースコードの自動生成で活躍してます。YAMLと組み合わせると吉です。以下はYAMLファイルの定義からJavaBeanを作成するサンプルです。

# YAML から JavaBeanを作る。

require 'yaml'
require "javautils"
require "fileutils"
require 'erb'

ROOT = './out' # 出力先
BEAN_YAML = './models.yaml' # YAMLの定義ファイル

# erb のテンプレートを作成
erb = ERB.new(IO.read("./bean.erb"), nil, "%" )

# yamlファイルをロード
beans = YAML.load_file( BEAN_YAML );
beans.each { |model|
  out = ROOT + "/" + model['package'].gsub("\.", "/") + "/"
  FileUtils.mkdir_p out
  out = out + JavaUtils.capitalize(model['name']) + ".java"
  File.open( out, "w" ) { |f|
      # 処理
      f.write( erb.result(binding) )
      puts out + " is created."
  }
}

models.yaml:

---
- name: kitten
  package: com.example
  display-name: "猫。"
  fields:
  - &kitten-name
    name: name
    display-name: "名前"
    type: String
    default: "\"\""
  - &kitten-age
    name: age
    display-name: "年齢"
    type: int
    default: "0"
  constructors:
  - args: [*kitten-name, *kitten-age]

出力:

package com.example;

/**
 * 猫。
 *
 * @version $Revision:$
 * @author  $Author:$
 */
public class Kitten {

    /**
     * 名前
     */
    private String name = "";

    /**
     * 年齢
     */
    private int age = 0;

    /**
     * コンストラクタ
     */
    public Kitten (){}

    /**
     * コンストラクタ
     *
     * @param name
     *        名前
     * @param age
     *        年齢
     */
    public Kitten (
        String name,
        int age ) {
        this.name = name;
        this.age = age;
    }

    /**
     * 名前を取得する。
     * @return 名前
     */
    public String getName () {
        return name;
    }
    /**
     * 名前を設定する。
     * @param name 名前
     */
    public void setName ( String name ) {
        this.name = name;
    }

    /**
     * 年齢を取得する。
     * @return 年齢
     */
    public int getAge () {
        return age;
    }
    /**
     * 年齢を設定する。
     * @param age 年齢
     */
    public void setAge ( int age ) {
        this.age = age;
    }

}

javautils.rbとbean.erbは長いのでリンクで。