Logo

site iconJustYY | 小赖子

小赖子的英国生活和资讯,以及投资和个人生活。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

JustYY | 小赖子 RSS 预览

用 iPhone 自带快捷指令把照片切成九宫格: 从零创建、下载、安装及 Python 实现

2026-09-21 22:28:37

iPhone 自带的「快捷指令」其实就能实现九宫格切图,不需要额外安装 App。本文记录如何从零创建一个“图片九宫格”快捷指令,让它支持从相册或共享菜单接收图片,并按照原图尺寸直接分割为 3×3 九张图片,同时介绍 .shortcut 文件、iCloud 分享链接,以及对应的 Python 实现和完整命令流程。
最近折腾了一下 iPhone 自带的「快捷指令(Shortcuts)」,做了一个挺实用的小工具:把一张照片自动切成 3×3 的九张小图,也就是我们平时所说的九宫格切图。 以前碰到这种需求,第一反应一般都是去 App Store 找个九宫格 App,或者找一个在线网站,把照片上传以后再切割。其实完全没有必要,iPhone 自带的「快捷指令」就能完成。 而且做好一次以后,以后的操作基本就是: 选择一张照片 → 运行快捷指令 → 自动得到九张图片。 不用安装第三方 App,也不用把照片上传到什么网站。

直接下载 / 安装「图片九宫格」快捷指令

如果不想自己从头做,可以直接安装我已经做好的版本: 在 iPhone 或 iPad 上打开上面的链接,会进入 Apple 的 Shortcuts 页面,然后选择添加快捷指令即可。 安装完成以后,「图片九宫格」就会出现在自己的快捷指令列表里。 [caption id="attachment_73032" align="alignnone" width="1905"]iPhone/iOS九宫格快捷方式/代码 iPhone/iOS九宫格快捷方式/代码[/caption]

也可以直接分享 .shortcut 文件

iOS 的快捷指令实际上也可以导出成一个扩展名为:
.shortcut
的文件。 所以除了上面的 iCloud Link,我也可以把导出的:
图片九宫格.shortcut
放到自己的服务器上供人下载。 不过如果是公开放在博客上,我个人更推荐使用 Apple 的 iCloud Shortcut Link。 一方面安装流程更自然,点击以后直接进入 Apple 的 Shortcuts 页面;另一方面 Apple 会处理快捷指令的签名和验证。

.shortcut 到底是什么文件?

这个问题还挺有意思。 一开始我还以为 .shortcut 可能就是一个 XML、JSON 或者普通的 Property List。 实际上,现在从 iPhone 导出的 .shortcut 文件要复杂不少。 我看了一下这次导出的文件,它的开头是:
AEA1
它实际上是一个由 Apple 签名的 Archive。 简化之后,大概可以理解成:
.shortcut
│
└── AEA1 Signed Archive
    │
    └── Apple Archive
        │
        └── Shortcut.wflow
            │
            └── Binary Property List
                │
                ├── Workflow 信息
                ├── Shortcut 图标
                ├── 输入输出类型
                └── WFWorkflowActions
                    └── 真正的一条条快捷指令命令
我这次导出来的文件大概只有 26 KB,但是里面已经包含了一条完整的 Workflow,以及 Apple 的 Signing Certificate Chain。 这也是为什么不建议直接拿 Hex Editor 或者文本编辑器去修改 .shortcut 文件。 哪怕里面真正的 Workflow 数据可以被解析出来,直接修改导出的签名文件也会破坏签名。

这个快捷指令到底做了什么?

最终目的非常简单。 假设有这么一张照片:

┌─────────────────┐
│                 │
│                 │
│     原始照片     │
│                 │
│                 │
└─────────────────┘
直接按照原图的宽和高分别三等分,切成:

┌─────┬─────┬─────┐
│  1  │  2  │  3  │
├─────┼─────┼─────┤
│  4  │  5  │  6  │
├─────┼─────┼─────┤
│  7  │  8  │  9  │
└─────┴─────┴─────┘
这里有一个容易误解的地方: 3×3 九宫格并不代表每一张小图都必须是正方形。 它只是把原始图片平均分成 3 行、3 列。 例如原图是:
4032 × 3024
那么每一块大约就是:
1344 × 1008
原图的宽高比不会被改变,也不需要事先从中间裁成正方形,因此不会丢掉原图左右或者上下的内容。 最后把这九张照片全部保存到相册。

从零开始创建「图片九宫格」

下面再记录一下如果完全从零开始,该怎么做。

第一步:创建 Shortcut

打开:
快捷指令
→ 所有快捷指令
→ 右上角 +
创建一个新的快捷指令。 我给它取名:
图片九宫格
名字当然可以随便取。

第二步:支持两种图片输入方式

我希望这个 Shortcut 有两种使用方法。 第一种是:
打开快捷指令
→ 点击“图片九宫格”
→ 选择照片
第二种更方便:
照片
→ 选择一张图片
→ 分享
→ 图片九宫格
因此首先把 Shortcut 设置成可以从: 共享表单 / Share Sheet 接收: 图像 / Images 然后判断到底有没有传进来照片。 快捷指令前面的逻辑就是:
从共享表单接收 图像

如果“快捷指令输入”有任何值

    将变量 img 设置为“快捷指令输入”

否则

    选择照片

    将变量 img 设置为“照片”

结束如果
这其实就是我们写程序时最普通的:
if shortcut_input:
    img = shortcut_input
else:
    img = select_photo()
这样后面的 Workflow 就不用关心图片到底是从哪里来的。 统一处理:
img
就行了。

第三步:获得图片 Width 和 Height

接下来添加: 获取图像详细信息 / Get Details of Images 分别获取:
Width
Height
例如一张 iPhone 照片可能是:
4032 × 3024
这里不需要把图片裁成正方形。 九宫格只是把原图横向分成三列、纵向分成三行,所以应该分别计算:
tileWidth = Width / 3
tileHeight = Height / 3
例如:
Width = 4032
Height = 3024

tileWidth = 4032 / 3
          = 1344

tileHeight = 3024 / 3
           = 1008
所以每张小图片的尺寸就是:
1344 × 1008
这样能够完整保留原图。 而且因为 Width 和 Height 都同时缩小为原来的三分之一,每张小图片和原图的宽高比完全相同。

第四步:计算九张图片的位置

图片坐标从左上角开始:
(0, 0)
X 向右增加,Y 向下增加。 现在我们有两个尺寸变量:
tileWidth
tileHeight
所以九张图片的位置是:
图片 X Y
1 0 0
2 tileWidth 0
3 2 × tileWidth 0
4 0 tileHeight
5 tileWidth tileHeight
6 2 × tileWidth tileHeight
7 0 2 × tileHeight
8 tileWidth 2 × tileHeight
9 2 × tileWidth 2 × tileHeight
然后使用: 裁剪图像 / Crop Image 选择:
Position = Custom
Width 设置成:
tileWidth
Height 设置成:
tileHeight
X 和 Y 使用上面计算出来的坐标。

更漂亮一点:用两个 Repeat 循环

当然,我们完全可以真的创建九个 Crop Image。 但是从程序员角度看,这显然有点重复。 更漂亮的做法是两个循环:
for row in range(3):
    for col in range(3):
        x = col * tileWidth
        y = row * tileHeight

        crop(
            x=x,
            y=y,
            width=tileWidth,
            height=tileHeight
        )
Shortcut 里面也可以使用: 重复 / Repeat 来实现。 外层:
重复 3 次
代表 Row。 先计算:
row = Repeat Index - 1
然后里面再:
重复 3 次
代表 Column。 计算:
column = Repeat Index - 1

X = column × tileWidth
Y = row × tileHeight
然后:
裁剪 img

Position = Custom
X = X
Y = Y
Width = tileWidth
Height = tileHeight
每次得到的结果加入变量:
gridImages
两个循环完成以后:
gridImages
里面正好就是九张照片。

第五步:保存九张照片

最后增加: 存储到照片相簿 / Save to Photo Album 输入:
gridImages
Shortcut 就完成了。

完整的 Shortcut 命令流程

如果把整个快捷指令按照命令顺序展开,大概就是:
1. 从共享表单接收“图像”


2. 如果 Shortcut Input 有任何值

       设置变量 img = Shortcut Input

   否则

       选择照片
       设置变量 img = 照片

   结束如果


3. 获取 img 的 Width

       → width


4. 获取 img 的 Height

       → height


5. 计算

       tileWidth = width / 3


6. 计算

       tileHeight = height / 3


7. 重复 3 次

       row = Repeat Index - 1

       重复 3 次

           column = Repeat Index - 1

           X = column × tileWidth
           Y = row × tileHeight

           裁剪 img

               Position = Custom
               X Coordinate = X
               Y Coordinate = Y
               Width = tileWidth
               Height = tileHeight

           将裁剪结果加入 gridImages

       结束重复

   结束重复


8. 将 gridImages 保存到照片相簿
如果从软件工程角度看,这其实已经是一个非常标准的小程序了。 有:
  • Input
  • Variable
  • If / Else
  • Nested Loop
  • Arithmetic
  • Coordinate Calculation
  • Image Processing
  • Output
只不过 Apple 把这些程序设计概念全部变成了一个个可以拖动的 Action。

如果用 Python 写,会是什么样?

其实 Shortcut 背后的核心算法用 Python 写出来反而更容易理解。 安装 Pillow:
pip install pillow
然后可以写成:
from pathlib import Path
from PIL import Image, ImageOps


def make_nine_grid(input_file: str, output_dir: str = "nine_grid"):
    input_path = Path(input_file)
    output_path = Path(output_dir)

    output_path.mkdir(parents=True, exist_ok=True)

    # 打开图片
    image = Image.open(input_path)

    # 根据 EXIF 信息纠正手机照片的方向
    image = ImageOps.exif_transpose(image)

    width, height = image.size

    # -------------------------
    # 第一步:计算 3 × 3 的边界
    # -------------------------
    #
    # 宽和高分别三等分。
    #
    # 不需要先把原图裁成正方形,
    # 因此不会丢失原始图片的内容。
    #
    # 使用边界而不是简单的 width // 3
    # 和 height // 3,可以处理尺寸不能被
    # 3 整除的情况。
    #

    x = [
        0,
        width // 3,
        width * 2 // 3,
        width,
    ]

    y = [
        0,
        height // 3,
        height * 2 // 3,
        height,
    ]

    # -------------------------
    # 第二步:裁成九张图片
    # -------------------------

    index = 1

    for row in range(3):
        for col in range(3):

            box = (
                x[col],
                y[row],
                x[col + 1],
                y[row + 1],
            )

            tile = image.crop(box)

            filename = output_path / f"grid_{index:02}.png"

            tile.save(filename)

            print(
                f"{index}: "
                f"row={row}, "
                f"col={col}, "
                f"box={box}, "
                f"size={tile.size}"
            )

            index += 1


if __name__ == "__main__":
    make_nine_grid(
        "photo.jpg",
        "nine_grid",
    )
运行:
python nine_grid.py
最后目录里面就会得到:
nine_grid/
├── grid_01.png
├── grid_02.png
├── grid_03.png
├── grid_04.png
├── grid_05.png
├── grid_06.png
├── grid_07.png
├── grid_08.png
└── grid_09.png

Python 版本还有一个值得注意的小细节

假设图片尺寸刚好可以被 3 整除,例如:
4032 × 3024
那么:
4032 / 3 = 1344
3024 / 3 = 1008
最终九张图片都会是:
1344 × 1008
但是并不是所有图片的尺寸都一定可以被 3 整除。 比如原图是:
4033 × 3025
那么:
4033 / 3 = 1344.333...
3025 / 3 = 1008.333...
图片当然不可能包含:
0.333 Pixel
如果简单写:
tileWidth = width // 3
tileHeight = height // 3
得到:
tileWidth = 1344
tileHeight = 1008
那么三个 tile 加起来只有:
1344 × 3 = 4032

1008 × 3 = 3024
这样原图右边和下面都会各剩下一个 Pixel。 所以 Python 版本没有简单地固定每块尺寸,而是直接计算四条 X 边界:
x0 = 0
x1 = width // 3
x2 = width * 2 // 3
x3 = width
以及四条 Y 边界:
y0 = 0
y1 = height // 3
y2 = height * 2 // 3
y3 = height
对于:
width = 4033
X 坐标就是:
0
1344
2688
4033
三个横向区间分别是:
0    → 1344
1344 → 2688
2688 → 4033
最后一块可能会比前面的多一个 Pixel,但整个原图的所有 Pixel 都会被保留下来。 Height 也是同样的处理方式。 这种做法的关键不是要求九张图片绝对一模一样大,而是: 保证整张原始图片被完整、连续、无重叠地切成 3×3 九个区域。

为什么不用先裁成正方形?

这里其实很容易产生一个误解: “九宫格”并不等于“九张正方形图片”。 3×3 只是说:
3 Columns × 3 Rows
如果原图是:
4032 × 3024
它的宽高比是:
4 : 3
切成 3×3 以后,每一块大约是:
1344 × 1008
宽高比仍然是:
4 : 3
这其实正是我们想要的。 因为横向和纵向都缩小了三倍,所以每一块和原图拥有相同的 Aspect Ratio。 如果为了所谓的“九宫格”先从中间把:
4032 × 3024
裁成:
3024 × 3024
那么左右两边一共会直接丢掉:
4032 - 3024
= 1008 Pixels
对于照片来说,这可能会把原本位于画面边缘的人物或者景物直接裁掉。 所以正确的做法就是: 保持原始照片尺寸,Width 和 Height 分别三等分。

平时怎么使用?

做好以后其实基本不用再打开 Shortcut 编辑器。 最简单的方式:
快捷指令
→ 图片九宫格
→ 选择照片
然后九张照片就会保存到相册。 我自己更喜欢从 Photos 直接运行:
照片
→ 打开一张图片
→ 分享
→ 图片九宫格
这时候照片会直接作为:
Shortcut Input
传进去。 因此连再次选择照片都不需要。

为什么我更喜欢 Shortcut 而不是九宫格 App?

当然 App Store 上肯定有大量九宫格工具。 但是这么简单的需求再安装一个 App,我觉得有点多余。 自己做 Shortcut 有几个好处。 首先不用看广告,也没有什么 VIP、会员或者每天免费处理三张这种限制。 其次照片不需要上传到什么未知的网站。 最重要的是,做完以后这是一个完全属于自己的小工具。 而且 Shortcut 很容易继续修改。 比如把:
3 × 3
改成:
2 × 2
就是四宫格。 改成:
4 × 4
就是十六宫格。 甚至可以在程序开始的时候:
询问输入

请输入 N:
然后分别计算:
tileWidth = width / N
tileHeight = height / N
循环也改成:
for row in range(N):
    for col in range(N):
如果用 Python 写得更加严谨一点,则依然可以直接计算所有边界:
x[i] = width * i // N
y[i] = height * i // N
其中:
i = 0, 1, 2, ..., N
这样就可以保证无论原始图片尺寸能不能被 N 整除,所有 Pixel 都会被完整使用。 这样它就不再是一个单纯的九宫格 Shortcut,而是一个: N × N 通用图片切割工具。

Shortcuts 本质上也是编程

以前我一直觉得 iPhone 的 Shortcuts 只是一个简单的自动化工具。 真正自己做几个以后,会发现它实际上和写程序没有什么本质区别。 比如这次的九宫格,里面已经有:
Input
Variable
If / Else
Loop
Nested Loop
Arithmetic
Coordinate
Image Processing
Output
甚至还涉及到一个很典型的二维坐标问题。 核心算法实际上就是:
for row in range(3):
    for col in range(3):

        left   = width * col // 3
        right  = width * (col + 1) // 3

        top    = height * row // 3
        bottom = height * (row + 1) // 3

        crop(
            left,
            top,
            right,
            bottom,
        )
用 Python 写可能几十行代码就解决了,而 Shortcuts 的好处是: 写完以后直接变成了 iPhone 上随时可以使用的小工具。 以后想切九宫格的时候,只需要:
照片
→ 分享
→ 图片九宫格
几秒钟以后,九张图片就已经在相册里面了。 有些很小的需求,其实根本没必要专门安装一个 App。 iPhone 自己已经提供了一套相当不错的自动化和编程环境。 [show_file file="/var/www/wp-post-common/justyy.com/ios.php"] [show_posts keyword="iphone"] 对了,我Vibe-code了一个把图片切割成格子的工具:图片切割:将图片精确划分为网格,预览每个分块并下载一个 ZIP 文件。图片始终保留在此设备上。 英文:Split a Photo into a 3×3 Grid with iPhone Shortcuts: Build, Install, Share and Recreate It in Python

微软 Global Hackathon 2026: 一周时间, 把一个想法先做出来

2026-09-20 21:00:50

这两年开始参加微软每年九月份举办的 Global Hackathon。今年我也注册并加入了两个 Project。Hackathon 通常只有一周时间,最终交付往往只是一个两分钟左右的 Demo 视频,因此相比成熟产品,Idea 和 Proof of Concept 更重要。对我来说,这更像是一周难得的“合法折腾时间”:可以看看其他团队的想法、学习新技术,也可以暂时跳出日常项目的节奏,快速验证一个平时未必有机会尝试的 Idea。
[caption id="attachment_73016" align="alignnone" width="1241"]注册Hackathon就有电子徽章 注册Hackathon就有电子徽章[/caption] 微软的 Hackathon 是每年九月份举办的一项内部创新活动,最早从 2014 年开始,到现在已经举办十多年了。规模也非常大,参与者往往来自全球不同的团队、不同的产品线,很多平时完全没有机会一起合作的人,会因为一个 Idea 临时组成一个 Team。 以前我一直知道公司有这么一个活动,不过真正开始参与,也就是最近这两年的事情。

Hackathon 通常只有一周

Hackathon 正式活动基本就是一周。 一般第二周的周一,需要上传一个大约两分钟的视频,介绍这个 Project 是做什么的、解决了什么问题,以及最终的 Demo。 有意思的是,Hackathon 并不像正式的软件项目一样要求提交一个非常完整的产品。 代码当然可以写,但通常不会有人真正去逐行 Review 你的代码。 很多时候,最终真正的 Output 或 Delivery,其实就是那个两分钟的视频。 所以参加过以后,我越来越觉得,Hackathon 和平时做软件工程项目的思维方式其实很不一样。 平时的软件开发,我们会考虑很多东西: Architecture、Code Quality、Testing、Security、Performance、Deployment、Maintainability。 但 Hackathon 只有短短一周。 从星期一开始做到星期五,真正能够写代码和折腾的时间其实并没有多少。 想在几天时间里做出一个成熟、稳定、Production Ready 的产品,基本不太现实。 所以大部分 Hackathon Project,本质上都只是: Proof of Concept。 也就是先证明: 这个 Idea 是可行的。

Fake it until you make it

因为时间很短,所以 Hackathon 里其实很适合一种思路: Fake it until you make it。 当然,这里的 Fake 并不是伪造结果。 而是说,为了快速验证一个 Idea,可以先 Mock 一些数据,可以把一些复杂流程简化,也可以先做一个看起来完整、实际上只实现核心功能的 Prototype。 比如一个真正的产品可能需要: Backend、Database、Authentication、Security Review、Monitoring、Deployment、Scalability…… 但 Hackathon 的时候,很多东西完全可以先不做。 只要最后能够通过一个 Demo,让别人理解: 如果我们真的把这个东西做出来,它最终可能是什么样子? 其实就已经达到目的了。

Idea 有时候比 Delivery 更重要

所以我觉得 Hackathon 最有意思的一点,就是: Project Idea 往往比最终的 Delivery 更重要。 正常工作里面,一个新的 Idea 想真正进入 Product Roadmap,需要考虑很多现实问题: Priority、Resource、Budget、Customer Requirement、Security、Compliance、Cost…… 有时候一个想法讨论了几个月,可能连第一行代码都还没开始写。 Hackathon 就不一样。 有一个 Idea? 先做出来看看。 先用几天时间验证一下。 如果最后发现这个 Idea 不靠谱,也没有什么关系。 至少大家验证过了。 但有时候,也会发现一些原本看起来有点异想天开的想法,在做成 Demo 以后,居然真的挺有意思。 这其实就是 Hackathon 最大的价值之一。

今年我 Join 了两个 Project

今年我也注册参加了 Hackathon,而且 Join 了两个 Project。 不过严格来说,我并没有 100% 全职投入到 Hackathon 里面。 更多的时候属于哪里需要帮一点忙,就过去帮一下。 Hackathon 其实挺自由的。 微软的LOGO在衣服后面脖胫处。参加的第一天/周一就有工程师穿上了。 [caption id="attachment_73011" align="alignnone" width="2048"]今天微软哈克松领的东西挺多的。 今天微软哈克松领的东西挺多的。[/caption] 注册了,并不一定真的要参加。 参加了,也不一定要上传视频。 上传了视频,也不一定会获奖。 并不是说报名以后,这一周就必须完全停止正常工作,然后每天全职 Hack。 参与多少,其实完全取决于自己的时间和兴趣。 我今年也就是参与一下,有需要的时候帮忙做一点东西。

注册以后还有衣服、SWAG 和午餐券

Hackathon 还有一些比较有意思的周边。 注册以后,星期一早上通常可以去领取 Hackathon 的衣服,还有一些小的 SWAG。 今年还发了一张免费的午餐券。 其实这些东西本身值不了多少钱,但会让整个活动稍微多一点仪式感。 公司里平时大家都在忙自己的 Project。 到了 Hackathon Week,办公室里面会明显感觉到有一点不一样。 会看到一些平时没见过的 Team 在做一些奇奇怪怪的东西。 有人做 AI。 有人做 Hardware。 有人做 Developer Tool。 也有人做一些非常 Experimental 的 Project。

不一定要获奖

我觉得参加 Hackathon 最容易陷入的一个误区,就是把它理解成一个比赛。 当然,它确实有评选,也有各种获奖 Project。 但对于绝大多数参与者来说,获奖其实并不是最重要的事情。 我反而觉得: 只要参与了,就已经有价值。 注册了,是好事。 Join 了一个 Project,也是好事。 真正写了几天代码,更好。 最后还能录一个两分钟的视频,那就更完整了。 至于最后有没有拿奖,反而没有那么重要。 [caption id="attachment_73008" align="alignnone" width="1152"]哈克松的本子,都不舍得拿来写。 哈克松的本子,都不舍得拿来写。[/caption]

一周“合法的折腾时间”

对我来说,Hackathon 越来越像是一周: 合法的折腾时间。 平时大家都有自己的 Project、Deadline、Bug、Meeting 和各种正常工作。 很难专门拿几天时间,去尝试一个和自己日常工作没有直接关系的东西。 Hackathon 正好提供了这么一个机会。 这一周正常工作的节奏一般会稍微轻一点。 可以看看公司其他团队最近有什么新的 Idea。 也可以 Join 一个以前完全不了解的 Project。 甚至只是利用这一周学习一个新的 Framework、一种新的 AI 技术,或者认识几个平时完全没有合作机会的同事,也挺有价值。 有时候最重要的甚至不是最后做出了什么。 而是: 你终于有理由花几天时间去研究一个平时根本不会去碰的东西。

Idea 比结果更重要

所以我现在看 Hackathon,已经没有以前那么在意最后到底做出来一个什么东西了。 一周时间,本来就不可能做出特别成熟的产品。 真正重要的是: 有没有一个值得尝试的 Idea。 有没有通过 Prototype 验证它。 有没有在这个过程中学到一点新东西。 平时的软件工程更多是在回答: 这个东西怎么才能可靠地做出来? 而 Hackathon 更像是在问: 这个东西,为什么不能先试试看? 我觉得这可能才是 Hackathon 最有意思的地方。 [caption id="attachment_73010" align="alignnone" width="2048"]免费午餐 ,5.1英镑, 那天我才了解到,可以花1.5倍的价格获得大概双份的量。公司的饮料/水果是免费的,这个午餐券还包括一个甜点。 免费午餐 ,5.1英镑, 那天我才了解到,可以花1.5倍的价格获得大概双份的量。公司的饮料/水果是免费的,这个午餐券还包括一个甜点。[/caption] [caption id="attachment_73009" align="alignnone" width="2048"]免费的午餐 最香了。 免费的午餐 最香了。[/caption] 这两年,我才开始比较认真地参加微软每年一度的 Global Hackathon。 去年获得了一个奖:拿到了一个纪念杯子:这周第一次参加微软的Hackathon/黑客马拉松 [show_file file="/var/www/wp-post-common/justyy.com/microsoft.php"] [show_posts keyword="Hackathon"] 英文:Microsoft Global Hackathon 2026: One Week to Turn an Idea into Something Real

CP/M: 那个比 MS-DOS 更早的操作系统

2026-09-19 19:31:33

[bctt tweet="知道DOS甚至CP/M的都暴露年龄了。"]

回顾 CP/M——一个诞生于微软 DOS 之前、并深刻影响早期个人电脑发展的经典操作系统。从 DIR、TYPE、FORMAT 等熟悉命令中,可以看到 DOS 时代乃至后来 PC 操作系统发展的许多早期痕迹。 CP/M:微软 DOS 之前的操作系统先驱 CP/M: The Operating System Pioneer Before Microsoft DOS 在 DOS 之前:回顾 CP/M 操作系统 Before DOS: A Look Back at the CP/M Operating System CP/M:那个比 MS-DOS 更早的操作系统 CP/M: The Operating System That Came Before MS-DOS 从 CP/M 到 DOS:个人电脑操作系统的早期历史 From CP/M to DOS: The Early History of Personal Computer Operating Systems 看到 CP/M,仿佛看到了 DOS 的祖先 Looking at CP/M Feels Like Seeing an Ancestor of DOS
这是 CP/M,一个比微软 DOS 还要早很多年的操作系统。 从今天的角度来看,它的命令行界面其实已经让人觉得非常熟悉了。像 DIR、COPY、TYPE、FORMAT 这样的命令,后来都成为 DOS 时代非常常见的命令。 CP/M 由 Gary Kildall(加里·基尔代尔) 在 20 世纪 70 年代开发,最初的全称是 Control Program/Monitor,后来 Digital Research 也使用过 Control Program for Microcomputers 这个解释。它曾经是早期 8 位微型计算机时代最重要、最流行的操作系统之一。 在 IBM PC 出现之前,CP/M 已经拥有相当成熟的软件生态。1981 年 IBM 推出 IBM PC 后,微软提供了 MS-DOS。MS-DOS 的早期设计、命令风格以及整体使用方式,都明显受到了 CP/M 时代的影响。 所以今天再看到 CP/M 的界面,会有一种很有意思的感觉:它看起来很像一个“DOS 之前的 DOS”。如果把个人电脑操作系统的发展画成一棵家谱,那么 CP/M 无疑是其中非常重要的一位祖先,而 DOS、Windows 以及后来整个 PC 软件生态的发展,都可以从那个时代找到不少影子。 [caption id="attachment_72994" align="alignnone" width="816"]CP/M操作系统 CP/M操作系统[/caption] [show_posts keyword="操作系统"] [show_file file="/var/www/wp-post-common/justyy.com/nostalgic.php"] 英文:CP/M - The Operating System That Came Before MS-DOS | Are you this old? Apple CP/M - 1980 Microsoft | Are you this old? Apple CP/M - 1980 Microsoft

又到了一年一度的中秋节/媳妇做的冰皮月饼

2026-09-19 17:54:08

人在海外多年,每到中秋总会多几分“每逢佳节倍思亲”的感触。今年因为朋友做的冰皮月饼,媳妇也被勾起了兴趣,买食材、刷教程、用小美做紫薯馅和咸蛋黄月饼,还把做好的月饼送给朋友。看着她在厨房里忙活,也让我想起了刚来剑桥以及疫情期间那些在家做糕点的日子。月饼或许只是节日的一种形式,但一家人在一起,为生活花点时间折腾,这些平凡的瞬间,本身就是一种团圆。
每到中秋节,总会多几分“每逢佳节倍思亲”的感觉。尤其是在海外生活多年以后,很多中国传统节日反而不像小时候那样,早早就在日历上等着了。 其实每年中秋节快到的时候,我似乎总是最后一个意识到的人。 通常都是某一天去中超买东西,突然看到货架上摆满了各种月饼,才反应过来:哦,中秋节快到了。又或者朋友圈里有人开始晒自己做的月饼,我才意识到又到这个季节了。 至于中秋节具体是哪一天,我往往是不知道的。只知道大概是在秋天,天气开始转凉的时候。 上周,我和媳妇一起去朋友家参加团契。朋友自己做了冰皮月饼,大家一起吃了几个。没想到媳妇回来以后就被“种草”了,觉得自己也应该试试看。 于是接下来的几天,家里就进入了“月饼实验室”模式。 先是在网上各种买食材,然后刷小红书看教程,再把家里的小美 cooker 搬出来研究配方。先折腾紫薯馅,后来又开始做咸蛋黄馅,一做还不是几个,而是一批一批地做。 做多了以后,自己当然也吃不完,于是又装成一盒一盒,送给几个朋友尝尝。 我估计媳妇做月饼的动力大概有两个:一是自己嘴馋,二是纯粹想折腾一下。 我还问她:“为什么不直接买呢?省时省力,想吃什么口味都有。” 她的回答也很直接:“外面卖的哪有自己做的健康。” 这倒也是。自己做,至少糖放多少、油放多少、里面是什么材料,心里都有数。至于到底比外面卖的健康多少,那就另说了。毕竟为了做这一批月饼,这几天厨房也没少折腾。 看着她忙着做月饼,我倒是突然想起了很多年前。 媳妇刚来剑桥的时候还没有工作,时间比较多,经常在家里给我做各种糕点、蛋糕和饼干。那时候隔三差五就能看到她研究一个新配方,然后厨房里摆满各种烤盘、模具和原材料。 后来工作越来越忙,孩子也越来越大,这种慢慢花几个小时研究一种点心的闲情逸致,反而越来越少了。 仔细想想,上一次她这么有时间在家里折腾吃的,好像还是疫情期间。 那时候大家都被要求尽量待在家里,我在家办公,媳妇当时在 Tesco 超市工作,因为疫情期间的一些安排,有一段时间也不用去上班,收入还有保障。突然多出来的大把时间,让大家的生活节奏一下子慢了下来。 那一阵子,家里也经常做各种吃的。 现在回头看,那段时间虽然有很多不方便,但一家人长时间待在一起,也留下了一些很特别的记忆。 所以这次看到媳妇重新开始研究月饼,我突然觉得,做不做月饼本身其实没有那么重要。 重要的是,生活里又出现了这种愿意花几个小时,为家里人折腾一点东西的心情。 人在海外久了,中秋节也许没有国内那么浓的节日气氛,没有满街的月饼广告,也没有几天前就开始讨论放假和团圆。但有时候,一个朋友做的月饼、一盒自己折腾出来的点心,就能把这种熟悉的节日感觉重新带回来。 而所谓“团圆”,大概也不一定非得是一大家人坐在同一张桌子旁。 一家人在一起,厨房里有人忙着做月饼,孩子偶尔过来偷吃一个,做多了再给朋友送几盒——这种普普通通的日子,本身也已经是一种团圆。 又快到中秋了。 以前觉得月饼只是中秋节的一种食品,现在反而越来越觉得,它更像是一种提醒:提醒你秋天到了,也提醒你,在忙忙碌碌的生活里,偶尔还可以停下来,想想家,想想以前的日子,也珍惜一下现在身边的人。 [caption id="attachment_72974" align="alignnone" width="2048"]老婆做出来的第一个月饼。 老婆做出来的第一个月饼。[/caption] [caption id="attachment_72975" align="alignnone" width="1152"]馅饼的馅/紫薯/用小美cooker做。 馅饼的馅/紫薯/用小美cooker做。[/caption] [caption id="attachment_72976" align="alignnone" width="1152"]冰皮月饼装盒 放冰箱冷藏。 冰皮月饼装盒 放冰箱冷藏。[/caption] [caption id="attachment_72977" align="alignnone" width="1152"]大版本的汤圆,然后再用磨具压成月饼形状。 大版本的汤圆,然后再用磨具压成月饼形状。[/caption] [caption id="attachment_72978" align="alignnone" width="1152"]制作月饼的过程,并不简单,也挺耗时的。 制作月饼的过程,并不简单,也挺耗时的。[/caption] [caption id="attachment_72979" align="alignnone" width="1152"]烤出来的月饼是金黄的,很香 烤出来的月饼是金黄的,很香[/caption] [caption id="attachment_72980" align="alignnone" width="1537"]媳妇做月饼 做了好几盒 媳妇做月饼 做了好几盒[/caption] [caption id="attachment_72981" align="alignnone" width="1537"]媳妇批量做月饼,这个是咸蛋黄馅的,要放烤箱里烤。 媳妇批量做月饼,这个是咸蛋黄馅的,要放烤箱里烤。[/caption] [caption id="attachment_72982" align="alignnone" width="1024"]老婆做月饼 老婆做月饼[/caption] [caption id="attachment_73005" align="alignnone" width="1152"]这么一坨紫薯馅 这么一坨紫薯馅[/caption] [show_posts keyword="糕点"]

在Perse接娃, 偶遇一块可能值几万英镑的ACE IT车牌

2026-09-17 23:04:12

去剑桥Perse私校接娃时,偶遇一辆挂着“ACE IT”车牌的奥迪。这块车牌很可能是“ACE 1T”,读起来有“漂亮地搞定”的意思。参考类似号码的挂牌价,它或许价值几万英镑。一次普通的接娃经历,让我见识了英国个性车牌的身价,也找到了一句给娃加油的英语。
[caption id="attachment_72954" align="alignnone" width="2048"]ACE IT豪车车牌 ACE IT豪车车牌[/caption] 昨天去剑桥的Perse私校接娃放学。娃第一次参加学校课后的Duke of Edinburgh’s Award活动,也就是爱丁堡公爵奖项目,通常简称DofE。 在校园里等娃的时候,我看到一辆奥迪,车尾的车牌一下子吸引了我的注意:ACE IT。 从照片看,应该是奥迪 SQ8,属于Q8车系的高性能大型SUV。 判断依据是它的溜背造型、贯穿式尾灯、车尾左侧的S系列标识,以及双边四出圆形排气口。 这辆车本身也不便宜:目前英国官网的SQ8新车起价约 £104,310(10.4万英镑)。不过,照片里这辆的具体年款和配置,仅凭外观还不能确定。这样的豪车配个豪车车牌自然很正常。 平时在Perse接送孩子,经常能看到各种豪车。看得多了,有时候也会忍不住开个玩笑:这里的学生家长,除了我,是不是都挺有钱的? 不过,这次让我多看了几眼的,是那块很有意思的车牌。短短几个字符,居然刚好能读成一句英文。

看起来是ACE IT,实际上应该是ACE 1T

仔细研究了一下,这块车牌应该是ACE 1T,中间那个看起来像字母“I”的字符,其实是数字“1”。按照英国旧式的后缀车牌格式,前面是三个字母,中间是一至三位数字,最后再跟一个表示年份的字母,因此“ACE 1T”符合这种结构。DVLA的车牌格式说明 这样一来,登记号码是“ACE 1T”,看起来却像“ACE IT”。数字和字母之间的小小错觉,让一个普通的登记号码有了额外的意思。

ACE IT是什么意思

“Ace it”可以理解为“把事情做得很出色”“漂亮地搞定”。 出色的完成它! Ace除了可以指扑克牌里的A、某个领域的高手,还可以作动词,表示在考试或其他事情上表现得非常好。例如,“I aced the exam.”就是“我这次考试考得很棒”;对即将参加考试或面试的人说“You’ll ace it!”则是在鼓励对方:“你一定会表现得很出色!”Merriam-Webster词典 所以,这块车牌读起来还挺有气势。挂在车尾,像一句简短的自我鼓励,也像是在说:这点事,我能搞定。 当然,车主选它究竟是因为喜欢这句话,还是与名字、公司或其他事情有关,我就不知道了。我只是觉得,这几个字符组合得确实巧妙。

一块车牌可能值几万英镑

好奇之下,我又查了查价格,结果比车牌本身更让我多看了两眼。 虽然没有找到ACE 1T这块车牌的实际成交记录,但我查到一个相近的号码:ACE 1X,挂牌价为24,750英镑,另外还有80英镑的转让费。ACE 1X的销售页面 贫穷限制了我的想像,不过也许这对真正的有钱人来说,可能就和我们上超市买个白菜一样样的吧。 [caption id="attachment_72956" align="alignnone" width="621"]ACE1X也得2万5000英镑 ACE1X也得2万5000英镑[/caption] 光一个登记号码,开价就接近两万五千英镑。

挂牌价不等于成交价

如果让我粗略估计,照片里的ACE 1T也可能在一万五到三万英镑这个范围,遇上特别喜欢“ACE IT”这句话的买家,或许还会有人愿意出更高的价。不过,这只是参考类似号码挂牌价作出的猜测:挂牌不等于成交,更不代表车主当年就是花这个价钱买的。

花几万英镑买一个喜欢的号码

即便如此,还是忍不住感慨。几万英镑对我来说,是一笔需要认真盘算用途的钱。如果一个家庭能轻轻松松拿出这笔钱,只为挑一个自己喜欢的车牌,那经济条件大概相当宽裕。 至于是否因此就能算“精英”,或者财富排在多少人前面,一块车牌当然说明不了那么多。我们看到的是别人愿意展示出来的一小部分,也不知道这块车牌背后的来历。但这种消费方式,确实让我感受到人与人之间对“花钱买个喜欢”的预算差别。

给娃的一句鼓励

话说回来,ACE IT这个意思,我倒是真喜欢。尤其是在学校里看到它,很容易联想到孩子的考试、比赛,以及第一次尝试的新活动。娃刚开始参加DofE,接下来还有不少事情要学习和体验,希望他也能慢慢找到那种“我能搞定”的信心。 以后给娃加油,倒是可以多用一句:You’ll ace it! 不过,要我花几万英镑把这句话挂在车上,我一是没钱,二是舍不得。先免费说给娃听吧。 PS:我觉得我的X8 CPU还是挺不错的,性价比很高,也才花了几百英镑!车牌是保值的(就类似好的域名),可以代代相传,而大多数车都是消耗品,从买了那天起就会有折旧。我和娃说,我这X8CPU车牌以后就传给你了。 [show_posts keyword="车牌"] [show_file file="/var/www/wp-post-common/justyy.com/car-plate.php"] 英文:ACE IT: this is a good car plate! | ACE IT: this is a good car plate!