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

在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 数据库)

本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方文档中声明 7.9 版本之后就不再支持使用 MySQL 数据库。所以此次搭建使用的数据库是 PostgreSQL 11.4 版本。

一、部署 PostgreSQL 服务

1. 创建命名空间

将 PostgreSQL 和 SonarQube 放在同一个命名空间 ns-sonar 中,创建命名空间的 yaml 文件如下:

---
apiVersion: v1
kind: Namespace
metadata:name: ns-sonarlabels:name: ns-sonar

2. 创建 PostgreSQL 使用的 PV 和 PVC

为了实现 PostgreSQL 数据的持久化存储,需要将数据存放在本地存储中。首先在宿主机的 /opt/ops_ceph_data 目录下创建如下目录:

mkdir -p /opt/ops_ceph_data/sonarqube/{PostgreSQL_data,sonar}

在我的机器环境中,/opt/ops_ceph_data 是挂载的 cephfs 文件系统,所以在任意节点上创建目录后,其他节点上都会存在。这也保证了 PostgreSQL 容器可以在任意节点上进行漂移。

同时由于我是将 cephfs 直接挂载到物理机上,所以在下面创建 pv 的时候,指定的存储类型是 local。

创建 PV 和 PVC 的 yaml 文件内容如下:

---
apiVersion: v1
kind: PersistentVolume
metadata:name: postgresql-pvnamespace: ns-sonar
spec:accessModes:- ReadWriteOncecapacity:storage: 5Gilocal:path: /opt/ops_ceph_data/sonarqube/PostgreSQL_datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: sonar-nodeoperator: Invalues:- "true"persistentVolumeReclaimPolicy: Retain
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: postgresql-pvcnamespace: ns-sonar
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi

3. 配置 labels

由于上面配置的 PV 存储类型是 local,所以需要在允许运行 PostgreSQL 容器的 Node 上设置 labels,labels 为 sonar-node=true,这里我是将所有的 Node 节点上都添加了这个 label,命令如下:

for i in 1 2 3 4 5
dokubectl label nodes k8s-node${i} sonar-node=true
done

注意,PV 中配置的 matchExpressions 一定要与 labels 一致,不然会无法匹配。 

4. 创建 Service

接下来需要配置用于映射 PostgreSQL 容器端口的 Service 文件,这里我使用 NodePort 类型,yaml 文件内容如下:

---
apiVersion: v1
kind: Service
metadata:name: postgresql-servicenamespace: ns-sonarlabels:app: postgresql
spec:type: NodePortports:- port: 5432targetPort: 5432nodePort: 30543protocol: TCPselector:app: postgresql

5. 创建 PostgreSQL 的 Pod

因为我搭建的环境中,PostgreSQL 使用的单点模式,所以直接使用 Deployment 类型来创建 Pod,yaml 文件内容如下:

---
apiVersion: apps/v1
kind: Deployment
metadata:name: postgresqlnamespace: ns-sonarlabels:app: postgresql
spec:replicas: 1selector:matchLabels:app: postgresqltemplate:metadata:labels:app: postgresqlspec:containers:- name: postgresql-for-sonarimage: postgres:11.4imagePullPolicy: "IfNotPresent"ports:- containerPort: 5432env:                                        # 这里设置 PostgreSQL 启动时候所需要的环境变量- name: POSTGRES_DB                       # 定义要创建的数据库名称value: sonarDB- name: POSTGRES_USER                     # 定义要创建访问数据库的用户value: sonarUser- name: POSTGRES_PASSWORD                 # 定义数据库的密码value: sonar_adminresources:limits:cpu: 1000mmemory: 2048Mirequests:cpu: 500mmemory: 1024MivolumeMounts:- mountPath: /var/lib/postgresql/data     # 这个目录是 PostgreSQL 容器内默认的数据存储路径name: postgredbvolumes:- name: postgredbpersistentVolumeClaim:claimName: postgresql-pvc               # 将上面创建的 PVC 挂载到 PostgreSQL 的数据目录下

在环境变量设置的部分,我一开始使用的是引用 Secret 的方式,但是在容器启动后没有正确创建用户和密码。所以还是使用了直接指定 value 的方式。具体为什么 Secret 没有生效现在还不清楚,后续查出原因后再补充。

6. 验证数据库连接

使用容器搭建 PostgreSQL 服务,默认会在容器内监听 0.0.0.0 地址,所以像传统方式部署那样去手动修改监听地址。

在其他机器中验证连接 PostgreSQL,IP 地址为任意 Node 节点 IP。用户名密码和数据库名称参考上面的 yaml 文件。测试是否可以正常连接即可。

二、部署 SonarQube 服务

1. 创建 SonarQube 使用的 PV 和 PVC

用于 SonarQube 的持久化存储目录已经在前面创建好了,下面直接编写 yaml 文件,内容如下:

---
apiVersion: v1
kind: PersistentVolume
metadata:name: sonar-pvnamespace: ns-sonar
spec:accessModes:- ReadWriteOncecapacity:storage: 20Gilocal:path: /opt/ops_ceph_data/sonarqube/sonar_datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: sonar-nodeoperator: Invalues:- "true"persistentVolumeReclaimPolicy: Retain
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: sonar-pvcnamespace: ns-sonar
spec:accessModes:- ReadWriteOnceresources:requests:storage: 20Gi

需要注意的是,PV 中匹配的 labels 已经在前面创建好了,所以此处不需要重复设置 labels。

另外 SonarQube 容器运行的时候,不是以 root 用户运行的,所以需要确保挂载的目录要允许其他用户读写,否则容器启动会失败。

chmod -R 777 /opt/ops_ceph_data/sonarqube/sonar_data

2. 创建 Service

使用 NodePort 类型将 SonarQube 端口映射出来,yaml 文件内容如下:

---
apiVersion: v1
kind: Service
metadata:name: sonarqube-servicelabels:app: sonarqube-service
spec:type: NodePortports:- port: 9000targetPort: 9000nodePort: 30900protocol: TCPselector:app: sonarqube

3. 创建 SonarQube 的 Pod

SonarQube 的 Pod 使用 Deployment 来创建,yaml 文件内容如下:

---
apiVersion: apps/v1
kind: Deployment
metadata:name: sonarqubenamespace: ns-sonarlabels:app: sonarqube
spec:replicas: 1selector:matchLabels:app: sonarqubetemplate:metadata:labels:app: sonarqubespec:initContainers:                                           # 设置初始化镜像,用于执行 system 命令,此处的配置在下文会有说明- name: init-sysctlimage: busyboximagePullPolicy: IfNotPresentcommand: ["sysctl", "-w", "vm.max_map_count=262144"]    # 设置vm.max_map_count这个值调整内存权限,否则启动可能报错securityContext:privileged: true                                      # 设置可以以 root 权限执行命令containers:- name: sonarqubeimage: sonarqube:7.9.4-communityports:- containerPort: 9000env:- name: SONARQUBE_JDBC_USERNAME                         # 设置 SonarQube 连接数据库使用的用户名value: sonarUser- name: SONARQUBE_JDBC_PASSWORD                         # 设置 SonarQube 连接数据库使用的密码value: sonar_admin- name: SONARQUBE_JDBC_URL                              # 设置 SonarQube 连接数据库使用的地址value: "jdbc:postgresql://10.16.12.206:30543/sonarDB" # 这里可以指定 Node 节点的 IP 地址和 PostgreSQL 映射出来的端口livenessProbe:                     # 设置容器存活检查策略,如果失败将杀死容器,然后根据 Pod 的 restartPolicy 来决定是否进行重启操作httpGet:path: /sessions/newport: 9000initialDelaySeconds: 60          # 设置在容器启动多长时间后开始探针检测,此处设置为 60speriodSeconds: 30                # 设置探针检查的频率,此处设置为每 30s 检查一次readinessProbe:                    # 设置容器的就绪检查策略,查看容器是否准备好接受 HTTP 请求httpGet:path: /sessions/newport: 9000initialDelaySeconds: 60          # 设置在容器启动多长时间后开始探针检测,此处设置为 60speriodSeconds: 30                # 设置探针检查的频率,此处设置为每 30s 检查一次failureThreshold: 6              # 在检查失败的情况下,重复检查的次数,此处设置为 6resources:limits:cpu: 2000mmemory: 2048Mirequests:cpu: 1000mmemory: 1024MivolumeMounts:- mountPath: /opt/sonarqube/confname: sonarqubesubPath: conf                    # 使用 subPath 在宿主机的挂载目录上设置一个子目录,用于存放上面指定目录的数据- mountPath: /opt/sonarqube/dataname: sonarqubesubPath: data- mountPath: /opt/sonarqube/extensionsname: sonarqubesubPath: extensionsvolumes:- name: sonarqubepersistentVolumeClaim:claimName: sonar-pvc    #绑定上面创建的 PVC

对于上面的 yaml 文件有些配置需要进行说明。

3.1 initContainers
initContainers 就是初始化容器,也就是在主容器启动之前,首先启动初始化容器。如果有多个初始化容器,会按照定义的顺序依次启动。只有在初始化容器启动完成后,主容器才会启动。

使用初始化容器有如下几个作用:

为主容器初始化环境:例如本文中的例子,由于 SonarQube 在启动服务的时候,要确保已经设置了 vm.max_map_count 这个值,但是由于 SonarQube 镜像本身不能执行这个命令,所以可以使用一个初始化容器来执行该命令(同一个Pod下的容器是共享文件系统的),并且保证该命令已经执行完成的情况下,主容器才会启动。或者另一种情况是主容器启动的时候需要安装一些依赖包,为了避免安装依赖包时间过长,影响健康检查策略,可以选择将这个安装的任务交给初始化容器去执行。
等待其他服务 Ready:例如一个 web 服务的 Pod 启动时,需要确保另一个数据库服务的 Pod 已经启动了并且可以接受连接(不然 web 服务可能会报错或者启动失败),所以可以在 web 服务的 Pod 中部署一个初始化容器,去检查数据库服务是否已经准备好,直到数据库可以开始连接,初始化容器才会推出。
初始化集群配置:例如可以使用初始化容器检测当前业务集群中已经存在的节点信息,并为主容器准备好集群的配置信息,这样集群启动时就可以根据这个配置信息加入到集群中。
需要注意的是,initContainers 是以 sideCar 模式运行在 Pod 中的。

3.2 健康检查策略
关于健康检查策略,上面的 yaml 文件中已经给出了一些注释。其他的配置项可以参考官网文档:配置存活探针和就绪探针

3.3 subPath 配置
上面的 yaml 文件中在存储挂载的部分使用了 subPath 配置,这是因为 SonarQube 中一共有三个需要挂载的目录:

/opt/sonarqube/conf
/opt/sonarqube/data
/opt/sonarqube/extensions

而宿主机上的存储目录只提供了一个 /opt/ops_ceph_data/sonarqube/sonar_data,默认情况下,以上三个目录的数据都会存储在宿主机这一个目录下,这样就会造成数据混乱,没有办法区分某个数据文件或目录具体是哪个父目录下的。可以使用 subPath 配置解决这个问题,这个配置的功能就是在宿主机的挂载目录下创建一个子目录来存放对应目录的数据。

例如上面的 subPath 配置项分别创建了三个子目录:conf、data、extensions,那么在宿主机的挂载目录下显示的就是如下形式

 这三个子目录的名称可以随意指定,上面的 yaml 文件中 subPath 指定的子目录名称与容器中的目录名称一致是为了更方便的区分。如果将 subPath 的配置分别改为:sonar_conf、sonar_data、sonar_extensions,那么在宿主机挂载目录下显示的就会是如下形式:

4. 访问 SonarQube 并安装插件

SonarQube 部署完成后,可以通过任意 Node 节点的 IP 地址加上映射的端口访问。

默认的登录用户名和密码均为 admin。登录完成后,首先点击 Administration --> Marketplace ,在 Plugin 部分查找 chinese 插件和 Codehawk Java 进行安装。chinese 插件用于汉化界面,安装完成后需要重启服务(在页面上方会有提示)。

#mkdir -p /data/sonarqube/{PostgreSQL_data,sonar_data}
#chmod -R 777 /data/sonarqube/sonar_data---
---
apiVersion: v1
kind: Service
metadata:name: postgres-sonarlabels:app: postgres-sonar
spec:clusterIP: Noneports:- port: 5432protocol: TCPtargetPort: 5432selector:app: postgres-sonar---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: postgres-sonarlabels:app: postgres-sonar
spec:replicas: 1selector:matchLabels:app: postgres-sonartemplate:metadata:labels:app: postgres-sonarspec:containers:- name: postgres-sonarimage: postgres:11.4imagePullPolicy: "IfNotPresent"ports:- containerPort: 5432env:                                        # 这里设置 PostgreSQL 启动时候所需要的环境变量- name: POSTGRES_DB                       # 定义要创建的数据库名称value: sonarDB- name: POSTGRES_USER                     # 定义要创建访问数据库的用户value: sonarUser- name: POSTGRES_PASSWORD                 # 定义数据库的密码value: sonar_adminresources:limits:cpu: 1000mmemory: 2048Mirequests:cpu: 500mmemory: 1024MivolumeMounts:- mountPath: /var/lib/postgresql/data     # 这个目录是 PostgreSQL 容器内默认的数据存储路径name: postgredbvolumes:- name: postgredbhostPath:type: DirectoryOrCreate path: /data/sonarqube/PostgreSQL_datanodeName: gem-yxyw-t-c03
---
---
apiVersion: v1
kind: Service
metadata:name: sonarqube-servicelabels:app: sonarqube-service
spec:type: NodePortports:- port: 9000targetPort: 9000nodePort: 30900protocol: TCPselector:app: sonarqube
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: sonarqubelabels:app: sonarqube
spec:replicas: 1selector:matchLabels:app: sonarqubetemplate:metadata:labels:app: sonarqubespec:initContainers:                                           # 设置初始化镜像,用于执行 system 命令,此处的配置在下文会有说明- name: init-sysctlimage: busyboximagePullPolicy: IfNotPresentcommand: ["sysctl", "-w", "vm.max_map_count=262144"]    # 设置vm.max_map_count这个值调整内存权限,否则启动可能报错securityContext:privileged: true                                      # 设置可以以 root 权限执行命令containers:- name: sonarqubeimage: sonarqube:7.9.4-communityports:- containerPort: 9000env:- name: SONARQUBE_JDBC_USERNAME                         # 设置 SonarQube 连接数据库使用的用户名value: sonarUser- name: SONARQUBE_JDBC_PASSWORD                         # 设置 SonarQube 连接数据库使用的密码value: sonar_admin- name: SONARQUBE_JDBC_URL                              # 设置 SonarQube 连接数据库使用的地址value: "jdbc:postgresql://postgres-sonar:5432/sonarDB" # 这里可以指定 Node 节点的 IP 地址和 PostgreSQL 映射出来的端口livenessProbe:                     # 设置容器存活检查策略,如果失败将杀死容器,然后根据 Pod 的 restartPolicy 来决定是否进行重启操作httpGet:path: /sessions/newport: 9000initialDelaySeconds: 60          # 设置在容器启动多长时间后开始探针检测,此处设置为 60speriodSeconds: 30                # 设置探针检查的频率,此处设置为每 30s 检查一次readinessProbe:                    # 设置容器的就绪检查策略,查看容器是否准备好接受 HTTP 请求httpGet:path: /sessions/newport: 9000initialDelaySeconds: 60          # 设置在容器启动多长时间后开始探针检测,此处设置为 60speriodSeconds: 30                # 设置探针检查的频率,此处设置为每 30s 检查一次failureThreshold: 6              # 在检查失败的情况下,重复检查的次数,此处设置为 6resources:limits:cpu: 2000mmemory: 2048Mirequests:cpu: 1000mmemory: 1024MivolumeMounts:- mountPath: /opt/sonarqube/confname: sonarqubesubPath: conf                    # 使用 subPath 在宿主机的挂载目录上设置一个子目录,用于存放上面指定目录的数据- mountPath: /opt/sonarqube/dataname: sonarqubesubPath: data- mountPath: /opt/sonarqube/extensionsname: sonarqubesubPath: extensionsvolumes:- name: sonarqubehostPath:type: DirectoryOrCreate path: /data/sonarqube/sonar_datanodeName: gem-yxyw-t-c03

相关文章:

在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 数据库)

本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方文档中声明 7.9 版本之后就不再支持使用 MySQL 数据库。所以此次搭建使用的数据库是 PostgreSQL 11.4 版本。 一、部署 PostgreSQL 服务 1. 创建命名空间 将 PostgreSQL 和 SonarQube 放在同一个命名空间…...

从getBean()分析BeanFactory和ApplicationContext

本文说了哪些问题: BeanFactory 是啥ApplicationContext 是啥什么时候去实例化一个 bean, BeanFactory 和 ApplicationContext 实例化 bean 都是在什么时候 一个 Bean 什么时候被初始化 任何一个 Bean, 都是在 getBean () 的时候被初始化的.BeanFactory 需要字节手动调用 getb…...

详解Redis的主从同步原理

前言 Redis为了保证服务高可用,其中一种实现就是主从模式,即一个Redis服务端作为主节点,若干个Redis服务端作为主节点的从节点,从而实现即使某个服务端不可用时,也不会影响Redis服务的正常使用。本篇文章将对主从模式…...

前端项目上线后,浏览器缓存未刷新问题

文章目录问题背景一、解决办法二、实现原理关于缓存强缓存协商缓存刷新页面对浏览器的影响总结问题背景 前端页面开发测试完,要进行上线,某些页面上传更新到服务器之后,浏览器并没有更新,渲染的还是老页面。这是因为浏览器读了缓存…...

Vulnhub系列:Raven 1

该篇为Vulnhub系列靶机渗透,本次靶机存在4个flag。下面开始我们今天的渗透之旅。Raven靶机有很多种思路,我将对其进行一一整理。首先进行信息收集,利用arp-scan和nmap,进行靶机的ip及端口扫描发现了22、80、111端口。下面访问80端…...

MybatisPlus------多数据源环境(十一)

MybatisPlus------多数据源环境&#xff08;十一&#xff09; 生产环境中常常会存在多个数据源。 比如读写分离、一主多从、混合模式等等。 首先再pom文件中需要引入依赖&#xff1a; 多数据源所需要使用到的依赖 <!-- 多数据源所需要使用到的依赖--><depend…...

Tomcat+IDEA+Servlet能显示页面但提交form表单出现404问题

问题&#xff1a; 当我们使用tomcat启动&#xff0c;然后输入对应的url路径时候&#xff0c;能出现该html的页面&#xff0c;但提交表单后&#xff0c;却出现了404的问题&#xff0c;这时候我就很疑惑了....然后开始慢慢分析。 思路&#xff1a; 首先我们得知道404状态码是什…...

【蓝桥杯集训16】多源汇求最短路——Floyd算法(2 / 2)

目录 Floyd求最短路模板 4074. 铁路与公路 - floyd 脑筋急转弯 Floyd求最短路模板 活动 - AcWing 题目&#xff1a; 给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 再给定 k 个询问&#xff0c;每个询问包含两个整数 x 和…...

simulink stateflow 状态机

系列文章目录 文章目录系列文章目录前言一、基操二、stateflow 数据三、chart动作四、chart的执行五、flow chart / junction六、状态机中的函数 Stateflow Functions七、chart层次结构八、案例——吸尘器机器人的驱动模式前言 一、基操 在tooltrip中选择DEBUG&#xff0c;通过…...

水库大坝安全监测的主要坝体类型介绍

水电站和水库大坝安全的分类中有重力坝、土石坝等不同的大坝形式。就在这里详细水库大坝安全监测按照建造形式&#xff0c;基本上可以分为三类&#xff1a;重力坝、土石坝和拱坝。 &#xff08;1&#xff09;重力坝 重力坝&#xff0c;顾名思义就是利用自身重力来维持坝体稳定…...

物理层概述(二)重点

目录前言编码与调制&#xff08;1&#xff09;基带信号与宽带信号编码与调制编码与调制&#xff08;2&#xff09;数字数据编码为数字信号非归零编码【NRZ】曼斯特编码差分曼彻斯特编码数字数据调制为模拟信号模拟数据如何编码为数字信号模拟数据调制为模拟信号物理层传输介质导…...

成都待慕电商:抖音极速版商品卡免佣扶持政策规则

新规&#xff0c;抖音极速版推出商品卡免佣扶持政策规则&#xff0c;本次抖音规则如何规定&#xff1f;具体往下看&#xff1a;一、政策简介1.1政策介绍为了更好地满足用户消费需求&#xff0c;丰富商家经营模式&#xff0c;降低商家经营成本&#xff0c;现平台针对商品卡场景推…...

青岛双软认定标准

软件企业的认定是有一定的标准的&#xff0c;需要满足以下这些条件&#xff1a;1、在我国境内依法设立了企业法人的企业&#xff1b;2、以计算机软件开发生产、系统集成、应用服务和其他相应技术服务为经营业务和主要经营收入&#xff1b;3、具有一种以上由本企业开发或由本企业…...

【00后卷王秘籍】python自动化测试—Python自动化框架及工具

1 、概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本系列选择的测试语言是 python 脚本语言。由于其…...

MySQL数据库基本操作

DDL 1、DDL解释 DDL(Data Definition Language)&#xff0c;数据定义语言&#xff0c;该语言部分包括以下内容&#xff1a; 对数据库的常用操作 对表结构的常用操作 修改表结构1、对数据库的常用操作 2、对表结构的常用操作-创建表 创建表格式 3、对表结构的常用操作-创建表…...

2023年最新的站内SEO指南:如何通过关键词优化提高网站排名

SEO或搜索引擎优化是指通过改善网站的内部和外部元素&#xff0c;以获得更好的自然搜索引擎排名和更多的网站流量。 链接建设和外链是SEO的重要组成部分&#xff0c;因为它们可以提高网站的权威性和可信度&#xff0c;从而使其在搜索引擎中排名更高。 在此指南中&#xff0c;…...

【Java】Java环开发环境安装

Java环开发环境安装 简介&#xff1a; 如果要从事Java编程&#xff0c;则需要安装JDK&#xff0c;如果仅仅是运行一款Java程序则JRE就满足要求。 Java的安装包分为两类 一类是JRE其就是一个独立的Java运行环境&#xff1b; 一类是JDK其是Java的开发环境&#xff0c;不过在JDK…...

[蓝桥杯] 枚举、模拟和排列问题

文章目录 一、连号区间数 1、1 题目描述 1、2 题解关键思路与解答 二、递增三元组 2、1 题目描述 2、2 题解关键思路与解答 三、错误票据 3、1 题目描述 3、2 题解关键思路与解答 四、回文日期 4、1 题目描述 4、2 题解关键思路与解答 五、归并排序 标题&#xff1a;蓝桥杯——…...

C++基础了解-02-C++ 数据类型

C 数据类型 一、C 数据类型 使用编程语言进行编程时&#xff0c;需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&#xff0c;当创建一个变量时&#xff0c;就会在内存中保留一些空间。 可能需要存储各种数据类型&#xff08;比如字符型、宽…...

关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、abort()R6010等故障模块排查及解决方法

一、常见故障介绍  最近在开发相机项目&#xff08;项目细节由于公司保密就不介绍了&#xff09;&#xff0c;程序运行5个来月以来首次出现msvcr100.dll故障等问题&#xff0c;于是乎开始了分析之路&#xff0c;按照度娘上的一顿操作&#xff0c;期间也是出现了各种不一样的问…...

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图)

零代码玩转Arduino巡线小车&#xff1a;KRobot图形化编程全攻略 第一次接触Arduino时&#xff0c;看到满屏的C代码是不是头皮发麻&#xff1f;作为教育工作者或创客爱好者&#xff0c;你可能更希望把时间花在创意实现上&#xff0c;而不是纠结于语法错误。现在&#xff0c;通过…...

多维尺度变换(MDS)实战指南:从原理到Python实现

1. 多维尺度变换&#xff08;MDS&#xff09;是什么&#xff1f; 多维尺度变换&#xff08;Multidimensional Scaling&#xff0c;简称MDS&#xff09;是一种经典的降维算法&#xff0c;它的核心思想是通过保持数据点之间的距离关系&#xff0c;将高维数据映射到低维空间。想象…...

CosyVoice CPU部署实战:如何优化AI语音模型的推理速度

最近在做一个智能客服项目&#xff0c;需要把语音合成模型部署到一些只有CPU的服务器上。一开始直接用PyTorch加载CosyVoice模型&#xff0c;那个推理速度真是让人着急&#xff0c;生成一句话要等好几秒&#xff0c;完全没法满足实时交互的需求。这让我下定决心&#xff0c;必须…...

LrcHelper:网易云音乐双语歌词下载与设备适配完整指南

LrcHelper&#xff1a;网易云音乐双语歌词下载与设备适配完整指南 【免费下载链接】LrcHelper 从网易云音乐下载带翻译的歌词 Walkman 适配 项目地址: https://gitcode.com/gh_mirrors/lr/LrcHelper 你是否经常遇到喜欢的歌曲没有歌词&#xff0c;或者歌词与音乐不同步的…...

STM32CubeMx 软件模拟SPI四种模式

(1)SPI的概念&#xff1a; SPI总线传输一共有&#xff14;种模式&#xff0c;这&#xff14;种模式分别由时钟极性(CPOL)和时钟相位(CPHA)来定义。 CPOL&#xff1a;规定了SCK时钟信号空闲状态的电平 CPHA&#xff1a;规定了数据是在SCK时钟的上升沿还是下降沿被采样 模式0&am…...

OpenClaw+百川2-13B办公自动化:会议纪要生成与邮件发送全流程

OpenClaw百川2-13B办公自动化&#xff1a;会议纪要生成与邮件发送全流程 1. 为什么需要自动化会议纪要处理 上周三的部门例会让我彻底崩溃了——2小时的会议录音&#xff0c;手动整理成纪要花了整整3小时。更糟的是&#xff0c;当我终于把邮件发出去时&#xff0c;发现漏掉了…...

VINS_Fusion轨迹评估实战:如何用evo工具搞定MH_01_easy数据集测试(附完整代码修改指南)

VINS_Fusion轨迹精度评估全流程&#xff1a;从数据准备到evo工具深度解析 1. 环境配置与工具准备 在开始评估VINS_Fusion的轨迹精度之前&#xff0c;我们需要确保开发环境已经正确配置。以下是必要的准备工作&#xff1a; 基础环境要求&#xff1a; Ubuntu 18.04/20.04 LTS&…...

零代码自动化:OpenClaw+GLM-4.7-Flash实现跨平台数据同步

零代码自动化&#xff1a;OpenClawGLM-4.7-Flash实现跨平台数据同步 1. 为什么选择OpenClaw处理跨平台数据同步&#xff1f; 去年我接手了一个棘手的任务&#xff1a;每周需要从某电商平台导出销售数据&#xff0c;清洗后上传到内部数据库。手动操作不仅耗时2-3小时&#xff…...

Ubuntu 20.04安装MATLAB R2023B保姆级避坑指南:从卸载旧版到选对产品,一步一截图

Ubuntu 20.04安装MATLAB R2023B全流程实战&#xff1a;从彻底卸载到精准选配 在科研与工程计算领域&#xff0c;MATLAB始终保持着不可替代的地位。当最新版的R2023B遇上Ubuntu 20.04这个长期支持版本&#xff0c;如何实现完美部署却让不少用户望而却步。不同于Windows下的图形化…...

别再乱用#0延迟了!一个SystemVerilog仿真波形出现X态的踩坑实录

SystemVerilog仿真中的X态陷阱&#xff1a;从#0延迟到事件队列的深度解析 引言&#xff1a;一个令人抓狂的仿真问题 上周五凌晨2点17分&#xff0c;我的显示器上VCS仿真波形中那个刺眼的红色X态信号让我彻底清醒了。这已经是第三次在项目交付前遇到这种诡异的仿真问题——明明R…...