hqplayer和roon二合一

第1步:安装并配置宿主机(Debian)

1.安装Debian:从Debian官网下载网络安装镜像,进行最小化安装。在软件选择时,只勾选“SSH server”和“Standard system utilities”。

2.更新系统:

1
sudo apt update && sudo apt upgrade -y

3.安装必要工具:

1
sudo apt install -y p7zip-full squashfs-tools systemd-container

p7zip-full用于解压7z文件,systemd-container提供了更现代的容器化管理工具(但我们仍会使用传统chroot)

第2步:准备HQPlayer OS的chroot环境

1.创建工作目录:

1
sudo mkdir -p /opt/hqplayer-chroot

2.解压HQPlayer Embedded:

1
sudo 7z x hqplayer-embedded-5.8.1-x64sse42.7z -o/opt/hqplayer-chroot

这会在/opt/hqplayer-chroot下得到hqplayer-embedded-5.8.1/文件夹,里面包含bin, lib, usr等目录。这就是我们chroot的基础。
我们需要把它挂载到一个临时目录,然后复制其中的所有文件。

1
2
# 创建挂载点
sudo mkdir -p /mnt/hqplayer-image

3.挂载镜像中的分区
您需要先找到镜像中的分区偏移量,然后挂载正确的分区。
第1步:查看镜像的分区信息

1
sudo fdisk -l hqplayer-embedded-5.8.1-x64sse42.img

fdisk 输出显示镜像中有两个分区:
分区1:Start=2048, Size=27.8M, Type=”Microsoft basic data” (这很可能是EFI系统分区)
分区2:Start=59392, Size=3G, Type=”Linux filesystem” (这是我们要的根文件系统分区)
挂载分区(分区2)

1
2
3
4
5
# 计算分区2的偏移量 (59392 sectors * 512 bytes/sector)
OFFSET=$((59392 * 512))

# 挂载分区2到挂载点
sudo mount -o loop,offset=$OFFSET hqplayer-embedded-5.8.1-x64sse42.img /mnt/hqplayer-image

复制文件到chroot目录

1
2
3
4
5
6
7
8
# 查看挂载的内容
ls -la /mnt/hqplayer-image/

# 复制所有文件到chroot目录(保留权限和属性)
sudo cp -a /mnt/hqplayer-image/* /opt/hqplayer-chroot/

# 卸载镜像
sudo umount /mnt/hqplayer-image

4.创建必要的系统目录:

1
2
sudo mkdir -p /opt/hqplayer-chroot/{proc,sys,dev,run,var/lib,etc,tmp}
sudo chmod 1777 /opt/hqplayer-chroot/tmp

5.复制DNS解析配置:

1
sudo cp /etc/resolv.conf /opt/hqplayer-chroot/etc/

6.让 chroot 环境访问主机音频设备
首先识别音频设备

1
2
3
4
5
6
7
8
# 在宿主机上查看所有音频设备
aplay -l

# 或者使用更详细的方式
cat /proc/asound/cards

# 查看 USB 音频设备详情
lsusb | grep -i audio

可以看到您的音频设备配置:

card 0: AB13X USB Audio (USB DAC) - 这是您的外部USB音频设备

card 1: Ensoniq AudioPCI - 这是主板内置声卡

现在让我们确保chroot环境中的HQPlayer能够访问这些设备。

配置chroot环境访问USB DAC, 修改启动脚本确保正确映射

第3步:配置chroot环境

我们需要一个脚本来自动挂载必要的文件系统并进入chroot。

创建挂载和进入chroot的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo nano /usr/local/bin/start-hqplayer-chroot.sh
#!/bin/bash
HQPLAYER_ROOT="/opt/hqplayer-chroot"

# 挂载必要的文件系统
mount --bind /proc "$HQPLAYER_ROOT/proc"
mount --bind /sys "$HQPLAYER_ROOT/sys"
mount --bind /dev "$HQPLAYER_ROOT/dev"
mount --bind /dev/pts "$HQPLAYER_ROOT/dev/pts"
mount --bind /dev/snd "$HQPLAYER_ROOT/dev/snd"
mount --bind /run "$HQPLAYER_ROOT/run"

# 确保USB设备可访问(重要!)
mount --bind /dev/bus/usb "$HQPLAYER_ROOT/dev/bus/usb" 2>/dev/null || true

# 确保使用最新的DNS配置
cp /etc/resolv.conf "$HQPLAYER_ROOT/etc/resolv.conf"

# 运行HQPlayer
exec chroot "$HQPLAYER_ROOT" /usr/bin/hqplayerd

停止脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo nano /usr/local/bin/stop-hqplayer-chroot.sh
#!/bin/bash
HQPLAYER_ROOT="/opt/hqplayer-chroot"

# 杀死所有hqplayerd进程
pkill -9 -f "hqplayerd" 2>/dev/null

# 卸载文件系统(确保正确的顺序)
umount -f "$HQPLAYER_ROOT/dev/bus/usb" 2>/dev/null
umount -f "$HQPLAYER_ROOT/dev/snd" 2>/dev/null
umount -f "$HQPLAYER_ROOT/dev/pts" 2>/dev/null
umount -f "$HQPLAYER_ROOT/dev" 2>/dev/null
umount -f "$HQPLAYER_ROOT/sys" 2>/dev/null
umount -f "$HQPLAYER_ROOT/proc" 2>/dev/null
umount -f "$HQPLAYER_ROOT/run" 2>/dev/null

sleep 2

设置正确的权限

1
2
3
4
sudo chmod +x /usr/local/bin/start-hqplayer-chroot.sh
sudo chmod +x /usr/local/bin/stop-hqplayer-chroot.sh

sudo systemctl daemon-reload

重新加载并测试服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重新加载systemd配置
sudo systemctl daemon-reload

# 手动测试启动脚本
sudo /usr/local/bin/start-hqplayer-chroot.sh

# 检查hqplayerd是否运行
ps aux | grep hqplayerd

# 检查端口监听
sudo ss -tlnp | grep :8088

# 如果运行正常,停止它
sudo /usr/local/bin/stop-hqplayer-chroot.sh

系统使用的是 cgroup2(统一层次结构),而不是传统的cgroup1。这可能是导致服务启动失败的原因,因为一些旧的应用或脚本可能不完全兼容cgroup2。
第1步:检查系统是否支持cgroup1

1
2
3
4
5
# 检查是否启用了cgroup1兼容性
cat /proc/filesystems | grep cgroup

# 检查内核启动参数
cat /proc/cmdline

修改systemd服务文件以兼容cgroup2

1
sudo nano /etc/systemd/system/hqplayer-chroot.service

使用以下配置:

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
[Unit]
Description=HQPlayer Embedded Daemon in Chroot
After=network.target
Requires=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/start-hqplayer-chroot.sh
ExecStop=/usr/local/bin/stop-hqplayer-chroot.sh
Restart=on-failure
RestartSec=5
TimeoutStartSec=300
TimeoutStopSec=30

# 关键配置:禁用所有cgroup相关功能
Delegate=no
CPUAccounting=no
MemoryAccounting=no
IOAccounting=no
TasksAccounting=no
IPAccounting=no
BlockIOAccounting=no

# 避免cgroup2相关问题
#Slice=
#ControlGroup=
[Install]
WantedBy=multi-user.target

启动服务并检查

1
2
sudo systemctl start hqplayer-chroot.service
systemctl status hqplayer-chroot.service

dns或者删除符号链接并创建实际文件

1
2
3
4
5
6
7
8
# 删除符号链接
sudo rm /opt/hqplayer-chroot/etc/resolv.conf

# 创建实际的 resolv.conf 文件
sudo cp /etc/resolv.conf /opt/hqplayer-chroot/etc/resolv.conf

# 确认现在是普通文件
ls -la /opt/hqplayer-chroot/etc/resolv.conf

第4步:执行精简

首先查看当前大小

1
sudo du -sh /opt/hqplayer-chroot/ --exclude=proc --exclude=sys --exclude=dev --exclude=run

删除最大的文件(镜像文件)

1
2
3
4
5
6
# 删除原始镜像文件(节省最多空间)
sudo rm /opt/hqplayer-chroot/hqplayer-embedded-5.8.1-x64sse42.img
sudo rm /opt/hqplayer-chroot/hqplayer-embedded-5.8.1-x64sse42.7z

# 删除备份文件(如果有)
sudo rm -rf /opt/hqplayer-chroot-backup 2>/dev/null || true

删除firmware文件

1
2
# 删除firmware(通常不需要)
sudo rm -rf /opt/hqplayer-chroot/lib/firmware

查看精简效果

1
2
3
4
5
6
7
8
# 查看当前大小
sudo du -sh /opt/hqplayer-chroot/ --exclude=proc --exclude=sys --exclude=dev --exclude=run

# 查看各目录大小
sudo du -sh /opt/hqplayer-chroot/* --exclude=proc --exclude=sys --exclude=dev --exclude=run | sort -hr

# 查看usr目录大小
sudo du -sh /opt/hqplayer-chroot/usr/*

验证功能正常

1
2
3
4
5
6
7
8
9
10
11
# 重启HQPlayer服务测试
sudo systemctl restart hqplayer-chroot.service

# 检查服务状态
systemctl status hqplayer-chroot.service

# 测试音频功能
sudo chroot /opt/hqplayer-chroot aplay -l

# 测试网络功能
sudo chroot /opt/hqplayer-chroot /bin/bash -c "ping -c 2 8.8.8.8"
l

CentOS7 源码安装redis4

1. 安装编译依赖

1
2
3
# 安装开发工具和依赖
sudo yum groupinstall "Development Tools" -y
sudo yum install wget tcl -y

2. 下载并编译 Redis 4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建安装目录
sudo mkdir -p /usr/local/redis
cd /usr/local/src

# 下载 Redis 4.0.14(最后一个 4.x 版本)
sudo wget http://download.redis.io/releases/redis-4.0.14.tar.gz

# 解压
sudo tar xzf redis-4.0.14.tar.gz
cd redis-4.0.14

# 编译安装
sudo make
sudo make install

# 创建配置目录
sudo mkdir -p /etc/redis
sudo mkdir -p /var/lib/redis
sudo mkdir -p /var/log/redis

3. 配置 Redis 服务

复制配置文件

1
2
3
4
5
# 复制配置文件
sudo cp /usr/local/src/redis-4.0.14/redis.conf /etc/redis/

# 复制服务脚本
sudo cp /usr/local/src/redis-4.0.14/utils/redis_init_script /etc/init.d/redis

修改配置文件

1
2
# 编辑 Redis 配置
sudo vim /etc/redis/redis.conf

主要修改以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 以守护进程方式运行
daemonize yes

# 绑定地址(允许远程连接)
bind 0.0.0.0

# 端口
port 6379

# 数据目录
dir /var/lib/redis

# 日志文件
logfile "/var/log/redis/redis.log"

# 设置密码(可选)
# requirepass yourpassword

# 最大内存
maxmemory 256mb
maxmemory-policy allkeys-lru

修改服务脚本

1
sudo vim /etc/init.d/redis

修改以下部分:

1
2
3
4
5
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis.conf"

4. 创建系统服务

创建 systemd 服务文件

1
sudo vim /etc/systemd/system/redis.service

添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
User=root
Group=root
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
PIDFile=/var/run/redis_6379.pid

[Install]
WantedBy=multi-user.target

5. 设置权限和启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建 Redis 用户(可选)
sudo useradd -r -s /bin/false redis

# 设置目录权限
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis

# 重新加载 systemd
sudo systemctl daemon-reload

# 启动 Redis 服务
sudo systemctl start redis

# 设置开机自启
sudo systemctl enable redis

# 检查服务状态
sudo systemctl status redis

6.验证安装

1
2
3
4
5
6
7
8
9
10
11
12
# 检查 Redis 版本
redis-cli --version
redis-server --version

# 测试连接
redis-cli ping

# 如果设置了密码
redis-cli -a yourpassword ping

# 查看 Redis 信息
redis-cli info server

防火墙配置(如果需要远程访问)

1
2
3
# 开放 Redis 端口
sudo firewall-cmd --permanent --add-port=6379/tcp
sudo firewall-cmd --reload
l

mac10.15 下 git2.33 安装 git-gui

1.软件版本

macOS系统:10.15.7

Git:2.33.0

Git-gui:2.42.1

Tcl-tk:8.6.12

2.环境安装

  1. Mac10.15安装git2.33的dmg包

git2.33下载链接git-2.33.0-intel-universal-mavericks.dmg (huaweicloud.com)

  1. Tcl-tk环境安装

git-gui 2.42.1依赖tcl-tk@8版本的UI库,使用brew install tcl-tk@8安装。

记住tcl-tk@8的安装目录,下面需要用到。brew安装的默认目录:

1
/usr/local/Cellar/tcl-tk@8

3.安装git-gui 2.42.1

  1. brew 不支持旧版git-gui安装了,需要到git-gui仓库下载2.42.1版本的 git-gui.rb文件

这是下载链接:git-gui.rb,如下图所示。

文件下载完,如果下载目录在~/Download里,就用brew install ~/Download/git-gui.rb安装。

  1. git-gui安装完,可能报git-gui 依赖tcl-tk 8.5,现在使用的是9.0版本的错误。

使用以下2条指令解决,这里就要用到上面第2步tcl-tk@8的安装目录

1
2
sudo sed -i '' '1s|.*|#!/usr/local/Cellar/tcl-tk@8/8.6.17/bin/wish8.6|' /usr/local/bin/git-gui
sudo sed -i '' '1s|.*|#!/usr/local/Cellar/tcl-tk@8/8.6.17/bin/wish8.6|' /usr/local/bin/gitk
l

parallels+desktop+linux共享文件夹,Parallels Desktop共享本机目录给虚拟机

本文详细介绍了在CentOS7虚拟机环境中安装ParallelsTools的过程,包括设置CD/DVD源、调整启动顺序及手动挂载镜像文件等步骤,并提供了升级ParallelsTools的方法。

我的虚拟机环境:centOS7

需要先安装Parallels Tools

先停止centos并设置cd/dvd源

8ca47c6e08db940329488b788cd0968e.png

Parallels Tools镜像文件在 位置 /Applications/Parallels Desktop.app/Contents/Resources/Tools/

Parallels Tools区分多个平台(windows,mac,linux)

由于用的是centOS,所以这里选择 prl-tools-lin.iso

进入安装Parallels Tools流程的方法

方法一:在Virtual Machine上点击 安装 Parallels Tools (有时候会不生效,建议使用方法二)

方法二:调整启动顺序,把CD/DVD调到第一位,接着是硬盘,然后reboot重启虚拟机

6a2b4247e3cb0a8a7987a490d8b85b13.png

cd /media

ls

此时看不到任何内容

手动创建

mkdir cdrom

再挂载到cdrom

mount -o exec /dev/cdrom /media/cdrom

(这里需要注意的是/dev/cdrom是否存在,有时是cdrom1)

此时看到 mount: block device /dev/sr0 is write-protected, mounting read-only 提示说明挂载成功

cd /media/cdrom

ls

可以看到‘ install installer install-gui kmods tools version ’等文件

执行安装

./install

dd44b494d24d4c3a48d02435c541d484.png

等待安装完成即可

ab2391807425d4e7f58ed6f55dec6f55.png

在Parallels Desktop菜单栏先停止该虚拟机

设置本机共享文件夹

55239c1dca6e8b1b3f229751488bc1ad.png

97562408f5e1fddbae3db6c6d209ff28.png

设置完共享目录再重启该虚拟机

cd /media/psf

ls

即可看到本机共享的文件夹

建立软连接

一般为了方便访问,我都是通过/website来访问本机的共享文件夹的

ln -s /media/psf/website /

cd /

ls

看到website就算建立连接了。

如果升级了Parallels Desktop版本,那么也要对应升级Parallels Tools,升级Parallels Tools的方法跟前面安装Parallels Tools的方法是一样的,界面会提示进行的操作是upgrade

正常使用建议改成优先硬盘启动

详情可查看官方文档

l

使用 SSH config 简化 SSH 连接

如果你有很多的服务器要连接,如果对你来说记住那些服务器的地址、端口实在是一种痛苦,如果你一直在寻找一种能够简化在命令行下连接 SSH 服务器的办法,那么,本文将给你提供一种解决问题的思路,那就是,使用 SSH 的 config 文件。

SSH config 文件是什么

Open SSH 客户端配置文件,允许你以配置项的形式,记录各个服务器的连接信息,并允许你使用一个定义好的别名来代替其对应的 ssh 命令参数。

SSH config 文件该怎么用

创建 SSH config 文件

通常来说,该文件会出现在两个地方,一个是/etc/ssh/ssh_config,一个是~/.ssh/config

/etc/ssh/ssh_config文件通常用来定义全局范围上的 SSH 客户端参数,而~/.ssh/config则被用来定义每个用户自己的 SSH 客户端的配置。我们将要修改的,就是位于用户目录下的 config 文件。

如果~/.ssh/config文件不存在,那么也不用着急,这是正常的,只需要执行如下命令,即可新建一个空白的 config 文件

1
2
3
4
5
6
7
8
9
10
11
# 创建 .ssh 目录(如果已存在,会提示没关系)
mkdir -p ~/.ssh

# 设置正确的权限,SSH 对文件权限非常严格
chmod 700 ~/.ssh

# 创建 config 文件(或编辑已存在的)
touch ~/.ssh/config

# 设置 config 文件的权限
chmod 600 ~/.ssh/config

在本地电脑上生成一个 RSA 类型的密钥对

生成一个 RSA 类型的密钥对,包含一个私钥(id_rsa.centos)和一个公钥(id_rsa.centos.pub

1
ssh-keygen -t rsa -b 2048 -C "centos" -f ~/.ssh/id_rsa.centos

执行后会询问你三个问题:

  1. 密钥保存路径(默认为 ~/.ssh/
  2. 密钥的密码(Passphrase)(推荐设置,可为空直接回车)
  3. 确认密码

生成成功后,你会看到类似下面的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your identification has been saved in /home/your_user/.ssh/id_ed25519_github
Your public key has been saved in /home/your_user/.ssh/id_ed25519_github.pub
The key fingerprint is:
SHA256:2fLsxGsdHPrqF1qC0Wkj2sSfKkLwHnTZ1pVXyMzA1Bc user@host
The key's randomart image is:
+--[ED25519 256]--+
| .o |
| . o . |
| . o o . |
| o o o . .|
| .S o o o.o|
| . .+ . .+*+|
| .+.o.+o=*+|
| .o+o+.o+o+E|
| .oo++...oo.|
+----[SHA256]-----+

生成后的文件与管理

执行上述命令后,在你的 ~/.ssh/ 目录下会生成两个文件:

  • id_rsa.centos:这是私钥
    • 必须像保护密码一样保护它!
    • 权限必须是 600-rw-------)。SSH 客户端会拒绝权限过宽的私钥。
  • id_rsa.centos.pub:这是公钥
    • 这个文件可以随便分发,它的内容需要上传到你需要连接的远程服务器上。

确保私钥的权限正确:

1
chmod 600 ~/.ssh/id_rsa.centos

分发公钥

将公钥文件(.pub 后缀)的内容复制粘贴添加到远程服务器的 ~/.ssh/authorized_keys 文件的末尾。

确保远程服务器上的文件权限正确:

1
2
3
# 在远程服务器上执行:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

编写 config 条目

假如说,我们想连接到一台服务器,它的地址是 example.server.com,端口号是 2222,以用户 root 登陆,并使用~/.ssh/id_rsa_myserver 这个私钥验证身份。那么,我们需要在命令行里输入:

1
ssh root@example.server.com -p 2222 -i ~/.ssh/id_rsa_myserver

嗯好吧,-i 参数可以省略,但即使这样,命令还是很长,对吧?

那么我们把这个服务器的连接参数写到 config 文件里,就变成了这个样子:

1
2
3
4
5
6
7
# 此处我为了美观起见,给每个子条目都缩进了一层,实际使用时缩进不影响文件的效果。

Host example //起别名
Hostname example.server.com
Port 2222
User admin
Identityfile ~/.ssh/id_rsa

嗯,在这里,它还有了一个新名字,叫example

然后,我们只需要:

1
ssh example

就可以连接到这台主机了。


看到这里就能实现使用 SSH config连接主机了,以下内容为扩展内容。

创建通配符规则

有的时候,我们需要连接多台不同的主机,那难道我们需要针对每个主机都写一遍规则吗?

答案是不一定。如果你要连接的主机,它们的域名有一定规律可循,那么我们可以用通配符来匹配这一系列的主机。

比如,公司里针对开发和测试环境,各创建了一系列集群,同时各个集群中又根据负责的业务不同,有多台负载均衡的主机,那么我们可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
# 首先匹配所有主机,在这里配置好我们的用户名、私钥等参数
Host *
User boris1993
IdentityFile ~/.ssh/id_rsa

# 开发环境
Host dev-*
HostName %h.dev.mycompany.com

# 测试环境
Host staging-*
HostName %h.staging.mycompany.com

接下来,我们只需要执行类似ssh dev-user,就可以连接到开发环境的负责用户管理的服务器上了。

而实现这个操作的重点,我想你已经注意到了,一个是Host配置中的*,另一个就是配置文件里面的%h。星号我们都知道,是个通配符,放在这里就意味着它会匹配所有以dev-*开头的主机名;而%h是一个占位符,它会把你在SSH命令中destination部分的输入取出来放在这里,所以当我们执行ssh dev-user的时候,实际上命令会被展开成ssh dev-user.dev.mycompany.com

配置通过跳板机连接

如果公司规定所有服务器都需要先SSH到跳板机,然后才能连接到具体的服务器,那该怎么办?把ssh_config文件放在跳板机上吗?

确实这是一个解决方案,但不是唯一解。因为我们还有一个配置参数叫ProxyJump。它,就是用来指定,在连接这个服务器之前,需要通过哪个跳板机。

写起来,是这样的:

1
2
3
4
5
6
7
8
9
10
# 其他部分略

# 跳板机
Host bastion
HostName bastion.mycompany.com

# 服务器
Host dev-*
HostName %h.dev.mycompany.com
ProxyJump bastion

如果你的SSH版本早于 7.3,那么很可惜它是不支持ProxyJump这条配置的。但是不要灰心,它支持另一条配置,ProxyCommand

1
2
3
4
5
6
7
8
9
10
# 其他部分略

# 跳板机
Host bastion
HostName bastion.mycompany.com

# 服务器
Host dev-*
HostName %h.dev.mycompany.com
ProxyCommand ssh -W %h:%p bastion

然后,我们继续执行ssh dev-user就可以了,SSH会自动先连接到跳板机,然后在跳板机中再连接到我们要去的服务器。

如果你们公司安全做的非常好,需要通过数个跳板机来连接服务器,那么只需要给每个跳板机都配置上更外层的跳板就好了,像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 其他部分略

# 最外层跳板机
Host bastion-outer
HostName bastion-outer.mycompany.com

# 下一层跳板机
Host bastion-inner
HostName bastion-inner.mycompany.com
ProxyJump bastion-outer

# 服务器
Host dev-*
HostName %h.dev.mycompany.com
ProxyJump bastion-inner

这样,SSH就会先连接到bastion-outer,然后连到bastion-inner,然后连到dev-user。理论上,你可以在这里无限套娃。

l

如何在MacOS上安装Doom Emacs

1. Emacs安装

1.1 通过Homebrew安装

首先我们利用Mac的包管理工具hombrew,安装的是Emacs-plus,传送门在此。 因为当前Doom Emacs不支持29.+, 所以只安装28版本的Emacs(Emacs 27.1+ (28.1 is recommended, or native-comp. 29+ is not supported).

所以,我们用命令安装

1
2
brew tap d12frosted/emacs-plus
brew install emacs-plus@28 --HEAD --with-modern-doom3-icon # 我们想换一个好看的头像,嘻嘻

如下图,doom3的icon,好看!
[Screen Shot 2023-04-11 at 17.18.14](http://blogv1.seanzou.com/upload/2023/04/Screen Shot 2023-04-11 at 17.18.14-d3897770cd794c9ca49df2fbdc9b4f38.png)

1.2 给Emacs创建快捷方式

利用homebrew安装完后Emacs,我们去将Emacs的app连接。我们首先去安装了emacs的根目录。可以从Summary里面找到,e.g., /opt/hombrew/Cellar/emacs-plus@27/HEAD-abedf3a。然后使用命令cp进行快捷方式的链接。

1
2
cd /opt/hombrew/Cellar/emacs-plus@27/HEAD-abedf3a
cp -r Emacs.app /Applications

这个时候我们就会发现我们有一个可爱的图标的Emacs了。

2. Doom Emacs配置覆盖

2.1 安装依赖

1
2
brew install git ripgrep coreutils fd
xcode-select --install

2.2 覆盖Emacs的配置

这个时候Emacs的配置很重要,DoomEmacs Github给的地方是~/.config/emacs,但是我的配置完全不是这个,所以导致我最开始即使安装成功了Doom 和 Emacs,但是打开的仍旧是原版的Emacs,所以对于我来说(MacOS)用户来说命令应该如下,正确位置上~/.emacs.d,而不是~/.config/emacs

1
2
3
4
5
git clone https://github.com/doomemacs/doomemacs ~/.emacs.d
cd ~/.emacs.d
bin/doom install # 安装过程中有y 点y
bin/doom doctor # 检查一下有没有问题
bin/doom sync # 同步一下,我没有运行这行命令甚至无法打开Emacs

至此我们的Doom Emacs已经安装完成了,接下来为了方便起见,可以将Doom加入环境变量。

[关于Emcas配置] 来自Dason大佬的建议:删掉.emacs.d,就会自动读取.config里面的配置。

2.3 将Doom命令加入

使用vim ~/.bashrc或者vim ~/.bash_profile,然后加入我们通过命令pwd找到我们当前Doom的目录,加入进去就可以啦。嘿嘿。

总结

完成了,昨天在火车上思考了一路,最后得出结论,既然Doom和Emacs都安装成功了,但是打开还是原版的Emacs,很明显就是Doom的配置文件没有覆盖成功,于是今天重新试了一遍,找了一个MacOS版本的Youtube视频,结果成功啦。参考视频链接在此。

l

解决 Parallels Desktop 17 无法连接网络问题

前言

不少小伙伴在 macOS Big Sur 或 Monterey 中安装 Parallels Desktop 16/17 之后,都遇到了初始化网络失败,无法连接网络的问题。

正文

我们只要修改两个文件的配置即可:

  • /Library/Preferences/Parallels/dispatcher.desktop.xml
  • /Library/Preferences/Parallels/network.desktop.xml

可以通过 Finder 的前往文件夹功能直达:

  1. 打开 dispatcher.desktop.xml 文件,找到 <Usb>0</Usb>,修改为 <Usb>1</Usb> 并保存。

另外,有些小白朋友可能按截图中的行号来找,这是不对的。可通过 ⌘ + F 键,然后输入关键词,来快速定位。

![3.webp.jpg](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/2024/09/13/CleanShot 2024-09-13 at 10.23.36@2x.png)

  1. 打开 network.desktop.xml 文件,找到 <UseKextless>1</UseKextless><UseKextless>-1</UseKextless>,修改为 <UseKextless>0</UseKextless> 并保存。

![2.webp.jpg](https://cdn.jsdelivr.net/gh/swimminghao/picture@main/img/2024/09/13/CleanShot 2024-09-13 at 10.24.17@2x.png)

如果找不到 <UseKextless>1</UseKextless><UseKextless>-1</UseKextless>,那么需要新增一行。

1
2
3
4
<ParallelsNetworkConfig schemaVersion="1.0" dyn_lists="VirtualNetworks 1">
<!-- 在第一行新增即可 -->
<UseKextless>0</UseKextless>
</ParallelsNetworkConfig>
  1. 完全退出 Parallels Desktop,重新打开,就能正常连接网络了。
l

holer-server项目解读

[1/40]程序文件概述: holer-server/src/main/java/org/holer/server/HolerApp.java

该文件是holer-server项目的主要入口文件。主要作用是启动Holer服务器,并且设置服务器的启动参数和端口。文件中的关键部分包括:

  • 使用了@SpringBootApplication注解来指定该类是Spring Boot应用的入口。
  • 使用了@EnableScheduling注解来启用定时任务的支持。
  • main方法是应用程序的入口点,通过SpringApplication.run(HolerApp.class, args)来启动Spring Boot应用程序。
  • 通过ServerUtil.property(ServerConst.SERVER_PORT)获取服务器端口。
  • 通过ServerContainer.getContainer().start()启动ServerContainer实例。
  • 最后通过日志记录服务器启动的端口信息。

该文件主要负责启动Holer服务器并初始化相关配置,然后启动ServerContainer来处理请求。

[2/40]程序文件概述: holer-server/src/main/java/org/holer/server/handler/ExceptHandler.java

该程序文件是一个Java类文件,位于holer-server/src/main/java/org/holer/server/handler/ExceptHandler.java。该文件定义了一个异常处理器类ExceptHandler,用于处理不同类型的异常。

该类使用@RestControllerAdvice注解标记为一个全局异常处理类,可以处理控制器中抛出的异常。

在该类中,定义了三个异常处理方法:

  1. handle(Exception e)方法用于处理通用的Exception异常,打印异常信息并返回一个HolerResult对象,该对象包含一个错误代码和错误信息。
  2. handle(MethodArgumentNotValidException e)方法用于处理参数校验异常,获取校验失败的字段错误信息并拼接为一个错误信息字符串,然后返回一个HolerResult对象,该对象包含一个错误代码和错误信息。
  3. handle(HolerException e)方法用于处理自定义的HolerException异常,直接返回一个HolerResult对象,该对象包含自定义异常中的错误代码。

通过这些异常处理方法,程序可以在发生异常时进行捕获、处理和返回错误信息,提高系统的可靠性和可维护性。

[3/40]程序文件概述: holer-server/src/main/java/org/holer/server/handler/ExtraClientHandler.java

该文件是holer项目中的一个Java源代码文件,路径为holer-server/src/main/java/org/holer/server/handler/ExtraClientHandler.java。它是一个Netty的事件处理器类,继承自SimpleChannelInboundHandler。它包含了处理客户端连接和数据传输的方法,包括exceptionCaught、channelRead0、channelActive、channelInactive和channelWritabilityChanged等方法。这些方法分别用于处理出现异常、接收数据、客户端连接建立、客户端连接断开和可写性变化等事件。

[4/40]程序文件概述: holer-server/src/main/java/org/holer/server/handler/DataHandler.java

这个程序文件是DataHandler.java,它位于holer-server/src/main/java/org/holer/server/handler路径下。

该文件是一个Java类,它是一个Netty的ChannelDuplexHandler的子类。它实现了channelReadwritechannelActivechannelInactive方法。

channelRead方法在读取数据后会更新DataCollector对象中的统计信息,并将消息传递给下一个处理器。
write方法在写入数据后会更新DataCollector对象中的统计信息,并继续执行后续的写操作。
channelActive方法在连接激活时会增加DataCollector对象中的连接数。
channelInactive方法在连接失效时会减少DataCollector对象中的连接数。

该类的主要功能是通过DataCollector收集和统计连接的读写数据量,并跟踪连接数。

[5/40]程序文件概述: holer-server/src/main/java/org/holer/server/handler/ServerHandler.java

该文件是holer-server项目中的一个处理程序类,用于处理服务器收到的消息。主要包括以下几个方法:

  1. exceptionCaught方法:捕获holer客户端的异常,并打印日志。
  2. channelRead0方法:处理接收到的消息,根据消息类型不同采取不同的处理方式。
  3. channelWritabilityChanged方法:当可写状态发生变化时,将该状态同步到关联的通道。
  4. channelInactive方法:当通道不再活动时,进行一些清理工作,如移除通道的引用及关闭相关通道。
  5. handleHeartbeatMsg方法:处理心跳消息,通知客户端已接收到该消息。
  6. handleAuthMsg方法:处理客户端认证消息,进行认证操作。
  7. handleConnectMsg方法:处理连接消息,建立与目标服务器的连接。
  8. handleDisconnectMsg方法:处理断开连接消息,关闭与目标服务器的连接。
  9. handleTransferMsg方法:处理数据传输消息,将数据传输到目标服务器。

该类主要功能是根据接收到的消息类型执行相应的操作,如认证、连接、断开连接和数据传输等。

[6/40]程序文件概述: holer-server/src/main/java/org/holer/server/init/ServerInitializer.java

该文件是一个Java类文件,位于holer-server/src/main/java/org/holer/server/init/目录下。它是一个netty的服务器初始化类,继承了ChannelInitializer类。在initChannel方法中,根据参数sslEnabled的值来判断是否开启SSL加密,并根据需要配置SSL引擎,然后添加一系列的管道处理器,包括消息解码器、消息编码器、空闲检测器和服务器处理器。

[7/40]程序文件概述: holer-server/src/main/java/org/holer/server/init/ExtraClientInitializer.java

这是一个名为ExtraClientInitializer.java的文件,位于holer-server/src/main/java/org/holer/server/init/目录下。这个文件是一个Netty的ChannelInitializer子类,用来初始化SocketChannel的管道。

在initChannel方法中,会依次向管道添加一个DataHandler和一个ExtraClientHandler,用于处理数据和额外的客户端请求。

[8/40]程序文件概述: holer-server/src/main/java/org/holer/server/h2/H2Function.java

这是一个名为H2Function.java的Java程序文件,位于holer-server/src/main/java/org/holer/server/h2目录下。它是一个H2数据库函数类,包含了一个名为unixTimeStamp的静态方法,参数为一个Timestamp对象,返回一个整数类型结果。该方法将给定的Timestamp对象转换为Unix时间戳。

[9/40]程序文件概述: holer-server/src/main/java/org/holer/server/util/DataCollector.java

这是一个名为DataCollector的Java类,它位于org.holer.server.util包中。该类用于收集和管理数据,并提供方法来访问和操作收集到的数据。

该类包含以下成员变量:

  • collectors:一个ConcurrentHashMap,用于存储不同端口的DataCollector实例。
  • port:表示当前DataCollector实例所监听的端口。
  • readBytes:一个AtomicLong类型的对象,用于记录读取的字节数。
  • wroteBytes:一个AtomicLong类型的对象,用于记录写入的字节数。
  • readMsgs:一个AtomicLong类型的对象,用于记录读取的消息数量。
  • wroteMsgs:一个AtomicLong类型的对象,用于记录写入的消息数量。
  • channels:一个AtomicInteger类型的对象,用于记录当前连接的通道数量。

该类包含以下方法:

  • getCollector(Integer port):根据端口获取对应的DataCollector实例。
  • getInitAllData():获取所有DataCollector实例的初始数据。
  • getAllData():获取所有DataCollector实例的当前数据。
  • getInitData():获取当前DataCollector实例的初始数据。
  • getData():获取当前DataCollector实例的当前数据。
  • incrementReadBytes(long bytes):增加读取的字节数。
  • incrementWroteBytes(long bytes):增加写入的字节数。
  • incrementReadMsgs(long msgs):增加读取消息的数量。
  • incrementWroteMsgs(long msgs):增加写入消息的数量。
  • getChannels():获取当前连接的通道数量。
  • getPort():获取当前DataCollector实例监听的端口。
  • setPort(Integer port):设置当前DataCollector实例监听的端口。

总体而言,该类用于收集和统计与端口相关的数据,并提供了访问和操作这些数据的方法。

[10/40]程序文件概述: holer-server/src/main/java/org/holer/server/util/ServerUtil.java

这个程序文件是一个名为ServerUtil的工具类。它包含了一些静态方法和实例方法,用来提供服务器相关的实用功能。这个类使用了一些第三方库,如Jackson、Gson和OkHttp,还依赖了一些其他的类和接口。它还被声明为一个Spring的组件(Component),可以被自动装配到其他类中使用。整个文件包括了一些公共方法,如初始化方法、获取服务方法、验证方法、写方法等。这些方法用来处理各种服务器相关的功能,如用户验证、生成随机ID、验证许可证、获取总端口数量等。

[11/40]程序文件概述: holer-server/src/main/java/org/holer/server/util/ServerMgr.java

该文件是一个名为ServerMgr的Java类,主要包含了一些静态变量和静态方法。其中静态变量包括bindChannels、holerChannels、trialClients、extraClientId等Map类型的变量,以及webServerPort、serverDomain、serverHost、serverPort、proxyContent等一些基本类型的变量。静态方法包括isSslServerEnable、getSslServerHost、getSslServerPort等获取静态变量值的方法,以及initCfg、initHoler、saveClient、savePort等一些用于初始化配置和保存数据的方法。此外,还有一些其他的辅助方法,如bind、unbind、deleteProxy等。整体来说,该类是一个服务器管理工具类,用于管理服务器的状态、配置和通讯等。

[12/40]程序文件概述: holer-server/src/main/java/org/holer/server/config/SchedulerConfig.java

这是一个名为SchedulerConfig的Java类文件,位于holer-server/src/main/java/org/holer/server/config/路径下。该类使用了Spring框架的注解@Configuration,用于标识为配置类。实现了SchedulingConfigurer接口,用于自定义任务调度器的配置。

configureTasks方法中,创建了一个ThreadPoolTaskScheduler对象,并进行了一些配置,如设置线程池大小为5,线程名前缀为”Holer-Task-“。然后调用initialize方法进行初始化。最后通过registrar.setTaskScheduler(taskScheduler)方法将配置好的任务调度器设置到ScheduledTaskRegistrar对象中。

该配置类的主要作用是创建和配置一个自定义的任务调度器,并将其应用于任务注册器中,以便在Spring应用程序中实现定时任务调度。

[13/40]程序文件概述: holer-server/src/main/java/org/holer/server/config/HolerWebConfig.java

这是一个名为HolerWebConfig.java的配置文件,位于org.holer.server.config包中。它实现了WebMvcConfigurer接口,并覆盖了addInterceptors方法。该方法通过向注册表添加拦截器来配置拦截器。文件中还有两个注入的拦截器实例:apiInterceptor和viewInterceptor。addInterceptors方法使用这两个拦截器,并为它们指定了拦截路径。apiInterceptor拦截/api/**路径,viewInterceptor拦截/view/**路径。

[14/40]程序文件概述: holer-server/src/main/java/org/holer/server/config/CorsConfig.java

这个文件是”Holer Server”项目中的一个配置文件,它用于配置跨域资源共享(CORS)功能。该文件定义了一个 CorsConfig 类,被注解为@Configuration,表示这是一个Spring应用程序的配置类。在这个类中,有一个@Bean方法,它创建了一个CorsFilter对象,并返回它。CorsFilter是Spring框架中的一个过滤器,用于处理跨域请求。在这个方法中,我们创建了一个CorsConfiguration对象,并设置了一些允许访问的来源、头部和方法。然后,创建了一个UrlBasedCorsConfigurationSource对象,将CorsConfiguration配置应用到所有的URL路径上。最后,将UrlBasedCorsConfigurationSource对象传递给CorsFilter构造函数,创建CorsFilter对象并返回。这样,当请求到达服务器时,CorsFilter将会根据CorsConfiguration的设置来处理跨域请求。

[15/40]程序文件概述: holer-server/src/main/java/org/holer/server/timer/HolerWorker.java

该程序文件名为HolerWorker.java,位于org.holer.server.timer包下。这个文件是一个定时任务类,包含了三个定时任务方法cleanExpiredData()、closeHoler()和setDomain()。cleanExpiredData()方法用于清除过期的数据;closeHoler()方法用于关闭Holer;setDomain()方法用于设置域名。这个类使用了Spring的Scheduled注解来指定定时执行的时间间隔。文件中还引入了一些其他的类和工具类,并且使用了日志输出。

[16/40]程序文件概述: holer-server/src/main/java/org/holer/server/container/ServerContainer.java

该程序文件是Holer服务器的主要容器类,用于启动和停止服务器。以下是该文件的关键要点:

  1. 该类位于org.holer.server.container包中。
  2. 使用了Netty库来构建服务器。
  3. 该类是单例模式实现的,通过getContainer()方法获取唯一实例。
  4. 拥有两个NioEventLoopGroup实例,一个用于处理网络请求的工作线程组,一个用于监听新连接的Boss线程组。
  5. ServerContainer类的构造函数调用了init()方法来初始化工作线程组和Boss线程组。
  6. 使用ServerBootstrap实例来配置服务器的基本参数,如工作线程组、通道类型和处理器。
  7. 通过listenPort()方法绑定一个指定的端口号。
  8. 通过listenPorts()方法监听所有配置的端口号。
  9. 有一个newServer()方法用于创建一个新的ServerBootstrap实例。
  10. 通过start()方法启动服务器,在指定的主机和端口上监听新连接。
  11. 通过stop()方法停止服务器,优雅地关闭工作线程组和Boss线程组。

总结:ServerContainer类是Holer服务器的核心容器类,负责处理服务器的启动和停止。它使用Netty库提供的API实现了一个基本的服务器框架,并通过单例模式确保全局唯一性。

[17/40]程序文件概述: holer-server/src/main/java/org/holer/server/constant/HolerType.java

该程序文件是一个Java枚举类,命名为HolerType。该枚举类定义了一些常见的网络协议类型,如HTTP、HTTPS、SSH等。每个协议类型都有一个与之对应的字符串类型(type属性),并提供了一个value方法用于获取该字符串类型。此外,该枚举类还提供了一个isValid方法,用于检查给定的字符串是否为有效的协议类型。

[18/40]程序文件概述: holer-server/src/main/java/org/holer/server/constant/ServerConst.java

该文件是一个Java类文件,位于org.holer.server.constant包下。该类中定义了一系列用于服务器的常量字段。

其中一些常量的含义如下:

  • EXTRA_CLIENTS:用于存储额外客户端的Netty Channel对象的AttributeKey。
  • OS_TYPE:操作系统类型,通过System.getProperty(“os.name”)获取。
  • SSL:字符串常量,表示SSL。
  • HOLER:字符串常量,表示Holer。
  • DOMAIN:表示域名。
  • PORT:表示端口号。
  • PROTOCOL:表示协议。
  • LISTEN_PORT:监听端口。
  • PROXY_CONF:代理配置文件路径。
  • HOLER_CONF:Holer配置文件路径。
  • NGINX_CONF:Nginx配置文件路径。
  • HOLER_SSL_JKS:Holer SSL证书密钥库路径。
  • CONF:配置文件路径。
  • NGINX_SSL:Nginx SSL。
  • HTTP:表示HTTP协议。
  • HTTPS:表示HTTPS协议。
  • HTTPS_PORT:HTTPS端口号。
  • HTTP_PORT:HTTP端口号。
  • SSL_CRT:SSL证书。
  • DOMAIN_RULE:域名的正则表达式规则。
  • KEY_RULE:密钥的正则表达式规则。
  • SERVER_RULE:服务器地址的正则表达式规则。
  • EMAIL_RULE:邮箱的正则表达式规则。
  • SERVER_MSG:服务器消息配置文件路径。
  • TOKEN:身份验证令牌。
  • VIEW_LOGIN:登录页面路径。
  • MAX_EXTRA_CLIENTS:最大额外客户端数。
  • MAX_PORT:最大端口号。
  • MIN_PORT:最小端口号。
  • MAX_DAY:最大天数。
  • DEFAULT_VALID_DAY:默认有效天数。
  • DEFAULT_DOMAIN:默认域名。
  • WISDOM_DOMAIN:智能域名。
  • ONLINE:在线状态。
  • OFFLINE:离线状态。
  • ONE_KB:1KB。
  • DEFAULT_HTTP_PORT:默认HTTP端口号。
  • API_PREFIX:API前缀。
  • LICENSE:许可证。
  • KEY:密钥。
  • NGINX_RELOAD:Nginx重新加载命令。
  • INCLUDE_CONF:Nginx配置文件中的include语句。
  • WEB_SERVER_PORT:Web服务器端口。
  • SERVER_DOMAIN:服务器域名。
  • SERVER_HOST:服务器主机。
  • SERVER_PORT:服务器端口。
  • SSLSERVER_ENABLE:SSL服务器是否启用。
  • SSLSERVER_HOST:SSL服务器主机。
  • SSLSERVER_PORT:SSL服务器端口。
  • HOLER_DOMAIN_NAME:Holer域名。
  • HOLER_SERIAL_NO:Holer许可证序列号。
  • HOLER_NGINX_BIN:Holer中Nginx可执行文件的路径。
  • HOLER_NGINX_CONF:Holer中Nginx配置文件的路径。
  • HOLER_NGINX_HOME:Holer中Nginx的安装目录。

[19/40]程序文件概述: holer-server/src/main/java/org/holer/server/constant/HolerCode.java

这是一个名为HolerCode.java的文件,位于src/main/java/org/holer/server/constant/路径下。这个文件定义了一个枚举类型HolerCode,包含了许多常量成员。每个常量成员都有一个对应的整数值,并通过构造函数进行初始化。HolerCode还提供了两个方法:value()用于获取常量成员的整数值,message()用于获取常量成员对应的消息文本。

[20/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerLicense.java

这个程序文件名为HolerLicense.java,位于org.holer.server.model包下的src/main/java目录中。它是一个Java类文件,用于定义HolerLicense对象的模型。

这个类使用了lombok库的@Data注解,自动生成了getter和setter方法。它实现了Serializable接口,表示可以被序列化。

HolerLicense类有以下成员变量:

  • licenseId:Long类型,表示许可证ID
  • userName:String类型,表示用户名
  • serialNum:String类型,表示序列号
  • validDay:Long类型,表示有效期天数
  • expireAt:String类型,表示过期时间
  • createAt:Long类型,表示创建时间
  • portNum:Long类型,表示端口号

这个类的作用是表示一个Holer许可证对象,并提供相关的属性和方法。这个类可用于在Holer服务器中存储和处理许可证信息。

[21/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerPort.java

这个文件是一个Java类文件,文件名为HolerPort.java。该类位于org.holer.server.model包。它是一个实体类,用于映射数据库表holer_port。该类定义了一些属性和方法,用于描述Holer服务器的端口信息,包括访问密钥(accessKey)、端口号(portNum)、服务器地址(server)、域名(domain)、Holer类型(type)等。该类还提供了一些辅助方法,用于计算有效天数(validDay)、过期时间(expireAt)、创建时间(createAt)和获取IP地址(inetAddr)。

[22/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerStatus.java

该文件是一个Java类文件,位于项目的holer-server模块中的org.holer.server.model包下。该类是一个数据模型类,用于表示Holer的状态。

该类使用了lombok库的@Data注解,自动生成了属性的getter、setter方法、equals()、hashCode()、toString()等方法。

HolerStatus类有以下属性:

  • code:一个整数,用于表示状态码。该属性被标注为不序列化和不反序列化。
  • msg:一个字符串,用于表示状态信息。该属性被标注为不序列化和不反序列化。
  • msgZhCN:一个字符串,用于表示中文状态信息。该属性会被序列化和反序列化,并使用SerializedName注解指定了序列化后的名称。
  • msgEnUS:一个字符串,用于表示英文状态信息。该属性会被序列化和反序列化,并使用SerializedName注解指定了序列化后的名称。

[23/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerClient.java

这个程序文件是holer-server项目的一部分。它定义了一个HolerClient类,在数据库表holer_client中映射了多个属性。该类实现了Serializable接口,并使用lombok库的@Data注解自动生成了getter和setter方法。HoldeClient类具有以下属性:clientId、name、accessKey、enabled、status、onlineAt、channel、ports。其中,clientId是自动生成的唯一标识符,name是一个非空且符合邮箱格式的字符串,accessKey是一个字符串,enabled是一个布尔值,status是一个整数。onlineAt和channel属性被标记为@Transient和@JsonIgnore,并不会在数据库中存储,而是用于临时存储数据。ports属性是一个HolerPort对象的列表。此外,类还包括一些方法,如publicPorts方法返回一个整数列表,并遍历ports列表以获取端口号。

[24/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerUser.java

该程序文件是一个Java类文件,名为HolerUser.java。该类位于org.holer.server.model包下。该类使用了Lombok库的@Data注解,以自动生成getter和setter方法。该类是一个实体类,使用了javax.persistence注解进行标注,以与数据库表holer_user进行映射。该类实现了Serializable接口,以支持序列化。类中包含了字段userId、name、password和token,分别表示用户id、用户名、密码和令牌。其中name字段使用了javax.validation.constraints注解进行验证,要求值不能为空且长度在3到128个字符之间;password字段也使用了javax.validation.constraints注解进行验证,要求值不能为空且长度在6到128个字符之间。

[25/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerData.java

这个程序文件是holer-server项目中的一个Java类文件,文件名是HolerData.java。这个类是一个POJO类,用于表示Holer服务器中的数据信息。它实现了java.io.Serializable接口,以便在网络传输和持久化存储过程中进行序列化和反序列化。

这个类有以下属性:

  • port (int类型): 表示服务器端口号
  • readBytes (long类型): 表示从客户端读取的字节数
  • wroteBytes (long类型): 表示向客户端写入的字节数
  • readMsgs (long类型): 表示已读取消息数
  • wroteMsgs (long类型): 表示已写入消息数
  • channels (int类型): 表示当前连接的通道数
  • timestamp (long类型): 表示时间戳

这个类使用了Lombok库中的@Data注解,自动生成了属性的getter和setter方法、toString方法等。

[26/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerResult.java

该源代码文件是一个名为HolerResult的Java类,位于org.holer.server.model包中。它具有以下属性和方法:

属性:

  • code:整数类型,表示返回结果的代码。
  • msg:字符串类型,表示返回结果的信息。
  • data:泛型T,表示返回结果的数据。
  • total:长整型,表示返回结果的总数。

构造方法:

  • HolerResult(Integer code):根据给定代码初始化结果对象,使用ServerUtil类获取代码对应的状态信息。
  • HolerResult(Integer code, String msg):使用给定的代码和信息初始化结果对象。
  • HolerResult(HolerCode code):根据给定的HolerCode枚举值初始化结果对象,使用ServerUtil类获取代码对应的状态信息。
  • HolerResult(Page<?> page, HolerCode code):根据给定的Page对象和HolerCode枚举值初始化结果对象,将Page对象的内容设置为结果对象的数据,并使用ServerUtil类获取代码对应的状态信息。
  • HolerResult(T data, HolerCode code):根据给定的数据和HolerCode枚举值初始化结果对象,将数据设置为结果对象的数据,并使用ServerUtil类获取代码对应的状态信息。

重要方法:

  • 无。

使用注解:

  • @Data:使用Lombok库生成getter、setter、hashCode、equals等方法。

[27/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerException.java

这个程序文件是holer-server项目中的一个Java类文件,文件名为HolerException.java。该类继承了RuntimeException类。它定义了一个HolerException异常,主要用于包装HolerCode和HolerStatus,提供了一些方法来获取异常的状态信息。该文件主要用于处理holer-server项目中的异常情况。

[28/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerReport.java

这个程序文件是holer-server项目中的一个Java类文件,文件名为HolerReport.java。它位于holer-server/src/main/java/org/holer/server/model/目录下。

该类使用了Lombok的@Data注解,自动生成了getter和setter方法。它实现了Serializable接口,并包含以下属性:

  • onlineClient: 在线客户端数量
  • offlineClient: 离线客户端数量
  • enabledClient: 启用的客户端数量
  • disabledClient: 禁用的客户端数量
  • expiredPort: 过期的端口数量
  • unexpiredPort: 未过期的端口数量
  • activePort: 活跃的端口数量
  • inactivePort: 不活跃的端口数量
  • upPort: 上行端口数量
  • downPort: 下行端口数量
  • appType: 使用Holer的应用类型及其数量的映射
  • connection: 连接数及其数量的映射
  • traffic: HolerData对象列表,表示流量数据

这个类用于表示Holer服务器的报告数据。

[29/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerApi.java

这是一个Java源代码文件,文件名为HolerApi.java。该文件包含了一个名为HolerApi的类,该类实现了Serializable接口,并使用了Lombok的@Data注解。该类具有以下属性:uri(String类型)、method(String类型)、free(boolean类型)。这些属性被自动生成了getter和setter方法。此外,该类还定义了一个名为serialVersionUID的静态长整型常量。

[30/40]程序文件概述: holer-server/src/main/java/org/holer/server/model/HolerChannel.java

这个程序文件是holler-server项目中的一个Java类文件,位于路径org.holler.server.model中。它实现了Serializable接口并使用了Lombok库中的@Data注解。该类具有以下成员变量:client,类型为HolerClient;ports,类型为Map<Integer, HolerPort>。这个类用于表示Holler服务器中的通道。

[31/40]程序文件概述: holer-server/src/main/java/org/holer/server/db/DBUserService.java

这个文件是 DBUserService.java,它位于 holer-server/src/main/java/org/holer/server/db 目录下。这是一个接口文件,定义了对数据库用户表进行操作的方法。它继承了 JpaRepository 接口,泛型参数为 HolerUserLong。这个接口定义了以下两个方法:

  • findByNameAndPassword 方法,根据用户名和密码查找用户。
  • findByToken 方法,根据令牌查找用户。

[32/40]程序文件概述: holer-server/src/main/java/org/holer/server/db/DBPortService.java

这是一个名为DBPortService.java的Java源代码文件,属于holer-server/src/main/java/org/holer/server/db目录。该文件定义了一个接口DBPortService,继承自JpaRepository<HolerPort, Long>。接口中定义了一些方法用于对HolerPort对象进行数据库操作,如根据accessKey、portNum、domain进行查询,根据accessKey进行删除,统计满足条件的记录数等。还有两个使用原生查询语句的方法,分别用于统计已过期的端口数量和活跃的端口数量。

[33/40]程序文件概述: holer-server/src/main/java/org/holer/server/db/DBClientService.java

这是一个名为DBClientService.java的Java文件,位于holer-server/src/main/java/org/holer/server/db目录中。该文件是一个接口文件,定义了一个名为DBClientService的接口。该接口继承了JpaRepository接口,并指定了泛型参数为HolerClient和Long。

DBClientService接口中定义了一些方法:

  • findByAccessKey:通过访问密钥查找HolerClient对象
  • findByName:通过名称查找HolerClient对象列表
  • countAllByStatus:计算所有状态为给定参数的HolerClient对象数量
  • countAllByEnabled:计算所有启用状态为给定参数的HolerClient对象数量

[34/40]程序文件概述: holer-server/src/main/java/org/holer/server/interceptor/ApiInterceptor.java

这个程序文件是一个名为ApiInterceptor.java的拦截器类,用于处理HTTP请求之前的拦截操作。它实现了Spring框架的HandlerInterceptor接口。在preHandle方法中,它会先检查请求中的令牌是否有效,如果令牌无效,则会返回一个包含错误代码的HolreResult对象,并返回false表示请求已被拦截。如果令牌有效,则返回true表示继续处理该请求。该拦截器被标记为@Component,表示它是一个由Spring管理的组件。

[35/40]程序文件概述: holer-server/src/main/java/org/holer/server/interceptor/ViewInterceptor.java

这个程序文件是一个名为ViewInterceptor的类,实现了HandlerInterceptor接口。它位于org.holer.server.interceptor包中,用于拦截请求并进行处理。

该类包含一个方法preHandle,用于处理请求之前的操作。在该方法中,它首先获取当前请求的HttpSession对象,并检查是否为null。如果为null,则通过HttpServletResponse对象将请求重定向到/login.html页面,并返回false表示请求不被继续处理。

然后,它从session中获取名为”HOLER-AUTH-TOKEN”的属性,并检查是否为null。如果为null,则通过HttpServletResponse对象将请求重定向到/login.html页面,并返回false表示请求不被继续处理。

最后,如果以上条件都不满足,它返回true,表示请求可以继续处理。

该类还使用了@Component注解,表示它是一个Spring组件,可以被Spring容器进行管理和注入。

[36/40]程序文件概述: holer-server/src/main/java/org/holer/server/rest/RESTClientService.java

这是一个名为RESTClientService.java的Java文件。它位于holer-server/src/main/java/org/holer/server/rest目录下。

这个文件定义了一个名为RESTClientService的类,该类是一个RestController,用于处理关于Holer客户端的REST API请求。它包含了一些常用的注解,如@Validated、@CrossOrigin、@RestController和@RequestMapping。

这个类依赖于DBClientService和DBPortService这两个数据库服务,并通过@Autowired注解进行自动注入。

它包含了一些处理REST API请求的方法,包括findAll、findByAccessKey、getReport、addClient、updateClient和deleteById。

这些方法使用了@GetMapping、@PostMapping、@PutMapping和@DeleteMapping注解,分别处理对应的HTTP请求方法。这些方法主要负责查询数据库的内容,并根据请求返回相应的结果。

整体而言,这个文件实现了一个RESTful API,用于处理关于Holer客户端的请求,并与数据库进行交互。

[37/40]程序文件概述: holer-server/src/main/java/org/holer/server/rest/RESTUserService.java

这个文件是一个名为RESTUserService的Java类,位于holer-server/src/main/java/org/holer/server/rest/目录下。该类提供了处理用户登录和退出功能的RESTful接口。其中,login方法处理用户登录请求,logout方法处理用户退出请求。该类依赖于DBUserService类实现数据库访问和操作。该文件还包含了一些注解用于配置接口路由和跨域访问。

[38/40]程序文件概述: holer-server/src/main/java/org/holer/server/rest/RESTPortService.java

该程序文件为一个RESTful风格的端口服务类,用于处理和管理端口的增删改查操作。

该类包含以下主要功能:

  1. 对于GET请求”/api/port/{clientId}”,根据客户端ID查询该客户端对应的端口列表。
  2. 对于POST请求”/api/port/{accessKey}”,新增一个端口,并关联到指定的访问密钥(accessKey)的客户端。
  3. 对于PUT请求”/api/port”,更新一个已存在的端口信息。
  4. 对于DELETE请求”/api/port/{portId}”,根据端口ID删除指定的端口。

该类依赖于其他类与服务:

  1. 使用@Autowired注解注入了DBClientService和DBPortService服务,用于与数据库进行交互。
  2. 使用了ServerUtil和ServerMgr工具类,提供了一些操作数据库和管理服务端口的方法。

该类还使用了一些常量和模型类,例如HolerCode、HolerType、HolerClient和HolerPort,用于表示不同的状态码、端口类型和客户端/端口模型。

整体来说,该程序文件是一个处理端口管理的RESTful服务类,通过对GET、POST、PUT和DELETE请求的处理,实现了对端口的增删改查功能。

[39/40]程序文件概述: holer-server/pom.xml

这个文件是一个 Maven 的 POM(Project Object Model)文件,用于构建 holser-server 项目。它定义了项目的基本信息,依赖项和构建配置。项目使用 Spring Boot 框架,主要依赖包括 Spring Boot Starter Web、Spring Boot Starter Data JPA、MySQL 连接器、Lombok、Commons Lang、Commons Collections、Commons BeanUtils、Commons Codec、JavaMail、Netty、OkHttp、H2 数据库和 Spring Boot Starter Actuator。构建配置包括 Maven 编译器插件和 Spring Boot Maven 插件。

[40/40]程序文件概述: holer-server/assembly.xml

这个程序文件是一个XML配置文件,用于指定Holer Server项目的打包和组装方式。

它包含以下内容:

  • <includeBaseDirectory>:指定在生成的tar.gz压缩包中是否包含与项目名相同的根目录。
  • <dependencySets>:定义依赖项集合,其中包括将本项目添加到依赖文件夹下的设置。
  • <outputDirectory>:指定将来自依赖项集合的运行时依赖包放在哪个目录下。
  • <fileSets>:定义文件集合,其中包括将src/main/bin目录下的文件复制到根目录下的设置。

简而言之,这个文件描述了如何组装和打包Holer Server项目,包括将项目本身和运行时依赖项一起打包,并将特定文件复制到特定目录。

用一张Markdown表格简要描述以下文件的功能:

文件路径 文件功能
holer-server/src/main/java/org/holer/server/
HolerApp.java
Holer服务器的主要入口文件,用于启动Holer服务器。
holer-server/src/main/java/org/holer/server/
handler/ExceptHandler.java
异常处理器类,处理控制器中抛出的异常。
holer-server/src/main/java/org/holer/server/
handler/ExtraClientHandler.java
处理客户端连接和数据传输的Netty事件处理器类。
holer-server/src/main/java/org/holer/server/
handler/DataHandler.java
数据处理器类,处理接收到的消息。
holer-server/src/main/java/org/holer/server/
handler/ServerHandler.java
服务器处理器类,处理服务器接收到的消息。
holer-server/src/main/java/org/holer/server/
init/ServerInitializer.java
服务器初始化类,用于初始化服务器管道。
holer-server/src/main/java/org/holer/server/
init/ExtraClientInitializer.java
额外的客户端初始化类,用于初始化额外的客户端管道。
holer-server/src/main/java/org/holer/server/
h2/H2Function.java
H2数据库函数类,包含了Unix时间戳转换的方法。
holer-server/src/main/java/org/holer/server/
util/DataCollector.java
数据收集器类,用于收集和管理数据。
holer-server/src/main/java/org/holer/server/
util/ServerUtil.java
服务器相关的实用工具类,提供一些公共方法和功能。
holer-server/src/main/java/org/holer/server/
util/ServerMgr.java
服务器管理工具类,提供管理服务器相关的静态方法和变量。
holer-server/src/main/java/org/holer/server/
config/SchedulerConfig.java
任务调度器的配置类,用于自定义任务调度器的配置。
holer-server/src/main/java/org/holer/server/
config/HolerWebConfig.java
Web配置类,用于配置拦截器和其他Web相关配置。
holer-server/src/main/java/org/holer/server/
config/CorsConfig.java
跨域资源共享(CORS)配置类,用于配置跨域请求处理。
holer-server/src/main/java/org/holer/server/
timer/HolerWorker.java
定时任务类,包含定时清除数据和关闭Holer的方法。
holer-server/src/main/java/org/holer/server/
container/ServerContainer.java
服务器容器类,用于启动和停止服务器。

整体而言,该组程序文件实现了一个Holer服务器,用于处理客户端连接、数据传输、异常处理、数据收集与管理、定时任务调度等功能。

概括这些文件的整体功能:这些文件的整体功能是实现一个Holer服务器,包括启动服务器、处理客户端连接和数据传输、处理异常、初始化服务器管道、使用H2数据库函数、收集和管理数据、提供服务器相关的实用工具和管理工具、配置任务调度器、配置Web和CORS、执行定时任务,以及启动和停止服务器。

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
flowchart LR
%% <gpt_academic_hide_mermaid_code> 一个特殊标记,用于在生成mermaid图表时隐藏代码块
classDef Comment stroke-dasharray: 5 5
subgraph 项目示意图
R0000000000["🗎HolerApp.java"] -.-x CR0000000000["`该文件是holer-
server项目的主
要入口文件。主要作用
是启动Holer服务
器,并且设置服务器的...`"]:::Comment
R000000000[["📁server"]] --> R0000000000["🗎HolerApp.java"]
R00000000010["🗎ExceptHandler.java"] -.-x CR00000000010["`该程序文件是一个Ja
va类文件,位于ho
ler-server
.zip.extra
ct/holer-s...`"]:::Comment
R0000000001[["📁handler"]] --> R00000000010["🗎ExceptHandler.java"]
R00000000011["🗎ExtraClientHandler.java"] -.-x CR00000000011["`该文件是holer项
目中的一个Java源
代码文件,路径为ho
ler-server
/src/main/...`"]:::Comment
R0000000001[["📁handler"]] --> R00000000011["🗎ExtraClientHandler.java"]
R00000000012["🗎DataHandler.java"] -.-x CR00000000012["`这个程序文件是Dat
aHandler.j
ava,它位于hol
er-server.
zip.ext...`"]:::Comment
R0000000001[["📁handler"]] --> R00000000012["🗎DataHandler.java"]
R00000000013["🗎ServerHandler.java"] -.-x CR00000000013["`该文件是holer-
server项目中的
一个处理程序类,用于
处理服务器收到的消息
。主要包括以下几个方...`"]:::Comment
R0000000001[["📁handler"]] --> R00000000013["🗎ServerHandler.java"]
R000000000[["📁server"]] --> R0000000001[["📁handler"]]
R00000000020["🗎ServerInitializer.java"] -.-x CR00000000020["`该文件是一个Java
类文件,位于hole
r-server.z
ip.extract
/holer-ser...`"]:::Comment
R0000000002[["📁init"]] --> R00000000020["🗎ServerInitializer.java"]
R00000000021["🗎ExtraClientInitializer.java"] -.-x CR00000000021["`这是一个名为Extr
aClientIni
tializer.j
ava的文件,位于h
oler-serve...`"]:::Comment
R0000000002[["📁init"]] --> R00000000021["🗎ExtraClientInitializer.java"]
R000000000[["📁server"]] --> R0000000002[["📁init"]]
R00000000030["🗎H2Function.java"] -.-x CR00000000030["`这是一个名为H2Fu
nction.jav
a的Java程序文件
,位于holer-s
erver.zip....`"]:::Comment
R0000000003[["📁h2"]] --> R00000000030["🗎H2Function.java"]
R000000000[["📁server"]] --> R0000000003[["📁h2"]]
R00000000040["🗎DataCollector.java"] -.-x CR00000000040["`这是一个名为Data
Collector的
Java类,它位于o
rg.holer.s
erver.util...`"]:::Comment
R0000000004[["📁util"]] --> R00000000040["🗎DataCollector.java"]
R00000000041["🗎ServerUtil.java"] -.-x CR00000000041["`这个程序文件是一个名
为ServerUti
l的工具类。它包含了
一些静态方法和实例方
法,用来提供服务器相...`"]:::Comment
R0000000004[["📁util"]] --> R00000000041["🗎ServerUtil.java"]
R00000000042["🗎ServerMgr.java"] -.-x CR00000000042["`该文件是一个名为Se
rverMgr的Ja
va类,主要包含了一
些静态变量和静态方法
。其中静态变量包括b...`"]:::Comment
R0000000004[["📁util"]] --> R00000000042["🗎ServerMgr.java"]
R000000000[["📁server"]] --> R0000000004[["📁util"]]
R00000000050["🗎SchedulerConfig.java"] -.-x CR00000000050["`这是一个名为Sche
dulerConfi
g的Java类文件,
位于holer-se
rver.zip....`"]:::Comment
R0000000005[["📁config"]] --> R00000000050["🗎SchedulerConfig.java"]
R00000000051["🗎HolerWebConfig.java"] -.-x CR00000000051["`这是一个名为Hole
rWebConfig
.java的配置文件
,位于org.hol
er.server....`"]:::Comment
R0000000005[["📁config"]] --> R00000000051["🗎HolerWebConfig.java"]
R00000000052["🗎CorsConfig.java"] -.-x CR00000000052["`这个文件是Holer
Server项目中
的一个配置文件,它用
于配置跨域资源共享(
CORS)功能。...`"]:::Comment
R0000000005[["📁config"]] --> R00000000052["🗎CorsConfig.java"]
R000000000[["📁server"]] --> R0000000005[["📁config"]]
R00000000060["🗎HolerWorker.java"] -.-x CR00000000060["`该程序文件名为Hol
erWorker.j
ava,位于org.
holer.serv
er.timer包下...`"]:::Comment
R0000000006[["📁timer"]] --> R00000000060["🗎HolerWorker.java"]
R000000000[["📁server"]] --> R0000000006[["📁timer"]]
R00000000070["🗎ServerContainer.java"] -.-x CR00000000070["`该程序文件是Hole
r服务器的主要容器类
,用于启动和停止服务
器。以下是该文件的关
键要点:1. 该...`"]:::Comment
R0000000007[["📁container"]] --> R00000000070["🗎ServerContainer.java"]
R000000000[["📁server"]] --> R0000000007[["📁container"]]
R00000000[["📁holer"]] --> R000000000[["📁server"]]
R0000000[["📁org"]] --> R00000000[["📁holer"]]
R000000[["📁java"]] --> R0000000[["📁org"]]
R00000[["📁main"]] --> R000000[["📁java"]]
R0000[["📁src"]] --> R00000[["📁main"]]
R000[["📁holer-server"]] --> R0000[["📁src"]]
R00[["📁holer-server.zip.extract"]] --> R000[["📁holer-server"]]
R0[["📁root"]] --> R00[["📁holer-server.zip.extract"]]
end

用一张Markdown表格简要描述以下文件的功能:

文件名 功能
HolerType.java 定义了Holer服务器支持的网络协议类型
ServerConst.java 定义了服务器相关的常量字段
HolerCode.java 定义了Holer服务器的状态码和消息文本
HolerLicense.java 定义了Holer服务器的许可证信息模型
HolerPort.java 定义了Holer服务器的端口信息模型
HolerStatus.java 定义了Holer服务器的状态信息模型
HolerClient.java 定义了Holer服务器的客户端信息模型
HolerUser.java 定义了Holer服务器的用户信息模型
HolerData.java 定义了Holer服务器的数据信息模型
HolerResult.java 定义了Holer服务器的通用结果封装模型
HolerException.java 定义了Holer服务器的异常类
HolerReport.java 定义了Holer服务器的报告信息模型
HolerApi.java 定义了Holer服务器的API接口信息模型
HolerChannel.java 定义了Holer服务器的通道信息模型
DBUserService.java 定义了对用户表进行数据库操作的接口
DBPortService.java 定义了对端口表进行数据库操作的接口

以上这些文件属于Holer服务器项目的不同模块,功能涵盖了启动服务器、连接和数据传输、异常处理、数据管理、结果封装、API接口定义和数据库操作等。综合来说,该程序的整体功能是实现一个Holer服务器,用于将本地服务映射到公网,实现内网穿透功能。

概括这些文件的整体功能:这些文件的整体功能是实现一个Holer服务器,包括定义服务器常量字段、状态码和消息文本、许可证信息、端口信息、状态信息、客户端信息、用户信息、数据信息、结果封装、异常处理、报告信息、API接口信息和通道信息模型,以及对用户表和端口表进行数据库操作。

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
flowchart LR
%% <gpt_academic_hide_mermaid_code> 一个特殊标记,用于在生成mermaid图表时隐藏代码块
classDef Comment stroke-dasharray: 5 5
subgraph 项目示意图
R00000000000["🗎HolerType.java"] -.-x CR00000000000["`该程序文件是一个Ja
va枚举类,命名为H
olerType。该
枚举类定义了一些常见
的网络协议类型,如H...`"]:::Comment
R0000000000[["📁constant"]] --> R00000000000["🗎HolerType.java"]
R00000000001["🗎ServerConst.java"] -.-x CR00000000001["`该文件是一个Java
类文件,位于org.
holer.serv
er.constan
t包下。该类中定义了...`"]:::Comment
R0000000000[["📁constant"]] --> R00000000001["🗎ServerConst.java"]
R00000000002["🗎HolerCode.java"] -.-x CR00000000002["`这是一个名为Hole
rCode.java
的文件,位于src/
main/java/
org/holer/...`"]:::Comment
R0000000000[["📁constant"]] --> R00000000002["🗎HolerCode.java"]
R000000000[["📁server"]] --> R0000000000[["📁constant"]]
R00000000010["🗎HolerLicense.java"] -.-x CR00000000010["`这个程序文件名为Ho
lerLicense
.java,位于or
g.holer.se
rver.model...`"]:::Comment
R0000000001[["📁model"]] --> R00000000010["🗎HolerLicense.java"]
R00000000011["🗎HolerPort.java"] -.-x CR00000000011["`这个文件是一个Jav
a类文件,文件名为H
olerPort.j
ava。该类位于or
g.holer.se...`"]:::Comment
R0000000001[["📁model"]] --> R00000000011["🗎HolerPort.java"]
R00000000012["🗎HolerStatus.java"] -.-x CR00000000012["`该文件是一个Java
类文件,位于项目的h
oler-serve
r模块中的org.h
oler.serve...`"]:::Comment
R0000000001[["📁model"]] --> R00000000012["🗎HolerStatus.java"]
R00000000013["🗎HolerClient.java"] -.-x CR00000000013["`这个程序文件是hol
er-server项
目的一部分。它定义了
一个HolerCli
ent类,在数据库表...`"]:::Comment
R0000000001[["📁model"]] --> R00000000013["🗎HolerClient.java"]
R00000000014["🗎HolerUser.java"] -.-x CR00000000014["`该程序文件是一个Ja
va类文件,名为Ho
lerUser.ja
va。该类位于org
.holer.ser...`"]:::Comment
R0000000001[["📁model"]] --> R00000000014["🗎HolerUser.java"]
R00000000015["🗎HolerData.java"] -.-x CR00000000015["`这个程序文件是hol
er-server项
目中的一个Java类
文件,文件名是Hol
erData.jav...`"]:::Comment
R0000000001[["📁model"]] --> R00000000015["🗎HolerData.java"]
R00000000016["🗎HolerResult.java"] -.-x CR00000000016["`该源代码文件是一个名
为HolerResu
lt的Java类,位
于org.holer
.server.mo...`"]:::Comment
R0000000001[["📁model"]] --> R00000000016["🗎HolerResult.java"]
R00000000017["🗎HolerException.java"] -.-x CR00000000017["`这个程序文件是hol
er-server项
目中的一个Java类
文件,文件名为Hol
erExceptio...`"]:::Comment
R0000000001[["📁model"]] --> R00000000017["🗎HolerException.java"]
R00000000018["🗎HolerReport.java"] -.-x CR00000000018["`这个程序文件是hol
er-server项
目中的一个Java类
文件,文件名为Hol
erReport.j...`"]:::Comment
R0000000001[["📁model"]] --> R00000000018["🗎HolerReport.java"]
R00000000019["🗎HolerApi.java"] -.-x CR00000000019["`这是一个Java源代
码文件,文件名为Ho
lerApi.jav
a。该文件包含了一个
名为HolerApi...`"]:::Comment
R0000000001[["📁model"]] --> R00000000019["🗎HolerApi.java"]
R000000000110["🗎HolerChannel.java"] -.-x CR000000000110["`这个程序文件是hol
ler-server
项目中的一个Java
类文件,位于路径or
g.holler.s...`"]:::Comment
R0000000001[["📁model"]] --> R000000000110["🗎HolerChannel.java"]
R000000000[["📁server"]] --> R0000000001[["📁model"]]
R00000000020["🗎DBUserService.java"] -.-x CR00000000020["`这个文件是 DBUs
erService.
java,它位于 h
oler-serve
r.zip.e...`"]:::Comment
R0000000002[["📁db"]] --> R00000000020["🗎DBUserService.java"]
R00000000021["🗎DBPortService.java"] -.-x CR00000000021["`这是一个名为DBPo
rtService.
java的Java源
代码文件,属于hol
er-server....`"]:::Comment
R0000000002[["📁db"]] --> R00000000021["🗎DBPortService.java"]
R000000000[["📁server"]] --> R0000000002[["📁db"]]
R00000000[["📁holer"]] --> R000000000[["📁server"]]
R0000000[["📁org"]] --> R00000000[["📁holer"]]
R000000[["📁java"]] --> R0000000[["📁org"]]
R00000[["📁main"]] --> R000000[["📁java"]]
R0000[["📁src"]] --> R00000[["📁main"]]
R000[["📁holer-server"]] --> R0000[["📁src"]]
R00[["📁holer-server.zip.extract"]] --> R000[["📁holer-server"]]
R0[["📁root"]] --> R00[["📁holer-server.zip.extract"]]
end

用一张Markdown表格简要描述以下文件的功能:根据以上分析,用一句话概括程序的整体功能。

文件路径 文件功能描述
holer-server/src/main/java/org/holer/server/
db/DBClientService.java
定义数据库客户端服务接口,提供对Holer客户端的基本操作
holer-server/src/main/java/org/holer/server/
interceptor/ApiInterceptor.java
处理HTTP请求前的拦截操作,检查令牌是否有效
holer-server/src/main/java/org/holer/server/
interceptor/ViewInterceptor.java
处理请求前的拦截操作,检查会话和令牌是否有效
holer-server/src/main/java/org/holer/server/
rest/RESTClientService.java
提供Holer客户端的RESTful API接口,包括查询、新增、更新和删除
holer-server/src/main/java/org/holer/server/
rest/RESTUserService.java
提供用户登录和退出的RESTful API接口
holer-server/src/main/java/org/holer/server/
rest/RESTPortService.java
提供端口管理的RESTful API接口,包括查询、新增、更新和删除
holer-server/pom.xml Maven项目配置文件,定义项目的依赖和构建配置
holer-server/assembly.xml 组装和打包Holer Server项目的配置文件

总体来说,程序的整体功能是实现Holer服务器,包括数据库服务、拦截器、RESTful API接口和打包部署配置。

概括这些文件的整体功能:这些文件的整体功能是实现Holer服务器,包括定义数据库操作接口、拦截器类、RESTful API接口和项目构建、打包、部署配置。

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
flowchart LR
%% <gpt_academic_hide_mermaid_code> 一个特殊标记,用于在生成mermaid图表时隐藏代码块
classDef Comment stroke-dasharray: 5 5
subgraph 项目示意图
R00000000000["🗎DBClientService.java"] -.-x CR00000000000["`这是一个名为DBCl
ientServic
e.java的Jav
a文件,位于hole
r-server.z...`"]:::Comment
R0000000000[["📁db"]] --> R00000000000["🗎DBClientService.java"]
R000000000[["📁server"]] --> R0000000000[["📁db"]]
R00000000010["🗎ApiInterceptor.java"] -.-x CR00000000010["`这个程序文件是一个名
为ApiInterc
eptor.java
的拦截器类,用于处理
HTTP请求之前的拦...`"]:::Comment
R0000000001[["📁interceptor"]] --> R00000000010["🗎ApiInterceptor.java"]
R00000000011["🗎ViewInterceptor.java"] -.-x CR00000000011["`这个程序文件是一个名
为ViewInter
ceptor的类,实
现了HandlerI
nterceptor...`"]:::Comment
R0000000001[["📁interceptor"]] --> R00000000011["🗎ViewInterceptor.java"]
R000000000[["📁server"]] --> R0000000001[["📁interceptor"]]
R00000000020["🗎RESTClientService.java"] -.-x CR00000000020["`这是一个名为REST
ClientServ
ice.java的J
ava文件。它位于h
oler-serve...`"]:::Comment
R0000000002[["📁rest"]] --> R00000000020["🗎RESTClientService.java"]
R00000000021["🗎RESTUserService.java"] -.-x CR00000000021["`这个文件是一个名为R
ESTUserSer
vice的Java类
,位于holer-s
erver.zip....`"]:::Comment
R0000000002[["📁rest"]] --> R00000000021["🗎RESTUserService.java"]
R00000000022["🗎RESTPortService.java"] -.-x CR00000000022["`该程序文件为一个RE
STful风格的端口
服务类,用于处理和管
理端口的增删改查操作
。该类包含以下主...`"]:::Comment
R0000000002[["📁rest"]] --> R00000000022["🗎RESTPortService.java"]
R000000000[["📁server"]] --> R0000000002[["📁rest"]]
R00000000[["📁holer"]] --> R000000000[["📁server"]]
R0000000[["📁org"]] --> R00000000[["📁holer"]]
R000000[["📁java"]] --> R0000000[["📁org"]]
R00000[["📁main"]] --> R000000[["📁java"]]
R0000[["📁src"]] --> R00000[["📁main"]]
R000[["📁holer-server"]] --> R0000[["📁src"]]
R0001["🗎pom.xml"] -.-x CR0001["`这个文件是一个 Ma
ven 的 POM(
Project Ob
ject Model
)文件,用于构建 h...`"]:::Comment
R000[["📁holer-server"]] --> R0001["🗎pom.xml"]
R0002["🗎assembly.xml"] -.-x CR0002["`这个程序文件是一个X
ML配置文件,用于指
定Holer Ser
ver项目的打包和组
装方式。它包含...`"]:::Comment
R000[["📁holer-server"]] --> R0002["🗎assembly.xml"]
R00[["📁holer-server.zip.extract"]] --> R000[["📁holer-server"]]
R0[["📁root"]] --> R00[["📁holer-server.zip.extract"]]
end
l

做任何事都非常厉害的诀窍,这3点你记好

记得高中时特喜欢看《名侦探柯南》,剧情对逻辑能力有一定考验,看起来还是比较烧脑的。

所以那时堂主就有意识不断提升自己的逻辑思维能力,也发现了自己因为该项能力不足而产生的各种问题。

每天那么多事情,还是不知道从哪里做起,总是手忙脚乱……

公开讲话或展示报告,总表达不出重点,心里特着急……

看书写文也是随心情,真正下笔时,不知道从何下手……

所以当看到这个同学的留言,真的很有共鸣:

堂主,我有一个疑问想求解答。像《金字塔原理》等这类书籍,看完后感觉想要真正融入实践去运用好难,不知道这是认知问题还是思维习惯的培养或者其他原因呢?

这本书堂主也看了几遍,最后发现,逻辑思维不好,既是思维固化的原因,也是认知以及方法论的问题。

所以,今天给大家分享的这篇文章,能够一定意义上帮助大家解决留言类似问题。

相信我,如果你借鉴文章中的一些方法,逻辑思维会有巨大提升!

01.

沟通框架法

日常沟通中,没有逻辑框架的表达差别,是很明显的。

比如你通知同事开会:

逻辑不清者:

下午3点开会,记得提前10分钟过来开空调到25°,在桌子上摆上景田,总监爱喝;

他下午要来总结月度目标,顺便帮我通知下其他人,在110会议室~

很可能到时候同事忘记通知其他人,晚到了半个小时,你也喝不上怡宝,被总监请去喝茶了……

有逻辑者:

今天下午3点,总监要来110会议室开月会,辛苦你通知下其他人;

再麻烦提前10分钟过来开好25°的空调,摆上总监爱喝的怡宝。

先说总体事项,再说细节,最后搭上同事个人收益。

下面堂主分享3个框架模型,可以作为形成你个人方法论的参考。

1、 工作沟通:STAR模型

这个模型能帮你轻松通过面试、工作汇报。

我们最大的问题,就是不懂如何有逻辑地向领导或面试官,展示自己的优势,以及工作的成果。

明明打好了满肚子的腹稿,一出口就变成了:“额……额……”

这种情况面试官内心独白估计是赶紧打发回去吧。

掌握好STAR模型的工作沟通方法,让你能够非常清楚自己需要表达什么。

S——情境(situation),事情是在什么情况发生的?

T——目标(target),你是如何明确自己的任务?

A——**行动(action)**,根据目标采取什么行动?

R——**结果(result)**,最后结果如何,个人有什么收获?

不需太啰嗦,每个点说1-2句即可。

举个面试例子,一个想去新媒体公司的大学生,自我介绍时可以这么说:

在校期间我是学校官方微信号的负责人(s);

我的主要任务是官方校园动态、和学生有趣槽点的推送,以及指导新社员(T)

在2年内我参考了近100个高校官微的运营模式,同时业余参加新媒体课程、请教老师(A)

最后总结了一套自己的写作模式和运营模式,经过验证,官微阅读量从6k上升到1.5w,自己拥有了5k粉丝量的个人账号。(R)

不到一分钟的时间,有条理地表达自己的工作成果,充分展现自己的个人能力。

2、 情感沟通:FOSSA模型

很多争吵都是因为情绪表达不到位,加剧了矛盾火力,越吵越凶。之后即便你有情绪,那么不妨在沟通之前,想想下面几个问题。

图片

另外在我们的人生道路上,永远不要发生无谓的冲突,你要清楚自己是一块宝石,犯不着和石头硬碰硬。

如果碰到烂人尽量大事化小,小事化了,实在触及到底线,再适当予以反击。

3、 阅读拆解:SQ3R模型

有逻辑地进行阅读,能大大提高你的读书吸收效率。

大多人都是拿本书就看,看完一头雾水,讨论起书中内容开始蒙了。

用SQ3R阅读模型框架,能轻松帮你理清思路,用最短的时间得到更多的知识点。

图片

同时阅读笔记很重要,绝对不只是单纯的“ctrl+v”、“ctrl+c”****,没经过思考的笔记,就算记得又臭又长也毫无用处,因为你根本不会去看。

02.

思维清单法

这是逆转你思考方式的方法,对生活工作都特别有帮助。

逻辑性强的人,善于解构任务,化繁为简,剔除无用信息, 能用更短的时间解决更多的事情。

这就是锻炼逻辑思维的好处和目的——替自己和别人省出更多时间,而时间就是金钱。

刚刚毕业时候做公司报告,我很认真写了30-50来张ppt。

结果当天被领导点名批评:废话连篇,乱七八糟,抓不住重点。

最后参考了一个思考顺序清单,通过大量练习,之后每次总结都基本能够得到领导的认可。

这个思维清单中和了「演绎推理法」「归纳整理法」****,能让你从时间、空间、事情重要程度等方面,进行全方位思考。

你遇到的每个难题,只要按照以下清单顺序考虑,都能迎刃而解,效果真不是吹的,谁用谁知道!

第一步:结论先行

第二步:分析情况

第三步:解决方法

第四步:时间规划

第五步:开始行动

举个应用例子,方便大家理解具体的操作方法:

你是新媒体公司的实习生, 现在要进行转正答辩,怎么有逻辑地表达自己3个月的工作成果?

第一步:结论先行

先把3个月的工作成果展示出来,让领导看到完成值。

这是特别重要的一点!不管报告还是沟通,先说结论能节省所有人的时间。

第二步:分析情况

列出影响数据的分析原因、工作亮点与不足、工作收获等……

这部分要遵循总分总原则,由上到下层层递进,带着“为什么会这样、如何改善”的思维,去剖析出每个问题。

第三步:确定方法

针对所有问题,用归纳法整理出“时间、空间”所有解决的方法、再用演绎法写出,每个能具体实施的方案。

比如:家离公司太远,通勤时间过长,学习时间过少。

时间上:每天提前半小时起床、或在上班途中学习、增大工作密度。

空间上:搬家,缩短空间距离。

第四步:时间规划

这一步,要根据自己的解决方法,和事情的重要程度,列成一个工作规划表:

先做什么、再做什么、之后做什么、最后做什么?

第五步:开始行动

如果不行动,上面所有的逻辑推理都是在纸上谈兵,只会让我们的思维认知停留在原地,毫无长进,所以,行动才是关键啊!

03.

持续积累法

接下来这句话,可能会让你恍然大悟!

其实很多时候,不是因为我们逻辑不好,而是我们的知识存量是有限!了解的事情太少,导致逻辑联系不起来。

想升级自己的逻辑思维,最根本的方法,就是扩大自己的知识储备。

接下来堂主就分享3种提升思维的认知渠道,就算只坚持10天半个月,也有很大的成效!

1. 尝试演讲,形成应激反应

能够参加演讲、辩论类的人,逻辑思维都会比一般人好很多,所以模仿优秀的人,也是很好的提升方法。

长期坚持下来,你就会遇事不慌,面对一切新挑战、繁琐工作,都能迅速上手~

图片

同时,生活中也要抓住一切机会,锻炼自己的表达能力,这里分享2个小细节:

1) 线上工作沟通时,需回复较长信息,可以刻意练习这个回复结构,来表达自己的观点:

第一、第二、第三……

2) 与人沟通时,也同样刻意练习:我有三个方面要说,123……

咳咳,这里我也有三句话要说, 大家注意啦!

第一,能坚持看到这里的同学好优秀!文章快结束了,再坚持坚持哦~

第二,如果喜欢这篇文章的话,记得保存下来,方便以后查看哦~

第三,答应我, 看完去输出个思维导图大纲,这是你提高逻辑思维第一步~

2.看思辨类节目,代入正确角色

这时有人要问了:堂主,我也没少看节目啊,我还是没长进啊。

为什么会这样?

因为你自动代入了观众角色啊,本来正方立场,结果反方一发言,你就觉得:啊好对好对,我怎么没想到!这时正方又把你拽回来:是啊是啊,就是这样!老铁懂我!

一直被别人牵着鼻子走,要是你在现场,估计投票键都会被你摁烂了。

代入选手角色, 选正方,就坚定做正方,选反方,就坚定做反方。

对方一发言,不是想着对对对,而是:不对,他有漏洞,忽略了客观角度,巴拉巴拉。队友发言,也不急着赞同,同样分析他的逻辑表达方式。

吃透这边的论证后,再换个立场训练,你会发现一期节目你得看3456遍,你才能彻底了解辩题的所有角度,客观地表达最正确的想法。

3. 读思辨类书籍,繁殖知识量

这个重要性,就不用我再多说啦,只有看更专业的书籍,才能更全面了解思维模型,废话不多说,直接上推荐书籍。

1)入门书籍,引起你纠正思维的兴趣:

图片

小学生也可以读的启蒙思维书籍,说一个道理搭配几个生活事例, 特别简单粗暴。

很喜欢这句话:人是生而自由的,却无往不在枷锁之中。

图片

完美不枯燥的一本书,书不厚但很耐读,干货特别多,故事很有趣。

从5个方面来帮助你形成自己的方法论:定义问题-分析问题-由谁解决问题-问题来自哪里-如何做一个问题解决者。

2)进阶书籍,系统学习深度思考

图片

前身是《学会提问》,我们最缺的就是批判性思维,这本是入门最佳之选,算是理性“杠精”指南,让你学会理智独立思考,就算说不过别人,也别被别人骗。

图片

读完可以立马用的干货书,书评有句话令人深思:“只要你有批判性思维你就能批判自己的思维”。

最后,送大家两句话,一起共勉:

1、 无论一个问题多么复杂,如果能以正确的方式去看待,它都会变得简单起来。

2、 花半秒钟就看透事物本质的人,和花一辈子都看不清事物本质的人,注定是截然不同的命运。

愿你能养成善于思考的习惯,生活中增加思考频次,慢慢掌握洞察事情本事的能力,点个「在看」,一起成为逻辑大神吧~

l

DBeaver Ultimate Edition 免费破解使用

背景

免费版本不支持导出excel格式,所以得想办法使用ue版本。

系统环境

  • 系统: macos 14.2.1/macos 10.13.6
  • SOC: m1 pro/intel

安装DBeaver UE

官方安装包下载地址 https://downloads.dbeaver.net/ultimate/23.3.0/dbeaver-ue-23.3.0-macos-x86_64.dmg

下载agent

链接: https://pan.baidu.com/s/1xWo75x9HiWDyQajGY9TUKw?pwd=a16r 提取码: a16r,下载并解压,放到一个专门的目录,下面会用到

修改 DBeaver UE

在应用程序里,右键显示包内容,找到dbeaver.ini (/Applications/DBeaverUltimate.app/Contents/Eclipse/dbeaver.ini)

找到 -vm,替换原始java路径,修改如下

1
2
3
4
-vm

# 你的java路径,如果本地没java环境,需要安装java环境。
/Library/Java/JavaVirtualMachines/zulu-20.jdk/Contents/Home/bin/java

然后在文件末尾添加如下两行

1
2
3
4
-Dlm.debug.mode=true

# 你下载的agent解压后的dbeaver-agent.jar的路径
-javaagent:/Users/xxx/Downloads/dbeaver-agent/dbeaver-agent.jar

修改Hosts

1
2
# dbeaver start
127.0.0.1 dbeaver.com

打开DBeaver UE

打开安装好的DBeaver UE,如果闪退或提示已损坏,请自行搜索解决办法。打开后,会提示让你输入注册码,输入下面的注册码即可

1
2
3
4
5
aYhAFjjtp3uQZmeLzF3S4H6eTbOgmru0jxYErPCvgmkhkn0D8N2yY6ULK8oT3fnpoEu7GPny7csN
sXL1g+D+8xR++/L8ePsVLUj4du5AMZORr2xGaGKG2rXa3NEoIiEAHSp4a6cQgMMbIspeOy7dYWX6
99Fhtpnu1YBoTmoJPaHBuwHDiOQQk5nXCPflrhA7lldA8TZ3dSUsj4Sr8CqBQeS+2E32xwSniymK
7fKcVX75qnuxhn7vUY7YL2UY7EKeN/AZ+1NIB6umKUODyOAFIc8q6zZT8b9aXqXVzwLJZxHbEgcO
8lsQfyvqUgqD6clzvFry9+JwuQsXN0wW26KDQA==

如无意外,目前应该已经破解成功了。

破解成功

l