跳转到主要内容

KK的博客

Don't Repeat Yourself · 好奇心驱动进步

最新文章

  • 最近设计的反思

    发布于 文章 1236 字 3 分钟

    Python

    最近完成了邮箱的功能。 邮箱的设计参考了 mmzb 的设计,基于一套 msgsrv 来实现。msgsrv 是一个消息中转的服务,这个服务是为了简化玩家之间消息传递的过程。比如邮箱要向一个离线玩家发信,为了避免对离线玩家的数据进行修改,会通过 msgsrv 发送到玩家对应的 msgbox 里。玩家上线后,会自动查询自己的 msgsrv,检索未读消息。当玩家上线时,会主动在 msgsrv 中发起订阅。每当有新的消息进入,msgsrv 会直接发送到玩家所在的 agent 上,实现实时通知。唯一例外的情 …

    最近完成了邮箱的功能。 邮箱的设计参考了 mmzb 的设计,基于一套 msgsrv 来实现。msgsrv 是一个消息中转的服务,这个服务是为了简化玩家之间消息传递的过程。比如邮箱要向一个离线玩家发信,为了避免对离线玩家的数据进行修改,会通过 msgsrv 发送到玩家对应的 msgbox 里。玩家上线后,会自动查询自己的 msgsrv,检索未读消息。当玩家上线时,会主动在 msgsrv 中发起订阅。每当有新的消息进入,msgsrv 会直接发送到玩家所在的 agent 上,实现实时通知。唯一例外的情 …

  • 服务器被发现存在未授权访问

    发布于 文章 548 字 2 分钟

    Python

    今天下午,友商的同学突然发了个确认信息过来,让我们确认一下服务器的归属。然后就抛出了个大新闻:我司服务器存在问题,所有文件都可以任意访问。根据对方反映的信息,确认是之前玩票性质的一个项目:avalon 出了问题。https://github.com/ejoy/avalon/blob/master/lualib/staticfile.lua#L12-L17 这里没有做输入检查,就直接使用 io.open 了。 另外一个地方,是因为这个项目的玩票性质,所以 SA 同学随便找台空的服务器丢上去了,而且 …

    今天下午,友商的同学突然发了个确认信息过来,让我们确认一下服务器的归属。然后就抛出了个大新闻:我司服务器存在问题,所有文件都可以任意访问。根据对方反映的信息,确认是之前玩票性质的一个项目:avalon 出了问题。https://github.com/ejoy/avalon/blob/master/lualib/staticfile.lua#L12-L17 这里没有做输入检查,就直接使用 io.open 了。 另外一个地方,是因为这个项目的玩票性质,所以 SA 同学随便找台空的服务器丢上去了,而且 …

  • RRDtool 简介

    发布于 文章 179 字 1 分钟

    Python

    最近公司换了办公地址,新厂址的宽带质量不怎么样,于是用 RRDTool 布了一套网络质量监控的系统,来定位公司内部与机房的连接问题。RRDTool 是一套经典的工具,前身是 MRTG,因为其中的性能有所不足,绘图的灵活性不够,于是作者 Tobias Oetiker 又重新开发了一套 RRDTool。这套工具包含了日志记录和图表绘制两部分,可以满足各种指标监控的用途。 RRDTool 的 RR,指的是 Round-robin,

    最近公司换了办公地址,新厂址的宽带质量不怎么样,于是用 RRDTool 布了一套网络质量监控的系统,来定位公司内部与机房的连接问题。RRDTool 是一套经典的工具,前身是 MRTG,因为其中的性能有所不足,绘图的灵活性不够,于是作者 Tobias Oetiker 又重新开发了一套 RRDTool。这套工具包含了日志记录和图表绘制两部分,可以满足各种指标监控的用途。 RRDTool 的 RR,指的是 Round-robin,

  • 折腾域名的 dns

    发布于 文章 800 字 2 分钟

    Python

    最近,购买域名的时候遇到了几个概念,刚开始不是很懂,最后都是直接找客服给我改好的,现在小结一下帮助理解。 DNS 域名管理是按后缀进行分组的,比如 .com 域名,作为最早的商用域名,有很高的推广价值。再比如各个国家的顶级域名,例如中国的 .cn,加拿大的 .ca,简单易记。我们购买的,是通常意义上,www 与顶级域名之间的部分,叫二级域名。 二级域名会挂在某个根域名下,各个根域名会分给各个承包商进行承包,各自销售。其中有个国际组织在掺和,叫 Internet Corporation for …

    最近,购买域名的时候遇到了几个概念,刚开始不是很懂,最后都是直接找客服给我改好的,现在小结一下帮助理解。 DNS 域名管理是按后缀进行分组的,比如 .com 域名,作为最早的商用域名,有很高的推广价值。再比如各个国家的顶级域名,例如中国的 .cn,加拿大的 .ca,简单易记。我们购买的,是通常意义上,www 与顶级域名之间的部分,叫二级域名。 二级域名会挂在某个根域名下,各个根域名会分给各个承包商进行承包,各自销售。其中有个国际组织在掺和,叫 Internet Corporation for …

  • 2015 年终总结

    发布于 文章 675 字 2 分钟

    Python

    2015 年是我第一次感觉人生过得快的一年。这一年买房了,月供比较重,有种喘不过气的感觉。15 年的阅读量比 14 年少,主要是网络小说看的少了,人文类的阅读量上来了,比较耗费时间。另外,15 年计算机专业的书读的很少,那本《redis 设计与实现》还没看完,有点遗憾。15 年开始思考一些大问题,比如两性平等,科技进步带来的发展,比如文明发展为什么不均衡,主体与客体,人为什么会感觉愉快。 15 年的博客写了 18 篇,比 14 年的 15 篇多了一点点,基本维持在每月一篇到两篇的节奏,但是文章的 …

    2015 年是我第一次感觉人生过得快的一年。这一年买房了,月供比较重,有种喘不过气的感觉。15 年的阅读量比 14 年少,主要是网络小说看的少了,人文类的阅读量上来了,比较耗费时间。另外,15 年计算机专业的书读的很少,那本《redis 设计与实现》还没看完,有点遗憾。15 年开始思考一些大问题,比如两性平等,科技进步带来的发展,比如文明发展为什么不均衡,主体与客体,人为什么会感觉愉快。 15 年的博客写了 18 篇,比 14 年的 15 篇多了一点点,基本维持在每月一篇到两篇的节奏,但是文章的 …

  • mmzb 游戏事故分析

    发布于 文章 1382 字 3 分钟

    Python

    最近一次线上更新,老项目挂了,遍地哀嚎,日活跃掉了好多,心痛。。。 这次维护时,SA 为了缩减硬件资源,做了一次数据库迁移。给到开发手上的 player db,只有一些索引数据,不带有任一玩家数据。玩家上线的时候,skynet 自动从 redis-persist 服务中拉取(redis-persist 是一个基于旁路监听的 redis 落地程序,相对独立,参见 之前的博文 )。这也是 RP 服务的第一次高强度使用。按之前的策略,每次玩家下线都会在 RP 服务中存档,三个月不上线的玩家,会自动从 …

    最近一次线上更新,老项目挂了,遍地哀嚎,日活跃掉了好多,心痛。。。 这次维护时,SA 为了缩减硬件资源,做了一次数据库迁移。给到开发手上的 player db,只有一些索引数据,不带有任一玩家数据。玩家上线的时候,skynet 自动从 redis-persist 服务中拉取(redis-persist 是一个基于旁路监听的 redis 落地程序,相对独立,参见 之前的博文 )。这也是 RP 服务的第一次高强度使用。按之前的策略,每次玩家下线都会在 RP 服务中存档,三个月不上线的玩家,会自动从 …

  • 为 sproto 手写了一个 pythonparser

    发布于 文章 541 字 2 分钟

    Python

    这是 sproto 系列文章的第三篇,可以参考前面的《 为 sproto 添加 python 绑定 》、《 为 python-sproto 添加 map 支持 》。 .type { .field { name 0 : string buildin 1 : integer type 2 : integer tag 3 : integer array 4 : boolean key 5 : integer # If key exists, array must be true, and it's a …

    这是 sproto 系列文章的第三篇,可以参考前面的《 为 sproto 添加 python 绑定 》、《 为 python-sproto 添加 map 支持 》。 .type { .field { name 0 : string buildin 1 : integer type 2 : integer tag 3 : integer array 4 : boolean key 5 : integer # If key exists, array must be true, and it's a …

  • Lua 小技巧

    发布于 文章 345 字 1 分钟

    Python

    来公司以后,业务逻辑都用 lua 写。写了好长时间了,到最近才觉得有点掌握了 Lua 的灵活。最近用 Lua 写了个类似集合一样的东西,如果两次向集合里放入同一个元素,就会报错,方便检查配置。代码如下: -- keep data across rule local m = {} local where_defines = {} local getinfo = debug.getinfo name2id = setmetatable({}, { __index = m, __newindex = …

    来公司以后,业务逻辑都用 lua 写。写了好长时间了,到最近才觉得有点掌握了 Lua 的灵活。最近用 Lua 写了个类似集合一样的东西,如果两次向集合里放入同一个元素,就会报错,方便检查配置。代码如下: -- keep data across rule local m = {} local where_defines = {} local getinfo = debug.getinfo name2id = setmetatable({}, { __index = m, __newindex = …

  • Techparty- 广州 10 月 31 日 Docker 专场沙龙后记

    发布于 文章 791 字 2 分钟

    Python

    华为的童鞋技术能力很强,但是两位讲师的都没听进去。重点听了两个,一个是芒果 TV 的 Docker 之路,另一个是 Coding 的实践和思考。 芒果 TV 的主讲人是一直仰慕的 CMGS,从豆瓣出来后去了国企芒果台。因为内部阻力问题,无法实现 PaaS。转而实现了细粒度的调度。物理机 +Docker 为芒果台省了不少机器,而且性能还比 AWS 的要强。实践上,主要用到了 MacVLan,在二层网络上做网络调度。还有 Devicemapper,但是 dm 受镜像大小的影响比较大,超过 2G 大小 …

    华为的童鞋技术能力很强,但是两位讲师的都没听进去。重点听了两个,一个是芒果 TV 的 Docker 之路,另一个是 Coding 的实践和思考。 芒果 TV 的主讲人是一直仰慕的 CMGS,从豆瓣出来后去了国企芒果台。因为内部阻力问题,无法实现 PaaS。转而实现了细粒度的调度。物理机 +Docker 为芒果台省了不少机器,而且性能还比 AWS 的要强。实践上,主要用到了 MacVLan,在二层网络上做网络调度。还有 Devicemapper,但是 dm 受镜像大小的影响比较大,超过 2G 大小 …

  • 1password 密码库格式更新

    发布于 文章 1059 字 3 分钟

    Python

    由于国内网络安全做的太差,经常发生被脱裤的事件,比如最近的网易邮箱(via 乌云 ),所以只好用 1password 这类密码管理软件,实现一站一密。昨晚半夜冻醒了,刷推刷到了这个:1password-leaks-your-data,整个人吓醒了 =_=# 作者有点标题党,脱水版可以参见 reddit 的 这篇文章 ,大意是 1password 的旧密码库格式叫 agilechains,大体是 json 结构,里面只有密码是加密的,密码项的名字和 URL 并未加密。官方提到历史原因,早期计算能力 …

    由于国内网络安全做的太差,经常发生被脱裤的事件,比如最近的网易邮箱(via 乌云 ),所以只好用 1password 这类密码管理软件,实现一站一密。昨晚半夜冻醒了,刷推刷到了这个:1password-leaks-your-data,整个人吓醒了 =_=# 作者有点标题党,脱水版可以参见 reddit 的 这篇文章 ,大意是 1password 的旧密码库格式叫 agilechains,大体是 json 结构,里面只有密码是加密的,密码项的名字和 URL 并未加密。官方提到历史原因,早期计算能力 …

  • SSL 加密与系统时间

    发布于 文章 458 字 1 分钟

    Python

    最近,家里的神州老笔记本没电池了,要拆 C 面才能换主板电池,懒得动手,于是搞了个 Network Time 来做对时。主要是未搞对时之前,所有 https 的站点都用不了,老人家也抱怨炒股不行,崩溃了。。。这时候才知道,原来证书也是要验证时间的。 在 SSL 会话里,客户端需要验证服务器的身份,这是通过证书检查来完成的。证书验证中,会涉及跟时间相关的两点: 服务器的证书(及涉及到的其他证书)的有效验证时间需要包含当前时间。每个证书都有 notBefore(不早于)和 notAfter(不晚于) …

    最近,家里的神州老笔记本没电池了,要拆 C 面才能换主板电池,懒得动手,于是搞了个 Network Time 来做对时。主要是未搞对时之前,所有 https 的站点都用不了,老人家也抱怨炒股不行,崩溃了。。。这时候才知道,原来证书也是要验证时间的。 在 SSL 会话里,客户端需要验证服务器的身份,这是通过证书检查来完成的。证书验证中,会涉及跟时间相关的两点: 服务器的证书(及涉及到的其他证书)的有效验证时间需要包含当前时间。每个证书都有 notBefore(不早于)和 notAfter(不晚于) …

  • python 和 nodejs 的 aes128 加密对比

    发布于 文章 278 字 1 分钟

    Python

    之前的机器人是用 python 写的,有同事想改写成 nodejs 版,但是验证一直通不过,于是帮忙爬了一下文档。 #encoding:utf8 from Crypto.Cipher import AES import binascii key = 'abcdabcdabcdabcd' plaintext = 'Secret Message A' encobj = AES.new(key, AES.MODE_ECB) ciphertext = encobj.encrypt(plaintext) …

    之前的机器人是用 python 写的,有同事想改写成 nodejs 版,但是验证一直通不过,于是帮忙爬了一下文档。 #encoding:utf8 from Crypto.Cipher import AES import binascii key = 'abcdabcdabcdabcd' plaintext = 'Secret Message A' encobj = AES.new(key, AES.MODE_ECB) ciphertext = encobj.encrypt(plaintext) …