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

proto 通过字段名获取值

很久没有更新博客了,一方面是出去实习比在学校的时候忙,真的很多东西等着我去学,太可怕了,另一方面就是懒 protobuf 真是个好东西,就是在你不知道具体结构的时候想要拿到特定字段的值有点小麻烦,好不容易折腾出来了,写篇博客记录一下 func FindByName(name string, msg protoreflect.Message) (has bool, value protoreflect.Value, isList bool) { if name == "" { return false, *new(protoreflect.Value), false } msgDesc := msg.Descriptor() for i := 0; i < msgDesc.Fields().Len(); i++ { if msgDesc.Fields().Get(i).Kind() == protoreflect.MessageKind { sonMsg := msgDesc.Fields().Get(i) has, value, isList = FindByName(name, msg.Get(sonMsg).Message()) // type mismatch: cannot convert list to message if has { return has, value, isList } } if msgDesc.Fields().Get(i).Name() == protoreflect....

2021-06-11 15:48:00 · 1 min · 173 words · johnpoint

Linux 进程信息格式化

2021 年了,转头看了下自己的服务器面板,发现还是那个半成品的样子…于是在这三天改了下代码,加入了 v2 api 接口,这个接口主要使用 Websocket 进行通信,虽然说服务端的压力其实不是很大,但是使用轮询进行数据的更新不仅会看到一坨一坨的请求,对我的渣渣电脑来说也有些吃力了,不过这篇文章的内容不是这个,改天再开一篇文章记录一下。 进程查看其实是很早之前就想做进面板的功能之一,但是受限于并没有找到现成的 go 第三方或者官方库,所以就放了一放 (结果放了差不多一年),刚好这几天在改面板的代码,索性就顺手把它做了。 进程查看没有库可以调用,就只能通过调用系统命令来进行查看,一般来说我看进程会使用 ps -aux,但是对于面板来说,这里输出的数据有点太多以及有点太乱(太乱指的是输出的数据不是计算机友好型结构),然后看了下网上网友们五花八门的命令,左拼右凑之后,最后成品是用的 ps axc -o pid,user,stat,pcpu,pmem,command --sort -pcpu --no-header | sed 's/\ \+/\ /g' 最终得到的数据是没有表头、连续空格被替换成一个空格的数据,我感觉这就够了,其余的交给前端处理。 前端代码截取如下 let ps = server.Ps.split('\n'); ps.forEach(item = >{ if (item.split(" ").length > 3) { item = item.split(" ") if (item[0] === "") { item = item.slice(1, item.length) } let i = { PID: item[0], User: item[1], State: item[2], Pcpu: item[3], Pmem: item[4], Command: item....

2021-02-02 21:20:00 · 1 min · 79 words · johnpoint

2020 年度简报

2020 年的开头我们并不知道接下来的这一年是那么的艰难,幸好春节前我就已经在某些地方得知了疫情的消息并且准备了一些口罩,减轻了疫情高峰期时口罩的使用压力。 Bilibili 跨年晚会仿佛就发生在昨天,又到了 2020 年的圣诞节,得开始写年度总结了,总感觉这一年啥都没有干就到年末了( ...

2020-12-23 11:11:29 · 1 min · 133 words · johnpoint

NodeMCU 制作桌面天气时钟

其实我眼馋青萍空气检测仪很久了,但是要700+的价格实在是下不了手,于是萌生了自己做一个类似的桌面摆件的想法,一方面是想尝试下制作包含硬件的小玩意,一方面确实是想整一个摆件放在桌面。 ...

2020-12-02 23:00:37 · 1 min · 112 words · johnpoint