如果说 poll 是 select 的简单优化,那么 epoll 就是 poll 的下一代。
典型的同步非阻塞方案
epoll 作为「次时代」的同步非阻塞 IO 模型,其真正划时代的点在于终于实现了「边缘触发」。
思考如下情况
- (epoll_add) 监听 socketA,socketA 此时无数据
- socketA 被写入了 2Byte
- select / poll / epoll_wait 监听 socketA 返回结果
- 从 socketA 读了 1Byte
群晖的 VMM 安装 Linux 的新版本可能会出现 kernel panic,这是由于使用的 CPU 不支持 AVX 指令引起的。
最简单的解决方案:在虚拟机关机状态下,修改 CPU 为「启用 CPU 兼容模式」
一下是原方案
解决方式是 VMM 中引导方式修改为使用 UEFI 引导,在启动菜单页面按 e
修改引导参数,在 quiet
后添加 noxsave
(注意空格作为分隔符)并按 Ctrl-X 进行保存、启动即可
Redis 的多个「数据库」间并未隔离,也没有良好的权限控制,拿到任何一个连接 Redis 的服务的权限就可以直接控制所有数据,这无疑是不安全的。
Redis 想要真正做到多数据库间隔离只有运行多个 Redis 实例,将其启动在不同的端口、设定不同的配置文件和数据目录,因为 Redis 本身对于资源的消耗并不大因此启动多个实例并不比在一个实例中创建多个数据库造成更大开销。
最简单的方式自然是利用 Docker(或者 docker-compose / k8s 等容器编排技术),这种情况只要指定不同的数据卷位置和映射端口即可,没有任何难度,因此不说了
协同工作时经常需要将一些配置文件放到仓库中,这时要保证本地的更改不会影响到远端。
一个方式是将相应文件放到 .git/info/exclude
中(语法同 .gitignore),这个文件只会在本地生效,不会上传到云端仓库
但这种方式对于已经存在的文件就无效了,如果本地编辑仓库中已经有的文件则依然会显示出更改,因此需要利用 git 的 update-index --assume-unchanged
命令将文件让 git「假装我没改过」
将以下内容加入 git config 可以简化使用
1 | [alias] |
因最近有一个需求是实现 scp,因此调研了一下 scp 的原理。
网上并没有一个对 scp 进行说明的文章,因此可以直接看 scp 实现的代码
https://github.com/openssh/openssh-portable/blob/master/scp.c
根据代码发现:scp 实现实际上就是在连接上远端服务器的 ssh 后又启动了一个 scp 进程。也就是 scp 使用必须依赖于目标服务器有 scp 存在。
本文暂时只介绍了从本地向远端发送文件的相关内容,从远端接收后续再写
方式:在 pom 中引入 properties-maven-plugin
1 | <project> |
RFC 7685 定义了一个 TLS 握手过程中 Client Hello 阶段的 Padding Extension。虽然 RFC 中没有写,但是实践是利用 padding 使 Client Hello 总大小不在 256-511 字节中间。
这是为了解决 F5 公司的某产品的 bug。
另外,规范还规定了 padding 内容必须为全 0,这是为了防止利用 padding 内容进行隐蔽通道数据传输(简而言之,隐蔽信道是攻击者用于突破防火墙检测的数据传输方式,参考中列出了一个实例)。
RFC 7685 - A Transport Layer Security (TLS) ClientHello Padding Extension
Ecosystem File 按照如下写法
1 | const fs = require("fs"); |
ts-node
的绝对路径(或相对于配置文件的相对路径),一定不能直接写 ts-node
,另外还需要注意 windows 下需要使用 ts-node.cmd
-r tsconfig-paths/register