2015年3月27日金曜日

[kdb] List : リスト操作

リスト関連メモ

・QforMortals2/lists


・atomからlistを作成する
atomを並べるとリストになる。
要素が1つのリストを作る場合はenlist関数を使用する
q)1 2 3
1 2 3
q) enlist 1
,1

q) `A`B
`A`B
q) enlist `A
,`A
q) type enlist `A
11h

q) (),`A   / ()を組み合わせることでもリストを作成可能
,`A
q)type (),`A
11h
q)type (),`A`B   / ()の場合は、リストを引数にしても多層にならないので関数中で使う場合に便利
11h
q)type enlist `A`B
0h

q) {(),x} `A`B`C   / 関数中で引数をリストに変える
`A`B`C


・listからatomを作成する
first, last, @, max, ... などlistを引数にしてatomを返す関数を使用する。
要素が1つのリストをatomにする場合は、firstなどを使えばよい
q) first -5#til 10
5
q) first enlist 1
1


・listのlistから特定の行/列を抽出
Rと同じように、index指定で抽出可能
q) show list: flip ((til 10);(10?`A`B`C))
0 `A
1 `A
2 `C
3 `B
4 `C
5 `B
...

q)list[1]   / 1行目を抽出
1
`A
q) list[;1]   / 1列目を抽出
`A`A`C`B`C`B`C`C`B`A

q)list[1 3 5]   / 1,3,5行目を抽出
1 `A
3 `B
5 `B

2015年3月18日水曜日

[kdb] Permission

認証に関するメモ

□ 参考: First Derivatives - q for Gods / 9 Permissions with kdb+
http://www.firstderivatives.com/lecture_series.asp


□ 設定方法
認証を行う方法は以下の2種類
  1. 起動オプションで -u or -U をつける
  2. .z.pw を変更する

kdb+で新しくセッションが作成される際には、以下の順序で処理が行われる
 -u/-U checks ⇒ .z.pw (user check) ⇒ .z.po(port open)

※ .z.pw はデフォルトでは常に1bが返るように定義されている

(1) 起動オプション -u [password_file] / -U [password_file]
事前にパスワードファイルを作成しておき、起動時にパスワードファイルを読み込む
-u: 初期ディレクトリより上の階層にはアクセスできない、OSコマンドは使用できない?
-U: 認証後は制限なし

パスワードファイルは user:password 形式で記載する。
passwordは生で書くか、kdbでmd5形式に変換したものを書く。

$ cat password_file
user:password

$ q -u password_file -p 5001

// md5に変換する方法
q) md5 "password"
0x5f4dcc3b5aa765d61d8327deb882cf99

// md5 hash でパスワードファイルを書く
$ cat password_file_md5
user:0x5f4dcc3b5aa765d61d8327deb882cf99


(2) .z.pw を変更する
.z.pw:{[user;pwd] ... ではユーザーごとに動きを制御することができる。
複雑な制御を行う時はこちらの方法がよい。
First Derivatives のq for Godsでは、message handlerと組み合わせることで User/Poweruser/Superuser ごとに可能なオペレーションを制御する方法が紹介されている。

.z.pw:{[user;pwd]
    // 判断
    // 1b or 0b を返す
  };

// message handler と組み合わせると相性がよいかも
.z.pg:{[query] ...}
.z.ps:{[query] ...}

2015年3月17日火曜日

[kdb] IDE: qStudio

qStudio に関するメモ

qStudio - JavaベースのIDE, ソース非公開

[qStudio の特徴]
・Good
Consoleビューが非常につかいやすい
ウィンドウがタブ型(でもExplorerがちょっとくせがある)
Unicodeで日本語がUTF-8でかける
いろいろなchart(でもイマイチ)
・Bad
いろいろ機能はあるけど、どれもかゆいところに手が届かない感じ
たまに処理中のままになる
prefixに変な文字が入ってしまうことがある(要再起動)


[Kdb+ Tutorials]
qStudioを作成しているTimeStoredが公開しているコンテンツ。よくまとまっていて、おすすめ
http://www.timestored.com/kdb-guides/

[kdb] IDE: QInsightPad

QInsightPad に関するメモ

QInsightPad - windows専用のIDE

[QInsightPadの特徴]
・Good
Windows専用でExplorerとの統合がよい
ウィンドウがタブ型
Namespace一覧が見やすい
入力補完が見やすく、使いやすい(ユーザー定義オブジェクトの補完には事前にnamespace更新が必要)
フォント等設定項目が豊富

・Bad
日本語を入れるとencodingが"BOM付き"UTF-8になるという困ったWindows仕様
グラフがイマイチ(可能性は非常に感じるのだけど。。。)
1つのファイルの行数が増えると非常に重い
日本語コメントの直後の行が動かないことがある(最後をascii文字にするとか何らかの対応が必要)
利用期限が2015/9/30に設定されており、開発者がバージョンアップしてくれない場合使えなくなる可能性あり。


[おすすめ設定]




・Q Settings
- Namespace Explorer
Refresh on server change - ctrl+spaceでの保管には最後に読み込んだNamespace情報が使われる

- Grid
Show dictionaries in grid view - dictionaryをgrid形式で表示
Add # column

・Editor
Switch connections in page activation - オンにするとそれぞれのtabで別々のconnectionになる。オフがおすすめ

・Fonts & Colors
デフォルトフォントはいまいちなので何かに変えたほうがよい。現在のオススメは "Migu 1M"


[Debuggerの使い方]

TBW


[kdb] IDE: StudioForKdb+

StudioForKdb+ に関するメモ

StudioForKdb+ - ベーシックなIDE、Javaベース、オープンソース

[studioメモ]

・フォント設定
studio.properties のフォント項目を変更すればよい
font.size=14
font.name=Monospaced

・Syntax Coloering設定
studio.properties のtoken.xxx項目を変更すればよい
token.BACKGROUND=ffffff
token.KEYWORD=0000ff
...

[studio 拡張版]

https://github.com/Naoki-Yatsu/studio

Multi-Axis Chartが楽にかけます。おすすめですよ

2015年3月16日月曜日

[kdb] Dictionary and Table

dictionaryとtableに関するメモ

□ dictionary
key(domain list)とvalue(range list)の対応をあわらしたもの

QforMortals/dictionaries

q) dict: ()!()    / 空で作成
q) dict[`a]:1     / 値を追加
q) dict[`b]:2.0   / intとfloatで型が違うのでエラー
'type
q) dict
a| 1
q) type value dict
7h
q) type key dict
11h

q) dict: ()!()   / 空で作成
q) dict[`]: ::   / generic nullを最初に入れると型が不定になる
q) dict[`a]: 1;
q) dict[`b]: 2.0;
q) dict
 | ::
a| 1
b| 2f
q) type value dict
0h

q) dict@`b      / @でもアクセスできる
2f
q) dict.a       / 不定型にすると"."でアクセスできるようになるっぽい
q) dict.c:`C    / 値の追加もできる
q) dict
 | ::
a| 1
b| 2f
c| C

q) dict: dict _`   / `を削除したい場合
q) dict _`a        / これは消えて見えるだけ
b| 2f
c| `C

q) dict2.a:1       / 何も無いところから定義するとこちらの形になる
q) dict2
 | ::
a| 1
q)dict3[`a]: 1     / dictionaryがないとダメ
'type

※「::」は generic null をあらわす非常にわかりにくい記号...



□ dictionaryとtable
dictionaryはテーブルに変換することができる
dictionaryの作り方によって変換方法は主に2種類ある

※前提: dictionaryのkeyがsymbolのリストであること
(A) valueがatomである(もしくはatomとして扱いたい何か)
⇒ enlist
(B) valueがconformableなリストである(atomか同じ長さのリスト)
⇒ flip
q) .Q.w[]        / valueがatomのリスト
used| 120288
heap| 67108864
peak| 67108864
wmax| 0
mmap| 0
mphy| 16640253952
syms| 591
symw| 19098
q) flip .Q.w[]   / flipはダメ
'rank
q) enlist .Q.w[]
used   heap     peak     wmax mmap mphy        syms symw 
---------------------------------------------------------
120336 67108864 67108864 0    0    16640253952 591  19098


q) dict: `a`b`c!(1 2;3 4;5 6)
q) dict
a| 1 2
b| 3 4
c| 5 6
q) flip dict   / valueがリストのときはflipで
a b c
-----
1 3 5
2 4 6
q) enlist dict
a   b   c      / enlistだと違う形のテーブルになる
-----------
1 2 3 4 5 6


2015年3月7日土曜日

[kdb] tick / tickerplant (1) tplog

tickerplantのtplogの取り扱い

・参考: First Derivatives - q for Gods 23
http://www.firstderivatives.com/Products_pdf.asp?downloadflyer=q_for_Gods_July_2014

・tplogの読み込み
作成済みのtplogの読み出し方法
tplogはupd関数とその引数がそのままの形で記述されている。そのため、通常のloadでは読み出しができない。
q) get `:tplog
`upd `MarketData           (0D00:00:00.068812000 0D00:00:00.068812000 0D00:00..
`upd `MarketData           (0D00:00:00.168898000 0D00:00:00.168898000 0D00:00..
...
読み出し(実際に再実行)には、専用の-11!関数を使う
q) \l schema.q   / schemaファイルを読み込み
q) upd:insert    / upd関数を定義
q) -11! `:tplog  / 
...              / tplogの行数が出力される

q) value each get `:tplog   / -11!はこれと同様(より効率的)

[kdb] テーブル保存・読み出し set/get/save/load

テーブル保存・読み出し関連

・save
テーブルを保存する。そのままならbinaryで拡張子をつけると各形式で保存される。
引数はsymbol型で指定する。
q) save `table         / currentディレクトリに保存(`:table set table と同じ)
`:table
q) save `:/tmp/table   / fullpath指定
`:/tmp/t
q) save `$"/tmp/table"
`:/tmp/t
q) save `table.csv     / csv形式で保存
`:table.csv
・load
binaryで保存したテーブルを読み出す。
qファイルやディレクトリは\lを使用する。
q) load `table   / 読み出し (table: get `:table と同じ) 
`:table

q) \l /tmp/q.q   / qファイルの読み込みはsystem command

q) \l /tmp/dir   / ディレクトリの読み出しはsystem command
q) {load ` sv `:dir,x} each key `:dir   / ↑と同じ
...
・set
X set Y
YのデータをXのファイル名で保存する。saveよりも汎用的。
Xに/で終わるディレクトリを指定するとsplayed tableで保存できる。ただし、primary key以外はenumeratedされていないといけない。
q) `filename set table   / tableをfilenameで保存。tableはsymbolはNG
`filename
q) `:savename/ set table   / tableをsavenameでsplayedで保存
`:savename/
q) `:dir/tr/ set .Q.en[`:dir] tr   / enumeratedに変換しつつsplayedで保存
`:dir/tr/
・get
ファイルからデータを読み出す
q) table:get`:filename   

q) table:get`:dirname/   / splayed tableを取得