0%

PyQt5简介

在软件设计过程中,图形用户界面(GUI)特别重要,漂亮、简介的用户界面可以增加软件的使用量,减少对终端不熟悉的人员的学习曲线。

Python作为目前超级火的语言,虽然本身不具备GUI功能,但是其强大的胶水特性,可以通过PyQt、Tkinter、wxPython等来扩展GUI功能。

PyQt是一个用于创建GUI应用程序的跨平台工具包,将Python编程语言和Qt库融合在一起。发挥出强强联合的特点。

而PyQt5是Qt5的python扩展,以前还有PyQt4,不过已经不在更新,不建议使用。

Linux sed

grep和sed替换文件中的字符串

1
sed -i s/"str1"/"str2"/g `grep "str1" -rl --include="*.[ch]" ./`

将当前目录下的所有.c、.h文件中的str1字符串替换为str2字符串。

参数解释:
sed:

  • -i 表示操作的是文件,``括起来的grep命令,表示将grep命令的的结果作为操作文件
    s/“str1”/“str2”/表示查找str1并替换为str2,后面跟g表示一行中有多个str1的时候,都替换,而不是仅替换第一个

grep

  • -r表示查找当前目录以及所有子目录
  • -l表示仅列出符合条件的文件名,传给sed命令做替换操作
  • –include=”*.[ch]” 表示仅查找.c、.h文件

注:如果不需要查找子目录,仅需要在当前目录替换,可直接用sed命令:

1
sed -i s/"str1"/"str2"/g ./*.[ch]

使用sed删除文件前N行

  • 删除首行: sed -i '1d' filename.txt
  • 删除1到100行: sed -i '1,100d' filename.txt
  • 删除尾行: sed -i '$d' filename.txt

使用sed删除文件中包含字符hello的行

sed ‘/hello/d’ filename.txt

sockaddr 与 sockaddr_in

在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:

1
2
3
4
5
typedef unsigned short sa_family_t;
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
}

在linux环境下,结构体struct sockaddr_in在/usr/include/netinet/in.h中定义,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Structure describing an Internet socket address. */
struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */

/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
/* 字符数组sin_zero[8]的存在是为了保证结构体struct sockaddr_in的大小和结构体struct sockaddr的大小相等 */
};

struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。

一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。

下面是struct sockaddr_in中用到两个数据类型,具体定义如下:

1
2
3
4
5
6
7
/* Type to represent a port. */
typedef uint16_t in_port_t;

struct in_addr其实就是32位IP地址
struct in_addr {
unsigned long s_addr;
};

BSD网络软件中包含了两个函数,用来在二进制地址格式和点分十进制字符串格式之间相互转换,但是这两个函数仅仅支持IPv4。

1
2
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);

功能相似的两个函数同时支持IPv4和IPv6

1
2
const char *inet_ntop(int domain, const void *addr, char *str, socklen_t size);
int inet_pton(int domain, const char *str, void *addr);

通常的用法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);

my_addr.sin_family = AF_INET; /* 主机字节序 */
my_addr.sin_port = htons(MYPORT); /* short, 网络字节序 */

my_addr.sin_addr.s_addr = inet_addr("192.168.0.1");

bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
//memset(&my_addr.sin_zero, 0, 8);

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

Windows 搜索利器 Everything

MacOSX上好用的工具不少,相信大家对 spotlightalfred 印象很深刻。

今天推荐一款在Windows上使用的软件 Everything,用过MacOSX的童鞋应该都知道Spotlight的绚丽功能,至少这个功能我是一直在使用的,快速的搜索,方便(捉急)的快捷键,把输入法切换给占用了。

这个也是为数不多经常给大家推荐提高工作效率的软件。

Everything应该是为唯一一个民用的Haskell编写的软件,其他都是军用的^_^。

Everything体积小巧,界面简洁易用,快速建立索引,快速搜索,同时占用极低的系统资源,实时跟踪文件变化,并且还可以通过http或ftp形式分享搜索。

在搜索框输入文字,它就会只显示过滤后的文件和目录。Everything搜索只基于文件和文件夹的名称,所以它创建数据库很快。

快到啥程度呢,官方的说明是一个刚安装完的Windows XP SP2系统(约20,000份文件),需要一秒钟。索引一百万份文件则需要一分钟。

我积攒到现在接近600多GB的数据,400多万个文件,第一次索引只用了2分钟,确实快如闪电。

最关键的是,这个软件只有几百KB,只有几百KB,最新版本不倒500KB,你晓得什么概念吧。。。。你估计不晓得什么概念,21世纪初的软盘可以放几份拷贝在上面。

一句话, Everything是速度最快的文件搜索软件,和windows自带搜索功能相比,简直是一个天上一个地下了。当然也可以使用 Total Commander 或其他 ,不过我还是会推荐这款体积小巧、免安装、免费、速度极快(比Locate32更快)的文件搜索工具Everything.

常用的普通搜索就可以了,进阶版的可以使用正则表达式。

搜索技巧

可以通过正则表达式更加高效地使用Everything,比如下面的一些技巧。

比如我希望找到一个2016年访问过的,文件超过1GB大小的视频,该视频包含了family字样,就可以用下面的搜索技巧搜索:

1
video: size:>1GB dateaccessed:2016 family

其他一些比较常用的为:

操作符

  • hello world : 将搜索包含hello 和 world的文件或文件夹
  • hello | world : 将搜索包含hello 或 world的文件或文件夹
  • hello !world : 将搜索包含hello 不包含world 的文件或文件夹

通配符

  • 20??01 :因为?表示一个字符,所以这个表示搜索包含20??01的文件或文件夹,其中20与01之间包含2个字符
  • 20*01:因为*表示匹配0或多个字符,所以搜索的范围比较广

有一些有用的宏,比较方便使用,如下:

  • audio: 搜索音频文件
  • zip: 搜索压缩文件.
  • doc: 搜索文档文件.
  • exe: 搜索可执行文件.
  • pic: 搜索图片文件.
  • video: 搜索视频文件.

修饰符

  • case: 区分大小写.
  • file: 仅匹配文件.
  • folder: 仅匹配文件夹.
  • nocase: 不区分大小写.
  • path: 匹配路径和文件名.
  • regex: 启用正则表达式.
  • wholefilename: 匹配完整文件名.

几个常用函数

  • dateaccessed:<date> 搜索指定访问时间的文件和文件夹.
  • datecreated:<date> 搜索指定创建日期的文件和文件夹.
  • datemodified:<date> 搜索指定修改日期的文件和文件夹.
  • size:<size> 搜索指定大小的文件 (以字节为单位),可以指定为kb,mb和gb

接下来的就是开始下载使用吧。

开发利器之PyCharm

在没有遇到Jetbrains的开发套件之前,其实我是犹豫的,比如我会用着成为利器之神的VIM,然后成为神之利器的Emacs,偶尔在用下号称编码人员最爱的Sublime,直到遇到Jetbrains开发套件,套不犹豫地购买License,开始徜徉在Jetbrains的海洋中,云淡风轻,与世无争。

悄悄告诉你一件事情,其实有些套件是有Community版本的,没有License的限制,但是相应地功能也会少一些,可以先试用,感觉性价比可以了在购买。

为什么呢,因为Jetbrains各个系列都拥有高度一致的开发GUI,集成了VIM,让我效率很高,集成了Git,让我在一个开发环境中可以完成需要切换N个终端才能完成的事情,还有自动代码格式化,代码完成、重构,等等。

待我细细讲来。

先来个预览吧,

screenshot

Pycharm

Pycharm特点

如所有其它 JetBrains 集成开发环境一样,PyCharm 具有智能代码编辑器,能理解 Python 的特性并提供卓越的生产力推进工具:自动代码格式化、代码完成、重构、自动导入和一键代码导航等。这些功能在先进代码分析程序的支持下,使 PyCharm 成为 Python 专业开发人员和刚起步人员使用的有力工具。

这些够了吗,这些还不够,还有:

  • 针对 Django 开发的高级支持,包括智能代码完成、检查、重构和特定代码导航
  • 综合 Python 调试器和图形单元测试工具
  • 支持先进 Python 开发工具链,包括 virtualenv 和 buildout
  • 版本控制系统整合——针对 Mercurial、Git、SVN、Perforce 和 CVS 等大多数版本控制系统的统一用户界面 (UI)
  • Google App Engine 支持,能到 App Engine 服务器上运行和部署用户的应用,同时确保代码满足沙盒环境需求
  • REPL 和 Django 控制台,具备胜过标准控制台的众多优势:运行中语法检查;括号和引号匹配和自动配对;以及代码完成。
  • 还有跨平台,通杀三大主流平台Windows,MacOSX和Linux,当然我觉得MacOSX上吗的体验最好。

Pycharm快捷键

调出快捷键的方法很简单,入下图所示:

shortcut

列出的快捷键如下面所示:

shortcut-all

其实我们用到的快捷键远远没有那么多啦,不过作为一个辣么牛的编辑器,一句话,别人可以不用,但是你不能没有,意思就是:

有没有是你的态度,用不用是我的权利。

这一点标明Jetbrains的态度那是杠杠滴OK。

用到的快捷键就那下面几个,一一说来。

代码基本完成快捷键

这个功能但凡能存活到现在的编辑器,都会具有这个功能,就是看代码完成的效率问题了。

这里有一个比较悲催的事情,就是Jetbrains默认的快捷键总是会跟输入法切换键有冲突,所以这个是我们需要比较注意的,我们需要改变这个快捷键,如何修改参考下面的修改默认快捷键,因为默认的快捷键比较多,可以在搜索区域输入basic即可。不要用你使用最多的键,比如可以改为**Ctrl + ,**,这个目前看来还没有跟其他什么主流软件有冲突,所以培养用户的习惯还是很重要的。

其实这个功能我用的不是特别多,这是为什么呢,因为在你输入的过程中,Jetbrains已经会比较快捷方便地给你提示了。如下所示:

hello

霸气的TAB

如果在Linux里面你还是照旧所有的字符都输入进入,我只能说佩服,还有不屑,因为在节省时间的问题上,为什么不用下Tab键呢?

Jetbrains也有这个很好的传统,有两种情况:

  1. 当你什么也没有输入的时候,Tab默认是4个空格的缩进
  2. 但是当你输入前几个字母的时候,Jetbrains会智能地列出所有的候选项,这时候你只要按下Tab,就会默认选择第一个候选项,这对于双手不离开键盘而言,是很好的提高输入速度,以及保证流畅思考编程的一个小技巧。

Shift+Enter 智能换行

如果鼠标位于class function():的任何一个位置,此时(ˇˍˇ) 想~写下一行代码了,小case,直接Shift+Enter切换到下一行正确的位置写代码即可。

修改默认快捷键

打开Preference,或者快捷栏中看起来像扳手的tool图标,会打开如下所示的界面,在左侧中选择keymap即可。

keymap

PyCharm插件

如何安装插件

同样跟修改快捷键一样,这次要找的是Plugins,顺便力推几个插件。

plugin

VIM插件

效果就是PyCharm的编辑器就是一个VIM开启的终端,各种赞。

顺便提供一个vim的快捷键,供参考。

vim

支持Markdown

写作如果现在你还在用富文本编辑器,估计会被鄙视的,高大上一点,最重要的是有效率一点,那就妥妥滴Markdown吧,会自动解析Markdown的各种标记。

markdown

支持Docker

我下载了一个docker,打开工程的时候,会提示:

docker

Debian 镜像更新源

镜像更新源做的比较好的有网易163、阿里云还有中科大。

方法为编辑/etc/apt/sources.list文件,替换为下述内容即可。

最好做好备份。

网易提供的源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
## Jessie

deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib

# Wheezy

deb http://mirrors.163.com/debian/ wheezy main non-free contrib
deb http://mirrors.163.com/debian/ wheezy-updates main non-free contrib
deb http://mirrors.163.com/debian/ wheezy-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ wheezy main non-free contrib
deb-src http://mirrors.163.com/debian/ wheezy-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ wheezy-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ wheezy/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ wheezy/updates main non-free contrib

# Squeeze

deb http://mirrors.163.com/debian/ squeeze main non-free contrib
deb http://mirrors.163.com/debian/ squeeze-updates main non-free contrib
deb http://mirrors.163.com/debian/ squeeze-lts main non-free contrib
deb-src http://mirrors.163.com/debian/ squeeze main non-free contrib
deb-src http://mirrors.163.com/debian/ squeeze-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ squeeze-lts main non-free contrib
deb http://mirrors.163.com/debian-security/ squeeze/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ squeeze/updates main non-free contrib
deb http://mirrors.163.com/debian-backports/ squeeze-backports main contrib non-free
deb-src http://mirrors.163.com/debian-backports/ squeeze-backports main contrib non-free

如果163的无法更新,可以考虑使用中科大的源

中国科技大学源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#(1)squeeze版本

deb http://ftp.cn.debian.org/debian squeezemain

deb-src http://ftp.cn.debian.org/debiansqueeze main

deb http://ftp.cn.debian.org/debiansqueeze-updates main

deb-src http://ftp.cn.debian.org/debiansqueeze-updates main

debhttp://ftp.cn.debian.org/debian-backports squeeze-backports main

deb-srchttp://ftp.cn.debian.org/debian-backports squeeze-backports main

deb http://security.debian.org/squeeze/updates main

deb-src http://security.debian.org/squeeze/updates main

#或:

deb http://ftp.cn.debian.org/debian squeeze main non-free

deb-src http://ftp.cn.debian.org/debiansqueeze main non-free

deb http://ftp.cn.debian.org/debiansqueeze-updates main non-free

deb-src http://ftp.cn.debian.org/debiansqueeze-updates main non-free

debhttp://mirrors.ustc.edu.cn/debian-security/ squeeze/updates main non-free

deb-srchttp://mirrors.ustc.edu.cn/debian-security/ squeeze/updates main non-free



# wheezy版本

deb http://ftp.cn.debian.org/debian/ wheezy main contrib non-free

deb-src http://ftp.cn.debian.org/debian/ wheezy main contrib non-free



deb http://ftp.cn.debian.org/debian/ wheezy-proposed-updates main contrib non-free

deb-src http://ftp.cn.debian.org/debian/ wheezy-proposed-updates main contrib non-free



deb http://ftp.cn.debian.org/debian/ wheezy-backports main contrib non-free

deb-src http://ftp.cn.debian.org/debian/ wheezy-backports main contrib non-free



# jessie版本

deb http://ftp.cn.debian.org/debian/ jessiemain contrib non-free

deb-src http://ftp.cn.debian.org/debian/ jessiemain contrib non-free

deb http://ftp.cn.debian.org/debian/ jessie-proposed-updates main contrib non-free

deb-src http://ftp.cn.debian.org/debian/ jessie-proposed-updates main contrib non-free

deb-amd64http://ftp.cn.debian.org/debian-security jessie/updates main contrib non-free

阿里云的源

1
2
3
4
deb http://mirrors.aliyun.com/debian/ wheezy main non-free contrib
deb http://mirrors.aliyun.com/debian/ wheezy-proposed-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ wheezy main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ wheezy-proposed-updates main non-free contrib

对于Debian7.8的版本,被归档了,我试了一下只有下面的这个可以用

1
deb http://archive.debian.org/debian/ wheezy main contrib non-free

简介

sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys目录下。sysctl配置与显示在/proc/sys目录中的内核参数.可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑/etc/sysctl.conf文件,即可手工或自动执行由sysctl控制的功能。

命令格式

1
2
3
4
5
sysctl [-n] [-e] -w variable=value

sysctl [-n] [-e] -p <filename> (default /etc/sysctl.conf)

sysctl [-n] [-e] -a

命令参数

  • -w 临时改变某个指定参数的值,如 sysctl -w net.ipv4.ip_forward=1
  • -a 显示所有的系统参数
  • -p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

使用范例:

如果仅仅是想临时改变某个系统参数的值,可以用两种方法来实现,例如想启用IP路由转发功能:

1
2
3
#echo 1 > /proc/sys/net/ipv4/ip_forward

#sysctl -w net.ipv4.ip_forward=1

以上两种方法都可能立即开启路由功能,但如果系统重启,或执行了

1
# service network restart

命令,所设置的值即会丢失,如果想永久保留配置,可以修改/etc/sysctl.conf文件将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1

还有一种方法设置主机名

sysctl kernel.hostname

简介

Tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。
使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;
是BSD实现的Screen替代品,相对于Screen,它更加先进:支持屏幕切分,而且具备丰富的命令行参数,使其可以灵活、动态的进行各种布局和操作。

功能

  • 提供了强劲的、易于使用的命令行界面。
  • 可横向和纵向分割窗口。
  • 窗格可以自由移动和调整大小,或直接利用四个预设布局之一。
  • 支持 UTF-8 编码及 256 色终端。
  • 可在多个缓冲区进行复制和粘贴。
  • 可通过交互式菜单来选择窗口、会话及客户端。
  • 支持跨窗口搜索。
  • 支持自动及手动锁定窗口。

使用

进入tmux面板后,一定要先按ctrl+b,然后松开,再按其他的组合键才生效。

新建会话

第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1。
使用编号区分会话,不太直观,更好的方法是为会话起名。
使用下面的指令即可:

1
$ tmux new -s <session-name>

查看会话

查看当前所有的 Tmux 会话

1
2
3
$ tmux ls
# or
$ tmux list-session

分离会话

这个是最常用的方法了,按下Ctrl+b d或者输入tmux detach命令,就会将当前会话与窗口分离。
而此时会话里面的进程依然在后台执行。

参考查看会话来查看所有的会话。

接入会话

attach命令用于重新接入某个已存在的会话,可以通过编号或者会话名来接入

1
2
3
4
5
# 使用会话编号
$ tmux attach -t 0

# 使用会话名称
$ tmux attach -t <session-name>

杀死会话

可以通过tmux kill-session命令用于杀死某个会话,与attach类似,可以通过会话编号与session名来kill

1
2
3
4
5
# 使用会话编号
$ tmux kill-session -t 0

# 使用会话名称
$ tmux kill-session -t <session-name>

切换会话

tmux switch命令用于切换会话。

1
2
3
4
5
# 使用会话编号
$ tmux switch -t 0

# 使用会话名称
$ tmux switch -t <session-name>

重命名会话

tmux rename-session命令用于重命名会话。

1
$ tmux rename-session -t 0 <new-name>

上面命令将0号会话重命名。

最简操作流程

综上所述,以下是 Tmux 的最简操作流程。

  1. 新建会话tmux new -s session_name
  2. 在 Tmux 窗口运行所需的程序
  3. 按下快捷键Ctrl+b d将会话分离
  4. 下次使用时,重新连接到会话tmux attach-session -t session_name

窗格操作

Tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。以下命令都是在 Tmux 窗口中执行。

划分窗格

tmux split-window命令用来划分窗格。

1
2
3
4
5
# 划分上下两个窗格
$ tmux split-window

# 划分左右两个窗格
$ tmux split-window -h

移动光标

tmux select-pane命令用来移动光标位置。

1
2
3
4
5
6
7
8
9
10
11
# 光标切换到上方窗格
$ tmux select-pane -U

# 光标切换到下方窗格
$ tmux select-pane -D

# 光标切换到左边窗格
$ tmux select-pane -L

# 光标切换到右边窗格
$ tmux select-pane -R

交换窗格位置

tmux swap-pane命令用来交换窗格位置。

1
2
3
4
5
# 当前窗格上移
$ tmux swap-pane -U

# 当前窗格下移
$ tmux swap-pane -D

窗口管理

除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口。

新建窗口

tmux new-window命令用来创建新窗口。

1
2
3
4
$ tmux new-window

# 新建一个指定名称的窗口
$ tmux new-window -n <window-name>

切换窗口

tmux select-window命令用来切换窗口。

1
2
3
4
5
# 切换到指定编号的窗口
$ tmux select-window -t <window-number>

# 切换到指定名称的窗口
$ tmux select-window -t <window-name>

重命名窗口

tmux rename-window命令用于为当前窗口起名(或重命名)。

1
$ tmux rename-window <new-name>

七、其他命令
下面是一些其他命令。

列出所有快捷键,及其对应的 Tmux 命令

$ tmux list-keys

列出所有 Tmux 命令及其参数

$ tmux list-commands

列出当前所有 Tmux 会话的信息

$ tmux info

重新加载当前的 Tmux 配置

$ tmux source-file ~/.tmux.conf

常用到的几个组合键:

快捷键 说明
ctrl+b ? 显示快捷键帮助
ctrl+b 空格键 采用下一个内置布局,这个很有意思,在多屏时,用这个就会将多有屏幕竖着展示
Ctrl+b , 窗口重命名
ctrl+b ! 把当前窗口变为新窗口
ctrl+b “ 模向分隔窗口
ctrl+b % 纵向分隔窗口
Ctrl+b ; 光标切换到上一个窗格
Ctrl+b { 当前窗格与上一个窗格交换位置
Ctrl+b } 当前窗格与下一个窗格交换位置
ctrl+b 空格键 采用下一个内置布局,这个很有意思,在多屏时,用这个就会将多有屏幕竖着展示
ctrl+b ! 把当前窗口变为新窗口
ctrl+b “ 模向分隔窗口
ctrl+b % 纵向分隔窗口
ctrl+b q 显示分隔窗口的编号
ctrl+b o 跳到下一个分隔窗口。多屏之间的切换
ctrl+b 上下键 上一个及下一个分隔窗口
ctrl+b C-方向键 调整分隔窗口大小
ctrl+b & 确认后退出当前tmux
ctrl+b [ 复制模式,即将当前屏幕移到上一个的位置上,其他所有窗口都向前移动一个。
ctrl+b c 创建新窗口
ctrl+b d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
ctrl+b n 选择下一个窗口
ctrl+b l 最后使用的窗口
Ctrl+b o 光标切换到下一个窗格
ctrl+b n 选择下一个窗口
ctrl+b l 最后使用的窗口
ctrl+b p 选择前一个窗口
ctrl+b w 以菜单方式显示及选择窗口
ctrl+b s 以菜单方式显示和选择会话。这个常用到,可以选择进入哪个tmux
ctrl+b t 显示时钟。然后按enter键后就会恢复到shell终端状态
Ctrl+b q 显示窗格编号
Ctrl+b x 关闭当前窗格
Ctrl+b z 当前窗格全屏显示,再使用一次会变回原来大小
Ctrl+b 光标切换到其他窗格。是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓
Ctrl+b Ctrl+o 所有窗格向前移动一个位置,第一个窗格变成最后一个窗格
Ctrl+b Alt+o 所有窗格向后移动一个位置,最后一个窗格变成第一个窗格
Ctrl+b Ctrl+ 按箭头方向调整窗格大小
Ctrl+b 切换到指定编号的窗口,其中的是状态栏上的窗口编号

基本概念

tmux有三个基本概念:

  • 会话(Session)
  • 窗口(Window)
  • 面板(Pane)

窗格(Pane)操作

  • % 左右平分出两个窗格
  • “ 上下平分出两个窗格
  • x 关闭当前窗格
  • { 当前窗格前移
  • } 当前窗格后移
  • ; 选择上次使用的窗格
  • o 选择下一个窗格,也可以使用上下左右方向键来选择
  • space 切换窗格布局,tmux 内置了五种窗格布局,也可以通过 ⌥1 至 ⌥5来切换
  • z 最大化当前窗格,再次执行可恢复原来大小
  • q 显示所有窗格的序号,在序号出现期间按下对应的数字,即可跳转至对应的窗格

窗口(window)操作

tmux 除了窗格以外,还有窗口(window) 的概念。依次使用以下快捷键来熟悉 tmux 的窗口操作:

  • c 新建窗口,此时当前窗口会切换至新窗口,不影响原有窗口的状态
  • p 切换至上一窗口
  • n 切换至下一窗口
  • w 窗口列表选择,注意 macOS 下使用 ⌃p 和 ⌃n 进行上下选择
  • & 关闭当前窗口
  • , 重命名窗口,可以使用中文,重命名后能在 tmux 状态栏更快速的识别窗口 id
  • 0 切换至 0 号窗口,使用其他数字 id 切换至对应窗口
  • f 根据窗口名搜索选择窗口,可模糊匹配

Session操作

刚说完flag就倒了,本地使用还好,SSH的时候session真的必不可少。

下面列出一些session的操作

启动新会话:

1
tmux [new -s 会话名 -n 窗口名]

恢复会话:

1
tmux at [-t 会话名]

列出所有会话:

1
tmux ls

关闭会话:

1
tmux kill-session -t 会话名

关闭所有会话:

1
tmux kill-server

载入数据

现在我们已经在Difmap环境中了,将有一个如下的提示符:

1
0>

现在我们开始输入第一个命令,用于载入数据。

1
0> observe YOUR_DATA

提示:这里可以简单地输入obs然后使用Tab即可补全剩余的命令。这项技术有助于在整个Difmap的使用过程中节省宝贵的时间。随时随地掌握这些技巧,可以提升软件使用体验^_^。
此时应该可以看到下述输出了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Reading UV FITS file: 3C219.L(A.butDefinitelyB).postProc.uvf
AN table 1: 2454 integrations on 406 of 406 possible baselines.
Apparent sampling: 0.732128 visibilities/baseline/integration-bin.
Found source: 3C219

There are 2 IFs, and a total of 2 channels:

IF Channel Frequency Freq offset Number of Overall IF
origin at origin per channel channels bandwidth
------------------------------------------------------------- (Hz)
01 1 1.385e+09 2.5e+07 1 2.5e+07
02 2 1.665e+09 2.5e+07 1 2.5e+07

Polarization(s): RR LL RL LR

Read 307 lines of history.

Reading 5835496 visibilities.

该命令详细列出了源的相关信息。检查所有的Ifs,通道、频率等都是正确的。如果出现了诸如“”的错误,你可能需要返回AIPS来确定输出了正确的数据。如果需要得到更多的信息,可以输入下述命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82

0> header
UV FITS miscellaneous header keyword values:
OBSERVER = "AC149"
DATE-OBS = "1986-05-18"
ORIGIN = "AIPSlocalhost LOCALHOST 31DEC11"
TELESCOP = "VLA"
INSTRUME = "VLA"
EQUINOX = 2000.00

Sub-array 1 contains:
406 baselines 29 stations
2454 integrations 4 scans

Station name X (m) Y (m) Z(m)
01 VLA:_N28 -1.600864e+06 -5.041770e+06 3.557965e+06
02 VLA:_W28 -1.604866e+06 -5.046527e+06 3.552962e+06
03 VLA:_N16 -1.601062e+06 -5.041898e+06 3.556058e+06
04 VLA:_W24 -1.604009e+06 -5.045468e+06 3.553404e+06
05 VLA:_W12 -1.602045e+06 -5.043040e+06 3.554428e+06
06 VLA:_W04 -1.601316e+06 -5.042139e+06 3.554808e+06
07 VLA:_W20 -1.603250e+06 -5.044530e+06 3.553798e+06
08 VLA:_W36 -1.606842e+06 -5.048973e+06 3.551913e+06
09 VLA:_W08 -1.601614e+06 -5.042508e+06 3.554652e+06
10 VLA:_E32 -1.597053e+06 -5.036606e+06 3.553059e+06
11 VLA:_OUT -1.601185e+06 -5.041978e+06 3.554876e+06
12 VLA:_N36 -1.600691e+06 -5.041658e+06 3.559632e+06
13 VLA:_E36 -1.596128e+06 -5.035403e+06 3.552652e+06
14 VLA:_W16 -1.602593e+06 -5.043718e+06 3.554141e+06
15 VLA:_N32 -1.600781e+06 -5.041716e+06 3.558761e+06
16 VLA:_N20 -1.601005e+06 -5.041861e+06 3.556610e+06
17 VLA:_E12 -1.600416e+06 -5.040979e+06 3.554536e+06
18 VLA:_E20 -1.599341e+06 -5.039580e+06 3.554065e+06
19 VLA:_E28 -1.597900e+06 -5.037707e+06 3.553432e+06
20 VLA:_E24 -1.598663e+06 -5.038699e+06 3.553767e+06
21 VLA:_N08 -1.601148e+06 -5.041953e+06 3.555236e+06
22 VLA:_N04 -1.601174e+06 -5.041970e+06 3.554987e+06
23 VLA:_E08 -1.600802e+06 -5.041479e+06 3.554706e+06
24 VLA:_E16 -1.599926e+06 -5.040341e+06 3.554320e+06
25 VLA:_E04 -1.601069e+06 -5.041826e+06 3.554825e+06
26 VLA:_N12 -1.601110e+06 -5.041929e+06 3.555597e+06
27 VLA:_N24 -1.600930e+06 -5.041813e+06 3.557330e+06
28 VLA:_W32 -1.605809e+06 -5.047694e+06 3.552459e+06
29 VPT:_OUT -1.601185e+06 -5.041978e+06 3.554876e+06

There are 2 IFs, and a total of 2 channels:

IF Channel Frequency Freq offset Number of Overall IF
origin at origin per channel channels bandwidth
------------------------------------------------------------- (Hz)
01 1 1.385e+09 2.5e+07 1 2.5e+07
02 2 1.665e+09 2.5e+07 1 2.5e+07

Source parameters:
Source: 3C219
RA = 09 21 08.548 (2000.0) 09 20 14.260 (apparent)
DEC = +45 38 57.920 +45 42 30.877
Antenna pointing center:
OBSRA = 09 21 08.548 (2000.0)
OBSDEC = +45 38 57.920

Data characteristics:
Recorded units are UNCALIB.
Recorded polarizations: RR LL RL LR
Phases are rotated 0 mas East and 0 mas North.
UVW coordinates are rotated by 0 degrees clockwise.
Scale factor applied to FITS data weights: 1
Coordinate projection: SIN

Summary of overall dimensions:
1 sub-arrays, 2 IFs, 2 channels, 2454 integrations
4 polarizations, and up to 406 baselines per sub-array

Time related parameters:
Reference date: 1986 day 249/00:00:00 (1986 Sep 06)
Julian Date: 2446679.50, Epoch J1986.678
GAST at reference date: 22 59 10.041
Coherent integration time = 0.0 sec
Incoherent integration time = 0.0 sec
Sum of scan durations = 26460 sec
UT range: 249/09:51:21 to 249/23:30:22
Mean epoch: JD 2446680.195 = J1986.680

此时在启动目录会生成一个log文件difmap.log,这个文件记录了你在DIFMAP交互环境中输入的所有命令。 It will also include selected output lines though they will be preceded by a ! in order to comment them out.
这个log文件可以通过一种脚本的形式来使用,可以通过在交互命令中输入 @difmap.log来执行这个脚本。
但需要注意的是这个脚本无法与PGPLOT进行交互,所以交互式的flagging都不会发生。所以要特别注意这一点。

The next step is to choose the Stokes parameter you are interested in:

1
2
3
4
0> select i

Where i refers to the Stokes I parameter. You can select any Stokes parameter (e.g. select q or u) to work with.

代码参考 https://www.github.com/shaoguangleo/radio_astronomy