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

NoneBot2,基于Python的聊天机器人

NoneBot2,基于Python的聊天机器人

  • 第一步,配置python
  • 第二步,配置[go-cqhttp](https://github.com/Mrs4s/go-cqhttp)
  • 第三步,配置[NoneBot](https://61d3d9dbcadf413fd3238e89--nonebot2.netlify.app/)

NoneBot2 是一个现代、跨平台、可扩展的 Python 聊天机器人框架,它基于 Python 的类型注解和异步特性,能够为你的需求实现提供便捷灵活的支持。

NoneBot2 具有丰富的插件生态系统,可以实现多种功能,例如自动回复、天气查询、消息推送等等。此外,它还提供了完善的文档和示例代码,方便用户快速上手和开发自己的插件。

如果你是一名 Python 程序员,想要开发一个聊天机器人,那么 NoneBot2 绝对是你的不二之选。你可以在官方文档中了解更多关于 NoneBot2 的详细信息和使用方法。

首先,你需要明白的是NoneBot2的运行是需要python运行环境来支持,因此我们首先需要配置好python环境;再有,以QQ聊天机器人举例,NoneBot2本身并不包含与QQ服务器通信的底层协议实现,因此无法独立搭建聊天机器人。与 QQ 服务器通信的底层协议实现可以有多种选择,如 CoolQ HTTP API 协议、Mirai 协议、go-cqhttp 协议等。因此,在使用 nonebot 框架搭建 QQ 机器人时,您还需要选择一个底层协议实现来与 QQ 服务器通信,这里我们以go-cqhttp为例

综上所述,如果我们要搭建一个属于自己的QQ机器人,需要进行如下几步:

  1. 要搭建一个安装 Python 是作为 nonebot 运行的基础环境;
  2. 配置 go-cqhttp 是为了实现与 QQ 服务器的通信,并提供 QQ 机器人的服务;
  3. 配置 nonebot 是将 go-cqhttp 和 Python 代码连接起来,实现具体的 QQ 机器人功能。

下面将直接用云服务器进行部署,毕竟如果你要开个机器人肯定是24小时一直服务,因此,这里以腾讯云的Centos为例部署。

第一步,配置python

首先你得先按照Python,需要注意的是,NoneBot 仅支持 Python 3.7.3 以上版本,这里以安装Python3.9.9为例:

由于CentOS7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到。所以我们要额外安装Python3,而且系统一般允许多个版本的python同时存在。

我们先来查看python安装位置,一般是位于/usr/bin/python目录下。

$ which python
>> /usr/bin/python

下面介绍安装Python3的方法:

  1. 安装依赖包(切记安装)

    yum -y groupinstall "Development tools"
    yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
    

    在安装 Python 之前需要安装必要的开发工具和库。

    当您运行第一个命令 yum -y groupinstall development tools 时,它会安装一组常用的开发工具,用于在 Linux 系统上构建软件。这些工具包括编译器、链接器和其他用于构建软件的实用程序。

    接下来的命令 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel 安装 Python 所需的其他开发库。这些库提供了压缩和加密功能、数据库访问支持以及 GUI 工具包(如 Tkinter)等功能。

    通过在安装 Python 之前安装这些工具和库,您可以确保您的系统具备构建和运行 Python 程序所需的所有必要组件。

    同时,补充个小知识点:在 yum 命令中,-y 参数是指定在执行安装或卸载操作时不需要手动确认。如果没有使用 -y 参数,则在安装或卸载软件包时,yum 会提示您确认操作,需要手动输入 y 才能继续执行操作。

    使用 -y 参数可以使 yum 命令在执行操作时自动确认,避免了人工交互的过程,方便自动化脚本和批量操作。但是,使用 -y 参数也需要注意,因为这样可能会导致不必要的安装或卸载,所以在使用时需要谨慎。

  2. 下载Python3安装包
    大家可根据自己需求下载不同版本的Python3,我下载的是Python3.9.9

    wget https://www.python.org/ftp/python/3.9.9/Python-3.9.9.tar.xz
    
  3. 新建python3存放目录

    mkdir /usr/local/python3
    
  4. 安装Python3

    解压压缩包,进入解压目录,指定安装目录,安装Python3。

    tar -xvJf  Python-3.9.9.tar.xz # 该命令将 Python 的源代码文件(压缩文件)解压缩到当前目录中。
    cd Python-3.9.9 # 将当前工作目录更改为 Python 源代码所在的目录,以便在这个目录下执行后续的命令。
    ./configure --prefix=/usr/local/python3 # 运行配置脚本,为 Python 的构建过程设置参数。--prefix 选项指定 Python 的安装目录,这里设置为 /usr/local/python3。这意味着 Python 将被安装到 /usr/local/python3 目录中。
    yum install libffi-devel -y # 这个命令会安装 libffi-devel 开发包,该开发包是 Python 某些模块的依赖项。在安装 Python 的某些版本(如 Python 3.7 及以上版本)时,需要先安装此包。
    make && make install # 这个命令会构建和安装 Python。make 命令编译源代码,并生成可执行文件。make install 命令将编译好的文件安装到指定的目录中(在这里是 /usr/local/python3)。这样,Python 就已经成功安装到了系统中。
    

    在 Python 3.4 及以后的版本中,pip 被包含在了 Python 的安装包中,因此在安装 Python 3.4 及以后的版本时,pip 也会被一同安装。

    如果您使用的是 Python 3.4 及以后的版本,那么在安装完成后,您可以通过在终端中输入 pip 命令来验证 pip 是否已经安装成功。

    对于早期版本的 Python(例如 Python 2.x 系列和 Python 3.3 及以前的版本),pip 并不会自动安装。您需要手动安装 pip。yum -y install python-pipyum -y install python3-pip

  5. 创建软链接

    ln -s /usr/local/python3/bin/python3 /usr/bin/python3
    ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
    

    在 Linux 系统中,通常使用 pythonpip 命令来分别执行 Python 解释器和 pip 包管理器。在您安装了多个版本的 Python 时,可能会出现需要切换 Python 版本的情况。此时,您可以使用软链接来指定默认版本。

    创建软链接的命令是 ln -s 源文件 目标文件,其中 -s 表示创建软链接。在这里,/usr/local/python3/bin/python3 是您要创建软链接的源文件,而 /usr/bin/python3 是软链接的目标文件。这样,当您执行 python3 命令时,实际上会调用 /usr/local/python3/bin/python3 解释器。

    同样,/usr/local/python3/bin/pip3 是源文件,/usr/bin/pip3 是目标文件,执行 pip3 命令时,实际上会调用 /usr/local/python3/bin/pip3 包管理器。

    通过创建软链接,您可以轻松地切换不同版本的 Python,并指定默认版本。但是,需要注意的是,软链接只是一个指向源文件的快捷方式,源文件被删除或移动时,软链接也将失效。

  6. 安装完成,输入python3测试

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myB3jFx3-1678427983272)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a67a6491-bb37-4e64-92ad-72f67be00c5f/Untitled.png)]

    安装成功

第二步,配置go-cqhttp

go-cqhttp 是一个基于 go 语言开发的,轻量、原生跨平台、高效、可扩展的 QQ 机器人框架,支持多种协议和多个 QQ 用户同时连接,可轻松实现 QQ 消息收发、群消息管理、帐号管理、事件处理等功能。

以腾讯云轻量级服务器centos7为例,配置go-cqhttp的流程如下:

  1. 在github上下载最新的版本go-cqhttp,根据你的系统选择下载安装包,这里我们选择arm64 Linux

    系统类型可执行文件压缩文件
    Intel 版 MacosNot availablego-cqhttp_darwin_amd64.tar.gz
    M1 版 MacosNot availablego-cqhttp_darwin_arm64.tar.gz
    32 位 LinuxNot availablego-cqhttp_linux_386.tar.gz
    64 位 LinuxNot availablego-cqhttp_linux_amd64.tar.gz
    arm64 LinuxNot availablego-cqhttp_linux_arm64.tar.gz
    armv7 LinuxNot availablego-cqhttp_linux_armv7.tar.gz
    32 位 Windowsgo-cqhttp_windows_386.exego-cqhttp_windows_386.zip
    64 位 Windowsgo-cqhttp_windows_amd64.exego-cqhttp_windows_amd64.zip
    arm64 Windowsgo-cqhttp_windows_arm64.exego-cqhttp_windows_arm64.zip
    armv7 Windowsgo-cqhttp_windows_armv7.exego-cqhttp_windows_armv7.zip
    wget https://github.com/Mrs4s/go-cqhttp/releases/download/v1.0.0-rc4/go-cqhttp_linux_amd64.tar.gz
    

    (一定要注意你的安装目录)

  2. 解压安装设置并登录机器人QQ

    tar -xzvf go-cqhttp_linux_amd64.tar.gz
    

    解压后cd到解压的目录里执行ssh命令./go-cqhttp,执行这个命令会在当前文件夹下生成几个文件。重点关注config.yml文件,你需要在这个文件中设置QQ(和 QQ密码)

    # go-cqhttp 默认配置文件
    account: # 账号相关uin: # QQ账号password: '' # 密码为空时使用扫码登录encrypt: false  # 是否开启密码加密status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态relogin: # 重连设置delay: 3   # 首次重连延迟, 单位秒interval: 3   # 重连间隔max-times: 0  # 最大重连次数, 0为无限制
    ......
    

    设置好后可以重启go-cqhttp。

  3. 重启后,第一次登录因为异地需要验证,可以选择扫码登录。

    • 如果你的服务器和手机不在同一个局域网内,会提示网络环境复杂

      解决办法:在本地电脑调试成功后,会在go-cqhttp所在的文件夹中生成session.token文件,将session.token文件传到云服务器中go-cqhttp所在的文件夹内即可

    • 提示登录失败: 密码错误或账号被冻结

      解决办法:在运行一次go-cqhttp后,可以发现其文件夹内会生成一个device.json文件,将device.josn中的protocol=5改为protocol=2即可

    这里你可能会出现其他bug,可以访问其GitHub,查看issue,看看有无解决办法。如下:

    https://github.com/Mrs4s/go-cqhttp/issues

  4. 由于我们想要其24小时运营,因此可以给它设置为后台运行,并进行进程守护

    1. 设置后台运行

      nohup ./go-cqhttp
      

      nohup ./go-cqhttp 是一个命令,它的作用是在后台运行 go-cqhttp。

      nohup 是 Linux 系统中一个命令,用于让命令在后台运行,并且忽略掉 Hangup 信号。Hangup 信号通常是在用户退出登录时发送给当前进程的,如果没有使用 nohup 命令,当用户退出登录时,进程也会被关闭。

      ./go-cqhttp 则是一个运行 go-cqhttp 的命令,其中 ./ 表示在当前目录下执行,go-cqhttp 是 go-cqhttp 的可执行文件名。因此,nohup ./go-cqhttp 的作用是在后台运行 go-cqhttp,并且忽略掉 Hangup 信号,这样即使当前用户退出登录,进程也会继续在后台运行。

      需要注意的是,在使用 nohup 命令运行程序时,程序的输出信息将不再显示在终端上,而是保存在当前目录下的 nohup.out 文件中,您可以使用 tail -f nohup.out 命令来实时查看输出信息。

    2. 进程守护:

      pm2 start ./go-cqhttp --name="go-cqhttp" 
      pm2 save 
      pm2 startup
      

      **pm2**是一个用于管理 Node.js 进程的工具,它可以帮助我们轻松地启动、停止、重启和监控 Node.js 进程。在这里,我们使用 **pm2**来启动 go-cqhttp 进程,并将其命名为 go-cqhttp,方便我们后续管理进程。使用 **pm2启动进程后,可以通过 pm2 list命令查看当前运行的进程列表,也可以通过 pm2 stoppm2 restartpm2 delete**命令来停止、重启、删除进程。

  5. 测试

    接下来我们进行http通信测试,首先需要在config.yml配置http通信

    如果你是本地服务器,配置IP地址以及端口号以127.0.0.1:5700为例,运行go-cqhttp。

    • 浏览器访问下面网址,测试使用机器人QQ发送消息给好友

      http://127.0.0.1:5700/send_private_msg?user_id=接收消息的好友QQ号码&message=这里输入发送的信息内容

      执行成功会返回一段响应数据{"data":{"message_id":xxxx},"retcode":0,"status":"ok"} 说明发送成功了

    • 给qq群发送消息测试,成功同样会返回上面一样的数据"status":"ok”

      http://127.0.0.1:5700/send_group_msg?group_id=接收消息QQ群号&message=这里输入发送的信息内容

更多详情内容,请访问go-cqhttp相关文档:https://docs.go-cqhttp.org/

第三步,配置NoneBot

直接进入正题,根据以下步骤进行None Bot的配置:

  1. 下载安装机器人依赖

    使用 pip 或 其他包管理工具 安装 nb-cli,nonebot2 会作为其依赖被一起安装

    python3 -m pip install nb-cli
    

    如果没有安装的话,可以执行下面这段命令安装nonebot2

    python3 -m pip install nonebot2
    
  2. 安装cqhttp适配器

    python3 -m pip install nonebot-adapter-cqhttp
    

    nonebot 是一个基于 Python 的 QQ 机器人开发框架,它本身只提供了一些高级 API 和插件,方便开发者编写 QQ 机器人的功能。但是,与 QQ 服务器通信的底层协议实现是多种多样的,如 go-cqhttp、Mirai、CoolQ 等,这些协议实现之间的 API 不尽相同。因此,开发 QQ 机器人需要先选择一个合适的协议实现,然后再编写对应的适配器,以便将协议实现和 nonebot 框架连接起来,实现 QQ 机器人的功能。

    适配器可以理解为是一个桥梁,它的作用是将底层协议实现和 nonebot 框架连接起来,使它们能够互相通信。在使用 nonebot 框架开发 QQ 机器人时,需要先根据所选的底层协议实现,选择相应的适配器,然后根据适配器提供的 API 编写 QQ 机器人的功能。

    举个例子,如果您选择使用 go-cqhttp 作为底层协议实现,那么您需要安装 go-cqhttp,并选择 go-cqhttp 适配器。这个适配器将 go-cqhttp 和 nonebot 框架连接起来,使得您可以通过 nonebot 框架来编写 QQ 机器人的功能,并且 go-cqhttp 可以帮助您与 QQ 服务器通信。

    因此,在使用 nonebot 框架开发 QQ 机器人时,需要根据所选的底层协议实现,选择相应的适配器,并将其与 nonebot 框架结合使用,以实现 QQ 机器人的功能。

  3. 修改go-cqhttp配置

    修改配置 config.yml文件,找到如下位置,修改地址及端口号,后面nonebot机器人安装要用到的

    ......
    # 反向WS设置- ws-reverse:# 反向WS Universal 地址# 注意 设置了此项地址后下面两项将会被忽略universal: ws://127.0.0.1:53245/cqhttp/ws# 反向WS API 地址api: ws://127.0.0.1:53245/cqhttp/api# 反向WS Event 地址event: ws://127.0.0.1:53245/cqhttp/event
    ......
    
  4. 新建nonebot qq机器人项目

    如果你已经按照推荐方式安装了 nb-cli,使用它创建一个空项目:

    nb create

    根据引导进行项目配置,完成后会在当前目录下创建一个项目目录,项目目录内包含 bot.py

    如果未安装 nb-cli,使用你最熟悉的编辑器或 IDE,创建一个名为 bot.py 的文件,内容如下(这里以 onebot.v11适配器为例):

    import nonebot
    from nonebot.adapters.onebot.v11 import Adapter as ONEBOT_V11Adapternonebot.init()
    app = nonebot.get_asgi()driver = nonebot.get_driver()
    driver.register_adapter(ONEBOT_V11Adapter)nonebot.load_builtin_plugins("echo")
    nonebot.load_from_toml("pyproject.toml")if __name__ == "__main__":nonebot.logger.warning("Always use `nb run` to start the bot instead of manually running!")nonebot.run(app="__mp_main__:app")
    
  5. 继续配置编辑 .env.prod 文件端口,这里的53245就是上面设置的cqhttp端口一致,第四行是超级管理员qq

    DRIVER=~fastapi
    HOST=127.0.0.1  # 配置 NoneBot 监听的 IP/主机名
    PORT=53245  # 配置 NoneBot 监听的端口
    DEBUG=true  # 开启 debug 模式 **请勿在生产环境开启**
    SUPERUSERS=["123456789", "987654321"]  # 配置 NoneBot 超级用户
    NICKNAME=["awesome", "bot"]  # 配置机器人的昵称
    COMMAND_START='["/"]'   # 配置命令起始字符
    

    在命令行使用如下命令即可运行这个 NoneBot 实例:

    # nb-cli
    nb run
    # 其他
    python3 bot.py
    

    运行后会产生类似如下日志:

    09-14 21:02:00 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
    09-14 21:02:00 [INFO] nonebot | Running NoneBot...
    09-14 21:02:00 [INFO] uvicorn | Started server process [1234]
    09-14 21:02:00 [INFO] uvicorn | Waiting for application startup.
    09-14 21:02:00 [INFO] uvicorn | Application startup complete.
    09-14 21:02:00 [INFO] uvicorn | Uvicorn running on http://127.0.0.1:53245 (Press CTRL+C to quit)
    

至此,所有的配置都over了

我们来看一下最终效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MeRI14H8-1678427983275)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d384c2a2-882d-452c-84b3-1bfe17e49279/Untitled.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BFxZ7IWW-1678427983276)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4ec65a12-3b0e-41bb-9a33-a8d0dc776601/Untitled.png)]

声明:本博客为基础学习性质,想要更加深入了解请自行研究官方文档

相关文章:

NoneBot2,基于Python的聊天机器人

NoneBot2,基于Python的聊天机器人第一步,配置python第二步,配置[go-cqhttp](https://github.com/Mrs4s/go-cqhttp)第三步,配置[NoneBot](https://61d3d9dbcadf413fd3238e89--nonebot2.netlify.app/)NoneBot2 是一个现代、跨平台、…...

java反射机制及其详解

反射反射机制反射调用优化有时候我们做项目的时候不免需要用到大量配置文件,就拿框架举例,通过这些外部文件配置,在不修改的源码的情况下,来控制文件,就要用到我们的反射来解决 假设有一个Cat对象 public class Cat …...

Leetcode—环形链表

前言:给定一个链表,判断是否为循环链表并找环形链表的入口点 首先我们需要知道什么是双向循环链表,具体如下图所示。 对于链表,我们如何去判断链表是循环链表呢?又寻找入环点呢?我们可以利用快慢指针的方法…...

蓝牙耳机哪个戴的最舒服?久戴不累的蓝牙耳机推荐

在喧嚣的时代中,快节奏和疲惫充斥着我们的生活,于是耳机成为了人们必不可少的东西,无论是闲暇时亦或是正处在工作时,都会将它戴上,出门在外戴耳机变成了常态,所以小编就整理了一期久戴不累的蓝牙耳机。 No…...

25k的Java开发常问的AQS问题有哪些?

前言:面试高频的AQS问题大多。本文将以实战面试角度出发,将面试官喜欢问的一些问题罗列出来。 文章目录 AQSAQS定义底层实现独占锁举例底层实现独占锁超时获取锁共享锁举例共享锁实现原理作者辟谣AQS AQS定义 AQS的全称是AbstractQueuedSynchronizer,也就是抽象队列同步器…...

Grafana 监控面板绘制流程

本篇作者:IoTDB 社区 -- 张洪胤本文以 IoTDB V1.0.1 版本为例本文档介绍了 Apache IoTDB 监控指标通过 Prometheus 的方式进行采集,并且使用 Grafana 的方式进行可视化。1监控指标的 Prometheus 格式说明对于 Metric Name 为 name, Tags 为 K1V1, ..., K…...

一句话设计模式5:责任链模式

责任链模式:步步为营。 文章目录 责任链模式:步步为营。前言一、责任链模式的作用二、如何实现责任链1 既然是责任链,那么就需要一个链路的承载体 ChainBody2 责任链中每一步都是一个抽象类,因为承载体仅仅是构造链路顺序,里面不放置任何具体业务逻辑:步骤抽象类3 具体步骤执行…...

保姆级使用PyTorch训练与评估自己的EVA网络教程

文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址:https://github.com/Fafa-DL/Awesome-Backbones 操作教程:https://www.bilibili.co…...

Java--JMH--性能测试--测试软件运行效率/时间--StopWatch

写在前面: 很多时候想要测试代码运行时间,或者比较2个运行的效率。 最简单的方法就是Sytem.currentTimeMillis记录2开始和结束时间来算 但是Java 代码越执行越快,放在后面的方法会有优势,这个原因受留个眼,以后研究。大概有受类加…...

JavaScript Array(数组)对象

数组对象的作用是:使用单独的变量名来存储一系列的值。参数参数 size 是期望的数组元素个数。返回的数组,length 字段将被设为 size 的值。参数 element ...; elementn 是参数列表。当使用这些参数来调用构造函数 Array() 时,新创建的数组的元…...

干货 | 电容在电路35个基本常识

第1个电压源正负端接了一个电容,与电路并联,用于整流电路时,具有很好的滤波作用,当电压交变时,由于电容的充电作用,两端的电压不能突变,就保证了电压的平稳。当用于电池电源时,具有交…...

日读300篇文献的技巧

感觉自己看文章很慢,有时候也抓不住重点。 如果是英文文献的话,可能还要有点难度,毕竟英语渣渣还是需要有中文-》英文的转换过程。 最近在搞毕业论文的时候,发现了一个非常好玩的东西,大大提升了我看文章搞科研&#x…...

C++核心编程

一、内存分区模型概述:C程序在执行时,将内存划分为4个区域程序运行前:代码区:存放函数体的二进制代码,由操作系统管理①共享。共享的目的是对于频繁被执行的程序,在内存中只需有一份代码即可②只读。使其只…...

SpringMVC程序开发

目录 SpringMVC 1、MVC定义 2、MVC和SpringMVC之间的关系 学SpringMVC 1、Spring MVC的创建和连接 浏览器获取前端接口和后端程序连接功能实现 2、获取参数 2.1、传递单个参数/多个参数 2.2、传递对象 2.3、传递表单参数 2.4、后端参数重命名 2.5、RequestBody接收J…...

多版本并发控制MVCC

什么是MVCC? MVCC是一种并发控制方法,一般在数据库管理系统中,实现数据库的并发访问。 可以使用乐观锁和悲观锁来实现。 MVCC的作用? 可以在不加锁的情况下解决读写问题,同时还可以解决脏读,幻读&#…...

JavaScript Date(日期)对象

日期对象用于处理日期和时间。在线实例返回当日的日期和时间如何使用 Date() 方法获得当日的日期。getFullYear()使用 getFullYear() 获取年份。getTime()getTime() 返回从 1970 年 1 月 1 日至今的毫秒数。setFullYear()如何使用 setFullYear() 设置具体的日期。toUTCString()…...

【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

🍦🍦写这篇AES文章也是有件趣事,有位小伙伴发了段密文,看看谁解密速度快,学过Python的小伙伴一下子就解开来了,内容也挺有趣的。 🍟🍟原来加解密也可以这么有趣,虽然看起…...

代码随想录【Day34】| 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005. K 次取反后最大化的数组和 题目链接 题目描述: 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。&…...

Java性能调优杀手锏JMH

JMH简介 JMH(Java Microbenchmark Harness)由 OpenJDK/Oracle 里面那群开发了 Java编译器的大牛们所开发,是一个功能强大、灵活的工具,它可以用于检测和评估Java应用程序的性能,主要目的是测量Java应用程序的性能,尤其是在多线程…...

实现excle表上传生成echarts图

代码如下html <!--这是一个网上关于读取Excel最经典的代码--> <!DOCTYPE html> <html><head><meta charset"utf-8"><title>ECharts</title><!-- 引入 echarts.js --><!-- <script src"newjs/js/incubato…...

python代码如何打包

网上的文章对小白都不太友好呀&#xff0c;讲得都比较高大上&#xff0c;本文章就用最简单的方式来教会大家如何打包。既然各位已经学习到了python打包了&#xff0c; 深适度应该跟我查不多。 注意事项&#xff1a; 1. 这个插件只能打包 mac 、win系统运行的文件&#xff0c;也…...

MyBatis学习笔记(十二) —— MyBatis的逆向工程

12、MyBatis的逆向工程 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源&#xff1a; Java实体类Mappe…...

4.Elasticsearch深入了解

4.Elasticsearch深入了解[toc]1.Elasticsearch架构原理Elasticsearch的节点类型在Elasticsearch主要分成两类节点&#xff0c;一类是Master&#xff0c;一类是DataNode。Master节点在Elasticsearch启动时&#xff0c;会选举出来一个Master节点。当某个节点启动后&#xff0c;然…...

【HashSet】| 深度剥析Java SE 源码合集Ⅲ

目录一. &#x1f981; HashSet介绍1.1 特点1.2 底层实现二. &#x1f981; 结构以及对应方法分析2.1 结构组成2.1.1 源码实现2.1.2 成员变量及构造方法2.2 常用的方法2.2.1 添加add(E e)方法2.2.2 删除remove(Object o)方法三. 最后想说一. &#x1f981; HashSet介绍 1.1 特…...

你了解线程的状态转换吗

本文概述: 讲述线程的六种状态. 你可能已经了解了六种状态, 但是你知道 sleep 被唤醒之后, wait ()被 notify 之后进入了什么状态吗? 本文只是开胃小菜, 你看看下一篇文章对你有没有帮助. 一共有六种状态: New 新建状态Runnable 运行状态Blocked 阻塞状态Waiting 等待状态Tim…...

MyBatis-Plus联表查询的短板,该如何解决呢

mybatis-plus作为mybatis的增强工具&#xff0c;它的出现极大的简化了开发中的数据库操作&#xff0c;但是长久以来&#xff0c;它的联表查询能力一直被大家所诟病。一旦遇到left join或right join的左右连接&#xff0c;你还是得老老实实的打开xml文件&#xff0c;手写上一大段…...

吲哚菁绿-巯基,ICG-SH,科研级别试剂,吲哚菁绿可用于测定心输出量、肝脏功能、肝血流量,和对于眼科血管造影术。

ICG-THIOL,吲哚菁绿-巯基 中文名称&#xff1a;吲哚菁绿-巯基 英文名称&#xff1a;ICG-THIOL 英文别名&#xff1a;ICG-SH 性状&#xff1a;绿色粉末 溶剂&#xff1a;溶于二氯甲烷等其他常规有机溶剂 稳定性&#xff1a;冷藏保存&#xff0c;避免反复冻融。 存储条件&…...

深度剖析JavaOptional类

Java Optional 类 Optional类在 Java 8中被加了进来,提供了一种处理业务逻辑想要的值可能没有出现(null)也可能出现的情况,可能直到目前,我们还是用null 来表示业务值不存在的情况,但是这可能导致空指针异常,Java 8新添加 Optional类可以从一定程度上来解决这个问题。 O…...

平面设计软件Corel CDR2023又开始放大招啦,CorelDRAW Graphics Suite 2023有哪些新增功能?

CorelDRAW 2023中文版即将于2023年3月14日&#xff0c;在苏州举行线上直播的2023新品发布会&#xff0c;本次发布会主题为“设计新生力&#xff0c;矢量新未来”。 发布会邀请思杰马克丁公司领导、Corel 中国区总经理分享思杰与 Corel 的合作模式及在 CorelDRAW 产品上推动历程…...

初学torch【报错:expected scalar type double but found float、rmse】

目录 一、inout 二、expected scalar type double but found float 报错 三、pytorch中回归评价rmse&#xff1a; 一、inout torch网络训练&#xff0c;输入需要转换为tensor格式&#xff1a; import torch import numpy A torch.arange(12, dtypetorch.float32).reshape((…...

金三银四、金九银十 面试宝典 JAVASE八股文面试题 超级无敌全的面试题汇总(接近3万字的面试题,让你的JAVA语法基础无可挑剔)

JavaSE八股文 - 面试宝典 一个合格的 计算机打工人 &#xff0c;收藏夹里必须有一份 JAVA八股文面试题 &#xff0c;特别是即将找工作的计算机人&#xff0c;希望本篇博客对你有帮助&#xff01; 本文参考了诸多大佬的面试题帖子&#xff0c;ps&#xff1a;白大锅、哪吒、英雄…...

数据结构:链式二叉树初阶

目录 一.链式二叉树的逻辑结构 1.链式二叉树的结点结构体定义 2.链式二叉树逻辑结构 二.链式二叉树的遍历算法 1.前序遍历 2.中序遍历 3.后序遍历 4.层序遍历(二叉树非递归遍历算法) 层序遍历概念: 层序遍历算法实现思路: 层序遍历代码实现: 三.链式二叉树遍历算…...

公式编写1000问9-12

9.问: 买入&#xff1a;日线创100日新高 ,周线(5周&#xff09;BIAS>10 卖出&#xff1a;2日收盘在30线下方 注&#xff1a;买卖都只要单一信号即可&#xff0c;不要连续给出信号 我今天才开始学习编写&#xff0c;可是没有买入信号&#xff0c;不知道哪错了&#xff1f; B1…...

C++11:类的新功能和可变参数模板

文章目录1. 新增默认成员函数1.1 功能1.2 示例2. 类成员变量初始化3. 新关键字3.1 关键字default3.2 关键字delete补充3.3 关键字final和override4. 可变参数模板4.1 介绍4.2 定义方式4.3 展开参数包递归展开参数包优化初始化列表展开参数包逗号表达式展开参数包补充5. emplace…...

【Java学习笔记】15.Java 日期时间(1)

Java 日期时间 java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。 第一个构造函数使用当前日期和时间来初始化对象。 Date( )第二个构造函数接收一个参数&#xff0c;该参数是从 1970 年 1 月 1 日起的毫秒数。 Date(long …...

在ROS2中,通过MoveIt2控制Gazebo中的自定义机械手

目前的空余时间主要都在研究ROS2&#xff0c;最终目的是控制自己用舵机组装的机械手。 由于种种原因&#xff0c;先控制Gazebo的自定义机械手。 先看看目前的成果 左侧是rviz2中的moveit组件的机械手&#xff0c;右侧是gazebo中的机械手。在moveit中进行路径规划并执行后&#…...

Java-线程池 原子性 类

Java-线程池 原子性 类线程池构造方法调用Executors静态方法创建调用方法直接创建线程池对象原子性volatile-问题出现原因:volatile解决原子性AtomicInteger的常用方法悲观锁和乐观锁synchronized(悲)和CAS(乐)的区别并发工具类Hashtable集合ConcurrentHashMap原理:CountDownLa…...

力扣sql简单篇练习(二十五)

力扣sql简单篇练习(二十五) 1 无效的推文 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT tweet_id FROM Tweets WHERE CHAR_LENGTH(content)>151.3 运行截图 2 求关注者的数量 2.1 基本题目内…...

计算机网络:OSPF协议和链路状态算法

OSPF协议 开放最短路经优先OSPF协议是基于最短路径算法SPF,其主要特征就是使用分布式的链路状态协议OSPF协议的特点&#xff1a; 1.使用泛洪法向自治系统中的所有路由器发送信息&#xff0c;即路由器通过输出端口向所有相邻的路由器发送信息&#xff0c;而每一个相邻的路由器又…...

利用表驱动法+策略模式优化switch-case

1.前言 我有一个需求&#xff1a;有四个系统需要处理字段&#xff0c;一开始利用switch-case进行区分编码&#xff0c;后期字段处理越来越多&#xff0c;导致switch-case代码冗余&#xff0c;不太好&#xff0c;然后想通过java单继承多实现的性质进行优化。 2.实现 2.1定义S…...

SpringBoot创建和使用

目录 什么是SpringBoot SpringBoot的优点 SpringBoot项目的创建 1、使用idea创建 2、项目目录介绍和运行 Spring Boot配置文件 1、配置文件 2、配置文件的格式 3、properties 3.1、properties基本语法 3.2、读取配置文件 3.3、缺点 4、yml 4.1、优点 4.2、yml基本…...

which、whereis、locate文件查找命令

Linux下查找文件的命令有which、whereis、locate和find&#xff0c;find命令因要遍历文件系统&#xff0c;导致速度较慢&#xff0c;而且还会影响系统性能&#xff0c;而且命令选项较多&#xff0c;就单独放一篇介绍&#xff0c;可参见find命令——根据路径和条件搜索指定文件_…...

Uipath Excel 自动化系列14-SaveExcelFile(保存Excel)

活动描述 SaveExcelFile 保存Excel:保存工作簿&#xff0c;在修改 Excel 文件的用户界面自动化活动之后使用此活动&#xff0c;以保存对文件的更改 SaveExcelFile As 另存Excel : 将workbook 另存为文件 SaveExcelFile As PDF &#xff1a;将Excel 另存为PDF文件。该三个活…...

MyBatis学习

MyBatis优点 轻量级&#xff0c;性能出色 SQL 和 Java 编码分开&#xff0c;功能边界清晰。Java代码专注业务、SQL语句专注数据 开发效率稍逊于HIbernate&#xff0c;但是完全能够接受 补充&#xff1a;POJO 一&#xff1a;什么是POJO POJO的名称有多种&#xff0c;pure old…...

高速PCB设计指南系列(二)

第三篇 高速PCB设计 &#xff08;一&#xff09;、电子系统设计所面临的挑战   随着系统设计复杂性和集成度的大规模提高&#xff0c;电子系统设计师们正在从事100MHZ以上的电路设计&#xff0c;总线的工作频率也已经达到或者超过50MHZ&#xff0c;有的甚至超过100MHZ。目前…...

uniapp项目打包上线流程

平台&#xff1a;h5小程序app &#xff08;安卓&#xff09;小程序打包上线流程第一步&#xff1a;登录小程序公众平台第二步&#xff1a;hbuilderx打包小程序1.在mainfest.json文件中进行相关配置2.需要将项目中的网络请求改为https协议做为生产环境&#xff08;配置项目的环境…...

垃圾回收:垃圾数据如何自动回收

有些数据被使用之后&#xff0c;可能就不再需要了&#xff0c;我们把这种数据称为垃圾数据。如果这些垃圾数据一直保存在内存中&#xff0c;那么内存会越用越多&#xff0c;所以我们需要对这些垃圾数据进行回收&#xff0c;以释放有限的内存空间 不同语言的垃圾回收策略 通常…...

苹果笔不用原装可以吗?Apple Pencil平替笔推荐

近些年来&#xff0c;不管是学习还是画画&#xff0c;都有不少人喜欢用ipad。而ipad的用户&#xff0c;也是比较重视它的实用价值&#xff0c;尤其是不少人都想要好好利用来进行学习记笔记。事实上&#xff0c;有很多替代品都能替代Apple Pencil&#xff0c;仅仅用于记笔记就没…...

uniCloud基础使用-杂文

获取openID云函数use strict; exports.main async (event, context) > {//event为客户端上传的参数console.log(event : , event)// jscode2session 微信小程序登录接口&#xff0c;获取openidconst {code} event;// 云函数中如需要请求其他http服务&#xff0c;则使用uni…...

vector的模拟实现

文章目录vector的模拟实现vector 结构定义1. vector的迭代器的实现2. vector四个默认成员函数2.1 构造函数2.1.1 无参2.1.2 n个val初始化2.1.3 迭代器初始化2.2 析构函数2.3 拷贝构造函数2.3.1 传统写法2.3.2 现代写法2.4 赋值重载运算符3. 管理数组相关接口3.1 reserve3.2 res…...