codedump的电报频道
4.53K subscribers
152 photos
4 videos
2 files
633 links
发布个人博客(主页 codedump.info)、想法、推荐等。RSS订阅地址:https://rsshub.app/telegram/channel/codedump_notes,过往汇总搜索可以到:https://app.shokichan.com/c/tg/codedump_notes。
Download Telegram
#杂
我看了某司号称很多重构的大版本,里面存元数据的模块用的btree实现,遗憾的是这里页面恢复用的journal机制,这个机制像sqlite这样的数据库都是最早使用的,属于20年前的技术了,后面都换成了WAL机制做页面备份恢复。

我不知道是去哪里找(或抄)的这个思路,但是这样做的效率不会高,而且涉及文件格式的东西,一旦确定后面就很难改了😇😇

关于journal和WAL这两种机制在sqlite中实现的分析,可以参考我博客的系列文章:
sqlite3.36版本 btree实现系列文章》
👍9
#杂
看到的一首据称是外卖骑手的王计兵写的现代诗《赶时间的人》,这也算是这个时代一个群体的众生相了:


从空气里赶出风 从风里赶出刀子

从骨头里赶出火 从火里赶出水

赶时间的人没有四季 只有一站和下一站

世界是一个地名 王庄村也是

每天我都能遇到 一个个飞奔的外卖员

用双脚锤击大地 在这个人间不断地淬火

(原始出处未知)
👍4
#工具
日常需要在各种应用里面切换输入法,比如到了写代码相关的应用(终端、vscode等)大概率希望是英文输入法,但是到了需要输入中文的应用(IM、文档工具等)就大概率希望是中文输入法,来回切换输入法是个很细碎的事情。

keyboardholder 这个应用能自定义不同应用的输入法规则,解决这些问题。
👍2
#设计模式
看到推友关于设计模式的一句话:“设计模式的本质是为了弥补语言抽象能力不足产生的东西。比如 visitor 模式也就 OOP 在用,支持点 pattern matching / lambda 的 FP 向语言基本不用。”

我是比较同意这个说法的,写多了Rust之类的非OOP语言,确实没怎么感觉设计模式的存在,因为非OOP类语言自有自己的一套解决这类问题的方案。

不过,这并不意味着设计模式就一点都不值得学习,某种程度上我认为设计模式教会了我:在哪些地方,常用哪些招式来封装变化,每个招式都有哪些优缺点,等等。“封装变化”以使项目更好得适应变化、高内聚低耦合等等,就与具体的语言无关了,是软件设计都必须面对的问题。而至于当时初学时为了设计模式而用设计模式导致的过度封装,又是另外一回事了。

https://twitter.com/the_foreverbell/status/1553780395778654208
👍17
#文章

《【老万】谷歌新语言 Carbon 能干翻 C++ 吗?》

乍一看题目,是那种标题党文章,但是作者之前在Google(按文章的说法参与了gtest、gmock等google开源的C++项目开发)与Carbon作者有过共事和近距离接触,姑且当靠谱些的技术八卦看吧。
👍12
#Rust

Rust里面的宏有点难度,以至于要单独拿出来写一份专门的教程了:
The Little Book of Rust Macros
9👍3
#技术推
这条推下面的讨论太好玩了:

“职业生涯见过的最脑洞大开的代码是在10多年前的一个C++网络游戏项目。
大致情况是在服务端new一结构体,设置好相关字段后把指针放在消息包里传给客户端。
刚毕业的我直接被惊掉下巴:指针是服务器的内存地址,发到客户端怎么能用呢?而且指针也没留副本,那个结构体不会内存泄漏吗?
👇评论区揭晓答案”

( 原推链接:https://twitter.com/disksing/status/1555444153588543488

其中提到了 TensorFlow的一个优化,做法如截图,可以说是大开眼界了。

《案例分享 | TensorFlow 大规模稀疏模型异步训练的分布式优化》
👍9
#博客
《周刊(第23期):图解Blink-Tree:B+Tree的一种并发优化结构和算法》

引言:《Efficient Locking for Concurrent Operations on B-Trees 》论文中提出了一种称为“Blink-Tree”的数据结构,这个数据结构提供了B+Tree并发访问的一些优化方式,本文对这篇论文进行解读。

公众号:https://mp.weixin.qq.com/s/Yb6OcCoM_Hhc4U8ESTYVbg
博客:https://www.codedump.info/post/20220807-weekly-23/
邮件订阅:https://www.getrevue.co/profile/lichuang
👍4
#文章
早上起来,翻知乎读到姚勇的一篇文章:

《软件技术人员的瓶颈,35岁之后做准备》

很同意里面的一句话:“我发现对一个程序员最大的阻碍,就是一种对解决问题极限难度的感受。 他决定了你最差的情况。或者收入。这个很有可能和性格有关。半天生。”

这个素质天生与否不好说,但是同意前半句面对难题的态度决定了这个人在技术方向上的走向。

BTW:姚勇是前水木清华成员,作家王小波的侄子,主业现在应该是游戏公司的老板,可以看看百度百科对他的介绍
👍22😁1
#书单

Rust打造的KV库 sled 作者的 推荐书单,不得不说里面好些书都没听过,即便听过也没有读过,其中很多主题是关于调试、软件检测的,马克一下。
👍6
#文章
上周有感而发写了一条推

“人际交往里,“兼容”别人最好的人,可能是最被忽视感受的那个人。

软件也是一样,越能容忍用户输入、需求的,最后虽然用户面更广,但是要处理的各种边界条件也更多,而且口子一开难以收敛。

有时候大胆说个“不”明确一下边界,不见得就不好。”

下面的回复里有人推了这两篇文章:

《复杂度是不灭的,只会转移,难道一切都是徒劳的吗?》
《架构设计-复杂度是不灭的》
👍7
Forwarded from Rust 视界
【趣文】用 Rust 收获 HATETRIS 的世界纪录

世界上有一款俄罗斯游戏的变体,叫做 [Hatetris](https://qntm.org/files/hatetris/hatetris.html) (“可恶的俄罗斯方块”,亲自去玩一下就知道这个版本的俄罗斯方块有多么令人抓狂,我最多消了三行。。),号称世界上最难的俄罗斯游戏,是由程序员和科幻作家Sam Hughes于 2010 年编写的俄罗斯方块版本。曾经的世界纪录也只能做到消去32行(32分),然后在去年被一个日本选手 knowjade 推到了66 分。 现在这个分数已经被(痴迷于一个问题并付诸实践且刚学了几天 Rust)的两个开发者给推到了 86 分高分。

该团队最初选择了三门语言来实现:Mathematica、python 和 Rust。

Mathematica 平均每场比赛耗时 4.3 秒,Rust 平均每场比赛耗时 0.035 秒。这是一个如此大的差异,所以该团队认为与 Rust 的借用检查器进行谈判的所有麻烦和斗争都是值得的。

他们尝试的实现:
- MCTS(蒙特卡洛树搜索)是游戏模拟中的一条行之有效的路径。核心理念是将游戏中的每一步都变成树状结构,然后探索树。然后他们从树搜索重构为 DAG 搜索,产生了可喜的结果。(MCTS 中的“Graph vs Tree”实际上是这个专业圈子里有争议的,并有相关论文)
- 他们尝试 rust + pytorch-c绑定制作了AlphaHATETRIS,但是失败了
- 实现了一个模拟器,然后受 knowjade 写的相关文章启发,使用了 heuristic beam search (启发式光束搜索,https://gist.github.com/knewjade/586c9d82bd53f13afa8bcb7a65f8bd5a),但是他们得到的分数是 53 分,而不是 knowjade 的66分。
- 从图论中得到启发,结合 heuristic beam search ,经过优化参数, 奢侈地使用了 aws 上的一个实例,然后花了56 个小时得到了 86分。一共花费140美元。

收获的教训:

- 学会了使用火焰图分析程序性能:字符串格式化代码占用总运行时间 17% ; 避免循环嵌套;使用 clone() 解决借用问题,但并没有花费什么时间成本,因为编译器将它们优化掉了。
- 切换数据结构。他们需要一个读取速度和插入速度都比较平衡的数据结构,所以从 Vec(读O(1), 写O(n)) 换成了 BTreeSet (读写都是O(log(n)))。
- 再多的优化代码都不会消除对机器学习硬件的荒谬需求。不管你的模拟器有多好,你玩游戏的速度有多快……大量的训练数据和所需的训练时间使得尝试解决消费硬件上的复杂问题变得非常具有挑战性。

这篇文章涉及很多算法细节,感兴趣的可以点击原文阅读

https://hallofdreams.org/posts/hatetris/
👍11