技术速递|Copilot Usage Advanced Dashboard 教程
作者:Xuefeng Yin
排版:Alan Wang
Copilot Usage Advanced Dashboard 是为了充分利用 GitHub Copilot API 中的几乎所有数据,用到的 API 有:
-
List teams of an onganization
-
Get a summary of Copilot metrics for a team
-
Get Copilot seat information and settings for an organization
-
List all Copilot seat assignments for an organization
形成单一的数据面板展示,从不同的维度展现 Copilot 在多个 Organzations 和 Teams 中的使用情况。特性概括如下:
-
对数据进行持久化存储到 Elasticsearch 中,并基于 Grafana 进行数据可视化,而不仅仅是展示过去的28天数据。因此,可以自由选择期望进行数据可视化的时间段,如过去一整年、或者特定的月份。
-
所有存储的数据都包含了 Organization 和 Team 字段,方便通过变量过滤器进行数据筛选。
-
对每一份数据生成唯一 hash key,每次获取最新数据时,会更新已经存储的数据。
-
可根据实际需求,对 Grafana 的 dashboards 中的 visualizations 进行调整、删除。
-
可以基于 Grafana 的内置告警功能,设定 alert 规则,对一些不合适的使用行为进行告警,比如对长期不活跃的用户发送告警信息。
-
可以方便的与第三方系统集成,不论是从 Elasticsearch 中抽取数据到别的数据可视化平台进行数据可视化,或者在 Copilot Usage Advanced Dashboard 中添加别的数据源进行联合数据可视化。
Online Demo Environment✨
设计了2款 dashboards,二者可以在 Grafana 中同时存在。

Copilot Usage Advanced Dashboard
Copilot Metrics Viewer 兼容 dashboard
如果你很熟悉 copilot-metrics-viewer 项目,那么请体验这个 dashboard,并在后续的安装中使用此 dashboard。
-
地址:http://20.89.179.123:3000/d/be7hpbvvhst8gc/copilot-usage-advanced-dashboard
-
用户名:
demouser -
密码:
demouser

Copilot Usage Advanced Dashboard Original
新设计 dashboard
-
地址:http://20.89.179.123:3000/d/a98455d6-b401-4a53-80ad-7af9f97be6f4/copilot-usage-advanced-dashboard-original
-
用户名:
demouser -
密码:
demouser

条件变量
支持四种过滤条件,分别是:
-
Organzation
-
Team
-
Language
-
Editor
变量的选择会动态关联到数据

特性
Copilot Usage Advanced Dashboard
1 Organization
先基于 List teams of an onganization 获取 Organization 下的所有 teams,然后基于 Get a summary of Copilot usage for a team,对 Organization 下所有的 teams 的数据求和并计算,得到完整的 Organization 层面数据。
-
Acceptance Rate Average =
sum(total_acceptances_count) / sum(total_suggestions_count) -
Cumulative Number of Acceptence (Count) =
sum(total_acceptances_count) -
Cumulative Number of Suggestions (Count) =
sum(total_suggestions_count) -
Cumulative Number of Lines of Code Accepted =
sum(total_lines_accepted) -
Acceptance Rate (%) =
total_acceptances_count / total_suggestions_count -
Total Active Users = total_active_users
-
Total Suggestions & Acceptances Count =
total_suggestions_count&total_acceptances_count -
Total Lines Suggested & Accepted =
total_lines_suggested&total_lines_accepted

2 Teams
基于Get a summary of Copilot usage for a team中的 breakdown 数据进行分析,对数据按照 Teams 进行数据聚合,得到不同的 Teams 的数据对比。
-
Number of Teams =
unique_count(team_slug) -
Top Teams by Accepted Prompts =
sum(acceptances_count).groupby(team_slug) -
Top Teams by Acceptance Rate =
sum(acceptances_count).groupby(team_slug) / sum(suggestions_count).groupby(team_slug) -
Teams Breakdown =
sum(*).groupby(team_slug)

3 Languages
基于Get a summary of Copilot usage for a team中的breakdown数据进行分析,对数据按照Languages进行数据聚合,得到不同的Languages的数据对比。
-
Number of Languages=
unique_count(language) -
Top Languages by Accepted Prompts =
sum(acceptances_count).groupby(language) -
Top Languages by Acceptance Rate =
sum(acceptances_count).groupby(language) / sum(suggestions_count).groupby(language) -
Languages Breakdown =
sum(*).groupby(language)

4 Editors
基于 Get a summary of Copilot usage for a team 中的 breakdown 数据进行分析,对数据按照 Editors 进行数据聚合,得到不同的 Editors 的数据对比。
-
Number of Editors =
unique_count(editor) -
Top Editors by Accepted Prompts =
sum(acceptances_count).groupby(editor) -
Top Editors by Acceptance Rate =
sum(acceptances_count).groupby(editor) / sum(suggestions_count).groupby(editor) -
Editors Breakdown =
sum(*).groupby(editor)

5 Copilot Chat
基于 Get a summary of Copilot usage for a team 的数据进行分析,得到 Copilot Chat 的使用情况。
-
Acceptance Rate Average =
sum(total_chat_acceptances) / sum(total_chat_turns) -
Cumulative Number of Acceptances =
sum(total_chat_acceptances) -
Cumulative Number of Turns =
sum(total_chat_turns) -
Total Acceptances | Total Turns Count =
total_chat_acceptances|total_chat_turns -
Total Active Copilot Chat Users =
total_active_chat_users

6 Seat Analysis
基于 Get Copilot seat information and settings for an organization 以及 List all Copilot seat assignments for an organization 的数据分析,把席位分配情况和使用情况进行统一呈现。
-
Copilot Plan Type =
count(seats).groupby(plan_type) -
Total =
seat_breakdown.total -
Active in this Cycle =
seat_breakdown.active_this_cycle -
Assigned But Never Used =
last_activity_at.isnan() -
Inactive in this Cycle =
seat_breakdown.inactive_this_cycle -
Ranking of Inactive Users ( ≥ 2 days ) =
today - last_activity_at -
All assigned seats =
*

7 Breakdown Heatmap
基于 Get a summary of Copilot usage for a team 中的breakdown 数据进行分析,从 Languages 和 Editors 二个维度进行数据分析。可以清晰的看到什么样的 Languages 和 Editors 的组合可以实现最好的 Copilot 使用效果。
-
Active Users Count (Group by Language) =
active_users.groupby(language) -
Accept Rate by Count (%) =
sum(acceptances_count).groupby(language) / sum(suggestions_count).groupby(language) -
Accept Rate by Lines (%) =
sum(lines_accepted).groupby(language) / sum(lines_suggested).groupby(language) -
Active Users Count (Group by Editor) = a
ctive_users.groupby(editor) -
Accept Rate by Count (%) =
sum(acceptances_count).groupby(editor) / sum(suggestions_count).groupby(editor) -
Accept Rate by Lines (%) =
sum(lines_accepted).groupby(editor) / sum(lines_suggested).groupby(editor)

Copilot Usage Advanced Dashboard Original
1 Copilot Seat Info & Top Languages
-
您可以查看席位分布情况、企业版还是商务版?以及总体激活趋势。对于不使用 Copilot 的用户,将根据不活动时间长短进行排名,并列出从未激活的用户。
-
根据使用情况对语言和团队进行排名

2 Copilot Usage Total Insight
您可以根据计数、行数和聊天量分析推荐总数和采用率趋势。

3 Copilot Usage Breakdown Insight
你可以分析 Copilot 在不同语言,不同编辑器组合下的效果。

特别说明
本文所描述一切内容都是基于 all-in-one 架构。在生产环境中,可以根据实际需求,拆分成分布式架构。
原理

技术栈
依赖的技术栈:
-
VM
-
Docker
-
Elasticsearch
-
Grafana
-
Python3
部署
所有操作在 VM 中执行
先决条件
一切都在本地并且免费(VM 除外)
唯一需要的是:
-
一个 VM
-
内存:建议 16G
-
操作系统:Ubuntu 22.04(推荐,其他操作系统除了安装 Docker 外没有区别)
-
端口:需要释放
3000端口供 Grafana 使用,22端口可以自行确定。
-
其他一切都基于现有的东西,或者基于开源软件,无需额外费用,例如:
-
启用了 Copilot 的 GitHub Organzations(我相信,您已经拥有它)
-
Docker(社区版本就足够了)
-
Elasticsearch(社区版本就足够了)
-
Grafana(社区版本就足够了,不需要 Grafana 云帐户)
-
从此项目构建的 CPUAD-Updater(MIT 许可证)
Docker
安装方式参考 Install Docker Engine,对于 Ubuntu 22.04,可以使用如下命令:
apt install docker.io
验证
docker version
得到如下内容,表示 ok
Client:Version: 24.0.7API version: 1.43Go version: go1.21.1Git commit: 24.0.7-0ubuntu2~22.04.1Built: Wed Mar 13 20:23:54 2024OS/Arch: linux/amd64Context: default
Server:Engine:Version: 24.0.7API version: 1.43 (minimum version 1.12)Go version: go1.21.1Git commit: 24.0.7-0ubuntu2~22.04.1Built: Wed Mar 13 20:23:54 2024OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.7.12GitCommit:runc:Version: 1.1.12-0ubuntu2~22.04.1GitCommit:docker-init:Version: 0.19.0GitCommit:
下载源码
所有工作内容都放在 /srv 目录中,点击下载 zip 压缩包,解压后重命名文件夹名称为 copilot-usage-advanced-dashboard,或者直接 git clone
cd /srv
git clone https://github.com/satomic/copilot-usage-advanced-dashboard.git
cd copilot-usage-advanced-dashboard
验证
ls -ltr
得到如下内容,表示 ok
total 64
-rw-r--r-- 1 root root 100 Dec 16 11:22 fetch.sh
-rw-r--r-- 1 root root 56 Dec 16 11:22 docker_build.sh
-rw-r--r-- 1 root root 1063 Dec 16 11:22 LICENSE
-rw-r--r-- 1 root root 1031 Dec 16 11:22 Dockerfile
-rw-r--r-- 1 root root 193 Dec 16 11:22 push.sh
drwxr-xr-x 2 root root 4096 Dec 16 11:22 mapping
-rw-r--r-- 1 root root 22 Dec 16 11:32 requirements.txt
-rw-r--r-- 1 root root 996 Dec 16 13:44 log_utils.py
drwxr-xr-x 2 root root 4096 Dec 17 00:18 grafana
-rw-r--r-- 1 root root 2571 Dec 17 00:18 gen_grafana_model.py
-rw-r--r-- 1 root root 22500 Dec 17 01:40 main.py
Elasticsearch
安装
如果你已经有了 ES,那么可以跳过本步骤,直接到下一步。
ES 不会暴露到 VM 的外部,因此不用开启xpack.security.enabled
- 为 Elasticsearch 创建数据持久化目录和配置文件目录:
mkdir -p /srv/elasticsearch/data /srv/elasticsearch/confi
- 并授予所有用户读写权限。
chmod -R a+rw /srv/elasticsearch
- 在
/srv/elasticsearch/config/目录下创建elasticsearch.yml配置文件:
cat >> /srv/elasticsearch/config/elasticsearch.yml << EOF
network.host: 0.0.0.0
node.name: single-node
cluster.name: es-docker-cluster
path.data: /usr/share/elasticsearch/data
path.logs: /usr/share/elasticsearch/logs
discovery.type: single-node
bootstrap.memory_lock: true
EOF
- 使用以下命令启动 Elasticsearch,并绑定数据目录和配置文件:
docker run -itd --restart always --name es \-p 9200:9200 \-e "xpack.security.enabled=false" \-e "ES_JAVA_OPTS=-Xms4g -Xmx4g" \-v /srv/elasticsearch/data:/usr/share/elasticsearch/data \-v /srv/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro \docker.elastic.co/elasticsearch/elasticsearch:8.17.0
- 访问测试
curl http://localhost:9200
得到如下内容,表示 ok
{"name": "single-node","cluster_name": "es-docker-cluster","cluster_uuid": "oO3mfjYWTZ6VZFSClDiSLA","version": {"number": "8.17.0","build_flavor": "default","build_type": "docker","build_hash": "2b6a7fed44faa321997703718f07ee0420804b41","build_date": "2024-12-11T12:08:05.663969764Z","build_snapshot": false,"lucene_version": "9.12.0","minimum_wire_compatibility_version": "7.17.0","minimum_index_compatibility_version": "7.0.0"},"tagline": "You Know, for Search"
}
创建 index
- 确认当前在正确的路径中
cd /srv/copilot-usage-advanced-dashboard
- 执行脚本,创建 index
bash create_es_indexes.sh
得到如下内容,表示 ok
{"acknowledged":true,"shards_acknowledged":true,"index":"copilot_usage_total"}
{"acknowledged":true,"shards_acknowledged":true,"index":"copilot_usage_breakdown"}
{"acknowledged":true,"shards_acknowledged":true,"index":"copilot_usage_breakdown_chat"}
{"acknowledged":true,"shards_acknowledged":true,"index":"copilot_seat_info_settings"}
{"acknowledged":true,"shards_acknowledged":true,"index":"copilot_seat_assignments"}
- 检查
curl -X GET http://localhost:9200/_cat/indices?v
得到如下内容,表示 ok
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size dataset.size
yellow open copilot_usage_total XrOEfAngTS60VsuUz3Lbrw 1 1 0 0 227b 227b 227b
yellow open copilot_seat_info_settings WtOBdBNUQRqua7wi7VANeQ 1 1 0 0 227b 227b 227b
yellow open copilot_
seat
_assignments lK5t4SwASZizPQ_
W4NX4KQ 1 1 0 0 227b 227b 227b
yellow open copilot_usage_breakdown xE6tkg5GQEOP-EP8pwAkYg 1 1 0 0 227b 227b 227b
yellow open copilot_usage_breakdown_chat 6R_1cdlIQQOCv4BoHPqXCw 1 1 0 0 227b 227b 227b
Grafana
安装
如果你已经有了 Grafana,那么可以跳过本步骤,直接到下一步。
- 创建数据路径
mkdir -p /srv/grafana/data
chmod -R a+rw /srv/grafana/data
- 启动
docker run -itd --restart always --name=grafana \--net=host \-p 3000:3000 \-v /srv/grafana/data:/var/lib/grafana \-e "GF_LOG_LEVEL=debug" \grafana/grafana:11.4.0
- 访问 Grafana
-
访问地址:
http://<PUBLIC_IP_OF_YOUR_VM>:3000 -
默认用户名密码为
admin/admin,请修改密码
创建 Admin Token
- 管理员访问 Administration → Users and access → Service accounts

- 输入 Display name,Role 选择
Admin,点击 Create

- 点击 Add service account token

- 点击 Generate token

- Copy to clipboard and close

- 现在,你获得了你的 Grafana Token “
<your_grafana_token>”,请保存后它,并设置为VM中的环境变量,接下来步骤会用到。
export GRAFANA_TOKEN="<your_grafana_token>"
通过 API 添加 Data sources
- 确认当前在正确的路径中
cd /srv/copilot-usage-advanced-dashboard
- 执行脚本,添加 data sources
bash add_grafana_data_sources.sh
- 访问 Grafana UI,确认添加成功

生成 Dashboard Json Model
- 确认当前在正确的路径中
cd /srv/copilot-usage-advanced-dashboard
- 执行脚本,生成 Grafana json 模型,如下2个命令,执行其中的一条就可以
# 生成 Copilot Usage Advanced Dashboard
python3 gen_grafana_model.py --template=grafana/dashboard-template.json
# Copilot Usage Advanced Dashboard Original
python3 gen_grafana_model.py --template=grafana/dashboard-template-original.jso
得到输出
Model saved to grafana/dashboard-model-2024-12-17.json, please import it to Grafana
导入产生的 Json 创建 Dashboard
- 下载产生的文件到本地
scp root@<PUBLIC_IP_OF_YOUR_VM>:/srv/copilot-usage-advanced-dashboard/grafana/dashboard-model-*.json .
dashboard-model-2024-12-17.json 100% 157KB 243.8KB/s 00:00
dashboard-model-data_sources_name_uid_mapping-2024-12-17.json 100% 210 1.1KB/s 00:00
- 复制产生的 json 文件,导入到 Grafana

选择文件导入,或者直接粘贴内容

- Import

- 恭喜你,此时获得了完整的 Dashboard,但是应该还没有数据。接下来,运行核心程序。
cpuad-updater
是 Copilot Usage Advanced Dashboard Updater 的首字符简写
选项1:✨Docker 方式运行(推荐)
参数说明
-
GITHUB_PAT:-
你的账户需要具有 Organzations 的 Owner 权限。
-
Create a personal access token (classic)在
manage_billing:copilot, read:enterprise, read:org作用域。 -
如果遇到了 PAT 权限问题,在组织的 Settings-Personal access tokens 中 Allow access via fine-grained personal access tokens。
-
请替换
<YOUR_GITHUB_PAT>为实际值。
-
-
ORGANIZATION_SLUGS:希望被监控的所有Organzation的Slug,可以是一个,也可以是以,(英文符号)分割的多个。如果你使用的是 Copilot Standalone,那么此处请使用你的 Standalone Slug,并且以standalone:作为前缀,例如standalone:YOUR_STANDALONE_SLUG。请替换<YOUR_ORGANIZATION_SLUGS>为实际值。例如,如下类型的值都是支持的: -
myOrg1 -
myOrg1,myOrg2 -
standalone:myStandaloneSlug -
myOrg1,standalone:myStandaloneSlug -
LOG_PATH:日志存储位置,不建议修改。如果修改需要同步修改-v数据卷映射。 -
EXECUTION_INTERVAL:更新间隔,默认为每1小时更新一次程序。
docker run -itd \
--net=host \
--restart=always \
--name cpuad \
-e GITHUB_PAT="<YOUR_GITHUB_PAT>" \
-e ORGANIZATION_SLUGS="<YOUR_ORGANIZATION_SLUGS>" \
-e LOG_PATH="logs" \
-e EXECUTION_INTERVAL=1 \
-e ELASTICSEARCH_URL="http://localhost:9200" \
-v /srv/cpuad-updater-logs:/app/logs \
satomic/cpuad-updater
选项2:源码运行
- 确认当前在正确的路径中
cd /srv/copilot-usage-advanced-dashboard
- 安装依赖
python3 -m pip install -r requirements.txt
- 设置环境变量。如果你使用的是 Copilot Standalone,那么此处请使用你的 Standalone Slug,并且以
standalone:作为前缀,例如standalone:YOUR_STANDALONE_SLUG。
export GITHUB_PAT="<YOUR_GITHUB_PAT>"
export ORGANIZATION_SLUGS="<YOUR_ORGANIZATION_SLUGS>"
- 执行
python3 main.py
- 输出日志
2024-12-17 05:32:22,292 - [INFO] - Data saved to logs/2024-12-17/nekoaru_level3-team1_copilot_usage_2024-12-17.json
2024-12-17 05:32:22,292 - [INFO] - Fetched Copilot usage for team: level3-team1
2024-12-17 05:32:22,293 - [INFO] - Data saved to logs/2024-12-17/nekoaru_all_teams_copilot_usage_2024-12-17.json
2024-12-17 05:32:22,293 - [INFO] - Processing Copilot usage data for organization: nekoaru
2024-12-17 05:32:22,293 - [INFO] - Processing Copilot usage data for team: level1-team1
2024-12-17 05:32:22,293 - [WARNING] - No Copilot usage data found for team: level1-team1
2024-12-17 05:32:22,293 - [INFO] - Processing Copilot usage data for team: level2-team1
2024-12-17 05:32:22,293 - [WARNING] - No Copilot usage data found for team: level2-team1
2024-12-17 05:32:22,293 - [INFO] - Processing Copilot usage data for team: level2-team2
2024-12-17 05:32:22,293 - [WARNING] - No Copilot usage data found for team: level2-team2
2024-12-17 05:32:22,293 - [INFO] - Processing Copilot usage data for team: level3-team1
2024-12-17 05:32:22,293 - [WARNING] - No Copilot usage data found for team: level3-team1
2024-12-17 05:32:22,293 - [INFO] - Sleeping for 6 hours before next execution...
2024-12-17 05:32:22,293 - [INFO] - Heartbeat: still running...
恭喜完成🎉
当前 VM 中的应用运行状态
此时此刻,在 VM 中,你应该能看到3个容器处于运行中(如果你都是基于 docker 从0开始部署的话),如下:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1edffd12a522 satomic/cpuad-updater:20241221 "python3 main.py" 23 hours ago Up 10 hours cpuad
b19e467d48f1 grafana/grafana:11.4.0 "/run.sh" 25 hours ago Up 10 hours grafana
ee35b2a340f1 docker.elastic.co/elasticsearch/elasticsearch:8.17.0 "/bin/tini -- /usr/l…" 3 days ago Up 10 hours 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9300/tcp es
查看 Dashboard
此时,回到 Grafana 页面,刷新,此时,应该可以看到数据了。
或者

acceptances_count
相关文章:
技术速递|Copilot Usage Advanced Dashboard 教程
作者:Xuefeng Yin 排版:Alan Wang Copilot Usage Advanced Dashboard 是为了充分利用 GitHub Copilot API 中的几乎所有数据,用到的 API 有: List teams of an onganization Get a summary of Copilot metrics for a team Get C…...
【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…...
Shell学习(1/6) 教程-变量
一、教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Shell…...
《Qt窗口动画实战:Qt实现呼吸灯效果》
Qt窗口动画实战:Qt实现呼吸灯效果 在嵌入式设备或桌面应用中,呼吸灯效果是一种常见且优雅的UI动画,常用于指示系统状态或吸引用户注意。本文将介绍如何使用Qt动画框架实现平滑的呼吸灯效果。 一、实现原理 利用Qt自带的动画框架来实现&…...
RabbitMQ系列(六)基本概念之Routing Key
在 RabbitMQ 中,Routing Key(路由键) 是用于将消息从交换机(Exchange)路由到指定队列(Queue)的关键参数。其核心作用是通过特定规则匹配绑定关系,确保消息被正确分发。以下是其核心机…...
Spring Boot 集成 Kafka
在现代软件开发中,分布式系统和微服务架构越来越受到关注。为了实现系统之间的异步通信和解耦,消息队列成为了一种重要的技术手段。Kafka 作为一种高性能、分布式的消息队列系统,被广泛应用于各种场景。而 Spring Boot 作为一种流行的 Java 开…...
CentOS中shell脚本对多台机器执行下载安装
1.建立免密ssh连接 详情见这篇: CentOS建立ssh免密连接(含流程剖析)-CSDN博客 2.脚本编写 我这里只是简单写了个demo进行演示,如果服务器很多可以先暂存成文件再逐行读取host进行连接并执行命令 用node1去ssh连接node2和node…...
浅析eBPF
目录 一、eBPF 原理 二、eBPF 已可投入使用的场景 三、eBPF 与 Jaeger/Zipkin 的区别及先进性 四、使用 eBPF 的开源软件 五、开源软件的局限性或待实现功能 猫哥说 一、eBPF 原理 eBPF (extended Berkeley Packet Filter) 是一种内核技术,允许用户在内核空间…...
HTML 基础 (快速入门)详细步骤和示例
目录 创建基本的 HTML 文件 添加内容到页面 页面布局与链接 HTML(超文本标记语言)是构建网页的基础技术,以下是 HTML 基础的详细步骤和示例: 创建基本的 HTML 文件 步骤一:新建文件 在本地计算机上选择一个合适的…...
力扣-动态规划-139 单词拆分
思路 dp数组定义:用wordDict数组可以完成不超过j的字符串的可能为dp[j]递推公式: tmp s.substr(j - wordDict[i].size(), wordDict[i].size()); dp[j] (dp[j - wordDict[i].size()] && wordDict[i] tmp) || dp[j]; dp数组初始化:…...
建筑能耗监测系统数据采集装置 物联网网关功能参数介绍
安科瑞刘鸿鹏 摘要 随着物联网(IoT)技术的迅猛发展,现代物联网系统的规模和复杂度不断增加,各种智能设备和传感器的广泛应用为数据采集和分析提供了丰富的信息源。然而,面对不同协议、标准和通信方式的设备ÿ…...
vue深拷贝:1、使用JSON.parse()和JSON.stringify();2、使用Lodash库;3、使用深拷贝函数(采用递归的方式)
文章目录 引言三种方法的优缺点在Vue中,实现数组的深拷贝I JSON.stringify和 JSON.parse的小技巧深拷贝步骤缺点:案例1:向后端请求路由数据案例2: 表单数据处理时复制用户输入的数据II 使用Lodash库步骤适用于复杂数据结构和需要处理循环引用的场景III 自定义的深拷贝函数(…...
ES 删除index 的curl
以下是使用 `curl` 命令删除 Elasticsearch 索引的格式和示例: ### 基本格式 ```bash curl -XDELETE "http://<node-ip|hostname>:9200/<index-name>" ``` - `<node-ip|hostname>`:Elasticsearch 节点的 IP 地址或主机名。 - `<index-name&g…...
游戏引擎学习第124天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天,我们已经介绍了多线程的一些基础知识,包括如何创建工作队列以及如何在线程中处理任务。今天,重点是解决那些我们之前没有注意到…...
第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子
编程实现: 小猫照镜子。(背景非源素材) 具体要求: 1). 运行程序,角色、背景如图所示; 完整题目可点击下方链接查看,支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…...
使用vscode导出Markdown的PDF无法显示数学公式的问题
我的硬件环境是M2的MacBook air,在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件,数学公式都是显示的源代码。 我看了许多教程,给的是这个方法:在md文件对应的html文件中加上以下代码:…...
前端系列之:Blob
Blob 与二进制 什么是二进制? 二进制是计算机数据的基本表示形式,只使用 0 和 1 两个数字来表示数值。任何类型的数据(无论是文本、图片、音频文件等)都可以通过二进制表示。 什么是 Blob? 全称 Binary Large Object&a…...
【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)
基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…...
Apache Flink:实时数据流处理的终极武器
Apache Flink:实时数据流处理的终极武器 在当今这个数据驱动的世界,实时数据流处理已经成为各行各业的核心需求。从金融风控到电商推荐,从物联网监控到网络安全,毫秒级的响应能力决定了一家公司在市场中的竞争力。而在众多流式计…...
点云处理入门--PointNetPointNet++论文与代码详解
基础知识 点云数据: 点云是一种通过三维扫描设备或计算机图形学技术获取的三维空间数据,通常由一系列点组成,每个点包含其在三维空间中的坐标(如 x,y,z),有时还可能包含颜色、强度等附加信息。 介绍几种常…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
