VRRP原理及实战实现

目录 一、VRRP介绍 1、VRRP作用 2、VRRP实现原理 二、VRRP实验配置 1、实验目的 2、实验工具及机器 3、实验拓扑 4、实验步骤 一、VRRP介绍 1、VRRP作用 VRRP协议中文名称虚拟路由冗余协议,应用在路由器上,其作用是某一路由器损坏或链路出现问题立刻切换到另一个路由器上不影响整个网络的运行,更好的保障网络通信。 例如下图中Server服务器为PC2与PC3提供服务,如果只有AR1路由器配置PC2和PC3的网关,AR1出现问题或者AR1侧的链路出现问题那PC2和PC3就无法访问server了,AR1和AR2又不能同时配置PC2和PC3的网关,所以此刻网络就瘫痪了需要手动去配置AR2。此时若是可以自动切换到AR2就不会出现网络瘫痪的问题,运用VRRP协议可以提供这种自动切换的服务。 2、VRRP实现原理 VRRP的原理其实很简单,就是将多个路由器逻辑上虚拟成一个大的路由器来提供服务,例如上图中可以将AR1和AR2逻辑上合成一个路由器,配置一个虚拟的ip来为PC提供服务。 在这个虚拟的“大”路由器中将实际的各个小路由器划分主用和备用路由器,主路由器可以正常工作时备用路由则闲置。划分主路由器与备路由器是如何划分的呢就要看他们的优先级了。如下图,若AR1为主路由器故障后或链路故障后,pc2和pc3则通过备用交换机访问server。 主备路由器划分标准: ①根据优先级划分主备路由器 1、优先级分为0-255级别。 2、优先级可手动配置1-254. 3、优先级默认为100。 4、若其中一个路由器为255级则直接成为主路由器。(一般只有存在真机和虚拟机地址一样时才会出现,成为主机后每1s钟向备机发送一个VRRP报文给备机用来告知备机主机还存在还不需要备机进行工作) ②若加入虚拟“大”路由器时优先级不是255则先成为备机,等待各路由器互相发送报文看是否有优先级比自己高的机器存在,等待时间为3s。(如何得知网络中是否存在比自己优先级高,虚拟“大”路由器中的设备会互相发送ARRP报文) 1、若收到的VRRP报文中优先级比自己高,则自己成为备机。 2、若收到的VRRP报文中优先级比自己低,则自己成为主机。 3、若收到的VRRP报文中优先级与自己相同,则比较接口ip地址的大小,ip地址大的成为主机。例如10.0.0.1与10.0.0.2则10.0.0.2所在的路由器成为主路由器。 4、若收到的VRRP报文中优先级为0,则要做好成为主机的准备。优先级为0代表虚拟“大”路由器中的主路由器主动退出。 5、选择出主路由器后备用路由器不再向主路由器发送报文。 6、虚拟ip是跟随主备切换的,若AR1为主则虚拟ip在AR1上,若AR1故障切换AR2为主则虚拟ip切换到AR2上。 ③主机虽然每隔1s都在向备机发送VRRP报文但是如果是主机的上层链路出现问题,此时PC1和PC2就不能访问server了,但是主机还是能向备机发送VRRP报文告知自己存在,为了解决这种问题则需要主路由器监听上层链路的情况,需要工程师手动配置,当上层端口down掉则优先级减小一部分,减完之后优先级必须比备用优先级低,这样才能完成切换。 二、VRRP实验配置 1、实验目的 实现当AR1路由器出现故障不影响网络业务。 2、实验工具及机器 工具:eNSP V100R003C00SPC100虚拟器 设备:华为AR220路由器三台、华为S3700交换机一台、华为计算机二台、华为服务器一台。 3、实验拓扑 4、实验步骤 ①第一步将PC2、PC3、server的IP地址以及掩码网关配置完毕。如下图 ②第二步,将AR1和AR2接口地址以及静态路由配置完毕。 AR1: <Huawei>undo terminal monitor ##关闭用户视图提示 <Huawei>system-view ##进入系统视图 [Huawei]sysname AR1 ##修改路由器名称 [AR1]interface g0/0/0 ##进入g0/0/0接口 [AR1-GigabitEthernet0/0/0]ip address 192.168.1.100 24 [AR1-GigabitEthernet0/0/0]interface g0/0/1 ##进入g0/0/1接口 [AR1-GigabitEthernet0/0/1]ip address 10.0.0.2 24 ##配置IP地址 [AR1-GigabitEthernet0/0/1]quit ##退回上一层 [AR1]ip route-static 192.

记一次Wait Classcursor: mutex X cursor: mutex S等待事件问题核查

客户环境是一套12.2.0.1的一体机rac,上午9点左右的是后客户说连不上库,是连pdb2的时候,客户端会卡在那边,没有返回; 我在服务器上直接sqlplus abc/abc123456@mypdb2也连接不上,sqlplus一直无法返回,只能返回版本提示信息,无法进入sql>提示符 查看top,cpu负载很高;--5分钟10分钟,15分钟基本都在500+以上,vcpus 24 查看内存free -g ,剩余内存较多,还有50g+;swap未被使用过; 查看iostat感觉等待也还行,负载不是太高; 查看oracle进程连接,连接比较多ps -ef| grep LOCAL=NO,这套库配置的process比较高,10000这个没有超标; 昨天发生过一次,当时重启了pdb2就好了;但是过了一天,又发生了; 生成awr报告 db time时间很长,可见数据库目前负载很大; 并行latch里面的mutex X等待事件特别高,占所有等待事件的84.5;这个等待事件是保护库缓存内存结构的latch,跟sql解析hashvalue的内存结构有关; 查询了会话很多,而且active的会话都是waiting的状态,都在等待资源,由上面的等待事件来看,应该就是在等待mutex X的锁; set linesize 1000 pagesize 1000 col instance_number for 999999 col session_id for 9999999 col session_serial# for 99999999 col SQL_ID for a20 col EVENT for a15 col BLOCKING_INST_ID for 999 col BLOCKING_SESSION for a10 col BLOCKING_SESSION_SERIAL# for 9999 col PROGRAM for a20 select instance_number,session_id,session_serial#,SQL_ID,EVENT,BLOCKING_INST_ID,BLOCKING_SESSION, BLOCKING_SESSION_SERIAL# ,PROGRAM from DBA_HIST_ACTIVE_SESS_HISTORY where SAMPLE_TIME between to_timestamp('202303210900','yyyymmddhh24mi') and to_timestamp('202303211000','yyyymmddhh24mi') and rownum <10000; 查询该时间段执行的sql,发现这条sql数据量特别多,而且都在不同会话等待相同的mutex s锁资源;

hadoop fs常用命令(五)

hadoop fs -help 当执行-help命令后,可以列出所有命令帮助信息 查看某一命令的帮助信息可在-help后面跟上所要查询的命令,以cat命令为例: hadoop fs -help cat 常用命令 hadoop fs (hdfs dfs)文件操作 ls 显示目录下的所有文件或者文件夹 使用方法: hadoop fs -ls [uri形式目录]示例: hadoop fs -ls / 显示根目录下的所有文件和目录显示目录下的所有文件可以加 -R 选项示例: hadoop fs -ls -R / cat 查看文件内容 使用方法:hadoop fs -cat URI [URI …]示例: hadoop fs -cat /in/test2.txt mkdir 创建目录 使用方法:hadoop fs -mkdir [uri形式目录]示例: hadoop fs –mkdir /test 创建多级目录 加上 -p示例: hadoop fs -mkdir -p /a/b/c rm 删除目录或者文件 使用方法:hadoop fs -rm [文件路径]

Flink使用 KafkaSource消费 Kafka中的数据

1.前言 目前,很多 flink相关的书籍和网上的文章讲解如何对接 kafka时都是使用的 FlinkKafkaConsumer,如下: StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); Properties properties = new Properties(); //指定kafka的Broker地址 properties.setProperty("bootstrap.servers", "192.168.xx.xx:9092"); //指定组ID properties.setProperty("group.id", "flink-demo"); //如果没有记录偏移量,第一次从最开始消费 properties.setProperty("auto.offset.reset", "earliest"); FlinkKafkaConsumer<String> kafkaSource = new FlinkKafkaConsumer<>("topic005", new SimpleStringSchema(), properties); 新版的 flink,比如 1.14.3已经将 FlinkKafkaConsumer标记为 deprecated(不推荐),如下: 'org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer' is deprecated 2.如何使用 KafkaSource 新版本的 flink应该使用 KafkaSource来消费 kafka中的数据,详细代码如下: StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); KafkaSource<String> kfkSource = KafkaSource.<String>builder() .setBootstrapServers("192.168.xx.xx:9092") .setGroupId("flink-demo") .setTopics("topic005") .setStartingOffsets(OffsetsInitializer.earliest()) .setValueOnlyDeserializer(new SimpleStringSchema()) .build(); DataStreamSource<String> lines = env.fromSource(kfkSource, WatermarkStrategy.noWatermarks(), "kafka source"); 3.总结 开发者在工作中应该尽量避免使用被标记为 deprecated的方法或者类,要及时进行更换,保持代码的活力。

Electron应用图标的配置与生成

技术选型: 1、"electron": "21.3.3", 2、"electron-vite": "1.0.17" 3、"vue": "3.2.45" 4、"element-plus": "2.2.32" 背景: 默认情况下我们使用electron开发的应用使用的图标有四种类型: 软件的安装文件图标: 软件安装之后在桌面生成的图标: 软件打开之后在任务栏显示的图标: 软件打开之后左上角显示的图标: 那么在electron里面怎么设置这四种图标呢? 其实上面四种图标可以分为两类,1和2分为一类,叫安装包图标,3和4分为一类,软件运行时显示的图标,叫窗口图标 窗口图标的修改: 修改的文件:src\main\index.js 修改的文件内容,参考下面代码第八行,在BrowserWindow里面设置icon属性: function createWindow() { // Create the browser window. const mainWindow = new BrowserWindow({ width: 1400, height: 800, show: false, autoHideMenuBar: true, icon: join(__dirname,'../../resources/image/3.png'), ...(process.platform === 'linux' ? { icon } : {}), webPreferences: { preload: join(__dirname, '../preload/index.js'), sandbox: false, nodeIntegration: true } }) 安装包图标的修改 安装包图标的修改要比窗口图标修改困难的多 安装electron-icon-builder npm i electron-icon-builder 在package.

Python:Pandas字符串处理相关函数与loc[]切片

目录 前言: 一、字符串处理 1. len() 2. lower() 3. strip() 4. split() 5. cat(sep=) 6. contains() 7. replace() 8. count() 9. startswith() 和 endswith() 10. findall() 与 find() 二、切片之.loc[] 与 .iloc[] .loc[] .iloc[] 前言: 本文为学习记录,仅供个人复习使用。如有错误,望指正。文中字符串处理基于Series数据类型。 本文包含pandas三方库内处理字符串的相关函数,以及.loc[]和.icol[]切片。 新手注意:pandas库中包含了多种数据类型,在专门处理字符串类型的时候,添加一个.str 调用字符串相关函数时,写法为:数据名称.str.函数名称() 一、字符串处理 1. len() 该函数返回字符串的长度。 import numpy as np import pandas as pd s = pd.Series(['C', 'Python ', 'java', 'go', np.nan, '1125 ', ' javascript']) print(s.str.len()) ''' 0 1.0 1 6.0 2 4.0 3 2.

DPDK介绍

DPDK 为 Intel 处理器架构下用户空间高效的数据包处理提供了库函数和驱动的支持,它不同于 Linux 系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。 也就是 DPDK 绕过了 Linux 内核协议栈对数据包的处理过程,在用户空间实现了一套数据平面来进行数据包的收发与处理。在内核看来,DPDK 就是一个普通的用户态进程,它的编译、连接和加载方式和普通程序没有什么两样。 一、背景介绍 随着云计算产业的异军突起,网络技术的不断创新,越来越多的网络设备基础架构逐步向基于通用处理器平台的架构方向融合,从传统的物理网络到虚拟网络,从扁平化的网络结构到基于 SDN 分层的网络结构,无不体现出这种创新与融合。 这在使得网络变得更加可控制和成本更低的同时,也能够支持大规模用户或应用程序的性能需求,以及海量数据的处理。究其原因,其实是高性能网络编程技术随着网络架构的演进不断突破的一种必然结果。 说到高性能网络编程,一定逃不过 C10K 问题(即单机 1 万个并发连接问题),不过这个问题已经成为历史了,很多技术可以解决它,如常用的 I/O 多路复用模型,select, poll, epoll 等。在此基础上也出了很多优秀的框架,比如 Nginx 基于事件驱动的 Web 服务框架,以及基于 Python 开发的 Tornado 和 Django 这种非阻塞的 Web 框架。 这里不得不提一个人,就是 Errata Security 公司的 CEO Robert Graham,他在 Shmoocon 2013 大会上很巧妙地解释了这个问题。有兴趣可以查看其 YouTube 的演进视频: C10M Defending The Internet At Scale。他提到了 UNIX 的设计初衷其实为电话网络的控制系统而设计的,而不是一般的服务器操作系统,所以,它仅仅是一个负责数据传送的系统,没有所谓的控制层面和数据层面的说法,不适合处理大规模的网络数据包。最后他得出的结论是: OS 的内核不是解决 C10M 问题的办法,恰恰相反 OS 的内核正式导致 C10M 问题的关键所在。 二、问题产生:OS内核弊端 1、中断处理:当网络中大量数据包到来时,会产生频繁的硬件中断请求,这些硬件中断可以打断之前较低优先级的软中断或者系统调用的执行过程,如果这种打断频繁的话,将会产生较高的性能开销。

字符数组和字符指针

经常有人问这个问题,mark一下,看完就非常清晰了。 1.字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。 这里要注意字符指针与字符数组之间的区别。例如,有说明语句: char string[ ]="This is a string."; 此时,string是字符数组,它存放了一个字符串。 字符指针str与字符数组string的区别是:str是一个变量,可以改变str使它指向不同的字符串,但不能改变str所指的字符串常量。string是一个数组,可以改变数组中保存的内容。 2.实例: char *str, *str1="This is another string."; char string[100]="This is a string."; 则在程序中,可以使用如下语句: str++; /* 指针str加1 */ str = "This is a NEW string."; /* 使指针指向新的字符串常量 */ str = str1; /* 改变指针str的指向 */ strcpy( string, "This is a NEW string.") /* 改变字符串的的内容 */ strcat( string, str) /* 进行串连接操作 */ 在程序中,不能进行如下操作:

jumpserver 常见问题处理

目录 jumpserver 常见问题处理 账号密码类 用户点击登录资产时没有可选账号登录 jumpserver 常见问题处理 账号密码类 用户点击登录资产时没有可选账号登录 权限管理-资产授权-指定账号 想要的效果是,jumpserver的普通用户zhangke登录一台机器,登录的时候可以选择他自己在linux上的账号登录 然而给jumpserver普通用户指定使用zhangke这个用户登录主机,输入的时候不自动显示 正常登录的时候应该是像下面这样的,登录选择账号,而zhangke这个却没有 解决方案如下: 首先先查看属于zhangke的资产有哪些,然后分别登录到这些机器上增加zhangke的账号密码 (ps:这里是因为历史遗留问题只能每个人每台机器的账号和权限都不一样,其实一个非root用户就能替代的) //登录这些资产机器分别加账号,我用的ansible useradd zhangke -g zhangke ... //这里不做详细描述了,对运维来说很多种方法都可以搞定 然后确认账号管理-账号模版下有没有zhangke的模版,如果没有就添加 最后登录到jumpserver,点击 资产管理-资产列表,找到对应的那些机器,分别点击更新 修改账号列表 点击账号模版,选择我们刚才在账号管理-账号模版里创建的账号zhangke,然后点击更新 和zhangke绑定的那些机器都添加完账号模版后,我们再去给他指定账号登录,他就可以自己弹出zhangke,并且登录的时候也能选择张可的账号登录我们的机器了

VS CODE插件-Keil Assistant代替keil编辑器

VS CODE插件-Keil Assistant代替keil编辑器 ## vscode 上的 Keil 辅助工具,与 c/c++ 插件配合使用. 能够为 Keil 项目提供 语法高亮、代码片段 的功能,并支持对 keil 项目进行 编译、下载。 仅支持 Keil uVison 5 及以上版本 仅支持 Windows 平台

K8S可视化管理平台KubeSphere

什么是 KubeSphere ? KubeSphere 是一款开源项目,在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器管理平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时,极大降低开发、测试、运维的日常工作的复杂度。 特点 易用 面向开发、测试、运维友好的 UI,向导式用户体验,通过 KubeSphere 控制台将 Kubernetes 的能力以一种极简的方式输送给用户。 灵活 除开源解决方案外,如用户对网络和存储有更高要求,可选用 青云 QingCloud 作为底层平台,可以使用商业化的网络和存储解决方案,集成青云 SDN、块存储和 NeonSAN。 高效 无基础设施依赖,无 Kubernetes 依赖,支持跨物理机、虚拟机、云平台部署,可以纳管不同版本、不同厂商的 Kubernetes 集群。 应用场景 KubeSphere®️ 适用于企业在数字化转型时所面临的敏捷开发与自动化运维、微服务应用架构与流量治理、自动弹性伸缩和业务高可用、DevOps 持续集成与交付等应用场景。 一步升级容器架构,助力业务数字化转型 企业用户部署于物理机、传统虚拟化环境的业务系统,各业务模块会深度耦合,资源不能灵活的水平扩展。KubeSphere 帮助企业将 IT 环境容器化并提供完整的运维管理功能,同时依托青云QingCloud 为企业提供强大的网络、存储支持,并可高效对接企业原监控、运维系统,一站式高效完成企业 IT 容器化改造。 多维管控 Kubernetes,降低运维复杂度 无论将业务架构在 Kubernetes 平台上的用户,还是使用多套来自不同厂商提供的 Kubernetes 平台的用户,复杂的运维管理使企业压力倍增。KubeSphere 可提供统一平台纳管异构 Kubernetes 集群,支持应用自动化部署,减轻日常运维压力。同时,完善的监控告警与日志管理系统有效节省运维人工成本,使企业能够将更多精力投放到业务创新上。 敏捷开发与自动化运维,推动企业 DevOps 落地 DevOps 将开发团队与运营团队通过一套流程或方法建立更具协作性、更高效的的关系,使得开发、测试、发布应用能够更加敏捷、高效、可靠。KubeSphere CI / CD 功能可为企业DevOps 提供敏捷开发与自动化运维。同时, KubeSphere 的微服务治理功能,帮助企业以一种细粒度的方式开发、测试和发布服务,有效推动企业 DevOps 落地。 灵活的微服务解决方案,一步升级云原生架构 微服务架构可轻量级构建冗余,可扩展性强,非常适合构建云原生应用程序。KubeSphere 基于主流微服务解决方案 Istio,提供无代码侵入的微服务治理平台。后续将集成 SpringCloud,便于企业构建 Java 应用,助力企业一步实现微服务架构,实现应用云原生转型。

Linux shell---sed的几个简单的替换应用

对字符串的操作: 例如:提取字符串aa_bb_cc_dd中的字符 提取第一个下划线 _ 前的字符:(将下划线后的字符替换为空字符) echo "aa_bb_cc_dd" | sed 's/_[^_]*//g' 运行结果:aa 删除最后一个下划线 _ 后的字符:(将下划线后的字符替换为空字符) echo "aa_bb_cc_dd" | sed 's/_[^_]*$//g' 运行结果:aa_bb_cc 替换最后一个下划线 _ 后的字符: echo "aa_bb_cc_dd" | sed 's/[^_]*$/ee/g' 运行结果:aa_bb_cc_ee 替换除下划线 _ 外的所有字符: echo "aa_bb_cc_dd" | sed 's/[^_]/e/g' 运行结果:ee_ee_ee_ee

带你深入Java Log框架,彻底搞懂Log4J、Log4J2、LogBack,SLF4J

Log4J、Log4J2和LogBack的历史故事 使用过Log4J和LogBack的同学肯定能发现,这两个框架的设计理念极为相似,使用方法也如出一辙。其实这个两个框架的作者都是一个人,Ceki Gülcü,俄罗斯程序员。 Log4J 最初是基于Java开发的日志框架,发展一段时间后,作者Ceki Gülcü将Log4j捐献给了Apache软件基金会,使之成为了Apache日志服务的一个子项目。 又由于Log4J出色的表现,后续又被孵化出了支持C, C++, C#, Perl, Python, Ruby等语言的子框架。 然而,伟大的程序员好像都比较有个性。Ceki Gülcü由于不满Apache对Log4J的管理,决定不再参加Log4J的开发维护。“出走”后的Ceki Gülcü另起炉灶,开发出了LogBack这个框架(SLF4J是和LogBack一起开发出来的)。LogBack改进了很多Log4J的缺点,在性能上有了很大的提升,同时使用方式几乎和Log4J一样,许多用户开始慢慢开始使用LogBack。 由于受到LogBack的冲击,Log4J开始式微。终于,2015年9月,Apache软件基金业宣布,Log4j不在维护,建议所有相关项目升级到Log4j2。Log4J2是Apache开发的一个新的日志框架,改进了很多Log4J的缺点,同时也借鉴了LogBack,号称在性能上也是完胜LogBack。性能这块后面我会仔细分析。 那slf4j和这些有什么关系? SLF4J的全称是Simple Logging Facade for Java,slf4j是门面模式的典型应用,因此在讲slf4j前,需要简单介绍下门面模式。 看看门面模式再说 下面是门面模式的一个典型调用过程,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。 下图中客户端不需要直接调用几个子系统,只需要与统一的门面进行通信即可。 门面模式的核心为Facade即门面对象,核心为几个点: 知道所有子角色的功能和责任。 将客户端发来的请求委派到子系统中,没有实际业务逻辑。 不参与子系统内业务逻辑的实现。 为什么要使用slf4j ? 回答这个问题之前,我们先看看如果需要用上面几个日志框架来打印日志,一般怎么做,具体代码如下: // 使用log4j,需要log4j.jar import org.apache.log4j.Logger; Logger logger_log4j = Logger.getLogger(Test.class); logger_log4j.info("Hello World!"); // 使用log4j2,需要log4j-api.jar、log4j-core.jar import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; Logger logger_log4j2 = LogManager.getLogger(Test.class); logger_log4j2.info("Hello World!"); // logback,需要logback-classic.jar、logback-core.jar import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; Logger logger_logback = new LoggerContext().getLogger(Test.class); logger_logback.info("Hello World!"); 复制代码 从上面不难看出,使用不同的日志框架,就要引入不同的jar包,使用不同的代码获取Logger。如果项目升级需要更换不同的框架,那么就需要修改所有的地方来获取新的Logger,这将会产生巨大的工作量。

Ubuntu18.04下搭建LAMP环境

目录 一、Apache2 web服务器的安装: 二:数据库MySQL的安装 三:PHP的安装 四:phpMyAdmin 的安装(可选) 注意:以下操作均在root用户下进行,如在普通用户,请自行加上sudo! 安装之前可更新一下服务器(可选): 1、 apt update # 获取最新资源包 2、 apt upgrade # 本机软件全部更新 3、 apt dist-upgrade # 本机系统软件更新 一、Apache2 web服务器的安装: #安装Apache apt install apache2 # 开启 、关闭和重启Apache服务器 systemctl start apache2 # 开启 systemctl stop apache2 # 关闭 systemctl restart apache2 # 重启 开启 Apache服务器后访问本地的 Web 服务器,打开浏览器并输入Ubuntu18.04的IP地址,看到Apache的默认信息页面即表示安装成功。 二:数据库MySQL的安装 # 安装MySQL: apt install mysql-server 安装完之后通过如下命令登录mysql数据库 mysql -u root -p -u 表示选择登陆的用户名, -p 表示登陆的用户密码,现在是mysql数据库是没有密码的,Enter password:处直接回车,就能够进入mysql数据库;然后通过 show databases; 就可以查看当前的所有数据库

windows cmd GBK改UTF8编码

cmd下中午默认显示的格式是GBK,如果跟程序的编码不一样则会乱码,所以建议改成UTF8编码 首先右键属性查看当前编码,一般是936 GBK 在cmd里输入chcp可以看到当前代码页的数字 我们可以手动输入chcp 65001来切换UTF-8编码 按enter运行,可以看到切换了活动代码页 但是如果我们想每次打开cmd都默认设置为UTF8编码呢,可以参考下列操作 (1)搜索注册表编辑器,或者win+R打开regedit 新建字符串autorun即可

常见的图像质量评估指标SSIM、PSNR、LPIPS

现阶段针对有真实参考的图像生成任务,主要有三种质量评价指标,分别为两种人为设计的指标SSIM和PSNR,也包括深度学习网络抽取到的特征进行对比的LPIPS评价指标 一:结构相似性(structural similarity,SSIM) SSIM(Structural Similarity),是一种衡量两幅图像相似度的指标。相对PSNR而言,SSIM在评价图像质量上更能符合人类的视觉特性。SSIM使用的两张图像中,一张为未经压缩的无失真图像,另一张为失真后的图像。 给定两个图像x和y, 两张图像的结构相似性可按照以下方式求出: SSIM值的范围为[0,1],越大代表图像越相似。如果两张图片完全一样时,SSIM值为1。 SSIM指数从图像组成的角度将结构信息定义为独立于亮度、对比度的,反映场景中物体结构的属性,并将失真建模为亮度、对比度和结构三个不同因素的组合。用均值作为亮度的估计,标准差作为对比度的估计,协方差作为结构相似程度的度量。 二:峰值信噪比(Peak Signal to Noise Ratio,PSNR) PSNR(Peak Signal to Noise Ratio),是一种评价图像质量的度量标准。因为PSNR值具有局限性,所以它一般用于衡量最大值信号和背景噪音之间的图像质量参考值。 PSNR的单位为dB,其值越大,图像失真越少。一般来说,PSNR高于40dB说明图像质量几乎与原图一样好;在30-40dB之间通常表示图像质量的失真损失在可接受范围内;在20-30dB之间说明图像质量比较差;PSNR低于20dB说明图像失真严重。 PSNR是最普遍,最广泛使用的评鉴图像的客观量测法,不过许多实验结果都显示,PSNR的分数无法和人眼看到的视觉品质完全一致,有可能PSNR较高者看起来反而比PSNR较低者差。这是因为人眼的视觉对于误差的敏感度并不是绝对的,其感知结果会受到许多因素的影响而产生变化(例如:人眼对空间频率较低的对比差异敏感度较高,人眼对亮度对比差异的敏感度较色度高,人眼对一个区域的感知结果会受到其周围邻近区域的影响) 给定一个大小为m×n的灰度图 I 和噪声图 K,均方误差(Mean Square Error,MSE,)公式如下: 在此基础上,PSNR被定义为: 三:学习感知图像块相似度(Learned Perceptual Image Patch Similarity, LPIPS) LPIPS(Learned Perceptual Image Patch Similarity),也称为“感知损失”(perceptual loss),用于度量两张图像之间的差别。来源于CVPR2018的一篇论文《The Unreasonable Effectiveness of Deep Features as a Perceptual Metric》,该度量标准学习生成图像到Ground Truth的反向映射强制生成器学习从假图像中重构真实图像的反向映射,并优先处理它们之间的感知相似度。LPIPS 比传统方法(比如L2/PSNR, SSIM, FSIM)更符合人类的感知情况。LPIPS的值越低表示两张图像越相似,反之,则差异越大。 d为 x0与x之间的距离。从L层提取特征堆(feature stack)并在通道维度中进行单位规格化(unit-normalize)。利用向量WL 来放缩激活通道数,最终计算L2距离。最后在空间上平均,在通道上求和。

Vue中的路由

目录 目录 一,路由理解 二,基本配置 第一步: 在main.js文件中引入并使用插件 第二步: 在src文件夹下创建一个router文件夹然后在文件夹下创建index.js ​编辑 第三步: 回到main.js中引入创建的 router 并在vue实例对象中使用 三,路由的使用 第一点:a标签在路由中的改变 第二点,多级路由 第三点,路由的传参 query传参 params传参 四,编程式路由导航 replace属性和push属性 五,缓存组件和两个生命周期钩子 1,缓存路由组件 2,两个新的生命周期钩子 六,路由守卫 第一种,全局守卫 第二种,独享守卫 第三种,组件守卫 一,路由理解 1)理解: 一个路由(route)就是一组映射关系(key-value),多个路由需要路由器(router)进行管理 2)前端路由:key是路径,value是组件 3)作用:设定访问路径,并将路径和组件映射起来(就是用于局部刷新页面,不需要请求服务器来切换页面) $route 1. route是单个路由,存放当前路径信息,携带的参数 $router 1. 管理整个路由系统,里面保存所有的路径信息,能够实现路由的跳转 二,基本配置 前期准备: 安装vue-router 全局配置 ,命令: npm i vue-router (默认安装的是4版本适配的是vue3,如果使用的是vue2的话,必须选定3版本 npm i vue-router@3。 第一步: 在main.js文件中引入并使用插件 // 第一步: 引入router 插件 import VueRouter from 'vue-router' // 使用插件 Vue.use(VueRouter) 第二步: 在src文件夹下创建一个router文件夹然后在文件夹下创建index.js index.js中写路由的核心代码 // 该文件是专门用于创建整个应用的路由器 // 第一步引入插件(本质是一个构造函数) import VueRouter from 'vue-router' // 引入一下用到的组件 import About from '.

【样本不均衡】本质影响分析

目录 一、前言 二、样本不均衡的定义 三、样本不均衡的影响 四、 样本不均衡的本质:影响决策面 五、我的疑问:样本不均衡对encoder是否有影响? 一、前言 首先说明,本文不包括样本不均衡问题的解决方法,只是对其本质影响尝试做一个阐述。其中不妥当的地方,欢迎在评论区交流。 二、样本不均衡的定义 为简化起见,以下均在二分类问题中展开讨论。 所谓“样本不均衡”,指的是在training dataset中,正负类样本的数量不均衡。 三、样本不均衡的影响 Firstly,在训练样本分布和测试样本分布(或真实样本分布)之间出现较大差异时,样本不均衡才会产生问题。 在印象中,如果train过程中,正类样本很少,负类样本很多,那么在test过程中,model会倾向于将data分类为负类。 但是到底为什么? 在参考对这个问题的分析时,我见到了以下几个说法: ①样本不均衡,导致model学习到了“真实世界”中,“正类样本远比负类样本少”的先验信息 ②样本不均衡,影响模型学习到更本质的特征 ③样本不均衡,使得我们应该更关注召回率recall 有些说法我觉得很有启发意义,有些我持观望态度,下面将提出我自己的思考。 四、 样本不均衡的本质:影响决策面 样本不均衡会导致在某个特征空间中,model学习到的决策面更靠近少样本一侧。 我们知道,机器学习或深度学习的某个实质,就是将低维空间线性不可分的样本,通过某种映射到高维空间变得线性可分。 如CNN中的卷积层,就是将原始输入encode到一个feature space,如VGG得到一个7×7×512的tensor,再通过全卷积FC(大小为 7×7×512,数量为4096)到1×1×4096的tensor,后面可输出分类。这里encoder后得到的tensor,相当于某个特征空间中的样本点;全卷积,相当于判别函数。 在不均衡的training dataset中,model要想得到较低的loss实现正确分类,就要在正类样本和负类样本之间找到一个决策面,这个决策面将两类数据分隔开。 不是说样本不均衡100%会导致model不好 ①如果最后学习到的model恰好紧贴着负类样本,和正类样本之间有较大的margin,那么train的样本不均衡就没有影响,如图1. ②同样,在一些简单task上(正负样本之间天然有很大的margin),样本不均衡也不会产生很大影响,如图2. 样本不均衡,影响的是test过程中“困难样本”的分类 In other words, 样本不均衡影响的是在margin附近的样本,即困难样本。因为在很多情况下,model学习到的决策面并不能如图1、2那样,而是很普通的在两类样本之间,而正类样本数量又很少,这就导致决策面会“自然”地向数量少的样本推进。这样test时,决策面两侧判别函数的计算,就会满足一个>0, 一个<0(或者以概率上的0.5为准,是一样的)。 上述分析与解决方法的呼应 在数据不均衡的解决方法中,存在着这样的对应: ①过采样/欠采样:努力使得数据分布均衡; ②改变分类阈值/loss加权:努力改变决策面位置,向数量多的类别推; 五、我的疑问:样本不均衡对encoder是否有影响? 上述分析的是 样本不均衡对决策面的影响。但是有个很重要的问题,那就是对encoder出来的特征空间(feature)有无影响?思路可以如下: ①在一个样本不均衡的dataset中,对已经pre-trained的model,freeze住前面encoder的参数,只训练后面的参数,再test:估计效果肯定不好,应该可以证实决策面的分析 ②在一个样本不均衡的dataset中,from-scratch训练一个model,包括encoder和后面的分类器,看看encoder出来的feature和pre-trained模型提出来的feature是否差异很大? 由于时间原因本人没有验证,欢迎交流讨论。

zip 命令初学指南

这是一份关于理解 Linux 中的 zip 命令的初学者指南,并附有一些例子。 zip 文件是一个包含一个或多个文件的压缩档案。它作为一种无损数据压缩技术被广泛使用。由于压缩,它占用的磁盘空间更少,在计算机网络上传输时需要的数据也更少。 这些压缩文件可以在 Linux、Windows 和 macOS 中轻松提取。有各种支持压缩 zip 文件的软件,也提供提取它们的功能。 由于它很流行,几乎所有的操作系统都内置了这个功能。 在本教程中,我们将谈论几种基于终端的方法来压缩 Linux 中的文件。 Linux 中的 Zip 命令示例 语法 在 Linux 中,你需要使用的压缩文件的程序名称是 zip。下面是基本的语法: zip [压缩文件名] file1 file2 file3 以下是正式的语法: zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list] 理想情况下,zip 命令应该被安装在所有主流的 Linux 发行版中。如果没有,使用下面的命令来安装它。 在 Debian、Ubuntu 和相关发行版上安装 sudo apt install zip 在 Fedora、基于 RHEL 的系统上安装 sudo dnf install zip 在 Arch Linux 上安装 pacman -S zip 让我们继续看一些例子。

简单使用Redis集合实现分页,排名

什么是Redis? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。 代码 public function test(){ $this->redis->select(2); //有序集合 查询所有成绩分数 $data= $this->redis->zRevRange('Exam',0,-1,true); //查询当前页 $page= request()->get('page'); //查询排名 $name= request()->get('name'); //设置加减分 $kemu=request()->get('kemu'); $sou=request()->get('sou'); ################# Redis有序集合分页################### $nextpage=""; $nevpage=""; //获取所有科目数量 $count=$this->redis->zCard("Exam"); //当前页 !empty($page)?$thispage=$page:$thispage=1; //每页显示的条数 $limit=2; //总页数 $allpage=ceil($count/$limit); //偏移量 $arr=($thispage-1)*$limit; //分页展示 $data=$this->redis->zRevRange('Exam',$arr,$limit*$thispage,true); //下一页 if ($thispage<$allpage)$nextpage=++$thispage; //上一页 if ($thispage>$allpage)$nevpage=--$thispage; ################# 查询数据排名信息 ###################### //获取成绩排名 if (!empty($name))$mc=$this->redis->zRevRank('Exam',$name); if (!empty($name))return json_encode(['soft'=>$mc,'message'=>'查询数据排名']); ################## 返回修改后的排名 ##################### //加减分 提高/降低排名 if (!empty($kemu)&&!empty($sou))$this->redis->zIncrBy('Exam',$sou,$kemu); if (!empty($kemu)&&!empty($sou))return json_encode(['soft'=>$this->redis->zRevRank('Exam',$kemu)+1,'message'=>'修改成功!现在的名次']); ################# 返回页数 和数据信息 ########################

Vue基于element UI 实现导出表格内容

通过点击导出信息按钮,实现表格内容的导出。 代码如下: 1.首先npm相应的依赖 npm i xlsx@0.16.9 npm i file-saver@2.0.5 2.引入导出Excel表格依赖 import FileSaver from 'file-saver' import XLSX from 'xlsx' 3.为自己需要导出的el-table表格添加一个id属性"educe-table" 4. 为button按钮绑定一个click事件exportExcel <el-button type="primary" @click="exportExcel">导出信息</el-button > JS: 5.实现exportExcel方法 exportExcel() { // 1.生成Excel工作簿对象 // var wb = XLSX.utils.table_to_book(document.querySelector('#educe-table')); // 2.手机号,身份证号等会默认使用科学计数法表示,则需要这样设置 var wb = XLSX.utils.table_to_book( document.querySelector("#educe-table"), { raw: true } ); // 获取二进制字符串作为输出 var wbout = XLSX.write(wb, { bookType: "xlsx", book: true, type: "array", }); try { FileSaver.saveAs( // Blob: 对象表示一个不可变 原始数据的类文件对象,不一定是JS原生格式的数据。 // File: 基于Blob,继承了blob的功能并将其扩展使其支持用户系统上的文件。 new Blob([wbout], { type: "

信息系统项目管理师第四版知识摘编:第1章 信息化发展

第1章 信息化发展 在新一代信息技术的推动下,人类社会正在加速进入全新发展时期,以智能化、网络化、数字化等为典型特征的新模式、新经济、新业态等正在加速形成,电子政务、消费互联网、工业互联网、智能制造和智慧城市等正在深刻影响人们的生产、消费和生活方式等。随看数据广泛链接和共享、数字孪生广泛建设,重新定义了信息空间的内涵,基于已发生的信息快照已经无法满足人们对美好生活的需求。对物理世界的模拟、未来的预测以及物理社会的优化,将成为新的核心关注点,个性化需求的高效满足成为发展的主要方向之一。 信息化继工业化后,正在催生一场新的入类社会革命,其影响更加广泛、变革更加深入,已经成为世界各国的关注焦点和共同选择: 1.信息化的发展水平代表一个国家的信息能力,信息产业成为国家核心竞争力的新战略高地,信息技术成为国家间竞争的核心聚住; 2.数字经济、数字人才成为区域经济与社会发展的重要支点,这不仅需要持续强化信息技术人才的业务能力建设,也需要业务技术人才的信息技术能力建设,从而形成立体化、多元化的新型人才体系; 3.作为数字化转型主体的计算机信息系统工程是一项复杂的社会和技术工程,无论是内容、规模、深度和广度,还是技术、工具、业务和流程,都在不断地发展和创新。 1.1信息与信息化 1.1.1信息 信息(Information)是物质、能量及其属性的标示的集合,是确定性的增加。它以物质介质为载体,传递和反映世界各种事物存在方式、运动状态等的表征。信息不是物质,也不是能力,它以一种普遍形式,表达物质运动规律,在客观世界中大批存在、产生和传递。 1948年,数学家香农指出:“信息是用来消除随机不定性的东西”。创建一切宇宙万物的最基本单位是信息,信息量的单位为比特(bit)。1比特的信息量,在变异度为2的最简单情况下,就是能消除非此即彼的不确定性所需要的信息量。这里的“变异度”是指事物的变化状态空间为2,例如大和小、高和低、快和慢等。香农将热力学中的熵引入了信息论。在热力学中,熵是系统无序程度的度量,而信息是系统有序程度的度量,表现为负熵。 信息、由意义和符号组成,指以声音、语言、文字、图像、动画、气味等方式所表示的实际内容。信息是抽象于物质的映射集合。 1.1.2信息系统 信息系统是由相互联系、相互依赖、相互作用的事物或过程组成的具有整体功能和综合行为的统一体。从数学角度来看,系统是一个集合,是由许多相互作用、相互依存的事物(集合元素)为了达到某个目标组成的集合。 编辑 添加图片注释,不超过 140 字(可选) 信息系统就是通过输入数据,然后进行加工处理,最后产生信息的系统。面向管理和支持生产是信息系统的显著特点,以计算机为基础的信息系统可以定义为:结合管理理论和方法,应用信息技术解决管理问题,提高生产效率,为生产或信息化过程以及管理和决策提供支撑的系统。信息系统是管理模型、信息处理模型和系统实现条件的结合。 信息系统的组成部件包括硬件、软件、数据库、网络、存储设备、感知设备、外设、人员以及把数据处理成信息的规程等。从用途类型来划分,信息系统一般包括电子商务系统、事务处理系统、管理信息系统、生产制造系统、电子政务系统、决策支持系统等。 软件在信息系统中屈于较复杂的部件,可以借用软件的生命周期来表不信息系统的生命周期。软件的生命周期通常包括:可行性分析与项目开发计划、需求分析、概要设计、详细设计、编码、测试、维护等阶段。 信息系统的生命周期可以简化为:系统规划(可行性分析与项目开发计划),系统分析(需求分析),系统设计(概要设计、详细设计),系统实施(编码、测试),系统运行和维护等阶段。 编辑切换为居中 添加图片注释,不超过 140 字(可选) 1.1.3信息化 信息化是指培养、发展以计算机为主的智能化工具为代表的新生产力,并使之造福于社会的历史过程。与智能化工具相适应的生产力,称为信息化生产力。信息化是以现代通信、网络、数据库技术为基础,将所研究对象各要素汇总至数据库,供特定人群生活、工作、学习、辅助决策等,是和人类息息相关的各种行为相结合的一种技术。 信息化是推动经济社会发展转型的一个历史性过程。在这个过程中,综合利用各种信息技术,支撑改善人类的各项政治、经济、社会活动,并把贯穿于这些活动中的各种数据有效、可靠地进行管理,经过符合业务需求的数据处理,形成信息资源,通过信息资源的整合与融合,促进信息交流和知识共享,形成新的经济和社会形态,推动各方面的高质量发展。 信息化内涵主要包括: 信息网络体系:包括信息资源、各种信息系统、公用通信网络平台等。 信息产业基础:包括信息科学技术研究与开发、信息装备制造、信息咨询服务等。 社会运行环境:包括现代工农业、管理体制、政策法律、规璋制度、文化教育、道德观念等生产关系与上层建筑。 效用积累过程:包括劳动者素质、团家现代化水平和人民生活质负的不断提高,精神文明和物质文明建设不断进步等。 国家信息化体系包括信息技术应用、信息资源、信息网络、信息技术和产业、信息化人才、信息化政策法规和标准规范6个要素,这6个要素的关系构成了一个有机的整体。 编辑 添加图片注释,不超过 140 字(可选) 1)组织信息化趋势 组织的信息化是国家经济与社会信息化的基础,指组织在产品的设计、开发、生产、管理、经营等多个环节中广泛利用信息技术,并大力培养信息人才,完善信息服务,加速建设组织信息系统。 产品信息化包含两层含义:1.产品中各类信息比重日益增大、物质比重日益降低,其物质产品的特征向信息产品的特征迈进;2.越来越多的产品中嵌入了智能化元器件,使产品具有越来越强的信息处理功能。 产业信息化指农业、工业、服务业等传统产业广泛利用信息技术,大力开发和利用信息资源,建立各种类型的产业互联网平台和网络,实现产业内各种资源、要素的优化与重组,从而实现产业的升级。 社会生活信息化指包括市场、科技、教育、军事、政务、日常生活等在内的整个社会体系采用先进的信息技术,建立各种互联网平台和网络,大力拓展人们日常生活的信息内容,丰富人们的精神生活,拓展人们的活动时空等。 国民经济信息化指在经济大系统内实现统一的信息大流动,使金勋、贸易、投资、计划、营销等组成一个信息大系统,生产、流通、分配、消费等经济的四个环节通过信息进一步连成一个整体。国民经济信息化是世界各国急乱实现的目标。 2)国家信息化趋势 2016年8月中共中央办公厅、国务院办公厅颁布的《国家信息化发展战略纲要》强调:国家信息化发展战略总目标是建设网络强国,分“三步走”:第一步到2020年,核心关键技术部分领域达到国际先进水平,信息产业国际竞争力大幅提升,信息化成为驱动现代化建设的先导力量;第二步到2025年,建成国际领先的移动通信网络,根本改变核心关键技术受制于人的局面,实现技术先进、产业发达、应用领先、网络安全坚不可摧的战略目标,涌现一批具有强大国际竞争力的大型跨国网信企业;第三步到21世纪中叶,信息化全面支撑富强民主文明和谐的社会主义现代化国家建设,网络强国地位日益巩固,在引领全球信息化发展方面有更大作为。当前,我国全面部署了“构建产业数字化转型发展体系”重大任务,明确我国化息化进入加快数字化发展、建设数字中国的新阶段。 《“十四五”国家信息化规划》明确了:建设泛在智联的数字基础设施体系,建立高效利用的数据要素资源体系,构建释放数字生产力的创新发展体系,培育先进安全的数字产业体系,构建产业数字化转型发展体系,构筑共建共治共享的数字社会治理体系,打造协同高效的数字政府服务体系,构建普惠便捷的数字民生保障体系,拓展互利共赢的数字领域国际合作体系和建立健全规范有序的数字化发展治理体系等重大任务。 1.2现代化基础设施 统筹推进传统基础设施和新型基础设施建设,打造系统完备、高效实用、智能绿色、安全可靠的现代化基础设施体系,是我国当前在该领域的发展战略和导向。 1.2.1新型基础设施建设 2018年召开的中央经济工作会议,首次提出“加快5G商用步伐,加强人工智能、工业互联网、物联网等新型基础设施建设”,简称“新基建”。“新型基础设施建设”的提法由此产生,其主要包括5G基建、特高压、城际高速铁路和城际轨道交通、新能源汽车充电桩、大数据中心、人工智能、工业互联网等七大领域。“新基建”面向国家战略需求,为经济社会的创新、协调、绿色、开放、共享发展提供底层支撑的具有乘数效应的战略性、网络型基础设施,内涵更丰富,更能体现数字经济的特征,能够更好地推动中国经济转型升级。 新型基础设施以新发展理念为引领,以技术创新为驱动,以信息网络为基础,面向高质量发展需要,提供数字转型、智能升级、融合创新等服务。主要包括如下三个方面: 信息基础设施。信息基础设施主要指基于新一代信息技术演化生成的基础设施。信息基础设施包括:a.以5G、物联网、工业互联网、卫星互联网为代表的通信网络基础设施;b.以入工智能、云计算、区块链等为代表的新技术基础设施;c.以数据中心、智能计算中心为代表的算力基础设施等。信息基础设施凸显“技术新”。 融合基础设施。融合基础设施主要指深度应用互联网、大数据、人工智能等技术,支撑传统基础设施转型升级,进而形成的触合基础设施。勋合基础设施包括智能交通基础设施、智慧能源基础设施等。融合基础设施重在“应用新”。 创新基础设施。创新基础设施主要指支撑科学研究、技术开发、产品研制的具有公益属性的基础设施。创新基础设施包括重大科技基础设施、科教基础设施、产业技术创新基础设施等。创新基础设施强调“平台新”。 新型基础设施建设比传统基建内涵更加丰富,涵盖范围更广,更能体现数字经济特征,能够更好地推动经济与社会转型升级。“十四五”规划中提出持续加快建设新基础设施: 强化数字转型、智能升级、融合创新支撑.布局建设信息基础设施、融合基础设施、创新基础设施等新型基础设施; 建设高速泛在、天地一体、集成互联、安全高效的信息基础设施,增强数据感知、传输、存储和运算能力: 加快5G网络规模化部署,待续提高用户普及率,推广升级千兆光纤网络; 前瞻布局6G网络技术储备: 扩容骨干网互联节点,新设一批国际通信出入口,全面推进互联网协议第六版(IPv6)商用部署, 实施中西部地区中小城市基础网络完善工程; 推动物联网全面发展,打造支持固移融合、宽窄结合的物联接入能力; 加快构建全国一体化大数枙中心体系,强化算力统筹智能调度,建设若干国家枢纽节点和大数据中心共群,建设E级和10E级超级计算中心; 积极稳妥发展工业互联网和车联网: 打造全球覆盖、高效运行的通信、导航、遥感空间基础设施体系,建设商业航天发射场: 加快交通、能源、市政等传统基础设施数字化改造,加强泛在感知、终端联网、智能调度体系建设; 发挥市场主导作用,打逍多元化投资渠道,构建新型基础设施标准体系等。

mysql按逗号拼接起来_MySql逗号拼接字符串查询的两种方法

下面两个函数的使用和FIND_IN_SET一样,使用时只需要把FIND_IN_SET换成FIND_PART_IN_SET或FIND_ALL_PART_IN_SET 例如某字段里是为1,2,3,4,5 使用方法: 第一种,传入1,3,6 可以查出来 select * from XXX where FIND_PART_IN_SET('1,3,6','1,2,3,4,5') 第二种,传入1,3,6 查不出来 select * from XXX where FIND_ALL_PART_IN_SET('1,3,6','1,2,3,4,5') 函数: 第一种:只要包含其中一个就可以被查出来 CREATE DEFINER = `root`@`%` FUNCTION `NewProc`(str1 text,str2 text) RETURNS text BEGIN #传入两个逗号分割的字符串,判断第二个字符串是否包含第一个字符串split之后的单个 DECLARE CURRENTINDEX INT;#当前下标 DECLARE CURRENTSTR text; DECLARE result int; set result = 0; set CURRENTINDEX = 0; set CURRENTSTR = ''; IF str1 IS NOT NULL AND str1 != '' THEN SET CURRENTINDEX = LOCATE(',',str1); WHILE CURRENTINDEX > 0 DO

Windows设置本地DNS域名解析Hosts文件的方法

我们需要先了解DNS解析查询的顺序。在用户输入域名之后,DNS解析查询的顺序是下面这样的。 (1)浏览器会首先查看自身的缓存,如果浏览器缓存中有对应的解析记录,直接返回结果; (2)如果浏览器没有缓存,电脑会查看本地操作系统的缓存,如果有记录,直接返回结果; (3)如果浏览器和本地缓存中都没有记录,会向递归解析服务器发起请求,递归服务器如果有记录直接返回,如果没记录会向全球发起递归查询,直到获得对应解析记录返回客户端并保存在本地。 什么是hosts文件? 在上面的DNS查询过程中,第二个步骤即电脑查看本地操作系统中的缓存,这里的缓存文件即为hosts文件。 由操作系统操作的IP和域名的本地映射文件,可以视为DNS server的重写,一旦查到了指定的域名,就不会继续查找DNS server, 所以可以节省时间。 但是hosts设置的IP地址是静态的,如果web app的宿主机地址发生改变,对应的hosts也要改写。 hosts是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,无需进行下面的解析查询过程,因此大大节省了查询时间。如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。 如何修改hosts文件? (1)搜索hosts文件 C:\Windows\System32\drivers\etc\hosts 我们知道centos中的hosts文件路径是/etc/hosts,windows里的路径也类似,只是前面多了一些前缀路径。 (2)通过记事本方式打开hosts文件,先写该域名对应的IP地址,然后空格加域名信息。按如下格式添加完保存就可以了。

Dubbo服务引用

一、服务引用的时机 1、ReferenceBean#afterPropertiesSet 方法时引用服务 2、ReferenceBean 对应的服务被注入到其他类中时引用 二、服务引用流程图: 服务引用流程: 参数检查,把ReferenceBean⾥的参数值设置为高优先级 调用init方法,生成ref 创建一个map对象,放入消费者一些参数 如果是本地引用,构建本地协议URL进行服务引入 如果是一个注册中心,直接调用Protocol#refer,得到一个Invoker对象 如果是多注册中心,遍历每个注册中心,分别调用Protocol#refer,封装所有Invokers,经过路由负载均衡,得到一个Invoker对象 PROXY_FACTORY.getProxy(invoker) 传入invoker,得到一个代理对象 三、生成的代理对象 生成的代理对象: public class proxy0 implements ClassGenerator.DC,EchoService,DemoService { public static Method[] methods; private InvocationHandler handler; public String sayHello(String string) { Object[] objectArray = new Object[]{string}; Object object = this.handler.invoke(this, methods[0], objectArray); return (String)object; } public String sayHello(String string, String string2) { Object[] objectArray = new Object[]{string, string2}; Object object = this.handler.invoke(this, methods[1], objectArray); return (String)object; } public Object $echo(Object object) { Object[] objectArray = new Object[]{object}; Object object2 = this.

ILETS雅思备考

次序听读九––132-7.0424-6.034-7.5十––329-6.5十二––631-7.0十六––122-5.532-7.0229-6.533-7.5323-6.0 LISTENING-40-30分钟 听: 轻读词THEM*,FOR,WHILE,IN,THERER注意连接词ANDFEWER是更少方位词全听单复数** 记: 看清题目问的对象:如何,频率留神听的和写的要一致尽量看全文本 选项提示词单复数->名词 READING-40-60分钟 注意文本否定过程的内涵,比较的意图 TFN: 看清题意看清YES还是TRUE 选词: for sth. of sb. = for sb. 标题匹配: 注意KEY WORD,看懂文本潜意识情绪 WIRTING-2-60分钟 1 地图折线 一短句话介绍(抄题目FLUCTUATION 波动考点:相似,稳定变化,短暂波动数字 = FIGURE 2 冠词 the: community, student, nationa:/:common sense, nature 词性:volunteer work写错:numErous, definitEly, gUaranteEd,单复数:the locals,单三: do sth. 写成直接动词ing resonsibilities to the nation in place where …状语从句不忘地点 everyday是adj. contribute TO care FOR SPEAKING NOT SHARE THIS OPINION不同意观点 Two factors contribute to this People have easier access to

# ERROR: No matching distribution found for csv WARNING: You are using pip version 21.3.1;

ERROR: No matching distribution found for csv WARNING: You are using pip version 21.3.1; however, version 23.0.1 is available. ** 错误:找不到 csv 的匹配分布 警告:您使用的是 pip 版本 21.3.1;但是,版本 23.0.1 可用。 ** 今天使用python的时候,发现需要导入一个名叫‘csv’的库,那我就导入呗,结果导入的时候遇到了错误! 错误:找不到 csv 的匹配分布 警告:您使用的是 pip 版本 21.3.1;但是,版本 23.0.1 可用。 您应该考虑通过’C:Users.\PycharmProjectsw2cevenvScriptspython.exe -m pip install --upgrade pip’ 命令进行升级。 ok,既然pycharm已经给出了意见,那我就去升级。 打开命令提示符 输入相应语句python -m pip install --upgrade pip,结果它报错了! 错误: 由于环境错误,无法安装包错误: [WinError 5] 拒绝访问。: 请考虑使用“–user”选项或检查权限。错误:找不到满足要求 csv 的版本(来自版本:无) 天呐,他又报错了,但是这个命令提示符给我了一个新的提示,真不愧是”提示“符。那我们按照提示再来一次。输入python -m pip install --user --upgrade pip看到成功安装(Successfully installed)这几个字,我就知道事情成功了,为了保险起见,我们来检查一下。

Redis7之哨兵(九)

9.1介绍 哨兵巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务,俗称无人值守运维 作用 监控redis运行状态,包括master和slave当master down机,能自动将slave切换成新master 哨兵的四个功能 主从监控 监控主从redis库运行是否正常 消息通知 哨兵可以将故障转移的结果发送到客户端 故障转移 如果master异常,则会进行主从切换,将其中一个slave作为新master 配置中心 客户端通过连接哨兵来获得当前Redis服务的主节点地址 9.2 基本操作 Redis Sentinel架构 3个哨兵 自动监控和维护集群,不存放数据,只是监控 1主2从 用于数据读取和存放 步骤 注意: 由于虚拟机运行内存问题,将哨兵放在一台机器上,真正部署项目时要分开 在 /myredis 目录新建或者拷贝 sentinel.conf 先看看redis解压目录下默认的sentinel.conf文件的内容 哨兵sentinel文件参数(先导) bind 服务监听地址,用于客户端连接daemonize 是否以后台daemon方式运行protected-mode 安全保护模式port 端口logfile 日志文件路径pidfile pid日志路径dir 工作目录sentiel monitor 设置要监控的masterquorm 表示最少有几个哨兵认可客观下线,同意故障迁移的法定票数 网络是不可靠的,有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了,在sentinel集群环境下需要多个sentinel互相沟通来确认某个master是否真的死了,quorum这个参数是进行客观下线的一个依据,意思是至少有quorum个sentinel认为这个master有故障,才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因,导致无法连接master,而此时master并没有出现故障,所以,这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用。 sentiel auth-pass 通过密码连接master 哨兵sentinel文件配置 sentinel26379.conf sentinel26380.conf sentienl26381.conf 先启动一主二从 按照上章配置的一主二从基础上,需要对主机redis6379.conf进行更改 6379后续可能会变成从机,需要设置访问新主机的密码, 请设置masterauth项访问密码为123456 启动一主二从 6379.conf redis-server /myredis/redis6379.conf redis-cli -a 123456 6380.conf redis-server /myredis/redis6380.conf redis-cli -a 123456 -p 6380 6381.

HCL_V5.7.0下载、安装

一、HCL_V5.7.0下载 1.进入新华三官网https://www.h3c.com/cn/,点击导航栏的支持 2.鼠标移到“软件下载”,点击有界面的“软件下载”按钮 3.点击“其它产品” 4.点击“H3C网络设备模拟器官方免费下载” 5.然后出现很多版本,选择我们想要的即可 6.比如5.7.0版本,下载即可,文件有点大 二、HCL_V5.7.0安装 https://www.bilibili.com/video/BV1nG411u7Rp/?vd_source=9a141fdc035035533c19b159365fcaa7

损失函数——均方误差(Mean Squared Error,MSE)

均方误差(Mean Squared Error,MSE):MSE是回归任务中常用的损失函数,它衡量模型预测值与实际值之间的平均平方误差。 具体来说,MSE的计算公式如下: 其中,n是样本数量,xi是第i个样本的真实值,yi是模型对第i个样本的预测值。 MSE的值越小,说明模型的预测值与真实值之间的差异越小,模型的性能越好。MSE可以被视为模型对预测值误差的平方的平均值,因此它对离群值(Outlier)比较敏感。如果样本中存在离群值,MSE可能会受到它们的影响而导致模型性能下降。 MSE广泛应用于线性回归和多元线性回归等任务中。在深度学习中,MSE也被用于衡量神经网络在回归任务中的性能,并作为损失函数进行优化。在使用MSE作为损失函数进行优化时,通常会采用梯度下降等优化算法来最小化MSE的值,从而提高模型的性能。 在PyTorch中,可以使用内置的MSE损失函数来计算均方误差。以下是使用PyTorch实现MSE损失函数的示例代码: import torch import torch.nn as nn # 创建真实值和预测值的张量 y_true = torch.tensor([1, 2, 3, 4, 5], dtype=torch.float32) y_pred = torch.tensor([1.5, 2.5, 2.8, 3.8, 4.5], dtype=torch.float32) # 计算MSE损失函数 criterion = nn.MSELoss() mse_loss = criterion(y_pred, y_true) print("MSE损失值:", mse_loss.item()) 在上面的代码中,首先创建了真实值和预测值的张量,然后使用PyTorch内置的nn.MSELoss()函数创建了一个MSE损失函数的实例。最后,调用实例的forward()方法,传入预测值和真实值张量,即可计算出MSE损失值。 如果需要在训练模型时使用MSE作为损失函数进行优化,可以在训练循环中计算损失,并使用反向传播算法更新模型参数。以下是使用MSE作为损失函数进行模型训练的示例代码: import torch import torch.nn as nn import torch.optim as optim # 定义模型 class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() self.linear = nn.Linear(1, 1) def forward(self, x): y_pred = self.

解决Chrome 浏览器提示错误:无法翻译此页面

由于谷歌停止了中国大陆的翻译服务,导致Chrome浏览器无法使用自带全文翻译功能,点击翻译会出现: 在网上搜索大概有两种解决方法: 修改host 找到可用的translate.googleapis.com的ip地址,然后配置到系统hosts文件中,可以使用全文翻译。 不过这个方法弊端是需要较高的it技术水平,对于小白来说十分困难,而且找到的ip会很快失效,需要重新再找, 非长久之计。 2)安装DeepL翻译扩展 DeepL是一款诞生在德国的在线翻译工具,DeepL的优点主要在于翻译结果的句子通顺且有一定润色,机翻味没那么重,我们可以通过安装扩展插件来使用DeepL的免费翻译功能,解决Chome浏览器的翻译问题。 安装方法: https://www.strerr.com/blog/tech/install-DeepL-for-chrome.html 运行效果

电费管理系统-UML建模课程设计

目录 前言 一、任务要求 二、系统功能简介 2.1 缴费功能 2.2 查询功能 2.3 管理功能 2.4 系统管理 三、业务建模 3.1 识别业务参与者 3.2 识别用例 3.3 绘制活动图 四、用例建模 4.1 分析需求 4.2 识别参与者 4.3 识别用例 4.4 绘制用例图 4.5 编写用例文档 4.6 重构用例模型 五、用例模型分析 5.1 分析用例 5.2 识别分析类 5.3 绘制顺序图 5.4 绘制类图 六、设计重构 七、心得体会 八、参考文献 总结 前言 简单记录一下,期末关于电费管理系统的UML建模课程设计。 一、任务要求 参考“4+1”视图模型,利用UML工具对所选定系统进行视图建模: 1、业务建模主要操作步骤:识别业务参与者、识别业务用例、绘制活动图等)。 2、用例建模主要操作步骤:分析需求、识别参与者、识别用例、绘制用例图、编写用例文档、重构用例模型等。 3、用例分析主要操作步骤:分析用例、完善用例文档、识别分析类、绘制顺序图、绘制类图等。 4、根据面向对象的设计原则和常用设计模式对设计进行重构并进行总结。 5、完成大作业设计报告。 二、系统功能简介 电费管理系统,在管理方面节省了时间,为部门节省了大量的人力和物力;并且方便业主对自己相关信息的了解,真正做到电费管理的透明化、高效性、方便性,适应了当今社会高效、便捷的要求。根据本系统的功能要求,其功能模块划分如图2.1所示 图2.1 电力公司收费管理系统基本功能 2.1 缴费功能 用户可以选择线下去营业厅缴费,也可以选择在网上进行缴费。 图2.2 缴费功能图 具体功能如下: ①线下缴费: 根据用户提供的电费卡,查询用户的用电情况,包括当月的,历史欠费等,现场收取电费。 ②线上缴费: 用户在网上核对用电信息后,通过微信小程序,或移动APP进行缴费。 2.2 查询功能 查询功能可以通过系统查询用户的用电量、缴费记录、用户个人信息、操作记录查询。

Hive数据倾斜的原因以及常用解决方案

在Hadoop平台的hive数据库进行开发的时候,数据倾斜也是比较容易遇到的问题,这边文章对数据倾斜的定义以及产生的原因、对应的解决方案进行学习。 一、数据倾斜的定义 数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点。主要表现为任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。 单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大 于平均时长。 二、数据倾斜产生的原因 1,key 分布不均匀。 2,业务数据本身的特性。 3,建表考虑不周全。 4,某些 HQL 语句本身就存在数据倾斜。 三、数据倾斜的类型以及对应解决方案 1,空值产生的数据倾斜 原理:使本身为 null 的所有记录不会拥挤在同一个 reduceTask 了,会由于有替代的 随机字符串值,而分散到了多个 reduceTask 中了,由于 null 值关联不上,处理后并不影响最终结果。 示例:在日志中,常会有信息丢失的问题,比如日志中的 user_id,如果取其中的 user_id 和用户表中的 user_id 相关联,就会碰到数据倾斜的问题。 常用解决方案: (1)user_id 为空的不参与关联 select * from log a join user b on a.user_id is not null and a.user_id = b.user_id union all select * from log c where c.user_id is null; (2)赋予空值新的 key 值

微信小程序实现购物商城(附源码)

2018年本人做了一个淘宝购物返利的微信公众号,截至目前已运营了近5年的时间,也陆续积累了不少粉丝。近日,有部分用户反馈是否可以在公众号上展示促销商品列表,而且要具备搜索功能。为感谢粉丝朋友们的长期支持,笔者耗时一周,利用茶余饭后时间,开发了一个微信小程序,详情如下: 一、首页 包括活动图片的轮播展示、活动商品缩略图和基本信息的展示、横向滑动tabBar、搜索框等。 <!--pdd_index.wxml--> <import src="components/user_guide/user_guide"/> <!--顶部搜素框--> <view class="container"> <view class="search"> <view class="searchlong"> <image class="searchico" src="/icon/search.jpeg"></image> <input class="searchkuang" type="text" placeholder="点击输入商品名称" confirm-type="search" bindconfirm="searchGoods" /> </view> </view> <!--顶部轮播图--> <view class="luobotu"> <swiper class="swiperImg" autoplay="{{autoplay}}" interval="{{interval}}" indicator-dots="true" circular="true" indicator-color="white" indicator-active-color="orange"> <block wx:for="{{activityList}}" wx:key="index"> <swiper-item data-id="{{item.id}}" data-title="{{item.title}}" data-jumpType="{{item.jumpType}}" data-activityTags="{{item.activityTags}}" data-activityDesc="{{item.activityDesc}}" data-platLink="{{item.platLink}}" data-itemId="{{item.itemId}}" data-imgUrl="{{item.imgUrl}}" data-jType="{{item.type}}" bindtap="jump_activity"> <image class = "lunboimg" src="{{item.imgUrl}}"></image> </swiper-item> </block> </swiper> </view> <!--滑动tabs--> <view class="listPar"> <scroll-view scroll-x="true" class="nav" scroll-left="{{navScrollLeft}}" scroll-with-animation="{{true}}" show-scrollbar="false" enhanced="true"> <block wx:for="

关于导入、编译、烧录S32K144 MCAL样例工程的相关问题

问题来自于实践。 在学习了EB关于相关模块的配置之后,尝试导入S32K144 MCAL的样例到EB中,并配置相关的工具链进行编译,再使用S32DS进行执行文件的烧录,在这期间遇到了不少问题,记录一下。 找不到样例的问题 进入官网大家可以看到有很多的版本,1.0.4、1.0.3、1.0.2…… 很遗憾的告诉大家,这些都不可以用,我们需要进入到以前的版本中找到1.0.0这个版本。 然后下载,安装,lisence……具体的可以参考其他大佬写详细步骤,这里不做赘述。 找到你的MCAL1.0.0安装路径,进去看看,样例工程在不在。 太棒了!!!它在,谁也不能阻止我点灯!!!! 导入样例到EB 然后导入到EB中就可以了 别忘记右键重新配置一下Reload comfig 然后生成代码: 这些应该都难不住大家,下一步可能就有点迷糊了 编译样例 编译之前有一点要搞明白!!! 咱们前面导入到EB里面生成的代码,和编译毛关系都没有! EB的工作路径在这里,咱们刚配置生成的代码也在这里。 可编译是要去这个路径下 这是令我百思不解的地方,意义在哪里? 按道理来说,下面这个是标准的样例模板: bin里面是编译过程中生成的链接和执行elf文件,或者map文件。 cfg里面是EB配置成功生成的MCAL文件。 ……………… 可现在样例隔离开了 1里面是待会儿咱们要编译的 2里面是咱们刚刚导入的EB文件,搞得很乱,但不影响咱们学习大概的流程。 改脚本 第一步肯定是要先找到批量处理文件的脚本,修改一下路径来适配咱们自己的电脑与工具链。 要修改的其实不多,主要是EB的安装目录,三个编译器的安装目录,以及MCAL插件的安装目录。 EB的安装目录: SET TRESOS_DIR=D:/EB/tresos GHS: SET GHS_DIR=C:/tools/ghs/ARM_MULTI_7.1.4COMPILER_2017.1.4 GCC: SET LINARO_DIR=E:/NXP/S32DS_ARM_v2.2/S32DS/build_tools/gcc_v6.3/gcc-6.3-arm32-eabi IAR: SET IAR_DIR=C:/tools/IARSystem/EmbeddedWorkbench8.0/arm MCAL插件的安装目录: SET PLUGINS_DIR=D:/EB/S32K14X_MCAL4_3_RTM_1_0_0/eclipse/plugins 对了还有,编译完成的out目录: SETTRESOS_WORKSPACE_DIR=D:/EB/tresos/workspace/lighting_S32K144_4.3_RTM1.0.0/output 编译 都完成之后,打开命令行: 输入指令: .\launch.bat MODE=USER TOOLCHAIN=gcc 编译完成之后: 进入目录下就可以看到,生成的可执行文件 烧录 这里使用S32DS平台进行烧录,方法参考了这个大佬的的文章: S32DS 使用 tips--使用Flash from file下载S19或elf文件 首先新建一个空的工程: 比如我这里的test 然后点击这个闪电图标,把elf文件定位到刚刚生成的目录,点击flash,实现烧录!!! 灯也是非常的亮!!!

【MATLAB函数】function定义函数

1、函数声明 定义:function [返回变量列表]=函数名(输入变量列表) 如:function [y1,...,yN] = myfun(x1,...,xM) end 声明一个名为myfun 的函数,该函数接受输入参数 x1,...,xM 并返回输出参数 y1,...,yN。此声明语句必须是函数的第一个可执行代码行。有效的函数名称以字母字符开头,并且可以包含字母、数字或下划线。 在函数定义中必须对返回变量列表中的变量赋值 2、函数文件与脚本文件中的函数 函数文件的名称应与函数的名称一致,不一致则调用该函数时以文件名为函数名调用。 脚本文件中,命令在前,函数定义在后,任何一条命令不能在函数定义之后,函数必须位于该文件的末尾。脚本文件的名称不能与文件中的函数具有相同的名称。 3、可变参数函数 定义:function varargout = myfun(varargin) end nargin、nargout、varargin、varargout为MATLAB保留变量,只要进入可变参数函数,MATLAB就将自动生成nargin、nargout、varargin这3个变量,对于varargout变量只有对其赋值varargout才能使用。 nargin:函数的输入参数个数 nargout:函数的输出参数个数 varargin:输入可变参数列表(数据类型为 1xn cell数组,n=nargin) varargout:输出可变参数列表(数据类型为 1xn cell数组,n=nargout) 脚本文件eg2如下: [a,b]=demo(1,2) %显示a,b function varargout = demo(varargin)%输入两个数则求和,否则输入等于输出,两输入两输出其他情况出错 disp(['输入参数个数:',num2str(nargin)]); if nargin disp('输入参数为:'); varargin %显示输入 for i=1:nargin disp(['参数',num2str(i),':',num2str(varargin{i})]); end else disp('无输入参数'); end if isnumeric(varargin{1})&&isnumeric(varargin{2})%判断第一第二个参数是否为整数或浮点数 varargout{1}=varargin{1}+varargin{2};%求和 varargout{2}='N'; else [varargout{1:nargout}]=varargin{1:nargout};%必须使用方括号,否则出错 end varargout %显示输出 end 运行结果: >> eg2 输入参数个数:2 输入参数为: varargin = 1×2 cell 数组 {[1]} {[2]} 参数1:1 参数2:2 varargout = 1×2 cell 数组 {[3]} {'N'} a = 3 b = 'N' 对于cell类型的变量A,当B=A{1}时B不是cell类型,而是A{1}内容数据的类型;当B=A(1)时B是cell类型。

制作html css 步骤进度条(完整代码)

这个动画步骤进度条的css制作的非常简单。那里有两个按钮可以控制步骤,它们将逐步进行。我在这个多步骤进度条 css 中使用了 4 个步骤。如果你愿意,你可以使用更多。 我使用了一些 javascript 来创建这一步进度条。横步进度条主要用在注册表中。以下是在 HTML 中创建步骤栏的步骤: 创建一个 HTML 文件并添加以下结构: <div class="container"> <div class="progress-container"> <div class="progress" id="progress"></div> <div class="circle active">1</div> <div class="circle">2</div> <div class="circle">3</div> <div class="circle">4</div> </div> <button class="btn" id="prev" disabled>Prev</button> <button class="btn" id="next">Next</button> </div> 添加以下 CSS 来设置步进栏的样式: @import url("https://fonts.googleapis.com/css2?family=Muli&display=swap"); :root { --line-border-fill: #3498db; --line-border-empty: #e0e0e0; } * { box-sizing: border-box; } body { font-family: "Muli", sans-serif; background-color: #f6f7fb; display: flex; align-items: center; justify-content: center; height: 100vh; overflow: hidden; margin: 0; } .

Xshell连接不上虚拟机的解决办法

目录 一,首先检查对应的会话信息是否正确 二,检查网络配置 三,防火墙是否关闭 四,ssh服务是否开启 五:更改网关 一,首先检查对应的会话信息是否正确 (1)主机号是否与连接的的一致 查看IP:ip addr (2)对应的密码是否是你设置的虚拟机的密码 建议使用同一个密码,否则很容易弄混,这个密码是你对应用户名的密码 (3)用户名是否是你的hostname,如果创建了新的用户需要在此用户下传输信息,就需要使用新创建的用户名。 二,检查网络配置 我是先在ubuntu下搭建的Hadoop,然后再centos下搭建了Hadoop,两者的网络适配环境不一样,如果你是centos系统下 在虚拟网络编辑器中设置 VMnet8(NAT 模式的网络适配器),关闭 DHCP 服 务,设置完成后点击“应用”。 如果是ubuntu系统(方法很有用,我每次连不上并且前面的配置都没有什么问题的话就直接恢复默认设置,重新连接真的很方便!!!!),需要选择还原默认设置,不会丢失什么东西。 默认设置之后你的虚拟机的ip地址会发生改变,需要重新查看ip,在xshell里面重新开一个会话去连接即可 三,防火墙是否关闭 如果是centos系统则需要永久关闭防火墙 查看防火墙状态:systemctl status firewalld.service 禁用防火墙:systemctl disable firewalld.service 四,ssh服务是否开启 查看ssh状态:service sshd status 如果没有开启则:service sshd start 五:更改网关 注意:使用这种方法时需要操作者自身的Hadoop集群的IP地址分配是从3(例如192.168.91.3)开始的,即给网关和IPv4地址留了空余。在这种情况下方可使用此方法。 设置--网络和Internet--更多网络适配选项 选择VMnet8--点击属性 选择IPv4,将其IP地址最后一位改为1,默认网关最后一位改为2,前三位不变。 以上就是我搭建Hadoop以来需要的xshell连接不上虚拟的办法汇总,希望对你有帮助。

k8s外部访问pod内部容器的端口-NodePort

一、 如何从外部网络访问 Kubernetes的Pod IP和Cluster IP都只能在集群内部访问,而我们通常需要从外部网络上访问集群中的某些服务,Kubernetes提供了下述几种方式来为集群提供外部流量入口。 二、需求 有一pod,里面有rabbitmq服务,先想从外部通过ip:15672访问MQ的管理员界面查看队列消费情况。 方法1(pod会重启): 方法2: NodePort(pod不会重启,更适合生产环境) NodePort在集群中的主机节点上为Service提供一个代理端口,以允许从主机网络上对Service进行访问。Kubernetes官网文档只介绍了NodePort的功能,并未对其实现原理进行解释。下面我们通过实验来分析NodePort的实现机制。 执行下面的命令创建一个nodeport类型的service。 kubectl apply -f rmq-np-svc.yaml rmq-np-svc.yaml内容(注意:端口范围只能是 30000-32767): apiVersion: v1 kind: Service metadata: namespace: yie-edge labels: baetyl-app-name: basic-service name: rabbitmq-np-service spec: ports: - name: 15672-15672 nodePort: 31672 port: 15672 protocol: TCP targetPort: 15672 selector: baetyl-app-name: basic-service type: NodePort status: loadBalancer: {} 三、Kubernetes中的nodePort,targetPort,port的区别和意义 nodePort 外部机器可访问的端口。 比如一个Web应用需要被其他用户访问,那么需要配置type=NodePort,而且配置nodePort=31672,那么其他机器就可以通过浏览器访问IP:31672访问到该服务,例如http://172.19.12.13:31672。 例如rabbitmq可能不需要被外界访问,只需被内部服务访问,那么不必设置NodePort targetPort 容器的端口(最根本的端口入口),与制作容器时暴露的端口一致 port kubernetes中的服务之间访问的端口,尽管rabbitmq容器暴露,15672端口,但是集群内其他容器需要通过15672端口访问该服务,外部机器不能访问rabbitmq服务,因为他没有配置NodePort类型 四、操作 通过netstat命令可以看到Kube-proxy在主机网络上创建了30080监听端口,用于接收从主机网络进入的外部流量。 查看创建的service,可以看到kubernetes创建了一个名为rmq-np-svc的service,并为该service在主机节点上创建了31672这个Nodeport。

MySQL学习教程(超全)

学习MySQL需要通过阅读文档、观看视频教程、参加在线课程等方式。同时,还需要进行实践操作,如创建数据库、表和数据插入、查询等操作,以加深对MySQL的理解和掌握。在实践中,也可以遇到一些问题,需要通过查询文档和搜索解决方案的方式来解决。 一、学习内容 1.学习SQL语言基础:学习SQL语言的基础知识,如数据类型、表的创建、数据插入和查询等。 2.学习MySQL的安装和配置:学习如何在计算机上安装和配置MySQL数据库服务器。 MySQL是一种流行的关系型数据库管理系统,本文将为您介绍MySQL的安装和配置。 下载MySQL安装包 在MySQL官网(https://www.mysql.com/)上下载MySQL安装包,选择适合您系统的版本(例如Windows、Linux等)和对应的操作系统版本。 2.安装MySQL 双击安装包,根据提示进行安装。在安装过程中,您需要选择MySQL的安装路径、设置root用户的密码、配置MySQL的端口号等。 3.配置MySQL 安装完成后,需要进行一些基本配置才能使用MySQL。以下是一些基本的配置: 启动MySQL服务:在Windows操作系统中,可以在“服务”中启动MySQL服务;在Linux操作系统中,可以使用命令行启动MySQL服务。 配置MySQL连接:在MySQL的安装目录中有一个my.ini或my.cnf文件,可以通过修改该文件配置MySQL连接。例如,可以修改端口号、设置字符集、禁止远程连接等。 创建数据库和用户:可以使用MySQL的命令行工具或者可视化工具(例如Navicat、phpMyAdmin等)创建数据库和用户。具体命令如下: CREATE DATABASE dbname; CREATE USER 'username'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON dbname.* TO 'username'@'localhost'; FLUSH PRIVILEGES; 4.使用MySQL 安装和配置完成后,可以使用MySQL进行数据库管理。可以使用命令行工具或者可视化工具进行操作,例如创建表、插入数据、查询数据等。 MySQL的基本使用命令如下: 登录MySQL:使用命令行工具,输入mysql -u root -p命令并输入root用户密码即可登录MySQL。创建数据库:创建数据库数据库名称;创建表:创建表表名(列 1 数据类型,列 2 数据类型,...);插入数据:INSERT INTO tablename (column1, column2, ...)值(值 1、值 2、...);查询数据:SELECT column1, column2, ...从表名 WHERE 条件;更新数据:UPDATE 表名 SET 列 1 = 值 1, 列 2 = 值 2, ...其中条件;删除数据:从表名中删除 WHERE 条件; 3.

node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正 确,然后再试一次 的解决方案

背景 Windows系统安装好了node环境,cmd中输入node -v 命令也能出现node的版本。 但是在IDEA的Terminal中输入,node相关命令。去出现如下错误: 解决方案 首先先确认自己的node已经安装了,整个路径不要有中文或空格 右键计算机,点开属性 左侧点开高级系统设置 打开环境变量,点击新建。 变量名 NODE_HOME,变量值就是你存放node.exe的整个文件夹(不能理解的话请参考第一步里面的图和第五步里面的图),然后点确定就行了 编辑Path变量 新增两个条目 %NODE_HOME% %NODE_HOME%\node-global 6.之后重新打开Terimal,输入node命令验证就可以了。 设置国内源 设置国内源,否则下载国外的比较慢 cmd命令打开命令窗口输入: npm config set registry "https://registry.npm.taobao.org"

Servlet:利用Response实现文件下载

一、自己添加一个图片/文件在resources中,并找到其绝对路径写在类中 二、创建FIleServlet类 import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; public class FileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.要获取下载文件的路径 String realPath = "C:\\代码\\javaweb-servlet\\response\\target\\classes\\1.png"; System.out.println("下载文件的路径:"+realPath); //2.下载的文件名是什么? String filename = realPath.substring(realPath.lastIndexOf("\\") + 1); //3.设置想办法让浏览器能够支持下载我们需要的东西 resp.setHeader("Content-Disposition","attachment;filename="+filename); //4.获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); //5.创建缓冲区 int len=0; byte[] buffer = new byte[1024]; //6.获取OutputStream对象 ServletOutputStream out = resp.getOutputStream(); //7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端 while((len=in.read(buffer))>0) { out.

面向对象程序设计基本概念和原理

面向对象程序设计的基本概念和原理 面向对象程序设计以对象为核心,该方法认为程序由一系列对象组成。类是对现实世界的抽象,包括表示静态属性的数据和对数据的操作,对象是类的实例化。对象间通过消息传递相互通信,来模拟现实世界中不同实体间的联系。在面向对象的程序设计中,对象是组成程序的基本模块。 消息传递: 指的是一个对象调用了另一个对象的方法(或者称为成员函数)。 1.抽象 抽取事物的共同特征就是抽取事物的本质特征,舍弃不同特征。 对特定实例进行抽象获取共同特征形成概念,对数据和行为都抽象 2.对象 对象=属性+行为; 对象是反应客观事物属性以及行为特征的描述, 每个对象都具有描述它的特征的属性和附属于它的行为。 3.类 一个共享相同结构和行为的对象的集合。 定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的(它的行为) (类与对象之间的关系就是具体与抽象的关系 类是多个对象进行综合抽象的结果,一个对象就是类的一个实例) 4.实例 实例是根据类创建出来的一个个具体的“对象” (类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响) 5.属性 表示类或者对象的某种特征。 属性的分类 类属性:整个类都具备的属性。 实例属性(对象属性):成员所具备的属性。 6.方法 也称为成员函数,是指对象上的操作,作为类声明的一部分来定义。方法定义了可以对一个对象执行那些操作 7.封装性 把数据和实现操作的代码集中起来放在对象内部,并尽可能隐藏对象的内部细节 第一层意思:将数据和操作捆绑在一起,创造出一个新的类型的过程。 第二层意思:将接口与实现分离的过程。 8.继承性 在已有类的基础上增加新特性而派生出新的类,原有的称作基类,新建的叫做派生类 面向对象技术则是指一个对象针对于另一个对象的某些独有的特点、能力进行复制或者延续。如果按照继承源进行划分,则可以分为单继承(一个对象仅仅从另外一个对象中继承其相应的特点)与多继承(一个对象可以同时从另外两个或者两个以上的对象中继承所需要的特点与能力,并且不会发生冲突等现象) 类之间的关系,在这种关系中,一个类共享了一个或多个其他类定义的结构和行为。继承描述了类之间的“是一种”关系。子类可以对基类的行为进行扩展、覆盖、重定义。 9.多态性 是不同的对象收到相同的消息产生多种不同的行为方式。例如接受到一个“移动”的消息,在Windows类和piece类对象上可以有不同的行为 从微观的角度来讲,多态性是指在一组对象的一个类中,面向对象技术可以使用相同的调用方式来对相同的函数名进行调用,即便这若干个具有相同函数名的函数所表示的函数是不同的 10.异常处理 异常处理的基本思想是分离异常的抛出和异常的处理。基本方法是:当程序中出现异常时抛出异常,用来通知系统发生了异常,然后由系统捕捉异常,并交给预先安排的异常处理程序段来处理异常。这样的异常处理机制可以实现在两个或两个以上的程序模块间传递异常信息,从而可以使软件设计者根据问题的要求,在不同情况下灵活地处理各种异常。 1.定义异常类 2.抛出异常throw 3.捕获异常try 异常的捕获由系统自动完成 4.处理异常cathch 11.文件 12.多线程 Thread类 多线程程序的优点: 1.充分利用CPU的资源:执行单线程程序时,若程序发生阻塞,CPU可能会处于空闲状态,这将造成计算机资源浪费,而使用多线程可以在某个线程处理休眠或阻塞状态时运行其他线程,这样,大大提高了资源利用率。 2.简化编程模型:一个既长又复杂的进程可以考虑分为多个线程,成为几个独立的运行部分,如使用时、分、 秒来描述当前时间,如果写成单线程程序可能需要多重循环判断,而如果使用多线程,时、分、秒各使用一个线程控制,每个线程仅需实现简单的流程,简化了程序逻辑,这样更有助于开发人员对程序的理解和维护。 3.带来良好的用户体验:由于多个线程可以交替执行,减少或避免了因程序阻塞或意外情况造成的响应过慢现象,降低了用户等待的几率。

数据结构(复习)

1.串的模式匹配 KMP 2.二叉树先序遍历,后序遍历,中序遍历 递归算法和非递归算法 ①后续遍历递归算法 void PostOrder(BitTree T) { if(T!=NULL) PostOrder(T_>lchild); PostOrder(T_>rchild); visit(T); } ②非递归算法中序遍历 void InOrder(BitTree T) { InitStack(S); BiTree p=T; while(p|| !IsEmpty(S)) { if(p) { Push(S,p); p=p->lchild; } else{ Pop(S,p); visit(p); p=p_>rchild; } } } ③层序遍历 void LevelOrder(BiTree T) { InitQueue(Q); BiTree p; EnQueue(Q,T); while(!IsEmpty(Q)) { DeQueue(Q,p); visit(p); if(p->lchild!=NULL) EnQueue(Q,p->lchild); if(p->rchild!=NULL) EnQueue(Q,p->rchild); } } 3.树的存储结构 1.双亲表示法 #define MAX_TREE_SIZE 100 typedef struct{ ElemType data; int parent; } PTNode;//节点 typedef struct { PTNode nodes[MAX_TREE_SIZE 100]; int n;/节点个数 }PTree;//树 2.

ChatGPT说:如何利用ChatGPT变现?躺着赚钱不是梦。

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。 💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通 😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶 ❤️ 4. Ceph实战,从原理到实战应有尽有。 Ceph实战 ❤️ 5. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门 文章目录 前言利用ChatGPT实现变现的方法1. 语言模型服务1.1.语音助手:1.2.写作工具:1.3.聊天机器人: 2. 文本生成服务2.1.内容营销:2.2.学术论文写作:2.3. 翻译服务: 3. 构建软件 前言 ChatGPT 是一种基于自然语言处理技术的大型语言模型,可以生成逼真的自然语言文本,并且可以用于各种任务,例如机器翻译、文本摘要、情感分析等等。由于其强大的功能和广泛的应用场景,许多人开始考虑如何利用 ChatGPT 来赚钱。在本文中,我们将介绍如何利用 ChatGPT 实现变现的不同方法,以及一些实用的技巧和建议。 利用ChatGPT实现变现的方法 1. 语言模型服务 一种最常见的方法是通过提供语言模型服务来获得收益。这种方法的核心是将 ChatGPT 集成到应用程序中,并允许用户使用它来生成自然语言文本。一些具体的实现方式包括: 1.1.语音助手: 将 ChatGPT 集成到智能语音助手中,例如 Siri、Alexa、Google Assistant 等,允许用户通过语音与 ChatGPT 交互。 1.2.写作工具: 将 ChatGPT 集成到写作工具中,例如微软的 Word、谷歌的 Docs、苹果的 Pages 等,允许用户使用 ChatGPT 生成文章、段落或句子。 1.3.聊天机器人: 将 ChatGPT 集成到聊天机器人中,例如微信的小程序、Facebook Messenger 等,允许用户与 ChatGPT 进行自然语言对话。 以讯飞智能客服为例,它可以帮助企业实现语音交互、多轮对话、语音合成等功能。讯飞智能客服的商业模式主要是基于 SaaS 模式,企业可以根据自身的需求选择不同的服务套餐,按照服务时长、并发数等参数进行付费。同时,讯飞智能客服还可以提供定制化的解决方案,根据客户需求进行量身定制。

airflow学习之路 (二) airflow 底层数据库的修改

airflow学习之路 (二) airflow 底层数据库的修改 ​ airflow想要升级的处理能力,后台metadata DB必须使用MySQL或者Postgresql。Airflow默认是有Sqlite,仅仅只能用做开发测试,也无法使用LocalExecutor。另外,后续的DAG会在这个数据库中执行读写数据操作,也是为后面的内容做好铺垫。 airflow 底层数据库的修改 设置 MySQL 数据库 创建一个数据库,Airflow 将使用该数据库访问此数据库。 在下面的示例中,将创建一个数据库airflow_db CREATE DATABASE airflow_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 安装mysql依赖包 pip install mysql-connector-python -i https://pypi.douban.com/simple 连接配置 mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> 示例如下 mysql+mysqlconnector://root:123456@mysql:3306/airflow_db 修改配置 vim ~/airflow/airflow.cfg 在[database]下面修改配置如下: [database] # sql_alchemy_conn = sqlite:home/deepcam/airflow/airflow.db sql_alchemy_conn = mysql+mysqlconnector://root:123456@mysql:3306/airflow_db 初始化airflow airflow db init 问题汇总 1.airflow db init异常 sqlalchemy.exc.ProgrammingError: (mysql.connector.errors.ProgrammingError) 1067 (42000): Invalid default value for 'updated_at' 找到MySQL的配置文件默认为my.ini 在[mysqld]下面增加配置如下: sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Python math详解

Python Math 是 Python 标准库中的一个模块,它提供了对数学函数的支持。该模块包含了各种用于数值计算的函数,比如三角函数、指数和对数等等。在本篇文章中,我们将详细介绍 Python Math 模块中的常见函数及其使用方法。 要使用 math 模块,需要先将其导入到你的代码中: import math 现在你就可以使用 math 模块中提供的任何函数了。 数字取整 math 模块包含几个数字取整的函数。其中最常用的是 ceil() 和 floor() 函数。ceil() 函数用于向上取整,返回大于或等于给定数字的最小整数;而 floor() 函数则用于向下取整,返回小于或等于给定数字的最大整数。 python import math x = 1.4 y = 2.6 print(math.ceil(x)) # 输出:2 print(math.floor(y)) # 输出:2 数学常量 math 模块还包括一些常见的数学常量,比如圆周率 π 和自然对数底 e 等。这些常量可在进行某些计算时非常有用。 python import math print(math.pi) # 输出:3.141592653589793 print(math.e) # 输出:2.718281828459045 三角函数 math 模块还提供了许多三角函数,例如 sin()、cos() 和 tan() 等。这些函数接受一个弧度值,并返回相应角度上正弦、余弦或正切值。 python import math x = math.

airflow学习之路 (一) 安装启动airflow

airflow学习之路 (一) 安装启动airflow airflow简介 ​ ​ Apache Airflow 是一个开源平台,用于开发、调度、 以及监控面向批处理的工作流。Airflow的可扩展Python框架使您能够构建工作流程 与几乎任何技术连接。Web 界面有助于管理工作流的状态。气流是 可通过多种方式进行部署,从笔记本电脑上的单个进程到分布式设置,甚至支持 最大的工作流程。 适用场景 ​ ​ 适用于需要执行数据处理和数据管道任务的应用场景,例如数据抽取、转换、加载(ETL)、数据挖掘、机器学习等。Airflow提供了丰富的监控、报告和告警功能,可以帮助用户管理和调度复杂的数据管道。 运行环境搭建 创建airflow虚拟环境 conda create -n airflow python=3.8 进入airflow虚拟环境 conda activate airflow 安装airflow环境依赖包 pip install kubernetes -i https://pypi.douban.com/simple pip install numpy -i https://pypi.douban.com/simple pip install apache-airflow==2.4.3 -i https://pypi.douban.com/simple 初始化airflow airflow db init 查看版本 airflow version 调度服务启动 启动airflow web服务 启动后浏览器访问http://172.22.8.244:8080 airflow webserver -p 8080 -D -p 端口-D 后台运行 启动airflow调度 airflow scheduler -D 创建账户 airflow users create \ --username admin \ --firstname test \ --lastname test \ --role Admin \ --email test@test.

SpringBoot集成AOP实现日志记录

文章目录 AOP简介AOP实现原理AOP相关概念Aspect(切面)Joint point(连接点)Pointcut(切点)Advice(增强)Target(目标对象)Weaving(织入) AOP常用注解Springboot整合AOP实例一(execution表达式)1.导入依赖2.创建一个UserService及其实现3.创建一个切面类4.测试 实例二 (@annotation方式)1.声明一个自定义注解2.新增AnnotationAop类:3.在接口方法上加自定义注解4.测试 实例三 (环绕通知方式):1. 改造AnnotationAop类:2.测试 实例四(DeclareParents)1.创建一个DoSthService及其实现2.新增一个IntroductionAop类3.测试 完整的测试类 AOP简介 AOP:面向切面编程,是通过预编译方式和运行期动态代理,实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,同时是对OOP(面向对象编程)的补充和完善,常被用来在spring中实现日志记录、性能监控等功能。 面向对象实现日志记录,性能监控这些功能时,需要在每个对象中都添加相同的方法,这样就产生了较大的重复工作量和大量的重复代码,不利于维护,使用AOP,可以大大减少代码数量,方便维护。 AOP实现原理 Spring 实现AOP思想使⽤的是动态代理技术。默认状况下,Spring会根据被代理对象是否实现接⼝来选择使⽤JDK仍是CGLIB。当被代理对象没有实现任何接⼝时, Spring会选择CGLIB。当被代理对象实现了接⼝, Spring会选择JDK官⽅的代理技术,不过能够经过配置的⽅式,让Spring强制使⽤CGLIB。 AOP相关概念 Aspect(切面) Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。 Joint point(连接点) 表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。 Pointcut(切点) 表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。 Advice(增强) Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。 Target(目标对象) 织入 Advice 的目标对象.。 Weaving(织入) 将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程 AOP常用注解 @Component: 将当前类注入到Spring容器内@Aspect :表明是一个切面类@Before :前置通知,在方法执行之前执行@After :后置通知,在方法执行之后执行@AfterRuturning :返回通知,在方法返回结果之后执行@AfterThrowing :异常通知,在方法抛出异常之后执行@Around :环绕通知,围绕着方法执行@Pointcut :切入点,PointCut(切入点)表达式有很多种,其中execution用于使用切面的连接点。 Springboot整合AOP 实例一(execution表达式) 1.

smtp报文分析(25、465、587端口)

对于用到的工具和对应的环境配置可以参见 smtp 抓包_Steven-Russell的博客-CSDN博客 25端口报文(仅支持smtp协议) curl命令 curl --verbose -s --url 'smtp://smtp.qq.com:25' --ssl-reqd --cacert /root/qqmail.pem --mail-from 'xxxxxxxxx@qq.com' --mail-rcpt 'xxxxxxxxx@163.com' --upload-file /root/email.txt --user 'xxxxxxxxx@qq.com:xxxxxpasswaordxxxx' tcpdump抓包 tcpdump host 120.241.186.196 -i ens33 -w qqmail_25_smtp.cap 具体报文信息详见附件:https://download.csdn.net/download/weixin_43317111/87591832 注意:25端口smtp进行邮件发送时,能够明显看到smtp建链过程 587端口报文(仅smtp协议) curl命令: curl --verbose -s --url 'smtp://smtp.qq.com:587' --ssl-reqd --cacert /root/qqmail.pem --mail-from 'xxxxxxxxx@qq.com' --mail-rcpt 'xxxxxxxxx@163.com' --upload-file /root/email.txt --user 'xxxxxxxxx@qq.com:xxxxxpasswaordxxxx' tcpdump命令: tcpdump host 120.241.186.196 -i ens33 -w qqmail_587_smtp.cap 具体报文信息详见附件: https://download.csdn.net/download/weixin_43317111/87591832 注意:587端口smtp进行邮件发送时,能够明显看到smtp建链过程 465端口报文(仅smtps协议) curl命令: curl --verbose -s --url 'smtps://smtp.qq.com:465' --ssl-reqd --cacert /root/qqmail.