暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Windows用户玩转Linux kdb+

kdb中文教程 2020-12-23
1492

提示:本文含有代码、表格等,在PC上阅读可获得更好体验。


01

Win kdb+用得很溜,为何要用Lin kdb+?

听说95%以上的kdb+/q用户使用的是Linux版本,想跟风?

kdb+ Linux版比Win版快,据说快10%以上?

kdb+的Linux相关资源比Win资源丰富?

Linux命令行生活更高效?

linux更高大尚……?

……?

…?

● if[无需求 or linux高手; 绕道 ] ●


02


选择Linux版本:WSL Ubuntu

Win用户当然直接用Win 10上的WSL。

Win 10自带了一个适用于 Linux 的 Windows 子系统

,叫WSLWindows Subsystem for Linux)。通过WSL,Windows可以运行真正的Linux及其应用程序。

WSL支持的Linux有Ubuntu、Debian、SUSE等,本文选用Ubuntu 20.04 LTS

Win10最新版WSL有WSL1和WSL2,本文假设用WSL1


03

安装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窗口。


04

从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。



05

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


06

安装Ubuntu软件


Ubuntu可以用“ apt-get install 软件名称  ”命令安装各种软件。

以安装rlwrap为例。

在Windows中运行kdb+的时候,可以使用向上、向下键来跳回之前已经执行过的q语句,根据需要修改后按Enter键重新提交执行。然而,在Linux中运行kdb+时,kdb+并不提供浏览历史命令行的功能。为了在Linux中达到同样的目的,可以安装rlwrap,安装命令为:


apt-get install rlwrap



07

下载、安装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/q
export PATH=/kdb/q/l64:$PATH
alias q='rlwrap /kdb/q/l64/q'

第一行设置QHOME指向 q.k所在目录,第二行将/kdb/q/l64目录添加到搜索路径,第三行设置q别名,输入q时执行的是 rlwrap /kdb/q/l64/q


当root用户登录ubuntu时,.bashrc将自动运行。



08

运行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不同。



09

在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下的一些技能都可以继续使用。



10

完全在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-window
bind -n C-PgDn next-window
bind -n M-Left select-pane -L
bind -n M-Down select-pane -D
bind -n M-Up select-pane -U
bind -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+/q


syntax q "\.[qk]$"
header "^#!.*[qk]"
magic "q script"
comment "/"


# q keywords
color 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_]+"


# Brackets
color 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+中文教程》

  全文链接

前言及目录
第一章  简介

第二章  数据类型

第三章  数组

第四章  字典

第五章  函数

第六章  表与qSQL

第七章  I/O操作

第八章  数据库

第九章  应用例子

第十章  问答(含参考文献)





文章转载自kdb中文教程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论