工作方法
管理方法
Hyman Rickover 是美国海军上将,被称为核动力海军之父。这里翻译1982年他在哥伦比亚大学的演讲,关于他的管理哲学。现代管理学虽然后很多新的方法,但文中他的很多观点仍然切中要害。一起学习下!
如何管理下属
事情最终是人办成的,不是组织或管理系统办成的。因此必须尽早给予下属足够的授权和责任,这样他们会快速成长并能够帮助管理者。当然经理最终还要负责,为下属的过错承担指责。
随着下属的成长,工作也要相应地增加,使他永远无法完成所有工作。这既是鞭策也是挑战:在提升了下属的能力的同时也让管理者能腾出精力去承担更多的责任。组织的成员变得能够承担更多新的困难的任务时,他们会为自己的工作感到自豪,这风气会在组织内传播。
我们需要允许员工去寻求更多的工作和更大的责任。在我的组织里,没有正式的职责描述或组织结构。责任的定义很宽泛,这样就不会把人限制住。只要员工认为最好的事就可以去做,他们可以找任何人或去任何地方寻求帮助。每个人的限制只有自己的能力。
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
。