Java压缩与解压缩ZIP文件

文章目录 前言Java解压缩文件压缩和解压缩ZIP文件检验应用总结 前言 在现代计算机上,数据传输和存储越来越依赖于文件压缩技术。当我们需要发送大量数据时,压缩文件可以大大减少传输时间和网络带宽,而且压缩文件还可以帮助我们节省磁盘空间。在Java中提供了压缩和解压缩文件的功能,可以使用java.util.zip包中的类来实现。本篇将对如何使用 Java 实现单文多件压缩和解压缩进行总结。 文件压缩指的是将一个或多个文件通过压缩算法,将其存储为一个更小的文件,以便于存储和传输。压缩的原理是通过对文件的数据进行编码和压缩,使其占用更少的空间。压缩后的文件可以通过解压缩算法还原成原始的文件格式。在文件压缩过程中,常见的操作是将多个文件打包成一个压缩文件,例如zip、tar等格式。 Java解压缩文件 常见的文件压缩格式包括: ZIP:最常见的压缩文件格式之一,可以存储一个或多个文件,并可在不同的操作系统中进行解压缩。TAR:Linux系统中的常见文件压缩格式,通常用于打包多个文件,但不会进行压缩。GZIP:常用的文件压缩格式,通常用于压缩单个文件,可以获得更高的压缩比。BZIP2:高效的压缩算法,通常用于压缩文本文件和XML文件等。JAR: Jar包对于Java开发同学来说肯定很熟悉,其也是一个压缩包 Java提供了多种用于压缩和解压缩文件的API,主要包括以下类和方法: ZipOutputStream 和 ZipInputStream:用于创建和读取ZIP格式的压缩文件。GZIPOutputStream 和 GZIPInputStream:用于创建和读取GZIP格式的压缩文件。JarOutputStream 和 JarInputStream:用于创建和读取JAR格式的压缩文件。DeflaterOutputStream 和 InflaterInputStream:用于创建和读取DEFLATE格式的压缩文件。CheckedOutputStream 和 CheckedInputStream:用于在压缩和解压缩过程中计算文件的校验和。 压缩和解压缩ZIP文件 通过使用Java 自带的 java.util.zip 类库下的ZipOutputStream、ZipInputStream、ZipEntry实现文件的压缩和解压缩,其中ZipOutputStream用于创建ZIP压缩文件输出流输出ZIP压缩文件,ZipInputStream用于创建ZIP文件输入流读取ZIP文件用于解压缩而ZipEntry对应ZIP压缩包中的每个被压缩对象; 生成ZIP文件 压缩单个文件或者单个文件夹方法,代码如下: /** * 压缩文件(支持单个文件和单个文件夹) * @param sourceFile 被压缩文件/文件夹 * @param zipFile Zip文件 */ public static void zipCompress(File sourceFile, File zipFile) { try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) { // 设置压缩方法 zos.setMethod(ZipOutputStream.DEFLATED); zos.setLevel(Deflater.BEST_COMPRESSION); // 默认为-1,压缩级别,1速度快,效率低,9 速度满,效率高 // zos.setLevel(Deflater.BEST_SPEED); zos.setComment("zip文件说明"); // 处理文件夹 if (sourceFile.

俄罗斯方块的实现—C语言

目录 简单解释几个函数: 1、制作俄罗斯方块: 2、 判断方块是否可以移动 3、 判断是否满行 完整代码如下: 运行界面展示: █ 开发工具:Dev C++ 简单解释几个函数: 1、制作俄罗斯方块: /* *制作俄罗斯方块 */ void MakeTetris(struct Tetris *tetris) { a[tetris->x][tetris->y ]=b[0]; switch(tetris->flag) { case 1: { color(2); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x+2][tetris->y-1]=b[2]; a[tetris->x+2][tetris->y]=b[3]; break; } case 2: { color(3); a[tetris->x-2][tetris->y]=b[1]; a[tetris->x+2][tetris->y]=b[2]; a[tetris->x+4][tetris->y]=b[3]; break; } case 3: { color(3); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x][tetris->y-2]=b[2]; a[tetris->x][tetris->y+1]=b[3]; break; } case 4: { color(11); a[tetris->x-2][tetris->y]=b[1]; a[tetris->x+2][tetris->y]=b[2]; a[tetris->x][tetris->y+1]=b[3]; break; } case 5: { color(11); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x][tetris->y+1]=b[2]; a[tetris->x-2][tetris->y]=b[3]; break; } case 6: { color(11); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x-2][tetris->y]=b[2]; a[tetris->x+2][tetris->y]=b[3]; break; } case 7: { color(11); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x][tetris->y+1]=b[2]; a[tetris->x+2][tetris->y]=b[3]; break; } case 8: { color(6); a[tetris->x][tetris->y+1]=b[1]; a[tetris->x-2][tetris->y]=b[2]; a[tetris->x+2][tetris->y+1]=b[3]; break; } case 9: { color(6); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x-2][tetris->y]=b[2]; a[tetris->x-2][tetris->y+1]=b[3]; break; } case 10: { color(6); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x-2][tetris->y-1]=b[2]; a[tetris->x+2][tetris->y]=b[3]; break; } case 11: { color(6); a[tetris->x][tetris->y+1]=b[1]; a[tetris->x-2][tetris->y-1]=b[2]; a[tetris->x-2][tetris->y]=b[3]; break; } case 12: { color(7); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x][tetris->y+1]=b[2]; a[tetris->x-2][tetris->y-1]=b[3]; break; } case 13: { color(7); a[tetris->x-2][tetris->y]=b[1]; a[tetris->x+2][tetris->y-1]=b[2]; a[tetris->x+2][tetris->y]=b[3]; break; } case 14: { color(7); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x][tetris->y+1]=b[2]; a[tetris->x+2][tetris->y+1]=b[3]; break; } case 15: { color(7); a[tetris->x-2][tetris->y]=b[1]; a[tetris->x-2][tetris->y+1]=b[2]; a[tetris->x+2][tetris->y]=b[3]; break; } case 16: { color(7); a[tetris->x][tetris->y+1]=b[1]; a[tetris->x][tetris->y-1]=b[2]; a[tetris->x+2][tetris->y-1]=b[3]; break; } case 17: { color(7); a[tetris->x-2][tetris->y]=b[1]; a[tetris->x+2][tetris->y+1]=b[2]; a[tetris->x+2][tetris->y]=b[3]; break; } case 18: { color(7); a[tetris->x][tetris->y-1]=b[1]; a[tetris->x][tetris->y+1]=b[2]; a[tetris->x-2][tetris->y+1]=b[3]; break; } case 19: { color(7); a[tetris->x-2][tetris->y]=b[1]; a[tetris->x-2][tetris->y-1]=b[2]; a[tetris->x+2][tetris->y]=b[3]; break; } } } ✔在本游戏中,使用“■”来填充各种方块,在横向上,它占两个字符;在纵向上,它占一个字符。俄罗斯方块的7种基本图形旋转后共有19种旋转图形。而此段代码就是制作出这19种俄罗斯形状。

贪吃蛇的实现—C语言

目录 简单解释几个函数: 1、记录最高分的函数 2、 隐藏光标 3、初始化蛇身 4、播放背景音乐的函数 完整代码如下: 运行界面显示: █ 开发工具:Dev C++ 简单解释几个函数: 1、记录最高分的函数 分为读取和储存,即分为 File_out() 和 File_in(); /** * 储存最高分进文件 */ void File_in() { FILE *fp; fp = fopen("save.txt", "w+"); //以读写的方式建立一个名为save.txt的文件 fprintf(fp, "%d", score); //把分数写进文件中 fclose(fp); //关闭文件 } /** * 在文件中读取最高分 */ void File_out() { FILE *fp; fp = fopen("save.txt", "a+"); //打开文件save.txt fscanf(fp, "%d", &HighScore); //把文件中的最高分读出来 fclose(fp); //关闭文件 } ✔ 文件中写入数据的步骤,首先使用fopen()方法来打开文件,如果要打开的文件不存在,那么创建此文件;然后通过fprintf()方法把数据写入文件;最后使用fclose()方法关闭文件。 2、 隐藏光标 //隐藏光标 void HideCursor() { CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量 curInfo.

理清GPU、CUDA、CUDA Toolkit、cuDNN关系以及下载安装

介于在服务器上安装Nvidia、CUDA、cuDNN等等,对各自的概念以及它们之间存在的关系一直不够清晰,借此机会,整理相关内容于此,若有错误望指正,评论多交流 目录 GPU显卡驱动DriverCUDACUDA ToolkitNVCCcuDNNCUDA Toolkit和 显卡驱动 的版本对应CUDA / CUDA Toolkit和cuDNN的版本对应显卡驱动程序的选择nvidia-smi 和 nvcc 结果的版本为何不一致使用conda命令安装pytorch时候cudatoolkit的版本是哪个?CUDA多版本切换/管理方式写在最后(一定要看嗷!) GPU 显卡是我们平时说的GPU,现在大多数的电脑使用NVIDIA公司生产的显卡;常见的型号有Tesla V100,GTX950M,GTX1050TI,GTX1080等。 显卡驱动Driver 特指NVIDIA的显卡驱动程序。 CUDA CUDA是显卡厂商NVIDIA推出的运算平台。CUDA™是一种由NVIDIA推出的通用并行计算架构,是一种并行计算平台和编程模型,该架构使GPU能够解决复杂的计算问题。CUDA英文全称是Compute Unified Device Architecture。 有人说:CUDA是一门编程语言,像C,C++,python 一样,也有人说CUDA是API。 官方说:CUDA是一个并行计算平台和编程模型,能够使得使用GPU进行通用计算变得简单和优雅。 运行CUDA应用程序要求系统至少具有一个具有CUDA功能的GPU和与CUDA Toolkit兼容的驱动程序。 查看CUDA版本命令:nvcc -V 或nvcc --version或cat /usr/local/cuda/version.txt 需要知道:CUDA和CUDA Driver显卡驱动不是一一对应的,比如同一台电脑上可同时安装CUDA 9.0、CUDA 9.2、CUDA 10.0等版本。 CUDA Toolkit CUDA工具包的主要包含了CUDA-C和CUDA-C++编译器、一些科学库和实用程序库、CUDA和library API的代码示例、和一些CUDA开发工具。(通常在安装CUDA Toolkit的时候会默认安装CUDA Driver;但是我们经常只安装CUDA Driver,没有安装CUDA Toolkit,因为有时不一定用到CUDA Toolkit;比如我们的笔记本电脑,安装个CUDA Driver就可正常看视频、办公和玩游戏了) 详细内容见NVIDIA官方 NVCC NVCC就是CUDA的编译器,可以从CUDA Toolkit的/bin目录中获取,类似于gcc就是c语言的编译器。由于程序是要经过编译器编程成可执行的二进制文件,而cuda程序有两种代码,一种是运行在cpu上的host代码,一种是运行在gpu上的device代码,所以nvcc编译器要保证两部分代码能够编译成二进制文件在不同的机器上执行。 cuDNN cuDNN的全称为NVIDIA CUDA® Deep Neural Network library,是NVIDIA专门针对深度神经网络中的基础操作而设计基于GPU的加速库。cuDNN为深度神经网络中的标准流程提供了高度优化的实现方式,例如convolution、pooling、normalization以及activation layers的前向以及后向过程。 CUDA这个平台一开始并没有安装cuDNN库,当开发者们需要用到深度学习GPU加速时才安装cuDNN库,工作速度相较CPU快很多。 CUDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算; 来自知乎的解释:CUDA看作是一个工作台,上面配有很多工具,如锤子、螺丝刀等。cuDNN是基于CUDA的深度学习GPU加速库,有了它才能在GPU上完成深度学习的计算。它就相当于工作的工具,比如它就是个扳手。但是CUDA这个工作台买来的时候,并没有送扳手。想要在CUDA上运行深度神经网络,就要安装cuDNN,就像你想要拧个螺帽就要把扳手买回来。这样才能使GPU进行深度神经网络的工作,工作速度相较CPU快很多。 基本上所有的深度学习框架都支持cuDNN这一加速工具,例如:Caffe、Caffe2、TensorFlow、Torch、Pytorch、Theano等。 Caffe可以通过修改Makefile.config中的相应选项来修改是否在编译Caffe的过程中编译cuDNN,如果没有编译cuDNN的话,执行一些基于Caffe这一深度学习框架的程序速度上要慢3-5倍(Caffe官网上说不差多少,明明差很多嘛)。Caffe对cuDNN的版本不是很严格,只要大于cuDNN 4就可以。 查看cuDNN版本:cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

如何写好日常代码以及一些常见的坑

1、方法命名潜在的坑 1.1、案例伪代码示例 @Data public class Order { private String customerName; private BigDecimal totalAmount; private String statusCode; private static final String payingStatus = "paying"; /** * 是否支付中 * * OrderInfo#verifyOrderPaymentStatus * @return */ public boolean isPaying(){ return statusCode.equals(payingStatus); } } public static void main(String[] args) { Order order = new Order(); // 这里会报空指针异常 System.out.println(JSON.toJSONString(order)); } 1.2、问题和改进建议 在三层架构下,我们通常将原来很多本该属于对象的行为的方法写在Service上,这种方式相比DDD我们称之为贫血模型,但是随着DDD越来越流行,大家都开始接受DDD充血模型去写代码,充血模型其实就是回归到面向对象(OOP),将原来属于对象Bean的行为方法写回到该对象去,但是对象Bean通常作为打印关键业务日志的主要数据对象,这里对于行为方法命名就要小心,除了本身Bean的getter、setter方法外,其它带逻辑性的行为不要用 get\set\is 开头,否则打印日志json序列化(JSON.toJSONString(...))默认会执行get\set\is 开头的方法,业务逻辑方法通常在特定场景下确保字段都有数据的情况下被调用,但是在打印日志时可能这些字段存在为null的情况,会导致报空指针,如果一定要这么命名,建议在方法上注解JSON序列化忽略标记上去,而且不同的JSON框架忽略注解都不同,这种方式可以避免但是会使代码变得很不优雅。 2、查询类API最佳实践 2.1、案例伪代码示例 @RestController public class QueryApiController { @GetMapping("/getOrderByCustomerCode") public R getOrderByCustomerCode(@RequestParam("

树的基础算法总结

树的遍历算法 二叉树结点 static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } N叉树结点 static class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List<Node> _children) { val = _val; children = _children; } } 二叉树遍历 先序中序后序 递归 和 非 递归 算法 【注, 后序的非递归算法 和 先序 思路相反】 import java.

在vue中引入高德地图

既然要用到高德地图首先要申请成为高德地图开发者,并申请使用高德地图的key这两点在这篇文章就不过多赘述,有需要的小伙伴可以查查资料,或者去高德地图api官网都有很详细的介绍。高德地图官网 简单提一下申请秘钥流程(web端) 控制台–>应用管理–>我的应用 好啦!步入正题,在vue项目中引入高德地图 一、下载依赖 npm 安装: npm i @amap/amap-jsapi-loader --save 或者 yarn 安装: yarn add @amap/amap-jsapi-loader --save 二、封装一个地图组件myamap.vue 引入 AMapLoader import AMapLoader from ‘@amap/amap-jsapi-loader’; 引入安全秘钥(2021年12月02日后申请的key需要这一步) <script> window._AMapSecurityConfig = { securityJsCode: '' // '「申请的安全密钥」', } </script> 初始化地图 methods: { initAMap () { AMapLoader.load({ key: "", // 申请好的Web端开发者Key,首次调用 load 时必填 version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 plugins: ["AMap.Scale", "AMap.ToolBar", "AMap.ControlBar", 'AMap.Geocoder', 'AMap.Marker', 'AMap.CitySearch', 'AMap.Geolocation', 'AMap.AutoComplete', 'AMap.InfoWindow'], // 需要使用的的插件列表,如比例尺'AMap.Scale'等 }).then((AMap) => { // 获取到作为地图容器的DOM元素,创建地图实例 this.

Selenium环境安装配置,webdriver配置

安装Selenium环境 项目环境下 pip install selenium 配置 ChromeDriver 根据自己的chrome浏览器版本,查看版本:设置->关于Chrome ChromeDriver下载地址:https://chromedriver.storage.googleapis.com/index.html windows 配置chromedriver 下载和自己浏览器版本相对应的ChromeDriver,将chromedriver.exe所在路径配置到环境变量的 Path 中 重启命令行,输入:chromedriver --version出现chromedriver版本信息则配置成功 配置chrome 复制chrome浏览器的安装地址,找到chrome浏览器图标->右键->属性,复制“起始位置”的地址,配置到 Path 中 如下图所示: MAC 配置chromedriver 进入命令行工具,确定当前的 SHELL 环境:echo $SHELL 根据自己的SHELL环境选择执行命令: 如果显示/bin/bash,则 vim ~/.bash_profile如果显示 /bin/zsh,则 ‘vim ~/.zshrc’ 在文件中添加:export PATH=$PATH:[chromedriver所在路径] 重启命令行工具 命令行输入 chromedriver 验证是否配置成功 image1217×274 99.8 KB 配置Chrome 复制chrome浏览器的安装地址,找到chrome浏览器图标->右键->属性,复制“起始位置”的地址 配置文件中添加:export PATH=$PATH:[chrome所在路径] 下载 selenium-idx.crx 插件 下载地址:https://download.ceshiren.com/webauto/Selenium_IDE.crx 打开chrome浏览器的开发者模式 将 selenium-idx.crx 文件添加到扩展程序中,Chrome浏览器 → 设置 → 扩展程序,将文件拖入扩展程序中进行安装

使用ELK(Elasticsearch、Logstash、Kibana)和Kafka实现微服务统一日志管理

由于传统的单体应用时代,大多数应用采用的是通过登录SSH客户端登服务器查看,使用less或者tail等指令。 使用ELK(Elasticsearch、Logstash、Kibana)和Kafka实现微服务统一日志管理,可以通过以下几个步骤来完成: 部署Kafka集群:首先需要部署一个Kafka集群,它将作为中间件来缓冲数据,确保高效的日志传输和处理。可以选择在Kubernetes中部署这些组件以实现容器化管理[2]。 部署ELK集群:在系统中部署Elasticsearch、Logstash和Kibana三个组件,搭建ELK日志系统。其中,Elasticsearch负责日志数据的存储与检索,Logstash负责从Kafka消费数据并将数据传输到Elasticsearch,Kibana则负责从Elasticsearch中读取日志数据并进行可视化展示[6]。 日志采集:可以使用Filebeat或者其他日志采集器收集微服务的日志数据,然后将数据发送到Kafka中[1]。 配置Logstash:配置Logstash以从Kafka消费数据,并将消费后的数据写入到Elasticsearch进行存储[4]。 使用Kibana进行日志查看与分析:在Kibana中创建索引模式,以便在Discover功能中查看和分析Elasticsearch中存储的日志数据。通过Kibana的Dashboard功能,可以进一步定制可视化面板,以便更直观地查看和分析日志数据[11]。 高可用性:为确保整个日志系统的高可用性,可以将Logstash、Elasticsearch和Kafka都通过集群模式进行构建[1]。 通过以上步骤,可以实现微服务统一日志管理的搭建。具体实施时,可以根据实际项目需求以及硬件资源进行相应的调整。 第四点中提到的什么是数据消费? 数据消费是一种以统计数据产品和统计数据服务为消费对象的消费活动,是比较特殊的信消息费用形式,是社会消费的重要组成部分。它是统计数据生产的目标和动力,是统计工作最终目标的体现。 1.1 最简单的ELK架构如下图: 1.2 引入kafka的典型ELK架构 为保证日志传输数据的可靠性和稳定性,引入Kafka作为消息缓冲队列,位于各个节点上的Logstash Agent(一级Logstash,主要用来传输数据)先将数据传递给消息队列,接着,Logstash server(二级Logstash,主要用来拉取消息队列数据,过滤并分析数据)将格式化的数据传递给Elasticsearch进行存储。最后,由Kibana将日志和数据呈现给用户。由于引入了Kafka缓冲机制,即使远端Logstash server因故障停止运行,数据也不会丢失,可靠性得到了大大的提升。 相比于最简单ELK架构优点: Kafka+ELK 该架构优点在于引入了消息队列机制,提升日志数据的可靠性,但依然存在Logstash占用系统资源过多的问题,在海量数据应用场景下,可能会出现性能瓶颈。 1.3 FileBeats+Kafka+ELK集群架构 该架构从上面架构基础上改进而来的,主要是将前端收集数据的Logstash Agent换成了filebeat,消息队列使用了kafka集群,然后将Logstash和Elasticsearch都通过集群模式进行构建,完整架构如图所示: FileBeats+Kafka+ELK集群架构 日志采集器Logstash其功能虽然强大,但是它依赖java、在数据量大的时候,Logstash进程会消耗过多的系统资源,这将严重影响业务系统的性能,而filebeat就是一个完美的替代者,它基于Go语言没有任何依赖,配置文件简单,格式明了,同时filebeat比logstash更加轻量级,所以占用系统资源极少,非常适合安装在生产机器上。这就是推荐使用filebeat,也是 ELK Stack 在 Agent 的第一选择。 此架构适合大型集群、海量数据的业务场景,它通过将前端Logstash Agent替换成filebeat,有效降低了收集日志对业务系统资源的消耗。同时,消息队列使用kafka集群架构,有效保障了收集数据的安全性和稳定性,而后端Logstash和Elasticsearch均采用集群模式搭建,从整体上提高了ELK系统的高效性、扩展性和吞吐量。我所在的项目组采用的就是这套架构,由于生产所需的配置较高,且涉及较多持久化操作,采用的都是性能高配的云主机搭建方式而非时下流行的容器搭建。

MyBatis-Plus封装抽取多个xxxMapper类作为方法参数

抽取出来的方法: public void testBaseMapper(String fix, Object reachGoalMapper) { int count = ((BaseMapper<Object>)reachGoalMapper).selectCount(new QueryWrapper<Object>().eq("reach_id", 1)); ReachGoalTemp reachGoalTemp = new ReachGoalTemp; if (count < 1) { Object rg = null; switch (fix) { case "2": reachGoalTemp.setDm("2222222"); rg = new ReachGoal2(); break; case "3": reachGoalTemp.setDm("33333"); rg = new ReachGoal3(); break; case "4": reachGoalTemp.setDm("444444"); rg = new ReachGoal4(); break; } BeanUtils.copyProperties(reachGoalTemp, rg); ((BaseMapper<Object>)reachGoalMapper).insert(rg); } } BeanUtils是:org.springframework.beans.BeanUtils,用来复制属性值 Controller层调用: @Resource ReachGoalService reachGoalService; @Resource ReachGoal2Mapper reachGoal2Mapper; @Resource ReachGoal3Mapper reachGoal3Mapper; @GetMapping("

sqlalchemy.exc.operationalerror: (pymysql.err.operationalerror) (1045, 报错 (已解决)

sqlalchemy.exc.operationalerror: (pymysql.err.operationalerror) (1045, "access denied for user 'root'@'localhost' (using password: yes)") 代码如下: 报错如下: 报错分析: 1.密码错误 2. 字符编码 错误 3.版本问题 ,4 权限问题 1.密码错误: 可以通过 cmd 尝试登入mysql 如果可以登入可以排除 mysql -u root -p 2.字符编码错误解决方式(很少这种情况): # SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:Password123$@localhost:3306/Graduationdesign?charset=utf8" 设置编码: ?charset=utf8 3.版本问题,也就是我这个问题,这个bug搞了我一下午 ,想着换个版本试一下结果就可以了 原因可能是:mysql8 版本 与 mysql 5版本的密码加密插件不同的原因: 为了提供更安全的密码加密, MySQL8.0的首选默认认证插件是caching_sha2_password, 而不是mysql_native_password 解决方法1:.使用mysql 5.7 版本 2:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; 修改验证方式 4.访问权限 ,用户只允许在本地连接,修改成指定ip 或者 % 如: mysql -u root -p use mysql ;

vivado添加winbond flash

修改C:\Xilinx\Vivado\2019.2\data\xicom\xicom_cfgmem_part_table.csv文件,在最末尾添加 CFGMEM_IDHIDDENNAMECOMPATIBLE_DEVICESMEM_DEVICEMEM_TYPEMEM_DENSITYDATA_WIDTHCOMPATIBLE_RS_PINSMEM_MANUFACTURERMEM_INTERFACE_FILENUM_CFG_FILESMEM_DEVICE_ALIASMEM_FAMILY8030w25q128bv-spi-x1_x2_x4#NAME?w25q128bvspi128x1_x2_x4Winbond1w25q128bvw25q 803是紧跟上一个设备的id序号,根据需要填写。

Java学习路线总结,搬砖工逆袭Java架构师

🏆作者简介:哪吒,CSDN2022博客之星Top1、CSDN2021博客之星Top2、多届新星计划导师✌、博客专家💪 ,专注Java硬核干货分享,立志做到Java赛道全网Top N。 🏆本文收录于,Java基础教程系列,目前已经700+订阅,CSDN最强Java专栏,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例,理论结合实战,实现Java的轻松学习。 🏆姐妹篇,Java基础教程(入门篇),包含面向对象、基本数据类型、数组、继承和多态、泛型、枚举等Java基础知识点。 🏆姐妹进阶篇,Java基础教程(进阶篇),包含Java高并发、Spring、MySQL等Java进阶技术栈。 🏆全部订阅后,可加入Java学习星球,完成Java从入门、实战、进阶全方位的Java知识体系学习。 前情提要 无意间听到领导们的谈话,现在公司的现状是码农太多,但能独立带队的人太少,简而言之,不缺干活的,缺PM。 也许这也是这个行业的现状,也是传说中的“35岁危机”的最好解释,如果你马上35岁了,但是你能干的,毕业生也能干,老板还要你作甚? 最近也有很多好友在群里问我,Java知识体系庞大,按照什么顺序学习才是最高效的呢? 目录 前情提要 一、JavaSE 1、Java基础 2、java集合 3、Java高并发 4、Java8新特性 5、Java代码实例 二、javaweb 三、数据库 四、Spring + SpringMVC + MyBatis 五、Spring Boot 六、Redis 七、目标检测YOLO 八、各种中间件技术 九、Netty 十、数据结构与算法 十一、JVM 十二、设计模式 十三、Linux 十四、SpringCloud 十五、JavaScript 十六、Vue 十七、计算机网络 十八、性能调优 十九、系统设计 二十、各种技术的相关源码分析 二十一、计算机理论 二十二、读书笔记 1、重构 改善既有代码的设计 2、【编写高质量代码:改善Java程序的151个建议】 3、深入理解Java虚拟机 二十二、高频面试题 二十三、未来期许 一、JavaSE 1、Java基础 华为OD机试(2022&2023)真题目录 + 考点 + 复盘思路Java学习路线总结(思维导图篇)【Java基础知识 1】Java入门级概述【Java基础知识 2】配置java环境变量【Java基础知识 3】为何要配置环境变量?【Java基础知识 4】秒懂数组拷贝,感知新境界【Java基础知识 5】装箱和拆箱【Java基础知识 6】Java异常详解【Java基础知识 7】toString()、String.valueOf、(String)强转【Java基础知识 8】String、StringBuilder、StringBuffer详解【Java基础知识 9】序列化与反序列化【Java基础知识 9.1】Java序列化与反序列化(重写版)【Java基础知识 10】Java IO流详解【Java基础知识 11】Java泛型详解【Java基础知识 12】Java枚举详解【Java基础知识 13】Java注解详解【Java基础知识 14】Java动态代理【Java基础知识 15】Java反射机制【Java基础知识 16】java内部类详解【Java基础知识 17】聊一聊同步代码块【Java基础知识 18】通过FileUtils.

新建一台VMware虚拟机

文章目录 前言一、问题二、步骤1.确认已安装VMware Workstation,已下载Windows 10 光盘镜像2.新建虚拟机pc13.自定义虚拟机pc1的硬件 总结 前言 新建一台VMware虚拟机。 一、问题 本例要求在VMware Workstation软件中创建一台新虚拟机,相关说明如下。 确认已安装好VMware Workstation虚拟化软件(可以从VMware官网https://www.vmware.com/cn.html获取Workstation Pro安装文件)新建一台VMware虚拟机:系统选型Windows 10 x64,虚拟机名称 pc1,固件类型 BIOS、内存 2048MB,网卡默认NAT,IDE接口硬盘 500GB自定义虚拟机硬件,连接Windows10光盘镜像 二、步骤 1.确认已安装VMware Workstation,已下载Windows 10 光盘镜像 2.新建虚拟机pc1 启动新建虚拟机向导 打开VMware Workstation虚拟机程序,单击菜单项“文件”–>“新建虚拟机”,即可看到“新建虚拟机”向导程序。 配置新虚拟机 在“欢迎使用新建虚拟机向导”界面,选择“自定义(高级)”,单击“下一步”。在“选择虚拟机硬件兼容性”界面,直接单击“下一步”。 在“安装客户机操作系统”界面,选择“稍后安装操作系统”,单击“下一步”。 在“选择客户机操作系统”界面,单选“Microsoft Windows(W)”,版本“Windows 10 x64” ,单击“下一步”。 在“命名虚拟机”界面,指定虚拟机名称“pc1”、存放位置“d:\vm\pc1” ,单击“下一步”。 注:一台windows10虚拟机需要至少20GB的硬件空间,所以虚拟机最好保存在非c盘的位置,并且保证剩余空间充足。 在“固件类型”界面,选择“BIOS”,单击“下一步”。 注:BIOS(Basic Input Output System),中文含义“基本输入输出系统”,是传统的电脑引导方式,支持32位老系统。UEFI(Unifed Extensible Firmware Interface),中文含义“统一的可扩展固件接口”,支持大硬盘、引导速度更快。 在“处理器配置”界面,按默认处理器数量和内核数量 ,单击“下一步”。 注:此处按默认即可,和物理电脑本身配置有关,有时默认为1处理器数量,每个处理器的内核数量为1。 在“此虚拟机的内存”界面,调整内存大小为:2048MB,单击“下一步”。 在“网络类型”界面,选择“使用网络地址转换(NAT)”,单击“下一步”。 在“选择I/O控制器类型”界面,按默认“LSI Logic SAS”,单击“下一步”。 在“选择磁盘类型”界面,按推荐选择,单击“下一步”。 在“选择磁盘”界面,选择“创建新虚拟磁盘”,单击“下一步”。 在“指定磁盘容量”界面,修改“最大磁盘大小”为500G,选择“将虚拟磁盘存储为单个文件”,单击“下一步”。 在“指定磁盘文件”界面,按默认文件名,单击“下一步”。 确认虚拟机配置,完成新虚拟机的创建。 3.自定义虚拟机pc1的硬件 修改虚拟机的光盘属性 单击 虚拟机设备栏的“CD/DVD(SATA) 自动检测”,在“虚拟机设置”对话框右侧“连接”处,选择“使用ISO映像文 件”,单击“浏览”找到对应的ISO文件,确定即可。 修改虚拟机的固件类型 可以自定义修改虚拟机的硬件(添加或者移除)

Visual Studio 2022基础使用操作总结

快速导航 1. 创建项目第一步:双击创建新项目第二步:双击空项目第三步:输入项目信息第四步:右键源文件添加新建项第五步:修改文件名和后缀 2. 认识视图窗口3. 运行程序4. 界面设置4.1 设置主题1. 系统自带主题2. 引入外部主题 4.2 设置字体 5. 编写多个项目5. 编写多个源文件6. 打开前项目1. 途径一2. 途径二 1. 创建项目 .c和.cpp源文件都按如下流程创建 第一步:双击创建新项目 第二步:双击空项目 第三步:输入项目信息 第四步:右键源文件添加新建项 第五步:修改文件名和后缀 如果是.c源文件,则把cpp改为c如果是.cpp源文件,则采用默认cpp即可 2. 认识视图窗口 菜单栏的每一个子菜单都有相应的功能,顾名思义,去寻找需要设置、调试的选项 3. 运行程序 为了养成好习惯,需要手动保存源文件,然后可以使用快捷键 “ctrl+F5” 快速运行,并不进行调试。 4. 界面设置 4.1 设置主题 通过工具中的主题,选择一个颜色主题实现主题设置;或者从外部下载并安装主题,再进行选择一个颜色主题。 1. 系统自带主题 选择工具中的主题,选择一个颜色主题 2. 引入外部主题 选择扩展中的管理扩展,在搜索框中搜索目标主题,下载安装然后工具选项卡中的主题,会新增自定义安装的颜色主题,选择一个颜色主题 4.2 设置字体 可以通过工具中的字体和颜色子选项来选择 consolas 等加宽字体,并设置合适的字号。 5. 编写多个项目 在一个解决方案中右键选择添加多个新建项目,运行新建项目需要设置对应项目为启动项目。 5. 编写多个源文件 同一个项目中,可以添加多个源文件,但只能编写一个main函数,其他源文件中的main函数需要改名才能运行 6. 打开前项目 有两种打开前项目的方法:途径一是双击目标项目的 .sln 文件,途径二是从“最近使用的项目和解决方案”选择目标项目 1. 途径一 方法一,打开以前开发的项目,找到目标文件夹中的.sln文件,双击用VS2022打开,这种方式可以避免打开的文件出现杂项文件的情况 2. 途径二 方式二,可以在文件中找到“最近使用的项目和解决方案”,选择目标项目

PFC2D学习笔记——geometry的使用

geometry命令 通过geometry import+ keyword与geometry export 十keyword实现几何图像集的导入与导出。 目前,PFC5.0 支持dxf格式、stl 格式和geometry 格式(itasca 软件自定义)。 new domain extent -10.0 10.0 geometry polygon positions (0 0 0) (1 0 0) (1 1 0) (0 1 0) geometry export sl format geometry ;导出为 geom格式文件 geometry export s2 format stl ;导出为 stl格式文件 geometry export s3 format dxf ;导出为dxf文件格式(出错,暂不支持) 1.从外部直接导入形文件生成不规则wall: geometry import chelun.dxf format dxf set lun; 直接从文件读取,并默认set名“lun” wall import geometry lun clean ; 用已有的几何图形集(名称boundary)生成wall,然后把几何图形删除。 2.进行刚性簇模板的生成 ;利用几何图形集lun, 创建一个名为dolos的clump模板,并利用bubble法填充颗粒。 clump template create name dolos geometry lun bubblepack ratio 0.

adb获取APK版本号/打开应用

1、查询想要获取的APK的包名 adb shell pm list packages 2、依据包名查询版本号 adb shell "dumpsys package android |grep versionName" android :为被查询的包名 3、获取报名与Activity dumpsys package # 获取所有包名与对应可用Activity dumpsys package |grep dou # 筛选包含‘dou’的信息 4、打开进程 am start com.doudoubird.compass/.StartActivity am start -n com.android.settings/com.android.settings.Settings ---打开系统设置 5、获取当前界面ACTIVITY dumpsys activity top |grep ACTIVITY

css 实现圆环进度条

效果图 主要的思路是 使用锥形渐变给div一个背景,然后使用mask遮挡中间部分,这样就变成一个圆环了,最后用 before和after处理一下 圆环进度开始和结束位置。 html <div class="shadow"></div> css .shadow { width: 100px; height: 100px; position: relative; border-radius: 50%; background: conic-gradient(#ddff5c 0%, #28d4c3 50%, #85ea8e 75%, #1d335c 75%, #1d335c 100%); mask: radial-gradient(transparent 44px, #000 45px); -webkit-mask: radial-gradient(transparent 44px, #000 45px); } .shadow::before { content: ''; position: absolute; left: 48px; top: 0px; width: 5px; height: 5px; background: #ddff5c; border-radius: 50%; } .shadow::after { content: ''; position: absolute; left: -1px; top: 44px; width: 8px; height: 8px; background: #85ea8e; border-radius: 50%; }

k8s相关证书的更新

一、ca.crt 证书更新到10年 1、通过ca.key生成ca.csr openssl x509 -x509toreq -in ca.crt-back -signkey ca.key -out ca.csr 2、通过ca.csr重新签发公钥ca.crt openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt 3、校验ca.crt是否OK openssl verify -CAfile ca.crt healthcheck-client.crt(任意签发的公钥认证) 4、查看更新后的证书时间 openssl x509 -in ca.crt -noout -dates 二、更新kubeadm所有的证书时间 拉取:https://github.com/yuyicai/update-kube-cert 执行:./update-kubeadm-cert.sh all 备注:update-kubeadm-cert.sh 文件内容 #!/usr/bin/env bash set -o errexit set -o pipefail # set -o xtrace # set output color NC='\033[0m' RED='\033[31m' GREEN='\033[32m' YELLOW='\033[33m' BLUE='\033[34m' log::err() { printf "[$(date +'%Y-%m-%dT%H:%M:%S.%2N%z')][${RED}ERROR${NC}] %b\n"

【Redis】记录一次redis异常RedisCommandExecutionException: ERR invalid expire time in setex

1. 记录一次因为redis的key的过期时间为负数的问题 org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR invalid expire time in setex at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:54) at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:52) at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:41) at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44) at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:42) at org.springframework.data.redis.connection.lettuce.LettuceConnection.convertLettuceAccessException(LettuceConnection.java:273) at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.convertLettuceAccessException(LettuceStringCommands.java:799) at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.setEx(LettuceStringCommands.java:232) at org.springframework.data.redis.connection.DefaultedRedisConnection.setEx(DefaultedRedisConnection.java:308) at org.springframework.data.redis.core.DefaultValueOperations$4.potentiallyUsePsetEx(DefaultValueOperations.java:268) at org.springframework.data.redis.core.DefaultValueOperations$4.doInRedis(DefaultValueOperations.java:261) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:228) at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:188) at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:96) at org.springframework.data.redis.core.DefaultValueOperations.set(DefaultValueOperations.java:256) at com.xxxxx.redis.service.RedisService.setCacheObject(RedisService.java:45) 上述异常的原因是因为超时时间小于零导致的,因为我们的key的超时时间是调用另外一个接口给的,然后 再减去多少毫秒得到的。 比如 接口给了80秒过期,我们设置redis的key过期时间 为80-100 = -20 所以导致上述错误

STM32F103中文参考手册(754页)

一、STM32F103中文参考手册(754页) 链接:https://pan.baidu.com/s/13SftqpR4Dgu3pxHOH-Oqyg 提取码:6666 链接永久有效,欢迎广大电子爱好者下载学习。

nginx 报错 HTTP Status 400 – Bad Request

今天使用nginx对nacos集群进行负载均衡报错:页面报错 HTTP Status 400 – Bad Request 查看日志 192.168.198.1 - - [07/May/2023:22:12:21 +0800] "GET /nacos HTTP/1.1" 400 435 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream nacoscluster{ server 192.168.198.129:8849; server 192.168.198.129:8859; server 192.168.198.129:8869; } server { listen 8001; server_name localhost; location /nacos { proxy_pass http://nacoscluster; } } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.

电脑百度网盘打不开怎么办 电脑百度网盘双击没反应处理方法

有时候我们想要在电脑浏览器上下载一些文件时,打开的文件下载链接有些需要通过百度网盘来存储下载,然而当用户在电脑中安装完百度网盘工具之后,双击想要打开时却总是没反应,对此电脑百度网盘打不开怎么办呢?接下来小编就来告诉大家电脑百度网盘双击没反应处理方法。 具体方法: 1、首先点开Win10系统-电脑左下角的标志。 2、鼠标点击一下,会出现一个上拉菜单,在菜单上找到控制面板。 3、点开控制面板,找到系统与安全。 4、点开系统与安全,找到系统并点击。 5、找到高级系统设置,点击后打开系统属性。 6、在系统属性里找到环境变量并点击。 7、在环境变量里找到编辑并点击。 8、点击完进行编辑,变量名为TEMP,然后点击确定。 9、最后在点击系统变量里的确定,这时我们再打开百度网盘客户端就能打开了。 上述就是小编给大家带来的电脑百度网盘双击没反应处理方法了,碰到同样情况的朋友们赶紧参照小编的方法来处理吧,希望能够对大家有所帮助。

获取spring窗口中的注入的类

获取spring窗口中的注入的类 package com.yy.utils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * @author yayun * @version 1.0 * @description TODO * @date 2023/5/7 9:13 */ @Component public class ApplicationContextHolder implements ApplicationContextAware , InitializingBean { private static ApplicationContext holdApplicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { holdApplicationContext = applicationContext; } public static <T> T getBeanByName(String beanName, Class<T> clazz){ T contextBean = holdApplicationContext.getBean(beanName, clazz); return contextBean; } @Override public void afterPropertiesSet() throws Exception { String[] names = holdApplicationContext.

Elasticsearch搜索引擎

The Elastic Stack, 包括 Elasticsearch【搜索,分析】、 Kibana【可视化】、 Beats 和 Logstash【数据的搜集】(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。 Elaticsearch,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎, 是整个 ElasticStack 技术栈的核心。 它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。 文章目录 目录 文章目录 前言 一、倒排索引 二、es的安装 三、ES中常见的概念 四、ES常用API接口 4.1查询匹配 4.2多条件查询 4.3匹配数组 4.4精确匹配 五、ik分词器 六、spring boot整合es 总结 前言 使用场景 国外: 维基百科,类似百度百科,“网络七层协议”的维基百科,全文检索,高亮,搜索推荐 Stack Overflow(国外的程序讨论论坛),相当于程序员的贴吧。遇到it问题去上面发帖,热心网友下面回帖解答。 GitHub(开源代码管理),搜索上千亿行代码。 电商网站,检索商品 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana) 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅《java编程思想》的监控,如果价格低于27块钱,就通知我,我就去买。 BI系统,商业智能(Business Intelligence)。大型连锁超市,分析全国网点传回的数据,分析各个商品在什么季节的销售量最好、利润最高。成本管理,店面租金、员工工资、负债等信息进行分析。从而部署下一个阶段的战略目标。 国内: 百度搜索,第一次查询,使用es。 OA、ERP系统站内搜索。 一、倒排索引 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。 二、es的安装 需要电脑有jdk环境 1.下载安装包并解压 下载地址:下载 Elastic 产品 | Elastic/ 解压后,进入 bin 文件目录,点击 elasticsearch.bat 文件启动 ES 服务 。

在Echarts的barChart中,xAxis的axisLabel中,interval参数如何解释?

在 Echarts 的 barChart 中,xAxis 的 axisLabel 中的 interval 参数表示坐标轴刻度标签的显示间隔,默认值为 0,表示所有标签都会显示。 当柱状图中的标签比较多或者长度较长时,为了避免标签重叠,可以通过设置 interval 参数来控制标签的显示间隔。当 interval 设置为数值 n 时,每隔 n 个标签显示一个标签。例如,当 interval 设置为 2 时,假设 x 轴上有 6 个标签,那么只有第 1、3、5 个标签会显示,第 2、4、6 个标签会被隐藏。 下面是一个示例代码: option = { xAxis: { type: 'category', data: ['标签1', '标签2', '标签3', '标签4', '标签5', '标签6'], axisLabel: { interval: 2 // 设置每隔 2 个标签显示一个标签 } }, series: [{ name: '数据', type: 'bar', data: [10, 20, 30, 40, 50, 60] }] } 以上代码中,x 轴上共有 6 个标签,通过设置 interval 参数为 2,表示每隔 2 个标签显示一个标签,结果只显示了标签1、标签3、标签5。

VSCode MSVC CMake工程模板

1.创建.vscode 文件夹 2.c_cpp_properties.json { "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**", "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.35.32215/include/**" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], "windowsSdkVersion": "10.0.22000.0", "compilerPath": "cl.exe", "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "windows-msvc-x64", "configurationProvider": "ms-vscode.cmake-tools" } ], "version": 4 } 3.创建launch.json { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "

MySQL:数学函数和字符串函数

目录 前言: 数学函数: 求绝对值: 求PI: 求平方根: 求余数: 取整: 随机数: 四舍五入: 只舍不入: 返回参数符号: 幂运算: 对数: 三角函数: 角度与弧度相互转换: 正弦和反正弦: 余弦和反余弦: 字符串函数: 计算字符串中字符个数,以及字符串的长度: 合并字符串: 直接合并: 合并,并添加分隔符: 替换字符串: x 为正整数: x 为负数: x 为0: x 为 1: 其中一个参数为NULL: 字母大小写转换: 获取指定长度字符串: 填充字符串: 删除外侧空格: 重复字符串: 替换字符: 比较字符串大小: 获取字符串: 匹配字符串开始位置: 反转字符串: 返回输入字符串中,指定位置的字符串: 返回输入字符串中,指定字符串的位置: 前言: 仅作为日常学习积累,方便日后查找。 数学函数: 求绝对值: ABS(X) 求PI: PI() 求平方根: SQRT(x) # 负数没有平方根,返回NULL 求余数: MOD(x,y):x是被除数,y是除数,返回的结果是余数 取整: CEIL(x), CEILING(x), FLOOR(x) 这三个的名字起得很有意思,前两个是“天花板”,后一个是“地板”。那么我们的数就是中间的“空气”,用ceil 和 ceiling 就是取“比输入数值大的最小整数”,返回的数值是大于输入数值的整数;用floor 就是取“比输入数值小的最大整数”,返回的数值是小于输入数值的整数。 前两个(ceil 和 ceiling)是一样的,返回的值大于输入的值,取大于x的最小整数。

Echarts堆叠柱状图圆角设置

背景 工作中有需要使用Echarts堆叠柱状图,并给单根柱条头部及底部的颜色设置圆角,常规的设置会生效于同一类颜色,无法达到效果,故设计一个简单的算法,给需要的颜色添加圆角。以下内容已横向柱状图为例。 分析 给柱子设置圆角的方法,是给series设置itemStyle-barborderRadius,但是series指的是同一类颜色,会导致不同坐标的柱子无法根据自己具体的内容给不同的顶部(或底部)颜色设置圆角。考虑采用两次循环的方法,对不同坐标的数据及所含子项的颜色进行遍历,给每一个坐标下的每一个颜色单独判断赋值。 代码 // 遍历所有轴数据(此处需保证series中每项都有完整的子项,即使值为0) for(let i in series[0].data) { // 遍历单根柱子 for(let item of series) { if(item.data[i].value !== 0]) { // 找到第一个不为零的值,为该项添加样式 item.data[i].itemStyle = {barborderRadius: [5, 0, 0, 5]}; break; } } // 反向遍历,为另一头添加圆角 for(let j = series.length - 1; j >= 0; j--) { if(series[j].data[i].value !== 0]) { // 当该项已经有一半为圆角,则设置为全圆角(即该坐标下仅一种颜色) series[j].data[i].itemStyle = series[j].data[i].itemStyle ? {barborderRadius: [5, 5, 5, 5]} : {barborderRadius: [5, 0, 0, 5]}; break; } } } 参考资料 【CSDN】

Gson使用

public class Test { public static void main(String[] args) { // json数组字符串 转json数组 String jsonStr = "[{\"a\":\"1\",\"b\":10}, {a:\"11\",\"b\":110}]"; JsonArray asJsonArray = JsonParser.parseString(jsonStr).getAsJsonArray(); for (JsonElement jsonElement : asJsonArray) { System.out.println("--------"); System.out.println(jsonElement); System.out.println(jsonElement.getAsJsonObject().get("a")); System.out.println(jsonElement.getAsJsonObject().get("a").getAsString()); // 直接使用toString,字符串的时候会有双引号;getAsString会去掉对应双引号 System.out.println(jsonElement.getAsJsonObject().get("b")); System.out.println(jsonElement.getAsJsonObject().get("b").getAsString()); } System.out.println("----------------"); // json字符串 转json对象 String jsonStr2 = "{\"c\":\"12\",\"d\":120}"; JsonObject asJsonObject = JsonParser.parseString(jsonStr2).getAsJsonObject(); System.out.println(asJsonObject.get("c")); System.out.println(asJsonObject.get("c").getAsInt()); System.out.println("----------------"); // json字符串 转bean对象 String jsonStr3 = "{\"name\":\"12\",\"age\":120}"; Person person = new Gson().fromJson(jsonStr3, Person.class); System.out.println(person); System.out.println("----------------"); // bean对象 转json字符串 Person person1 = new Person(); person1.

前端文件下载接口的调用

背景 日常开发中前端经常会遇到需要下载文件的情况,现针对工作中常用的下载接口调用方法进行梳理。下载接口大体分为两类,直接使用url的get接口,或需要传一些复杂参数的post接口。 GET 当下载接口不需要传复杂参数(如选中需要下载的数据信息),此时直接使用get接口,调用方法为直接打开该url即可: location.href = `https://xxxx/xx/xx/xx?id=2`; window.open(`https://xxxx/xx/xx/xx?id=2`); 此方法会打开一个新页面再进行文件下载,若不想打开页面,可以参考以下的post方法进行操作。 POST POST需要传参,故不能直接使用打开页面的方法,使用方法如下: // Angular调用接口的方法 public download(params) { const url = `xxx`; return this.http.post(url, params, {responseType: 'blob'}); // 需要设置返回体类型 } // 下载方法 private download(data, response) { const type = response.headers['content-type']; // 内容类型 const contentDispositon = response.headers['content-disposition']; // 内容形式 const fileName = decodeURI(contentDispositon.split('fileName=')[1] || contentDispositon.split('filename=')[1]); // 获取文件名(此处也可以自定义下载文件名,注意添加后缀) let blob = new Blob([data], {type: type}); const a = window.document.createElement('a'); // 创建一个a标签 const downloadUrl = window.

紫外可见分光光度计 | 探索光的工具 | 详解

探索光的工具 : 紫外可见分光光度计之用途 紫外-可见光谱法(UV-Vis)是一种简单而有效的实验室分析方法,用于确定大分子化合物或其他物质的浓度。这项技术需要使用分光光度计来测量样品吸收的光量,并记录化合物通过的特定波长,从而产生不同的光谱图谱。 (华之光谱 Explorer160UV PRO 紫外可见分光光度计) 分光光度计向装有所需物质的比色皿(一种半透明容器)发射一束光。比色皿只吸收特定波长的光,这种波长取决于溶液的浓度。未被吸收的光穿过样品,然后通过小孔传输,最终被光致发光探测器接收和记录,产生每种化合物都不同的特定光谱图谱。 除了在生物和化学研究中使用,紫外-可见光谱法还有多种实际应用。例如,它可以用于辨别艺术品的时期、制作某些颜色的材料,甚至在绘画修复中进行颜色识别。 这种非侵入性的光谱技术可以用于绘画和纺织品上颜料的鉴定,是其独特的特征之一。 此外,环境科学家使用分光光度计来模拟水中有机污染物的光化学转化,并研究地球上的空气质量和气候。 在更大的尺度上,天体物理学家使用UV-Vis来了解不同行星的大气层,例如火星和金星。 探索光的工具 : 紫外可见分光光度计之历史 1930 年代,维生素研究发现多种维生素,特别是维生素 A,可以吸收紫外线 (UV)。美国政府对使用紫外线和可见光 (UV-Vis) 光测量士兵口粮中维生素含量的兴趣推动了这项研究,并最终在 1940 年代初期进行了 UV-Vis 分光光度计的商业发布。 其中,贝克曼 DU 分光光度计于 1941 年首次销售,它通过提供更准确的结果并将分析时间从数小时甚至数周缩短到几分钟,从竞争产品中脱颖而出。 现代紫外-可见分光光度计与第一代 DU 有很大不同,但它们都基于相同的基本原理运行。光强度是在 UV-Vis 光源灯测量的光通过样品之前和之后测量。吸收的光量对应于样品中的分子浓度。无论是作为独立仪器还是高效液相色谱 (HPLC) 检测器,紫外-可见分光光度计都是测量分析物浓度不可或缺的。它们在科学研究、学术教学和 QA/QC 实验室研究药物、蛋白质、DNA、太阳能电池板、半导体和涂料等方面都扮演着重要角色。 新的仪器设计和附件扩大了紫外-可见样品的范围——从传统上在 1 厘米比色皿中以毫升体积测量的液体到今天的微量体积。诺贝尔奖获得者布鲁斯·梅里菲尔德 (Bruce Merrifield) 将紫外-可见分光光度计称为“可能是有史以来为推动生物科学发展而开发的最重要的仪器”。 布鲁斯·梅里菲尔德 (Bruce Merrifield) 20世纪30年代 1935年,阿诺德·贝克曼创立了国家技术实验室,后来命名为贝克曼仪器公司。 20世纪40年代 介绍了第一批商用紫外-可见分光光度计。1940年,贝克曼和国家技术实验室的同事制造了他们的第一台实验室分光光度计。该项目的负责人霍华德·H·卡里后来成立了卡里仪器公司。 1941年,贝克曼推出了DU UV-Vis分光光度计,它比任何其他商业仪器都具有更高的分辨率和更低的紫外线杂散光。 1946年,霍华德·卡里、乔治·W·唐斯和威廉·C·米勒以应用物理公司的名义创立了卡里仪器公司。此前,霍华德·卡里是贝克曼仪器公司负责开发的副总裁。 1947年,应用物理公司向宾夕法尼亚州匹兹堡的梅隆研究所交付了第一台商用记录UV-Vis分光光度计Cary 11。 20世纪50年代 1950 年代 – 1970 年代 批量生产降低了紫外-可见分光光度计的成本。 新的光电二极管阵列同时收集所有波长,将扫描光谱所需的时间从几分钟缩短到几秒钟。 1950 年,National Technologies Laboratories 更名为 Beckman Instruments, Inc。

Halcon模板匹配之形状匹配,缩放比匹配,相关性匹配

是什么是模板匹配? 模板就是一副已知的小图像,而模板匹配就是在一副大图像中搜寻目标,已知该图中有要找的目标,且该目标同模板有相同的尺寸、方向和图像元素,通过一定的算法可以在图中找到目标,确定其坐标位置 模板匹配的参数介绍: 1. 图像金字塔:Numberlever 2. 起始角度:AngleStart 3. 角度范围:AngleExtern 4. 角度步长:AngleStep 5. 优化算法:Optimization 6. 极性:Metric 7. 对比度:Contrast 8. 最小对比度:MinContrast 9. 缩放比:scale(find_scale_shape_model.hdev) 查找模板参数介绍 1. 最小匹配分数:Score 。 2. 匹配最大个数:NumMatches 3. 最大重叠比:MaxOverlap(1 为允许重叠,0 为不允许) 4. 亚像素精度:SubPixel。 5. 搜索时使用的金字塔层数:NumLevels (0 为最高效)。 6. 贪婪度:Greediness(为 0 时慢而安全,为 1 时快而可能匹配失败)。 9.2基于助手的模板匹配步骤 9.3基于形状的模板匹配 1.创建形状模板匹配create_shape_model 算子: Template NumLevels AngleStart AngleExtent AngleStep Optimization Metric Contrast MinContrast ModelID 示例:create_shape_model (ImageReduced, 'auto',0,rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) ImageReduced1(输入对象):输入图像对象 'auto'(输入控制参数1):默认自动获取 0(输入控制参数2):创建模板的起始角度(弧度)

WebStorm2023上传项目到Gitee仓库(清晰、明确、具体)

一、创建Gitee仓库 Tip:若已经创建过了,直接跳到第二部分看VsCode如何上传代码到Gitee 创建仓库比较简单,下面两张图就是整个过程,这里不在赘述,具体如下: 二、WebStorm上传项目到Gitee仓库 1.打开WebStorm,点击"更多符号"选择设置。如下图所示。 2.找到设置中的 Gitee 插件,首先登录到Gitee系统。如下图所示。 3.接下来在弹出的 Gitee 登录界面输入账号信息登录到系统。如下图所示。 4.登录成功后,授权给 WebStorm 软件。如下图所示。 5.在设置中确定 Gitee账户信息。如下图所示。 6.添加项目到 本地仓库。如下图所示。 7.提交项目目录。如下图所示。 8.推送项目到Gitee。如下图所示。 9.错误信息提示的处理,(若无提示----> 请跳过此步骤,看第10步)。如下图所示。 10. 若是初次使用,则连接到 Gitee仓库上的仓库。(与IDEA过程操作相似,这里以 IDEA操作为例,若不是第一次连接新的仓库请跳过本步骤,看第 11 步)。如下图所示。 11.推送项目到 Gitee。如下图所示。 12. 进入我们Gitee中的仓库,可以看到我们上传上去的项目代码

使用Python轻松识别音频中文字(Whisper)

使用Python轻松识别音频中文字 一、前言 在开会或是讨论问题的时候,我们总有一些内容需要记录下来。但由于各种原因,我们无法做到全面细致的记录。事后我们可能需要补充这些细节性内容,而回放视频或是录音费时费力,这时候语音识别可以帮助我们轻松解决这一痛点。目前,常见的语音识别服务以收费的居多,而免费且识别效果较好的也有。比如,由OpenAI 开发的Whisper。 二、Whisper简介 Whisper是由OpenAI基于Python开发的能够识别多国语言的语音识别模型,同时能将识别结果翻译为指定语言。 Open AI的官方介绍:Whisper是一种通用的语音识别模型。它是在不同音频的大型数据集上训练的,也是一个多任务模型,可以执行多语言语音识别、语音翻译和语言识别。即它可以实现自动识别音频中的语言,语音识别,将识别结果翻译为指定语言这些功能。 三、Github项目地址 项目地址:https://github.com/openai/whisper 这里面有该项目的详细介绍,如对应的论文,安装方法,使用方法等。 四、Whisper 安装要求 Pytorchffmpegsetuptools-rust 五、识别速度 这里讲一下我使用过程用中得到的结果。 使用GPU版Pytorch进行计算时,GeForce MX150显卡(4G显存)使用small模型识别一段40分钟左右的视频大约为30分钟。使用CPU版Pytorch进行计算时,Intel 酷睿i7 8550U使用large模型识别一段40分钟左右的视频大约为12小时。 六、识别结果 使用small模型识别,有些地方会出现识别错误。有时也会将识别结果以繁体汉字显示。使用large模型识别,基本没有看到错误,也不会出现识别结果以繁体汉字显示的情况。 七、建议 如果有大于4G显存N卡,或者不用考虑识别速度的,尽量使用大模型进行识别工作。 八、 Whisper的其他用途 whisper也可以用来辅助剪辑视频。因为它识别的每一句话都会附上这段话时间起点和终点,如以下片段所示。更细致的讲解请在搜索《在讲 OpenAI Whisper 前先做了一个剪视频小工具【论文精读·44】》获取答案! 00:59.200 --> 01:02.560 我们的目标就是榨干真题的价值 01:03.840 --> 01:05.480 那么什么叫做榨干 01:06.920 --> 01:08.520 这个非常纯洁的来讲 01:09.320 --> 01:11.520 榨干就像榨油一样 对吧 01:12.240 --> 01:13.080 一滴都不剩

Vue3超详细的ref()用法,看这一篇就够了

ref( ) 接受一个内部值,返回一个ref 对象,这个对象是响应式的、可更改的,且只有一个指向其内部值的属性 .value。 ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。 1、ref 对象是可更改的,即可以为 .value 赋予新的值 举例: const a = ref(1); // 为 a.value 赋予新的值 a.value = 2; console.log("a--->", a); console.log("a.value--->", a.value); 查看打印结果: 2、ref 对象是响应式的,即所有对 .value 的操作都将被追踪,并且写操作会触发与之相关的副作用。 ref()方法允许创建可以使用任何值类型的响应式 ref ref 的 .value 属性也是响应式的。 当ref的值为对象类型时,会用 reactive() 自动转换它的 .value。 举例:一个包含对象类型值的 ref 可以响应式地替换整个对象 const b = ref({ name: 'vue3' }); // 响应式替换 b.value = { name: 'vite' }; console.log("b--->", b); console.log("b.value--->", b.value); 查看打印结果:

【Mock】JSON Server常用使用教程(自动生成遵循restful风格的API)

文章目录 1.安装2.快速使用2.1准备db.json文件(名字可以随意,当必须是.json结尾)2.2启动JSON Server2.3调用API2.3.1 GET请求2.3.2 POST请求2.3.3 PUT请求2.3.4 DELETE请求2.3.5 PATCH请求 3.详细使用3.1 传参的方式3.1.1 通过路由传参3.1.2 通过parmas传参3.1.3 通过payload传参 3.2嵌套属性查询3.3进行分页3.4实现排序3.5筛选条件(大于,小于,排除,模糊匹配)3.5.1大于和小于3.5.2排除3.5.3模糊匹配 3.6全文搜索3.7关联查询(一对多,多对一,多对多)3.7.1一对多3.7.2多对一3.7.3多对多 3.8查询数据库结构 1.安装 npm全局安装 npm install -g json-server yarn 全局安装 yarn global add json-server npm基于特定项目的本地安装 npm install json-server yarn基于特定项目的本地安装 yarn add json-server 如何过编写项目的话建议只在项目本地安装,因为全局安装可能会导致一些问题,例如版本冲突或者环境变量问题. 2.快速使用 2.1准备db.json文件(名字可以随意,当必须是.json结尾) db.json { "posts": [ { "id": 1, "title": "json-server", "author": "typicode" } ], "comments": [ { "id": 1, "body": "some comment", "postId": 1 } ], "profile": { "name": "typicode" } } 2.

Docker容器启动时报错:container init caused “write /proc/self/attr/keycreate: permission denied““: unknown

一、报错详情 docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “process_linux.go:449: container init caused “write /proc/self/attr/keycreate: permission denied””: unknown. 二、原因 permission denied” 表示文件没有写入权限,被拒绝访问了 selinux是linux为了系统安全性做的控制,会控制用户可以访问、读取、修改哪些文件,比如,前面的write /proc/self/attr/keycreate文件没有权限,就是被selinux限制了。 selinux有三种模式: enforcing 强制 permissive 宽容的 diabled 禁止的, 限制程度由高到低。 三、解决办法: 1.永久修改(慎重!!!) (1)cat /etc/selinux/config,更改SELINUX=disable (2)重启生效 2.临时修改,不重启生效,重启后恢复 (1)/usr/sbin/setenforce 0 立刻关闭 SELINUX【还原:/usr/sbin/setenforce 1 立刻启用 SELINUX】 (2)加到系统默认启动里面:echo "/usr/sbin/setenforce 0" >> /etc/rc.local

C#_宏定义

关键字简述 //仅可用在using前 #define #undef //仅可在using后 #elif //无限制 #if #else #endif 注:与或非(&& || !) 的使用同样无限制 宏定义的用途 宏定义常用于版本控制,例如在X环境下使用A代码,在Y环境下使用B代码 示例代码 #define VERSION_3 #if !VERSION_3 #define VERSION_1 #define VERSION_2 #else #undef VERSION_1 #undef VERSION_2 #endif using System.Threading.Channels; namespace ConsoleApp_1 { internal class Program { static void Main(string[] args) { #if VERSION_1 && VERSION_2 Console.WriteLine("VERSION_1"); #elif VERSION_3 Console.WriteLine("VERSION_2 VERSION_3"); #else Console.WriteLine("UNKNOW_VERSION"); #endif } } } 运行效果

绘制上海地铁网络图

绘制上海地铁网络图 需求 1.网络图适配iOS、android、web、大屏 2.线路高亮 技术选择 vue + d3 方法设计 1.初始化 var metro = function (info) {} 2.创建路线 var createPaths = function (lines) {} 3.创建站点 var createStations = function(stations) {} 4.显示遮盖层 var showTransparentCover = function () {} 5.线路高亮 var showSingleLinebeforeCover = function () {} 数据结构 1.SHMetro.info { "info": { "id": "", "name": "", "width": "", "height": "", "bgColor": "" } } 2.lines { "lines": [ { "line_id": "1", "name_en": "line1", "

虚拟机服务器搭建

一、虚拟机安装 1.安装vmware软件 直接进入vmware官网或其它平台下载都可,这里安装的是vmware workstation 17 pro,官网链接如下: 下载 VMware Workstation Pro | CN 激活秘钥:ZF3R0-FHED2-M80TY-8QYGC-NPKYF 如无效,请自行网上百度一下,网上有很多 2.下载镜像文件 这里用的是 CentOS-7-x86_64-DVD-2009,可自行官网下载 链接:https://pan.baidu.com/s/1X8jjQtVv-WkmNl1FsaSQYw 提取码:0306 3.创建虚拟机 vmware软件下载完成后,直接安装即可。安装完成后,就需要创建新的虚拟机。 centos虚拟机服务器手把手搭建_虚拟机搭建服务器_无名之辈之码谷娃的博客-CSDN博客 这篇文章对虚拟机搭建讲的还是比较详细。 完成后,需要为用户添加sudo权限,不然你创建的用户是没有sudo权限的 打开终端命令窗口,进入root用户下: vi /etc/sudoers 添加用户名如下 保存退出。 至此虚拟机已安装好 二、网络配置 1.虚拟机配置 vi /etc/sysconfig/network-scrips/ifcfg-ensxx 配置网络信息,ensxx为网卡名称,这里是ens33,如下图所示: 配置完成后,wq保存退出 2.设置虚拟网络编辑器 编辑-->虚拟网络编辑器打开如下所示 修改NAT模式如下: 注意网关IP与上一步骤网关需保持一致 2.设置VMnet8属性 打开本地网络设置--> 高级网络设置-->更改适配器选项-->鼠标右击VMnet8-->打开IPV4 设置如下: 网关需与前两步骤设置的一致,IP地址与网关同段,且不与ens33中IP地址冲突。 重启VMnet8网卡 service network restart 或 reboot 重启 网络测试: 输入命令:ping www.baidu.com 外网连接是否正常 输入命令:ping 192.168.0.11 内网是否正常 注意: 1.如果内网电脑IP与虚拟机不同段,则虚拟机可以ping通内网,而内网上的电脑ping不同虚拟机 2.当把虚拟机的网段改成和内网电脑同网段时,可能出现问题:虚拟机ping不同本机电脑及内网电脑(这点我也没搞明白是什么问题) 3.如果虚拟机 network状态显示为 active(exited),可能是本地服务器的VMnet相关服务未开启 4. ifconfig 打开查看ens33网卡未启动 ,查看文件ifcfg-ens33文件内ONBOOT=yes没问题,

【已解决】Microsoft Visual C++ Redistributable is not installed

【Error】导入torch,提示报错: Microsoft Visual C++ Redistributable is not installed, this may lead to the DLL load failure. 【Cause】 Anaconda没有默认安装在C盘; 系统没有安装VC++ Redistributable程序。 【Resolve】 VC++ Redistributable.exe 双击安装,重启电脑即可。

ChatGLM-6B 部署与 P-Tuning 微调实战

自从 ChatGPT 爆火以来,树先生一直琢磨想打造一个垂直领域的 LLM 专属模型,但学习文本大模型的技术原理,从头打造一个 LLM 模型难度极大,所以这事儿就一直搁置了。 但最近一个月,开源文本大模型如雨后春笋般接踵而至,例如 LLaMA、Alpaca、Vicuna、 ChatGLM-6B 等。树先生觉得这个事有着落了,毕竟站在巨人的肩膀上,离成功就会更近一步。 经过比较,我选择了ChatGLM-6B 作为预训练模型,一方面是它的中文支持效果好,另一方面是它的参数是 62 亿,对 GPU 性能要求相对较低,可以压缩成本。 概念科普 ChatGLM-6B 是什么? ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的 显卡 上进行本地部署(INT4 量化级别下最低只需 6GB 显存) 。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。 为了方便下游开发者针对自己的应用场景定制模型,同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。 不过,由于 ChatGLM-6B 的规模较小,目前已知其具有相当多的局限性,如事实性/数学逻辑错误,可能生成有害/有偏见内容,较弱的上下文能力,自我认知混乱,以及对英文指示生成与中文指示完全矛盾的内容。更大的基于 1300 亿参数 GLM-130B 的 ChatGLM 正在内测开发中。 硬件需求 量化等级最低 GPU 显存(推理)最低 GPU 显存(高效参数微调)FP16(无量化)13 GB14 GBINT88 GB9 GBINT46 GB7 GB 最低只需 7GB 显存即可启动微调,就问你香不香~

docker-compose安装redis+nacos+nginx+mysql

redis: docker-compose.yml version: '3' services: redis: container_name: redis image: redis:6.2.7 restart: always ports: - 6379:6379 volumes: - ./data:/data - ./conf/redis.conf:/etc/redis/redis.conf command: redis-server /etc/redis/redis.conf --appendonly yes redis.conf文件 daemonize no pidfile /data/redis-6379.pid port 6379 tcp-backlog 65535 bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice databases 16 lua-time-limit 5000 maxclients 10000 protected-mode yes dir /data slowlog-log-slower-than 10000 slowlog-max-len 128 maxmemory 6G maxmemory-policy volatile-lru save 3600 1 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "

StarWind V2V Converter - 免费好用的 img 转换 vmdk 格式软件

StarWind V2V Converter - 免费好用的img转换vmdk格式软件-老部落 StarWind V2V Converter是一款免费好用的虚拟磁盘双向转换工具,通过StarWind V2V Converter用户能够轻松的对虚拟磁盘进行迁移转换,并且不会对原虚拟磁盘造成任何影响,有需要的可以下载使用。 安装完毕 Sta rW i nd V2V Converter 软件之后 , 我们打开软件 , 获取需要转换的 IMG 文件格式 。 这里我们获取查看 IMG 文件信息之后继续下一步 。 选择输出的区域 , 我们还是输出保存到本地 , 因为本地虚拟机要用到 。 选择输出的格式 , 支持VMDK 、 VHD 、 QCOW2格式等 。 转ESXI 可用文件就OK 了;下面是转win版,workstation 可用文件。 这里在选择 VMDK 的格式 , 默认第一个 。 最后确定保存转换映像名称和路径 , 然后转化执行 。 可以利用 StarWind V2V Converte r 进行IMG 格式镜像转化VMDK 格式 。 ==================================================================== p2v到云上能不能成功,我有个经验:物理机环境,尤其是带raid的物理机环境,直接制作镜像上云,导入镜像大概率会失败,即便强制导入成功开机一般也会蓝屏。最稳妥的办法是先在线下,p2v到vmware验证,如果在vmware里能成功,上云的可能性才大。 腾讯云有个大前提,系统盘只支持MBR,不支持GPT,需要提前确认这一点,如果是GPT的系统盘,就不要尝试了,先想办法搞成MBR的再说。

C语言程序设计作业

1.运算符的应用I 输入一个五位的整数i,依次将其个位,十位,百位,千位,万位数取出来保存到变量a,b,c,d,e中;按照输出案例的格式依次输出 c,d,b,e,a. 输入 五位整数 输出 取个位a,十位b,百位c,千位d,万位数e, 按照格式依次输出 c,d,b,e,a. 样例输入 12345 样例输出 32415 #include<stdio.h> int main() { int x,a,b,c,d,e; scanf("%d",&x); a=x%10; b=x/10%10; c=x/100%10; d=x/1000%10; e=x/10000; printf("%d%d%d%d%d",c,d,b,e,a); return 0; } 2.运算符的应用II 输入4个整数a,b,c,d;如果它们构成递增数列(所有相邻的元素满足<=关系),则输出1;否则输出0 样例输入 1 1 1 2 样例输出 1 #include<stdio.h> int main() { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); if(a<=b) if(b<=c) if(c<=d) printf("1"); else printf("0"); else printf("0"); else printf("0"); return 0; } #include<stdio.h> int main() { int a,b,c,d,x; int f=1,e=0; scanf("%d%d%d%d",&a,&b,&c,&d); x=b>=a?(c>=b?(d>=c?f:e):e):e; printf("%d",x); } 3.

【Kafka】概述与集群部署

文章目录 Kafka概述定义应用场景缓冲/削峰解耦异步通信 应用模式点对点模式发布/订阅模式 基础架构 Kafka集群部署集群规划下载解压修改配置文件分发安装包hadoop103、hadoop104修改配置文件配置环境变量启动集群先启动Zookeeper集群然后启动Kafka 关闭集群 集群启停脚本脚本编写添加执行权限启动集群脚本命令停止集群脚本命令 Docker启动Kafka集群docker-compose.yml编写启动compose命令行验证Python验证 Kafka概述 定义 kafka是一种分布式的,基于发布/订阅的消息队列 (MessageQueue)。它可以处理消费者在网站中的所有动作流数据。 Kafka是一个开源的分布式事件流平台(Event StreamingPlatform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。(既想处理消息队列,又想处理数据) 应用场景 缓冲/削峰 有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。 解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 异步通信 允许用户把一个消息放入队列,但并不立即处理它,然后在需要的时候再去处理它们。 应用模式 点对点模式 消费者主动拉去数据,消息收到后清除消息 发布/订阅模式 • 可以有多个topic主题(浏览、点赞、收藏、评论等) • 消费者消费数据之后,不删除数据 • 每个消费者相互独立,都可以消费到数据 基础架构 (1)Producer:消息生产者,就是向Kafka broker发消息的客户端。 (2)Consumer:消息消费者,向Kafka broker取消息的客户端。 (3)Consumer Group(CG):消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。 (4)Broker:一台Kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。 (5)Topic:可以理解为一个队列,生产者和消费者面向的都是一个topic。 (6)Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。 (7)Replica:副本。一个topic的每个分区都有若干个副本,一个Leader和若干个Follower。 (8)Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是Leader。 (9)Follower:每个分区多个副本中的“从”,实时从Leader中同步数据,保持和Leader数据的同步。Leader发生故障时,某个Follower会成为新的Leader。 Kafka集群部署 集群规划 hadoop102hadoop103hadoop104zkzkzkkafkakafkakafka 下载解压 官网地址;https://kafka.apache.org/downloads # 下载 cd /opt/module wget https://downloads.apache.org/kafka/3.4.0/kafka_2.12-3.4.0.tgz # 解压 tar -zxvf kafka_2.12-3.4.0.tgz -C /opt/module/ # 改名 mv kafka_2.12-3.4.0/ kafka 修改配置文件 路径:config/server.properties