神奇代码备份恢复工具逸事与操作指南

文章目录

  • 一,序
  • 二,逸事
  • 三,为什么今天要提这个工具
  • 四,操作界面
    • 1. 文章发表者备份项目步骤
    • 2. 文章发表者恢复项目操作步骤
    • 3. 文章阅读者恢复项目步骤
  • 五,附件

一,序

软件行业流传着一幅漫画:开发软件就像制造小轿车,不是一开始就有设计图,也不是将轮子、车身、车门、发动机按部就班安装上去就可以的,而是大概先出现独轮车,接着出现自行车,然后是滑板车,之后是三轮自行车,继而是两轮摩托车··……

如此反复迭代,最后才得到成型的小轿车。这幅漫画讽刺的是开发新系统时“想当然”的做法,反映的是真实的探索过程。

其实,不仅开发系统是这样,即使是开发一个小工具,也遵循类似的原则,毕竟大部分软件被开发出来,是需要去解决实际中遇到的难题的。

二,逸事

n年前,小C曾入职一家软件公司,公司信息安全管理比较严格,员工办公电脑无法接入任何外部未授权设备。

在工作之中,也曾经做过一些技术预研,积累了一些代码。

公司有一个技术论坛,方便大家技术交流。论坛发帖采用后台审核机制。大家可以把自己遇到的问题以及代码发出来切磋。

对于这样的机制,少量的内容是合适的。一次偶然的机会发现论坛里面的短消息功能可以发送比较长的文本内容。

于是,问题便转变成了:如何把一个项目文件的内容快速的放到一个文本文件里面,并且接受到这个文本内容后如何快速恢复成项目原来的结构。

从软件需求的角度来说,这里面引申出2个基本需求:

  1. 项目文件备份到单个的文本文件
  2. 单个的文本文件恢复成项目文件

三,为什么今天要提这个工具

因为今天,程序员其实是最具有开源精神的一类团体,有太多的内容和Idea需要通过code来交流。

虽然说有github、gitee等代码托管平台,但那是和文章是属于2套系统,而且代码托管平台上的代码是随时变动的。

于是便催生了发表文章的同时,能够方便将示例代码一同提交的需求,而且这个代码还需要反映出项目的结构,这跟上面的2个需求是不谋而合的!

四,操作界面

运行1、2下载 procode-0.0.1.jar

运行3下载 procode-simple-0.0.1.jar

1. 文章发表者备份项目步骤

首先,选择需要备份的项目目录,并选择需要备份的文件类型
在这里插入图片描述
点击开始备份按钮,生成bak文件,成功后给出提示
在这里插入图片描述
备份成功后,提示是否查看备份文件在这里插入图片描述
选择ok,则打开备份文件所在目录
在这里插入图片描述

2. 文章发表者恢复项目操作步骤

切换到代码恢复tab,选择bak文件,以及恢复文件保存目录
在这里插入图片描述
点击开始恢复
在这里插入图片描述
恢复后的文件如图:
在这里插入图片描述
使用开发工具导入如下
在这里插入图片描述

3. 文章阅读者恢复项目步骤

参考 https://blog.csdn.net/qq_16127313/article/details/133792839

五,附件

上面步骤演示生成的备份文件 spring-config-refresh_10241110.bak,大家可以自行验证文件恢复功能!

//goto pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.fly</groupId><artifactId>spring-config-refresh</artifactId><version>1.0</version><packaging>jar</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.4.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency></dependencies><build><finalName>${project.artifactId}-${project.version}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
//goto src\main\java\com\fly\demo\Application.javapackage com.fly.demo;import java.io.IOException;
import java.net.URL;import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.util.ResourceUtils;import lombok.extern.slf4j.Slf4j;/*** * SpringBoot 启动入口* * @author 00fly* @version [版本号, 2018年7月20日]* @see [相关类/方法]* @since [产品/模块版本]*/
@Slf4j
@EnableScheduling
@SpringBootApplication
public class Application implements CommandLineRunner
{public static void main(String[] args){SpringApplication.run(Application.class, args);}@Overridepublic void run(String... args)throws IOException{URL url = Application.class.getProtectionDomain().getCodeSource().getLocation();log.info("Location URL Path: {}", url.getPath());URL url2 = new ClassPathResource("cron").getURL();log.info("url2 Path: {}", url2.getPath());log.info("ResourceUtils.isFileURL: {}", ResourceUtils.isFileURL(url2));log.info("ResourceUtils.isJarURL: {}", ResourceUtils.isJarURL(url2));log.info("ResourceUtils.isJarFileURL: {}", ResourceUtils.isJarFileURL(url2));}
}
//goto src\main\java\com\fly\demo\auto\job\ShowJob.java
package com.fly.demo.auto.job;import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;import com.fly.demo.auto.RedisConfig;
import com.fly.demo.auto.ReloadConfig;import lombok.extern.slf4j.Slf4j;@Slf4j
@Configuration
public class ShowJob
{@AutowiredRedisConfig redisConfig;@AutowiredReloadConfig reloadConfig;/*** 默认线程池的大小为1,配置线程池支持多个定时任务线程并发执行* * @return* @see [类、类#方法、类#成员]*/@BeanScheduledExecutorService scheduledExecutorService(){// return Executors.newScheduledThreadPool(8);return new ScheduledThreadPoolExecutor(8, new CustomizableThreadFactory("schedule-pool-"));}@Scheduled(cron = "0/5 * 7-23 * * ?")public void run(){reloadConfig.refresh(redisConfig);log.info("redisConfig por={}", redisConfig.getPort());}
}
//goto src\main\java\com\fly\demo\auto\RedisConfig.java
package com.fly.demo.auto;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;/*** * 配置文件值注入* * @author 00fly* @version [版本号, 2018年7月20日]* @see [相关类/方法]* @since [产品/模块版本]*/
@Configuration
@PropertySource(value = "classpath:redis.properties")
public class RedisConfig
{@Value("${port}")private int port;public int getPort(){return port;}public void setPort(int port){this.port = port;}
}
//goto src\main\java\com\fly\demo\auto\ReloadConfig.java
package com.fly.demo.auto;import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.springframework.context.annotation.Configuration;import lombok.extern.slf4j.Slf4j;/*** * 刷新配置文件* * @author 00fly* @version [版本号, 2018年7月20日]* @see [相关类/方法]* @since [产品/模块版本]*/
@Slf4j
@Configuration
public class ReloadConfig
{private PropertiesConfiguration config;public ReloadConfig(){super();try{config = new PropertiesConfiguration("redis.properties");FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy();strategy.setRefreshDelay(5000L);// 刷新周期5sconfig.setReloadingStrategy(strategy);}catch (ConfigurationException e){log.error("刷新配置数据出错", e);}}/*** 刷新配置数据到对象中* * @param redisConfig* @see [类、类#方法、类#成员]*/public void refresh(RedisConfig redisConfig){redisConfig.setPort(config.getInt("port"));}
}
//goto src\main\java\com\fly\demo\auto\task\MyTask1.java
package com.fly.demo.auto.task;import java.util.Date;import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;import lombok.extern.slf4j.Slf4j;/*** 定时任务类* * @author 00fly* @version [版本号, 2017年4月25日]* @see [相关类/方法]* @since [产品/模块版本]*/
@Slf4j
@Component
public class MyTask1 implements SchedulingConfigurer
{PropertiesConfiguration config;public MyTask1(){super();try{config = new PropertiesConfiguration("demo.properties");FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy();strategy.setRefreshDelay(60000L);// 刷新周期1分钟config.setReloadingStrategy(strategy);}catch (ConfigurationException e){log.error(e.getMessage(), e.getCause());}}@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar){taskRegistrar.addTriggerTask(new Runnable(){@Overridepublic void run(){// 任务逻辑log.info("★★★★★★★ MyTask1 run ★★★★★★★");}}, new Trigger(){@Overridepublic Date nextExecutionTime(TriggerContext triggerContext){// 任务触发,可修改任务的执行周期String cron = config.getString("schedule.myjob.cron");return new CronTrigger(cron).nextExecutionTime(triggerContext);}});}
}
//goto src\main\java\com\fly\demo\auto\task\MyTask2.java
package com.fly.demo.auto.task;import java.util.Date;
import java.util.ResourceBundle;import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;import lombok.extern.slf4j.Slf4j;/*** 定时任务类* * @author 00fly* @version [版本号, 2017年4月25日]* @see [相关类/方法]* @since [产品/模块版本]*/
@Slf4j
@Component
public class MyTask2 implements SchedulingConfigurer
{ResourceBundle config = ResourceBundle.getBundle("demo");@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar){taskRegistrar.addTriggerTask(new Runnable(){@Overridepublic void run(){// 任务逻辑log.info("------ MyTask2 run -------");}}, new Trigger(){@Overridepublic Date nextExecutionTime(TriggerContext triggerContext){// 任务触发,ResourceBundle方式读取修改任务的执行周期ResourceBundle.clearCache();String cron = config.getString("schedule.myjob.cron");return new CronTrigger(cron).nextExecutionTime(triggerContext);}});}
}
//goto src\main\java\com\fly\demo\auto\task\MyTask3.java
package com.fly.demo.auto.task;import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Date;import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;import lombok.extern.slf4j.Slf4j;/*** 定时任务类* * @author 00fly* @version [版本号, 2017年4月25日]* @see [相关类/方法]* @since [产品/模块版本]*/
@Slf4j
@Component
public class MyTask3 implements SchedulingConfigurer
{Resource resource = new ClassPathResource("cron");@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar){taskRegistrar.addTriggerTask(new Runnable(){@Overridepublic void run(){// 任务逻辑log.info("######### MyTask3 run #########");}}, new Trigger(){@Overridepublic Date nextExecutionTime(TriggerContext triggerContext){String cronText = "*/4 * * * * ?";try{cronText = IOUtils.toString(resource.getURL(), StandardCharsets.UTF_8);log.info("resource url = {}, cronText = {}", resource.getURL(), cronText);}catch (IOException e){log.error(e.getMessage(), e.getCause());}// 任务触发,IO方式读取可修改任务的执行周期return new CronTrigger(cronText).nextExecutionTime(triggerContext);}});}
}
//goto src\main\resources\demo.properties
schedule.myjob.cron = */5 * * * * ?
//goto src\main\resources\redis.properties
port=8081

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

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

相关文章

【MySQL】数据库常见错误及解决

目录 2003错误&#xff1a;连接错误1251错误&#xff1a;身份验证错误1045错误&#xff1a;拒绝访问错误服务没有报告任何错误net start mysql 发生系统错误 5。 1064错误&#xff1a;语法错误1054错误&#xff1a;列名不存在1442错误&#xff1a;触发器中不能对本表增删改1303…

如何正确地使用ChatGPT(角色扮演+提示工程)

如何正确地使用ChatGPT&#xff08;角色扮演提示工程&#xff09; 一、ChatGPT介绍二、准备工作2.1 获取ChatGPT环境2.2 确定使用ChatGPT的目标和需求 三、重要因素3.1 角色赋予3.2 提示工程 四、正确案例4.1 工作日报4.2 工作总结 一、ChatGPT介绍 可以查阅ChatGPT快速入门 …

docker版本的Jenkins安装与更新技巧

因为jenkins/jenkins镜像默认带的jenkins版本比较低&#xff0c;导致安装完以后&#xff0c;很多插件因为版本问题无法安装。以下是最权威&#xff0c;最方便的安装教程。 1. 创建本地挂载目录 mkdir -p /mnt/dockerdata/jenkins/home/2. 修改挂载目录权限 chown -R 1000:10…

Pyside6 QFileDialog

Pyside6 QFileDialog Pyside6 QFileDialog常用函数getOpenFileNamegetOpenFileNamesgetExistingDirectorygetSaveFileName 程序界面程序主程序 Pyside6 QFileDialog提供了一个允许用户选择文件或目录的对话框。关于QFileDialog的使用可以参考下面的文档 https://doc.qt.io/qtfo…

RustDay06------Exercise[91-100]

91.将指针还原成指定类型 因为指针不知道里面具体有什么,所以一般约定打上unsafe 申明开发者自己对该部分可用性负责,且在调试的时候也能起强调作用 // tests6.rs // // In this example we take a shallow dive into the Rust standard librarys // unsafe functions. Fix …

[yolo系列:YOLOV7改进-添加CoordConv,SAConv.]

文章目录 概要CoordConvSAConv 概要 CoordConv&#xff08;Coordinate Convolution&#xff09;和SAConv&#xff08;Spatial Attention Convolution&#xff09;是两种用于神经网络中的特殊卷积操作&#xff0c;用于处理图像数据或其他多维数据。以下是它们的简要介绍&#x…

【RNA structures】RNA-seq 分析: RNA转录的重构和前沿测序技术

文章目录 RNA转录重建1 先简单介绍一下测序相关技术2 Map to Genome Methods2.1 Step1 Mapping reads to the genome2.2 Step2 Deal with spliced reads2.3 Step 3 Resolve individual transcripts and their expression levels 3 Align-de-novo approaches3.1 Step 1: Generat…

2023年中国调速器产量、销量及市场规模分析[图]

调速器行业是指生产、销售和维修各种调速器设备的行业。调速器是一种能够改变机械传动系统输出转速的装置&#xff0c;通过调整输入和输出的转速比来实现转速调节的功能。 调速器行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 随着工业自动化程度…

C语言代码把时间戳字符串转换成日期时间格式以及修正bug的测试方法

时间戳是一种用来表示日期和时间的数字格式&#xff0c;在不同的编程语言里时间戳的长度和单位都不一样&#xff1a; C&#xff1a;以秒为单位&#xff0c;目前的时间戳是10位数。 Python&#xff1a;以秒为单位并且有精确到7位小数的毫秒&#xff0c;目前的时间戳整数部分是…

基于springboot小区团购管理系统

基于springboot小区团购管理系统的设计与实现 摘要 小区团购管理系统是一款基于Spring Boot框架的Web应用&#xff0c;为小区居民提供了一个方便的平台&#xff0c;以协调和管理各种团购活动。该系统的主要目标是促进小区居民之间的互助合作&#xff0c;通过集中采购来降低商品…

Ubuntu 22.04 中安装 fcitx5

Ubuntu 22.04 中安装 fcitx5 可以按照以下步骤进行&#xff1a; 添加 fcitx5 的 PPA 首先&#xff0c;添加 fcitx5 的官方 PPA&#xff1a; sudo add-apt-repository ppa:fcitx-team/fcitx5更新软件包列表 sudo apt update安装 fcitx5 sudo apt install fcitx5 fcitx5-conf…

【JavaEE初阶】 CAS详解

文章目录 &#x1f332;什么是 CAS&#x1f6a9;CAS伪代码 &#x1f38b;CAS 是怎么实现的&#x1f333;CAS的应用&#x1f6a9;实现原子类&#x1f6a9;实现自旋锁 &#x1f384;CAS 的 ABA 问题&#x1f6a9;什么是 ABA 问题&#x1f6a9;ABA 问题引来的 BUG&#x1f6a9;解决…

Mac安装nginx(Homebrew)

文章目录 nginx 安装nginx 反向代理nginx 反向代理配置nginx 负载均衡配置 nginx 安装 查看需要安装 nginx 的信息 brew info nginxDocroot 默认为 /usr/local/var/www 在 /opt/homebrew/etc/nginx/nginx.conf 配置文件中默认端口被配置为8080&#xff0c;从而使 nginx 运行…

常用Win32 API的简单介绍

目录 前言&#xff1a; 控制控制台程序窗口的指令&#xff1a; system函数&#xff1a; COORD函数&#xff1a; GetStdHandle函数&#xff1a; GetConsoleCursorInfo函数&#xff1a; CONSOLE_CURSOR_INFO函数&#xff1a; SetConsoleCursorInfo函数&#xff1a; SetC…

Vue 实战项目(智慧商城项目): 完整的订单购物管理功能 内涵资源代码 基于Vant组件库 Vuex态管理 基于企业级项目开发规范

鹏鹏老师的实战开发项目 智慧商城项目 接口文档&#xff1a;安全问题&#xff08;需要私信即可&#xff09; 演示地址&#xff1a;跳转项目地址 01. 项目功能演示 1.明确功能模块 启动准备好的代码&#xff0c;演示移动端面经内容&#xff0c;明确功能模块 在这里插入图…

DevExpress WinForms甘特图组件 - 轻松集成项目管理功能到应用

DevExpress WinForms Gantt&#xff08;甘特图&#xff09;控件允许您在下一个WinForms桌面应用程序中快速合并项目规划和任务调度功能。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于…

【超参数研究02】使用随机搜索优化超参数

一、说明 在神经网络训练中&#xff0c;超参数也是需要优化的&#xff0c;然而在超参数较多&#xff08;大于3个&#xff09;后&#xff0c;如果用穷举的&#xff0c;或是通过经验约摸实现就显得费时费力&#xff0c;无论如何&#xff0c;这是需要研究、规范、整合的要点&#…

Banana Pi BPI-M4 Berry 采用全志H618芯片,板载2G RAM和8G eMMC

BPI-M4 Berry 开发板作为一款强大的单板计算机&#xff08;SBC&#xff09;&#xff0c;充分挖掘了全志 H618 系统级芯片&#xff08;SoC&#xff09;的功能&#xff0c;为开发人员提供了令人印象深刻的性能和丰富的特性。与树莓派 4b 类似&#xff0c;BPI-M4 Berry 能够展现与…

网站页脚展示备案号并在新标签页中打开超链接

备案时&#xff0c;我们就注意到&#xff0c;备案成功后需要在网站首页底部展示“备案号”&#xff0c;并将备案号链接至https://beian.miit.gov.cn。 这里我使用了WrodPress中的主题&#xff0c;主题自定义中有提供对页脚文本的编辑&#xff0c;支持用css标签定义样式。若是自…

MySQL MVCC机制探秘:数据一致性与并发处理的完美结合,助你成为数据库高手

一、前言 在分析 MVCC 的原理之前&#xff0c;我们先回顾一下 MySQL 的一些内容以及关于 MVCC 的一些简单介绍。&#xff08;注:下面没有特别说明默认 MySQL 的引擎为 InnoDB &#xff09; 1.1 数据库的并发场景 数据库并发场景有三种&#xff0c;分别是&#xff1a; 读-读…