type 和 interface区别

interface只能定义对象数据结构类型。 // 简单案例1 interface User { name: string; age: number; sex?: string; } let user: User = { name: '', age: 233 }; // 简单案例2 interface User1<T> { name: string; age: number; sex?: string; details?: T; } const userObj: User1<{ hobby: string; }> = { name: '', age: 233, details: { hobby: '爱好吃饭', } }; type侧重于直接定义类型 type 还可以给一个或多个类型起一个新名称(当变量用) type Demo = string | number; // 赋值 let test1: Demo = 1; let test2: Demo = ''; type当然也能定义对象类型

nginx的启动报错和80端口被占用

在公司,大佬表示:你nginx有用吗?没有的话装一下nginx吧,用nginx做下代理。 大佬怎么说就这么做,按部就班安装完nginx后发现启动之后就一闪而过,任务管理器中也没有 nginx进程。 nginx有一个logs文件目录,打开看是里面的error.log会记载什么错。 此处我报的错误是: 10013: An attempt was made to access a socket in a way forbidden by its access permissions 错误原因是绑定80端口错误,说明80端口被占用,nginx绑定失败。 那么只需要杀掉占用80端口的进程就可以了。 PS:如果是PID=4的进程占用了80端口,任务管理器显示:NT Kernel & System PID=4 进程占用80端口,那么看大佬的这一篇文档: window系统80端口被占用 ,解除了NT Kernel & System PID=4 进程占用80端口_影子2401的博客-CSDN博客

Intel Realsense D400系列相机自校准细节,减少踩坑!!

自校准(对任意环境非白墙 注意距离0.4-2米之间,深度(相机拍摄内容中物体所占空间)≥50%) ①:打开Intel realSense viewer ②:连接设备(注意要用3.0USB,可以通过显示3.x判断)后,选择more->Install Recommended Firmware(推荐安装固件)更新固件 ③:选择more->on-Chip Calibration(片上校准) ③:会打开如下图Intrinsic内参调节 Extrinsic外参调节 选择calibrate开始校准(以内参调节为例) ④:得到下图 等待进度条加载完成(注意距离以及深度可能会影响自校准,导致校准失败报错:occ all calibraton cannot work with this camera 如果出现这样报错只需要改变相机到目标物体距离以及摄像机镜头里物体深度占比) 上方出现的弹窗中,我们能够看到两项数值Health-Check(下面简称HC)和FL Health-Check(下面简称FL HC) 校准标准: 当HC<0.25,FL HC<0.15,我们可以保留原有校准数据,即点击“Dismiss”忽略。 当HC>0.25,FL HC>0.15,我们需要改善原有校准数据,即点击“Apply New”应用新的校准数据,并且再运行一次On-Chip Calibration ,继续观察两项数值,直至它们分别低于0.25和0.15, 若HC或FL HC>0.75,原有校准数据必须要进行改善,并且建议直接使用动态校准或OEM校准(Intel英特尔RealSense实感深度摄像头 OEM校准操作步骤讲解OEM Calibration 恢复出厂精度)

本地代码上传到gitlab

两种方式的说明,如果是以学习的目的,建议使用第一种方式;如果是为了快速把代码上传到gitlab,建议使用第二方式; 查看git配置的命令,注意:不同的目录,配置项也不尽相同:git config --list 一、第一种方式: 首先确认本地PC已经安装了git。 1、在本地代码目录中,鼠标右键Git Bash Here,会打开一个git命令操作窗口; 2、执行git init命令,此命令会在当前目录下创建一个.git文件夹, git init 3、设置用户名和邮箱(不是必须的) git config --global user.name '用户名' git config --global user.email '邮箱' 修改用户名和邮箱 git config --global --replace-all user.name '用户名' git config --global --replace-all user.email '邮箱' 4、将项目的所有文件添加到仓库中,注意add与点(.)中间空格 git add . 5、这个命令会把当前路径下的所有文件,添加到待上传的文件列表中。如果想添加某个特定的文件,只需把 . 换成特定的文件名即可 6、将add的文件commit到本地git仓库,添加说明'init' git commit -m 'init' 7、然后在gitlab或gitee或github里面创建一个代码仓库,得到一个仓库地址; 8、将本地的仓库关联到gitlab上, git remote add origin http://gitlab地址/java/project.git 9、上传代码到github远程仓库 git push -u origin master 二、第二种方式 1、先在gitlab上建立一个代码仓库,然后获取仓库地址 http://gitlab.ctvit.tv/develop/news-captor.git 2、将本地的仓库关联到gitlab上 git remote add origin http://gitlab.

Target class [CommandMakeCommand] does not exist。问题解决。

前两天用composer导入依赖包的时候怎么导入都提示Target class [CommandMakeCommand] does not exist。错误,后来排查下来发现是nwidart/laravel-modules包出的问题,后来百度大部分都是composer dump-autoload要先用这个命令,自己试了一下运行这个也不好使。 最后找到了Introduction - Laravel Modules Docs这个网址知晓了原因所在,然后找到了项目根目录下config目录的modules.php文件对它进行了编辑,首先添加use Nwidart\Modules\Commands; 之后将命令commands数组替换为: 'commands' => [ Commands\CommandMakeCommand::class, Commands\ComponentClassMakeCommand::class, Commands\ComponentViewMakeCommand::class, Commands\ControllerMakeCommand::class, Commands\DisableCommand::class, Commands\DumpCommand::class, Commands\EnableCommand::class, Commands\EventMakeCommand::class, Commands\JobMakeCommand::class, Commands\ListenerMakeCommand::class, Commands\MailMakeCommand::class, Commands\MiddlewareMakeCommand::class, Commands\NotificationMakeCommand::class, Commands\ProviderMakeCommand::class, Commands\RouteProviderMakeCommand::class, Commands\InstallCommand::class, Commands\ListCommand::class, Commands\ModuleDeleteCommand::class, Commands\ModuleMakeCommand::class, Commands\FactoryMakeCommand::class, Commands\PolicyMakeCommand::class, Commands\RequestMakeCommand::class, Commands\RuleMakeCommand::class, Commands\MigrateCommand::class, Commands\MigrateRefreshCommand::class, Commands\MigrateResetCommand::class, Commands\MigrateRollbackCommand::class, Commands\MigrateStatusCommand::class, Commands\MigrationMakeCommand::class, Commands\ModelMakeCommand::class, Commands\PublishCommand::class, Commands\PublishConfigurationCommand::class, Commands\PublishMigrationCommand::class, Commands\PublishTranslationCommand::class, Commands\SeedCommand::class, Commands\SeedMakeCommand::class, Commands\SetupCommand::class, Commands\UnUseCommand::class, Commands\UpdateCommand::class, Commands\UseCommand::class, Commands\ResourceMakeCommand::class, Commands\TestMakeCommand::class, Commands\LaravelModulesV6Migrator::class, ], 保存之后问题就解决了。

Ubuntu 20.04安装Docker及相关设置

在配置和部署深度学习训练环境时,往往会遇到conda创建的虚拟环境不好用的情况,这时使用Docker就可以解决很多麻烦。 本篇遵循Docker官网的安装指导进行操作。 首先说明,Docker Engine和Docker Desktop是不同的,这里使用常用的Engine。 1、安装前的准备工作 (1)确保系统满足安装条件 (2)如果之前安装了旧版本,需要卸载。 (3)支持的存储驱动 2、安装方法 多数情况下,推荐使用创建Docker仓库,从仓库进行安装,这样安装以及升级都方便。还可以通过下载deb文件包,然后手动安装,以后也需要手动升级,没有网络的情况下可以使用该方法。使用便捷脚本进行安装。使用Ubuntu自身仓库安装,可能并不总是最新版本。 (1)第一次安装需要创建Docker仓库,然后从仓库安装和更新Docker。 更新apt 包索引,安装各种依赖包,从而允许apt通过HTTPS来使用仓库 sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release 添加Docker 官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 使用以下命令来创建稳定仓库, echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null (2)安装Docker Engine 更新apt包索引,安装最新版本的Docker Engine,containerd,Docker Compose。安装指定版本,请见官网(此处省略)。 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin 验证Docker已经正确安装完成,运行hello-world镜像。输出以下信息即说明安装OK。 sudo docker run hello-world Docker安装后自动运行,同时docker group也创建完成,但还没有用户被添加进去,现在需要用sudo运行docker命令。

Postman接口测试-rsa加密

在使用postman进行接口测试的时候,有的请求头是ras加密后的字符串,例如我要测试的接口,签名是三个参数拼接后进行rsa加密,且拼接的参数中有时间戳(5分钟失效),手工加密就很不友好,我们可以用postman中的前置脚本进行rsa加密设置环境变量 rsa加密操作如何使用代码实现? ####在Postman中pre-request script的具体实现: if (!pm.globals.has("forgeJS")) { pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", function (err, res) { if (err) { console.log(err); } else { pm.globals.set("forgeJS", res.text()); } }) } else { eval(postman.getGlobalVariable("forgeJS")); // 公钥 const public_key = '-----BEGIN PUBLIC KEY-----\n'+ '(这里输入开发给的公钥)\n' + '-----END PUBLIC KEY-----' var publicKey = forge.pki.publicKeyFromPem(public_key); // 需要加密的字符串,博主的需要加密的字符串是三个字符串拼接的,大家按实际需求进行修改 var time = require('moment')().format("YYYYMMDDHHmmss");//时间 var account = pm.environment.get("account"); var access_secret = pm.environment.get("abc_access_secret") var a = account+"&"+access_secret+"&"+time; //rsa加密得到签名 var encryptedText = forge.util.encode64(publicKey.encrypt(a, 'RSAES-PKCS1-V1_5', { md: forge.

用matlab进行xlsx表格的提取和操作

用matlab进行xlsx表格的提取和操作 一、数据的提取二、垃圾数据的清除三、数据的分类四、图像的绘制 在学习数学建模时,我们会碰到大数据的问题,这类问题通常要进行数据预处理,这是我用matlab进行预处理的一些经验总结。数据预处理通常分为三步,缺失值、异常值的检测与处理,数据标椎化,数据的降维。本文我们以2020年数学建模国赛C题为例,讲解xlsx表格的提取和分类。 一、数据的提取 用xlsread函数进行数据的提取。 xlsread函数语法: num = xlsread(filename) num = xlsread(filename,sheet) num = xlsread(filename,xlRange) num = xlsread(filename,sheet,xlRange) num = xlsread(filename,sheet,xlRange,‘basic’) [num,txt,raw] = xlsread(___) ___ = xlsread(filename,-1) [num,txt,raw,custom] = xlsread(filename,sheet,xlRange,‘’ filename:要提取的文件名(也可以是文件路径);num:返回的double型的数据矩阵(字符串类型的数据在该矩阵中显示为NaN);sheet:要提取的表格页数或页名称;xlRange:提取数据的范围,使用Excel 范围语法,例如 ‘A1:C3’;txt:在元胞数组中返回文本字段,数据类型的元素在元胞中为空值;raw:在元胞数组中返回数值数据和文本数据 另外在最新版本中还有readtable,readmatrix,readcell函数可以进行数据的提取,具体函数语法可以在MATLAB官网查询学习。 要处理的表格预览 观察上表格,其中既有文本数据,又有数值数据,所以我们用[num,txt,raw] = xlsread(___)提取表格中数据保证所有的数据都能够被提取。 matlab代码:[num,txt,raw] = xlsread('附件1:123家有信贷记录企业的相关数据.xlsx',2) 二、垃圾数据的清除 提取到表格中的所有数据,我们就可以用矩阵的语法对其进行操作了。可以看到表格中的最后一列中含有作废发票,故我们要将其删除,基本思路是找到第八列所有的“作废发票”返回其的行指标,将这些行删除。 提取出第八列 因为raw的第一行是对应列的标题,所以我们从第二行开始 L8 = raw(2:end,8) 找出第八列中是“作废发票”的元素 tf = strcmp('作废发票',L8); strcmp函数可以判断字符串数组中的元素是否和给定的字符串完全相同,如果完全相同返回1,否则返回0,tf是一个和L8大小相同的double矩阵。 返回对应行指标并清空 index = find(tf==1); %去除作废发票 raw(index+1,:) = []; find函数可以返回满足括号中关系式的元素的指标,因为我们从第二行开始查找,令index+1行等于[ ],相当于对第index+1行进行删除,删除之后元胞数组的大小也变化。 三、数据的分类 数据的分类主要有两方面,一方面是公司的分类,另一方面是日期的分类,为了方便,我们将raw的每一列复制给一个变量。 L1 = raw(2:end,1);L2 = raw(2:end,2);L3 = raw(2:end,3);L4 = raw(2:end,4); L5 = raw(2:end,5);L6 = raw(2:end,6);L7 = raw(2:end,7);L8 = raw(2:end,8); 找出所有的公司名称

Charles的基础使用教程

一、安装步骤 安装步骤非常简单,这边就大致概述一下: 官网下载:https://www.charlesproxy.com/download/,依照自己的电脑系统,下载安装。 官网下载的版本需要进行破解,破解包根据自己下载的版本下载一个对应版本的破解包,这边提供一个windows版本的破解安装包。 二、证书安装 charles安装完成后,就可以抓取电脑上http的请求。但抓取https的时候还需要进行一些设置。windows的设置于mac不太相同,但基本操作都是一样。这边以windows为例。 1.电脑安装证书 a.选择:Help—SSL Proxying—Install Charles Root Certificate b.证书安装完成后,设置SSL Proxying Settings。选择:Proxy—SSL Proxying Settings… 添加相应的host以及端口,如下图所示。 c.以上设置完成后,重启charles和浏览器就可以使用charles抓取电脑中的https请求了。 但有时会出现部分网页打开时,提示“隐私设置”问题。这是可能是由于SSL Proxying Settings中的设置没有覆盖全面,可以将无法打开网页的host以及port添加进去。 2.手机安装证书 a.选择:Help—SSL Proxying—Install Charles Root Certificate on a Mobile Devices or Remote Browser b.打开了如下的窗口 c.手机端打开无线网的设置—代理设置。设置代理服务器、端口为上图中的主机和端口 d.配置代理信息后,Charles会出现如下窗口,点击Allow e.允许链接后,在浏览器中输入:chls.pro.ssl下载证书,下载后,直接安装。安装后确认证书是否是被信任的证书,打开:通用—关于本机—证书信任设置,将下载的charles证书设置为信任。 f.设置完成后可以使用charles抓取手机发出的https请求 三、快捷菜单栏操作 ·清除按钮:点击该按钮将清除当前会话中的所有内容 停止按钮:点击后Charles将停止抓包 节流按钮:点击后将限制请求上传和下载的速度 断点按钮:点击后将指定的请求打上断点 撰写按钮:可以新建一个请求或者在原有的请求基础上修改请求 重复请求按钮:选中请求后点击按钮,将所有请求重复请求一次 验证按钮:验证返回的Html信息。将这些返回发送到W3C HTML验证器、W3C CSS验证器和W3C Feed验证器来验证记录的相应。 四、常用功能操作 1.模拟慢速网络:Proxy—Throttle Settings(快捷菜单中的节流按钮) 适用场景:模拟慢速网络或者高延迟的网络。 勾选:Enable Throttling按钮就可以打开限速。 在Throttle Preset中可以直接选择已经预设的模式,也可以根据自己需要调整参数。 可以对指定的请求进行单独的限速,勾选:Only for selected hosts—Add—添加指定的请求地址。 2.断点功能:Proxy—Breakpoints Settings(快捷菜单中的断点按钮) 适用场景:需要修改一次网络请求或返回结果。一般用于临时性的修改。当指定的网络请求发生时,Charles会接获该请求。 (1)两种设置的方式: a.勾选:Enable Breakpoints按钮,点击Add按钮,添加需要打断点的请求信息

支付宝周期扣款(支付后签约)业务功能总结(php+golang)

文档 周期扣款支付后签约场景文档:https://opendocs.alipay.com/open/041bxs 业务流程 1、处理签约成功回调,添加到订阅表 2、定时任务自行请求订阅表,把达到扣款日期的订阅,然后请求支付宝扣款,并本地开通权限给用户,再计算下次扣款时间 3、处理签约解除回调,删除订阅表数据。(需要去设置网关回调地址,有退款的话支付宝会回调告诉我们) 包文件 golang包:https://github.com/phpgolangdeveloper/smartwalle phpsdk包:https://opendocs.alipay.com/open/02np96 注意:上面的golang的包我是做过改进的,在 https://github.com/smartwalle/alipay 基础上改了源码 把改进的包下载下来之后,放在gopath路径中:/Users/twj/Documents/go_www/src/github.com/smartwalle/alipay,我这里的go是gopath环境 备注 因为我们支付系统是用golang写的,业务系统是用php写的,所以下面会有两个系统的代码,但go和php都大同小异。 接周期扣款要注意的点 1、支付宝的周期扣款,后续的扣款是商家自行请求扣款接口的,支付宝是不会帮你们做定时器然后回调接口提示你已经扣款的。需要你自己写定时任务计算好扣款日期,再去请求支付宝的,然后支付宝可以提前5天扣款。 2、周期扣款日期不能是28号到月底最后一天的,假设下次扣款日是9月28日,那么建议你设置扣款日期是下个月的1~3号,也就是这个字段:execute_time 3、周期扣款的后续,商家自行请求支付宝时候,每笔扣款是100元内,也就是你接入周期扣款的时候,后续的每笔自动扣款都必须是100元内,没得提升,想要提升额度就是要用商家代扣,具体问问alipay客服。 代码层 golang代码 结构体 type TradePay struct { Channel string `json:"channel"` TBody string `json:"t_body"` TotalFee float64 `json:"amount"` OutTradeNo string `json:"out_trade_no"` ProductName string `json:"product_name"` ProductDesc string `json:"product_desc"` OpenId string `json:"open_id"` TradeType string `json:"trade_type"` FrontUrl string `json:"front_url"` JsonStr string AppId string `json:"app_id"` MchId string `json:"mch_id"` ApiKey string `json:"-"` NotifyUrl string `json:"notify_url"` NotifyType string `json:"

吉林大学UML统一建模语言期末备考

选择题(20分) UML中的部署图通常用在(实施)阶段; 顺序图和(协作图,就是通信图)是可以相互转化的; UML图中适合描述单个用例中多个对象之间的协作行为的是(交互图),适合描述跨越多个用例的单个对象的行为的是(状态图),适合描述多个对象跨越多个用例时的总面貌的是(活动图); 哪种物件能够代表计算资源的物理元素;(节点) 对象状态由(对象的属性和关系定义),而非仅由状态属性定义; UML中的事物包括:结构事物,行为事物,分组事物,注解事物; 参与者之间可以有(泛化关系),而Actor与用例之间的关系是(关联关系); (用例)概念被认为是第二代面向对象技术的标志; (状态图)是用来描述一个对象的生命周期的; 判断题(10分) 简答题(40分) UML英文全称Unified Modeling Language,统一建模语言; 简述UML:UML是一种定义良好、易于表达、功能强大且普遍适用的可视化建模语言。他的作用域不仅限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。UML的作用就是从静态和动态两个方面来全面描述我们将要开发的系统; UML2.0包括structual diagram( class diagram, object diagram, component diagram, deployment diagram, package diagram),behavioral diagram( activity diagram, sequence diagram, state diagram, use case diagram, communication diagram); 解释模型和图的概念,并说明他们的区别和联系。 a. 模型是对复杂事物的简化,通过建立模型可以对目标系统进行可视化描述,详细描述其静态结构和动态行为,提供构造系统的模板,并且可以作为文档记录在分析设计系统过程中做的种种决策; b. 图是由建模元素和关系组合在一起来表达一定的内容; c. 模型从不同的角度刻画了系统不同的透视内容,而图只是一种刻画系统关键部件的图形工具。 举例说明聚合关系和组合关系的含义、表示方法和区别; 聚合具有“has a”语义,而组合是强语义的聚合,整体对象消失,部分对象也就消失。 聚合(公司和职员),组合(订单和订单项); 请说明分析类中三种构造型的表示方法、含义和作用: a. 界面类:用来描述系统和外界之间交互的系统要素; b. 实体类:一般对应着在业务领域中的客观事物,是对系统内重要的数据信息及其操作,或业务逻辑运算进行封装; c. 控制类:表示系统用来进行调度、协调、处理,以及业务处理的系统要素。 什么是用例实现。用例实现应该包含哪些工件,以及用例实现和用例之间的关系。 用例实现说明了一个用例是怎么实现自己行为的。 用例实现应该包括静态类图和动态交互图。 用例实现是对用例的实现,两者之间是实现关系。 用例之间的关系。 a. 包含include; b. 拓展extend; c. 泛化generalization。

时间戳转换为日期?日期转换为时间戳?如何获取当前时间?

一、日期转换为时间戳(可比较日期大小) let startTime = new Date(this.text.beginTime.replace(/-/g, '/')).getTime(); //替换掉this.text.beginTime即可 //方法2 var date = new Date('2014-04-23 18:55:49:123'); // 有三种方式获取 var time1 = date.getTime(); var time2 = date.valueOf(); var time3 = Date.parse(date); console.log(time1);//1398250549123 console.log(time2);//1398250549123 console.log(time3);//1398250549000 二、时间戳如何转换为日期格式 function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1000,时间戳为13位的话不需乘1000 Y = date.getFullYear() + '-'; M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-'; D = date.getDate() + ' '; h = date.getHours() + ':'; m = date.

【前端css】如何实现分隔线效果(css兄弟兄弟节点样式+ ~)

效果图如下 需求说明 不就是加一条分割线吗?有什么难的? 这可不是普通的分割线 每行数据的下面需要有一条分割线,最后一行数据底部无需分割线,如果某行数据为空,则该行不显示(所以这条线不能写死) 解决方案 给css样式用上CSS的兄弟选择器 + 代码详情 HTML代码 //父级 <view class="labelbg"> //子级1 <view class="labelbg__contentPropertyBox"> <text class="labelbg__contentPropertyBox__labelTitle">完成时间</text> <text class="labelbg__contentPropertyBox__labelContent">{{model.checkPlanBo && model.checkPlanBo.executeUserName}}</text> </view> //子级2 <view class="labelbg__contentPropertyBox"> <text class="labelbg__contentPropertyBox__labelTitle">是否逾期</text> <text class="labelbg__contentPropertyBox__labelContent" :style="{color: model.overdueName == '是' ? '#34C759' : '#FF4042'}" >{{model.overdueName}}</text> </view> //子级3 <view class="labelbg__contentPropertyBox"> <text class="labelbg__contentPropertyBox__labelTitle">问题总数</text> <text class="labelbg__contentPropertyBox__labelContent">{{model.abnormalNum||0}}</text> </view> </view> css代码 //看过来 就是这样写的 //下面也有写到contentPropertyBox 只要把兄弟元素有区别的样式拎出来写在这里就可以 .labelbg__contentPropertyBox + .labelbg__contentPropertyBox{ width: 686rpx; border-top-width:0.5rpx; border-top-style:solid; border-top-color:$gray-7; } .labelbg{ width: 750rpx; background-color: $uni-bg-color; //就是这里 把兄弟元素相同的样式放这里 &__contentPropertyBox { flex-flow: row; justify-content: flex-start; display: flex; padding-top: 29rpx; padding-bottom: 29rpx; margin:0rpx 32rpx 0rpx 32rpx; &__labelTitle{ font-size: 30rpx; color: $gray-3; width: 156rpx; } &__labelContent{ font-size: 30rpx; color: $gray-1; width: 530rpx; } } 补充知识 示例效果图: 1.

关于ubuntu中防火墙ufw的运用

Uncomplicated FireWall(ufw)是 debian 系发行版中为了轻量化配置 iptables 而开发的一款工具.ufw提供一个非常友好的命令用于创建防火墙的规则。由于Ubuntu下的iptables操作起来比较复杂,依赖关系比较多,所以使用ufw时可以简化很多操作。同时,ufw和iptables 一样都是匹配原则,匹配到了则忽略剩下的规则。 下面介绍一下ufw的如何使用: 1.关于防火墙的开启和关闭 sudo ufw enable #开启防火墙 sudo ufw disable #关闭防火墙 2.查看防火墙状态 Sudo ufw status Sudo ufw status verbose #这个更详细的显示规则 正常防火墙开启后默认是拒绝所有设备访问的,从Default位置就可以看出; 我们开启防火墙墙有2中情况: 1)已知我使用了哪些端口和哪些IP和外界交互,那么就默认状态(deny(incoming))开启需要访问的端口和IP;2)系统比较复杂或者刚接手这个项目,不清楚哪些端口与外界交互,但是清楚哪些端口有风险,可以采用sudo ufw default allow 命令,开启所有可以端口可以访问转台(allow(incoming)),然后禁止那些风险端口访问。 3.端口的开启及禁止 sudo ufw allow 22/tcp #允许2222端口的TCP sudo ufw allow 22/udp #允许2222端口的UDP sudo ufw allow 22 #允许2222端口,tcp和UDP都可以 sudo ufw denty 22 #阻止2222端口(要协议控制同上) sudo ufw allow http #允许http端口连接 4.允许/禁止指定的IP访问 sudo ufw allow from 192.168.1.26 #允许特定IP连接过来 sudo ufw deny from 192.

vue、nuxt的mavon-editor富文本的使用及添加代码块高亮样式、代码块行数、一键复制代码功能

为啥断更了这么久? 就是因为mavon-editor富文本框的样式、nuxt项目的seo、nuxt项目的优化、nuxt首屏渲染等等等的问题导致这么久没有发文章了。。。 这篇文章先讲vue项目及nuxt项目中使用mavon-editor并改变代码块的样式、高亮样式,新增功能:代码块行数、一键复制代码。先附一张图。 我博客连接:安哥个人博客 这个是nuxt项目mavon-editor的样式,接下来废话不多说开始。 1. vue的mavon-editor使用 先安装mavon-editor npm install mavon-editor 或者 yarn add mavon-editor 在main.js全局引入使用 import mavonEditor from 'mavon-editor' import 'mavon-editor/dist/css/index.css' Vue.use(mavonEditor) 在你的组件中使用 html代码 <template> <div class="dashboard-container"> <mavon-editor v-model="context" :toolbars="toolbars" /> </div> </template> js代码 <script> export default { name: 'Article', data() { return { context: '', // 输入的数据 toolbars: { bold: true, // 粗体 italic: true, // 斜体 header: true, // 标题 underline: true, // 下划线 strikethrough: true, // 中划线 mark: true, // 标记 superscript: true, // 上角标 subscript: true, // 下角标 quote: true, // 引用 ol: true, // 有序列表 ul: true, // 无序列表 link: true, // 链接 imagelink: true, // 图片链接 code: true, // code table: true, // 表格 fullscreen: true, // 全屏编辑 readmodel: true, // 沉浸式阅读 htmlcode: true, // 展示html源码 help: true, // 帮助 undo: true, // 上一步 redo: true, // 下一步 trash: true, // 清空 save: true, // 保存(触发events中的save事件) navigation: true, // 导航目录 alignleft: true, // 左对齐 aligncenter: true, // 居中 alignright: true, // 右对齐 subfield: true, // 单双栏模式 preview: true // 预览 }, } }, mounted() {}, methods: {} } </script> 然后就可以使用了

一些基本配色

基本配色方式 互补色:某一颜色为基准,与此色相隔180°的任一两色互补,互补色的色相对比强烈,画面相较于对比色更丰富、更具有感官刺激性。 邻近色:以某一颜色为基准,与此色相隔60-90°的颜色为邻近色,邻近色对比属于色相的中对比,可保持画面的统一感,又能使画面显得丰富、活泼。可增加明度和纯度对比,丰富画面效果。这种色调上的主次感能增强配色的吸引力。 对比色:以某一颜色为基准,与此色相隔间隔120°-150°的任一两色互为对比色。对比色相搭配是色相的强对比,其效果鲜明、饱满,容易给人带来兴奋、激动的视觉感受。作品中常以高纯度的对比色配色来表现随意、跳跃、强烈的主题,以起到吸引人们目光的作用。 类似色:以某一颜色为基准,与此色相隔30°的颜色为类似色,类似色比同类色效果搭配效果更加明显、丰富,可保持画面的统一与协调感,呈现柔和质感。由于搭配效果相对较平淡和单调,可通过色彩明度和纯度的对比,达到强化色彩的目的。 同类色:以某一颜色为基准,与此色相隔15°以内的颜色为同类色,同类色差别很小,常给人单纯、统一、稳定的感受。可以通过明暗层次体现画面的立体感,使其呈现出更加分明的画面效果。可点缀少量对比色,使画面具有亮点。 无彩色: ①黑色,能够传递出简洁有力的视觉印象; ②白色,呈现明感受和扩张感,能给人视觉上的舒适感;灰色,是彻底的中性色,是一种可靠、灵活的无彩色,具有安全感和亲切感。 根据年龄不同的色彩嗜好 基本上,年龄层越低越喜欢明亮的颜色,年龄层越高越喜欢紫色和蓝绿等中性色,或者灰色等浊色。 幼年层:喜欢明亮的、鲜艳的颜色,喜欢红色和橙色等暖色。 儿童层: 包括幼年层的嗜好在内还加入了黄色,喜欢高亮度和低纯度的嗜好也增加了。喜欢明亮的颜色,活泼色调还有亮色调等。 青年层: 瑗色和冷色系的嗜好有所增加,抑制纯度的淡色系和明亮鲜艳的颜色,低亮度的深色系等嗜好也有所增加,包括白色和黑色。 壮年层:冷色系和中性色的嗜好也有所增加,喜欢的颜色也变得多样化。深色调和晦暗色调等暗色,灰暗色调。 中老年层:以喜欢低亮度或低纯度为中心,还喜欢中纯度、暗色调和灰色调这种古朴的颜色。 UI中色彩搭配 1.整体色调协调统一 先确定主色调,辅助色彩以主色为基准进行搭配。 2.有重点色 可选取一种颜色作为整个界面的重点色,这个颜色可以被运用到焦点图、按钮、图标,或者有其他相对重要的元素,使之成为整个页面的焦点。 3.注意色彩平衡 颜色的强弱、轻重、浓淡的关系。 4.调和对立色 ①调整对立色的面积,使一种颜色成为主色,其他颜色成为辅助色,可调整色彩的纯度和明度。 ②添加两种对立色之间的颜色,引导颜色在色相上逐渐过渡。 ③加入大量的中性色。黑白灰

使用Dokcer配置Tensorflow-1.15环境并使用VSCode开发

使用Dokcer配置Tensorflow-1.15环境 目前学术界大部分深度学习的开源代码都是基于Pytorch的,但还有少部分工作或者以前的工作是基于Tensorflow 1.x的,由于tensorflow的版本和CUDA的版本有严格的对应关系,它需要依赖很多相应版本的CUDA的C++动态库,而CUDA又和显卡型号存在对应关系,那此时在本机上直接部署tensorflow可能会破坏现有环境。所以我们可以选择使用Docker容器生成各种环境来执行代码。更棒的是VS Code的Remote-Container插件可以支持我们使用本地的Docker容器环境进行开发。 准备工作 首先需要在本机上安装NVIDIA的显卡驱动,剩下的CUDA库在Docker镜像中都配置好了 1. 拉取镜像 Tensorflow安装官网: https://www.tensorflow.org/install/docker?hl=zh-cn Tensorflow官方docker hub链接: https://hub.docker.com/r/tensorflow/tensorflow/ 拉取相应版本的cuda和tensorflow镜像 docker pull nvidia/cuda:10.0-devel-ubuntu18.04 docker pull tensorflow/tensorflow:1.15.3-gpu-jupyter 拉取镜像后直接运行,有一个报错 docker: Error response from daemon: Unknown runtime specified nvidia. 谷歌以后参考Stackoverflow: https://stackoverflow.com/questions/52865988/nvidia-docker-unknown-runtime-specified-nvidia 安装nvidia runtime, 并把它添加到docker runtime的配置文件 sudo apt-get install nvidia-container-runtime sudo vim /etc/docker/daemon.json 把下面内容添加到文件中 { "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } } 重启docker sudo systemctl daemon-reload sudo systemctl restart docker 2 启动容器 2.1 作为守护进程启动(启动后一直在后台运行) # 启动容器并后台运行 docker run -itd -v /home/qyz:/home/qyz --rm --runtime=nvidia --name tensorflow tensorflow/tensorflow:1.

应用层: HTTP 与 HTTPS协议

目录 http请求格式: 首行: method: 请求方法. URL: 统一资源定位符, 俗称网址. version: http协议版本号 头部: 空行: 正文: http响应格式: 首行: 头部: cookie机制:​ session机制: 空行: 正文: HTTP服务器实现: HTTPS协议: https协议的加密流程: 身份验证: 数据加密: 对称加密: 非对称加密: 混合加密: SSL加密流程: http是应用层的协议, 应用程序之间数据格式的约定统一格式, 由程序员们自己约定 协议可以用自定制协议也可以是已有的、优秀的知名的协议. http协议就是大佬们弄好的针对典型应用的知名的nb的协议.(应用层的知名的协议还有: http 超文本传输协议,https 解密的http, ftp 文件传输协议, smtp 邮件传输协议, dns 域名解析协议) 自定制协议: 我们可以自己随便定义使用的数据格式, 但是要高效就得考虑: 序列化,反序列化的传输性能和解析性能问题. 序列化后的二进制数据越短传输性能越好, 序列化和反序列化的过程越简单解析性能越好. 通常使用结构体的二进制序列化解析性能非常高 (通过的是结构体的特性,对成员变量的赋值就能实现数据在内存中的序列化.) 但是结构体方式的序列化存在缺陷: 不同平台 位段的使用、字节对齐 不同. http协议是应用层协议,在传输层用的tcp协议.也就是说http服务器也就是tcp服务器. http协议是个简单的请求-响应协议,一次请求一个响应. http是明文字符串传输协议(2.0版本前), 即协议组织的请求响应数据是人能看得懂的. http请求格式: 包括首行, 头部字段, 空行, 正文四个部分 首行: 首行就是请求报文中的第一行, 包含三个要素: method url version\r\n, 三个要素之间用空格间隔.

win10 ping命令与telnet命令使用详解

ping命令,主要用来分析和判断网络故障,网络是否可以连通 在windows上使用ping命令 cmd命令启动方式主要有两种: 第一种是快捷费方式Win+R,在运行编辑中,输入cmd即可; 第二种由于win10取消了所有程序命令,直接在审搜索框搜索运行即可,然后输入cmd ping 命令可以ping网址,域名,IP,后面加-t可以一直ping,使用Ctrl+C终止ping telnet命令,主要用来判断端口是否开启,常配合套接字(IP+端口)使用 在windows上使用telnet命令 首先需要确认windows电脑是否安装telnet服务,查找路径如下: 【控制面板-程序-程序与功能-启用或关闭Windows功能】 win10打开控制面板可以直接在搜索框搜索控制面板,或者使用鼠标右键点击屏幕 【个性化-主题-桌面图标设置-控制面板】创建桌面快捷方式。 用法:telnet IP/URL(网址)/域名 端口 连接成功,按q退出 连接失败

前端面试题——dom的逆序

< ul > < li >1 </ li > < li >2 </ li > < li >3 </ li > </ ul > <script> let ul = document.querySelector('ul') let lis = ul.querySelectorAll('li') let lisArr = Array.from(lis) let arr = [] for(let i = 0; i < lisArr.length; i++) { arr.push(lisArr[i].innerText) } arr.reverse() ul.innerHTML = '' for(let i = 0; i < arr.length; i++) { let li = document.createElement('li') li.

原型原型链面试题

Function.prototype.a=() => console.log(1) Object.prototype.b=() => console.log(2) function A(){} const a= new A() a.a() // 报错 a.b() // 2

数据结构-B树删除示例

数据结构学习-B树删除示例 1、B树简介2、在线可视化生成B树工具3、B树删除规则4、B树删除示例4.1、删除非根结点示例4.2、删除根结点示例 1、B树简介 1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树: 1、根结点至少有两个子女; 2、每个非根节点所包含的关键字个数 j 满足:⌈ m/2⌉ - 1 <= j <= m - 1; 3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:⌈ m/2⌉ <= k <= m ; 4、所有的叶子结点都位于同一层。 在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。 因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。 B-树中的一个包含n个关键字,n+1个指针的结点的一般形式为:(n,P0,K1,P1,K2,P2,…,Kn,Pn)。其中,Ki为关键字,K1<K2<…<Kn, Pi 是指向包括Ki到Ki+1之间的关键字的子树的指针。 ------粘百度百科 2、在线可视化生成B树工具 网址是:https://www.cs.usfca.edu/~galles/visualization/BTree.html 3、B树删除规则 4、B树删除示例 看一个具体例子,这里是以五阶B树为例, 对于五阶B树来说: 其中根结点的关键字个数 j 满足:1 <= j <= m - 1,也就是1 ~ 4; 其中非根结点的关键字个数 j 满足:⌈ m/2⌉ - 1 <= j <= m - 1,也就是2 ~ 4; 其中根结点的子树个数 k 满足:2 <= j <= m ,也就是2 ~ 5;

Unix 环境高级编程(一):开发环境

Unix 环境高级编程(一):开发环境 一、Unix操作系统二、Linux操作系统三、GNU编译工具(GCC)1、简介2、基本用法3、文件后缀4、构建过程5、预处理指令6、预定义宏7、环境变量 四、静态库1、简介2、创建静态库3、ar 指令4、调用静态库 五、共享库1、简介2、创建共享库3、调用共享库3、运行 六、动态加载共享库1、头文件2、加载共享库3、获取函数地址4、卸载共享库5、 获取错误信息 七、辅助工具 一、Unix操作系统 二、Linux操作系统 三、GNU编译工具(GCC) 1、简介 GCC是以GPL许可证所发行的自由软件,也是GNU计划的关键部分。GCC的初衷是为GNU操作系统专门编写一款编译器,现已被大多数类Unix操作系统(如Linux、BSD、MacOS X等)采纳为标准的编译器,甚至在微软的Windows上也可以使用GCC。GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台。 GCC原名为GNU C语言编译器(GNU C Compiler),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。 2、基本用法 gcc [options] [filenames] /* GCC最基本的用法是∶gcc [options] [filenames] * 其中 options 就是编译器所需要的参数 * filenames 给出相关的文件名称 * */ -c /* 只编译,不链接成为可执行文件, * 编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件, * 通常用于编译不包含主程序的子程序文件 * */ -o /* output_filename,确定输出文件的名称为output_filename, * 同时这个名称不能和源文件同名。 * 如果不给出这个选项,gcc就给出预设的可执行文件a.out * */ -x /* 设定文件所使用的语言, 使后缀名无效, 对以后的多个有效 * 根据约定 C 语言的后缀名称是 .c 的, * 而 C++ 的后缀名是 .

Chrome浏览器无法登录Google账号

参考链接:https://blog.csdn.net/qq_40630902/article/details/122914599 无法登录谷歌账号,提示浏览器或应用可能不安全 输入Gmail账号之后,提示却是: 此浏览器或应用可能不安全。 了解详情 请尝试使用其他浏览器。如果您使用的是受支持的浏览器,可以重新尝试登录。 重新尝试N次之后发现还是无法登录,于是乎只能求助百度…… 解决方法 找到浏览器的设置,在其中搜索JavaScript,打开JavaScript。或者: 但其实这种方式效果一般,因为Chrome浏览器是默认开启了JavaScript的。 关闭所有扩展插件,再打开谷歌浏览器,登录谷歌账号。 这个方法效果也不咋地,一会可以一会不行。 关掉Google浏览器,在Google安装目录下,打开chrome_proxy.exe就可以登录。 这个方法相对最为有效,在输入Gmail账号后出现的是输入密码的界面,而不再是重新尝试登录的界面。

python列表练习之插入与排序

今天看到一个python关于列表排序和插入的练习,它的要求是这样的: 已知列表nums = [3, 1, 25, 10, 15, 6, 8]将这个序列从大到小排序声明一个变量i,并赋值一个数字,例如 i=7,然后将该变量插入到已排序的列表中合适的位置上,使得该列表依旧满足从大到小排序 然后我打算去试一下,我的思路是这样的: 1、先对列表nums进行排序 nums = [3, 1, 25, 10, 15, 6, 8 ] nums.sort(reverse=True) # >>> nums = [25, 15, 10, 8, 6, 3, 1] 2、将该列表进行反向,并赋值给一个新的变量 num_reverse = nums[::-1] # >>> nums = [1, 3, 6, 8, 10, 15, 25] 3、对两个列表同时遍历,分别将下标对应的值与变量 i 进行判断 def insert_data_to_list(nums, nums_reverse, i): for index in range(len(nums)): if nums_reverse[index] < i < nums[index]: continue elif nums_reverse[index] > i: nums.

jQuery基础入门笔记(详细总结)

目录 1、什么是jquery? 2、jquery下载安装 2.1、方式一官网下载 2.2、方式二引入谷歌和微软服务器的jQuery 3、jQuery语法 3.1、元素选择器 3.2、属性选择器 3.3、CSS选择器 3.4、事件函数 3.5、hide()隐藏函数 4、jQuery效果 4.1、隐藏/显示 4.2、淡入/淡出 4.3、滑动 4.4、动画 4.5、stop函数停止动画 4.6、函数链接 5、jQuery之DOM操作 5.1、获取内容 5.2、获取属性 5.3、设置内容 5.4、设置属性attr()和删除属性removeAttr() 5.5、设置属性prop()和删除属性removeProp() 5.6、添加内容 5.7、删除元素 5.8、获取并设置CSS类 6、jQuery选择器 6.1、基本选择器 6.2、层级选择器 6.3、基本过滤选择器 6.4、内容过滤选择器 6.5、可见性过滤选择器 6.6、属性过滤选择器 6.7、子元素过滤选择器 6.8、表单过滤选择器 6.9、表单对象属性过滤选择器 6.10、对象遍历 前言:学习jQuery之前,必须先学习HTML+CSS+JS,后学jQuery才会更加简单。 1、什么是jquery? jQuery 是一个 JavaScript 库。 jQuery 极大地简化了 JavaScript 编程。 jQuery 学习很容易。 2、jquery下载安装 jQuery的安装有二种方式,一种就是从官方网站进行下载,这里我提供一个1.8.3版本的jQuery文件,请自行提取。 有两个版本的 jQuery 可供下载: Production version - 用于实际的网站中,已被精简和压缩,以后部署服务器用的都是精简版本。 Development version - 用于测试和开发(未压缩,是可读的代码),开发练习使用这个就可以了。 2.1、方式一官网下载 链接:https://pan.baidu.com/s/1p_-XkROq65rSKpPS745HRg 提取码:bs8c 如果不想用这个版本,也可自习到官网下载,这里提供官网地址:Download jQuery | jQuery

Cache Stashing

Cache stashing is the ability of an external agent to request that a line is brought in (or stashed) to a cache in the cluster. Cache stashing can be performed over the ACP interface, or the CHI master interface. Stash requests can target the L3 cache, or any of the L2 caches in cores within the cluster.

PHP grpc环境搭建(宝塔环境)

服务器环境:centos7,php7.4 1. 安装grpc扩展 # 下载解压 grpc cd ~ wget http://pecl.php.net/get/grpc-1.30.0.tgz tar xvf grpc-1.30.0.tgz cd grpc-1.30.0 # 生成配置并编译安装(编译安装时间较长, 耐心等待) /www/server/php/74/bin/phpize ./configure --with-php-config=/www/server/php/74/bin/php-config make && make install # 配置PHP扩展, 重启PHP服务, 清理下载文件 echo "extension = grpc.so" >> /www/server/php/74/etc/php.ini /etc/init.d/php-fpm-74 reload /www/server/php/74/bin/php -m|grep -i gRPC cd .. && rm -rf grpc-1.30.0* 2. 安装protobuf扩展 # 下载解压 protobuf cd ~ wget http://pecl.php.net/get/protobuf-3.12.2.tgz tar xvf protobuf-3.12.2.tgz cd protobuf-3.12.2 # 生成配置并编译安装(编译安装时间较长, 耐心等待) /www/server/php/74/bin/phpize ./configure --with-php-config=/www/server/php/74/bin/php-config make && make install # 配置PHP扩展, 重启PHP服务, 清理下载文件 echo "

C++实现图 - 04 最短路径

数据结构与算法专栏 —— C++实现 写在前面: 今天我们来看看图论中另一个非常重要的问题 —— 最短路径,正如其名就是要再图中找到起点到终点的最短路径,这就需要不断地去比较每条边的权值。 这一讲我们将会具体介绍迪杰斯特拉算法和弗洛伊德算法的实现。 迪杰斯特拉算法 迪杰斯特拉算法是一个单源点的一个最短路径算法,也就是说,我们这个算法会求得从一个顶点到其所有顶点的最短路径。 这个算法需要用到邻接矩阵来存储所有边值,并且需要一个辅助数组来更新最短路径,需要一个路径数组存储最短路径的结点,还需要一个状态数组来判断当前结点是否已经加入最短路径。 这样说可能会有点晕,我们还是先来看图,假设有这样一张图: 现在,我们要找到结点 0 到结点 8 的最短路径,步骤如下: 辅助数组 D:存储结点 0 到当前结点的最短路径权值。 路径数组 P:存储当前最短路径到该点的父结点。 状态数组 Final :记录当前结点是否已经加入到最短路径当中(0 代表还没有加入,1 代表已经加入)。 第一步:初始化我们上述提到的三个数组,将结点 0 加入数组中,并更新辅助数组即结点 0 连出去的边的权值。 第二步:找到当前辅助数组中的边权最小值,即结点 0 到结点 1 ,故加入结点 1 ,并且更新结点 1 连出去的边值。 可以发现之前更新过结点 2 的辅助数组,现在又需要更新,因为结点 0 到结点 2 的最短路径不再是 0 -> 2 ,而是 0 -> 1 -> 2 ,即最短路径值从 5 变为 1+3 = 4 ,并且结点 2 的 P 不再是 0 ,它在最短路中要先经过结点 1 ,故 P 改成 1 。

C#实现轮子效果的屏保

也是十年前学绘图做的小玩意儿。已经没用了,翻出来给人分享学习资料。C#能干的有很多,只是代码开放意识弱。 源码地址 一样的用绘图实现轮子控件 using System; using System.Collections.Generic; using System.Linq; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; using System.Windows.Forms; namespace UserClock { public class UserClock:UserControl { /// <summary> /// 记录时间 /// </summary> private DateTime time; /// <summary> /// Timer控件 /// </summary> private Timer timer1; /// <summary> /// 中间点颜色 /// </summary> private Color dotColor=Color.Blue; /// <summary> /// 时针颜色 /// </summary> private Color hourHandColor = Color.DimGray; /// <summary> /// 分针颜色 /// </summary> private Color miniteHandColor = Color.

工作流模块Jar包启动报错:liquibase – Waiting for changelog lock….

1.异常 工作流模块Jar包启动报错: 2021-02-14 13:45:13.735 [main] INFO liquibase - Waiting for changelog lock.... 2021-02-14 13:45:23.739 [main] INFO liquibase - Waiting for changelog lock.... 2021-02-14 13:45:33.744 [main] INFO liquibase - Waiting for changelog lock.... 2021-02-14 13:45:43.750 [main] INFO liquibase - Waiting for changelog lock.... 2021-02-14 13:45:53.755 [main] INFO liquibase - Waiting for changelog lock.... 2021-02-14 13:46:03.762 [main] INFO liquibase - Waiting for changelog lock.... 2021-02-14 13:46:13.767 [main] INFO liquibase - Waiting for changelog lock.

grid布局看这一篇就够了

grid布局笔记 1、grid概述2、grid布局的作用2.1、grid与flex布局的区别2.2、grid的优势 3、grid基本概念3.1、容器与项目3.2、行、列、单元格3.3、网格线 4.1、容器属性4.1、列行大小 grid-template-columns grid-template-rows4.1.1、repeat4.1.2、auto-fill4.1.3、auto-fit4.4.4、minmax4.1.5、fr4.1.6、auto4.1.7、网格线命名 4.2、间距 grid-row-gap grid-column-gap grid-gap4.3、区域划分 grid-template-areas4.4、项目群对齐 justify-items、align-items、place-items4.5、内容对齐 justify-content、align-content、place-content4.6、自动列行 grid-auto-columns、grid-auto-rows4.7、自动流 grid-auto-flow4.8、网格简写 grid 5、项目属性5.1、项目定位 grid-column-start、grid-column-end、grid-row-start、grid-row-end5.2、项目列行大小 grid-column grid-row5.2、项目区域 grid-area5.3、自我对齐 justify-self、align-self、place-self 6、兼容性 1、grid概述 grid 布局即网格布局,目前唯一一种 CSS 二维布局,是最强大的的 CSS 布局方案。它可以轻松实现以下布局,这是 flex 布局无法一次性解决的 声明定义 容器里面包含着项目元素,使用 display:grid 或 display:inline-grid 声明为网格容器。 grid :生成一个块级(block-level)网格inline-grid:生成一个行级(inline-level)网格 .container { display: grid | inline-grid; } 2、grid布局的作用 2.1、grid与flex布局的区别 flex 布局是轴线布局,只能指定 “项目” 针对轴线的位置,是一维布局,只能类似一行一行的放置grid 布局则是将容器划分成 “行” 和 “列” ,产生“单元格”,可以指定项目所在的单元格区域,是二维布局,可以随意划定放置的区域 注意:只有 grid 有 just-items 属性 flex 没有,你可以认为 flex 的 just-items 被 just-content 取代了

Java 多线程 习题

活动地址:CSDN21天学习挑战赛 目录 1、设计4个线程对象2、设计一个生产电脑和搬运电脑类 1、设计4个线程对象 题目:设计4个线程对象,两个线程执行减操作,两个线程执行加操作。 代码如下: //执行加运算的线程 class Add implements Runnable{ private int sum = 0; @Override public void run() { for(int i=0; i<10; i++){ sum += i; } System.out.println("相加的结果: " + this.sum); } } //执行减运算的线程 class Subtraction implements Runnable{ private int sum = 100; @Override public void run() { for(int i=10; i>0; i--){ sum -= i; } System.out.println("相减后的结果: " + this.sum); } } //主函数 public class Demo1{ public static void main(String[] args) { Add a = new Add(); Thread t1 = new Thread(a); Thread t2 = new Thread(a); t1.

数据结构-平衡二叉树示例

平衡二叉树示例 1 平衡二叉树简介2 平衡二叉树示例3 总结 1 平衡二叉树简介 平衡二叉树(Balanced Binary Tree 或 Height-Balanced Tree)又称AVL树。它或者是一棵空树,或者是具有下列性质的二叉树,它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树上结点的平衡因子BF( Balance Factor)定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只可能是-1,0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。 距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们称为最小不平衡子树。 2 平衡二叉树示例 我们希望由任何初始序列构成的二叉排序树都是AVL树。因为AVL树上任何结点的左右子树的深度之差都不超过1,则可以证明它的深度和 logn 是同数量级的(其中n为结点个数)。由此,它的平均查找长度也和logn同数量级。 平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,进行相应的旋转,使之成为新的平衡子树。如何使构成的二叉排序树成为平衡树呢?看一个具体例子,假设有一个数组关键字序列为(3,2,1,4,5,6,7,10,9,8),其中结点左上角的数字是平衡因子BF的值。 1、第一个关键字是“3”,直接构建为根结点,如图2-1的左图所示。 此时结点“3”的BF是0(左孩子0 - 右孩子0 = 0) 2、第二个关键字是“2”,关键字“2”比关键字“3”小,所以成为“3”的左孩子,如图2-1的右图所示。 此时结点“3”的BF是1(左孩子1 - 右孩子0 = 1) 此时结点“2”的BF是0(左孩子0 - 右孩子0 = 0) 图2-1 3、第三个关键字是“1”,关键字“1”比关键字“2”小,所以成为“2”的左孩子,此时关键字“3”的BF不在平衡因子的取值范围内,此时整棵树都成了最小不平衡子树,因此需要调整,因为关键字“3”的BF值为正,因此我们将整个树进行右旋(顺时针旋转),此时结点“2”成了根结点,结点“3”成了结点“2”的右孩子,此时三个结点的BF值均为0,如图2-2所示。 此时结点“3”的BF是2(左孩子2 - 右孩子0 = 2) 此时结点“2”的BF是1(左孩子1 - 右孩子0 = 1) 此时结点“1”的BF是0(左孩子0 - 右孩子0 = 0) 图2-2 4、第四个关键字是“4”,关键字“4”比关键字“3”大,所以成为“3”的右孩子,此时三个结点的BF值均在平衡因子的取值范围内,不用对树进行任何调整,如图2-3所示。 此时结点“2”的BF是-1(左孩子1 - 右孩子2 = -1) 此时结点“3”的BF是-1(左孩子0 - 右孩子1 = -1) 此时结点“1”的BF是0 (左孩子0 - 右孩子0 = 0) 此时结点“4”的BF是0 (左孩子0 - 右孩子0 = 0) 图2-3 5、第五个关键字是“5”,关键字“5”比关键字“4”大,所以成为“4”的右孩子,此时关键字“3”的BF不在平衡因子的取值范围内,此时要对最小不平衡子树(3、4、5)进行旋转,因为关键字“3”的BF值为负,因此我们将对最小不平衡子树进行左旋(逆时针旋转),旋转后结点“3”成了结点“4”的左孩子,整个树又达到了平衡,如图2-4所示。

Java 获取 URL 中的域名

废话不多说,直接上码吧: public static String getDomainName(String url) { try { String domain = new URL(url).getHost(); if (domain == null) { return null; } domain = domain.replaceFirst("^www.*?\\.", ""); return domain; } catch (MalformedURLException e) { log.error("getDomainName error, url: {}", url, e); throw new RuntimeException(e); } } 靠谱参考:Java获取URL中的顶级域名domain的工具类

记一次使用nacos2踩到的坑

前言 本文素材来源朋友学习nacos2.1.1踩到的坑。直接上正菜 坑点一:出现端口被占用 因为是学习使用,朋友就在物理机搭建了搭建了nacos伪集群,即ip都一样,端口分别为8848,8847,8849。然而启动nacos服务器后,一台正常启动,其他两台都报了端口被占用 出现这种情况的原因,官网有做了解释 通过官网我们可以很容易得知,这个端口被占用主要是因为grpc引起的,因为他端口的生成方式,是由主端口+1000、主端口+1001生成。 解决方法 集群的端口不要采用相邻数字,步长尽量搞大点。比如设置为7777、8888、9999之类的 坑二:微服务项目启动出现com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING异常 这个问题出现在朋友在项目中配置的nacos地址为nginx地址,配置示例如下 spring.cloud.nacos.discovery.server-addr=nginx ip 一开始朋友nginx的配置示例如下 upstream nacos-cluster { server 127.0.0.1:7777; server 127.0.0.1:8888; server 127.0.0.1:9999; } server { listen 80; server_name localhost; location / { proxy_pass http://nacos-cluster; } } 浏览器通过nginx访问没问题,但是项目中把nacos服务地址配置为nginx ip就报了 com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING 这个异常信息,后面朋友查资料,官网上有写 于是他就将转发方式改为TCP,他的nginx版本是1.9+以上版本,默认就支持TCP代理了,不用额外安装stream模块。nginx配置TCP的示例形如下 stream { upstream nacos-cluster-grpc{ # nacos2版本,grpc端口与要比主端口多1000,主端口为7777、8888、9999 server 127.0.0.1:8777; server 127.0.0.1:9888; server 127.0.0.1:10999; } server{ listen 9848; proxy_pass nacos-cluster-grpc; } } 当朋友配置好nginx tcp代理转发后,通过telnet命令

BEVFusion:A Simple and Robust LiDAR-Camera Fusion Framework 论文笔记

原文链接:https://arxiv.org/abs/2205.13790 1.引言 目前的相机和激光雷达融合方法通常是将激光雷达点或提案投影到图像平面,作为查询选择相应的图像特征。但这种方法使得模型依赖于激光雷达点云。当激光雷达故障时,这些融合方法不能产生有意义的结果。 本文认为理想的融合应是各模态独立(即一个模态不应该受到其余失效模态的影响),且使用所有模态时能进一步提高性能。如下图(c)所示,本文提出BEVFusion,两个独立分支分别处理图像和激光雷达点云,将它们编码到相同的BEV空间;然后融合这些分支的BEV特征,输入到预测头。 BEVFusion可直接使用单一模态BEV表达模型,如LSS、PointPillars、CenterPoint等。此外,本文还针对激光雷达失效的鲁棒性实验,提出一种新的增广技术。 3.BEVFusion BEVFusion的详细结构如下图所示。 3.1 相机分支结构:从多视图图像到BEV空间 本文使用LSS的结构,但由于LSS是为BEV分割任务设计的,在3D检测任务上的性能较差,因此略有调整。如图2的上半部分所示,图像分支包含图像编码器、视图投影模块(将图像特征转移到3D空间)和BEV编码器。 图像编码器:包含用于基本特征提取的2D主干(Dual-Swin-Tiny)和用于尺度变化物体表达的颈部模块(FPN)。为更好地对齐多尺度特征,设计特征自适应模块(ADP)修正上采样的特征,即在拼接前使用自适应均值池化和卷积处理每个上采样特征(详见附录A.1)。 视图投影模块:与LSS相同,即以分类的方式预测深度分布,将图像特征提升为点云,并进一步转化为体素。 BEV编码器:未使用池化或3D卷积,而是使用空间到通道(S2C)操作,即将4D张量reshape为,以保留语义信息并减小计算;再使用卷积提取高级特征并减小通道维度。 3.2 激光雷达分支结构:从点云到BEV空间 使用PointPillars、CenterPoint和TransFusion-L的结构以检验BEVFusion的泛化能力。 3.3 动态融合模块 如上图所示,使用类似Squeeze-and-Excitation的机制,用通道注意力选择重要的融合特征: 其中表示通道维度上的拼接;是静态通道&空间融合函数(由卷积实现),用于减小通道维度; 其中是线性变换阵,是全局均值池化,是sigmoid函数。 3.4 检测头 使用三种检测头验证BEVFusion的泛化能力:基于锚框的(PointPillars)、无需锚框的(CenterPoint)和基于transformer的(TransFusion-L)。 4.实验 4.1 实验设置 实施细节:先预训练两个分支,然后训练BEVFusion。激光雷达分支使用翻转、全局旋转、全局缩放等数据增广方法,并使用CBGS进行类平衡采样;相机分支在多视图图像输入条件下,没有使用任何数据增广(如翻转、旋转、CBGS)。 4.2 泛化能力 在不同激光雷达主干和检测头下,BEVFusion均能大幅超过相应的激光雷达方法。 4.3 与SOTA方法的比较 本文比TransFusion性能略高,尽管TransFusion使用了两个解码器(即检测头;可视为两阶段网络),而BEVFusion仅有一个检测头。本文与TransFusion的区别仅在于融合方法上,说明了BEV融合的好处。 4.4 鲁棒性实验 4.4.1 激光雷达失效的鲁棒性实验 考虑两种激光雷达失效:激光雷达故障,即有有限角度的视野;物体不能反射激光雷达点。 为鲁棒性实验进行数据增广:模拟激光雷达视野受限的情况,将视野角度限制在180°和120°;以50%的概率丢弃物体,以50%的概率丢弃物体内的点。训练时,在增广数据集上微调检测头。 激光雷达故障:使用上述数据增广方案训练时,相比激光雷达单一模态方法以及原始的TransFusion,BEVFusion对视野受限具有更强的鲁棒性。 物体不能反射激光雷达点:在未使用数据增广时,BEVFusion就能超过激光雷达单一模态方法和TransFusion;引入数据增广后,BEVFusion进一步大幅提高性能,而TransFusion甚至出现性能下降,这可能是增广数据集中前景点的缺失带来了错误的监督。 以上结果说明本文融合相机的方法能在一定程度上补偿激光雷达失效问题。 4.4.2 相机失效的鲁棒性实验 实验了三种相机故障:仅前视相机故障、除前视相机外均故障、50%的相机卡帧。结果表明本文方法在任何情况下均比相机单一模态方法和其他融合方法性能更优。 4.5 消融研究 相机分支:与ResNet18 BEV编码器相比,使用本文的BEV编码器能大幅提高性能;FPN中的自适应特征对齐模块能略微提高性能;使用更大的2D主干能带来更好的性能。 动态融合模块:仅使用通道&空间融合(图3蓝色区域)即可大幅提高PointPillars、CenterPoint和TransFusion的性能,进一步使用自适应特征选择(图3橙色区域)能进一步提高性能。 A.附录 A.1 网络结构 FPN自适应模块的结构:如下图所示。

Your requirements could not be resolved to an installable set of packages.问题解决。

重点在于缺少的条件,“ - league/flysystem[1.1.0, ..., 1.x-dev] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.”大意是php.ini里面“fileinfo”缺失没有开启,安装或者启用PHP的fileinfo扩展。 找到php.ini文件把“extension=fileinfo ”句子前面的;注释去掉。 重启环境 再输入“ composer require maatwebsite/excel” 安装成功 输入“composer show -i”查看composer现在已安装的扩展包。

Python爬虫学习路径

1、首先学会基本的Python语法知识 2、学习Python爬虫常用到的几个重要内置库urllib, http等,用于下载网页 3、学习正则表达式re、BeautifulSoup(bs4)、Xpath(lxml)等网页解析工具 4、开始一些简单的网站爬取(博主从百度开始的,哈哈),了解爬取数据过程 5、了解爬虫的一些反爬机制,header,robot,时间间隔,代理ip,隐含字段等 6、学习一些特殊网站的爬取,解决登录、Cookie、动态网页等问题 7、了解爬虫与数据库的结合,如何将爬取数据进行储存 8、学习应用Python的多线程、多进程进行爬取,提高爬虫效率 9、学习爬虫的框架,Scrapy、PySpider等 10、学习分布式爬虫(数据量庞大的需求) 后续更新……

python爬虫报错:AttributeError: ‘NoneType‘ object has no attribute ‘xpath‘

今天学了一下python爬虫,遇到一个报错:AttributeError: 'NoneType' object has no attribute 'xpath',试了一下网上说的修改路径,不成功,差不多快要绝望的时候,从头到尾检查一遍代码才发现我在写请求头的时候把 User-Agent 写成了 User_Agent 真是不该的低级错误,而且Pycharm没有把问题行定位正确,只是定到了“xpath”这一行,其他的没有报错。

Linux系统下某个进程杀不掉,会自动重启

问题描述: ubuntu服务器下,使用nvidia-smi查看GPU使用情况,发现一直存在一个未知的python程序在长期使用GPU,使用kill命令杀进程和关机重启都无法解决,该程序会自动重启。 解决过程: 1、最初使用kill -9 PID命令,发现进程可以被杀掉,但随后会自动以新PID重启,PID也可以用top命令查询; 2、使用cd /proc/2135 和cat status命令查询其父进程PPID为2132,尝试先kill父进程,再kill掉子进程,依然发现没用; 3、再次尝试查找其源头的父进程,即该进程的父进程的父进程,发现PPID居然是1,意味着只要开着机,就会启动这个程序。怀疑是被人植入了木马程序。 4、最后cd /proc/2038并ls -ail,查找其PID对应占用的程序位置,想要直接删掉该未知程序: 5、将该目录下的python程序删除后,再次结束PID,成功kill掉该程序。 该图是删掉python后的文件目录 在目录下发现被人植入了挖矿程序 问题原因 note: 关于这个程序会反复重启的原因,实际上是由于用 系统下的cron工具 写入了计划任务(会周期检查是否有要执行的任务) # 查看当前root用户是否有计划任务 crontab -u root -l # 删除所有计划任务 crontab -r 详细cron的介绍和使用 所以原则上,只要删除掉 cron计划任务,再次kill掉任务 就不会重启了。

利用 OpenCV 和 Python 进行 3D 重建

OpenCV 是一个实时计算机视觉库。它具有非常强大的功能,使处理图像和获取有关图像的信息变得容易。在这篇文章中,我们将回顾一些用于从图像进行 3D 重建以制造自主机械臂的功能。 OpenCV 使用针孔相机模型。该模型通过使用透视变换将 3D 点投影到图像平面上来工作。 OpenCV 有一些功能可以帮助我们实现目标。这些功能与棋盘模型配合使用以校准模型,因此首先是获取棋盘并拍摄一些照片。我们拍了几张照片以获得更好的校准。 import glob import cv2 import numpy as np criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30 , 0.001) objp = np.zeros((9*6,3), np.float32) objp[:,:2] = np.mgrid[0:6.0:9].T.reshape(-1,2) objpoints = [] imgpoints = [] images = glob.glob('./Muestras_Calibracio/*.jpg') for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img,cv.COLOR_BGR2GRAY) ret , corners = cv.findChessboardCorners(gray,(6,9), None) if ret == True: objpoints.append(objp) corners2 = cv2.cornerSubPix(gray , corners , (11,11) , (-1,-1) , criteria) imgpoints.

研发经理职责总结

一、研发经理的产生 研发经理作为带有些许管理性质的技术岗职位,主要负责产品或项目的开发任务管理、技术攻关、技术决策,在非技术性产品或项目的团队里一般是多数情况下处于副手的角色,协助团队leader做技术侧的管理。 主要原因是大多数非技术性产品,除了技术管理之外,通常还需要有人进行横向部门进行沟通协调、外部沟通汇报、进度把控等事务性工作。一方面很难有人能既懂技术,又能在沟通、表达、协调上做的很好,另一方面,技术管理工作和非技术的事务性工作很难兼顾好,如果事务性工作占据时间过多,那么技术管理工作和技术能力就会有减弱,这对团队来说也不是不可接受的,所以通常把事务管理和技术管理分开,就有了研发经理岗位。 二、研发经理的意义 研发经理做为开发人员与项目经理或产品经理之间沟通衔接的桥梁,对于研发效率的提升有着非常大的作用。一个好的研发经理,能够为开发团队屏蔽一些伪需求,能够使用一些协作工具让团队更高效,让开发任务井然有序地进行,能带领团队不断提升战斗力。 三、研发经理的职责 下面我总结一些研发经理的工作职责,供大家参考: 1、沟通 1、负责与其他部门进行技术侧相关工作的沟通协调,沟通评审项目需求、产品需求的合理性、可行性等,屏蔽不合理需求对团队的干扰。 2、提升研发团队的凝聚力,打造积极向上的研发团队。 2、开发 1) 制定开发规范。指导编写和维护开发文档,包括开发规范、设计规范、团队沟通机制等,让新成员或对项目不熟的成员能够快速上手,提升项目成员规范意识。 2) 需求评审。评审需求说明文档、原型设计等,减少开发成果的返工次数,发现和指出需求考虑不周的地方。 3) 系统设计。梳理项目需求,根据需求对项目进行整体设计、模块设计以及重点功能设计,对重点和复杂的业务模块绘制业务流程图等。 4) 制定开发计划。根据需求说明进行工作任务分解,设置各项任务的合理工期,制定合理的开发计划,根据人员能力分配合适的开发任务。 5) 难点把控。核心功能设计、编码或检查,指导或负责关键环节实现方案,打造通用功能组件,提高开发效率,加强复用度。 6) 代码走查。 定期或不定期进行代码走查,保证开发质量。 3、团队建设 1) 建设质量意识。平时不要放过和忽略一些小问题,遇到问题后及时向大家提出,长久以往,团队的质量意识将会得到明显提高。 2) 加强产品意识。功能设计有时候不止是产品经理来做,有时候也可以是开发人员自己来做,做为一个想成为优秀开发人员的人来说,应该要有一定的产品思维,在开发时注重一些交互性、易用性等问题。 3) 提升学习意识。平时组织一些技术培训,可以分配一些学习任务。 4) 培养分享意识。相互分享技术经验和技术知识。 四、研发经理的能力培养 1、技术能力 2、表达能力 3、管理能力 4、多项目管理能力 5、学习能力 6、业务能力 五、研发经理常常犯的错误 下属不行自己上 对于刚提升到研发经理岗位的人来说,通常容易出现的问题是,当下面的开发不给力时,就自已顶上,导致自已忙死,不能把精力花在更有意义或更关键的事情上,而真正该做此事的开发人员却闲了下来。 这样不仅对自己不负责,对公司不负责,也对下属开发人员不负责。因为研发经理的首要职责不是替普通开发买单,开发人员不能按预期完成工作,应该指导他来解决,并且要求在此后加强任务反馈。另外,如果下属工作出现问题都由上级来解决,那下级也丧失了锻炼解决问题的机会。

POI实现导出word文件【内容包括文本,表格,图片】

使用POI生成word文档 业务要求: 网站页面内容导出为相关分析报告,内容包括文本描述,分析表格【行,列内容不固定】,echars图表等 引入poi相关依赖 <!-- poi相关依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.17</version> </dependency> 代码中所涉及数据集合结构 List<String> listColumns = new ArrayList<>(); List<List<String>> listLineData = new ArrayList<>(); //map中 img为base64格式字符串 item作为图片字描述的key List<Map<String,String>> listPicContent = new ArrayList<>() //图片处理 //处理页面所需图片存至服务器 for (int s = 0; s < listPicContent .size(); s++) { //base64字符串格式过长,后台采用StringBuffer接收 StringBuffer img = new StringBuffer(listPicContent .get(s).get("img")); Base64ToPicUtils.convertBase64ToImage(img,s + ""); } 导出文本内容渲染【内容导出顺序:表格 、文字描述对应echars图片】 //创建word文档对象 XWPFDocument document = new XWPFDocument(); //创建文本标题 XWPFParagraph title = document.

go配置文件热加载

参考:go 配置文件的热加载 - RandolphCYG的记录 - OSCHINA - 中文开源技术交流社区 go 配置文件的热加载 原创 RandolphCYG 之前写的 gin 项目中也用到了 viper 去监控配置文件的热加载,实际上后面部署用 k8s 后,这个功能实际上没啥用了。 但是对于不是 web 的一些小项目,可以做到快速复用,省时省力。重读在 gin 中写的配置文件热加载功能,发现实际上 watchConfig 方法只是输出了对配置文件的操作,实际上没有将配置文件反序列化到 go 的结构体变量中。还有之前用 pflag 获取输入的参数,这里就是配置文件的路径,其实一直没用过这个功能,仅仅是留空让判断配置文件路径的逻辑走到默认配置文件名称那里。这边也用 flag 替换加上了。 目录结构 ├── dynamicConfig │ ├── conf │ ├── go.mod │ ├── go.sum │ └── main.go 1. 配置文件 dynamicConfig/conf/conf.yaml 这个配置文件还可以复制一份到其他地方,例如我这边示例复制到了 /Users/randolph/Downloads/test.yaml,用来测试指定配置文件路径情况下,修改配置文件是否有效。 system: Mode: debug Addr: 127.0.0.1:8099 Debug: true database: Type: mysql UserName: root Password: adfgsf^&^*Y Addr: 192.168.99.9:3306 Name: TYT ShowLog: true # 是否打印SQL日志 MaxIdleConn: 10 # 最大闲置的连接数,0意味着使用默认的大小2, 小于0表示不使用连接池 MaxOpenConn: 60 # 最大打开的连接数, 需要小于数据库配置中的max_connections数 ConnMaxLifeTime: 60m # 单个连接最大存活时间,建议设置比数据库超时时长(wait_timeout)稍小一些 redis: Addr: 127.

tomcat session server集群配置

一,通过memcache 搭建tomcat session server 本实验基于centos 7.2 主要目的是通过memcache来保持会话 为了方便,本次实验总共需要四台服务器 centos 7.2: tomcat1.memcache1 centos 7.2: tomcat2,memcache2 centos 7.2: nginx windows: client 架构图 配置nginx 1,先安装nginx yum install nginx -y 2,配置nginx vim /etc/nginx/nginx.conf vim /etc/nginx/conf.d/default.conf 3,检查配置文件并启动服务 nginx -t systemctl start nginx ss -ntl 配置tomcat 因为要实现会话保持,并且基于memcached,因此需要一些关于memcached 的jar包 1,在ser1 安装tomcat和memcached yum install tomcat memcached -y 2,复制jar包到tomcat的lib下 3,配置tomcat的server.xml <Context path="/test" docBase="test" reloadable="true"> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:192.168.153.112:11211,n2:192.168.153.113:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context> 将配置文件复制到另外一台服务器上 scp /etc/tomcat/server.xml 192.168.153.113:/etc/tomcat/ 4,创建测试页面 mkdir /usr/share/tomcat/webapps/test vim /usr/share/tomcat/webapps/test/test.

人工智能笔记

第一章:绪论 1956年正式提出人工智能(artificial intelligence, AI)这个术语并把它作为一门新兴科学的名称。20世纪三大科学技术成就:空间技术、原子能技术、人工智能智能是知识与智力的总和。知识是一切智能行为的基础,智力获取知识并应用知识求解问题的能力 。即使通过图灵测试也不能说明计算机能思维。机器学习(machine learning):研究如何使计算机具有类似于人的学习能力,使它能通过学习自动地获取知识。模式识别(pattern recognition):研究对象描述和分类方法的学科。分析和识别的模式可以是信号、图象或者普通数据。 第二章:知识表示与知识图谱 知识: 在长期的生活及社会实践中、在科学研究及实验中积累起来的对客观世界的认识与经验。把有关信息关联在一起所形成的信息结构。 知识反映了客观世界中事物之间的关系,不同事物或者相同事物间的不同关系形成了不同的知识。 例如: “雪是白色的” 。 事实 “如果头痛且流涕,则有可能患了感冒” 。 知识 知识的特性: 相对正确性不确定性: 随机性、 模糊性、经验、不完全性引起的不确定性可表示性与可利用性: 知识的可表示性: 知识可以用适当形式表示出来,如用语言、文字、图形、神经网络等。 知识的可利用性: 知识可以被利用。 命题: 命题(proposition):一个非真即假的陈述句。命题逻辑:研究命题及命题之间关系的符号逻辑系统。命题逻辑表示法:无法把它所描述的事物的结构及逻辑特征反映出来,也不能把不同事物间的共同特征表述出来。连接词:非、析取、合取、蕴含、等价 一阶谓词逻辑表示法的特点: 优点:自然性、精确性、严密性、容易实现 局限性: 不能表示不确定的知识、 组合爆炸、 效率低 产生式 产生式通常用于表示事实、规则以及它们的不确定性度量,适合于表示事实性知识和规则性知识 知识图谱 知识图谱(Knowledge Graph/Vault),又称科学知识图谱,用各种不同的图形等可视化技术描述知识资源及其载体,挖掘、分析、构建、绘制和显示知识及它们之间的相互联系。知识图谱是由一些相互连接的实体及其属性构成的。三元组是知识图谱的一种通用表示方式: (实体1-关系-实体2):中国-首都-北京 (实体-属性-属性值):北京-人口-2069万知识图谱也可被看作是一张图,图中的节点表示实体或概念,而图中的边则由属性或关系构成。 第三章:确定性推理方法 (1)确定性推理:推理时所用的知识与证据都是确定的,推出的结论也是确定的,其真值或者为真或者为假。 (2)不确定性推理:推理时所用的知识与证据不都是确定的,推出的结论也是不确定的。 自然演绎推理: 从一组已知为真的事实出发,运用经典逻辑的推理规则推出结论的过程。推理规则:P规则、T规则、假言推理、拒取式推理 。优点:表达定理证明过程自然,易理解。拥有丰富的推理规则,推理过程灵活。便于嵌入领域启发式知识。缺点:易产生组合爆炸,得到的中间结论一般呈指数形式递增。 例: 例3.1 已知事实: (1)凡是容易的课程小王( Wang )都喜欢;(2)C 班的课程都是容易(3)ds 是 C 班的一门课程。求证:小王喜欢 ds 这门课程。 证明:定义谓词: EASY ( x ):x 是容易的 LIKE ( x, y ):x 喜欢 y

ffmpeg学习

ffmpeg初学 ffmpeg ffmpeg 相关原理参考 AVFormatContext:解封装功能的结构体,包含文件名、音视频流、时长、比特率等信息; AVCodecContext:编解码器上下文,编码和解码时必须用到的结构体,包含编解码器类型、视频宽高、音频通道数和采样率等信息; AVCodec:存储编解码器信息的结构体; AVStream:存储音频或视频流信息的结构体; AVPacket:存储音频或视频编码数据; AVFrame:存储音频或视频解码数据(原始数据); 代码参考 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include <libavutil/avassert.h> #include <libavutil/channel_layout.h> #include <libavutil/opt.h> #include <libavutil/mathematics.h> #include <libavutil/timestamp.h> #include <libavformat/avformat.h> #include <libswscale/swscale.h> #include <libswresample/swresample.h> #define STREAM_DURATION 50.0 /*录制视频的持续时间 秒*/ #define STREAM_FRAME_RATE 5 /* images/s 这里可以根据摄像头的采集速度来设置帧率 */ #define STREAM_PIX_FMT AV_PIX_FMT_YUV420P /* default pix_fmt */ #define SCALE_FLAGS SWS_BICUBIC //存放视频的宽度和高度 int video_width; int video_height; // 单个输出AVStream的包装器 typedef struct OutputStream { AVStream *st; AVCodecContext *enc; /*下一帧的点数*/ int64_t next_pts; int samples_count; AVFrame *frame; AVFrame *tmp_frame; float t, tincr, tincr2; struct SwsContext *sws_ctx; struct SwrContext *swr_ctx; }OutputStream; typedef struct IntputDev { AVCodecContext *pCodecCtx; AVCodec *pCodec; AVFormatContext *v_ifmtCtx; int videoindex; struct SwsContext *img_convert_ctx; AVPacket *in_packet; AVFrame *pFrame,*pFrameYUV; }IntputDev; static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt) { AVRational *time_base = &fmt_ctx->streams[pkt->stream_index]->time_base; printf("

vscode 安装

1. go env -w GO111MODULE=on 2. go env -w GOFLAGS=-mod=mod" 2.go env -w GOPROXY=https://goproxy.io,direct 3. 安装 gin 包 go get github.com/gin-gonic/gin 下载vscode windows shift+ctrl+p go.json "go.useLanguageServer": true, "timeline.excludeSources": [], "[go]": { "editor.snippetSuggestions": "none", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports": true } }, "gopls": { "completeUnimported": true, "usePlaceholders": true, "completionDocumentation": true, "deepCompletion": true, "matcher": "fuzzy", "hoverKind": "SynopsisDocumentation" // No/Synopsis/Full, default Synopsis }, "files.eol": " ", // formatting only supports LF line endings "

Xavier NX实现硬解码H264&H265

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、NX的硬解码?二、测试代码三、软硬解对比四、总结 前言 最近在做一个项目,使用opencv的VideoCapture拉流并把帧送进模型推理,结果发现VideoCapture本身使用的是cpu的软解码,占用了大量的资源,后来就去研究使用设备本身的硬解码资源去分摊cpu的压力。 一、NX的硬解码? Xavier NX 使用OpenCV+GStreamer实现硬解码 NX的硬解码叫NVDEC,硬编码交NVENC,这两个都是专门的硬件去做的,效率比cpu高很多。这里要多说一句,NX是共享内存,就是gpu,vpu和cpu都是一个内存,不像台式机有专用显存,显存与内存数据格式不一样,需要转换(实测0-2ms),不能拿来直接用。NX就没有这个问题,但是这里我们不讨论这么深的问题,感兴趣的可以私下里去研究下。先上个图,这里需要使用jtop看 注意看红框里面的,如果解码器没有用这个就是OFF,旁边的就是编码器,不在这次讨论范围内。 二、测试代码 首先你要安装了opencv+gstreamer,具体安装方法我会在另一篇文章里面介绍,这里不多说,直接上代码。这里我们使用官方提供的代码 # -------------------------------------------------------- # Camera sample code for Tegra X2/X1 # # This program could capture and display video from # IP CAM, USB webcam, or the Tegra onboard camera. # Refer to the following blog post for how to set up # and run the code: # https://jkjung-avt.github.io/tx2-camera-with-python/ # # Written by JK Jung <jkjung13@gmail.com> # -------------------------------------------------------- import sys import argparse import subprocess import cv2 WINDOW_NAME = 'CameraDemo' def parse_args(): # Parse input arguments desc = 'Capture and display live camera video on Jetson TX2/TX1' parser = argparse.

SpringBoot - SWAGGER中配置.pathMapping(“XXXX“)引发的404错误

写在前面 SpringBoot - SWAGGER2的集成与使用(一) SpringBoot - SWAGGER2公共模块的抽象集成与使用(二) SpringBoot - SWAGGER3公共模块的抽象集成与使用(三) SpringBoot - 集成SWAGGER的常见问题 问题描述 A. 前端UI将SWAGGER-UI集成到系统的菜单中了,SWAGGER-UI是用iframe形式打开的; B. 直接在前端UI的菜单中访问SWAGGER-UI正常,接口访问正常; C. 如果直接使用:http://后端服务地址:后端端口/swagger-ui/index.html访问SWAGGER-UI,页面显示正常,但是测试接口的时候报404错误; D. SWAGGER的配置如下: @Bean public Docket createRestApi() { return new Docket(DocumentationType.OAS_30) // 是否启用Swagger .enable(enabled) // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) .apiInfo(apiInfo()) // 设置哪些接口暴露给Swagger展示 .select() // 扫描所有有注解的api, 用这种方式更灵活(本系统默认方式) //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) // 扫描指定包中的swagger注解 .apis(RequestHandlerSelectors.basePackage("cn.hadoopx.web.controller.system")) // 扫描所有 //.apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() /* 设置安全模式,swagger可以设置访问token */ .securitySchemes(securitySchemes()) .securityContexts(securityContexts()) .pathMapping("/dev-api"); } 问题分析 A. 为什么直接在前端UI的菜单中访问SWAGGER-UI正常,接口访问正常? 在前后端分离架构上,SWAGGER-UI使用iframe方式嵌套,生成的服务地址也是前端暴露的地址端口,然后请求过来时将请求代理到后端的目标地址上,同时前端会去掉’.pathMapping(“/dev-api”)'设置的请求前缀,所以访问是正常的。 B. 为什么直接使用:http://后端服务地址:后端端口/swagger-ui/index.html访问SWAGGER-UI,页面显示正常,但是测试接口的时候报404错误? .pathMapping(“/dev-api”),只是一个附加的虚拟的路径,并没有实际映射作用到对应的@RequestMapping的路径上,实际的访问路径依然是去掉请求前缀"/dev-api"的,但是它会作用到生成SWAGGER-DOC里的API路径上,会在API路径的前面拼接上前缀,所以直接访问会报错。 C. 如何解决? 第一种方式:针对这个情况可以写个全局过滤器,将请求路径的前缀去掉; 第二种方式:测试的时候,不使用SWAGGER,直接使用POST-MAN测试,使用服务接口真实的调用地址+端口(不带/dev-api前缀);

GPU error:CUDA超内存

RuntimeError: CUDA error: out of memory CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1. 出现此错误并不是调整batchsize或者with torch.no_grad():能解决问题,出现此问题是nvidia的GPU会出现假释放内存bug,看上去释放了,实则没有释放。 解决办法:关闭进程,或者电脑关机,若使用租用的云,联系客服处理。

mysql8.0 zip绿色版安装教程Windows

官网下载链接:MySQL :: Download MySQL Community Server 下载完解压,新建 my.ini文件,创建data目录。 my.ini文件内容 [mysqld] default_authentication_plugin=mysql_native_password # 设置mysql数据库的数据的存放目录 basedir=D:\dev\mysql-8.0.30-winx64 datadir=D:\dev\mysql-8.0.30-winx64\data #设置3306端口 port = 3306 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 服务端使用的字符集默认为UTF8 character-set-server = utf8mb4 performance_schema_max_table_instances = 600 table_definition_cache = 400 table_open_cache = 256 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB #最大连接数 max_connections=200 [mysql] default-character-set = utf8mb4 [client] default-character-set = utf8mb4 开始校验安装,在bin目录下: .\mysqld.exe --initialize --console 图中红框,则是需要管理员权限执行 管理员身份安装成功启动 mysqld.exe --install net start mysql 开启服务。注:部分系统需要管理员权限执行。 注:net stop mysql 关闭服务。任务管理器服务可结束进程。 登录mysql,更改密码。 mysql -u root -p set password= "

URP源码学习(六)后处理

URP把后处理分成了两个pass,finalPass只在相机抗锯齿模式为FastApproximateAntialiasing时调用。 开启条件,在ForwardRenderer判断 lastCameraInTheSatck。 这名字有误导性,取的值是RenderingData的resolveFinalTarget,而resolveFinalTarget是在InitializeRenderingData函数设置的,取的值是requiresBlitToBackbuffer,InitializeRenderingData被RenderSingleCamera调用。requiresBlitToBackbuffer会在scene相机渲染,以及stack的最后一个相机设为true。这个参数的真正意义,我的理解是表示这个相机是否要渲染到屏幕上,如果要渲染到屏幕,再去判断相机是否开启后处理。后处理已经把画面渲染到屏幕上了,所以finalBlitPass不需要执行。 bool applyFinalPostProcessing = anyPostProcessing && lastCameraInTheStack &&renderingData.cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing; applyFinalPostProcessing: 为true的条件,相机开启后处理,并且lastCameraInTheStack为true、抗锯齿模式为FastApproximateAntialiasing。applyPostProcessing: 只要相机开启后处理就为true。如果lastCameraInTheStack为true,会设置渲染目标rt,并设置是否需要对sRGB做转换。 PostProcessPass,驱动各个后处理shader 数据 MaterialLibrary:定义实现各个效果的material。PostProcessData:ScriptableObject,配置shader和贴图。在editor可以创建ScriptableObject的实例,但是并不能编辑shader,可能是个未开发完的功能。ShaderConstants:缓存shader名字对应的id。 RenderFinalPass,渲染final pass var material = m_Materials.finalPass; 获取material,用于后续渲染。 if (cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing) material.EnableKeyword(ShaderKeywordStrings.Fxaa); 逻辑上来说判断抗锯齿模式是多余的,只有fxaa才会用这个分支渲染。 SetupGrain(cameraData, material); SetupDithering(cameraData, material); 如果对应效果开启,设置shader关键字或贴图,shader用的是finalPass。这俩并不对应具体的shader。 Render函数 Render函数里有个有趣的写法,int GetSource() => source;类似这种,在函数内定义函数。 这个函数按顺序渲染各个后处理效果,简单看下流程。 cmd.Blit(GetSource(), BlitDstDiscardContent(cmd, GetDestination()), m_Materials.stopNaN); 最先渲染的是一个特殊的NaNshader,可选的,作用是将不合法的颜色值用自定义的颜色输出,应该是调试用的,判断颜色是否合法的代码在CoreRP的Common.hlsl文件。 DoSubpixelMorphologicalAntialiasing(ref cameraData, cmd, GetSource(), GetDestination()); 处理SubpixelMorphological模式的抗锯齿,消耗较大,移动平台使用要看情况。 DoDepthOfField(cameraData.camera, cmd, GetSource(), GetDestination(), cameraData.pixelRect); 对scene camera不开启。Gaussian和Bokeh两种模式 DoMotionBlur(cameraData.camera, cmd, GetSource(), GetDestination()); 对scene camera不开启。是相机的运动模糊,物体运动是没有效果的。 DoPaniniProjection(cameraData.camera, cmd, GetSource(), GetDestination()); 对scene camera不开启。帕尼尼投影,一种圆柱形投影,效果是扭曲两侧,突出中间,在渲染大视角的时候提供更好的效果。 后面的都和UberPost shader相关

基于kafka的日志收集分析平台

目录 基于kafka的日志收集分析平台架构图 数据走向流程 一、项目目的 二、项目环境 三、项目步骤 准备好3台虚拟机搭建nginx集群 配置好三台nginx机器的静态ip地址,防止dhcp模式动态获得ip地址对我们服务器造成影响 三台机器都配置好dns dns解析顺序: 修改主机名 每一台机器上面写好域名解析 安装基本软件,解决依赖关系 安装时间同步服务 关闭防火墙 关闭selinux nginx搭建 nginx配置文件修改 新建我们的配置文件 语法检测,检测配置文件语法是否正确 使用三台虚拟机搭建kafka和zookeeper集群 安装java和kafka 配置kafka 配置zookeeper 启动kafka 启动zookeeper 创建一个topic来测试kafka 创建topic : 创建生产者 创建消费者 filebeat部署 yum安装filebeat 测试filebeat能否生产数据 启动filebeat服务 接下来用kafka自带的消费者程序来测试一下我们能否消费到filebeat生产的nginxlog主题里面的数据 可以到filebeat的记录数据的文件里面看一下消费者有没有成功消费到数据。(/var/lib/filebeat/registry/filebeat/) 编写python脚本,模拟消费者消费数据,然后将所需字段提取出来整理后放入数据库里面 日志收集平台详细架构图: 基于kafka的日志收集分析平台架构图 数据走向流程 一、项目目的 主要是为了模拟企业在大数据背景下的日志收集、存储,分析,消费等流程。 二、项目环境 Windows10机器(测试用)、Linux(centos7)、Nginx(1.20.1)、Filebeat(7.17.5)、kafka(1.12)、zookeeper(3.6.3)、Pycharm2020.3、mysql(5.7.34) 三、项目步骤 准备好3台虚拟机搭建nginx集群 配置好三台nginx机器的静态ip地址,防止dhcp模式动态获得ip地址对我们服务器造成影响 三台机器都配置好dns dns解析顺序: 1、浏览器的缓存 2、本地hosts文件 --linux(/etc/hosts) 3、找本地域名服务器 -- linux(/etc/resolv.conf) 修改主机名 [root@nginx-kafka01 /]# cat /etc/hostname nginx-kafka01 [root@nginx-kafka02 ~]# cat /etc/hostname nginx-kafka02 [root@nginx-kafka03 ~]# cat /etc/hostname nginx-kafka03 每一台机器上面写好域名解析 [root@nginx-kafka01 /]# cat /etc/hosts 127.

postgresql更改数据目录

注意本文环境是基于CentOS 7 以及Postgre 12 1、查看基础信息 [root@YZX-RD-37 app]# su - postgres [postgres@YZX-RD-37 data]$ psql psql (12.6) Type "help" for help. postgres=# SHOW data_directory; data_directory ------------------------ /var/lib/pgsql/12/data (1 row) 2、停止PG [root@YZX-RD-37 app]# systemctl stop postgresql-12 [root@YZX-RD-37 app]# ps aux | grep pg root 4441 0.0 0.0 112812 976 pts/0 S+ 18:46 0:00 grep --color=auto pg 3、创建基础环境 [root@YZX-RD-37 app]# mkdir /app/postgresql [root@YZX-RD-37 app]# chown -R postgres.postgres /app/postgresql/ 4、安装rsync [root@YZX-RD-37 app]# yum install -y rsync 5、拷贝现在的数据目录到新的数据目录

Mybatis缓存

什么是缓存:存在内存中的临时数据 为什么使用缓存:减少与数据库的交互次数,从缓存中查询,减少系统开销,提高系统性能,解决高并发系统性能问题 什么时候用缓存: 适用于缓存的:经常查询但不经常修改的(eg: 省市,类别数据),数据的正确与否对最终结果影响不大的 不适用缓存的:经常改变的数据 , 敏感数据(例如:股市的牌价,银行的汇率,银行卡里面的钱)等等, mabatis分一级缓存和二级缓存 一级缓存 一级缓存默认开启 一级缓存查询分析:执行sql语句,第一次查询用户ID为1时先去缓存中找,没找到则去数据库查找并将数据写入缓存,第二次查询用户ID为1时,去缓存中找,若找到直接从缓存中获取数据 一级缓存什么时候清空:sqlsession对象销毁时,增删改,commit提交 二级缓存 二级缓存是SqlSessionFactory的缓存,同一个SqlSessionFactory创建的SqlSession才能共享二级缓存的内容,并且可以操作二级缓存. 二级缓存要手动开启 在主配置文件<setting name="cacheEnabled" value="true"/> 在映射文件<cache/>标签在你想用二级缓存的语句标签中添加useCache="true" 默认为true 不想用设置为false 二级缓存注意 : 1.一级缓存清空后二级缓存才能生效 2.要进行二级缓存的POJO类必须实现Serializable接口,就可以使用序列化方式来保存对象。 如果对您有帮助,免费的赞点一个 感谢🙏~~~

微信小程序 async runtime.js

防止跳不过去 复制到这儿 附带源链接 https://github.com/facebook/regenerator/blob/5703a79746fffc152600fdcef46ba9230671025a/packages/regenerator-runtime/runtime.js 在⼩程序⽬录下新建⽂件夹 lib/runtime/runtime.js,将代码拷⻉进去 在需要使⽤async语法的⻚⾯js⽂件中,进行引⼊(不支持全局引⼊) import regeneratorRuntime from '../../lib/runtime/runtime'; /** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ var regeneratorRuntime = (function (exports) { "use strict"; var Op = Object.prototype; var hasOwn = Op.hasOwnProperty; var undefined; // More compressible than void 0. var $Symbol = typeof Symbol === "

金仓数据库 KingbaseES PL/SQL 过程语言参考手册(7. PL/SQL 静态 SQL)

7. PL/SQL 静态 SQL 静态 SQL是 PL/SQL 的一种功能,它允许在 PL/SQL 语句中直接使用 SQL 语法。 本章描述静态 SQL 并解释如何使用它。 "静态 SQL 语句中的名称解析" 7.1. 静态SQL说明 静态 SQL 与 SQL 具有相同的语法,除非另有说明。 7.1.1. 声明 这些是 PL/SQL 静态 SQL 语句,它们的语法与相应的 SQL 语句相同,除非另有说明: - SELECT(此语句也称为查询) 有关 PL/SQL 语法,请参阅“ SELECT INTO 语句”。 数据操作语言 (DML) 语句: INSERT 有关 PL/SQL 语法,请参阅“ INSERT 语句扩展”。 UPDATE 有关 PL/SQL 语法,请参阅“ UPDATE 语句扩展”。 DELETE 有关 PL/SQL 语法,请参阅“ DELETE 语句扩展”。 MERGE(有关语法,请参阅SQL 语言参考) 事务控制语言 (TCL) 语句: COMMIT(有关语法,请参阅SQL 语言参考)

Linux安装和使用OpenCV

系统版本 Ubuntu 20.04 第一步:下载OpenCV 官网下载对应版本的source:https://opencv.org/releases/ 这里我们选择下载当前最新版本source进行下载:OpenCV-4.6.0 第二步:更新依赖,非常重要!!!如果缺少某个依赖文件,编译不会报错。但后续使用opencv相关函数的时候就是提示错误,只能卸载重新编译。 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev 第三步:解压、编译安装(需要一段时间,耐心。。。) 将下载的opencv-4.6.0.zip 拷贝到虚拟机或者云服务器下 unzip opencv-4.6.0.zip // 解压 cd opencv-4.6.0 mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j4 // 4核同时编译 sudo make install // 需要使用root权限 第四步:配置环境变量 4.1 将opencv的库加入路径: sudo vim /etc/ld.so.conf.d/opencv.conf 有可能打开的是空文件,没事,在文件中加入:/usr/local/lib,保存退出,执行:sudo ldconfig。

OpenCV图像缩放插值之BiCubic双三次插值

转载请注明出处。 文章链接:https://blog.csdn.net/duiwangxiaomi/article/details/123845869?spm=1001.2014.3001.5501 图像缩放算法简介 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值(立体插值),兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。双三次插值效果最好,但速度较慢。 OpenCV中实现图像缩放的函数为 void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR ); 参数说明: src:输入,原图像,即待改变大小的图像; dst:输出,改变大小之后的图像,这个图像和原图像具有相同的内容,只是大小和原图像不一样而已; dsize:输出图像的大小。如果这个参数不为0,那么就代表将原图像缩放到这个Size(width,height)指定的大小;如果这个参数为0,那么原图像缩放之后的大小就要通过下面的公式来计算: dsize = Size(round(fxsrc.cols), round(fysrc.rows)) 其中,fx和fy就是下面要说的两个参数,是图像width方向和height方向的缩放比例。 fx:width方向的缩放比例,如果它是0,那么它就会按(double)dsize.width/src.cols来计算; fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算; interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种: INTER_NEAREST - 最邻近插值 INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法 INTER_AREA - 区域插值 resampling using pixel area relation.It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.

Android中的Switch控件

1、Switch中时Android中自带的开关控件: 效果如下: 2、完整代码如下所示: <Switch android:id="@+id/main_switch" android:layout_width="@dimen/x103" android:layout_height="@dimen/x3" android:track="@drawable/setting_button_track" android:textOn="@string/version_on" android:textOff="@string/version_off" android:thumb="@drawable/setting_button_thumb" android:layout_marginLeft="@dimen/x429" android:showText="true" android:switchTextAppearance="@style/SwitchTextAppearance" android:layout_gravity="center" tools:ignore="UseSwitchCompatOrMaterialXml" /> 3、Switch的样式,文字编写都为自定义的,代码如下所示: ①setting_button_track <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/setting_on_track" /> <item android:drawable="@drawable/setting_off_track" /> </selector> (1)setting_on_track <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@color/color_on"/> <corners android:radius="@dimen/x32"/> <size android:width="@dimen/x48" android:height="@dimen/x24"/> </shape> (2)setting_off_track <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@color/color_off"/> <corners android:radius="@dimen/x32"/> <size android:width="@dimen/x48" android:height="@dimen/x24"/> </shape> ②setting_button_thumb <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="

QCustomPlot 坐标轴间隔显示刻度标签

1. 可直接使用,使用场景:画散点图时,需要显示多个点,但是横坐标标签全部显示的话,就会拥挤,故事用这个方法 //设置坐标 QVector<QString>xLable; QVector<double>xpos; int num = 10; xLable.resize(num); xpos.resize(num); int xmin = m_freValue_list.time_t_vector.first(); int xmax = m_freValue_list.time_t_vector.last(); double xspan = (xmax+1 - xmin)/num; for(int i=0;i<num;i++) { xpos.append(xmin+i*xspan); xLable.append(QString::number(xmin+i*xspan)); } QSharedPointer<QCPAxisTickerText> xaixsTicker = QSharedPointer<QCPAxisTickerText>(new QCPAxisTickerText); xaixsTicker->addTicks(xpos,xLable); ui->widget_freqStatisticsPlot->xAxis->setTicker(xaixsTicker); ui->widget_freqStatisticsPlot->xAxis->setRange(m_FreScatterNum-MAX_POINT_NUM+1,m_FreScatterNum+1); ui->widget_freqStatisticsPlot->replot(); 2.需要将横坐标贴上标签 //设置坐标 QVector<QString>xLable; QVector<double>xpos; int num = 10; xLable.resize(num); int xmin = 0; int xmax = 4096;//频域图绘制4096个点 double xspan = (xmax+1 - xmin)/num; xpos.resize(num); for(int i=0;i<num;i++) { xpos.append(xmin+i*xspan); xLable.append(QString::number((xmin+i*xspan)/210.0,'f',1)); } QSharedPointer<QCPAxisTickerText> xaixsTicker = QSharedPointer<QCPAxisTickerText>(new QCPAxisTickerText); xaixsTicker->addTicks(xpos,xLable); ui->FreqPlot->xAxis->setTicker(xaixsTicker); ui->FreqPlot->xAxis->setRange(0,4096); ui->FreqPlot->replot(); 注意:此方法在支持缩放的图形中,会出现问题,需要配合,在 槽函数中

C#计算字符串

C#计算字符串 var expression=“1+2*(2+3)”; object result = new DataTable().Compute(expression, ""); //返回object 可以转换

Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago.

最近租了一台服务器,想用一下远程服务器,然后在部署自己的web项目到服务器上面的时候遇到了MYSQL远程连接不上服务器的情况,看了很多博主的文章问题都没有得到解决,最后想着不是MYSQL的设置问题就是服务器的设置问题,就觉着可能是被什么拦截了,然后找到了解决办法(问题附下图): 因为是服务器,所以 1、首先要看自己的防火墙有没有开,如果开了的话从你的主机访问服务器可能会被拦截,所以首先需要打开防火墙(如果会防火墙放行的话更好,更安全),本人使用的是CentOS 7.8,关闭防火墙的命令是: systemctl stop firewalld 2、如果防火墙放行(或关闭)了,但是还是没法连接上服务器的数据库,那么可能是你的数据库所占用的port(端口)没有开放,比如常用的MYSQL是3306端口,Redis是6379端口等。放行端口需要在你购买服务器的地方进行,找到访问控制-安全组-添加入口规则(一般添加你要用的端口就行)即可。 在这个基础上,然后如果你的MYSQL本身配置没有什么问题的话,应该就可以连接成功了 本人目前是小白一个,只是发了解决了我的问题的方法,如果哪里不对或者可以有更好的做法,还请大佬指正 

图片验证码实现的几种方式

一、Google Kaptcha 1、简介 kaptcha 是一个非常实用的验证码生成工具。有了它,你可以生成各种样式的验证码,因为它是可配置的。kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.KaptchaServlet,生成一个图片。同时将生成的验证码字符串放到 HttpSession中。 使用kaptcha可以方便的配置: 验证码的字体验证码字体的大小验证码字体的字体颜色验证码内容的范围(数字,字母,中文汉字!)验证码图片的大小,边框,边框粗细,边框颜色验证码的干扰线(可以自己继承com.google.code.kaptcha.NoiseProducer写一个自定义的干扰线)验证码的样式(鱼眼样式、3D、普通模糊……当然也可以继承com.google.code.kaptcha.GimpyEngine自定义样式) 2、maven依赖 <dependency> <groupId>pro.fessional</groupId> <artifactId>kaptcha</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>com.jhlabs</groupId> <artifactId>filters</artifactId> <version>2.0.235</version> </dependency> 3、验证码配置类 import java.util.Properties; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; @Component public class KaptchaConfig { @Bean public DefaultKaptcha getDefaultKaptcha() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 图片边框 properties.setProperty("kaptcha.border", "no"); // 边框颜色 properties.setProperty("kaptcha.border.color", "black"); //边框厚度 properties.setProperty("kaptcha.border.thickness", "1"); // 图片宽 properties.setProperty("kaptcha.image.width", "200"); // 图片高 properties.setProperty("kaptcha.image.height", "

vue-indexDB 浏览器数据库操作类

/** * 这是前端浏览器indexDB工具类 * 可实现创建数据库增删改查操作 * date 20220626 author by lin */ export class dbActive{ /** * 构造函数 * @param dbname type string 数据库名称 * @param tbName type []表对象名称多个表数组 * @param field type obj表字段对象,直接传入新增数据的对象如{height:15},那么将height作为字段名 */ constructor(dbname, tbName,field) { this.db = null; //数据库对象 this.tableName = tbName; //表格名称[] this.dbName = dbname //数据库名称 myDB this.dataList = []; this.field = field; this.result = {success:true,msg:"操作成功",data:[]} //默认返回样式 } /** * 由于初始化数据库是异步函数,此时需用await等待其执行完毕,先调用此函数 * @param v 版本号默认为1, * @returns {Promise<unknown>} */ async initDB(v) { v = v > 1 ?

读取txt数据文件算法

1.istringstream 【C++】使用istringstream根据分隔符分割字符串 - Flix - 博客园 istream& getline ( istream &is , string &str , char delim ); 第一个参数为 is 表示一个 istringstream,第二个参数表示我们要将字符串分割的结果通过 getline 逐个放入 str 中,第三个参数为分隔符,注意分隔符只能为字符型,默认的是空格分隔,如果是逗分割,即',',而不是字符串","。 C++ getline():从文件中读取一行字符串_睿科知识云的博客-CSDN博客_c++从文件读取一行 #include <sstream> #include <iostream> #include <vector> using namespace std; int main() { string s = "a,b,c,d"; istringstream iss(s); string buffer; while(getline(iss, buffer, ',')) //while(getline(iss, buffer, ' ')) { cout<<buffer<<endl; } return 0; } C++中使用stringstream与getline处理一行被空格(逗号)隔开的数据_发如雪Jay的博客-CSDN博客_stringstream遇到空格 while (getline(fileStream, rowString, '\n'))//读取一行 { std::istringstream is(rowString);

EtherCAT之TwinCAT3安装、使用

目录 一. 环境:Win10专业版(i7处理器,intel网卡)+VS Community 2017+TC3 二、开启虚拟化,关闭超频。 三、安装TC3.1 四、新建PLC项目 五、新建c++项目 一. 环境:Win10专业版(i7处理器,intel网卡)+VS Community 2017+TC3 备注:如果在虚拟机中安装,参考官方文档《TwinCAT3软件版本管理指南》2.2.1 通过虚拟机管理开发环境 备注:在TC中开发c++程序模块,需要添加网卡适配器驱动,以及windows的sdk/安装证书,操作过程需要参考官方文档《TwinCAT3 C++/Simulink教程》 备注:官方文档非常丰富,强烈建议学习。倍福虚拟学院: 课程类别 (beckhoff.com.cn) 刚接触TwinCAT3的小伙伴多多看看视频课程以及文档资料!!! 安装VS2017 正常安装即可。 备注1:旧的TC3.1支持Win10和VS2015,如果安装的是2017及以上版本,则安装TC3.1时会集成VS2013shell,此环境无法开发c++和matlab程序,但是能够运行这些程序。 备注2:安装顺序:安装VS->安装TC;卸载顺序:卸载TC->卸载VS 备注3: 最新的TC3下载地址,最高支持VS2019。 Software | 倍福 中国 备注4:本文介绍了TwinCAT的安装、简单使用、PLC以及与c++程序的ads通讯。参考了倍福虚拟学院的官方文档,大家可以在倍福虚拟学院中找到。 二、开启虚拟化,关闭超频。 在安装之前要配置一下主板的BIOS: 关闭 Hyper-Threading 的功能打开 Intel VirtualizationTechnology Extensions (VT-x)功能 ,这个主要是因为关系到TC3在wind下实现实时内核的问题 三、安装TC3.1 1.双击打开TC31-Full….exe文件 2.等待,然后点击next 3.许可协议点击accept,点击next 4.点击next 5. 点击next 我的电脑系统中已经装了vs2015,所以会显示下图。因为我TC3属于旧版本,暂时不支持vs2017及以上版本,如果vs版本再高,旧版本的TC3就只能集成一个vs2013的内核。最新的版本可以安装vs2017/vs2019。 勾选2015,next 6.点击Install,开始安装 安装过程,需要等待时间较久: 选择“安装” 7.点击Finish 8.点击Yes,重启电脑 9.完成重启后,开机进入桌面后,会自动出现TC的画面,然后消失,这是正常开机自启动画面。桌面右下角会出现TC的图标。 单击打开选项,选择如下图,打开TC界面。 10.界面如下 备注:TC的实际界面其实就是VS的界面,安装TC相当于给VS加个插件。 四、新建PLC项目 备注:下面的步骤都是基于“本地连接”,没有单独的主机、从机,即在同一台pc机上实现TC的plc程序和VS的c++程序通信(ads通信) 1. 依次选择FILE->NEW->Project 2.按照下图依次点击 3.试用版授权激活 在不连接网络的情况下,可以根据实际需求重复激活使用。TwinCAT3 开发环境可以自动检测项目中所需要的授权,并且在运行项目的时候进行提示,比如当项目在本地或者目标控制器中被激活的时候,会提示那些试用版授权应该被激活。具体步骤如下: 点开 SYSTEM 下的 License 备注:下图是已经激活后的图

2022年网络安全行业发展趋势

中国报告大厅网讯,网络信息安全是当下互联网用户很重视的问题,并且大数据等技术的革新也加剧了市场安全隐患问题。网络安全企业逐渐在向多元化方向发展,未来整个网络体系化安全是行业发展必然趋势。以下是2022年网络安全行业发展趋势。 2022年,5g网络、人工智能、工业互联网、大数据中心等一系列新基础设施成为创新热点。以互联网为代表的网络信息技术日益成为创新驱动发展的主导力量。网络信息产业面临着宝贵的历史机遇和广阔的发展前景,应用安全的提升也将会大幅增长。 近年来,我国政府一直出台多项政策推动网络信息安全行业的发展,以满足对政府、企业等网络信息安全的合规要求。要想网络信息安全行业的发展稳定,离不开移动应用软件的加固检测,加强个人隐私信息合规。 从国家层面的政策上,两方面推动我国网络安全行业发展,一方面,加强对网络安全的重视,提高网络安全产品的应用规模;另一方面,从硬件设备等基础设施上杜绝网络安全隐患。 网络安全行业发展趋势提到,网络安全行业内不同产品间的技术差异使得不同厂商在不同的产品领域具有技术和产品上的优势;同时,用户对于网络安全的多元化需求也使得网络安全市场呈现出多元化的发展趋势,厂商在自身定位上也会寻找差异化竞争的优势。这使得网络安全行业在各个细分领域均有着细分领域龙头企业,例如IDS/IPS及UTM领域的启明星辰、防火墙领域的天融信、信息加密/身份认证领域的卫士通等。 随着互联网的发展,网络接入方式和接入终端逐渐多样化,用户业务和网络安全威胁也不断变化,企业急需构建一个以数据和身份为中心、与当前数字化发展趋势更加相适应的安全防护机制。网络安全行业发展趋势指出在此背景下,业界开始提出零信任安全概念,提倡通过基于身份和应用的细粒度授权、持续动态威胁分析和管控来提升整体业务安全性。 网络安全行业发展趋势提到,随着信息技术及其应用范围的不断发展,信息安全问题也越来越复杂,对信息安全威胁的检测和防护已很难由单个安全设备来完成。 因此,由单个安全设备独立进行防护、安全设备独立于网络之外单独建设等传统模式已无法满足新的安全防护需求,将交换机、无线产品等网络设备与安全设备整合协同进行安全防护的整网体系化安全成为网络安全发展的必然趋势。 在国家政策的一系列扶持下,我国的网络安全市场规模不断扩大并且行业也在满足用户需求逐渐向多元化的方向发展。

ssh-keygen 的 详解

1.关闭防火墙 在外部访问CentOS中部署应用时,需要关闭防火墙。 关闭防火墙命令:systemctl stop firewalld.service 开启防火墙:systemctl start firewalld.service 关闭开机自启动:systemctl disable firewalld.service 开启开机启动:systemctl enable firewalld.service 2.为了让两个linux机器之间使用ssh不需要用户名和密码。 所以采用了数字签名RSA或者DSA来完成这个操作。 模型分析 假设 A (192.168.20.59)为客户机器,B(192.168.20.60)为目标机; 要达到的目的: A机器ssh登录B机器无需输入密码; 加密方式选 rsa|dsa均可以,默认dsa ssh-keygen -t rsa #使用rsa加密 二、具体操作流程 单向登陆的操作过程(能满足上边的目的): 1、登录A机器 2、ssh-keygen -t [rsa|dsa],将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub 3、将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys 4、大功告成,从A机器登录B机器的目标账户,不再需要密码了;(直接运行 #ssh 192.168.20.60 ) 双向登陆的操作过程: 1、ssh-keygen做密码验证可以使在向对方机器上ssh ,scp不用使用密码.具体方法如下: 2、两个节点都执行操作:#ssh-keygen -t rsa 然后全部回车,采用默认值. 3、这样生成了一对密钥,存放在用户目录的~/.ssh下。 将公钥考到对方机器的用户目录下 ,并将其复制到~/.ssh/authorized_keys中(操作命令:#cat id_dsa.pub >> ~/.ssh/authorized_keys )。 4、设置文件和目录权限: 设置authorized_keys权限 $ chmod 600 authorized_keys 设置.

linux创建新的用户

1、添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 Changing password for user tommy. New UNIX password: //在这里输入新密码 Retype new UNIX password: //再次输入新密码 passwd: all authentication tokens updated successfully. 2、赋予root权限 方法一:修改 /etc/sudoers 文件,找到下面一行,把前面的注释(#)去掉 ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL 然后修改用户,使其属于root组(wheel),命令如下: #usermod -g root tommy 修改完毕,现在可以用tommy帐号登录,然后用命令 su – ,即可获得root权限进行操作。 方法二:修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示: ## Allow root to run any commands anywhere root ALL=(ALL) ALL tommy ALL=(ALL) ALL

element的el-table合并,处理合并产生的hover样式问题

项目场景: 有时候列表页需要合并单元格展示,这时候element自带的hover效果没有全选中,如下图所示: 但是最终的实现效果是:点击单元格显示合并后的所有行。 需要的效果图: 解决方案: 将合并在一起的行(row)添加相同的currentIndex,为后续根据currentIndex动态设置类名做准备。 currentIndex: '', 通过看element官网可以知道,table单元格 hover 进入/退出时会触发该事件 <el-table :row-class-name="tableRowClassName" :cell-style="cellStyle" @cell-mouse-enter="handleCellMouseEnter" @cell-mouse-leave="handleCellMouseLeave"> 将鼠标所在行的的myRowIndex保存到动态响应变量currentIndex中 handleCellMouseEnter(row, column, cell, event) { //鼠标移入后赋值 this.currentIndex = row.productCode; //row.productCode是行相同的标志 this.currentColumnIndex = column.label; //获取列的标题名 }, handleCellMouseLeave() { //鼠标移走后置空 this.currentIndex = ''; this.currentColumnIndex = ''; }, 行的颜色变化,row.productCode == this.currentIndex实现鼠标在某行后全部选中。this.currentColumnIndex == '服务'实现只有鼠标在第一列才会有这样的效果,鼠标在其它列不会有全选的效果,我的第一列标题是【服务】,所以我匹配的【服务】,根据自己的项目来写。 // 行的颜色设置 tableRowClassName({ row }) { let flag = row.productCode == this.currentIndex && this.currentColumnIndex == '服务'; return flag ? 'quotatemplate-my-hover-row' : ''; }, 样式,是写在不加scoped的style里面写的。

C语言---用函数嵌套调用求4个整数中最大的数

输出4个整数,找出其中最大的数。用函数的嵌套调用来处理 解题思路:这个问题并不复杂,完全可以只用一个主函数就可以得到的结果。现在根据题目要求,用函数的嵌套调用来处理。在main函数中调用max4函数在调用另一个函数max2.max2函数用来找出两个数中最大者,在max4中通过多次调用max2函数,可以找出4个数中的最大者,然后把它作为函数值返回main函数,在main函数中输出结果。代码如下: #include<stdio.h> int max4(int a,int b,int c,int d); int max2(int m,int n); int main() { int a,b,c,d,m; printf("Please enter 4 interger numbers"); scanf("%d%d%d%d",&a,&b,&c,&d); m=max4(a,b,c,d); printf("max=%d\n",m); return 0; } int max4(int a,int b,int c,int d) { int t; t=max2(a,b); t=max2(c,t); t=max2(d,t); return(t); } int max2(int a,int b) { if(a>b) return a; else return b; } 也可以max2和max4函数进行简化: int max4(int a,int b,int c,int d) { return max2(max2(max2(a,b),c),d); } int max2(int a,int b) { return (a>=b?

CentOS 7离线安装使用git

CentOS 7离线安装使用git 一 CentOS 7下载安装配置git1.1 下载安装1.2 配置环境变量1.3 git常用命令 二 上传与下载2.1 上传-服务器端(centos)操作2.1.1 添加git用户2.1.2 创建文件夹、初始化仓库2.1.3 修改仓库配置文件 2.2 上传-本地端(windows)操作(也需要安装git)2.3 拉取代码 三 其他操作3.1 配置git忽略文件 一 CentOS 7下载安装配置git 1.1 下载安装 git下载地址 # 1 下载后上传到服务器/opt/software/git cd /opt/software/git # 2 解压 tar -zxvf git-2.34.1.tar.gz # 3 配置安装目录 cd git-2.34.1/ ./configure --prefix=/usr/local/git # 4 编译安装 make && make install 1.2 配置环境变量 # 修改/etc/profile文件,修改如下。如果有多个PATH,中间用英文冒号隔开 vim /etc/profile # 加上或修改如下两行 export GIT_HOME=/usr/local/git export PATH=$PATH:$JAVA_HOME/bin:$GIT_HOME/bin # 修改完重新加载配置文件 source /etc/profile # 创建软链(因为安装位置不是默认的,不创建后面使用会报错) ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack # 报错信息 bash: git-receive-pack: command not found fatal: Could not read from remote repository.

java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion

docker中OpenJDK excel无法导出 java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion 1.背景说明: 本地使用的是jdk1.8版本功能可正常使用,当通过docker打包镜像部署到linux环境下(openJDK1.8)后无法导出excel,报初始化是否,空指针异常,报错如下: 2.原因: openjdk比jdk1.8简化了一些功能,所以用docker打包的时候更小。excel导出时初始化失败就是因为fontconfig组件就被简化了。 3.解决方案: docker打包镜像时下载fontconfig组件即可解决 第一步:Linux Centos系统 下载fontconfig组件 yum install fontconfig 第二步:打包镜像时添加下载命令 RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig 如下截图: 打包镜像时会打印如下日志(下载可能会比较慢): 4.然后重启docker docker restart 容器ID或容器名 5.打包时发现下载的特别慢,解决方案:切换阿里镜像 RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories \ && apk update \ && apk upgrade \ && apk --no-cache add ttf-dejavu fontconfig 最终配置如下:

WSL2安装到其它目录下

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、WSL2是什么?二、下载Ubuntu20.041.打开Mocrosoft Store2.导出发行版 总结 前言 最近在研究WSL2,有正好遇到WSL-GUI可用就测试了下,发现会自动装到C盘下,而且随着日常的使用会导致C盘越来越臃肿,这篇文章会教大家怎么装到其它位置,比如D盘,请大家一步步来,需要注意的地方会特别标注。 一、WSL2是什么? WSL2是WSL的第二个版本,是基于Hyper-V的Windows子系统,WSL1和2对比有下面这些差异。 这篇文章我们基于Ubuntu20.04发行版来演示,其他发行版应该是适用的。 二、下载Ubuntu20.04 这个地方要强调一下子,必须要到Store去下载,不要下载离线包安装,实测两个安装好有差别。 1.打开Mocrosoft Store 搜索Ubuntu20.04,选择Ubuntu20.04.4 LTS(最后的4是小版本,有可能不是4,只要是20.04大版本就行了) 这个时候点击图标进去 我是已经下载好了,所以是Open,正常没下载应该是Install,下载成功就是Open了。这个包就几百兆,一会就下完了。下载完了点击Open,会提示等一会,输入账号密码就可以了。 2.导出发行版 要想安装到其它位置需要将发行版先导出到压缩包,再重新导入到指定目录。 打开一个命令行输入以下命令查看已安装的版本 wsl --list -v 记住导出的版本后续会用到。 输入以下命令开始导出,需要保证磁盘有足够的空间,建议安装完发行版就立刻操作,大概需要1G左右空间存储压缩包。 wsl --export Ubuntu-20.04 wsl-ubuntu20.04.tar 导出完之后需要取消注册发行版 wsl --unregister Ubuntu-20.04 等待导出完成,这里以存储在D盘为例,执行以下代码开始导入。 wsl --import Ubuntu-20.04 D:\Ubuntu-20.04 .\wsl-ubuntu20.04.tar --version 2 如果存储路径有空格就使用以下代码,将全路径加上单引号。 wsl --import Ubuntu-20.04 'D:\Program Files\Ubuntu-20.04' .\wsl-ubuntu20.04.tar --version 2 等待导入完成,这个时候登进去就是root账户,如果需要使用刚才你设置的用户执行以下代码 ubuntu2004 config --default-user <你的用户> 如果你的分发版是Ubuntu-20.04一定要使用“ubuntu2004”,而且如果你使用的是离线包安装的Ubuntu-20.04,这个命令会提示找不到,所以一定从Microsoft Store下载。 总结 蛮简单的,有问题可以提问。

JUC下典型的类

目录 1. 可重入锁 ReentrantLock 2. 信号量 Semaphore 3. 计数器 CountDownLatch 4. 循环屏障 CyclicBarrier JUC就是java.util.concurrent工具包的简称。这是一个处理线程的工具包。提供了许多在并发编程工程中常用的工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO、轻量级框架、还提供了多线程上下文的Collectiion的实现。 1. 可重入锁 ReentrantLock 2. 信号量 Semaphore semaphore.acquire(); // 得到令牌 semaphore.release();// 释放令牌 public class SemaphoreDemo1 { public static void main(String[] args) { //创建线程池 ExecutorService service = Executors.newFixedThreadPool(5); //创建信号量 Semaphore semaphore = new Semaphore(2); //统一任务的定义 Runnable runnable = new Runnable() { @Override public void run() { Thread currThread = Thread.currentThread(); // 得到执行此任务的线程 System.out.println("进入线程:" + currThread.getName()); try { // 如果没有可用令牌的话,那么线程会阻塞在当前位置 semaphore.

搞一下CP AUTOSAR 入门 | 02 CP AUTOSAR 基础模块功能描述

搞一下CP AUTOSAR 入门 | 02 CP AUTOSAR 基础模块功能描述 - 知乎 autosar - 知乎 T-BOX专业分享 - 知乎 【技术短文】直到今天,我才真正理解sizeof() - 知乎 汽车电子系列分享(所有系列分享已整理进本篇图文)_搞一下汽车电子的博客-CSDN博客 前言 在上一篇介绍了CP AUTOSAR的分层结构,对于多数使用AUTOSAR架构开发汽车电子软件的工程师而言,主要关注的还是如何将AUTOSAR架构应用到具体的项目中,多数公司都是直接采用AUTOSAR开发工具链进行开发,主流的如Vector的Davinci工具链、ETAS的ISOLAR工具链以及EB等。 在AUTOSAR分层架构中,APP部分在特定的工具链的架构设计和实现相对比较简短,主要是建立SWC、SWC之间交互的接口、映射CAN信号、建立周期触发的函数、建立Client-Server导向的接口函数等。但是从一个初识AUTOSAR架构或者工具链的工程师来说,对BSW层众多的模块可能一脸懵逼,自己刚开始接触AUTOSAR使用工具配置的时候也不例外。当时用Vector Davinci的工具链的时候对于AUTOSAR定义的基础模块功能基本一窍不通,那时候最想关心的还是BSW各个模块的功能是干什么的,后来在慢慢的开发学习中了解了各个模块的功能,因此这篇文章主要介绍下AUTOSAR基础模块的主要功能,达到对BSW各个模块熟悉的目的,以便在后续使用中更快的上手。 全系内容可在《搞一下汽车电子》公众号后台回复 "系列",或进入菜单栏 "分享平台" --> "系列分享" 下图展示的是AUTOSAR 4.2标准的主要功能块: 其中E2EPW 是E2E保护封装通过添加功能安全相关的信号,扩展了RTE的验证功能。在使用的时候要结合E2E的库来使用。 下面对每个功能块内部的模块做简述。 1、AUTOSAR RTE模块概述 RTE RTE实现虚拟总线的功能和SWC的执行,并确保了SWC之间以及SWC和基础软件间数据访问的一致性。同时集成SCHM实现了基础软件功能函数的执行。RTE还可以支持分区界限(多核/可信任/不可信任)间的通信。此外,RTE还提供NVRAM数据和标定数据的简化访问方式。在与功能安全相关的ECU中,RTE是一个与功能安全相关的模块。 SCHM SCHM模块集成在RTE内,调用每个BSW模块的主函数,并给临界区提供相关的函数。对于通过分区和内核边界的BSW分配(主卫星概念),SCHM可以提供和RTE模块基本相同的通信接口。 2、AUTOSAR OS模块概述 AUTOSAR ECU中的OS是基于OSEK操作系统而扩展的。所有扩展功能被分配到不同的操作系统扩展类型中,采用SC1-SC4表示,其中,SC1表示只使用调度表功能;SC2包含了调度表和时间保护;SC3包含了内存保护和调度表;SC4包含了调度表/时间保护和内存保护。同时操作系统也可以支持多核处理器。 3、AUTOSAR SYS模块概述 AUTOSAR中SYS模块主要提供系统相关的服务,主要模块如下: 具体的模块功能如下: BSWM 包含了车辆的模式管理和应用模式管理,处理来自于SWC模块和其他BSW模块的模式请求,同时根据模式请求的仲裁结果,执行模式转换或具体的行为等。同时BSWM可以与ECUM模块关联,控制ECU的启动和关闭,BSWM模块还可以协调多核系统的不同分区。 COMM COMM模块根据应用程序的通信需求协调不同网络以及局部网络间的通信。对通信具有使能和禁用控制。 CSM CSM模块提供接口用于SWC访问基础加密函数。个别加密算法在CRY模块通过软件或者硬件实现。 DBG 调试模块使得外部访问可以获得基础软件的内部信息,也用于修改内存数据。 DET DET模块用于支持在软件开发过程中的错误调试。它提供了一个错误提示接口,这一接口会在错误发生的时候被对应的BSW模块调用。 DLT DLT模块是诊断Log和Trace的简称,主要用于记录DET、DEM、SWS等的日志信息以及跟踪信息。Dlt模块通过内部的API可以在通信总线传输该数据,以使该信息在 ECU 外部可见。 ECUM ECU状态管理负责ECU的启动和关闭,同时还管理ECU的唤醒机制。支持Fixed和Flex两个版本的配置。Fixed的配置ECUM管理一些预定义好的运行状态。通过Flex的配置可以在BSWM中定义运行的状态,实现特殊的节能状态和多种启动类型。多核系统中,ECUM还可以协调管理不同的内核。 STBM 同步时基管理可以确保时间的同步,从AUTOSAR 4.2开始,由时间主站提供的时间基准可以通过总线系统实现不同ECU之间的同步。 TM

Windows查看端口和进程

windows: 通过任务管理器查看进程信息 通过控制台查看进程信息 taskkill杀死进程 Linux: ps -ef //查看所有进程信息 kill 32029 //使用kill 进程id,杀死进程 top //查看所有进程信息,可以使用top命令 Java自带工具: jps查看进程ID jstack查看进程中的线程状态 jconsole图形化界面 1、查看所有端口占用情况 netstat -ano 2、查看指定端口占用情况 netstat -ano | findstr "端口号" 查看占用该端口的PID,注意端口号要加上双引号。 执行: netstat -ano|findstr "8080" 3、使用tasklist查看 PID 对应的进程名 tasklist C:\Users\Admin>tasklist 映像名称 PID 会话名 会话# 内存使用 ========================= ======== ================ =========== ============ System Idle Process 0 Services 0 8 K System 4 Services 0 2,368 K tasklist|findstr "PID号" tasklist | findstr "java" 4、结束进程 如果我们想结束该进程,可以在任务管理器内找到该进程,然后直接右键结束。

Vue.js——PC端和移动端样式适配方案

此方案整合了断点响应式样式,和移动端样式重分配。 前言 最近在学习Vue的项目架构,查询了很多移动端样式适配,整合了一下我自己的适配方案做一个记录,可能不是最好的,但我自己用着还蛮顺手的~欢迎大家补充 一、字体篇——px2rem-loader 引言: 常规的字体大小使用px的话是写死的,那么rem由此诞生,根据html页面的根节点去计算相对大小,但是如此一来,如果是pc和移动端都适配的项目,那么我们在针对设计稿画ui的时候,px和rem的换算就异常痛苦了。 因此我选择引入了px2rem-loader组件,通过全局配置的方式让框架自己去计算rem和px的换算。 配置方法: 首先npm install px2rem-loader引个包 1、在vue.config.js中将loader引入使他在webpack打包的时候就加载,具体参数自己查一下吧解释起来有点多。 2、然后在你的全局样式的地方添加一个混入样式 这个文件中同样可以添加你需要的其他的全局样式函数之类的 3、在需要的地方引入 我们可以看到在使用px2rem函数后直接用px插件会帮我们转换成rem就很方便。 当然也有类似postcss-px2rem的插件功能相近,如果想全局注册的看我主页的全局变量使用,不过不是很推荐这么干,函数类的暂时不是很熟会碰到啥bug咱还不清楚,等研究明白了再补充 二、样式类——vue-breakpoint-component配合vuex 引言: 移动端适配常用的是amfe-flexible和postcss-pxtorem,可以做到样式宽度的重新计算。详情配置可以见下面这条帖子。 vue 移动端适配_dlnu2015250622的博客-CSDN博客_vue移动端适配 但是这样会出现一个问题,类似下面两张图,移动端和pc端的样式如果只是常规的压缩那未免也太丑了,如果需要两套样式更具环境变换上面这种方法可能不是那么好实现,样式就不太好处理了。 因此想到vuex中的状态管理,我的方案是通过引入vue的断点插件,由状态管理去判断页面使用哪套样式。 配置方法: 1、常规引包npm install vue-breakpoint-component -save 插件的详细参数直接看源码的描述文件吧 GitHub - adi518/vue-breakpoint: 😸 A renderless Vue.js component for composing CSS breakpoints 2、在main.js中引入做相应的配置,当然我这里的配置用的是官方的默认值,如果需要更详细的配置可以拉个配置文件引入 3、在App.vue的最外层使用组件监控页面状态根据组件的model变量你会动态拿到当前页面的状态,这里的store是vuex中的内容等会说明,等你拿到model之后通过计算属性给路由的最外层添加一个动态样式。 自此我们在页面或者组件中可以配置两套样式,不仅是移动端,在pc端视窗大小变化的时候也可以拥有响应式的动态样式变化。 上面所提到的store是vuex中状态管理的一个方式,组件样式如果差异过大在pc端可以渲染会出问题,所以在此做状态记录方便以后处理可能出现的bug。关于vuex会另开一篇笔记记录详细用法。 总结 自此就是本次移动端pc端样式适配的总结,就我目前的水平来看这是比较方便的一种处理方式,咱也不是特别清楚里面是否有其他问题,但是能用~欢迎有更好方案的可以指正一下

基于麻雀算法,调控PID参数

最近研究了智能算法,略有收获,下面说一下我的收获,如有错误,请大家批评指正,不胜感激。 因目前主流麻雀算法主要以matlab进行展示,但为了理解更加深入,我以C#重新进行书写并展示。 目的:以麻雀算法计算一个最优PID参数,用来控制一个函数模型,使输出波形与输入波形一致。如下图所示: 当输入波形是一个正弦函数时,受不同PID参数的影响,输出波形也截然不同。如下图,这是我随意设置的一个函数模型,随便整了个PID参数进行控制后的结果: 输入波形 :Finput(x)= 100*sin(x); PID控制器参数:kp:0.052,ki:0.043,kd:0.048 函数模型: 输出波形 即: 底层框架就是这些,以人工经验,多次调整PID参数后,应该可以得出一个优解,但今天主题是麻雀算法,所以在这些底层函数上,需要以麻雀算法计算出一个最优解。 根据网上大多数人对麻雀算法的拆分,可以将麻雀算法分为四个部分: 发现者、追随者、报警者、以及适应度函数 主要逻辑就是随机生成100(种群数量)个PID参数组,然后带入适应度函数计算出最优适应度,然后根据发现者、追随者、报警者三个公式计算更新PID参数,然后不断排列取优,在经过多次迭代后,取出最优解。 前三者网上都有固定的公式,只要将其套入使用,基本没有什么差别。公式详情可以百度,可以参考下面的连接,至于用C#如何实现可以看我的代码。 (46条消息) 基于麻雀算法求解函数最优解_小小初心的博客-CSDN博客 主要是适应度函数,如何在PID控制器中成立,这里我借鉴了下面这位大哥的文章: (46条消息) 智能优化算法应用:基于麻雀搜索算法PID参数优化 - 附代码_智能算法研学社(Jack旭)的博客-CSDN博客_pid优化算法 实现方法也很简单粗暴,如下描述: 将PID参数带入底层模型运行10个周期,即可计算出适应度Fout大小。 完工后,对C#的窗体进行操作,再加个定时器就可以看到麻雀算法迭代时的PID参数对曲线的影响了:如下 这是麻雀算法第一次迭代生成的PID参数组,对函数模型的影响,可以看出完全没有正弦的样子,适应度Fout也达到了七百多万。 (下列红框中,2代表迭代次数,Fout:代表当前最优解的适应度大小,适应度越小代表曲线越近似正弦,后续三个参数分别是PID参数中的Kp、Ki、Kd。) 但是在经过100次迭代后,可以看到PID参数对曲线的影响,很快就取到了一个相对优秀的解。适应度由七百多万降低到了十八万左右(186818)。 接下来我们看一千多次迭代后的PID参数组,可以看出此时的麻雀算法,已经算出了一个比较优秀的解,PID控制下的输出曲线也近似完美的正弦。适应度更是由十八万降低到俩万以下(19969) 再次迭代一千次后,如下图,适应度仅降低至19703,比一千次迭代前仅降低了266,说明整个麻雀算法已经收敛,目前输出已经近似最优解了,再迭代下去也影响不大。 如下图,我们迭代至五千次后,输出基本没有什么改变,适应度也仅降低至19701,整个麻雀算法已经完全收敛,再迭代下去也没有任何意义。当前PID参数组就是最适合目前函数模型的最优解。 下面我们来看一组动态图,看看麻雀算法迭代过程中的曲线变化趋势: 代码如下: 基于C#展示麻雀算法求PID控制器参数最优解-C#文档类资源-CSDN文库

Spring MVC 实现文件的上传和下载

文章目录 前言1. 文件上传1.1 文件上传介绍1.2 文件上传实现1.2.1 添加依赖1.2.2 配置上传解析器1.2.3 通过表单上传1.2.4 创建控制器类1.2.5 上传演示 2. 文件下载2.1文件下载的实现2.1.1 客服端创建超链接2.1.2 创建控制器类2.1.3 下载演示 前言 文件的上传和下载是项目开发中非常常见的功能,例如图片、邮件附件的上传与下载,下载与上传音频、视频等。 1. 文件上传 1.1 文件上传介绍 文件上传是通过表单的形式提交给服务器的,因此,实现文件的上传,就需要一个提供上传的表单,而这个表单则必须满足以下三个条件。 form表单的method属性为postform表单的enctype属性为multipart/form-data使用<input type="file" name="filename"/>为文件上传输入框 示例代码如下: <form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data"> <input type="file" name="photo" multiple> <input type="submit" value="上传"/> </form> 注意:使用 multiple 属性,则可以同时选择多个文件上传。 enctype=multipart/form-data:该属性表明发送的请求体的内容是多表单元素的,通俗点讲,就是有各种各样的数据,可能有二进制数据,也可能有表单数据。当使用该属性时,浏览器就会采用二进制流的方式来处理表单数据,服务器端就会对文件上传的请求进行解析处理。 1.2 文件上传实现 1.2.1 添加依赖 Spring NVC 的文件上传需要依赖Apache Commons FileUpload的组件,即需要添加支持文件上传的依赖。 <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> 1.2.2 配置上传解析器 Spring MVC 为文件的上传提供了直接的支持,而这个支持是通过MultipartResolver对象实现。MultipartResolver是一个接口,需要他的实现类CommonsMultipartResolver来完成文件上传。而在Spring MVC中使用该对象,只需在配置文件中定义一个MultipartResolver接口的Bean即可。 <!-- 配置文件上传解析器,将上传的文件封装为CommonsMultipartFile --> <bean id="

微信小程序循环列表添加动画animation

微信小程序内的css无法做到循环的动态 animationData变成[],数组里很多{}对象,就可以改变单独的值。 WXML: <view class="context-full"> <block wx:for="{{axis}}" wx:key="id" wx:for-index="idx"> <view data-id='{{idx}}' class="history-item" animation="{{timeLineAnimationData[idx]}}"> <view class="year"><text>{{item.time}}</text></view> <view class="gradient"> </view> <view class="circle" > <view class="point"></view> </view> <view class="item-detail"> <text>{{item.event}}</text> </view> </view> </block> </view> JS: Page({ data: { timeLineAnimationData: [], }, methods:{ //循环的key值为id,arrName为该循环绑定的数据,因为页面中有多个表单需要加动画 animateArr: function (id,arrName) { var index = id var temp_str = arrName+'[' + index + ']';//判断当前点击的 animationData相对应的{}是否为空,如果为空就是走第一个动画,不为空走第二个 if (JSON.stringify(this.data[arrName][index]) != "{}") { let animation = wx.createAnimation({ duration: 100, timingFunction: 'ease', }) this.

小白学习Cobalt Strike4.5(一)

一、目录结构 1、客户端程序:Cobalt_Strike_CN,可以启动多个客户端,相互共享重要数据 2、服务端程序:teamserver,只能启动一个,客户端都需要连接该服务器 二、启动服务端 1、windows启动服务端 以管理员身份打开CMD,切换到CS目录中,运行teamserver_win文件 需要输入两个参数,一个是该服务器的ip地址(host),另一个是客户端连接该服务器的密码(password) teamserver_win.bat 192.168.1.103 123456 2、Linux启动服务端 运行下面命令启动服务端,root权限可以无视sudo sudo ./teamserver 192.168.0.108 111111 三、启动客户端 1、windows启动客户端 双击批处理文件Cobalt_Strike_CN,弹出这个对话框,填写相关内容,主机就是上面服务器的地址,端口就是箭头指向的那个端口号,用户随便起个名字即可,密码就是服务器后面跟着那个密码,点击连接 弹出一个请求框,可以理解为有个客户端要来连接了,是否允许连接,点击yes即可 成功连接后会弹出下面的客户端界面,提示哎呦已经加入 2、Linux启动客户端 在终端运行下面命令,如果是root权限可以无视sudo,启动客户端,点击连接 sudo ./cobaltstrike 可以看到目前有两个客户端连接了该服务器 仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者不承担任何法律及连带责任。 工具下载地址: 关注网络安全者公众号,后台回复CS4.5

【leetcode】剑指 Offer(专项突击版)汇总

文章目录 002. 二进制加法(反转相加 / 位运算)006. 排序数组中两个数字之和(二分查找 / 双指针)007. 数组中和为 0 的三个数(双指针)008. 和大于等于 target 的最短子数组(滑动窗口 / 双指针)009. 乘积小于 K 的子数组(滑动窗口 / 双指针)010. 和为 k 的子数组(前缀和+哈希表)011. 0 和 1 个数相同的子数组(前缀和+哈希表)012. 左右两边子数组的和相等(前缀和)013. 二维子矩阵的和(前缀和)014. 字符串中的变位词(滑动窗口 / 双指针)015. 字符串中的所有变位词(滑动窗口 / 双指针)016. 不含重复字符的最长子字符串(滑动窗口 / 双指针) 002. 二进制加法(反转相加 / 位运算) 题目:剑指 Offer II 002. 二进制加法 给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1: 输入: a = "11", b = "

App逆向入门

day05 App逆向快速上手 app逆向课程: 环境搭建 & Java语法基础 & 安卓开发 & NDK案例 平台: Web框架 今日概要:app逆向的快速上手和必备环境搭建(上)。 安装模拟器(网易mumu)抓包工具 charles 、Drony反编译工具:jeb、jadx、GDA(Java代码) 1.安装模式器 PC上的安卓模拟器有很多。 windows,逍遥、夜神、网易mumu 等。mac,网易mumu。注意:暂不匹配mac的m1。 下载地址:https://mumu.163.com/mac/index.html 注意:安装后请开启root权限。 2.抓包工具 charles 2.1 下载并安装 mac用户 访问网址 https://xclient.info/s/charles.html 根据提示下载并破解。 windows用户: 下载地址:( charles v4.5.6,大家也可去网上自行下载和破解 ) 链接: https://pan.baidu.com/s/1gedTGrFsB1SnNwTvPLoZPg 提取码: cjfe 注册码 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 2.2 配置 打开 【Proxy】>【Proxy Settings】设置代理IP端口: 查看本地charles的IP地址:【Help】>【Local IP Address】 模拟器连接 charles代理:填写IP和端口。 默认这样设置charles只能抓http的包,无法抓取Https包,所以需要在手机上安装证书。 设置SSL代理:【Proxy】->【SSL Proxy Settings】 手机上安装证书: 提醒: 在模拟器上配置charles,安装证书。在安卓手机上配置charles 手机 android7以下,可以用上面的方法 ----> 受信任的证书。手机不能用上面的方法(获取root权限)----> 用户级别、系统级别。 安装成功后,就可以在charles中进行抓包了。

移动mgv2000_JL代工_s905l2_MT7668_emmc_免拆卡刷固件包

移动mgv2000_JL代工_s905l2_MT7668_emmc_免拆卡刷固件包 特点: 1、适用于卡刷; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件,运行速度提升,多出大量的存储空间; 5、去除应用安装限制; 6、支持开机自启动、开机密码锁、儿童应用锁、应用隐藏、开机自动进入HDMI等各种花式功能 。 教程: 准备一个FAT32格式单分区 U盘,,实测8G得最好。 将 recovery.img、 update.zip、 factory_update_param.aml 三个文件拷贝到根目录, 注意保证文件完整性;插入机顶盒进行U盘,断电重启,机顶盒自动刷机。 刷机固件: 链接: https://pan.baidu.com/s/1OErBqk-Jsrl9AqsQcgB5mw 提取码: bqj3 声明:本安卓固件,仅供内部测试和技术交流使用,任何非法商业使用及商业利益冲突带来的法律纠纷,与本人无关,本人概不负责,请下载后24小时内删除,谢谢合作!刷机既有乐趣也有风险,请慎重选择,一切源于刷机造成的后果自负,本人概不负责! 

古代汉语 郭锡良版本 复习要点

古代汉语复习要点 一、文选部分复习要点: 1.重点篇目: 第一册:《精卫填海》、《夸父逐日》、《女娲补天》、《蝜蝂传》、《巫山、巫峡》《王子坊》、《庐山草堂记》、《传是楼记》、《郑伯克段于鄢》、《齐桓公伐楚》、《鞌之战》、《触龙说赵太后》、《孙膑》 第二册:《谏逐客书》、《报任安书》、《答李翊书》、《逍遥游》、《秋水》、《许行》、《天论》 第三册:《登大雷岸与妹书》、《哀郢》、《风赋》、《氓》、《七月》 2.复习办法: A.熟悉课文,每一句话都要会翻译,每一个字都要会解释; B.注意特殊句型,如宾语前置、被动句等; C.注意字词的特殊用法,如名词作动词,名词作状语,使动用法,意动用法等等; D.注意关键词语的古义、本义、特殊意义,尤其是不同于现代汉语的意义。 二、常用词部分复习要点: 1.复习范围: 第一册: (一)古今词义不同辨析例 (二)词的本义探求例 第二册 (三)引申义分析例(上) (四)引申义分析例(下) 第三册 (五)同义词辨析例 2.复习办法: A.注意每个词的本义、古义; B.注意古今意义的不同; C.注意同义、近义词的相同点和不同点。 三、通论部分复习要点: 复习通论部分的基本原则是,掌握基本知识、基本理论,在记住知识的要点的同时,一定要掌握书上举出的例子,回答问题的时候,尽量结合例子。 上 册 (一)怎样查字典辞书: 1.字典排列方法:A.按音序排列;B.按部首和笔画排列;C.按号码排列。 2.《康熙字典》作者,成书年代,214个部首,先注音,后释义。 3.《康熙字典》的注音方法:反切法、直音法、叶(xié)音法;掌握每种注音方法的概念。认识到“叶音法”是一种不科学的注音方法,应当批判和否定。 4.《助字辨略》的作者是( ),收字( )个,按( )分卷,依( )排列。 5.《经传释词》的作者是( ),收字( )个,全书分( )卷,按( )排列。 6.《词诠》作者是( ),其他虚词著作有裴学海的《 》,对唐以后汉语词汇进行研究的著作有张相的《 》。 (二)汉字的结构和发展 1.什么是“六书”?实际上汉字的结构只有( )四种,假借是用字方法,至于转注,很难作出定论。 2.记住许慎在《说文解字·叙》中对“六书”的解释,即:“一曰指事,……;二曰……。” 3.记住“象形、指事、会意、形声”的概念和书上的古字形。 4.什么是“亦声”? 5.记住书上举例的字,如:“难、权、而、忘”等字的本义。 6.掌握古今字、异体字、繁简字的概念和例字。 (三)古今词义的异同 1.关于古今词义的异同概括起来有三种情况:(问题:古今词义的异同有哪些情况?) (1)古今意义基本未变:如:“马、牛、羊、山、水”等; (2)古今意义完全不同的:如:“绸”古代的意义是“缠绕”,现代的意义是“丝绸”;“该”古代的意义是“完备”,现在是“应当”。 (3)古今词义有同有异的。如:…… 2.古今词义范围的差异有:(问题:从词义范围看,古今词义的不同有哪些?) (1)词义的扩大,如“菜”,古代专指植物类蔬菜,现在包括肉、蛋之类;再如“睡”,古代指坐着打盹,现在指一般的睡觉。 (2)词义的缩小,如“宫”,上古泛指房屋,现在指少数公共场所。再如“瓦”,古义比今义要广,古代指陶制品,现在房屋上的建筑材料。 (3)词义的转移,如“暂”,古代是指狗突然向人袭击,今义指时间短暂;再如“汤”,本义指热水,现在指菜汤、米汤之类。 3.词义感情色彩的差异有哪些? 答:(1)古代是褒义,现在是贬义的:如“复辟”,古代是“恢复君位”,现在是说“开历史倒车”;再如:“爪牙”,古代指“勇猛的得力助手”义,现在是“走狗”。 (2)古代是贬义,现在是褒义的:如“锻炼”,古代是玩弄法律诬陷别人的意思,现在指“练习、磨炼”,是褒义。 (3)有的中性词,后来有了褒贬色彩:如“谤”,古代指“议论”,中性;现在指“诽谤”,贬义。 4.从词义轻重的情况:

Cron表达式详解(配合例子)

这里写目录标题 Cron 表达式1、基本格式2、一些特殊值的含义四种**通用**特殊字符五种有使用限制的特殊字符`?``L``W``LW ``#` 3、各个域的取值范围 Cron 表达式 在进行定时任务的创建的时候,cron是计划任务的表达式 本文意在快速的分析列出cron表达式的书写规则与含义 1、基本格式 cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 六位的 0 0 12 * * ?(每天的中午12点触发) Seconds Minutes Hours DayofMonth Month DayofWeek 七位的0 0 12 * * ? *(每天的中午12点触发) Seconds Minutes Hours DayofMonth Month DayofWeek Year 简单解释下以六位(常用)的为例 0 0 12 * * ? 中的六位,分别对应Seconds Minutes Hours DayofMonth Month DayofWeek 数字对应位含义0Seconds(秒)第0秒0Minutes(分)第0分12Hours(时)12时(24小时制)*DayofMonth(一个月的第几天)一个月的每一天*Month(月)每一个月?DayofWeek(周几)一周中的每一天 整体来看就是每天的12:00进行任务触发,这种是最简单最易理解的一种形式。 要注意的是,在 秒 分 时 后边跟的是 一个月的第几天 而非 月记忆的时候注意别搞混,还有DayofWeek的取值定义,不同处有不同定义,要先确认1代表周一还是周日 其中的* 、?二者都是每一天的意思,但又有使用上的区别,下边会进行详细解释。

深入理解FIFO以及同步FIFO和异步FIFO的verilog实现代码

FIFO FIFO即First In First Out,是一种先进先出数据存储、缓冲器,我们知道一般的存储器是用外部的读写地址来进行读写,而FIFO这种存储器的结构并不需要外部的读写地址而是通过自动的加一操作来控制读写,这也就决定了FIFO只能顺序的读写数据。下面我们就介绍一下同步FIFO和异步FIFO。 1、FIFO分类 同步FIFO,读和写应用同一个时钟。它的作用一般是做交互数据的一个缓冲,也就是说它的主要作用就是一个buffer。 异步FIFO,读写应用不同的时钟,它有两个主要的作用,一个是实现数据在不同时钟域进行传递,另一个作用就是实现不同数据宽度的数据接口。 2、FIFO的主要参数 同步FIFO和异步FIFO略有不同,下面的参数适用于两者。 宽度,用参数FIFO_data_size表示,也就是FIFO存储的数据宽度;深度,用参数FIFO_addr_size表示,也就是地址的大小,也就是说能存储多少个数据;满标志,full,当FIFO中的数据满了以后将不再能进行数据的写入;空标志,empty,当FIFO为空的时候将不能进行数据的读出;写地址,w_addr,由自动加一生成,将数据写入该地址;读地址,r_addr,由自动加一生成,将该地址上的数据读出; 同步FIFO和异步FIFO的最主要的不同就体现在空满标志产生的方式上,由此引出两者一些不同的参数。 同步FIFO 时钟,clk,rst,读写应用同一个时钟;计数器,count,用计数器来进行空满标志的判断; 异步FIFO 时钟,clk_w,rst_w,clk_r,rst_r,读写应用不同的时钟;指针,w_pointer_gray,r_pointer_gray,用指针来判断空满标识;同步指针,w_pointer_gray_sync,r_pointer_gray_sync,指针的同步操作,用来做对比产生空满标志符; 3、同步FIFO FIFO主要的设计难点在于如何产生空满标志,在同步FIFO中,我们定义一个计数器,当计数器的值为0时,产生空标志,当计数器的值为FIFO的深度时,产生满标志。基于以上的思想,可以将同步FIFO划分为以下几个模块:write、read、count、RAM。 3.1 模块划分 同步FIFO主要划分为四个模块,RAM模块是用来读取和写入数据;write模块是用来产生写地址;read模块是用来产生读地址;count模块是用来产生空满标志符,每写入一位数,count加一,每读出一位数,count减一。 下面是各个模块的连接框图: 3.2 同步FIFO代码 源文件 module FIFO_sync( clk, rst, w_en, r_en, data_in, data_out, count, full, empty ); parameter FIFO_data_size=3, FIFO_addr_size=2; input clk,rst; input w_en,r_en; input[FIFO_data_size-1:0] data_in; output[FIFO_data_size-1:0] data_out; output full,empty; output[FIFO_addr_size:0]count; reg [FIFO_data_size-1:0] data_out; reg [FIFO_addr_size:0]count; reg [FIFO_addr_size-1:0]w_addr,r_addr; reg [FIFO_data_size-1:0]mem[{FIFO_addr_size{1'b1}}:0]; integer i; //memory的初始化以及写操作 always@(posedge clk or negedge rst) begin if(!

时间戳转换js

一、时间转换时间戳 var date = new Date(); //时间对象 var str = date.getTime(); //转换成时间戳 注: 在安卓手机中得到的常量validDateTime的值正确,在苹果手机中得到的返回值为Invalid Date,测试后发现,当日期格式为:‘2022:08:16 12:00:00’和‘2022-08-16 12:00:00’时,返回的数据都为Invalid Date 只有年月日之间的连接符为'/'时,返回的才是正确的数值。处理方法如下: var time = '2022-08-16 12:00:00'; var strtime = time.replace(/-/g, '/') var date = new Date(strtime); 二、时间戳转换为时间 1.转换成形 ‎2022年‎18月‎16‎日‎ ‎17:‎00‎:‎00 格式: var item = new Date(1659424247000).toLocaleString(); 2.还可以这样 // 有三种方式获取,在后面会讲到三种方式的区别 time1 = date.getTime(); time2 = date.valueOf(); time3 = Date.parse(date); /* 三种获取的区别: 第一、第二种:会精确到毫秒 第三种:只能精确到秒,毫秒将用0来代替 比如上面代码输出的结果(一眼就能看出区别): 1398250549123 1398250549123 1398250549000 */ 3. 转换成更多其他的格式: // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 date.

雷达参数设计

前言:所有的算法落实到实际应用中就必须要考虑实际中的应用场景,针对需求相应的设计出合适的雷达参数。这篇笔记主要从距离分辨率,最大作用距离,速度分辨率,角度分辨率来给出设计参数的原理。 一、最大作用距离 与最大中频带宽有关 最大中频带宽与采样率相关,在complex 1x情况下,;在complex 2x情况下,,complex 1x比complex 2x使用更小的采样率,采集的数据都为有效数据。因此最大作用距离可以用以下公式估计: 其中,K是调频斜率,是chirp总周期包括rampEndTime和idleTime。 二、距离分辨率和测距精度 1、距离分辨率是指分辨两个物体距离向的能力,计算公式如下: 2、测距精度是指测量单目标的距离测量精度,取决于信噪比,计算公式如下: 三、速度分辨率 1、最大探测速度 目标速度是通过提取chirp之间的相位差(多普勒频率)来计算。连续chirp之间的相位差的相位差可表示为: 当相位保证不模糊时,则,于是最大探测速度为 2、速度分辨率 速度分辨率表示速度维区分两个同一位置的目标的能力。假设一帧传输 N 个chirp,速度维频率分辨率为。 3、测速精度 测速精度表示测量单目标的速度测量精度,取决于信噪比。计算公式如下: 四、角度分辨率 1、测角范围FOV 角度通过RX天线间的接收信号相位差(由波程差引起)来计算,相位差为: 当相位差不模糊时,即,得到测角范围。 2、角度分辨率 角度分辨率表示在角度维分离相同距离、速度目标的能力。雷达的角度分辨率一般较低,AWR1xxx系列雷达1TX4RX的角度分辨率28°左右。在实际情况下,由于距离、速度分辨率较高,目标一般可以在距离和速度维区分开。 假设接收天线个数为,角度维频率分辨率为。 3、测角精度取决于雷达天线波束宽度即天线增益和信噪比有关,计算公式如下: 参考文章: 1、毫米波雷达系统性能参数分析_唱跳c++篮球的博客-CSDN博客_毫米波雷达角度分辨率 2、毫米波雷达基础知识(二) - 知乎 (zhihu.com)

iOS CIQRCodeGenerator(二维码生成器)的使用和参数介绍

//MARK: 生成二维码 可设置带居中的icon图标 + (UIImage *)qrCodeInfo:(NSString *)info width:(float)width iconImage:(UIImage *)iconImage{ CIImage *imageCI = [self getQRCode:info]; UIImage *imageQR = [self resizeQRCodeImage:imageCI withSize:width]; if (iconImage) {//有小图标需要写入 UIGraphicsBeginImageContext(imageQR.size); [imageQR drawInRect:CGRectMake(0, 0, imageQR.size.width, imageQR.size.height)]; //当前配置的容错率是15% 保险起见写入小图标只占12% float iconWidth = imageQR.size.width * 0.14; [iconImage drawInRect:CGRectMake((imageQR.size.width - iconWidth) * 0.5, (imageQR.size.height - iconWidth) * 0.5, iconWidth, iconWidth)]; imageQR = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } return imageQR; } //MARK: 生成一个二维码图片 - (CIImage *)getQRCode:(NSString *)constent{ //创建二维码滤镜 CIFilter *filter = [CIFilter filterWithName:@"

C语言 循环结构 —— while循环

while循环 //while 语法结构 while (表达式) 循环语句: 表达式结果为真,为非0的时候,循环语句执行,否则循环停止 举例:打印整数1-10 #include<stdio.h> int main(void) { int i = 1; //初始化 while (i <= 10) //判断部分 { printf("%d\n", i); i++; //循环变量的调整部分 } return 0; } 在while循环中,break 用于永久的终止循环,举例: #include<stdio.h> int main(void) { int i = 1; while (i <= 10) { if (i == 5) break; printf("%d ", i); //只会输出:1 2 3 4 ,到5的时候就终止循环了 i++; } return 0; } 把上面的 break 换成 continue 会怎样?