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

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

Scala

クラスを取得する。

Scalaにはクラスリテラルはありませんが、代わりに組み込み関数「classOf[]」を使って指定した型のjava.lang.Classを取得できます。 println( classOf[String] ) println( classOf[List[Object]] ) println( classOf[List[String]] ) 実行結果です。 class j…

性能計測ユーティリティ

だいぶ前にScalaで書いた性能計測ユーティリティを発掘しました。ScalaなのでJavaクラスの性能計測で使えます。以下はサンプル。 // 関数を5回実行して、処理時間の平均・最大・最小を出力する。 print( Perf.perf( "test", 5 ) { Thread.sleep(500); }.toSt…

Compound Types

<継承元の型> { <追加の定義...> }で、継承元の型に合致し、さらに追加の定義を持つ型を作成?できます。例えば // Cat派生でかつmeowメソッドを持つ何かを引数として受け付ける関数 def meow( foo: Cat { def meow:Unit } ) = { foo.meow } みたいなCompound…

@serializable

アノテーションを使ってシリアライザブルであることを明示できます。 // アノテーションを使ってシリアライザブルであることを明示 @serializable class Foo {} // ↑は↓と同じ class Var extends java.io.Serializable {} // 確認 println( "Foo: " + new Fo…

関数を連結する

Function#chainで複数の関数を連結して、1つの関数にできます。 // 連結する関数の配列 var fs = Array( (i:Int)=>i+2, (i:Int)=>i*3, (i:Int)=>i-2) // 連結した関数を実行。 println( Function.chain(fs)(4) ) 実行結果です。 16

配列に指定の要素が含まれているか評価する

existsが簡単。 val array = Array("a", "b", "c") if ( array.exists( i=> "a".equals(i) ) ) println( "exist" ) else println( "not exist" ) findして、isEmptyで評価するとか。 if ( array.find( i=> "a".equals(i) ).isEmpty ) println( "not exist" )…

任意の長さの文字列を返す式をさくっと作成したい。

Scala でも「*」が使えます! println( "a"*20 ) 実行結果です。 aaaaaaaaaaaaaaaaaaaa

Int配列中の最大、最小、平均を得る

こんな感じで書いてみた。 var datas = Array(9,3,5,7) // 最大 println( "max:" + datas.reduceLeft( (max,i) => i max max ) ) // 最小 println( "min:" + datas.reduceLeft( (min,i) => i min min ) ) // 平均 println( "avg:" + datas.reduceLeft( (sum,…

By-Name ParametersでJavaライクなsynchronizedを作る

「By-Name Parameters」を使うと、 foo { println("aaaa") } みたいな感じで呼び出せる関数を作成できます。関数fooの定義は以下のような感じ。 def foo[R]( proc: => R ):R = { try { println("before...") proc // 引数のprocを評価して実行 } finally { p…

NodeSeq#\

NodeSeq#\、NodeSeq#\\で遊んでみた。 // XML リテラル var xml:scala.xml.Elem = <kittens type="animal" xmlns="http://kittens.com" xmlns:t="http://tigers.com"> <kitten age="1">mii</kitten> <t:tiger age="2">tora</t:tiger> <kitten age="3">shiro</kitten> <foo> <kitten age="3">kuro</kitten> </foo> </kittens> // ルート直下のk…

XMLリテラル

XMLリテラルとかあります。 // XML リテラル var xml:scala.xml.Elem = <kittens xmlns="http://kittens.com"> <kitten>mii</kitten> <kitten>tora</kitten> <kitten>shiro</kitten> </kittens> // kittens/kitten要素を探してきてそのテキストを表示する。 // -filterのところは「Node.xmlType」を使うのがよさげ。 // -「Node.\」でもっとシンプルにかけそう。…

Prefix Operations

クラスやTraitに、 def unary_<演算子(- or + or ! or ~)> = ... のようなメソッドを定義しておくと、 <演算子> <レシーバ> の形式でメソッドを呼び出すことができます。 // テスト用クラス class Foo( value:Int ) { override def toString = value.toStrin…

sbazでパッケージをインストールする

最近気付いたのだけど、scalaの世界にも「Scala Bazaars」というパッケージ管理の仕組み(rubyのRubyGems的なモノ)があります。「sbaz」というツールが提供されていて、これを使ってパッケージの追加/削除が可能。基本的な使い方は次の通りです。 # インスト…

Scala+SpecsでMavenなJavaプロジェクトのテストを書く

Specsは、Scalaで使えるBDDなテスティングフレームワークです。JUnit4アダプタが提供されており、Mavenに組み込んで使うことが可能!ということで、MavenなJavaプロジェクトのテストをScala+Specsで書く手順をまとめてみます。 といっても基本的には、 pom.xm…

Mavenでscaladocを作る

maven-scala-pluginでは、scaladocの作成もサポートされています。手順は次の通り。 pom.xmlの「reporting」にmaven-scala-pluginの設定を書く 「mvn scala:doc」! 1.pom.xmlにmaven-scala-pluginの設定を書く。 pom.xmlの「project/reporting」に以下の設定…

複数行文字列リテラル

"""<文字列>""" で改行を含む文字列リテラルとなります。 // 改行を含む文字列リテラル。 var strs = """aaa bbb ccc""" println(strs) 実行結果です。インデントもそのまま残ります。 aaa bbb cccインデントうぜー、とか思う人は、RichString#stripMarginを…

MavenでScalaのソースコードをコンパイルする

Mavenを使ってScalaのソースコードをコンパイルする簡単なサンプルです。maven-scala-pluginを使ってさくっとコンパイルできます。 Scalaのソースコード置き場を作成し、ソースコードを配置 pom.xmlにmaven-scalaプラグインの取得先とか、scalaでコンパイル…

型キャスト

オブジェクトを指定の型にキャストするには、Any#asInstanceOfを使います。また、指定した型と互換性があるか評価するにはAny#isInstanceOfを使います。 どちらもAnyのメソッドです。 型パラメータとして、変換or評価したい型を渡します。 var i = 10 var st…

派生クラスでtype aliasの指定を強制する

abstractなclass or trait に、型指定のない名前だけのtype aliasを書くと、派生クラスでこのtype aliasの定義を強制することができます。 abstract class Foo( ) { // 派生クラスで明示する必要があるtype alias // このクラスの派生クラスでは、Xのtype al…

type alias

type <名前> = <型> で、型に別名をつけることができます。 別名をつけた型は、別名でパラメータの型指定などに使えます。 複雑な型パラメータを持つ型を複数回使うような場合に便利。 // 「Array[Int]」の別名としてXを作る。 type X = Array[Int] // X型の…

MailBox

MailBoxは、複数スレッド間での同期制御とメッセージの送受信をさくっとできるようにするユーティリティクラスです。 要は、Javaにおけるjava.util.concurrent.BlockingQueueです。メッセージ送付側はブロックしないようなので、容量制限のないjava.util.con…

スレッドの同時実行制御(synchronized)

synchronizedで複数スレッドの同時実行制御ができます。 機能はJavaのsynchronizedと同じで、指定された処理が、1スレッドからのみ実行されるようになります。同時に複数スレッドから実行されることはありません。 Javaと違って、すべての参照型の基底クラス…

spawnで処理を並列実行する

scala.concurrent.opsで定義されているspawnメソッドを使って、任意の処理を別スレッドで並列に実行させることができます。 処理は引数で渡します。 内部的には、処理を実行するだけの専用のスレッドが1つ生成されるようです。スレッドは処理の実行完了後に…

世界のナベアツに Scala で挑戦する

今更ですが、世界のナベアツに Scala で挑戦してみました。 Scalaだと、 <レシーバ> <メソッド> <引数>でメソッドを呼び出したりできるので、「.」とか「()」とかを排除できてやばいことになるんじゃね!と思って始めたのだけど、0にするのは無理でした。 imp…

正規表現

Regexを使うのがよさげです。 使い方はAPIドキュメントを見ればだいたいわかるかと。 なお、古いScalaには含まれていないので注意。scala-2.7.0には入っておらず、scala-2.7.1.finalを落としてくると入ってました。 以下は簡単なサンプルです。 // 正規表現 …

View Bounds

「暗黙」シリーズ3つめ。型パラメータの指定で [<型パラメータ名> <% <クラス>] 例) [X <% String] とすることで、「に暗黙的に変換可能ななにか」を受け付ける関数が作成できます。 上の例だと、Xは「Stringに変換可能な何か」になります。 なので、実行時…

Implicit Conversions

「暗黙」シリーズ二つめ。「implicit」をつけた型変換用関数を定義しおくと、暗黙の型変換が行われるようになります。 型変換は、必要なときに自動的に変換関数が実行されることで行われます。 型変換用の関数は「implicit」をつけて定義しておく必要があり…

Implicit Parameter

関数のパラメータに「implicit」をつけておくと、関数の呼び出し時にその引数を省略できるようになります。省略された引数には、メソッドの呼び出し元コンテキストで一番それっぽいimplicit付きの値をコンパイラが選択して挿入してくれます。 「implicit」は…

lazyで値を遅延評価する

「val」で不変の値を定義する際に、「lazy」修飾子をつけると、値が遅延評価される(最初にアクセスされたときにのみ評価され、定義時には評価されない)ようになります。 「lazy」は「val」にのみ設定できます。「var」や「def」に設定することはできません。…

Iterator

要素を必要になったときに作成して返す仕組みとしてはStreamのほかにIteratorもあります。hasNext(),next()を持つアレです。Java使いにはこっちの方がわかりやすいかも。以下はフィボナッチ数を順に返すイテレータのサンプルです。 Iteratorを継承した無名ク…

Stream

Streamは要素が必要になったときに作成されるList(みたいなモノ)です。 要素は必要になったときに初めて作成されるので、 要素の作成に時間がかかる場合に初期作成コストを抑えることができます。 また、要素を全部辿らない場合に無駄な作成コストを削減でき…

演算子とメソッド

昨日書いたオブジェクトのメソッド呼び出しを「 」で実行できる件について、みずしまさんよりコメントを頂いた(ありがとうございます!)ので、仕様書を確認。 どうも、メソッド呼び出しと演算子がまったく別物という認識がそもそも間違っていたようだ。Scala…

untilを使った繰り返し

処理をn回繰り返したいときは「until」が使えます。 // 処理を10回繰り返したい for ( i <- 0 until 10 ) println( i ) 実行結果です。 0 1 2 3 4 5 6 7 8 9「0 until 10」を最初見たとき「なんだこれ?」と思ったんですが(そういう演算子があるのかなーとか…

for文を使った配列の操作

for文を使うと、配列やListの操作を簡単に行なうことができます。 配列を列挙する 単純に配列を列挙するには次のように書きます。 for ( <パターン名> <- <配列> ) <処理> これで以下の処理が行なわれます。 配列の値を一つ取り出してパターン名が示す変数に…

List

可変長の配列(javaのList)を使いたい場合、scala.Listが使えます。 同じような機能を持つクラスとして、scala.Arrayがありますが、 scala.Arrayは固定長で、Javaにおける配列(new int[]とか)に近い。 scala.Listは可変長で、JavaにおけるListに近い。 可変長…

タプル

複数の値を返したいけどコンテナとするクラスを定義するのがメンドイ、というときにタプルが使えます。 タプルは複数の値を保持する組み込みのクラス(scala.Tuple2 .. etc)です。 要素数に応じてそれぞれ別のクラスが用意されているので、必要な要素数にあわ…

Variance Annotations

型パラメータに「+」「-」をつけることで、パラメータ化されたクラスの代入制限を少し緩くできます。 パラメータ化されたクラスの代入制限とは? 次のような、型パラメータを受け取るクラスがあるとして、 // 型パラメータを受け取るクラス class Holder[A](v…

配列の基本的な使い方

配列(scala.Array)の基本的な使い方についてまとめ。 生成 「new Array[]()」で生成。 // 生成 var array = new Array[Int](5) n番目の要素の設定 「配列() = 」を使う。「[]」じゃないよ! // n番目の要素を設定 array(2) = 20 // 2番目の要素を20に。 array…

finalとsealed

Classの継承やメンバーのオーバーライドを制限する機能として「final」と「sealed」が使えます。 「final」はクラスやメンバーに対して設定できる修飾詞です。 finalが設定されたクラスは継承できません。 finalが設定されたメンバーはオーバーライドできま…

型パラメータの範囲指定

Scalaの型パラメータでは、パラメータで受け付けるクラスの範囲を制限することができます。Javaの「super」とか「extends」みたいな機能です。 「[ ]」とすることで、「は派生の何か」に制限できます。 「[ >: ]」とすることで、「はまたはその上位クラスの…

Object

ScalaのObjectについて。The Scala LanguageSpecificationを読んでポイントをまとめます。 使いみち 定数(static変数)やstaticメソッドを作るのに使う。逆にscalaにはstaticがない。 内部的にはどうなってるの? 次のようなobjectの定義は、 object X extends…

Class,Abstract Class,Trait,Objectの違いまとめ

ScalaByExample - Example 6 Classes and Objectsより。ScalaのClassとかTraitの違いについて、わかる範囲でまとめてみます。 ScalaのClassとかTraitの比較表 Class Abstract Class Trait Object 抽象メソッドを持てるか? × ○ ○ × メソッドの実装を書けるか?…

関数を返す関数を作る

ScalaByExample - Chapter 5.2 Curryingより。関数を戻り値として返す関数を作ってみます。 引数で渡す場合と同様に、戻り値型を「: => 」とすることで関数を返すことを示します。 後は戻り値として関数を返せばOK // 関数を返す関数の定義 // 戻り値型を「<…

関数について

ScalaByExample - Chapter 5 First-Class FunctionsとScalaByExample - Chapter 5.1 Anonymous Functionsのポイントまとめ。 関数は値 Scalaの関数は値です。引数として渡したり、戻り値として返すことができます。以下は、関数を引数として受け取る関数の例…

末尾再帰

ScalaByExample - Example 4.6 Tail Recursionより。Scalaでは末尾再帰は最適化されます。無駄なスタックを生成しないために、再帰を利用する関数は末尾再帰となるように設計しましょう、とのこと。 末尾再帰とは 再帰呼び出しを含む手続きが、自分自身の呼…

ブロックを使う

ScalaByExample - Example 4.3 Conditional ExpressionsからScalaByExample - Example 4.5 Nested Functionsあたりのポイントまとめ。 if-else は値を返す Scalaのif-else制御構文は値を返します。なので三項演算子的に使うことができるとのこと。 // if は…

引数を受け付ける関数の定義/「値渡し」と「参照渡し」

ScalaByExample - Example4.2 Parametersを読みました。 引数を受け付ける関数の定義 「def () : = ...」として、引数を持つ関数を定義できます。 // 「def <名前>(<引数>):<戻り値型> => ...」で引数を受け取る関数を定義できる。 def foo(i:int):int = 3*i…

式と簡単な関数について

beginner's guideは一通り読んだので、Scala By Example(日本語訳)に入ります。Cahpter4から体系的な構文の説明らしいので、1-3をすっ飛ばして「Chapter4 Expressions and Simple Functions」から。 式と簡単な関数 「def = 」で「式」に名前を付け、関数と…

型パラメータ

beginner's guideの「8 Genericity」より。Scalaでも型パラメータを使うことができます。 「class [] ...」といった感じで、「[]」を使って指定します。(Javaと違って「<,>」ではないです。) 使い方はJavaと同じ感じです。(beginner's guideの「8 Genericity…

Mixin

beginner's guideの「7 Mixins」を読みました。Scalaでは、RubyのようなMixinが使えます。 イメージとしてはtraitと呼ばれるAbstractなClassを複数継承する感じ。 継承したクラスでは、traitで定義された実装を持つメソッドを使うことができる。 また、trait…