打勾圆圈图示

为什么需要双重因子验证(2FA)?

随着越来越多的软体推广与强制双重因子验证 2FA,我的手机也装上了 Google Authenticator,但老实说,很长一段时间我只知道「打开 App → 输入六位数字」,对于这组数字为什么会一直变、伺服器又是怎么验证的,其实没有真正了解过。直到最近在测试一些相关登入逻辑才回来补齐这块知识。

时间符号

程序中时间是如何计算与存储的?

我一直对程式中日期存在个模糊不可靠的概念,通常依靠方便的库像是:dayjs 去处理日期转换,但底层的原理至今仍不是很清楚,只知道时间是相对的,且存储方式可能是某种标准格式,这篇文章将尽可能补全程式处理时间所需要的知识。关于时区的规则与电脑运算存储时间的概念。

板手图示

Go 字符串处理使用 Rune

当在 Go 字串中索引位置 `n` 时,为什么没有得到第 `n` 个字元?相较于其他程式语言一串文字在遍历时会预期拿到单一个字符,在 Go 会拿到「Rune」;如果直接透过索引取得 string 内容会拿到 byte。透过实际解 Codewars 题目了解处理字串要留意的东西

人和钥匙符号

对称加密与非对称加密

「对称加密」就是通讯双方进行加密与解密使用相同的金耀,但除了双方都要保守金钥外,怎么让双方都持有相同的金钥本身就是个问题,存在被劫持的风险(中间人攻击)。 「非对称加密」透过一对金钥(Key Pair),也就是公钥与私钥来解决对称加密会遇到的问题。

阵列符号

Go Slice vs Array 差異與底層原理

在 Go 语言中,有两种常见的资料结构可用于表示「序列资料」:Array 与 Slice。这两者在语法上相似,但背后行为与使用情境差异非常关键。简单来说,Array 是固定长度(Static Array),而 Slice 是动态长度(Dynamic Array)。

文件符號

GitLab Mirror 3 分钟轻松迁移与同步 Git Repo

近期工作上计划将 GitLab 迁移到 GitHub,但光是腾出时间进行专案迁移就感觉很麻烦,也因此很多计画被耽搁着,像是建构 CI 自动化测试环境、导入 AI 代码审核。幸好 GitLab 很早就有一项功能叫做 Mirroring。

容器装载惊叹号符号

速通了解 TypeScript 泛型

对于 TypeScript 的泛型我一直有种恐惧,什么满满的 `<T>`、`<U>`、`extends`、多层嵌套,看起来就很可怕。毕竟在日常开发里,好像也不太需要……对吧?的确解决小问题如此,但在特定问题下泛型将会非常必要。

打勾圆框符号

前端自动化测试会遇上的坑

前端 UI 一直是多变且复杂的题材,经历各种工具迭代与起伏,有很长一段时间其实并没有什么特别统一良好的方式进行测试。在经历过太多次的跌宕变化过后,纪录我认为现阶段怎么打造可被验证的前端与未来趋势与过程中实际遇到的各种困难。

形状转换符号

实际简单的 Monad 解释

Functor 的好处是:它让我们能用同样的方式操作不同的「容器型别」,想像成一个「装值的盒子」,它允许我们对盒子里的值进行运算,但同时又保留了盒子的结构。 Functor 「提供了方式在容器里操作值」,遵循同一性(Identity)与合成性(Composition)。

形状转换符号

实际简洁的 Applicative Functor 解释

从先前 Functor 的概念出发,Functor 的 `map` 只能作用在数值上,而不能是「存在于容器中的数值」上,所以才需要 Applicative Functor,一种比 Functor 更多功能的结构,除了满足 Functor 的功能外还能「让盒子里的函数作用(apply)到另一盒子的值」。