grzhan 最近的时间轴更新
grzhan
ONLINE

grzhan

V2EX 第 76375 号会员,加入于 2014-10-09 11:15:58 +08:00
今日活跃度排名 8722
grzhan 最近回复了
@qiuhang 其实我也猜测是这样,团队里没有专业一些的工程师。
但类似的专业度不足的问题过去几年已经出现过好几次了( helang 、掰天线……),公司应该是盈利的,他的人脉哪怕只是找个顾问把个关应该也不难(不找其他 up 主,找个大厂上班的老同学或者学长之类也成吧),到现在还没解决这个问题只能说 emmm……
主要还是营销技术宅人设带来的反噬。

何的早期视频看出来属于是一个有自己创意的数码爱好者(果粉?)。但应该是 5G 视频之后为了接住这泼天的流量,何开始往“技术宅”人设开始转型,然而问题在于和手工耿、稚晖君不同,他自身的专业水平是不足以支撑这个人设的。

如果何同学团队具有一般软件工程师的专业知识储备,就会知道:
1. ascii generator 本身很简单,就算是自己写的也没啥了不起的,没必要抄别人的项目
2. 如果基于别人的开源项目实现也 OK ,但要遵循别人项目的开源协议,哪怕是非常宽松的 MIT
3. 哪怕再恶劣些,我抄了别人的项目说是我做的,但只要我视频里没有证据也不会有什么舆情,因为还是那句话 ascii generator 很简单,自己会写也不奇怪。

最烂的情况就是现在:我拿了别人项目声明是自己写的,然后把证据放到视频里还不自知。

之前看过何同学关于自己在互联网舆情的访谈,我觉得多少是可以理解的,但我也确实没想到 2024 年快结束了他们团队还会犯这种基础的专业性错误,确实有点自业自得了。
draveness 大佬的《 Go 语言设计与实现》我之前一直看: https://draveness.me/golang/
他应该就是先写系列文章( gitbook ),在收获比较高的访问量与关注度之后,出版了实体书。
我觉得是个路子,然后像 draveness 会画很多配图(确定好配色后用 sketch 画),对于这种源码分析读物的可读性提升了很多,但也更费功夫。
供参考。
10 天前
回复了 xoxo419 创建的主题 程序员 你见过哪些好玩又花里胡哨的代码呢
Golang 标准库 sys.TrailingZeros64
通过 deBruijn 序列快速计算一个 64 位二进制末尾有多少个 0:

var deBruijn64tab = [64]byte{
0, 1, 56, 2, 57, 49, 28, 3, 61, 58, 42, 50, 38, 29, 17, 4,
62, 47, 59, 36, 45, 43, 51, 22, 53, 39, 33, 30, 24, 18, 12, 5,
63, 55, 48, 27, 60, 41, 37, 16, 46, 35, 44, 21, 52, 32, 23, 11,
54, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6,
}

const deBruijn64 = 0x03f79d71b4ca8b09

// TrailingZeros64 returns the number of trailing zero bits in x; the result is 64 for x == 0.
func TrailingZeros64(x uint64) int {
if x == 0 {
return 64
}
// If popcount is fast, replace code below with return popcount(^x & (x - 1)).
//
// x & -x leaves only the right-most bit set in the word. Let k be the
// index of that bit. Since only a single bit is set, the value is two
// to the power of k. Multiplying by a power of two is equivalent to
// left shifting, in this case by k bits. The de Bruijn (64 bit) constant
// is such that all six bit, consecutive substrings are distinct.
// Therefore, if we have a left shifted version of this constant we can
// find by how many bits it was shifted by looking at which six bit
// substring ended up at the top of the word.
// (Knuth, volume 4, section 7.3.1)
return int(deBruijn64tab[(x&-x)*deBruijn64>>(64-6)])
}


-------

1. (x & -x) 会把 x 除了最低位以外的 1 都清 0
2. deBrujin64 是一个德布鲁因数,它有个重要性质:它相当于一个循环的德布鲁因序列,每个长度为 6 的二进制子串在里面恰好出现一次,也就是说这个德布鲁因数包含所有的 6 位二进制数,且通过不同次数的位移可以恰好得到。
3. x 若有 k 个 0 , 那么 (x & -x) * deBrujin64 就相当于 deBrujin64 << k ,注意左移是会回绕的,因此 (deBrujin64 << k) >> 58 可以恰好得到 k 在 deBrujin64 中对应的六位唯一二进制子序列
4. deBrujin64tab 就是 k 与对应六位二进制子序列(数)的映射,因此可以快速找到对应的 k ,也就是末尾多少个 0

据说该方法来自 Knuth 的 The Art of Computer Programming 7.3.1 ,回头找一下再学习下。

sys.TrailingZeros64 的性能在很多 Go 运行时场景都至关重要,Golang 有很多 free-list allocator ,比如 mspan 就会用 allocCache bitmap 位图来快速定位可以分配的 free object ,所以计算这个 bitmap 末尾有多少个 0 ,就能快速找到可以被重复利用分配的 free object
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4995 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 18ms · UTC 09:39 · PVG 17:39 · LAX 01:39 · JFK 04:39
Developed with CodeLauncher
♥ Do have faith in what you're doing.