【数字花园】个人知识库网站搭建:⑤本地构建+云服务器部署数字花园plus
目录
- 写在前面:
- 数字花园的定义
- [[数字花园]]网站的构建原理包括三个步骤:
- [[我的数字花园搭建笔记]]
- 现在的部署流程
- 一、本地操作详细教程
- -2.前置步骤(前面的文章都提过)
- -1.创建github中转库
- 0. 本地环境配置
- 基础环境:git、curl
- Node.js
- 旧版本Node.js卸载
- Node.js 18.x安装
- 验证是否安装成功
- npm换源
- git配置
- 1.数字花园源代码构建
- 源代码模板获取
- 网页源代码构建(build)
- 2.源码上传中转仓库
- github中转仓库的初始化
- 如果是后续更新代码
- 3.复制构建文件
- 4.提交构建好的代码到中转库
- 二、服务器端详细教程
- 1.环境
- 2.git获取代码
- 3.部署
- 直接放写好的脚本
- 本地自动化脚本
- 服务器端自动化脚本
- 附加:全自动化脚本
- bat脚本启动wsl中的部署sh脚本
- 本地wsl中的本地部署脚本
最终效果
写在前面:
包括本文以及一系列教程的笔记都在我的数字花园中:czchx.cc
数字花园的定义
数字花园是通过借助网络数字工具,对想法、笔记和思考等一切你感兴趣的信息或进行收集、整理和创作,文字之间用标签或链接创建连接,形成一座独具个人浓厚色彩的信息与知识型花园。
这个花园是开放的,不可避免地至少要经常打理。
数字花园介于笔记本和博客之间的交叉空间,具有半公开性质。
不像笔记内容的纯私人性一样,数字花园鼓励用户发布自己的想法、草稿,这在很大程度上降低了我们的发布压力。
同时,数字花园不像博客那样完全公开,以建立个人品牌作为内容发布的主要目的。
[[数字花园]]网站的构建原理包括三个步骤:
- 源代码生成:Markdown 笔记编写,通过dg插件发布出源代码
- 源代码构建成网页代码:通过npm run build 实现 Markdown → HTML + CSS + JS
- 网页代码部署:将 网页 (HTML + CSS + JS) 部署到服务器
[[我的数字花园搭建笔记]]
- ①[[netlify免费搭建数字花园]]:适用:数字花园需求较小,更新频率少,笔记量少
- ②[[本地部署数字花园]]:适用:有公网ip或局域网(校园网)内使用
- ③[[云服务器部署数字花园]]:适用:数字花园需求较小,更新批量高:笔记量少
- ④[[本地构建+云服务器部署数字花园]]:适用:数字花园需求较小,更新批量高:笔记量少(失效,无视这条)
- ⑤[[本地构建+云服务器部署数字花园plus]]:适用:数字花园需求较大,更新批量高:笔记量大
[[本地构建+云服务器部署数字花园]]这个方法因为可能存在的网络限制没用了
这篇笔记是[[本地构建+云服务器部署数字花园]]的改进版
方案依旧是源代码构建build和部署deploy分离
现在的部署流程
源代码构建(build)环境选择:本地和服务器都是linux,也可以是[[WSL]](我用vscode的ssh连接wsl和服务器,方便执行脚本弹出github登录页),也可以是手机的终端环境,我用的[[termux]](对你没看错,手机也可以用来构建源代码然后发送到服务器)
新增步骤:github新创建一个库(中转库,叫digitalgardendist)用来存放构建好的数字花园代码,并把库信息填入脚本代码中
obsidian编辑笔记,digital garden插件上传笔记到github
自己电脑执行本地自动化脚本一键部署(前提是按照之前的流程先完成了云服务器的部署操作)
服务器端执行服务器脚本
部署成功,网页可以访问
一、本地操作详细教程
(注意:命令执行环境是linux,windows下可以开wsl或者linux虚拟机,安卓可以用termux)
⭐首先确定你的网络🌐环境能访问github⭐
不想看详细教程可以直接翻到下面去看脚本源码,我能直接用,你只要网没啥问题应该也可以用
-2.前置步骤(前面的文章都提过)
obsidian安装好数字花园插件(digital garden),将要发布的笔记最前面设置好dg-publish: true属性
github创建一个新的空仓库
去数字花园插件官网获取源代码模板克隆至自己新创建的一个github仓库(数字花园代码模板库)
在obsidian中的digital garden插件中配置好确认能正常发布到github仓库
本文中以我的仓库为例子:https://github.com/czc6666/digitalgarden.git(数字花园代码模板库)
-1.创建github中转库
为什么要中转库?:因为我们在本地构建好的网页源代码文件要传到服务器,去反正都能访问GitHub了,就用github来中转文件(其实是用ssh我总传不上去)
- 新创建一个不带readme文件的库就行,然后github就不用操作了
0. 本地环境配置
基础环境:git、curl
sudo apt update
sudo apt install -y git curl
Node.js
从数字花园提供的源代码模板构建出网站源代码需要用到的工具:
- Node.js
- npm
直接默认用apt安装的化可能版本太落后用不了
旧版本Node.js卸载
如果你不小心安装了旧版的,可以先卸载
卸载旧版本 Node.js…
sudo apt-get remove -y nodejs nodejs-doc npm libnode-dev
sudo apt-get autoremove -y
清理可能存在的冲突文件
sudo rm -rf /usr/include/node/common.gypi
Node.js 18.x安装
添加 Node.js 18.x 仓库…
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
安装 Node.js
sudo apt-get install -y nodejs
安装好后更新一下环境
source ~/.bashrc
验证是否安装成功
验证Node.js
node_version=$(node -v) # 直接复制这两行去执行
print_info "Node.js 版本: $node_version"
验证npm
npm_version=$(npm -v)
print_info "npm 版本: $npm_version"
npm换源
这步嫌麻烦可以跳过,因为你能访问github,不换源应该也行
配置npm源
npm config set registry https://registry.npmmirror.com
清除可能存在的缓存
npm cache clean --force
git配置
配置git邮箱,替换为你的邮箱
git config --global user.email "这写邮箱"
配置用户名,替换为你的用户名
git config --global user.name "czc6666"
设置默认分支为main
git config --global init.defaultBranch main
1.数字花园源代码构建
从你的数字花园模板库中获取代码然后在本地构建数字花园源代码后发送到你的中转仓库
源代码模板获取
克隆代码仓库…记得替换成你自己的库
git clone https://github.com/czc6666/digitalgarden.git
切换到克隆下来的文件夹
cd digitalgarden
从数字花园代码模板库拉去最新代码
git pull
网页源代码构建(build)
确保当前在digitalgarden目录下,执行下面命令,安装相应环境(可能如果卡半天不动,那就去换源)
npm install
开始构建网页源代码
npm run build
2.源码上传中转仓库
我的中转仓库是:https://github.com/czc6666/digitalgardendist.git
github中转仓库的初始化
先切换回上一级目录(别在digitalgarden目录里就行)
创建一个放中转库的文件夹
mkdir digitalgardendist
进入文件夹
cd digitalgardendist
git初始化文件夹
git init
创建README文件并写入内容
echo "# digitalgardendist" >> README.md
将README文件添加到暂存区
git add README.md
提交更改,添加提交信息
git commit -m "first commit"
将当前分支重命名为main
git branch -M main
添加远程仓库地址,记得修改成你自己的地址
git remote add origin https://github.com/czc6666/digitalgardendist.git
如果是后续更新代码
第一次设置好以后,后续再更新代码就不需要执行上面的操作了,只需要用下面的命令清空这个中转库,重新复制构建好的代码过来上传就行
清空目录(保留 .git)
find . -not -path './.git/*' -not -name '.git' -delete
3.复制构建文件
复制构建好的代码文件到中转库的文件夹,记得自己修改下面的命令
cp -r ../digitalgarden/dist/* .
4.提交构建好的代码到中转库
确保当前在中转库的目录中
将所有文件添加到暂存区
git add .
提交更改,提交信息包含当前时间
git commit -m "Update built files: $(date '+%Y-%m-%d %H:%M:%S')"
$(date '+%Y-%m-%d %H:%M:%S')
会被替换为当前时间,格式如:2024-03-19 15:30:45
推送到远程仓库的main分支
git push -u origin main
-u
参数设置上游分支,之后可以直接使用git push
而不需要指定分支origin
是远程仓库的别名main
是分支名
到这里数字花园的网站源代码就上传到github的中转库了。接下来就是去服务器端将代码下载下来并部署
二、服务器端详细教程
1.环境
更新系统包列表
sudo apt update
安装必要的软件包:git、nodejs和npm
sudo apt install -y git nodejs npm
设置npm镜像源为国内源(加速下载)
npm config set registry https://registry.npmmirror.com
清理npm缓存
npm cache clean --force
全局安装pm2
npm install -g pm2
全局安装http-server(因为pm2要用到)
npm install -g http-server
验证安装是否成功
pm2 --version
如果遇到权限问题,需要使用sudo安装
sudo npm install -g pm2
sudo npm install -g http-server
2.git获取代码
克隆项目仓库
git clone https://github.com/czc6666/digitalgardendist.git
进入项目目录
cd digitalgardendist
拉取最新代码
git pull
3.部署
返回用户主目录
cd ~
删除旧的pm2进程(如果存在)(这步可以不执行)
pm2 delete digitalgarden
重启或新建pm2进程
pm2 restart digitalgarden || pm2 start http-server -- digitalgardendist/ -p 8080 --name digitalgarden
- 尝试重启已存在的进程
- 如果重启失败(进程不存在),则创建新进程
- 使用http-server服务器
- 指定目录为digitalgardendist/
- 设置端口为8080
- 进程名称为digitalgarden
直接放写好的脚本
我自己用的脚本代码:[[数字花园代码本地构建sh]]、[[数字花园网页服务器部署sh]]
本地自动化脚本
#!/bin/bash# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'# 打印带颜色的信息
print_info() {echo -e "${GREEN}[INFO] $1${NC}"
}print_error() {echo -e "${RED}[ERROR] $1${NC}"
}# 检查命令是否执行成功
check_result() {if [ $? -eq 0 ]; thenprint_info "$1 成功"elseprint_error "$1 失败"exit 1fi
}# 0. 环境配置
print_info "更新系统包..."
sudo apt update
check_result "系统更新"print_info "安装必要的软件包..."
sudo apt install -y git curl
check_result "基础软件包安装"# 检查并安装正确版本的 Node.js
setup_nodejs() {print_info "检查 Node.js 版本..."# 检查是否已安装 Node.js 和版本号if command -v node &> /dev/null; thencurrent_version=$(node -v | cut -d'v' -f2)required_version="18.0.0"# 使用版本比较if printf '%s\n' "$required_version" "$current_version" | sort -V -C; thenprint_info "Node.js 版本($current_version)符合要求,跳过安装"return 0elseprint_info "当前 Node.js 版本($current_version)过低,需要升级"fielseprint_info "未检测到 Node.js,开始安装"fi# 如果需要安装,则先卸载旧版本print_info "卸载旧版本 Node.js..."sudo apt-get remove -y nodejs nodejs-doc npm libnode-devsudo apt-get autoremove -y# 清理可能存在的冲突文件sudo rm -rf /usr/include/node/common.gypi# 添加 NodeSource 仓库print_info "添加 Node.js 18.x 仓库..."curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -# 安装 Node.jsprint_info "安装 Node.js 和 npm..."sudo apt-get install -y nodejs# 重新加载环境变量source ~/.bashrc# 验证安装node_version=$(node -v)print_info "Node.js 版本: $node_version"npm_version=$(npm -v)print_info "npm 版本: $npm_version"check_result "Node.js 安装"
}# 直接调用 setup_nodejs 函数 安装 Node.js 和 npm
setup_nodejs# 配置 npm
npm config set registry https://registry.npmmirror.com
npm cache clean --force# 配置 Git
print_info "配置 Git..."
git config --global user.email "⭐⭐⭐⭐⭐写你自己的邮箱!!⭐⭐⭐"
git config --global user.name "czc6666" # 替换为你的用户名
git config --global init.defaultBranch main # 设置默认分支为 main
check_result "Git 配置"# 1. 在原始项目中构建
if [ ! -d "digitalgarden" ]; thenprint_info "克隆代码仓库..."git clone https://github.com/czc6666/digitalgarden.git # 替换为你的源码仓库check_result "克隆代码仓库"
elseprint_info "项目目录已存在,直接使用..."
fiprint_info "构建原始项目..."
cd digitalgarden
git pull
npm install
npm run build
check_result "构建项目"# 2. 准备新的 dist 仓库(中转仓库)
print_info "准备 dist 仓库..."
cd ..
if [ ! -d "digitalgardendist" ]; thenmkdir digitalgardendistcd digitalgardendistgit initecho "# digitalgardendist" >> README.mdgit add README.mdgit commit -m "first commit"git branch -M maingit remote add origin https://github.com/czc6666/digitalgardendist.git # 替换为你的中转仓库
elsecd digitalgardendist# 清空目录(保留 .git)find . -not -path './.git/*' -not -name '.git' -delete
fi# 3. 复制构建文件
print_info "复制构建文件..."
cp -r ../digitalgarden/dist/* .
check_result "复制文件"# 4. 提交并推送
print_info "提交更改..."
git add .
git commit -m "Update built files: $(date '+%Y-%m-%d %H:%M:%S')"
git push -u origin main
check_result "推送到 GitHub"print_info "本地构建和推送完成!"
本地脚本运行截图:
服务器端自动化脚本
#!/bin/bash# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'# 打印带颜色的信息
print_info() {echo -e "${GREEN}[INFO] $1${NC}"
}print_error() {echo -e "${RED}[ERROR] $1${NC}"
}# 检查命令是否执行成功
check_result() {if [ $? -eq 0 ]; thenprint_info "$1 成功"elseprint_error "$1 失败"exit 1fi
}# 0. 安装必要的环境
print_info "更新系统包..."
sudo apt update
check_result "系统更新"print_info "安装必要的软件包..."
sudo apt install -y git nodejs npm
npm config set registry https://registry.npmmirror.com
npm cache clean --force
npm install -g pm2
npm install -g http-server
pm2 --version
check_result "软件包安装"# 1. 检查并克隆仓库
cd ~
print_info "切换到 home 目录..."if [ ! -d "digitalgardendist" ]; thenprint_info "克隆代码仓库..."git clone https://github.com/czc6666/digitalgardendist.gitcheck_result "克隆代码仓库"
ficd digitalgardendist
check_result "进入项目目录"# 2. 拉取最新代码
print_info "拉取最新代码..."
git pull
check_result "拉取代码"# 3. 返回 home 目录并重启服务
print_info "重启服务..."
cd ~
pm2 delete digitalgarden
pm2 restart digitalgarden || pm2 start http-server -- digitalgardendist/ -p 8080 --name digitalgarden
check_result "重启服务"print_info "部署完成!"
服务器端脚本执行后部署成功截图
成功部署:网页能成功访问了
![[本地构建+云服务器部署数字花园plus_image-5.png]]
附加:全自动化脚本
这里将在本地sh脚本中添加执行远程服务器中脚本的命令,实现obsidian更新完数字花园,只需要双击点击一个桌面一个bat文件即可完成所有更新部署操作:
bat脚本启动wsl中的部署sh脚本
我的脚本就放在~/目录下,你如果不是请修改
@echo off
title 数字花园自动部署
color 0Aecho 正在启动 WSL 执行部署脚本...
echo.wsl -e bash -ic "cd ~ && ./czc_deploy.sh; echo ''; echo '部署结束,按回车键退出...'; read"if %ERRORLEVEL% NEQ 0 (color 0Cecho.echo 脚本执行出错!pause
) else (color 0Aecho.echo 脚本执行完成!pause
)
本地wsl中的本地部署脚本
#!/bin/bash# GitHub Token 配置
GITHUB_TOKEN="你的githubtoken"# 定义ssh远程服务器信息
REMOTE_HOST="服务器的ip地址"
REMOTE_USER="ssh连接的用户名"
REMOTE_PASS="ssh连接的密码"
REMOTE_SCRIPT="服务器上的部署脚本地址"# 下面的仓库地址也要修改成你自己的# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'# 打印带颜色的信息
print_info() {echo -e "${GREEN}[INFO] $1${NC}"
}print_error() {echo -e "${RED}[ERROR] $1${NC}"
}# 检查命令是否执行成功
check_result() {if [ $? -eq 0 ]; thenprint_info "$1 成功"elseprint_error "$1 失败"exit 1fi
}# 0. 环境配置
print_info "更新系统包..."
sudo apt update
check_result "系统更新"print_info "安装必要的软件包..."
sudo apt install -y git curl
check_result "基础软件包安装"# 检查并安装正确版本的 Node.js
setup_nodejs() {print_info "检查 Node.js 版本..."# 检查是否已安装 Node.js 和版本号if command -v node &> /dev/null; thencurrent_version=$(node -v | cut -d'v' -f2)required_version="18.0.0"# 使用版本比较if printf '%s\n' "$required_version" "$current_version" | sort -V -C; thenprint_info "Node.js 版本($current_version)符合要求,跳过安装"return 0elseprint_info "当前 Node.js 版本($current_version)过低,需要升级"fielseprint_info "未检测到 Node.js,开始安装"fi# 如果需要安装,则先卸载旧版本print_info "卸载旧版本 Node.js..."sudo apt-get remove -y nodejs nodejs-doc npm libnode-devsudo apt-get autoremove -y# 清理可能存在的冲突文件sudo rm -rf /usr/include/node/common.gypi# 添加 NodeSource 仓库print_info "添加 Node.js 18.x 仓库..."curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -# 安装 Node.jsprint_info "安装 Node.js 和 npm..."sudo apt-get install -y nodejs# 重新加载环境变量source ~/.bashrc# 验证安装node_version=$(node -v)print_info "Node.js 版本: $node_version"npm_version=$(npm -v)print_info "npm 版本: $npm_version"check_result "Node.js 安装"
}# 直接调用 setup_nodejs 函数 安装 Node.js 和 npm
setup_nodejs# 配置 npm
npm config set registry https://registry.npmmirror.com
npm cache clean --force# 配置 Git
print_info "配置 Git..."
git config --global user.email "913809127@qq.com" # 替换为你的邮箱
git config --global user.name "czc6666" # 替换���你的用户名
git config --global init.defaultBranch main # 设置默认分支为 main
check_result "Git 配置"# 1. 在原始项目中构建
if [ ! -d "digitalgarden" ]; thenprint_info "克隆代码仓库..."git clone https://oauth2:${GITHUB_TOKEN}@github.com/czc6666/digitalgarden.gitcheck_result "克隆代码仓库"
elseprint_info "项目目录已存在,直接使用..."
fiprint_info "构建原始项目..."
cd digitalgarden
git pull
npm install
npm run build
check_result "构建项目"# 2. 准备新的 dist 仓库(中转仓库)
print_info "准备 dist 仓库..."
cd ..
if [ ! -d "digitalgardendist" ]; thenmkdir digitalgardendistcd digitalgardendistgit initecho "# digitalgardendist" >> README.mdgit add README.mdgit commit -m "first commit"git branch -M maingit remote add origin https://oauth2:${GITHUB_TOKEN}@github.com/czc6666/digitalgardendist.git
elsecd digitalgardendistgit remote set-url origin https://oauth2:${GITHUB_TOKEN}@github.com/czc6666/digitalgardendist.git# 清空目录(保留 .git)find . -not -path './.git/*' -not -name '.git' -delete
fi# 3. 复制构建文件
print_info "复制构建文件..."
cp -r ../digitalgarden/dist/* .
check_result "复制文件"# 4. 提交并推送
print_info "提交更改..."
git add .
git commit -m "Update built files: $(date '+%Y-%m-%d %H:%M:%S')"
git push -u origin main
check_result "推送到 GitHub"print_info "本地构建和推送完成!"# 使用sshpass执行远程命令,确保加载完整的环境
sshpass -p "$REMOTE_PASS" ssh "$REMOTE_USER@$REMOTE_HOST" "export NVM_DIR=\"\$HOME/.nvm\" && \[ -s \"\$NVM_DIR/nvm.sh\" ] && source \"\$NVM_DIR/nvm.sh\" && \[ -s \"\$NVM_DIR/bash_completion\" ] && source \"\$NVM_DIR/bash_completion\" && \source ~/.bashrc && \source ~/.profile && \bash $REMOTE_SCRIPT"# 检查执行结果
if [ $? -eq 0 ]; thenecho "[INFO] 远程脚本执行成功"
elseecho "[ERROR] 远程脚本执行失败"
fi
相关文章:
【数字花园】个人知识库网站搭建:⑤本地构建+云服务器部署数字花园plus
目录 写在前面:数字花园的定义[[数字花园]]网站的构建原理包括三个步骤:[[我的数字花园搭建笔记]] 现在的部署流程一、本地操作详细教程-2.前置步骤(前面的文章都提过)-1.创建github中转库0. 本地环境配置基础环境:git…...
力扣题目 - 3264.K 次乘运算后的最终数组I
题目 还需要你前往力扣官网查看详细的题目要求 地址 1.给你一个整数数组 nums ,一个整数 k 和一个整数 multiplier 。2.你需要对 nums 执行 k 次操作,每次操作中:找到 nums 中的 最小 值 x ,如果存在多个最小值,选择最…...
Java常用 Date 时间格式化、Calender日历、正则表达式的用法
目录 1. SimpleDateFormat 日期格式化类 1.1 Date 类型转 String 1.2 String 类型转 Date 2. Calendar 日历类 3. 正则表达式 3.1 正则表达式的组成部分 3.2 手机号正则表达式 3.3 常用密码校验正则表达式 1. SimpleDateFormat 日期格式化类 SimpleDateFormat 是Java中…...
网页爬虫技术全解析:从基础到实战
引言 在当今信息爆炸的时代,互联网上的数据量每天都在以惊人的速度增长。网页爬虫(Web Scraping),作为数据采集的重要手段之一,已经成为数据科学家、研究人员和开发者不可或缺的工具。本文将全面解析网页爬虫技术&…...
细说STM32F407单片机SPI基础知识
目录 一、 SPI接口和通信协议 1、 SPI硬件接口 (1)MOSI(Master Output Slave Input) (2)MISO(Master Input Slave Output) (3)SCK 2、SPI传输协议 (1)CPHA0时的数据传输时序 …...
【OJ题解】面试题三步问题
个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 📘 基础数据结构【C语言】 💻 C语言编程技巧【C】 🚀 进阶C【OJ题解】 📝 题解精讲 目录 **题目链接****解题思路****1. 问题分析****2. 递归思路****3. 优化方案&a…...
Linux vi/vim 编辑器使用教程
Linux vi/vim 编辑器使用教程 引言 Linux 系统中的 vi 和 vim 是非常强大的文本编辑器,它们以其高效性和灵活性而闻名。vim 是 vi 的增强版,提供了更多的功能和改进的用户界面。本文将详细介绍 vi/vim 的基本用法,包括打开文件、编辑文本、…...
长安大学《2024年812自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《长安大学812自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...
服务器一般装什么系统?
在服务器管理中,操作系统的选择是一个关键因素,它直接影响到服务器的稳定性、性能和可维护性。那么为什么有些服务器选择Linux,而不是Windows?选择合适的操作系统对服务器的性能和安全性有多么重要? 在众多操作系统中…...
Gitlab ci/cd 从0-1持续集成持续发布前端
关于gitlab ci/cd,就是实现DevOps的能力,即Development &Operations的缩写,也就是开发&运维。CI/CD 指的是软件开发的持续集成方法,我们可以持续构建、测试和部署软件。通过持续方法的迭代能使得我们减少在错误代码或者错…...
#GC4049. GC.2017---. GC.2016.六年级
这套题包含了历年真题,包含了前面我写的博客中的题目,十分重要!!!!要考试的同学可以参考一下!! 此套题限时3小时。 #GC4049. GC.2017.六年级.01.更多闰年 题目描述 在 smoj 网站上…...
UE5中实现Billboard公告板渲染
公告板(Billboard)通常指永远面向摄像机的面片,游戏中许多技术都基于公告板,例如提示拾取图标、敌人血槽信息等,本文将使用UE5和材质节点制作一个公告板。 Gif效果: 网格效果: 1.思路 通过…...
Android系统(android app和系统架构)
文章目录 AndroidAndroid Apps四大组件 Android系统Platform API之下:一个微笑内核adb(Android Debug Bridge) Android包管理机制Android的Intent机制参考 Android LinuxFrameworkJVM 在Linux/Java上做了个二次开发?并不完全是:Android定义…...
docker设置容器自动启动
说起开机自动启动应该很多人都遇到过,我们公司做的系统很多的中间件都没有设置开机自动启动然后中间修改问题又设置了一些临时生效的文件,开始的时候大家都不以为意,知道公司陆续有人离职入职管理交接一塌糊涂,项目成了历史遗留问…...
在 React 中,创建和嵌套组件、添加标签和样式、显示数据、渲染条件和列表、对事件做出响应并更新界面以及在组件间共享数据是常见的任务
文章目录 1. 创建和嵌套组件创建组件嵌套组件 2. 添加标签和样式添加标签添加样式 3. 显示数据显示静态数据显示动态数据 4. 渲染条件和列表条件渲染列表渲染 5. 对事件做出响应并更新界面处理事件 6. 在组件间共享数据使用 Context API react 如何创建和嵌套组件 如何添加标签…...
Android命令行工具--dumpsys
dumpsys 是一种在 Android 设备上运行的工具,可提供有关系统服务的信息。可以使用 Android 调试桥 (adb) 从命令行调用 dumpsys,获取在连接的设备上运行的所有系统服务的诊断输出。 此输出通常比您想要的更详细,因此请使用此页面上的命令行选…...
设计模式-访问者模式
背景 做一个对歌手的评价系统,观众分为男人和女人,分别对歌手做出自己的评价。 传统思路: 做一个person父类,Man 和 Woman分别继承自这个父类,在这两个类中执行各自操作。 问题: 可拓展性差࿰…...
Vue集成阿里云点播实现视频上传
实现方式有多种,如下是我的实现方式: 一、下载点播插件,在 public 下的 index.html 中引入阿里云点播需要的 js 插件,js 文件最好放在 cdn 上,,这里以放在 public 文件夹下的 static 文件夹中为例: <s…...
ByteByteGo-Forward/Reverse Proxy正/反向代理
原文链接 EP137: Proxy Vs Reverse proxy - ByteByteGo Newsletter 参考链接 Forward proxy vs. reverse proxy: Whats the difference? | TheServerSide 正向代理 (Forward Proxy) 位置:用户设备 和 互联网 之间 用途:保护客…...
[论文阅读] |智能体长期记忆与反思
写在前面:10月份的时候,联发科天玑9400发布,搭载这款旗舰 5G 智能体 AI 芯片的荣耀MagicOS9.0实现了一句话让手机自动操作美团点咖啡。很快商场实体店里便能看到很多品牌手机已经升级为智能体语音助手。下一步,这些智能体或许便能…...
Elasticsearch Kibana (windows版本) 安装和启动
目录 1.安装 2.启动 elasticsearch 3.启动 kibana 1.安装 elasticsearch下载,官网链接: Download Elasticsearch | Elastichttps://www.elastic.co/downloads/elasticsearch kibana下载,官网链接: Download Kibana Free | G…...
CSS系列(9)-- Transform 变换详解
前端技术探索系列:CSS Transform 变换详解 🔄 致读者:探索 CSS 变换的魔力 👋 前端开发者们, 今天我们将深入探讨 CSS Transform,学习如何创建引人注目的 2D 和 3D 变换效果。 2D 变换基础 Ὠ…...
bs4基本运用
1. bs4基本使用 1.1. 简介 bs4的全称为 BeautifulSoup。和lxml一样,是一个html的解析器,主要功能也是解析数据和提取数据 。 本模块作为了解模块,实际开发中很少用这个模块去解析数据,大家可能会想为什么这个模块会逐渐被淘汰&…...
skywalking 搭建 备忘录
基础环境 apache-skywalking-apm-9.6.0.tar.gz apache-skywalking-java-agent-9.1.0.tgz elasticsearch 7.14.1 采用dockers搭建 或者手动部署 kibana 可视化 应用 微服务版 consumer.jar eureka.jar 注册中心 provider.jar skywalking 地址 https://skywalkin…...
C# 和 go 关于can通信得 整理
在C#中开发CAN(Controller Area Network)通信接口时,确实有一些现成的NuGet包可以简化你的开发工作。这些库通常提供了与CAN硬件接口通信所需的基本功能,如发送和接收CAN消息。下面是一些常用的NuGet包: PCANBasic.NET…...
Unity类银河战士恶魔城学习总结(P179 Enemy Archer 弓箭手)
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了敌人弓箭手的制作 Enemy_Archer.cs 核心功能 状态机管理敌人的行为 定义了多个状态对象(如 idleState、moveState、attackState 等),通过状态机管理敌人的…...
一、LRU缓存
LRU缓存 1.LRU缓存介绍2.LRU缓存实现3.LRU缓存总结3.1 LRU 缓存的应用3.2 LRU 缓存的优缺点 1.LRU缓存介绍 LRU是Least Recently Used 的缩写,意为“最近最少使用”。它是一种常见的缓存淘汰策略,用于在缓存容量有限时,决定哪些数据需要被删…...
基于python绘制数据表(上)
利用python绘制各种数据图表 绘制柱形图-源码 from openpyxl import Workbook from openpyxl.chart import BarChart, Reference# 创建工作薄 wb Workbook(write_onlyTrue) # 创建工作表 ws wb.create_sheet(月收入)# 准备数据 rows [(月份, 销售额),(1, 23),(2, 43),(3, …...
Python Segmentation fault错误定位办法
1. 说明 Python3执行某一个程序时,报Segmentation fault (core dumped)错,但没有告知到底哪里出错,无法查问题,这时就需要一个库faulthandler来帮助分析。 2. 安装faulthandler faulthandler在Python3.3之后成为标准库…...
快速在远程服务器执行命令、批量在多个服务器执行命令(基于sshpass的自定义脚本fastsh)
在日常服务器操作中,很多时候我们需要同时操作多个服务器。特别对于那些每个服务器都需要操作相同命令的场景,不断的切换命令会话窗口会比较麻烦。基于此,编写了本文中的 fastsh 脚本用于轻度解决这种问题,提高一定的便利性。 使…...
Java基于SpringBoot的企业OA管理系统,附源码
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
SSM 垃圾分类系统——环保领域的创新引擎
第1章 概述 1.1 研究背景 随着现代网络技术发展,对于垃圾分类系统现在正处于网络发展的阶段,所以对它的要求也是比较严格的,要从这个系统的功能和用户实际需求来进行对系统制定开发的发展方式,依靠网络技术的的快速发展和现代通讯…...
websocker的java集成过程
第一步:引入依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 第二步设置配置类: // 需要注入Bean的话必须声明为配置类 Co…...
如何对小型固定翼无人机进行最优的路径跟随控制?
控制架构 文章继续采用的是 ULTRA-Extra无人机,相关参数如下: 这里用于guidance law的无人机运动学模型为: { x ˙ p V a cos γ cos χ V w cos γ w cos χ w y ˙ p V a cos γ sin χ V w cos γ w sin χ…...
03、对象的内存布局以及分配方式
在通过前面的文章了解到当一个程序启动的时候,会把一个java文件通过编译成class文件,然后把class字节码加载到JVM内存中,并初始化各种变量和对象实例,同时建立起具体的内存模型进行线程间的数据交换,在这之间对象的实例…...
「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。 关键词 小学奥数Python Cangjie动态规划斐波那契数列 一、题目描述 …...
ADB在浏览器中:ya-webadb项目安装与配置完全指南
ADB在浏览器中:ya-webadb项目安装与配置完全指南 ya-webadb ADB in your browser [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/ya/ya-webadb 项目基础介绍与编程语言 ya-webadb 是一个由 Yume-chan 开发的开源项目,它实现了ADB&#x…...
通过ros2启动gazebo
ros2_integration3.使用gazebo加载URDF 在老版本中,我们使用 gazebo --verbose -s libgazebo_ros_init.so -s libgazebo_ros_factory.so来启动gazebo和ros2与gazebo的桥。 但在新版本中,libazebo_ros_init.so和libazebo_ros_factory.so不再被支持 你…...
WPF 消息循环(二)
们已经知道,win32/MFC/WinForm/WPF 都依靠消息循环驱动,让程序跑起来。 这里就介绍 WPF 中是如何使用消息循环来驱动程序的。 1. 背景 只听说过 Dispatcher ,哪里来的消息循环? WPF 启动运行堆栈: > WpfApp1.…...
基于stm32的红外测温系统设计(论文+源码)
1总体方案设计 本课题为基于STM32的红外测温系统设计,在此将系统架构设计如图3.1所示, 整个系统包括STM32F103单片机,红外测温模块MLX90614,显示模块OLED12864,蜂鸣器以及按键等构成,在功能上,…...
分布式 Paxos算法 总结
前言 相关系列 《分布式 & 目录》《分布式 & Paxos算法 & 总结》《分布式 & Paxos算法 & 问题》 参考文献 《图解超难理解的 Paxos 算法(含伪代码)》《【超详细】分布式一致性协议 - Paxos》 Basic-Paxos 基础帕克索斯算法…...
ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小
ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小 文章目录 ubuntu 使用 Times New Roman 字体在 Matplotlib 中绘图并调整字体大小1. 安装 Times New Roman 字体验证字体是否安装成功 2. 在 Matplotlib 中加载 Times New Roman 字体3. 在 Matplotlib 中使…...
[网络] UDP协议16位校验和
16位校验和是udp报头中的一个字段,绝大多数的教材和网课都会忽略这个字段,不去细究,我闲的蛋疼问了问ai,得到了一个答案,故作此文,以证明我爱学习之心惊天地泣鬼神(狗头 ai的回答 仅从作用来说,它会根据整个应用层报文进行运算,生成一个准确的数字,这个数字不能保证唯一性,但根…...
【总结·反思·汇报·思考02】裸辞后,我的一些感想和感悟。
Hello,大家好! 首先,我需要向大家道个歉,对不起!因为最近发生了一些事情,博客文章一直没有更新。(90度鞠躬道歉) 那么,最近到底发生了什么呢?相信大家已经从…...
【前端开发】HTML+CSS网页,可以拿来当作业(免费开源)
HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content_lizhongyu"widthdevice-width, initial-scale1.0"><title>小兔鲜儿-新鲜、惠民、快捷<…...
java 导出word锁定且部分内容解锁可编辑
使用 Apache POI 创建带编辑限制的 Word 文档 在日常工作中,我们可能需要生成一些带有编辑限制的 Word 文档,例如某些段落只能被查看,而其他段落可以自由编辑。本文介绍如何使用 Apache POI 创建这样的文档,并通过代码实现相应的…...
Scala的隐式类
package hfd //隐式类 //任务:给之前的BaseUser添加新的功能,但是不要直接去改代码 //思路:把BaseUser通过隐式转换,改成一个新类型,而这个新类型中有这新的方法 //implicit class一个隐式转换函数类 //作用࿱…...
Jenkins流水线初体验(六)
DevOps之安装和配置 Jenkins (一) DevOps 之 CI/CD入门操作 (二) Sonar Qube介绍和安装(三) Harbor镜像仓库介绍&安装 (四) Jenkins容器使用宿主机Docker(五) Jenkins流水线初体验(六) 一、Jenkins流水线任务介绍 之前采用Jenkins的自由风格构建的项目,每个步骤…...
RK3568(二)——字符设备驱动开发
最基础的字符设备驱动开始,重点学习 Linux 下字符设备驱动开发框架。 驱动框架 Linux 应用程序对驱动程序的调用: 在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/de…...
apk反编译修改教程系列-----超简单修改apk中名称 包名 布局文本以及其中的文字选项 手机设置中apk对应修改演示【三十三】
💝💝💝在反编译apk中,每个初学者可能最感兴趣入门的就是修改包名 去更新以及其中选项文本的修改。这样循序渐进来激发学习的兴趣。了解一些apk中常见的修改方法。对于修改手机rom中的 系统类等等的apk原理都是一样的。这篇是应粉丝需要的修改apk基础教程. 通过博文了解…...