使用MinIO S3存储桶备份Weaviate

news2024/11/23 15:37:33


Weaviate 是一个开创性的开源向量数据库,旨在通过利用机器学习模型来增强语义搜索。与依赖关键字匹配的传统搜索引擎不同,Weaviate 采用语义相似性原则。这种创新方法将各种形式的数据(文本、图像等)转换为矢量表示形式,即捕捉数据上下文和含义本质的数字形式。通过分析这些向量之间的相似性,Weaviate提供了真正了解用户意图的搜索结果,从而超越了基于关键字的搜索的局限性。

本指南旨在演示 MinIO 和 Weaviate 的无缝集成,充分利用 Kubernetes 原生对象存储和 AI 驱动的语义搜索功能。本指南利用 Docker Compose 进行容器编排,提供了构建强大、可扩展且高效的数据管理系统的战略方法。针对我们如何存储、访问和管理数据,此设置对于寻求利用现代存储解决方案和 AI 驱动型数据检索功能的开发人员、DevOps 工程师和数据科学家来说是一个游戏规则改变者。

技术堆栈简介

在本演示中,我们将重点介绍如何使用 Docker 备份 Weaviate with MinIO buckets。这种设置确保了我们人工智能增强的搜索和分析项目中的数据完整性和可访问性。

  • 用于存储的 MinIO:我们使用 MinIO 作为我们的主要存储平台。MinIO 以其高性能和可扩展性而闻名,擅长安全高效地处理大量数据。在本演示中,您将了解如何使用 MinIO 存储桶来备份 Weaviate 数据,确保我们系统的完整性和性能不受影响。

  • Weaviate 向量数据库:Weaviate 的向量数据库是这种集成的核心,它使 AI 应用程序能够执行语义搜索。通过将非结构化数据转换为有意义的向量表示,它使应用程序能够以细致入微的方式理解数据并与之交互,为更智能、响应更灵敏的 AI 驱动功能铺平道路。

该演示旨在重点介绍使用 Docker 将 MinIO 和 Weaviate 无缝集成,展示一种备份 AI 增强搜索和分析系统的可靠方法。

资源

所有文件都可通过 GitHub minio/blog-assets/minio-weaviate-backups 存储库文件夹获得。

  • docker-compose.yaml
  • schema.json
  • data.json
  • s3_backup_module.ipynb

知识渊博的先决条件

  • 计算机上安装了 Docker 和 Docker Compose。

  • 基本了解 Docker 概念和 YAML 语法。

  • 使用 weaviate-client 库的 Python 环境。

  • 用于运行命令(如 curl)的命令行访问。

与 Docker Compose 的集成和配置

此处 docker-compose.yaml 提供的文件旨在为 Weaviate 建立无缝设置,突出了我们对简化和高效数据管理的承诺。这种配置提供了一个强大的环境,其中 MinIO 充当安全存储服务,Weaviate 利用此存储实现高级向量搜索功能。

下面提供的 docker-compose.yaml 概述了 Weaviate 的设置。

version: '3.8'

services:
  weaviate:
    container_name: weaviate_server
    image: semitechnologies/weaviate:latest
    ports:
      - "8080:8080"
    environment:
      AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
      PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
      ENABLE_MODULES: 'backup-s3'
      BACKUP_S3_BUCKET: 'weaviate-backups'
      BACKUP_S3_ENDPOINT: 'play.minio.org.cn:443'
      BACKUP_S3_ACCESS_KEY_ID: 'minioadmin'
      BACKUP_S3_SECRET_ACCESS_KEY: 'minioadmin'
      BACKUP_S3_USE_SSL: 'true'
      CLUSTER_HOSTNAME: 'node1'
    volumes:
      - ./weaviate/data:/var/lib/weaviate

Docker-Compose:在启用模块和 play.minio.org.cn MinIO 服务器的情况下 backups-s3 部署 Weaviate

配置 Weaviate 以进行 S3 备份

通过上面的docker-compose.yaml,Weaviate被复杂地配置为利用MinIO进行备份,确保数据的完整性和可访问性。此设置涉及基本环境变量,例如 ENABLE_MODULES 设置为 backup-s3 ,以及 S3 存储桶、终端节点、访问密钥和 SSL 使用情况的各种设置。此外,设置 以确保持久存储数据, PERSISTENCE_DATA_PATH 并 CLUSTER_NAME 用于节点标识。

值得注意的环境变量包括:

  • ENABLE_MODULES: ‘backup-s3’
  • BACKUP_S3_BUCKET: ‘weaviate-backups’
  • BACKUP_S3_ENDPOINT: ‘play.minio.org.cn:443’
  • BACKUP_S3_ACCESS_KEY_ID: ‘minioadmin’
  • BACKUP_S3_SECRET_ACCESS_KEY: ‘minioadmin’
  • BACKUP_S3_USE_SSL: ‘true’
  • PERSISTENCE_DATA_PATH: ‘/var/lib/weaviate’
  • CLUSTER_NAME: ‘node1’

此 docker-compose 中的 Weaviate 服务设置为利用挂载的卷进行数据持久化;这可确保您的数据在会话和操作中持久存在。

注意:MinIO 存储桶需要事先存在,Weaviate 不会为您创建存储桶。

部署步骤

要使用 Docker Compose 将 MinIO 和 Weaviate 集成到您的项目中,请遵循以下详细过程:

保存或更新 Docker Compose 文件

  • 新设置:如果这是新设置,请将提供的 docker-compose.yaml 文件直接保存到项目的工作目录中。此文件对于正确配置服务至关重要。

  • 现有设置:如果要更新现有生产环境,请修改当前的 docker-compose.yaml 以反映上述设置。确保准确复制这些设置以连接到您的服务。

运行 Docker Compose 文件

docker-compose.yaml 文件就位后,在终端或命令提示符下使用以下命令启动部署:

docker-compose up -d --build

此命令将以分离模式启动 Weaviate 服务,并在系统后台运行它们。

了解持久性目录

在构建和执行过程中,Docker Compose 将创建一个持久目录,如 docker-compose.yaml 文件中指定的那样。此目录( ./weaviate/data 用于 Weaviate)用于持久存储数据,确保您的数据在容器重启和部署中保持不变。
持久性存储允许更稳定的环境,在重新启动容器时不会丢失数据。

部署 docker-compose 后,您可以在浏览器中访问 Weaviate 服务器的 URL,然后 /v1/meta 检查您的部署配置是否正确。

JSON 有效负载的第一 http://localhost:8080/v1/meta 行应如下所示:

{"hostname":"http://[::]:8080","modules":{"backup-s3":{"bucketName":"weaviate-backups","endpoint":"play.minio.org.cn:443","useSSL":true}...[truncated]...}

配置 MinIO:存储桶的访问策略 weaviate-backups

为了将 Weaviate 与 MinIO 集成,MinIO 中的备份存储桶需要指定备份存储桶的访问策略,即 weaviate-backups to Public。此调整对于授予 Weaviate backup-s3 模块成功与 MinIO 存储桶交互以执行备份操作所需的权限是必要的。

注意:在生产环境中,您可能需要将其锁定,这超出了本教程的范围。

在处理此配置时,必须清楚地了解将存储桶设置为“public”的安全隐患。虽然此设置有助于开发环境中的备份过程,但应考虑为生产系统使用替代方法,以保持数据安全性和完整性。采用精细的访问控制,例如 IAM 策略或“预签名”URL。


成功备份到 weaviate-backups 存储桶

在本演示结束时,您将能够看到 Weaviate 在使用该 backup-s3 模块时在整个过程中创建的桶对象。

使用 Python 概述流程

要在 Weaviate 中启用 S3 备份,请在 docker-compose.yaml 文件中设置必要的环境变量。这指示 Weaviate 使用 MinIO 作为备份目的地,包括备份模块的设置和 MinIO 存储桶的详细信息。

在深入探讨技术操作之前,我想声明,我正在 JupyterLab 环境中演示以下步骤,以便将我们的管道封装在笔记本中的额外好处,可在此处获得。

第一步涉及通过使用 pip 安装 python weaviate-client 库来设置环境。这个 Python 包对于以更 Python 的方式与 Weaviate 的 RESTful API 连接至关重要,允许与数据库无缝交互,以进行模式创建、数据索引、备份和恢复等操作。在演示中,我们将使用 Weaviate Python 客户端库进行演示。

在本演示中,我们使用的是 Weaviate V3 API,因此当您运行 python 脚本时,您可能会看到如下消息:

`DeprecationWarning: Dep016: You are using the Weaviate v3 client, which is deprecated.
            Consider upgrading to the new and improved v4 client instead!
            See here for usage: https://weaviate.io/developers/weaviate/client-libraries/python
           
  warnings.warn(`

此消息是一个警告横幅,可以忽略,有关更多信息,您可以访问 Weaviate 博客上的这篇文章。

Python 步骤概述:

  1. Install weaviate-client Library
  2. Client initialization
  3. Schema creation
  4. Data insertion
  5. Backup initiation
  6. Data restoration

1. 安装 Weaviate-Client 库

!pip install weaviate-client

2. 导入文章和作者的模式类

本节介绍“Article”和“Author”类的数据结构和架构,为如何组织数据奠定了基础。它演示了如何在 Weaviate 中以编程方式定义和管理模式,展示了 Weaviate 的灵活性和强大功能,以适应针对特定应用程序需求量身定制的各种数据模型。

import weaviate

client = weaviate.Client("http://localhost:8080")

# Schema classes to be created

schema = {
  "classes": [
    {
      "class": "Article",
      "description": "A class to store articles",
      "properties": [
        {"name": "title", "dataType": ["string"], "description": "The title of the article"},
        {"name": "content", "dataType": ["text"], "description": "The content of the article"},
        {"name": "datePublished", "dataType": ["date"], "description": "The date the article was published"},
        {"name": "url", "dataType": ["string"], "description": "The URL of the article"},
        {"name": "customEmbeddings", "dataType": ["number[]"], "description": "Custom vector embeddings of the article"}
      ]
    },
    {
      "class": "Author",
      "description": "A class to store authors",
      "properties": [
        {"name": "name", "dataType": ["string"], "description": "The name of the author"},
        {"name": "articles", "dataType": ["Article"], "description": "The articles written by the author"}
      ]
    }
  ]
}
client.schema.delete_class('Article')
client.schema.delete_class('Author')
client.schema.create(schema)

3. 架构和数据的设置

定义架构后,笔记本将指导您完成初始化 Weaviate 客户端、在 Weaviate 实例中创建架构以及为数据编制索引。这个过程用初始数据集填充数据库,从而能够探索Weaviate的载体搜索功能。它说明了开始利用 Weaviate 以矢量化格式存储和查询数据所需的实际步骤。

# JSON data to be Ingested

data = [
    {
        "class": "Article",
        "properties": {
            "title": "LangChain: OpenAI + S3 Loader",
            "content": "This article discusses the integration of LangChain with OpenAI and S3 Loader...",
            "url": "https://blog.minio.org.cn/langchain-openai-s3-loader/",
            "customEmbeddings": [0.4, 0.3, 0.2, 0.1]
        }
    },
    {
        "class": "Article",
        "properties": {
            "title": "MinIO Webhook Event Notifications",
            "content": "Exploring the webhook event notification system in MinIO...",
            "url": "https://blog.minio.org.cn/minio-webhook-event-notifications/",
            "customEmbeddings": [0.1, 0.2, 0.3, 0.4]
        }
    },
    {
        "class": "Article",
        "properties": {
            "title": "MinIO Postgres Event Notifications",
            "content": "An in-depth look at Postgres event notifications in MinIO...",
            "url": "https://blog.minio.org.cn/minio-postgres-event-notifications/",
            "customEmbeddings": [0.3, 0.4, 0.1, 0.2]
        }
    },
    {
        "class": "Article",
        "properties": {
            "title": "From Docker to Localhost",
            "content": "A guide on transitioning from Docker to localhost environments...",
            "url": "https://blog.minio.org.cn/from-docker-to-localhost/",
            "customEmbeddings": [0.4, 0.1, 0.2, 0.3]
        }
    }
]

for item in data:
    client.data_object.create(
        data_object=item["properties"],
        class_name=item["class"]
    )

Python:按类索引数据

4. 创建备份

对数据编制索引后,重点将转移到通过备份来保留数据库的状态。笔记本的这一部分演示如何触发对 MinIO 的备份操作。

result = client.backup.create(
  backup_id="backup-id",
  backend="s3",
  include_classes=["Article", "Author"],  # specify classes to include or omit this for all classes
  wait_for_completion=True,
)
print(result)

Python:创建备份

期望:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id-2', 'path': 's3://weaviate-backups/backup-id-2', 'status': 'SUCCESS'}

5. 删除架构类以进行还原

在继续还原之前,有时需要清除现有架构。本部分介绍干净还原过程的步骤。这可确保还原的数据不会与数据库中的现有架构或数据冲突。

client.schema.delete_class("Article")
client.schema.delete_class("Author")

6. 恢复备份

result = client.backup.restore(
  backup_id="backup-id",
  backend="s3",
  wait_for_completion=True,
)

print(result)

恢复备份

期望:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}

成功的 Backup-S3 响应

还原期间的错误处理

笔记本的这一部分提供了在备份还原过程中实现错误处理的示例。它提供了对数据恢复操作期间意外问题的见解。

from weaviate.exceptions import BackupFailedError

try:
    result = client.backup.restore(
        backup_id="backup-id",
        backend="s3",
        wait_for_completion=True,
    )
    print("Backup restored successfully:", result)

except BackupFailedError as e:
    print("Backup restore failed with error:", e)
    # Here you can add logic to handle the failure, such as retrying the operation or logging the error.

期望:
Backup restored successfully: {'backend': 's3', 'classes': ['Author', 'Article'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}

成功的备份恢复
将 Article 类作为 JSON 对象返回

验证还原成功

最后,为了确认备份和还原过程已成功完成,笔记本包含一个步骤来检索“Article”类的架构。此验证可确保正确还原数据和架构。

client.schema.get("Article")

将 Article 类作为 JSON 对象返回

期望:

{'class': 'Article', 'description': 'A class to store articles'... [Truncated]...}

笔记本的每个部分都提供了贯穿 Weaviate 数据管理生命周期的综合指南,从初始设置和数据填充到备份、恢复和验证,所有这些都使用 Weaviate-client 库在 Python 生态系统中执行。

使用 curl 概述流程

到目前为止,我们已经向您展示了如何以 Python 方式执行此操作。我们认为,在 CURL 内部展示如何在不编写脚本的情况下实现相同的操作会很有帮助。

要与 Weaviate 实例交互以执行创建架构、索引数据、执行备份和恢复数据等任务,可以使用特定的 curl 命令。这些命令向 Weaviate 的 REST API 发出 HTTP 请求。例如,要创建架构,需要将包含架构详细信息的 POST 请求发送到 Weaviate 的架构端点。同样,要为数据编制索引,将向对象端点发出具有数据负载的 POST 请求。

备份是通过对备份端点的 POST 请求触发的,还原是通过对还原端点的 POST 请求完成的。其中每个操作都需要相应的 JSON 有效负载,通常在 curl 命令中使用 @ 符号作为文件引用提供。

为了实现 Weaviate,我们当然需要样本数据来处理,这

  1. schema.json 概述了我们要编制索引的数据的结构。

  2. data.json 是我们实际数据发挥作用的地方,其结构与schema.json文件中的类一致。

schema.json 和 data.json 文件位于此处的 MinIO blog-assets 存储库中。

{
  "classes": [
    {
      "class": "Article",
      "description": "A class to store articles",
      "properties": [
        {"name": "title", "dataType": ["string"], "description": "The title of the article"},
        {"name": "content", "dataType": ["text"], "description": "The content of the article"},
        {"name": "datePublished", "dataType": ["date"], "description": "The date the article was published"},
        {"name": "url", "dataType": ["string"], "description": "The URL of the article"},
        {"name": "customEmbeddings", "dataType": ["number[]"], "description": "Custom vector embeddings of the article"}
      ]
    },
    {
      "class": "Author",
      "description": "A class to store authors",
      "properties": [
        {"name": "name", "dataType": ["string"], "description": "The name of the author"},
        {"name": "articles", "dataType": ["Article"], "description": "The articles written by the author"}
      ]
    }
  ]
}

文章和作者的示例架构类

schema.json文件概述了要索引的数据的结构,详细说明了类、属性及其数据类型,有效地为如何在 Weaviate 中组织和交互数据奠定了基础。该模式充当 AI 理解和分类传入数据的蓝图,确保向量搜索引擎能够精确和相关地运行。

另一方面,data.json 文件使用实际的数据实例填充此架构,镜像实际应用程序和场景。此示例数据阐明了 Weaviate 搜索功能的潜力,提供了实践经验,展示了如何解决查询以及如何根据 AI 对内容的理解动态生成结果。

data.json

[
    {
        "class": "Article",
        "properties": {
            "title": "LangChain: OpenAI + S3 Loader",
            "content": "This article discusses the integration of LangChain with OpenAI and S3 Loader...",
            "url": "https://blog.minio.org.cn/langchain-openai-s3-loader/",
            "customEmbeddings": [0.4, 0.3, 0.2, 0.1]
        }
    },
    {
        "class": "Article",
        "properties": {
            "title": "MinIO Webhook Event Notifications",
            "content": "Exploring the webhook event notification system in MinIO...",
            "url": "https://blog.minio.org.cn/minio-webhook-event-notifications/",
            "customEmbeddings": [0.1, 0.2, 0.3, 0.4]
        }
    },
    {
        "class": "Article",
        "properties": {
            "title": "MinIO Postgres Event Notifications",
            "content": "An in-depth look at Postgres event notifications in MinIO...",
            "url": "https://blog.minio.org.cn/minio-postgres-event-notifications/",
            "customEmbeddings": [0.3, 0.4, 0.1, 0.2]
        }
    },
    {
        "class": "Article",
        "properties": {
            "title": "From Docker to Localhost",
            "content": "A guide on transitioning from Docker to localhost environments...",
            "url": "https://blog.minio.org.cn/from-docker-to-localhost/",
            "customEmbeddings": [0.4, 0.1, 0.2, 0.3]
        }
    }
]

使用 curl 进行设置

架构充当数据管理系统的结构支柱,定义数据的组织、索引和查询方式。

创建 Weaviate Schema

通过一个简单的 curl 命令,并将我们的示例文件本地克隆到我们当前的工作目录;我们可以将schema.json直接发布到 Weaviate,制定我们的数据将遵守的规则和关系。

curl -X POST -H "Content-Type: application/json" \
--data @schema.json http://localhost:8080/v1/schema

CURL:创建

填充架构:为数据编制索引

有了我们的架构,下一步就是用实际数据填充它。使用另一个 curl 命令,我们将data.json索引到架构中。

curl -X POST -H "Content-Type: application/json" \
--data @data.json http://localhost:8080/v1/objects

CURL:索引

确保数据持久性:使用 MinIO 进行备份

我们需要分配一个唯一标识符,或“backup-id”。此标识符不仅有助于精确跟踪和检索备份集,还可以确保每个数据集都受到版本控制。

curl -X POST 'http://localhost:8080/v1/backups/s3' -H 'Content-Type:application/json' -d '{
  "id": "backup-id",
  "include": [
    "Article",
    "Author"
  ]
}' 

CURL:备份-s3

期望:
{'backend': 's3', 'classes': ['Article', 'Author'], 'id': 'backup-id', 'path': 's3://weaviate-backups/backup-id', 'status': 'SUCCESS'}

成功的 Backup-S3 响应

此输出的格式为 JSON 对象。它包括使用的后端(在本例中为 ‘s3’ )、备份中包含的类列表 ( ‘Article’ 、 ‘Author’ ‘backup-id’ s3://weaviate-backups/backup-id ‘SUCCESS’

这种结构化的响应不仅确认备份过程已成功完成,而且还提供了可用于将来参考、审核或恢复过程的基本信息。

数据恢复过程

Weaviate 生态系统中数据的恢复是通过结构化的 API 调用来实现的,该调用通过针对 /v1/backups/s3/backup-id/restore 端点的 POST 请求(由 backup-id 标识)。此 curl 调用不仅可以恢复丢失或存档的数据,还可以保持连续性。

curl -X POST 'http://localhost:8080/v1/backups/s3/backup-id/restore' \
-H 'Content-Type:application/json' \
-d '{
  "id": "backup-id",
  "exclude": ["Author"]
}'

CURL:恢复

期望
{
  "backend": "s3",
  "classes": ["Article"],
  "id": "backup-id",
  "path": "s3://weaviate-backups/backup-id",
  "status": "SUCCESS"
}

成功的恢复响应

这些命令中的每一个都应根据您的特定设置和要求进行调整。您可能需要根据需要修改终端节点 URL、数据文件路径和其他参数。此外,请确保必要的文件(schema.json、data.json)和配置在您的环境中可用。

关于 Weaviate 的附加说明

使用 GitOps 实现自动化

通过在 Git 中编纂所有内容,团队可以轻松跟踪更改、回滚到以前的状态并确保跨环境的一致性。GitOps 工作流可以与持续集成/持续部署 (CI/CD) 工具和 Kubernetes 集成,进一步简化容器化应用程序的编排和基础设施管理。我们将在以后的文章中详细介绍如何使用 GitOps 实现自动化。

部分备份和还原

Weaviate 允许备份或恢复特定类,这对于部分数据迁移或开发测试等情况很有用。

多节点备份:对于多节点设置,尤其是在 Kubernetes 环境中,请确保您的配置正确指定了备份模块(如 MinIO 的 backup-s3)和相关环境变量。

故障 排除

如果您在备份或还原期间遇到问题,请检查您的环境变量配置,尤其是与 S3 兼容存储(如 MinIO)的 SSL 设置相关的配置。禁用 SSL ( BACKUP_S3_USE_SSL: false ) 可能会解决某些连接问题。

适用于 Weaviate with MinIO 的强大且可扩展的备份解决方案

当我们结束使用 Docker Compose 将 Weaviate 与 MinIO 集成的探索时,很明显,这种组合不仅仅是一种技术解决方案,而是对数据管理的战略性增强。这种集成完全符合 MinIO 的承诺,即提供可扩展、安全和高性能的数据存储解决方案,现在 Weaviate 的 AI 驱动功能进一步增强了这种解决方案。Docker Compose 的使用进一步简化了这种集成,强调了我们对使复杂技术易于访问和管理的关注。

一如既往,MinIO团队始终致力于推动数据管理领域的创新。我们致力于增强和简化数据的存储、访问和分析方式,这是我们使命的核心。

通过将 Weaviate 的高级矢量数据库功能与 MinIO 提供的强大存储解决方案相结合,用户能够释放其数据的全部潜力。这包括利用语义搜索功能,不仅确保数据的可访问性,而且确保数据在基础层面的安全性。

我们真正受到像您这样敬业和热情的开发人员头脑中涌现的非凡创新的启发。我们非常高兴能提供支持,并成为您探索先进解决方案并在您的数据驱动项目中达到新高度的旅程的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么在jupyter notebook中运行R

文章目录 需要安装的R包将jupyter和R进行关联修改镜像(缩短包的下载时间)最终效果图 需要安装的R包 repr, IRdisplay, evaluate, crayon, pbdZMQ, devtools, uuid, digest,IRkernel使用命令 install.packages(c(repr, IRdisplay, evaluate, crayon, pbdZMQ, devto…

Javaweb之SpringBootWeb案例之AOP通知类型的详细解析

3.1 通知类型 在入门程序当中,我们已经使用了一种功能最为强大的通知类型:Around环绕通知。 Around("execution(* com.itheima.service.*.*(..))") public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录方法执行开始…

自动化测试:电商管理系统元素定位练习​

本次专题我们来说一下 Python中Unittest 框架的使用及如何通过HTMLTestRunner实现自动化测试报告的自动生成。案例中的代码我们仍旧使用课堂学习中部署的“电商管理系统”来实现。本次练习包括以下几个操作: l 测试用例整体结构设计 l 测试用例的实现 l 测试套的…

C++类和对象-多态->多态的基本语法、多态的原理剖析、纯虚函数和抽象类、虚析构和纯虚析构

#include<iostream> using namespace std; //多态 //动物类 class Animal { public: //Speak函数就是虚函数 //函数前面加上virtual关键字&#xff0c;变成虚函数&#xff0c;那么编译器在编译的时候就不能确定函数调用了。 virtual void speak() { …

建造者模式-Builder Pattern

原文地址:https://jaune162.blog/design-pattern/builder-pattern/ 引言 现在一般大型的业务系统中的消息通知的形式都会有多种,比如短信、站内信、钉钉通知、邮箱等形式。虽然信息内容相同,但是展现形式缺不同。如短信使用的是纯文本的形式,钉钉使用的一般是Markdown的形…

MATLAB通信系统仿真设计——基于BPSK的直接序列扩频通信系统仿真

一.实验原理 直接序列扩频&#xff0c;就是直接用高码率的扩频码序列在发端去扩展信号的频谱&#xff0c;在收端用相同的扩频码去解扩&#xff0c;把展宽的扩频信号还原成原始的基带信号。 在发端输入的信息与扩频码发生器产生的伪随机码序列&#xff08;这里使用的是m序列&am…

【C语言相关问题】C语言中关于大小写字母转换的问题

大家好&#xff0c;这里是争做图书馆扫地僧的小白。非常感谢各位的支持&#xff0c;也期待着您的关注。 目前博主有着C语言、C、linux以及数据结构的专栏&#xff0c;内容正在逐步的更新。 希望对各位朋友有所帮助同时也期望可以得到各位的支持&#xff0c;有任何问题欢迎私信与…

【解决】阿里云香港服务器怎么样?cn2性能测试

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

会声会影2024新功能及剪辑视频步骤教程

会声会影2024的新功能主要包括&#xff1a; 全新的标题动态与特效&#xff1a;用户可以为文字标题指定进入、中场和退出的不同动态效果&#xff0c;比如闪现进入、中场弹跳和淡出退出等&#xff0c;让文字标题更具动感。此外&#xff0c;还新增了多个标题特效&#xff0c;包括…

开源数据可视化应用程序JSON Crack

什么是 JSON Crack &#xff1f; JSON Crack 是一款免费的开源数据可视化应用程序&#xff0c;能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互式图表。凭借其直观且用户友好的界面&#xff0c;JSON Crack 可以轻松探索、分析和理解即使是最复杂的数据结构。无论您是从事大…

OpenCV 4基础篇| OpenCV简介

目录 1. 什么是OpenCV2. OpenCV的发展历程3. 为什么用OpenCV4. OpenCV应用领域5. OpenCV的功能模块5.1 基本模块5.2 扩展模块5.3 常用函数目录 1. 什么是OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…

CES 2024:NVIDIA 通过新的笔记本电脑、GPU 和工具提供生成式 AI

在 CES 2024 上&#xff0c;NVIDIA 推出了一系列硬件和软件&#xff0c;旨在释放 Windows 11 PC 上生成式 AI 的全部潜力。 在 PC 上本地运行生成式 AI 对于隐私、延迟和成本敏感型应用程序至关重要。在 CES 上&#xff0c;NVIDIA 将在整个技术堆栈中带来新的创新&#xff0c;…

Code Composer Studio (CCS) - Current and Local Revision

Code Composer Studio [CCS] - Current and Local Revision References 鼠标放在文件内的任意位置&#xff0c;鼠标右键 -> Compare With -> Local History -> Revision Time. References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

半导体物理基础-笔记

源内容参考&#xff1a;https://www.bilibili.com/video/BV11U4y1k7zn/?spm_id_from333.337.search-card.all.click&vd_source61654d4a6e8d7941436149dd99026962 半导体物理要解决的四个问题 载流子在哪里&#xff1b;如何获得足够多的载流子&#xff1b;载流子如何运动…

浅析DPDK驱动管理:vhost

文章目录 概述DPDK vhost工作机制DPDK vhost工作模式 DPDK vhost管理结构DPDK vhost接口注册vhost驱动&#xff1a;rte_vhost_driver_register启动vhost&#xff1a;rte_vhost_driver_startvhost消息处理 相关参考 概述 DPDK提供了一套vhost库&#xff0c;用于加速virtio后端&…

EXTI外部中断

&#xff1f; 难点&#xff1a;中断向量表、看门狗、NVIC的优先级位&#xff1f;EXTI框图&#xff1f; ------------------------ 中断系统 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;--->例如&#xff1a;…

Unity设备分级策略

Unity设备分级策略 前言 之前自己做的设备分级策略&#xff0c;在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准&#xff0c;预生成部分已知机型的分级信息&#xff0c;且保存在包内&#xff1b;如果设备没有被评级过&#xff0c;则优…

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(1)发现与明确问题

抱歉&#xff0c;过春节这几天&#xff0c;没有更新。赶紧续上。 人就是这样&#xff0c;放假之前呢&#xff0c;想着趁着这个假期&#xff0c;把很多之前没有做好的事情&#xff0c;都梳理好&#xff0c;该补的也补上&#xff0c;结果一个假期就这样过去了&#xff0c;很多想…

【探索Linux】—— 强大的命令行工具 P.22(POSIX信号量)

阅读导航 引言一、POSIX信号量的基本概念二、信号量的相关操作1 . 初始化信号量sem_init ( )&#xff08;1&#xff09;原型&#xff08;2&#xff09;参数&#xff08;3&#xff09;返回值&#xff08;4&#xff09;示例代码 2 . 等待信号量&#xff08;1&#xff09;sem_wait…

OpenCV库及在ROS中使用

OpenCV库及在ROS中使用 依赖 cv_bridge image_transport roscpp rospy sensor_msgs std_msgsCMakeLists.txt添加 find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(pub_img_topic ${catkin_LIBRARIES} ${Opencv_LIBS}) C …