2015年4月19日日曜日

[kdb] Loop: ループと関数

ループ処理に関するメモ
※ループ処理は基本的に遅いので、できるだけループ処理は行わないようにするのがよい


・ループ処理
kdbのループ処理は while, do, 関数(each) で行う。
do[count;exp1;...;expn]
while[test;exp1;...;expn]
function[] each xxx


・for文のループ
for文は存在しないので、for文に相当する処理を行うためには、以下の2通りの方法で行う。
(1) index 付き while or do
(2) 関数をeachで呼ぶ

(1) index 付き while or do
q) i:0; x:1;
q) do[5; x*:2; i+:1]   / do
q) x
32

q) i:0; x:1;
q) while[i<5;  x*:2; i+:1]   / while
q) x
32
(2) 関数をeachで呼ぶ 処理部分を関数化すればeachで呼ぶことができる。peachを使うことで並列実行可能
q) L: -10#til 110
q) x:()
q) i:0
q) do[10; x,:L@i; i+:1]
q) x
100 101 102 103 104 105 106 107 108 109

q) {x@y}[L;] each til 10
100 101 102 103 104 105 106 107 108 109

2015年4月14日火曜日

[kdb] rand: 乱数

乱数に関するメモ

・アルゴリズム
kdbの擬似乱数生成アルゴリズムはキャリー付き乗算らしい

https://groups.google.com/forum/#!searchin/personal-kdbplus/Mersenne/personal-kdbplus/_8HIuv6AV-4/UmjaxVrfanoJ

> simon 2008/09/05
>
> this is the one currently used
> http://en.wikipedia.org/wiki/Multiply-with-carry
> no bitwise operations at the moment
>

・使用方法

kwxiki - rand

各atomの0を引数に入れると、そのatomの乱数が生成される
q)rand 0i
-2074077848i
q)rand each 10#0b
0111000011b
q)rand `float$0    / 当然ですがfloatはダメ
0f

0以外の数字を入れると、[0,X)の値が生成される。Xが含まれないのがポイント
q)rand each 5#100
20 77 5 64 49
q)rand each 5#1.0
0.2149847 0.1007832 0.4520411 0.0196153 0.1262957

q)rand each 100#1b   / trueが含まれないので全部false
00000000000000000000000000000000000000000000000000000000000000000000000000000..

引数がリストの場合は、リストの要素からランダムに抽出
q)rand `A`B`C
`B
q)rand each 5#enlist `A`B`C
`A`A`C`B`B


"?"でも同様。?がkに近い書き方?
q)10?1.0
0.6598286 0.03947309 0.1404332 0.4545668 0.6829453 0.7773633 0.5704403 0.8341..
q)10?0b
1010011100b

q)10?`A`B`C
`A`B`C`C`A`B`B`B`B`C


重複なし、ランダムソート(並び替え)
"?"の前にマイナスをつけると、重複なしとなる。これを使えばランダムソートが可能
q)-10?10   / 重複なしでランダムに取得する
9 3 0 1 5 6 8 4 7 2

q) -11?10   / 数が合わないのでエラー
'length

q)(neg count x)?x   / xのランダムソートになる
`B`A`D`C`E

q)x -5?5   / indexを乱数で作って取得してもよい
`C`D`B`E`A



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/