国内 Wireshark 安装

wireshark 是一款网络协议分析器,使用这个工具能够让我们深层次的观察到网络数据传输过程中发生的一切,包括 ICMPTCPUDPSSL 等协议的细节,但是因为官方下载资源地址为国外,在国内它的下载速度十分慢,虽然资源包大小不大,但是动不动得下载好几个小时。

不过好在国内有对应的下载镜像,比如清华大学的下载镜像源:
https://mirrors.tuna.tsinghua.edu.cn/wireshark/

阅读更多

Vim 常见命令及其对应的含义

command desc
w 移动到下一个 word[^1] 的开头
e 移动到下一个 word 的结尾
W 移动到下一个 WORD 的开头
E 移动到下一个 WORD 的结尾
b 移动到上一个 word 的开头
B 移动到上一个 WORD 的开头
ge 移动到上一个 word 的结尾
gE 的移动到上一个 WORD 的结尾
f{char}[^2] 移动到当前行下一个 char 出现的位置
F{char} 移动到当前行上一个 char 出现的位置
t{char} 移动到当前行下一个 char 出现的前一个位置
T{char} 移动到当前行上一个 char 出现的前一个位置
0 移动到当前行的第一个字符位置
^ 移动到当前行的第一个非空字符的位置
$ 移动到当前行的最后一个位置
g_ 移动到当前行的最后一个非空字符的位置
{ 移动到下一个段落
} 移动到上一个段落
/{pattern} 搜索下一个符合的单词[^3]
?{pattern} 搜索上一个符合的单词
gg 移动到文件的最上方
{line}gg 移动到指定的行数
G 移动到文件的末尾
% 移动到匹配 ({[]}) 的位置[^4]
dd 删除整行
D 删除到结尾的字符,相当于 d$
阅读更多

使用 dlv 进行 debug

使用 dlv 可以方便的对 go 生成的二进制文件进行 debug,以下面的代码 main.go 为例讲解 dlv 的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
"net/http"
"time"
)

func Hello(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query().Get("q")
if q != "" {
fmt.Printf("search query: %s\n", q)
}
fmt.Fprintf(w, "Hello World! %s", time.Now())
}

func main() {
http.HandleFunc("/", Hello)
http.ListenAndServe(":8080", nil)
}

阅读更多

Rust 编写 derive 宏

宏可以帮助我们减少重复代码的编写,在 Rust 中有两种宏定义,

  • 声明宏
  • 过程宏

其中,声明宏只是简单的 token 替换,我们无法知道代码结构中的其他信息,过程宏可以获取更加详细的数据,比如我们可以获取结构体中字段的名称,类型等等。

阅读更多

Rust 参数设置默认值

Option 模式?

在调用函数的时候,可能参数比较多,但是我们只需要修改其中的几个特定参数就可以满足我们的需求,而其他的参数我们希望保持不变,但是 Rust 和 Go 一样,函数调用中不支持默认参数,所以我们必须另寻他法,那么第一感觉我们是不是可以采用 Go 中的 选项模式呢?

虽然 Rust 函数中并不支持变参数传递,但是我们可以通过 来间接达到相同的功能,代码如下

阅读更多