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;()] と書けばよい