JRT监听程序

news2024/11/27 14:46:02

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

在这里插入图片描述

首先,接口抽象时候就不在给参数放仪器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
    {
        //执行SQL
        if(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.coloradmin.cn/o/1437221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang GC 介绍

文章目录 0.前言1.发展史2.并发三色标记清除和混合写屏障2.1 三色标记2.2 并发标记问题2.3 屏障机制Dijkstra 插入写屏障Yuasa 删除写屏障混合写屏障 3.GC 过程4.GC 触发时机5.哪里记录了对象的三色状态&#xff1f;6.如何观察 GC&#xff1f;方式1&#xff1a;GODEBUGgctrace1…

cocos creator 3.x 预制体无法显示

双击预制体&#xff0c;进入详情页&#xff0c;没有显示资源 Bomb 是个预制体&#xff0c;但是当我双击进来什么都没有了&#xff0c;无法对预制体进行可视化编辑 目前我只试出来一个解决方法&#xff1a; 把预制体拖进Canvas文件中&#xff0c;这样就能展示到屏幕上&#xff…

springboot集成easypoi导出多sheet页

pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板&#xff1a; 后端代码示例&#xff1a; /*** 导出加油卡进便利店大额审批列…

三网码支付系统源码,三网免挂有PC软件,有云端源码,附带系统搭建教程

搭建教程 1.先上传云端源码 然后配置Core/Config.php文件里面数据库信息注改&#xff1b;数据库帐号密码 2.云端源码里面Core/Api_Class/Instant_Url_List.php文件配置终端地址注改&#xff1b;第4 http://终端地址/ 3.导入云端数据库 账号admin 密码123456注改&#xff1…

ELAdmin 前端启动

开发工具 官方指导的是使用WebStorm&#xff0c;但是本人后端开发一枚&#xff0c;最终还是继续使用了 idea&#xff0c;主打一个能用就行。 idea正式版激活方式&#xff1a; 访问这个查找可用链接&#xff1a;https://3.jetbra.in/进入任意一个能用的里面&#xff0c;顶部提…

java---查找算法(二分查找,插值查找,斐波那契[黄金分割查找] )-----详解 (ᕑᗢᓫ∗)˒

目录 一. 二分查找&#xff08;递归&#xff09;&#xff1a; 代码详解&#xff1a; 运行结果&#xff1a; 二分查找优化&#xff1a; 优化代码&#xff1a; 运行结果&#xff08;返回对应查找数字的下标集合&#xff09;&#xff1a; ​编辑 二分查找&#xff08;非递归…

YUM | 包安装 | 管理

YUM 功能 软件包安装&#xff1a; 通过yum命令安装软件包。例如&#xff0c;安装一个名为 example-package 的软件包 yum install example-package更新包 检查更新&#xff1a; 检查可用更新&#xff1a; sudo yum check-update <package_name>软件包更新&#xff1a; y…

k8s报错记录(持续更新中....)

k8s报错记录(持续更新中…) 1. 部署k8s遇到kube-flannel已经构建&#xff0c;但是coredns一直处于ContainerCreating和pending状态 解决问题&#xff1a; 通过 kubectl describe pod -n kube-system coredns-7ff77c879f-9ls2b 查看pod的详细信息&#xff0c;报错说是cni 配置没…

Linux系统调试课:硬件断点

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢在linux内核编程中,经常会遇到由于内存被篡改,例如 buffer overflow,野指针,write after free等。查找分析此类问题非常的麻烦。 一、什么是硬件断点 硬件断点,是Linux内核中是一种被ptrace和内核内调试器使用调试…

蓝桥杯嵌入式学习记录——点亮第一个LED(含软件的使用)

目录 一、蓝桥杯概述 二、软件的使用 三、点亮LED 一、蓝桥杯概述 蓝桥杯是一个编程大赛、商赛&#xff0c;获奖率高达60%&#xff08;省赛中一等奖10%、二等奖20%、三等奖30%&#xff09;&#xff0c;但这并不影响它的含金量&#xff0c;多所高校将它列为A类赛事并实行保研…

React+Echarts实现数据排名+自动滚动+Y轴自定义toolTip文字提示

1、效果 2、环境准备 1、react18 2、antd 4 3、代码实现 原理&#xff1a;自动滚动通过创建定时器动态更新echar的dataZoom属性startValue、endValue&#xff0c;自定义tooltip通过监听echar的鼠标移入移出事件&#xff0c;判断tooltTip元素的显隐以及位置。 1、导入所需组…

阿里云游戏服务器租用价格表,2024最新报价

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

C语言之随心所欲打印三角形,金字塔,菱形(倒金字塔)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 三角形 金字塔 倒金字塔 菱形 三角形 题目&#xff1a;根据输入的行数打印对应的三角形。&#xff08;用 * 号打印&#xff09; #includ…

亚信安慧AntDB构建繁荣生态的数据库管理系统

亚信安慧AntDB是一款数据库管理系统&#xff0c;它采用全球影响力大、社区繁荣、开放度高、生态增长迅速的PG内核。这款系统具有卓越的性能和稳定性&#xff0c;在全球范围内备受用户青睐。与此同时&#xff0c;AntDB的社区也是充满活力的&#xff0c;用户可以在社区中交流经验…

Java设计模式大全:23种常见的设计模式详解(三)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

Springboot项目报文加密(AES、RSA、Filter动态加密)

Springboot项目报文加密(AES、RSA、Filter动态加密) 一、痛点1.1、初版报文加密二、前期准备2.1、AES加密2.2、RSA加密2.3、国密算法概述2.4、国密SM22.5、国密SM32.6、国密SM42.7、JAVA中的拦截器、过滤器2.8、请求过滤器2.9、响应过滤器2.10、登录验证码2.11、BCrypt非对称…

【力扣 51】N 皇后(回溯+剪枝+深度优先搜索)

按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种…

C++ 11/14/17 智能指针

1. 简介 为了更加容易&#xff08;更加安全&#xff09;的使用动态内存&#xff0c;引入了智能指针的概念。智能指针的行为类似常规指针&#xff0c;重要的区别是它负责自动释放所指向的对象。 标准库提供的两种智能指针的区别在于管理底层指针的方法不同&#xff1a;shared_p…

【MATLAB】使用随机森林在回归预测任务中进行特征选择(深度学习的数据集处理)

1.随机森林在神经网络的应用 当使用随机森林进行特征选择时&#xff0c;算法能够为每个特征提供一个重要性得分&#xff0c;从而帮助识别对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理…

时间序列特有的交叉验证方法GroupTimeSeriesSplit

一、前言 对于时间序列的任务的交叉验证&#xff0c;很核心的问题在于数据是否leak&#xff0c;因为较其他数据最为不同的是时间信息&#xff0c;有先后的发生顺序。 如果用简单的打散数据顺序&#xff0c;之后抽取&#xff0c;进行交叉验证肯定是违反这个时间顺序的规则的&…