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

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


专题:一个自制代码生成器(嵌入式脚本语言)之总述-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之对象模型-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之堆栈结构和总入口-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之核心逻辑-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之辅助逻辑-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例-CSDN博客(本篇)

专题:一个自制代码生成器(嵌入式脚本语言)之模型开发-CSDN博客

专题:一个自制代码生成器(嵌入式脚本语言)之代码模板详解-CSDN博客


目录

一、数据库模型

二、应用实例

2.1 创建模型

2.2 生成代码

2.3 生成的代码

三、如何创建模型


一、数据库模型

        数据库模型是根据数据库定义生成数据库操作相关代码的模型,生成的代码是静态代码,具有静态代码的编译时检查和运行效率。

        数据库模型支持表定义、主键、定制的DML操作。对于C++客户代码,所有操作都是基于函数的,函数名和参数清晰地表达了函数的功能。

        下面我们先了解一个应用实例,然后再研究如何编写模型。

二、应用实例

2.1 创建模型

bool Rooster_AddAllTable(CCTModel_UniversalDB* pCTM)
{CCTModel_UniversalDB::table* p;//资源类型,预定义的数值p = pCTM->AddNewTable("RESOURCE_TYPE_D", "资源类型");if (NULL == p)return false;p->AddMember("RESOURCE_TYPE_ID", "long", "资源类型");p->AddMember("COMMENT", "string", "备注");p->SetPK("RESOURCE_TYPE_ID");p->AddDML("InsertNewResourceType", "insert", "RESOURCE_TYPE_ID,COMMENT", "", "插入新资源类型");//资源使用类型,预定义的数值p = pCTM->AddNewTable("RESOURCE_USE_TYPE_D", "资源使用类型");if (NULL == p)return false;p->AddMember("RESOURCE_USE_TYPE_ID", "long", "资源使用类型ID");p->AddMember("COMMENT", "string", "备注");p->SetPK("RESOURCE_USE_TYPE_ID");p->AddDML("InsertNewResourceUseType", "insert", "RESOURCE_USE_TYPE_ID,COMMENT", "", "插入新资源使用类型");//资源p = pCTM->AddNewTable("RESOURCE_D", "资源");if (NULL == p)return false;p->AddMember("RESOURCE_ID", "long", "资源ID");p->AddMember("RESOURCE_NAME", "string", "资源名称");p->AddMember("RESOURCE_TYPE_ID", "long", "资源类型");p->AddMember("RESOURCE_WITH_SYS", "long", "资源是否区分sys/sys2");p->AddMember("COMMENT", "string", "备注");p->SetPK("RESOURCE_ID");p->AddDML("InsertNewResource", "insert", "*", "", "插入新资源");p->AddDML("GetAllResource", "select", "*", "", "获得全部");//任务定义p = pCTM->AddNewTable("TASK_D", "任务");if (NULL == p)return false;p->AddMember("TASK_ID", "long", "任务ID");p->AddMember("TASK_NAME", "string", "任务名称");p->AddMember("TASK_MULTIPLE", "long", "0非多开1多开");p->AddMember("TASK_WITH_SYS", "long", "是否区分sys/sys2");p->AddMember("TASK_PRIORITY", "long", "优先级,小的优先");p->AddMember("TASK_PLAN_TIME", "string", "执行时间,‘2,8-16’,时间点或时间段");p->AddMember("TASK_PLAN_INTERVAL", "long", "执行时间段的执行间隔(分钟0-59)");p->AddMember("TASK_START_CMD", "string", "启动命令");p->AddMember("COMMENT", "string", "备注");p->SetPK("TASK_ID");p->AddDML("InsertNewTaskDefine", "insert", "*", "", "插入新任务定义");p->AddDML("GetAllTask", "select", "*", "", "获得全部");//任务资源使用定义p = pCTM->AddNewTable("TASK_RESOURCE_USE_D", "任务资源使用");if (NULL == p)return false;p->AddMember("TASK_ID", "long", "任务ID");p->AddMember("RESOURCE_ID", "long", "资源ID");p->AddMember("RESOURCE_USE_TYPE_ID", "long", "资源使用类型ID");p->AddMember("COMMENT", "string", "备注");p->SetPK("TASK_ID,RESOURCE_ID");p->AddDML("InsertNewTaskResurceUseDefine", "insert", "TASK_ID,RESOURCE_ID,RESOURCE_USE_TYPE_ID,COMMENT", "", "插入新任务资源使用定义");p->AddDML("GetAllTaskResourceUse", "select", "*", "", "获得全部");//任务队列表p = pCTM->AddNewTable("TASK_QUEUE", "待执行的任务队列");if (NULL == p)return false;p->AddMember("TASK_ID", "long", "任务ID");p->AddMember("SYS", "long", "维度1");p->AddMember("SYS2", "long", "维度2");p->AddMember("TASK_NAME", "string", "任务名称(参考)");p->AddMember("TASK_PRIORITY", "long", "优先级,小的优先(参考)");p->AddMember("COMMENT", "string", "备注(参考)");p->AddMember("INSERT_TIME", "time", "开始时间", "", "TIME_LOG");p->SetPK("TASK_ID,SYS,SYS2");p->AddDML("InsertNewTaskQueue", "insert", "TASK_ID,SYS,SYS2,TASK_NAME,TASK_PRIORITY,COMMENT,INSERT_TIME", "", "插入新任务队列");p->AddDML("DeleteTaskQueue", "delete", "", "TASK_ID,SYS,SYS2", "删除任务队列");p->AddDML("GetAllTaskQueue", "select", "*", "", "获取全部任务队列");p->AddDML("GetTaskQueue", "select", "*", "TASK_ID,SYS,SYS2", "获取任务队列");//任务执行表p = pCTM->AddNewTable("TASK_LOG", "任务日志");if (NULL == p)return false;p->AddMember("TASK_LOG_ID", "long", "任务执行序列号SEQ_TASK_LOG");p->AddMember("TASK_ID", "long", "任务ID");p->AddMember("SYS", "long", "维度1");p->AddMember("SYS2", "long", "维度2");p->AddMember("PID", "long", "任务所在的进程,客户方写入");p->AddMember("START_TIME", "time", "开始时间", "", "TIME_LOG");p->AddMember("FINISH_TIME", "time", "结束时间", "", "TIME_LOG");p->AddMember("RETURN_VALUE", "long", "返回值 0成功 <0Rooster错误 >0任务错误");p->AddMember("UPDATE_TIME", "time", "记录更新时间", "", "TIME_LOG");p->SetPK("TASK_LOG_ID");p->AddDML("InsertNewTaskLog", "insert", "TASK_LOG_ID,TASK_ID,SYS,SYS2,START_TIME,UPDATE_TIME", "", "插入新任务日志");p->AddDML("UpdateTaskLog", "update", "PID,UPDATE_TIME", "TASK_LOG_ID", "更新任务日志", "finish_time=0");p->AddDML("FinishTaskLog", "update", "FINISH_TIME,RETURN_VALUE,UPDATE_TIME", "TASK_LOG_ID", "更新任务日志", "finish_time=0");p->AddDML("GetCurrentTask", "select", "*", "", "获取正在运行的任务", "finish_time=0");//序列if (NULL == pCTM->AddNewSequence("SEQ_TASK_LOG", "TASK日志序列", 0))return false;return true;
}

        这个代码创建了一组表和一个序列,每一行代码的功能都是显而易见的。

2.2 生成代码

int main(int argc, char** argv)
{if (!InitActiveApp("CCTModel_UniversalDB", 1024 * 1024, argc, argv))exit(1);if (sizeof(long) != 8){thelog << "非64位程序!" << ende;}G_IS_DEBUG = true;CCTModel_UniversalDB ctm;if (!Rooster_AddAllTable(&ctm)){thelog << "执行失败" << ende;return __LINE__;}if (!ctm.CreateCode("ns_rooster_struct", "RoosterStruct", ".")){thelog << "执行失败" << ende;return __LINE__;}thelog << "程序退出" << endi;return 0;
}

        有用的就两句:Rooster_AddAllTable创建模型,CreateCode生成代码。

2.3 生成的代码

        生成的一组文件:

        总入口头文件是_cc_CRoosterStruct.h:

//_cc_CRoosterStruct.h 自动生成的代码
//
// Copyright (c) ct  All rights reserved.
// 版权所有 ct 保留所有权利
////警告:本文件由CT系统自动生成,不可手工修改#ifndef CTFC_RoosterStruct_H
#define CTFC_RoosterStruct_H 1//如果需要使用内存数据库直连功能,请在包含本头文件之前定义 CTFC_RoosterStruct_H_SHM_DB
//如果需要使用MariaDB功能,请在包含本头文件之前定义 CTFC_RoosterStruct_H_MARIA_DB
#include "_cc_RoosterStruct_RESOURCE_TYPE_D.h"
#include "_cc_RoosterStruct_RESOURCE_USE_TYPE_D.h"
#include "_cc_RoosterStruct_RESOURCE_D.h"
#include "_cc_RoosterStruct_TASK_D.h"
#include "_cc_RoosterStruct_TASK_RESOURCE_USE_D.h"
#include "_cc_RoosterStruct_TASK_QUEUE.h"
#include "_cc_RoosterStruct_TASK_LOG.h"
#include "_cc_RoosterStruct_SEQ_TASK_LOG.h"using namespace ns_my_std;namespace ns_rooster_struct
{class CShmDB_RoosterStruct{public://表CRoosterStruct_RESOURCE_TYPE_D m_RESOURCE_TYPE_D;//资源类型CRoosterStruct_RESOURCE_USE_TYPE_D m_RESOURCE_USE_TYPE_D;//资源使用类型CRoosterStruct_RESOURCE_D m_RESOURCE_D;//资源CRoosterStruct_TASK_D m_TASK_D;//任务CRoosterStruct_TASK_RESOURCE_USE_D m_TASK_RESOURCE_USE_D;//任务资源使用CRoosterStruct_TASK_QUEUE m_TASK_QUEUE;//待执行的任务队列CRoosterStruct_TASK_LOG m_TASK_LOG;//任务日志//序列CRoosterStruct_SEQ_TASK_LOG m_SEQ_TASK_LOG;//TASK日志序列public:
#ifdef CTFC_RoosterStruct_H_SHM_DB
#define CTFC_RoosterStruct_H_WITH_DBtypedef CShmDB T_DB;
#endif#ifdef CTFC_RoosterStruct_H_MARIA_DB
#define CTFC_RoosterStruct_H_WITH_DBtypedef CMariaDB T_DB;
#endifprivate:
#ifdef CTFC_RoosterStruct_H_WITH_DBT_DB m_ShmDB;T_DB * pDB;
#endifpublic:
#ifdef CTFC_RoosterStruct_H_WITH_DB//返回内部数据库对象T_DB * getDB(){return pDB;}//直连初始化bool DBInit(char const * db = nullptr){
#ifdef CTFC_RoosterStruct_H_SHM_DBCShmActiveObjects * p;p = m_ShmDB.GetCShmActiveObjects();if (!p->isConnected() && !p->Attach(false))
#endif
#ifdef CTFC_RoosterStruct_H_MARIA_DBif(!m_ShmDB.Connect(db))
#endif{thelog << "CRoosterStruct连接失败" << ende;return false;}DEBUG_LOG << "CRoosterStruct连接成功" << endi;pDB = &m_ShmDB;m_RESOURCE_TYPE_D.Init(pDB);m_RESOURCE_USE_TYPE_D.Init(pDB);m_RESOURCE_D.Init(pDB);m_TASK_D.Init(pDB);m_TASK_RESOURCE_USE_D.Init(pDB);m_TASK_QUEUE.Init(pDB);m_TASK_LOG.Init(pDB);m_SEQ_TASK_LOG.Init(pDB);return true;}//直连断开bool DBUnInit(){
#ifdef CTFC_RoosterStruct_H_SHM_DBCShmActiveObjects * p;p = m_ShmDB.GetCShmActiveObjects();if (p->isConnected())p->Detach();
#endif
#ifdef CTFC_RoosterStruct_H_MARIA_DBpDB->Close();
#endifpDB = NULL;return true;}//直连创建所有数据库对象bool DBCreateAllDBObject(){//创建表if(!m_RESOURCE_TYPE_D.CreateTable())return false;if(!m_RESOURCE_USE_TYPE_D.CreateTable())return false;if(!m_RESOURCE_D.CreateTable())return false;if(!m_TASK_D.CreateTable())return false;if(!m_TASK_RESOURCE_USE_D.CreateTable())return false;if(!m_TASK_QUEUE.CreateTable())return false;if(!m_TASK_LOG.CreateTable())return false;//创建序列if(!m_SEQ_TASK_LOG.CreateSequence())return false;return true;}//直连显示所有数据库对象bool DBShowAllDBObject(){//显示表if(!m_RESOURCE_TYPE_D.Show())return false;if(!m_RESOURCE_USE_TYPE_D.Show())return false;if(!m_RESOURCE_D.Show())return false;if(!m_TASK_D.Show())return false;if(!m_TASK_RESOURCE_USE_D.Show())return false;if(!m_TASK_QUEUE.Show())return false;if(!m_TASK_LOG.Show())return false;//显示序列thelog << "sequence:" << endl << "-------------------------" << endl;theLog<< "SEQ_TASK_LOG " << m_SEQ_TASK_LOG.GetSequenceValue() << endl;theLog << "-------------------------" << endi;return true;}
#endif};
}
#endif

        这个文件看起来和普通手写的文件没有任何区别,除了它真的是用代码模板生成的。

        再来看看生成这个文件的模板_t_UniversalDB.h.ct是什么样的:

//_cc_C${SYS}.h 自动生成的代码
//
// Copyright (c) ct  All rights reserved.
// 版权所有 ct 保留所有权利
////警告:本文件由CT系统自动生成,不可手工修改#ifndef CTFC_${SYS}_H
#define CTFC_${SYS}_H 1//如果需要使用内存数据库直连功能,请在包含本头文件之前定义 CTFC_${SYS}_H_SHM_DB
//如果需要使用MariaDB功能,请在包含本头文件之前定义 CTFC_${SYS}_H_MARIA_DB
<%foreach table in ${tables}%>
#include "_cc_${SYS}_${table}.h"
<%endforeach%>
<%foreach sequence in sequences%>
#include "_cc_${SYS}_${sequence}.h"
<%endforeach%>using namespace ns_my_std;namespace ${NAMESPACE}
{class CShmDB_${SYS}{public://表<%foreach table in tables%>C${SYS}_${table} m_${table};//${table.comment}<%endforeach%>//序列<%foreach sequence in sequences%>C${SYS}_${sequence} m_${sequence};//${sequence.comment}<%endforeach%>public:
#ifdef CTFC_${SYS}_H_SHM_DB
#define CTFC_${SYS}_H_WITH_DBtypedef CShmDB T_DB;
#endif#ifdef CTFC_${SYS}_H_MARIA_DB
#define CTFC_${SYS}_H_WITH_DBtypedef CMariaDB T_DB;
#endifprivate:
#ifdef CTFC_${SYS}_H_WITH_DBT_DB m_ShmDB;T_DB * pDB;
#endifpublic:
#ifdef CTFC_${SYS}_H_WITH_DB//返回内部数据库对象T_DB * getDB(){return pDB;}//直连初始化bool DBInit(char const * db = nullptr){
#ifdef CTFC_${SYS}_H_SHM_DBCShmActiveObjects * p;p = m_ShmDB.GetCShmActiveObjects();if (!p->isConnected() && !p->Attach(false))
#endif
#ifdef CTFC_${SYS}_H_MARIA_DBif(!m_ShmDB.Connect(db))
#endif{thelog << "C${SYS}连接失败" << ende;return false;}DEBUG_LOG << "C${SYS}连接成功" << endi;pDB = &m_ShmDB;<%foreach table in tables%>m_${table}.Init(pDB);<%endforeach%><%foreach sequence in sequences%>m_${sequence}.Init(pDB);<%endforeach%>return true;}//直连断开bool DBUnInit(){
#ifdef CTFC_${SYS}_H_SHM_DBCShmActiveObjects * p;p = m_ShmDB.GetCShmActiveObjects();if (p->isConnected())p->Detach();
#endif
#ifdef CTFC_${SYS}_H_MARIA_DBpDB->Close();
#endifpDB = NULL;return true;}//直连创建所有数据库对象bool DBCreateAllDBObject(){//创建表<%foreach table in tables%>if(!m_${table}.CreateTable())return false;<%endforeach%>//创建序列<%foreach sequence in sequences%>if(!m_${sequence}.CreateSequence())return false;<%endforeach%>return true;}//直连显示所有数据库对象bool DBShowAllDBObject(){//显示表<%foreach table in tables%>if(!m_${table}.Show())return false;<%endforeach%>//显示序列thelog << "sequence:" << endl << "-------------------------" << endl;<%foreach sequence in sequences%>theLog<< "${sequence} " << m_${sequence}.GetSequenceValue() << endl;<%endforeach%>theLog << "-------------------------" << endi;return true;}
#endif};
}
#endif

        这就是一个代码模板编写的典型例子,用到了大量的循环处理和变量替换。看起来像asp?嗯,就是模仿asp啊。

三、如何创建模型

        下一篇将详细解释这个模型(原则上,除了最终生成的的是这个脚本生成器要求的对象结构外模型和脚本生成器并没有更多关联)。


(这里是结束,但不是整个系列的结束)

相关文章:

专题:一个自制代码生成器(嵌入式脚本语言)之应用实例

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 专题&#xff1a;一个自制代码…...

Appium设备交互API

设备交互API指的是操作设备系统中的一些固有功能&#xff0c;而非被测程序的功能&#xff0c;例如模拟来电&#xff0c;模拟发送短信&#xff0c;设置网络&#xff0c;切换横竖屏&#xff0c;APP操作&#xff0c;打开通知栏&#xff0c;录屏等。 模拟来电 make_gsm_call(phon…...

Qlib-Server部署

Qlib-Server部署 介绍 构建Qlib服务器,用户可以选择: 一键部署Qlib服务器逐步部署Qlib服务器一键部署 Qlib服务器支持一键部署,用户可以选择以下两种方法之一进行一键部署: 使用docker-compose部署在Azure中部署使用docker-compose进行一键部署 按照以下步骤使用docker…...

CMC学习系列 (4):β段CMC可以作为一种中风治疗的生物标志物和治疗靶点

CMC学习系列:β段CMC可以作为一种中风治疗的生物标志物和治疗靶点 0. 引言1. 主要贡献2. 方法2.1 相干源动态成像2.2 源统计分析 3. 结果3.1 训练前后比较3.2 源代码分析3.3 皮质重叠的分组分析 4. 讨论5. 总结欢迎来稿 论文地址&#xff1a;https://www.sciencedirect.com/sci…...

jmeter中参数加密

加密接口常用的方式有&#xff1a; MD5&#xff0c;SHA&#xff0c;HmacSHA RSA AES&#xff0c;DES&#xff0c;Base64 压测中有些参数需要进行加密&#xff0c;加密方式已接口文档为主。 MD5加密 比如MD5加密的接口文档&#xff1a; 请求URL&#xff1a;http://101.34.221…...

YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)

一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…...

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据&#xff0c;其在跨时钟域传输的过程中有多种处理方式&#xff0c;比如DMUX&#xff0c;异步FIFO&#xff0c;双口RAM&#xff0c;握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器&#xff0c;该方…...

服务器停止解析域名,但仍然可以访问到

1.centos7 如何刷新dns缓存 在CentOS 7上&#xff0c;DNS缓存由nscd&#xff08;Name Service Cache Daemon&#xff09;管理&#xff0c;如果系统上安装了nscd&#xff0c;可以通过清除nscd缓存来刷新DNS缓存。 要刷新DNS缓存&#xff0c;请执行以下命令&#xff1a; sudo …...

Centos系统与Ubuntu系统防火墙区别,以及firewalld、ufw和iptables三者之前的区别。

现在大多数Centos系统上的防火墙是firewalld&#xff0c;Ubuntu系统上是ufw&#xff0c;而iptables是最底层的防火墙工具。iptables是Linux系统中最早的防火墙工具&#xff0c;并且被许多不同的Linux发行版使用&#xff0c;包括CentOS和Ubuntu。然而&#xff0c;CentOS 7及更高…...

ES6 学习(三)-- es特性

文章目录 1. Symbol1.1 使用Symbol 作为对象属性名1.2 使用Symbol 作为常量 2. Iterator 迭代器2.1 for...of循环2.2 原生默认具备Interator 接口的对象2.3 给对象添加Iterator 迭代器2.4 ... 解构赋值 3. Set 结构3.1 初识 Set3.2 Set 实例属性和方法3.3 遍历3.4 相关面试题 4…...

使用ChatGPT的场景之gpt写研究报告,如何ChatGPT写研究报告

推荐写研究报告使用智能站&#xff1a; dayfire.cn/ 1. 确定研究主题 明确主题&#xff1a;在开始之前&#xff0c;你需要有一个清晰的研究主题。这将帮助AI更好地理解你的需求…...

librdkafka的简单使用

文章目录 摘要kafka是什么安装环境librdkafka的简单使用生产者消费者 摘要 本文是Getting Started with Apache Kafka and C/C的中文版&#xff0c; kafka的hello world程序。 本文完整代码见仓库&#xff0c;这里只列出producer/consumer的代码 kafka是什么 本节来源&#…...

【iOS ARKit】播放3D音频

3D音频 在前面系列中&#xff0c;我们了解如何定位追踪用户&#xff08;实际是定位用户的移动设备&#xff09;的位置与方向&#xff0c;然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了&#xff0c;则通过VIO 和 IMU更新用户的位置与方向信息&…...

ES学习日记(四)-------插件head安装和一些配套插件下载

前言 接上节,第三方插件选择了时间久,功能丰富,长得丑的head,head 插件在ES 5版本以前开箱即用非常简单&#xff0c;ES 5版本以后需要运行在node环境下&#xff0c;所以我们要先准备一下环境 一.安装Git 不装了,明儿再说,看会儿手机准备下班!!!!!!!!!...

flask+uwsgi+云服务器 部署服务端

参考&#xff1a;使用uwsgi部署flask 报错 “找不到Python应用程序&#xff0c;请检查启动日志以查找错误” 或者&#xff1a; no python application found, check your startup logs for errors debug 过程&#xff1a;查到Python uWSGI 安装配置 里面说&#xff0c;先写测…...

linux学习之路 -- 普通用户添加进sudoer列表

在Linux系统里&#xff0c;很多的操作普通用户是不能执行的&#xff0c;所以我们需要对普通用户进行提权操作&#xff0c;可我们会发现&#xff0c;一开始没有配置的话&#xff0c;是无法的提权操作的&#xff0c;下面我将介绍普通用户该如何配置sudoer列表。 首先以root 的身…...

【分类评估指标,精确率,召回率,】from sklearn.metrics import classification_report

from&#xff1a; https://zhuanlan.zhihu.com/p/368196647 多分类 from sklearn.metrics import classification_report y_true [0, 1, 2, 2, 2] y_pred [0, 0, 2, 2, 1] target_names [class 0, class 1, class 2] # print(classification_report(y_true, y_pred, targe…...

element-ui autocomplete 组件源码分享

紧接着 input 组件的源码&#xff0c;分享带输入建议的 autocomplete 组件&#xff0c;在 element-ui 官方文档上&#xff0c;没有这个组件的 api 目录&#xff0c;它的 api 是和 input 组件的 api 在一起的&#xff0c;看完源码之后发现&#xff0c;源码当中 autocomplete 组件…...

视觉SLAM理论与实践的学习链接汇总

仅供学习&#xff0c;在此感谢所有乐于分享知识的大佬们~ 一、 ORB_SLAM理论 视觉SLAM 前端 后端 回环 建图 1、 前端视觉里程计 1.1 特征点法 一文带你搞懂相机内参外参(Intrinsics & Extrinsics)-知乎 VSLAM 笔记——我们如何通过图像来计算位姿的变化&#xff…...

极光笔记|极光消息推送服务的云原生实践

摘要 极光始终秉承“以开发者为中心”的战略导向&#xff0c;极光推送&#xff08;JPush&#xff09;是国内领先的消息推送服务。极光推送&#xff08;JPush&#xff09;本质上是一种软件付费应用程序&#xff0c;结合当前主流云厂商基础施设&#xff0c;逐渐演进成了云上SaaS…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...