etcd 是分布式系统中的一个重要基础中间件,为 K8s 等关键基础设施提供了底层的 KV 储存能力。摘自 Github 描述:

Distributed reliable key-value store for the most critical data of a distributed system.

由于业务需要,我项目中使用了 etcd 官方客户端 clientv3 及其源码仓库中提供的队列实现(当时的版本为 3.5.11),并意外地发现了一系列问题,故事从这里开始。

阅读全文 »

pprof 是 Google 开发的一款用于数据分析和可视化的工具。

最近我编写的 go 程序遇到了一次线上 OOM,于是趁机学习了一下 Go 程序的性能问题排查相关知识。其基本路线是:先通过内置的 net/http/pprof 模块生成采集数据,然后在使用 pprof 命令行读取并分析。Go 语言目前已经内置了该工具。

本文不会介绍 pprof 的太多细节,只关注主要流程(主要的是太细的我现在也不会)。

阅读全文 »

5 月份休完陪产假,再回到公司,发现原本的小组已经整体重组,只有我一人还在工位上了。后来跟 TL 聊了一下,最后反正就是几个选项,要么跟着原来的同事一起去新的部门继续写前端,要么就做点别的事情。

当时我还是挺头疼的,主要是那会事情太多了,一是小满还在月子里,二是新房子还在装修,三是那段时间身体状态有一点波动(其实主要可能还是因为这个)。继续搞前端肯定是最稳的,但是我自己其实已经有点厌倦了,属于是看到前端代码就已经有点不耐烦的程度。但是对前端以外的东西又还是很感兴趣,偶尔自己写点非前端的玩意都会感到很愉快。犹豫再三,也是跟朋友家人都聊了一下,最后选择了转成服务端开发。(其实当时还有一个可能是 C++ 客户端的方向,但是因为太过陌生,加上前面说的那些现实情况,实在是有点绷不住)

其实我在刚毕业那会做过一段时间(半年左右?)的 Java 开发,但是那段时间基本上来说还是处于比较懵的状态,也没学到什么东西,加上后来很快就转型(基本上)全职前端,Java 服务端就荒废了。现在也算是一个从头来过。

到现在 7 月份,大概算下来时间过去一个多月了,也简单说下转型后的感想。

阅读全文 »

我和静纯的孩子在 2023 年 5 月 22 日出生,当天并不是小满,而是小满的次日。然而犹豫再三,最后我们还是给孩子取名为“小满”。

“小满”的含义,在于小满,而非大满,满而未盈。我们本打算如果孩子能在小满当日出生就叫他“小满”,却偏偏差了一日。但是转念想想,这一点点偏差,不是刚好对应上了“小满”的内在涵义吗?再者,虽然小满不是在当天出生的,但是妈妈却是在小满那天进的产房,生产过程除了手术室,我基本是全程陪着妈妈,这多少也能代表我们的一点回忆。

另外,除了这个结果以外,生孩子的过程也出现了偏差。但好在最后的结果是好的。孩子目前为止很健康,妈妈也恢复得很好,这样就足够了。这就是我这个小家庭的“小满”。

阅读全文 »

b 站上的歌姬,很多歌只发布在 b 站。比如说直播时唱的歌,或者一些发布到正经音乐平台上会有版权问题的歌。然而,对于爱听歌的人来说,b 站的听歌体验实在是太差了,这里就不展开细说。

我习惯用网易云听歌。网易云虽然版权方面很惨,但有它一个很好用的功能:云盘。每个用户有 60G 的云盘容量,基本用不完,不管是什么歌,有没有版权,只要上传上去了就能随时随地听。因此,我的目标是,希望可以有一个自动化的工具,帮我把 b 站上的歌以 mp3 的格式下载下来,让我可以上传到云盘,这样我就可以用网易云听歌了。

综上所述,我就做了这么一个小工具:bv2mp3 ,这是一个开源工具,完整的代码可以在代码仓库中找到。下面,我主要讲一下这个工具的实现思路以及优化过程。

126f0ee04db59831d6a9820ac89c471.jpg

阅读全文 »

今天想要打包一个 Docker 镜像,里面只包含一些静态的前端文件。为了使体积足够小,想到的方案是把命令全部集中在一个 RUN 上,类似这样:

FROM node

WORKDIR /usr/src/app
COPY . .

RUN yarn --frozen-lockfile --check-files --ignore-engines && \
yarn build && \
rm -rf node_modules

但是打包出来的镜像,死活都是 2.2G,node 镜像自身 900MB,静态文件总共才 10MB+,run container 进去查看 node_modules 也确实删掉了,百思不得其解。一度以为是 Docker 出了 bug,遂升级 Docker,但仍不能解决。

折腾了一下午后,尝试去掉 rm -rf node_modules,观察到打出来的镜像 2.8G,突然觉得是不是还有什么东西没删干净,然后很快就想到了 yarn 的缓存。添加 yarn cache clean 后,打出来的镜像来到 910MB。世界终于清净了。

Vue3 与 Vue2 的最大不同点之一是响应式的实现方式。众所周知,Vue2 使用的是 Object.defineProperty,为每个对象设置 getter 与 setter,从而达到监听数据变化的目的。然而这种方式存在诸多限制,如对数组的支持不完善,无法监听到对象上的新增属性等。因此 Vue3 通过 Proxy API 对响应式系统进行了重写,并将这部分代码封装在了 @vue/reactivity 包中。

本文将参照 Vue3 的设计,从零开始实现一套响应式系统。注意本文引用的代码与实际的 Vue3 实现方式有所出入,Vue3 需要更多地考虑高效与兼容各种边界情况,但此处以易懂为主。 文中提到的大部分代码可以在 https://github.com/wxsms/learning-vue 找到。

阅读全文 »

很久没更新了,最近有点懒。也没什么想写的。

在新公司(金山办公)上班一年了,工作量并不大,但是干得感觉比之前更累了。主要可能有两个原因:一是之前的负责人在我入职不久后就走了,结果我又变成了负责人(离开西山居的原因之一就是不想做不责人)。二是,做的项目比较偏探索向,不是常规的业务项目,整天要思考这个那个,很累。有时候(经常)也会想放弃。不过看在去年刚来半年就给我 3.75 的份上,还是再干一段时间吧。

最近理财跌得不要不要的,3 个月已经把之前 3 年的收益都跌完了。好在我买的不是很多。现在也不怎么看了。

可能是因为理财亏得太多了,我开始到各种平台薅羊毛,然后又开始把梦幻西游捡起来玩了。家产全部变卖以后转到了朋友所在的区,每天就当作一个打发时间的消遣,分散一下亏钱的注意力。

昨天正式受邀(实际上是我申请的)进入了 vuejs 组织。虽然目前只是 doc team,但是我相信以后可以做更多的事情。

638f7ff6d334b2d7616039a3787efe6.png

在没有包管理器之前

正确来说 Node.js 是不存在没有包管理器的时期的。从 A brief history of Node.js 里面可以看到,当 2009 年 Node.js 问世的时候 NPM 的雏形也发布了。当然因为 Node.js 跟前端绑得很死,这里主要谈一谈前端在没有包管理器的时期是怎样的。

那时候做得最多的事情就是:

  1. 网上寻找各软件的官网,比如 jQuery;
  2. 找到下载地址,下载 zip 包;
  3. 解压,放到项目中一个叫 libs 的目录中;
  4. 想更方便的话,直接将 CDN 链接粘贴到 HTML 中。

四个字总结:刀耕火种。 模块化管理?版本号管理?依赖升级?不存在的。当然,那时候前端也没有那么复杂,这种模式勉强来说也不是不能用。

阅读全文 »
0%