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

TiDB Operator 和 Operator Dashboard

TiDB Operator 和 Operator Dashboard

  • V1
    • TiDB Operator
      • 概念
      • 实现
    • Operator Dashboard
      • 概念
      • 实现
  • V2
    • 思路
    • 实例代码
      • TiDB ARM Operator
      • TiDB ARM Operator Dashboard

V1

为了演示如何编写 TiDB Operator 和 Operator Dashboard,我们将分别介绍它们的概念和实现。

TiDB Operator

TiDB Operator 是一种 Kubernetes Operator,它负责在 Kubernetes 上部署和管理 TiDB 集群。它可以自动化管理 TiDB 集群的生命周期,包括创建、扩容、缩容和升级等操作。

概念

TiDB Operator 的核心概念包括:

  • TiDBCluster:一个 TiDB 集群的抽象,包括 TiDB、TiKV 和 PD 组件。
  • TiDBMonitor:一个 TiDB 集群的监控组件,它可以采集集群的监控数据,并提供可视化的监控界面。
  • TiDBBackup:一个 TiDB 集群的备份组件,它可以将集群数据备份到云存储或本地存储中。

实现

为了实现 TiDB Operator,我们需要完成以下工作:

  1. 编写 CRD(Custom Resource Definition)文件,定义 TiDBCluster、TiDBMonitor 和 TiDBBackup 的资源模型和 API。
  2. 编写 Controller,监听 TiDBCluster、TiDBMonitor 和 TiDBBackup 的事件,并根据事件类型执行相应的操作。
  3. 编写 Operator 的部署文件,将 Controller 部署到 Kubernetes 集群中。

下面是一个简单的 TiDBCluster CRD 的定义:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:name: tidbclusters.pingcap.com
spec:group: pingcap.comversion: v1alpha1scope: Namespacednames:plural: tidbclusterssingular: tidbclusterkind: TiDBClustersubresources:status: {}additionalPrinterColumns:- name: Phasetype: stringdescription: The current phase of the TiDB Cluster.JSONPath: .status.phase

这段代码定义了一个 Kubernetes 自定义资源类型 TiDBCluster。

  • apiVersion: 定义 YAML 文件使用的 Kubernetes API 版本。
  • kind: 定义了 CustomResourceDefinition 对象的类型。
  • metadata: 定义了资源对象的元数据,包括名称和标签等。
  • spec: 定义了资源对象的规范,包括 API 组、版本、作用域和名称等。
  • group: 定义 API 组的名称。
  • version: 定义 API 版本的名称。
  • scope: 定义资源对象的作用域,这里是 Namespaced,表示它是一个命名空间级别的资源。
  • names: 定义了资源对象的名称,包括复数形式、单数形式和类型名称。
  • subresources: 定义了资源对象的子资源,这里只定义了状态子资源。
  • additionalPrinterColumns: 定义了额外的输出列,这里只定义了一个名为 Phase 的列,用于显示 TiDB Cluster 的当前状态。

在 Controller 中,我们需要监听 TiDBCluster 的事件,并根据事件类型执行相应的操作。例如,当 TiDBCluster 被创建时,我们需要创建 TiDB、TiKV 和 PD 组件:

func (r *TiDBClusterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {// 获取 TiDBCluster 对象var tc tidbv1alpha1.TiDBClusterif err := r.Get(ctx, req.NamespacedName, &tc); err != nil {if errors.IsNotFound(err) {// TiDBCluster 被删除,忽略该事件return ctrl.Result{}, nil}// 处理错误return ctrl.Result{}, err}// 判断 TiDBCluster 是否已经被删除if !tc.ObjectMeta.DeletionTimestamp.IsZero() {// TiDBCluster 已经被删除,执行清理操作return r.cleanup(ctx, tc)}// 判断 TiDBCluster 是否已经创建if tc.Status.Phase == "" {// TiDBCluster 还没有创建,创建 TiDB、TiKV 和 PD 组件return r.create(ctx, tc)}// 更新 TiDBCluster 状态return r.updateStatus(ctx, tc)
}

在 create 函数中,我们使用 Helm Chart 创建 TiDB、TiKV 和 PD 组件:

func (r *TiDBClusterReconciler) create(ctx context.Context, tc tidbv1alpha1.TiDBCluster) (ctrl.Result, error) {// 安装 TiDB、TiKV 和 PD 组件if err := r.installComponents(ctx, tc); err != nil {return ctrl.Result{}, err}// 更新 TiDBCluster 状态tc.Status.Phase = "Running"if err := r.Status().Update(ctx, &tc); err != nil {return ctrl.Result{}, err}return ctrl.Result{}, nil
}func (r *TiDBClusterReconciler) installComponents(ctx context.Context, tc tidbv1alpha1.TiDBCluster) error {// 使用 Helm Chart 安装 TiDB、TiKV 和 PD 组件chartPath := filepath.Join("charts", "tidb-operator")chart, err := loader.Load(chartPath)if err != nil {return err}vals := map[string]interface{}{"clusterName": tc.Name,"pd": map[string]interface{}{"replicas": tc.Spec.PD.Replicas,},"tikv": map[string]interface{}{"replicas": tc.Spec.TiKV.Replicas,},"tidb": map[string]interface{}{"replicas": tc.Spec.TiDB.Replicas,},}installer := action.NewInstall(&action.Configuration{})_, err = installer.Run(chart, vals)if err != nil {return err}return nil
}

Operator Dashboard

Operator Dashboard 是 TiDB Operator 的可视化管理界面,它可以帮助用户更方便地管理 TiDB 集群。它提供了 TiDB 集群的状态监控、配置管理、备份恢复等功能。

概念

Operator Dashboard 的核心概念包括:

  • TiDBCluster 状态监控:展示 TiDB 集群的运行状态、监控数据等信息。
  • TiDBCluster 配置管理:允许用户修改 TiDB 集群的配置,包括 TiDB、TiKV 和 PD 的配置。
  • TiDBCluster 备份恢复:允许用户备份和恢复 TiDB 集群数据。

实现

为了实现 Operator Dashboard,我们需要完成以下工作:

  1. 编写前端代码,实现 TiDBCluster 状态监控、配置管理和备份恢复等功能。
  2. 编写后端代码,实现与 TiDB Operator 的交互,并提供 REST API。
  3. 部署前端和后端代码,构建 Operator Dashboard。

下面是一个简单的 TiDBCluster 状态监控的前端代码:

<!DOCTYPE html>
<html>
<head><title>TiDBCluster Dashboard</title><script src="https://cdn.jsdelivr.net/npm/echarts@5.2.1/dist/echarts.min.js"></script>
</head>
<body><div id="chart" style="width: 600px; height: 400px;"></div><script>var chart = echarts.init(document.getElementById('chart'));chart.setOption({title: {text: 'TiDBCluster Monitoring',},tooltip: {trigger: 'axis',},legend: {data: ['TiDB', 'TiKV', 'PD'],},xAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],},yAxis: {type: 'value',},series: [{name: 'TiDB',type: 'line',data: [820, 932, 901, 934, 1290, 1330, 1320],},{name: 'TiKV',type: 'line',data: [820, 932, 901, 934, 1290, 1330, 1320],},{name: 'PD',type: 'line',data: [820, 932, 901, 934, 1290, 1330, 1320],},],});</script>
</body>
</html>

在后端代码中,我们需要提供 REST API,该 API 可以获取 TiDBCluster 的状态数据:

func getTiDBClusterStatus(w http.ResponseWriter, r *http.Request) {// 获取 TiDBCluster 对象var tc tidbv1alpha1.TiDBClusterif err := r.Get(ctx, req.NamespacedName, &tc); err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 返回 TiDBCluster 状态数据data := map[string]interface{}{"phase": tc.Status.Phase,"tikv": map[string]interface{}{"replicas":    tc.Status.TiKV.Replicas,"available":   tc.Status.TiKV.AvailableReplicas,"unavailable": tc.Status.TiKV.UnavailableReplicas,},"pd": map[string]interface{}{"replicas":    tc.Status.PD.Replicas,"available":   tc.Status.PD.AvailableReplicas,"unavailable": tc.Status.PD.UnavailableReplicas,},"tidb": map[string]interface{}{"replicas":    tc.Status.TiDB.Replicas,"available":   tc.Status.TiDB.AvailableReplicas,"unavailable": tc.Status.TiDB.UnavailableReplicas,},}// 返回数据w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(data)
}

最后,我们需要将前端和后端代码一起打包,并部署到 Kubernetes 集群中:

apiVersion: apps/v1
kind: Deployment
metadata:name: operator-dashboard
spec:replicas: 1selector:matchLabels:app: operator-dashboardtemplate:metadata:labels:app: operator-dashboardspec:containers:- name: frontendimage: operator-dashboard-frontend:latestports:- name: httpcontainerPort: 80- name: backendimage: operator-dashboard-backend:latestenv:- name: TIDB_OPERATOR_ENDPOINTvalue: "http://tidb-operator:2379"ports:- name: httpcontainerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: operator-dashboard
spec:selector:app: operator-dashboardports:- name: httpprotocol: TCPport: 80targetPort: http- name: apiprotocol: TCPport: 8080targetPort: http

V2

思路

可以为您提供一个大致的指导,帮助您编写一个 TiDB ARM 的 Operator 和 Operator Dashboard。

  1. TiDB ARM Operator

TiDB ARM Operator 可以使用 Operator SDK 和 Helm Charts 来创建。以下是 TiDB ARM Operator 的大致步骤:

  • 创建一个新的 Operator 项目
  • 使用 Helm Chart 来定义 TiDB ARM 的安装和升级过程
  • 在 Operator 中创建 Custom Resource Definition (CRD),以便用户可以使用 kubectl apply 命令来创建 TiDB ARM 集群
  • 在 Operator 中实现逻辑,以便在 CRD 创建或更新时,调用 Helm Chart 安装或升级 TiDB ARM
  • 在 Operator 中实现逻辑,以便在 CRD 删除时,调用 Helm Chart 卸载 TiDB ARM
  1. TiDB ARM Operator Dashboard

TiDB ARM Operator Dashboard 可以使用 React 和 Kubernetes API 来创建。以下是 TiDB ARM Operator Dashboard 的大致步骤:

  • 创建一个新的 React 项目
  • 使用 Kubernetes API 来获取 TiDB ARM 集群的状态和信息
  • 在 Dashboard 中实现逻辑,以便用户可以查看 TiDB ARM 集群的状态、监控数据和日志
  • 在 Dashboard 中实现逻辑,以便用户可以执行操作,如扩容、升级、备份和恢复 TiDB ARM 集群

以上是大致的步骤,具体实现可能会有所不同。希望这些指导能够帮助您编写 TiDB ARM Operator 和 Operator Dashboard。

实例代码

可以为您提供一些示例代码,并加上注释来帮助您理解代码。

TiDB ARM Operator

以下是使用 Operator SDK 和 Helm Charts 创建 TiDB ARM Operator 的步骤:

  1. 创建一个新的 Operator 项目:
operator-sdk init --plugins=helm --domain=mycompany.com --group=tidb --version=v1alpha1 --kind=TidbCluster

这个命令将创建一个新的 Operator 项目,其中包括 CRD 和控制器代码。--plugins=helm 表示我们将使用 Helm Charts 来定义 TiDB ARM 的安装和升级过程。--domain=mycompany.com 表示您的公司域名,--group=tidb 表示您的 Operator 的 API 组名,--version=v1alpha1 表示 API 版本,--kind=TidbCluster 表示自定义资源的类型。

  1. 使用 Helm Chart 来定义 TiDB ARM 的安装和升级过程:

deploy/charts 目录中创建一个 Helm Chart,定义 TiDB ARM 的安装和升级过程。

Helm Chart 是一种 Kubernetes 应用程序包管理器,它可以定义一组 Kubernetes 资源,以便在 Kubernetes 上安装、升级和卸载应用程序。在 deploy/charts 目录中创建一个 Helm Chart,定义 TiDB ARM 的安装和升级过程。

  1. 在 Operator 中创建 Custom Resource Definition (CRD):

api/v1alpha1/tidbcluster_types.go 中创建 CRD,定义 TiDB ARM 集群的规范。

CRD 是 Kubernetes API 的一部分,它允许您定义自定义资源的 API 规范。在 api/v1alpha1/tidbcluster_types.go 中创建 CRD,定义 TiDB ARM 集群的规范。

以下是 tidbcluster_types.go 的示例代码:

// TidbClusterSpec defines the desired state of TidbCluster
type TidbClusterSpec struct {// Size is the size of the TiDB ARM clusterSize int32 `json:"size"`// Version is the version of TiDB ARM to be installedVersion string `json:"version"`// StorageClassName is the name of the storage class to use for TiDB ARM storageStorageClassName string `json:"storageClassName"`
}// TidbClusterStatus defines the observed state of TidbCluster
type TidbClusterStatus struct {// Nodes is the list of TiDB ARM nodesNodes []string `json:"nodes"`// Version is the actual version of TiDB ARM installedVersion string `json:"version"`// Conditions describes the current state of the TiDB ARM clusterConditions []metav1.Condition `json:"conditions"`
}// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:resource:path=tidbclusters,scope=Namespaced,shortName=tc// TidbCluster is the Schema for the tidbclusters API
type TidbCluster struct {metav1.TypeMeta   `json:",inline"`metav1.ObjectMeta `json:"metadata,omitempty"`Spec   TidbClusterSpec   `json:"spec,omitempty"`Status TidbClusterStatus `json:"status,omitempty"`
}// +kubebuilder:object:root=true// TidbClusterList contains a list of TidbCluster
type TidbClusterList struct {metav1.TypeMeta `json:",inline"`metav1.ListMeta `json:"metadata,omitempty"`Items           []TidbCluster `json:"items"`
}
  1. 在 Operator 中实现逻辑:

controllers/tidbcluster_controller.go 中实现逻辑,以便在 CRD 创建或更新时,调用 Helm Chart 安装或升级 TiDB ARM;在 CRD 删除时,调用 Helm Chart 卸载 TiDB ARM。

以下是 tidbcluster_controller.go 的示例代码:

// Reconcile reads that state of the cluster for a TidbCluster object and makes changes based on the state read
// and what is in the TidbCluster.Spec
func (r *TidbClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {// Fetch the TidbCluster instancevar tc v1alpha1.TidbClusterif err := r.Get(ctx, req.NamespacedName, &tc); err != nil {return ctrl.Result{}, client.IgnoreNotFound(err)}// Get the Helm release name for this TidbClusterreleaseName := tc.Name// Get the namespace for this TidbClusternamespace := tc.Namespace// Get the values for the Helm Chartvalues := map[string]interface{}{"size":              tc.Spec.Size,"version":           tc.Spec.Version,"storageClassName":  tc.Spec.StorageClassName,}// Get the chart directorychartDir := filepath.Join(r.ChartDir, "tidb-arm")// Get the chart valueschartValues, err := chartutil.ValuesFromMap(values)if err != nil {return ctrl.Result{}, err}// Install or upgrade the Helm Chartrelease, err := r.HelmClient.InstallOrUpgrade(releaseName, chartDir, namespace, chartValues)if err != nil {return ctrl.Result{}, err}// Update the TidbCluster statustc.Status.Nodes = release.Resourcestc.Status.Version = release.Chart.Metadata.Versiontc.Status.Conditions = []metav1.Condition{{Type:               "Ready",Status:             metav1.ConditionTrue,LastTransitionTime: metav1.Now(),},}if err := r.Status().Update(ctx, &tc); err != nil {return ctrl.Result{}, err}return ctrl.Result{}, nil
}

在这个控制器中,我们首先获取了 TidbCluster 实例,然后获取了 Helm 发布名称、命名空间和值。然后,我们使用 Helm 客户端来安装或升级 Helm Chart。最后,我们更新了 TidbCluster 的状态。

TiDB ARM Operator Dashboard

以下是使用 React 和 Kubernetes API 创建 TiDB ARM Operator Dashboard 的步骤:

  1. 创建一个新的 React 项目:
npx create-react-app tidb-arm-operator-dashboard

这个命令将创建一个新的 React 项目。

  1. 使用 Kubernetes API 来获取 TiDB ARM 集群的状态和信息:

使用 Kubernetes API 来获取 TiDB ARM 集群的状态和信息。您可以使用 Kubernetes API 客户端库,如 @kubernetes/client-node

以下是获取 TiDB ARM 集群状态和信息的示例代码:

const kc = new k8s.KubeConfig();
kc.loadFromDefault();const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
const tidbApi = kc.makeApiClient(k8s.CustomObjectsApi);const tidbClusterList = await tidbApi.listNamespacedCustomObject('tidb.pingcap.com','v1alpha1','default','tidbclusters'
);const podList = await k8sApi.listPodForAllNamespaces();const serviceList = await k8sApi.listServiceForAllNamespaces();
  1. 在 Dashboard 中实现逻辑:

在 Dashboard 中实现逻辑,以便用户可以查看 TiDB ARM 集群的状态、监控数据和日志;以及执行操作,如扩容、升级、备份和恢复 TiDB ARM 集群。

以下是获取 TiDB ARM 集群状态和信息的示例代码:

import React, { useState, useEffect } from 'react';
import * as k8s from '@kubernetes/client-node';const kc = new k8s.KubeConfig();
kc.loadFromDefault();const k8sApi = kc.makeApiClient(k8s.CoreV1Api);
const tidbApi = kc.makeApiClient(k8s.CustomObjectsApi);function App() {const [tidbClusters, setTidbClusters] = useState([]);const [pods, setPods] = useState([]);const [services, setServices] = useState([]);useEffect(() => {const fetchTidbClusters = async () => {const tidbClusterList = await tidbApi.listNamespacedCustomObject('tidb.pingcap.com','v1alpha1','default','tidbclusters');setTidbClusters(tidbClusterList.body.items);};const fetchPods = async () => {const podList = await k8sApi.listPodForAllNamespaces();setPods(podList.body.items);};const fetchServices = async () => {const serviceList = await k8sApi.listServiceForAllNamespaces();setServices(serviceList.body.items);};fetchTidbClusters();fetchPods();fetchServices();}, []);return (<div><h1>TiDB ARM Operator Dashboard</h1><h2>TiDB ARM Clusters</h2><ul>{tidbClusters.map((tc) => (<li key={tc.metadata.name}>{tc.metadata.name} ({tc.status.phase})</li>))}</ul><h2>Pods</h2><ul>{pods.map((pod) => (<li key={pod.metadata.name}>{pod.metadata.namespace}/{pod.metadata.name} ({pod.status.phase})</li>))}</ul><h2>Services</h2><ul>{services.map((svc) => (<li key={svc.metadata.name}>{svc.metadata.namespace}/{svc.metadata.name} ({svc.spec.type})</li>))}</ul></div>);
}export default App;

在这个示例中,我们使用 useStateuseEffect 钩子来获取 TiDB ARM 集群、Pod 和服务的状态和信息。然后,我们在页面上显示这些信息。

相关文章:

TiDB Operator 和 Operator Dashboard

TiDB Operator 和 Operator Dashboard V1TiDB Operator概念实现 Operator Dashboard概念实现 V2思路实例代码TiDB ARM OperatorTiDB ARM Operator Dashboard V1 为了演示如何编写 TiDB Operator 和 Operator Dashboard&#xff0c;我们将分别介绍它们的概念和实现。 TiDB Ope…...

计算机网络闲谈01——QUIC协议

计算机网络闲谈01——QUIC协议 预备知识 重传机制 RTT 一个连接的往返时间 RTO 重传超时时间 RTT和RTO 的关系是&#xff1a;由于网络波动的不确定性&#xff0c;每个RTT都是动态变化的&#xff0c;所以RTO也应随着RTT动态变化。 流量控制 对发送方发送速率的控制 称之为…...

楼层滚动效果(超级简单,易懂)

系列文章目录 文章目录 系列文章目录一、楼层滚动效果图如下1. 下图是纯Css实现的楼层滚动2.通过Js优化后的楼层滚动如下图(&#x1f339;&#x1f339;) 二、楼层滚动&#xff08;Css实现&#xff09;1.滚动原理2.代码如下 三、楼层滚动&#xff08;JsCss优化后的楼层滚动&…...

FPGA、 CPU、GPU、ASIC区别

一、为什么使用 FPGA&#xff1f; 众所周知&#xff0c;通用处理器&#xff08;CPU&#xff09;的摩尔定律已入暮年&#xff0c;而机器学习和 Web 服务的规模却在指数级增长。 人们使用定制硬件来加速常见的计算任务&#xff0c;然而日新月异的行业又要求这些定制的硬件可被重新…...

ChatGPT 之父承认 GPT-5 并不存在,为什么 OpenAI 总是这么实诚?|万字详述

ChatGPT 诞生前传 来源: 爱范儿 微信号&#xff1a;ifanr 最近&#xff0c;OpenAI 的 CEO Sam Altman 在一场公开会议上为 GPT-5 辟谣。 他声称 OpenAI 并没有在训练 GPT-5&#xff0c;而是一直基于 GPT-4 做别的工作。 OpenAI 是一家非常有趣的机构&#xff0c;和微软、Go…...

华为交换机配置telnet登录图文教程

一、配置交换机管理vlan和地址&#xff0c;配置交换机接口 1.关闭多余的信息提示&#xff1a; [Huawei]undo in en Info: Information center is disabled. [Huawei] 2.交换机配置 在工作中通过Telnet方式登录交换机进行设备登录管理能更加便利&#xff0c;不需要到机房里…...

Linux:网络基础1

网络协议分层 所有网络问题&#xff0c;本质都是通信距离变长了&#xff0c;为了尽可能减少通信成本&#xff0c;定制了协议。 协议分层的优势&#xff1a; 软件设计方面的优势 - 低耦合 一般我们的分层依据: 功能比较集中&#xff0c;耦合度比较高的模块-- 一层 &#xff0c…...

Matlab对日期变量和时间变量的管理

Matlab2012a内置了三个函数 datanumdatevecdatestr 靠这三个函数&#xff0c;可以基本实现日期变量和时间变量的管理。下面直接来看。 &#xff08;1&#xff09;datanum 这个函数用来将字符串&#xff0c;日期矢量转为通用日&#xff08;数值型&#xff09;。所谓的通用日…...

js字符串 常用方法 并带详细讲解

JavaScript中字符串是一种基本数据类型&#xff0c;表示文本数据。字符串常用方法有以下几种&#xff1a; length&#xff1a;返回字符串的长度。 let str "hello world"; console.log(str.length); // 11indexOf&#xff1a;返回字符串中指定字符或子串的位置&am…...

Oracle_Audit_审计

1、什么是审计审计&#xff08;Audit)用于监视用户所执行的数据库操作&#xff0c;并且Oracle会将审计跟踪结果存放到OS文件&#xff08;默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/&#xff09;或数据库&#xff08;存储在system表空间中的SYS.AUD$表中&#xff0c;可通…...

python算法中的深度学习算法之生成对抗网络(详解)

目录 学习目标: 学习内容: 生成对抗网络 Ⅰ. 生成器 Ⅱ. 判别器...

【VM服务管家】VM4.0软件使用_1.2 工具类

目录 1.2.1 文本保存&#xff1a;逐行保存格式化模块输出的方法1.2.2 脚本模块&#xff1a;循环模块搭配脚本使用的方法1.2.3 几何查找&#xff1a;彩色图像的几何查找方法1.2.4 深度学习&#xff1a;图像分割的面积的获取方法1.2.5 颜色识别&#xff1a;使用颜色识别工具做分类…...

Android系统架构

Application层&#xff0c;也就是应用层&#xff0c;不仅包括通话短信联系人这种系统级的应用&#xff0c;还包括用户自己安装的一些第三方应用Framework层&#xff0c;这一层大部分用Java写的&#xff0c;包括系统服务和四大组件Library层&#xff0c;这一层大部分都是C/C写的…...

零基础想成为黑客,只需要四步

前言 首先要明白&#xff0c;该篇文章说的黑客不是那种窃取别人信息、攻击别人系统的黑客&#xff0c;说的是调试和分析计算机安全系统的网络安全工程师。 黑客技术的核心之一就是渗透攻防技术&#xff0c;是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模…...

ChatGPT研究报告:AIGC带来新一轮范式转移

本文约4000字&#xff0c;目标是快速建立AIGC知识体系&#xff0c;含有大量的计算专业名词&#xff0c;建议阅读同时扩展搜索。 一、行业现状 1、概念界定 区别于PGC与UGC不同的&#xff0c;AIGC是利用人工智能技术自动生成内容的新型生产方式。 2、数据模态 按照模态区分&a…...

自助式数据分析平台:jvs数据智仓-统计报表的使用条件及界面介绍

统计报表界面介绍 统计报表是指利用表格和报表等形式&#xff0c;将数据以清晰的结构和布局的方式呈现出来&#xff0c;以便用户进行数据分析和决策制定的一种BI统计方法。表格式的BI统计通常采用交叉表格、分组表、报表等形式&#xff0c;对数据进行整合、分析和展示&#xff…...

php连接sqlserver

1.使用工具 Wampserver--3.3 sqlserver2023 php7.4.33 2.连接流程 1.下载Microsoft Drivers for PHP for SQL Server 下载地址&#xff1a;下载 Microsoft Drivers for PHP for SQL Server - PHP drivers for SQL Server | Microsoft Learn 2.下载Microsoft ODBC Driver …...

Android 9.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(一)

1.前言 在9.0的系统rom产品定制化开发中,在原生系统SystemUI下拉状态栏的通知栏的通知背景默认是白色四角的背景, 由于在产品设计中,需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 然后通知显示流程,设置默认下拉状态栏UI中的…...

vCenter(PSC)正常更改或重置administrator@vsphere.local用户的密码方法

1. 正常更改administratorvsphere.local用户密码 在vCenter界面中选择“菜单”下的“系统管理”&#xff0c;如下图所示&#xff1a; 然后在Single Sign On下的用户和组中&#xff0c;选择“vsphere.local”域&#xff0c;再对Administrator用户进行编辑&#xff0c;即可进行…...

【五一创作】Java 反射

在了解反射前&#xff0c;我们先要知道一些相关知识 Class类 Class类的实例表示java应用运行时的类或接口&#xff0c;每个java类运行时都在JVM里表现为一个class对象&#xff0c;可通过类名.class、类型.getClass()、Class.forName("类名")等方法获取class对象。 …...

常见元件、封装、尺寸、表面处理等

参考&#xff1a;https://www.bilibili.com/read/cv11024927?fromsearch&spm_id_from333.337.0.0 参考&#xff1a;https://www.bilibili.com/read/cv18413169?fromsearch&spm_id_from333.337.0.0 目录 通孔插件(THT)和表面贴装(SMT)技术封装类型SOP/SOIC封装DIP封装…...

作为一名8年测试工程师,因为偷偷接私活被····

接私活 对程序员这个圈子来说是一个既公开又隐私的话题&#xff0c;不说全部&#xff0c;应该大多数程序员都有过想要接私活的想法&#xff0c;当然&#xff0c;也有部分得道成仙的不主张接私活。但是很少有人在公开场合讨论私活的问题&#xff0c;似乎都在避嫌。就跟有人下班后…...

前端面试八股文

1、HTTP和HTTPS 1.1、http和https的基本概念 http: 是一个客户端和服务器端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用于从 WWW 服务器传输超文本到本地浏览器的超文本传输协议。 https: 是以安全为目标的 HTTP 通道&#xff0c;即 HTTP 下 加入 SS…...

[创新工具和方法论]-02- DOE实验设计步骤

文章目录 1.DOE设计1.1 基于OFAT的传统实验设计&#xff1a;1.2 基于DoE的现代实验设计&#xff1a;1.3 DOE和OFAT的比较1.4 如何利用好DOE1.4.1 规划1.4.2 筛选1.4.3 表征1.4.4 优化1.4.5 确认 2. 步骤2.1陈述实际的问题和实验的目的2.2因果链分析,提取重要的因子2.3选择Y的响…...

XXL-JOB分布式任务调度平台搭建以及和SpringBoot整合应用

1 前言 XXL-JOB 是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 可以前往 Gitee 地址进行下载使用&#xff1a; https://gitee.com/xuxueli0323/xxl-job.g…...

【LeetCode】236. 二叉树的最近公共祖先

1.问题 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是…...

STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)

1.总体逻辑 按下STM32F4的KEY0按键&#xff0c;通过外部中断的方式对按键进行检测&#xff0c;然后开启一次带DMA的固定点数的ADC采集&#xff0c;采集完成后在DMA的中断发送采集到的数据&#xff0c;然后清空数据区准备下一次的按键中断。电脑接受到串口数据后对数据进行简单…...

ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~

文章目录 ChatGPT 平替天花板&#xff1a;HuggingFace 版 ChatGPT 来了&#xff0c;无需魔法无需等待直接起飞 ~HuggingFace 简介HuggingChat 登场展望 ChatGPT 平替天花板&#xff1a;HuggingFace 版 ChatGPT 来了&#xff0c;无需魔法无需等待直接起飞 ~ 二话不说上链接 htt…...

桐乡学会计实操—小规模纳税人征收率的汇总帖来啦!

上元会计—会计实操—小规模纳税人征收率的汇总帖来啦&#xff01;一文了解 小规模纳税人发生应税行为适用简易计税方法计税。那么小规模纳税人增值税的征收率到底有几档&#xff1f;很多人以为小规模纳税人适用的征收率只有3%&#xff0c;但是有没有其他征收率呢&#xff0c;…...

权威学者、企业CFO荟聚上海国家会计学院,共探「智能会计 价值财务」

4月21日&#xff0c;由用友主办的「智能会计 价值财务」2023企业数智化财务创新峰会在上海国家会计学院圆满举办。学院权威教授、业内专家与来自央国企、行业领先企业的财务先锋&#xff0c;线下云端共聚一堂&#xff0c;数万人共探大型企业财务数智化的全新价值主张。 会议伊始…...