专题:一个自制代码生成器(嵌入式脚本语言)之应用实例
初级代码游戏的专栏介绍与文章目录-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:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 专题:一个自制代码…...

Appium设备交互API
设备交互API指的是操作设备系统中的一些固有功能,而非被测程序的功能,例如模拟来电,模拟发送短信,设置网络,切换横竖屏,APP操作,打开通知栏,录屏等。 模拟来电 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. 总结欢迎来稿 论文地址:https://www.sciencedirect.com/sci…...

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

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

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

服务器停止解析域名,但仍然可以访问到
1.centos7 如何刷新dns缓存 在CentOS 7上,DNS缓存由nscd(Name Service Cache Daemon)管理,如果系统上安装了nscd,可以通过清除nscd缓存来刷新DNS缓存。 要刷新DNS缓存,请执行以下命令: sudo …...
Centos系统与Ubuntu系统防火墙区别,以及firewalld、ufw和iptables三者之前的区别。
现在大多数Centos系统上的防火墙是firewalld,Ubuntu系统上是ufw,而iptables是最底层的防火墙工具。iptables是Linux系统中最早的防火墙工具,并且被许多不同的Linux发行版使用,包括CentOS和Ubuntu。然而,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写研究报告
推荐写研究报告使用智能站: dayfire.cn/ 1. 确定研究主题 明确主题:在开始之前,你需要有一个清晰的研究主题。这将帮助AI更好地理解你的需求…...

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

【iOS ARKit】播放3D音频
3D音频 在前面系列中,我们了解如何定位追踪用户(实际是定位用户的移动设备)的位置与方向,然后通过摄像机的投影矩阵将虚拟物体投影到用户移动设备屏幕。如果用户移动了,则通过VIO 和 IMU更新用户的位置与方向信息&…...
ES学习日记(四)-------插件head安装和一些配套插件下载
前言 接上节,第三方插件选择了时间久,功能丰富,长得丑的head,head 插件在ES 5版本以前开箱即用非常简单,ES 5版本以后需要运行在node环境下,所以我们要先准备一下环境 一.安装Git 不装了,明儿再说,看会儿手机准备下班!!!!!!!!!...
flask+uwsgi+云服务器 部署服务端
参考:使用uwsgi部署flask 报错 “找不到Python应用程序,请检查启动日志以查找错误” 或者: no python application found, check your startup logs for errors debug 过程:查到Python uWSGI 安装配置 里面说,先写测…...

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

【分类评估指标,精确率,召回率,】from sklearn.metrics import classification_report
from: 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 组件的源码,分享带输入建议的 autocomplete 组件,在 element-ui 官方文档上,没有这个组件的 api 目录,它的 api 是和 input 组件的 api 在一起的,看完源码之后发现,源码当中 autocomplete 组件…...
视觉SLAM理论与实践的学习链接汇总
仅供学习,在此感谢所有乐于分享知识的大佬们~ 一、 ORB_SLAM理论 视觉SLAM 前端 后端 回环 建图 1、 前端视觉里程计 1.1 特征点法 一文带你搞懂相机内参外参(Intrinsics & Extrinsics)-知乎 VSLAM 笔记——我们如何通过图像来计算位姿的变化ÿ…...

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

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...

LINUX编译vlc
下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...