element el-input type=number的时候隐藏上下箭头,并且禁止鼠标滚动改变值,禁止输入e

el-input,type = number 鼠标点击箭头增加减小数值,它的鼠标滚动也会 如图: 两种方法,第一种正常的写: 第一种方法(有bug,可以输入e,第二种可以解决): // 全局css 加上以下代码,可以隐藏上下箭头 // 取消input的上下箭头 input::-webkit-inner-spin-button { -webkit-appearance: none !important; } input::-webkit-outer-spin-button{ -webkit-appearance: none !important; } input[type="number"]{ -moz-appearance: textfield; } 这时候又会发现一个问题,就是输入框我们鼠标滑动的的时候,它会改变input的值,如图: 解决方法: //bug是可以输入e 第二种方法可以解决 <el-input v-model="amount" type="number" @mousewheel.native.prevent @DOMMouseScroll.native.prevent> </el-input> 第二种方法(完美解决,代码量也少,直接使用正则即可): // 注意type类型是text <el-input v-model="amount" type="text" @input="allNumber(amount)" > </el-input> <script> export default { data() { return { amount: '', } }, methods: { allNumber(value) { value = value.replace(/[^\d]/g,""); //只能输入数字 this.amount = value //注意这里是string,你要数字类型记得自己转一下 console.

git 撤销提交 撤销暂存区 取消操作

撤销提交: 开发过程中我们对代码进行了修改,修改之后进行git add files,然后执行git commit -m "cmt info",在提交之后我们就可以push到远程仓库,正常是这么操作的,但是如果在push之前发现我们改错了,不能push,这时候我们就要撤销提交,怎么办呢? 执行git reset --sfot HEAD^ 该命令的意思是撤销最后一次提交并且让我们修改的文件在暂存区中,官网的解释是: 也就是说我们的状态会变为Changes to be committed 举例如下: 先查看当前的提交: 当前的commit:b16829ed6388a28ab1022875edde5d03bf0f1af2,提交信息是:to 仓库 现在我们再看看当前commit的修改内容是什么: 修改内容是在src/main/resources/application.properties文件中加了一个属性键值对:mycat=tom 现在我们撤销:git reset --soft HEAD^ ,执行该命令后查看状态如下: 我们再查看下提交记录,执行git log: 刚才的提交没有了。 撤销暂存区: 假如我们在执行完git add <files>命令之后,想要将该文件的变化从暂存区撤回,怎么办呢? 执行命令:git restore --staged <fileName> 执行之后,状态就变为了Changes not staged for commit: 取消修改: 我们对文件进行了一大堆修改,修改之后发现是错误的,想取消修改怎么办?只要执行git restore <fileName>,该命令就是将工作区的文件修改取消了,相当于放弃当前的文件修改。 如下:

5.Vue中的计算属性(compute)监视属性(watch),二者优点和对比

目录 计算属性(compute) 结合程序来看 运行结果 监视属性(watch) 代码 运行结果 监视的简写 compute和watch的区别 data中的数据就是属性 计算属性(compute) 1.定义:通过自己已有的属性计算得来 2.原理:底层结束Object.defineproperty方法提供的getter和setter 3.get函数什么时候执行 1.初次读取fullName的时候 2.所依赖的数据发生变化的时候 4.优势:与methods实现相比,内存有缓存机制(复用),效率更高,调试方便 5.备注: 1.计算属性最终会出现再vm上,直接读取即可 2.如果计算属性要被修改,那必须写set函数去相应修改 结合程序来看 <body> <div id="root"> 姓: <input type="text" v-model="fisrtName"> <br> 名: <input type="text" v-model="lastName"> <br> 姓名: <span>{{fullName}}</span> </div> <script> Vue.config.productionTip = false new Vue({ el: '#root', data() { return { fisrtName: 'fan', lastName: 'xiyuan' } }, // computed: { // //完整写法 // fullName: { // //get有什么作用,当人读取fullName时,get就会被调用 // // 且返回值作为fullName的值 // //set什么时候使用:当需要直接修改fullName的时候 // set(value){ // }, // get() { // return this.

如何在idea中创建一个SpringBoot项目(超详细教学)

如何在idea中创建一个SpringBoot项目 目录 环境准备 1.1打开IDEA,点击New新建一个项目 1.2 使用Spring Initializr方式构建Spring Boot项目 ?1.3 设置项目所属组,项目名称,选择java版本 ?1.4 选择对应的SpringBoot版本 1.5?再次设置项目名称,选择存储项目的路径,点击创建 ?1.6 创建成功 ?1.7 编写测试方法 1.7.1 启动端口 ?1.7.2 编写一个控制类 1.7.3 编写HelloWord.java 1.7.4 启动测试 环境准备 (1)JDK 环境必须是 1.8 及以上,传送门:jdk1.8.191 下载(2)后面要使用到 Maven 管理工具 3.2.5 及以上版本(3)开发工具建议使用 IDEA,也可以 MyEclipse 1.1打开IDEA,点击New新建一个项目 1.2 使用Spring Initializr方式构建Spring Boot项目 Spring Initializr是一个Web应用,它提供了一个基本的项目结构,能够帮助我们快速构建一个基础的Spring Boot项目 1.3 设置项目所属组,项目名称,选择java版本 1.4 选择对应的SpringBoot版本 选择开发中用到的配置依赖包,也可以不选择,在用到时向pom里面添加对应的jar 1.5再次设置项目名称,选择存储项目的路径,点击创建 1.6 创建成功 1.7 编写测试方法 1.7.1 启动端口 测试方法前,我们先在配置文件里配置一下我们的启动端口 application.properties #启动端口 server.port=8088 1.7.2 编写一个控制类 编写一个控制类–>便于规范我们新建一个controller包–>建一个HelloWord.class 当用到上面那个注解是爆红,则说明没有引入此注解依赖,我们只需要将鼠标到注解上,IDEA会提示所需依赖,我们只需点击下载即可 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 1.

Pandas创建透视表教程

本文介绍如何使用Pandas创建透视表(交叉表)。 透视表语法 pd.pivot_table(df, values='col1', index='col2', columns='col3', aggfunc='sum') 下面通过示例进行说明。 创建透视表并进行数据汇总 首先创建示例数据: import pandas as pd #create DataFrame df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'position': ['G', 'G', 'F', 'F', 'G', 'F', 'F', 'F'], 'points': [4, 4, 6, 8, 9, 5, 5, 12]}) #view DataFrame print(df) # team position points # 0 A G 4 # 1 A G 4 # 2 A F 6 # 3 A F 8 # 4 B G 9 # 5 B F 5 # 6 B F 5 # 7 B F 12 下面创建透视表,按team和position汇总points值:

printf格式化输出

printf 格式化输出 格式为 " %s " 表示以字符串的形式输出第二个可变长参数的第一个参数值、格式为 " %n " 表示换行格式为 " %S " 表示将字符串以大写形式输出;在 " %s " 之间用 " n$ " 表示输出可变长参数的第n个参数值格式为 " %b " 表示以布尔值的形式输出第二个可变长参数的第一个参数值 格式为 " %d " 表示以十进制整数形式输出格式" %o " 表示以八进制形式输出格式" %x " 表示以十六进制 * 输出;" %X " 表示以十六进制输出,并且 将字母(A、B、C、D、E、F)换成大写格式为 " %e " 表示以科学计数法输出浮点数格式为"%E"表示以科学计数法输出浮点数,而且将e大写格式为 " %f " 表示以十进制浮点数输出,在 " %f " 之间加上 " .n " 表示输出时保留小数点后面n位 格式为 " %t " 表示输出时间日期类型 " %t " 之后用y表示输出日期的二位数的年份(如99)、用m 表示输出日期的月份、用d表示输出日期的日号"

Java基础之正则表达式

Java 正则表达式 文章目录 Java 正则表达式意义特点Stringregex包Pattern类Matcher类用法捕获组用法URL反向引用 Matcher类方法索引方法查找方法替换方法 PatternSyntaxException 正则语法匹配格式单个字符匹配单个字符集单个简化字符集边界匹配数量表示逻辑表达式 正则格式列表 意义 正则表达式是对字符串操作的一种逻辑公式 事先定义好的特定字符、及特定字符的组合组成规则字符串表达对字符串的一种过滤逻辑 给定一个正则表达式和另一个字符串可以实现: 字符串是否符合正则表达式的过滤逻辑(“匹配”) 通过正则表达式从字符串中获取特定部分 特点 灵活性、逻辑性和功能性非常强 可以迅速地用极简单的方式达到字符串的复杂控制 对于刚接触的人来说,比较晦涩难懂 正则表达式写好后,没有错对之分,返回结果只是true和false 定义了字符串的模式,可以用来搜索、编辑或处理文本 并不局限某种语言,但在不同语言有细微差别 实例:一个字符串就是一个简单的正则表达式 Hello World 正则表达式匹配"Hello World"字符串. (点号)也是一个正则表达式,匹配任何一个字符:“a” 或 “1” 正则表达式描述this is text匹配字符串"this is text"this\s+is\s+text注意\s+可以匹配多个空格,之后匹配is字符串,再之后\s+匹配多个空格再跟上text字符串;例:this is text^\d+(\.\d+)?^ 定义了以什么开始 \d+ 匹配一个或多个数字 ? 设置括号内的选项是可选的 \. 匹配 “.” 可以匹配的实例:“5”, “1.5” 和 “2.21” String string 类型字符串可以转为其他任何类型,所以用户输入内容一般用 String 接收 转为其他类型数据为确保正确性需要复杂验证 正则表达式就可以对字符串内容进行拆分、验证通常用来进行通用内容格式验证,或内容的定向读取 //String 中可以直接使用正则表达式 //matcher(): 判断是否相同,返回布尔值 String s = "456137900"; System.out.println(s.matcher("\\d+")); //结果为true,匹配所有数字 //split(): 分割字符串 String content = "

C++ static关键字

几点总结 1、类内的static成员变量全局可见,需要类内声明,类外初始化 2、static成员函数只能调用static成员变量、static成员函数和类外部的其他函数 3、static成员仍受private关键字限制(private成员函数只能不能主动调用,只能被类内的其他成员函数调用) 例子: #include <cstdio> #include <iostream> using namespace std; class A{ public: static void f1(){ std::cout << "f1() called" << std::endl; f2(); cout << "===a: " << A::a << endl; } static int a; private: static void f2(){ cout << "f2() is called" << endl; cout << a << endl; } }; int A::a = 5; int main() { A::f1(); cout << "main: " << A::a << endl; // A::f2(); }

CMMI2.0和1.3之间的区别有哪些?

CMMI资质认证已经有很多年的历史了,CMMI的版本也发生了变化,从最初的1.3版本演变成至今2.0版本,现在的企业在办理的时候使用也都是2.0版本,那么这两者之间的变化是什么?区别大不大这些都是很多人好奇的,今天同邦信息科技的小编就给大家说一下 1、关注性能: 在模型的所有成熟度等级中都内置了新的性能实践,强调并关注改进组织性能,以识别更显着的投资回报率。 这反映了现代商业氛围,即,性能是每个组织成功的关键——无论其成熟度如何。由于性能现在内置于每一成熟度等级之中,因此组织可以规划更加有条理且循序渐进的路线,以实现更好的性能和更高的成熟度。 1级从基本性能开始,这种性能是随着等级的提高而逐渐建立起来的,2级实践包含1级的实践,而3至5级实践的建立是在低等级的基础上进一步演变形成的。 每个基准评估所建立的性能报告能够更有效地展示组织的性能改进。 2、提高可用性并改进集成指南: CMMI V2.0是建立在可扩展的体系结构上,该体系结构可无缝对接新内容,从而为特定的业务需求提供指导。 当前,CMMI开发模型2.0版本包含特定的指南,通过关注性能,帮助组织使用敏捷方法开发,加强其过程并扩展其敏捷实践。更多内容,诸如安全、防护等仍将持续更新。 纳入1级实践,使新组织能够采取渐进措施进行改进,从而取得早期成功。 提供可选的网上格式,使得易于选择和访问相关内容。 将更容易管理多模型评估,一旦实施了核心CMMI实践,只需添加额外的模型或领域特定的内容。 3、更易理解和访问: 采用非技术性的商业语言编写CMMI V2.0;这将是CMMI V2.0更易于被非英语母语人士所使用,并且更易于翻译成不同的语言。 每个实践域都有一个渐进的改进路线,一个级别的实践建立在上一级别的实践之上。 建立和维持实践已经取代了通用目标和通用实践。 获得许可的用户将可以查看模型中或多或少对自己有用的部分。用户可以点击并搜索来快速找到需要的内容,而不是滚动浏览PDF或翻阅书籍。获得许可的用户在许可期限内可以访问当前所有CMMI V2.0模型内容以及任何更新内容。 4、提高评估的价值和可靠性: ①SCAMPI A类评估VS基准评估 基准评估(取代了SCAMPI A类评估)的成熟度等级定级结果有效性可持续3年。 新的评估方法包含经过统计验证的随机抽样方法,为工作单元(WU)的数据分析提供更为广泛的覆盖范围,并显着降低抽样结果的偏见。 强调评估方法和计划活动,从而减少整体的准备时间。 ②维持性评估 维持性评估(新的评估类别)会显着减小过程维持的检查范围,以确保成熟度保持一段时间。 实施维持性评估能将基准成熟度定级结果有效期延长2年。 在进行最初的基准评估之后,您可以连续开展3次维持性评估,然后才需要进行另外一场基准评估重新建立基线。 ③SCAMPI B类和C类评估VS评价评估 组织可以针对CMMI V2.0模型内容的任何范围和任何部分进行评价评估(取代 SCAMPI B类 & C类评估),以实现灵活满足业务目标。 5、成熟度等级:与CMMI V1.3的成熟度等级非常相似: 6、采用指南:特定的指南将引导组织循序渐进地开始使用CMMI或从CMMI V1.3进行过渡。 通过一套清晰的并经过证明的简单步骤,即可开始(或转换)您的CMMI性能改进之旅。 通过常用的所需资源列表确保成功的改进工作。 识别重要经验教训和最佳实践以避免“错误的启动”,并确保改进工作直接与业务成果相关联 。 7、重新设计的系统:更新后,已完全集成的系统(评估系统,评估结果发布系统等),将使您更容易访问CMMI V2.0模型的内容、评估系统和评估组成员资源。单点登录界面将减少冗余,无论您是刚开始还是继续CMMI旅程,都将变得更加简单。 关于CMMI1.3演变到CMMI2.0之间的变化和区别是什么,同邦信息科技的小编已经给大家说了,本质上的变化还是很大的,现在企业办理的也都是CMMI2.0版本的,我们同邦集团专注资质认证已有十余年,帮助上百家企业办理cmmi资质认证,关于CMMI资质有不懂得问题是可以询问我们的顾问老师来解答的哟!

【微信小程序】一文带你搞懂小程序的页面配置和网络数据请求

文章目录 页面配置页面配置文件的作用页面配置和全局配置的关系页面配置 网络数据请求网络数据请求的限制配置request合法域名发起get/post请求在页面刚加载时请求数据跳过request合法域名校验关于跨域和ajax请求 页面配置 每个小程序页面都有一个.json文件,该文件用来对小程序的页面进行配置。 页面配置文件的作用 小程序中,每个页面都有自己的.json配置文件,用来对当前页面的窗口外观、页面效果等进行配置。 页面配置和全局配置的关系 小程序中,app.json中的window节点,可以全局配置小程序中每个页面的窗口表现。 如:当在app.json中全局配置导航栏的文字为苏凉时,此时每个页面的导航栏标题都为苏凉。 如果某些小程序页面想要拥有特殊的窗口表现,此时,“页面级别的 .json配置文件”就可以实现这种需求。 注意:当全局配置和页面配置冲突时,根据就近原则,最终的页面以页面配置的效果为准。 页面配置 在页面配置文件(.json)中我们可以通过修改以下属性来配置页面文件。 属性名类型默认值说明navigationBarTitleTextString字符串导航栏标题文字内容navigationBarBackgroundColorHexcolor#000000导航栏背景颜色,如#000000navigationBarTextStyleStringwhite导航栏标题颜色,仅支持black / whitebackgroundColorHexcolor#ffffff窗口的背景色backgroundTextStylestringdark下拉 loading的样式,仅支持dark / lightenablePullDownRefreshBooleanfalse是否全局开启下拉刷新onReachBottomDistanceNumber50页面上拉触底事件触发时距页面底部距离,单位为px 如: 网络数据请求 网络数据请求的限制 出于安全性方面的考虑,小程序官方对数据接口的请求做出了如下两个限制; 只能请求HTTPS类型的接口必须将接口的域名添加到信任列表中,如下图所示: 下面我们一起来看看如何进行域名配置。 配置request合法域名 步骤: 登录小程序管理后台:微信小程序管理后台 下拉点击开发下的开发设置 下拉找到服务器域名,点击开始配置 微信扫码进行身份验证,手机上点击开启 5.输入你需要配置的域名,保存并提交。 此时在服务器域名中存在了刚刚所提交的域名。即设置成功。 回到微信小程序开发者工具;详情-项目配置-request合法域名中就保存了刚才我们在小程序管理后台中配置的域名了。此时我们就可以在小程序中合法使用这两个域名。 配置服务器域名注意事项: 域名只支持https协议域名不能使用IP地址或localhost域名必须经过ICP备案服务器域名一个月内最多可申请5次修改(小程序管理后台显示还可修改49次,为显示bug,实际上就只有5次,请谨慎使用。) 发起get/post请求 调用微信小程序提供的wx.request()方法,可以发起GET数据请求: 在wxml中给按钮绑定一个单击事件: <button type="primary" bindtap="Get_request">发起GET请求</button> 通过wx.request方法请求数据。 Get_request(){ wx.request({ url: 'https://suliang.blog.csdn.net', //请求地址 method:"GET", //请求方式 data:{ //发送到服务器的数据 name:'suliang', age:21 }, success:(result)=>{ //请求成功后的回调函数 console.log(result); } }) } 点击按钮,get请求成功。 同理:发起POST请求也是如此,只需将method的值修改为PSOT即可。 在页面刚加载时请求数据 在很多情况下,我们需要在页面刚加载的时候,自动请求一些初始化的数据。此时需要在页面的onLoad事件中调用获取数据的函数。 在页面的.js文件中的监听页面加载设置即可。 /** * 生命周期函数--监听页面加载 */ onLoad(options) { this.

eNSP综合实验——简易园区网的搭建

拓扑图 一、配置终端和路由器的网络参数 二、使用Vlanif将三层交换机和路由器联通 三、实现3号和2号交换机的链路聚合 四、配置交换机之间的生成树 五、为各端口配置链路类型并运行相应的vlan 六、进行Ping通测试 七、利用三层交换机上的Vlanif实现Vlan间通信 八、在核心交换机上配置DHCP地址池,实现Vlan10域和20域ip地址的获取 九、在隔离路由器和核心交换机之间配置OSPF以实现路由器对内网的访问 十、隔离路由器默认缺省路由指向外网 十一、NAT(easy ip)实现私有地址转公有地址以规避非法的ip定位

Ansible中的变量及加密

目录 1.变量命名 2.变量级别 3.变量设定和使用方式 1.在playbook中直接定义变量 2.在文件中定义变量 3.使用变量 4.设定主机变量和清单变量 5.目录设定变量 6.用命令覆盖变量 7.使用数组设定变量 8.注册变量 9.事实变量 10.魔法便变量 JINJA2模板 j2模板书写规则 Ansible的加密控制 1.创建加密文件 2. vim key创建密钥 3.加密现有文件 4.查看加密文件 5.编辑加密文件 6.解密文件 7.更改密码 1.变量命名 和大多数编程语言一样,包含数字,下划线,字母 ,只能用下划线或字母开头 ansible内置的关键字不能作为变量名 2.变量级别 全局: 从命令行或配置文件中设定的 paly: 在play和相关结构中设定的 主机: 由清单,事实收集或注册的任务 变量优先级设定: 狭窄范围有限与广域范围 3.变量设定和使用方式 1.在playbook中直接定义变量 2.在文件中定义变量 编辑westos.yml文件,指定变量linuxfile,在编辑test.yml文件,如下 运行后即可在/mnt/中创建linuxfile 3.使用变量 - name: tesk play hosts: westos tasks: - name: create filef file: path: "{{ file }}" state: touch 4.设定主机变量和清单变量 在定义主机变量和清单变量时使用 编辑inventory如下,编辑test.yml如下,运行test.yml即可在受控主机中创建filewestoslinux 5.目录设定变量 group_vars 清单变量,目录中的文件名称与主机清单名称一致

ByteBuffer和String互转

Charset charset = StandardCharsets.UTF_8; String str = "kj你好呀----------------kjlkjlkjlk"; ByteBuffer buffer = ByteBuffer.allocate(1024); //将字符串转成ByteBuffer buffer.put(str.getBytes(charset)); //切换读取数据的模式 buffer.flip(); //----将ByteBuffer转成字符串1------------------------------------------------------------------------------ String string1 = charset.decode(buffer).toString(); System.out.println(string1); //----将ByteBuffer转成字符串2------------------------------------------------------------------------------ buffer.flip(); String string2 = new String(buffer.array(), 0, buffer.limit()); System.out.println(string2);

Android入门介绍

1.系统简介 1.1Android名词 Android 一词的本义指 “机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。 1.2 Logo Android 的 logo 是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号,于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了 1.3 发行版本 版本号版本名称API 级别发布时间Android 1.0-12008.9.23Android 1.1-22009.2.2Android 1.5Cupcake(纸杯蛋糕)32009.4.30Android 1.6Donut(甜甜圈)42009.9.15Android 2.0/2.0.1/2.1Eclair(松饼)5/6/72009.10.26Android 2.2/2.2.1Froyo(冻酸奶)82010.5.20Android 2.3/2.3.2/2.3.3/2.3.7Gingerbread(姜饼)9/102010.12.7Android 3.0/3.1/3.2Honeycomb(蜂巢)11/12/132011.2.2Android 4.0/4.0.2/4.0.3/4.0.4Cream Sandwich(冰淇淋三明治)14/152011.10.19Android 4.1/4.2/4.3Jelly Bean(果冻豆)16/17/182012.6.28Android 4.4KitKat(奇巧巧克力)19/202013.11.1Android 5.0/5.1Lollipop(棒棒糖)21/222014.10.16Android 6.0Marshmallow(棉花糖)232009.5.28Android 7.0/7.1Nougat(牛轧糖)24/252016.8.22Android 8.0/8.1Oreo(奥利奥)26/272017.8.21Android 9PIE(派)282018.8.21Android 10Q292019.9.3Android 11R302020.9.9Android 12S312021.10.5Android API 32322022.2.15 2.应用组件 2.1Android开发的四大组件 1. 活动 (Activity) Android 中,Activity是所有程序的根本,所有程序的流程都运行在Activity 之中,Activity可以算是开发者遇到的最频繁,也是Android 当中最基本的模块之一。 一般一个Android 应用是由多个Activity 组成的。这多个Activity 之间Android的应用 可以进行相互跳转。 2. 服务 (Service ) Service 是android 系统中的一种组件,它跟Activity 的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。Service 是没有界面的长生命周期的代码。举个例子,打开一个音乐播放器的程序,这个时候若想上网了,那么,打开Android浏览器,这个时候虽然已经进入了浏览器这个程序,但是,歌曲播放并没有停止,而是在后台继续一首接着一首的播放。其实这个播放就是由播放音乐的Service进行控制。 3.广播接收器 (BroadcastReceiver ) 在Android 中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。

Java基础之Java方法

Java 方法 文章目录 Java 方法方法设计原则 命名规则方法的定义方法调用递归 void关键字通过值传递参数重载(Overload)定义重载规则 重写(Override)重写规则super关键字 重写和重载区别重载重写 参数作用域命令行参数可变参数 finalize()方法构造方法 方法 语句的集合,在一起执行一个功能解决一类问题的步骤的有序组合包含于类或对象中在程序中被创建,在其他地方被引用 设计原则 原子性:一个方法只完成一个功能,利于后期扩展 优点: 使程序变得更简短而清晰有利于程序维护提高程序的开发效率提高了代码的重用性 命名规则 第一个单词应以小写字母作为开头,后面单词则用大写字母开头,不使用连接符。例如:setByName()下划线可能出现在JUnit的测试方法名称中用以分隔名称的逻辑组件;典型模型:test<MethodUnderTest>_<state>。 例如:testPop_emptyStack 方法的定义 修饰符 返回值类型 方法名(参数类型 参数名){ 方法体 return 返回值; } public static int age(int birthday){ return birthday; } public static int max(int num1, int num2){ return num1 > num2 ? num1 : num2; } 方法包含一个方法头和方法体 主函数 main 方法的头部是不变的 带修饰符 public 和 static返回 void 类型方法名字是 main,String[] 类型参数:String[] 表明参数是字符串数组 其它语言中方法指过程和函数 返回非void类型返回值的方法称为函数返回void类型返回值的方法叫做过程 方法头

C++学习——坚持(二)

前言 努力不一定成功,但是坚持做好一件事一定很酷。 在上一篇文章 C++学习——共勉(一) 中学习了C++语言的特点和程序结构,这篇文章就简单看看面向对象的基本概念。 一:结构化程序设计 在面向对象程序设计方法出现之前,软件界流行的主流设计方法之一就是结构化程序设计方法,也称为面向对象的设计方法。 在机构化程序设计中,采用自顶向下、逐步求精以及模块化思想,有个著名的公式体现了这一思想:数据结构+算法=程序。可以说,程序基本上都含有顺序、选择、循环3种基本控制结构。 一个完整的c++程序包括以下几个部分: 一个主函数,可以用来调用其他函数,也叫做主程序(关于主函数是否能被调用,我在网上也查了一些资料并实验了一下:如果不加约束条件去调用主函数的话就会死循环,这时候考虑用递归的思想去调用就能运行出来。但是一般情况下不会对主函数进行调用,个人觉得c++中主函数能否被调用应该还未定义,期待前辈们指点!)自主定义的任意多个类和全局函数全局说明,在所有函数和类定义之外的变量说明和函数原型必要注释头文件 对于比较大的文件,可以根据主函数和所定义的各个类以及全局函数的功能和相互关系,可以将类和全局函数划分为几个程序文件,包括 cpp. 文件(源程序文件)和 .h 文件(头文件)。 1:面向对象的程序设计 对象就是数据+函数,也就是属性+操作。举个简单的例子:员工的姓名、职位、工资等就是一个个变量;员工进行加班、出差、摸鱼划水,或者获得提拔、炒鱿鱼等就是操作;而操作会施加于属性,比如“加班、出差、摸鱼划水”操作会修改“工资”属性;“提拔、炒鱿鱼“操作会修改”职位“属性。 用对象名标识一个个对象,用数据表示对象的属性,再用函数实现操作。 C++中使用对象名、属性、操作三要素来描述对象。 2:类模型结构 类模型结构和对象结构很相似,它们都含有属性和操作,唯一不同的是对象结构图中有对象名而没有类名;类模型结构图中有类名但没有对象名。 二:创建类对象的基本形式 定义一个普通对象,即类变量的基本方法有两种: 方法一 类名 对象名; 或 类名 对象名(参数); 或 类名 对象名 = 类名(参数); 可以扩展为对个对象: 类名 对象名1,对象名2,....; 或者 类名 对象名 1(参数1),对象名2(参数2),...; 方法二 类名 *对象指针名 =new 类名; //使用该方法调用函数时,调用无参的构造函数,如果这个构造函数是由编译器为类提供的,那么类中成员变量不进行初始化。 或者 类名 *对象指针名 =new 类名(); //在创建对象时调用无参的构造函数。如果这个构造函数时由编辑器为类提供的,那么对类中的成员变量进行初始化。 或者 类名 *对象名指针 =new 类名(参数); 使用new创建对象时返回的是一个对象指针,这个指针指向本类刚创建的这个对象。使用new 创建的对象,必须用delete撤销。 声明对象引用(变量别名)格式: 类名 &对象引用名=对象; 声明对象指针格式: 类名 *对象指针名=对象的地址; 声明对象数组格式: 类名 对象数组名[数组大小];

分布式开发漫谈

​> 活动地址:CSDN21天学习挑战赛 分布式开发就需要知道什么是分布式系统,分布式系统直接如何通过RPC方式通信,服务治理解决那些问题?(学习《架构演变实战:从单体到微服务再到中台》) 1、分布式系统 分布式系统可用理解为通过网络连接让多台计算机协同解决单台计算机所不能解决的计算、存储问题,多台计算机之间通过RPC方式进行通信。 通过使用多台计算机分布式解决单台计算机的问题,需要让分布式系统中的每台计算机解决原问题的一个子集,这时需要使用横向拆分法或纵向拆分法对复杂的系统进行拆分。 横向拆分:在无状态系统中多部署几个实例,通过负载均衡方式协调每个实例所负载的计算量。纵向拆分:将一个大应用拆分为多个小应用,每个小应用负责处理一部分业务。如将电商系统拆分为用户、商品、订单服务。 虽然通过拆分解决了计算和存储的问题,但使用分布式开发会引发比单体应用更多的问题,如网络异常、数据一致性及分布式系统的性能等。 为了解决分布式系统中的问题,出现了副本概念。分布式系统副本是为分布式系统中的数据或服务提供冗余,一种是服务副本,另一种是数据副本。 服务副本:多个节点提供某种相同的服务,这种服务不依赖本地节点的存储状态,是一种无状态服务。分布式系统种服务副本非常容易控制,由于服务本身具备无状态特性,运维人员可以动态增加或减少服务副本的数量,而不会影响服务。数据副本:在不同节点上持久化同一份数据,当出现某一个节点存储的数据丢失了,可用从其他副本节点上读取数据,数据副本是分布式系统种解决数据丢失的唯一方法,但是数据副本需要被分散或复制到不同的节点上,所以如何保证各节点之间数据的一致性是一个巨大挑战。 数据的一致性分为如下 强一致性:任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据;弱一致性:系统并不保证进程或线程在任何时刻访问数据都会返回最新更新成功的数据;最终一致性:数据一旦更新成功,各个副本上的数据最终将达到完全一致的状态,但需要一定的时间。 在分布式开发时,需要遵循的设计原则如下 异构性:由于分布式系统基于不同的网络、操作系统、硬件和语言,因此必须考虑采用一种通用的网络通信协议来屏蔽异构系统之间的差异,一般选择中间件来屏蔽这些差异。并发性:应用分布式系统的目的是更好地共享资源,所以系统中的每个资源在并发环境下都必须是安全的。可扩展性:任何计算机都有可能发生故障,发的故障类型也不尽相同,需要允许发生部分故障,而不影响整个分布式系统的正常使用。数据一致性:需要保证各个节点之间的数据一致性。负载均衡:由于分布式系统是协同工作的系统,为了提高系统的整体效率和吞吐量,必须考虑最大化发挥每个节点的作用,最大化利用每个节点的资源。 分布式系统的衡量指标如下 系统的性能:系统每秒的事物处理能力,通过用TPS(Transactions Per Second)来衡量。系统的可用性:系统停服的时间与正常服务的时间的比值,可用性是系统容错能力的体现。系统的可扩展性:通过扩展集群的节点规模来提高系统的吞吐量、并发量、存储量、计算量。 2、RPC框架 RPC(Remote Procedure Call,远程过程调用)是一种进程间通信方式,也是一种技术思想。使用 RPC 技术时,允许本地程序通过网络调用另一台服务器上的函数或者方法,具体调用过程一般由 RPC 框架实现,不用编码实现。即无论是调用本地函数还是调用远程函数,我们编写的调用代码在本质上基本相同。 RPC框架要向服务调用方和服务提供方屏蔽各类复杂性操作,比如负载均衡、序列化和反序列化、网络重试、超时等,主要由客户端、服务端和注册中心3种角色构成 客户端:调用远程服务的服务消费方。客户端调用远程服务就像调用本地函数一样,客户端负责序列化、反序列化、连接池管理、负载均衡、故障转移、超时管理、异步管理等。服务端:暴露服务的服务提供方。服务器端如同实现一个本地函数一样来实现远程服务提供,服务器端需要做收发包队列、I/O线程、工作线程、序列化及反序列化等工作。注册中心:服务注册与发现的注册中心。 3、服务治理 业务刚开始是都是单体应用,随着用户量和访问量的增加,架构层面也发生了变化,逐步由单体应用转变为分布式应用开发,如把单体应用的每个模块按照特定的方法拆分成一组独立的服务,服务与服务之间通过HTTP或RPC方式调用。但随着服务的数量增加,维护服务的URL地址就变得非常麻烦,所以需要设计一套系统来管理每个服务所对应的URL地址,出现了注册中心。当有多个服务是,消费者需要根据规则来调用相关的服务,实现软负载均衡,以达到资源最大化利用的目的,出现了负载均衡。还会面临流量削峰、版本兼容、服务熔断、服务降级、服务限流等问题,如何解决这些问题,让服务更稳定运行,就叫做服务治理。 服务:分布式架构下的基础单元,包括一个或一组软件功能,器目的是不同客户端通过网络获取相应的数据,而不用关注底层实现的具体细节。注册中心:微服务架构中的“通信录”,记录了服务和服务地址的映射关系,主要涉及服务的提供者,服务注册中心和服务的消费者。在数据流程中,服务的提供者在启动服务之后将服务注册到注册中心,服务消费者在启动时,会从注册中心拉取相关配置,并将器放到缓存中。注册中心的优势在于解耦了服务提供者和服务消费者之间的关系,并且支撑弹性扩容和缩容。服务注册与发布:服务实例在启动时被加载到容器中,并将服务自身的相关信息,包括接口名称、接口路由、IP地址、端口等注册到注册中心,并使用心跳机制定期刷新当前服务在注册中心的状态,以确认服务状态正常,在服务终止时将其从注册表中删除。服务发现:使用一个注册中心来记录分布式系统中全部的信息,以便其他服务快速找到这些已注册的服务,目前有客户端发现模式和服务端发现模式。客户端发现模式是从服务注册服务中查询所有可用服务实例的地址,使用负载均衡算法从多个服务实例中选择一个,然后发出请求。服务端发现模式是客户端通过负载均衡向某个服务提出请求,负载均衡从服务注册服务中查询所有可用服务实例的地址,将每个请求都转发到可用的服务实例中。流量削峰:使用一些计算手段来削弱瞬时的请求高峰,让系统吞吐量在高峰请求下可控,也可用于消除毛刺,使用服务器资源的利用更加均衡充分。常用队列、分层过滤、多级缓存的解决方式。服务熔断:作用类似加用的保险丝,当某服务出现不可用或响应超时的情况,已经达到系统设定的阈值,为了防止整个系统出现崩溃,会暂时停止对该服务的调用。服务降级:在服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略性的降级,一次释放服务器资源,保证核心功能的正常运行。服务限流:服务限流是服务降级的一种,通过限制系统的输入和输出来达到保证系统的目的。一般来说,系统的吞吐量是可用被测算的,为了保证系统的稳定运行,一旦达到阈值,就需要限制流量。限制措施有延迟处理,拒绝处理等。负责均衡:用于解决一台机器无法处理所有请求而产生的一种算法,当集群李的一台或多台机器不能响应请求时,负载均衡策略会通过合理分摊流量,让更多的机器均衡处理流量请求,不会因某一高峰时刻流量大而导致某太机器宕机。

IDEA中 pom.xml文件变为灰色

原因可能是在新建此Module前创建了同名的Module并删除,在建立同名Module后被IDEA认为此Project中需要排除该Module。 解决:IDEA —> Preferences 搜索关键字 Ignored Files,并取消勾选 这都是一些idea中的小问题,希望可以帮助到大家

Python中程序的基本结构

程序的基本结构 程序由3种基本结构组成:顺序结构、分支结构和循环结构。这些基本结构都有一个入口和一个出口。 顺序结构 顺序结构是程序按照线性顺序依次执行的一种运行方式。 分支结构 分支结构是程序根据条件判断结果而选择不同向前执行路径的一种运行方式。 (1)单分支结构:if语句 if<条件>: <语句块> 语句块是if条件满足后执行的一个或多个语句序列。 注意: Python使用“=”表示赋值语句,使用“==”表示等于。 字符串比较本质上是字符串对应的Unicode编码的比较,字符串的比较按照字典顺序进行,英文大写字符对应的Unicode编码比小写字符小。 (2)二分支语句:if-else语句 if<条件>: <语句块1> else: <语句块2> 还有一种简洁的表达方式: <表达式1>if<条件>else<表达式2> (3)多分支结构:if-elif-else语句 if<条件1>: <语句块1> elif<条件2>: <语句块2> … else: <语句块N> 注意: 用反斜杠()将很长的一行分解为两行书写,对于Python解释来说,这是一行代码。 循环结构 根据循环执行次数的确定性,循环可以分为确定次数循环和非确定次数循环,确定次数循环成为“遍历循环”。 (1)遍历循环:for语句 for<循环变量>in<遍历结构>: <语句块> 遍历结构可以是字符串、文件、组合数据类型或range()函数,在这种扩展模式中,当for循环正常执行结束后,程序会继续执行else语句中的内容。else语句只有在循环正常执行并结束后才执行。 (2)无限循环:while语句 while<条件>: <语句块1> else: <语句块2> (3)循环保留字:break和continue break用来跳出最内层for和while循环,脱离该循环后程序从循环代码后继续执行,每个break语句只有能力跳出当前层次循环。 continue用来结束当前当次循环,即跳出循环体中下面尚未执行的语句,但不跳出当前循环。 区别:continue语句只结束本次循环,而不终止整个循环的执行;break语句则是结束整个循环过程,不再判断执行循环的条件是否成立,continue保留字对else没有影响。 程序的异常处理 (1)try-expect语句实现 try: <语句块1> except<异常类型>: <语句块2> 语句块1是正常执行的程序内容,当发生异常时执行except保留字后面的语句块。 (2)try-except语句可以支持多个except语句 try: <语句块1> except<异常类型1>: <语句块2> … except<异常类型N>: <语句块N+1> except: <语句块N+2> (3)异常语句与else和finally保留字配合使用 try: <语句块1> except<异常类型1>: <语句块2> else: <语句块3>