Telegram Channel
记录和分享有趣的信息。

Record and share interesting information.

contact: [email protected]
https://laisky.notion.site/Garbage-Collection-In-Go-Part-I-Semantics-500f4cd6c5a54eae9f455002d8c08d98?pvs=4

看到别人推荐的关于 Golang GC 的文,第一篇很有意思,后两篇有点水。

Golang 的 GC 使用三色标记法(tri-color),将所有的对方区分为 WHITE、GREY 和 BLACK 三色。BLACK 是需要保留的,GREY 是有待分拣,WHITE 就是可以清除的。

1. GC 启动后,将栈内所有的 root objects 都放进 GREY
2. 激活 write barrier,监听 GC 运行期间所有的写操作,将新的被引用对象放进 GREY
3. 遍历 GREY 中的对象,将其放入 BLACK。同时递归遍历这些对象所引用的子对象,也放进 BLACK。
4. 待 GREY 清空后,将 WHITE 中的对象清除。
https://pusher.github.io/tricolor-gc-visualization/

从 GC 的角度,可以分为三个步骤:

1. Mark Setup: 初始阶段,需要 STW,扫描所有的 root objects。
2. Marking: 遍历 GREY 的阶段,可以和用户程序并行执行。
3. Mark Termination: 最后阶段,需要 STW,清除 WHITE。

上面提到的 STW 就是 Stop The World,即暂停所有的用户程序,只执行 GC 相关的代码。这样虽然会导致用户程序的执行延迟,但是可以防止数据冲突。可以简单将其理解为全局锁。

Golang 给用户提供了两种微调 GC 的方式:

1. GOGC: 设置百分比,默认为 100,当内存翻倍时,触发下一次 GC。
2. GOMEMLIMIT: 设置堆内存峰值,当堆内存达到这个值时,触发下一次 GC。

通过微调这两个值,可以控制 GC 的频率。但是需要记住,微调 GC 的本质是在内存和 CPU 间进行 tradeoff。GC 对程序的延迟有两个部分:STW 的中断延迟、并行 SWEEP 期间占用 CPU 导致的性能下降。天下没有免费的午餐,增大 GC 的间隔并不会减少总延迟,非必要不用去调节这两个值。
狗屁通套皮站支持 gpt-4-0125-preview 了。顺带提醒一下使用 one-api 套皮的人,升级最新的 one-api 后,在 设置->运营设置 里手动检查一下倍率设置,gpt-4-0125-preview 的价格应该和 gpt-4-1106-preview 一样设置为 5。升级后很可能遇到未设置 gpt-4-0125-preview 倍率的情况,此时倍率会按照默认 50 计费,导致计费错误。
https://stackoverflow.com/a/72245072/2368737

学会一个前端的坑。如果你把高度设置为 100vh 试图占满浏览器的高度,这在桌面上没问题。

但是在手机浏览器上,浏览器的 navigator(地址栏)会占掉一点高度,而这个高度不会计算在 vh 里,结果就是你的 document 的实际高度会超出浏览器里的可视高度,然后你的页面就会在垂直方向上变成滚动(或者被截断,如果你将 overflow 设置为 hidden)。

这个恶心的现象在桌面版的 Chrome DevTools 里也无法调试,因为 Toggle Device Toolbar 模拟的 mobile 页面并不会包含 navigator。

在现代浏览器上,应该使用 svh 来获取 navigator 下方的,真实的页面可视高度。实测在最新版的 ios safari 和 chrome 上都可使用。
https://caniuse.com/?search=dvh
#FE
https://youtu.be/eUdIz21P7zE?si=blnO07kmDngoBBC1

走访了几家 all-american chain 的公司,介绍美国制造业复兴的愿景。

几个有趣的观点:
1. free trade 是个骗局:美国人获得了更便宜的商品,但是输掉了未来。中国的工人生活也并没有变好。
2. decoupling from China 政策不是美国的单方面施暴,而只是对等措施。中国才是那个多年以来一直以脱钩为核心国策的国家。
3. 振兴制造业成为了两党共识,两党的争议在于谁做的更好
4. 美国对制造业危机的觉醒来自于疫情,连口罩都需要依赖中国进口。
5. 制造业的最后一人不会是赢家,而是最后的输家。我理解这句话是说制造业会不执迷于给人类手工保留职位,同时要考量自动化的进步。

片尾结语,不是所有人都想成为金融家或程序员,人们需要一个多样性的就业环境,创造价值。
https://youtu.be/RFjAqth-EQk?si=2t6n0ybkfgkNrh6s

看了部关于 Nord Stream pipelines 爆炸案的纪录片,制作方是德国的 DW。

可以很明显地感受到,制片人基本上已经主观认定是乌克兰所为了。一个贴有乌克兰军人照片的护照持有者,租了一辆小游艇两个星期,这艘游艇足以实施这次袭击。而且,租借游艇的机构和金钱都来自于乌克兰。

但是,也有安全专家提示,你们这么轻易地调查就得出了这些线索,很可能是对方设下的圈套。比如故意留下乌克兰的蛛丝马迹,让你以为这是乌克兰所为。

而德国政府对北溪案件持严格保密态度,更让人怀疑是在故意隐瞒一些信息。

不过这案子难查的一个主要因素是,北溪管道实在太容易破坏了,甚至可以说任何一个有意向的组织,投入很少的资金,就可以完成。家庭作坊制造炸弹,能搞定 70 米海水的潜水员,租借一艘小游艇,足矣。
https://laisky.notion.site/What-We-Got-Right-What-We-Got-Wrong-4a44534fca40489eb2302161512e662b?pvs=4

Rob Pike 在 2023 年 11 月的一次内部演讲稿,回顾 Golang 14 年的历程,没什么技术内容,热爱 Golang 的人可以读一读。

Pike 强调发明 Go 是为了解决 Google 所面临的超大规模团队的工程问题。而在今天看来,有很多人批评 Go 的语法,却几乎没人批评 Go 的工程化能力,这可以看作初创者们的初衷已经圆满实现了。

因为 Google 内部使用 monorepo,导致初创团队对于依赖管理经验不足,也严重低估了其复杂性,所以早期 Go 是没有多版本依赖管理的,直到后来实现了 gomodule。

在并发问题上,Pike 再次推荐了经典论文 CSP,并且认为 async/await 的写法实际上是把复杂性交给了程序员。(我倒是觉得 async/await 在手写调度时实际上比 CSP 简单)

还有就是作者认为 interface 已经足够了,但是迫于社区压力引入了范型,范型和 interface 的兼容很成问题,为此付出了大量的努力。

关于 Golang 和 Google 的关系,Pike 总结为:the core Go team is paid by Google but they are independent。Google 付钱,但并不干涉,Golang 是完全由社区主导的。

BTW,Rob Pike 已经 68 岁了,据说已经退休,近年来已经很少露面。 What We Got Right, What We Got Wrong | Notion
Laisky's Notes
https://chat.laisky.com/# 套皮站支持自定义 session 名了,而且在左侧会显示快速切换按钮。每个 session 都可以有独立的模型选择和配置(比如 system prompt),你可以给不同的会话设置不同的角色,这样在不同的任务间切换会更方便。 这站现在成我的日常娱乐了,有空就写几行垃圾代码,我自己用着舒服就行,缺啥加啥,哈哈哈哈。 next: https://t.me/laiskynotes/135
https://chat.laisky.com/ 狗屁通套皮站可以跨设备同步所有的配置和对话记录了。

之前支持了各个会话保存独立的设置,这样就可以开一堆会话,然后通过 system prompt 给每个会话定义不同的角色。用起来虽然很爽,但是每个设备都得这么设置一次很烦,所以同步设置成了必要的。

现在可以通过 sync key 同步记录和设置,使用相同的 sync key 就可以拉取相同的记录,所有的记录在云上都使用 AES-256 加密,密钥就是 sync key,无需担心隐私。

Ps. 视频里出现的 sync key 我已经销毁了,不用费劲黑我了。
读了一本信息满满的书《The Econology Trap》(技术陷阱)。此书通过经济数据来分析人类历史上的技术进步和社会变革,得出了很多有趣的观点。

比如,技术进步最大的阻碍从来不是技术本身。社会的本质是利益的创造和分配,技术的进步往往会立刻对利益的分配带来冲击,而带来广泛的利益创造则往往会滞后数十年(50 年左右)。所以历史上制约技术进步最大的障碍就是人们的抵制。

在古代,对技术进步的抵制主要来自上层统治阶级,因为这会动摇他们依赖利益分配所维持的统治地位。进入近代商业时代后,统治阶级转而鼓励技术进步以获取国际竞争优势,底层劳动者成为主要的抵制力量。某种意义上,工业革命之所以发源于欧洲,一大原因就是欧洲的国家间竞争实在太过于激烈,某国成功的抵制进步后很快就会被另一个国家超越。这些抵制技术进步的大众还被诬称为“卢德主义者(Luddite Movement)”。

在商业社会,技术进步让人们的劳动力价值逐步降低,而资本在收益分配中的比重日益上升。这也被称为“恩格斯停顿(Engels' Pause)”,即社会生长率上升,但劳动工资却停滞不前。

书中还提到了最近很火的一个观念“全民基本收入(Unconditional Basic Income, UBI)”,但这其实并不是一个新观点,本质上就是由 Milton Friedman 曾提出的“负所得税(negative income tax)”,即给未达到起征点的人发放福利。但是 UBI 的一个致命缺点是,他逆转了人们对于福利系统“帮助需要帮助的人”这一观念,转而无差别的将利益分配给所有人,这可能会反而增大差异,引发矛盾。

摘抄: https://blog.laisky.com/p/the-technology-trap/
https://chat.laisky.com/# 套皮站支持自定义 session 名了,而且在左侧会显示快速切换按钮。每个 session 都可以有独立的模型选择和配置(比如 system prompt),你可以给不同的会话设置不同的角色,这样在不同的任务间切换会更方便。
这站现在成我的日常娱乐了,有空就写几行垃圾代码,我自己用着舒服就行,缺啥加啥,哈哈哈哈。

next: https://t.me/laiskynotes/135
Laisky's Notes
最近几天都在折腾修电脑。 我家里有一台不关机的 win10 服务器,上面用 vmware player 跑了一台 ubuntu 作为我的主开发机。平时我随身带一台 macbook air,可以用 tailscale 连到这台 ubuntu 上远程开发。 前阵子我手贱点了升级到 win11。自从升级完成后,每天半夜这台 win11 都会完全卡死(freeze),只能长按电源强制关机再重启。后来忍无可忍用 win10 的启动盘重装了,但是自从重装了 win10 起,死机变得越来越频繁,逐渐从刚开始的一天一…
修电脑的后续,我高兴太早了,实际上并没修好,只不过出现了新的症状(最初刚升级 win11 时的症状)。

具体情况是,我修好后用了一天都没问题,让我以为修好了。但后来发现只要待机个五分钟后就会卡死。再后来发现不仅仅是待机,我在桌面上做一些轻度操作也会卡死,而我做一些需要大量 CPU 和磁盘 I/O 的操作就没事儿。然后我猜想是 win11 存在一些隐藏的省电策略,发现你负载低时就会触发,然后这个功能有致命 bug,会导致系统卡死。

基于这个猜想,我在 terminal 里跑了一个死循环,会稳定地吃掉一个核。然后奇迹发生了,这台 PC 从昨晚放置到现在都没死!

Ps. 我已经关闭了系统设置里所有的节能选项,sleep 全部设置为 never,power mode 为 best performance,但都没用。

BTW,我这台电脑外接了 UPS,所以在 OS 看来可能会误以为这是一台笔记本电脑,而 win11 在笔记本上的休眠死非常常见。今晚回去我把 UPS 拔掉试试。

补充:不是 win 的问题,是 CPU + 主板的问题。主板会自动调整 CPU 的电压,然后 CPU 在低电压时会卡死。
不知道为什么升级 win11 后立刻就出现了这个问题,可能是 win11 把我的主板 or CPU 驱动给静默升级了。
在 BIOS 设置里把 CPU 频率的 Auto 改成一个固定值就没问题了。
最近几天都在折腾修电脑。

我家里有一台不关机的 win10 服务器,上面用 vmware player 跑了一台 ubuntu 作为我的主开发机。平时我随身带一台 macbook air,可以用 tailscale 连到这台 ubuntu 上远程开发。

前阵子我手贱点了升级到 win11。自从升级完成后,每天半夜这台 win11 都会完全卡死(freeze),只能长按电源强制关机再重启。后来忍无可忍用 win10 的启动盘重装了,但是自从重装了 win10 起,死机变得越来越频繁,逐渐从刚开始的一天一次变成了几分钟一次,最后连系统启动过程中都可能卡死,最夸张的时候 UEFI 一加载 OS 开始转圈就死了。

我琢磨着估计是 win11 把我硬件损坏了,中间略去无数插拔、更换硬件寻找问题的过程。直到今天,我用 win11 启动盘重装了 win11 后,一切问题突然自动消失了。

没能最终定位到问题,盲猜是初次升级时出现不兼容问题,同时 win11 修改了 UEFI 里的一些配置,让硬件无法再兼容 win10 ,重装 win11 后就好了。(我把老硬件全装回去了也没问题,看来硬件都没坏)

顺带推荐一个在 mac 下制作 windows 启动 U 盘的工具:
https://github.com/TechUnRestricted/windiskwriter
只要从 MS 官网下载系统镜像 iso 文件,就可以直接在 mac 上用 U 盘制作 window 启动盘了,U 盘可以使用 FAT32 格式。

next: https://t.me/laiskynotes/130 GitHub - TechUnRestricted/WinDiskWriter: 🖥 Windows Bootable USB creator for macOS. 🛠 Patches Windows 11 to bypass TPM and Secure…
https://laisky.notion.site/The-Pulse-Will-US-companies-hire-fewer-engineers-due-to-Section-174-5082d31da80245e5889c218769f16262?pvs=4

关于美国税法新规 Section 174 对科技公司带来灭顶之灾。

川普在 2017 年提出的减税法案,使得税务局修订了征税标准,要求严格执行 S174。这一修订于 5 年后的 2022 年生效,而 2022 财年于 2023 年结算,导致很多公司在 2023 年收到了巨额税单,这也是造成 2023 裁员潮的一大原因。

S174 的最重要内容就是研发成本摊销,要求将美国内研发成本平摊到未来 5 年,美国以外地区的研发成本平摊到 15 年。简而言之,一家在年度内收支相抵零利润的公司,在税表上会表现为盈利,盈利额为 80% 的研发成本,这是因为当年的研发成本在每年只计算 20%。

S174 事实上给科创公司造成了财务重负,美国很可能会迎来一波出海潮,将科创公司主体设置在海外,从而规避 S174。
优化了一下 github action

设置 commit 的 7 位短 hash 作为 docker image tag:
- name: Add SHORT_SHA env property with commit short sha
run: echo "SHORT_SHA=`echo ${GITHUB_SHA} | cut -c1-7`" >> $GITHUB_ENV


将 docker layers 在 github action cache 里缓存:
-
name: Build and push hash label
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: YOUR_IMAGE_NAME:${{ env.SHORT_SHA }}
cache-from: type=gha
cache-to: type=gha,mode=max
又学到一个 python 的 trick,finally 始终会执行,甚至能重写 return。
汽车工业撤离后,底特律陷入萧条,大量人口失业并且离开,一片衰败的末世景象。

这,就是我以前对美国铁锈带的印象。但其实底特律人也并没有坐以待毙,他们在空置的城市土地上发展城市农业(urban agriculture),或者称为永续农业(Permaculture),利用社区园地为居民提供廉价的新鲜食物,并且教导人们在自家的草坪或花园里种植可食用蔬菜。

读到这段让我很感触,顺带分享一些可能有违“常识”的事实:

1. 人类的绝大部分粮食(70%+)都是由家庭作坊式的小农生产的
2. 个体的小农农业是土地效率最高的农业形式,产出可以比机械化农业高出十倍
3. 大规模机械化农业的人力效率高,但是土地效率低下,同时高度依赖化肥和农药,不可持续
Telegram Channel