添加的 synocommunity 本来是没有问题的,最近发现没法显示相关组件,从新添加提示无效的位置

解决

1
sudo mv /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.bak && sudo curl -Lko /etc/ssl/certs/ca-certificates.crt https://curl.se/ca/cacert.pem

参考:can’t add community repo - “invalid location” error - problem solved

前记

最近在使用 Caddy 的时候出现如下错误

1
2
3
4
5
6
7
8
9
10
Jan 05 02:16:47 C20230104172971 caddy[3271]: HOME=/root
Jan 05 02:16:47 C20230104172971 caddy[3271]: LOGNAME=root
Jan 05 02:16:47 C20230104172971 caddy[3271]: USER=root
Jan 05 02:16:47 C20230104172971 caddy[3271]: SHELL=/bin/sh
Jan 05 02:16:47 C20230104172971 caddy[3271]: INVOCATION_ID=91c06f7e038e4ed2a5e12d9d975650b1
Jan 05 02:16:47 C20230104172971 caddy[3271]: JOURNAL_STREAM=8:26524
Jan 05 02:16:47 C20230104172971 caddy[3271]: {"level":"info","ts":1672885007.9022179,"msg":"using provided configuration","config_file":"/etc/caddy/Caddyfile","config_adapter":""}
Jan 05 02:16:47 C20230104172971 caddy[3271]: run: loading initial config: loading new config: starting caddy administration endpoint: listen tcp 127.0.0.1:2019: bind: cannot assign>
Jan 05 02:16:47 C20230104172971 systemd[1]: caddy.service: Main process exited, code=exited, status=1/FAILURE
Jan 05 02:16:47 C20230104172971 systemd[1]: caddy.service: Failed with result 'exit-code'.

解决

Caddyfile 开头增加下面配置即可

1
2
3
{
admin 0.0.0.0:2019
}

IP

首先找到 google.cn 在大陆可用的 IP,可以利用下面 chinaz

https://ping.chinaz.com/google.cn

尽量找延迟低一点的 IP

Host

修改 HostWindows 如:C:\Windows\System32\drivers\etc\hosts

将下面记录加入到 hosts 文件

1
180.163.151.162 translate.googleapis.com

题外话:Chrome 翻译插件可以用火山翻译,字节出品还比较好用

Go 语言中生成特定长度和特定组合的密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package utils

import (
"fmt"
"math/rand"
"time"
)

const (
NUmStr = "0123456789"
CharStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
SpecStr = "!@#$%&"
)

func GeneratePasswd(length int, charset string) string {
var passwd []byte = make([]byte, length, length)
var sourceStr string

if charset == "num" { // 数字
sourceStr = NUmStr
} else if charset == "char" { // 字母
sourceStr = charset
} else if charset == "mix" { // 数字、字母混合模式
sourceStr = fmt.Sprintf("%s%s", NUmStr, CharStr)
} else if charset == "advance" { // 数字、字母、字符混合模式
sourceStr = fmt.Sprintf("%s%s%s", NUmStr, CharStr, SpecStr)
} else {
sourceStr = NUmStr
}
// fmt.Println("source:", sourceStr)

// 生成密码
rand.Seed(time.Now().UnixNano())
for i := 0; i < length; i++ {
index := rand.Intn(len(sourceStr))
passwd[i] = sourceStr[index]
}
return string(passwd)
}

前记

本地 Windows,在做 k8s kubebuilder 开发的时候是在本机安装一台 Cnetos 虚拟机来作为开发环境,这个时候就需要用到远程开发了

安装

1、Vscode 上安装 Remote - SSH 插件

2、设置配置文件

1
2
3
4
5
6
7
8
# 配置文件路径
# C:\Users\jakehu\.ssh\config

# 配置文件格式
Host kubebuilder
HostName 10.113.73.205
User root
Port 22

3、配置免密登陆

将本地公钥 C:\Users\jakehu\.ssh\id_rsa.pub 放入服务器 ~/.ssh/authorized_keys 即可


Remote 参考

前记

虚拟机是 Centos,利用桥接模式进行网络连接,输入 ip a s 命令 ens33 网卡没有 IP 地址

解决

修改配置文件:

1
vi /etc/sysconfig/network-scripts/ifcfg-ens33

修改如下配置:

1
ONBOOT=yes

重启:

1
reboot

题外话:

安装 VMware Tools

前记

昨天在 Windows 上成功安装了 kubebuilder 但是在最后 make install 环节一直过不去,想想算了,还是用 Centos

依赖

这是官方给出的需求依赖

1
2
3
4
go version v1.17.9+
docker version 17.03+.
kubectl version v1.11.3+.
Access to a Kubernetes v1.11.3+ cluster.

GO

1
2
3
4
wget https://go.dev/dl/go1.18.4.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.4.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

Docker

Centos Docker 安装文档

1
2
# 自启动Docker
systemctl enable docker.service

K8S

Minikube 安装

问题 1:X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.

1
minikube start --force --driver=docker

kubebuilder

kubebuilder 安装


到此 kubebuilder 环境就算搭建完成

Cygwin

安装

Cygwin 就是一个 Windows 软件,该软件就是在 Windows 上仿真 Linux 操作系统

基础模块:BaseDevelLibsNetSystemUtils

这里我们安装 BaseDevel 就够了

Cygwin 包可以通过 UI 界面进行安装,也可以通过将下载来下来的 exe 文件放在 C:\cygwin64\bin 目录下

Cygwin 镜像

包管理

除了上面说的,我们还可以使用第三发的包管理工具 apt-cyg

安装:

1
2
3
curl -O https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg
mv apt-cyg /bin/apt-cyg
chmod +x /bin/apt-cyg

使用:

1
apt-cyg install wget

Kubebuilder

依赖

1
2
3
4
go version v1.17.9+
docker version 17.03+.
kubectl version v1.11.3+.
Access to a Kubernetes v1.11.3+ cluster.

还需要安装 Make

1
apt-cyg install make

安装

1
2
3
git clone git@github.com:kubernetes-sigs/kubebuilder.git
cd kubebuilder
make install

位置

1
2
which kubebuilder
/cygdrive/c/Users/jakehu/go/bin/kubebuilder

使用

1
2
go mod init jakehu.me
kubebuilder init --domain jakehu.me

目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
tree
.
├── Dockerfile
├── Makefile
├── PROJECT
├── README.md
├── config
│   ├── default
│   │   ├── kustomization.yaml
│   │   ├── manager_auth_proxy_patch.yaml
│   │   └── manager_config_patch.yaml
│   ├── manager
│   │   ├── controller_manager_config.yaml
│   │   ├── kustomization.yaml
│   │   └── manager.yaml
│   ├── prometheus
│   │   ├── kustomization.yaml
│   │   └── monitor.yaml
│   └── rbac
│   ├── auth_proxy_client_clusterrole.yaml
│   ├── auth_proxy_role.yaml
│   ├── auth_proxy_role_binding.yaml
│   ├── auth_proxy_service.yaml
│   ├── kustomization.yaml
│   ├── leader_election_role.yaml
│   ├── leader_election_role_binding.yaml
│   ├── role_binding.yaml
│   └── service_account.yaml
├── go.mod
├── go.sum
├── hack
│   └── boilerplate.go.txt
└── main.go

6 directories, 25 files

kubebuilder 文档

题外话:make 下载失败的时候请走代理

1
2
export http_proxy="127.0.0.1:10809"
export https_proxy="127.0.0.1:10809"

需求

需要构建的 SQL 条件如下:

1
where field1 in (1,2) and field2 not in (1,3) and (field3 like "%test%" or field4 like "%test%")

非动态

如果是非动态其实还是比较好实现的

1
2
where = Q(field1__in=(1,2)) & ~Q(field2__in=(1,3)) & (Q(field3__icontains="test") | Q(field4__icontains="test"))
MyObject.objects.filter(where)

动态实现

1
2
3
4
5
6
7
8
9
10
Q1 = Q()
if request.query_params.get("group_id") is not None:
Q1.add(Q(cid_id__in=[1,2]), Q.AND) # 1,2 is the group_id
Q1.add(~Q(id__in=[1,2]), Q.AND)
Q2 = Q()
if request.query_params.get("name") is not None:
Q2.add(Q(schema__icontains=request.query_params.get("name")), Q.OR)
Q2.add(Q(cid__host__icontains=request.query_params.get("name")), Q.OR)
Q2.add(Q(cid__env__name__icontains=request.query_params.get("name")), Q.OR)
MyObject.objects.filter(Q1 & Q2)

上面实现中 cid 为外键 cid_id 为外键表 id 字段,cid__env__namecid 外键表的外键表 env 的字段 name

前记

最近在用 Go 做一个小程序,需要生成一个 6 位数随机验证码,遂记录一下实现

实现

Go 生成特定长度的随机数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import (
"fmt"
"math/rand"
"strings"
"time"
)

func main() {
fmt.Println(RandomNumber(6))
}

// width 表示需要的位数
func RandomNumber(width int) string {
numeric := [10]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
r := len(numeric)
rand.Seed(time.Now().UnixNano())

var sb strings.Builder
for i := 0; i < width; i++ {
fmt.Fprintf(&sb, "%d", numeric[rand.Intn(r)])
}
return sb.String()
}