回旋镖之重回北京

回旋镖之重回北京

2023 年毕业后我来到了杭州,开始了我的第一份工作。相比北京而言,杭州这个南方城市对我来说熟悉又新鲜。熟悉的是我作为南方人对这里的气候和风土人情有所了解,新鲜的是这里的山水江湖和人文历史让我感到耳目一新。初到的一年时间里,我常常在业余时间独自在城市里探索,在西湖、植物园、雷峰塔、灵隐寺、龙井村、西溪湿地等等地方都留下过足迹,我也用相机记录下了这些令人欣喜的时光。

在 2022 年找工作时经历过的难以抉择的时光如今依然历历在目。2020 年疫情开始我的学生生活就发生了翻天覆地的变化,不能自由地进出校门、进出北京让我在研究生阶段的探索计划通通落空,取而代之的是食堂的透明隔板、进出校的艰难报备以及隐隐约约的焦虑不安。三年的限制让我对北京没有过多的留恋,我甚至是抱着埋怨的心态选择了杭州的工作岗位,并且在毕业后如愿地、如释重负地来到了杭州。杭州的山水人文环境也确实疗愈了我,让我能够在今时今日决定回到北京。

阅读更多
再次认识 React

再次认识 React

毕业之后很久没写前端代码了,但最近因为工作需要又开始接触前端项目。例如在 ob-operator 项目中我负责评审两位前端同学过去一年所有的 PR、在用 Cursor 快速搭建软件原型提到的项目中也是用 Cursor 快速实现了一个以 TypeScript + Next.js + Shadcn UI 作为技术栈的 RAG 系统管理后台 Web 应用。

过去自己认为十分枯燥乏味的前端项目开发,在分别许久后似乎又迸发了出新的吸引力。当然如果要回溯让我产生这样变化的原因,我会归因于通过新的路径重新认识 React 吧。这条新路径的载体是 Next.js 这个极度流行的框架。

阅读更多
2024 年终总结

2024 年终总结

2024 年过得很快,时间就像倾盆大雨时的雨滴,挡不住地从空中落在地上,然后消失在草地或者泥土里。这一年我经历了很多事情,也学到了很多事情,希望可以用这篇博客来总结和梳理一下自己的想法。主要还是围绕着与自己工作和兴趣相关的云原生、RAG 和 AI 三个方面展开。

阅读更多
像使用 Windows 一样使用 MacOS

像使用 Windows 一样使用 MacOS

我在学校时实验室配备的办公台式机是 Windows 系统,而我自己的笔记本电脑是 macOS 系统。在使用两个操作系统的过程中,我发现有一些 Windows 系统的使用方式比较高效,而且在 macOS 上也可以实现,这样既能让我在两个系统之间的切换变得流畅,也可以提高我在 macOS 上的工作效率。以下是我在 MacOS 上实现 Windows 系统使用方式的一些方法。

主要分为鼠标使用、窗口管理、软件切换、云盘存储和跨平台软件使用几个方面。

阅读更多
用 Cursor 快速搭建软件原型

用 Cursor 快速搭建软件原型

Cursor 是一款使用 AI 能力加持的代码编辑器,或者说得更大一点,文本编辑器。正如它在官网所说的那样 Built to make you extraordinarily productive, Cursor is the best way to code with AI. 使用它能够让在编程时更加高效,几倍地提升编码效率,将工程师从平常繁琐、简单、机械、重复的代码编写工作中解放出来,更加专注于分析、建模和解决关键的问题。

但需要说在开头的是,Cursor 无法让零基础的用户变成专精的软件工程师,以能够解决所编写代码中发生的各种疑难杂症,但能让他们轻松搭建出一些有意思的应用,例如简单的网页,便捷的脚本等,真正遇到问题需要定位和调试的时候,往往是需要人类提供指导方案的。Cursor 能够做的是让有一定编程基础的用户更加高效地编写代码,让专业的软件工程师更加专注于解决问题本身。简而言之,让零基础的人玩得起来,让有基础的人更加高效。

本文介绍了我如何使用 Cursor 在业余时间独立完成了一个软件系统的原型搭建、后续演化以及最终部署上线的。

阅读更多
再见北京 👋

再见北京 👋

因公司在北京举办的活动需要人员到现场支持,我提前了一个周末来到北京。刚到那天的温度就给了我一个下马威:寒潮过境,最低温度来到了 0 度,而我刚从气温接近 30 度的杭州过来,一时间难以适应。

上午 10 点到达预定的酒店被告知没有空余房间,这也合乎情理,金秋时节的北京是热门的出游目的地,游客众多,用房需求也相应的高。和朋友相约到二里沟地铁站旁边的新疆大厦吃了顿自助,羊肉串、羊腰大快朵颐,酸奶、格瓦斯畅快下肚,好不痛快,就是最后肠胃承受了消化的重负,撑了一下午。

阅读更多
记黑神话悟空云通关☁️

记黑神话悟空云通关☁️

第一印象

游戏科学在 2020 年 8 月放出黑神话悟空第一个实机演示视频以吸引游戏人才,“被迫”开始了对外宣传,到今年 2024 年 8 月 20 日正式发售,经历了四年的时间。这四年里,每年的 8 月 20 日都会释放出新的实机演示视频,赚足了单机游戏玩家的期待,其中自然也包括了我。

我在小学时期玩过很多游戏,各种各样的游戏都爱玩,仙剑奇侠传、波斯王子、英雄无敌、魔兽争霸、鬼泣等,对单机游戏是有足够好感的。中学之后娱乐时间变少后玩游戏的时间就趋近于零了,这个习惯一直延续到了大学毕业。在研究生阶段中期,多多少少受到些黑神话悟空的影响,我又开始断断续续接触了几款动作 RPG 游戏,例如古剑奇谭三、塞尔达传说、只狼、黑魂三、刺客信条·奥德赛等。

从释出的实机演示视频来看,黑悟空与近期接触过的只狼比较相似,战斗系统、画面风格、故事背景(都具有东方特色)等,而只狼是我玩过类似游戏里最喜欢的。黑悟空刺激的战斗系统搭配上西游记的故事背景,进一步拔高了我对黑悟空的期待。

八十一难之第零难:启动游戏

我手头的设备是 MacBook Pro 和 Switch,并且 Switch 长时间吃灰,彻底沦为了有氧拳击启动器。同时因为没有业余时间打游戏的习惯,没有再增配主机,近期只对黑悟空这一款游戏感兴趣,不打算单单为了它添置设备,所以我开始摸索如何在 Mac 上运行黑悟空。

阅读更多
一起来做类型体操吧!😊

一起来做类型体操吧!😊

类型重要吗?

长话短说,类型很重要。

类型的重要性

静态检查

在编程中,类型往往是我们的第一道防线,它可以帮助我们在编译阶段就发现一些潜在的问题,避免一些不必要的错误。在过去,由于 JavaScript 是弱类型、解释型语言,所以在编译阶段无法发现一些类型相关的问题,这就需要我们在运行时进行一些类型检查,这样就会增加一些不必要的开销。而 TypeScript 则是由微软推出的、基于 JavaScript 的强类型语言,它可以在编译阶段就发现一些类型相关的问题,这样就可以避免一些不必要的错误。

当然也不是说用 JavaScript 就一定会出问题,但这要求编程者有更高的责任心和编程能力,能够在编码阶段就提前规避问题,但对于大型项目来说,这是不现实的。不要完全相信任何人的代码,即使是自己的代码。因为人是会犯错的,需要加以约束。在 Web 应用开发过程中,JavaScript 代码如果访问了一个空对象的字段则会导致异常,如果程序有限定错误边界,那么这个错误可能会被忽略,但是如果没有限定错误边界,那么这个错误可能会导致程序崩溃,也就是页面白屏。而使用 TypeScript 配合 IDE 的类型检查、其他静态检查工具,可以在编码、编译和代码合并时就发现并修复这些问题。

类型即文档

另外,用弱类型语言编写的项目一旦涉及到多人协作(甚至是对于现在的自己和过去的自己来说也是如此),就会变得难以维护和协作,因为弱类型语言无法提供足够的信息,所以在多人协作时,很容易出现一些问题。而强类型语言则可以提供足够的信息,帮助我们更好地理解代码,提高代码的可维护性。所以我也认为“类型即文档”。

现在很多语言都有相关工具可以通过类型信息来生成文档,例如 openapi-generator、TypeDoc、JSDoc 等等,通过代码自动生成文档可以帮助开发者省去很多写文档的时间,同时也可以极大程度地提高交流效率。

阅读更多
rFTP - 用 Rust 实现简单的 FTP Server (2)

rFTP - 用 Rust 实现简单的 FTP Server (2)

前情提要

上一篇文章中,我讲述了我为什么选择 Rust 作为学习计算机底层知识的工具,一些 Rust 的基础知识和我当时所遇到的困难。在这篇又是属于目标回收的文章中,我将介绍最近的进展、Rust 开发的体验和下一步的计划。总的来说,用 Rust 写项目体验尚可,通过与编译器博弈而最终通过“考试”后,自己对 Rust 的理解也有了些许提升。

异步编程

在 Rust 中,异步编程是通过 Future 特征和 async/await 语法糖来实现的。Future 是 Rust 中的异步编程的基础,它代表了一个异步计算的结果或者异步任务的“承诺”,可以通过 poll 方法来获取计算的结果。async/await 语法糖则是为了让异步编程更加友好,通过 async 关键字来定义异步函数,通过 await 关键字来等待异步计算的结果。

越来越多的语言采纳异步编程机制,比如 Python 的 asyncio、JavaScript 的 Promise(或者是同样的 async/await)、Golang 的 goroutine 等等。异步编程的优势在于可以提高程序的并发性能,因为异步编程可以让程序在等待 I/O 操作的时候不阻塞,可以继续执行其他任务。Rust 的 Tokio 是一个基于 Future 的异步编程框架,它提供了很多异步编程的工具,比如 tokio::spawntokio::net::TcpStream 等等。

阅读更多
在 Kubernetes 中安全地运行应用

在 Kubernetes 中安全地运行应用

背景

在近期的工作当中我大量接触 Kubernetes 集群以及容器化应用,在完成 Operator 拓展的开发和发布后,有海外用户反映在 OpenShift 平台上运行我们的容器化应用会遇到安全性问题,具体而言是我们的容器化应用默认需要 root 用户运行,而 OpenShift 平台如果不进行专门的设置是不允许容器使用 root 用户的。为了解决该用户的问题我们花费了一些功夫,正好我也想以此为契机进一步了解如何在 Kubernetes 中安全地运行应用。本文将记录我在调研和学习过程中的一些心得体会。

容器安全

Docker Init CLI

Docker Init 命令是用来创建遵循最佳实践的 Docker 配置文件的命令行工具。在使用时通过选择需要运行的应用类型(例如 Go、Python、Node、Rust 等),Docker 会自动帮助用户创建出符合最佳实践的 Dockerfile 和 compose.yaml 文件。

我的操作系统是 macOS, Docker 版本为 25.0.5,后续的版本中支持的应用类型可能会更多。

阅读更多