呼叫中心,电话机器人的中继线路

全国中继一点汇接 呼叫中心集中的政企客户在全国范围内开展服务、营销等合规业务时,从集中呼叫中心发出的外呼主叫为呼叫中心所在地中继号码。为提升被呼叫用户的感知,希望主叫显示用户所在地的固定号码。签约云中继业务后,可实现企业外呼平台中继一点对接集团能力开放平台,通过集团能力开放平台连接全国中继。 场景需求:客户呼叫中心所在本地网和落地本地网均需开通云中继业务,呼叫中心云中继需实装,落地本地网中继不需要实装。客户需在呼叫中心所在本地网受理“云中继(主叫侧,已开通实装中继)”,在落地本地网受理“云中继(落地侧,新开通非实装中继)”,业务单式详见附件1。 中继外呼集中管控 (1)为落实国家打击通信诈骗重点工作,政府部门希望能够一点管控实体中继号码的外呼控制,实体中继签约云中继业务后,所有的外呼话务均路由至集团能力开放平台,实现中继号码的集中一点管控。以此实现外呼时间、呼叫频次、黑白名单等集中控制功能。便于客户满足国家监管部门对中继外呼类业务的集中管控要求,规范语音市场。 (2)大型跨域企业客户往往具有众多全国分支机构,需要集团一点对全国的中继呼叫进行控制,签约云中继业务后可以将分散在全国各地中继的呼叫路由至集团能力开放平台进行一点管控。 场景需求:客户呼叫中心所在本地网需开通云中继业务,呼叫中心云中继需实装。客户需在呼叫中心所在本地网受理“云中继(主叫侧,已开通实装中继)”,并选择所需控制功能,业务单式详见附件1。 业务功能 全国中继一点汇接 企业呼叫中心外呼所在地必须实装中继,被叫落地侧需新开通非实装中继。 通过集团能力开放平台,将企业外呼侧的已开通实装中继与全国各地的新开通非实装中继进行云化并连接。政企客户通过实装中继外呼全国非实装中继,显示被叫落地侧中继码号,回拨该码号可连接至外呼时的实装中继。 中继外呼集中管控 针对已开通的实装中继。当企业使用该中继外呼时,将话务路由至集团能力开放平台,实现中继的云化管理。 (1)外呼频次控制 实现同一号码外呼时的频次限制。 实现同一企业名下所有中继号码对同一被叫用户外呼的频次限制。 (2)外呼流量控制 按照中继受理时中继最大并发数控制中继号码的外呼并发量。 按照客户指定的允许/禁止呼叫时段,控制中继号码相应的可呼叫时段。 (3)外呼黑名单控制 根据用户要求,限制特定号码拨打该用户与解除限制。 根据政府、企业要求,限制特定号码外呼与解除限制。 呼叫接续、呼叫控制配置 针对政企客户对于云中继呼叫接续号码关系绑定、呼叫控制策略等细节需求,平台将提供统一的门户界面,供客户选择设置。 可以支持的中继线路类型 传统PRI中继(也叫PRA,ISDN,30B+D)、sip中继均支持云中继业务。每个省中继业务不同,具体各省实装中继情况可咨询各省中继业务负责人;如若开通云中继业务需要有至少一根实装中继提供给平台对应中继号码。

mfc对话框操作及命令行窗口隐藏

1.对话框在任务栏不显示图标.不是隐藏. this->ModifyStyleEx(0, WS_EX_APPWINDOW); 2.显示对话框但是 是透明的. 函数实现的。 参数1:窗口句柄 参数2:颜色值RGB 参数3:Alpha值,即透明度值 参数4:设置参数-- LWA_COLORKEY(1)表示前面的颜色值起作用 LWA_ALPHA(2)表示前面的Alpha值起作用,即透明度 注意 1。这两个参数可以同时使用,意义为只将对话框上所有颜色为指定为RGB的地方,按照Alpha值来进行透明处理。 2。SetLayeredWindowAttributes函数是用前,需要指定GWL_EXSTYLE属性为0x80000; 下列代码将默认颜色的对话框完全透明。 SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, 0x80000); ::SetLayeredWindowAttributes(this->GetSafeHwnd(), RGB(128, 128, 128), 255, 3); 3.用_popen运行命令后隐藏cmd黑框. //隐藏一个控制台窗口,使得在之后用popen来启shell窗口的时候,不显示黑窗口,或者避免黑窗口一闪而过的情况 AllocConsole(); //为调用进程分配一个新的控制台 ShowWindow(GetConsoleWindow(), SW_HIDE); //隐藏自己创建的控制台

STM32物联网项目之程序框架

前言: 这个系列,我主要写我用32f103实现的各种功能模块,已经程序编写过程中,硬件调试中出现的问题,一边记录,一边分享,一边复盘。 使用的是STM32cubemax,自动生成代码,所以为了保证程序可读性,逻辑性,我们在不影响系统自动生成代码的情况下,自己要有自己的程序框架,这样,在我们后期不断增加模块功能时,改动更小,兼容性更强,可阅读性更好。 目录 1.STM32CUBEMAX自动生成代码 1.1软件配置 2.系统代码 2.1包含的头文件 2.2系统时钟函数 2.3系统初始化 3. 标准化程序框架 3.1MyApplication.h文件 3.2main.c文件 3.3.1头文件 3.3.2源文件 3.3.3run函数 1.STM32CUBEMAX自动生成代码 为了方便演示程序框架,我用最简单也是最入门的点亮LED灯来操作。 1.1软件配置 首先,我们需要配置stm32cubemax的各种配置,包括芯片选型,GPIO外设,时钟RCC,等等,如下图所示: GPIO口的配置,推挽还是开漏,已经不同选择的原因,rcc时钟频率的配置,这些都跟挂载总线有关,时钟源这些等等底层逻辑相关的,后期我会单独分享复盘底层逻辑;这个章节我主要想介绍程序框架。 2.系统代码 当我们配置好cubemax之后,点击GENERATE CODE 就会在我们保存的文件路径底下自动生成project,如下图所示: 因为我是用点亮led灯来演示的,所以系统除了主函数,只有gpio,后期我们用到的模块越多,源文件也会相应的增加,我们主要分析一下系统生成文件都包含那些以及主要的功能 2.1包含的头文件 引用了main.h以及gpio.h这两个头文件,这两个头文件内部主要是对gpio口的引脚及端口进行定义 ,包括gpio初始化的声明。 2.2系统时钟函数 我们配置完系统时钟之后,这些文函数就会自动生成。 2.3系统初始化 系统初始化部分就包含了 HAL库的初始化以及gpio的初始化。 3. 标准化程序框架 我们在不影响上述文件的情况下,新增属于我们自己的框架文件,在保证接口固定的情况下,每次只修改部分接口函数即可。 1、新增MyApplication文件夹,放置4个标准c文件,分别是公共文件,回调文件,系统文件,用户初始化文件,后续应用代码均放在此文件夹; 2、新增MyApplication.h文件,包含所有用户代码的头文件与外设头文件,调整外设或用户文件,只需要调整此文件内的相应头文件即可; 3、main.c文件标准化 3.1MyApplication.h文件 #ifndef __MyApplication_H__ #define __MyApplication_H__ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "gpio.h" #include "stdio.h" #include "stdlib.h" #include "System.h" #include "Public.h" #include "MyInit.h" #endif 我们将所有能用到的头文件集中在一个大的头文件中,只要所有源文件调用这一个头文件即可。 3.2main.c文件 //调用头文件 /* USER CODE BEGIN Includes */ #include "

在ubuntu环境下来部署Nginx静态网页

通过apt install nginx来安装nginx;nginx.conf的目录地址在:/etc/nginx下面可以在conf.d中随便创立.conf文件并且撰写server如下:访问服务器所在的ip即可访问静态网页第一次安装nginx设置80端口后,还跳转到welcome to nginx!,解决办法:进入sites-avaiabl目录下面,将default文件中的server -> listen端口改掉,因为80默认使用了欢迎页面; 使用的命令: nginx -s reload 重启nginx nginx -t 测试nginx配置文件是否能通过编译 server{ listen 80; server_name test; root /data/HZ-Website; //填写index.html所在的目录 index index.html; location / { try_files $uri $uri/ =404; } }

【linux下的rsyslogd输出文件内容至syslog服务器】

linux下的rsyslogd输出文件内容至syslog服务器 rsyslogd输出文件内容至syslog服务器1. 第一步 升级系统内的rsyslogd版本2. 第二步 配置主配置文件3. 第三步 检查与新增配置文件4. 自由阅读 语句解释 rsyslogd输出文件内容至syslog服务器 rsyslogd输出文件内容至syslog服务器,可以将任何文本文件内容输出至syslog服务器,比如tomcat日志、nginx日志、oracle日志、mysql日志、pgdb日志等等,只要是文本文件都可以自由读取并以syslog形式发送出去。 老规矩,废话不多说,直接放链接。 rsyslogd下载链接:https://mirrors.aliyun.com/centos/7.9.2009/updates/x86_64/Packages/rsyslog-8.24.0-57.el7_9.3.x86_64.rpm?spm=a2c6h.25603864.0.0.11aca9574RFsgq 1. 第一步 升级系统内的rsyslogd版本 升级rsyslogd软件版本为rsyslog-8.24.0-57.el7_9.3.x86_64.rpm 这个版本支持通配符,就是程序一天生成一个以日期结尾的,可以使用*.log来代替详细的文件名称。 (因为这个版本是亲测没问题,而且不需要依赖关系,其他低版本有问题,而且每个版本的配置语句不同。nxlog依赖关系很多,yum下了900M的依赖包。) 下载完的rsyslogd直接扔到服务器上,给个执行权限,直接升级操作。 chmod +x rsyslog-8.24.0-57.el7_9.3.x86_64.rpm && rpm -Uvh rsyslog-8.24.0-57.el7_9.3.x86_64.rpm 2. 第二步 配置主配置文件 在/etc/rsyslog.conf文件中,将包含次级的脚本目录打开。(只改动这一个地方,其他地方默认) 图片放在word里面,再粘出来就变得特别小,用图片和系统内的配置文件对比,就知道改哪里了,并且我也圈了红框。 3. 第三步 检查与新增配置文件 检查: 1、检查是否存在目录:/var/spool/rsyslog 如不存在需要创建mkdir -p /var/spool/rsyslog 2、删除或备份/etc/rsyslog.d/下的默认文件 新建配置文件 在/etc/rsyslog.d/下新建配置文件 (名称随意写,但扩展名的后缀必须是.conf 例如tomcat.conf、oracle_log.conf) 配置文件内容为以下代码 $ModLoad imfile $InputFilePollInterval 5 $WorkDirectory /var/spool/rsyslog $PrivDropToGroup root $InputFileName /mnt/tomcat-9.0.72/logs/localhost_access*.log $InputFileTag tomcat-access: $InputFileStateFile stat-tomcat-access $InputFileSeverity info $InputFilePersistStateInterval 25000 $InputRunFileMonitor $InputFileName /opt/plugin/nginx/logs/error*.log $lnputFileTag tomcat-error: $InputFileStateFile stat-tomcat-error $lnputFileSeverity error $InputFilePersistStateInterval 25000 $InputRunFileMonitor *.

VScode下 ESP32 下载程序

ESP32-S3 下载方式可以通过UART0 下载,USB 下载,JTAG下载,还可以使用WIFI进行远程OTA升级程序。 插件底栏按键介绍: ①选择串口端口号,如COM3; ②选择芯片型号; ③工程idf设置,相当于menuconfig; ④清理所有编译文件; ⑤编译; ⑥烧录方式,如uart、jtag和DFU; ⑦烧录; ⑧log监视窗口(monitor); ⑨编译+烧录+自动打开log监视窗口; ⑩openocd配置,开启openocd或停止openocd。 编译和烧录 先配置uart烧录端口,要根据自己实际端口号来选择,然后选择芯片型号,一定要选择目标芯片,不然编译会报错,我选的是ESP32-S3 (ESP-PROG JTAG),即外部jtag; 一,UART0下载方式。 硬件环境: 使用工具“USB转串口”; 3.3V供电,GND,EN使能; 上电前IO0引脚先接地,如果使用串口工具查看UART0的输出信息,如下图 使用VScode下载程序。 IO0引脚先接地,上电,编译后生成.bin文件。 编译完,点击图中按键就可以下了。 下载完成,输出上图信息。 二,在线调试 uart0可以下载程序,并不能进行在线调试,在线调试需要使用JTAG,ESP32不支持SWD模式。 工作原理 介绍 ESP32-S3、JTAG(Joint Test Action Group)接口、OpenOCD 和 GDB 如何相互连接,从而实现 ESP32-S3 的调试功能 选择 JTAG 适配器 如果您想使用单独的 JTAG 适配器,请确保其与 ESP32-S3 的电平电压和 OpenOCD 软件都兼容。ESP32-S3 使用的是业界标准的 JTAG 接口,它未使用(实际上也并不需要)TRST 信号脚。JTAG 使用的 IO 管脚由 VDD_3P3_RTC 电源管脚供电(通常连接到外部 3.3 V 的电源轨),因此 JTAG 硬件适配器的管脚需要能够在该电压范围内正常工作。 在软件方面,OpenOCD 支持相当多数量的 JTAG 适配器,请参阅 OpenOCD 支持的适配器列表 (请注意这一列表并不完整),其中还列出了兼容 SWD 接口的适配器,但请注意,ESP32-S3 目前并不支持 SWD。此外,被硬编码为只支持特定产品线的 JTAG 适配器也无法在 ESP32-S3 上工作,例如仅针对 STM32 系列产品的 ST-LINK 适配器。

开放题 - 共享单车测试点整理

标明: 根据目前想到的开锁流程、骑行过程、关锁流程使用场景结合功能、安全、健壮性、性能、兼容等罗列测试点,实际项目中还是要根据需求文档来,欢迎补充~ 开锁: 功能点预期结果定位权限未打卡弹出提示,开启定位定位权限已打开正常进行后续操作登录成功 + 支付押金 + 无正在进行或未付款的订单进入扫码用车界面未登录进入登录界面未支付押金或未满足其他相关抵押条件无法正常用车,需要进入对应页面做相应操作存在未支付订单无法正常用车,需进入支付页面支付存在进行中的订单给出提示,点击可查看当前订单情况扫码用车入口功能正常,点击进入扫码页面相机权限未打开弹出相机权限框拒绝授权相机权限提示授权失败,返回上一页面同意授权相机权限扫码扫描其他二维码提示无效二维码,重新扫描扫描被损坏的二维码无法识别(是否有提示信息根据需求文档来)扫描正常单车二维码进入开锁页面输入正确车辆编号开锁进入开锁页面输入无效的车辆编号提示输入的编号有误,重新输入手电筒功能点击手电筒可以正常使用开锁成功提示音,开始骑行开锁期间短时间中断测试事件结束后不影响正常开锁开锁期间关机等长时间中断需要重新进行开锁操作开锁失败是否给出相应的提示(这里不详细写提示上的功能) 骑行中: 功能点预期结果页面数据显示是否按照实际情况进行显示即将超出运营范围提示即将超出运营范围超出运营范围锁车/不予处理还车入口还车按钮显示点击还车功能正常,弹出提示框取消还车继续骑行确认还车还车成功,显示正确的数据,扣取费用其他功能(定位,客服等)(需求) 关锁: 功能点预期结果免费骑行时间内关锁不扣取任何费用运营区内正常关锁成功提示音,显示对应数据,扣取对应费用骑行费用校验(边界值)根据骑行费用规则具体计算关锁页面金额区域可以查看支付详情关锁故障,超出规定时间提示已超出规定时间,无法上报故障关锁故障,未超出规定时间填写内容正常提交车子在运营区内,个人离车子较远进行锁车操作无法进行锁车,给出对应提示车子超出运营区内锁车提示用户超出运营区域,需要收取调度费用行程分享功能正常,显示内容正常关锁时中断测试不影响正常关锁关锁成功,用户未支付订单,下个用户使用该车子正常使用,正常计费未关锁,下个用户进行扫码使用该用户无法正常扫码使用,给出提示长时间未关锁短信或APP push提醒 或 一定时间内自动关锁 其他方向: 功能点兼容性弱网支付弱网扫码弱网锁车扫码响应时间开锁响应时间锁车响应时间支付响应时间模拟用户长时间点击事件,软件是否正常扫码界面长时间打开,软件是否正常频繁打开关闭手电筒功能,软件是否正常多人同时扫一辆车子,程序是否正确处理易用性…

【Flutter入门到进阶】Flutter基础篇---布局

1 GridView网格布局组件 1.1 说明 1.1.1 图例 1.1.2 说明 GridView网格布局在实际项目中用的也是非常多的,当我们想让可以滚动的元素使用矩阵方式排列的时 候。此时我们可以用网格列表组件GridView实现布局 GridView创建网格列表主要有下面三种方式 1、可以通过GridView.count 实现网格布局 2、可以通过GridView.extent 实现网格布局 3、通过GridView.builder实现动态网格布局 1.2 常用属性 属性 1.3 案例 1.3.1 GridView.count 实现网格布局 GridView.count构造函数内部使用了SliverGridDelegateWithFixedCrossAxisCount,我们通过它可以 快速的创建横轴固定数量子元素的GridView 示例 //GridView.count 实现网格布局 class HomePage extends StatelessWidget { const HomePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return GridView.count( crossAxisCount: 3, childAspectRatio: 1.0, children: const <Widget>[ Icon(Icons.home), Icon(Icons.ac_unit), Icon(Icons.search), Icon(Icons.settings), Icon(Icons.airport_shuttle), Icon(Icons.all_inclusive), Icon(Icons.beach_access), Icon(Icons.cake), Icon(Icons.circle), ], ); } } 1.3.2 GridView.extent实现网格布局 GridView.

npm root -g 查看全局的包的安装路径解决‘cnpm‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题: npm root -g 查看全局的包的安装路径解决’cnpm’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 产生原因: 有时候把node.js 安装不在C盘,安装的D盘 解决思路: 产生这个问题一般是环境变量配置不正确引起的。 1、全局安装cnpm 或者nodemon 的时候表示成功安装,去D盘去找的时候,没有node_modules文件夹里面也是空的 2、输入cnpm 提示:‘’‘cnpm’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。‘’ 3、管理员身份安装也没有办法解决 4、这个时候去查看环境变量,也发现配置了是D盘的node/node_modules路径,而D盘node/node_modules是空的,所以会提交命令不存在。 5、这个时候需要去找到真实的node/node_modules安装的位置,然后去添加到的环境变量中 # 可以用到 下面命令 npm root -g 6、会输出真实的全局依赖安装的路径,把路径复制出来,添加到环境变量,就可解决问题 7、再次输入 cnpm -v 就可以按到提示版本信息

数组以及冒泡和选择排序

数组:可以看作一个容器,存储一组数据(多个),创建数组时,需要给定数据类型,只能存储同一类的数据,必须要明确数组的容量,一旦确定就不能改变。数组是引用类型,可以存储多个值的容器 数组的两种声明方式:int [] a 或int a [] 一般建议使用第一种 数组创建的三种方式:int[] ary0 = new int[10]; int[] ary1 = new int[]{1, 2, 3, 4, 5}; int[] ary2 = {1, 2, 3,4,5} 数组中的每个空间都有一个下标或者称为索引,索引的特点是整数,开始的值为0,最大索引是数组的长度减一,数组的长度是有限制的,最大也是int最大值,数组内部的空间必须是连续的 数组遍历 可以利用for循环和增强for循坏来对数组将进行遍历 冒泡排序 选择排序 二维数组

你不知道的JavaScript—变量提升

前言 对于JavaScript而言,var a = 2; 是两个操作。var a 是编译阶段的任务,而 a = 2 是执行阶段的任务。因此,在代码被执行前,所有的声明都会被“移动”到各自作用域的最顶端。这个过程就是“提升”。 一、变量声明与赋值? 声明在前,赋值在后。 只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。 console.log(a); // undefined var a = 10; // 等价于 var a; console.log(a); // undefined a = 10; 二、函数声明 函数声明本身会被提升,但函数表达式的赋值在内的操作并不会被提升(可理解为普通变量被赋值函数的操作)。 // 函数提升 bar(); // 1 function bar(){ console.log("1"); } // 等价于 function bar(){ console.log("1"); } bar(); // 1 // 函数表达式提升 foo(); // TypeError bar(); // ReferenceError var foo = function bar(){ //... } // 等价于 var foo; foo(); // TypeError bar(); // ReferenceError foo = function(){ var bar = .

Vue2与Vue3响应式的详解与比对

目录 前言一,响应式的理解1.1 Mvvm模式的复习1.2 什么是响应式 二, Vue2中响应式的应用三,Vue2响应式的原理及实现3.1 数据代理3.2 数据代理的原理3.3 数据劫持 四,Vue3中响应式的应用3.1 ref与reactive3.2 ref函数的使用讲解3.3 为什么要出现reactive及其用法 五, Vue3响应式的原理及实现5.1 底层原理5.2 window上内置对象Reflect5.3 Vue3响应式原理的总结 后记 前言 在我们学习Vue响应式之前,我们需要了解,Vue的响应式是什么,Vue响应式的怎么用,以及其内部深层次的原理。 一,响应式的理解 1.1 Mvvm模式的复习 Vue响应式的响应式又可以称之为数据双向绑定。双向绑定来源于有关Vue设计的Mvvm模式,这里对其进行简单复习。 Mvvm拆解: M:Model:模型,对应data中的数据; View:模板,页面结构,可以理解为用户界面,是由真实的Dom结构构成; VM:视图模型,对应的是Vue的实例对象。 可以根据下面这张图片进行理解: 其中,Model中的数据通过Vm传递给View,在页面中可以反映出name的值为‘巧克力小猫猿’;同样,如果改变了View中name的值(通过input的value),Model中的数据也会发生改变。 1.2 什么是响应式 响应式就是在数据变化时可以被检测并对这种变化做出响应的机制响应式,简单说就是用户更改数据(Data)时,视图可以自动刷新,页面UI能够响应数据变化。 结合Mvvm,如果我们要实现响应式,其实就是实现Model到View的同步改变,当数据发生变化时,视图也发生变化。 二, Vue2中响应式的应用 Vue2中用到响应式的地方很多,用法简单粗暴,比如模板语法。只要data中存在数据,就可以通过模板语法进行使用: <template> <div> 我是{{ name }} </div> </template> <script> export default { data() { return { name: '巧克力小猫猿' } } } </script> 页面中即可显示data中的数据: 三,Vue2响应式的原理及实现 3.1 数据代理 数据代理的定义:通过一个对象代理对另一个对象中的属性的操作(读/写),就是数据代理。 Vue2的响应式原理离不开数据代理。数据代理是什么意思?这里用一个例子来解释。如下,person是一个对象: let person = { name: '张三', age: 18 } 我们可以试着在浏览器控制台来读取数据,修改数据。但是,在vue2中,是vm来管理这些数据。也就是说,我们不直接操纵person,而是通过vm(Vue的实例对象)来管理person中的数据。这种情况就叫做数据代理。

JVM调优思路

JVM调优思路 原文链接: https://blog.csdn.net/sinat_40770656/article/details/122203566 监控命令与调优工具 首先,我们需要了解有哪些常用的性能监控和jvm调优的工具: 操作系统: top: 显示系统整体资源使用情况 vmstat:监控系统内存和CPU iostat:监控系统IO使用情况 netstat:监控系统网络使用情况 JDK性能监控工具 jps:虚拟机进程查看 jstat:虚拟机运行时信息查看 jinfo:虚拟机配置查看 jmap:内存映像 jhat:堆转储快照分析 jstack:java堆栈跟踪 jcmd:实现以上除了jstack所有功能 jdk可视化性能监控工具: JConsole VisualVM Java Mission Control 三方工具: MAT:java堆内存分析工具 GChisto:GC日志分析工具 GCViewer:GC日志分析工具 JProfiler:商用的性能分析器 arthas:阿里开源诊断工具(https://arthas.aliyun.com/doc/) async-profiler:java应用性能分析工具,开源,火焰图、跨平台 JVM常见的参数配置 传送门:jvm参数详解 比较常见的一些参数配置: 堆配置: -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize :设置年轻代大小 -XX:PermSize:设置老年代大小 ······ GC收集器配置: -XX:+UseParNewGC :设置年轻代为并行收集 -XX:+UseParallelOldGC :年老代垃圾收集方式为并行收集(Parallel Compacting) -XX:+UseConcMarkSweepGC:使用CMS内存收集 ······ ······ 有做过JVM调优么? JVM调优是一件很严肃的事情,前期需要严密的分析和监控。实际上,JVM调优是不得已而为之,有那功夫,好好把烂代码重构一下不比瞎调JVM参数强么? 面试官非要问怎么办?可以从处理问题的角度来回答(对应图中事后),这是一个中规中矩的案例:电商公司的运营后台系统,偶发性的引发OOM异常,堆内存溢出。 1、因为是偶发性的,所以第一次简单的认为就是堆内存不足导致,单方面的加大了堆内存从4G调整到8G -Xms8g。 2、但是问题依然没有解决,只能从堆内存信息下手,通过开启了-XX:+HeapDumpOnOutOfMemoryError参数 获得堆内存的dump文件。 3、用JProfiler 对 堆dump文件进行分析,通过JProfiler查看到占用内存最大的对象是String对象,本来想跟踪着String对象找到其引用的地方,但dump文件太大,跟踪进去的时候总是卡死,而String对象占用比较多也比较正常,最开始也没有认定就是这里的问题,于是就从线程信息里面找突破点。 4、通过线程进行分析,先找到了几个正在运行的业务线程,然后逐一跟进业务线程看了下代码,有个方法引起了我的注意,导出订单信息。 5、因为订单信息导出这个方法可能会有几万的数据量,首先要从数据库里面查询出来订单信息,然后把订单信息生成excel,这个过程会产生大量的String对象。 6、为了验证自己的猜想,于是准备登录后台去测试下,结果在测试的过程中发现导出订单的按钮前端居然没有做点击后按钮置灰交互事件,后端也没有做防止重复提交,因为导出订单数据本来就非常慢,使用的人员可能发现点击后很久后页面都没反应,然后就一直点,结果就大量的请求进入到后台,堆内存产生了大量的订单对象和EXCEL对象,而且方法执行非常慢,导致这一段时间内这些对象都无法被回收,所以最终导致内存溢出。 7、知道了问题就容易解决了,最终没有调整任何JVM参数,只是做了两个处理: 在前端的导出订单按钮上加上了置灰状态,等后端响应之后按钮才可以进行点击 后端代码加分布式锁,做防重处理 这样双管齐下,保证导出的请求不会一直打到服务端,问题解决! 线上服务占用CPU过高怎么排查?

无法加载Word2Vec-google-news-300

1.错误提示 无法直接下载'word2vec-google-news-300' 输入代码: import gensim.downloader as api wv = api.load('word2vec-google-news-300') 获得报错: remote end closed connection without response 2.解决办法 2.1 手动下载数据 ① 数据 在下面的网站找到的 RaRe-Technologies/gensim-dataGoogle Code Archive:word2vec !The archive is available here: GoogleNews-vectors-negative300.bin.gz.(←这里下载) !!word2vec-google-news-300(←没法翻墙就这里下载) 提取码: word ② 解压 手动下载下来word2vec-google-news-300.gz,将解压后的文件GoogleNews-vectors-negative300.bin放在~/gensim-data/word2vec-google-news-300目录下 但是再运行上述代码,还是会报错: 2.2 再使用以下代码: from gensim.models import KeyedVectors from gensim.test.utils import datapath wv_from_bin = KeyedVectors.load_word2vec_format(datapath(r"~/gensim-data/word2vec-google-news-300/GoogleNews-vectors-negative300.bin"), binary=True) 可以了! 3.参考博客 AttributeError:module ‘word2vec-google-news-300’ has no attribute ‘load data’

前端页面主题切换方案

方案1:link标签动态引入 其做法就是提前准备好几套CSS主题样式文件,在需要的时候,创建link标签动态加载到head标签中,或者是动态改变link标签的href属性。 优点: 实现了按需加载,提高了首屏加载时的性能 缺点: 动态加载样式文件,如果文件过大网络情况不佳的情况下可能会有加载延迟,导致样式切换不流畅 如果主题样式表内定义不当,会有优先级问题 各个主题样式是写死的,后续针对某一主题样式表修改或者新增主题也很麻烦 方案2:提前引入所有主题样式,做类名切换 这种方案与第一种比较类似,为了解决反复加载样式文件问题提前将样式全部引入,在需要切换主题的时候将指定的根元素类名更换,相当于直接做了样式覆盖,在该类名下的各个样式就统一地更换了。其基本方法如下: /* day样式主题 */ body.day .box { color: #f90; background: #fff; } /* dark样式主题 */ body.dark .box { color: #eee; background: #333; } .box { width: 100px; height: 100px; border: 1px solid #000; } <div class="box"> <p>hello</p> </div> <p> 选择样式: <button onclick="change('day')">day</button> <button onclick="change('dark')">dark</button> </p> functionchange(theme) { document.body.className = theme; } 优点: 不用重新加载样式文件,在样式切换时不会有卡顿 缺点: 首屏加载时会牺牲一些时间加载样式资源 如果主题样式表内定义不当,也会有优先级问题 各个主题样式是写死的,后续针对某一主题样式表修改或者新增主题也很麻烦 方案3:CSS变量+类名切换 灵感参考:Vue3官网 在Vue3官网有一个暗黑模式切换按钮,点击之后就会平滑地过渡,虽然Vue3中也有一个v-bind特性可以实现动态样式绑定,但经过观察以后Vue官网并没有采取这个方案,针对Vue3的v-bind特性在接下来的方案中会细说。

C语言查漏补缺(进阶)volatile、__attribute__、void*、地址对齐、$$Super$main

最近在学习RT-Thread,在看其源码的时候发现了许多自己不太了解的C语言知识点,在此查漏补缺一下。 1. 关键字 volatile volatile是C90新增关键字,volatile的的中文意思是adj.易变的;无定性的;无常性的;可能急剧波动。与const正好是相反的,说明变量是允许被外界改变的。 当定义了一个无volatile修饰的变量时,如果通过硬件等方式改变其值则这个变量的值会被编译器优化,即编译器发现程序并没有改变该变量的值,程序继续使用其原先的值。 如果加了volatile,程序每次需要读取该变量的值时会直接从该变量的地址读取,当变量的值通过硬件的方式改变后,程序从变量地址读取后的值是通过硬件改变的值。从而不被编译器优化。 使用方式: volatile int v; 在STM32编程中常用__IO这个宏来表示volatile 参考:菜鸟教程 register register 存储类用于定义存储在寄存器中而不是 内存 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。 { register int miles; } 寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 ‘register’ 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。 注意事项: 1、register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码 2、但是使用register修饰符有几点限制 (1)register变量必须是能被CPU所接受的类型。 这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。 (2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。 (3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。 在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。 (4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c; (5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。 注意: 早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令 参考: 浅析C语言的一个关键字——register C存储类 enum enum是C90标准新增的关键字,enum本质是int型,语法上与结构体相同,用于提高程序的可读性。 注意:C++中不允许枚举类型进行++操作。而C语言允许,因此一个C程序移植为C++时可以将枚举类型改为int型 默认值:如果不赋值则默认从0开始递增,如果中间有元素被赋值,则后面的值依次递增。 enum color = {red,green,blue,pink}; /* red,green,blue,pink成为 */ void* void很常见,常用于限定函数的返回值为无以及函数的参数为空,但是void *却是头一次见,void *可以接收任意指针,但是指针在接收void *之前必须进行强制类型转换。内存分配函数malloc的返回值就是void*指针,所以需要强制类型转换。 int *a; void *p; p = a;//void指针可以接收其他类型指针 a = (int*)p;//其他类型指针接收void指针,需要进行强制类型转换 在ANSI C中不允许void *进行自加操作,而GNU中可以。因为GNU将void *看做char *

CentOS8基础篇10:网络环境配置

管理员为了能够更好的管理和维护网络,需要配置服务器的网络环境,再将服务器部署到网络环境中。为此他需要完成以下工作: 设置临时主机名为Server。 设置网卡信息:IP地址为192.168.137.5,子网掩码是255.255.255.0;设置客户端域名解析服务器地址是219.216.129.5。 对于每一步的设置,管理员都要作相应的查看以验证设置成功。 一、主机名的配置 1.使用hostname命令临时设置主机名 命令格式:hostname [新主机名] 使用hostname命令设置的主机名立刻生效,可以使用hostname命令来查询设置是否成功。但是,hostname命令的设置是临时的,当系统重启后会恢复成原主机名。这是由于hostname命令的设置内容并没有更新到网络配置文件/etc /hosts中主机名的选项中。 2.永久设置主机名 CentOS Linux 8使用/etc/hosts配置文件存储主机名信息,然而使用hostname命令设置主机名并未修改该配置文件的内容,因此hostname命令未实现永久性修改,若想实现主机名永久性修改,可使用命令:#hostnamectl set-hostname 新主机名,此命令将修改配置文件/etc/hosts。系统重启时会读取该文件中的内容从而对主机名进行配置。 二、网卡信息的配置 1.网卡配置文件 对于网卡信息的配置通常包括:配置IP地址、子网掩码、网关。网卡信息保存在网卡配置文件中。网卡配置文件位于/etc/sysconfig/network-scripts目录下。一块网卡对应一个网卡配置文件。 ifcfg-ens33为网卡配置文件。 常用配置项的含义如下: DEVICE=ens33 //定义该网卡的识别名称。 BOOTPROTO=dhcp //启动该网卡的方式,dhcp表示通过BOOTP或DHCP协议动态取得IP地址。 ONBOOT=yes //启动network服务时,是否启动该网卡。 TYPE=Ethernet //网卡的类型。 2.配置网卡信息 (1)直接修改网卡配置文件 (2) ifconfig命令 ①查看网卡信息 命令格式: ifconfig [选项] 选项说明: 无选项:显示当前活动的网卡。 –a :显示系统中所有网卡配置信息。 网卡设备名:显示指定网卡配置信息。 〖例1〗 查看ens33网卡的信息。 通过输出结果可以看到ens33的IP地址是192.168.65.129,MAC地址是00:0c:29:c5:3c:5f,子网掩码是255.255.255.0。 ②设置IP地址 命令格式: ifconfig 网卡设备名 IP地址 netmask 子网掩码 采用ifconfig命令设置的IP地址即时生效,但是重启机器后,IP地址又恢复到原IP地址,所以ifconfig命令只能用于设置临时IP地址。 〖例6.2〗 使用ifconfig命令将当前网卡ens33的IP地址设置为192.168.168.156,子网掩码255.255.255.0 。 ③ 修改网卡的MAC地址 命令格式:ifconfig 网卡设备名 hw ether MAC地址 注意在修改网卡的MAC地址之前要禁用网卡,修改后要启用网卡。 〖例3〗 将ens33网卡的MAC地址修改为00:0C:29:03:F3:76。 3.网卡常用命令 (1) ifdown

Anaconda+pycharm+pytorch安装教程(GPU版)

配置环境 os:win11 Anaconda:3 pycharm:2022.3.2 (Professional Edition) CUDA:11.7 注意:显卡必须是英伟达且显存6G及以上为佳,否则Pytorch安装在GPU下的运行效果远不如CPU,AMD显卡暂不支持安装。 安装步骤 一、Anaconda: 官网下载:Anaconda | The World's Most Popular Data Science Platform 安装:步骤不再具体叙述。 新建环境 在Anaconda中找到并打开Anaconda Navigator,点击->Environments->点击左下角Create,输入新建环境Name并选择python版本->点击Create,等待一会儿环境即新建完成。 4.环境激活 打开Anaconda prompt->输入activate pytorch->回车(这里的pytorch是刚才新建的环境名,需要根据自己的实际定义修改)。 二、CUDA: 官网下载:https://developer.nvidia.com/cuda-toolkit-archive、 最新推荐下载11.6或11.7版本。 2.安装结果确认 键盘按win+R->输入cmd->回车->输入nvcc -V,正常返回版本即为安装成功。 三、pytorch: 官网下载:Start Locally | PyTorch 选择相应配置后Ctrl+C复制Run this Command里的内容->打开Anaconda prompt并进入刚刚新建激活好的环境内->Ctrl+V粘贴Run this Command里的内容->回车即可下载并安装; 注意这里的Package选Pip、Compute Platform需注意与安装的CUDA版本保持一致,其他项根据自己的实际情况选择; 到了这里即是已经安装完成。 2.安装结果确认:先输入python->再依次输入下面的三行代码,返回对应结果即为正常。 import torch print(torch.__version__) print(torch.cuda.is_available()) 四、pyCharm: 1.环境加载:文件->设置->项目:pythonProject->Python解释器->全部显示,查看是否有新建的Conda环境; 如无则按以下步骤操作:点击左上角+号->添加本地解释器->Conda环境,找到Anaconda安装目录中的_conda.exe文件->加载环境; 注意这里的使用现有环境需选择Anaconda->envs->pytorch; 最后在python解释器项选择刚加载的Conda环境并点击应用,等待环境加载完成点击确认即可; 安装结果确认:在新建项目中输入次输入下面的三行代码并运行,返回对应结果即为安装成功,至此所有步骤完成。 import torch print(torch.__version__) print(torch.cuda.is_available())

linux虚拟机创建CentOS7

操作系统安装讲解 ## 1、最小化安装讲解 系统安装是学习Linux系统的第一步,该过程涉及到许多Linux系统的基础知识,是必须熟练掌握的能力。 实验环境 虚 拟 机: VMware® Workstation 镜 像: CentOS-7-x86_64 操作系统: Windows 10, 64-bit (Build 15063) 10.0.15063 操作过程 打开VMware虚拟机软件,依次点击**【文件】**选项卡 → 新建虚拟机。 依次点选【典型】,【稍后安装操作系统】,【Linux-Red Hat Enterprise Linux 7 64位】。 更改虚拟机存储位置到你想要的位置 磁盘划分20G足够,点选【将虚拟磁盘拆分成多个文件】 点击**【完成】** 单击编辑虚拟机设置。在内存选项中,将**【此虚拟机的内存】修改为【1024MB】。在处理器选项中, 将【处理器数量】修改为【1】个,【每个处理器的核心数量】修改为【1】**个。在CD/DVD选项中,将 **【使用ISO映像文件】**中选择Centos镜像文件。 现在即可返回并点击【开启此虚拟机】,开始安装CentOS7系统。 此界面选择【Install CentOS 7】,稍作等待开始安装。 首先选择语言 接下来选择系统安装位置 然后点选【I will configure partitioning】,再单击左上角的【Done】 进入分区界面,如果想偷一把懒,可直接点击【Click here to create them automatically】进行自动分区 接下来是分区相关的选读部分。 使用图示图标可以进行自定义分区 CentOS7提供了如下四种文件系统 【Standard Partition】是标准分区,提供ext2,ext3等传统文件系统,类似Windows Server中简单卷 的概念。 【Btrfs】是一种新型的文件系统,相较传统的ext3,Btrfs允许更大容量的单一文件,更大的存储容 量,以及提供了文件校验等特性。 【LVM】是逻辑卷管理,LVM将存储中的所有硬盘逻辑上看作一个存储空间,类似Windows server中 的跨区卷,可以更加容易的对分区进行空间管理,同时支持分区快照等功能。 【LVM Thin Provisioning】是LVM自动精简配置,在LVM的基础上,对分区空间进行弹性分配,在设 定预计存储空间大小后,由计算机管理存储空间,在空间达到预警阈值时才会通知管理员进行手工调 整。

基于springboot的微信公众号管理系统(支持多公众号接入)

微信公众号管理系统,支持多公众号接入。提供公众号菜单、自动回复、公众号素材、模板消息、CMS等管理功能 项目说明 是一个轻量级的公众号开发种子项目,可快速接入微信公众号管理功能swagger文档(启动wx-api后查看):http://localhost:8088/wx/swagger-ui/index.html 技术选型 核心框架:Spring Boot安全框架:Apache Shiro持久层框架:MyBatis-Plus页面交互:Vue2.x、ElementUI、TinyMce Editor、Vuex 截图 本項目已经包括前端,直接启动项目即可访问:http://localhost:8088/wx 演示地址 : https://www.klgeek.com/wx/wx-manage/index.html 账号密码:test/123456 演示账号部分功能受限! 源码下载地址: https://imgbed.link/file/17216

Unity流式数据读取

不是很清楚这个名字对不对。 有时候我们需要用unity获取cpu或者硬盘的序列号,但是SystemInfo并不能获取,我们只能通过C#来获取,这个时候就用到了流式数据读取。 具体体现为:通过winfrom程序将cpu或硬盘的序列号读取出来,然后unity通过数据流读取的方式获取信息。 以下为winform中的代码 private void Form1_Load(object sender, EventArgs e) { //GetCPUSerialNum(); StringBuilder log = new StringBuilder(); try { long s = 0; long f = 0; log.AppendLine(GetCPUSerialNum()); DriveInfo[] ds = DriveInfo.GetDrives(); foreach (DriveInfo d in ds) { s += d.TotalSize; f += d.TotalFreeSpace; } //log.AppendLine("Harddisk Totalspace" + link + (s / 1048576).ToString()); //log.AppendLine("Harddisk Freespace" + link + (f / 1048576).ToString()); } catch (Exception ex) { Console.WriteLine(ex.Message + ex.StackTrace); } Console.

深度学习是什么?应用在哪些方向?

深度学习(Deep Learning)是一种机器学习技术,是一种基于神经网络的模型,用于学习和表示复杂的数据模式。相对于传统机器学习方法,深度学习通过多个隐层(hidden layer)的堆叠,可以构建更加复杂的模型,并且可以自动学习输入数据的特征表示。 深度学习是什么?应用在哪些方向? 深度学习的核心是神经网络,它是由神经元组成的层次结构,可以在多个层次上学习抽象特征,并逐步实现对输入数据的转化。通过不断迭代训练,神经网络可以自动学习到更加高级的特征表示,以及如何将输入数据与输出结果相对应,实现数据的分类、回归、聚类、生成等任务。 深度学习技术在计算机视觉、自然语言处理、语音识别、游戏AI等领域中得到广泛应用,并且取得了非常显著的成果。如在图像分类、目标检测、人脸识别等计算机视觉任务中,深度学习的准确率已经超过了人类;在语音识别和自然语言处理任务中,深度学习也已经成为最为常用的方法之一。 免费分享一些我整理的人工智能学习资料给大家,整理了很久,非常全面。包括一些人工智能基础入门视频+AI常用框架实战视频、图像识别、OpenCV、NLP、YOLO、机器学习、pytorch、计算机视觉、深度学习与神经网络等视频、课件源码、国内外知名精华资源、AI热门论文等。 下面是部分截图,点击文末名片关注我的公众号【AI技术星球】发送暗号 321 领取(一定要发暗号 321) 目录 一、人工智能免费视频课程和项目 二、人工智能必读书籍 三、人工智能论文合集 四、机器学习+计算机视觉基础算法教程 五、深度学习机器学习速查表(共26张) 学好人工智能,要多看书,多动手,多实践,要想提高自己的水平,一定要学会沉下心来慢慢的系统学习,最终才能有所收获。 点击下方名片,扫码关注公众号【AI技术星球】发送暗号 321 免费领取文中资料。

解决vue2.7及以后版本不兼容chrome老版本的问题

报错信息 Uncaught SyntaxError: Unexpected token . 解决方案: 根目录下新建balel.config.js文件 module.exports = { presets: [ '@vue/cli-plugin-babel/preset' ] } pakege.json的browserslist参数增加"Chrome > 64" 重新初始化依赖并运行即可正常访问 browserslist参数配置参考:https://blog.csdn.net/qq_41772754/article/details/96854600?spm=1001.2014.3001.5502

精选7个Python相关的Github学习资源库,助你成为优秀的开发者

提高你的Python开发效率 当你在学习编程时,很容易被大量的资源所吓到,不知道该从何开始。GitHub 仓库是一个很好的起点,因为它们提供了一种非常实用的方式来了解实际的编程应用。你可以查看其他人的代码,并将其与自己的代码进行比较和学习。 当涉及到 Python 时,这些仓库提供了广泛的主题,从基本的语法到高级的数据分析和人工智能。在这些仓库中,你可以找到许多有趣的项目,如游戏、机器学习算法、网络爬虫、数据可视化等等。 除了这些仓库之外,还有很多其他的编程资源可以帮助你提高编程技能,如编程博客、在线教程、编程书籍等等。无论你是一个新手还是一个经验丰富的开发者,持续学习和探索是取得成功的关键。 1. Algorithm 这个仓库旨在为人们提供 Python 的算法和数据结构实现。在这个仓库中,你可以找到各种算法的实现,从基本的排序和搜索算法到复杂的图形算法和动态规划等等。此外,这个仓库还包含一些常见数据结构的实现,如树、堆、队列、栈等等。 这个仓库的一个很酷的特点是,每个算法和数据结构的实现都有一个相应的 README 文件,其中包含了详细的解释、复杂度分析、示例代码和测试用例等等。这让学习这些算法和数据结构变得更加容易。 如果你正在学习 Python 或者想要提高自己的算法和数据结构能力,这个仓库是一个值得关注和探索的地方。 https://github.com/TheAlgorithms/Python 2. 30-Days-Of-Python 这个仓库旨在帮助初学者学习 Python 编程语言。它包含了一个 30 天的 Python 编程挑战,每一天都包含了一些编程概念、任务和练习题。在这个挑战中,你将学习 Python 中的各种概念,如变量、数据类型、条件语句、循环语句、函数、模块、文件操作、异常处理等等。此外,你还将学习如何使用 Python 来处理数据、进行 web 开发和构建机器学习模型等等。 每一天的任务和练习题都有详细的说明和示例代码,以帮助你更好地理解和掌握 Python 的各种概念和技能。此外,这个仓库还包含了一些附加资源,如学习笔记、视频教程和额外的练习题等等,可以帮助你更好地掌握 Python 编程语言。 https://github.com/Asabeneh/30-Days-Of-Python 3. Learn Python 在这个仓库中,你可以找到一系列 Python 编程挑战和任务,从基本的语法和数据类型到高级的算法和数据结构等等。这些挑战和任务都有详细的说明和示例代码,可以帮助你更好地理解和掌握 Python 编程语言。 此外,这个仓库还包含了一些额外的资源,如 Python 编程书籍、在线课程和博客文章等等,可以帮助你更深入地学习 Python 编程语言。 这个仓库的一个很酷的特点是,它还包含了一些有趣的 Python 项目和工具,如迷宫生成器、密码破解器、人脸识别器等等。这些项目可以帮助你更好地理解和应用 Python 编程语言。 https://github.com/trekhleb/learn-python 4. 30-seconds-of-python 这个仓库旨在为人们提供 Python 编程语言中常用代码片段的快速参考。在这个仓库中,你可以找到大量的 Python 代码片段,这些片段包括了 Python 中的各种概念和功能,如字符串操作、列表操作、字典操作、函数、类、模块等等。这些代码片段都非常简洁明了,可以帮助你快速地理解和掌握 Python 编程语言中的各种功能。

IDEA插件Apifox,一键自动生成接口文档!

有关Apifox软件之前写过一篇文章: 接口测试神器Apifox,亲测好用! 如何一键自动生成数据库文档之前也写过一篇文章: 数据库界的Swagger:一键生成数据库文档! 一、Apifox插件的优势 作为一名后端开发在项目开发过程中,肯定需要提供接口文档。 一般我们有两种方案 项目结合Swagger,自动生成接口文档。 手动将接口复制到其它接口文档,比如postman、Apifox。 第一种方案缺陷在于 为了生成完整接口文档,我们会代码入侵且增加开发工作量 当我们只需提供几个接口给第三方,总不能直接提供Swagger所有接口文档吧 第二种方案缺陷在于 需要一个一个将接口写在对应的接口文档上,耗费大量时间 当接口发生变更了,还需要修改下接口文档,会经常出现只修改接口忘记去修改接口文档的情况。 这时候这款插件神器就来了,它不仅可以解决上面的缺陷,而且还有更强大的功能,它可以支持直接在IDEA上做接口联调测试! 二、Apifox插件简单介绍 该插件主要用于 IDEA 项目快速生成 API 文档,并同步到 Apifox,代码零入侵。 基于 javadoc(Java)、KDoc(Kotlin)、ScalaDoc(Scala) 解析API文档。 支持 Swagger 注解 注意:可以在保持代码零侵入的情况下得到相当完整的 API 文档,但是特殊的需求还是需要部分特殊的注释/注解配合 功能特性 导出 API 文档到 Apifox 导出 Markdown 格式 API 文档 在 IDEA 中直接发起 API 请求 三、IDEA安装插件 1、支持以下IDEA IntelliJ IDEA 193.+(2019.3+) IntelliJ IDEA Community Edition 174+(2017.4+) 2、搜索安装 打开IDEA > Preferences(Settings) > Plugins ,搜索 Apifox Helper 安装完成后,你就可以使用上面说的功能特性了。 如果是同步到 Apifox 项目,你还需要下载或注册 Apifox 软件,创建一个对应的项目(这个具体操作看上面那篇文章就可以了)

《数据库系统概论》学习笔记——第九章 关系系统及其查询优化

教材为数据库系统概论第五版(王珊) 9.1 关系数据库系统的查询处理 9.1.1 查询处理步骤 RDBMS查询处理阶段 : (记一下) 查询分析查询检查查询优化查询执行 查询分析 对查询语句进行扫描、词法分析和语法分析 词法分析:从查询语句中识别出语言符号语法分析:进行语法检查 查询检查 合法性检查:根据数据字典中有关的模式定义检查语句中的数据库对象,如关系名、属性名是否存在和有效。视图转换:如果是对视图的操作,则要用视图消解方法把对视图的操作转换成对基本表的操作。安全性和完整性初步检查:根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查。 检查通过后便把SQL查询语句转换成内部表示,即等价的关系代数表达式。这个过程中要把数据库对象的外部名称转换为内部表示。关系数据库管理系统一般都用查询树(query tree),也称为语法分析树(syntax tree)来表示扩展的关系代数表达式。 查询优化 查询优化:选择一个高效执行的查询处理策略 查询优化分类 :要背 代数优化:指关系代数表达式的优化,即按照一定的规则,通过对关系代数表达式进行等价变换,改变代数表达式中操作的次序和组合,使查询执行更高效物理优化:指存取路径和底层操作算法的选择 查询优化方法选择的依据: 基于规则(rule based)(比如题目要求按什么顺序进行什么操作)基于代价(cost based)(比如要求空间或时间更小)基于语义(semantic based) 查询执行 依据优化器得到的执行策略生成查询计划 代码生成器(code generator)生成执行查询计划的代码 加以执行,回送查询结果 9.1.2 实现查询操作的算法示例 一、 选择操作的实现 选择操作典型实现方法: 简单的全表扫描方法 对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的元组作为结果输出适合小表,不适合大表 索引(或散列)扫描方法 适合选择条件中的属性上有索引(例如B+树索引或Hash索引)通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接在查询的基本表中找到元组 例: Select * from student where <条件表达式>; 考虑<条件表达式>的几种情况: C1:无条件;C2:Sno=’200215121’;C3:Sage>20;C4:Sdept=’CS’ AND Sage>20; C1:使用全表扫描 算法思想:假设可以使用的内存为M块,全表扫描的算法思想如下: 按照物理次序读Student的M块到内存。 检查内存的每个元组t,如果t满足选择条件,则输出t 如果 Student还有其他块未被处理,重复1和2。 C2:索引扫描算法 Select * from student where Sno='200215121'; 假设Sno上有索引(或Sno是散列码),如果Sno是主码则系统会自动建立索引 算法: 使用索引(或散列)得到Sno为‘200215121’元组的指针通过元组指针在student表中检索到该学生 C3:索引扫描算法 Select * from student where Sage>20; 假设Sage上有B+树索引

HTML快速生成代码的语法,简单快速上手。

所有的操作都是按下tab键即可瞬间完成。 1.属性操作 用.来生成,后面就是类名 div.aaa 按tab后结果如下: <div class="aaa"></div> 用#来生成,后面就是id名 div#aaa 按tab <div id="aaa"></div> 其他属性用[] div[title='hello' colspan=3] 结果 <div title="hello" colspan="3"></div> 用$来实现编号,实际上就是个占位符 li.aaa$*3 结果 <li class="aaa1"></li> <li class="aaa2"></li> <li class="aaa3"></li> 用@n来修改起始值 li.aaa$@3*3 结果,3可以用-3这样就会变成-5,-4,-3 <li class="aaa3"></li> <li class="aaa4"></li> <li class="aaa5"></li> {}可以添加文本,不过这个不实用 2.嵌套使用 >生成子元素 div>ul>li 结果 <div> <ul> <li></li> </ul> </div> 其他的有,+生成兄弟元素,“^”生成父元素,”*n“生成多个相同元素,”()”将元素分组 3.table快捷生成 table>tr*3>td*3{data} 结果 <table> <tr> <td>data</td> <td>data</td> <td>data</td> </tr> <tr> <td>data</td> <td>data</td> <td>data</td> </tr> <tr> <td>data</td> <td>data</td> <td>data</td> </tr> </table>

H.265/HEVC编码结构

H.265/HEVC编码结构 为了增强各种应用下操作的灵活性以及数据损失的鲁棒性,H.265/HEVC在编解码的设计上添加了多种新的语法结构。相较于以往的视频编码标准(如H.264/AVC),这种新的语法架构使得H.265/HEVC在压缩效率和网络适应性两个方面都有显著提升。此外,根据不同业务需求、终端运算能力等,H.265/HEVC还相应地规定出不同的档次、层、级,以适应各种应用场景。本章首先对H.265/HEVC的编码架构和其所涉及的相关语法参数集进行详细介绍,然后给出档次、层、级的基本概念以及在H.265/HEVC中对它们的具体规范 [1] 。 3.1 编码结构概述 关于编码结构,可以从编码时的分层处理架构和编码完后码流的语法架构两方面进行描述。视频序列由若干时间连续的图像构成,在对其进行压缩时,先将该视频序列分割为若干个小的图像组(Group Of Pictures,GOP)。在视频编码中,存在两种GOP类型:封闭式GOP(Closed GOP)和开放式GOP(Open GOP),如图3.1所示。在封闭式GOP类型中,每一个GOP以IDR(Instantaneous Decoding Refresh)图像开始,各个GOP之间独立编解码。在开放式GOP类型中,第一个GOP中的第一个帧内编码图像为IDR图像,后续GOP中的第一个帧内编码图像为non-IDR图像,也就是说,后面GOP中的帧间编码图像可以越过non-IDR图像,使用前一个GOP中的已编码图像做参考图像。每个GOP又被划分为多个片(Slice),片与片之间进行独立编解码。其主要目的之一是在数据丢失情况下进行重新同步。每个片由一个或多个片段(Slice Segment,SS)组成。此外,为了更灵活、更有效地表示视频内容,H.265/HEVC还引入了树形结构单元(Coding Tree Unit,CTU)这一概念,其类似于传统的宏块。每个CTU包括一个亮度树形编码块(Coding Tree Block,CTB)和两个色差树形编码块。一个SS在编码时,先被分割为相同大小的CTU,每一个CTU按照四叉树分割方式被划分为不同类型的编码单元(Coding Unit,CU)。Slice到CU的之间的编码结构如图3.2所示。以上即为编码时的分层处理架构。一般来说,为了支持视频编码标准的通用性,ITU—T和ISO/IEC只规定码流的语法元素,以保证编码器的设计更为灵活。因此本章重点介绍H.265/HEVC编码后码流的语法架构。 图3.1 两种不同的GOP类型 图3.2 Slice到CU之间的编码架构 在码流结构方面,H.265/HEVC压缩数据采用了类似于H.264/AVC的分层结构,将属于GOP层、Slice层中共用的大部分语法元素游离出来,组成序列参数集(Sequence Parameter Set,SPS)和图像参数集(Picture Parameter Set,PPS)。SPS包含了一个CVS(Coded Video Sequence)中所有图像共用的信息。其中CVS被定义为一个GOP编码后所生成的压缩数据。SPS的内容大致包括解码相关信息,如档次级别、分辨率、某档次中编码工具开关标识和涉及的参数、时域可分级信息等。PPS包含一幅图像所用的公共参数,即一幅图像中所有SS引用同一个PPS。其大致内容包括初始图像控制信息,如初始量化参数(Quantization Parameter,QP)、分块信息等。此外,为了兼容标准在其他应用上的扩展,例如可分级视频编码器、多视点视频编码器,H.265/HEVC的语法架构中增加了视频参数集(Video Parameter Set,VPS)。其内容大致包括多个子层共享的语法元素,其他不属于SPS的特定信息等。对于一个SS,通过引用它所使用的PPS,该PPS又引用其对应的SPS,该SPS又引用它对应的VPS,最终得到SS的公用信息。H.265/HEVC压缩码流的结构如图3.3所示。 图3.3 H.265/HEVC压缩码流结构 参数集是一个独立的数据单位,它包含视频的不同层级编码单元的共享信息,只有当参数集直接或间接被SS引用时才有效。一个参数集并不对应某个特定的图像或CVS,同一个VPS或SPS可以被多个CVS引用,同一个PPS可以被多个图像引用。在H.265/HEVC中,NAL单元根据是否装载视频编码数据被分为VCLU(Video Coding Layer NAL Unit)和non-VCLU。非编码数据的参数集作为non-VCLU进行传输,这为传递关键数据提供了高鲁棒机制。参数集的独立使得其可以提前发送,也可以在需要增加新参数集的时候再发送,可以被多次重发或者采用特殊技术加以保护,甚至采用带外(Out-of-band)发送的方式。片段SS是视频编码数据的基本单位,一个SS的压缩数据生成一个VCLU进行传输。最终,一个视频序列的编码码流由一系列SS所生成的多个VCLU单元和夹杂其间的一些分割标示数据和参数集数据组成。分割标示数据用于区分一个SS属于哪幅图像、哪个CVS。 3.2 视频参数集 3.2.1 视频层描述 在H.264/AVC的码流结构中,没有类似VPS这样的参数集去描述时域各层之间的依赖关系。它的扩展部分可伸缩视频编码中,SEI信息提供了相关各层信息,以用于不同业务和不同终端的访问。但在一些应用场景,例如广播和多播,由于SEI中的部分信息会重复出现在SPS中,这样造成参数重传而引起延迟等问题。因此在H.265/HEVC中引入VPS,以克服H.264/AVC中存在的不足,同时为设计简洁,可扩展多层视频编码提供方便。VPS主要用于传输视频分级信息,有利于兼容标准在可分级视频编码或多视点视频编码的扩展。 一个给定的视频序列,无论它每一层的SPS是否相同,都参考相同的VPS。VPS包含的信息有: ① 多个子层和操作点共享的语法元素; ② 会话所需的有关操作点的关键信息,如档次、级别; ③ 其他不属于SPS的操作点特性信息,例如与多层或子层相关的虚拟参考解码器(Hypothetical Reference Decoder,HRD)参数。对每个操作点的关键信息的编码,不要求可变长编码,这样有利于减轻大多数网络组成单元的负担。H.265/HEVC的扩展版本将会在当前VPS中添加更多的语法元素,以使会话更加灵活高效并使编码码率具有更高的自适应性。 3.2.2 视频层参数集 表3.1给出了VPS中包含的各个语法元素以及它们的描述子。描述子即语法元素的熵解码算法,描述子符号表示如下。 ae(v):基于上下文自适应的二元算术编码。 b(8):读进连续的8 bit。 f(n):读进连续的n bit。 se(v):有符号指数Golomb熵编码。 u(n):读进连续的n bit,且它们解码后的值为无符号整数。 ue(n):无符号指数Golomb熵编码。 上面描述子中括号内的参数为n时,表明该语法元素是定长编码;参数为v时表示语法元素采用变长编码。 表3.1 VPS内的语法元素

Docker容器开启IPv6

Docker容器开启IPv6 Docker默认不开启IPv6配置,某些场景我们又需要IPv6网络支持,随着IPv6的普及,以后的使用场景会越来越多; Docker开启IPv6支持 首先编辑 /etc/docker/daemon.json 配置文件,默认是没有该文件的,执行以下命令直接创建; cat >/etc/docker/daemon.json <<EOF { "ipv6": true, "fixed-cidr-v6": "fd00::/80", "experimental": true, "ip6tables": true } EOF 然后重启Docker服务; systemctl restart docker Docker-Compose启用IPv6 docker-compose.yaml 中使用以下配置启用IPv6地址: networks: local_bridge: enable_ipv6: true driver: bridge ipam: config: - subnet: "fd00:1001::/80" docker-compose.yaml 文件必须使用 version: “2”,version: “3” 不支持 enable_ipv6 配置; 如果已有旧的容器在运行(网络配置发生了变化),则需要先销毁容器 docker-compose down 然后再重新创建 docker-compose up; 手动创建IPv6网络 创建网络时带 --ipv6 选项,示例如下: docker network create -d bridge --ipv6 --subnet "fd00:1001::/80" local_bridge 测试 最后在容器内ping一下IPv6地址; # 进入容器命令行 docker exec -it php bash # 为容器安装ping命令 apt-get update apt-get install iputils-ping # ping ping -6 dns.

关于el-table前端导出

面向百度编程的小菜鸟,有好的方法,希望大佬多多指教 新建一个js文件,创建导出的方法。 import FileSaver from "file-saver"; import XLSX from "xlsx"; //导出方法 export function exportInfo(tableId,name) { //此处的入参是表格的id ,name是导出时的名称 console.log("导出") var wb = XLSX.utils.table_to_book( document.querySelector("#" + tableId ), ); var wbout = XLSX.write(wb, { bookType: "xlsx", bookSST: true, type: "array", }); try { FileSaver.saveAs( new Blob([wbout], { type: "application/octet-stream" }), name + ".xlsx" //下载的时候默认的名称 ); } catch (e) { if (typeof console !== "undefined") { console.log(e, wbout); } } return wbout; } 2.

OS Install for debug

1. Conmercial OS, Centos/Redhat/Fedora rufus + ISO + GPT + OS label -> installer driveinstaller driver + SSDgrubby --update-kernel=ALL --args=“console=tty0 console=ttyS0,115200n8 loglevel=8”grubby --update-kernel=ALL --remove-args=“quiet”cp /lib/systemd/system/serial-getty@.service /lib/systemd/system/serial-getty@.service.baksed ‘/ExecStart=/cExecStart=-/sbin/agetty -a root -8 -L %I 115200 $TERM’ -i /lib/systemd/system/serial-getty@.service 2. Debug OS, SVOS, fwts, openwrt balenaEtcher.exe + .imgcp /lib/systemd/system/serial-getty@.service /lib/systemd/system/serial-getty@.service.baksed ‘/ExecStart=/cExecStart=-/sbin/agetty -a root -8 -L %I 115200 $TERM’ -i /lib/systemd/system/serial-getty@.service 3.ESXI OS - rufus -> MBR + BIOS (UEFI-CSM) + VolumeLable(OS) + FileSystem(Fat32) + ClusterSize(16k) - copy EXSI so contents to installer drive - copy KS.

Qt安装完毕后,如何再添加移除组件

Qt安装完毕后,如何再添加移除组件 环境说明背景具体步骤 环境说明 操作系统:Windows10专业版 Qt版本:qt-5.15.2 背景 最初安装qt5.15.2时只安装了MinGW-32的编译套件,想增加MinGW-64的编译套件。 具体步骤 1、在windows资源管理器中找到qt的安装目录,我的电脑是D:\Qt,如下图: 2、双击qt安装目录下的MaintenanceTool.exe,如下图: 3、双击之后出现下图: 4、直接点击“下一步”,出现下图: 5、选择“添加或移除组件”,然后点击“下一步”,出现下图: 根据需要勾选要添加的组件,就可以点击“下一步”按钮,然后等待安装完成就行了。

Python 之 Pandas 文件操作和读取 CSV 参数详解

文章目录 一、Pandas 读取文件二、CSV 文件读取1. 基本参数2. 通用解析参数3. 空值处理相关参数4. 时间处理相关参数5. 分块读入相关参数 一、Pandas 读取文件 当使用 Pandas 做数据分析的时,需要读取事先准备好的数据集,这是做数据分析的第一步。Panda 提供了多种读取数据的方法,针对不同的文件格式,有以下几种:(1) read_csv() 用于读取文本文件。(2) read_excel() 用于读取文本文件。(3) read_json() 用于读取 json 文件。(4) read_sql_query() 读取 sql 语句的。其通用的流程如下:(1) 导入库 import pandas as pd。(2) 找到文件所在位置(绝对路径 = 全称)(相对路径 = 和程序在同一个文件夹中的路径的简称)。(3) 变量名 = pd.读写操作方法(文件路径,具体的筛选条件,……)。 二、CSV 文件读取 CSV 又称逗号分隔值文件,是一种简单的文件格式,以特定的结构来排列表格数据。 CSV 文件能够以纯文本形式存储表格数据,比如电子表格、数据库文件,并具有数据交换的通用格式。CSV 文件会在 Excel 文件中被打开,其行和列都定义了标准的数据格式。将 CSV 中的数据转换为 DataFrame 对象是非常便捷的。和一般文件读写不一样,它不需要你做打开文件、读取文件、关闭文件等操作。相反,您只需要一行代码就可以完成上述所有步骤,并将数据存储在 DataFrame 中。下面进行实例演示,源数据如下: 首先,我们对 CSV 文件进行读取,可以通过相对路径,也可以通过 os 动态取得绝对路径 os.getcwd() os.path.json。 import pandas as pd df = pd.read_csv("./data/my_csv.csv") print(df,type(df)) # col1 col2 col3 col4 col5 #0 2 a 1.

解决Windows因找不到msvcr110.dll无法运行程序

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或者损坏了,这时你只需下载这个msvcr110.dll文件进行安装(前提是找到适合的版本),当我们执行某一个.exe程序时,相应的DLL文件就会被调用,因此安装好之后就能重新打开你的软件或游戏了. 那么出现msvcr110.dll丢失要怎么解决? 一、手动从本站下载dll文件 1、从下面列表下载msvcr110.dll文件 32位 文件: msvcr110.dll 11.0.61135.400 64位 文件: msvcr110.dll 11.0.61135.400 2、将下载的文件放入到你要运行的软件或者游戏的安装所在文件夹之中,可以右键点击主执行程序.exe然后选择"打开文件所在的位置" 找到安装目录,将文件复制进去。 或者将文件复制到Windows系统目录,这个需要注意电脑的系统是32位还是64位,如果是32位的系统,那就将本站下载32位的dll文件放到“C:/Windows/System32”这个文件夹里面,如果是64位的系统,那就将本站下载的32位dll文件放到“C:/Windows/SysWOW64”这个文件夹里面,本站下载的64位文件放到“C:/Windows/System32”这个文件夹里面. 如果问题依然无法解决,值得注意的是此类文件的丢失有时候和杀毒软件的误报毒有关,所以请将此类dll文件添加到杀毒软件的信任列表当中. 二、使用本站提供的软件进行自动修复 本站出品的DLLEscort软件具有修复Windows系统文件的特性,它可以帮助你修复系统软件或游戏丢失的DLL运行库文件。 如:DirectX游戏运行库,directx出现错误导致的游戏打不开等BUG; VC(Microsoft Visual C++)运行库是在Windows系统下运行Visual Studio开发的应用必备组件,缺少的话无法运行软件,会出现提示缺少DLL的情况。 DLLEscort全面支持32/64位 Windows XP,Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 操作系统 下载地址:本站下载 | 百度网盘下载(提取码: 9999),下载完成后得到安装包文件运行后,点击Next下一步进行安装,安装完毕后会自动打开软件或手动执行桌面主程序(DLLEscort)即可打开软件, 桌面软件图标: 一、点击“PC Scan”或 “Click to Start Scan”开始对系统丢失文件扫描 二、扫描完成,扫描结果分成三部分,包括1,待修复的丢失文件。 2,待修复的注册表。 3.待清理的系统缓存文件。 三、点击”ALL Repair”修复开始,请保持网络通畅,直到所有问题修复完成。

postgresql执行模糊批量删除表

DO $$ DECLARE d varchar(128); BEGIN FOR d IN select 'drop table '||schemaname||'.'||tablename||';' from pg_tables where schemaname||'.'||tablename like '%public.要删除的表前缀%' loop EXECUTE d; END LOOP; END; $$

项目管理工具dhtmlxGantt甘特图入门教程(十四):导出/导入 Excel到 iCal

这篇文章给大家讲解利用dhtmlxgantt导入/导出Excel到iCal的操作方法。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足应用程序的所有需求,是完善的甘特图图表库 DhtmlxGantt正版试用下载(qun;765665608)https://www.evget.com/product/4213/download dhtmlxGantt库可以让您以Excel和iCal格式从甘特图中导出数据。您还可以将数据从 Excel文件导入甘特图。 1、导出到 Excel 要将甘特图中的数据导出到Excel文档,请执行以下操作: 在页面中包含“https://export.dhtmlx.com/gantt/api.js”文件以启用在线导出服务: <script src="codebase/dhtmlxgantt.js"></script> <script src="https://export.dhtmlx.com/gantt/api.js"></script> <link rel="stylesheet" href="codebase/dhtmlxgantt.css" type="text/css"> 调用exportToExcel方法从甘特图中导出数据: <input value="Export to Excel" type="button" οnclick='gantt.exportToExcel()'> <script> gantt.init("gantt_here"); gantt.parse(demo_tasks); </script> 使用可选属性调用导出方法 gantt.exportToExcel({ name:"document.xlsx", columns:[ { id:"text", header:"Title", width:150 }, { id:"start_date", header:"Start date", width:250, type:"date" } ], server:"https://myapp.com/myexport/gantt", visual:true, cellColors:true, data:{}, date_format: "dddd d, mmmm yyyy" }); 默认日期参数 导出模块期望start_date和end_date列具有Date类型,而duration列具有number类型。 在应用自定义模板的情况下,要么返回预期类型的值,要么在列配置的name属性中定义不同的值。例如: gantt.config.columns = [ ... {name: "start_date", align: "center", width: 100, resize: true, editor: start_dateEditor}, {name: "

五-2、vue中引用文件路径问题

vue路径分为: 绝对路径、相对路径、~+路径 及 别名+路径 绝对路径: (1)放在public文件夹下的内容,不会经过webpack打包处理,可以直接引用, 比如:aa.png直接放在public文件夹下,不管在哪个文件里,都可以这么引用 <img src="aa.png" style="width: 200px; height: 200px" /> (2)通过别名引用 在js中,引入带别名的文件路径,不需要在别名前加~ ,在css或者style中引入的需要在路径前面加~,路径以 ~ 开头,其后的部分将会被看作模块依赖。这意味着你可以用该特性来引用一个 Node 依赖中的资源,~相当于reqiure。 在vue.config.js中定义了别名 chainWebpack: (config) => { config.resolve.alias .set('@', resolve('src')) //本项目路径src路径设置别名为@ .set('_conf', resolve('src/config')) //本项目路径src/config路径设置别名为_conf .set('_iconfont', resolve('src/assets/icons/iconfont')) .set('_css', resolve('src/assets/css/')) .set('_img', resolve('src/assets/img/')) .set('_js', resolve('src/assets/js/')) .set('_components', resolve('src/components')) .set('_header', 'src/Header') .set('_footer', 'src/Footer') } 在vue中引入js文件和css文件 注意在script中路径前面都没有~ <script> import index from "_js/index.js"; ==src/assets/js/index.js import "swiper/swiper.min.css"; ==node_modules/swiper/swiper.min.css import "_js/vendor/swiper/swiper.min.css"; ==src/assets/js/vendor/swiper/swiper.min.css </script> 注意style中使用别名的路径前面需要加~ <style scoped> @import url(~_css/index.css); ==src/assets/css/index.css

第一讲:ESP32-IDF+VSCode开发环境配置

第一讲:ESP32-IDF+VSCode开发环境配置 文章目录 第一讲:ESP32-IDF+VSCode开发环境配置1.1写进ESP32芯片的二进制程序的生成方式1.2ESP32-IDF+VSCode开发环境搭建流程介绍1.2.1安装前的准备1.2.2开始安装esp-idf-tools-setup-offline-2.10.exe1.2.3配置ESP-IDF插件 1.3使用ESP-IDF+VSCode创建第一个点亮LED小灯的项目1.3.1在VSCode中搭建ESP32项目1.3.2编译blink LED闪烁工程文件1.3.3下载程序到我们的开发板1.3.4查看串口数据 1.1写进ESP32芯片的二进制程序的生成方式 ​ 在进行开发环境配置之前我们需要知道,ESP32的CPU只可以读懂二进制文件,而我们在电脑上使用高级语言(例如C语言或者Python)编写的程序是无法直接烧录到我们的开发板上的。因此我们搭建开发环境的目的在于将我们使用高级语言编写的程序转换成为二进制文件(windows下扩展名常为.bin)。如下图 图1.1.1ESP能够读懂的二进制文件(由开发环境编译生成) ​ 在我们使用开发环境生成好上图所示的二进制文件,我们就可以通过ESP官方提供的下载工具或者通过命令行直接将程序下载到我们的开发板。 图1.1.2 官方提供的运行程序下载工具 图1.1.3 通过命令行下载程序到开发板 ​ 那么问题来了,我们的开发环境是如何将我们用高级语言写的程序,转换成二进制文件的呢。如下图所示,我们的高级语言程序(例如.c/.h文件)经过IDF和它内部集成的工具链生成二进制文件。那么IDF是什么呢,IDF是ESP32官方给我们提供的开发SDK,它集成了大量的软件组件,包括 RTOS、外设驱动程序、网络栈、多种协议实现技术以及常见应用程序的使用助手。他就相当于我们进行STM32开发过程中使用的固件库,但是它的功能更为强大。 图1.1.4 可执行文件的生成方式—由ESP32官方提供 ​ 以VSCode+IDF为例,我们的我们在VSCode中编写完毕代码程序后,利用乐鑫公司开发的插件可以将我们编写的高级语言程序编译为二进制文件,甚至你可以在VSCode中一键下载程序进入开发板(VSCode需要升级到最新版本)。好了啰嗦了这么多下面我们开始正式开始搭建ESP32开发环境吧。 1.2ESP32-IDF+VSCode开发环境搭建流程介绍 1.2.1安装前的准备 ​ 1)安装python3.8 环境 ​ 2)安装VSCode软件 ​ 3)安装C++编译环境 ​ 4)下载esp-idf-tools-setup-offline-2.10.exe(下载地址:https://dl.espressif.com/dl/esp-idf/?idf=4.4,先保存到迅雷云盘再下载) Python、VSCode和GCC的安装方法较为简单这里不再赘述,但是要特别注意,Python版本一定要大于3.8!!!!!!!!另外python和gcc一定要记得添加环境变量到电脑如下图。 图1.2.1 配置环境变量 python安装完成后在cmd控制台输入命令python检查是否真的安装完成,出现如下提示即为安装成功 C++编译环境搭建完成后在控制台输入gcc -v检查是否安装成功,安装成功则提示 1.2.2开始安装esp-idf-tools-setup-offline-2.10.exe ​ 1)双击esp-idf-tools-setup-offline-2.10.exe文件进入到安装页面出现下图,选择简体中文并确定 ​ 2)点击我同意然后下一步 3)然后就会进入安装环境检查,最好是推出360等杀毒软件,等待检查完毕后点击下一步即可 4)然后就进入到了我们ESP32库函数的放置目录,选择一个文件夹放置我们的IDF(建议选择C盘以外的文件夹)。IDF内部包含官方提供的例程以及固件库,是我们学习ESP32的重要工具。因为这里我们是离线安装,所以IDF不需要我们自己再去Git仓库上下载了(从Git上下载真的慢啊。。。)。这里我们选择的版本是v4.3.1最新版本(截止到2021.11.14),选择完毕后点击下一步。 5)然后我们进入到我们IDF-Tools工具的安装路径配置页面,建议选择C盘之外的空间进行安装,因为这个文件会非常大。IDF-Tools内部包含了我们编译C代码需要的工具,包括Cmake和Git工具等。 注:cmake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的编译过程。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性。CMake的组态栏取名为CMakeLists.txt。简单来说就是,我们在C代码中经常用include来包含外部接口<叫函数也行>,达到调用外部函数的目的。但是我们的C程序中文件经常互相包含关系非常复杂,如果我们使用命令行来进行人力链接的话会非常麻烦,有了Cmake我们只需要将调用关系通过CMakeLists.txt告诉CMake,链接工作就会由CMake自动帮我们完成。 配置完成后点击下一步。 6)这里我们先选择默认即可,点击下一步。 7)点击安装开始进入漫长的安装 8)进入到漫长的等待安装完成环节 9)开始安装驱动 10)安装驱动过程中会弹出如下对话框,点击安装 11)点击完成,完成安装 注意:安装完Tools后,可以在其安装目录下看到python安装目录,一定要通过命令E:\Programs.espressif\python_env\idf4.3_py3.8_env\Scripts\python.exe -m pip install --upgrade pip(安装目录下的python.exe文件,根据自己实际情况来) 更新pip否则安装过程会出错,另外如果安装过程中出现pip版本无法更新可以通过命令easy_install.exe pip进行修复或更新。如若以上方法仍旧无法进行pip升级,还可以通过清华大学镜像(https://pypi.tuna.tsinghua.edu.cn/simple/pip/),下载完whl离线包后,通过命令:***\python_env\idf5.0_py3.8_env\scripts\python.exe -m pip install pip-23.0.1-py3-none-any.whl,来进行更新。 注:一定要更新!!!! 1.2.3配置ESP-IDF插件 1)在VSCode的插件仓库中搜索ESP即会出现如图界面,点击Install进行安装(全程使用管理员权限运行vscode)

xcode命令行汇总-总有你不知道的

Xcode命令行工具提供了一系列有用的命令,可以帮助开发人员在终端环境下快速进行编译、打包、代码签名、调试等操作。以下是一些常用的Xcode命令行命令: xcodebuild:用于在终端环境下进行项目的编译、测试、打包等操作,支持多种参数,如指定工程文件路径、选择构建目标、指定代码签名等。 xcodebuild build:构建Xcode项目;xcodebuild clean:清理构建目录;xcodebuild test:运行Xcode项目的测试套件;xcodebuild analyze:对Xcode项目进行静态代码分析;xcodebuild archive:将Xcode项目打包成归档文件;xcodebuild exportArchive:导出打包好的Xcode项目;xcodebuild install:安装Xcode项目;xcodebuild uninstall:卸载Xcode项目;xcodebuild -list:列出Xcode项目的所有构建目标、方案和配置文件。 xcrun:用于管理和运行Xcode工具链中的命令行工具,包括但不限于clang、git、simctl等,支持多种参数,如选择工具链版本、指定运行环境等。 clang 命令可以编译C、C++、Objective-C和Objective-C++源代码;lipo 命令可以操作静态库和可执行文件的多个架构;otool 命令可以查看静态库和可执行文件的二进制文件;swift 命令可以编译Swift源代码;xcodebuild 命令可以构建、测试、打包和分发Xcode项目;instruments 命令可以执行性能测试和UI自动化测试。 xcode-select:用于管理Xcode命令行工具的版本和路径,支持设置当前使用的工具链路径、查看可用的Xcode版本列表等操作。 xctest:用于在终端环境下运行Xcode项目中的单元测试,支持多种参数,如指定测试目标、输出测试报告等。 xip:用于将Xcode项目打包成XIP(Xcode Installation Package)文件,方便分发和安装,支持多种参数,如指定输出路径、选择签名证书等。 xed:用于在终端环境下打开指定的文件或目录,支持多种参数,如打开文件时指定行号、选择编辑器等。 --launch 参数用于在打开项目或文件后启动Xcode; --wait 参数用于在打开项目或文件后等待Xcode关闭; xed命令还可以使用一些选项来打开指定类型的文件,例如使用-b或--background选项打开一个后台进程,并使用-s或--source选项打开一个源代码文件。 --no-wait 参数用于在打开项目或文件后不等待Xcode关闭,直接返回到终端;--line 或 --column 参数用于指定在打开文件后跳转到指定的行或列。 xcrun simctl:用于管理和运行模拟器,支持多种参数,如启动模拟器、安装APP、模拟GPS等。 list 子命令用于列出所有可用的模拟器;create 子命令用于创建一个新的模拟器;boot 子命令用于启动一个指定的模拟器;install 子命令用于安装一个APP到指定的模拟器;launch 子命令用于启动一个指定的APP;uninstall 子命令用于卸载一个指定的APP;delete 子命令用于删除一个指定的模拟器;snapshot 子命令用于创建或还原一个模拟器的快照;recordVideo 子命令用于录制模拟器屏幕的视频;screenshot 子命令用于截取模拟器屏幕的截图。 xcrun instruments:用于运行Xcode的Instruments工具,可以对APP进行性能分析、内存泄漏检测、UI测试等操作,支持多种参数,如指定模板、选择设备等。 -t 或 --template 参数用于指定运行的Instruments模板,例如使用Time Profiler模板进行时间性能分析,或使用Allocations模板进行内存泄漏检测;-w 或 --wait-for-apps 参数用于指定应用启动前等待的时间;-l 或 --launch 参数用于指定应用的Bundle Identifier,并启动应用;-d 或 --device 参数用于指定运行的设备类型;-e 或 --environment 参数用于指定运行应用时的环境变量;-s 或 --script 参数用于指定脚本文件路径,可以用来执行自定义脚本。 以上是一些常用的Xcode命令行命令,使用它们可以方便地在终端环境下进行各种开发和调试操作。需要注意的是,使用Xcode命令行工具前需要先安装Xcode,并在Xcode的“Preferences”中勾选“Command Line Tools”选项。

用python写一个支持加减乘除的简单计算器

# 计算器程序 def add(x, y): return x + y def subtract(x, y): return x - y def multiply(x, y): return x * y def divide(x, y): return x / y print("请选择运算:") print("1. 加") print("2. 减") print("3. 乘") print("4. 除") # 获取用户输入 choice = input("请输入你的选择(1/2/3/4):") num1 = float(input("请输入第一个数字:")) num2 = float(input("请输入第二个数字:")) if choice == '1': print(num1, "+", num2, "=", add(num1, num2)) elif choice == '2': print(num1, "-", num2, "=", subtract(num1, num2)) elif choice == '3': print(num1, "

TensorRT安装教程

一、使用tar安装TensorRT 使用nvcc -V 查看cuda版本,下载对应的TensorRT包 压缩包解压 tar xvf TensorRT-8.4.3.1.Linux.x86_64-gnu.cuda-11.6.cudnn8.4.tar 安装与自己的python环境对应的包 cd TensorRT-8.4.3.1/python pip install tensorrt-8.4.3.1-cp37-none-linux_x86_64.whl 将下面的语句写入~/.bashrc,并source ~/.bashrc export LD_LIBRARY_PATH=/<path/to/tensorrt>/TensorRT-8.4.3.1/lib:$LD_LIBRARY_PATH 二、确保安装了cudnn 上面的TensorRT对应的cudnn版本是8.4。 xz -d cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive.tar.xz tar -xvf cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive.tar 将下面的语句写入~/.bashrc,并source ~/.bashrc export LD_LIBRARY_PATH=/<path/to/cudnn>/cudnn-linux-x86_64-8.4.0.27_cuda11.6-archive/lib:$LD_LIBRARY_PATH

数据倾斜、数据漂移及hiveSQL优化

1. ODS 层采用什么压缩方式和存储格式? 压缩采用 Snappy ,存储采用 orc ,压缩比是 100g 数据压缩完 10g 左右。 2. DWD 层做了哪些事? 1.、数据清洗 空值去除过滤核心字段无意义的数据,比如订单表中订单 id 为 null,支付表中支付id 为空对手机号、身份证号等敏感数据脱敏对业务数据传过来的表进行维度退化和降维。将用户行为宽表和业务表进行数据一致性处理 2、 清洗的手段 Sql、mr、rdd、kettle、Python(项目中采用 sql 进行清除) 3.、DWS 层做了哪些事? 1.、DWS 层有 3-5 张宽表(处理 100-200 个指标 70%以上的需求) 具体宽表名称:用户行为宽表,用户购买商品明细行为宽表,商品宽表,购物车、宽表,物流宽表、登录注册、售后等。 2.、哪个宽表最宽?大概有多少个字段? 最宽的是用户行为宽表。大概有60-100 个字段 4、数据漂移 4.1、什么是数据漂移及情况 通常是指ods表的同⼀个业务⽇期数据中包含了前⼀天或后⼀天凌晨附近的数据或者丢失当天变更的数据,这种现象就叫做漂移, 4.2、解决数据漂移思路 两种方法: **方法一:**多获取一点后⼀天的数据,保障数据只多不少(简单粗暴) **方法二:**第⼀种⽅案⾥,时间戳字段分为四类: 数据库表中⽤来标识数据记录更新时间的时间戳字段(假设这类字段叫modified time )。数据库⽇志中⽤来标识数据记录更新时间的时间戳字段·(假设这类宇段叫 log_time)。数据库表中⽤来记录具体业务过程发⽣时间的时间戳字段 (假设这类字段叫 proc_time)。标识数据记录被抽取到时间的时间戳字段(假设这类字段 extract time)。 理论上这⼏个时间应该是⼀致的,但往往会出现差异,造成的原因可能为: 数据抽取需要⼀定的时间,extract_time 往往晚于前三个时间。 业务系统⼿动改动数据并未更新 modfied_time。 ⽹络或系统压⼒问题,log_time 或 modified_time 晚于 proc_time。 通常都是根据以上的某⼏个字段来切分 ODS 表,这就产⽣了数据漂移。具体场 景如下: 1、根据 extract_time 进⾏同步。

如何将CAJ文件转换成PDF格式?分享两种实用的方法

CAJ是一种特定的文献格式,通常用于中国学术期刊和学位论文等。在学习生活中我们查阅一些文献资料,一些权威文献报刊通常情况下都是CAJ文件格式,打开它需要使用专业的阅读工具 ,这时候就需要将它转换成PDF格式,方便我们阅读。如何将CAJ文件转换成PDF格式?分享两种实用的方法 第一种、使用CAJ Viewer软件将其打印为pdf 1.下载并安装CAJViewer软件。可以从中国知网官网下载该软件,或从其他网站下载。 2.打开CAJViewer软件,将需要转换的CAJ文件打开。 3.点击“文件”选项卡,然后选择“打印”选项卡。 4.点击“打印机”一栏中的“名称”下拉框,选择“Microsoft Print to PDF”或“Foxit PDF Editor Printer”或“Adobe PDF”选项,开始将CAJ文件转换为PDF文件。 第二种、使用在线转换工具将CAJ转换为PDF 这里我们使用记灵在线工具 1.我们搜索公众号:记灵 2.点击在线使用,搜索CAJ,然后点击CAJ转PDF 3.上传需要转换的CAJ文件,完成后点击下载就可以了。 总之,以上二种方法都可以将CAJ文件转换为PDF文件。您可以根据个人偏好和需要,选择其中一种方法来完成操作。

【Unity基础框架】YooAsset 学习(一)

YooAsset 学习记录 跟着b站视频+文档学习的 地址:https://github.com/tuyoogame/YooAsset b站视频:https://space.bilibili.com/328590743文档看它项目里的就行 YooAsset 基于的原理也是来源于Unity的 AssetBundle 和 Addressable AssetBundle的原理及最佳实践 YooAsset简介 具体的简介项目里都有,就简单截一些了 1.Editor 1.1导入YooAsset 直接看文档。 总共三种,用的是这种 1.2 全局配置 在Resources下新建 YooAsset 配置文件 1.3 资源配置 配置直接看文档 1.3.1 AutoCollectShaders 新版已经没有这个选项了。 ShaderVariant Collector 仍在 旧版: 搜集所有Group内的材质球,把它们的shader打入一个包内 这里设置好后打开 为了防止Shader资源荣誉,点击搜集变种生成 点击完毕后,会跳到它给我们的一个所有Shader的材质球展示界面。以及生成了 ShaderVariants 的搜集结果文件 然后在热更资源目录新建一个文件夹,放入这个配置文件 然后在YooAsset打包配置里新建一个它的收集器 专门为它自定义一个打包规则 这里返回的名称和Shader Bundle Name一致 最后给搜集器换成自定义的打包规则类即可 1.4 资源打包 记录一些配(详细配置请看文档,只记录了部分) Build Pipeline 构建管线 BuiltinBuildPipeline: 传统的内置构建管线。ScriptableBuildPipeline: 可编程构建管线。 Build Mode 构建模式 强制构建模式:会删除指定构建平台下的所有构建记录,重新构建所有资源包。增量构建模式:以上一次构建结果为基础,对于发生变化的资源进行增量构建。演练构建模式:在不生成AssetBundle文件的前提下,进行演练构建并快速生成构建报告和补丁清单。模拟构建模式:在编辑器下配合EditorSimulateMode运行模式,来模拟真实运行的环境。 Output Name Style 输出的资源包文件名称样式 HashName:哈希值HashName_Extension:哈希值+后缀名HashName_BundleName_Extension:资源包名+哈希值+后缀名 Copy Buildin File Option 首包资源文件的拷贝方式 None:不拷贝任何文件ClearAndCopyAll:先清空已有文件,然后拷贝所有文件ClearAndCopyByTags:先清空已有文件,然后按照资源标签拷贝文件OnlyCopyAll:不清空已有文件,直接拷贝所有文件OnlyCopyByTags:不清空已有文件,直接按照资源标签拷贝文件 重要概念

k8s查看日志命令—2023.02

查看k8s中pod日志命令: kubectl logs -f pod/[pod名称] -n [命名空间名称] 假设现在要查coredns-7ff77c879f-9bsbx 这个pod的日志,可以使用如下命令: kubectl logs -f pod/coredns-7ff77c879f-9bsbx -n kube-system kubectl logs --tail 200 -f coredns-7ff77c879f-9bsbx -n kube-system #查看最后200行的日志 kubectl logs --since=1h coredns-7ff77c879f-9bsbx #查看名称为coredns-7ff77c879f-9bsbx这个pod最近一小时的日志

VMware安装虚拟机(小白看了都会哦)

一、什么是VMware VMware是一款运行在windows系统上的虚拟机软件,可以虚拟出一台计算机硬件,方便安装各类操作系统。如Windows、Macos、Linux、Unix等等。 虚拟机(VM)是一种创建于物理硬件系统(位于外部或内部)、充当虚拟计算机系统的虚拟环境,它模拟出了自己的整套硬件,包括 CPU、内存、网络接口和存储器。通过名为虚拟机监控程序的软件,用户可以将机器的资源与硬件分开并进行适当置备,以供虚拟机使用。 配备了虚拟机监控程序(例如基于内核的虚拟机(KVM))的物理机被称为主机器、主机计算机、主机操作系统,或简称为主机。使用其资源的诸多虚拟机被称为虚拟客户机、虚拟客户计算机、虚拟客户机操作系统,或简称为虚拟客户机。虚拟机监控程序把计算资源(如 CPU、内存和存储器)视为一组可以在现有的虚拟客户机之间或向新的虚拟机进行重新分配的资源。 虚拟机隔离、独立于系统的其余部分,而且单个硬件(如服务器)上可以有多个虚拟机。您可以根据自己的需要在主机服务器之间移动这些虚拟机,更有效地利用资源。 虚拟机允许在一台计算机上同时运行多个不同的操作系统,比如一台 MacOS 笔记本电脑上也装了 Linux 发行版。每个操作系统的运行方式与通常操作系统或应用在主机硬件上使用的运行方式相同,因此在虚拟机中获得的最终用户体验与物理机上的实时操作系统体验也几乎毫无二致。 二、VMware的安装 VMware下载地址: 下载 VMware Workstation Pro - VMware Customer Connect 1.首先,下载VMware安装包,这里我下载的版本是pro16 下载完之后进行安装 2.然后点击下一步,到了这里可以按照自己的需求,自己选择安装位置,然后一路下一步,最后进行安装 安装完成结果图,如下图所示 3.VMware是一款商业软件,在使用时通常需要输入许可证。如果不输入许可证,先有几十天的试用期,之后就可能无法使用VMware的所有功能,一般许可证可以在百度能搜到,输入许可证后,打开的VMware界面就是这样啦 三、安装虚拟机 安装虚拟机之前首先需要下载好需要的镜像,我这里采用的是CentOS镜像,下面是CentOS的下载地址 Index of /centos/7.9.2009/isos/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择你需要的,一般下载DVD标准安装版就行 镜像下载好了以后,就可以新建虚拟机了 选择典型,然后再点击下一步 由于我们选择的是DVD镜像,所有我们选择稍后安装操作系统,然后再点击下一步 因为我们学习的就是Linux所有我们客户机选择Linux(L),版本我们选择之前下载好的CentOS镜像的版本,然后再点击下一步 自己定义喜欢的名字来作为虚拟机的名称,并设置好虚拟机的位置,然后再点击下一步 最大磁盘大小不能小于20G,一般是选择20G,然后选择将虚拟磁盘拆分成多个文件,然后再点击下一步 点击自定义硬件,进行相关硬件的配置 根据自己的需求,来进行配置虚拟机内存,因为我进行的是最小化安装,所有选择的是1GB 处理器选择两个,内核一个 然后把刚刚下载好的CentOS镜像进行使用 配置完成后,点击关闭,最后点击完成 然后新的虚拟机就建成啦 四、NAT网络配置 检查本地DHCP服务是否将IP地址分配给虚拟机,这涉及到之后虚拟机有没有网络,如若没有就要进行一下步骤 先将虚拟机网络编辑器打开 点击NAT模式,然后进入管理员模式,然后勾选本地DHCP服务是否将IP地址分配给虚拟机,然后点击应用,最后点击确定退出 五、虚拟机初始化配置 启动虚拟机 鼠标点进虚拟机,然后回车 根据自己的需要选择语言,我这里选择简体中文 因为我这里安装就是最小安装,所有软件选择可以不用管,如果有的朋友不想最小安装,就要点击软件选择其他的了 点击安装位置 选择自动配置分区,选好好点击完成退出 进入网络和主机名,打开以太网,这涉及到之后安装的虚拟机是否有网络 然后点击开始安装 然后分别进行root密码(很重要)的设定和普通用户的创建 如果密码不足八位数,则需要点击两次完成才能行 普通用户的名字根据自己需求来写,然后点两次完成退出 点击完成配置

群晖设置流量控制后进不去系统

1、背景 由于最近nas一直偷跑科学上网流量,想找找真凶,于是在控制面板中设置了流量控制策略10KB/s,于是乎保存之后刷新就再也进不去系统了,尝试了各种办法,无济于事。 一度想过按reset按钮直接重置(可以重置密码以及网络),没舍得。 随后请求群晖工程师,成功解决进不去系统的问题 2、解决方法 方法如下,通过直连的方式,看看是否能够登入NAS: 1.将您的计算机与NAS用一根五类以上的网线直接连接。 2.将您的电脑网络配置更改为DHCP模式(自动获得IP地址)。 3.PC 端打开 Synology Assistant 搜索并链接 NAS。

链路追踪及其常用工具

简介 链路追踪(distributed tracing)是指通过记录分布式系统中各个组件之间的调用和传输信息的过程,来跟踪和分析请求在系统中的运行情况和性能问题的技术。在分布式系统中,一次请求可能涉及多个微服务的协同工作,链路追踪能够帮助我们更好地了解整个请求的流程,诊断问题、优化性能。 链路追踪的核心思想是将请求的跟踪信息在整个请求链路中传递,这样可以将请求的调用过程串联起来,形成一个完整的请求链路,从而快速定位出问题所在。 链路追踪的实现通常分为四个阶段: 1. 生成追踪信息:请求进入系统时,生成一个全局唯一的追踪标识符(trace ID)和一个局部唯一的标识符(span ID)。 2. 传递追踪信息:将追踪信息添加到请求头或者上下文中,在请求链路中的各个组件之间传递。 3. 采集和存储追踪数据:在各个组件中采集请求的追踪数据,例如请求时间、响应时间、调用的服务名称等,并将这些数据存储到一个共享的存储中。 4. 展示追踪数据:通过可视化界面展示整个请求的追踪数据,包括请求的调用链路、请求的各个组件的响应时间等,帮助开发人员快速诊断问题。 一般来说,链路追踪需要依赖于一个追踪系统来实现。常见的开源追踪系统包括 Zipkin、Jaeger、SkyWalking 等,这些系统提供了一些常用的 API 和插件,方便开发人员在不同的语言和框架中接入和使用。在实际使用中,我们需要对链路追踪进行配置和集成,以便能够实时监控分布式系统的运行状态,并及时诊断和解决问题。下面分别对几种链路追踪工具进行简单介绍: zipkin Zipkin是一个开源的分布式跟踪系统,用于解决分布式系统中的性能问题。它可以帮助开发人员快速发现和解决服务之间的调用延迟、故障等问题。下面是关于Zipkin的一些详解: 1.Zipkin的工作原理 Zipkin的工作原理是在应用程序中添加跟踪数据,这些数据会被发送到Zipkin服务器进行存储和分析。Zipkin客户端会生成跟踪信息,并将其发送到Zipkin服务器。跟踪信息包括每个请求的唯一标识符、开始和结束时间戳以及其他元数据。Zipkin服务器会存储跟踪信息,并将其显示在Web界面中,以便用户可以查看跟踪信息并分析它们。 2.Zipkin的组成部分 Zipkin主要由四个组成部分组成:收集器、存储器、查询器和Web界面。收集器负责接收和存储跟踪数据,存储器负责存储跟踪数据,查询器负责查询和分析跟踪数据,Web界面用于显示跟踪信息。 3.Zipkin的使用场景 Zipkin适用于分布式系统中的调用链跟踪和性能分析,特别是在微服务架构中非常有用。在分布式系统中,服务可能分布在多个不同的计算机上,并且服务之间的调用关系很复杂,因此需要一个跟踪系统来跟踪整个调用链并分析性能问题。 4.Zipkin的优点 Zipkin具有以下优点: 分布式跟踪:支持跟踪分布式系统中的请求调用链。高度可扩展:能够处理大量跟踪数据。可视化:具有直观的Web界面,方便用户查看和分析跟踪信息。开源:Zipkin是一个开源项目,可以自由使用和定制。 5.Zipkin的局限性 Zipkin的局限性包括: Zipkin跟踪信息的粒度较粗,无法记录请求和响应之间的详细信息。Zipkin需要在应用程序中添加额外的代码来生成跟踪信息。Zipkin需要部署和维护Zipkin服务器,增加了系统的复杂性。 6.Zipkin的实现方式 Zipkin的实现方式包括两种:单体式和分布式。 单体式的Zipkin可以将所有的收集器、存储器、查询器和Web界面都打包在一个应用程序中,适用于小型系统或测试环境。这种方式的优点是简单易用,缺点是无法满足大型系统的需求。 分布式的Zipkin则将不同的组件分别部署在不同的服务器上,适用于大型系统或生产环境。这种方式的优点是高度可扩展,能够处理大量跟踪数据,缺点是部署和配置较为复杂。 7.Zipkin的集成方式 Zipkin可以与各种应用程序和框架集成,包括Spring Boot、Netflix OSS、gRPC、Thrift等。集成方式主要包括添加Zipkin客户端依赖和配置Zipkin服务器地址等。 8.Zipkin的使用案例 Zipkin在互联网公司、金融公司、电商公司等各行各业中都有广泛的应用。例如,Netflix在其微服务架构中使用Zipkin来跟踪和分析请求调用链,阿里巴巴也在其微服务架构中使用了Zipkin。 jager Jaeger是一款开源的分布式跟踪系统,旨在帮助开发人员和SRE(Site Reliability Engineer)解决微服务架构中的性能问题。下面是有关Jaeger的详解: 1.Jaeger的工作原理 Jaeger的工作原理是通过向应用程序添加跟踪数据来捕获请求调用链。跟踪数据包括唯一的跟踪ID、开始和结束时间戳以及其他元数据。Jaeger客户端将跟踪数据发送到Jaeger代理,代理将数据存储在Jaeger存储器中。Jaeger存储器负责存储和查询跟踪数据,Jaeger查询器用于查询和可视化跟踪数据。Jaeger Web界面提供了直观的UI来查看跟踪数据。 2.Jaeger的组成部分 Jaeger主要由以下组成部分组成:客户端、代理、存储器、查询器和Web界面。客户端负责向应用程序添加跟踪数据,代理负责接收和处理跟踪数据,存储器负责存储和查询跟踪数据,查询器负责查询和分析跟踪数据,Web界面用于显示跟踪信息。 3.Jaeger的使用场景 Jaeger适用于分布式系统中的调用链跟踪和性能分析,特别是在微服务架构中非常有用。Jaeger可以帮助开发人员快速发现和解决服务之间的调用延迟、故障等问题。 4.Jaeger的优点 Jaeger具有以下优点: 分布式跟踪:支持跟踪分布式系统中的请求调用链。高度可扩展:能够处理大量跟踪数据。可视化:具有直观的Web界面,方便用户查看和分析跟踪信息。开源:Jaeger是一个开源项目,可以自由使用和定制。 5.Jaeger的局限性 Jaeger的局限性包括: Jaeger跟踪信息的粒度较粗,无法记录请求和响应之间的详细信息。Jaeger需要在应用程序中添加额外的代码来生成跟踪信息。Jaeger需要部署和维护Jaeger服务器,增加了系统的复杂性。 6.Jaeger的实现方式 Jaeger的实现方式包括两种:单体式和分布式。 单体式的Jaeger可以将所有的代理、存储器、查询器和Web界面都打包在一个应用程序中,适用于小型系统或测试环境。这种方式的优点是简单易用,缺点是无法满足大型系统的并发压力。 skywalking Apache SkyWalking是一个分布式应用程序性能监测系统,支持跨多种编程语言和多种分布式系统的监测,它具有以下的特点: 1.SkyWalking的架构 SkyWalking采用了插件化的架构,可以根据需求选择性地启用不同的插件,以支持多种编程语言和分布式系统的监测。SkyWalking的架构主要由四个组件组成:探针、收集器、存储器和Web UI。探针负责向应用程序添加监测数据,收集器负责收集和处理监测数据,存储器负责存储监测数据,Web UI提供了直观的UI来查看监测数据。

burpsuite_pro_v2022.3版本(jdk18、burpsuite_pro_v2022.3、burp-load-key.jar)官方下载链接(提供版本过多,自行查看正文)

burpsuite_pro_v2022.3版本(jdk18、burpsuite_pro_v2022.3、burp-load-key.jar)官方下载链接(提供版本过多,自行查看正文) 一、下载地址1、个人网盘提供2022.3jar版本、jdk18版本、key生成批处理脚本2、burpsuite官网下载地址2.1 2022-03版本下载页面2.2 2022-08-1版本下载页面2.3 2022-09-5版本下载页面2.4 2022-12-6版本下载页面2.5 2023-01-02版本下载链接 二、运行方法 burpsuite_pro_v2022.3版本(pro版)(jdk18、burpsuite_pro_v2022.3、burp-load-key.jar) 2022-08-1版本(专业版) 2022-09-5版本(专业版) 2022-12-6版本(社区版、专业版、pro版) 2023-01-2版本(PRO版本、专业版) burpsuite_pro_v2022.3版本、2022-08-1版本、2022-09-5版本、2022-12-6版本均在下方提供官网下载链接 一、下载地址 废话不多说,先放干货 从2022.3jar版本开始,依赖组件相同。所以先下载度娘里面的依赖组件(java、key生成批处理脚本、启动批处理脚本) 本人的网盘只提供2022.3jar版本和其他版本的依赖组件下载(原因是懒和没时间整理),其他版本放出官网下载地址,可以复制到任何浏览器进行回车直接弹出文件下载。 1、个人网盘提供2022.3jar版本、jdk18版本、key生成批处理脚本 由于程序过大,考虑很多人没有度娘盘盘的会员,单独放链接,用哪个下那个。 生成key程序下载链接 链接:https://pan.baidu.com/s/1qfLSA4_1G0ipXz5Au-GobA?pwd=z348 提取码:z348 jdk18下载链接 链接:https://pan.baidu.com/s/1I-LA1Cqyf6pdAi4OySJWaw?pwd=t8wy 提取码:t8wy 批处理启动文件 文件内容在下方 burpsuite burpsuite体积较大(500M+),度娘太特喵的慢了(忍不住骂*),不嫌度娘慢的直接用我分享的链接也行。 嫌慢的去官网下载速度快,下载直链在下面,版本很多,自己挑! 度娘下载 (burpsuite_pro_v2022.3.jar、jdk18、burp-load-key.jar,大小600M,手机热点的同学请注意自己的流量) 度娘下载链接:https://pan.baidu.com/s/1enpjCITt8XiR94uaJDl5RA?pwd=tjnv 提取码:tjnv 2、CSDN拒绝我上传所有版本,因为版权问题不让上传。不限速的阿里云盘不让分享zip文件(忍不住又要骂*) · · 2、burpsuite官网下载地址 2.1 2022-03版本下载页面 https://portswigger.net/burp/releases/professional-community-2022-3 2.2 2022-08-1版本下载页面 https://portswigger-cdn.net/burp/releases/download?product=pro&version=2022.8.1&type=Jar 2.3 2022-09-5版本下载页面 https://portswigger-cdn.net/burp/releases/download?product=pro&version=2022.9.5&type=Jar 2.4 2022-12-6版本下载页面 此版本号的有三个版本,前两个版本最好,最后一个版本差一点。 pro版本 https://portswigger-cdn.net/burp/releases/download?product=pro&version=2022.12.6&type=Jar 专业版本 https://portswigger.net/burp/releases/download/professional-community-2022.12.6.jar 社区版本 https://portswigger-cdn.net/burp/releases/download 2.5 2023-01-02版本下载链接 2023.1.2版本下载直链 pro版本 https://portswigger-cdn.net/burp/releases/download?product=pro&version=2023.1.2&type=Jar professional版本 https://portswigger.net/burp/releases/download/professional-community-2023.1.2.jar 2023.1.2版本官网页面 https://portswigger.net/burp/releases/professional-community-2023-1-2?requestededition=professional&requestedplatform= 各版本区别自行去官网查看。我已经懒着更新版本的区别了。 二、运行方法 PS:不太重要的文字内容使用斜体加删除线

xshell连接不到虚拟机的解决办法

首先检查虚拟机是否可以正常联网,可以使用ping www.baidu.com 如果ping不通或者出现www.baidu.come: 未知的名称或服务说明网络配置有问题需要重新配置虚拟机网络 检查网络配置文件:vim /etc/sysconfig/network-scripts/ifcfg-ens33如下图 将BOOTPROTO="dhcp" 改成 BOOTPROTO="static",将ONBOOT="on" 改成 ONBOOT="yes" 在最后加上用红圈圈出来的内容 IPADDR=192.168.122.232 #ip地址,地址要和网关在同一网段,这里简单来说就是ip地址的前三段和网关的前三段要相同,即192.168.122 #使用ifconfig查看 NETMASK=255.255.255.255 #子网掩码 GATEWAY=192.168.80.2 #设置网关,自己虚拟机的网关在虚拟机的编辑--->虚拟网络编辑器里边去看 然后重启网络 service network restart 重新按照新的地址连接xshell ———————————————— 版权声明:本文为CSDN博主「塞班呢」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/a18307096730/article/details/120326265