后端程序员如何配置 macOS

标签:Apple, Mac OS X

鉴于我的红米 K60 仅使用不到半年,电池健康度就只剩 80% 了,我入手新 MacBook Pro 后的第一件事就是安装 AIDente
锂电池的健康度主要和这三个因素相关:
  1. 循环次数:从 100% 用到 0%,或是从 100% 用到 50%,充满后再用到 50% 都算一次循环次数。可以理解为总共使用了多少电量,所以长期插电使用,而不是用电池供电是正确的。
  2. 温度:充电会导致电池温度上升,而过高(> 35°C)和过低(< 0°C)的温度都会影响电池的性能。一般越接近 25°C 越好。所谓的快充伤电池,其实是快充会导致电池升温更快。
  3. 充放电深度:过度的充放电(特别是放电)都可能对锂电池造成不可逆的损伤,尽量避免充电至 80% 以上和放电至 20% 以下。例如 100% 的充放电深度,大概 300 次循环次数就会使健康度降到 70%,80% 的充放电深度则可以到 400 次,10% 的充放电深度则可以到 6000 次(但是相当于只使用 10% 电池容量)。
AIDente 对这几点都有处理:
如果经常需要移动办公,将充电限制设置到 80% 就行了,60% 的充放电深度也够用大半天了;如果大部分时间都插电使用,限制到 70% 也够用;如果几乎不移动,让它保持在 50% 附近也是可以的。
Intel 芯片的 MacBook 是可以设置硬件充电上限,之后即使退出 AIDente 甚至关机都不会过充;而 Apple silicon 芯片则需要保持 AIDente 运行,且启用「MacBook 进入睡眠时停止充电」,并在关机后拔下充电头才能避免过充。
后面的设置就需要购买 AIDente Pro 了,但也不是非买不可:
  • 「过热保护」可以在电池温度过高时停止充电。
  • 「续航模式」可以避免短暂用电后又充到上限这种微小充电,不过这也没啥危害。
  • 「控制 MagSafe LED」可以在达到充电上限停止充电时使 MagSafe LED 显示绿色,而不是充电中的橙色。
  • 「图标样式」可以改成「咬合状态」,用来区分不同的充电状态。
  • 「硬件电池百分比」可以更精确地显示和控制电量,macOS 为了避免过度充放电,一般会隐藏一小部分电量。(比如充到 95% 就显示充满了,还剩 5% 时显示成没电了。)
我顺便还读了下它的源码,发现它是通过写入 SMC 来限制充电的。还有一个叫 battery 的项目是调用 smc 命令行实现的,可能更易懂。

为什么在高并发的场景下,需要将 MySQL 的事务隔离级别设为读已提交?

标签:性能

为缩短篇幅,本文假定读者已知晓 transaction isolation level(事务隔离级别)的基础知识。

MySQL 的默认事务隔离级别是 repeatable read(可重复读),而在都市传说中,各个互联网大厂都会将其改为 read committed(读已提交),这是为什么呢?

从字面上理解,可重复读满足了一个事务在读取某行后,如果另一个事务修改了该行,再次读取它时,能保持第一次读到的值。可是,这又有什么意义呢?谁会在一个事务里多次读取同一行呢?
其实它的实现是这样:当事务开始后,从它第一次读取数据时,就创建了一个快照,之后都是对这个快照进行查询,直到这个事务结束。也就是说,可重复读的主要作用是让事务只访问这个事务和它之前已有的数据,而不是字面上的读同一行不会变。
而读已提交只需要在每次读取时创建一个快照,读取完这个快照就用不到了。
由此可见,可重复读需要维护一个较长的快照,这自然要消耗更多的资源。

不过现实中我们不会这样简单地使用事务。一个正常的事务如果要基于读取到的数据来修改,会使用 SELECT ... FOR UPDATE 的形式来加锁。
如果这里可以利用唯一索引的话,MySQL 会对唯一索引中满足条件的行添加行锁,否则需要加 gap lock 和 next-key lock,这两把锁会增加被锁定的范围。例如表 test 有一个被索引的列 a,有一行 a 为 100 的数据。当执行 SELECT * FROM test WHERE a = 1 FOR UPDATE 后,其他事务无法插入任何 a < 100 的数据,因为被这两把锁给锁住了。
而读已提交则不会添加这两种锁,并且当需要锁住的行不存在时,并不会对其加锁,而是允许其他事务插入。
由此可见,可重复读可能锁住了更多的数据,更容易造成死锁。

简单评测 VSCode 的免费 AI 编程插件

标签:无

最近发现 VSCode 里安装的 AI 编程插件越来越多,也不知道会不会有冲突,所以想选一个最好的留下。
本次参与评测的选手有:tabnine、Codeium、CodeGeeX、fittencode、Baidu Comate、TONGYI Lingma 和 Cody(按我安装的顺序排序,有些不好用的我直接卸载了,不参与评测)。
鉴于免费的已经够我用了,收费的就不参与评测了,正好避免恰饭嫌疑。

mihomo(clash) 无法访问 raw.githubusercontent.com 的解决方案

标签:翻墙

前几天在使用 brew 安装 im-select 时发现从 raw.githubusercontent.com 下载失败了,而 brew 是用 curl 下载的,我已经在 ~/.curlrc 里配置了 socks5 = "127.0.0.1:1080",理论上它应该走本地代理,怎么会失败呢?
于是我直接执行 curl 看看:
curl -v https://raw.githubusercontent.com/daipeihust/im-select/master/macOS/out/apple/im-select
*   Trying 127.0.0.1:1080...
* Connected to 127.0.0.1 (127.0.0.1) port 1080
* Host raw.githubusercontent.com:443 was resolved.
* IPv6: (none)
* IPv4: 0.0.0.0
* SOCKS5 connect to 0.0.0.0:443 (locally resolved)
居然在本地解析成 0.0.0.0 了,这不是应该走代理去解析的吗?

都 2024 年了,该更新翻墙技术了

标签:翻墙

时光荏苒,距初代的翻墙神器 shadowsocks 停更都已过去 6 年了,这期间墙早已进化了多次,至少原生的 shadowsocks 基本上会被秒封了。
随着墙的进化,我翻墙的姿势也不得更换了数次,使用最久的还是 kcptun + shadowsocks 的方案,毕竟对于线路不好的 VPS 而言,可以自定义拥塞控制的 UDP 协议还是比 TCP 快几个数量级的。
不过最近两年 kcptun 也容易被墙了,于是我又开始了新的寻觅,然后选中了 hysteria。它被墙的概率要低很多,而且无需配合 shadowsocks 等协议一起工作,可以直接提供 SOCKS5 和 HTTP 代理。

用 nginx 对文件服务器鉴权

标签:nginx

最近项目中遇到一个需求:
用户在使用 seafile 上传文件,希望将其分享出去。
seafile 自己生成的分享链接类似于 https://seafile.xxx.com/f/23cc6812408e44f8b63e/,若未过期且密码正确时会将其重定向到类似 http://seafile.yizhisec.com/seafhttp/files/e1687864-8a12-46db-9708-b4240df346be/1.txt 的地址。
产品希望能对这个分享链接进行鉴权,并且最好不暴露实际的文件地址和避免发起重定向的请求。

把任务队列 delayed 移植到 Go 了

标签:Go

4 年前我用 Python 写了个叫 delayed 的任务队列,经过几年发展后,公司有了 Go 和 Python 相互调用的需求。
目前的 delayed 实现是用 pickle 来做序列化的,其实之前也写过用 JSON 来做序列化的版本,但是遇到了几个问题:
  1. JSON 会丢失一些对象类型,例如无法区分 tuple 和 list。
  2. JSON 无法直接编码二进制字符串(bytes)。
  3. JSON 不支持原本 pickle 能支持的很多类型。
当时因为这些问题我就放弃了,但是现在看来,这些问题有的可以解决,有的可以容忍,所以还是决定开发 Go 的版本。

换个域名

标签:无

正如关于本站被墙的一些分析一文中所说,keakon.net 这个用了 12 年的域名被墙了。
我也懒得再费劲买域名与墙对着干了,就注册一些免费的域名轮流换吧,墙了也不心疼。好像那些不可描述的网站也是这样干的?

« 看看还有什么好玩意