Go 实现瑞士轮排列算法

工作原因接触到了瑞士轮这种赛制,记录一下瑞士轮比赛对手编排的算法 瑞士轮有两个规则 选择积分相近的对手进行比赛 不会重复比赛 写出来的算法如下: type player struct { Id int64 Score int64 Opponent map[int64]struct{} // 曾经遇到过的对手 } // pickTablePlayer 计算瑞士轮比赛排列 func pickTablePlayer(players []int64, playerOpponentMap map[int64]map[int64]struct{}) ([]int64, bool) { if len(players) < 2 { return players, true } whitePlayer := players[0] opponentMap, _ := playerOpponentMap[whitePlayer] for i := range players { if i != 0 { // 判断是否已经比过 if _, has := opponentMap[players[i]]; !has { // 选中 res := make([]int64, 2) res[0] = whitePlayer res[1] = players[i] // 组装剩下排序的数据 var nextRound []int64 nextRound = append(nextRound, players[1:i]....

2022-07-29 10:00:00 · 2 min · 214 words · johnpoint

Oneplus 8T 刷入 LineageOS

劳动节来给博客除除草! 自从一加手机社区发布了官方公告说 Android 12 正式版本出来了之后我就一直在等系统更新的推送,谁知道从4月12日公告出来到今天我都没有收到推送,再加上一加的在 Android 12 后 HOS 会切换成 ColorOS,类原生的特点就没有了,OOS 虽说还会持续维护,但是我既然都用 OOS 了我为啥不自己刷个更加原生的系统呢?比如说 LineageOS。 前期准备 说干就干,先去官网看下有没有支持,芜湖,有支持而且看了下文档还蛮完善的,备份好微信(这个手机里面唯一没有同步功能的app)的数据就打算开始刷机了。 开刷 刷机的过程官方文档已经非常完善了,在这里不重复赘述。 一些要注意的小问题 GAPPS GAPPS 一定要在首次启动系统之前刷入,不然就要双清,之前辛苦配置的东西都无了 SafetyNet 在刷好系统之后,我自然是想打开 ingress 玩下,然后折腾了半天,一直在提醒 ”ingress 需要安全登录“,一开始还以为是代理的问题,疯狂切换代理都没有用,后来查到这个讨论发现是 SafetyNet 的问题,于是 Magisk 刷入了 MagiskHide Props Config、Universal SafetyNet Fix 两个模块解决了这个问题 Universal SafetyNet Fix 这个模块无需任何配置,直接刷入即可生效 MagiskHide Props Config 这个则需要在shell执行指令 props 按照提示选择即可。 相机 自带的相机 app 太拉了,直接停用,在 Google Camera Port 下载了个最新版本的相机,以及挑了个推荐的配置文件。 使用感受 原生的系统真是舒服啊,没有了一些有的没有的app,动画啥的感觉要比HOS要好。高帧率、AOD、蓝牙HD音频编码、屏下指纹这些都没有啥大问题。 甚至有些之前在HOS上面没有体验过的特性,比如说锁屏音乐可视化 总的来说挺满意的,再看看后续使用的过程中有没有啥坑了,就这样。

2022-05-01 11:51:00 · 1 min · 61 words · johnpoint

博客及相关服务部署更新

部署流程更新 众所周知,之前我的博客以及图片托管的服务是通过硬核的DNS分区域解析来实现流量的就近调度,而多个服务器之间的资源文件我一般使用syncthing来进行同步,这个方法显得比较粗糙,但是还挺有效的。最近折腾了下 cloudflare worker 感觉还不错,于是就把博客以及图片托管迁移到了 cloudflare worker 上来,这样一来可以白嫖到不错的全球加速(除中国大陆),而且使用 workers 进行部署可以省下不少的服务器资源。 这个就是我之前的发布工作流程 在这次部署流程更新后他变成了这样,博客由于是 public 代码仓库,所以我的自动构建直接使用了 github action,只要基于之前的配置改改加上 publish 到 cloudflare workers 的 step 就可以直接用了。 而静态文件托管的我一直是存在自建的 gitea 上面,所以配了个 drone 来执行自动 publish 到 cloudflare workers 的工作,总而言之也是挺香的。 5月1日更新 又更改了下,用上了 vercel 的服务,实测这个服务提供的 cdn 要比 cloudflare 在中国大陆访问的快些。 博客主题更新 博客主题也好久没有更新了,这次更新主要是加上了几个能够改进访问体验的 feature。 添加了首页巨幕以及文章头图图片下面的背景颜色,能够自定义在图片还没有加载出来之前显示的颜色 将博客底部版权信息部分的版本号放进了一个js里面,这样就减少了版本号修改时候需要修改的位置 将原来的文章无头图从几张图片中随机选择一张作为头图改成了随机选择一个颜色作为头图 颜色随机取值这里,是取值RGB都在 110-87之间的值,这里的颜色饱和度比较低,看起来比较舒服

2022-04-17 00:40:00 · 1 min · 49 words · johnpoint

博客迁移到cloudflare踩坑

好久不见,新年开始一直忙着毕业设计和实习找新的工作,一直没有空去将一些折腾过的东西记录成为博客,最近在写毕业设计的间隙终于对博客进行了一波优化,顺便写篇博客记录一下。 在过去的部署中,博客一直是采用多节点部署并且通过dnspod的分地区解析做流量调度,将流量解析到尽量近的节点来尽量保证博客访问的速度。而多个节点之间的博客文件同步一开始用的是定时任务从github上面更新,后来改成了使用syncthing进行同步,这种方法看起来比较蠢,但是也持续的保证了我的博客在这两年期间的顺畅访问。 最近在翻sukka大佬的博客过程中,看到了 cloudflare worker 可以联合 kv 存储用来部署静态网站,于是乎我就先将自托管的图片提供服务(就是一个存了图片的http服务),部署到了 cloudflare 上面,测试速度以及延迟也相当不错,所以就想彻底的把博客这一套东西完全迁移到 cloudflare 上面去。 这样就能保证我博客在我不主动折腾的情况下保证极高的可靠性以及相对不错的响应速度。 404页面异常 在 worker-site/index.js 文件中,有一段逻辑是控制在url无法获取到文件的时候返回 /404.html。但是一部署上去我就发现了不对劲,这个404页面直接源代码显示,并没有被浏览器渲染出来。 经过F12大法查看network的response知道返回的数据中缺少了个指定响应数据格式的header。 修复这个情况只需要在返回响应的时候加上相应的header即可,代码修改可以参考我提的PR 参考链接 将 Hexo 部署到 Cloudflare Workers Site 上的趟坑记录

2022-03-25 13:11:29 · 1 min · 28 words · johnpoint

2021 年度简报

今年真的是变化挺大的一年。我大四了,也算是步入了大学生活的最后一段时间,从三月份开始就离开了学校实习,在实习中我学到了许多,但是也确实占用了我大部分时间用于上班以及学习一些我之前没有学习的在工作中用到的知识和技术。 博客写了啥 在编写那个服务器监控面板的时候我想把服务器上面的进程信息显示在上面,所以顺手写了一个文章 Linux 进程信息格式化 这两篇是我在实习中所学习用到的东西,也写成了文章 proto 通过字段名获取值 用于 gnet 的 Protocol buffers 编解码器 还有两篇是平时折腾的记录 解决全屏背景图卡顿 使用 Zerotier 异地组内网 可以看出来我今年写的博客少了很多,看看明年能不能试试写多一些 代码写了啥 GITHUB 照惯例上绿点图 可以明显的看到今年比去年相比,我的 github 代码提交的不是那么的活跃了。。那是因为实习的时候确实比在学校要忙 今年新写了啥呢 还在维护啥? johnpoint.github.io: 博客的本体 hexo-theme-XvA: 今年更新的也很少,就是更新了一些细节问题,升级了 jq 的版本,改进了 copyright 的样式,修复了背景图片卡顿的问题 博客今年怎么样 今年终于有人评论了! 更新的文章略少,不过貌似还是比去年的文章多一篇,天啊 今年更新了 6 篇文章(包括本文) 友链增加了 0 个大佬 评论 2 条(哇塞,终于有活人来评论了!!虽然我没有回复) 完整数据-Google Sheet 参与了啥活动 GDG devfest GuangZhou(延期了…延期到 2022年1月8日的 2021 GDG devfest,不出啥大问题的话会去的) 看了啥 今年在我心目中排名第一的电影! 《雄狮少年》 无论从画面还是剧情还是音乐都很不错,可能晚点会把刚刚看完就说要写的影评咕出来 绝对不咕 还有啥想说 去年开始的记账习惯最终还是在一次长时间中断记账后放弃了,看来用web记账还是不适合我,用手机记账又在今年的10月份重新开始,希望可以坚持下去吧。 经过我这将近一年的实习,我还是发现有挺多的不足,明年希望有所改进吧。 最后 2021 再见!

2021-12-26 15:11:29 · 1 min · 69 words · johnpoint

使用 Zerotier 异地组内网

众所周知,世界上的 ipv4 地址已经快要枯竭 (错了就当我在瞎掰),所以在国内不是所有的运营商都拥有公网 IP 地址,同时还有许多奇奇怪怪的需求 (比如说想异地联机打红警之类的),想要实现异地组建内网的效果不得不要采取一些特别手段进行组网。其实异地组网的文章有不少,比如柠檬雨大佬的这篇文章 《异地也要玩局域网——使用N2N,实现异地服务器快速组建内网》,中间就用到了一个叫做 N2N 的软件来进行隧道的建立。但是吧,我在想用 N2N 进行组网的时候,遇到了不少问题,首先就是 windows 客户端 v2 版本的我只找到了一个网络博主自己编译的版本,而且国内服务器在获取客户端的时候非常慢。 其中一度不想折腾想着使用那些现成的局域网对战平台来进行游戏 (对就是浩方) 但是下载注册 (这个平台注册居然还要身份证,就离谱,虽然我是用生成的身份证号码注册的) 之后,登录这边一直卡死在 loading,无奈我只能再看看有没有其他的方案。 在一位 (非常非常非常想玩红警3的) 朋友的建议下,我去研究了下 ZeroTier 这个异地组网的解决方案,发现挺方便的。 但是问题来了,在我用上了 ZeroTier 之后,隧道倒是建立了,但是不知道为何,有两个节点相互 ping 不通

2021-11-24 16:25:00 · 1 min · 32 words · johnpoint

用于 gnet 的 Protocol buffers 编解码器

要写一个 TCP 服务端,实现处理在纯 TCP 流中传输的 Protocol buffers 数据。网络框架很早就选好了,用性能杰出的 gnet,问题是 gnet 的示例库里面没有直接解析纯 Protocol buffers 的编解码器,于是乎只能自己动手了… 协议分析 从 TCP 流里面传过来的是经过简单处理的 Protocol buffers 数据,他在数据的头携带了这个数据包的长度信息,像是这样 [ 头 ][ 数据 ][ 头 ][ 数据 ][ 头 ][ 数据 ][ 头 ][ 数据 ][ 头 ][ 数据 ] 调用 golang 的 proto 官方库中的 func DecodeVarint(b []byte) (uint64, int) 方法可以从数据中拿到两个值,分别是 数据的完整长度、标明数据长度的头信息的长度。 由于没有特定的协议在包与包之间进行明显的划分,所以得用他的头数据来进行分包。 解码器 // 储存连接内的相关信息 type DataStruct struct { fullLength int lenNumLength int fullData []byte } func (d *Codec) Decode(c gnet....

2021-09-17 18:30:00 · 4 min · 692 words · johnpoint

解决全屏背景图卡顿

早就在替换了新的主题后(也就是现在用的主题),发现主页滚动的时候特别的卡,但是在滚动部分没有背景图片的时候就不会掉帧,所以判断是背景图片的问题。 而在我替换掉了 fixed 属性之后就又不卡了,从而断定就是这个属性导致博客滚动的时候出现性能问题。 搜索资料发现了这篇文章 Fixed background image performance issue,遂按照其中的方式将背景设置为虚元素,那么在滚动的时候背景就不会频繁的进行重绘,从而解决了滚动到时候出现掉帧的问题,终于在鸽了半年之后让我的博客首页重回丝滑…

2021-07-28 11:44:00 · 1 min · 10 words · johnpoint