vue3.2 elementplus 中 popover组件指定按钮触发

<template> <el-button type="primary" @click="(e:any)=>showLogin(e)" > 指定触发按钮 </el-button > <el-popover v-if="popVisible" placement="bottom" :width="300" trigger="click" v-model:visible="popVisible" virtual-triggering :virtual-ref="tempRef" :show-arrow="false" popper-class="pop-class" > 我是content </el-popover> </template> <script lang="ts" setup> import {ref,unref,nextTick} from 'vue' const popVisible= ref<boolean>(false); const tempRef = ref() const showLogin = (e:any)=>{ const evt = e || (window as any).e || (window as any).event; if (unref(tempRef) && unref(tempRef).tempRef) popVisible.value = false nextTick(() => { tempRef.value = evt.currentTarget popVisible.value = true })

reentrantLock的使用

reentrantLock是和锁有关,那么必然就涉及到并发操作,所以我们先构建一个项目: 依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> 准备工作 往redis里面放一个值,num,值设置成100 相关代码 package com.jiubodou.bingfa.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.locks.ReentrantLock; /** * @ClassName MyController * @Description * @Author huyingliang * @Date 2023/5/23 15:32 */ @RestController public class MyController { public static ReentrantLock reentrantLock = new ReentrantLock(); @GetMapping("/") public String sayHello() { return "

java 正则表达式精确查找和替换指定字符

情形: 在复制模型的时候,要给名称加上“-复制”。一开始用的是 replace进行全部替换。在测试的时候,出现有元素名称跟模型名称是一样的,这样替换就有问题。这时候要改成正则去匹配和替换对应内容。 { "flowModel": { "flowMod": 502, "flowType": 2, "flowTypeName": "普通流程", "flowTypeNameUs": "common", "flowName": "流程表单模型A", "flowNameUs": "流程表单模型A", "fieldName": "流程表单模型A", "state": "A" }, "formModel": { "formId": 108, "flowMod": 502, "flowName": "流程表单模型A", "flowNameUs": "流程表单模型A", "formName": "流程表单模型A", "formNameUs": "流程表单模型A", "fieldName": "流程表单模型A" } } 目标: 替换里面 flowName, flowNameUs,formName和formNameUs的名称 先处理一个 先写正则表单式: String pattern ="\"flowName\""+ ":"+"\\s*\"" + modelName + "\""; \\s*可以匹配0到多个空格 匹配到对应值后,用整个值进行替换 public static String matchReplaceName(String content, String modelName, String newModelName) { String pattern ="

视频转码服务器配置H.265转码H.264方法

视频转码服务器应用在不同的视频编码格式之间的互转,通过部署视频转码服务器可以快速的解决各种视频间的编码格式不兼容的问题,助力视频项目快速落地。今天我们以新领通PRN1600视频转码服务器为例,看一下,如何讲H.265的视频实时转换为H.264编码。 首先我们用GB28181方式去摄像头拉流,当然,也可以通过RTSP方式进行拉流。 1. 配置摄像头视频编码为H.265 摄像头视频编码配置界面 我们采用海康摄像头作为演示,配置海康摄像头为H.265编码,分辨率1080P 2. 配置国标GB/T28181注册到转码服务器 在海康摄像头平台接入界面,可以配置摄像头国标参数,可以直接注册到视频转码服务器上。我们用于演示的情况可以直接配置。在实际项目中,你的摄像头可能注册在NVR,国标监控平台上 。在项目中,视频转码网关可以直接对接NVR,监控平台,配置方法大同小异。 3.视频转码服务器上配置一个编码规则 通过配置一个转码规则,将视频转码为H.264,分辨率为720P,可以灵活的配置转码规则,通过配置多个转码规则,达到不同的转码效果。在转码策略时灵活调用。 4. 配置转码策略 配置一个转码策略,选择我们刚刚配置好的转码规则,如现在的转码策略是不管转码服务器拉的视频流是什么编码格式,都根据720规则来处理。如上所示,720规则就是所有视频转换为H.265,分辨率为720P。 5.通过VLC测试拉一路FLV视频流 完成以上配置,我们可以使用VLC进行测试。通过VLC视频播放器直接拉一路国标的摄像头,并采用FLV格式播放。 通过VLC去拉GB28181的国标ID为34020000001320000005的摄像头。 可以成功拉出视频流 我们进入转码服务器运行状态界面,可以查看到此时的转啊状态。 我们可以通过转码状态界面查看到,此时,一路输入到视频,编码是H.265,分辨率是1080P,而输出视频是H.264编码,720P的分辨率。 并可以查看此时的延迟,抖动,帧率,码率等重要信息,并可以根据具体需求在转码规则和策略中进行调整。 当然,新领通视频转码服务器还支持输出国标28181,RTP,RTSP,RTMP,HLS,SIP,WebRTC等多种方式,本文只演示国标28181转码FLV的方式,后续会给大家介绍更多的转码方法和应用场景。

UDP/SSDP/ONVIF协议之间的区别

UDP协议作为一种简单而高效的传输协议,保持着相对稳定的发展。而SSDP协议和ONVIF协议则在智能家居和视频监控领域发挥着重要的作用,随着技术的进步和标准的完善,它们不断适应新的需求和挑战,以促进设备之间的互联和互操作性。 UDP UDP协议(User Datagram Protocol)是一种面向无连接的传输协议,它位于OSI模型的传输层。UDP提供了一种简单的数据传输机制,它不像TCP协议那样提供可靠的数据传输和错误恢复机制,而是将数据报直接发送给目标地址,因此具有低延迟和较小的开销。 UDP协议的发展演变相对较少,它作为互联网传输协议的一部分,几乎没有发生实质性的变化。然而,UDP仍然广泛应用于许多网络应用中,特别是那些对实时性要求较高的场景,如音频和视频流传输、在线游戏等。UDP协议类似于订阅发布模式。 SSDP SSDP协议(Simple Service Discovery Protocol)是一种基于UDP的网络协议,它用于设备的发现和服务的自动配置。SSDP主要用于在局域网中发现支持Universal Plug and Play(UPnP)的设备,并允许这些设备自动配置网络设置和服务。它通过多播方式发送服务发现消息,从而使设备能够自动发现和连接到网络中的其他设备。 SSDP协议的发展演变主要围绕UPnP技术的发展。UPnP是一种网络协议集合,它允许设备自动发现、连接和配置网络服务。随着智能家居和物联网的兴起,UPnP和SSDP在设备互联和通信方面变得越来越重要。然而,由于SSDP协议的安全性和隐私问题,最新的发展趋势是将其替换为更安全的替代协议,如mDNS(Multicast DNS)和DNS-SD(DNS-Based Service Discovery)。 ssdp简单服务发现协议,在udp协议基础的上层协议 .但是只针对内网239.255.255.250:1900 这样一个内网端口.该机制已经非常普遍,如果我们订阅239.255.255.250:1900 就会发现,每台电脑的 谷歌浏览器/edge浏览器/nodejs 等等都往这里发消息 只有:ssdp:discover查询 /live心跳/ byebye离线 三种主动发送,另外如果符合其他设备的查询条件ssdp:discover,自己则会可以回复该设备。 ONVIF ONVIF协议(Open Network Video Interface Forum)是一个开放的网络视频接口标准,它旨在实现不同厂商的网络摄像机和监控设备之间的互操作性。ONVIF协议定义了一组标准和规范,以确保设备之间的互联和互操作性,包括设备发现、设备管理、视频流传输和事件处理等方面。 ONVIF协议的发展演变主要涉及协议版本的更新和功能的扩展。随着技术的发展和市场需求的变化,ONVIF协议的不断更新使得设备之间的互操作性得到改善,并支持更多的功能和特性。例如,最初的ONVIF协议版本支持基本的视频流传输和设备管理功能,而较新的版本则增加了更高级的功能,如运动检测、智能分析和音频传输等。 目前,网络摄像机的标准协议,国际标准上有三大类:ONVIF、PSIA和HDCCTV,国内标准有国标GB/T28181。ONVIF阵营日益壮大,与PSIA、HDCCTV相比,无论是支持厂商的数目、厂商的知名度,还是市场占有率都遥遥领先。ONVIF标准的厂商覆盖芯片、视频前端设备、存储设备、系统平台、智能分析设备、门禁、传感设备等各个安防相关领域。我们说的IPC摄像头只是ONVIF标准里的一个分支而已,可见ONVIF的强大。 ONVIF(Open Network Video Interface Forum,开放型网络视频接口论坛)以公开、开放的原则共同制定开放性行业标准。 从ONVIF官网上可以了解到,为适应各种不同的参与级别,ONVIF提供了不同等级的会员企业资格,其中不乏国内外著名的设备制造商与集成商,国内的华为、海康威视、浙江大华、波粒科技和佳信捷也是ONVIF论坛的高级会员。 ONVIF技术框架 ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行。

MATLAB 之 二维图形绘制的基本函数和辅助操作

文章目录 一、绘制二维曲线的基本函数1. plot 函数的基本用法2. 含多个输入参数的 plot 函数3. 含选项的 plot 函数4. 双纵坐标函数 plotyy 二、绘制绘制图像的辅助操作1. 图形标注2. 坐标控制3. 图形保持4. 图形窗口的分割 二维图形是将平面坐标上的数据点连接起来的平面图形。可以采用不同的坐标系,除直角坐标系外,还可以采用对数坐标、极坐标。数据点可以用向量或矩阵形式给出,类型可以是实型或复型。二维曲形的绘制无疑是其他绘图操作的基础。 一、绘制二维曲线的基本函数 在 MATLAB 中,基本的绘图函数是 plot 函数,利用它可以绘制出不同的二维曲线。 1. plot 函数的基本用法 plot 函数用于绘制 x y xy xy 平面上的线性坐标曲线图,因此需提供一组 x x x 坐标及其各点对应的 y y y 坐标,这样就可以绘制分别以 x x x 和 y y y 为横、纵坐标的二维曲线。plot 函数的基本调用格式如下: plot(x,y) 其中, x x x 和 y y y 为长度相同的向量,分别用于存储 x x x 坐标和 y y y 坐标数据。例如,在 0 ≤ x ≤ 2 π 0\le x\le2\pi 0≤x≤2π 区间内,我们绘制曲线 y = 2 e − 0.

Golang运行环境问题

Background 1 执行程序报错 go tool: no such tool compile 2 切换环境配置失败 go env -w GOBIN=... does not override conflicting OS environment variable 3 环境变量不存在 $GOPATH/go.mod exists but should not 以上情况,需要逐项排查运行环境安装以及相关配置。 Premise MacBook Pro (13-inch, M1, 2020) Process 1 查看go.mod文件,确认项目需要的GO版本。 module entryname go 1.19 require ( ) 2 下载安装对应的版本 3 确认go版本,安装是否成功。 sirius@MacBook-Pro-9 ~ % go version go version go1.20.1 darwin/arm64 4 查看Go安装位置 sirius@MacBook-Pro-9 ~ % which go /usr/local/go/bin/go 5 go env 查看配置。

Java中常见的垃圾回收器 Serial、Parallel、CMS、G1 和 ZGC简介

Java中有几种常见的垃圾回收器,每种垃圾回收器都有其特定的工作方式和回收策略。下面列举了常见的Java垃圾回收器,并对其进行详细说明。 Serial 垃圾回收器: 回收过程:单线程回收器,使用标记-清除算法。它首先暂停所有应用线程,然后标记需要回收的对象,最后清除未被标记的对象。适用代:主要用于新生代。 Parallel 垃圾回收器: 回收过程:多线程回收器,使用标记-清除算法。多个线程并行进行垃圾回收操作,提高回收效率。同样会暂停所有应用线程。适用代:主要用于新生代。 CMS(Concurrent Mark-Sweep)垃圾回收器: 回收过程:使用并发标记-清除算法,以减少停顿时间。首先进行初始标记,然后并发进行标记和清除操作,最后进行重新标记和清除操作。适用代:主要用于老年代。 G1(Garbage-First)垃圾回收器: 回收过程:基于分代收集的垃圾回收器,将堆内存划分为多个区域。使用并发标记-整理算法,将垃圾对象进行标记并整理内存,减少碎片。适用代:主要用于新生代和老年代。 ZGC(Z Garbage Collector)垃圾回收器: 回收过程:使用并发标记-整理算法,将垃圾对象进行标记并整理内存。采用读屏障技术,减少应用线程的停顿时间。适用代:主要用于大型堆内存,包括新生代和老年代。 垃圾回收的整个过程通常包括以下几个步骤: 标记(Marking): 垃圾回收器从根对象开始遍历对象图,标记所有被引用的对象为存活对象。标记过程可以通过根据不同的垃圾回收算法采用不同的标记方式,如标记-清除算法、标记-复制算法、标记-整理算法等。 清除(Sweeping): 垃圾回收器清除所有未被标记的对象,即将被标记为死亡(垃圾)的对象进行回收,释放它们所占用的内存空间。清除过程可以根据不同的垃圾回收算法采用不同的清除方式,如清除未被标记的对象、清除整个区域等。 压缩(Compacting): 有些垃圾回收算法在清除阶段后会进行内存压缩操作,将存活对象进行整理,使它们在内存中连续排列,减少内存碎片的产生。压缩过程可以提高内存的利用率和访问效率。 内存分配(Allocation): 在垃圾回收完成后,如果应用程序需要分配新的对象,垃圾回收器会为其分配内存空间。内存分配可以采用不同的策略,如指针碰撞、空闲列表等。 这些步骤中的具体实现方式和细节取决于所使用的垃圾回收算法和具体的垃圾回收器。不同的垃圾回收器可能在标记、清除和压缩等阶段采用不同的策略和技术,以满足不同的性能需求和内存管理目标。 需要注意的是,具体选择哪种垃圾回收器以及用于哪个代的决策是由JVM根据运行时参数、系统配置和应用程序行为等动态决定的。因此,在实际应用中,可以根据应用的特性和性能需求进行适当的调整和配置。

替换掉数组中某个对象

const arr = [ { id: 1, name: '这是第一个对象' }, { id: 2, name: '这是第二个对象' }, { id: 3, name: '这是第三个对象' }, ] const object = { id: 3, name: '我把 ID 为三的替换掉了' } const filterFind = arr.findIndex(item => item.id === object.id) console.log(filterFind); // 2 (下标) if (filterFind > -1) { // 如果找到了 我就执行 solice 截取替换 arr.splice(filterFind, 1, object) } console.log(arr); 可以使用 findIndex 方法去查找出你要替换掉的某一个对象,通常需要用对象中某个唯一的标识去查找 返回的是找到的第一个对象下标 如果返回的值不等一 -1,或者大于 -1。那么就说明找到了,如果说找到了。 就可以直接执行数组的 splice 方法去将它替换掉,变成一个新的数组。

python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+

目录 python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+ 升级openssl版本降低urllib版本 python 问题修复ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+ 这个问题时python版本安装的 urllib3版本过高,而openssl版本太低导致的 解决无非两种方法,降低urllib3版本或者升级openssl版本 升级openssl版本 //只针对centos,如果是ubunt系统,把yum改 apt-get yum -y update yum -y install openssl@1.1 降低urllib版本 python3 -m pip install urllib3==1.26.6

win10/11系统打开IE强制跳转Edge的解决办法

关于打开IE自动跳转Edge这个问题,之前给大家分享过解决办法,通过修改Edge浏览器的设置就可以了,但是最近系统再次更新,之前的设置也无效,这次就从IE着手解决这个问题吧。 右键点击系统的开始菜单,选择“搜索”,输入“Internet选项”并打开,切换至“高级”选项卡,如下图所示, 将“启用第三方浏览器扩展”前面的勾去掉,点击“确定”即可。 win10、win11系统中打开IE的三个方法: 1、在开始菜单的“搜索”里输入“Internet Explorer”, 2、打开运行,输入iexplore,点击“确定”, 3、打开目录C:\Program Files (x86)\Internet Explorer或C:\Program Files\Internet Explorer,找到iexplore,双击它即可打开,或者右键点击它向桌面发送一个快捷方式。

A2L文件的自动生成(Simulink/CANape)

目录 什么是A2L文件? 使用simulink生成A2L文件 A2L文件组成 characteristic measurement compu_method group simulink生成的A2L与CANape生成的A2L 如何自动修改simulink生成A2L文件使其适用于CANape? 所需文件 什么是A2L文件? A2L文件是一个标定的描述文件,基于文本格式,描述ECU的通信等相关的参数,以及标定,观测变量的地址以及物理值计算公式等等。 A2L 文件中的信息允许 XCP 主站通过 XCP 连接与从站模块通信。格式化的文本文件包含事件和测量定义以及其他配置信息,用于采集和激励数据以及执行其他函数。 Vector提供两种生成A2L文件的工具: ASAP2 Studio,适用于ECU中变量较少且A2L文件变更不频繁的情况下,需手动编辑然后生成A2L文件 ASAP2 Tool Set适用于ECU中变量比较多且A2L文件变更频繁的情况,它通过批处理指令自动识别代码中的变量信息然后生成A2L文件 使用simulink生成A2L文件 按照以下步骤,勾选ASAP2 生成代码,就可以看到 A2L文件组成 A2L文件头(项目配置信息等,一般不随软件编译变化,除非对应参数调整) 标定变量描述(包含的地址信息每次编译都有可能变化) 观测变量描述(包含的地址信息每次编译都有可能变化) 其他辅助信息,转换公式等 (一般不随软件编译变化,除非对应参数调整) HEADER该块里边包含了项目信息,包括项目编号,项目版本等信息 MODULE该块里边包含了在标定测量层面来描述ECU需要的所有信息,一个ECU对应一个MODULE块,MODULE由许多子块来组成1MOD_PAR这个块里包含了用于管理ECU的数据,例如客户名,编号,CPU类型,ECU的内存分配等,其中最重要的就是ECU的内存分配,开发人员需要根据ECU内存分段情况定义MEMORY SEGMENT和SEGMENT里边的PAGE,这里的SEGMENT/PAGE的概念和在线标定中的概念是一致的,一个MODULE里边只能出现一次。 MOD_COMMON该块用来指定ECU的一些标准的一般性描述信息,比如大小端,数据的对齐方式,FLOAT变量的处理方式等,一个MODULE里也只能出现一次。 CHARACTERISTIC该块用来定义标定变量,里边包含了可以被标定的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的标定变量。 AXIS_PTS该块用来定义数组或查表变量对应的轴的类型,它将被RECORD_LAYOUT块来引用,一个ECU里边可以有很多种不同的轴类型,用于实现查表和插值,一般很少用到。MEASUREMENT该块用来定义测量变量,里边包含了可以被测量的变量的名字,地址,长度,计算公式,精度,最大最小值等信息,一个MODULE里边可以出现很多次这样的块,也就是说一个ECU可以有很多的测量变量。 COMPU_METHOD该块用于定义计算公式,及原始值和物理值之前的转换关系,这些公式可以被标定变量和测量变量来引用,从而将原始值转换成便于用户阅读和使用的物理值。COMPU_TAB该块用来定义原始值和物理值的映射关系,是一种特殊的转换关系,它一般应用于枚举变量,例如我们想采集一个代表XCP状态机的变量,分别为0对应DISCONNECTED,1对应CONNECTED,2对应RESUME,那么我们就可以把这样的映射关系定义成一个COMPU_TAB,然后关联到对应的变量上,这时候如果上位机采集到1这样的原始值,它就可以将当前的状态显示成“CONNECTED”字样,方便用于阅读和使用。FUNCTION该块为可选项,很少使用。 GROUPS该块是把标定变量和测量变量按照一定的逻辑(比如功能模块)组织起来,在上位机中形成一个下拉菜单,使得用于可以从中选择变量,这块是可选的。 RECORD_LAYOUT该块用来定义标定变量的物理存储结构(单个变量,二维表,三维表等)。 characteristic measurement compu_method 计算方法,也就是measurement类型数据中的Conversion method。 内部值Q,物理值V,两者的互相转换。 内部值可以理解为物理值放大转换之后的值或者物理值固定点化的值。 group 分类,模型分层的分类。 simulink生成的A2L与CANape生成的A2L 以上举得这个例子属于使用simulink生成的A2L文件,它不同于使用CANape生成的A2L文件,当然只是在格式表达上不同,但它们的参数类型、以及内核是一样的。 具体差别在哪呢? 因为我这边也没有具体的使用CANape生成的A2L文件,从网上截取了几张图,主要变换和区别是:Measurement, Characteristic, COMPU_METHOD这几个类型 在CANape生成的A2L文件描述如下: 对比这simulink生成的例子,好像省略掉了很多的东西,更简洁了。 如何自动修改simulink生成A2L文件使其适用于CANape? 流程如下: 1、把通过IDE编译生成的map文件中的ECU参数地址,放到a2l文件对应的参数中(前面提到的三种类型) 2、去掉多余的注释 所需文件 IDE生成的map文件、Simulink生成的a2l文件、模板文件a2l(不变的头和尾,变化的中间部分)、用于从map文件和原a2l文件中提取参数放到模板文件a2l中的m执行文件、最终生成的ECU.a2l文件。 主要是:找准不变的头和尾与变化的中间部分 具体的m执行文件可从这里获取 链接:百度网盘 请输入提取码

微服务架构中,服务之间都是独立数据库,如何做到高性能地数据关联展示?

微服务架构中,服务之间都是独立数据库,如何做到高性能地数据关联展示? 首先.微服务应当是隔离而独立的吗?. 是的,微服务架构的一个核心原则是每个微服务应该具有自己的独立数据库。这种独立性有助于实现微服务的解耦和可扩展性。 通过为每个微服务分配独立的数据库,可以实现以下好处: 解耦性:每个微服务都有自己的数据库,可以独立地进行数据模式设计和数据管理。这样,对一个微服务的数据库进行更改或优化时,不会对其他微服务产生影响。 可扩展性:独立的数据库使得每个微服务可以根据其自身的需求进行水平扩展。当某个微服务的负载增加时,可以单独扩展其数据库,而无需影响其他微服务。 性能优化:由于每个微服务具有自己的数据库,可以根据其特定的需求进行性能优化。针对每个微服务的查询和事务可以进行专门的优化,提高整体系统的性能。 数据隔离:微服务之间的数据是相互独立的,每个微服务只能访问其自己的数据库。这样可以确保数据的隔离性和安全性,防止一个微服务的故障对整个系统的数据产生影响。 需要注意的是,微服务之间的通信和数据同步可能会引入一定的复杂性和开销。在设计和实现微服务架构时,需要考虑好微服务之间的数据交互方式和一致性保证机制。 比如说商品服务,订单服务. 如果我们的订单列表的需求是:查询出订单,并且附带上该订单的商品名字和图片. 那么就需要这一件事情,多个服务共同参与,共同关联数据. 我们可以怎么做? 1.实时查询 我们可以在订单服务里面,实时查询 1.订单服务:查询出分页的一组订单列表,然后调用 商品服务提供的查询接口. 2.商品服务提供的查询接口的查询条件是商品id_list. 里面的具体查询也是 where id in (id_list),然后把商品信息返回给订单服务 3.订单服务拿到了一组商品,for循环塞入数据 优点: 简单操作,易于理解,不需要维护其他的东西,只需要在服务端进行组装数据即可. 缺点: 这种情况会导致 基础服务的压力很大,在高并发时候,基础服务容易造成雪崩效应. 另外,在考虑到调用服务时发生的熔断后,是直接报错,还是返回部分,也是值得考虑的问题. 2.数据库设计冗余 我们可以在订单表里添加 商品名称和商品图片 两个字段即可. 优点: 查询性能高,不需要跨服务查询,缓存策略简单 缺点: 冗余查询快,但就意味着增删改的时候麻烦.比如修改商品的时候,也要修改订单里面的商品字段.删除商品的时候,也要删除订单里面的商品字段.相当于业务又重做了一部分.在系统上,又感觉耦合了.如果某些字段变更速度很快,那就很麻烦. 3.搜索引擎 数据扔搜索引擎里面.所有服务共享该搜索引擎. 该方式可行,本质上是再创建一个大家公用的库. 优点: 性能优秀 缺点: 1.搜索引擎 应该只作为查询结果,而不要再根据查询结果 追加业务. 2.增加维护成本 4.同步部分其他服务的表 该方案是:订单服务里面添加个商品表,一直同步商品服务的商品表.订单服务里面的商品表不能乱修改. 可以找Canal、Debezium、DataX、Databus、Flinkx、Bifrost 这种中间件来操作 优点:代码层面比较简单,符合目的 缺点: 1.冗余表数据,需要同步中间件高可用 2.对于不同的数据库 就比较麻烦 5.构建查询数据库 重新建一个数据库,copy所有的表.该数据库用于查询. 优点: 1.总体构建比较简单,不管三七二十一,同步所有即可. 2.代码层面还可以 缺点: 性能不咋地,同步中间件需要高可用 对于不同的数据库 就比较麻烦 对于及时性不高的是可以的 6.数仓做数据汇聚 数据放数仓,从数仓查

Day270/300 react hooks 使用useState 修改后,视图不更新

1、React 代码 {chatData.map(item => { return <div key={item.id}> </div> })} 使用useState改变数组的值,dom没有更新: const showChat = (item)=>{ item.open = !item.open console.log('item-open',chatData) setChatData(chatData) } 2、原因 useState异步,数据不能及时获取到 useState() 属于异步函数,在useState() 第一次存储的时候,值会存储不上。 因为react中state的更新是异步的,我们setState后,react不会立刻对值进行改变,而是将其暂时放入pedding队列中。react会合并多个state,然后值render一次,所以不要在循环中使用useState,它有可能只render最后一次set值,但是当传入一个函数时,函数就会被放入一个队列中,然后按照顺序执行。 React中默认浅监听,当变量为引用类型时,栈中存的是对象的引用(地址),setState改变的是堆中的数据。所以此时set后,栈中的地址还是原地址,React浅监听到地址没变,会认为State并未改变,所以没有重新渲染页面 3、解决方案 修改为数组的结构赋值形式就可以了。 const showChat = (item)=>{ item.open= !item.open console.log('item-open',item.open,chatData) setChatData([...chatData]) } 4、React Hooks 整理 useState: 用来在函数组件中添加状态,能够代替类组件中的state;useEffect: 用来在函数组件中添加副作用,例如发起网络请求、更新DOM等操作;useContext: 用来在函数组件之间共享全局数据;useReducer: 用来管理复杂状态或多个相关状态的更新;useCallback: 用来缓存函数实例,避免不必要的渲染;useMemo: 用来缓存计算结果,提高组件渲染性能;useRef: 用来获取DOM节点或缓存任何可变值,类似于类组件中的ref属性。 参考链接 链接:https://juejin.cn/post/7102334510808694792

软件测试学习规划(学习思路、学习方法、面试技巧、后期发展、职业规划等)

软件测试学习思路 1、基础知识、理论知识(用例编写,测试方法,用例管理),测试思维的学习,很多人不屑理论,一股劲的扎进测试工具里面。最大的误区,工具永远学不完,测试必须的自己思路清晰,理论是自己吹B的基础 2、数据库(mysql 、oracle、sql server),增删改查必须会 ,这个是入门,尽量会点存储过程等其他高深点的,面试表现出来,绝对是加分项。 3、Linux,必须会,现在很多WEB测试环境都是搭建在centos下,所以建议直接学习centos7,服务器一般用的这个系统,Ubuntu这些有些地方和centos还是有一点区别,所以为了花最少的时间去适应新的系统,就直接选centos7,搭建环境,安装软件,这个必须会。介绍两个工具Xshell、FTP前者用来远程连接系统,后者实现linux系统和Windows传输文件。 4、测试工具,市场上的测试工具太多了,永远学不完,推荐几个主流的给大家,QTP、selenium(功能测试) 、LR、jmeter(性能测试),postman(接口测试),QC、禅道(用例管理、项目管理),gitlab、SVN(项目管理、版本控制),不一定全学,会几个就是了,初级要求不会太高,如果面试遇到公司使用了你不会的工具,直接说一句,“工具不是万能的,市场上的工具是学不完的,如果要学会使用一个工具就几天时间,最重要的还是自己的思路” 这样很容易让面试官觉得你很有自信,能力还不错。 5、汇编语言,没得编程基础同学,建议学习Python,号称最简单的语言,代码量少,维护性好,界面很容易接受,最重要的是现成的库很多,效率很高。JAVA,Python有的地方不能实现JAVA的一些功能,JAVA相对Python编码量有点大了,JAVA编写测试框架很实用,C,性能测试很需要,特别是服务器性能测试,linux都是C写出来的,可以看出C在服务器底层应用是很广的。编程语言可以作为后期工作中学习 6、面试,转行、刚毕业的要求别太高,看清自己对自己有一个定位。刚开始可以选择海投,一方面多给自己一些面试机会,另一方面可以出去看看别人的要求,更清楚的认识自己。 7、后期发展,技术:转开发,性能测试也能达到年薪30W。产品经理,管理层这些都是未来的方向。 学习路线图 学习方法 视频和笔记结合,不太容易懂的视频更容易理解,但是耽误时间,笔记能快速学习,吸收力差,看完即忘。 简历重点 项目经验,必须写清楚,职责,收获。 个人能力,看了很多人根本就不知道怎么写简历,个人评价全是套话,没有人看,对于初入职场或者转行人员尤其重要,第一件事就是让别人知道你的能力,个人评价直接写自己的技能,会什么东西,直白些,不要让别人看了简历都不知道你会什么,3秒浏览一份简历,可以想象一个没有闪光点的简历是什么样的后果。 面试技巧 转行: 1) 让别人知道为什么转行,不要说一些自己都感觉SB的想法,要说的很有抱负,很有想法(“27岁才发现自己喜欢事,只想做自己喜欢的事,曾经的东西都可以放弃”)瞬间让别人感觉不一样 2) 决心有多大,转行最怕的就是让面试官知道你只是尝试性的转行,这样别人会觉得你还是没思考自己想要什么,不稳定 ,靠不住。表现出自己的决心“曾经10K的工资,现在为了自己喜欢的事,放弃所有,从新开始”把自己的后路直接说死,让面试官知道你有种破釜沉舟的勇气,即使面试不成功也会换来好感。 3) 职业规划,不说多远,2-5年的规划就可以,让别人知道你这个人很有想法,思考比较独立,整个人很有上进心 以上说的很多都是自己的加分点,实际情况还需自己去考虑,想好这三个问题,拿到一份offer是不成问题的。 大厂面试录音以及面试题 刚毕业转行: 1)为什么转行,这个是每一个转行的人首先要考虑的问题 ,大忌:自己的专业不好找工作,耳朵都听腻了。可以谈自己的兴趣,爱好。 2) 自己的能力,尽量和软件测试这个行业扯上关系,自己学编程要第一时间表现出来,加分项。自己不会的要表现出有很好的态度和学习能力,公司都会根据能力选择人才培养和储备。 3) 职业规划,一个刚毕业的学生有一个很清晰的规划马上可以从其他人中脱颖而出,尽量别说一些套话,人人都一样了,面试官为什么选择你! 所有的面试必须思路清晰,不要想起一句说一句,这样面试官很反感,软件测试要的不是会多少东西,而是良好的交流、清晰的思维,工作能力是其次的。态度—思维—能力,这个是我对职场的理解。这些是我对一个刚进入或者想进入这个行业的一些人的建议和自己的一些看法,不完全正确,自己可以找到一种属于自己的方式。 后期发展 不管自己是以什么样的方式入职的,进公司第一件事就是工作态度,几个月的试用期,看的最的多是工作态度,转正的方式有很多种,不一定靠能力转正,态度也可以让BOSS给你转正的机会。工作能力差可以用态度和勤奋去弥补。交流能力,测试应该算公司交际比较广泛的team了,产品经理、需求、研发、客户都有可能涉及到,所以测试工程师第一要素:交流,不光是听懂别人的意思,有时候必须清楚的表达自己的意思。很多人认为这个很简单,在我看来这是最难的,有时候自己不能完全理解可续的需求,自己想要表达的东西也没有很直白、确切的传达给客户。这是我做产品两个月来的深刻体会。 测试与开发对比 现在大家都在讨论测试和开发的工资问题: 1、测试低人一等,比不了开发 2、都认为开发比测试工资高 3、测试以后的发展方向没有开发好 很多公司对测试设立的工资范围比开发低这个是自然的: 原因一:在他们眼里测试不重要,可有可无,这个是中国目前行业的诟病; 原因二:一般公司对测试要求低,就基本的功能测试,工作强度决定了工资待遇; 但是这并不意味测试的工资一定就低。同样是工作两年,一般的开发工资就是9k左右,但是一个测试如果是会编程,两年工作经验,工资可以达到11K,为什么? 测试会编程的人偏少,更别说编程质量高的,少了很多人的竞争,物以稀为贵,这样就是为什么开发转测试很吃香的原因。前提是必须会编程,但是对于一般的功能测试,编程要求很低,编程能力不如开发,同样的工作经验比开发拿的工资高,多的这一部分钱就是测试需要的思维意识,有思维能编程,综合性人才公司自然会给的多。思维意识这个对于测试来说可能需要付出更多的时间去积累,也有可能是两年工作时间就可以学到的,这个都是看个人能力。 发展方向 开发精于某一方面,测试是看大局,定位不一样。为什么测试可以做到产品经理,开发做项目经理,产品可以不需要懂技术,但需要有大局观,对项目的把控能力,项目经理需要的是技术,对做事的人的指导。 最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

Stablediffusion模型diffusesr格式和ckpt格式相互转换

参考资料: diffusers的源码 [github] 因为小博客可能看的人很少,所以我写的啰嗦一点,想直接看如何互相转换的朋友可以直接转到文末的代码段。 当你在学习Stablediffusion这个开源的t2i模型时,不可避免地会碰到两种模型权重的存储格式,即diffusers格式和ckpt格式: 如上图所示,这是一个hugging face的仓库,仓库里有文件夹和.ckpt文件.safetensors文件。这个截图同时包含了两种格式的权重,那么哪些属于diffusers格式?哪些属于ckpt格式? 答:明摆着的,后缀为.ckpt的文件就是ckpt格式。而diffusers格式其实包含:feature_extractor, scheduler, text_encoder, tokenizer, unet, vae这些文件夹以及model_index.json这个文件。大的二进制文件主要位于text_encoder,unet和vae文件夹下。 safetensors是ckpt转换得到的,防止别有用心之人在ckpt文件中加入恶意代码。safetensor和ckpt文件都能直接用于AUTOMATIC111这个为T2I模型开发的WebUI上,而diffusers不行。而diffusers提供的一些代码example又非常有借鉴意义,但一旦使用,其存储类型是一系列目录,这就催生了两种各格式相互转化的需求。 怎么转化?使用diffusers官方提供的转化脚本即可,这些转换脚本在diffuser源代码仓库的scripts文件夹下:主要涉及两个文件:convert_original_stable_diffusion_to_diffusers.py和convert_diffusers_to_original_stable_diffusion.py。 diffusers to ckpts 使用convert_diffusers_to_original_stable_diffusion.py脚本,一个典型的使用场景是你训练了一个模型,然后就想把这个模型转换成.ckpt文件放到webui上。使用范例如下: python convert_diffusers_to_original_stable_diffusion.py --model_path model_dir --checkpoint_path path_to_ckpt.ckpt 还有两个参数--half和--use_safetensors,如果加上就会把数值存为fp16以及把ckpt存为safetensors ckpts to diffusers 使用convert_original_stable_diffusion_to_diffusers.py脚本,一个典型的使用场景是把ckpt文件(自己训练的或者是SD官方发布的)解包成diffusers的目录形式上传hugging face或者是自己使用。需要注意的是diffuser的目录存储形式实际上提供了比ckpt文件更多的(实际上多得多)信息。为什么?因为ckpt是pytorch使用的存储权重的二进制文件,你在load_state_dict的时候需要先初始化model,然后再load权重,但是ckpts文件中没有这些信息(或很少),就只能靠脚本来推断到底用了哪些参数初始化的model。所以你会发现diffusers to ckpts的脚本很简单,ckpts to diffusers的脚本很复杂。下面提供一个范例: python convert_original_stable_diffusion_to_diffusers.py --checkpoint_path path_to_ckpt.ckpt --dump_path model_dir --image_size 512 --prediction_type epsilon 在使用v2-base或v2.1-base的时候,一定要加上--image_size 512和--prediction_type epsilon这两个参数,不然脚本就会推断错模型的类型(ckpt中的信息太少)。由于脚本已经写的很完备了,大多数情况下只需要--checkpoint_path和--dump_path两个参数就能正常完成转换。 最后,diffusers这个代码仓库日新月异,每天都在高强度更新,所以读者需要多git pull安装最新版本,这两个转换脚本什么时候发生变化也不能保证滴。

软考:信息系统项目管理师/信管高级第一章课后练习思考题

2. 思考题 (1)请指出大数据的特点,并根据你的理解简要叙述大数据有哪些重要应用领域。 答:大数据的特点主要包括以下几个方面: 1.数据量大:大数据的数据量非常庞大,常常需要使用分布式计算和存储技术来处理。 2.数据类型多样:大数据包含了各种类型的数据,包括结构化数据、半结构化数据和非结构化数据等。 3.数据速度快:大数据的数据产生速度非常快,需要实时处理和分析。 4.价值密度低:大数据中往往包含了很多无用的信息,需要通过挖掘和分析来发现其中蕴含的价值。 大数据具有广泛的应用领域,主要包括以下几个方面: 1.金融行业:大数据可以用于风险控制、欺诈检测、交易分析等方面。 2.医疗行业:大数据可以用于疾病诊断、药物研发、健康管理等方面。 3.物流行业:大数据可以用于路线规划、货物追踪、仓储管理等方面。 4.零售行业:大数据可以用于消费者行为分析、商品推荐、库存管理等方面。 5.媒体行业:大数据可以用于内容推荐、广告投放、舆情分析等方面。 6.政府行业:大数据可以用于公共安全、城市管理、社会服务等方面。 (2)请总结归纳信息系统建设的特点,根据这些特点,请论述在实施信息系统项目管理时,应重点考虑哪些项目风险。 答:信息系统建设的特点包括: 复杂性:信息系统建设通常涉及多个部门和多个业务流程,需要考虑到各个方面的需求和限制。 长期性:信息系统建设需要长期投入和维护,需要考虑到系统的可持续性和灵活性。 技术性:信息系统建设需要应用先进的技术和工具,需要考虑到技术的可行性和可靠性。 用户参与度高:信息系统建设需要用户参与,需要考虑到用户的需求和反馈。 在实施信息系统项目管理时,应该着重考虑以下项目风险: 范围风险:信息系统建设范围的变化可能会导致项目延期或超预算。 时间风险:信息系统建设可能需要长时间的开发和测试,可能会导致项目延期或无法按时完成。 成本风险:信息系统建设的成本可能会超出预算,需要考虑到成本控制和管理。 技术风险:信息系统建设需要应用先进的技术和工具,可能会出现技术上的问题或限制。 人员风险:信息系统建设需要涉及多个部门和多个业务流程,需要考虑到团队的协作和沟通,以及人员流动的问题。 市场风险:信息系统建设可能会受到市场变化和竞争的影响,需要考虑到市场趋势和变化。 (3)结合你的工作岗位,请简要论述如何开展信息系统规划。 略。 (4)请简要叙述ITSS框架的主要内容。 ITSS框架是一种软件系统开发的方法论,其主要内容包括以下四个方面: Information(信息):ITSS框架强调信息的重要性,要求在软件系统开发过程中,必须对信息进行全面的分析,以确保系统设计满足用户需求。 Technology(技术):ITSS框架提供了一系列的技术标准和最佳实践,以帮助开发人员更好地实现系统功能。 System(系统):ITSS框架将软件系统视为一个整体,要求开发人员在系统设计和开发时考虑到各个组成部分之间的交互和协作。 Service(服务):ITSS框架强调服务化的理念,将软件系统设计为一系列服务的集合,以方便系统的维护和升级。同时,ITSS框架还要求系统服务必须符合标准化、可重用、可扩展和可互操作的原则。

Flutter组件--ListView组件

Flutter中我们可以通过ListView来定义列表,支持垂直和水平方向展示.通过一个属性就可以控制列表的方向.列表有一下分类: 1.垂直列表; 2.垂直图文列表; 3.水平列表; 4.动态列表. 列表组件常用的参数 名称类型说明scrollDirectiionAxis Axis.horizontal 水平列表 Axis.vertical垂直列表 paddingEdgelinsetsGeometry内边距resolvebool组件反向排序childrenList列表元素Scrollbarwidget滑动时候,右侧显示的滚动条 shrinkWrap bool设置为true的时候,没有下拉的动效.physics NeverScrollableScrollPhysics (禁止滑动事件) 当两个ListView进行嵌套的时候,必须设置physics和shrinkWrap=YES.内层的ListView才不会进行滑动 itemExtent double 强制修改cell的高度 RefreshIndicator widget下拉刷新,刷新的 onRefresh方法需要是异步的. controller.animateTo/列表回到顶部 1.代码示例(普通列表): class ListViewApp extends StatelessWidget { const ListViewApp({super.key}); @override Widget build(BuildContext context) { return ListView( scrollDirection: Axis.vertical,//设置滚动的方向 children: <Widget>[ const ListTile(title: Text("我是一个列表")), Divider(), //添加一个分割线 ListTile(leading: Icon(Icons.home_filled), title: Text("我是一个列表")), //左侧添加一个图片 Divider(), //添加一个分割线 const ListTile( title: Text("我是一个列表"), trailing: Icon(Icons.arrow_right), ), //右侧添加一个图片 const ListTile( title: Text("我是一个列表"), subtitle: Text("我是一个副标题"), ), ListTile( leading: Image.

使用python导出矢量图后无法编辑

使用python绘图后(spyder),需要导出为可编辑的矢量图格式。 plt.savefig(outname+".png", format='png',dpi=600) plt.savefig(outname+".pdf", format='pdf',dpi=600) plt.savefig(outname+".eps", format='eps',dpi=600) plt.savefig(outname+".svg", format='svg',dpi=600) 然而: 导出为eps格式,文件过大,且导入到coreldraw编辑,无法显示图像坐标;导出为pdf格式,导入到coreldraw编辑,显示也有问题;发现只有导出为svg格式,然后导入到coreldraw编辑,才会正常显示。但是文字显示为曲线形式,无法用文本编辑。

Oracle登录

Oracle登录 端口号:1521 1、SQL Plus 的使用 sqlplus的登录 打开oracle自带的sqlplus插件 输入用户名 例:scott 输入口令 例:123456 注:初装oracle后scott的账号是处于锁定状态 cmd窗口登录 window+r 之后输入cmd,敲回车 输入 sqlplus,回车 输入用户名 例:scott 输入口令 例:123456 以管理员身份登录sqlplus 输入用户名 例:sys 输入口令 例:123456 as sysdba 输入用户名 例:sys as sysdba 输入口令 例:123456 # 解锁 alter user username account unlock; # 修改用户密码 alter user username identified by password; # username: 用户名 password: 密码 sqlplus直接登录数据库 sqlplus 用户名/密码@ip:port/数据库实例 例:sqlplus scott/scott@127.0.0.1:1521/orcl sqlplus 用户名/密码 --连接默认实例 2、PLSQL登录 普通用户登录 Username:scott Pawword:123456 Database:ORCL Connect as:Normal

Flink 基于 MailBox 实现的 StreamTask 线程模型

文章目录 1. Motivation2. 设计方案 2.1. StreamTask 中要做的改变2.2. client 代码需要做的改变2.3. event 的产生与处理2.4. Checkpoint 和 timer 的 trigger3. 具体实现 3.1. StreamTask 处理流程 3.1.1. event-processing 处理3.1.2. checkpoint trigger 处理3.2. SourceStreamTask 如何兼容4. 总结 本篇文章是 Flink 系列 的第八篇,在介绍 TaskManager 第二部分之前,先来给介绍一下目前 StreamTask 中基于 MailBox 实现的线程模型,这个模型从 1.9 开始实现,在目前发布的 1.10 版本中,基本上已经改造完成,具体 issue 见 FLINK-12477: Change threading-model in StreamTask to a mailbox-based approach,其设计文档见 Change threading-model in StreamTask to a mailbox-based approach,去年,vinoyang 也写了一篇关于它的介绍,见 重磅!Flink 将重构其核心线程模型。因为 Flink 1.10 已经发布,本篇关于 MailBox 实现的介绍会基于 1.

【Docker实战】使用Docker部署Tomcat

【Docker实战】使用Docker部署Tomcat 一、Tomcat介绍1. Tomcat简介2. Tomcat特点3. Tomcat容器部署的优点4. Tomcat的配置文件 二、检查本地环境三、检查本地Docker环境1. 检查本地Docker服务2. 检查Docker版本 四、搜索docker hub中的tomcat镜像五、下载tomcat镜像六、创建Tomcat容器1.创建数据目录2.运行Tomcat容器3.查看Tomcat容器状态 七、访问Tomcat网页1.编辑网页内容2.访问tomcat网页 一、Tomcat介绍 1. Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 2. Tomcat特点 Tomcat是一种开源的、轻量级的应用服务器,它实现了Java Servlet和JavaServer Pages规范。 其特点包括: 轻量级:Tomcat是一个轻量级的Web容器,在内存占用和启动时间上都比较快。易用性:Tomcat的使用和部署非常简单,它提供了方便的Web界面和命令行工具来管理和配置Web应用程序。易扩展性:Tomcat支持多种插件和扩展,可以方便地集成其他的Web应用程序框架和技术。跨平台性:Tomcat是基于Java开发的,可以在多种操作系统平台上运行。安全性:Tomcat提供了丰富的安全管理和访问控制机制,可以确保Web应用程序的安全性和可靠性。 3. Tomcat容器部署的优点 Tomcat用容器部署的优点包括: 简化部署:通过容器化,可以将Tomcat的应用程序、配置文件和依赖项打包到一个docker容器中,从而简化了部署流程。 轻量级:容器是轻量级的,只包含运行应用程序所需的组件,这可以减少资源消耗,提高效率。 灵活性:容器可以随时启动、停止和移动,可以轻松地进行扩展和缩减,这为应对流量峰值和成本节约提供了便利。 可靠性:容器提供隔离和安全性,可以防止应用程序之间的相互影响,从而提高可靠性和安全性。 云友好性:容器可以轻松地在云端部署,与DevOps实践和自动化部署相适应,提高了应用程序管理的效率。 4. Tomcat的配置文件 Tomcat的配置文件包括以下几个: server.xml:Tomcat服务器的主配置文件,定义了Tomcat的全局设置,包括端口、连接器、虚拟主机等。 web.xml:Web应用的配置文件,定义了Web应用的基本设置和参数。 context.xml:Web应用的上下文配置文件,定义了Web应用的上下文作用域的参数和设置。 catalina.properties:Tomcat的全局属性文件,定义了Tomcat的全局属性值。 logging.properties:Tomcat的日志配置文件,定义了Tomcat的日志记录器和级别。 tomcat-users.xml:Tomcat的用户认证和授权配置文件,定义了Tomcat管理界面的账户和权限。 realm.properties:Tomcat的安全领域配置文件,定义了Tomcat安全领域的用户名和密码及其角色。 jaspic-providers.xml:Tomcat的JASPIC(Java Authentication Service Provider Interface for Containers)配置文件,定义了JASPIC提供者的配置信息。 二、检查本地环境 检查本地操作系统版本: [root@node ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="

DrissionPage学习(一)

一、下载适合mac环境的chromedriver.exe 1.查找chrome浏览的版本 方法二:查看chrome版本信息 2.确定版本后在下载chrome对应的chromedriver.exe 下载地址:http://chromedriver.storage.googleapis.com/index.html 3.在文件夹中找到下载的文件chromedriver并放入到下图红框目录下: 4.验证chromedriver是否安装成功 二、在mac上执行DrissionPage遇到的问题 1.执行时报端口号被占用 解决办法如下:终端输入命令查找被占用端口的进程号 sudo losf -i: 9515 kill该进程:sudo kill 15500 2.执行时报错 错误原因:set_path是设置浏览器可执行文件的路径,这里应该设置为: set_paths(browser_path=r’/Applications/Google Chrome.app/Contents/MacOS/Google Chrome’)

逆向案例之X车网

逆向案例之X车网 ***用到的知识点: (1)requests模块和session模块,发起请求 什么是session对象? 该对象和requests模块用法几乎一致.对于在请求过程中产生了cookie的请求如果该请求是使用session发起的,则cookie会被自动存储到session中. session = requests.Session() 详见博客:https://www.cnblogs.com/dream-ze/p/17176494.html (2)headers头部伪装,随机UA伪装 # UA伪装之随机headers模块 from fake_useragent import UserAgent headers = {'User-Agent': UserAgent().random,} # 这里的random方法不需要random模块支持 (3)md5加密算法,加密数据 # md5加密模块 from hashlib import md5 # 如果需要十六进制的结果与二进制的结果之间的转换,需要的模块 import binascii # 【1】准备数据 data = '你好' #这里是字符串类型 # 字符串转二进制数据方式一 encode_data = s.encode() # 字符串转二进制数据方式二 encode_data = b'你好' # 【2】数据加密 # 构建md5对象 md5_obj = md5() # 将数据更新到md5算法中进行数据加密 (参数为二进制数据的明文数据) #(方法一):直接在加密算法中进行转码 md5_obj.update("你好".encode("utf-8")) md5_obj.update(data.encode("utf-8")) #(方法二):先将明文数据进行转码,再传入到加密算法中 md5_obj.update(encode_data) # 【3】数据提取 # 拿到加密字符串 # 十六进制的结果 result_16 = obj.

【VMware】搭建个人服务器

文章目录 准备工作三种网络模式Bridged(桥接模式)定义设置 NAT(网络地址转换模式)定义设置 Host-Only(仅主机模式)定义设置 搭建服务器网络模式的选择在VMWare的网络编辑器中设置转发端口查看宿主机的ip地址使用ssh连接工具进行连接 Mac笔记本跑虚拟机总感觉别扭,通过VMware虚拟机技术,将闲置的Windows笔记本打造成服务器,用于搭建集群之用 准备工作 用作宿主机的Windows需要安装好VMware软件 参看网站:https://blog.csdn.net/al6nlee/article/details/130792439 关闭宿主机的防火墙,避免请求被拦截 用作连接机的Mac需要安装好ssh工具,可以用自带的终端(我用的是Royal TSX) 保障连接机与宿主机在同一个局域网 三种网络模式 打开vmware虚拟机,我们可以在选项栏的“编辑”下的“虚拟网络编辑器”中看到VMnet0(桥接模式)、VMnet1(仅主机模式)、VMnet8(NAT模式) 同时,在主机上对应的有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两块虚拟网卡,它们分别作用于仅主机模式与NAT模式下。在“网络连接”中我们可以看到这两块虚拟网卡,如果将这两块卸载了,可以在vmware的“编辑”下的“虚拟网络编辑器”中点击“还原默认设置”,可重新将虚拟网卡还原。 Bridged(桥接模式) 定义 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。 在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机ip地址需要与主机在同一个网段,如果需要联网,则网关与DNS需要与主机网卡一致。其网络结构如下图所示: 设置 编辑虚拟机设置 “网络适配器”,选择"桥接模式" 先确定宿主机的ip地址、网管、DNS等信息 编辑网卡配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0 重启虚拟机网卡,并测试虚拟机与外网通信 /etc/init.d/network restart 虚拟机与宿主机之间通信 NAT(网络地址转换模式) 定义 当网络ip资源紧缺时,又希望你的虚拟机能够联网,这时候NAT模式是最好的选择。NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网。其网络结构如下图所示: 设置 虚拟网络编辑器配置 虚拟机配置 编辑网卡配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth0 重启虚拟机网卡并与测试虚拟机与外网测试 关闭VMware Network Adapter VMnet8虚拟网卡,测试虚拟机与外网通信&测试虚拟机与宿主机通信 虚拟机与外网通信 -> 正常通信 虚拟机与宿主机通信 -> 不通 Host-Only(仅主机模式) 定义 Host-Only模式其实就是NAT模式去除了虚拟NAT设备,然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信的,Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通讯。 如果要使得虚拟机能联网,我们可以将主机网卡共享给VMware Network Adapter VMnet1网卡,从而达到虚拟机联网的目的。 其网络结构如下图所示: 设置 虚拟网络编辑器

局部最优解和全局最优解

局部最优解(Local Optima)和全局最优解(Global Optima)是在优化问题中经常讨论的两个概念,用于描述目标函数的最佳取值。 局部最优解:局部最优解是指在某个特定区域内目标函数取得的最优值,该值在该区域内可能是最小值或最大值。局部最优解是相对于特定的起始点或局部搜索过程而言的,这意味着在局部搜索的范围内找到了最优解,但不一定是全局最优解。 全局最优解:全局最优解是指目标函数在整个定义域内取得的最优值,该值是所有可能解中最优的。全局最优解是相对于整个问题空间而言的,它表示在所有可能的解中找到了最优解,具有最小或最大的目标函数值。 在优化问题中,我们通常的目标是寻找全局最优解,因为全局最优解代表了问题的最佳解决方案。然而,许多复杂的优化问题存在多个局部最优解,导致全局最优解的搜索变得困难。特别是对于非凸函数、高维空间和复杂约束的问题,很难保证找到全局最优解。 为了解决这个问题,可以采用以下策略: 多次运行:使用不同的初始值多次运行优化算法,以增加找到全局最优解的机会。每次运行可能会收敛到不同的局部最优解,但通过多次尝试可以增加找到全局最优解的概率。 改进算法:使用更复杂的优化算法或改进的算法来克服陷入局部最优解的问题。例如,遗传算法、粒子群优化、模拟退火等启发式算法具有全局搜索的性质,能够更好地逃离局部最优解。 全局优化方法:采用专门设计的全局优化方法,如网格搜索、遗传算法等,可以直接针对全局最优解进行搜索,但通常需要更高的计算成本。 需要根据具体问题和目标函数的性质选择合适的方法来处理局部最优解和全局最优解的问题。对于大多数实际应用,找到一个接近全局最优解的解决方案已经足够好,并且可以通过调整参数、改进算法等方法来不断优化结果。

CSS实现内容可以滚动,不显示滚动条

两种方式: 使用 padding使用 ::webkit-scrollbar 第一种,使用padding 先把 body 的滚动条隐藏,隐藏横向滚动条;把 main 元素的 overflow-y 设置为 scroll,让它可以垂直滚动;把 main 元素的右侧间距 padding-right 设置为滚动条的宽度。根据操作系统会有不同,windows 数值大些; 第二种,使用 ::webkit-scrollbar .demo::-webkit-scrollbar { display: none; /* Chrome Safari */ } .demo { scrollbar-width: none; /* firefox */ -ms-overflow-style: none; /* IE 10+ */ overflow-x: hidden; overflow-y: auto; }

【VMware】VM安装虚拟机

文章目录 VMware教程创建新的虚拟机自定义安装选择稍后安装操作系统这里选择Linux操作系统,版本为Centos7 64位选择名称和安装位置选择处理器、内核数量(可根据电脑硬件以及需求进行调整)选择2G内存(可根据电脑硬件以及需求进行调整)选择网络类型选择虚拟磁盘对于不需要的硬件进行移除 国内镜像源地址下载镜像安装镜像选择第一项Install CentOS 7磁盘划分设置网络设置root密码 VMware教程 官网下载版:阿里网盘分享地址 创建新的虚拟机 自定义安装 选择稍后安装操作系统 这里选择Linux操作系统,版本为Centos7 64位 选择名称和安装位置 选择处理器、内核数量(可根据电脑硬件以及需求进行调整) 选择2G内存(可根据电脑硬件以及需求进行调整) 选择网络类型 选择虚拟磁盘 对于不需要的硬件进行移除 国内镜像源地址 清华源:https://mirrors.tuna.tsinghua.edu.cn/阿里源:https://developer.aliyun.com/mirror/ 下载镜像 CentOS Minimal:CentOS的最小化安装版本,只包含最基本的命令行工具和软件包,适合用于服务器环境。 https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ Ubuntu Server:Ubuntu的服务器版本,也是一个无桌面版操作系统,只包含命令行界面和基本工具,适合用于服务器环境。 https://mirrors.aliyun.com/oldubuntu-releases/releases/20.04.5/ 安装镜像 以centos7为例 选择第一项Install CentOS 7 磁盘划分 在手动完成分区中选择加号,并挂载/boot 容量为300M 设置网络 里面有一栏需要设置网络,这个时候需要自己手动打开 设置root密码

Linux文件系统结构

1、linux文件系统结构 /:是Linux系统的根目录 /bin:存放用户经常使用的命令 /boot:启动加载程序的静态文件 /dev:设备文件目录,不能单独分区 /etc:系统配置文件目录 /home:普通用户的家目录 /root:系统管理员的家目录 /run:进程的运行数据存放的目录 /sbin:存放系统管理员用户使用的命令 /tmp:临时文件目录;任何人都可以访问,存放周期10天 /usr:存放程序文件,库文件,共享文件,各种文档等 /usr/bin:存放用户命令 /usr/local:程序安装目录 /usr/sbin:类似/sbin;存放管理员用户使用的命令 /usr/tmp:被抛弃的临时文件目录 /var:动态数据文件目录;日志文件log,数据库,缓存目录等 /lib:存放程序的库文件 /lib64:存放64位程序库文件 /media:移动媒体的挂载点 /mnt:临时挂载的文件系统的挂载点 /opt:存放第三方软件服务 /proc:伪文件系统,内核映射文件,不能单独分区 /srv: 用来存储本机提供的服务或数据 /sys:伪文件系统,跟硬件设备相关的属性映射文件,不能单独分区 2、绝对路径 绝对路径是指从根目录开始描述的路径,也就是从/开始。 例如:/etc/sysconfig/network-scripts/ifcfg-ens33 3、相对路径 相对路径是指从当前位置开始描述的路径。 常用的标识符: ./ 当前目录 … 当前目录的上级目录

永磁同步电机-随机PWM调制-仿真模型

1.控制策略 FOC双闭环 OR DeadBeat无差拍控制 2.调制策略 随机载波频率 OR 随机零矢量占空比 3.仿真结果 仿真模型概图 【1】常规固定频率SVPWM 三相电流 电流FFT分析(谐波集中) 转矩频谱分析 【2】随机频率SVPWM 三相电流 电流谐波FFT分析(谐波被分散在宽频段) 转矩频谱分析 模型获取请看博主置顶文章 

JAVA内部类

内部类就是在一个类中定义一个类 java中的内部类主要分为两类四种: 第一类:定义在外部类局部位置上,分为局部内部类( 有 类名)、匿名(没有类名)。 第二类:定义在外部类的成员位置上,分为成员内部类(没有static修饰)、静态内部类(使用static修饰)。 a.成员内部类的创建需要依赖于外部类对象-(成员方法必须通过对象调用),在没有外部类实例之前无法创建成员内部类对象 b.内部类与外部类相对独立,不是is a 的关系(发动机-汽车) c.私有属性的互相访问,内部类可以直接访问外部类,而外部类访问内部类需要内部类的对象来访问 格式: /* class 外部类名{ 修饰符 class 内部类名{ } } */ class Outer { public class Inner { } } 内部类访问特点 1.内部类可以直接访问外部类的成员,包括私有的 2.外部类要访问内部类的成员,必须创建对象 1.成员内部类 成员内部类是定义在外部类的成员位置上,并且没有static修饰 成员内部类的使用 1.可以直接访问外部类的所有成员,包括私有的。外部类访问成员内部类访问方式:创建对象,再访问; 2.可以添加任意访问修饰符,因为它的地位就是一个成员; 3.作用域和外部类的其他成员一样,为整个类体 4.如果外部类和内部类的成员重名时,内部类访问的话,遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问。 5.外部其他类访问成员内部类有三种方式:第一种实例化外部类,然后访问;第二种将内部类作为外部类的成员实例化然后访问;第三种在外部类里面编写一个方法,可以返回内部类对象。 成员内部类语法 1.在外部类内部创建内部类对象 2.在外部类外部创建内部类对象,格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象; 例:Outer.Inner oi = new Outer().new Inner(); 成员内部类的推荐使用方案:将一个类,设计为内部类的目的,大多数都是不想让外界去访问,所以内部类的定义应该私有化,私有化之后,再提供一个可以让外界调用的方法,方法内部创建内部类对象并调用。 class Outer { private int num = 10; private class Inner { public void show() { System.

国内IEEEXplore访问加速(adblock)

访问IEEEXplore,需要加载一个网页需要等好久,然后才出来,就很奇怪,查到网上有同样这个问题 感谢原博主:ieeexplore加载慢的解决办法 核心原因: 国内无法访问地址: https://cdn.jwplayer.com/libraries/6Mc4deRE.js 导致每次加载都会在访问这个地址的时候等待20s,然后才跳过 解决办法: 屏蔽此地址,不影响使用 浏览器安装屏蔽网站插件,我使用adblock 进入adblock的设置界面–高级 https://cdn.jwplayer.com/libraries/6Mc4deRE.js 将此网页黏贴过去并添加到我的过滤列表中 刷新页面 即可流畅访问IEEE了!

伙伴匹配系统笔记---03

一、后端整合: 接口文档:请求参数、响应参数、接口地址、接口名称、请求类型、请求格式。 有一个书面的文档,进行项目的维护和说明。 1.Swagger: 2.Knife4j 3.抓取信息: 看链接:SpringBoot整合Swagger_灰太狼家的小鸭子的博客-CSDN博客 二、存量用户信息导入以及同步: EasyExcel:的使用(后补)

Linux / Centos Stream 9安装 Skywalking 9.4.0 记录

链路追踪框架 官网:http://skywalking.apache.org/ 下载:http://skywalking.apache.org/downloads/ Github:https://github.com/apache/skywalking 文档:https://skywalking.apache.org/docs/main/v9.4.0/readme/ 中文文档: https://skyapm.github.io/document-cn-translation-of-skywalking/ 1. 下载 SkyWalking OAP 服务、SkyWalking UI 服务 官网下载: https://skywalking.apache.org/downloads/ 在线下载: wget https://dlcdn.apache.org/skywalking/9.4.0/apache-skywalking-apm-9.4.0.tar.gz 下载 Agents 在线下载: wget https://dlcdn.apache.org/skywalking/java-agent/8.15.0/apache-skywalking-java-agent-8.15.0.tgz 2. 解压 习惯放到local路径下 cd /usr/local/ tar -zxvf apache-skywalking-apm-9.4.0.tar.gz -C /usr/local tar -zxvf apache-skywalking-java-agent-8.15.0.tgz -C /usr/local 3. 配置SkyWalking OAP 避免端口冲突,更换 SkyWalking UI界面默认8080端口: cd apache-skywalking-apm-bin 查看目录 ll 编辑yml文件,以8100端口为例: vi webapp/application.yml 默认内存模式,更改为MySQL连接 vi config/application.yml :set number 可查看行号 大概133 行 修改h2为mysql storage: selector: ${SW_STORAGE:mysql} 大概183-194行,确认MySQL连接信息(地址、账号、密码),记得新建数据库。 mysql: properties: jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest?rewriteBatchedStatements=true"} dataSource.

c盘突然多了了几十个G临时文件怎么清理?

最近有部分用户在整理电脑的时候,发现C盘莫名其妙多了几十个G的临时文件,C盘直接爆红了,这该怎么办?要如何处理这些临时文件呢?下面就来看看详细的清理方法吧。 纯净之家-win7纯净版系统_win7 ghost 纯净版 临时文件被保留的原因:程序可能在完成安装前被中断,或在重新启动时崩溃。 在进行网上冲浪时也会创建临时文件。下载和安装卸载软件,打开电子邮件和即时消息程序中的文件或传输文件时都会创建临时文件。通常创建临时文件的程序会在完成时将其删除,但有时候这些文件会被保留。 通常而言,这个文件夹中的所有文件都可以放心地删除。有时,一些文件正在使用而不能删除,可以重新启动计算机后立即删除它们。 c盘清理注意事项: 在清理C盘的过程中,很多人对这些文件不了解,可能会误删系统文件或者是软件安装文件,导致后期系统无法正常开启或者是软件无法正常使用。 因此在清理C盘的过程中需要知道Windows与DocumentsandSettings中的文件都是系统重要文件,删掉的话可能会影响系统开启,在清理C盘的时候需要注意不要误删这类文件。 c盘无故产生几十个G临时文件怎么清理? 方法一:缓存清理 1、Win10自带了缓存清理功能,我们单机桌面左下角开始键,点击小齿轮进入设置。 2、在设置中输入“存储设置”查找并打开。 3、接着选择“配置存储感知或立即运行”。 4、选择“立即清理”就可以清理缓存了,还可以自己设置定期清理时间。 方法二:重建搜索索引 1、在window设置中(点击左下角“小齿轮进入,具体操作看第一步的图)直接搜索“索引选项”>点击“高级”。 2、选择“重建”重置索引大小。并且可以通过“选择新的位置”把它移到别的分区来节约C盘空间。 方法三:程序管理 1、来到“储存”界面,点击“应用和功能”。 2、将“筛选条件”设置为“window10 C:”,这样c盘中下载的第三方软件和空间占用就非常清晰了,平时被捆绑的一些软件或者有一些空间占用大却暂时用不到的软件就可以在这里一一删除。 方法四:系统文件夹转移 1、在“储存选项”中,点击“更多储存设置”,选择“更改新内容保存位置 ”,选择其他盘如F盘,然后点击“应用”。这样就能将新内容保存在其他盘上,腾出c盘空间。 2、对于C盘中现有的内容,可以通过手动转移的办法:打开“此电脑”我们可以看到“文档”、“下载”、“桌面”等文件夹。它们目前默认的路径都是C盘。在“文档”上点开右键,选择“属性”,然后在菜单中选择“位置”,最后再选择“移动”。 3、然后我们需要在指定一个存放位置,选择“更改新内容”时保存的位置,选中F盘下的同名文件夹,原来C盘中的文档就会自动转移到这里了。(进行移动操作前,需要提前建立好一个文件夹) 方法五:常用程序缓存迁移 1、一些常用软件的缓存路径都会默认保存在c盘,例如微信,我们可以打开微信左下角的“更多”-选择“设置”。 2、在“通用设置”中就可以看到聊天记录的缓存了,可以将这些缓存删除来节省空间,也可以将聊天记录手动备份在其他盘。 3、再将“文件管理”中的文件保存路径改到其他盘,这样微信下载的文件就不会下载到c盘了,其他软件应用也是如此。 方法六:关闭系统休眠功能 1、左下角开始菜单栏上右键>选择搜索》输入cmd》在【命令提示符】上右键选择“以管理员方式运行”。 2、接着在弹出的命令行中输入:powercfg -h off,回车就可以关闭系统休眠功能了。(开启休眠功能需输入命令:powercfg -h on)。

elk+kafka基本

ELK elk + kafka + filebeat 企业内部日志分析系统 elk由ElasticSearch(依莱芙斯塔rua弛)(简称es)logstash(老歌丝带吃)和kibana三个开源工具组成 logstash 收集日志(在java上跑) es 搜索分析 kibana web页面展示 es特点 分布式 配置简洁 自动发现 索引自动分片 索引副本机制 多数据源 由java开发 logstash 带有一个web页面 只收集过滤日志 和改格式 logstash 整个工作流程分为三个阶段 输入 过滤 输出 input 负责产生事件 filter 负责处理数据和转换 output 负责数据输出 kibana es前端展示工具 head侦测es是否收到过滤的日志 用于排查错误 kafka 数据缓冲队列 消息队列 具有高吞吐量(峰值处理几十万消息)高并发(支持数千用户同时读写) 冗余 削峰 解耦 异步通信等功能 kafka 是一个分布式 支持分区 多副本基于zookeeper协调的分布式消息系统 kafka组件 话题(特定类型的信息流) 生产者(能够发布消息到话题的任何对象)消费者(可以订阅一个或多个话题)服务代理(已发布的消息保存在一组服务器中 被陈我给代理或kafka集群)zookeeper(kafka通过组k波存储集群信息) kafka中 一个话题topic会被分成多个区partition并被分到多个服务代理broker上 分区信息及broker分布情况与消费者当前状态信息会被保存在zookeeper中 zookeeper是一个分布式协调服务 主要作用是为分布式系统提供一致性服务 提供包括配置维护 分布式同步等 kafka运行依赖于zookeeper zookeeper主要用来协调kafka的各个服务代理 可以实现服务代理的负载均衡 增加集群高可用 filebeat收集日志

python-pycharm添加外部工具

1.pyside6-designer D:\Program Files\Python39\Scripts\pyside6-designer.exe $ProjectFileDir$ 2.ui文件转py文件 D:\Program Files\Python39\Scripts\pyside6-uic.exe $FileName$ -o $FileNameWithoutExtension$.py $FileDir$ 3.rcc文件转py文件 D:\Program Files\Python39\Scripts\pyside6-rcc.exe $FileName$ -o $FileNameWithoutExtension$.py $FileDir$

在spring中如何在xml配置中加载properties文件

在Spring中,你可以使用PropertyPlaceholderConfigurer来加载和解析properties文件。以下是在XML配置中加载properties文件的步骤: 假设我们有一个jdbc.properties的配置文件: jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm753as jdbc.username=root jdbc.password=123456 首先,在XML配置文件中引入context命名空间,如下所示: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 然后,在XML配置文件中添加PropertyPlaceholderConfigurer bean的定义,指定要加载的properties文件路径,例如: <context:property-placeholder location="classpath:jdbc.properties" /> 最后,你可以通过${}语法在其他bean定义中使用properties文件中的属性值,例如: <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>

java boot项目基础配置之设置启动端口

因为 springboot 项目是一个内嵌的tomcat 那么 我们就来研究一下 怎么改它的启动端口 其实 它的配置 还是非常多的 我们基础部分讲一下 后面 到实用部分 再一边用 一边再看一些 首先 我们如果不设置 他就会占用 我们的 8080端口 那么 我们最好就直接用 80端口 就不用输入端口了 因为 你ip后面不带端口 他就会默认取访问 80端口 那么 问题来了 内嵌的tomcat 没有xml了 那么 怎么配? 这里 注意 我们 boot 工程 配置文件都在 resources 里面 打开下面的application.properties 我们会发现 空的 这个文件是一个键值对格式 我们可以这样写 # 设置当前项目运行在本机80端口上 server.port=80 很明显 # 是他的注释方式 我们上面写了行注释 然后 配置端口 运行到 80端口 那么 能不能用呢? 我们试试 启动项目 可以看到 这里打印的是没什么问题的 我们试着访问他 可以看到 我们不带端口号还有访问 80端口 都是没有问题的 因为 不带80 和之间用 80 访问的其实都是80端口

Java泛型详解

写在开头:想必大家和博主一样,在以往学习JavaSE的语法中,遇到了一个陌生的词——泛型,博主当时很好奇,什么是泛型呢?即使是学完了JavaSE,这个问题都没有解决,只能在百度查阅了解关于泛型的一些皮毛。却不成想,在数据结构的第一课就接触到了这个问题,为了能帮助大家简单的认识泛型,博主通过学习以及查阅诸多资料,决定写下本篇博客并分享给大家,希望能够帮助到和博主当时有一样困境的小伙伴,同时博主也在持续更新各方面的知识内容,欢迎大家动动手指点个关注,第一时间阅读博主的分享内容! 同时博主也毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课。接下来和博主一起学习吧! 本文内容概要: 一、泛型的本质二、包装类2.1 基本数据类型2.2 装箱与拆箱 三、泛型与泛型类的使用3.1泛型语法3.2使用举例3.3泛型类 四、泛型编译机制4.1擦除机制4.2提出问题 五、泛型上界5.1语法5.2实例 泛型进阶 一、泛型的本质 我们有没有想过:实现一个类,可以放入任意类型的数据,同时也可以根据成员方法来返回对应下标的值?以往的学习过程中,我们对数组的使用是刻板的,只能单一的放入指定类型元素,我们会发现这种数组是对代码充满了束缚。所以在JDK1.5以后,我们的前辈提出了泛型这一概念来实现对类型的参数化。 泛型的实质在于:指定当前的容器,他存储的对象应该是什么类型,然后通过编译器去检查,所以我们需要将类型作为参数进行传递 在介绍泛型的使用之前,我们先介绍包装类以及装箱、拆箱的有关知识,以便于我们可以深入学习泛型知识 二、包装类 2.1 基本数据类型 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应一个包装类型。对于基本数据类型来说,除int、char以外其他基本类型都是将基本数据类型首字母大写,而int、char对应的包装类型为Integer、Character,而每个包装类底下也对应着诸多方法,我们不在此过多叙述,可以参考博主其他博客进行参考学习 2.2 装箱与拆箱 public class Fx { int i = 10; // 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中 Integer A = Integer.valueOf(i); Integer B = new Integer(i); // 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中 int j = A.intValue(); } 当然,我们在日常的使用中是不这样写的,因为上述的装箱与拆箱会为开发者增加不少代码量,显的比较繁琐,于是Java又引申出了自动装箱与自动拆箱的语法,如下所述: int i = 10; Integer A = i; // 自动装箱 Integer B = (Integer)i; // 自动装箱 int j = A; // 自动拆箱 int k = (int)B; // 自动拆箱 相信各位老铁看到这里也不需要过多说明已经明白了装箱以及拆箱,接下来让我们去了解了解泛型究竟是个什么样的神奇语法!

maven的概念与一个实例

注:使用maven需要先安装,安装官网网址https://maven.apache.org/download.cgl。 maven是一个项目管理工具。 可以管理项目需要的.jar文件(.jar文件里有项目需要用到的类), 自动下载jar和它的文档,可以管理jar版本, 还能编译程序,测试代码是否正确(可以同时编译多个文件,javac一次只能编译一个文件),且会生成的测试的报告, 还能打包文件,把所有的.class文件、配置文件等所有资源放到一个压缩文件中,这个压缩文件就是项目的结果文件,形成.jar文件(java程序)或者.war文件(web应用), 还能部署文件。 把生成的.jar文件或.war文件安装到仓库,就可以运行。 1.maven的核心概念 一个手动创建的maven项目实例: (1)使用maven工程约定的目录结构 比如一个maven项目Hello: 上图中除了pom.xml其它都是指文件夹。 (2)配置pom.xml文件 (3)在main文件夹下加了.java文件后,在pom.xml所在文件夹打开cmd,使用mvn compile指令。该指令编译src/main目录下的所有.java文件,并且下载需要的.jar文件。 jar文件在maven中叫做插件(maven工具执行的操作需要很多插件),默认下载位置(称为默认仓库)是 若你的java文件中的代码有误还会报错: 修改之后显示如下则编译成功: mvn compile命令执行成功后会生成一个target文件夹 target文件夹下的classes文件夹中含有编译后的.class文件: 3.maven使用的两种方式

Linux安装telnet服务、telnet 命令用法

前言 环境:centos 7.9 Telnet命令经常被用于测试远程端口通不通,telnet命令既可以在Windows下使用,也可以在Linux下使用。 Windows下使用telnet命令 开启telnet客户端步骤:控制面板–程序和功能–启用或关闭Windows功能–Telnet客户端 打钩 win+r --输入cmd 打开cmd命令窗口–输入:telnet 192.168.43.179 10050 Linux下使用telnet命令 [root@nginx /]# yum install telnet [root@nginx /]# telnet 192.168.43.179 10050 Trying 192.168.43.179... Connected to 192.168.43.179. Escape character is '^]'. #这里的'^]'表示你要按Ctrl+] 才能进入Telnet命令行模式 telnet> Connection closed by foreign host. [root@nginx /]# Linux服务服务器安装telnet服务 [root@node2 ~]# yum -y install telnet* #安装telnet-server服务 [root@node2 ~]# yum -y install xinetd #安装xinetd #telnet服务安装之后,默认是不开启服务,修改文件/etc/xinetd.d/telnet来开启telnet服务 [root@node2 ~]# cd /etc/xinetd.d/ #进入telnet服务配置文件目录,默认是没有telnet文件的,需要创建一个 [root@node2 xinetd.d]# ll total 44 -rw------- 1 root root 1157 Apr 1 2020 chargen-dgram -rw------- 1 root root 1159 Apr 1 2020 chargen-stream -rw------- 1 root root 1157 Apr 1 2020 daytime-dgram -rw------- 1 root root 1159 Apr 1 2020 daytime-stream -rw------- 1 root root 1157 Apr 1 2020 discard-dgram -rw------- 1 root root 1159 Apr 1 2020 discard-stream -rw------- 1 root root 1148 Apr 1 2020 echo-dgram -rw------- 1 root root 1150 Apr 1 2020 echo-stream -rw------- 1 root root 1212 Apr 1 2020 tcpmux-server -rw------- 1 root root 1149 Apr 1 2020 time-dgram -rw------- 1 root root 1150 Apr 1 2020 time-stream [root@node2 xinetd.

celery如何调用类方法(self传参问题),以及调用的类方法继承其他函数时,celery无法将任务运行起来

class ABCD: def create_urls(self) -> []: pass def parse_the_list_page(self): pass def parse_details_page(self): pass def start_spider(self, max_workers: int = 16): print('ojbk:', self) self.create_urls() self.parse_the_list_page() self.parse_details_page() 问题1: celery直接调用start_spider时候,无法传入self参数,可以通过另外建立一个方法,用来调用爬虫的start_spider,例如: @app.task def spider(): ABCD().start_spider() 问题2: 当celery调用爬虫时,爬虫的类方法里面存在有logger模块时,使用logger.add方法会导致celery无法调用爬虫,需要将logger.add方法去掉即可

Springboot EXCEL转换为PDF——aspose方式

Springboot EXCEL转换为PDF——aspose方式 一、准备相关资源 1.下载Excel转PDF需要的aspose包 [网盘地址](https://pan.baidu.com/s/1q-CYzdDWqJPgO0331GgoOw) 提取码:uwyx 2.下载aspose破解license文件 网盘链接:https://pan.baidu.com/s/1Mq2XPMhOcXACsAwQyHYREA 提取码:211b 二、配置maven依赖 1. 将下载下来的jar包放在项目的根目录的lib文件夹下 2. 将下载下来的license.xml放在根目录的resources下 3.添加maven依赖 <dependency> <groupId>com.aspose</groupId> <artifactId>aspose-cells</artifactId> <version>8.5.2</version> <scope>system</scope> <systemPath>${project.basedir}/lib/aspose-cells-8.5.2.jar</systemPath> </dependency> 三、创建java文件并编写代码 public class Word2PdfAsposeUtil { public static boolean getLicenseExcel() { boolean result = false; InputStream is = null; try { ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); org.springframework.core.io.Resource[] resources = resolver.getResources("classpath:license.xml"); is = resources[0].getInputStream(); com.aspose.cells.License aposeLic = new com.aspose.cells.License(); aposeLic.setLicense(is); result = true; } catch (Exception e) { e.printStackTrace(); } finally { if (is !

webstorm vue3+ts报错:Cannot find module ‘@/views/xxx.vue‘ or its corresponding type declarations

意思是说找不到对应的模块“@/views/xxx.vue”或其相应的类型声明 因为ts只能解析 .ts 文件,无法解析 .vue文件 解决方法很简单,一开始的时候env.d.ts是空文件,我们可以在项目的env.d.ts中引入如下代码: declare module '*.vue' { import { DefineComponent } from "vue" const component: DefineComponent<{}, {}, any> export default component } 加入上面的代码,就不报错了。

Observability:使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0

如果你已经安装过最近的 Elastic Stack 的话,你可能已经发现 Beats 已经不是推荐的数据摄入方式,取而代之的是 Elastic Agent。我们可以看一下如下的图: 上图展示的是 Elastic Stack 整体的栈的结构图。我们会发现其中最重要的一个变化是使用了 Integrations 而不是之前的 Beats 和 Logstash,尽管它们仍然适用。也就是推荐的办法是使用 Integration 来摄入数据。我们之前使用 Beats 来采集数据的架构是这样的: 所有的 Beats 的数据都可以发送至 Elasticsearch。它们都分别进行配置,但是不能在 Kibana 中进行集中管理和配置。 什么是 integration(集成)? Elastic 集成是一组资产,定义了如何使用 Elastic Stack 观察特定产品或服务: 数据摄取、存储和转换规则设置选项预构建的自定义仪表板和可视化文档测试 集成具有严格、定义明确的结构,并提供许多优于其他摄取选项的优势: 围绕被观察的服务构建 — 而不是监控代理简单、不易出错的配置用户安装的监控代理更少只需点击几下即可部署从 Elastic Stack 解耦发布过程 使用 Elastic Agent 来采集数据可以给我带来如下的好处: 我们使用一个 Elastic Agent,但是它可以代替我们在之前的许多的 Beats: 以 Elastic Agent 为基础的数据摄入架构如下: 在今天的文章中,我们将介绍如何使用 Fleet 来设置 Elastic Agent 并摄入需要的数据。你将了解: 配置 Fleet使用 Elastic Agent 来发送数据到 Elastic Stack监控整个公司的系统和服务的日志和指标 我们可以通过 Fleet 来对 Elastic Agents 进行集中管理和配置。 在每一个 Elastic Agent 中,它是实现了如下的功能:

C语言中u8,u16,u32的详解

一、代表意思 1、u8 :无符号char字符类型 2、u16:无符号short短整形 3、u32:无符号int整数leixing 二、举个例子 typedef signed char int8_t; // 标准表达方式 signed char 被等同于 int8_t; typedef signed short int int16_t; typedef signed int int32_t;//在32位环境里,int代表4个字节32位!! typedef signed __int64 int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned __int64 uint64_t; typedef uint32_t u32;///32位 typedef uint16_t u16;///16位 typedef uint8_t u8;///8位

stm32使用C标准库printf函数

我们都知道 C 语言中printf 函数默认输出设备是显示器,如果要实现在串口或者 LCD 上显示,必须重定义标准库函数里调用的与输出设备相关的函数。 比如使用 printf 输出到串口,需要将 fputc 里面的输出指向串口,这一过程就叫重定向。 在stm32中只需要将fputc里边的输出指向STM32的串口即可,代码如下: int fputc(int ch,FILE *p) //函数默认的,在使用 printf 函数时自动调用 { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); return ch; } 如果要让其他的串口也使用 printf 函数,只需要修改下串口号即可。 这样就可以使用stm32串口输出中使用printf函数。 例如 printf("请输入数据,以回车键结束\r\n"); 在串口监视器中可以看到 需要注意的是 在KEIL中使用printf一定要勾选“微库”选项,否则不会输出 配置如下: 在STM32 程序开发中 printf 应用是非常广的,当我们需要查看某些变量数值或者其他信息等, 都可以通过 printf 打印到串口调试助手上查看。 参考 STM32实例-printf 重定向