main
parent
cdef53f505
commit
f27ac51a79
@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-13
|
||||||
|
category:
|
||||||
|
- Linux
|
||||||
|
tag:
|
||||||
|
- pacman
|
||||||
|
- Arch
|
||||||
|
- ArchLinux
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Arch 关于pacman的常用指令
|
||||||
|
## 关于pacman的常用指令:
|
||||||
|
### 5.1 pacman -S 指令:安装
|
||||||
|
```bash
|
||||||
|
sudo pacman -S #安装软件
|
||||||
|
sudo pacman -Sy #获取最新打软件情况,如果已经是最新了,直接会提示已经更新到最新了。
|
||||||
|
sudo pacman -Syy #强行更新你的应用的软件库(源)
|
||||||
|
sudo pacman -Su #更新所有软件
|
||||||
|
sudo pacman -Syu #更新软件源并更新你的软件
|
||||||
|
sudo pacman -Syyu #强行更新一遍,再更新软件
|
||||||
|
sudo pacman -Ss <pkg_name> #查询所有软件名里面带有<pkg_name>相关的软件。
|
||||||
|
sudo pacman -Sc #删除软件/var目录下的缓存
|
||||||
|
```
|
||||||
|
### 5.2 pacman -R 指令:删除
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo pacman -R <pkg_name> #删除软件
|
||||||
|
sudo pacman -Rs <pkg_name> #删除软件,并删除<pkg>所有的依赖包
|
||||||
|
sudo pacman -Rns <pkg_name> #删除软件,并删除<pkg>所有的依赖,并删掉<pkg>的全局配置文件。 推荐!!
|
||||||
|
```
|
||||||
|
### 5.3 pacman -Q 指令:查询
|
||||||
|
```bash
|
||||||
|
sudo pacman -Q #显示出所有软件 sudo pacman -Q | wc -l 查询数量
|
||||||
|
sudo pacman -Qe #查询所有自己安装的软件
|
||||||
|
sudo pacman -Qeq #查询所有自己安装的软件,只显示包名,不显示版本号等
|
||||||
|
sudo pacman -Qs <pkg_name> #查询本地安装的所有带<pkg_name>的软件
|
||||||
|
sudo pacman -Qdt #查询所有孤儿软件,不再被需要的。
|
||||||
|
sudo pacman -Qdtq #查询所有不再被依赖的包名
|
||||||
|
```
|
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-02-09
|
||||||
|
category:
|
||||||
|
- .Net
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# C# .Net Standard 类库版本 对应。.NetCore 和 .Net Framework 支持
|
||||||
|
![image-1675923628386](https://local.wuanwanghao.top:9000/test/test/image-1675923628386.png)
|
||||||
|
|
||||||
|
|
||||||
|
.Net Standard 是一种规范
|
||||||
|
.Net Core 的出现是微软为了在 .Net 复杂概念中一种解决方法。并且实现了跨平台的功能 .Net Core 可以看做是一种新类型的规范 ,当然也有相应的实现。
|
||||||
|
当然 .Net Core 也支持 .Net Standard 规范。
|
||||||
|
![image-1675924247126](https://local.wuanwanghao.top:9000/test/test/image-1675924247126.png)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-01-31
|
||||||
|
category:
|
||||||
|
- cpp
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# C++ 字符串比较的一下方法
|
||||||
|
字符串比较是否包含
|
||||||
|
```
|
||||||
|
bool canConstruct(std::string ransomNote, std::string magazine)
|
||||||
|
{ //字符串等长情况
|
||||||
|
int magazineLength =magazine.length();
|
||||||
|
int ransomNoteLength =ransomNote.length();
|
||||||
|
if(magazineLength == ransomNoteLength){
|
||||||
|
for (size_t i = 0; i < ransomNoteLength; i++)
|
||||||
|
{
|
||||||
|
if(magazine[i]!=ransomNote[i]){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (magazineLength > ransomNoteLength)
|
||||||
|
{
|
||||||
|
int temp= 0;
|
||||||
|
for (size_t i = 0; i < magazineLength; i++)
|
||||||
|
{
|
||||||
|
if(magazine[i]==ransomNote[temp]){
|
||||||
|
temp++;
|
||||||
|
}else{
|
||||||
|
temp = 0;
|
||||||
|
}
|
||||||
|
if(temp==ransomNoteLength){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-10-17
|
||||||
|
category:
|
||||||
|
- Docker
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Docker 安装 minio
|
||||||
|
```
|
||||||
|
docker run -d --name minio \
|
||||||
|
-p 9000:9000 \
|
||||||
|
-p 9001:9001 \
|
||||||
|
--restart=always \
|
||||||
|
-e MINIO_ACCESS_KEY=minio \
|
||||||
|
-e MINIO_SECRET_KEY=minio123 \
|
||||||
|
-e "MINIO_BROWSER_REDIRECT_URL=https://local.wuanwanghao.top:9001" \
|
||||||
|
-e "MINIO_SERVER_URL=https://local.wuanwanghao.top:9000" \
|
||||||
|
-v /home/wanghao/minio/config:/root/.minio \
|
||||||
|
-v /home/wanghao/minio/data1:/data1 \
|
||||||
|
-v /home/wanghao/minio/data2:/data2 \
|
||||||
|
-v /home/wanghao/minio/data3:/data3 \
|
||||||
|
-v /home/wanghao/minio/data4:/data4 \
|
||||||
|
minio/minio server /data{1...4} --console-address ":9001" -address ":9000"
|
||||||
|
```
|
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2021-09-15
|
||||||
|
category:
|
||||||
|
- 默认分类
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Hello Halo
|
||||||
|
## Hello Halo
|
||||||
|
|
||||||
|
如果你看到了这一篇文章,那么证明你已经安装成功了,感谢使用 [Halo](https://halo.run) 进行创作,希望能够使用愉快。
|
||||||
|
|
||||||
|
## 相关链接
|
||||||
|
|
||||||
|
- 官网:[https://halo.run](https://halo.run)
|
||||||
|
- 文档:[https://docs.halo.run](https://docs.halo.run)
|
||||||
|
- 社区:[https://bbs.halo.run](https://bbs.halo.run)
|
||||||
|
- 主题仓库:[https://halo.run/themes.html](https://halo.run/themes.html)
|
||||||
|
- 开源地址:[https://github.com/halo-dev/halo](https://github.com/halo-dev/halo)
|
||||||
|
|
||||||
|
在使用过程中,有任何问题都可以通过以上链接找寻答案,或者联系我们。
|
||||||
|
|
||||||
|
> 这是一篇自动生成的文章,请删除这篇文章之后开始你的创作吧!
|
||||||
|
|
@ -0,0 +1,74 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2021-10-16
|
||||||
|
category:
|
||||||
|
- Docker
|
||||||
|
- Linux
|
||||||
|
tag:
|
||||||
|
- Docker
|
||||||
|
- linux
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Linux 安装 Docker
|
||||||
|
|
||||||
|
# centos下安装docker
|
||||||
|
> 其他系统参照如下文档
|
||||||
|
|
||||||
|
https://docs.docker.com/engine/install/centos/
|
||||||
|
## 1、移除以前docker相关包
|
||||||
|
``` shell
|
||||||
|
sudo yum remove docker \
|
||||||
|
docker-client \
|
||||||
|
docker-client-latest \
|
||||||
|
docker-common \
|
||||||
|
docker-latest \
|
||||||
|
docker-latest-logrotate \
|
||||||
|
docker-logrotate \
|
||||||
|
docker-engine
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2、配置yum源
|
||||||
|
``` shell
|
||||||
|
sudo yum install -y yum-utils
|
||||||
|
sudo yum-config-manager \
|
||||||
|
--add-repo \
|
||||||
|
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3、安装docker
|
||||||
|
``` shell
|
||||||
|
sudo yum install -y docker-ce docker-ce-cli containerd.io
|
||||||
|
|
||||||
|
|
||||||
|
#以下是在安装k8s的时候使用
|
||||||
|
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4、启动
|
||||||
|
```
|
||||||
|
systemctl enable docker --now #--now 立即执行
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5、配置加速
|
||||||
|
这里额外添加了docker的生产环境核心配置cgroup
|
||||||
|
``` json
|
||||||
|
sudo mkdir -p /etc/docker
|
||||||
|
|
||||||
|
sudo tee /etc/docker/daemon.json <<-'EOF'
|
||||||
|
{
|
||||||
|
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
|
||||||
|
"exec-opts": ["native.cgroupdriver=systemd"],
|
||||||
|
"log-driver": "json-file",
|
||||||
|
"log-opts": {
|
||||||
|
"max-size": "100m"
|
||||||
|
},
|
||||||
|
"storage-driver": "overlay2"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
|
||||||
|
sudo systemctl restart docker
|
||||||
|
```
|
@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-10-25
|
||||||
|
category:
|
||||||
|
- Rust
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Rust 文件加解密
|
||||||
|
```Cargo.toml```
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
aes = "0.7.5"
|
||||||
|
block-modes = "0.8.1"
|
||||||
|
hex-literal = "0.2.1"
|
||||||
|
rand = "0.8.4"
|
||||||
|
bytebuffer = "0.2.1"
|
||||||
|
base64 = "0.13.0"
|
||||||
|
```
|
||||||
|
main.rs
|
||||||
|
```rust
|
||||||
|
use aes::Aes256;
|
||||||
|
use block_modes::{BlockMode, Cbc};
|
||||||
|
use block_modes::block_padding::Pkcs7;
|
||||||
|
use rand::seq::SliceRandom;
|
||||||
|
use std::fs;
|
||||||
|
type AesCbc = Cbc<Aes256, Pkcs7>;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::prelude::*;
|
||||||
|
const BASE_STR: &str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
const KEY:&str = "01234567012345670123456701234567";
|
||||||
|
fn gen_ascii_chars(size: usize) -> String {
|
||||||
|
let mut rng = &mut rand::thread_rng();
|
||||||
|
String::from_utf8(
|
||||||
|
BASE_STR.as_bytes()
|
||||||
|
.choose_multiple(&mut rng, size)
|
||||||
|
.cloned()
|
||||||
|
.collect()
|
||||||
|
).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn encrypt(key: &str, data: &[u8]) -> String {
|
||||||
|
let iv_str = gen_ascii_chars(16);
|
||||||
|
let iv = iv_str.as_bytes();
|
||||||
|
let cipher = AesCbc::new_from_slices(key.as_bytes(), iv).unwrap();
|
||||||
|
let ciphertext = cipher.encrypt_vec(data);
|
||||||
|
let mut buffer = bytebuffer::ByteBuffer::from_bytes(iv);
|
||||||
|
buffer.write_bytes(&ciphertext);
|
||||||
|
base64::encode(buffer.to_bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn decrypt(key: &str, data: &str) -> String {
|
||||||
|
let bytes = base64::decode(data).unwrap();
|
||||||
|
let cipher = AesCbc::new_from_slices(key.as_bytes(), &bytes[0..16]).unwrap();
|
||||||
|
String::from_utf8_lossy(cipher.decrypt_vec(&bytes[16..]).unwrap().as_slice()).to_string()
|
||||||
|
}
|
||||||
|
fn decryptToByte(key: &str, data: &str) -> Vec<u8> {
|
||||||
|
let bytes = base64::decode(data).unwrap();
|
||||||
|
let cipher = AesCbc::new_from_slices(key.as_bytes(), &bytes[0..16]).unwrap();
|
||||||
|
cipher.decrypt_vec(&bytes[16..]).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn encodefile(path:&str,encodePath:&str){
|
||||||
|
//let plaintext = "hello worldsssss";
|
||||||
|
let plaintext = fs::read(path).unwrap();
|
||||||
|
let classstr = String::from_utf8_lossy(plaintext.as_slice()).to_string();
|
||||||
|
let enc = encrypt(KEY, plaintext.as_slice());
|
||||||
|
// println!("{}", enc);
|
||||||
|
let dec = decrypt(KEY, &enc);
|
||||||
|
assert_eq!(classstr, dec);
|
||||||
|
// println!("{}", dec);
|
||||||
|
let mut file = File::create(encodePath).unwrap();
|
||||||
|
file.write(enc.as_bytes()).unwrap();
|
||||||
|
}
|
||||||
|
fn decodefile(path:&str,decodePath:&str){
|
||||||
|
let plaintext = fs::read(path).unwrap();
|
||||||
|
let classstr = String::from_utf8_lossy(plaintext.as_slice()).to_string();
|
||||||
|
// let dec = decrypt(key, &classstr);
|
||||||
|
let decodeBytes = decryptToByte(KEY,&classstr);
|
||||||
|
let mut file = File::create(decodePath).unwrap();
|
||||||
|
file.write(decodeBytes.as_slice()).unwrap();
|
||||||
|
}
|
||||||
|
fn main() {
|
||||||
|
encodefile("C:\\Users\\61778\\Desktop\\HelloWorld.class","C:\\Users\\61778\\Desktop\\test1\\HelloWorldDE.class");
|
||||||
|
decodefile("C:\\Users\\61778\\Desktop\\test1\\HelloWorldDE.class","C:\\Users\\61778\\Desktop\\test1\\HelloWorld.class");
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2021-10-18
|
||||||
|
tag:
|
||||||
|
- SpringCloud
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Spring Cloud 一些组件 网上自建项目地址
|
||||||
|
## 注册中心
|
||||||
|
### nacos
|
||||||
|
>[nacos](http://114.115.184.124:8848/nacos)
|
||||||
|
## 流控中心
|
||||||
|
### sentinel
|
||||||
|
>[sentinel](http://114.115.184.124:8858/)
|
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-07-04
|
||||||
|
category:
|
||||||
|
- 内网穿透
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# Windows 10上开启路由转发
|
||||||
|
[打开windows路由转发功能](https://docker.blog.csdn.net/article/details/11700553?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-11700553-blog-122132109.pc_relevant_multi_platform_whitelistv2&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-11700553-blog-122132109.pc_relevant_multi_platform_whitelistv2&utm_relevant_index=1)
|
||||||
|
|
||||||
|
[Windows 10上开启路由转发及添加路由](https://blog.csdn.net/weixin_44647835/article/details/109616688?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-109616688-blog-11700553.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-109616688-blog-11700553.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=1)
|
@ -0,0 +1,69 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-11
|
||||||
|
category:
|
||||||
|
- Linux
|
||||||
|
tag:
|
||||||
|
- alist
|
||||||
|
- raidrive
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# alist 和 raidrive 组建本地网络硬盘
|
||||||
|
[alist 官网](https://alist.nn.ci/)
|
||||||
|
[raidrive 官网](https://www.raidrive.com/)
|
||||||
|
|
||||||
|
### 下载安装
|
||||||
|
[AList Release](https://github.com/Xhofe/alist/releases) 下载自己需要的版本
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 解压下载的文件,得到可执行文件:
|
||||||
|
tar -zxvf alist-xxxx.tar.gz
|
||||||
|
# 授予程序执行权限:
|
||||||
|
chmod +x alist
|
||||||
|
# 运行程序
|
||||||
|
./alist server
|
||||||
|
# 获得管理员信息
|
||||||
|
./alist admin
|
||||||
|
```
|
||||||
|
|
||||||
|
### 守护进程
|
||||||
|
|
||||||
|
使用任意方式编辑 `/usr/lib/systemd/system/alist.service` 并添加如下内容,其中 path_alist 为 AList 所在的路径
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=alist
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
WorkingDirectory=path_alist
|
||||||
|
ExecStart=path_alist/alist server
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
然后,执行 `systemctl daemon-reload` 重载配置,现在你可以使用这些命令来管理程序:
|
||||||
|
|
||||||
|
- 启动: `systemctl start alist`
|
||||||
|
- 关闭: `systemctl stop alist`
|
||||||
|
- 配置开机自启: `systemctl enable alist`
|
||||||
|
- 取消开机自启: `systemctl disable alist`
|
||||||
|
- 状态: `systemctl status alist`
|
||||||
|
- 重启: `systemctl restart alist`
|
||||||
|
|
||||||
|
### raidrive 下载安装
|
||||||
|
windows 下
|
||||||
|
[raidrive 官网](https://www.raidrive.com/) 下载radrive 安装包安装
|
||||||
|
|
||||||
|
安装完成后
|
||||||
|
点击```添加``` 选择```NAS``` 选择```WebDAV```
|
||||||
|
根据需要添加是否时https 选择 不是就把 地址框的对勾取消
|
||||||
|
输入alist 地址 和端口
|
||||||
|
输入alist 账号 密码
|
||||||
|
![image-1681204409171](https://local.wuanwanghao.top:9000/test/test/image-1681204409171.png)
|
||||||
|
|
@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-01-11
|
||||||
|
category:
|
||||||
|
- 系统配置
|
||||||
|
- cpp
|
||||||
|
tag:
|
||||||
|
- 操作符
|
||||||
|
- 重载
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# c++ 能重载的操作符有那些
|
||||||
|
重载操作符是指重新定义C++中已有运算符的含义。常见的重载操作符有:
|
||||||
|
```
|
||||||
|
算术运算符: +, -, *, /, %
|
||||||
|
关系运算符: ==, !=, >, <, >=, <=
|
||||||
|
逻辑运算符: &&, ||, !
|
||||||
|
赋值运算符: =
|
||||||
|
位运算符: &, |, ^, ~, <<, >>
|
||||||
|
自增/自减运算符: ++, --
|
||||||
|
成员访问运算符: ->, .
|
||||||
|
下标运算符: [ ]
|
||||||
|
函数调用运算符: ( )
|
||||||
|
转型运算符: (type)
|
||||||
|
new 和 delete 运算符: new, delete, new[], delete[]
|
||||||
|
另外还有三个特殊的运算符是可以被重载的:
|
||||||
|
复合赋值运算符: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
|
||||||
|
串联运算符: <<, >>
|
||||||
|
逗号运算符: ,
|
||||||
|
```
|
||||||
|
需要注意的是所有运算符重载都需要在类内部进行,且实现的时候可能需要使用特殊的关键字来实现,如 ```friend``` 和 ```operator```.
|
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-07-15
|
||||||
|
category:
|
||||||
|
- Docker
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# docker 安装 emqx
|
||||||
|
[docker 安装 emqx](https://blog.csdn.net/qq_21137441/article/details/113539310)
|
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-09
|
||||||
|
category:
|
||||||
|
- Docker
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# docker 安装 jenkins
|
||||||
|
```
|
||||||
|
docker run \
|
||||||
|
-u root \
|
||||||
|
-d \
|
||||||
|
--name jenkins \
|
||||||
|
--restart=always \
|
||||||
|
-p 8080:8080 \
|
||||||
|
-p 8888:8888 \
|
||||||
|
-p 50000:50000 \
|
||||||
|
-v /wanghao/jenkins_home:/var/jenkins_home \
|
||||||
|
-v /wanghao/env:/usr/local/env \
|
||||||
|
jenkins/jenkins:latest
|
||||||
|
```
|
@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-06
|
||||||
|
category:
|
||||||
|
- Docker
|
||||||
|
tag:
|
||||||
|
- zfile
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# docker 安装 zfile
|
||||||
|
[官方安装文档](https://docs.zfile.vip/install/os-docker/)
|
||||||
|
### 下载配置文件
|
||||||
|
```shell
|
||||||
|
curl -k -o /home/wanghao/zfile/config/application.properties https://c.jun6.net/ZFILE/application.properties
|
||||||
|
```
|
||||||
|
### 启动
|
||||||
|
``` shell
|
||||||
|
docker run -d --name=zfile --restart=always \
|
||||||
|
-p 8080:8080 \
|
||||||
|
-v /home/wanghao/zfile/db:/root/.zfile-v4/db \
|
||||||
|
-v /home/wanghao/zfile/logs:/root/.zfile-v4/logs \
|
||||||
|
-v /home/wanghao/zfile/file:/data/file \
|
||||||
|
-v /home/wanghao/zfile/config/application.properties:/root/application.properties \
|
||||||
|
zhaojun1998/zfile
|
||||||
|
```
|
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2021-10-17
|
||||||
|
category:
|
||||||
|
- Docker
|
||||||
|
tag:
|
||||||
|
- sentinel
|
||||||
|
- Docker
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# docker部署sentinel
|
||||||
|
## docker 拉取 镜像
|
||||||
|
``` shell
|
||||||
|
docker pull bladex/sentinel-dashboard
|
||||||
|
```
|
||||||
|
## docker 运行 镜像
|
||||||
|
``` shell
|
||||||
|
docker run -d --name sentinel-dashboard -p 8858:8858 --restart=always bladex/sentinel-dashboard
|
||||||
|
```
|
||||||
|
## 访问sentinel
|
||||||
|
```http://ip:8858 #ip:服务器地址```
|
||||||
|
![image.png](/upload/2021/10/image-35a36703c3de4608bb87dc383d088d69.png)
|
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-02-22
|
||||||
|
category:
|
||||||
|
- .Net
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# dotnet core 配置文件 相关配置 复制到编译目录
|
||||||
|
```
|
||||||
|
<ItemGroup>
|
||||||
|
<None Update="config.json"> // 需要配置的配置文件名称
|
||||||
|
// 配置复制到编译目录,文件较新就复制
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
```
|
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-12-26
|
||||||
|
category:
|
||||||
|
- 系统配置
|
||||||
|
tag:
|
||||||
|
- grpc
|
||||||
|
- proto
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# grpc proto 使用 cpp 插件生成协议文件
|
||||||
|
```shell
|
||||||
|
cd D:\vcpkg\grpc_example\proto
|
||||||
|
#cmd
|
||||||
|
protoc --proto_path=. --cpp_out=. ModelGongYi.proto
|
||||||
|
protoc --proto_path=. --grpc_out=. --plugin=protoc-gen-grpc="D:\env\vcpkg\packages\grpc_x64-windows\tools\grpc\grpc_cpp_plugin.exe" ModelGongYi.proto
|
||||||
|
#poweshell
|
||||||
|
./protoc --proto_path=. --cpp_out=. calculate.proto
|
||||||
|
./protoc --proto_path=. --grpc_out=. --plugin=protoc-gen-grpc="D:\env\vcpkg\packages\grpc_x64-windows\tools\grpc\grpc_cpp_plugin.exe" calculate.proto
|
||||||
|
```
|
@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-17
|
||||||
|
category:
|
||||||
|
- Java
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# java 使用 ldap 例子
|
||||||
|
```java
|
||||||
|
import java.util.Hashtable;
|
||||||
|
import javax.naming.AuthenticationException;
|
||||||
|
import javax.naming.CommunicationException;
|
||||||
|
import javax.naming.directory.DirContext;
|
||||||
|
import javax.naming.directory.InitialDirContext;
|
||||||
|
|
||||||
|
public class AdTest {
|
||||||
|
public AdTest() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int connect(String host, String post, String username, String password) {
|
||||||
|
DirContext ctx = null;
|
||||||
|
int rs = 0;
|
||||||
|
String domain = "@example.com"; //ldap 服务器域控
|
||||||
|
String name = username.indexOf(domain) > 0 ? username : username + domain;
|
||||||
|
Hashtable<String, String> HashEnv = new Hashtable();
|
||||||
|
HashEnv.put("java.naming.security.authentication", "simple");
|
||||||
|
HashEnv.put("java.naming.security.principal", name);
|
||||||
|
HashEnv.put("java.naming.security.credentials", password);
|
||||||
|
HashEnv.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
|
||||||
|
HashEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");
|
||||||
|
HashEnv.put("java.naming.provider.url", "ldap://" + host + ":" + post);
|
||||||
|
|
||||||
|
try {
|
||||||
|
ctx = new InitialDirContext(HashEnv);
|
||||||
|
System.out.println("身份验证成功!");
|
||||||
|
} catch (AuthenticationException var22) {
|
||||||
|
System.out.println("身份验证失败!");
|
||||||
|
rs = 1;
|
||||||
|
var22.printStackTrace();
|
||||||
|
} catch (CommunicationException var23) {
|
||||||
|
System.out.println("AD域连接失败!");
|
||||||
|
rs = 2;
|
||||||
|
var23.printStackTrace();
|
||||||
|
} catch (Exception var24) {
|
||||||
|
System.out.println("身份验证未知异常!");
|
||||||
|
rs = 3;
|
||||||
|
var24.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (null != ctx) {
|
||||||
|
try {
|
||||||
|
ctx.close();
|
||||||
|
ctx = null;
|
||||||
|
} catch (Exception var21) {
|
||||||
|
var21.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return rs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-10-01
|
||||||
|
category:
|
||||||
|
- Kubernetes
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# k8s 命令行命令
|
||||||
|
# 删除
|
||||||
|
强制删除pod
|
||||||
|
```
|
||||||
|
kubectl delete pod <podName> -n <namespace> --force --grace-period=0
|
||||||
|
```
|
@ -0,0 +1,83 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-10
|
||||||
|
category:
|
||||||
|
- Linux
|
||||||
|
tag:
|
||||||
|
- git
|
||||||
|
- gitea
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# linux gitea 搭建
|
||||||
|
[官方文档](https://docs.gitea.io/zh-cn/)
|
||||||
|
### 下载可执行文件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mkdir -p /wanghao/gitea
|
||||||
|
cd /wanghao/gitea
|
||||||
|
wget -O gitea https://dl.gitea.com/gitea/1.19.0/gitea-1.19.0-linux-amd64
|
||||||
|
chmod +x gitea
|
||||||
|
```
|
||||||
|
### 验证文件(选作)
|
||||||
|
Gitea 对打包的二进制文件使用 GPG密钥 签名以防止篡改。 请根据对应文件名 .asc 中包含的校验码检验文件的一致性。
|
||||||
|
```shell
|
||||||
|
gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2
|
||||||
|
gpg --verify gitea-1.19.0-linux-amd64.asc gitea-1.19.0-linux-amd64
|
||||||
|
```
|
||||||
|
校验正确时的信息为 Good signature from "Teabot <teabot@gitea.io>"。 校验错误时的信息为 This key is not certified with a trusted signature!。
|
||||||
|
|
||||||
|
### 添加环境变量
|
||||||
|
>```GITEA_WORK_DIR```:工作目录的绝对路径
|
||||||
|
```GITEA_CUSTOM```:默认情况下 Gitea 使用默认目录 ```GITEA_WORK_DIR/custom```,您可以使用这个参数来配置 custom 目录
|
||||||
|
|
||||||
|
修改环境配置文件
|
||||||
|
```shell
|
||||||
|
vim etc/profile
|
||||||
|
```
|
||||||
|
追加
|
||||||
|
```shell
|
||||||
|
export GITEA_HOME=/wanghao/gitea
|
||||||
|
export GITEA_WORK_DIR=$GITEA_HOME/workdir
|
||||||
|
export GITEA_CUSTOM=$GITEA_WORK_DIR/custom
|
||||||
|
export PATH=$GITEA_HOME:$PATH
|
||||||
|
```
|
||||||
|
### 添加systemd 服务
|
||||||
|
```
|
||||||
|
sudo vim /etc/systemd/system/gitea.service
|
||||||
|
```
|
||||||
|
追加
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=Gitea (Git with a cup of tea)
|
||||||
|
After=syslog.target
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
RestartSec=2s
|
||||||
|
Type=simple
|
||||||
|
User=wanghao
|
||||||
|
Group=wanghao
|
||||||
|
WorkingDirectory=/wanghao/gitea/workdir
|
||||||
|
ExecStart=/wanghao/gitea/gitea web --config /wanghao/gitea/app.ini
|
||||||
|
Restart=always
|
||||||
|
Environment=USER=wanghao HOME=/home/wanghao GITEA_WORK_DIR=/wanghao/gitea/workdir
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
启动
|
||||||
|
|
||||||
|
```
|
||||||
|
systemctl enable gitea
|
||||||
|
systemctl start gitea
|
||||||
|
```
|
||||||
|
### 开放端口
|
||||||
|
```shell
|
||||||
|
firewall-cmd --zone=public --add-port=3000/tcp --permanent
|
||||||
|
```
|
||||||
|
|
||||||
|
### 问题解决
|
||||||
|
ssh clone 时遇到[No supported authentication methods available (server sent: publickey) ](https://blog.csdn.net/qq_37726813/article/details/127475348)
|
@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-11
|
||||||
|
category:
|
||||||
|
- Linux
|
||||||
|
tag:
|
||||||
|
- harbor
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# linux harbor 搭建, 以及nginx ssl 代理
|
||||||
|
### 前置
|
||||||
|
首先确保机器以及安装好 docker 以及 docker-compose
|
||||||
|
>[Linux 安装 Docker](https://local.wuanwanghao.top:30549/archives/linux%E5%AE%89%E8%A3%85docker)
|
||||||
|
|
||||||
|
>[Linux 安装 docker-compose](https://local.wuanwanghao.top:30549/archives/linux%E5%AE%89%E8%A3%85docker-compose)
|
||||||
|
|
||||||
|
### 下载离线安装包
|
||||||
|
[github_harbor_releases](https://github.com/goharbor/harbor/releases)
|
||||||
|
创建工作目录 下载安装包并解压
|
||||||
|
```shell
|
||||||
|
mkdir -p /wanghao/docker
|
||||||
|
cd /wanghao/docker
|
||||||
|
wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.5.6/harbor-offline-installer-v2.5.6.tgz
|
||||||
|
tar -xvf harbor-offline-installer-v2.5.6.tgz
|
||||||
|
```
|
||||||
|
### 修改配置文件
|
||||||
|
进入解压目录 /wanghao/docker/harbor ,拷贝模版创建配置文件
|
||||||
|
```shell
|
||||||
|
cd /wanghao/docker/harbor
|
||||||
|
cp harbor.yml.tmpl harbor.yml
|
||||||
|
```
|
||||||
|
修改harbor.yml 以下的配置项
|
||||||
|
```
|
||||||
|
hostname: 访问的域名
|
||||||
|
http:
|
||||||
|
port: 5500
|
||||||
|
external_url: https://域名:端口
|
||||||
|
harbor_admin_password: 管理员密码
|
||||||
|
```
|
||||||
|
### 启动harbor
|
||||||
|
```
|
||||||
|
./install.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配置nginx 代理 ssl
|
||||||
|
```
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name 域名 ;#修改为自己的域名
|
||||||
|
ssl_certificate ; #域名证书
|
||||||
|
ssl_certificate_key ; #域名证书
|
||||||
|
ssl_session_timeout 5m;
|
||||||
|
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
|
||||||
|
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
location / {
|
||||||
|
proxy_pass http://localhost:5500;
|
||||||
|
client_max_body_size 0;
|
||||||
|
proxy_connect_timeout 90;
|
||||||
|
proxy_read_timeout 90;
|
||||||
|
proxy_buffer_size 4k;
|
||||||
|
proxy_buffers 6 32k;
|
||||||
|
proxy_busy_buffers_size 64k;
|
||||||
|
proxy_temp_file_write_size 64k;
|
||||||
|
}
|
||||||
|
```
|
@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-04
|
||||||
|
category:
|
||||||
|
- 系统配置
|
||||||
|
- Linux
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# linux 制作简单systemctl 的service
|
||||||
|
在系统路径```/usr/lib/systemd/system/``` 下创建 ```服务名```.service 文件
|
||||||
|
|
||||||
|
下面frp.service模板
|
||||||
|
```toml
|
||||||
|
[Unit]
|
||||||
|
#描述
|
||||||
|
Description=MainFrpService
|
||||||
|
#在网络启动后执行Frp服务
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
#以root权限运行
|
||||||
|
User=root
|
||||||
|
#停止时重启
|
||||||
|
Restart=on-abort
|
||||||
|
#启动命令
|
||||||
|
ExecStart=/wanghao/frps/frp_0.44.0_linux_amd64/frps -c /wanghao/frps/frp_0.44.0_linux_amd64/frps.ini
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
创建好后就可以使用systemctl 命令来操作服务
|
||||||
|
```shell
|
||||||
|
#启动服务
|
||||||
|
ststemctl start frp
|
||||||
|
#重启服务
|
||||||
|
systemctl restart frp
|
||||||
|
#查看服务状态
|
||||||
|
systemctl status frp
|
||||||
|
#开启开机自启动
|
||||||
|
systemctl enable frp
|
||||||
|
```
|
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-03-12
|
||||||
|
category:
|
||||||
|
- 系统配置
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# linux 发布重启项目简单脚本命令
|
||||||
|
``` shell
|
||||||
|
cd $project_path
|
||||||
|
ps -ef | grep $bin_file | grep -v grep| awk '{print $2}' | xargs kill -9
|
||||||
|
nohup java -jar $project_path/$bin_file >catalina.out 2>&1 &
|
||||||
|
```
|
||||||
|
|
||||||
|
**$project_path 替换为可执行文件的路径**
|
||||||
|
|
||||||
|
**$bin_file 替换为可执行文件的名称**
|
||||||
|
|
||||||
|
```cd $project_path``` 进入可执行文件目录
|
||||||
|
```ps -ef | grep $bin_file | grep -v grep| awk '{print $2}' | xargs kill -9``` 获取可执行文件的pid 进程id 然后结束该进程id
|
||||||
|
```nohup java -jar $project_path/$bin_file >catalina.out 2>&1 & ``` 执行可执行文件并输出日志到指定文件
|
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-04-09
|
||||||
|
category:
|
||||||
|
- Linux
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# linux 命令大全
|
||||||
|
[ Linux命令大全 ](https://linux265.com/course/linux-commands.html)
|
@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-11-02
|
||||||
|
category:
|
||||||
|
- Linux
|
||||||
|
tag:
|
||||||
|
- 网络
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# linux 通过SpeedTest工具网络测速
|
||||||
|
### 下载工具
|
||||||
|
```shell
|
||||||
|
wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
|
||||||
|
```
|
||||||
|
### 赋予执行权限
|
||||||
|
```shell
|
||||||
|
chmod +x speedtest-cli
|
||||||
|
```
|
||||||
|
### 执行
|
||||||
|
```shell
|
||||||
|
./speedtest-cli --share
|
||||||
|
```
|
||||||
|
![image](https://local.wuanwanghao.top:9000/test/test/image.png)
|
||||||
|
|
||||||
|
### 查看所有国内测试节点
|
||||||
|
```shell
|
||||||
|
./speedtest-cli --list | grep China
|
||||||
|
```
|
||||||
|
![image-1667377461538](https://local.wuanwanghao.top:9000/test/test/image-1667377461538.png)
|
||||||
|
### 指定测试节点测试
|
||||||
|
```shell
|
||||||
|
./speedtest-cli --server=41910 --share
|
||||||
|
```
|
||||||
|
![image-1667377603338](https://local.wuanwanghao.top:9000/test/test/image-1667377603338.png)
|
||||||
|
|
@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-06-20
|
||||||
|
category:
|
||||||
|
- 系统配置
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# mysql 被黑客攻击了 惨痛教训
|
||||||
|
**今天鼓捣c++ 项目的时候 需要用下nacos 准备docker 安装个发现数据库被黑客攻击了太惨了,还好数据没丢只是 把我的root 权限给改了。
|
||||||
|
自己的mysql 密码太简单了,以后要把密码复杂化**
|
||||||
|
下面解决方法
|
||||||
|
先用本地用户登录mysql
|
||||||
|
赋予远程账号全部权限;
|
||||||
|
刷新配置;
|
||||||
|
修改远程账号密码
|
||||||
|
刷新配置;
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
mysql> grant all on *.* to root@'%';
|
||||||
|
Query OK, 0 rows affected (0.00 sec)
|
||||||
|
|
||||||
|
mysql> flush privileges;
|
||||||
|
Query OK, 0 rows affected (0.00 sec)
|
||||||
|
|
||||||
|
mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'xxxxxx';
|
||||||
|
Query OK, 0 rows affected (0.01 sec)
|
||||||
|
|
||||||
|
mysql> flush privileges;
|
||||||
|
Query OK, 0 rows affected (0.00 sec)
|
||||||
|
```
|
@ -0,0 +1,92 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-12-26
|
||||||
|
category:
|
||||||
|
- nodejs
|
||||||
|
tag:
|
||||||
|
- mqtt
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# nodejs 运行 mqtt
|
||||||
|
npm 安装 mqtt
|
||||||
|
```shell
|
||||||
|
npm install -g mqtt
|
||||||
|
```
|
||||||
|
客户端
|
||||||
|
```js
|
||||||
|
var mqtt = require('mqtt');
|
||||||
|
//var process = require('process');
|
||||||
|
var client = mqtt.connect('mqtt://192.168.3.254:1883', {
|
||||||
|
username: "admin",
|
||||||
|
password: "public",
|
||||||
|
clientId: 'client9'
|
||||||
|
});
|
||||||
|
|
||||||
|
function getYYYYMMDDhhmmssByDate() {
|
||||||
|
let date = new Date();
|
||||||
|
let value = date.getFullYear() * 10000000000 +
|
||||||
|
(date.getMonth() + 1) * 100000000 +
|
||||||
|
date.getDate() * 1000000 +
|
||||||
|
date.getHours() * 10000 +
|
||||||
|
date.getMinutes() * 100 +
|
||||||
|
date.getSeconds();
|
||||||
|
return value;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
client.on('connect', function() {
|
||||||
|
console.log("connect success");
|
||||||
|
client.subscribe('/server/task/roleId/1/update_task_data');
|
||||||
|
client.subscribe('/server/task/roleId/1/setValue');
|
||||||
|
});
|
||||||
|
|
||||||
|
client.on('message', function(topic, message, packet) {
|
||||||
|
console.log(" ");
|
||||||
|
console.log(process.env.JAVA_HOME);
|
||||||
|
console.log("time: ", getYYYYMMDDhhmmssByDate());
|
||||||
|
var jsonStr = message.toString()
|
||||||
|
console.log("jsonStr: " + jsonStr);
|
||||||
|
console.log(" ");
|
||||||
|
});
|
||||||
|
```
|
||||||
|
服务端
|
||||||
|
```js
|
||||||
|
var mqtt = require('mqtt');
|
||||||
|
var client = mqtt.connect('mqtt://192.168.3.254:1883', {
|
||||||
|
username: 'admin',
|
||||||
|
password: 'public',
|
||||||
|
clientId: 'server1'
|
||||||
|
});
|
||||||
|
|
||||||
|
function getJsonStr() {
|
||||||
|
return JSON.stringify({
|
||||||
|
"event": "update_task_data",
|
||||||
|
"data": {
|
||||||
|
"arrTaskId": [],
|
||||||
|
"arrTaskInst": [{
|
||||||
|
"id": 1,
|
||||||
|
"roleId": 1,
|
||||||
|
"moduleId": "0",
|
||||||
|
"userId": 0,
|
||||||
|
"taskId": 9999,
|
||||||
|
"finish": 0,
|
||||||
|
"taskNodeId": 15,
|
||||||
|
"taskNodeStatus": 0,
|
||||||
|
"taskNodeStartTime": 20210811,
|
||||||
|
"beforeNodeId": 14
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"open": (Math.round(Math.random())+1)*10,
|
||||||
|
"state": (Math.round(Math.random())+1)*10,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 推送的频道和数据
|
||||||
|
|
||||||
|
setInterval(() => {
|
||||||
|
client.publish("/server/task/roleId/1/update_task_data", getJsonStr(), {qos: 2, retain: false});
|
||||||
|
}, 5000)
|
||||||
|
|
||||||
|
```
|
@ -0,0 +1,91 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-12-26
|
||||||
|
category:
|
||||||
|
- nodejs
|
||||||
|
tag:
|
||||||
|
- modbus
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# nodejs 运行modbus
|
||||||
|
npm 安装 modbus-serial
|
||||||
|
```shell
|
||||||
|
npm install -g modbus-serial
|
||||||
|
```
|
||||||
|
modbus 客户端
|
||||||
|
```js
|
||||||
|
// create an empty modbus client
|
||||||
|
var ModbusRTU = require("modbus-serial");
|
||||||
|
var client = new ModbusRTU();
|
||||||
|
|
||||||
|
// open connection to a tcp line
|
||||||
|
client.connectTCP("127.0.0.1", { port: 8502 });
|
||||||
|
client.setID(1);
|
||||||
|
|
||||||
|
// read the values of 10 registers starting at address 0
|
||||||
|
// on device number 1. and log the values to the console.
|
||||||
|
setInterval(function() {
|
||||||
|
client.readHoldingRegisters(0, 10, function(err, data) {
|
||||||
|
if(data){
|
||||||
|
console.log(data.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 1000);
|
||||||
|
```
|
||||||
|
modbus 服务端
|
||||||
|
```js
|
||||||
|
// create an empty modbus client
|
||||||
|
var ModbusRTU = require("modbus-serial");
|
||||||
|
var vector = {
|
||||||
|
getInputRegister: function(addr, unitID) {
|
||||||
|
// Synchronous handling
|
||||||
|
return addr;
|
||||||
|
},
|
||||||
|
getHoldingRegister: function(addr, unitID, callback) {
|
||||||
|
// Asynchronous handling (with callback)
|
||||||
|
setTimeout(function() {
|
||||||
|
// callback = function(err, value)
|
||||||
|
callback(null, addr + 7000);
|
||||||
|
}, 10);
|
||||||
|
},
|
||||||
|
getCoil: function(addr, unitID) {
|
||||||
|
// Asynchronous handling (with Promises, async/await supported)
|
||||||
|
return new Promise(function(resolve) {
|
||||||
|
setTimeout(function() {
|
||||||
|
resolve((addr % 2) === 0);
|
||||||
|
}, 10);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
setRegister: function(addr, value, unitID) {
|
||||||
|
// Asynchronous handling supported also here
|
||||||
|
console.log("set register", addr, value, unitID);
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
setCoil: function(addr, value, unitID) {
|
||||||
|
// Asynchronous handling supported also here
|
||||||
|
console.log("set coil", addr, value, unitID);
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
readDeviceIdentification: function(addr) {
|
||||||
|
return {
|
||||||
|
0x00: "MyVendorName",
|
||||||
|
0x01: "MyProductCode",
|
||||||
|
0x02: "MyMajorMinorRevision",
|
||||||
|
0x05: "MyModelName",
|
||||||
|
0x97: "MyExtendedObject1",
|
||||||
|
0xAB: "MyExtendedObject2"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// set the server to answer for modbus requests
|
||||||
|
console.log("ModbusTCP listening on modbus://0.0.0.0:8502");
|
||||||
|
var serverTCP = new ModbusRTU.ServerTCP(vector, { host: "0.0.0.0", port: 8502, debug: true, unitID: 1 });
|
||||||
|
|
||||||
|
serverTCP.on("socketError", function(err){
|
||||||
|
// Handle socket error if needed, can be ignored
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
```
|
@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-12-26
|
||||||
|
category:
|
||||||
|
- python
|
||||||
|
tag:
|
||||||
|
- opcua
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# python 运行 opcua
|
||||||
|
pip 安装 opcua
|
||||||
|
``` shell
|
||||||
|
pip install opcua
|
||||||
|
```
|
||||||
|
opcua 客户端
|
||||||
|
```python
|
||||||
|
from opcua import Client
|
||||||
|
if __name__ == "__main__":
|
||||||
|
client = Client("opc.tcp://localhost:4840/freeopcua/server/")
|
||||||
|
# client = Client("opc.tcp://admin@localhost:4840/freeopcua/server/") #connect using a user
|
||||||
|
try:
|
||||||
|
client.connect()
|
||||||
|
# Client has a few methods to get proxy to UA nodes that should always be in address space such as Root or Objects
|
||||||
|
root = client.get_root_node()
|
||||||
|
print("Objects node is: ", root)
|
||||||
|
# Node objects have methods to read and write node attributes as well as browse or populate address space
|
||||||
|
print("Children of root are: ", root.get_children())
|
||||||
|
# get a specific node knowing its node id
|
||||||
|
#var = client.get_node(ua.NodeId(1002, 2))
|
||||||
|
#var = client.get_node("ns=3;i=2002")
|
||||||
|
#print(var)
|
||||||
|
#var.get_data_value() # get value of node as a DataValue object
|
||||||
|
#var.get_value() # get value of node as a python builtin
|
||||||
|
#var.set_value(ua.Variant([23], ua.VariantType.Int64)) #set node value using explicit data type
|
||||||
|
#var.set_value(3.9) # set node value using implicit data type
|
||||||
|
# Now getting a variable node using its browse path
|
||||||
|
myvar = root.get_child(["0:Objects", "2:MyObject", "2:MyVariable"])
|
||||||
|
obj = root.get_child(["0:Objects", "2:MyObject"])
|
||||||
|
print("myvar is: ", myvar)
|
||||||
|
print("myobj is: ", obj)
|
||||||
|
# Stacked myvar access
|
||||||
|
# print("myvar is: ", root.get_children()[0].get_children()[1].get_variables()[0].get_value())
|
||||||
|
finally:
|
||||||
|
client.disconnect()
|
||||||
|
```
|
||||||
|
opcua 服务端
|
||||||
|
```python
|
||||||
|
import sys
|
||||||
|
sys.path.insert(0, "..")
|
||||||
|
import time
|
||||||
|
from opcua import ua, Server
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# setup our server
|
||||||
|
server = Server()
|
||||||
|
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")
|
||||||
|
# setup our own namespace, not really necessary but should as spec
|
||||||
|
uri = "http://examples.freeopcua.github.io"
|
||||||
|
idx = server.register_namespace(uri)
|
||||||
|
# get Objects node, this is where we should put our nodes
|
||||||
|
objects = server.get_objects_node()
|
||||||
|
print(objects)
|
||||||
|
# populating our address space
|
||||||
|
myobj = objects.add_object(idx, "MyObject")
|
||||||
|
myvar = myobj.add_variable(idx, "MyVariable", 6.7)
|
||||||
|
myvar.set_writable() # Set MyVariable to be writable by clients
|
||||||
|
# starting!
|
||||||
|
server.start()
|
||||||
|
try:
|
||||||
|
count = 0
|
||||||
|
while True:
|
||||||
|
time.sleep(1)
|
||||||
|
count += 0.1
|
||||||
|
myvar.set_value(count)
|
||||||
|
finally:
|
||||||
|
#close connection, remove subcsriptions, etc
|
||||||
|
server.stop()
|
||||||
|
```
|
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-11-03
|
||||||
|
category:
|
||||||
|
- 系统配置
|
||||||
|
- Linux
|
||||||
|
tag:
|
||||||
|
- 网络
|
||||||
|
- EXSI
|
||||||
|
- SSL
|
||||||
|
- 域名
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# vmware EXSI 修改系统默认SSL证书和密钥
|
||||||
|
### ssh链接到exsi
|
||||||
|
![image-1667434778798](https://local.wuanwanghao.top:9000/test/test/image-1667434778798.png)
|
||||||
|
### 跳转到 ```/etc/vmware/ssl``` 路径下
|
||||||
|
```shell
|
||||||
|
cd /etc/vmware/ssl
|
||||||
|
```
|
||||||
|
### 将路径下的两个文件备份 修改后辍为bak
|
||||||
|
![image-1667434900974](https://local.wuanwanghao.top:9000/test/test/image-1667434900974.png)
|
||||||
|
|
||||||
|
### 上传自己的ssl 证书 和密钥 名称都修改为 ```rui```
|
||||||
|
![image-1667435003688](https://local.wuanwanghao.top:9000/test/test/image-1667435003688.png)!
|
||||||
|
### 使证书生效
|
||||||
|
```shell
|
||||||
|
/etc/init.d/hostd restart
|
||||||
|
/etc/init.d/vpxa restart
|
||||||
|
```
|
||||||
|
![image-1667435106747](https://local.wuanwanghao.top:9000/test/test/image-1667435106747.png)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-07-04
|
||||||
|
category:
|
||||||
|
- 内网穿透
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# zerotier Ping 不工作
|
||||||
|
[zerotier 官网相关解决方案](https://docs.zerotier.com/zerotier/troubleshooting/)
|
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2022-07-04
|
||||||
|
category:
|
||||||
|
- 内网穿透
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# zerotier搭建moon模式
|
||||||
|
[zerotier搭建moon模式](https://blog.csdn.net/zetion_3/article/details/124046219)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
icon: edit
|
||||||
|
date: 2023-03-06
|
||||||
|
category:
|
||||||
|
- 私人配置
|
||||||
|
headerDepth: 5
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
# 各个数据库账号密码
|
||||||
|
mysql
|
||||||
|
local.wuanwanghao.top:3307 root ks125930.
|
||||||
|
local.wuanwanghao.top:3307 root ks125930.
|
||||||
|
|
||||||
|
sqlserver
|
||||||
|
local.wuanwanghao.top:1433 ```SA Ks125930.``` ```wanghao ks125930.```
|
||||||
|
|
||||||
|
redis
|
||||||
|
local.wuanwanghao.top:6379 无
|
||||||
|
|
||||||
|
mongodb
|
||||||
|
local.wuanwanghao.top:27017 root ks125930.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue