Pinned Post

Recent Posts

ZeroTier 创建私有服务器节点(Moon节点)

没有公网 IP 的 NAS 无异于被阉割的太监。现在各运营商对公网 IP 管理政策来看怕是不会再有了,所以还是另寻它路。

目前常见的有 FRP、NPS、 ZeroTier 等方案。

FRP 是自己搭建一个公网服务器,所有流量经过公网服务器中转。ZeroTier 默认使用官方的一组根服务器进行节点查找。

ZeroTier 也允许自己在服务器上搭建自己的节点,这种节点称之为 moon 节点。 (官方根节点称之为行星节点,自建节点叫月球节点,很合情合理是吧 )

定义自己的 moon 世界

首先使用官方脚本安装 ZeroTier:

curl -s https://install.zerotier.com/ | sudo bash

安装完成后会自动创建服务,并且显示节点 ID:


Created symlink /etc/systemd/system/multi-user.target.wants/zerotier-one.service → /lib/systemd/system/zerotier-one.service.

*** Enabling and starting ZeroTier service...
Synchronizing state of zerotier-one.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable zerotier-one

*** Waiting for identity generation...

*** Success! You are ZeroTier address [ abcxxxxx123 ].

ZeroTier 将被安装在 /var/lib/zerotier-one/ 位置,该目录下包含自己的身份信息文件 identity.publicidentity.secret (相当于公钥和私钥)。

使用 zerotier-idtool 工具从 identity.public 生成 moon 配置文件 moon.json

zerotier-idtool initmoon /var/lib/zerotier-one/identity.public >> moon.json

生成的 moon.json 文件结构如下:

{
 "id": "3f80270f25",
 "objtype": "world",
 "roots": [
  {
   "identity": "xxxx",
   "stableEndpoints": []
  }
 ],
 "signingKey": "xxxx",
 "signingKey_SECRET": "xxxx",
 "updatesMustBeSignedBy": "xxxx",
 "worldType": "moon"
}

编辑上一步生成的 moon.json 文件中的 roots 部份,向 roots.stableEndpoints 部份添加稳定节点信息:

{
  "stableEndpoints": [ "服务器IP:9993" ]
}

使用 zerotier-idtool genmoon moon.json 命令得到一个签名后的文件(使用 moon.json 中定义的密钥签名),文件名类似于: 000000<nodeID>.moon

加入自己的 moon

在各节点,安装完 ZeroTier 后, 在程序安装目录(Linux:/var/lib/zerotier-one、 Mac: /Library/Application Support/ZeroTier/One )内创建名为 moons.d 的目录,将上一步在服务器节点生成的类似于 000000<nodeID>.moon 的文件复制到 moons.d 目录内。

在其它节点,可以通过2种方式加入到 moon 节点: - 将上面创建的世界定义文件 000000<nodeID>.moon 复制到节点自己的 moons.d 目录,并重启服务; - 使用命令 sudo zerotier-cli orbit 000000<nodeID> 000000<nodeID> 加入 moon, orbit 命令的第1个参数是 Moon 节点ID(moon.json 文件的 id 字段), 第2个参数是 moon.json 文件中 roots 字段定义的任意节点,可以与第1个参数相同。

验证

然后在常规节点使用 sudo zerotier-cli listpeers 查看节点时,就能看到 moon 节点的类型已经从 LEAF 变成了 MOON

在本机从 tmux 中 SSH 连接到服务器后,再在服务器上的 tmux 操作(tmux 套娃),
如果此时想在服务端的 tmux 中脱离或者查看窗口之类的操作,由于 ctrl+b 会被本地的 tmux 捕获所以相关操作只会发生在本地,

解决办法:按两次 ctr+b 作为前缀按键。

有需求的上NAS,没需求的创造需求上NAS

my first nas

成都疫情期间(2022.09.01 - 15?) 关在家里折腾了一段时间的 NAS。

对了,
我使用了新的域名: https://wang.mx

之前把这个博客程序的源码 在 github 上开源了
今天下班路上居然收到了朋友发来的 PR :)

我本以为会是使用过程中发现的 bug 或者功能改善,
点开一看居然是一个面向新用户的安装脚本功能(初始表结构、账户信息等)。
有心了!我之前都没考虑过说会有别人来使用 -_-.

tmux 修改配置文件 ~/.tmux.conf 更改快捷键前缀绑定后,并未生效。

需要重启 tmux 服务进程让它重新解析配置。 可使用以下三种方法之一:

  • tmux kill-server

  • tmux source-file ~/.tmux.conf

  • 或者在 tmux 中:C-b :source-file ~/.tmux.conf

使用 adb 给安卓设备安装应用

brew install --cask android-platform-tools 

adb usb

adb devices -l

设备标识  状态[offline||device|no device]   说明 

adb install -s 设备标识 -r ~/Downloads/carplay-20211105.apk

adb shell pm list packages

开启 tcp bbr

折腾了一下,开启 bbr 后对网速提升非常明显。

首先 uname -r 查看内核是否在 4.9 以上。

执行 lsmod | grep bbr,如果结果中没有 tcp_bbr 则执行:


modprobe tcp_bbr
echo "tcp_bbr" |  tee --append /etc/modules-load.d/modules.conf


echo "net.core.default_qdisc=fq" |  tee --append /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" |  tee --append /etc/sysctl.conf

使用 sysctl -p 从配置文件加载内核参数使其立即生效。

验证设置是否生效:

执行:

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

如果结果都有 bbr ,说明开启成功。执行 lsmod | grep bbr,看到有 tcp_bbr 模块即说明 BBR 已启动。

samber/lo 基于 Go1.18+ 泛型的各种数据类型操作的库。

其包含的方法主要可以分为以下几类:

1、slice 辅助方法
2、map 辅助方法
3、tuples 辅助方法
4、多个集合之间计算辅助方法
5、搜索查询辅助方法
6、其他函数式编程辅助方法等

使用以太坊地址登录网页

前端使用 web3.js 获取用户地址并进行签名。

后端使用 go-ethereum 库校验签名是否来自指定地址,大致校验流程:

  • 通过明文的HASH和签名数据算出公钥
  • 通过公钥还原出地址
  • 校验还原出来的地方是否与用户指定地址相同

玩了几天的 ESP32 下来,那些羁绊我前行的因素,一半是各协议、引脚问题,另一半就是关于 C 语言的一些坑了(是的,我确实用得很不熟练 🤦🏾‍)。

然后尝试了下用 TinyGo 来写,瞬间畅快了许多。不过现在的问题是 TinyGo 对 ESP32 这块芯片(包括基于该芯片的所有板子)的支持并不好,许多功能(比如:I2C、ADC、PWM、WiFi、蓝牙)目前都还不支持。看了下 TinyGO 对各板子的支持情况,貌似对 Adafruit 家的板子、树梅派支持度是最高的。(附: TinyGo 对各微控制器的支持情况 - https://tinygo.org/docs/reference/microcontrollers/

所以,我是该入手一块树莓派 Pico 了吗?
—— 然而这货的配置真的比 ESP32 低太多啊(🤦🏾‍),而且 ESP32 还有WIFI、蓝牙……

啊,我被这开发板的引脚折腾哭了……

试玩微控制器开发:ESP32 初体验

以前在项目中有过几次需要涉及物联网的东东,但当时对微控制器开发这块完全不了解,以至于做方案时信心不足。
最新终于闲下来了,想试试这方面的开发,于是买了两块乐鑫 ESP32-C3 开发板玩

microcontroller

在 MacOS 中制作 Manjaro/Ubuntu 等 Linux 发行版的U盘启动镜像

  1. 下载需要安装的 Linux 发行版镜像( 比如这里的: manjaro-xfce-21.2.2-220123-linux515.iso )
  2. 使用 hdiutil 转换格式: hdiutil convert -format UDRW -o manjaro.iso manjaro-xfce-21.2.2-220123-linux515.iso
  3. 将上一步得到的 dmg 文件重命名: mv manjaro.iso.dmg manjaro.iso
  4. 插入U盘,使用磁盘工具抹掉该U盘
  5. 通过 diskutil list 找到U盘 (比如我这里得到的 /dev/disk4
  6. 通过 diskutil unmountDisk /dev/disk4 取消U盘的挂载
  7. 使用 sudo dd if=./manjaro.iso of=/dev/disk4 bs=2m 命令将镜像文件复制到目标U盘
  8. 漫长的等待后,系统会提示无法连接指定U盘,此时选择选择弹出即可

在 zsh 中为 git 使用 GPG 签名遇到的问题

最近在 git 提交某些关键代码时就在想着要是别人冒充我的名义提交了代码怎么办,于是就折腾起 git commit 的签名。

go-shadowsocks2
A fresh implementation of Shadowsocks in Go

https://github.com/shadowsocks/go-shadowsocks2

Go 中使用 singleflight 防止缓存击穿

一个典型的使用缓存的案例:

// GetConfig 获取 key 指定的配置项
func GetConfig(key string) (Config, bool) {
	cacheKey := "cfg:" + key
    
    // 如果缓存中查到则直接返回缓存数据
	if v, has := Cache().Get(cacheKey); has {
		if cfg, ok := v.(Config); ok {
			return cfg, true
		}
	}

    // 不在缓存中则从数据库中查找
	cfg := Config{}
	if err := DB().Where("`key`=?", key).First(&cfg).Error; err != nil {
		return cfg, false
	}

    // 将数据库中查到的值写入缓存, 300 秒过期
	Cache().Store(cacheKey, cfg, 300)
	return cfg, true
}

但这样存在一个问题: 如果 300 秒缓存过期时,有大量并发产生,将会导致这些并发在缓存中都找不到数据去查数据库的情况,从而发生所谓的缓存击穿。

MacOS 查看 CPU 具体型号: sysctl -n machdep.cpu.brand_string

qmcdump QQ音乐解码器。

ncmdump 网易云音乐解码器。

unlock-music Unlock encrypted music file in browser. 在浏览器中解锁加密的音乐文件。 这货好像能解码国内主流音乐媒体格式。

Setapp 合租-应用推荐

整理我常用的 Setapp 应用。