2022 年度概览

不知不觉 2022 年就要过去。我换了新的工作,算是今天最大的变化。之后去完了一下 Web3 的游戏项目,赶上了崩盘的末班车。疫情风云变幻,最后一个月我也没逃过阳了的宿命。

白山云

2022 年的 4 月份离开了工作 5 年的白山云。理由很多,最直接的就是呆久了做烦了。而且,经过这么多年混公司,也越累越觉得没啥意思。绩效啊工作内容啊工作气氛啊,都已经发生了很大的变化。心境变了就不想好好工作,那还是离职吧。

比较感慨的是,有同事因为房贷孩子的问题,没办法像我潇洒的离开。顿时觉得那样的生活的压力不是我要的生活。如今的工作的压力,不是我要的生活。

离开公司后,我一直在 Gap 休息。即使有朋友的公司的 offer,有推荐的位置。我也是提不起动力去看看,或者说启动新的工作生涯。这段时间,自己去园博苑、天竺山、仙岳山,各种厦门的自然公园走了走。纯粹的放松心情,去看看各种东西。一直休息到了 7 月份。

使用 wit-bindgen 和 wasmtime 开发 WebAssembly 应用

wit-bindgen 是通过 wit 生成 wasm 绑定函数的库。wit 是 wasm 的类型抽象描述文件,替换原来的 witxwat 格式。wit-bindgen 生成的绑定函数,可以直接在 Rust 代码中调用,不需要手动编写 wasm 代码。

wasmtime 是一个 wasm runtime,可以直接运行 wasm 文件,也可以通过 wasmtime 的 API 在 Rust 代码中调用 wasm 函数。wasm 在 serverless runtime 中的应用,可以通过 wasmtime 来运行能够处理 HTTP 请求的 wasm 文件的。这里以处理 HTTP 请求的能力为例,介绍如何使用 wit-bindgenwasmtime 开发 WebAssembly 应用。

定义 wit 接口并生成代码

首先,我们需要定义一个 wit 接口文件 leaf-http.wit,用于描述 wasm 文件的能力。这里我们定义一个处理 HTTP 请求的接口,接口定义如下:

interface exports {
    // status code
    type status = u16
    // headers as key value pairs
    type headers = list<tuple<string, string>>
    // request uri
    type uri = string
    // body as bytes
    type body = list<u8>
    // request method
    type method = string
    // request object
    record request{
        method: method,
        uri: uri,
        headers: headers,
        body: option<body>,
    }
    // response object
    record response{
        status: status,
        headers: headers,
        body: option<body>,
    }
    // handle request function
    handle-request: func(req: request) -> response
}

// exports the interface
world leaf-http {
  default export exports
}

这里定义了一个 handle-request 函数,接收一个 request 对象,返回一个 response 对象。request 对象包含了请求的方法、uri、headers、body 等信息。response 对象包含了响应的状态码、headers、body 等信息。export 的接口名为 leaf-http

这里使用 wit_bindgen_gen_guest_rust 生成 rust 代码,生成的代码如下 https://github.com/fuxiaohei/leaf-wasm/blob/0f62fc90ae044edd7861053e1373cdb9dd76bf4d/wit/leaf-http.rs。使用代码生成而不是宏,为了更直观的看到需要编译为 rust 的 wasm 文件的内容。

如果使用宏的姿势,可以参考:

wit_bindgen_guest_rust::generate!("leaf-http.wit");

学习 Rust,找新工作

我在前公司主要使用的技术栈是 Go。Go 语言本身语法简单,既有动态语言的一些特性,又有很高的运行效率,同时拥有很好的并发运行能力的支持。Go 语言本身【大道至简】到丑陋,不过正是因此,反而统一了编码风格,对于团队协作而言非常有意义。而且 Go 直接输出可执行文件,工程部署上简单很多,也是公司很多团队都会用的原因。

Go 本身也有很多问题:乱用 interface、缺乏泛型、goroutine 调度、半吊子的面向对象、不完善的依赖管理(go mod 以后好多了)等。

后来写 serverless runtime 的时候,基于 V8 ,又写了一段时间 C++,欲仙欲死。因为不是原生开发,是基于 V8 的 API。对我这种不甚熟悉 C++ 的同学,搞出来一大堆奇奇怪怪的姿势,感叹确实 C++ 很强大很厉害,又担心过个把月我也看不懂我写的啥了。

离职后,本来是用 Go 在重写小站用的静态生成器(当初版本还是 GOPATH 时代,还没 go mod)。后来觉得,玩自己熟练的东西没意思,就想试一试 Rust。最早调研 serverless runtime 的时候就看到 Deno 使用的是 Rust v8 bindings —— rusty_v8。很多 wasm 的 runtime 也是用 Rust 写的,比如 WasmEdgeWasmer。当时调研认为 wasm 是边缘函数计算很有可能的未来。基于这些考虑,学习一下 Rust 好了。

五一周边游

因为疫情,五一放假,也只能去周边的地方走走。没有买车,也没有驾照。之前周边的景区都参考看公共交通能不能比较方便。但是,不知道他从哪里看到翔安香山公园这个景区。查了地铁公交,都非常麻烦,最好滴滴。无所谓啦,反正他想去,我就悉听尊便随君一游。4 月 30 日就出发了。

之后 5 月 1 日和 2 日都是下雨,只能宅家。5 月 3 日又去了东坪山里的滚蛋谷。我以为是个山谷石路或者步行栈道之类的,没想到是真的爬野山,累个半死。

写在新的开始

2014 年,fuxiaohei.me 就已经建立起来了。那时候,Go 是我正在学习的一门语言。PuGo 最早的版本是随着学习的过程写出来的,用于建立的简单的博客。这么项目现在还有 300+ 个 Star,也算有一点点的成长。

断断续续的开始经营,留下一些 日志文章。也经历从大学就读的西安工作两年后,来到南方厦门开始新的生活。

2017 年春节结束,我加入了 白山云科技。工作逐渐忙碌起来,站点就慢慢荒废,一中断就是 5 年。

2022 年 4 月,我离职了。在白山云呆了 5 年又 1 个月。一个地方待的太久,也是时候换个新的环境,尝试很多新的事情。另外也已经 30+ 了,再不看看新的世界,就没有机会了。

在家宅了半个月,重新捡回 PuGo,基于最新的 Go 重构了一遍。同时也学习了一下 tailwindcss,了解一些新的前端相关的技术。

休息到 5 月份,劳动节假期后,我再重新找工作吧。

Hello World

If you see this article, you have installed it successfully. Thank you for using PuGo. I hope you can use it happily.

1 / 1