May 08, 2018

断点单步跟踪是一种低效的调试方法

断点单步跟踪的交互式调试器是软件开发史上的一项重大发明。但我认为,它和图形交互界面一样,都是用牺牲效率来降低学习门槛。本质上是一种极其低效的调试方法。

我在年少的时候( 2005 年以前的十多年开发经历)都极度依赖这类调试器,从 Turbo C 到 Visual C++ ,各个版本都仔细用过。任何工具用上十年后熟能生巧是很自然的事。我认为自己已经可以随心所欲用这类工具高效的定位出 bug 了。但在 2005 年之后转向跨平台开发后,或许是因为一开始没能找到 Linux 平台上合适的图形工具,我有了一些时间反思调试方法的问题。GDB 固然强大,但当时的图形交互外壳并不像今天的版本这么完善。当时比较主流的 insight ddd 都有些小问题,用起来不是十分顺手。我开始转换自己平时做开发的方式。除了尽量提高自己的代码质量:写简洁的、明显没有问题的代码之外,多采用不断的代码复核(Code Review),有意识地增加日志输出,来定位 Bug 。

后来开发重心从客户端图形开发逐步转向服务器,更加显露出用调试器中断程序运行的劣势来。对于 C/S 结构的软件,中断一边的代码运行,用人的交互频率单步跟踪运行,而另一边是以机器的交互频率运作,像让软件运行流程保持正常是非常困难的。

这些年的工作中又慢慢加入一些 Windows 下的开发工作。我发现经过了再一个十年的训练,即使偶尔用上交互式调试器,也体会不到什么优势了。往往手指按在跟踪调试按键上机械的操作,脑子里想的却不是眼前看到的屏幕上的代码。往往都没执行到触发 Bug 的位置,已经恍然大悟发现写错的地方了。这种事情多了,自然会对过去的方法质疑,是什么导致了调试器的低效。

阅读全文 "断点单步跟踪是一种低效的调试方法" »

May 05, 2018

《冰气时代》末日下的人性考验

劳动节假期前夜,跳票了一年的 Frostpunk 上架了。我的五一假期有一半时间是都在挖煤。我想这是一款堪称艺术品的游戏,因为他能带来娱乐之外的东西,所以我一定要专门为它写一篇 blog 。

出于对开发商的信任,我第一时间就买了这款游戏。毕竟他们的前一个作品——《我的这场战争(This War of Mine)》就充满着人文情怀却不失游戏性,让我沉迷了好几个晚上。我相信新作不会让人失望的。

果不其然,冰气时代依然透着 TWoM 中那种悲天悯人的独特气质,一上手就能感觉到是同一帮人的作品。而且这次画面质量还出奇的好。出场的时候踏着及腰的积雪出去拾煤的小人,一点点在雪地里趟出一条路来。冷风呼啸而过,在屏幕上结出冰来。这些都让人有一种 3A 大作的感觉,完全不像个独立游戏(当然从制作人员名单来看,制作团队整容也作实庞大)。其实即便把画面抹掉,依据其玩法内核做成一个文本游戏,我依然会觉得好玩。

阅读全文 "《冰气时代》末日下的人性考验" »

April 17, 2018

skynet cluster 模块的一点优化

上周末,我对 skynet 的 cluster 模块做了一点优化。

cluster 模式 是 skynet 的一种集群方案,用于将多台机器更为弹性的组成一个集群。我们将每台机器都赋予一个名字,然后就可以在集群间用这个名字向对方推送消息或发起请求。

集群的管理是一项非常复杂的工作,skynet 作为一个轻量化的框架,只实现了最基本的基础设施。cluster 这个基础设施已实现的部分并不复杂。在每个 skynet 进程中,我们启动了一个叫 clusterd 的服务,专门用于集群间的通讯。由 clusterd 再启动了一个 gate 服务,监听其它节点连过来的连接;同时,当前节点如果要对其它节点发送数据,也通过 clusterd 向外连接。业务要使用 cluster 的时候,都是通过 require "cluster" 这个库,然后这个库中的 api 负责和本节点的 clusterd 交换数据。

我们正在开发的一个 mmorpg 项目重度依赖了 cluster ,在过去的多次压力测试中,发现 clusterd 是测试中单位时间内消耗 CPU 最多的服务。它是整个 skynet 节点中的一个性能热点。所以我考虑了对这个 clusterd 做一些优化。

阅读全文 "skynet cluster 模块的一点优化" »

April 09, 2018

Lua 5.4 的改进及 Lua 的版本演进

Lua 社区最近的一件大事是 Lua 5.4 的 work1 版本发布了。

这次的首发版本中引入了一个试验性的新特性,用来解决将 nil 放入数组的问题。因为是实验性特性,所以开发组决定默认关闭,必须在编译源代码的时候定义 LUA_NILINTABLE 这个宏才能开启。注意:默认是不开启的,后面的讨论都以这个为基础。

在邮件列表的讨论中,有不少人引入了不必要的激烈情绪,反对这种影响兼容性的改变。 Roberto 同学看起来是生气了,用全大写字母又重新强调了一次。当然虽然也有人不仔细阅读就评论,也比充斥在网络的大部分地方的喷子要强得多。

我觉得阅读整个讨论能加深对 Lua 语言的理解,非常有价值。这里做一点记录。毕竟,深入学习任何东西都回避不了了解其历史。每次 Lua 的版本升级的预发阶段,都会引入一些有趣的东西,大多数又会在正式版本发布前删掉。说明 Lua 的开发团队在语言设计上是及其谨慎的,我们要追寻这些历史痕迹,也只能从这些讨论中发掘了。

对于不太熟悉 Lua 的同学来说,我们先简单介绍一下这个特性的缘由。

阅读全文 "Lua 5.4 的改进及 Lua 的版本演进" »

March 15, 2018

为什么用本地程序通过本地端口做第三方服务认证是不安全的

今天有同事吐槽钉钉的 windows 客户端做第三方服务权限认证的流程,人机交互方面远没有 qq 好用。

我说,通过一个普通权限的本地程序做统一认证,其实是很容易出安全漏洞的,小心点比较好。一般来说,这个在操作系统层面支持会比较安全,就像 windows 的 UAC 。这种通常是第三方应用向服务器发一个认证请求,然后服务器下转发到本地客户端,然后客户端弹出一个确认窗口,经过用户确认以后,再经由第三方服务器下发给那个第三方客户端。

这里有个安全隐患就是,如果这个弹出窗口不是操作系统级别支持的话,在 windows 下很容易被普通权限的同级程序拦截。当然也不是完全没有办法。比如预留一个用户认可的信息展示,好像信用卡那样的安全识别码;我没用过 qq ,听说 qq 是用用户自己的头像做防伪确认的。

不过,这套流程做起来比较麻烦,开放个第三方使用的话,需要第三方客户端/服务器都遵循一定的协议来做。而且第一次需要做一次账号绑定,需要用户在第三方应用里输入一次自己的 qq 号,或在 qq 中输入一次第三方账号。windows 下可以先用 FindWindow 找到 qq 客户端的窗口,然后用一个自定义消息把一个 token 或第三方的账号信息发过去,完成握手。

说到这里,同事说,qq 的那套似乎没那么复杂,好像是走的本地端口。我先想说不至于吧,但是似乎每次遇到安全问题,我都会高估腾讯的产品设计人员的安全意识下限。腾讯系产品的用户权限大量被盗用似乎在黑产链上不足为奇。

阅读全文 "为什么用本地程序通过本地端口做第三方服务认证是不安全的" »

March 14, 2018

LoadLibrary 无法加载 DLL 的 bug 处理

今天我们的小伙伴在把 Open Asset Import Library 封装成 lua 库的时候遇到一些麻烦。他在 vs 集成环境中编译的版本可以用,在 mingw-gcc 下却出错,报告 “找不到指定的模块。” 或是 “找不到指定的程序。" 。

我不得不吐槽,微软真是太有钱了,雇了一大帮人把出错信息都给国际化,这叫中国程序员怎么 google 问题啊。不太懂 windows ,反正我用 export LANG= 切换了 locale 为 C 还是不能把这段用 FormatMessage 格式化出来的 GetLastError 获得的出错码的错误串变成英文。还请读者中的 windows 大牛在留言中赐教。写这篇 blog 的主要目的就是以后有人可以用上面的出错信息关键词 google 过来。让我们一起来吐槽微软。

阅读全文 "LoadLibrary 无法加载 DLL 的 bug 处理" »

February 24, 2018

群星 2.0 汉化项目

年前就留意了群星会在年后发布 2.0 ,我一直在跟踪它的版本升级维护汉化 mod ,既然这次是一个大版本升级,更新的文本肯定非常多,所以对这次的工作量有了充分的心理准备。

在 2.0 发布的前一天就返回了广州,我反思了过去汉化 mod 的维护过程。虽然有 github 这个方便的工具,可以联合很多同好的力量,但每次还是弄得人很累,尤其是第一天的整理工作。

我以前的做法是,更新完游戏,把新的英文文本上传,根据 github 上的 diff 来整理中文的翻译。过去选择人肉做中文的工作是因为希望人肉把关,有时候英文原文只是调整了版式,修改了错别字,或是修正里里面提到的数字等等。那么在合并中文版的时候就可以保持原样,或顺手改过来。同时也大致了解了游戏的变更。

大量新增的条目、大幅修改的条目,通常我就在中文版中保留英文原文,做个记录,在 github 上发 issue 分类,征集人手来分头翻译。

阅读全文 "群星 2.0 汉化项目" »

Misc

Categories

Archives

Recent Comments