题目太新了,题库都是我自己提取的,有需要的下面的代码即可搜索文档里的题目,需要复制题目完全!
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: moddemod # datetime: 2021/4/21 15:08 import xlrd workbook = xlrd.open_workbook('形式与政策6总.xls') # print(workbook.nsheets) sheet = workbook.sheet_by_index(0) print(sheet.nrows) # 行数 data = sheet.row_slice(1) question = data[1] def find_ques(ques): for line in range(1, sheet.nrows): data = sheet.row_slice(line) question = data[1] if question.value.replace(' ', '') == ques.replace(' ', ''): answer = data[2] print(answer.value) return print('未查询到答案!!!') while True: ques = input('请输入问题:') find_ques(ques) https://wwe.lanzous.com/iDDhpocggud
下面附个查题脚本,基于题库的
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
itext修改pdf文字 POM文件如何使用原pdf字符替换关键字后文字替换 工具类实体总结 Git项目地址
POM文件 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.1</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.21</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> 如何使用 原pdf 结果
字符替换 //输入文件 String source = "G:/问题文件/测试.pdf"; //输出文件 String target = "G:/问题文件/test222.pdf"; //字符串替换,注意设置maxDistance的值,maxDistance太小将无法正常替换文字 ITextPdfUtil.stringReplace(source, target, "颜色 ",30,"*****"); 关键字后文字替换 //输入文件 String source = "G:/问题文件/测试.pdf"; //输出文件 String target = "G:/问题文件/test222.pdf"; //关键字之后替换,仅仅支持关键字之后的100范围内的文字覆盖,超出范围将覆盖不到 ITextPdfUtil.afterKeyReplace(source, target, "签字",50,"*****"); 工具类 import java.awt.image.BufferedImage; import java.
在引入mybatisplus插件后,mapper文件中的方法会提示 @MapKey is required @MapKey的作用是在返回一个Map的时候,Map的key将映射成注解中的值的字段,从而使map变相可以作为List使用.
举例:
public class UserMapper(){ //使用list接收 //[{id:1111,name:"foo"},{id:2222,name:"bar"}] public List<User> useList(); //使用带有@Mapkey("id")的Map<Integer,User>接收 //{1111:{id:1111,name:"foo"},2222:{id:2222,name:"bar"}} @Mapkey("id") public Map<Integer,User> useMap(); } 该特性作为以某一字段大批量查找特别方便。
实验平台如下图所示:
实验平台组成:
一个2马力的电动机。(图左侧)
一个扭矩传感器/译码器(图中连接处) 一个功率测试仪(图右侧)
电子控制器
待测轴承: 待检测的轴承支撑着电动机的转轴;驱动端轴承为SKF6205 ,采样频率为12KHz和48KHz;风扇端轴承为SKF6203 ,采样频率为12KHz。 轴承数据格式
数据文件为Matlab的mat格式。每个文件包含风扇和驱动端振动数据,以及电机转速。在所有文件中,变量名显示解释如下:
DE - drive end accelerometer data 驱动端加速度数据;
FE - fan end accelerometer data 风扇端加速度数据;
BA - base accelerometer data 基座加速度数据;
time - time series data 时间序列数据;
RPM- rpm during testing 转每分钟,除以60为旋转频率
利用该实验台获取的正常样本4个、外圈损伤样本77个、内圈损伤样本40个及滚动体损伤样本40个。
12DriveEndFault是12KHZ的驱动端故障数据,
1797代表点电机转速1797转/min,
NormalBaseline就是正常的数据,
.mat格式可以用MATLAB打开
下面是故障数据;
因为轴承主要有三类故障,内圈(InnerRace),外圈(OuterRace)还有滚动体(Ball),和上面的英文是对应的。
0.007,0.014和0.021代表不同的故障体量级别,也就是故障直径为7密耳,14密耳,21密耳(以密耳为单位),这样一组合就有了九种不同的故障+1种正常的。
提示:部分资料来自网络,如有侵权请联系删除
关于Ubuntu系统安装选项 @[TOC](关于Ubuntu系统安装选项) 安装选项选择一、*Try or Install Ubuntu二、Ubunru (safe graphics)三、OEM install (for manufacturers)四、Test memory总结 安装选项选择 在安装Ubuntu系统时会有四个选项,搜集资料略作小结。
一、*Try or Install Ubuntu Try or Install Ubuntu (翻译:尝试或安装Ubuntu)
二、Ubunru (safe graphics) Ubuntu (safe graphics) (翻译: Ubuntu 安全 图形/显卡)
“有一段时间nouveau开源的nvidia驱动会导致linux安装后死机。safe graphic就是啥显卡驱动都不装,显示界面是cpu模拟出来的。这样就防止卡死。” 暂未找到更多资料
三、OEM install (for manufacturers) OEM install (for manufaturers) (翻译:OEM安装(供制造商使用))
四、Test memory Test memory (翻译:内存测试 /检测内存 )
总结 在安装Ubuntu系统时,选择第一项或第二项进行安装,如果出现卡死、黑屏或无法启动问题就切换另一种方式进行安装。
我在收集资料的时候发现,有些网友是使用第一种安装方式会出现问题,有些是使用第二种安装方式会出现问题,具体原因暂且未知。
(注:如在虚拟机中安装时出现问题,也要考虑并检查虚拟化设置,部分电脑可能不支持虚拟机中的虚拟化设置)
使用qemu的gdbstub调试 在之前我的一篇博客——《kgdb调试linux内核以及驱动模块》中简要描述如何配置kgdb进行内核以及驱动模块调试,这种方法既适用于qemu仿真环境也适用于真实的物理开发板,但对于做早期cpu core bridge up时未必能在物理设备上搭建好稳定可靠的kgdb环境。一般来讲使用qemu仿真来发现一些早期软件问题是有一定的帮助的,因此本文将描述,借助qemu的gdbsever模式,在仿真环境上更早的介入gdb工具进行非常底层的debug。本文实验环境依然为qemu搭建的riscv64模拟器环境,笔者之前有系列博客详细描述了环境搭建,可供参考——《基于qemu-riscv从0开始构建嵌入式linux系统》。
修改内核配置 与kgdb类似,使用为方便gdb加载内核符号,我们依然要在编译kernel是配置如下相关选项,本文不再赘述原因,详情查看之前的文章。
CONFIG_GDB_SCRIPTS setCONFIG_DEBUG_INFO setCONFIG_DEBUG_INFO_DWARF4 setCONFIG_STRICT_KERNEL_RWX/CONFIG_STRICT_MODULE_RWX not set 启动qemu 正常启动qemu时,目标板将立即启动,如要开启gdbsever并等待gdb连接,则仅需添加"-s -S"参数即可。
SHELL_FOLDER=$(cd "$(dirname "$0")";pwd) GRAPHIC_PARAM="-nographic --serial telnet::3441,server,nowait --serial telnet::3442,server,nowait --serial telnet::3443,server,nowait --monitor stdio --parallel none" $SHELL_FOLDER/output/qemu/bin/qemu-system-riscv64 \ -M quard-star \ -m 1G \ -smp 8 \ -drive if=pflash,bus=0,unit=0,format=raw,file=$SHELL_FOLDER/output/fw/fw.bin \ -drive file=$SHELL_FOLDER/output/rootfs/rootfs.img,format=raw,id=drive0 \ -fsdev local,security_model=mapped-xattr,id=fsdev0,path=$SHELL_FOLDER \ -netdev user,id=net0,net=192.168.31.0/24,dhcpstart=192.168.31.100,hostfwd=tcp::3522-:22,hostfwd=tcp::3580-:80 \ -global virtio-mmio.force-legacy=false \ -device virtio-blk-device,id=hd0,drive=drive0 \ -device virtio-gpu-device,id=video0,xres=1280,yres=720\ -device virtio-mouse-device,id=input0 \ -device virtio-keyboard-device,id=input1 \ -device virtio-9p-device,id=fs0,fsdev=fsdev0,mount_tag=hostshare \ -device virtio-net-device,netdev=net0 \ -fw_cfg name="
在我们的项目中,登录页面经常要加协议,有时候还经常改动,但是又不知道改了哪里,每次看到发来一个文档的时候,只能在线找个编辑器,复制进去,转成html,再复制出来,虽然这样很简单,但是有没有更快的方法呢,于是在闲暇的时候,用python做了一个小工具,一键导出,希望能帮助更多小伙伴
下面分享下源码的主要实现方法,有不对的地方,望指正(新手上路,bug多),有需要看更多源码,以及工具下载可以---->戳我
from pydocx import PyDocX from bs4 import BeautifulSoup import os # 默认style init_style = """ * { margin: 0;padding: 0;} body { padding: 10px !important;} table td {border-style: solid;} """ class DocToHtml: def __init__(self, file): self.soup = None self.file = file # 获取文档内容 def get_doc_content(self): html = PyDocX.to_html(self.file) self.soup = BeautifulSoup(html, 'lxml') # 使用lxml解析库 # 修改html内容 def update_html(self): # 插入新的meta meta = self.soup.new_tag( 'meta', content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;') self.
近几年,CMMI资质认证逐渐被更多企业熟知,CMMI认证是针对软件类型企业的一种资质认证,有些企业已经了解并且办理了这个认证,但是也有些企业不太清楚什么是CMMI认证?企业办理这个证书的意义是什么?关于这个话题,今天同邦信息科技的小编就给大家来说一下
CMMI认证是什么?
CMMI是软件能力成熟度集成模型,其目的是帮助软件企业对软件工程过程进行管理和改进,增强开发与改进能力,从而能按时地、不超预算地开发出高质量的软件。
企业办理CMMI证书的意义
企业实施CMMI的意义则是,CMMI的实施能够提高我国企业的管理水平。降低企业的工程成本。事实表明,企业实施CMMI技术的投入都会得到丰厚的回报。据SEI统计,用于软件项目上的CMMI的投资,其回报率在5:1到8:1之间。由此可见,为什么这么多的企业纷纷实施CMMI项目管理技术。
近年来,很多软件企业纷纷实施CMMI管理模式,一方面反映了我国企业在进入后的危机意识,以及与世界接轨的迫切愿望。另一方面则反映出我国软件企业在改进管理方法上所作的努力。
但是CMMI到底能够为我们做什么呢?实际上这个问题对不同的人有不同的答案。对采购部门的人员来说,掌握了CMMI技术可以有目的地考察项目实施人员或公司的实施能力,从而保证所采购的项目能够顺利完成。对于 项目经理来说,掌握CMMI技术能够提高自己的管理能力,从而能够使项目高质量,低成本,按期限地完成。对于企业领导者来说,CMMI还能够引入科学的管理理念,提升企业的整体管理水平。
很多企业通过CMMI评估,一方面为了满足承包国防工程或一些大企业的工程的要求,另一方面也是为了提高企业自身的管理能力。美国政府的工程项目,绝大多数都要求承包商有一定的CMMI级别作为参加投标的资格。越来越多的大型企业开始要求其工程承包商具有一定的CMMI级别。级别高的企业在赢得项目的竞标中具有一定的优势。因此,如果没有CMMI的等级评估,企业就会失去很多商机。
使用CMMI开发的模型具有如下的优点:
(1)过程改进能扩展到整个企业;
(2)以前各模型之问的不一致和矛盾将得到解决;
(3)既有分级模型表示,也有连续模型表示,可以按需选用;
(4) 以前单个条例(Discipline)过程改进工作与其它条例的过程改进工作结合起来;
(5)基于CMM的评估将与组织以前评估相协调,保护当前的投资,并与ISO15504进行评估所得的结果一致;
(6)很有可能节约费用,特别是在进行多条例过程改进时,以及进行相关的培训和评估时;(7)鼓励鉏织各条例间的沟通和交流。
CMMI实施的两种方法
CMMI有两种不同的实施方法,不同的实施方法,其级别表示不同的内容。CMMI的一实施方法为连续式,主要是衡量一个企业的项目能力。企业在接受评估时可以选择自己希望评估的项目来进行评估。因为是企业自己挑选项目,其评估通过的可能性就较大一点。但是,它反映的内容也比较窄一点。它仅仅表示企业在该项目或类似项目的实施能力达到了某一等级。
而另一种实施方法为阶段性。它主要是衡量一个企业的成熟度,亦即是企业在项目实施上的综合实力。企业在进行评估时,一定要由评估师来挑选企业内部的任何项目,甚至于任何项目的任何部分。一般地讲,一个企业要想在阶段性评估中得到三级,其企业内部的大部分项目要达到三级,小部分项目可以在二级,但绝不能够有一级。阶段性实施方法的难度要大一些。
虽然,CMMI的表述方式不同,但其实质内容是完全一样的。是同一种方法的两种不同的表述方式。企业在准备评估时要做的准备工作也是完全一样的。这些工作对企业的管理上的帮助也是一样的。因此,不管企业需要做什么样的评估,企业所获取的实惠应该是差别不大。具体要做连续性评估,还是做阶段性评估则要看企业对等级评估证书的具体要求。
CMMI的实施流程简述
阶段1:CMMI项目启动会
明确企业实施CMMI的商业目标,建立CMMI项目实施的沟通机制。
阶段2:CMMI基础培训和过程改进小组(EPG)组建
进行CMMI基础概念讲解,指导企业建立核心的过程改进小组。
阶段3:诊断
充分了解企业研发过程现状,识别企业现有软件过程与企业现阶段理应达到的的CMMI成熟度级别的差距,提交诊断报告,进行过程改进的策划。
阶段4:过程域培训和文件定义
结合企业过程现状进行CMMI过程域培训,通过举例、等方式,让企业的EPG掌握过程文件定义技巧,结合企业实际情况有针对性的定义组织的研发过程,并确定过程产出物(如:需求报告)
阶段5:项目试点
选择代表公司的项目或者典型项目进行试点,通过试点来完善过程文件,从而为企业全面推广过程文件打下基础。
阶段6:组织推广
全员参与全面导入与执行CMMI。
阶段7:
验证组织推广的结果,识别企业尚存缺陷并制定再次改善方案,准备充分,以便企业能够更好进行正式SCAMPI评估。
阶段8:正式评估
由SEI的主任评估师领导,采用SCAMPI ( Standard CMMI Appraisal Method for Process Improvement)评估方法,对企业的能力成熟度进行正式的评估,颁发证书,通过SEI网站向全球发布企业信息。
CMMI资质证书为企业带来的价值还是很大的,可以更好的帮助企业的发展,对于CMMI资质认证还有哪些方面不了解的,可以询问我们同邦信息科技的顾问老师哟,全面解答疑惑,同邦信息科技成立至今,已为上百家企业办理资质证书,拿到证书!
原 创 不 易 , 还 希 望 各 位 大 佬 支 持 一 下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下 点 赞 , 你 的 认 可 是 我 创 作 的 动 力 ! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力! ⭐️ 收 藏 , 你 的 青 睐 是 我 努 力 的 方 向 ! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向! ✏️ 评 论 , 你 的 意 见 是 我 进 步 的 财 富 ! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富! 一.
用 ifconfig 发现有个叫 br-59ec53121ef6 的网桥地址是 172.19.0.1,
如果要删除:
ifconfig br-59ec53121ef6 down brctl delbr br-59ec53121ef6 brctl命令安装:
Centos系统 $ yum install -y bridge-utils Ubuntu系统 $ apt-get install -y bridge-utils ifconfig命令列出的br-xxx的网桥一般是docker创建的,怎么确认呢?
docker network ls即可
docker inspect 网桥id 或docker network inspect 网桥id可查看有哪些容器在使用:
一、assets
在 Odoo 中管理资产(assets)并不像在其他一些应用程序中那样简单。原因之一是我们有多种场景需要不同的assets。例如,网络客户端、销售点应用程序、网站甚至移动应用程序的需求是不同的。此外,一些assets可能很大,但很少需要:在这种情况下,我们可能希望它们被延迟加载(按需)。
1、assets类型
共有三种不同的类型:代码(js文件)、样式(css或scss 文件)和模板(xml文件)。
js代码
Odoo 支持三种不同的 javascript 文件。一是系统处理所有这些文件(原生 JS 模块转换为 odoo 模块),二是压缩(可通过debug=assets mode解压缩)并连接。三是将结果保存为文件附件。这些文件附件通常通过页面部分中的
'assets': { 'web.assets_backend': [ 'web/static/src/xml/**/*', ], 'web.assets_common': [ 'web/static/lib/bootstrap/**/*', 'web/static/src/js/boot.js', 'web/static/src/js/webclient.js', ], 'web.qunit_suite_tests': [ 'web/static/src/js/webclient_tests.js', ], }, 以下是一些常用且什么重要的捆绑:
web.assets_common: 此捆绑包包含 Web 客户端、网站和销售点常用的大多数assets。还包含 odoo 框架的较低级别的构建模块。它还包含 boot.js定义 odoo 模块系统的文件。 web.assets_backend: 此捆绑包包含特定于 Web 客户端的代码(特别是 Web 客户端/操作管理器/视图) web.assets_frontend: 这个捆绑包是关于公共网站的所有特定内容:电子商务、门户、论坛、博客 … web.assets_qweb: 后端环境和销售点中使用的所有静态 XML 模板 web.qunit_suite_tests: 所有 javascript qunit 测试代码(测试、助手、模拟) web.qunit_mobile_suite_tests: 移动特定的 qunit 测试代码 操作
通常情况下,管理资产比较简单:只需增加一些新的文件到一个经常使用的绑定如 assets_common 或 assets_backend.
JetBrains是一家捷克的软件开发公司,开发了一大批好用IDE,比如:JAVA用的IDEA,PHP用的PhpStorm,Python用的PyCharm,前端开发用的WebStorm等等。Android Studio也是谷歌基于IntelliJ IDEA定制的,友好的界面,智能的代码提示,丰富的插件使得JetBrains开发的IDE成为程序员的最爱。
由于某些原因,很多时候我们需要时以前的版本,使用方法如下:
Other Versions - IntelliJ IDEA
红色加粗的地方可以替换成其它IDE名称如:pycharm(也可以到后面直接找我测试的链接),建议复制下载链接到迅雷,会快很多。
也可以只下载Toolbox App,安装后打开,选择要安装的软件和版本。(推荐)
JetBrains Toolbox App: Manage Your Tools with Ease
JetBrain公司产品列表如下
All Developer Tools and Products by JetBrains
一、Other Versions - AppCode 二、Other Versions - CLion 三、Other Versions - IntelliJ IDEA 四、Other Versions - PyCharm 五、 Other Versions - PhpStorm 六、Other Versions - GoLand 七、Other Versions - Rider 八、Other Version - RubyMine 九、Other Versions - WebStorm
电池参数 电池的多少mAh表示电池容量,
如1000mah电池,如果以1000ma放电,可持续放电1小时。如果以500mA放电,可以持续放电2小时电池后面多少C代表电池放电能力。
这是普通锂电池和动力锂电池最重要区别,动力锂电池需要很大电流放电。电池的放电能力是以倍数(C)来表示的,它的意思是说按照电池的标称容量最大可达到多大的放电电流。
如1000mAh电池 标准为5C,那么用5x1000mAh,得出电池可以以5000mA的电流强度放电。如果用低C的电池,大电流放电,电池会迅速损坏,甚至自燃。电池后面的2s,3s,4s代表锂电池的节数。
锂电池1节标准电压为3.7v,那么2s电池,就是代表有2个3.7v电池在里面,电压为7.4v多少C快充表示充电倍率,
如1000mah电池,2C快充,就代表可以用2000mA的电流来充电。所以千万不要图快冒然用大电流,超过规定参数充电,电池很容易损坏组合方式:例如“2P3S”电池组 具有不同配置的电池,这通常被称为系列(S)和平行(P)。当串联连接时,一个电池的负端子连接到下一个电池的正端子,依此类推。如果以这种方式连接3个电池,则称为3S。串联电池组提供的电压高于单个电池,其数量取决于以这种方式连接的电池数量。在这个例子中,3S电池组有3个电池×3.7V,相当于11.1 V。
在并联连接的电池组中,所有电池的正极端子都连接在一起,所有负极端子都连接在一起。并联连接的电池组用于提供比单个电池更多的电流,其数量取决于以这种方式连接的电池数量。在我们的例子中,如果你有2500mAh的单元并且它们连接2P,那么你有5000mAh。因此,您的2P3S电池将是5000mAh 3芯(11.1 V)电池组。
淘宝获取的图片 1.
2.
插头:
前言:目前在敲项目,遇到的报错问题~
报错原因:
Property or method "item" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.
found in
翻译报错:属性或方法“item”未在实例上定义,但在渲染期间被引用。通过初始化该属性,确保该属性是反应性的,无论是在数据选项中,还是对于基于类的组件。
简而言之,就是item未定义,但在渲染期间使用。 错误代码/原代码:
错误原因是识别了""双引号,里面应该写单引号
改完代码:
<el-col :span="16"> <div class="num"> <el-card v-for="item in countData" :key="item.name" :body-style="{ display:'flex', padding: 0 }" > <i class="icon" :class="`el-icon-${item.icon}`" :style="{ background: item.color }" > </i> <div class="
在学习了C++中可以使用call_once进行初始化资源后,我就想着写一个单例模板供以后使用。
template<typename T> class SingleTon { using Ptr = std::shared_ptr<T>; static Ptr p; static std::once_flag flag; template<typename ...Args> static void init(Args&&...args) { p.reset(new T(std::forward<Args>(args)...)); } public: template<typename ...Args> static Ptr getInstance(Args&& ...args) { /* //也可以使用lambda表达式实现上面成员函数的功能,但是不是很必要,使用成员函数更加直观而且避免了每次调用都创建lambda表达式和传递p的性能消耗 auto init = [](Ptr &p, auto&& ...args1) { p.reset(new T(std::forward<decltype(args1)>(args1)...)); }; */ //如果不使用lambda表达式而是使用静态成员函数进行初始化,则必须在传入给call_once的时候就进行实例化 //否则编译器会提示init是一个未解决的重载函数 std::call_once(flag, init<Args...>, std::forward<Args>(args)...); //static Ptr p = std::make_shared<T>(std::forward<Args>(args)...); return p; } }; template<typename T> std::shared_ptr<T> SingleTon<T>::p; template<typename T> std::once_flag SingleTon<T>::flag; 但是非常不幸,如果我们简单测试一下这个单例模式就会报错。
一、先用eNSP搭建起网络拓扑(如下图)
二、完成终端和路由器的基本IP和网络接口配置
三、创建LoopBack端口并配置IP
四、为每个路由器配置Route-Id标识并将指定的端口划分并添加到不同区域
五、查看邻居关系,验证OSPF是否配置完成
六、对终端进行Ping通测试并Tracert其路由过程
七、更改端口的Cost值,再次Ping通测试并tracert路由
可以发现,OSPF进行了路径的更改
前言:自己敲项目,遇到的报错问题
左侧菜单栏时,发现点击路由跳转 会有这个报错
vue-router.esm.js?3423:2100 Uncaught (in promise) NavigationDuplicated {_name: 'NavigationDuplicated', name: 'NavigationDuplicated', message: 'Navigating to current location ("/mall") is not allowed', stack: 'Error\n at new NavigationDuplicated (webpack-int…node_modules/vue/dist/vue.runtime.esm.js:4617:26)'}
router.js(或者router文件夹下index.js)中,添加这段代码
import Router from 'vue-router'; Vue.use(Router) // 添加这下面一段代码,就可以解决报错 const originalPush = Router.prototype.push; Router.prototype.push = function push(location) { return originalPush.call(this, location).catch(err => err) }; 添加代码:
import VueRouter from "vue-router"; Vue.use(VueRouter); const originalPush = VueRouter.prototype.push; VueRouter.prototype.push = function push(location) { return originalPush.call(this, location).catch(err => err) }; 转载于:https://www.
前言:正在敲一个项目,所遇到的警告问题
嵌套路由
警告:Named Route 'Main' has a default child route. When navigating to this named route (:to="{name: 'Main'"), the default child route will not be rendered. Remove the name from this route and use the name of the default child route for named links instead.
原因:在vue中,如果有默认子路由,在路由配置项中,就不用给父级路由设置name了,否则会有一个警告
警告代码:
正确代码:
const routes = [ { path: '/', // name: 'Main', component: () => import('../src/views/Main'), // 嵌套路由 children: [ { path: '/', name: 'home', component: () => import('.
提示:多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的
ThreadLocal是用空间换取时间,synchronized关键字是用时间换空间。
ThreadLocal线程安全示例及其原理 前言一、示例ThreadLocal线程安全示例非线程安全示例 二、ThreadLocal线程安全原理线程安全原理内存泄漏 三、其他线程安全的集合Vector(不推荐)HashTableCollections包装方法ConcurrentHashMap(多个桶,锁部分)CopyOnWriteArrayList和CopyOnWriteArraySet 四、Java并发编程12种锁的具体实现方式总结 前言 线程安全是多线程编程时的计算机程序代码中的一个概念。 在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。
提示:以下是本篇文章正文内容,下面案例可供参考
一、示例 以下示例说明了两个线程操作同一对象的过程中,线程安全和线程不安全的两种结果
ThreadLocal线程安全示例 package com.mabo; import java.util.concurrent.TimeUnit; public class TheadLocalTest { private static ThreadLocal<Integer> threadLocalStudent = new ThreadLocal<>(); private static int a=0; static { threadLocalStudent.set(a); } public static void main(String[] args) { // 简单写一个测试线程隔离的例子 // 原料: 1个ThreadLocal类型的变量 2个线程 // 期望结果:线程一set的变量 线程二get不到! new Thread(()->{ a=2; threadLocalStudent.set(a); System.out.println(Thread.currentThread()+"线程保存的对象:"+threadLocalStudent.get()); try { // 细节!!! 先睡一会再get避免误差。 // 可见这是一个严谨性很高的测试Demo TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.
一、简介 首先从cloudcompare(后面简称cc)官网上下载源码,解压后在\plugins\example路径下可以看到名为ExamplePlugin、ExampleIOPlugin、ExampleGLPlugin这三个文件夹,以及一个CMakeLists.txt文件。这三个文件夹都是插件的模板,字面意思上理解,分别是写一般插件、输出输出、显示相关的。
二、修改为自己的插件 下面讲一下一般插件ExamplePlugin的编写细则。首先复制一份ExamplePlugin,更改文件夹名字为自己的插件名,这里就命名为myplugin,然后打开CMakeLists.txt,仿照上面三行,赋值一下,改为自己的插件名,如下所示:
下面,进入myplugin文件夹,然后把里面的命名为ExamplePlugin的文件都更改为myplugin,如下所示:
下面就按照文件顺序进行修改吧,其实整个修改过程并不存在先后顺序,重点只是需要把所有模板的命名都改为自己的插件名而已。在这里,images里面存的是插件的图标图片,可以自己修改图片以及命名,只是后面写路径时候要注意保持一致就好了。
1. CMakeLists.txt 首先,打开CMakeLists.txt,将第13行的ExamplePlugin改为myplugin,第9行和第11行的命名随意,可改可不改,如下所示:
2. info.json 保存,然后打开info.json文件,这个文件主要是写一些插件的描述,这里最重要的是把第4行的":/CC/plugin/ExamplePlugin/images/icon.png"改为自己的插件图标路径和命名":/CC/plugin/myplugin/images/icon.png"。在这里,前面的CC并不是真实的路径,感觉像是宏一类的,会在运行时候自动替换为你当前的绝对路径,所以可以不用管它。然后第3行的name的值是插件在cc里的名字,可以自己随意改动,这里就也命名为myplugin了。其他一些信息可以自己按需要设置,这些信息不会对生成插件造成影响。修改后如下所示:
3. myplugin.cpp 下面打开myplugin.cpp,直接在记事本里面,将ExamplePlugin全部替换为myplugin,如下所示:
4. myplugin.h 打开myplugin.h,同理,直接将所有的ExamplePlugin全部替换为myplugin,不过,这里还需要改一个地方,第49行,将Example改为myplugin。这是插件的唯一标识,具体描述直接看46-48行就知道了。
5. myplugin.qrc 最后,打开myplugin.qrc,将第2行的prefix路径修改为自己的路径,在这里,我们应该将ExamplePlugin改为myplugin,如下图所示:
三、编译 好了,到这里一切工作就都已经准备完毕了,接下来就是使用cmake对源码进行编译了,编译的教程可以参考这里。有一点不同的是,在configure之后,generate之前,要先把PLUGIN_MYPLUGIN项目勾上,如下图所示。这个就是刚才我们修改好的myplugin项目了,都改好后点击generate就可以了。
四、功能实现 生成后,打开生成的sln工程,组织如下:
插件功能的实现都是在我们建立的myplugin里面的h和cpp文件中进行的。展开myplugin项目,如下所示:
插件功能实现的接口都是在doAction这个函数里面,可以把它认为是控制台程序中的main函数。如下图所示:
如果将它与main函数类比,那应该就很好理解了。简单的操作你可以直接在这个函数里实现,而复杂的操作,你也可以像控制台程序那样,在myplugin这个工程里新建很多h和cpp文件来进行实现。模板里实现的功能是点击这个plugin后,会在cc底下输出hello这行字样。功能实现以后,将程序改为release x64环境,然后点击顶部菜单栏的生成->批生成,全部勾上,然后关闭。右键ALL_BUILD工程,然后就是漫长的编译等待了。
ALL_BUILD生成成功后,右键INSTALL工程,点击生成。生成成功后,你就可以在cmake时候指定的生成路径下看到cloudcompare文件夹了:
打开,可以看到里面有cc的exe文件,然后plugins文件夹里有名字为myplugin的dll文件,这个就是你编译生成的插件了。
双击运行exe文件,在打开的cc顶部菜单栏,可以看到自己编写的插件: