/images/avatar.png

Schaepher's Blog

AWK 命令

awk 是文本处理工具。

awk 命令接收的参数分为四个部分:

  1. 选项
  2. 脚本代码
  3. 变量
  4. 待处理文件

大多数 awk 命令只用到选项、脚本代码、待处理文件。

示例文本

test.txt

name,age
xiaoming,20
xiaohong,18

选项

最常用的选项是 -F field-separator,用来选择以什么字符串作为分割字段的依据。例如 -F ',' 表示按照 , 分割行。

iptables

https://www.digitalocean.com/community/tutorials/how-to-list-and-delete-iptables-firewall-rules#:~:text=Deleting%20Rules%20by%20Specification.%20One%20of%20the%20ways,the%20rules%20list%2C%20iptables%20-S%2C%20for%20some%20help.

禁止所有网卡访问 9093 端口

iptables -I INPUT -p tcp –dport 9093 -j DROP

–dport 一定要加在 -p tcp 后面,否则会提示没有该选项。

放行所有访问本机某个网卡的 9093 端口

iptables -I INPUT -d 192.168.1.101 -p tcp –dport 9093 -j ACCEPT

列出所有规则

iptables -L

列出 INPUT 链的所有规则

iptables -L INPUT

列出 INPUT 链的所有规则,带上序号

iptables -L INPUT –line-numbers

编程语言把函数作为 First Class

要求返回接口,但创建对象需要更多参数。

Golang 的 gin 的 Router 的参数:

func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
	return group.handle(http.MethodGet, relativePath, handlers)
}

type HandlerFunc func(*Context)

要求传入以 *Context 为参数且无返回值的函数。

正常情况:

func example(c *gin.Context) {
    // ...
    c.JSON(200, "")
    return
}

func InitRouter() {
    r.GET("/test", example)
}

如果要用到其他 service,由于函数参数无法传入,通常只能用全局。

WEB 服务热更新

已知:

  1. 在一个进程启动子进程的时候,可以将父进程文件描述符复制给子进程
  2. 在 Socket 层面,当进程监听某个端口时,会为其创建一个对应的 TCP_LISTEN Socket,用于监听来自客户端的请求。
  3. TCP_LISTEN Socket 会绑定一个 Socket 文件,该文件位于系统内核空间。文件可以独立于这个 TCP_LISTEN Socket 存在。

做法: