今天我学了什么 (Today I Learned)
博观而约取,厚积而薄发。
ADoyle 的碎片化知识笔记。https://til.adoyle.me
订阅
推荐订阅 Weekly Report。每周一获取每周总结。 订阅方法:点击 Github 右上角的 watch 按钮。
提醒
- 在网页端,建议搜索英文用最上方的搜索框,体验比较好。搜索框不支持中文。建议搜中文用浏览器自带的搜索功能。
- 文章不保证正确,请自己判断对错。如果你有不同意见,欢迎到 Discussions 提出意见。
内容约定
所有文件一旦创建就不会改变路径,以保证永久链接。 文章内容可能随时会改动。
部分外部链接会引用 archive.today 以及 archive.org 的链接,以保证永久链接。永久链接需要挂代理浏览。
部分外部链接使用原链接的考虑因素有:
- 原文内容会更新,比如 wiki 类型的文章。
- 原链接很稳定,即使变动也会有重定向到最新的内容链接。
- Stack Exchange 其下网站都用原链接。
- 指向 Github Issue/Disussion/PR/Code 的都用原链接。
- RFC 文档都使用 https://www.rfc-editor.org 的链接。
反馈问题或建议
本项目不接受 Pull Request。如果你有什么好的想法,或者改进的建议,请使用 Discussions 与我探讨。
建议 Star 本项目。不要 Fork,这没有意义。
版权声明
Copyright 2016-2024 ADoyle ([email protected]). Some Rights Reserved. The project is licensed under the BSD 3-clause License.
Read the LICENSE file for the specific language governing permissions and limitations under the License.
Read the NOTICE file distributed with this work for additional information regarding copyright ownership.
TOC
- 算法
- Android
- C
- 计算机
- 设计
- Docker
- Elixir
- 嵌入式
- 函数式编程
- 前端
- Git
- Github
- Go
- 硬件
- Java
- Javascript
- K8S
- 语言设计
- Linux
- Language Server Protocol (LSP)
- Lua
- Mac
- 数学
- 机器学习
- 网络
- Nix
- Nodejs
- 运维
- 其他
- 哲学
- 箴言录
- Python
- Racket
- Redis
- Ruby
- 安全攻防
- Shell
- Startup
- 存储
- 思考
- Typescript
- Vim
- 虚拟机
- Web
- Windows
算法
Android
C
计算机
记录与计算机硬件相关的知识。
- 内存管理单元 MMU
- RDMA
- 单指令流多数据流 (SIMD)
- TLB
- CPU 伪共享 (CPU Cache Line False Sharing)
- CPU 缓存
- CPU
- 风扇
- 内存屏障
- 我的硬盘分区规划
- 随机存取存储器 (RAM)
设计
记录平面设计的相关知识
- 8 点栅格
- Illuminant D65
- CIE 色彩空间
- 色域
- 色彩模式
- 色彩空间
- 色彩理论
- UI 的加载状态
- OpenType
- 使用 sketchtool 操作 sketch 文档:diff 以及其他功能
- Sketch 的文本样式与颜色
- 排版
Docker
- 苹果芯片的 Mac 电脑构建 x86 镜像
- ContainerD OverlayFS
- Containerd
- 客户端连接多个 docker daemon
- 容器里的 Core Dump
- 容器里的 CPU 信息
- device or resource busy
- docker-compose 启动容器顺序
- Docker 容器与 Cgroup
- docker desktop
- 进入 docker for mac 的虚拟机
- docker for mac
- 学习 Docker
- Docker OverlayFS
- Docker 的坑
- docker 代理
- Docker Run With Namespace
- Docker Tag/Id/Digest
- docker 小技巧
- Dockerfile
- 查找 Overlay ID 与哪个容器相关
- 修正 alpine 镜像的时区问题
- 修正 Docker for mac 时区问题
- host.docker.internal
- Docker for Mac 中磁盘文件占用过大
- docker macvlan
- 构建多架构镜像
- docker 多阶段构建 (Multi-Stage Build)
- nerdctl 容器
- nerdctl 网络
- nerdctl
- rootless docker 网络
- ping: Operation not permitted
- Podman netns
- Podman
- rootless containerd
- rootless 问题
- 在后台运行 docker 容器且不会自动退出
- docker security_opt
- Docker 安全
- 在 rootless 容器中,用非 root 用户无法操作 volume 里的文件
- volume 单个文件到容器
- volume
- 在 rootless podman 获取不到真实远端 ip
Elixir
嵌入式
函数式编程
前端
- SSR (Server Side Render)
- 关于 webpack 2
<script async>
与<script defer>
- 圆角的玩法
- Chrome 浏览器 DNS 解析
- Safari 浏览器的类继承 Bug
- 代码分离
- 颜色对比度
- 编译前端 JS 库
- contentEditable
- CORS
- css-modules vs css-in-js
- CSS Selector list invalidation
- 开发一个油猴 (Tampermonkey) 脚本
- 前端类库打包的注意点
- XMLHttpRequest 的继承者:Fetch
- 浮动侧边栏
- Functional CSS
- 307 Internal Redirect 与浏览器的 HSTS 功能
- HTTP 缓存机制
- Input Method Editor (IME)
- 学习 Chrome DevTools
- 前端工程的模块控制反转
- redux 入门
- Rollup Dynamic Import
- script 和 link 标签的事件属性
- 弹性滚动
- Mac 浏览器中显示滚动条
- 状态机与状态图
- 媒体查询的断点设置
- 使用 browserify 和 uglifyjs
- wasm
- Webkit 浏览器渲染效率
- webpack 配置为数组
- webpack 配置
- Webpack Dynamic Import
- 奇怪的 parse html
- 富文本编辑器选型
- z-index
React
- 使用 jquery 改变 React 的 input DOM
- 组件生命周期
- Compound Components
- 不要在 render 里直接定义 ref callback
- ref callback 何时触发?
Git
- 用 shell 脚本查询 git commit hash
- Git Diff
- Git 学习资料
- git ssh 代理
- git 小技巧
- git credentials
- gitignore 与 gitkeep
- grafted commit
- git http clone
- 忽略 Git submodule
- –ours vs –theirs
- git proxy
- 指定分支与另一个远端仓库绑定
- git shallow clone
- Git sign-off
Github
- Github Markdown 中的锚点引用
- 构建 github page
- Github 下载最新 release 文件
- github 中 markdown 折叠文本
- 如何在 github 项目里搜索代码
- 在 Github Markdown 中如何填写图片的链接
- Github Template (模板)
Go
- go 交叉编译安卓程序
- Golang GC
- GO 汇编
- go build
- go doc
- go generate
- Go Module
- go tool
- Golang 学习
- gopls
- Gorutine
- 在 MacOS 上使用 gvm install
- interface 与 nil
- //go:linkname
- Go 语言的几大坑
硬件
- 微处理器 MCU
- Over The Air (OTA)
- RFID
- EMMC
- 固件 (Firmware)
- Home Assistant
- 红外测温仪
- ET X08 鼠标
- 网件 R6900 刷梅林固件
- 网络交换机
- 无线电波 (Radio Waves)
- USB
Java
Javascript
- babel 小技巧
- JavaScript 中的相等性判断
- 为什么 eval(‘{}’) 返回 undefined ?
- JS 的 fiber 技术
- lodash 陷阱
- Javascript Proxy
- JS 保留字
- 尾递归优化
- Promise 的坑
- 使用 Promise 的技巧
- JS 编程技巧
K8S
- OCI、CNI
- Cilium
- 调试 CrashLoopBackOff 状态的 Pod
- Helm
- Pod containerStatuses 的镜像版本与 Pod 指定版本不同
- 容器里装 K3S
- K8S CSI 开发
- K8S Dashboard
- K8S 部署踩坑记
- K8S 垃圾回收 (GC)
- K8S 学习
- K8S 资源规划
- K8S Resource Spec
- kubectl 学习
- Kubespray
- kustomize
- 重启 Pod 中的容器
- configmap 和 secret 的滚动更新
- 多个 Pod 不重复部署在同一个节点上
语言设计
记录编程语言的内部设计与思想
Linux
记录 Linux 系统设计、系统命令,UNIX/Linux 命令和软件等相关知识
- XDG 基础目录标准
- ab 与 wrk 比较
- ABI
- 用户线程,内核线程,CPU 超线程技术
- 用户增加用户组
- adduser 与 useradd
- 硬盘电源管理
- ag 和 rg
- Alfred 找不到文件
- alpine 的 /sbin/init
- Alpine Linux
- anon_inode
- ansible 部署到 centos7 时,不能找到 service
- apt
- arch linux
- Armbian 关闭 swap
- Armbian
- BIOS
- Block Layer
- BootLoader
- btrfs
- 内存的 buffer 和 cache
- 在容器中构建 Package
- Busybox
- CFS (Completely Fair Scheduler)
- 更改默认 shell
- sudo 找不到可执行文件
- clamav
- 命令格式标准
- linux 命令被 hash 缓存
- compgen
- configfs
- 连接 tty
- conntrack
- 上下文切换
- CPU
- 判断文件编码
- Device Mapper
- diff 与 patch
- shutdown, poweroff, halt 的不同
- 硬盘分区
- dmesg
- dnsmasq
- dpkg
- du
- eBPF 与 XDP
- 编辑二进制文件
- ELF 文件
- 终端开启真彩色 (true color)
- 用环境变量替换文本内容 envsubst
- exfat
- ExtFS (Extended File System)
- fakeroot
- 快速删除文件
- 快速创建大文件
- 快速删文件
- 文件描述符,open file table 与 inode
- file 命令
- CentOS 与 Debian 文件上的差异
- Linux 文件系统
- 文件名大小写问题
- 文件路径
- 查找 USB 串口设备对应的是哪个 /dev tty 文件
- find -print0 的坑
- ftrace
- gpg-agent
- GPG 与 Keybase
- gpg
- grep
- GNU GRUB
- hash 命令
- Here Strings 与 Here Documents
- 隐藏进程
- Hostname in Linux
- iconv
- 查看进程的环境变量
- 安装 Linux 系统
- 网络接口名称的 @
- 中断
- 调用原生 shell 命令
- IO、select、epoll
- iproute2 与 ifconfig 命令
- iptables 与 nftables
- 在 arch linux 中升级 curl 碰到的问题
- kconfig
- Linux 内核模块
- Linux 内核
- kswapd0
- libc
- Linux 系统日志
- 修改 Linux 系统语言 (locale)
- Linux 日志文件
- lsof 与 fuser
- LVM (Logical Volume Manager)
- 制作 deb 包
- man 命令
- mdadm
- 命令行中的乱码
- mkisofs
- 创建临时文件的命令
- mount
- musl libc
- Netfilter
- netns
- netstat 与 ss
- 网络接口配置 (ifcfg)
- 网络配置工具
- 硬盘空间占满问题
- nsenter
- NTP 时间同步
- OpenRC
- OverlayFS
- PAM
- perf 命令
- 不需要 root 权限执行 ping
- 管道重定向
- PostmarketOS
- 打印环境变量
- 进程中断
- 进程内存
- 进程亲和性 (Processor Affinity)
- 命令行中提示用户 Yes/No
- rm 命令
- 旋转终端屏幕
- rsync 与 scp
- rsyslog
- 用别的用户运行命令
- runit
- SATA 热拔插
- 程序的退出码 (Exit Code)
- sed
- 在 alpine 中找不到 setup-apkcache 等 setup-* 命令
- shebang
- 共享内存
- 拆分与合并文件
- SSH
- sshd -R 参数
- strace
- sudo and su
- sudoer
- sysctl
- syslinux
- Linux 系统调用
- tailf
- tar
- 基于内存的虚拟文件系统 tmpfs/ramfs/RamDisk
- Terminfo
- Linux Thermal 框架
- 线程与进程
- time 命令
- UFW
- UNIX Domain Socket
- unlink 是删除任何文件
- unshare 命令
- 用户登录与 passwd
- /usr/bin/env
- 虚拟文件系统 (VFS, Virtual File System)
- 虚拟内存
- 奇怪的 ESC
- Welcome Message Banner
- 监听 0.0.0.0 与 127.0.0.1 的区别
- 为什么创建 Daemon 进程要 Fork 两次?
- XDP
- ZFS
- Zsh 的坑
Debian
Systemd
- systemd-mount
- systemd-network
- networking.service
- systemd-path
- systemd-resolved
- systemd
- systemd-timesyncd
Language Server Protocol (LSP)
Lua
Mac
- MacOS 通过命令行修改 IP 地址
- Mac 的 DNS 问题
- 多网卡在 Mac 系统的问题
- Mac 下按住键盘不能输出重复的字符
- Homebrew
- MacOS log
- Mac 快捷键
- 用命令触发系统通知
- Mac 自启动配置 plist
- Mac 删除允许在后台运行的设置
- Finder 显示隐藏文件
- Tab 键不能切换弹出框的选中焦点
- 关闭 Mac 的 Gatekeeper
- Mac 微信备份显示不在同一网络
- xcode 重新安装
数学
数学,不仅仅是算法
机器学习
网络
记录网络相关知识
- ARP
- 自治系统 (Autonomous System)
- 组播地址
- 网桥 (Bridge)
- DHCP
- DNS
- DNS SRV
- DoH 与 DoT
- Envoy
- 网关 gateway
- HTTP Request/Response 网络包
- link
- MQTT
- NAT
- 网络风暴 (Network Storm)
- pfctl
- 私有网段
- Samba
- SDN
- TCP Buffer 大小
- TUN/TAP
- 虚拟网络设备
- 虚拟 IP
- 虚拟网络设备
- vlan
- vxlan
- Wake On Lan (WOL)
- zigbee
Nix
Nodejs
- MaxListenersExceededWarning
- 命令行的工具和类库
- 不要对函数参数重新赋值
- EJS 渲染引擎的空白问题
- Error.captureStackTrace 的 stack 缺少 message 问题
- fs 函数抛出的异常没有堆栈信息
- NodeJS GC
- node 中发 ICMP 包
- Jest
- npm publish 不会包含 .gitignore 文件
- 配置 node 开发环境
- npm 命令
- npm run scripts
- nvm 不是一个可执行文件,而是一个函数
- npm 发包
- 调整 rejectUnauthorized 选项来容许 https 证书无效
- report 文件
- require 路径名大小写问题
- 流 (stream)
- EventEmitter 需要注意的三个地方
- Warning 缺少堆栈信息
- winston 日志库
- Yarn 用法
运维
- Ansible Role
- Ansible 技巧
- Ansible 变量
- Ansible
- dig 命令
- DNF
- 以太网
- IPMI 与 BMC
- 运维小技巧 - 硬件
- 运维小技巧 - 网络
- 运维小技巧
- PCI
- RPM 创建仓库
- RPM 制作和安装离线包
- YUM
其他
记录各种奇奇怪怪的小知识
- 0.30000000000000004
- Today I learned (TIL) 资源列表
- 使用 acme.sh 生成证书
- adguard home
- 在梅林固件路由器里安装 AdGuard Home
- Alfred Workflow debug 技巧
- 永久链接
- 在 Alpine docker 容器里启动 aria2
- aria2
- ASCII 与 ANSI
- 梅林固件 asuswrt-merlin
- 脱字符 (caret)
- Chrome 小技巧
- 复制粘贴好过手写
- Mac 文件系统的剪切快捷键
- 数据恢复工具
- YAML 中的 Date 类型陷阱
- MacOS 彻底删除搜狗输入法
- dropbear
- Duplicati
- 在浏览器里启动 DoH
- 文件命名,下划线还是中划线?
- fonts.googleapis.com 不可访问
- fzf
- 从微信公众号提取原图
- gRPC
- 通过 Hash 密码到 url 来验证密码
- 如何学习一门编程语言
- 如何阅读标准
- 如何审核代码
- httrack
- Hyper.js 中文问题
- 图床
- 无法在 Tmux 显示图片
- Jekyll
- jellyfin 中文字体
- Jinja2
- Language Server Protocol
- Makefile
- 箴言
- 修改进程的内存数据
- 元语法 (Metasyntax)
- 乱码问题
- 终端邮件客户端 Mutt
- nextcloud
- NFS
- 堆外内存
- 原码, 反码, 补码
- 如何打开超大文件
- Ubnt EdgeRouter X (er-x) 刷 OpenWRT
- Protocol Buffers
- 在美区 app store 充值
- 正则表达式的小技巧
- Markdown 里写反引号
- rsync
- Semver
- SSL 证书校验失败
- SSL 证书
- 停止词 (Stop Words)
- mac 里的 tmux 内无法用 sublime 打开文件
- svn 设置代理加速
- teleport
- vim textwidth=78 的约定
- KB 与 KiB 的不同
- 时间回跳问题
- Dockerfile 里使用 tini
- tmux 环境变量
- usbipd 与 Windows WSL
- UTF-8 vs UTF-16
- Vagrant DNS
- vagrant-vbguest
- 不用 lsblk 查看块设备
- 查看 Chrome 通知历史列表
- Virtualbox VBoxManage
- vsftpd
- 水快速加热
- wget 爬站
- 为何 Protobuf 3 移除了 required 和 optional
- 为什么 Unicode U+F8FF 是苹果 Logo?
- zookeeper 健康检查
- 零宽字符加密
哲学
箴言录
Python
Racket
Redis
Ruby
安全攻防
Shell
- 给命令的每一行输出加前缀的方法
- 多行字符串赋值给变量
- bash completion
- Bash 镜像有 bug
- bash error exit
- bash history
- bash 开启 vi 模式
- 学习 Bash
- Bash 的坑
- Bash 小技巧
- shell 中改变光标样式
- 修改 console 环境的字体大小
- 当存在与命令同名的别名,如何调用原命令
- Shell 操作文件描述符
- 刷新命令的路径缓存
- 在 console 里滚屏翻页
printf '%s\n' $@
为何可以打印多行?- Readline
- 学习 Shell
- Bash 的 subshell 与子进程
- set 命令
- 终端输入的文字不可见怎么办?
- Bash xtrace
Startup
存储
Etcd
Mongo
Mysql
Postgres
思考
记录我的碎片式思考
Typescript
Vim
<C-I>
在 nvim 里等同于<Tab>
- 用于调试的最小 neovim 配置
- 学习 Neovim
- 在 vim 中执行 shell 命令,同时将结果输出到 buffer
- vim 插件教程
- 在 vim 中运行终端,以及如何退出终端模式
- sudo :write
- VIM filetype
- vim-go 出现问题
- 学习 Vim
- VIM 搜索和替换技巧
虚拟机
- KVM (Kernel-based Virtual Machine)
- Libvirt 网络
- Libvirt
- 虚拟 CPU
- virsh shutdown 命令无效
- virt-install Couldn’t find kernel for install tree
- Virtualbox
Web
记录 Web 服务开发涉及的相关知识。