文章
与机器共生
最近写代码比较少,干脆分享一点八卦,博诸君一笑 :) 几年前,在 GitHub 上建了几个 golang 的项目,主要是练手用的,也没几个人关注。最近几天,忽然几个仓库同时收到 PR, 类似这样的 ,大意就是对仓库跑了下 gofmt,其他别的都没干,请合并修改。然后在 issue 里写明了项目的地址,原来还是用 golang 写爬虫做的。自动用 GitHub 的 API 爬取 golang 的仓库,clone 到本地,跑完 gofmt 后,看看有没有修改,有修改就提交 PR。 当时有点郁闷,仿佛 …
最近写代码比较少,干脆分享一点八卦,博诸君一笑 :) 几年前,在 GitHub 上建了几个 golang 的项目,主要是练手用的,也没几个人关注。最近几天,忽然几个仓库同时收到 PR, 类似这样的 ,大意就是对仓库跑了下 gofmt,其他别的都没干,请合并修改。然后在 issue 里写明了项目的地址,原来还是用 golang 写爬虫做的。自动用 GitHub 的 API 爬取 golang 的仓库,clone 到本地,跑完 gofmt 后,看看有没有修改,有修改就提交 PR。 当时有点郁闷,仿佛 …
bug 狩猎
最近需求少了,终于有时间修一下底层的 bug,做一点工具方便查 bug,写篇文章简单记录一下。 一是优化了一个玩法进程的启动速度。这个玩法需要用战力做匹配,玩家按战力分段放进不同的桶里,每个桶用 skiplist 组织。启动服务器的时候,会遍历所有玩家,放进对应的桶里,方便正式开放的时候进行搜索匹配。之前是遍历策划配置的战力分段表,高端玩家几乎要遍历完整个表才能进到桶里。现在改成了二分查找,匹配速度提高了好多 二是隔壁组做 mmo 的同事,问了下有没有现成的查内存泄漏的工具。他们加班的比较凶,周 …
最近需求少了,终于有时间修一下底层的 bug,做一点工具方便查 bug,写篇文章简单记录一下。 一是优化了一个玩法进程的启动速度。这个玩法需要用战力做匹配,玩家按战力分段放进不同的桶里,每个桶用 skiplist 组织。启动服务器的时候,会遍历所有玩家,放进对应的桶里,方便正式开放的时候进行搜索匹配。之前是遍历策划配置的战力分段表,高端玩家几乎要遍历完整个表才能进到桶里。现在改成了二分查找,匹配速度提高了好多 二是隔壁组做 mmo 的同事,问了下有没有现成的查内存泄漏的工具。他们加班的比较凶,周 …
LessonLearned
最近,中兴 ZTE 违反美国商务部禁令,向伊朗出售敏感技术,被美国下达长达 7 年的禁止令,教训十分深刻。以诚待人,信守承诺,才能在商业社会站稳脚跟。 还是说说最近自己上的一课吧。上了港台服以后,奇奇怪怪的问题比较多。其中之一是玩家被异常登录了。现象是玩家登录游戏,提示账号被异常登录。这种现象本来应该在玩家顶号操作时,被顶号的设备上出现的。不应该在正在登录的活跃客户端上显示 回顾现在的登录过程,玩家连上游戏后,首先会创建一个 session。登录完成后,会产生 user 挂在 session 上 …
最近,中兴 ZTE 违反美国商务部禁令,向伊朗出售敏感技术,被美国下达长达 7 年的禁止令,教训十分深刻。以诚待人,信守承诺,才能在商业社会站稳脚跟。 还是说说最近自己上的一课吧。上了港台服以后,奇奇怪怪的问题比较多。其中之一是玩家被异常登录了。现象是玩家登录游戏,提示账号被异常登录。这种现象本来应该在玩家顶号操作时,被顶号的设备上出现的。不应该在正在登录的活跃客户端上显示 回顾现在的登录过程,玩家连上游戏后,首先会创建一个 session。登录完成后,会产生 user 挂在 session 上 …
下划线引起的血案
最近公司搬迁,所有虚拟机都要重新部署,累死了。然后 Python 一堆依赖以前没管理好,直接装全局位置,也忘记导出一份版本号到新机器来安装。这是祸根 换到新机器后,Skynet 和 Golang 相关应用都跑起来了。但是 Python 写的内部应用有点问题,网站认证后,认证用户名 valid_username 一直传不到应用里。检查过内部 Oauth 的代码,以及 Nginx 的转发配置,都没有问题。最终通过重放请求定位到是 Gevent 丢掉了这个参数。同事帮忙翻了下 更新日志 ,发现因为安全 …
最近公司搬迁,所有虚拟机都要重新部署,累死了。然后 Python 一堆依赖以前没管理好,直接装全局位置,也忘记导出一份版本号到新机器来安装。这是祸根 换到新机器后,Skynet 和 Golang 相关应用都跑起来了。但是 Python 写的内部应用有点问题,网站认证后,认证用户名 valid_username 一直传不到应用里。检查过内部 Oauth 的代码,以及 Nginx 的转发配置,都没有问题。最终通过重放请求定位到是 Gevent 丢掉了这个参数。同事帮忙翻了下 更新日志 ,发现因为安全 …
Intel 的 CPU 漏洞:Spectre
最近觉得越来越忙,写博客都没精力了。一定是太沉迷农药和刷即刻了 17 年年底,18 年年初,Intel 被爆出了 Meltdown(熔断)和 Spectre(幽灵)漏洞。等 Spectre 攻击的 POC 出来以后, 去 github 围观了一下 ,真的非常精妙,好想贴上来分享一下。 void victim_function(size_t x) { if (x < array1_size) { temp &= array2[array1[x] * 512]; } } 主要代码就在 …
最近觉得越来越忙,写博客都没精力了。一定是太沉迷农药和刷即刻了 17 年年底,18 年年初,Intel 被爆出了 Meltdown(熔断)和 Spectre(幽灵)漏洞。等 Spectre 攻击的 POC 出来以后, 去 github 围观了一下 ,真的非常精妙,好想贴上来分享一下。 void victim_function(size_t x) { if (x < array1_size) { temp &= array2[array1[x] * 512]; } } 主要代码就在 …
git 和 redmine 同步
最近实现了 github 以及内部的 gitbucket 与 redmine 的同步。 redmine 是内部使用的一套工单系统,用于跟踪 bug 和需求,由于最近同时开发的版本比较多,在不同分支的提交容易漏掉。现在改为用 redmine 的工单跟踪需求和 bug 修复,提交的时候,只要在提交日志里写上单号,机器人就可以将提交信息同步到表单,可以方便的跟踪到提交有没有漏提交到指定分支。 实现上居然很简单,整个过程还是很愉悦的。gitbucket 方面比较简单,gitbucket 的仓库属主可以添 …
最近实现了 github 以及内部的 gitbucket 与 redmine 的同步。 redmine 是内部使用的一套工单系统,用于跟踪 bug 和需求,由于最近同时开发的版本比较多,在不同分支的提交容易漏掉。现在改为用 redmine 的工单跟踪需求和 bug 修复,提交的时候,只要在提交日志里写上单号,机器人就可以将提交信息同步到表单,可以方便的跟踪到提交有没有漏提交到指定分支。 实现上居然很简单,整个过程还是很愉悦的。gitbucket 方面比较简单,gitbucket 的仓库属主可以添 …
redis 的 LRU 算法(一)
最近加班比较累,完全不想写作了。。 刚看到 一篇有趣的文章 ,是 redis 的作者 antirez 对 redis 的 LRU 算法的回顾。LRU 算法是 Least Recently Used 的意思,将最近最少使用的资源丢掉。Redis 经常被用作 cache,如果能够将不常用的 key 移除,尽量保留常用的,那内存的利用率就相当高了。当然,LRU 也有弱点,考虑下面一种情况: ~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~| …
最近加班比较累,完全不想写作了。。 刚看到 一篇有趣的文章 ,是 redis 的作者 antirez 对 redis 的 LRU 算法的回顾。LRU 算法是 Least Recently Used 的意思,将最近最少使用的资源丢掉。Redis 经常被用作 cache,如果能够将不常用的 key 移除,尽量保留常用的,那内存的利用率就相当高了。当然,LRU 也有弱点,考虑下面一种情况: ~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~| …
skynet 的网络收发
最近,有位前同事在 skynet 仓库里提了个 有关网络性能的 issue,正好理一下 skynet 的流程。
最近,有位前同事在 skynet 仓库里提了个 有关网络性能的 issue,正好理一下 skynet 的流程。
skynet 的火焰图
之前搞过一下 systemtap(systemtap 折腾笔记 ),可惜很快琐事缠身,没有继续搞下去。最近偷空搞了一下,有点意思。 章大大的思路,是用 perl 生成 systemtap 脚本,从 /proc/$pid/maps 里面扫出 liblua.so 的地址。然后 hook 这个地址里,以 luaL_* 和 lua_* 开头的 lua 虚拟机 C 函数。hook 住的函数里,都会有个参数 L,这个 L 表示 lua 的虚拟机。接下来就是按 lua 的 C 代码撸一遍,看看怎么从 L 的内 …
之前搞过一下 systemtap(systemtap 折腾笔记 ),可惜很快琐事缠身,没有继续搞下去。最近偷空搞了一下,有点意思。 章大大的思路,是用 perl 生成 systemtap 脚本,从 /proc/$pid/maps 里面扫出 liblua.so 的地址。然后 hook 这个地址里,以 luaL_* 和 lua_* 开头的 lua 虚拟机 C 函数。hook 住的函数里,都会有个参数 L,这个 L 表示 lua 的虚拟机。接下来就是按 lua 的 C 代码撸一遍,看看怎么从 L 的内 …
伤感三月
带着我经历过两个项目的 boss 离职了,好遗憾。老同事过来我们组帮忙了,算是一个小小的惊喜。 最近看了《垃圾回收的算法与实现》,说实话,译者的水平比较有限,有几处明显的理解错误。不过,书里的插图还是很易懂的,看着伪代码和插图,勉强读了下来。读完会比较清醒的意识到,即使有 gc 帮助,还是有可能会有内存泄漏的。月中抽空压测了一下,的确发现了有泄漏。。 我们用的脚本语言是 Lua,Lua 采用的是标记清除算法,从根出发,搜索不可达对象并回收掉。如果有泄漏,一定是有资源被某个地方引用住了,没有释放。 …
带着我经历过两个项目的 boss 离职了,好遗憾。老同事过来我们组帮忙了,算是一个小小的惊喜。 最近看了《垃圾回收的算法与实现》,说实话,译者的水平比较有限,有几处明显的理解错误。不过,书里的插图还是很易懂的,看着伪代码和插图,勉强读了下来。读完会比较清醒的意识到,即使有 gc 帮助,还是有可能会有内存泄漏的。月中抽空压测了一下,的确发现了有泄漏。。 我们用的脚本语言是 Lua,Lua 采用的是标记清除算法,从根出发,搜索不可达对象并回收掉。如果有泄漏,一定是有资源被某个地方引用住了,没有释放。 …
加班月
本月都在埋头加班,没搞什么有趣的东西,就分享一篇 Cloudflare 捅的篓子吧 XD Google 有个叫 Project Zero 的安全团队,成员 Tavis Ormandy 某天做一个语料库项目,突然发现 Google 缓存数据里出现了完整的 https 请求。排查发现这些请求都来自于 Cloudflare。Cloudflare 是业界闻名的 CDN,通过 DNS 解释的原理工作,不需要修改页面的资源地址,而是将代理资源的域名,解释到靠近访客的 Cloudflare 服务器上,以此达到 …
本月都在埋头加班,没搞什么有趣的东西,就分享一篇 Cloudflare 捅的篓子吧 XD Google 有个叫 Project Zero 的安全团队,成员 Tavis Ormandy 某天做一个语料库项目,突然发现 Google 缓存数据里出现了完整的 https 请求。排查发现这些请求都来自于 Cloudflare。Cloudflare 是业界闻名的 CDN,通过 DNS 解释的原理工作,不需要修改页面的资源地址,而是将代理资源的域名,解释到靠近访客的 Cloudflare 服务器上,以此达到 …