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

以报时机器人为例详细介绍tracker_store和event_broker

  报时机器人源码参考[1][2],本文重点介绍当 tracker_store 类型为 SQL 时,events 表的表结构以及数据是如何生成的。以及当 event_broker 类型为 SQL 时,events 表的表结构以及数据是如何生成的。

一.报时机器人启动 [3]

  Rasa 对话系统启动方式详见参考文献[3]中执行程序部分,这里不再赘述。如下所示:

1.加载模型:rasa run --cors "*"

2.运行 action server:rasa run actions

3.运行 Web 页面:python -m http.server 8080


二.(tracker_store)endpoints.yml 和 events 表结构

  使用 mysql 数据库来存储对话,使用 MySQL 新建 db 为 rasa_tracker_store,其中字符集和排序规则分别为 utf8mb4 – UTF-8 Unicode 和 utf8mb4_0900_ai_ci。

1.endpoints.yml 配置文件

tracker_store:type: SQLdialect: "mysql+pymysql"url: "localhost"  # your mysql hostdb: "rasa_tracker_store"  # name of the mysql databaseusername: "root"  # username to access the databasepassword: "root"  # password to access the database

2.新建数据库 rasa_tracker_store

3.events 表结构

(1)id:主键 id

(2)sender_id:发送者 id

(3)type_name:event 的类型名字

(4)timestamp:时间戳

(5)intent_name:意图名字

(6)action_name:action 名字

(7)data:数据

4.events 表数据内容

  以用户问:“今天星期几”,机器答:"星期三"为例子展开介绍。

  生成的 rasa_tracker_store.events 数据表内容,如下所示:

(1)id:主键 id。

  这个自增主键就不用多说了。

(2)sender_id:发送者 id。

  比如,oCMNVZ44YCbHIcFYAAAB。这个数据是如何来的?生成的规则是什么呢?

sender_id 是在 SQLTrackerStore 类中的 SQLEvent 子类中初始化的。SQLEvent 子类是 SQLAlchemy 的一部分,用于在数据库中创建一个表。在这个表中,sender_id 是一个字段,它的类型是字符串(最大长度为 255),并且它被设置为非空(nullable=False),并且为其创建了索引(index=True)。这意味着在数据库中,sender_id 字段不能为 null,并且可以被快速查找。

  sender_id 是在创建 DialogueStateTracker 对象时传入的一个参数,它通常用于标识对话的发送者。在 Rasa 中,每个对话都有一个唯一的 sender_id,这样可以区分不同的用户会话。在 from_events 类方法中,sender_id 是作为第一个参数传入的。这个方法用于从一系列事件中创建一个 DialogueStateTracker 对象。这些事件会被应用到新的跟踪器上,以重建其状态。生成 sender_id 的具体规则取决于你的应用,当客户端是 Rasa Shell、Rasa X、HTTP API 等的时候,都不相同。由于本次使用的是 Socket 方式,可以顺藤摸瓜去找 sender_id 的具体生成规则,这里不再细节展开。rasa/core/channels/socketio.py 如下所示:

(3)type_name:event 的类型名字。

  比如,action、session_started、user、slot、user_featurization、bot。这个数据是什么?除了这个数据还有其它的类型名字吗?(列出全部)。rasa/shared/core/events.py 如下所示:

序号事件类事件类型名字备注
1Event(ABC)类“event”描述对话中的事件以及它们如何影响对话状态。用户与助手进行对话期间发生的所有事情的不可变表示。告诉 rasa.shared.core.trackers.DialogueStateTracker 如何在事件发生时更新其状态。
2UserUttered(Event)“user”用户对机器人说了些什么。作为副作用,将在 Tracker 中创建一个新的 Turn
3DefinePrevUserUtteredFeaturization(SkipEventInMDStoryMixin)“user_featurization”存储 action 是基于文本还是意图预测的信息。
4EntitiesAdded(SkipEventInMDStoryMixin)“entities”用于将提取的实体添加到 tracker 状态的事件。
5BotUttered(SkipEventInMDStoryMixin)“bot”机器人对用户说了些什么。此类在故事训练中不使用,因为它包含在 ActionExecuted 类中。在 Tracker 中进行了记录。
6SlotSet(Event)“slot”用户已指定其对 slot 值的偏好。每个 slot 都有一个名称和一个值。此事件可用于在对话中设置 slot 的值。作为副作用,Tracker 的插槽将被更新,以便 tracker.slots[key]=value。
7Restarted(AlwaysEqualEventMixin)“restart”对话应该重新开始,历史记录被擦除。与删除所有事件不同,可以使用此事件来重置跟踪器状态(例如,忽略任何过去的用户消息并重置所有插槽)。
8UserUtteranceReverted(AlwaysEqualEventMixin)“rewind”机器人会撤消最近的用户消息之前的所有内容。机器人将撤消最新的 UserUttered 之后的所有事件,这也意味着跟踪器上的最后一个事件通常是 action_listen,机器人正在等待新的用户消息。
9AllSlotsReset(AlwaysEqualEventMixin)“reset_slots”所有插槽都重置为其初始值。如果要保留对话历史记录并仅重置插槽,则可以使用此事件将所有插槽设置为其初始值。
10ReminderScheduled(Event)“reminder”在给定时间安排异步触发用户意图。如果需要,触发的意图可以包括实体。
11ReminderCancelled(Event)“cancel_reminder”取消某些工作。
12ActionReverted(AlwaysEqualEventMixin)“undo”机器人撤消了最后的操作。机器人会撤消最近的操作之前的所有内容。这包括操作本身以及操作创建的任何事件,例如设置插槽事件-机器人现在将使用最近操作之前的状态来预测新操作。
13StoryExported(Event)“export”故事应该转储到文件。
14FollowupAction(Event)“followup”排队后续操作。
15ConversationPaused(AlwaysEqualEventMixin)“pause”忽略用户的消息,让人类接管。作为副作用,Tracker 的 paused 属性将被设置为 True
16ConversationResumed(AlwaysEqualEventMixin)“resume”机器人接管对话。PauseConversation 的反义词。作为副作用,Tracker 的 paused 属性将被设置为 False
17ActionExecuted(Event)“action”操作描述了执行的操作 + 其结果。它包括一个操作和一个事件列表。操作将附加到 Tracker.turns 中的最新 Turn
18AgentUttered(SkipEventInMDStoryMixin)“agent”agent 对用户说了些什么。由于它包含在 ActionExecuted 类中,因此此类在故事训练中不使用。在 Tracker 中进行了条目。
19ActiveLoop(Event)“active_loop”如果给出了 name:使用 name 激活循环,否则停用活动循环。
20LegacyForm(ActiveLoop)“form”Form 事件的旧版处理程序。ActiveLoop 事件曾被称为 Form。这个类是为了处理旧的遗留事件,这些事件是使用旧的类型名称 form 存储的。
21LoopInterrupted(SkipEventInMDStoryMixin)“loop_interrupted”FormPolicy 和 RulePolicy 添加的事件。通知表单操作是否验证用户输入。
22LegacyFormValidation(LoopInterrupted)“form_validation”FormValidation 事件的旧版处理程序。LoopInterrupted 事件曾被称为 FormValidation。这个类是为了处理旧的遗留事件,这些事件是使用旧的类型名称 form_validation 存储的。
23ActionExecutionRejected(SkipEventInMDStoryMixin)“action_execution_rejected”通知 Core 操作的执行已被拒绝。
24SessionStarted(AlwaysEqualEventMixin)“session_started”标记新会话会话的开始。

(4)timestamp:Unix 时间戳。

  比如,1704300000,转换后的日期时间:2024-01-03 16:40:00。Unix 时间戳是指从 1970 年 1 月 1 日 00:00:00UTC(协调世界时)开始的秒数。

from datetime import datetimetimestamp = 1704300000
date_object = datetime.utcfromtimestamp(timestamp)print("转换后的日期时间:", date_object)

(5)intent_name:意图名字

  比如,query_weekday。报时机器人总共的意图包括 greet、goodbye、query_time、query_date、query_weekday。对应的例子如下所示:

version: "3.0"
nlu:- intent: greetexamples: |- 你好- 您好- hello- hi- 喂- 在么- intent: goodbyeexamples: |- 拜拜- 再见- 拜- 退出- 结束- intent: query_timeexamples: |- 现在几点了- 什么时候了- 几点了- 现在什么时候了- 现在的时间- intent: query_dateexamples: |- [今天](date)几号- [今天](date)是几号- [昨天](date)几号- [明天](date)几号- [今天](date)的日期- [今天](date)几号了- [明天](date)的日期- 几号- intent: query_weekdayexamples: |- [今天](date)星期几- [明天](date)星期几- [昨天](date)星期几- [今天](date)是星期几- 星期几

(6)action_name:action 名字

  比如,action_session_start(会话开始)、action_listen(机器人处于监听状态,机器人每次回答完毕后都会处于监听状态)、date(日期实体)、action_query_weekday(自定义 action)。除此之外,还有哪些 action_name 呢?(列出全部)。rasa/core/actions/action.py 如下所示:

序号动作类动作名字备注
1ActionNotImplementedError响应对话状态的下一个操作。
2ActionBotResponse(Action)——一个动作,其唯一效果是在运行时发出响应。
3ActionEndToEndResponse(Action)——动作以端到端响应向用户发出响应。
4ActionRetrieveResponse(ActionBotResponse)——查询响应选择器以获取适当的响应的操作。
5ActionBack(ActionBotResponse)“action_back”将跟踪器状态恢复两个用户话语。
6ActionListen(Action)“action_listen”任何回合中的第一个动作-机器人等待用户消息。机器人应停止采取进一步的操作,并等待用户说些什么。
7ActionRestart(ActionBotResponse)“action_restart”将跟踪器重置为其初始状态。如果可用,则发出重启响应。
8ActionSessionStart(Action)“action_session_start”应用一个对话会话开始,将上一个会话中的所有 SlotSet 事件应用于新会话。
9ActionDefaultFallback(ActionBotResponse)“action_default_fallback”执行回退操作并返回对话的上一个状态。
10ActionDeactivateLoop(Action)“action_deactivate_loop”停用活动循环。
11RemoteAction(Action)————
12ActionRevertFallbackEvents(Action)“action_revert_fallback_events”撤消 TwoStageFallbackPolicy 期间完成的事件。这将撤消在 TwoStageFallbackPolicy 的回退期间完成的用户消息和机器人话语。通过这样做,不需要为不同的路径编写自定义故事,而只需要编写快乐的路径。这已被弃用,一旦删除 TwoStageFallbackPolicy,就可以删除它。
13ActionUnlikelyIntent(Action)“action_unlikely_intent”一个动作,指示 NLU 预测的意图是意外的。此操作可以由 UnexpecTEDIntentPolicy 预测。
14ActionDefaultAskAffirmation(Action)“action_default_ask_affirmation”默认实现,询问用户确认他的意图。建议使用自定义操作覆盖此默认操作,以获得更有意义的确认提示。例如。具有意图的描述而不是其标识符名称。
15ActionDefaultAskRephrase(ActionBotResponse)“action_default_ask_rephrase”默认实现,询问用户重新表达他的意图。
16ActionSendText(Action)“action_send_text”向输出通道发送文本消息。
17ActionExtractSlots(Action)“action_extract_slots”每个用户回合后自动运行的默认操作。在下一个预测的操作运行之前,在 MessageProcessor.handle_message(…)中自动执行操作。根据分配的槽映射将插槽设置为从用户消息中提取的值。
18ACTION_TWO_STAGE_FALLBACK_NAME“action_two_stage_fallback”——
19ACTION_VALIDATE_SLOT_MAPPINGS“action_validate_slot_mappings”——
20RULE_SNIPPET_ACTION_NAME“…”——

(7)data:数据

  取出一条 data 数据字段进行 json 显示,如下所示:

{"event": "action","timestamp": 1704297163.3703225,"metadata": {"model_id": "4ca8c86f1301497f9488c47c860f39fd","assistant_id": "20240103-232935-excited-category"},"name": "action_session_start","policy": null,"confidence": 1.0,"action_text": null,"hide_rule_turn": false
}
  • event:事件的名字。(列出全部)
  • timestamp:时间戳。
  • metadata-model_id:模型 id。这个并不是模型的名字,比如训练的报时机器人模型为 20240103-233232-windy-borzoi.tar.gz
  • metadata-assistant_id:这个是 config.yml 文件中定义的 assistant_id: 20240103-232935-excited-category
  • name:action 的名字。
  • policy:使用的策略。
  • confidence:置信度。
  • action_text:动作文本,即端到端机器人响应的文本。
  • hide_rule_turn:是否隐藏规则回合。

  上述字段大都来自于 ACTION_EXECUTED(rasa/shared/utils/schemas/events.py),ACTION_EXECUTED 是一个字典,它定义了 Rasa 中 “action” 事件的 JSON schema。这个 schema 描述了 “action” 事件的数据结构,包括它的属性和这些属性的类型。如下所示:

ACTION_EXECUTED = {"properties": {"event": {"const": "action"},"policy": {"type": ["string", "null"]},"confidence": {"type": ["number", "null"]},"name": {"type": ["string", "null"]},"hide_rule_turn": {"type": "boolean"},"action_text": {"type": ["string", "null"]},}
}

  在 ACTION_EXECUTED schema 中,相关属性解释如下所示:

  • event: 这是一个常量,值为 “action”,表示这是一个 “action” 事件。
  • policy: 这是一个字符串,表示执行这个动作的策略的名称。它也可以为 null。
  • confidence: 这是一个数字,表示执行这个动作的策略的置信度。它也可以为 null。
  • name: 这是一个字符串,表示执行的动作的名称。它也可以为 null。
  • hide_rule_turn: 这是一个布尔值,表示是否隐藏规则回合。
  • action_text: 这是一个字符串,表示动作的文本。它也可以为 null。

  这个 schema 用于验证 “action” 事件的数据是否符合预期的格式。如果一个 “action” 事件的数据不符合这个 schema,那么在处理这个事件时,Rasa 将会抛出一个错误。

5.action 和 event 间的关系

  在 Rasa 中,动作(action)和事件(event)是两个不同但相关的概念。如下所示:

(1)action

  动作是在对话中执行的一些操作,例如向用户发送消息、调用外部服务、或者进行自定义的计算。在 Rasa 中,动作通常与对话策略相关联,用于决定在特定的对话状态下应该执行哪个动作。动作由自定义的动作类或内置的动作类实现,它们被定义为继承自 Action 类。

(2)event

  事件是对话中的状态更改的表示,例如用户的输入、机器人的响应、槽位的更新等。在 Rasa 中,对话的历史记录是一系列事件的集合。事件被用于跟踪对话的状态,对话管理器使用事件来更新对话状态。不同的事件类型表示不同的对话动作和状态变化。

(3)两者关系

  • 当动作执行时,通常会生成一个或多个事件,这些事件描述了对话状态的变化。
  • 每个对话轮次中都会有一系列事件,包括用户的输入事件(例如 UserUttered)、动作执行事件(例如 ActionExecuted)、槽位更新事件(例如 SlotSet)、机器人响应事件(例如 BotUttered)等。

  在对话中,动作和事件密切相互关联。动作执行时会触发事件,这些事件进而影响对话状态的演进。一般来说,对话的历史记录中的事件序列描述了对话的全貌,对话管理器利用这些事件来进行决策。

三.(event_broker)endpoints.yml 和 events 表结构

1.endpoints.yml 配置文件

  使用 mysql 数据库来消息队列,如下所示:

event_broker:type: SQLurl: "localhost"port: 3306dialect: "mysql+pymysql"username: "root"password: "root"db: "rasa_event_broker"

2.新建数据库 rasa_tracker_store

  创建数据库方式与 rasa_tracker_store 相同,这里不再赘述。

3.events 表结构

  生成的 rasa_event_broker.events 数据表内容,如下所示:

(1)id:主键 id

(2)sender_id:发送者 id

(3)data:数据

4.events 表数据内容

  取出一条 data 数据字段进行 json 显示,如下所示:

{"sender_id": "oCMNVZ44YCbHIcFYAAAB","event": "action","timestamp": 1704297163.3703225,"metadata": {"model_id": "4ca8c86f1301497f9488c47c860f39fd","assistant_id": "20240103-232935-excited-category"},"name": "action_session_start","policy": null,"confidence": 1.0,"action_text": null,"hide_rule_turn": false
}

  发现 event_broker.events.data 和 tracker_store.events.data 相比,除了多一个 sender_id 字段,其它的都是一样的。跟踪源码发现,如下所示:

  执行顺序是先发布新的 tracker 事件集合到 event_broker,然后逐一遍历 event,并将其存储到 tracker_store.event 表中。

四.EventBroker 类和 SQLEventBroker(EventBroker)类

1.EventBroker 类

2.SQLEventBroker(EventBroker)类

  SQLEventBroker(EventBroker)类有个内部类 SQLBrokerEvent(Base),定义了 events 的 3 个字段,分别为 id、sender_id 和 data。剩下的基本是对 EventBroker 基类中方法的具体实现。rasa/core/brokers/sql.py 如下所示:



五.TrackerStore 类和 SQLTrackerStore 类

1.TrackerStore 类

  表示所有 TrackerStore 的公共行为和接口,如下所示:

2.SQLTrackerStore 类

  对 TrackerStore 基类的实现,包括 InMemoryTrackerStore、RedisTrackerStore、DynamoTrackerStore、MongoTrackerStore、SQLTrackerStore。SQLTrackerStore(TrackerStore, SerializedTrackerAsText)类有个内部类 SQLEvent(Base),定义了 events 的 7 个字段,分别为 id、sender_id、type_name、timestamp、intent_name、action_name 和 data。剩下的基本是对 TrackerStore 基类中方法的具体实现。rasa/core/tracker_store.py 如下所示:



参考文献

[1] rasa-v2024010701(报时机器人)源码:https://github.com/ai408/nlp-engineering/tree/main/知识工程-对话系统/公众号代码/rasa-v2024010701

[2] 报时机器人的 rasa shell 执行流程分析:https://z0yrmerhgi8.feishu.cn/wiki/CvASwk5SmiYkCXkqONycSxVfnJg

[3] 打通 Rasa Action Server 和 LLM 接口的尝试方法:https://z0yrmerhgi8.feishu.cn/wiki/UQa0wQBeJi6K7oknz2wcaSTnnNb

[4] 以报时机器人为例详细介绍tracker_store和event_broker:https://z0yrmerhgi8.feishu.cn/wiki/SQSGwzYR7iKSNukQDKicz1Vqnvg

相关文章:

以报时机器人为例详细介绍tracker_store和event_broker

报时机器人源码参考[1][2],本文重点介绍当 tracker_store 类型为 SQL 时,events 表的表结构以及数据是如何生成的。以及当 event_broker 类型为 SQL 时,events 表的表结构以及数据是如何生成的。 一.报时机器人启动 [3] Rasa 对话系统启动方…...

理解JavaScript事件循环机制

JavaScript作为前端开发的核心语言之一,其事件循环机制是实现异步编程的关键。本文将深入探讨JavaScript事件循环机制,帮助您更好地理解它是如何工作的,以及如何在前端开发中充分利用这一机制。 1. 什么是事件循环? JavaScript是…...

自定义View之重写onMeasure

一、重写onMeasure()来修改已有的View的尺寸 步骤: 重写 onMeasure(),并调用 super.onMeasure() 触发原先的测量用 getMeasuredWidth() 和 getMeasuredHeight() 取到之前测得的尺寸,利用这两个尺寸来计算出最终尺寸使用 setMeasuredDimensio…...

专为Mac用户设计的思维导图软件MindNode 2023 for Mac助您激发创意!

在现代快节奏的生活中,我们经常需要整理思绪、规划项目、记录灵感。而思维导图作为一种高效的思维工具,能够帮助我们更好地整理和展现思维。现在,我们介绍一款强大而直观的思维导图软件——MindNode 2023 for Mac,助您拓展思维边界…...

Linux命令——用户和权限相关

文章目录 1 用户管理1.1 用户标识符1.2 用户添加1.3 用户删除1.4 用户配置文件1.4.1 passwd文件1.4.2 shadow文件1.4.3 group文件 2 密码管理3 权限管理 1 用户管理 1.1 用户标识符 用户标识符主要是UID和GID,UID表示用户id,GID表示用户组id。在登录的…...

linux反汇编工具: ida pro、rizinorg/cutter; ubuntu 22 flameshot延迟截图 以应对下拉菜单

rizinorg/cutter rizinorg/cutter 是 命令行反汇编工具 rizinorg/rizin 的图形化界面, 这比 ida pro跑在kvm虚拟机中方便多了, ubuntu22.04下直接下载Cutter-v2.3.2-Linux-x86_64.AppImage后即可运行,如下图: 注意 有个同名的报废品: radare2/Cutter 即 radare2的图形化界…...

【INTEL(ALTERA)】使用NiosV/m 处理器,niosv-download 为什么会失败?

说明 在英特尔 Quartus Prime Pro Edition 软件 23.3 版及更高版本中将 Nios V 处理器软件下载到非流水线Nios V/m 处理器时,可能会出现此问题。 这是由于处理器限制,仅影响非流水线Nios V/m 处理器。 以下其他处理器不受此限制的影响: 管道…...

【无线通信专题】NFC通信模式及可能的应用方式

在文章【无线通信专题】NFC基本原理中我们讲到了NFC工作模式。其中NFC工作模式主要有三种,读写模式、卡模拟模式、点对点模式。 NFC通信模式丰富,NFC Forum定义了三种NFC设备:通用NFCForum设备、读写器设备和标签设备。这些NFC设备可以在三种通信模式下运行,并对应用案例进…...

pyinstaller生成的exe文件启动时间漫长的原因

加-F慢的原因是,pyinstaller把所有资源文件包括python解释器的依赖文件和库都打包到exe一个文件中,用户打开时,pyinstaller需要先执行一边解压操作,把依赖文件全部解压出来。慢就慢在这里。 如果不加-F,你会发现那些文…...

C语言基本语句介绍

c程序的执行部分是由语句组成的。程序的功能也是由执行语句来实现的,c语句分为6类 1表达式语句 表达式语句由表达式加上分号“;”组成 一般形式:表达式; 2函数调用语句 由函数名,实际参数加上分号“;”…...

【QT】QString类型中,Empty和NULL有什么区别在qt里,对比C#

在 Qt 中,QString 类型的字符串使用 isEmpty() 方法来检查字符串是否为空,而不是使用 null。这与 C# 中的 string.IsNullOrEmpty 方法略有不同。 QString::isEmpty(): 用于检查字符串是否为空。一个 QString 对象可能是空字符串,即…...

破壳而出:运维工程师在新科技热潮下的崛起与转型

运维工程师的出路到底在哪里? 在这个飞速发展的数字世界里,运维工程师无疑是IT界冲在最前线的勇士。他们曾是服务器的守护者,他们曾是故障的消灭者,他们曾是性能的推手。然而,随着科技的发展和市场需求的变化&#xf…...

静态网页设计——贵州美食(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1vC4y1K7de/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS(…...

imgaug库指南(六):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…...

stable diffusion 人物高级提示词(五)场景、特效、拍摄手法、风格

一、场景 场景Promptindoor室内outdoor室外cityscape城市景色countryside乡村beach海滩forest森林mountain山脉snowfield雪原skyscraper摩天大楼ancient monument古代遗迹cathedral大教堂library图书馆museum博物馆office building办公大楼restaurant餐厅street market街头市场…...

智能分析网关V4智慧港口码头可视化视频智能监管方案

一、需求背景 近年来,水利港口码头正在进行智能化建设,现场管理已经是重中之重。港口作为货物、集装箱堆放及中转机构,具有昼夜不歇、天气多变、环境恶劣等特性,安全保卫工作显得更加重要。港口码头的巡检现场如何高效、快捷地对…...

docker部署kibana

1,简介 官网 kibana 2,安装docker 参考 linux安装docker 3,准备 Kibana 配置文件 # 进入主节点配置文件目录 cd /export/server/docker/kibana/config # 编辑单机版配置文件 vi kibana.ymlkibana.yml内容 # 主机地址,可以是…...

【AI视野·今日CV 计算机视觉论文速览 第283期】Thu, 4 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Thu, 4 Jan 2024 Totally 85 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers LEAP-VO: Long-term Effective Any Point Tracking for Visual Odometry Authors Weirong Chen, Le Chen, Rui Wang, Marc P…...

sort实现自定义排序方法详解

使用 sort 实现自定义排序 目录 使用 sort 实现自定义排序1.sort 的基本用法2.sort 实现自定义排序3.结构体重载进行比较 1.sort 的基本用法 sort 库函数需要引入头文件algorithm,是一种排序算法,使用的排序逻辑可以看成是效率很高的快速排序或其的改进版本。平均时…...

【攻防世界】Reverse——secret-galaxy-300 writeup

由main函数查看相关代码,但是代码中并没有直接的关于flag的信息: int __cdecl main(int argc, const char **argv, const char **envp) {__main();fill_starbase(&starbase);print_starbase((int)&starbase);return 0; } void __cdecl fill_sta…...

Github Copilot 快速入门

GitHub Copilot 是一个由 GitHub 推出的人工智能编程助手,旨在帮助开发者通过自动代码建议和补全来提高编程效率和质量。作为一个人工智能配对程序员,它能够理解你的代码意图,并提供相关的代码片段,以帮助你更快地编写代码。这种技…...

c# wpf 的触发器,触发器Trigger种类,每个触发器的使用说明

触发器是一种强大的声明性机制,用于根据指定条件更改控件的外观或行为。触发器主要分为以下几种类型: Property Trigger 说明:当绑定到控件某个依赖属性的值发生改变时,Property Trigger会执行预定义的一组设置。例如,…...

计算机毕业设计 SpringBoot的乡村养老服务管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

AMP 通讯RPMsg

参考 RPMsg:协议简介_rpmsg协议-CSDN博客 【软件架构】【通信】S32G IPCF - 知乎 openamp https://www.cnblogs.com/sky-heaven/p/14085800.html virtualIO 虚拟化技术 — VirtIO 虚拟设备接口标准 - 知乎 Virtio-fs介绍与性能优化_guest docker Docker Docs 扫…...

【ECMAScript】WebSocket模拟HTTP功能的实践:Promise+WebSocket+EventEmitter+Queue

1. 前言 本篇将结合Promise、WebSocket、EventEmitter和Queue,做一次实践:用WebSocket来模拟HTTP的功能。先不用关心它的用处,就当一次对知识点的整合吧。 2. MockHTTP 方法说明request(params, callback?) 功能:发起请求&…...

Linux 软raid - - Barrier

什么是Barriers 在linux软raid中,用来处理正常IO和同步IO的并发问题,可以简单理解为专用于软raid的锁。 软raid在做resync/recovery,或者配置操作时需要raise 屏障,于此同时必须暂停正常IO。 barrier是可以被多次raise的一个计数…...

航空公司管理系统(迷你版12306)

要求 今天分享一个之前辅导留学生的作业,作业要求如下: Project E: Airways Management System Overall description: Your team is employed by an Airways company for the implementation of a computer system responsible for a large part of th…...

嵌入式硬件电路原理图之跟随电路

描述 电压跟随电路 电压跟随器是共集电极电路,信号从基极输入,射极输出,故又称射极输出器。基极电压与集电极电压相位相同,即输入电压与输出电压同相。这一电路的主要特点是:高输入电阻、低输出电阻、电压增益近似为…...

学习录

概述 这几年在迷茫中看了不少资料,有觉得写得很棒的,也有写的很糟糕的。所以一直想写这块的总结来进行归纳,同时也希望能给其他处于迷茫中的朋友提供一份高质量的资料列表(也许一个读者也没有),以下清单个人觉得值得反复看以及思…...

MongoDB索引详解

概述 索引是一种用来快速查询数据的数据结构。BTree 就是一种常用的数据库索引数据结构,MongoDB 采用 BTree 做索引,索引创建 colletions 上。MongoDB 不使用索引的查询,先扫描所有的文档,再匹配符合条件的文档。使用索引的查询&…...

wordpress 配置要求/搜易网服务内容

RabbitMQ 中文文档 背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR的 IIOP ,或者是 …...

一般做网站是用什么程序做的/网络口碑营销

注册表信息重要说明 此部分、方法或任务包含的步骤告诉你如何修改注册表。 但是,注册表修改不当可能会出现严重问题。 因此,请一定严格按照下列步骤操作。 为了获得进一步的保护,请在修改注册表之前对其进行备份。 这样就可以在出现问题时还原…...

郑州网站设计多少钱/百度公司全称

问题 我们都知道,MGR 用了类 Paxos 机制的协议,协商过程只要多数节点同意即可达成一致。 那么对于 3 节点的 MGR 集群,我们能不能让某一个节点延迟较高(放在地球另一端),而不影响整体性能? 实…...

免费地方网站/seo任务

导语:圣诞老人个子不高,胖乎乎的,蓝眼睛,白眉毛,大鼻子,高颧骨,小嘴巴,两鬓长满了银白色的络腮胡子,看上去很慈祥。接下来小编整理了圣诞节贺卡的优美句子,文…...

随身wifi网站设置/电子商务沙盘seo关键词

前言binlog 就是binary log,二进制日志文件,这个文件记录了mysql所有的增、删、改语句。通过binlog日志我们可以做数据恢复,做主从复制等等。可以看到,只要有了这个binlog,我们就拥有了mysql的完整备份了。我们时常会碰…...

南京网站建设网站制作/百度网页链接

在dao层给map赋值纠正一下应该把dd作为传入而不是sbiId; sqlMap中的parameterType"java.util.Map", 就 OKpackage com.ldrc.srm.jczx.web.results.module.screen;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Ma…...