【博客】使用GithubAction自动同步obisidian和hexo仓库
使用Github Action自动同步obisidian和hexo仓库,避免手动操作。
本文首发于❄慕雪的寒舍
1. 烦恼
先来说说慕雪现在的笔记和博客是怎么管理的吧,我正在使用两套笔记软件
- 思源笔记:私密性高一些,不是博客的笔记都在这里面。由于思源笔记不是markdown编辑器,不能直接和hexo对接;
- obisdian:专门管理hexo的博客;
然后我的hexo博客和obsidian又有分离,hexo配置仓库是一个单独的git仓库(后文简称为hexo仓库),obsidian博客库也是一个单独的git仓库(后文简称为obisidian仓库)。
我采用的操作特别繁琐,步骤如下:
- 在obsidian里面写好博客之后,手动使用FreeFileSync软件,将
obisidian/blog
目录同步到hexo/source/_posts
目录中(这两个目录完全一样); - 然后再到hexo本地仓库中执行hexo三板斧命令,给新的博客生成abbrlink,push到hexo的github仓库;
- 再用FreeFileSync反向将
hexo/source/_posts
目录同步回obisidian/blog
目录,因为新的博客会多出abbrlink;
是不是听起来都头大了?
2. 曾经的想法
先前我一直在想怎么让这套流程简化,考虑过几个方案都不太满意。我想过直接把obsidian vaults丢到hexo/source/_posts
目录里面,但是考虑到我的obsidian中还有博客模板这种不需要上传到博客里面的内容,此项并不方便(虽然hexo其实可以跳过渲染某些md文件)
现在就想出了自动化的方案,也就是用github action来同步obsidian和hexo的仓库,当obisidian/blog
目录有变动的时候,触发action,自动将这个目录的内容拷贝到hexo/source/_posts
仓库目录中,并push到hexo仓库。
这里就有一个问题,abbrlink是基于hexo插件生成的,如果用这种方式那就没办法给新的博客md文件生成一个固定abbrlink了。不管是怎么让github action执行hexo g
命令,最后都会出现远程仓库md文件中有abbrlink,但本地需要pull才能更新的问题,这会对我后续的博客编写和git操作带来不便(毕竟之前都是无脑push上去的)
之前每次想折腾github action的时候就会发现这个问题(由于没记笔记导致折腾的时候忘记了之前为啥没搞定……),然后又不了了之。
今天突然想起来,既然问题是在abbrlink插件上,那我不用hexo来生成abbrlink不就行了?反正abbrlink本质上和随机数没啥关系,我只要给新的博客手动加上一个和其他博客不冲突的abbrlink不就ok了?
注:hexo的abbrlink插件是通过crc16/crc32算法计算得到文件的abbrlink的,并非随机数生成。但对于abbrlink的作用来看,只要博客上每个文章都有一个独立的abbrlink其实就够了,所以abbrlink说它是随机数也没啥问题。
解决方法明了:用别的方法给新博客生成abbrlink,然后再用github action自动化同步obsidian仓库和hexo仓库。
3. 解决步骤
3.1. 生成abbrlink的python脚本
其实obsidian中是有一个abbrlink插件的,首先感谢插件作者能提供一个hexo-abbrlink插件的替代品。但是,这个插件不太符合本人的需求,因为它直接针对于obsidian全局,会把我的其他文件以及博客模板文件都加上abbrlink。
折腾了一会后,感觉不如返璞归真,直接写个python脚本,把所有博客文件的abbrlink遍历出来,然后生成30个不冲突的abbrlink写入到一个文件里面,每次写新博客的时候从这个文件里面取一个abbrlink出来用就完事啦!
说干就干,GPT,启动!
# 生成不冲突的abbrlink
import yaml
import re
import os
import randomMD_FILE_PATH = '../../Notes/CODE'
"""博客md文件路径"""
NEW_ABBRLINK_SIZE = 20
"""生成几个abbrlink"""
NEW_ABBRLINK_MD_FILE = '../../Notes/ABBRLINK归档.md'
"""生成的abbrlink写入这个md文件里面"""def extract_front_matter(file_path):"""提取 Markdown 文件中的 front-matter 内容。假设 front-matter 是以 '---' 包围的 YAML 格式内容。"""with open(file_path, 'r', encoding='utf-8') as file:content = file.read()# 使用正则表达式匹配 front-mattermatch = re.match(r'---\n(.*?)\n---\n', content, re.DOTALL)if match:front_matter = match.group(1)return yaml.safe_load(front_matter) # 使用 yaml 解析 front-matterelse:return Nonedef remove_front_matter(file_path):"""移除 Markdown 文件中的 front-matter 部分,返回去除 front-matter 后的内容。"""with open(file_path, 'r', encoding='utf-8') as file:content = file.read()# 使用正则表达式去除 front-mattercleaned_content = re.sub(r'---\n(.*?)\n---\n', '', content, flags=re.DOTALL)return cleaned_contentdef update_front_matter(file_path, new_front_matter):"""更新 Markdown 文件中的 front-matter 内容。"""with open(file_path, 'r+', encoding='utf-8') as file:content = file.read()# 使用正则表达式替换 front-matternew_front_matter_str = yaml.dump(new_front_matter, default_flow_style=False)content = re.sub(r'---\n(.*?)\n---\n', f'---\n{new_front_matter_str}\n---\n', content, flags=re.DOTALL)# 写回文件with open(file_path, 'w', encoding='utf-8') as file:file.write(content)def extract_front_matter_from_dir(directory_path):"""遍历指定目录及其子目录下的所有 .md 文件,提取它们的 front-matter 内容,并将所有内容添加到列表中。"""front_matter_list = []# 遍历目录中的所有文件和子目录for root, dirs, files in os.walk(directory_path):for filename in files:file_path = os.path.join(root, filename)# 只处理 .md 文件if filename.endswith('.md'):front_matter = extract_front_matter(file_path)if front_matter:front_matter_list.append(front_matter)return front_matter_listdef generate_unique_10digit_numbers(existing_numbers, n):"""生成 n 个不在 existing_numbers 列表中的 10 位数字。:param existing_numbers: 已存在的整数列表:param n: 需要生成的数字数量:return: 不重复的 10 位数字列表"""unique_numbers = set(existing_numbers) # 将现有的数字转换为集合,加速查找generated_numbers = []# 如果现有数字数量已经非常大,可能无法生成足够的唯一数字if len(unique_numbers) > 9999999999 - 1000000000:return Nonewhile len(generated_numbers) < n:num = random.randint(1000000000, 9999999999) # 随机生成一个10位数字if num not in unique_numbers:generated_numbers.append(num)unique_numbers.add(num) # 将新生成的数字添加到现有数字集合中return generated_numbersdef write_int_list_to_md(file_path, int_list):"""将整数列表的成员按行写入一个Markdown文件。:param file_path: Markdown文件的路径:param int_list: 要写入文件的整数列表"""with open(file_path, 'w', encoding='utf-8') as file:for number in int_list:file.write(f"{number}\n") # 每个数字写一行# 示例使用
if __name__ == "__main__":# 假设 markdown 文件目录路径为 "../../Notes/CODE"file_path = MD_FILE_PATH# 提取所有 .md 文件的 front-matterfront_matter_list = extract_front_matter_from_dir(file_path)# 打印所有文件的 front-matterif not front_matter_list:print("没有找到 front-matter 或目录为空。")os.abort()abbrlink_list = []for fm in front_matter_list:# print(f"文件的 front-matter 内容:", fm)if 'abbrlink' not in fm:print(f"ERR! abbrlink not in {fm}")continuelink = int(fm['abbrlink'])if link in abbrlink_list:print(f"ERR! {link} in abbrlink list!")continueabbrlink_list.append(link)# 获取新的abbrlinknew_abbrlink = generate_unique_10digit_numbers(abbrlink_list, NEW_ABBRLINK_SIZE)for link in new_abbrlink:print(link)print("Gen abbrlink success")write_int_list_to_md(NEW_ABBRLINK_MD_FILE, new_abbrlink)print("Write abbrlink to", NEW_ABBRLINK_MD_FILE)
脚本运行效果如下,会生成新的abbrlink链接数字,然后写入到指定的md文件中。这样在obsidian里面就能看到这个md文件,取用里面的abbrlink了。用完了之后再手动执行一下脚本更新abbrlink就完事啦。
❯ python3 gen_abbrlink.py
8608489065
7885829874
8484489314
4284761477
1589125738
9151131777
4800824161
7141292217
2714461943
5131440419
2816690027
9574459795
6572894529
2920325088
2724835080
7631222809
1802821635
3120273636
2860205445
3100823185
Gen abbrlink success
Write abbrlink to ../../Notes/ABBRLINK归档.md
3.2. Github Action配置
接下来就是配置Github Action来同步两个仓库了。让GPT写了个大概,发现GPT在瞎说,它给出https的仓库clone链接,并表示用自带的GITHUB_TOKEN
就能克隆私有仓库了,但实际上完全没用。最后还是得用老办法ssh密钥对来实现。
首先使用如下命令生成一个ssh密钥,弹出的提示中填写一个文件名字(不然会覆盖默认目录的ssh密钥对)
ssh-keygen -t rsa -C "github action"
然后,搞清楚同步的方向,我的需要是将obsidian仓库中的内容同步到hexo仓库,所以公钥放在hexo仓库,私钥放在obsidian仓库中。
在hexo仓库(被推送的仓库)中,仓库设置Settings->Deploy keys->Add deploy key
添加公钥,命名为HEXO_PUB_KEY
。注意需要勾选允许write写入仓库,不然默认权限只允许pull和clone仓库。
在obsidian仓库中,仓库设置Settings->Secrets and variables->Secrets
添加私钥,命名为HEXO_PRI_KEY
。
最后的Github Action Workflow文件如下,将该文件写入obsidian仓库的.github/workflows/sync-code-to-posts.yml
即可,每个步骤都写了注释。
name: Sync CODE to _postson:push:paths:- 'Notes/CODE/**' # 监听 CODE 文件夹内的文件变化,没有变化不会触发actionjobs:sync:runs-on: ubuntu-lateststeps: # 检出 obsidian 仓库的代码- name: Checkout muob repositoryuses: actions/checkout@v3# 设置 Git 配置- name: Set up Gitenv:ACTIONS_KEY: ${{ secrets.HEXO_PRI_KEY }}run: |mkdir -p ~/.ssh/echo "$ACTIONS_KEY" > ~/.ssh/id_rsachmod 700 ~/.sshchmod 600 ~/.ssh/id_rsassh-keyscan github.com >> ~/.ssh/known_hostsgit config --global user.name "musnows"git config --global user.email "ezplayingd@126.com"git config --global core.quotepath falsegit config --global i18n.commitEncoding utf-8 git config --global i18n.logOutputEncoding utf-8 # 克隆 HexoBlog 仓库(私有仓库),使用 ssh 来进行认证- name: Checkout HexoBlog repositoryrun: |git clone git@github.com:musnows/Hexo-Blog.git HexoBlog# 同步文件:将 obsidain 仓库中的 CODE 文件夹内容复制到 HexoBlog 仓库的 _posts 文件夹- name: Sync files from CODE to _postsrun: |rsync -av --delete Notes/CODE/ HexoBlog/source/_posts/# 提交更改并推送到 HexoBlog 仓库- name: Commit and push changes to HexoBlog repositoryrun: |cd HexoBloggit add .git commit -m "Sync CODE to _posts at $(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S')"git push origin hexo
第二步的Git操作中,我们将仓库配置的secrets.HEXO_PRI_KEY
映射成环境变量ACTIONS_KEY
,然后写入执行action的ubuntu环境的~/.ssh/id_rsa
私钥文件中,这样就能操作另外一个仓库了。
第四步的Sync操作使用了rsync命令
rsync -av --delete 源文件夹 目标文件夹
解释一下这里的几个命令参数,-a
用于保持文件的原有属性,-v
代表verbose,会输出详细的日志,--delete
用于在目标目录中删除源目录中不存在的文件(同步删除操作)。
4. 测试效果
我在目录中创建了一个测试文件,push到了远端仓库中,触发了action
hexo配置仓库成功被push了,有更新的文件也是在obsidain仓库中被修改的文件,符合预期。
这样就搞定啦!以后我只需要push博客到obsidian仓库中,就能自动同步到hexo仓库内了。不需要手动做那部分繁琐的操作
相关文章:
【博客】使用GithubAction自动同步obisidian和hexo仓库
使用Github Action自动同步obisidian和hexo仓库,避免手动操作。 本文首发于❄慕雪的寒舍 1. 烦恼 先来说说慕雪现在的笔记和博客是怎么管理的吧,我正在使用两套笔记软件 思源笔记:私密性高一些,不是博客的笔记都在这里面。由于思…...
UE5学习笔记 FPS游戏制作23 区分敌我,寻找敌对角色
文章目录 方法1 tag方法2 变量添加变量和函数防止队友伤害 修改Task使用球形检测查找敌人场景面板直接编辑属性 方法1 tag 角色蓝图身上有一个tag标签,可以通过标签内容区分队伍 通过ActorHasTag判断一个Actor是否有对应的标签 方法2 变量 添加变量和函数 在s…...
ECharts各类炫酷图表/3D柱形图
一、前言 最近鸡米花实现了各类的炫酷的图表,有3D柱形图、双边柱形图以及异形柱形图,好了,直接上图: 二、效果图 一个个来吧,下面就是代码啦,注意,一下图表展示的宽高均为800px*300px 三、异形横…...
AI基础03-视频数据采集
上篇文章我们学习了图片的数据采集,今天主要了解一下视频数据采集的方法。视频是由一系列图像构成的,其中每一张图片就是一帧。视频数据采集方法通常有自动图像采集和基于处理器的图像采集两种。我们学习一下如何利用python 工具和笔记本计算机摄像头进行…...
docker-compose部署prometheus+grafana+node_exporter+alertmanager规则+邮件告警
目录 一.docker-compose文件 二.配置文件 三.文件层级关系,docker-compose和配置文件位于同级目录 四.node_exporter页面json文件 五.效果展示 prometheusalertmanager邮件告警 grafana面板效果 六.涉及离线包 一.docker-compose文件 [rootsulibao prometh…...
CPM:大规模生成式中文预训练语言模型
摘要 预训练语言模型(PLMs)已被证明对各种下游自然语言处理(NLP)任务有益。最近,GPT-3 以 1750 亿参数和 570GB 训练数据引起了广泛关注,因为它具备少样本(甚至零样本)学习的能力。…...
k8s scheduler几种扩展方式的关系及区别
网上关于scheduler扩展介绍的文章很多,但都是东说一句西说一嘴,完全没有逻辑性,对于逻辑建构者看着很痛苦,这篇文章不会深入教你怎么扩展,而是教你几种扩展方式的关系和逻辑结构: 目前Kubernetes支持五种方…...
Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 实现项目接口文档管理
在现代企业级应用开发中,前后端分离已成为主流模式,前端负责界面呈现,后端专注提供 RESTful API 接口。然而,接口文档的编写和维护往往是开发过程中的痛点。Spring Boot 3.4.3 结合 SpringDoc 2 和 Swagger 3,为开发者…...
前端D3.js面试题及参考答案
目录 解释 D3.js 中 enter ()、update ()、exit () 的作用及典型应用场景 描述数据连接(Data Join)的原理,如何通过 data () 方法实现数据集与 DOM 元素的动态绑定? 如何利用 datum () 实现单个元素的数据绑定?与 data () 有何区别? 在动态数据更新时,如何通过 merge…...
Docker实现MySQL主从复制配置【简易版】
Docker实现MySQL主从复制配置 环境准备 安装docker 拉取MySQL 8.0镜像 docker pull mysql:8.0#检查 docker images | grep mysql代码流程 由于Mysql8.0的ssl验证十分繁琐,在创建容器的时候一定要禁掉 创建自定义网络 docker network create mysql-replication-ne…...
IDEA中打开项目Vue+Vue基本语法
一、IDEA中打开项目 1.IDEA中安装Vue基本插件 2.项目结构 项目根目录 node_modules : npm 加载的项目依赖模块 public : 存放静态资源,如图片、视频等。 src : 项目源码目录,包含主要的开发文件。 index.html : 首页入口文件,可以添…...
【深度学习新浪潮】图像修复(Image Inpainting)技术综述:定义、进展与应用展望
本文为精简版,完整技术细节与参考文献可与作者讨论。 1. 图像修复的定义与核心目标 图像修复(Image Inpainting)是一种通过算法手段填补图像中缺失区域或移除不需要对象的技术,其核心目标是利用图像上下文信息生成与周围像素一致且视觉自然的内容。该技术通过计算机视觉和…...
【实战】解决图片 Hover 抖动问题的完整指南
在开发网站时,很多人都会遇到一个常见问题:鼠标移动到图片上,图片放大,结果发生抖动或闪烁。这个问题往往伴随着后端接口请求、JS 动态追加 DOM 等复杂行为。 本文将深入剖析这个问题的成因,并提供一套彻底的解决方案…...
java容器
一、List 接口实现类 1. ArrayList 特性:基于动态数组实现,支持快速随机访问(时间复杂度 O(1)),但插入/删除元素时需移动后续元素(时间复杂度 O(n)) 一、核心方法分类 添加元素 add(E e):尾部追加元素,均摊时间复杂度O(1)add(int index, E element):指定位置插入…...
arthas之jvm相关命令
文章目录 1. dashboard2. thread线程相关3. jvmTHREAD相关文件描述符相关 4. sysprop5. 小结6. sysenv7. vmoption8. getstatic9. ognl10. 小结 1. dashboard 作用:显示当前系统的实时数据面板,按q或ctrlc退出 数据说明 ID: Java级别的线程IDÿ…...
UDP视频传输中的丢包和播放花屏处理方法
在处理UDP视频传输中的丢包和花屏问题时,需要结合编码优化、网络传输策略和接收端纠错技术。以下是分步骤的解决方案: 1. 前向纠错(FEC,Forward Error Correction) 原理:在发送数据时附加冗余包,接收方通过冗余信息恢复丢失的数据包。 实现方法: 使用Reed-Solomon、XO…...
蓝桥杯 班级活动
问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名同学(n 为偶数),老师想把所有同学进行分组,每两名同学一组。 为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 i…...
Open webui的使用
问题 之前本地量化模型管理器ollama的文章,我们知道可以通过ollama来管理本地量化模型,也能够在命令行中与相关模型进行对话。现在我们想要在有个web页面通过浏览器来与本地模型对话。这里我们就使用Open webui作为界面来与本地模型对话。 安装启动 这…...
页面重构过程中如何保证良好的跨浏览器一致性?
在页面重构的过程中,为了确保网页能够在不同的浏览器中呈现一致的效果,我们需要采取一系列措施来提高跨浏览器的一致性。以下是几个关键步骤和技术要点: 使用标准化的HTML和CSS:始终遵循最新的Web标准编写代码,例如采用…...
Python库与Excel
目录 一、库 1、Python自带的库 2、第三方库 3、第三方库的安装 二、import的用法 三、datetime库 1、处理日期 2、处理时刻 3、局限性 四、random库 1、函数 2、随机种子 3、发牌模拟器 五、jieba库 六、openpyxl库 1、表格读取 2、表格元素遍历 3、工作表的…...
记录一下最近参与实习 外包 社招流程里的一些感悟
记录一下最近参与实习 外包 社招流程里的一些感悟 1.简历门面要重视 1.简历非常重要,它是你的门面 初步了解到你的一个实习/工作经历,然后掌握的技术栈,是否与当前项目匹配,哪些模块上的设计是我们想要重点关注的,可…...
流动的梦境:GPT-4o 的自回归图像生成深度解析
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
HarmonyOS NEXT开发进阶(十四):HarmonyOS应用开发者基础认证试题集汇总及答案解析
文章目录 一、前言二、判断题(134道)三、单选题(210道)四、多选题(123道)五、拓展阅读 一、前言 鸿蒙原生技能学习阶段,通过官方认证的资格十分有必要,在项目实战前掌握基础开发理论…...
Visual Studio Code(简称 VS Code)下载与使用教程1(新建文件,语法高亮,快捷键,主题,快捷指令)
简介 由 微软(Microsoft) 开发的 免费、开源、跨平台 的 代码编辑器,广泛用于编程开发、文本编辑和调试。 主要功能 代码编辑:支持几乎所有编程语言(Python、JavaScript、Java、C、Go 等),提供…...
3.28前端模拟面试
针对你 1.5 年的前端经验,结合 Vue 3、TypeScript、微前端(qiankun)等背景,我准备了一套模拟面试题,偏向场景化问题,考察你的实战经验和思维能力。 一、工程化 & 架构 你们的前端项目使用 qiankun 做微…...
pip 安装某个包之后,Jupyter Lab仍旧显示包冲突;例如:Numba needs NumPy 2.1 or less. Got NumPy 2.2.
异常提示 Numba needs NumPy 2.1 or less. Got NumPy 2.2. --------------------------------------------------------------------------- ImportError Traceback (most recent call last) Cell In[8], line 53 import pywt4 import matplot…...
Python:爬虫概念与分类
网络请求: https://www.baidu.com url——统一资源定位符 请求过程: 客户端,指web浏览器向服务器发送请求 请求:请求网址(request url);请求方法(request methods);请求头(request header)&…...
flask开发中设置Flask SQLAlchemy 的 db.Column 只存储非负整数(即 0 或正整数)
如果你想控制一个 Flask SQLAlchemy 的 db.Column 只存储非负整数(即 0 或正整数),你可以在模型中使用验证来确保这一点。一种常见的方法是使用模型的 validate 方法或者在执行插入或更新操作时进行检查。 以下是实现这一目标的几种方法&…...
从0到1解决项目问题经验-Vue3前端
问题1: 我有文件里面这么一段代码,但是现在有个问题,就是在设备信息详情的抽屉页面中,当我首次点击查看的时候,显示的物流中心名称现在是跟"deviceInfo.logisticsCenterName"做的绑定,于是现在显…...
Vue.js的CSS过渡与动画:常用案例解析
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
【论文阅读】Co2l: Contrastive continual learning
原文链接:[2106.14413] Co$^2$L: Contrastive Continual Learning 阅读本文前,需要对持续学习的基本概念以及面临的问题有大致了解,可参考综述: Wang L, Zhang X, Su H, et al. A comprehensive survey of continual learning: …...
Python给对象数组排序
文章目录 1. 使用sorted()函数(返回新的排序后的列表)2. 使用list.sort()方法(原地排序,不返回新列表)3. 如果数据结构是集合(set),集合本身是无序的,无法直接排序&#…...
Docker-清理容器空间prune
docker system prune -a 是一个非常有用的命令,用于清理 Docker 系统中未使用的资源,包括停止的容器、未使用的网络、卷以及未被任何容器引用的镜像(悬空镜像和所有未使用的镜像)。以下是关于该命令的详细说明: 命令…...
Kubernetes》》K8S》》Deployment 、Pod、Rs 、部署 nginx
Deployment deployment文档说明 kubectl get rs,deployment,pods 删除pod 、deployment 、service # 如果只删除pod,deployment会自动重建,所以应该先删除deployment。 # 下面演示的是删除所有deployment,可以指定只删除某个 # 删除所有…...
【Zookeeper搭建】Zookeeper分布式集群搭建完整指南
Zookeeper分布式集群搭建 (一)克隆前准备工作 一、时钟同步 步骤: 1、输入date命令可以查看当前系统时间,可以看到此时系统时间为PDT(部分机器或许为EST),并非中国标准时间。我们在中国地区…...
基于YOLO11/WVP的电梯系统开发-模型训练与rk3568移植
1. 环境准备 代码下载: https://github.com/ultralytics/ultralytics.git切换到 8.3.0 以上的分支,yolov11 只在上述分支支持, 下载后在 ultralytics 根目录下安装 yolo 依赖环境: pip install -e . -i https://pypi.tuna.tsinghua.edu.cn…...
[数据结构]并查集(系统整理版)
基础用法 int p[N];//路径压缩 寻找祖宗节点 int find(int x){if(p[x]!x) p[x]find(p[x]);return p[x]; }int main(){ //初始化for(int i1;i<n;i) p[i]i; }合并 void merge(int a,int b){int aafind(a),bbfind(bb);if(aa!bb){p[aa]bb;} }查询是否联通 bool is_connected(…...
人工智能与软件工程结合的发展趋势
AI与软件工程的结合正在深刻改变软件开发的流程、工具和方法,其发展方向涵盖了从代码生成到系统维护的整个生命周期。以下是主要的发展方向和技术趋势: 1. 软件架构体系的重构 从“面向过程”到“面向目标”的架构转型: AI驱动软件设计以目标…...
Compose 实践与探索十七 —— 多指手势与自定义触摸反馈
上一节我们讲了滑动的手势识别以及嵌套滑动,二者都属于触摸反馈这个大的范畴内的知识。本节我们将深入触摸反馈这个话题,讲一讲多指手势的识别与完全自定义的触摸反馈的实现。 1、多指手势 多指手势可以分为两类: 利用 API 处理预设好的手…...
哈希表 - 两个数组的交集(集合、数组) - JS
一、Set基础 在 JavaScript 中,Set 是一种集合(Collection)数据结构,用于存储唯一值(不允许重复),并且可以高效地进行添加、删除、查询等操作。它类似于数组(Array)…...
26_ajax
目录 了解 接口 前后端交互 一、安装服务器环境 nodejs ajax发起请求 渲染响应结果 get方式传递参数 post方式传递参数 封装ajax_上 封装ajax下 了解 清楚前后端交互就可以写一些后端代码了。小项目 现在写项目开发的时候都是前后端分离 之前都没有前端这个东西&a…...
Java面试黄金宝典24
1. 什么是跳表 定义 跳表(Skip List)是一种随机化的数据结构,它基于有序链表发展而来,通过在每个节点中维护多个指向其他节点的指针,以多层链表的形式组织数据。其核心思想是在链表基础上增加额外层次,每…...
每日c/c++题 备战蓝桥杯(全排列问题)
题目描述 按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼n 组成的所有不重复的数字序列,每行一个序列。 每个数字保留 5 个场…...
Layui实现table动态添加行,可删除、表格可编辑,小数校验
实现如图需求,layui实现的可编辑table,包含B、C、D、E列,A列不用实现出现,A列放在附件就是让你明白,不同的物料名称,行是不一样的。除了头部表头和E列不能编辑,每个表格都可编辑,其中…...
Spring Boot 非web应用程序
在 Spring Boot 框架中,要创建一个非Web应用程序(纯Java程序) main方法运行,不启动tomcat,main方法执行结束,程序就退出了; 方式一 1、SpringBoot开发纯Java程序,应该采…...
数据分析中的基线校正算法全解析:原理、实现与应用
数据分析中的基线校正算法全解析:原理、实现与应用 在数据分析中,基线漂移是一个常见问题,会严重影响数据的解释和分析精度。本文将详细介绍12种主流基线校正方法,包括数学原理、Python实现代码和适用场景分析。 基线漂移问题概述 基线漂移主要由以下因素引起: 仪器强度…...
国外计算机证书推荐(考证)(6 Sigma、AWS、APICS、IIA、Microsoft、Oracle、PMI、Red Hat)
文章目录 证书推荐1. 六西格玛 (6 Sigma)2. 亚马逊网络服务 (AWS)3. 美国生产与库存控制学会 (APICS)4. 内部审计师协会 (IIA)5. 微软 (Microsoft)6. 甲骨文 (Oracle)7. 项目管理协会 (PMI)8. 红帽 (Red Hat) 证书推荐 1. 六西格玛 (6 Sigma) 介绍:六西格玛是一种…...
linux》》docker 、containerd 保存镜像、打包tar、加载tar镜像
Linux》》docker: 默认情况下,Docker镜像保存在/var/lib/docker/目录下。 当您使用docker pull命令从Docker Hub或私有镜像仓库中拉取镜像时,Docker会自动将镜像文件保存在/var/lib/docker/image/目录下。 每个镜像都由一个或多个层组成,这些…...
大数据(2)Hadoop架构深度拆解:HDFS与MapReduce企业级实战与高阶调优
目录 一、分布式系统的设计哲学演进1.1 从Google三驾马车到现代数据湖 二、企业级HDFS架构全景图2.1 联邦架构的深度实践2.2 生产环境容灾设计2.3 性能压测方法论 三、MapReduce引擎内核解密3.1 Shuffle机制全链路优化3.2 资源调度革命:从MRv1到YARN3.3 企业级编码规…...
【数学建模】动态规划算法(Dynamic Programming,简称DP)详解与应用
动态规划算法详解与应用 文章目录 动态规划算法详解与应用引言动态规划的基本概念动态规划的设计步骤经典动态规划问题1. 斐波那契数列2. 背包问题3. 最长公共子序列(LCS) 动态规划的优化技巧动态规划的应用领域总结 引言 动态规划(Dynamic Programming,简称DP)是一…...