R·ex / Zeng


音游狗、安全狗、攻城狮、业余设计师、段子手、苦学日语的少年。

分类“开发”下的文章

TypeScript 类型系统与函数式编程

背景接触 TypeScript 已经有一段时间了,这期间写过一些复杂的类型(例如 这篇文章),我开始意识到:TypeScript 的类型系统写起来就像函数式编程一样。去年某天,一个同事给我发了个链接,里面讲的是“TypeScript 类型系统的图灵完备”,里面的一些内容我还在努力理解到可以分享的程度,但一些代码差不多可以说明 TypeScript 类型系统跟函数式编程的思想非常接近了。前期知识掌握 TypeScript 的 基本类型,相信大家都了解;掌握 TypeScript 的 高级类型 和 ...

从前端组件库引出的计算几何问题

是的,又是那个组件库。由于脚手架搭的比较好,大家开发的效率超出了预期。然而总有些不顺利的事情出现,于是就有了这次要说的事情。一个容易解决的问题我们的 <Icon> 组件跟 Ant design 比较类似,底层用的是 SVG,这样可以通过按需引入以减小空间。由于 SVG 是设计师用 Illustrator 画的,里面必定会带有各种无关紧要的信息,因此同事在构建脚本中用 svgo 去掉了几乎所有用不到的数据。然而,我们发现不能去掉 fill 属性(通常 SVG 图标内部不能带有具体颜色的...

TypeScript+Vue 组件库的细节问题

背景为了 第四季度的 KPI(划掉) 配合全组前端项目的 UI/UX 改版,我们需要自己写一套组件库。第一个吃螃蟹的项目是用 Vue 写的,所以我们决定先写一个 Vue 的组件库。因为我刚好比较闲,于是搭脚手架的任务就交给了我。技术选型我个人的观点是:TypeScript(或其它静态类型的语言)是未来的趋势,但 Vue 对 TypeScript 的支持并不是那么好。经过再三查阅文档,我发现 官方文档 提到可以用 ES6 Class 或者传统的 Object。我试了一下:Object 无法优雅的提...

immer.js - 实现不可变数据的新思路

immer.js 介绍因为项目需要,我跟不可变数据打交道也有很长一段时间了。对于不可变数据来说,大家最熟悉的应该就是 immutable-js 了,然而它有这么几个劣势:API 复杂,额外引入了 Map 和 List 类型需要指定一个数组作为路径来 Get 或 Set,失去了 ES6 的语法简洁性失去了 Flow 或 TypeScript 对数据的 Schema 校验直到我前几天偶然在网上看到了一个叫 immer.js 的库,看了几眼文档,瞬间就被它的简洁给吸引住了。先来个简单的例子(摘自官方文...

从 DFS 的角度看 NFA 正则与优化技巧

前言今年七月初 CloudFlare 由于一条正则表达式宕机的事情大家应该都听说过了,究其原因,是因为正则表达式匹配时产生了大量的回溯,从而耗尽了 CPU 资源。具体的技术分析网上都有,这儿就不赘述了。从小到大我都被教育:正则表达式可以高效的匹配字符串,正则会先被转换成 NFA,再被确定化为 DFA(这算法我现在还是能记住的),然后就可以用一个“与输入长度相关的线性时间复杂度”的算法来匹配了。CloudFlare 这件事情让我对正则表达式的效率十分失望,因此我花了一段时间了解了一下正则表达式的引...

为 GORM Logger 添加 Trace ID 的过程和一点思考

起因后端程序的运行时日志,一直是出现线上问题时帮忙调试的有利工具。我现在负责的运营平台,由于是给内部人员用的,而且大多数功能都是数据库的增删改查,于是对于日志就没有打的那么详细。直到有一天出了一次线上事故,我们足足花了三天才找到原因(其中有两天我甚至一直以为跟我们的平台没有关系)。经过那次之后,我彻底明白了日志的重要性,于是开始丰富我们的运行时日志。在这个平台刚搭起来没多久的时候,另一个开发就做了一些基本的工作:写了 Gin 的中间件,可以为每个请求的 Context 添加一个 Request ...

利用 Trie 树的变种优化带参数路由的匹配

背景我目前负责的平台需要做一个转发功能,大概的需求如下:把前端发过来的某些 URL 直接转发到第三方系统;需要在转发过程中添加带有用户和国家信息的 JWT header 以供第三方系统使用;需要在我的平台上为不同 URL 做鉴权,例如 URL a 需要 rule 的读权限,URL b 需要 rate 的写权限;第三方系统的管理员可以在我的平台上自由配置转发规则,例如把 /admin 转发到他们的 /user/admin;URL 需要支持带参数,例如 /admin/:email 可以转发到 /us...

一次对 Chromium 源码分析的经历

问题起因前几天,我们组的 Leader 在准备内部技术分享的 PPT,是关于 Chrome 底层的一些内容。然而在准备的过程中,发现了 Chrome 在某些情况下会重复请求服务器资源。这是明显不合理的设计,因为 Chrome 并不知道每个请求是否符合幂等性,代替开发者自动重新请求可能会导致不可预知的问题,于是 Leader 便开始寻找问题所在。刚好被我看到了,于是便过去帮一下忙(当了一个小时的小黄鸭),最终我们发现了问题所在。回家后,我觉得很有必要完全靠自己把这个问题仔细研究一下,毕竟我看到 L...

对于地址库需求的优化

背景作为一个电商平台,我们需要有一个统一的地址库,对这个库的配置页面,就落到了我负责的运营平台中了。对于这个库来说,大概的几个需求如下:以 Entity 维度来区分,例如 Malaysia 和 Taiwan 的数据是不互通的;每个 Entity 中的数据都是一棵树,一共有四层,分别代表 State、City、District、Street;需要支持如下操作:给定一个点,需要能找到从它到根节点的所有点,例如粤海街道上面是南山区、深圳市、广东省;给定一个点,需要能找到它的所有子孙后代,例如广东省下面...

Go 如何优雅的验证前端请求体

背景从开始写 Go 到现在也过了两个月了。我现在负责的是两个新系统的后端项目,很多功能还没有搭起来,例如对 Request Body 的合法性检验。目前的校验规则都是手动写在业务代码中的,既复杂又不容易扩展。我觉得,在我用过的前端的框架中,Element UI 的验证规则是最优雅的,于是就想在后端也实现这么一套验证规则。调研Element UI 的表单验证使用了 async-validator,随便举几个例子:{ name: [ { required: true, mes...

从排查 Go CAT Client 的错误中学到的

背景一个月前,我们仓库的操作人员感觉系统的响应太慢,点击一个按钮需要等待十几秒才能出结果,于是给我们加了个前端监控的需求,也就是监控 API 的响应时间。我跟同事借用了漫威宇宙中的观察者 Uatu 的名字,给项目的前后端分别命名为 uatu-lib 和 uatu-service。后来项目经过几次修改,已经可以在前端监控 DNS、TCP、响应时间,还有前端的一些未被捕获的报错(包括 Vue 的报错,这里借用了 sentry 的部分代码)。我们公司其实已经用上了一套监控平台,是美团开源的 CAT,于...

由于 gin-cors 而带来的 Bug

我最近在写一个管理系统的后端项目,用的是 Go,使用了 gin 来写服务器。跟前端本地联调的时候一直是没问题的,但直到有一天前后端部署到了 Test 环境开始测试,发现所有的 GET 请求都没问题,但所有的 POST 和 PUT 请求都 403 了。我再三检查了一下 Request Authorizor Middleware,确认了并没问题(不然前端本地访问也不会正常),而且如果确实因为权限问题而 403,是有错误信息的,但现在没有任何信息。于是我连上服务器开始看 Log,发现无论是 gin 的...

这是我们共同度过的

第 3070 天