ZingLix Blog

凡心所向,素履以往

Go 在使用泛型时无法与 Pointer Receiver 共存的解决方法

How to use pointer receiver and generics in Go

问题描述 在使用 Go 的泛型时,如果泛型类型存在 constraint,而传入的类型在实现这个 constraint 时使用的是 pointer receiver,那么就会遇到 XXX does not satisfy XXX (method XXX has pointer receiver) 的报错,就比如下面这个例子希望用 Create 函数完成所有创建 Person 的操作 1 ...

NGINX 配置避免 IP 访问时证书暴露域名

Reject SSL Handshake in NGINX

TL;DR 利用 NGINX 1.19.4 后的新特性 ssl_reject_handshake on;,将其置于默认访问时配置中,IP 访问时会终止 TLS 握手,也就不会暴露域名了。 细说 CDN 是建站时常用的工具,在自己的主机外面套一层 CDN 是常见操作,一般这样认为自己的主机就安全了,有人来攻击也会先到 CDN 服务器,攻击者根本无法获取到自己主机的 IP,但事实真的是这样...

NGINX 配置 HTTPS 最佳实践

Got A+ Security for Your Websites

1202 年了,不会还有网站不支持 HTTPS 吧?不过 HTTPS 的配置还是有很多讲究的。本文以 NGINX 的配置为例,嫌麻烦的可以直接跳到 最后 抄配置。 如果你不清楚 HTTPS 与 TLS 的工作原理,可以先阅读 这篇文章,可以帮助你理解下述配置。 获取证书 证书是实现 HTTPS 的基础,现在各个云服务商都提供了免费的证书申请,可以直接去申请。这里我以 acme.sh 为...

九年过去了,TLS 1.3 带来了什么?

What's new in TLS 1.3?

距离 TLS 1.2 发布时隔九年,其中经过四年漫长的商定,TLS 1.3 正式面世,其设计目标简单来说就是让数据传输更快更安全。 更安全 TLS 采用的是混合的加密流程,也就是在通信过程中采用对称加密,该加密的密钥通过非对称加密协商得到。其中用 MAC 算法进行完整性校验,证书体系进行身份认证。这一流程听上去很完美,但现实却并不总是这么美好。 前向安全 前向安全(Forward S...

ESNI 与 ECH 的前世今生

Next Step towards Safer Internet

在当时介绍 TLS 的最后,提到过虽然 TLS 能够加密整个通信过程,但是在协商的过程中依旧有很多隐私敏感的参数不得不以明文方式传输,其中最为重要且棘手的就是将要访问的域名,即 SNI(Server Name Indication)。同时还有用于告知客户端可用的应用层协议的 ALPN 拓展,泄露这个会导致攻击者知道服务器所支持的服务以及连接的用途。 之所以会暴露如此重要的内容,并不是设...

关于分布式系统中一致性模型那些事

Isolation in ACID and Consistency in CAP

在分布式系统中,一致性模型是一个老生常谈的话题,而其之所以这么重要正是因为其复杂而又直接关系到一个分布式系统的正确性,所以值得被反复讨论。 在开发单机多线程程序的时候,不同线程如果不加任何措施同时对同一片内存进行操作会冲突造成不可预知的后果。分布式系统同样是个并发系统,这个问题依旧,不同的结点同时对同一个数据进行修改同样会造成不可预知的后果,造成数据一致性被破坏,同时加上分布式系统中可用性...

Mutex<Rc> 为什么不能在线程间传递?

重新理解 Rust 中的 Sync 与 Send

最近在用 Rust 写多线程程序的时候,一个编译器的错误让我感到了困惑。 问题 简单来说,我有一个结构体,内部有一个 Rc 的值,如下 1 2 3 struct A { val: Rc<u32>, } 很显然,Rc 并不线程安全,所以加锁保护,并且用 Arc 在线程之间传递,所以写了如下的代码 1 2 3 4 5 6 7 8 9 10 11 fn main()...

「图解Raft」让一致性算法变得更简单

Make Consensus Algorithm Simpler

最近在刷 MIT 的 6.824 分布式课程,里面花了很多课时来讲解 Raft 一致性算法,我也花了一段时间完成了课程 lab,算是理清楚了整个算法的流程,有需要 lab 答案的可以联系我,课程要求并不允许放在网上~ 工作流程 首先需要明确的是一致性算法的目标是什么,主要面对的问题是在只使用单个服务器时由于发生错误导致数据丢失等事情发生。解决这个问题的思路也很简单,就是备份,将操作重复到...

「论文笔记」The Deep Learning Compiler: A Comprehensive Survey

可能是第一篇关于深度学习编译器的综述

背景 现如今我们有了许多深度学习的框架,例如 TensorFlow、PyTorch、MXNet 等等。同时我们还要将其部署于不同的硬件之上,除了常见的 GPU 和 CPU,还有针对于机器学习设计的硬件,例如来自 Google 的 TPU、海思的 NPU、Apple 的 Bonic 等等。 这种场景有没有让你想起传统的编译器?以 LLVM 作为例子,其可以接受不同的语言(C++、Swift...

升级 WSL2 Ubuntu 至 20.04 LTS

Upgrade WSL2 to Ubuntu 20.04 LTS

最近 Ubuntu 20.04 正式发布了,但是 WSL 里装的还是 18.04,所以肯定要升级一下啦~ 18.04 可以很方便的升级到 20.04,但如果你现在用的还是 16.04 最好是先升级至 18.04 再升至 20.04 以避免一些奇奇怪怪的事情发生 更新现有环境 为了能够让现有的环境和升级后的差异尽可能小,从而避免一些更新失败的情况的发生,最好是先更新一下现有的环境...