
提示:本文含有代码、表格等,在PC上阅读可获得更好体验。
Win kdb+用得很溜,为何要用Lin kdb+?
听说95%以上的kdb+/q用户使用的是Linux版本,想跟风?
kdb+ Linux版比Win版快,据说快10%以上?
kdb+的Linux相关资源比Win资源丰富?
Linux命令行生活更高效?
linux更高大尚……?
……?
…?
● if[无需求 or linux高手; 绕道 ] ●
选择Linux版本:WSL Ubuntu
Win用户当然直接用Win 10上的WSL。
Win 10自带了一个适用于 Linux 的 Windows 子系统
,叫WSL(Windows Subsystem for Linux)。通过WSL,Windows可以运行真正的Linux及其应用程序。
WSL支持的Linux有Ubuntu、Debian、SUSE等,本文选用Ubuntu 20.04 LTS。
Win10最新版WSL有WSL1和WSL2,本文假设用WSL1。
安装WSL Ubuntu
(1)Win10开始菜单=>设置=>应用=>程序和功能=>启用或关闭Windows功能=>选中“适用于Linux的Windows子系统”(如果找不到该项,说明Win10版本太低,请先升级),重启Win10。

(2)Win菜单选择Microsoft Store,搜索“ubuntu”,选择Ubuntu 20.04 LTS,获取,安装,启动。



关闭该窗口。从win菜单点击 Ubuntu 20.04 LTS,启动成功如下图所示,登录用户为管理员root(相当于win的administrator):

下文我们称这个窗口为Ubuntu shell窗口。
从Windows直接访问Ubuntu文件
Win10可以方便地访问Ubuntu的文件。在资源管理器的地址栏中输入 \\wsl$,可以看到Ubuntu-20.04,双击进入即可(也可以在地址栏直接输入 \\wsl$\ubuntu-20.04直达):


与win不同,linux没有c盘d盘这类盘符,只有一个根目录,用 / 表示。所有子目录和文件都在根目录下面。上图就是根目录里的内容。根目录下各个目录的含义可以参考:https://www.runoob.com/linux/linux-system-contents.html。
Ubuntu软件更新
从Ubuntu官网更新软件速度较慢,我们改为从阿里云镜像站点更新软件。
首先,用记事本打开 \\wsl$\ubuntu-20.04\etc\apt\sources.list文件,将原来的内容全部加上#号注释掉或者删除。
然后,访问https://developer.aliyun.com/mirror/ubuntu,将其中“ubuntu 20.04(focal) 配置”的内容复制贴粘过来并保存。

最后,在Ubuntu Shell执行 apt-get update && apt-get upgrade /y
安装Ubuntu软件
Ubuntu可以用“ apt-get install 软件名称 ”命令安装各种软件。
以安装rlwrap为例。
在Windows中运行kdb+的时候,可以使用向上、向下键来跳回之前已经执行过的q语句,根据需要修改后按Enter键重新提交执行。然而,在Linux中运行kdb+时,kdb+并不提供浏览历史命令行的功能。为了在Linux中达到同样的目的,可以安装rlwrap,安装命令为:
apt-get install rlwrap
下载、安装Linux kdb+
32位linux版kdb+下载:https://kx.com/download
64位linux版kdb+下载:https://ondemand.kx.com
从上述两个网址下载时,均可能需要进行google人机身份认证,需要科学下载。64位版本还可以使用Miniconda安装,可以参考“如何下载64位kdb+?”一文,或者《kdb+中文教程》第九章第五节。
这里假设用户已参考“如何下载64位kdb+?”一文下载了Windows版64位kdb+,取得了授权文件kc.lic(在q.k文件所在目录)。kc.lic也可以用于linux kdb+,我们只需要下载64位q文件。
要下载64位q文件,可以直接访问https://anaconda.org/kx/kdb/files,下载linux-64/kdb-4.0-yyyymmdd.bar.bz2文件,解压。
假设要将kdb+安装到ubuntu的/kdb/q目录,我们可以在ubuntu里操作,也可以在Windows里操作。这里假设在Windows里操作:在\\wsl$\ubuntu-20.04下创建kdb目录,在kdb下创建q目录,q下创建l64目录(l64的l表示Linux),将取得的kc.lic及解压出来的q.k复制到q目录,将q文件复制到l64目录,结果如下图所示:


同时用记事本打开\\wsl$\ubuntu-20.04\root\.bashrc文件,在最后添加以下三行:
export QHOME=/kdb/qexport PATH=/kdb/q/l64:$PATHalias q='rlwrap /kdb/q/l64/q'
第一行设置QHOME指向 q.k所在目录,第二行将/kdb/q/l64目录添加到搜索路径,第三行设置q别名,输入q时执行的是 rlwrap /kdb/q/l64/q。
当root用户登录ubuntu时,.bashrc将自动运行。
运行kdb+
启动ubuntu(修改.bashrc后保存并重新启动ubuntu),在Shell中输入q,这时Shell将显示rlwrap: error: Cannot execute /kdb/q/l64/q: Permission denied。这是因为/kdb/q/l64/q文件是从在windows下解压并复制的,没有正确设置可执行属性,我们在控制台输入
chmod +x /kdb/q/l64/q
然后再输入q就可以启动q了。这里的q和Winodws下的q的用法是一样的,要注意的是linux的文件路径写法与windows不同。
在Windows中访问 linux kdb+
在Ubuntu Shell中执行
q -p 5001
启动一个在端口5001监听的q。
在Windows中启动studio等IDE,可以象访问Windows kdb+一样访问Linux kdb+。
可以看出,Linux kdb+运行在Linux中,但是我们可以在Windows中管理Linux文件(包括kdb+脚本文件)及访问kdb+等,我们在Windows下的一些技能都可以继续使用。
完全在linux中使用kdb+
如果想完全在linux中使用kdb+,我们需要一个文本编辑器用于编辑q脚本,最好还有一个窗口管理工具,再加上q和shell,我们只要用好4个工具就足够了:
(1)Shell:Shell是用户使用 Linux 的桥梁,它提供了一个界面,用户通过这个界面访问操作系统的服务。Shell与Windows的命令提示符窗口相似,但它的功能比Windows的命令提示符强大太多太多了。
(2)窗口管理工具:tmux用于运行多个q,并管理会话,是个神器。
(3)文本编辑器:linux下常用的编辑器有nano、vim、emacs等,其实最简单的nano就够用了,可以配置一下,使得它支持q语法高亮,支持Ctrl+C、Ctrl+V等与Windows一致的快捷键。(许多人会推荐Vim、Emacs编辑器,我们建议先用nano!)
(4)q:直接在q中执行脚本、调试、查看结果等。
10.1
shell的使用
常用的Shell命令有:
ls 用于查看目录及文件
cd 改变当前目录

htop用于查看CPU和内存使用情况等信息
mkdir 创建目录
rm 删除目录或文件
mv 移动目录或文件
clear或ctrl+L用于清屏
更多Linux基础知识见https://www.runoob.com/linux/linux-tutorial.html。
10.2
tmux的使用
Tmux 是一个用于在linux终端窗口中运行多个终端会话的工具,即终端复用软件(Terminal multiplexer)。它使你能够轻松地在多个终端程序之间来回切换,同时你还可以脱离它们(它们将在后台继续运行),然后在另一个终端窗口重新连接它们。
tmux 中有几个重要概念:
会话(session): Session是Tmux中最主要的概念了,默认开启Tmux的时候,就会自动新建一个会话,在这个会话中,也会给你开启一个默认的Window(也即窗口)。Tmux中可以拥有多个会话,多个会话之间可以来回无缝切换。
窗口(window): 相比session,Windows是稍微小一点的单位。一个session中,可以开启多个window。这些window同属于一个Session,并由其管理。
窗格(pane): Panel是比Window更小的界面元素。前面我们也提到了Tmux中可以对window进行任意分割,由window分割出来的单位就叫做panel了。在同一个window中,用户可以控制光标在分割出的panel中随意移动,用以选定当前作为激活状态的panel。

命令:
tmux 启动tmux
tmux a 恢复最近关闭会话
tmux ls 查看所有会话
常用快捷键:
Ctrl+b,c(按Ctrl+b,放开后马上按c) 创建新窗口
Ctrl+b,, 重命名当前窗口
Ctrl+b,p 前一个窗口
Ctrl+b,n 后一个窗口
Ctrl+b,w 选择窗口
Ctrl+b,& 关掉当前窗口
Ctrl+b,d 离开当前会话
Ctrl+b,% 分成左右两个窗格
Ctrl+b," 分成上下两个窗格
Ctrl+b,方向键 光标移到窗格
Ctrl+b,x 关闭当前窗格
更多命令参考https://www.ruanyifeng.com/blog/2019/10/tmux.html
为了更方便进行窗口、窗格切换,我们添加一些快捷键:在\\wsl$\ubuntu-20.04\root\中创建一个名为.tmux.conf的文件,内容如下:
bind -n C-PgUp previous-windowbind -n C-PgDn next-windowbind -n M-Left select-pane -Lbind -n M-Down select-pane -Dbind -n M-Up select-pane -Ubind -n M-Right select-pane -R
重新启动tmux后,可以用 Ctrl+PgUp/PgDn切换tmux窗口,可以用Alt+方向键选择窗格。
10.3
nano的配置及使用
第一次使用nano时,进行一些配置,使得nano的快捷键与windows常用快捷键保持一致,同时使nano支持q语言语法高。
修改nano的快捷键:用记事本打开 \\wsl$\ubuntu-20.04\etc\nanorc,把部分快捷键配置语句前的#删除。

q语法高亮:在\\wsl$\Ubuntu-20.04\usr\share\nano中创建文件,命名为q.nanoc,文件内容如下:
## Syntax highlighting for kdb+/qsyntax q "\.[qk]$"header "^#!.*[qk]"magic "q script"comment "/"# q keywordscolor brightgreen "\<(abs|acos|aj|aj0|ajf|ajf0|all|and|any|asc|asin|asof|atan|attr|avg|avgs|bin|boolean|by|byte|ceiling|char|cols|cor|cos|count|cov)\>"color brightgreen "\<(cross|csv|cut|date|datetime|dd|delete|deltas|depth|desc|dev|differ|distinct|div|do|each|enlist|eval|except|exec|exit|exp|fby)\>"color brightgreen "\<(fills|first|fkeys|flip|float|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hh|hopen|hsym|http|iasc|idesc|if|ij|in)\>"color brightgreen "\<(insert|int|inter|inv|key|keys|last|like|lj|load|log|long|lower|lsq|ltime|ltrim|mavg|max|maxs|mcount|md5|mdev|med|meta|min)\>"color brightgreen "\<(mins|minute|mm|mmax|mmin|mmu|mod|month|msum|nbbo|neg|next|not|null|or|over|parse|peach|pj|plist|prd|prds|prev|price|quote)\>"color brightgreen "\<(rand|rank|ratios|raze|read0|read1|real|reciprocal|reverse|rload|rotate|rsave|rtrim|save|scan|second|select|set|setenv|short)\>"color brightgreen "\<(show|signum|sin|sqrt|ss|ssr|string|sublist|sum|sums|sv|symbol|system|tables|tan|til|time|trade|trim|txf|type|uj|ungroup)\>"color brightgreen "\<(union|update|upper|upsert|value|var|view|views|vs|wavg|week|where|while|within|wj|wsum|xasc|xbar|xcol|xcols|xdesc|xexp)\>"color brightgreen "\<(xgroup|xkey|xlog|xprev|xrank|year)\>"color brightgreen "(\.Q\.addmonths|\.Q\.addr|\.Q\.host|\.Q\.chk|\.Q\.cn|\.Q\.pn|\.Q\.D|\.Q\.dd|\.Q\.dpft|\.Q\.dsftg|\.Q\.en|\.Q\.fc|\.Q\.fk|\.Q\.fmt|\.Q\.fs|\.Q\.ft|\.Q\.gc|\.Q\.hdpf|\.Q\.ind|\.Q\.P|\.Q\.par|\.Q\.PD|\.Q\.pd|\.Q\.pf|\.Q\.PV|\.Q\.pv|\.Q\.qp|\.Q\.qt|\.Q\.s|\.Q\.ty|\.Q\.u|\.Q\.v|\.Q\.V|\.Q\.view)"color brightgreen "(\.z\.a|\.z\.ac|\.z\.b|\.z\.d|\.z\.D|\.z\.f|\.z\.h|\.z\.i|\.z\.k|\.z\.K|\.z\.l|\.z\.o|\.z\.pc|\.z\.pg|\.z\.ph|\.z\.pi|\.z\.po|\.z\.pp|\.z\.ps|\.z\.pw|\.z\.1|\.z\.s|\.z\.t|\.z\.T|\.z\.ts|\.z\.u|\.z\.vs|\.z\.w|\.z\.x|\.z\.z|\.z\.Z|\.z\.n|\.z\.N|\.z\.p|\.z\.P)"color brightgreen "\.[hjm]\."color brightgreen "\<0N[!hijef]"color brightwhite,magenta "^\\[0-2A-Za-z_]+"# Bracketscolor brightred "\{|\}"# Special values.color brightwhite,red "^q)"color brightwhite,red "^p)"# Comments.color yellow "(^|[[:blank:]])/.*"color yellow start="^/$" end="^\\$"
(上面只是简单语法高亮,用户可根据需要自行完善)
10.4
shell+tmux+nano+q
下面通过例子简单介绍一下如果使用shell、tmux、nano、q来编辑q脚本、运行q等。
假设用nano编辑两个q脚本test1.q和test2.q,同时启动2个q,一个端口为5001,运行test1.q,一个端口为5002,运行test2.q。
在shell执行:
tmux

执行
nano /kdb/q/test1.q /kdb/q/test2.q

输入test1.q的内容,按Ctrl+s保存:
f:{0N!(.z.T;x);:x+1};
按Alt+>切换到test2.q,输入如下内容并按Ctrl+s保存:
`::5001(`f;2)
两个文件间可以进行复制、粘贴等操作。

Ctrl+b,,重命名窗口为q5001

Ctrl+b,c 新建一窗口,Ctrl+b,c 窗口名称改为q5002,在其shell中运行 q -p 5002,

按Ctrl+PgUp/PgDn 可以切换窗口。窗口名称后面带"*"号的为当前窗口。
切换到q5001窗口,执行test1.q:

切换到q5002窗口,执行test2.q:

调试q脚本时,可以充分使用q的注释,将暂不需要执行的内容注释掉。q的注释方法有:
/这是单行注释/这是多行注释这是多行注释\\从这里开始的所有内容均为注释
另外,还可以创建一个临时脚本,将需要调试的内容复制到这个临时脚本并执行。毕竟nano创建新文件和复制内容是很方便的。
如果需要画图,那就只好用Windows或Linux图形界面了。
《kdb+中文教程》
全文链接





