Follow feeds: blogs, news, RSS and more. An effortless way to read and digest content of your choice.
Get Feederhuoding.com
Get the latest updates from 火丁笔记 directly as they happen.
Follow now 31 followers
Last updated about 3 years ago
about 3 years ago
前些天遇到一个「打包下载」的需求,在调研过程中走了一些弯路,本文记录一下。 比如说某网站有一个文件列表,用户点哪个就可以下载哪个,如果用户想下载多个,无非就是多点几次而已。于是需求来了:当用户想下载多个文件的时候,可以通过一次点击完成打包下载操作。 听起来似乎并不复杂,服务端可以把用户想要下载的文件打包成一个新文件,然后用户点一次就可以下载了,但是这样做有以下几个缺点: 浪费了时间,多了创建新文件的流程。 浪费了空间,同样的文件被多次存储。 用户体验差,下载必须要等到新文件创建好才能开始。 不难得出结论:动态流式下载才是正解,同事提到 tar 可以搞定,于是研究一下: shell> cat test_0.txt...
over 3 years ago
最近我在处理从 pdf 转换到 docx 的时候,总会出现丢字问题,让我一度以为是字体的原因,结果方正、思源、文泉驿换了个遍也没搞定,最终发现是一个 unicode 问题。 我用 javascript 构造了一个测试用例,你可以在 chrome 控制台里运行它:...
over 3 years ago
当医生遇到疑难杂症时,那么可以上 X 光机,有没有病?病在哪里?一照便知!当程序员遇到疑难杂症时,那么多半会查日志,不过日志的位置都是预埋的,可故障的位置却总是随机的,很多时候当我们查到关键的地方时却总是发现没有日志,此时就无能为力了,如果改代码加日志重新发布的话,那么故障往往就不能稳定复现了。回想医生的例子,他们可没有给病人加日志,可为什么他们能找到问题的,因为他们有 X 光机,所以对程序员来说,我们也需要有我们的 X 光机,它就是 eBPF。 为了降低使用 eBPF 的门槛,社区开发了 bcc,bpftrace...
over 3 years ago
最近学习某个 Golang 单元测试的课程,发现其中推荐使用 gomonkey 这种黑科技,让人略感意外,毕竟在软件开发领域,诸如依赖注入之类的概念已经流传了几十年了,本文希望通过一个例子的演化过程,来总结出 Golang 单元测试的最佳实战。 既然是白话,那么我们得想一个通俗易懂的例子,就拿普通人来说吧:活着是为了什么,好好学习,买房,结婚,任意一个环节出现意外,整个人生就会偏离轨道。下面我用 Golang 代码来描述活着的过程,其中好好学习,买房,结婚都可能受到不可控外界因素的影响,比如好好学习遇上教培跑路,买房遇上银行限贷,结婚遇上彩礼涨价。 下面问题来了:请为「Live」编写单元测试,要求覆盖率达到 100%。...
over 3 years ago
最近我用命令行工具来测试 rpc 服务,因为此命令行工具要求输入数据是 json 格式,所以免不了要在 shell 环境构造一些 json 字符串: shell> echo '{"content"...
almost 4 years ago
前几天闲聊的时候,景埕说网上很多 string 和 []byte 的转换都是有问题的,当时并没有在意,转过身没几天我偶然看到字节跳动的一篇文章,其中提到了他们是如何优化 string 和 []byte 转换的,我便问景埕有没有问题,讨论过程中学到了很多,于是便有了这篇总结。 让我们看看问题代码,类似的 string 和...
almost 4 years ago
前几天我在学习内存屏障的时候搜到一篇文章「Golang Memory Model」,其中在介绍 CPU 缓存一致性的时候提到一个例子,带给我一些困惑,本文记录下解惑过程。 既然是在介绍 CPU 缓存一致性的时候举的例子,那么理所应当与此有关,看代码: package main import "time"...
almost 4 years ago
前些天我们聊了 Golang 内存对齐的话题,后来我突然想到另一个问题:为什么会有 atomic.LoadInt32?可能你觉得思维太跳跃了,容我慢慢道来:首先,有 atomic.LoadInt64 很正常,因为对一个 int64 来说,它的大小是 8 个字节,如果是 32 位平台的话(字长...
almost 4 years ago
关于 Golang 内存对齐,昨天已经写了一篇「浅谈Golang内存对齐」,可惜对一些细节问题的讨论语焉不详,于是便有了今天这篇「再谈Golang内存对齐」。 让我们回想一下 groupcache 和 sync.WaitGroup 中的做法,为了规避在 32 位环境下 atomic 操作...
almost 4 years ago
如果你在 golang spec 里以「alignment」为关键字搜索的话,那么会发现与此相关的内容并不多,只是在结尾介绍 unsafe 包的时候提了一下,不过别忘了字儿越少事儿越大: Computer architectures may require memory addresses...
almost 4 years ago
在中国,有一个简单的方法可以用来判断一个互联网公司够不够大,那就是看其是否开源过 rpc 框架!比如阿里巴巴的 dubbo,或者腾讯的 tars,小公司往往会对这些大公司的产品趋之若鹜,不过一个可悲的现实是大公司自己往往并不用他们开源的版本,这就好比皇帝总是把自己看不上眼的女人赏赐给臣民,不过能得到皇帝的赏赐总是好事,下面让我手把手教你用 tars,更具体的说是 tarsgo,也就是 tars 的 golang 实现。 实际动手前,最好熟读官方文档,特别是基础概念和基础通讯协议部分,假设你已经了解了这些内容,那么不妨让我们虚拟一个例子:给商城里的用户加积分!然后我们要构建一个...
almost 4 years ago
话说前几天我遇到了一个死锁问题,当时想了一些办法糊弄过去了,不过并没有搞明白问题的细节,周末想起来便继续研究了一下,最终便有了这篇文章。 让我们搞一段简单的代码来重现一下当时我遇到的问题: package main import "sync" func main() { var wg sync.WaitGroup...