Linux
iptables
ipset
路由
redsocks
这个博客在八年前分享过 用 Linux 做 WiFi 热点,今天的设备和软件已经完全不同了。可以很方便地做曾经很复杂的事情,同时这个世界也更复杂了。现在我们要实现的是 把代理分享给局域网,连上 WiFi 即连上了代理。
这件事最简单的办法是直接刷一个 OpenWrt,较为复杂的办法是刷一个 unRaid、PVE 或 ESXi 上面装一个 OpenWrt,最复杂的办法是在 ArchLinux 里手动配各种服务。本文就来介绍这个最复杂的办法。因为一来笔者更熟悉这老旧的东西,Linux 不需要赶潮流也能用得很好,即便几十年前的 Linux 技术今天仍然管用;二来手动搭建起来虽然麻烦,但是单 OS 的架构比较简单,后期维护时不容易忘掉。整个架构的思路大概是:
- 把 SOCKS5/HTTP 代理转成一个透明代理。流量发给它就能走 SOCKS5。
- 配置 DHCP 服务器,把网关和 DNS 设置为这台机器。本机的 DNS 走 DoH 或 DoT 到上游。
- iptables 把局域网的流量转发给 redsocks。
- 这样默认所有局域网流量都去代理了,可以加一个 ipset 规则来让做黑名单不走代理。
SSH
端口转发
SOCKS
SSH 隧道或 SSH 端口转发可以用来在客户端和服务器之间建立一个加密的 SSH 连接,通过它来把本地流量转发到服务器端,或者把服务器端流量转发到本地。比如从本地访问服务器上的 MySQL 管理后台,或者把本地的串流、SMB、CIFS 等服务暴露在服务器所在的公网。本文将介绍 SSH 隧道的本地端口转发、远程端口转发等使用方式,以及如何配置 SSH 允许长连接、开机时自动建立连接。
Vim
剪切板
寄存器
快捷键
不同于 Emacs,Vim 确实是一个编辑器。那么编辑器能不能复制粘贴呢?肯定是可以的。不过要在 vim 中完成复制粘贴是需要敲键盘的,虽然略复杂但是功能也更强。
这篇文章来详细介绍 Vim 中复制粘贴的设置和使用方法。
包括复制当前字符/当前词/当前行,复制整个文件内容,粘贴刚才复制/剪切的内容;在插入模式/命令行模式粘贴;复制到 Windows/Mac 系统剪切板。
iOS
版本
iPhone
Safari
Web 开发时关心 iPhone 的兼容性,其实就是关心各 Safari 版本的市场占有率。而后者取决于 iPhone 各版本的市场占有率。比如某些 iPhone 已经绝版了,那么它对应的 Safari 版本也不再需要去支持了。此外更现实的问题是,老板说“我的 iPhone X 下这个页面挂了”,这时就需要猜他的 Safari 版本,再对应 caniuse.com 就能知道哪些特性把页面搞挂了。iOS Safari 的发版有这么几个规律:
- iPhone 的 Safari 是随着 iOS 发版的。也就是说你的 iOS 版本直接决定了 Safari 版本,而想要更新 Safari 版本,就得更新 iOS 版本。
- 每个 iPhone 有支持的 iOS 范围。这个范围从它搭载的首个 iOS 版本直到它不能再支持的最高 iOS 版本。比如:
- iPhone 12 发布时搭载的初始系统是 iOS 14.1,但可以升级到最新的 iOS 15.3.1,那么 iPhone 12 的 iOS 版本范围就是 [14.1, 15.3.1]。
- 一些旧的 iPhone 无法支持 iOS 13,所以它们的最高 iOS 版本就锁定在了 12.5.5,它搭载的 Safari 12.1.2 就成了分水岭,类似 IE6 的角色。
- 最近的 iOS 和 Safari 主版本是一致的。比如 Safari 13 随着 iOS 13 发布,Safari 14 随着 iOS 14 发布。
JavaScript
字符串
Number
类型转换
我们知道 JavaScript 中字符串转为数字有 parseInt
, Number()
, +
等方式,但它们的转换规则很不一样适用范围也不同。比如 parseInt
可以解析数字字母的混合字符串而 Number
和 +
会直接产生 NaN
,Number
和 parseInt
可以操作 BigInt
而 +
则会抛出 TypeError
。TL;DR 三种字符串先给出对比表格如下:
value |
parseInt(value) |
Number(value) |
+value |
"3.14"/3.14 |
3 |
3.14 |
3.14 |
undefined |
NaN |
NaN |
NaN |
null |
NaN |
0 |
0 |
false |
NaN |
0 |
0 |
true |
NaN |
1 |
1 |
"Infinity"/Infinity |
NaN |
Infinity |
Infinity |
"1e3" |
1 |
1000 |
1000 |
"123z" |
123 |
NaN |
NaN |
"z123" |
NaN |
NaN |
NaN |
10n |
10 |
10 |
TypeError |
"0x10" |
16 |
16 |
16 |
"010" |
10 |
10 |
10* |
- parseInt 在某些浏览器下解释为 8 进制。
Vim
剪切板
寄存器
Vim 是运行在 Terminal 里的 Shell 程序,所以要把内容拷贝出来可以通过 Terminal,也可以通过 Vim 自己。不配置 Vim 剪切板时只能通过 Shell 来拷贝粘贴:
- 通过 Shell 拷贝(比如在 iTerm 里按住 Alt 选取内容)会有问题:比如会包含 Vim 左侧行号、折行变成了换行。
- 通过 Shell 粘贴有类似的问题:相比于
p
命令,在插入模式下 Ctrl+V 时 Vim 会把内容当作字符键入,触发 Vim 的所有处理键入的插件,比如自动补全、语法检查等。不仅会很慢,而且可能会破坏你的内容(比如粘贴一对括号,可能 Vim 会再帮你自动补全一个多余的右括号)。
所以完美的拷贝粘贴一定要通过 Vim 本身。Vim 中 p
(paste)、d
(delete)、y
(yank)等拷贝粘贴操作使用的是 匿名寄存器 ""
(unnamed register),本文就来解释怎么在 Mac/Windows/Linux 上把 Vim 的 匿名寄存器 映射到操作系统的剪切板。
TL; DR
- 确保你的 vim 支持剪切板,通过
vim --version | grep clipboard
检查。
- 确定你的剪切板寄存器是
"+
(XA_SECONDARY)还是 "*
(XA_PRIMARY)。
- 同步剪切板和匿名寄存器,在
~/.vimrc
添加配置比如 set clipboard=unnamed
。
网络
视频
HDMI
只要 4K 显示器就能拥有 4K 体验吗?这篇文章写在 4K 出现 六年之后的今天,再来重新审视这个问题,以及如何正确地配备显示器、片源、网络和视频线缆。