最近的几个小工程

2022 年 07 月 10 日

离职在家,最大的好处就是有了足够的空闲时间。不做点什么的话,真对不起自己。于是我做了几个自己需要的小工程。

一个简单的http服务器

首先是serva,一个简单的http服务器。说实话,这个题目都做滥了,随便哪种语言,找个web框架库,几行代码就可以撸一个。但市面上的现成的工具里面,很难同时满足我的几个需求:

  • 简单+方便安装:我觉得这玩意就应该是一个命令行应用,单个执行文件,拷贝过来,一条命令运行起来就好。
  • 跨平台:windows/linux我都在用,而且家里x86-64/arm设备都有,需要随便哪个平台都能跑。
  • 带上传功能:多数http server都只实现了文件下载,实现上传功能的不太多。服务端文件管理就更不指望了。
  • 现代界面:绝大部分都是传统的apache directory list风格,看起来单调且不一定适配移动端。
  • 开源易改:用我习惯的语言实现,这样想要什么功能都可以自行扩展。

用过了一圈,本来我觉得gossa挺适合的,除了go语言我不熟这一条,别的应该都还可以。结果上次在家里传一个大文件,windows上的gossa服务疑似没有阻止系统休眠,导致文件没传完就失败了。所以才起了自己做一个的心思。

具体来说,我的需求是通过下面几点实现的:

  • 前后端分离,使用grpc通信,方便接口修改和扩展。
  • 后端用rust语言,rust-embed将前端嵌入可执行文件,tonic实现grpc服务,axum提供web服务,两个服务通过hyper整合在同一个端口;模块做了区分,方便添加功能。
  • 前端用react+typescript,使用devextreme的filemanager控件,各种功能整合起来比较方便。

很多问题在具体实现的时候才会发现,比如多文件下载会被浏览器block这件事。所以一开始的一些想法要不断地改变,现在实现了以下几个简单feature:

  • 上传+下载+服务端文件夹管理,服务端可以控制permission。
  • serve mode,也就是传统的httpd服务,即返回目录中的文件本身,而非返回前端webapp来操作目录中的文件。
  • cors选项,可以让后端跟其他前端协同工作,方便调试。

后续可能还会加一些功能,比如直接在浏览器里播放流媒体之类,不过这些需求还不强烈,而且浏览器限制也蛮多的。反正前后端都好改,有什么需求急需时再加吧。

一个代理/镜像切换工具

然后就是这个lane。说实话,上家公司最让人满意的就是网络,无需操心网络配置,npm/cargo等各类开发工具畅快直连,省心省力。离职了就必须自己面对这些烦心事。虽然手上有服务器,但客户端总还是得自己配不是?这个小工具就是用来干这个的。现在支持了以下几个app:

  • curl的proxy
  • git的proxy
  • cargo的proxy和mirror,mirror支持tuna和ustc
  • npm的mirror,支持taobao和huawei

以后需要哪个加哪个,最近可能把wget加进去。

说起来也发现不少有意思的坑,比如cargo的publish功能,因为必须要发布到crates.io,所以如果开了mirror就会失败。因此,publish之前需要先关掉mirror并开启proxy,开发时需要反过来,开mirror并关掉proxy,实在是折腾。另外wsl2的host ip地址经常改变,因此curl切换代理也比较频繁。所以这个小工具对我自己来说还蛮有用的。

网站重构

最后就是网站重构了。其实我的需求很简单,就是基于JAMStack做一个自己看着顺眼的网站,整理自己写的blog和技术文档。但就是“看着顺眼”这四个字,太难了。所以我去看了很长时间设计相关的知识,但真正做起来的时候,还是觉得手足无措。我甚至都起了去学photoshop的心思,不过这几天我终于想通了,毕竟我的主要目的还是整理知识库,再努力我也很难在短时间内成为设计师,所以还是找专业的实现比较好。

碰巧,这几天看到了doks主题,但这是hugo用的,而我用的是zola。虽然也有zola用的adidoks主题,但前者一直在保持更新,而且我也不想看两套源码。因此我花了点时间,一边看doks的源码,一边移植和修改。现在基本功能做的差不多了,今天做了search,差不多可以出来见人了。


总之一句话,虽然不上班没有钱拿很不爽,但能天马行空的随便做些事情这点,还是挺有意思的。

Top