0%

如果说 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(或者 docker-compose / k8s 等容器编排技术),这种情况只要指定不同的数据卷位置和映射端口即可,没有任何难度,因此不说了

创建多个配置文件、指定多个数据目录

阅读全文 »

前言

在新款 Mac 中,各种需要给予 root 权限的地方可以很方便地使用 TouchID 或是 Apple Watch 代替「输入密码」这一步骤,但是终端(Terminal / iTerm 2)中和命令行相关的 sudo 却不会触发生物认证而是要求输入密码

根据如下配置,则在终端要求输入密码时会弹出生物认证而不要求必须输入密码

步骤

(适用于 bash / zsh 终端)

阅读全文 »

协同工作时经常需要将一些配置文件放到仓库中,这时要保证本地的更改不会影响到远端。

一个方式是将相应文件放到 .git/info/exclude 中(语法同 .gitignore),这个文件只会在本地生效,不会上传到云端仓库

但这种方式对于已经存在的文件就无效了,如果本地编辑仓库中已经有的文件则依然会显示出更改,因此需要利用 git 的 update-index --assume-unchanged 命令将文件让 git「假装我没改过」

将以下内容加入 git config 可以简化使用

1
2
3
4
[alias]
ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"
阅读全文 »

因最近有一个需求是实现 scp,因此调研了一下 scp 的原理。

网上并没有一个对 scp 进行说明的文章,因此可以直接看 scp 实现的代码

https://github.com/openssh/openssh-portable/blob/master/scp.c

根据代码发现:scp 实现实际上就是在连接上远端服务器的 ssh 后又启动了一个 scp 进程。也就是 scp 使用必须依赖于目标服务器有 scp 存在。

本文暂时只介绍了从本地向远端发送文件的相关内容,从远端接收后续再写

阅读全文 »

方式:在 pom 中引入 properties-maven-plugin

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
<project>
<!-- 原来的内容 -->
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<goals>
<goal>set-system-properties</goal>
</goals>
<configuration>
<properties>
<property>
<name>org.slf4j.simpleLogger.defaultLogLevel</name>
<value>debug</value>
</property>
<property>
<name>something</name>
<value>hoho</value>
</property>
</properties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const fs = require("fs");

let interpreter;
if (process.platform === "win32") {
interpreter = "/.bin/ts-node.cmd";
} else {
interpreter = "./node_modules/.bin/ts-node";
}


module.exports = {
apps: [{
name: 'my-app',
interpreter,
interpreter_args: '-r tsconfig-paths/register',
instance_var: 'INSTANCE_ID',
instances: 6,
exec_mode: 'cluster',
cwd: './',
script: './src/main.ts',
}]}
  1. interpreter 设定为 ts-node 的绝对路径(或相对于配置文件的相对路径),一定不能直接写 ts-node,另外还需要注意 windows 下需要使用 ts-node.cmd
  2. interpreter_args 设定为 -r tsconfig-paths/register
  3. cwd 填写工作目录
  4. script 填写脚本的目标
  5. ts-node 和 typescript 必须同时进行全局安装和项目安装

原因

阅读全文 »

Go 中的空值是一个永远的坑,感觉比价值十亿美金的空指针还难受,本文将尝试比较一下 nil 切片和空切片

TL;DR

空切片和零切片没什么大区别,大胆用吧

认识 nil

首先我们先明确几件关于 nil 的事情

阅读全文 »