使用MinIO S3存储桶备份Weaviate


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 提供的强大存储解决方案相结合,用户能够释放其数据的全部潜力。这包括利用语义搜索功能,不仅确保数据的可访问性,而且确保数据在基础层面的安全性。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分享一下,程序员为什么不喜欢关电脑?(个人观点仅供娱乐哈哈哈)

你是否曾经疑惑,为何身边的程序员朋友总是让电脑保持开机状态,仿佛与它们有着不解之缘?别急着给他们贴上“电脑迷”的标签,背后其实隐藏着许多合理的原因。今天,就让我们一同走进程序员的世界,探究他们为何…

My desktop didn‘t come with the Bluetooth.

You didnt turn on the Bluetooth on PC and phone.Turn on it to control your phone. My desktop didnt come with the Bluetooth. 电脑控制手机的时候,电脑蓝牙没打开 电脑蓝牙打开步骤 电脑蓝牙的小图标打开了 手机上可以看到计算机了【Thinkpad-T440p-zwf】 无…

transformer图像切块与还原(window_partition+window_unpartition)

文章目录 前言一、切割图像(window_partition)二、还原图像(window_unpartition)三、整体代码 前言 假如b ,h,w,c(3,32,32,768)需将h w按照14尺寸切割,32/14无法整除,需pad为(3,42,42,768)完成固定尺寸块切割,进而完成transformer结构&#…

java数据结构与算法刷题-----LeetCode150. 逆波兰表达式求值

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 本题也叫后缀表达式,更利于机器处理题目给出的案例都…

Find My资讯|苹果Vision Pro无法通过Find My进行远程定位和发声

苹果 Vision Pro 头显现在已经正式开售,不过根据该公司日前发布的支持文件,这款头显目前缺乏一系列关键查找功能,用户无法在 iCloud 网站或Find My应用中获悉头显的位置,也无法让这款头显远程播放声音。 不过支持文件同时提到 V…

【快速解决】python项目打包成exe文件——vscode软件

目录 操作步骤 1、打开VSCode并打开你的Python项目。 2、在VSCode终端中安装pyinstaller: 3、运行以下命令使用pyinstaller将Python项目打包成exe文件: 其中your_script.py是你的Python脚本的文件名。 4、打包完成后,在你的项目目录中会…

多线程---线程同步,线程通信

线程同步 1.概述 线程同步是多线程编程中的一个重要概念,它指的是在多线程环境中,通过一定的机制保证多个线程按照某种特定的方式正确、有序地执行。这主要是为了避免并发问题,如死锁、竞态条件、资源争用等,确保数据的一致性和完…

Python 基于 AI 动物识别技术的研究与实现,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

hope实验室预备役第三次测试题解

目录 1.选数 2.奇怪的电梯 3.无线通讯网 4. Rotate Colored Subsequence 5.LOWER 6.Error Correction 1.选数 P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 已知 n 个整数 1,2,⋯ ,x1​,x2​,⋯,xn​,以及 1 个整…

VNCTF 2024 Web方向 WP

Checkin 题目描述:Welcome to VNCTF 2024~ long time no see. 开题,是前端小游戏 源码里面发现一个16进制编码字符串 解码后是flag CutePath 题目描述:源自一次现实渗透 开题 当前页面没啥好看的,先爆破密码登录试试。爆破无果…

洗地机什么牌子最好?家用洗地机推荐

如今洗地机已经在家庭中扮演着至关重要的角色,随着人们对居住环境的卫生要求越来越高,洗地机作为结合了吸尘和拖地为一体的清洁工具,不仅可以高效的帮助我们清洁地板,节省时间,还可以为我们节省很多收纳空间。那么&…

typeScript 类型推论

什么是类型推论? 类型推论是 TypeScript 中的一个特性,它允许开发人员不必显式地指定变量的类型。相反,开发人员可以根据变量的使用情况让 TypeScript 编译器自动推断出类型。例如,如果开发人员将一个字符串赋值给一个变量&#…

【力扣白嫖日记】1795.每个产品在不同商店的价格

前言 练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。 今日题目: 1795.每个产品在不同商店的价格 表:Products 列名类型product_idintstore1intstore2intstore3in…

项目中和兄弟部门难以高效协作?你需要注意这四点

在组织架构日益复杂的今天,靠一个人单打独斗完成工作或项目越来越难,也越来越不可能。不知你是否留意过,无论招聘什么岗位,几乎所有企业都在强调“团队合作”。 这里的团队不光指的是同部门协作,要包括公司内部的跨部门…

网络原理 - HTTP/HTTPS(1)

HTTP HTTP是什么 HTTP("全程超文本协议")是一种应用非常广泛的应用层协议. 文本:字符串(能在utf8/gbk)码表上找到合法字符. 超文本:不仅是字符串,还能携带图片啥的(HTML). 富文本:类似于word文档这种. HTTP诞生于1991年.目前已经发展为最主流使用的一种应用层协议.…

不等式的证明之二

不等式的证明之二 证明下述不等式证法一证法二证法二的补充 证明下述不等式 设 a , b , c a,b,c a,b,c 是正实数,请证明下述不等式: 11 a 5 a 6 b 11 b 5 b 6 c 11 c 5 c 6 a ≤ 3 \begin{align} \sqrt{\frac{11a}{5a6b}}\sqrt{\frac{11b}{5b6c}…

centos7如何切换到root用户

在 CentOS 7 中,你可以通过几种方式切换到 root 用户。最常用的方法是使用 su (switch user) 命令或者 sudo 命令。这里是如何使用这些命令的详细说明: 使用 su 命令 打开终端。输入以下命令并按下回车键:su -系统会提示你输入 root 用户的…

云手机在引流方面有什么优势?

对于电商商家而言,无论是在亚马逊还是其他平台,有效的流量来源主要集中在短视频引流和社交电商营销。要在新兴社交平台为企业电商带来更多流量,不可忽视云手机的关键作用和独特优势。 云手机的定义与作用 在经营TikTok、Facebook和INS账号时&…

外汇110:外汇做空是什么意思?如何运作?一文读懂

外汇市场允许卖空,就像众多金融市场一样。但什么是卖空呢?如何外汇做空?在本文中,我们将讨论如何做空货币。什么是外汇做空? 外汇做空(Short Selling)是外汇市场上的一种投资方式。它指的是投资…

Java面向对象案例之设计用户去ATM机存款取款(三)

需求及思路分析 业务代码需求: 某公司要开发“银行管理系统”,请使用面向对象的思想,设计银行的储户信息,描述存款、取款业务。 储户类的思路分析: 属性:用户姓名、密码、身份证号、账号、帐户余额 方法&a…