2014年11月15日土曜日

[kdb] kdbメモ

kdb+関連メモあれこれ

・使用されているnamespaceを一覧表示
q) key `
`q`Q`h`o


・namespaceで定義したテーブルを呼ぶ
テーブルを呼ぶときは同一namespaceからでもnamespaceをつける必要がある。
一般に、namespaceはfunctionだけに使用すべきであり、tables/dataはroot namespaceに定義すべき。
cf) https://groups.google.com/forum/#!searchin/personal-kdbplus/namespace/personal-kdbplus/8ottIcH3qkk/0460pMTJR9wJ


・nullの比較
マイナスの比較をする場合、null値はマイナス扱いとなるため注意する。nullを除外するにはnegで符号を反転させるとよい
q)1 < 0
0b
q)-1 < 0
1b
q)0N < 0
1b

q)(neg -1) > 0
1b
q)(neg 0N) > 0
0b


・Browserからのアクセス(HTTP query)
変数一覧
http://host:port/

クエリ
http://host:port/?[query]
ex) http://localhost:5001/?.z.z


・"1行"の処理
1行の処理でも後ろから処理される。変数の連続代入を行う場合は気をつけて使う必要がある。
※"1行"という表現は微妙ですが、コンソールであれば次の";"までの処理です
q) i: 0 1 2
q) (i[1]:3; i[2]:i[1]+1)   / [1]に3を代入し、[2]を"[1]+1"に変更したい
3 2
q) i   / [2]が変わっていない
0 3 2

q)i: 0 1 2
q)(i[2]:i[1]+1; i[1]:3)
4 3
q)i
0 3 4   / 後ろから処理されることを意識すればOK

q) i: 0 1 2
q)(i[2]:1+i[1]:3)   / この書き方のほうが間違えが少ないかも
q)i
0 3 4

2014年11月10日月曜日

[Linux] find -exec で複数行コマンド/ユーザー定義関数を実行する

find -exec で複数行コマンド/ユーザー定義関数を実行するためのメモ
※bashのみ対象

find -execはシェルを実行せずに直接コマンドを実行しているため、シェルで定義したものは使えないらしい。
 ・UNIX/Linux の find -exec の引数にはシェルの構文を使えない.
 http://ameblo.jp/noocyte/entry-10024398713.html

そこで以下の流れで実行することにする

□複数行コマンド
(1) exec内でシェルを実行
サンプル:カレント以下のファイル名と中身をtailする
bashのシンボリックリンクであるshで実行すると、~.bashrcを読み込まない
$ find . -type f -exec sh -c "echo; echo {}; tail -3 {}" \;
$ find . -type f -exec bash -c "echo; echo {}; tail -3 {}" \;

□ユーザー定義関数
(1) 関数を定義しexportする
$ function test1() {
>     echo; echo $1; tail -3 $1;
> }
$ export -f test1

(2) exec内でシェルを実行
$ find . -type f -exec sh -c "test1 {}" \;

(3) 不要なら削除
$ unset test1

2014年11月4日火曜日

[kdb] rlwrap の CentOS7 へのインストール

コンソールでqを起動する場合は、rlwrap を使うと便利
- kxwikiより
> How do I recall and edit keyboard input?
> rlwrap l64/q -p 5001

□ インストール方法
yumでインストールできないので、ソースコードから。

(1) 公式サイトからDL
http://freecode.com/projects/rlwrap
rlwrap-0.41.tar.gz
※EPELレポジトリを追加すればyumでもインストール可

(2) 解凍→インストール?
README or INSTALL ファイルを参照
readlineのライブラリがないとのエラーがでた場合は(3)へ

(3) readlineのインストール
readline はデフォルトでインストールされているようだが、readline-develが必要らしい
cf.) http://stackoverflow.com/questions/26129623/
yum install readline-devel

(4) インストール
./configure
make
make install

(5) 確認
whereis rlwrap
  rlwrap: /usr/local/bin/rlwrap

(6) alias
使いやすいようにaliasを設定しておく
alias rq='rlwrap q'

[kdb] svnでcode.kx.comにアクセスする

svnでcode.kx.comにアクセスする方法

websvn通常のURL
http://code.kx.com/wsvn/code/

svn用URL
http://code.kx.com/svn/

2014年10月15日水曜日

[R] timeとtimezone

Rのtimezone関連あれこれ

□ List of tz database time zones
http://en.wikipedia.org/wiki/List_of_tz_database_time_zones

□ help(Sys.time)
Get Current Date, Time and Timezone
Sys.time()
Sys.Date()
Sys.timezone()

□ 時刻型への変換
as.POSIXct, as.POSIXlt
as.POSIXct("15/03/31", format="%y/%m/%d")
[1] "2015-03-31 JST"

2014年10月14日火曜日

[kdb] load csv files

kdbへのcsvファイルの読み込み方

□ kxwiki - cookbook
How do I import a CSV file into a table? 

□ kxwiki - Reference/Datatypes
各列の型の定義は "char" の型定義を大文字にしたものを使えば良い
ただし、stringにしたい場合は、S: symbol, C: char なので、"*"を使用する
空欄にすると、その列は除外される
  cf) Kdb+ Personal Developers - splayed table string datatype
$ cat test.csv
USDJPY,1,11,AAA,BBB
EURUSD,2,22,AAA,BBB
EURJPY,2,22,AAA,CCC

q) flip `sym`v1`v2`s1`s2!("SII**";",") 0:`test.csv
sym    v1 v2 s1    s2   
------------------------
USDJPY 1  11 "AAA" "BBB"
EURUSD 2  22 "AAA" "BBB"
EURJPY 2  22 "AAA" "CCC"

2014年10月13日月曜日

[その他] ブログの装飾

□ コードの挿入
<pre>タグで囲った部分を装飾する
Syntax Highlighterでコードをきれいに魅せる
SyntaxHighlighter

□ 数式の挿入
MathJaxを使用すると、LaTex形式で入力したものを装飾可能
MathJax in Blogger
MathJaxの使い方

2014年10月1日水曜日

[FIX] FIX関連リンク

FIXプロトコル公式サイト


□ FIX TRADING COMMUNITY
http://www.fixtradingcommunity.org/

□ Implementation Guide
http://www.fixtradingcommunity.org/pg/structure/tech-specs/implementation-guide/implementation-guide

□ Specification (FIX 4.4)
右上のLoginでLogin後にFIX 4.4 Specificationを開く(Loginしないとリンクが表示されない)
http://www.fixtradingcommunity.org/pg/structure/tech-specs/fix-version/44#Documents
Specification DocumentsからDL

VOLUME 1 - INTRODUCTION
VOLUME 2 - FIX SESSION PROTOCOL
VOLUME 3 - FIX APPLICATION MESSAGES: PRE-TRADE
VOLUME 4 - FIX APPLICATION MESSAGES: ORDERS AND EXECUTIONS (TRADE)
VOLUME 5 - FIX APPLICATION MESSAGES: POST-TRADE
VOLUME 6 - FIX DATA DICTIONARY
VOLUME 7 - FIX USAGE BY PRODUCT

□ Beginners Resources
http://www.fixtradingcommunity.org/pg/structure/tech-specs/presentations-docs/beginners-guide

□ FIXimate (Message And Tag reference)
http://www.fixtradingcommunity.org/FIXimate/FIXimate3.0/latestEP/index.html


QuickFIX/J


http://www.quickfixj.org/
http://www.quickfixj.org/jira/browse/QFJ
https://github.com/quickfix-j/quickfixj

[Java] QuickFIX/J 1.6.0

リリース前ですが、ちょっと覗いてみました。
Maven & Github になったようです。

□ JIRA
http://www.quickfixj.org/jira/browse/QFJ

□ Release Notes
http://www.quickfixj.org/jira/secure/ReleaseNote.jspa?projectId=10000&version=10150

- Bug
1.5.3のBug-fixがたくさん

- Improvement
気になる改善点
[QFJ-664] - Upgrade MINA from 1.1.8 to 2.0.7
[QFJ-736] - performance improvement: Modify the code to use StringBuilder instead of StringBuffer in calculateString method of FieldMap
[QFJ-740] - Replace StringBuffer with StringBuilder
[QFJ-777] - Determine session's IP address

□ Builds
ビルド済みはこちらに
http://www.quickfixj.org/jira/browse/QFJ/?selectedTab=com.atlassian.jira.plugin.ext.bamboo:bamboo-project-tabpanel

2014年9月30日火曜日

[kdb] 32bitフリー版のCentOS7 へのインストール

(1) 公式サイトからDL
http://kx.com/software-download.php

(2) 配置
qの場所はどこでも問題ない。以下のディレクトリ構成で配置
/opt/kdb/q
├── README.txt
├── l32
│  └── q
├── q.k
├── q.q
├── s.k
├── sp.q
└── trade.q

(3) 環境変数を設定(.bashrc に追記)
起動ユーザーの環境変数を設定
export QHOME=/opt/kdb/q
export PATH="$PATH":${QHOME}/l32

(4) 32bit版起動ライブラリの導入
$ sudo yum install glibc.i686
(5) 起動
$ q
(6) (オプション)zlibのインストール
32bit版kdb+でgzipの圧縮を使うためには、32bit版のzlibが必要
$ sudo yum install zlib.i686

2014年9月26日金曜日

[Java] FIXのtimestampの取り扱い

FIXのtimestamp(UTC, String) をLoacalDateTime(JST)に変換したい。いろいろぐぐったが適当なものが見つからず。

FIXのtimestampの例
  SendingTime(UTC) : 52=20140925-18:09:34.422

以下はアイディア
(1) LocalDateTimeに変換し、9時間プラスする。
(2) LocalDateTime(UTC)に変換 ⇒ Instantに変換 ⇒ ZonedDateTIme(JST)に変換 ⇒ LocalDateTime(JST)に変換
(3) もっと良いやり方が。。。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSS");
String sampleTime = "20140925-18:09:34.444";

// UTC
LocalDateTime localDateTimeUtc = LocalDateTime.parse(sampleTime, formatter);

// (1) LocalDateTimeに変換し、9時間プラスする。
LocalDateTime localDateTimeJst = localDateTimeUtc.plusHours(9);

// (2) LocalDateTime(UTC)に変換 ⇒ Instantに変換 ⇒ ZonedDateTIme(JST)に変換 ⇒ LocalDateTime(JST)に変換
Instant instant = localDateTimeUtc.toInstant(ZoneOffset.UTC);
ZonedDateTime zonedDateTimeJst = ZonedDateTime.ofInstant(instant, ZoneId.of("Asia/Tokyo"));
LocalDateTime localDateTimeJst2 = zonedDateTimeJst.toLocalDateTime();

DateTimeAPIで参考になりそうなサイト
・Programming Studio Date and Time API 徹底攻略(5) - Date/Time その2
・JavaのAPI

2014年9月16日火曜日

[kdb] Functional select

Functinal Selectの使い方

[kx wiki のページ]
http://code.kx.com/wiki/JB:QforMortals/queries_q_sql#Functional_select
http://code.kx.com/wiki/JB:QforMortals2/queries_q_sql#Functional_select

[サンプルテーブル]
q) meta MarketData
c             | t f a
--------------| -----
date          | d
sym           | s   p
time          | t
bid           | f
ask           | f
marketDateTime| z

date       sym    time         bid     ask     marketDateTime        
----------------------------------------------------------------------
2014.01.02 USDJPY 07:00:02.111 105.231 105.271 2014.01.02T07:00:02.022
2014.01.02 USDJPY 07:00:05.222 105.232 105.272 2014.01.02T07:00:05.044
2014.01.02 USDJPY 07:00:05.333 105.233 105.273 2014.01.02T07:00:05.066

[使い方]
//
//###
// Functional Select
// 
// @param t(symbol) - table name
// @param c(List) - c is a list of where specifications (constraints)
// @param b(Dict of List) - b is a dictionary of grouping specifications (by phrase)
// @param a(Dict of List) - a is a dictionary of select specifications (aggregations)
// @return Table
//#
t: `MarketData;
c: enlist ( <; `marketDateTime; `datetime$2014.01.05 );
b: (enlist `time) ! (enlist (`marketDateTime)); // just by
a: (enlist `price) ! enlist (last;`bid);
?[t;c;b;a]

// Other Samples
// 2 conditions
c: ( (=; `date; 2014.01.02);(=; `sym; enlist `GBPJPY) );

// This phrase is equal to " by `datetime$ 0D00:00:01 xbar `timestamp$`marketDateTime "
b: (enlist `time) ! (enlist (`timestamp$;`marketDateTime)); // 
b: (enlist `time) ! (enlist (`datetime$ 0D00:00:01 xbar `timestamp$;`marketDateTime) ); // cast to datetime

// return 2 cols
a: `bid`ask ! ((last;`bid);(last;`ask));
c: (条件演算子・関数; カラム; 条件) のリスト
条件がsymbolの場合、そのままではだめっぽい。とりぜえずlistにするとOKだった。

b: (出力カラム名 ! by条件のリスト) のDict
by条件リストの書式は(条件; カラム名)。条件はなくても可,
特にbyでまとめる必要が無い場合は、0bを指定すればよい

a: (出力カラム名 ! 出力元カラム条件のリスト) のDict
出力元カラム条件のリストの書式は (条件演算子・関数; カラム名)。条件はなくても可
複数カラムを組み合わせるやり方は不明。。。


[Functional Selectの作り方例]
作成したいFunctional Selectと同様のselect文をstring形式で作成し、
parseするとFunctional Selectと同様の形式に展開される
q) parse "select from t"
?
`t
()
0b
()

/ 1行で書くと、(?;`tab;();0b;()) となる。2つめからそれぞれ、t,c,b,a
/ つまり、?[`t;();0b;()] と書けばよい

2014年8月2日土曜日

[Java] ArrayとArrayListの速度比較

小さめのサイズでArrayとArrayListの速度比較を行ってみました。

[前提]
 ・サイズは 10-100 程度
 ・リストの容量と中身の大きさはほぼ同じ
 ・用途は、更新頻度が高いイベントの配布先の管理に使う


[結果]
Arrayのforとforeachはほぼ同じ。
ArrayListでも通常のforループで回すと余り変わらない 。若干ArrayListが遅いか。
foreach、streamは遅い。foreachで2倍程度。

[Array - for]
Start : 1406987147093, End : 1406987147102, Took : 9
[Array - foreach]
Start : 1406987147122, End : 1406987147131, Took : 9
[ArrayList - for]
Start : 1406987147132, End : 1406987147142, Took : 10
[ArrayList - foreach]
Start : 1406987147142, End : 1406987147174, Took : 32
[ArrayList - stream]
Start : 1406987147174, End : 1406987147229, Took : 55


※初期容量を非常に大きくした場合
 ⇒foreachが大きく影響を受ける。
[Array - for]
Start : 1406987109799, End : 1406987109809, Took : 10
[Array - foreach]
Start : 1406987109826, End : 1406987109835, Took : 9
[ArrayList - for]
Start : 1406987109835, End : 1406987109845, Took : 10
[ArrayList - foreach]
Start : 1406987109845, End : 1406987110117, Took : 272
[ArrayList - stream]
Start : 1406987110118, End : 1406987110526, Took : 408

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ListAndArray {

    private final int SIZE = 20;
    private final int OUTER_COUNT = 100000;
    
    private ExecutorService executer = Executors.newFixedThreadPool(SIZE);
    
    public static void main(String[] args) {
        ListAndArray instance = new ListAndArray();
        instance.calcListVsArray();
    }
    
    public void calcListVsArray() {
        // initialize
        List list = new ArrayList<>(SIZE);
        for (int i = 0; i < SIZE; i++) {
            list.add(new EventListenerSample());
        }
        EventListenerSample[] array  = list.toArray(new EventListenerSample[list.size()]);

        long startTime;
        long endTime;
        long miliExecTime;
       
        // calc
        System.out.println("[Array - for]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            for (int i = 0; i < SIZE; i++) {
                array[i].getLocalDateTime();
            }
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);
        
        
        System.out.println("[Array - foreach]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            for (EventListenerSample eventListenerSample : array) {
                eventListenerSample.getLocalDateTime();
            }
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);
        
        
        System.out.println("[ArrayList - for]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            for (int i = 0; i < SIZE; i++) {
                list.get(i).getLocalDateTime();
            }
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);
        
        

        System.out.println("[ArrayList - foreach]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            for (EventListenerSample eventListenerSample : list) {
                eventListenerSample.getLocalDateTime();
            }
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);

        
        System.out.println("[ArrayList - stream]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            list.stream().forEach(e -> e.getLocalDateTime());
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);
    }

    
    public static class EventListenerSample {
        private Integer integer = Integer.MAX_VALUE - 1;
        private String b = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
        private String c = "ccccccccccccccccccccccccccccccc";
        private LocalDateTime localDateTime = LocalDateTime.now();
        public LocalDateTime getLocalDateTime() {
            return localDateTime;
        }
    }
}