2015年10月10日土曜日

[Excel] Excel 関連メモ

Excel 関連メモ

□ VBA関連

VBAがわかりやすく解説してあって非常によい
 ・昨日までJavaJavaしてた人がいきなりExcelのVBAを実装する羽目になったときのためのメモ
 http://qiita.com/opengl-8080/items/5bd8ae7fe95f5c31dfc3

開発環境 Code Explorer, To-do Items, Test Explorer, Code Inspections, Refactorings, Github
 ・紹介しているページ
 https://github.com/retailcoder/Rubberduck/wiki/Features


□ Excelメニュー関連

クイックアクセスツールバーの紹介
 (未定)






2015年9月13日日曜日

[R] データフレーム関連メモ

データフレーム関連メモ

・行名・列名(ラベル)の変更
colnames, rownames
ref) 行列やデータフレームの列名・変数名の変更

・テーブルとして表示
rmarkdownで使う場合は、xtable, kable など
xtableで行番号ラベルを消すには、行ラベルを設定すればよい。
HTML用にはhtmlTableも使える
以下のサイトがよくまとまっている
ref) Tables with htmlTable and some alternatives

2015年8月31日月曜日

[R] ファイナンス関連計算メモ


・対数収益率
diff(log(x))
diff(log(c(100,101,102,103)))
 0.009950331 0.009852296 0.009756175

# データフレームにreturn列を追加 (行数が減るので、先頭に0を追加する)
> head(returns)
        date close
1 2004-05-19 10967
2 2004-05-20 10862
3 2004-05-21 11070
> returns$return <- c(0, diff(log(returns$close)))
        date close       return
1 2004-05-19 10967  0.000000000
2 2004-05-20 10862 -0.009620304
3 2004-05-21 11070  0.018968287

2015年5月15日金曜日

[Java] QuickFIX/J 1.6.0 (2) リリース

QuickFIX/J 1.6.0 がリリースされたようなので試してみた

QFJ 1.6.0 release notes

□ ダウンロードと実行(java version "1.8.0_45")
ビルド済みのバイナリファイルをダウンロード
quickfixj-core-1.6.0.jar
quickfixj-messages-fixXX-1.6.0.jar (必要なバージョン、allなら全部込み)
をパスに指定する。

実行したところ、NewOrderSingleのインスタンス作成時 new NewOrderSingle() に以下のエラーが発生

java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    quickfix/fix44/NewOrderSingle.get(Lquickfix/field/SettlType;)Lquickfix/field/SettlType; @2: invokevirtual
  Reason:
    Type 'quickfix/field/SettlType' (current frame, stack[1]) is not assignable to 'quickfix/CharField'
  Current Frame:
    bci: @2
    flags: { }
    locals: { 'quickfix/fix44/NewOrderSingle', 'quickfix/field/SettlType' }
    stack: { 'quickfix/fix44/NewOrderSingle', 'quickfix/field/SettlType' }
  Bytecode:
    0x0000000: 2a2b b600 3057 2bb0   

SettlType はFIXのバージョンによってQFIX/Jのフィールド種別が異なっているようだ。
FIX4.4ではCharField、FIX5.0ではStringFieldで定義されている。
デフォルトでは、coreに定義されているSettlTypeはStringFieldを拡張している。

VerifyErrorはJDK7以降でclassファイルの検証方式が変更になったことによるものらしい。
既存プロジェクトをJDK8へ移行したら、java.lang.VerifyErrorが出た

とりあえずの解決法はフィールドのそろえればよい。↓のQAにも同様の回答があった。
[Quickfixj-users] Using multiple versions of FIX with Quickfix


□ ビルド
ソースをダウンロードして再ビルドする。
しかし、そのままビルドしたらテストが通らない。。。

原因を探すのが面倒なので、テストスキップでビルド
mvn install -DskipTests=true

全体を一度ビルドした後で、messageの定義を変更して再ビルドする。
使用したいバージョンの定義ファイルを編集する。FIX4.4の場合は以下
quickfixj-messages-fix44\src\main\resources\FIX44.modified.xml
このあたりを変更する
前)   
    ↓
後)  
メッセージだけビルドして終了

2015年5月5日火曜日

[kdb] Q Math Library (qml) (2) 回帰分析

Q Math Library の使い方メモ (2)

□回帰分析
・単回帰分析
y=c+ax の回帰を行う。データをこの式に代入して行列で表現すると、Y=XA となる。
Yはデータ個数の縦ベクトル、Xはデータ個数行・2列の行列、A=(c a) の縦ベクトル

/ .qml.mlsq[X;Y]   / 公式には.qml.mlsq[A;B]
q)show X: flip (10#1;til 10)   / 0-9で、1列目は固定で1
1 0
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9

q)show Y: (10?10) + 2*til 10   / 切片5、傾き2
8 3 13 11 12 16 18 15 24 23

q).qml.mlsq[X;Y]   / 1つめが切片, 2つめが傾き
4.654545 1.921212


回帰分析の各種情報を取りやすくした関数がcontribのlinreg.qに定義されている

参考: Is there linear regression algorithms written by Q language?
https://groups.google.com/forum/#!searchin/personal-kdbplus/linear$20regression/personal-kdbplus/CRf-kOx-v4I/mqqo49tsvTIJ

・contribからソースを入手
http://code.kx.com/wsvn/code/contrib/azholos/linreg.q


/ 単回帰分析
q)show X: (1;til 10)   / flipせずに単純に係数を並べてOK
1
0 1 2 3 4 5 6 7 8 9

q)show Y: (10?10) + 2*til 10   / Yは上と同じ
5 8 8 7 11 13 19 22 18 19

q) linreg[Y;X]
     | ::
X    | (1 0f;1 1f;1 2f;1 3f;1 4f;1 5f;1 6f;1 7f;1 8f;1 9f)
y    | 1 6 7 15 16 19 21 19 20 18f
S    | (4.473113 -0.706281;-0.706281 0.1569513)
b    | 5.145455 2.012121
e    | -4.145455 -1.157576 -2.169697 3.818182 2.806061 3.793939 3.781818 -0.230303 -1.242424 -5.254545
n    | 10
m    | 2
df   | 8
se   | 2.114974 0.3961708
tstat| 2.432869 5.078923
tpval| 0.04101822 0.0009544019
rss  | 103.5879
tss  | 437.6
r2   | 0.7632818
r2adj| 0.733692
fstat| 25.79546
fpval| 0.0009544019



2015年5月1日金曜日

[kdb] Adverbs / each

Adverbsに関するメモ(主にeach)
※間違いがありそう。あればコメントください。

kxwiki - Adverbs

・adverb
function or verb を引数にとって、別の function or verb を作り出す。
each以外はスペースを空けてはならない。

adverbの引数はadverbの前にあるfunction or verbなので、adverbの後ろはfunction or verbの引数。
つまり、f each args の場合、eachの引数はfで、argsはfの引数になる。

個人的によく使いそうなもの
[eachなど]
each  each        - 
  '   each both   - 
 \:   each left   - 
 /:   each right  - 

[関数fに作用]
 f each X  - fは1つ以上の引数をとる関数。
             fからXのそれぞれに作用する関数を作り出す。
             イメージ f[X[0]], f[X[1]],...
 X f' Y    - fは2つ以上の引数をとる関数。
             fからXとYの両方にそれぞれ作用する関数を作り出す。
             イメージ f[X[0];Y[0]], f[X[1];Y[1]],...
 X f\: Y   - fは2つ以上の引数をとる関数。
             fからXのぞれぞれをYに作用させる関数を作り出す。
             イメージ f[X[0];Y], f[X[1];Y],...
 X f/: Y   - fは2つ以上の引数をとる関数。
             fからYのぞれぞれをXに作用させる関数を作り出す。
             イメージ f[X;Y[0]], f[X;Y[0]],...

[実行例]
q)f:{sum x,y}
q)X: 1 2 3
q)Y: 10 20 30

q)f each X
{sum x,y}'[1 2 3]
q)
q)(f each X) Y
11 22 33

q)X f' Y
11 22 33
q)X f\: Y
61 62 63
q)X f/: Y
16 26 36

q)X f/:\: Y   / "X (f/:)\: Y "と同じ, (f/:)を関数と見ればよい
11 21 31
12 22 32
13 23 33


[書き方]
f'[X;Y], f\:[X;Y], f/:[X;Y] とも書ける
q)parse "X f' Y"   / parseすれば同じに見える
(';`f)
`X
`Y
q)parse "f'[X;Y]"  / parseすれば同じに見える
(';`f)
`X
`Y

・eachを使った関数の応用
TBW, maybe...



2015年4月22日水曜日

[kdb] Performance (1) distinct / join key

Performanceメモ (1) distinct / join key

重複を排除するために使用するdistinctのPerformance

・数値のリストのリスト
floatのdistinctは非常に遅いので避けるべき。
通常floatをdistinctするケースは無いが、0.1刻みのデータや意図せずfloatになってしまっているケースもあるので注意

q) L: `float$ 10000000?10000i
q) \t distinct L
305

q) L: 10000000?10000i
q) \t distinct L
29

リストのリストをdistinctするときにより影響が大きい
q)L: til 5
q)LL: do[5; L cross L]
q)LL
0 0 0 0 0 0
0 0 0 0 0 1
0 0 0 0 0 2
...
q)count LL
15625

q)LLf: 0.5*10000?LL   / floatのListを作成
q)LLf
0.5 0   0   1   0   1  
0   1.5 0.5 2   1.5 1  
1.5 1   2   1   1   1.5

q)\t distinct LLf   / 要素が10000で1sもかかる
965
q)count  distinct LLf
7448

q)\t 0.5* distinct `int$2*LLf   / castの時間を加えても100倍早い
8
q)count  distinct `int$2*LLf
7448


・Join key
上記と同様に、valueとしてfloatのリストが入っているテーブル同士をjoinする場合、
floatのリストをkeyにしてjoinをすると非常に遅い。
q) meta t   / listをkeyにして結合したい
c   | t f a
----| -----
list| F     
... |      
q) count t   / 
47293j
q) t
list              ..
------------------..
1 2 3 4 5 6   7   ..
1 2 3 4 5 6.5 6.5 ..

q) \t (t同士をlistをkeyに自己結合)
200230j

q) \t (t同士をintに変換したlistをkeyに自己結合)
135j




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/

[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を取得

2015年2月17日火曜日

[Linux] NcFTP

ファイルを再帰的にダウンロードするためのFTPクライアントを探したところ、NcFTPが見つかったのでメモ

・インストール
忘れた。yumで無かったら↓から落としてコンパイル。
NcFTP Client - http://www.ncftp.com/download/

・使い方
man ncftp か ncftpを実行してhelp

・接続方法
ncftp [OPTIONS] [host]
OPTIONOS
-u username
-p password
...

・Bookmark
よくアクセスする接続をbookmarkとして保存できる。
# 現在の接続を保存
ncftp > bookmark

# 一覧を呼び出し
ncftp > bookmarks

・再帰的にダウンロード
ncftp > get -R [target]    <- *が使える

2015年2月16日月曜日

[kdb] File Compression

ファイル圧縮に関するあれこれ

□ kxwiki - Cookbook/FileCompression
http://code.kx.com/wiki/Cookbook/FileCompression


□ contrib
Simon / compress - utilities for compressing kdb+ databases
Simon作成のcontribが便利そうなので、これを使うことにする。

・cutil.qの使い方(一部)
下部のsample sessionに記載の通り、infoテーブルを回しながら、
cinfo -> cuse -> cwrire -> cmv
と実行すればよい。cwriteでtdに指定したディレクトリに圧縮し、cmvで元のファイルを上書きしている。
圧縮済みのディレクトリを対象にしても再度圧縮することはなさそう。
cuse には何種類かバージョンが作成されている。gzipで圧縮する場合はcusegz、 kdb+ipcで圧縮する場合はcusekxを選べばよい。なお、32bit版kdb+でgzip圧縮を使う場合は、32bit版zlibが必要なので注意。(インストール方法のページ参照)
複数の日付・テーブル・カラムを対象にする場合のやり方は、build a bulk request として最下部に記載されている。カラムとかを可変にしたかったので、以下の関数を作成。
//
// 指定ディレクトリ以下をすべて圧縮します。
//
compressAll: {[fromdir;tempdir]
    // prepare
    partitionList: key fromdir:hsym fromdir;
    partitionList: partitionList where partitionList <> `sym;
    tableList: key ` sv fromdir,partitionList[0];
    tempdir: hsym tempdir;
    
    // execute
    {[d;td;partition_table]
        p: partition_table[0];
        t: partition_table[1];
        info:cinfo[d;td;p;t];
        /info:cusekx info;
        info:cusegz info;
        info:cwrite info;
        cmv info:cvalidate info;
    }[fromdir;tempdir;] each cross[partitionList;tableList]
  };

// example
/ compressAll[`:/data/kdb/xxx;`:/data/kdb/work]


・圧縮状態の確認
圧縮状態の一括で確認する方法が見つからなかったので、関数を作成してみた。
グローバルオブジェクトを作成してしまうのは、まあそんなもので。
//
// 指定ディレクトリ以下のすべての圧縮状態を取得します。
//
showCompressionInfo: {[dir]
    CompressStatus:: ([]date:`$();table:`$();col:`$();size:`long$();compressedLength:`long$();uncompressedLength:`long$();algorithm:`int$();logicalBlockSize:`int$();zipLevel:`int$());

    partitionList: key dir:hsym dir;
    partitionList: partitionList where partitionList <> `sym;
    tableList: key ` sv dir,partitionList[0];
    
    {[dir;partition_table]
        partition: partition_table[0];
        table: partition_table[1];
        // column list
        colList: key ` sv dir,partition,table;
        // remove .d
        colList: colList where colList <> `.d;
        // get compresstion statistics
        CompressStatus,:
        {[dir;partition;table;col]
            file: ` sv dir,partition,table,col;
            size: hcount file;
            res: `date`table`col`size`compressedLength`uncompressedLength`algorithm`logicalBlockSize`zipLevel!(partition;table;col;size;0Nj;0Nj;0N;0N;0N);
            res,: -21! file;
            select date, table, col, size, `long$compressedLength, `long$uncompressedLength, `int$algorithm, `int$logicalBlockSize, `int$zipLevel from res
        }[dir;partition;table;] each colList;
    }[dir;] each cross[partitionList;tableList];
    
    // return compression status
    :CompressStatus
  };

// example
/ showCompressionInfo[`:/data/kdb/xxx]

2015年2月2日月曜日

[kdb] Q Math Library (qml) (1) インストール

Q Math Library の使い方メモ
・配布元
http://althenia.net/qml


□インストール
以下は32bitのフリー版kdb向けの説明

(1) パッケージのDL
(2) 32bitコンパイラーのインストール
※先に(3)を実行してエラーになったら必要なものをインストールする感じで

# gcc 
yum install libgcc.i686
# gfortran
yum install libgfortran.i686

# LAPACK(BLAS) ※無くてもよかったっぽい
yum install lapack

ここは結構はまりました。qmlのconfigureではちゃんと動くコンパイラーをインストールしてくれとしか表示されないので。 gccとgfortranの32bitコンパイラーがインストールできているか確認するには、それぞれ簡単なプログラムをコンパイルしてみることをお勧めします。
# gcc
gcc -m64 -o ctest64 ctest.c
gcc -m32 -o ctest32 ctest.c

# gfortran
gfortran -m32 test.f90 -o test32
gfortran test.f90 -o test64

(3) インストール
configureファイルを見るとわかりますが、各種オプションが設定できます。
QHOMEが設定されている場合は、QHOMEのkdbのバージョンを見てコンパイルするビット数を自動で、QHOMEが無い場合はOSのバージョンを見るようです。
フリー版のkdbを使っている場合は32bitで、OSは通常64bitなので、必要があればオプションで32bitになるように設定してください。

# BLASとLAPACKのあたりは適宜
# ./configure --with-blas=/usr/lib64/libblas.so.3.4.2 --with-lapack=/usr/lib64/liblapack.so.3.4.2
./configure --build-blas
make
make test
make install

ちなみに、make install ではqml.qとqml.soがコピーされます。例↓
$ make install
・・・
cp qml.so '/opt/kdb/q'/l32/
cp qml.q  '/opt/kdb/q'/
・・・
(4) 実行
q) \l qml.q
q) .qml
     | ::
dll  | `qml
...
q).qml.nicdf .25 .5 .975                  / normal distribution quantiles
-0.6744898 0 1.959964



・おまけ
Cとfortranのサンプルソース
### CでHello world

#include 
int main(void){
    printf("Hello, World!\n");
    return 0;
}

### FortranでHello world
program main
    print *, 'Hello World!'
end



※最後の行はなぞ。なぜか表示される。。。

2015年1月30日金曜日

[Java] リモートJMX接続

リモートJMX接続ではまったのでメモ

・問題
CentOSでJMXのリモート接続設定を行ったにもかかわらず、リモート接続できない。
ただし、ファイヤーウォールをオフにしたところ接続できた。

・原因と解決策
ファイヤーウォールをオフにして接続して、Mission Controlから接続したところ、見覚えないポートで接続がされている。
調べたところ、JMX接続する際のRMIレジストリポートに加えて、通信用のRMIサーバーポートがあるらしい(デフォルトではランダム?)
-Dcom.sun.management.jmxremote.rmi.port=[port]
で設定したところうまくいきました。
最終的に設定したオプションは以下の通り(SSLは今後)
-Dcom.sun.management.jmxremote.port=[port]
-Dcom.sun.management.jmxremote.rmi.port=[port]
-Dcom.sun.management.jmxremote.access.file=[filepath]
-Dcom.sun.management.jmxremote.password.file=[filepath]
-Dcom.sun.management.jmxremote.ssl=false

↓はテスト用に
-Dcom.sun.management.jmxremote.authenticate=false

↓はなしでも動いた
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.local.only=false

・参考サイト
Oracle:JMXテクノロジを使用するモニタリングと管理 ← ここにわかりやすく書いておいてくれれば・・・
http://docs.oracle.com/javase/jp/8/technotes/guides/management/agent.html

Has anyone ever got a remote JMX JConsole to work?
http://stackoverflow.com/questions/151238/has-anyone-ever-got-a-remote-jmx-jconsole-to-work

JMXでのリモート接続でハマったことAdd Star
http://d.hatena.ne.jp/Kazuhira/20141112/1415782056

2015年1月20日火曜日

[その他] ISO4217 Currency codes

通貨コードに数値コードがあったなんて知りませんでした。
英数字コードに統一という話もでているようですが。
どうしてもintで保存したい場合につかえるかも。

USD 840
EUR 978
JPY 392
...

□Currency codes - ISO 4217
http://www.iso.org/iso/home/standards/currency_codes.htm

□Current currency & funds code list
http://www.currency-iso.org/en/home/tables/table-a1.html

2015年1月16日金曜日

[R] ggplot2メモ

ggplot2関連メモあれこれ

□ 軸
・時間軸の書式
scale_x_datetime() – Time series graph x-axis control

・日付・時刻の構造(R言語の仕様)
https://sites.google.com/site/leihcrev/r/date-and-time

・カンマ区切り
scale_y_continuous(label=comma)

□ グラフ
・Candlestick chart
http://www.perdomocore.com/2012/using-ggplot-to-make-candlestick-charts-alpha/

2015年1月15日木曜日

[R, kdb] Rからkdbを使うメモ

kdb+とR関連メモあれこれ

・kxwiki
http://code.kx.com/wiki/Cookbook/IntegratingWithR

・起動時に呼ぶ
# load q server
source("c:/r/qServer.R"); Sys.setenv(TZ="GMT")
# milisec
options(digits.secs=3)
・行数注意
Rは行数が多いと非常に重くなるので行数に注意
数万行を超えると厳しい

・String
kdbのStringをRに渡すとListになってしまうので、symbolにキャストする

・datetime
datetimeはRで対応していないので、timestampにキャストする

・時刻
時刻型が無いみたいなので、適宜floatでカバーする
たとえば、hourで表示したい場合は、 hour: (0.001*`int$`time$time)%3600 のような形で気合でカバーする

2015年1月6日火曜日

[その他] Win7/8 のウィンドウ枠の幅

いまさらですが、winodows 7/8 のウィンドウの枠の幅が太いなと思って検索したところ、よい記事があったのでメモしておきます。

□ Windows 7/8/8.1のウィンドウ枠の幅を調整する
http://www.atmarkit.co.jp/ait/articles/1404/11/news059.html

windows7 はコンパネから、windows8はレジストリ変更でできるそうです。

設定項目はこちら
項目内容
キーHKEY_CURRENT_USERのControl Panel\Desktop\WindowMetrics
値の名前PaddedBorderWidth
種類REG_SZ(文字列型)
値のデータ0(最小幅)/-60(デフォルト)

だいぶ細くなりました。

2015年1月2日金曜日

[kdb] splayed table for nested sym vectors

symbolのリストをsplayed tableにする場合は特殊な処理が必要らしい

こんな感じのテーブルは対象
c               | t f a
----------------| -----
sym             | s    
datetime        | z    
bidPrice        | f    
askPrice        | f    
targetTypes     | S    <-- これが問題
targetTimes     | Z    
...   
□ kxwiki - cookbook
http://code.kx.com/wiki/Cookbook/SplayedTables - Enumerating nested varchar columns in a table

□ やり方 通常は.Q.en[dbdir;data] でsymファイルが更新されるが、nested sym lists は手動でやれと書いてある。
 > .Q.en does not enumerate nested sym lists; you have to do those manually
kxwikiの例では、symファイルのディレクトリを直接書いてるので、以下のような関数を作成してみた。
enumerateSymList: {[symdir; data]
        (` sv dbdir,`sym)?raze data;
        `sym$'data
    };
// example (/db/sym に作成する場合) 
// enumerateSymList[`:/db] (data)

// こんな感じでつかう
dbdir: `:/data/kdb;
writepath: .Q.par[dbdir;2014.01.06;`$("tt","/")];
writepath set .Q.en[dbdir] update enumerateSymList[dbdir] targetTypes from tt;
writepath set .Q.en[dbdir] update enumerateSymList[dbdir] targetTypes from select from tt where (`date$datetime)=2014.01.06;
splayed tableではEnumerated Typeになるようだ。
c               | t f a
----------------| -----
sym             | s    
datetime        | z    
bidPrice        | f    
askPrice        | f    
targetTypes     |      <-- metaで表示できない
targetTimes     | Z    
...   

q) type first value first select targetTypes from tt
20h