Pinned Post

Recent Posts

在本机从 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 应用。

Go 中的枚举

数据库中使用了枚举 enum 来存储订单状态 orders.state,然后在 model/order.go 中一堆状态常量:


type Order struct {
	// ...
	State string
}

const (
	OrderStatePending	= "pending"
	OrderStateLocked	= "locked"
	OrderStatePaid		= "paid"
	OrderStateRevoked	= "revoked"
	OrderStateDone		= "done"
)

既然说到 Go 的枚举,肯定有人要说 iota 了,那么,,用 iota 来实现该功能试试: