文章
视频分析
最近 AI 因为 ChatGPT 大热,正好找个由头玩一下,家里为了看娃装了个摄像头,一周拍的录像大概 20 多 G,可以拿来练练手。之前都是老婆人肉一个个看的,我这次先筛选出有动静的片段,后续老婆再看 最初的想法,是使用 haarcascades 分类器的,毕竟是老牌分类器,又是 opencv 自带的,公司用了一段时间也还行。但是 full_body 和 frontalface 都试过了,家里光线和环境比较复杂,误报很多。无奈换成了有动静才保留对应视频,这里参考了 利用 OpenCV 过滤监控 …
最近 AI 因为 ChatGPT 大热,正好找个由头玩一下,家里为了看娃装了个摄像头,一周拍的录像大概 20 多 G,可以拿来练练手。之前都是老婆人肉一个个看的,我这次先筛选出有动静的片段,后续老婆再看 最初的想法,是使用 haarcascades 分类器的,毕竟是老牌分类器,又是 opencv 自带的,公司用了一段时间也还行。但是 full_body 和 frontalface 都试过了,家里光线和环境比较复杂,误报很多。无奈换成了有动静才保留对应视频,这里参考了 利用 OpenCV 过滤监控 …
43 周回顾
很佩服阮一峰每周出一篇网志,我也尝试着每周写一篇杂萃,记录一下本周遇到的有趣网文 Reddit 网友获得了一台 Netflix 的网络缓存服务器 Netflix 作为流媒体领域的巨头,在刚过去的 2022 年 Q3 上线了超过 1000 集电视剧,而幕后默默支撑 Netflix 帝国的缓存服务器却鲜为人知,这次发现悄悄的开了一扇窗 :) Google Chrome 释出 0day 漏洞修复更新 Google Chrome 作为市场占有率第一的浏览器,也是众多黑客的重点关注对象,这次修复更新已经是 …
很佩服阮一峰每周出一篇网志,我也尝试着每周写一篇杂萃,记录一下本周遇到的有趣网文 Reddit 网友获得了一台 Netflix 的网络缓存服务器 Netflix 作为流媒体领域的巨头,在刚过去的 2022 年 Q3 上线了超过 1000 集电视剧,而幕后默默支撑 Netflix 帝国的缓存服务器却鲜为人知,这次发现悄悄的开了一扇窗 :) Google Chrome 释出 0day 漏洞修复更新 Google Chrome 作为市场占有率第一的浏览器,也是众多黑客的重点关注对象,这次修复更新已经是 …
SSH 产生公钥
github 最近新增了 ssh 公钥签名的展示,正好可以试一下。结果发现使用多年的私钥已经找不回匹配的公钥了 …… 记录一下免得以后又忘了: ssh-keygen -f ~/.ssh/private_key -y >~/.ssh/private_key.pub git 设置使用 ssh 签名: git config --global gpg.format ssh git config --global user.signingKey ~/.ssh/private_key git config …
github 最近新增了 ssh 公钥签名的展示,正好可以试一下。结果发现使用多年的私钥已经找不回匹配的公钥了 …… 记录一下免得以后又忘了: ssh-keygen -f ~/.ssh/private_key -y >~/.ssh/private_key.pub git 设置使用 ssh 签名: git config --global gpg.format ssh git config --global user.signingKey ~/.ssh/private_key git config …
折腾 HTTPS 的一点笔记
最近,在同事多次推荐下,终于将家里 NAS 的 Nginx 换成了 Caddy,顺便看了一下相关的各种资料,写篇文章记录一下 为什么要申请 HTTPS 证书? 因为 http 是明文的,从客户端到服务器会经历多跳路由,其中任意一个开启捕获模式,都会将 http 的明文会话记录下来。为了避免密码明文在网上传输,以及照片、文本被窥视,还是套上一层加密比较稳妥。之前我的选择是用 ssh 隧道映射端口到本地,再用普通的 http 访问。但是 iOS 的后台保活时间比较短,ssh 隧道很容易断,而 ssh …
最近,在同事多次推荐下,终于将家里 NAS 的 Nginx 换成了 Caddy,顺便看了一下相关的各种资料,写篇文章记录一下 为什么要申请 HTTPS 证书? 因为 http 是明文的,从客户端到服务器会经历多跳路由,其中任意一个开启捕获模式,都会将 http 的明文会话记录下来。为了避免密码明文在网上传输,以及照片、文本被窥视,还是套上一层加密比较稳妥。之前我的选择是用 ssh 隧道映射端口到本地,再用普通的 http 访问。但是 iOS 的后台保活时间比较短,ssh 隧道很容易断,而 ssh …
流量压缩
最近中间件组开始尝试推送 goscon 流量压缩的更新,继上次用 libev 改写 goscon 提升效率后,又是一大改进了。可惜我们没机会上了,CM 觉得我们没有带宽的压力,引入更新只会增加潜在风险。站在团队角度看,我很能理解这个理由啦,但是单纯的从技术追求角度看,又心痒痒的很想上,纠结 ing 中间件组的实验报告很有意思,中间提到了一点,sproto 的 pack 算法反而会降低最终的压缩率,sproto 的 pack 是针对二进制串里连续的 0 做的压缩,应用层做了压缩后,反而影响到压缩算 …
最近中间件组开始尝试推送 goscon 流量压缩的更新,继上次用 libev 改写 goscon 提升效率后,又是一大改进了。可惜我们没机会上了,CM 觉得我们没有带宽的压力,引入更新只会增加潜在风险。站在团队角度看,我很能理解这个理由啦,但是单纯的从技术追求角度看,又心痒痒的很想上,纠结 ing 中间件组的实验报告很有意思,中间提到了一点,sproto 的 pack 算法反而会降低最终的压缩率,sproto 的 pack 是针对二进制串里连续的 0 做的压缩,应用层做了压缩后,反而影响到压缩算 …
代码扫描
最近犯了一个很蠢的错,Code Review 的时候觉得非常丢人,决心不再犯第二次了,同样的错误不再犯第二次,才能不断进步XD 于是写了个小工具来检查。但是实际跑起来,才发现 Lua 这里设计得不太好,留下了一个合法但很容易犯错的坑 具体错误非常简单,就是 for _,item in ipairs(seq) 写成了 for item in ipairs(seq)。而且由于 seq 里的值某些情况下会包含 1,2,3... 的序列,所以还不容易发现异常。花了一点时间写了个扫描器,主要还是调一个正则 …
最近犯了一个很蠢的错,Code Review 的时候觉得非常丢人,决心不再犯第二次了,同样的错误不再犯第二次,才能不断进步XD 于是写了个小工具来检查。但是实际跑起来,才发现 Lua 这里设计得不太好,留下了一个合法但很容易犯错的坑 具体错误非常简单,就是 for _,item in ipairs(seq) 写成了 for item in ipairs(seq)。而且由于 seq 里的值某些情况下会包含 1,2,3... 的序列,所以还不容易发现异常。花了一点时间写了个扫描器,主要还是调一个正则 …
沉迷 docker
最近抵不过同事的热情推荐,用上了 docker 来部署一些私有应用。得益于 Docker.app 对 MacOS 的原生支持,终于不需要再额外跑一个虚拟机了。搭配着 portainer 做 web 端的管理,使用起来相当方便 之前对 docker 一直不太感冒,docker 提供的隔离性对我没感觉,总觉得软件来源是可信赖的商店就行了,包管理器可以做到一键安装,卸载干净,同时安装的时候会挑选依赖少、尽量单一二进制包的应用。现在通过 portainer,用上了 docker-compose 来安装应 …
最近抵不过同事的热情推荐,用上了 docker 来部署一些私有应用。得益于 Docker.app 对 MacOS 的原生支持,终于不需要再额外跑一个虚拟机了。搭配着 portainer 做 web 端的管理,使用起来相当方便 之前对 docker 一直不太感冒,docker 提供的隔离性对我没感觉,总觉得软件来源是可信赖的商店就行了,包管理器可以做到一键安装,卸载干净,同时安装的时候会挑选依赖少、尽量单一二进制包的应用。现在通过 portainer,用上了 docker-compose 来安装应 …
sproto 添加版本号
明明需求都做完了,硬要拉着人家去公司加班,真是变态 ToT 最近想推动一下协议版本号的事,版本号不一致的禁止登录。理论上,只要改了某条协议的定义,而客户端因为各种原因没有更新到协议文件,就有可能导致协议解析出错,服务器拿到异常数据。因为 sproto 的定义是放在 spb 文件里,而不是在网络字节流中,所以拿到数据后用不一致的 schema 去解开,真是无法预期会拿到什么,如果还直接拿这个数据去存盘了,就更危险而难以修复了 之前没有出过问题,可能是客户端更新机制做得比较健壮。客户端上线先拉取版本 …
明明需求都做完了,硬要拉着人家去公司加班,真是变态 ToT 最近想推动一下协议版本号的事,版本号不一致的禁止登录。理论上,只要改了某条协议的定义,而客户端因为各种原因没有更新到协议文件,就有可能导致协议解析出错,服务器拿到异常数据。因为 sproto 的定义是放在 spb 文件里,而不是在网络字节流中,所以拿到数据后用不一致的 schema 去解开,真是无法预期会拿到什么,如果还直接拿这个数据去存盘了,就更危险而难以修复了 之前没有出过问题,可能是客户端更新机制做得比较健壮。客户端上线先拉取版本 …
Skynet 广播优化小记
最近和 QC 同学共建一套自动化压测的框架,希望能够确定游戏的性能基线,通过自动化定期回顾,看看有没有引入性能劣化的代码。压测过程中,发现广播性能不够强,搞的清明假期也在家想问题,写篇博客记录一下 为了让房间服务能腾出手专心处理战斗相关内容,我们针对性的改进了打包和广播,分离到一个与房间 1 比 1 配置的 sidecar 服务上去,期待能多利用一个核的算力来实现。在维持客户端链接的 login 节点,我们也做了类似 Skynet 的 cluster 模块的优化,拆分开一个 gate 和多个 …
最近和 QC 同学共建一套自动化压测的框架,希望能够确定游戏的性能基线,通过自动化定期回顾,看看有没有引入性能劣化的代码。压测过程中,发现广播性能不够强,搞的清明假期也在家想问题,写篇博客记录一下 为了让房间服务能腾出手专心处理战斗相关内容,我们针对性的改进了打包和广播,分离到一个与房间 1 比 1 配置的 sidecar 服务上去,期待能多利用一个核的算力来实现。在维持客户端链接的 login 节点,我们也做了类似 Skynet 的 cluster 模块的优化,拆分开一个 gate 和多个 …
proxychains4.16 的新行为
proxychains 用来转发命令行工具的流量十分趁手,但是最近升级到 4.16 后没法上 github 了,于是好好研究了一下新的配置,写篇博客记录下 proxychains 是利用了 LD_PRELOAD 的方式抢先加载,然后将命令行程序的网络流量都按 Socks5 或者 HTTP 代理的方式转发出去。如果访问的是域名,则还需要进行一次 DNS 解析,再用 socks5 代理或者 HTTP 代理直接链接 IP 进行访问。当然,为了更完整的隐私保护,一般会在配置文件里打开 …
proxychains 用来转发命令行工具的流量十分趁手,但是最近升级到 4.16 后没法上 github 了,于是好好研究了一下新的配置,写篇博客记录下 proxychains 是利用了 LD_PRELOAD 的方式抢先加载,然后将命令行程序的网络流量都按 Socks5 或者 HTTP 代理的方式转发出去。如果访问的是域名,则还需要进行一次 DNS 解析,再用 socks5 代理或者 HTTP 代理直接链接 IP 进行访问。当然,为了更完整的隐私保护,一般会在配置文件里打开 …
使用 jemalloc 的潜在问题
今天读到一篇 关于 Firefox 内存优化的文章 ,里面提到使用 jemalloc 时遇到的一个小问题,不知道有没有现成的 API 可以统计,回头看看。 Jemalloc 是用来减少内存碎片化导致的内存损失的。内存碎片化是指可用内存被分成了一片片碎片,虽然总量够用,但是无法按需求分出指定大小的块。操作系统是按页(page)进行内存管理的,每页被浪费的内存会成为空洞;另外,部分释放回来的内存会在已分配内存间形成碎片,比较大的内存申请也塞不进去碎片里,导致内存损失 [Page1, [3 …
今天读到一篇 关于 Firefox 内存优化的文章 ,里面提到使用 jemalloc 时遇到的一个小问题,不知道有没有现成的 API 可以统计,回头看看。 Jemalloc 是用来减少内存碎片化导致的内存损失的。内存碎片化是指可用内存被分成了一片片碎片,虽然总量够用,但是无法按需求分出指定大小的块。操作系统是按页(page)进行内存管理的,每页被浪费的内存会成为空洞;另外,部分释放回来的内存会在已分配内存间形成碎片,比较大的内存申请也塞不进去碎片里,导致内存损失 [Page1, [3 …
golang编译问题
最近中间件来了一位新同学,帮忙将goscon的重构了,着重提升了goscon的网络读写性能。这个修改通过cgo的方式引入了Linux的epoll,比golang原生的网络读写好多了。但是在QC同学的祖传ubuntu 16.04镜像上,死活编译不通过,网上也没找到资料,所以留一篇记录,方便以后查询 报错信息: /usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1 …
最近中间件来了一位新同学,帮忙将goscon的重构了,着重提升了goscon的网络读写性能。这个修改通过cgo的方式引入了Linux的epoll,比golang原生的网络读写好多了。但是在QC同学的祖传ubuntu 16.04镜像上,死活编译不通过,网上也没找到资料,所以留一篇记录,方便以后查询 报错信息: /usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1 …