JRT监听程序

本次设计避免以往设计缺陷,老的主要为了保持兼容性,在用的设计就不好调了。

在这里插入图片描述

首先,接口抽象时候就不在给参数放仪器ID和处理类了,直接放仪器配置实体,接口实现想用什么属性就用什么属性,避免老方式要扩参数时候就波动接口定义,导致不兼容。
在这里插入图片描述

对返回命令取图或者上传文件等不在组串了,直接约定命令,返回查询上传数据或保存数据返回时候直接返回命令的JSON列表,再有监听提供的命令虚拟机执行命令

/*
本框架版权归属于JRT计划,任何单位或个人未经许可,不得以任何方式复制、传播、展示、发布、分发、重新分发、修改、反编译、
反向编译或以其他方式使用本框架的任何部分,包括但不限于源代码、二进制文件、文档、演示文稿、示例代码和API。
使用本框架的用户需遵守以下条款:
用户只能以个人学习和研究为目的使用本框架,不得将其用于商业用途。
用户在使用本框架时,应遵守所有适用的法律和法规,包括但不限于版权法、商标法、专利法和隐私权法。
用户在使用本框架时,应自行承担风险和责任,并确保不会侵犯任何知识产权或个人权利。
本框架的使用仅限于用户自己使用,不得将其分发给其他用户或将其用于任何形式的共享或传播。
在使用本框架时,用户应尊重和保护其他用户的隐私和个人信息,不得将其泄露给任何第三方。
违反以上条款将视为侵权行为,将采取法律手段维护JRT合法权益。*/
package JRTMachineImpl.Cmd;import java.util.List;
import JRTMachineImpl.Base.CmdDto;/*** 构造指令,监听再也不按以前固定拼串方式来实现附加功能了,转而提供一系列指令约定,让后台虚拟M按需要返回指令列表,* 由监听实现的简单指令执行虚拟机执行,从而达到解耦和实现更灵活和强大的功能*/
public class MakeCmd {/*** 添加一个SQL更新或者插入数据的指令到指令列表* @param cmdList 指令列表* @param setStatusKey 设置状态主键,有的话用该注解调用SetQryStatus设置状态* @param sql SQL语句* @param Address 连接串,如果上传要单独指定地址的话就传* @param UserName 用户名,如果上传要单独指定地址的话就传* @param UserPass 密码,如果上传要单独指定地址的话就传* @param Driver 驱动,如果上传要单独指定地址的话就传*/public static void AddSqlCmd(List<CmdDto> cmdList,String setStatusKey,String sql,String Address,String UserName,String UserPass,String Driver){CmdDto dto=new CmdDto();dto.Cmd="SQL";dto.P0=sql;dto.P1=Address;dto.P2=UserName;dto.P3=UserPass;dto.P4=Driver;dto.SetStatusKey=setStatusKey;cmdList.add(dto);}/*** 添加一个SQL更新或者插入数据的指令到指令列表* @param cmdList 指令列表* @param setStatusKey 设置状态主键,有的话用该注解调用SetQryStatus设置状态* @param sql SQL语句*/public static void AddSqlCmd(List<CmdDto> cmdList,String setStatusKey,String sql){AddSqlCmd(cmdList,setStatusKey,sql,"","","","");}/*** 添加一个写文本数据的指令到指令列表* @param cmdList 指令列表* @param setStatusKey 设置状态主键,有的话用该注解调用SetQryStatus设置状态* @param path 文本路径* @param str 写入的串* @param isAppend 是否追加* @param encode 编码 空默认系统编码,可为:UTF-8 UTF-16 ISO-8859-1 US-ASCII GB2312 GBK Big5 Shift-JIS EUC-KR Windows-1252*/public static void AddTxtCmd(List<CmdDto> cmdList,String setStatusKey,String path,String str,String isAppend,String encode){CmdDto dto=new CmdDto();dto.Cmd="TXT";dto.P0=path;dto.P1=str;dto.P2=isAppend;dto.P3=encode;dto.SetStatusKey=setStatusKey;cmdList.add(dto);}/*** 添加一个删除文件或者文件夹的指令到指令列表* @param cmdList 指令列表* @param path 路径*/public static void AddRMCmd(List<CmdDto> cmdList,String path){CmdDto dto=new CmdDto();dto.Cmd="RM";dto.P0=path;dto.SetStatusKey="";cmdList.add(dto);}/*** 添加一个拷贝文件的指令到指令列表* @param cmdList 指令列表* @param filePathOld 源文件路径* @param filePathNew 新文件路径*/public static void AddCPCmd(List<CmdDto> cmdList,String filePathOld,String filePathNew){CmdDto dto=new CmdDto();dto.Cmd="CP";dto.P0=filePathOld;dto.P1=filePathNew;dto.SetStatusKey="";cmdList.add(dto);}/*** 添加一个获取图片的指令到指令列表* @param cmdList 指令列表* @param epis 流水号* @param imgClass 图片类别代码* @param imgPath 图片路径* @param newName 新名称,不给的话就是文件名*/public static void AddGetImageCmd(List<CmdDto> cmdList,String epis,String imgClass,String imgPath,String newName){if(newName==null){newName="";}CmdDto dto=new CmdDto();dto.Cmd="GETIMAGE";dto.P0=epis;dto.P1=imgClass;dto.P2=imgPath;dto.P3=newName;dto.SetStatusKey="";cmdList.add(dto);}
}

命令执行器

/*
本框架版权归属于JRT计划,任何单位或个人未经许可,不得以任何方式复制、传播、展示、发布、分发、重新分发、修改、反编译、
反向编译或以其他方式使用本框架的任何部分,包括但不限于源代码、二进制文件、文档、演示文稿、示例代码和API。
使用本框架的用户需遵守以下条款:
用户只能以个人学习和研究为目的使用本框架,不得将其用于商业用途。
用户在使用本框架时,应遵守所有适用的法律和法规,包括但不限于版权法、商标法、专利法和隐私权法。
用户在使用本框架时,应自行承担风险和责任,并确保不会侵犯任何知识产权或个人权利。
本框架的使用仅限于用户自己使用,不得将其分发给其他用户或将其用于任何形式的共享或传播。
在使用本框架时,用户应尊重和保护其他用户的隐私和个人信息,不得将其泄露给任何第三方。
违反以上条款将视为侵权行为,将采取法律手段维护JRT合法权益。*/
package JRTMachineImpl.Cmd;import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;import JRTMachineImpl.Base.BaseDeal;
import JRTMachineImpl.Base.CmdDto;
import JRTMachineImpl.Base.ConfDto;
import JRTMachineImpl.Util.FileService;
import JRTMachineImpl.Util.LogUtils;
import JRTMachineImpl.WebService.OutValue;
import JRTMachineImpl.WebService.Parameters;
import JRTMachineImpl.WebService.WebGetData;
import JRTMachineImpl.DB.DBHelper;/*** 指令执行的虚拟机,按指令约定执行指令*/
public class CmdVM {/*** 执行指令* @param cmdList 指令列表* @param conf 监听配置* @return 返回值,正常返回空,否则返回错误*/public static String ExeCmd(List<CmdDto> cmdList, JRTMachineImpl.Base.ConfDto conf) throws Exception{//循环执行指令for(CmdDto cmd:cmdList){try {ExeOneCmd(cmd, conf);}catch (Exception ex){StringWriter stringWriter = new StringWriter();ex.printStackTrace(new PrintWriter(stringWriter));LogUtils.WriteDebugLog("执行命令异常:" + stringWriter.toString());LogUtils.WriteExceptionLog("执行命令异常", ex);}}return "";}/*** 执行指令* @param cmd 指令* @param conf 监听配置* @return 返回值,正常返回空,否则返回错误*/public static String ExeOneCmd(CmdDto cmd, JRTMachineImpl.Base.ConfDto conf) throws Exception{//执行SQLif(cmd.Cmd.equals("SQL")){ConfDto confNew=new ConfDto();confNew.Address=conf.Address;confNew.UserName=conf.UserName;confNew.UserPass=conf.UserPass;confNew.Driver=conf.Driver;//命令指定了要换驱动if(cmd.P1!=null&&!cmd.P1.isEmpty()){confNew.Address=cmd.P1;confNew.UserName=cmd.P2;confNew.UserPass=cmd.P3;confNew.Driver=cmd.P4;}JRTMachineImpl.DB.DBHelper dbHelper=new DBHelper(confNew);LogUtils.WriteDebugLog("执行SQL:"+cmd.P0);//执行SQL语句int ret=dbHelper.ExecUpdateSQL(cmd.P0);LogUtils.WriteDebugLog("执行SQL返回:"+ret);//设置状态if(ret==1&&!cmd.SetStatusKey.isEmpty()){Parameters param=new Parameters();param.P0=conf.MachID;param.P1=cmd.SetStatusKey;OutValue session = new OutValue();OutValue out = new OutValue();LogUtils.WriteDebugLog("调用:"+conf.DealProcess+"的:SetQryStatus设置状态");String setStatusRet=WebGetData.GetData(BaseDeal.WebServicAddress,conf.DealProcess,"SetQryStatus",param,session,out);LogUtils.WriteDebugLog("设置状态返回:"+setStatusRet);}}//写文件else if(cmd.Cmd.equals("TXT")){File fi=new File(cmd.P0);boolean isAppend=false;if(cmd.P2.equals("1")){isAppend=true;}String model=",模式:覆盖";if(isAppend==true){model=",模式:追加";}LogUtils.WriteDebugLog("往文件:"+cmd.P0+",写入:"+cmd.P1+model+",编码:"+cmd.P3);JRTMachineImpl.Util.TxtUtil.WriteText2File(fi,cmd.P1,isAppend,cmd.P3);//设置状态if(!cmd.SetStatusKey.isEmpty()){Parameters param=new Parameters();param.P0=conf.MachID;param.P1=cmd.SetStatusKey;OutValue session = new OutValue();OutValue out = new OutValue();LogUtils.WriteDebugLog("调用:"+conf.DealProcess+"的:SetQryStatus设置状态");String setStatusRet=WebGetData.GetData(BaseDeal.WebServicAddress,conf.DealProcess,"SetQryStatus",param,session,out);LogUtils.WriteDebugLog("设置状态返回:"+setStatusRet);}}//删除文件和目录else if(cmd.Cmd.equals("RM")){LogUtils.WriteDebugLog("删除:"+cmd.P0);JRTMachineImpl.Util.DirUtil.DeleteFileOrDir(new File(cmd.P0));}//拷贝文件else if(cmd.Cmd.equals("CP")){Path source = Paths.get(cmd.P0);Path target = Paths.get(cmd.P1);LogUtils.WriteDebugLog("拷贝:"+cmd.P0+"到:"+cmd.P1);Files.copy(source,target, StandardCopyOption.REPLACE_EXISTING);}//得到图片else if(cmd.Cmd.equals("GETIMAGE")){FileService fileService=new FileService();Parameters param=new Parameters();param.P0=conf.MachID;OutValue session = new OutValue();OutValue out = new OutValue();LogUtils.WriteDebugLog("调用:"+conf.DealProcess+"的:GetFileService得到文件服务路径");String fileServerPath=WebGetData.GetData(BaseDeal.WebServicAddress,conf.DealProcess,"GetFileService",param,session,out);LogUtils.WriteDebugLog("文件服务路径:"+fileServerPath);File fi=new File(cmd.P2);if(fi.exists()){String [] arr=fileServerPath.split("\\^");LogUtils.WriteDebugLog("准备上传:"+cmd.P2+",新名称:"+cmd.P3+",相对路径:"+arr[1]+"到:"+arr[0]);String ret=fileService.Upload(arr[0],cmd.P2,cmd.P3,arr[1]);LogUtils.WriteDebugLog("上传返回:"+ret);if(ret.isEmpty()){param=new Parameters();param.P0=conf.MachID;param.P1=cmd.P0;param.P2=cmd.P1;param.P3=fi.getName();param.P4=fi.getAbsolutePath();LogUtils.WriteDebugLog("调用:"+conf.DealProcess+"的:SaveImage保存文件路径");String saveRet=WebGetData.GetData(BaseDeal.WebServicAddress,conf.DealProcess,"SaveImage",param,session,out);LogUtils.WriteDebugLog("保存文件返回:"+saveRet);}else{LogUtils.WriteDebugLog("上传文件服务失败:"+ret);}}else{LogUtils.WriteDebugLog("文件:"+cmd.P2+"不存在");}}return "";}
}

定时上传执行命令
在这里插入图片描述

保存返回执行命令
在这里插入图片描述

仪器业务处理示例

import JRT.Core.Dto.CmdDto;
import JRT.Core.Dto.OutValue;
import JRT.Core.Util.LogUtils;
import JRT.Core.Util.MakeCmdUtil;
import JRT.Core.Util.TimeParser;
import JRTBLLBase.BaseHttpHandlerNoSession;
import JRTBLLBase.Helper;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;/*** 监听模式的仪器测试*/
public class JRTMachineTest extends BaseHttpHandlerNoSession {/*** 记录已经上传的数据*/private static HashMap<String, Boolean> hasUpData = new HashMap();/*** 保存仪器数据** @param mi        仪器主键* @param data      数据* @param epis      流水号* @param fileName  文件全名* @param DBColName 数据库列名* @param index     序号,-1为最后一行* @param P6* @param P7* @param P8* @param P9* @param P10* @param P11* @param P12* @param P13* @param Session* @param Output* @return* @throws Exception*/public String SaveData(String mi, String data, String epis, String fileName, String DBColName, String index, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {//先写Log测试LogUtils.WriteDebugLog("mi:" + mi + ",data:" + data + ",epis:" + epis + ",fileName:" + fileName + ",DBColName:" + DBColName);//返回的数据List<CmdDto> cmdList = new ArrayList<>();MakeCmdUtil.AddGetImageCmd(cmdList, "998", "P2", "D:\\OUT\\2.bmp", "");return Helper.Object2Json(cmdList);}/*** 得到文件服务地址供接口上传图片** @param mi* @param P1* @param P2* @param P3* @param P4* @param P5* @param P6* @param P7* @param P8* @param P9* @param P10* @param P11* @param P12* @param P13* @param Session* @param Output* @return* @throws Exception*/public String GetFileService(String mi, String P1, String P2, String P3, String P4, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {//返回文件服务路径return "http://localhost:8080/JRTWeb/FileService/^/zlzmach/" + TimeParser.GetNowDate();}/*** 保存文件到数据库** @param mi* @param epis* @param ImageClass* @param fileName* @param FullName* @param P5* @param P6* @param P7* @param P8* @param P9* @param P10* @param P11* @param P12* @param P13* @param Session* @param Output* @return* @throws Exception*/public String SaveImage(String mi, String epis, String ImageClass, String fileName, String FullName, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {//先写Log测试LogUtils.WriteDebugLog("mi:" + mi + ",epis:" + epis + ",ImageClass:" + ImageClass + ",fileName:" + fileName + ",FullName:" + FullName);return "";}/*** 查询要上传的指令** @param mi      仪器* @param P1* @param P2* @param P3* @param P4* @param P5* @param P6* @param P7* @param P8* @param P9* @param P10* @param P11* @param P12* @param P13* @param Session* @param Output* @return* @throws Exception*/public String QryUpdata(String mi, String P1, String P2, String P3, String P4, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {//先写Log测试LogUtils.WriteDebugLog("mi:" + mi + ",调用上传查询");//返回的数据List<CmdDto> cmdList = new ArrayList<>();//读文本仪器if (mi.equals("1")) {if (!hasUpData.containsKey("0947809")) {MakeCmdUtil.AddTxtCmd(cmdList, "0947809", "D:\\OUT\\uptxt.dttmp", "这是JRT上传的文本串", "0", "");MakeCmdUtil.AddCPCmd(cmdList, "D:\\OUT\\uptxt.dttmp", "D:\\OUT\\uptxt.dt");MakeCmdUtil.AddRMCmd(cmdList, "D:\\OUT\\uptxt.dttmp");}}//读数据库仪器else if (mi.equals("2")) {if (!hasUpData.containsKey("0947810")) {MakeCmdUtil.AddSqlCmd(cmdList, "0947810", "insert into DBUpHistory(DataCode,KeyData,DateStr,Data) values('0947809','1','这是JRT用SQL插入的数据','1')");}}MakeCmdUtil.AddGetImageCmd(cmdList, "999", "P1", "D:\\OUT\\1.bmp", "");return Helper.Object2Json(cmdList);}/*** 设置上传指令执行状态** @param mi           仪器* @param setStatusKey 设置状态的主键* @param P2* @param P3* @param P4* @param P5* @param P6* @param P7* @param P8* @param P9* @param P10* @param P11* @param P12* @param P13* @param Session* @param Output* @return* @throws Exception*/public String SetQryStatus(String mi, String setStatusKey, String P2, String P3, String P4, String P5, String P6, String P7, String P8, String P9, String P10, String P11, String P12, String P13, OutValue Session, OutValue Output) throws Exception {//先写Log测试LogUtils.WriteDebugLog("mi:" + mi + ",setStatusKey:" + setStatusKey + "设置状态");hasUpData.put(setStatusKey, true);return "";}
}

这样,一套超越以前设计的监听架构就出来了。JRT拥有Web、打印导出Client、JRT浏览器、JRTMachine、jrt运维命令、齐全了

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5-4、S加减单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍实现步进电机S曲线运动的代码 一、目标功能 实现步进电机转动总角度720&#xff0c;其中加减速各90 加速段&#xff1a;加速类型&#xff1a;S曲线  加速角度&#xff1a;角度为90  起步速度…

微软Windows生态是怎么打造成功的?

&#xff08;1&#xff09;2015年Windows10&#xff1a;兼容性 我不得不再次佩服一下微软&#xff0c;Windows10是2015年出品的&#xff0c;但是仍然能正常运行绝大多数的Windows95软件&#xff0c;不用做任何的适配修改&#xff0c;连重新编译都不用&#xff0c;运行照样正常。…

视觉SLAM十四讲学习笔记(一)初识SLAM

目录 前言 一、传感器 1 传感器分类 2 相机 二、经典视觉 SLAM 框架 1 视觉里程计 2 后端优化 3 回环检测 4 建图 5 SLAM系统 三、SLAM 问题的数学表述 四、Ubuntu20.04配置SLAM十四讲 前言 SLAM: Simultaneous Localization and Mapping 同时定位与地图构建&#…

SSRF漏洞给云服务元数据带来的安全威胁

文章目录 前言元数据服务威胁1.1 Metadata元数据1.2 RAM资源管理角色1.3 STS 临时凭据利用1.4 CF云环境利用框架1.5 元数据安全性增强 TerraformGoat2.1 永久性AccessKey2.2 SSRF靶场环境搭建2.3 腾讯云CVM配角色2.4 接管腾讯云控制台 SSRF组合拳案例3.1 上传图片功能SSRF3.2 文…

DataX详解和架构介绍

系列文章目录 一、DataX详解和架构介绍 二、DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 文章目录 系列文章目录DataX是什么&#xff1f…

外包干了10个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

苹果macbook电脑删除数据恢复该怎么做?Mac电脑误删文件的恢复方法

苹果电脑删除数据恢复该怎么做&#xff1f;Mac电脑误删文件的恢复方法 如何在Mac上恢复误删除的文件&#xff1f;在日常使用Mac电脑时&#xff0c;无论是工作还是娱乐&#xff0c;我们都会创建和处理大量的文件。然而&#xff0c;有时候可能会不小心删除一些重要的文件&#x…

电缆线的阻抗50Ω,真正含义是什么?

当我们提到电缆线的阻抗时&#xff0c;它到底是什么意思&#xff1f;RG58电缆通常指的是50Ω的电缆线。它的真正含义是什么&#xff1f;假如取一段3英尺(0.9144米)长的RG58电缆线&#xff0c;并且在前端测量信号路径与返回路径之间的阻抗。那么测得的阻抗是多少&#xff1f;当然…

unity实现第一人称和第三人称

在角色设置两个挂载点&#xff0c;第一人称时&#xff0c;相机放在eys上面&#xff0c;切换第三人称时&#xff0c;放置到3rd节点上面&#xff0c;调整节点位置&#xff0c;达到期望效果 代码 void ThirdView(){Debug.Log("切换到第三人称");camera.SetParent(third…

财务数据处理问题及解决方案分享

一、平台介绍 财务自营计费主要承接京东自营数据在整个供应链中由C端转B端的功能实现&#xff0c;在整个供应链中属于靠后的阶段了&#xff0c;系统主要功能是计费和向B端的汇总。 二、问题描述 近年来自营计费数据量大增&#xff0c;有百亿的数据量&#xff0c;一天中汇总占…

ChatGPT Plus如何升级?信用卡付款失败怎么办?如何使用信用卡升级 ChatGPT Plus?

ChatGPT Plus是OpenAI提供的一种高级服务&#xff0c;它相较于标准版本&#xff0c;提供了更快的响应速度、更强大的功能&#xff0c;并且用户可以优先体验到新推出的功能。 尽管许多用户愿意支付 20 美元的月费来订阅 GPT-4&#xff0c;但在实际支付过程中&#xff0c;特别是…

【ES数据可视化】kibana实现数据大屏

目录 1.概述 2.绘制数据大屏 2.1.准备数据 2.2.绘制大屏 3.嵌入项目中 1.概述 再来重新认识一下kibana&#xff1a; Kibana 是一个用于数据可视化和分析的开源工具&#xff0c;是 Elastic Stack&#xff08;以前称为 ELK Stack&#xff09;中的一部分&#xff0c;由 Ela…

机器学习 | 一文看懂SVM算法从原理到实现全解析

目录 初识SVM算法 SVM算法原理 SVM损失函数 SVM的核方法 数字识别器(实操) 初识SVM算法 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种经典的监督学习算法&#xff0c;用于解决二分类和多分类问题。其核心思想是通过在特征空间中找到一…

【Linux网络编程三】Udp套接字编程(简易版服务器)

【Linux网络编程三】Udp套接字编程(简易版服务器&#xff09; 一.创建套接字二.绑定网络信息1.构建通信类型2.填充网络信息①网络字节序的port②string类型的ip地址 3.最终绑定 三.读收消息1.服务器端接收消息recvfrom2.服务器端发送消息sendto3.客户端端发送消息sendto4.客户端…

海康威视球机摄像头运动目标检测、跟踪与轨迹预测

一、总体方案设计 运动目标检测与跟踪方案设计涉及视频流的实时拍摄、目标检测、轨迹预测以及云台控制。以下是四个步骤的详细设计&#xff1a; 1.室内场景视频流拍摄 使用海康威视球机摄像头进行室内视频流的实时拍摄。确保摄像头能覆盖整个室内空间&#xff0c;以便捕捉所…

如何修改远程端服务器密钥

前言 一段时间没改密码后&#xff0c;远程就会自动提示CtrlAltEnd键修改密码。但我电脑是笔记本&#xff0c;没有end键。打开屏幕键盘按这三个键也没用。 解决方法 打开远程 1、远程端WINC 输入osk 可以发现打开了屏幕键盘 2、电脑键盘同时按住CtrlAlt&#xff08;若自身电…

【iOS ARKit】人形提取

为解决人形分离和深度估计问题&#xff0c;ARKit 新增加了 Segmentation Buffer&#xff08;人体分隔缓冲区&#xff09;和Estimated Depth Data Buffer&#xff08;深度估计缓冲区&#xff09;两个缓冲区。人体分隔缓冲区作用类似于图形渲染管线中的 Stencil Buffer&#xff0…

机器学习--K近邻算法,以及python中通过Scikit-learn库实现K近邻算法API使用技巧

文章目录 1.K-近邻算法思想2.K-近邻算法(KNN)概念3.电影类型分析4.KNN算法流程总结5.k近邻算法api初步使用机器学习库scikit-learn1 Scikit-learn工具介绍2.安装3.Scikit-learn包含的内容4.K-近邻算法API5.案例5.1 步骤分析5.2 代码过程 1.K-近邻算法思想 假如你有一天来到北京…

2月6日作业

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&…

嵌入式软件bug分析基本要求

摘要&#xff1a;软件从来不是一次就能完美的&#xff0c;需要以包容的眼光看待它的残缺。那问题究竟为何产生&#xff0c;如何去除呢&#xff1f; 1、软件问题从哪来 软件缺陷问题千千万万&#xff0c;主要是需求、实现、和运行环境三方面。 1.1 需求描述偏差 客户角度的描…