NAT类型和STUN协议 端点(endpoint) = IP + 端口(port) NAT(Network Address Translation)本质上是在内网端点和 NAT 设备的公网侧端点之间建立映射。内网主机访问公网时,NAT 设备会把内网主机的 IP:端口 映射成它的公网侧的 IP:端口(也称 SNAT)。NAT 设备会在一段时间内记住这个映射,以便公 2026-07-19 网络与运维 #NAT #STUN
.gitignore的路径匹配规则 在 .gitignore 中,路径中的 / 会极大地影响它所匹配的目标。 首先,需要看路径结尾是否为 /: 结尾不为 /:匹配文件和目录 结尾为 /:只匹配目录 接着,需要看路径是否开头为 / 或中间包含 /: 开头不是 / 且中间不包含 /:以当前 .gitignore 所在目录及其任意子目录作为匹配的起点。 比如,my-path 既可以匹配 my-path,也可以匹配 also/my-p 2026-07-19 Git #Git #.gitignore
正则表达式的进阶用法 本文将介绍几种正则表达式的进阶用法。 前瞻、后顾、负前瞻、负后顾(positive/negative lookahead/lookbehind)当我们想要匹配一段“后面为特定内容”的文本,但又不想匹配“特定内容”时,可以使用前瞻(positive lookahead)。比如: 1foo(?=bar) 只会匹配后面是 bar 的 foo: 123[foo]barfoobazfo 2026-07-19 Regex #Regex #RegExp
TypeScript的satisfies关键字 前几天在看代码的时候,第一次遇到了 satisfies 关键字。 satisfies 会让编译器检查一个值是否满足指定类型(即能否被赋值给指定类型)。如果不满足,就会报错。举个例子: 1234567891011type User = { name: string;};const goodUser = { name: "Tom",} s 2026-07-12 JavaScript #JavaScript #语言特性 #TypeScript
Python的yield from关键字 yield from + 生成器在 Python 中,如果想在一个生成器中把另一个生成器的值传递出去,一种方法是用 for 循环逐个消费生成器的值并 yield: 1234567891011def child(): yield 1 yield 2def parent(): yield 0 for value in child(): yield value 2026-07-12 Python #Python #语言特性
Go"魔丸"包命名法 在写 Go 时,如果项目中有一些子包,通常会保持目录名和文件头部的 package 名一致。但我突发奇想,如果两者不一样呢?遂做如下实验: 1234567891011121314151617181920212223242526272829$ tree.├── go.mod├── main.go└── myfolder └── myfile.go$ cat go.modmodule examp 2026-07-12 Go #语言特性 #Go
macOS 15重置本地网络权限 本文仅适用于搭载 Apple 芯片的 Mac。 该方法可能会影响其他配置,操作前请做好备份。 macOS 15 Sequoia 新增了本地网络权限,具体的位置在“系统设置 - 隐私与安全性 - 本地网络”。如果相关配置出现了问题,macOS 并未提供官方的重置方法。因此,下面记录一下我经过研究和 2026-07-12 macOS #macOS
macOS重置系统安装U盘 在 macOS 下用 balenaEtcher 之类的工具制作的系统安装 U 盘通常包含多个分区。如果想将它恢复成普通 U 盘,可以利用 macOS 自带的 diskutil 命令。 首先,列出所有磁盘,找到 U 盘对应的磁盘标识符,比如 disk5: 1diskutil list 接着,对 U 盘重新分区并格式化: 1diskutil eraseDisk ExFAT "Untitle 2026-07-12 macOS #macOS
Ant Design Form小记 大概三年前在使用 Ant Design 的 <Form> 时,产生了一些疑问,这里将解惑后的答案记录如下。 问:为什么 123<Form.Item shouldUpdate> {form.getFieldValue('name')}</Form.Item> 不会随表单值变化重新渲染以显示最新值,而 123<For 2026-07-11 JavaScript #JavaScript #React #Ant Design
Go的值接收者和指针接收者 Go 中没有类(class),类似的特性是结构(struct)。正如类可以有方法那样,结构也可以有方法。结构的方法有两种形式:值接收者(value receiver)和指针接收者(pointer receiver)。本文将讲一下它们的区别,以及我的个人理解。 区别一:能否修改原实例值接收者拿到的是实例的副本,在方法内部修改这个副本,不会影响原实例。指针接收者拿到的是实例的地址,因此可以修改原实例。 2026-07-10 Go #语言特性 #Go