流沙河鎮

情報技術系のこと書きます。

q言語基礎_0.5_環境セットアップからHelloWorld!まで

# 以下は2020年頃に執筆した過去ブログのアーカイブです。現在メンテしておらず、一部の情報が古い可能性があります

Kx Systemsが提供するへんてこデータベースもどき「kdb」と、知る人ぞ知るそのDSL「q」の基本を解説するシリーズ。

本連載の目的はq言語の基本的な使い方を日本語で分かりやすく提供することである。細かい情報や定義を知りたい時は適宜「q for mortals」及び「q Tips」を参照されたい。

q for mortals
https://code.kx.com/q4m3/2_Basic_Data_Types_Atoms/
q Tips
https://www.amazon.com/Tips-Fast-Scalable-Maintainable-Kdb-ebook/dp/B00UZ8OMME
 
今回は実行環境セットアップからお約束のHelloWorld!までを解説する。

 

q実行環境のinstall

1. 公式サイトにアカウントを登録してLicenceファイルを入手する。
以下URLからsign upするとライセンスファイルが添付されたメールが届く。メールにはWindows / Linux / Mac版のダウンロードリンクが記載されているので、自分の環境に合ったバージョンをダウンロードしよう。Developers Editionは無料で使えるので安心してほしい。
https://kx.com/connect-with-us/download/
筆者はプライベートではwsl上のUbuntuで作業しているので、ここからはLinuxを前提に話を進めるが、WinやMacでも大きな違いはない。

2. 動作に必要なファイル群を配置する
ダウンロードしたzipファイルの中身と、メールに添付されていたkc.licを任意の場所に以下のような具合で配置する。

$ tree q
q
├── kc.lic
├── l64
│   └── q
└── q.k

1 directory, 3 files

3. 環境変数を設定
この時点で以下のような具合で起動できる。(実際には起動時に簡単なライセンス情報が表示されるのが、一応消している)

$ q/l64/q
KDB+ 3.6 2018.12.06 Copyright (C) 1993-2018 Kx Systems
q) 

いちいちパスを指定するのは面倒なので以下のように環境変数を設定しよう。

export QHOME=/opt/kdb/q
export PATH="$PATH":${QHOME}/l34

$ q
KDB+ 3.6 2018.12.06 Copyright (C) 1993-2018 Kx Systems
q)

HelloWorld!

q言語におけるHelloWorldは何も難しいことはない。以下に色々と例を示すので、試してみて欲しい。

q)"HelloWorld"
"HelloWorld"
q)`HelloWorld
`HelloWorld
q)hello:"HelloWorld!"
q)100#hello
"HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld!HelloWorld..
q)system "echo HelloWorld!"
"HelloWorld!"
q)\\

末尾に示した通り、バッククォート2つでコンソールから抜ける。
処理をファイルに記載して以下のように実行することも出来る。拡張子が.qでなければエラーになるので注意。

$ cat HelloWorld.q
"HelloWorld!"
$ q HelloWorld.q
KDB+ 3.6 2018.12.06 Copyright (C) 1993-2018 Kx Systems

"HelloWorld!"

rlwrap

qコンソールは極めてシンプルな標準入出力に過ぎないので、大変融通が利かない。
入力historyが出せないことなどは当たり前で、それどころか方向キーもデリートキーも効かず、大変ストレスフルだ。

q)aaaa^[[3~^[[3~a^[[3~a^[[3~^[[3~
'char
  [0]  aaaaaa
       ^   ^
q)^[[A^[[A^[[A^[[A
q)aar
'a[0]
  [0]  a
       ^
q)a
'a
  [0]  a
       ^

普段作業する時はもちろん、障害対応時などにこのようなコンソールに付合っていると血管が切れそうになるので、rlwrapを併用することを強く勧める。
linux.die.net
rlwrapは入出力の融通が利かないコマンドの間にアダプター的に割込んで、元のコマンドの振舞を透過しつつ、融通が利くようにしてくれるものだ。
これで入力historyや方向キーが使えるようになる。頻繁に使う人は、このままaliasを貼ってしまうのもアリだろう。

$ rlwrap q
KDB+ 3.6 2018.12.06 Copyright (C) 1993-2018 Kx Systems

q) 

CPUアフィニティ

今の時点では気にする必要はないが、kdbは稼働するコア数に対するライセンス課金なので、実行時にCPUのはり付けを行う必要がある。
また、slaveやNUMAを活用する上でもCPUアフィニティは気にする必要がある。
linuxでcpuアフィニティを実現する方法としてはtasksetとnumactlがあるが、NUMAを考慮するとnumactlを使うことをおすすめする。(tasksetではinterleaveが出来ないため)
taskset(1) - Linux manual page
numactl(8) - Linux man page
以下のような感じだ。

$ numactl --physcpubind=1 q
KDB+ 3.6 2018.12.06 Copyright (C) 1993-2018 Kx Systems

CPUアフィニティ周りの細かい話は以下ページに良く纏まっているので参照されたい。
Linux production notes – Knowledge Base – kdb+ and q documentation - Kdb+ and q documentation

IDE

当面はIDEが必要になるようなスクリプトは書かないので標準的なqコンソールで十分と思うが、いくつか簡単に紹介しておく。

q studio

恐らく最も標準的かつお手軽なq言語の開発、実行環境だろう。
また、KDBを本番運用する上でデータベースの参照や分析にも重宝するツールで、テーブルのhuman readableな表示や、グラフの描画機能等を備えている。

qStudioについてはいずれ詳述する記事を別に書きたい。
www.timestored.com

VS Codeプラグイン

syntaxハイライトを実現する「KDB+/Q」とVS Code上でのターミナル実行を実現する「KDB+/Q-Runner」がある。
纏まったスクリプト、特に他人が書いたものを読むときはsyntaxハイライトがないと厳しいので、そのような時に便利だ。


kx developer

kx Systems謹製のIDE。デバッガ機能や複数の依存性あるqスクリプト群を統合的に扱うことが出来る機能を持っている。
code.kx.com

そういうわけで、環境セットアップとHelloWorld!はこれぐらいにして、次回からはいよいよq言語の文法解説に入る。
第一回は最も基本的なデータ型であるatomの説明から始めよう。
q言語基礎_1_atomの概要