当前位置: 首页 > article >正文

grafana 批量视图备份及恢复(含数据源)

一、grafana 批量视图备份

import requests
import json
import urllib3
import osfrom requests.auth import HTTPBasicAuthfilename_folders_map = "folders_map.json"
type_folder = "dash-folder"
type_dashboard = "dash-db"# Grafana服务器地址及API密钥
grafana_url = "http://127.0.0.1:30301/api"
api_key = "YOUR_API_KEY"
username = "admin"
passwd = "admin123"
requests.packages.urllib3.disable_warnings()
new_grafana_url = "https://127.0.0.1:30301/api"
new_es_url = "https://quickstart-es-data-nodes.es8:9200"
new_es_passwd = "new_es_passwd "headers = {'Content-Type': 'application/json'
}# 获取数据源列表
def get_datasources():response = requests.get(f'{grafana_url}/datasources', headers=headers, auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")def save_datasource_detail(datasource_id):response = requests.get(f'{grafana_url}/datasources/{datasource_id}', headers=headers,auth=HTTPBasicAuth(username, passwd), verify=False)if response.status_code == 200:ret_json = json.loads(response.text)print(ret_json)name = ret_json["name"]# 打开文件(若不存在则创建)并写入JSON数据with open("datasource_" + name + ".json", "w") as file:# 使用json.dump()函数将数据转换为JSON格式后写入文件json.dump(ret_json, file)return ret_jsonelse:print("Failed to retrieve dashboards.")def set_datasource_detail(datasource_json, password="123"):# del datasource_json["uid"]# datasource_json["name"] = datasource_json["name"] + "03"datasource_json["secureJsonData"] = {'basicAuthPassword': password}new_json_obj = json.dumps(datasource_json)print(new_json_obj)response = requests.post(f'{new_grafana_url}/datasources', data=new_json_obj, headers=headers,auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")def set_datasource_detail(datasource_json, es_url=new_es_url,password=new_es_passwd):# del datasource_json["uid"]# datasource_json["name"] = datasource_json["name"] + "03"if "elasticsearch" == datasource_json["type"]:datasource_json["url"] = new_es_urldatasource_json["secureJsonData"] = {'basicAuthPassword': password}new_json_obj = json.dumps(datasource_json)print(new_json_obj)response = requests.post(f'{new_grafana_url}/datasources', data=new_json_obj, headers=headers,auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")def del_datasource_detail(datasource_id):response = requests.delete(f'{new_grafana_url}/datasources/{datasource_id}', headers=headers,auth=HTTPBasicAuth(username, passwd), verify=False)if response.status_code == 200:ret_json = json.loads(response.text)return ret_jsonelse:print("Failed to retrieve dashboards.")# 获文件夹列表
def get_folders(url):response = requests.get(f'{url}/folders', headers=headers, auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:return json.loads(response.text)else:print("Failed to retrieve dashboards.")def save_folder_detail(folder_uid):response = requests.get(f'{grafana_url}/folders/{folder_uid}', headers=headers,auth=HTTPBasicAuth(username, passwd), verify=False)if response.status_code == 200:ret_json = json.loads(response.text)print(ret_json)name = ret_json["title"]# 打开文件(若不存在则创建)并写入JSON数据with open("folder_" + name + ".json", "w") as file:# 使用json.dump()函数将数据转换为JSON格式后写入文件json.dump(ret_json, file)return ret_jsonelse:print("Failed to retrieve dashboards.")def set_folder_detail(folder_json):# datasource_json["name"] = datasource_json["name"] + "03"new_json_obj = {"title": folder_json["title"], "uid": folder_json["uid"]}json_obj = json.dumps(new_json_obj)print(new_json_obj)response = requests.post(f'{new_grafana_url}/folders', data=json_obj, headers=headers,auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")# 获取所有仪表盘列表
def get_dashboards():response = requests.get(f'{grafana_url}/search', headers=headers, auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")def save_dashboard_detail(dashboard_id , folder_id):response = requests.get(f'{grafana_url}/dashboards/uid/{dashboard_id}', headers=headers,auth=HTTPBasicAuth(username, passwd), verify=False)if response.status_code == 200:ret_json = json.loads(response.text)print(ret_json)dashboard = ret_json["dashboard"]name = dashboard["title"]if folder_id == None:# 打开文件(若不存在则创建)并写入JSON数据with open("dashboard_" + name + ".json", "w") as file:# 使用json.dump()函数将数据转换为JSON格式后写入文件json.dump(ret_json, file)else:with open("dashboard_folder" + str(folder_id) + "_" + name + ".json", "w") as file:# 使用json.dump()函数将数据转换为JSON格式后写入文件json.dump(ret_json, file)return ret_jsonelse:print("Failed to retrieve dashboards.")def set_dashboard_detail(dashboard_json):folderUid = dashboard_json["meta"]["folderUid"]del  dashboard_json["meta"]#dashboard = file_json["dashboard"]dashboard_json["folderUid"] = folderUiddashboard_json["overwrite"] = Truedashboard_json["dashboard"]["id"] = NonedashboardJson = json.dumps(dashboard_json)print(f"{dashboardJson}")response = requests.post(f'{new_grafana_url}/dashboards/import', data=dashboardJson, headers=headers,auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")# 创建新的仪表盘
def create_new_dashboard(title):data = {"overwrite": False,"dashboard": {"id": None,"uid": "","title": title,# ...其他配置项...},"folderId": 0,"message": ""}headers = {'Authorization': f'Bearer {api_key}','Content-Type': 'application/json'}response = requests.post(f'{grafana_url}/dashboards/db', json=data, headers=headers)if response.status_code == 200:return response.json().get('slug')else:print("Failed to create new dashboard.")# 更新现有仪表盘
def update_existing_dashboard(dashboard_slug, title):data = {"overwrite": True,"dashboard": {"id": None,"uid": "","title": title,# ...其他配置项...},"folderId": 0,"message": ""}headers = {'Authorization': f'Bearer {api_key}','Content-Type': 'application/json'}response = requests.put(f'{grafana_url}/dashboards/{dashboard_slug}', json=data, headers=headers)if response.status_code == 200:return response.json().get('slug')else:print("Failed to update existing dashboard.")# 删除指定仪表盘
def delete_dashboard(dashboard_slug):headers = {'Authorization': f'Bearer {api_key}'}response = requests.delete(f'{grafana_url}/dashboards/{dashboard_slug}', headers=headers)if response.status_code == 200:print("Dashboard deleted successfully.")else:print("Failed to delete the dashboard.")# 测试函数
if __name__ == "__main__":# # 清空所有数据源# datasources = get_datasources()# for datasource in datasources:#     # print(datasource["id"])#     datasource_detail = del_datasource_detail(datasource["id"])#     print(datasource_detail)current_dir = os.getcwd()file_names = os.listdir(current_dir)# 获取所有数据源并保存到磁盘datasources = get_datasources()for datasource in datasources:# print(datasource["id"])datasource_detail = save_datasource_detail(datasource["id"])print(datasource_detail)#  数据源导入# for file_name in file_names:#     if file_name.startswith("datasource") & file_name.endswith(".json"):#         print(file_name)##         with open(file_name, 'r') as f:#             file_json = json.load(f)#         ret = set_datasource_detail(file_json, new_es_url,new_es_passwd)# 获取所有文件夹并保存到磁盘folders = get_folders(grafana_url)for folder in folders:print(folder["title"])folder_detail = save_folder_detail(folder["uid"])print(folder_detail)# 文件夹导入# for file_name in file_names:#     if file_name.startswith("folder") & file_name.endswith(".json"):#         print(file_name)#         with open(file_name, 'r') as f:#             file_json = json.load(f)#         ret = set_folder_detail(file_json)# 获取所有仪表盘列表dashboards = get_dashboards()for board in dashboards:# if type_folder==board["type"]:#     print(board["title"])if type_dashboard == board["type"]:print(board["title"])save_dashboard_detail(board["uid"],board["folderId"])# 仪表盘导入# for file_name in file_names:#     if file_name.startswith("dashboard") & file_name.endswith(".json"):#         print(file_name)#         with open(file_name, 'r') as f:#             file_json = json.load(f)#         ret = set_dashboard_detail(file_json)# # 创建新的仪表盘# new_dashboard_slug = create_new_dashboard("New Dashboard")# print(f"Created a new dashboard with slug: {new_dashboard_slug}")## # 更新现有仪表盘# updated_dashboard_slug = update_existing_dashboard(new_dashboard_slug, "Updated Dashboard Title")# print(f"Updated an existing dashboard with slug: {updated_dashboard_slug}")## # 删除指定仪表盘# delete_dashboard(updated_dashboard_slug)

二、grafana 批量视图恢复

import requests
import json
import urllib3
import osfrom requests.auth import HTTPBasicAuthfilename_folders_map = "folders_map.json"
type_folder = "dash-folder"
type_dashboard = "dash-db"# Grafana服务器地址及API密钥
grafana_url = "https://127.0.0.1:30301/api"
api_key = "YOUR_API_KEY"
username = "admin"
passwd = "admin123"
requests.packages.urllib3.disable_warnings()
# new_grafana_url = "https://127.0.0.2:30301/api"
# new_es_url = "https://quickstart-es-data-nodes.es8:9200"
# new_es_passwd = "new_es_passwd "
new_grafana_url = "https://127.0.0.1:30301/api"
new_es_url = "https://quickstart-es-data-nodes.es8:9200"
new_es_passwd = "new_es_passwd "old_domain = 'traefik.kidsi4.cn'
new_domain = 'web.bcs2sz.com'headers = {'Content-Type': 'application/json'
}# 获取数据源列表
def get_datasources():response = requests.get(f'{new_grafana_url}/datasources', headers=headers, auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")def save_datasource_detail(datasource_id):response = requests.get(f'{grafana_url}/datasources/{datasource_id}', headers=headers,auth=HTTPBasicAuth(username, passwd), verify=False)if response.status_code == 200:ret_json = json.loads(response.text)print(ret_json)name = ret_json["name"]# 打开文件(若不存在则创建)并写入JSON数据with open("datasource_" + name + ".json", "w") as file:# 使用json.dump()函数将数据转换为JSON格式后写入文件json.dump(ret_json, file)return ret_jsonelse:print("Failed to retrieve dashboards.")def set_datasource_detail(datasource_json, password="123"):# del datasource_json["uid"]# datasource_json["name"] = datasource_json["name"] + "03"datasource_json["secureJsonData"] = {'basicAuthPassword': password}new_json_obj = json.dumps(datasource_json)print(new_json_obj)response = requests.post(f'{new_grafana_url}/datasources', data=new_json_obj, headers=headers,auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")def set_datasource_detail(datasource_json, es_url=new_es_url,password=new_es_passwd):# del datasource_json["uid"]# datasource_json["name"] = datasource_json["name"] + "03"if "elasticsearch" == datasource_json["type"]:datasource_json["url"] = new_es_urldatasource_json["secureJsonData"] = {'basicAuthPassword': password}new_json_obj = json.dumps(datasource_json)print(new_json_obj)response = requests.post(f'{new_grafana_url}/datasources', data=new_json_obj, headers=headers,auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")def del_datasource_detail(datasource_id):response = requests.delete(f'{new_grafana_url}/datasources/{datasource_id}', headers=headers,auth=HTTPBasicAuth(username, passwd), verify=False)if response.status_code == 200:ret_json = json.loads(response.text)return ret_jsonelse:print("Failed to retrieve dashboards.")# 获文件夹列表
def get_folders(url):response = requests.get(f'{url}/folders', headers=headers, auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:return json.loads(response.text)else:print("Failed to retrieve dashboards.")def save_folder_detail(folder_uid):response = requests.get(f'{grafana_url}/folders/{folder_uid}', headers=headers,auth=HTTPBasicAuth(username, passwd), verify=False)if response.status_code == 200:ret_json = json.loads(response.text)print(ret_json)name = ret_json["title"]# 打开文件(若不存在则创建)并写入JSON数据with open("folder_" + name + ".json", "w") as file:# 使用json.dump()函数将数据转换为JSON格式后写入文件json.dump(ret_json, file)return ret_jsonelse:print("Failed to retrieve dashboards.")def set_folder_detail(folder_json):# datasource_json["name"] = datasource_json["name"] + "03"new_json_obj = {"title": folder_json["title"], "uid": folder_json["uid"]}json_obj = json.dumps(new_json_obj)print(new_json_obj)response = requests.post(f'{new_grafana_url}/folders', data=json_obj, headers=headers,auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")# 获取所有仪表盘列表
def get_dashboards():response = requests.get(f'{grafana_url}/search', headers=headers, auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")def save_dashboard_detail(dashboard_id):response = requests.get(f'{grafana_url}/dashboards/uid/{dashboard_id}', headers=headers,auth=HTTPBasicAuth(username, passwd), verify=False)if response.status_code == 200:ret_json = json.loads(response.text)print(ret_json)dashboard = ret_json["dashboard"]name = dashboard["title"]# 打开文件(若不存在则创建)并写入JSON数据with open("dashboard_" + name + ".json", "w") as file:# 使用json.dump()函数将数据转换为JSON格式后写入文件json.dump(ret_json, file)return ret_jsonelse:print("Failed to retrieve dashboards.")def set_dashboard_detail(dashboard_json):folderUid = dashboard_json["meta"]["folderUid"]del  dashboard_json["meta"]#dashboard = file_json["dashboard"]dashboard_json["folderUid"] = folderUiddashboard_json["overwrite"] = Truedashboard_json["dashboard"]["id"] = NonedashboardJson = json.dumps(dashboard_json)print(f"{dashboardJson}")response = requests.post(f'{new_grafana_url}/dashboards/import', data=dashboardJson, headers=headers,auth=HTTPBasicAuth(username, passwd),verify=False)if response.status_code == 200:print(json.loads(response.text))return json.loads(response.text)else:print("Failed to retrieve dashboards.")# 创建新的仪表盘
def create_new_dashboard(title):data = {"overwrite": False,"dashboard": {"id": None,"uid": "","title": title,# ...其他配置项...},"folderId": 0,"message": ""}headers = {'Authorization': f'Bearer {api_key}','Content-Type': 'application/json'}response = requests.post(f'{grafana_url}/dashboards/db', json=data, headers=headers)if response.status_code == 200:return response.json().get('slug')else:print("Failed to create new dashboard.")# 更新现有仪表盘
def update_existing_dashboard(dashboard_slug, title):data = {"overwrite": True,"dashboard": {"id": None,"uid": "","title": title,# ...其他配置项...},"folderId": 0,"message": ""}headers = {'Authorization': f'Bearer {api_key}','Content-Type': 'application/json'}response = requests.put(f'{grafana_url}/dashboards/{dashboard_slug}', json=data, headers=headers)if response.status_code == 200:return response.json().get('slug')else:print("Failed to update existing dashboard.")# 删除指定仪表盘
def delete_dashboard(dashboard_slug):headers = {'Authorization': f'Bearer {api_key}'}response = requests.delete(f'{grafana_url}/dashboards/{dashboard_slug}', headers=headers)if response.status_code == 200:print("Dashboard deleted successfully.")else:print("Failed to delete the dashboard.")# 测试函数
if __name__ == "__main__":# # 清空所有数据源datasources = get_datasources()for datasource in datasources:# print(datasource["id"])datasource_detail = del_datasource_detail(datasource["id"])print(datasource_detail)current_dir = os.getcwd()file_names = os.listdir(current_dir)#  数据源导入for file_name in file_names:if file_name.startswith("datasource") & file_name.endswith(".json"):print(file_name)with open(file_name, 'r') as f:file_json = json.load(f)ret = set_datasource_detail(file_json, new_es_url,new_es_passwd)# 获取所有文件夹并保存到磁盘# folders = get_folders(grafana_url)# for folder in folders:#     print(folder["title"])#     folder_detail = save_folder_detail(folder["uid"])#     print(folder_detail)# 文件夹导入# current_dir = os.getcwd()# file_names = os.listdir(current_dir)for file_name in file_names:if file_name.startswith("folder") & file_name.endswith(".json"):print(file_name)with open(file_name, 'r') as f:file_json = json.load(f)ret = set_folder_detail(file_json)# 获取所有仪表盘列表# dashboards = get_dashboards()# for board in dashboards:#     # if type_folder==board["type"]:#     #     print(board["title"])#     if type_dashboard == board["type"]:#         print(board["title"])#         save_dashboard_detail(board["uid"])# 仪表盘导入# current_dir = os.getcwd()# file_names = os.listdir(current_dir)for file_name in file_names:if file_name.startswith("dashboard") & file_name.endswith(".json"):print(file_name)with open(file_name, 'r') as f:file_json = json.load(f)# 域名处理Json_str2 = json.dumps(file_json)Json_str3= Json_str2.replace(old_domain,new_domain)Json_str4 = Json_str3.replace(old_domain, new_domain)json5 = json.loads( Json_str4 )ret = set_dashboard_detail(json5)# # 创建新的仪表盘# new_dashboard_slug = create_new_dashboard("New Dashboard")# print(f"Created a new dashboard with slug: {new_dashboard_slug}")## # 更新现有仪表盘# updated_dashboard_slug = update_existing_dashboard(new_dashboard_slug, "Updated Dashboard Title")# print(f"Updated an existing dashboard with slug: {updated_dashboard_slug}")## # 删除指定仪表盘# delete_dashboard(updated_dashboard_slug)

相关文章:

grafana 批量视图备份及恢复(含数据源)

一、grafana 批量视图备份 import requests import json import urllib3 import osfrom requests.auth import HTTPBasicAuthfilename_folders_map "folders_map.json" type_folder "dash-folder" type_dashboard "dash-db"# Grafana服务器地…...

SAP学习笔记 - 开发22 - 前端Fiori开发 数据绑定(Jason),Data Types(数据类型)

上一章讲了Icons(图标),Icon Explorer。 SAP学习笔记 - 开发21 - 前端Fiori开发 Icons(图标),Icon Explorer(图标浏览器)-CSDN博客 本章继续讲SAP Fiori开发的知识。 目录 1&…...

网络编程之TCP编程

基于 C/S &#xff1a;客户端&#xff08;client&#xff09;/服务器端&#xff08;server&#xff09; 1.流程 2. 函数接口 所有函数所需头文件&#xff1a; #include <sys/types.h> #include <sys/socket.h> 系统定义好了用来存储网络信息的结构体 ipv4通信使…...

C++进阶--C++11(04)

文章目录 C进阶--C11&#xff08;04&#xff09;lambdalambda表达式语法捕捉列表lambda的应用lambda的原理 包装器functionbind 总结结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c…...

当AI遇上防火墙:新一代智能安全解决方案全景解析

在2025年网络安全攻防升级的背景下&#xff0c;AI与防火墙的融合正重塑安全防御体系。以下三款产品通过机器学习、行为分析等技术创新&#xff0c;为企业提供智能化主动防护&#xff1a; 1. 保旺达数据安全管控平台——AI驱动的动态治理引擎‌ 智能分类分级‌&#xff1a;基于…...

STL 库基础概念与示例

一、STL 库基础概念与示例 1. 容器分类 顺序容器 核心特性&#xff1a;按元素插入顺序存储&#xff0c;支持下标访问&#xff08;类似数组&#xff09;&#xff0c;动态扩展内存。典型容器&#xff1a;vector&#xff08;动态数组&#xff09;。适用场景&#xff1a;需要频繁…...

Spring MVC参数绑定终极手册:单多参/对象/集合/JSON/文件上传精讲

我们通过浏览器访问不同的路径&#xff0c;就是在发送不同的请求&#xff0c;在发送请求时&#xff0c;可能会带一些参数&#xff0c;本文将介绍了Spring MVC中处理不同请求参数的多种方式 一、传递单个参数 接收单个参数&#xff0c;在Spring MVC中直接用方法中的参数就可以&…...

Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代

2025年6月1日&#xff0c;去中心化算力平台 Fluence 正式宣布启动“Pointless 计划”——这是其《Fluence Vision 2026》战略中四项核心举措之一&#xff0c;旨在通过贡献驱动的积分体系&#xff0c;激励更广泛的社区参与&#xff0c;为用户带来现实世界资产&#xff08;RWA&am…...

innovus: ecoAddRepeater改变hier层级解决办法

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 来自星球提问: 星主&#xff0c;我在A/B/C/D/E/U0这个cell后面插入一个BUFF&#xff0c;生成的名字为A/B/C/BUFF1&#xff0c;少了D/E两个层级&#xff0c;不应该是生成A/B/C/…...

华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《硬件产品销售方案》: 目录…...

突破数据孤岛:StarRocks联邦查询实战指南

随着企业数据生态的复杂化&#xff0c;跨多个数据存储系统进行联合查询的需求日益增长。本文将深入解析如何利用StarRocks构建高效的数据联邦查询体系&#xff0c;实现与Apache Doris和Hive数据仓库的无缝对接。 ### 一、StarRocks联邦查询架构解析 StarRocks采用分布式架构设…...

传统业务对接AI-AI编程框架-Rasa的业务应用实战(1)--项目背景即学习初衷

我的初衷&#xff1a;我想学习AI。具体的方向是这样的&#xff1a;原本传统的平台业务去对接智能体。比如发票业务&#xff0c;发票的开具、审核、计税、回款等。根据用户在业务系统前台界面输入若干提示词 或者 语音输入简短语音信息&#xff0c;可以通过智能体给出需要处理的…...

低功耗架构突破:STM32H750 与 SD NAND (存储芯片)如何延长手环续航至 14 天

低功耗架构突破&#xff1a;STM32H750 与 SD NAND &#xff08;存储芯片&#xff09;如何延长手环续航至 14 天 卓越性能强化安全高效能效图形处理优势丰富集成特性 模拟模块实时监控保障数据完整性提升安全性与可靠性测量原理采样率相关结束语 在智能皮电手环及数据存储技术不…...

CSS选择子元素

通过选择器 为所有子元素应用样式。以下是几种常见方法&#xff1a; 1. 选择所有直接子元素&#xff08;不包括孙级&#xff09; css 复制 下载 .parent > * {/* 样式规则 */color: red; } > 选择器&#xff1a;只匹配直接子元素 * 通配符&#xff1a;匹配任意类型…...

git cherry-pick (28)

1.1 目的 本文档用于说明如何git上,通过cherry-pick命令合并某个功能。 将分支bg_device的 AHB New feature support libalgo arm64 lib 提交内容合并至 分支spfl_device 分支当中 1.2适配步骤 1.2.1 实操过程 > 分支sfpl_device的状态 rootxrootx-ThinkPad:~/workdir…...

android与Qt类比

一、概念对应关系 Android RecyclerView 组件类比描述Qt 模型 - 视图组件Qt 类比描述RecyclerView画板&#xff08;容器&#xff09;QAbstractItemView视图&#xff08;展示数据的容器&#xff0c;如列表、表格&#xff09;RecyclerView.Adapter画布&#xff08;数据桥梁&…...

AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片 支持高清CMOS Sensor输入 国产品牌

AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片 支持高清CMOS Sensor输入 国产品牌 产品概述&#xff1a; AX513CE 是一款针对模组渠道市场前端IPC应用而设计的数字SOC芯片&#xff0c;支持高清CMOS Sensor输入&#xff0c;经ISP处理、视频前处理以及音视频编…...

Linux(11)——基础IO(上)

目录 一、理解文件 二、回顾C文件的接口 &#x1f4c4; C语言文件操作函数表 ​编辑&#x1f4c4; 三个文件流 三、系统文件I/O 1️⃣open 2️⃣close 3️⃣write 4️⃣read 四、文件描述符 &#x1f4a1;用户操作文件的底层逻辑是什么&#xff1f; &#x1f4…...

ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface

ABP-Book Store Application中文讲解 - Part 9: Authors: User Interface TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 8: Authors: Application Layer-CSDN博客 项目之间的引用关系。 ​​ 目…...

鸿蒙开发修改版本几个步骤

鸿蒙开发修改版本几个步骤 比如&#xff1a;5.0.4&#xff08;16&#xff09;版本改为5.0.2&#xff08;14&#xff09;版本 一、项目下的build-profile.json5 "products": [{"name": "default","signingConfig": "default&qu…...

Hive自定义函数案例(UDF、UDAF、UDTF)

目录 前提条件 背景 概念及适用场景 UDF&#xff08;User-Defined Function&#xff09; 概念 适用场景 UDAF&#xff08;User-Defined Aggregate Function&#xff09; 概念 适用场景 UDTF&#xff08;User-Defined Table-Generating Function&#xff09; 概念 适…...

【学习笔记】Circuit Tracing: Revealing Computational Graphs in Language Models

Circuit Tracing: Revealing Computational Graphs in Language Models 替代模型(Replacement Model)&#xff1a;用更多的可解释的特征来替代transformer模型的神经元。 归因图(Attribution Graph)&#xff1a;展示特征之间的相互影响&#xff0c;能够追踪模型生成输出时所采用…...

3D视觉重构工业智造:解码迁移科技如何用“硬核之眼“重塑生产节拍

一、工业视觉的进化论&#xff1a;从CCD到3D相机的范式革命 在汽车冲压车间里&#xff0c;传统CCD相机正面临四大检测困局&#xff1a; 平面感知局限&#xff1a;二维视觉无法捕捉曲面工件形变环境适应性差&#xff1a;反光板件导致误检率超12%动态捕捉延迟&#xff1a;传送带…...

Elasticsearch中的刷新(Refresh)和刷新间隔介绍

在 Elasticsearch 中,刷新(Refresh) 是控制索引数据何时对搜索可见的机制,而 刷新间隔(Refresh Interval) 则是配置该机制执行频率的参数。理解这两个概念对于平衡搜索实时性与写入性能至关重要。 一、刷新(Refresh)的本质 Lucene 索引结构与搜索可见性Elasticsearch …...

STM32标准库-TIM定时器

文章目录 一、TIM定时器1.1定时器1.2定时器类型1.1.1 高级定时器1.1.2通用定时器1.1.3基本定时器 二、定时中断基本结构预分频器时器计时器时序计数器无预装时序计数器有预装时序RCC时钟树 三、定时器定时中断3.1 接线图3.2代码3.3效果&#xff1a; 四、定时器外部中断4.1接线图…...

【算法训练营Day05】哈希表part1

文章目录 哈希表理论基础有效的字母异位词两个数组的交集快乐数两数之和 哈希表理论基础 几个值得关注的知识点&#xff1a; hash表用于快速的判断元素是否存在&#xff08;空间换时间&#xff09;其原理就是将数据通过散列函数映射到bucket中&#xff0c;如果发生hash碰撞&a…...

CMap应用场景和例子

CMap 详解 CMap 是 MFC (Microsoft Foundation Classes) 库中的一个模板类&#xff0c;用于实现键值对的映射关系&#xff08;类似哈希表或字典&#xff09;。它提供了高效的数据存储和检索功能&#xff0c;适用于需要通过键快速查找值的场景。 基本模板参数 cpp 运行 tem…...

Kafka 如何保证顺序消费

在消息队列的应用场景中&#xff0c;保证消息的顺序消费对于一些业务至关重要&#xff0c;例如金融交易中的订单处理、电商系统的库存变更等。Kafka 作为高性能的分布式消息队列系统&#xff0c;通过巧妙的设计和配置&#xff0c;能够实现消息的顺序消费。接下来&#xff0c;我…...

【算法题】算法一本通

每周更新至完结&#xff0c;建议关注收藏点赞。 目录 待整理文章已整理的文章方法论思想总结模版工具总结排序 数组与哈希表栈双指针&#xff08;滑动窗口、二分查找、链表&#xff09;树前缀树堆 优先队列&#xff08;区间/间隔问题、贪心 &#xff09;回溯图一维DP位操作数学…...

Modbus转Ethernet IP赋能挤出吹塑机智能监控

在现代工业自动化领域&#xff0c;小疆智控Modbus转Ethernet IP网关GW-EIP-001与挤出吹塑机的应用越来越广泛。这篇文章将为您详细解读这两者的结合是如何提高生产效率&#xff0c;降低维护成本的。首先了解什么是Modbus和Ethernet IP。Modbus是一种串行通信协议&#xff0c;它…...