目录 总结for循环while循环try 循环 总结 在IntelliJ IDEA中可以输入快捷关键词,生成大段的循环代码块,接下来让我们逐一演示
for循环 输入itar快捷生产array for代码块 itar ------------------------------- for (int i = 0; i < array.length; i++) { = array[i]; } 输入itco生成 itco ------------------------------- for (Iterator<Map<String, String>> iterator = show.iterator(); iterator.hasNext(); ) { Map<String, String> next = iterator.next(); } 输入iter生成 iter ------------------------------- for (Map<String, String> stringStringMap : show) { } 输入itli生成 itli ------------------------------- for (int i = 0; i < show.size(); i++) { Map<String, String> stringStringMap = show.
功能简介:
1、循环显示9项
2、点击每一项,每一项字体颜色变蓝,向下和向右分别移动100px
关键点:
1、使用v-for,循环加载每一项
2、使用:ref="`list${i}`" ,为每一项动态添加ref
<div id="app"> <div class="frame" ref="frame"> <div v-for="(item,i) in list" :key="i" @click="changeColor(item,i)" :ref="`list${i}`">{{item}}</div> </div> </div> 3、点击事件,使用this.$refs[`list${i}`][0] 获取当前元素dom结构
<script> var vm = new Vue({ el: '#app', data: { list:['1','22','333','4444','55555','666666','7777777','88888888','999999999'] }, mounted() { this.$refs.frame.style.color='red' }, methods: { changeColor(item,i){ debugger let _y='100px' let _x='100px' this.$refs[`list${i}`][0].style.color='blue' this.$refs[`list${i}`][0].style.transform='translate('+_x+','+_y+')' } } }) </script> 4、dom结构
5、可以添加的style样式汇总,详见https://blog.csdn.net/LzzMandy/article/details/91372903
1.使用tzselect命令
[root@localhost /]# tzselect Please identify a location so that time zone rules can be set correctly. Please select a continent or ocean. 1) Africa 2) Americas 3) Antarctica 4) Arctic Ocean 5) Asia 6) Atlantic Ocean 7) Australia 8) Europe 9) Indian Ocean 10) Pacific Ocean 11) none - I want to specify the time zone using the Posix TZ format. #? 5 Please select a country. 1) Afghanistan 18) Israel 35) Palestine 2) Armenia 19) Japan 36) Philippines 3) Azerbaijan 20) Jordan 37) Qatar 4) Bahrain 21) Kazakhstan 38) Russia 5) Bangladesh 22) Korea (North) 39) Saudi Arabia 6) Bhutan 23) Korea (South) 40) Singapore 7) Brunei 24) Kuwait 41) Sri Lanka 8) Cambodia 25) Kyrgyzstan 42) Syria 9) China 26) Laos 43) Taiwan 10) Cyprus 27) Lebanon 44) Tajikistan 11) East Timor 28) Macau 45) Thailand 12) Georgia 29) Malaysia 46) Turkmenistan 13) Hong Kong 30) Mongolia 47) United Arab Emirates 14) India 31) Myanmar (Burma) 48) Uzbekistan 15) Indonesia 32) Nepal 49) Vietnam 16) Iran 33) Oman 50) Yemen 17) Iraq 34) Pakistan #?
**
26、NC环境备份还原
**
NC正式环境迁移至测试环境步骤
1、压缩正式服务器home目录
2、异地备份正式数据库
3、将home压缩文件拷贝至测试服务器,停止测试服务,重命名原来的home为home.bak(日期时间),将拷贝过来的home压缩文件解压。
4、将db备份文件拷贝至本机后即可启动正式服务器上的中间件。
5、在本机将备份文件导入173服务器。(库放linux系统)
5.1、将备份的dmp文件通过FTP工具拷贝至Linux系统的目录中(如:/home/dbbak)。
5.2、在测试服务器上,创建新的oracle用户(测试数据库服务器system的密码systemHuaFeng678)
CREATE USER hfnc4 IDENTIFIED BY hfnc4 DEFAULT TABLESPACE NNC_DATA01 TEMPORARY TABLESPACE temp;
GRANT connect,dba to hfnc4 ;
5.2、使用putty工具打开终端,用root用户登录,授权文件所在文件夹:chmod -R 777 /home/dbbak
5.3、命令中切换oracle用户(命令:su - oracle),输入命令进行导入(改用impdp导入方式):imp hfnc4/hfnc4@orcl file=/home/dbbak/orcl_2017-04-10.dmp log=/home/dbbak/orcl_2017-04-10.log ignore=y full=y
导入完成后,删除测试服务器上的拷贝文件,避免长期占用空间。
5、(库放windows系统)
5.1、将我们备份的数据库文件拷贝至测试服务器上,并解压到某个文件夹中
5.2、在测试服务器上,创建新的oracle用户(测试数据库服务器system的密码systemHuaFeng678)
CREATE USER hfnc0326 IDENTIFIED BY hfnc0326 DEFAULT TABLESPACE NNC_DATA01 TEMPORARY TABLESPACE temp;
GRANT connect,dba to hfnc0326;
5.3、命令中切换oracle用户(命令:su - oracle),输入命令进行导入(改用impdp导入方式):impdp hfpy/1@orcl directory=dump_dir remap_schema=hftest:hfpy dumpfile=hfnc20161115.dmp logfile=hfnc20161115.log
6、修改sysconfig文件。
Kafka是一个高性能,高容错,多副本,可复制的分布式消息系统。在整个系统中,涉及到多处选举机制,被不少人搞混,这里总结一下,本篇文章大概会从三个方面来讲解。
控制器(Broker)选主分区多副本选主消费组选主 控制器(Broker)选举
所谓控制器就是一个Borker,在一个kafka集群中,有多个broker节点,但是它们之间需要选举出一个leader,其他的broker充当follower角色。集群中第一个启动的broker会通过在zookeeper中创建临时节点/controller来让自己成为控制器,其他broker启动时也会在zookeeper中创建临时节点,但是发现节点已经存在,所以它们会收到一个异常,意识到控制器已经存在,那么就会在zookeeper中创建watch对象,便于它们收到控制器变更的通知。
那么如果控制器由于网络原因与zookeeper断开连接或者异常退出,那么其他broker通过watch收到控制器变更的通知,就会去尝试创建临时节点/controller,如果有一个broker创建成功,那么其他broker就会收到创建异常通知,也就意味着集群中已经有了控制器,其他broker只需创建watch对象即可。
如果集群中有一个broker发生异常退出了,那么控制器就会检查这个broker是否有分区的副本leader,如果有那么这个分区就需要一个新的leader,此时控制器就会去遍历其他副本,决定哪一个成为新的leader,同时更新分区的ISR集合。
如果有一个broker加入集群中,那么控制器就会通过Broker ID去判断新加入的broker中是否含有现有分区的副本,如果有,就会从分区副本中去同步数据。
集群中每选举一次控制器,就会通过zookeeper创建一个controller epoch,每一个选举都会创建一个更大,包含最新信息的epoch,如果有broker收到比这个epoch旧的数据,就会忽略它们,kafka也通过这个epoch来防止集群产生“脑裂”。
分区副本选举机制
在kafka的集群中,会存在着多个主题topic,在每一个topic中,又被划分为多个partition,为了防止数据不丢失,每一个partition又有多个副本,在整个集群中,总共有三种副本角色:
首领副本(leader):也就是leader主副本,每个分区都有一个首领副本,为了保证数据一致性,所有的生产者与消费者的请求都会经过该副本来处理。跟随者副本(follower):除了首领副本外的其他所有副本都是跟随者副本,跟随者副本不处理来自客户端的任何请求,只负责从首领副本同步数据,保证与首领保持一致。如果首领副本发生崩溃,就会从这其中选举出一个leader。首选首领副本:创建分区时指定的首选首领。如果不指定,则为分区的第一个副本。 follower需要从leader中同步数据,但是由于网络或者其他原因,导致数据阻塞,出现不一致的情况,为了避免这种情况,follower会向leader发送请求信息,这些请求信息中包含了follower需要数据的偏移量offset,而且这些offset是有序的。
如果有follower向leader发送了请求1,接着发送请求2,请求3,那么再发送请求4,这时就意味着follower已经同步了前三条数据,否则不会发送请求4。leader通过跟踪 每一个follower的offset来判断它们的复制进度。
默认的,如果follower与leader之间超过10s内没有发送请求,或者说没有收到请求数据,此时该follower就会被认为“不同步副本”。而持续请求的副本就是“同步副本”,当leader发生故障时,只有“同步副本”才可以被选举为leader。其中的请求超时时间可以通过参数replica.lag.time.max.ms参数来配置。
我们希望每个分区的leader可以分布到不同的broker中,尽可能的达到负载均衡,所以会有一个首选首领,如果我们设置参数auto.leader.rebalance.enable为true,那么它会检查首选首领是否是真正的首领,如果不是,则会触发选举,让首选首领成为首领。
消费组选主
在kafka的消费端,会有一个消费者协调器以及消费组,组协调器GroupCoordinator需要为消费组内的消费者选举出一个消费组的leader,那么如何选举的呢?
如果消费组内还没有leader,那么第一个加入消费组的消费者即为消费组的leader,如果某一个时刻leader消费者由于某些原因退出了消费组,那么就会重新选举leader,如何选举?
private val members = new mutable.HashMap[String, MemberMetadata] leaderId = members.keys.headOption 上面代码是kafka源码中的部分代码,member是一个hashmap的数据结构,key为消费者的member_id,value是元数据信息,那么它会将leaderId选举为Hashmap中的第一个键值对,它和随机基本没啥区别。
对于整个选举算法的详情需要先了解Raft选举算法,kafka是基于该算法来实现leader选举的。有兴趣的读者可以参考之前的文章【分布式一致性协议:Raft算法详解】。
参考资料:
《Kafka权威指南》
圆环实现原理
1.左边一个扇形+右边一个扇形组成一个圆环的圆圈
2.clip裁剪左扇形和右扇形,使其变为圆环形式
3.隐藏圆圈容器的左半边,只显示右半边,让左扇形向右开始逐步旋转,通过转动左扇形,隐藏右扇形,使左扇形旋转到右边显示,从而展现圆环进度50%以内的视觉效果
4.当左扇形旋转回左边后,右边出现空缺,所以需要显示右扇形显示在右边替补空缺的右边部分,最后让旋转回左边的左扇形显示需要显示的部分,从而程序百分之50之后的进度圆环视觉效果
原文博客
https://my.oschina.net/conqueror/blog/727713
git源代码
https://github.com/aa1312296679/CSSArcPercent
今天做微信公众号模版消息推送,要求点击模版消息,就直接跳转到小程序里面。
当然,我已经按照官方文档,填写了正确的小程序appid,可是还是报错。
{ errcode: 40013, errmsg: 'invalid appid hint: [cC6RwA09011295]' } 最后,找了一会儿原因,我发现了问题所在:
公众号需要和小程序关联,才可以进行跳转,不然即使写了跳转参数,也直接会报错 invalid appid. 希望以后一定要细心+细心。
第一种方式 通过thrift接口,这种方式是最简单的,但是访问速度慢,而且thrift接口socket是由超时的
用Python操作HBase之HBase-Thrift
这种方式遍历rdd会出问题,当rdd特别大的时候。
通过happybase增强thrift接口
安装happyhbase
安装过程失败,尝试修正方法,centos7
yum install python-devel
安装happybase也失败了。看了只有使用原生的thrift接口了。
Python操作HBase之happybase
第二种方式 通过newAPIHadoopRDD接口,尝试了好几次,没有搞通
经过研究,这种方式终于搞通了,参考链接
错误处理方法
分布式需要在每个节点上都拷贝这个文件,修改配置。
通过scp拷贝方式最为简介。
scp /var/lib/spark/jars/hbase/spark-examples_2.11-1.6.0-typesafe-001.jar root@192.168.100.13:/var/lib/spark/jars/hbase/spark-examples_2.11-1.6.0-typesafe-001.jar
第三种方式 经过很多折腾,这种方式也终于搞通了。
修改启动参数:
pyspark2 --conf spark.kryoserializer.buffer.max=1024m --conf spark.driver.maxResultSize=20G --conf spark.driver.memory=20G --total-executor-cores=100 --executor-memory=10G --executor-cores=2 --packages com.hortonworks:shc-core:1.1.1-2.1-s_2.11 --repositories http://repo.hortonworks.com/content/groups/public/
需要很长的时间,只在启动的spark-shell节点上操作。
import datetime from pyspark import SparkConf, SparkContext #driver意思为连接spark集群的机子,所以配置host要配置当前编写代码的机子host from pyspark.sql import SparkSession from pyspark.sql import SQLContext from pyspark.sql import Row, functions as F from pyspark.sql.window import Window from pyspark.sql.functions import udf from pyspark.
设置元素的宽高为窗口的宽高:
$("#body").height($(window).height()); $("#body").width($(window).width());
一、程序代码如下
fid=fopen(['****',num2str(******),'******'],'wt');
fprintf(fid, '%d\n' ,*******); fclose(fid);
在运行matlab时提示错误不能正正确运用fprint
出错原因没有把matlab改为当前文件夹(只是把matlab程序所在文件的文件夹添加到了路径)
解决方法:主页--编辑器里面的路径指到matlab所在路径
成功解决错误。
一.Gson说明 Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。而JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,广泛应用于各种数据的交互中,尤其是服务器与客户端的交互。
build.gradle倒库:
implementation 'com.google.code.gson:gson:2.8.5' Gson各个版本下载地址:http://repo1.maven.org/maven2/com/google/code/gson/gson/
二.Gson使用 2.1Gson的创建 Gson的创建方式一:直接new Gson对象
// 使用new方法 Gson gson = new Gson(); // toJson 将bean对象转换为json字符串 String jsonStr = gson.toJson(user, User.class); // fromJson 将json字符串转为bean对象 Student user= gson.fromJson(jsonStr, User.class); // 序列化List String jsonStr2 = gson.toJson(list); // 反序列化成List时需要使用到TypeToken getType() List<User> retList = gson.fromJson(jsonStr2,new TypeToken<List<User>>(){}.getType()); //type的使用,User代表解析出来的Bean对象,result为后台返回的json格式字符串, //List<UserBean>代表通过Gson按照type格式解析json格式字符串后返回的对象列表 如:Type type = new TypeToken<List<User>>() { }.getType(); List<UserBean> UserBeans = gson.fromJson(result, type); Gson的创建方式二:使用GsonBuilder
使用new Gson(),此时会创建一个带有默认配置选项的Gson实例,如果不想使用默认配置,那么就可以使用GsonBuilder。
//serializeNulls()是GsonBuilder提供的一种配置,当字段值为空或null时,依然对该字段进行转换 Gson gson = new GsonBuilder().
目录 总结遍历数组的区别遍历数组var和let类型的比较使用for...in遍历数组使用for...of遍历数组 总结 for…of是在for…in之后推出的新特性,弥补for…in中的一些不足.JSON 数据的标的达方式是key:valuefor…of遍历出的结果是valuefor…in遍历出的结果是key 遍历数组的区别 遍历数组var和let类型的比较 这里使用let声明变量,不要使用var,存在变量提升问题
//使用var类型遍历数组 var a=[1,2,3] for(var i=0;i<3;i++){ setTimeout(function(){ console.log(i); },0) } //输出结果是333 //使用let类型遍历数组 var a=[1,2,3] for(let i=0;i<3;i++){ setTimeout(function(){ console.log(i); },0) } //输出结果是123 使用for…in遍历数组 遍历结果是key,数组下标
var a=[1,2,3]; for(let i in a){ console.log(i);//0 1 2 console.log(a[i]);//1 2 3 } 使用for…of遍历数组 遍历结果是value,数组值
var a=[1,2,3]; for(let i of a){ console.log(i);//1 2 3 }
tensorflow中的模型常常是protobuf格式,这种格式既可以是二进制也可以是文本。keras模型保存和加载与tensorflow不同,keras中的模型保存和加载通常是保存成hdf5格式。
keras的模型保存分为多种情况。
一、不保存模型只显示大概结构 model.summary()
这个函数会打印模型结构,但是仅仅是打印到控制台。
keras.utils.plot_model()
使用graphviz中的dot.exe生成网络结构拓扑图
二、保存模型结构 keras.models.Model
对象的to_json,to_yaml只保存模型结构,加载时使用keras.models.model_from_json(),keras.models.model_from_yaml()
keras.model.get_config()返回文本形式的配置
使用keras.model.model_from_config可以加载模型。
三、保存全部结构(最常用的方法) keras.core.saving.py这个文件十分重要,keras的模型保存、加载都需要这个文件。
但是不建议直接使用这个文件,因为keras中的Model对象和models模块会调用这个文件。
keras.core包下的内容一般供内部使用,不暴露给使用者。
Model对象提供了save()和save_wights()两个方法。
save()方法保存了三种东西:
模型结构模型参数优化器参数 其中优化器参数是给优化器用的,用于继续训练模型。有些优化器比如AdamOptimizer需要根据训练步数来调整不同参数的学习速率,这样在分阶段训练模型时才能够保证正确。save()函数保存结果就是一个hdf5文件,不像tensorflow一下子保存好多种文件。tensorflow把模型结构和权重分开保存,目的是多个权重文件可以共用一个模型结构文件,但是模型结构文件通常非常小,所占空间远远小于参数所占空间。
Model对象的save_weights()方法:
只保存了模型参数而没有保存模型结构,它的保存格式也是hdf5。它保存的数据不能用于继续训练模型。
Model实例的save()方法有一个等价方式:使用models.save_model()。
对于使用save()方法保存的文件,可以使用models.load_model()进行加载,此函数直接返回一个Model对象。因为save()方法保存了模型的全部内容,所以可以直接“无中生有”创造一个模型。
对于使用save_weights()方法保存的文件,只能通过Model对象提供的load_weights()方法加载模型权重。 并且,在加载模型权重之前,必须把网络结构定义好,并且模型的各个层的名称必须与保存模型权重时的各个层保持一致。必须先compile()函数后面用
带大家看个反面教程:
我试图从我训练过的模型中保存和加载重量.
用于保存模型的代码是.
TensorBoard(log_dir='/output') model.fit_generator(image_a_b_gen(batch_size), steps_per_epoch=1, epochs=1) model.save_weights('model.hdf5') model.save_weights('myModel.h5') 如果这是一种不正确的方式,或者是否有更好的方法,请告诉我.
但是当我尝试加载它们时,使用它,
from keras.models import load_model model = load_model('myModel.h5') 但我得到这个错误:
ValueError Traceback (most recent call last) <ipython-input-7-27d58dc8bb48> in <module>() 1 from keras.models import load_model ----> 2 model = load_model('myModel.h5') /home/decentmakeover2/anaconda3/lib/python3.5/site- packages/keras/models.py in load_model(filepath, custom_objects, compile) 235 model_config = f.
完整工程请见:https://download.csdn.net/download/qq_42838291/12573047
实物图及其测试效果,由于测试时没拍太多照片。高频部分的没有,只贴上低频的。
由于这里用到的多是集成的芯片和模块,所以画的比较简单。图中的CH1和CH2时信号源产生的两路正弦波或方波。方波可以直接输入测量,但是注意信号源要设置偏移量,将输出方波抬高到0上。因为信号源直接出来的方波含有负电压会导致测量不准,甚至损坏I/O口。正弦波要经过整形放大模块后才能进入FPGA。
进来的两路信号中,一路直接送进FPGA进行测频。异或门是将两路同频同幅的方波信号进行异或后再送入FPGA进行计数(测相)。D触发器是判断两路信号的超前滞后关系。
这里如果测量两路正弦波的频率和相位的话要先通过整形放大电路,将两路带负电压的正弦波整形成为单极性的方波。常用的电压比较器有LM311P或LM393之类的(延时在50~200ns之间),但是效果不尽人意,整形的波形不够干净。只能用来做测频用,测相会产生很大的误差。因为测相是直接对异或的方波进行计数,如果波形不好,计数也不会准确。附一张图:
紫色是信号源产生的标准方波,下面是经过整形电路后的波形,测相要不得。
这里推荐使用高速电压比较器TLV3501(单通道)淘宝几块钱就有。也可以直接使用双通道TLV3502(淘宝十多块钱)。这是淘宝上比较便宜的价钱,可根据自己的心情选择购买。
如果不想自己在做整形电路的话可以直接购买模块,淘宝上有单通道/双通道的TLV3501/3502模块。推荐一个单通道的,当时买来测试用的,单通道。每个35块,两块加起来还比双通道的便宜。
注意一定要使用SMA线,不管你自己做电路还是买模块。即使是低频状态下,信号源输出到整形电路这一段距离都会受到比较大的干扰,突出的表现是频率测量准确,相位误差很大。购买时要注意如果SMA头是针头则要配合SMA内孔线。
想自己做整形电路的朋友可以参考这张原理图(单通道),这是购买模块的商家的原理图。
打开FPGA工程
顶层模块是一些端口的声明,和几个模块的例化。
module Fre_measure( input clk, input rst_n, input clk_measure, //频率测量输入引脚 input Phase_Measure, //相位测量输入引脚 input uart_rx, output uart_tx ); wire[31:0] fre_cnt; wire[31:0] xiang_wei; //parameter define parameter CLK_FREQ = 50000000; //定义系统时钟频率 parameter UART_BPS = 115200; //定义串口波特率 wire pulse; wire [31:0]pulse_high_reg, pulse_low_reg; //脉宽高低位寄存器 Pulse_width_messure Pulse_width_messure//例化脉宽测量模块 ( .clk (clk), .rst_n (rst_n), .pulse_in (Phase_Measure), //相位测量 .pulse_high_reg (pulse_high_reg),//高电平宽度寄存器 .pulse_low_reg (pulse_low_reg)//低电平宽度寄存器 ); Time_1s time_1s( .clk (clk ), .
对于某些node模块我们需要全局安装它,方便使用。在linux中我们我们会遇到这个的一个问题,我们全局安装了一个模块,但是该模块的命令无法在全局中正常使用。
如:npm install -g sinopia
用命令:sinopia 时会提示 sinopia: command not found
原因:模块安装成功后,环境变量没有添加设置,导致无法正常使用该命令。
解决方案:
echo -e "export PATH=$(npm prefix -g)/bin:$PATH" >> ~/.bashrc && source ~/.bashrc
通过设置之后,用npm在全局安装的模块命令就可以全局使用了。
1.正交实验法的概念 正交试验设计(Orthogonal experimental design)是研究多因素多水平的又一种设计方法,它是根据正交性从全面试验中挑选出部分有代表性的点进行试验,这些有代表性的点具备了“均匀分散,齐整可比”的特点,正交试验设计是分式析因设计的主要方法。是一种高效率、快速、经济的实验设计方法。日本著名的统计学家田口玄一将正交试验选择的水平组合列成表格,称为正交表。
例如作一个三因素三水平的实验,按全面实验要求,须进行3^3=27种组合的实验,且尚未考虑每一组合的重复数。若按L9(3^4)正交表安排实验,只需作9次,按L15(3^7)正交表进行15次实验,显然大大减少了工作量。因而正交实验设计在很多领域的研究中已经得到广泛应用。
2.正交表的性质 (1)每列中不同数字出现的次数是相等的,如L9(3^3),每列中不同的数字是1,2,3,它们各出现3次;
(2)在任意两列中,将同一行的两个数字看成有序数对时,每种数对出现的次数是相等的,如L9(3^3),有序数对共有9个:(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3),它们各出现一次。
3.利用正交表来进行正交试验 为了叙述方便,用L代表正交表,常用的有L8(2^7),L9(3^4),L16(4^5),L8(4×2^4),L12(2^11),等等。此符号各数字的意义如下: L8(2^7),7为此表列的数目(最多可安排的因子数),2为因子的水平数,8为此表行的数目(试验次数)。
L16(2×3^7),有7列是3水平的,有1列是2水平的。
L16(2×3^7)的数字告诉我们,用它来安排试验,做16个试验最多可以考察一个2水平因子和7个3水平因子。
在行数为mn型的正交表中(m,n是正整数),试验次数(行数)=Σ(每列水平数-1)+ 1
正交表具有两条性质:(1)每一列中各数字出现的次数都一样多。(2)任何两列所构成的各有序数对出现的次数都一样多。所以称之谓正交表。
例如在L9(3^3)中(见表1),各列中的1、2、3都各自出现3次;任何两列,例如第3、4列,所构成的有序数对从上向下共有九种,既没有重复也没有遗漏。其他任何两列所构成的有序数对也是这九种各出现一次。这反映了试验点分布的均匀性。
假设三个因子,分别将其取值范围定义如下,则可以得到以下正交表和测试用例
A:A1=80℃,A2=85℃,A3=90℃
B:B1=90分,B2=120分,B3=150分
C:C1=5%,C2=6%,C3=7%
原文链接:https://www.cnblogs.com/xinwusuo/p/5948908.html
js:
<script type="text/javascript"> function SubmitCk() { var reg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; if (!reg.test($("#txtEmail").val())) { alert("请输入正确邮箱地址") return false; } } </script> 验证数字的正则表达式集 :
验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^\+?[1-9][0-9]*$ 验证非零的负整数:^\-[1-9][0-9]*$ 验证非负整数(正整数 + 0) ^\d+$ 验证非正整数(负整数 + 0) ^((-\d+)|(0+))$ 验证长度为3的字符:^.{3}$ 验证由26个英文字母组成的字符串:^[A-Za-z]+$ 验证由26个大写英文字母组成的字符串:^[A-Z]+$ 验证由26个小写英文字母组成的字符串:^[a-z]+$ 验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 验证由数字、26个英文字母或者下划线组成的字符串:^\w+$ 验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+ 验证汉字:^[\u4e00-\u9fa5],{0,}$ 验证Email地址:/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 验证电话号码:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。 验证身份证号(15位或18位数字):^\d{15}|\d{}18$ 验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12” 验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。 整数:^-?\d+$ 非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$ 正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ 非正浮点数(负浮点数 + 0) ^((-\d+(\.
Java架构师交流群:793825326
java版本:jdk1.8
IDE:idea2019
先说怎么用,现在我们想写一个注解HelloWorld,让所有使用了这个注解的类,在编译的时候都打印“Hello World!”,注意,是在编译的时候,不是运行的时候。那么该怎么做呢,这就要用到AbstractProcessor这个东西了。
1.先创建一个maven项目abstractprocessor,在这个项目下创建两个子module,processor和compiletest,如图:
2.在processor里面添加一个类MyProcessor:
import com.google.auto.service.AutoService; import javax.annotation.processing.*; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; import javax.tools.Diagnostic; import java.util.Set; @SupportedAnnotationTypes("HelloWorld") @SupportedSourceVersion(SourceVersion.RELEASE_7) @AutoService(Processor.class) public class MyProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Hello World!"); return false; } } 其中AutoService是Google开发用来生成META-INF/services/javax.annotation.processing.Processor文件的,有了它,我们就不用自己手动添加这个文件了。要使用它,需要在pom里面添加依赖:
<dependency> <groupId>com.google.auto.service</groupId> <artifactId>auto-service</artifactId> <version>1.0-rc5</version> </dependency> 3.然后写一个注解HelloWorld:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.SOURCE) public @interface HelloWorld { } 至此,processor项目目录如下:
4.使用maven生成一下,这样,我们的HelloWorld注解就实现了,现在就是如何使用它了,很简单,像使用普通的注解一样。在compiletest这个项目里面添加引用:
<dependency> <groupId>AbstractProcessorDemo</groupId> <artifactId>processor</artifactId> <version>1.0-SNAPSHOT</version> </dependency> 5.
前言 本文介绍如何通过Nacos作为配置中心,实现Dubbo服务的注册与消费
以HelloService服务为例
public interface HelloService { String sayHello(String name); } 服务提供方和消费方都引入以下jar
<dependencys> <!-- Spring Boot dependencies --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> </dependency> <!-- Dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> </dependency> <!-- Dubbo Registry Nacos --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> </dependency> </dependencys> 需要搭建一个Nacos服务,这里直接使用程序员DD提供的公益性的Nacos服务,
详细地址
服务提供方 实现接口 @Service(version = "${dubbo.service.version}") public class HelloServiceImpl implements HelloService { @Value("${spring.application.name}") private String serviceName; public String sayHello(String name) { return String.
公司的这一次开发中遇到一个问题,就是服务器上不能存储文件或者图片,因为服务器的会清理掉和其他集群不同的地方,所以得到的文件流或图片流就没有了存放的地方,因此要展示的文件或图片该怎么展示呢?一开始蒙圈,之后到处查询资料,百度终于弄好了
我这一次的需求是要展示图片,所以我就说图片的了!话不多说,代码奉上,我们是银行项目,所以用的struts2,但是都是大同小异。
后台action关键代码(相当于controller)
//获得图片的二进制流(已经进行base64编码的) String potoString = jObject1.getString("photo"); //将String类型的流放入对象返回前台 jsonRoot.put("Code", potoString); return SUCCESS; 前台html页面关键代码
//准备显示的img标签 <img id="bigimg" src="" /> 前台js关键代码
//静态页面ajax访问后台 $.post('/online/enter/showPoto.do',{ phoneNum:phoneNum, apply_serial_no:applySerialNo, id_type:index },function(data){ var src = data.Code;//将后台传回的二进制数据取出 $(“#bigimg”).attr("src", "data:image/png;base64,"+src);//设置#bigimg元素的src属性 } ) data:image/png;base64,这是Data URI scheme。
Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。比如上面那串字符,其实是一张小图片,将这些字符复制黏贴到浏览器的地址栏中并转到,就能看到它了,在上面的Data URI中,data表示取得数据的协定名称,image/png 是数据类型名称,base64 是数据的编码方法, 逗号后面就是这个image/png文件base64编码后的数据。
目前,Data URI scheme支持的类型有:
data:,文本数据
data:text/plain,文本数据
data:text/html,HTML代码
data:text/html;base64,base64编码的HTML代码
data:text/css,CSS代码
data:text/css;base64,base64编码的CSS代码
data:text/javascript,Javascript代码
data:text/javascript;base64,base64编码的Javascript代码
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据
base64简单地说,它把一些 8-bit 数据翻译成标准 ASCII 字符,网上有很多免费的base64 编码和解码的工具,在目前,IE8、Firfox、Chrome、Opera浏览器都支持这种小文件嵌入。
1.环境配置 (可参考uni-官网的环境配置)
common文件夹下新建config.js
let url_config = "" if(process.env.NODE_ENV === 'development'){ // 开发环境 url_config = 'https://*****.com/' }else{ // 生产环境 url_config = 'https://*****.com/' } export default url_config 2.uni.request封装
common文件夹下新建request.js
import urlConfig from './config.js' const request = {} const headers = {} const PORT1 = '/baseinfo' request.globalRequest = (url, method, data, power) => { /* 权限判断 因为有的接口请求头可能需要添加的参数不一样,所以这里做了区分 1 == 不通过access_token校验的接口 2 == 文件下载接口列表 3 == 验证码登录 */ switch (power){ case 1: headers['Authorization'] = 'Basic a3N1ZGk6a3N1ZGk=' break; case 2: headers['Authorization'] = 'Basic a3N1ZGlfcGM6a3N1ZGlfcGM=' break; case 3: responseType = 'blob' break; default: headers['Authorization'] = `Bearer ${ this.
自己动手设计一个FPGA上可运行的CPU及汇编器 前言简易CPU的基本功能和架构简介存储模块设计(背景设计)指令系统设计待上传图片 该项目目前已经转移到:https://gitee.com/jianfengtony/risc_t16 欢迎一起研讨。
前言 其实自己写一个CPU的想法早在2008年还在上大学的时候就有了,因为后来工作的原因,当然更多的是因为自己懒散的原因,一直没有投入精力去做这件事情。差不多在2015年的时候在做一个控制项目时,因为有一些实时性要求很高的控制及信号处理,又重新用到了FPGA,当时的项目是在FPGA上实现的,自己参与时项目主体基本完工,但是仔细了解项目后发现项目里面很多模块都用到了状态机,然后通过编码的二进制去实现复杂的计算,当时就再次萌发了写一个精简的CPU来替换项目中众多的定制化CPU,充分利用FPGA上的分布式RAM、LUT及乘法器等资源。
后来花费了两三周的时间设计了一个三级流水线CPU,用FPGA内部的RAM模块作为存储器,可以运行起来,无奈项目规模太大,这个设计的CPU项目中一直不愿替换,就一直存在我的电脑中无用武之地。
最近因为多方面的原因,包括看到中美贸易战科技战,自己想把这个简易CPU的想法和代码总结一下发到网上,大家一起学习。
简易CPU的基本功能和架构简介 在这里我定义一个最简的CPU包含如下几方面的特性或指令:
能够读取数据和指令,即具备访问存储器或寄存器的寻址能力有程序指针,控制CPU按照节奏顺序执行指令具有跳转指令,能够实现程序循环具备逻辑比较等指令,能够实现条件判断具备外部IO,能够处理输入和输出,与外界交互具备算术运算、逻辑运算等指令支持更加复杂的运算等,这个我认为不是全部必须,但是要有能力扩展,需要哪个指令的时候能够通过总线增加。 以上这些就是设计这个CPU的一些基本特性和目标。
当然最后我们还要设计一个汇编器(计划用python来实现,替换原来用C#实现的),以方便对于CPU进行编程。至于C语言的支持,因为本人对于编译还不太懂,暂时不打算实现和支持。
原来是用VHDL来实现的设计,本次整理计划改为用verilog来实现。
存储模块设计(背景设计) 为了验证CPU的设计,我们先做一些铺垫,这里先分析一下存储的一些典型特性及建立我们设计CPU的一些前提输入。
存储是计算机系统最重要的一个模块之一,对于CPU来说存储系统分为数据存储器和程序存储器,当然也有将数据存储器和程序存储器合一的,这取决于CPU的架构,这里我们采用的是程序和数据分开的哈佛架构,相对来说这样设计逻辑简单,便于入门,而且对于FPGA上的资源来说也比较容易实现。
我们先来看看典型sdram的时序图:
指令系统设计 原来的指令采用的是自己设计的16bits的指令系统,本次改为采用RISC-V指令系统,从中间选取一些必要的最小集合来实现。
RISC-V指令系统格式分为以下几种:
待上传图片 其中的寄存器片段为rs1和rs2以及rd,均为5bits设计,也就是可以最大容纳32个寄存器的编址。
opcode片段为7bits的设计,最大容纳 2 7 = 128 2^7=128 27=128个编码
RISC-V的指令集分类基础指令和扩展指令,我们重点实现RV32I的基础指令集。
下面为挑选出来的RV32I基础指令集:
指令汇编funct - 7rs2 - 5rs1 - 5funct - 3rd - 5opcode - 7Radd rd,rs1,rs20000000rs2rs1000rd0110011Raddi rd,rs1,immediateimme
对象 什么是对象?
万物皆对象。它包括现实中客观存在的事物,也包括抽象的时间、规则、思维。简单点说,对象具有状态、行为和标识。
类 什么是类?
具有相同特性和行为的对象组成的集合就是类,JAVA实际中的类就是指一个数据类型。
对象与类的关系 类是对象的抽象,而对象是类的具体实例。类与对象的关系:抽象(该抽象是名词)与类的实例化就是对象,对象的共性特征抽象(该抽象是动词)出来就是类。
比如你要买一台PC,你在订单上列出了这台PC的CPU和显卡型号、显示屏的大小、键盘是104还是87位、主机的颜色等等,这所有信息组成在一起就是一个电脑的类,但你只有它的参数并没有一个符合这个要求的实物对象,而当服务员拿出了一台符合这个订单的具体PC时,这个PC就是那个类的具体对象。
实习找工作遇到个印象较深的基础面试问题,
面试官:男人和女人是同一个类吗?
我:是同一类。
面试官:钢笔和铅笔是同一个类吗?
我:是同一类。
面试官:男人和钢笔是同一个类吗?
我犹豫了3秒钟,
我:不是同一类
面试官:看来你对基础概念理解的还不到位啊。
这里,首先你要懂得万物皆对象,对象都是类的实例,而类是对象的抽象。那么我在JAVA中就可以定义男人和钢笔都是A类或B类或C类,而这个类可以是描述都是看的见或摸的着的特征,亦或是什么都不描述的但就是用来实例化男人和钢笔的类(类可以是你随性定义的),即男人和钢笔是同一类。同理,时间和水是一类吗?思维和手是一类吗?都是的。
其实面试官在这也埋了一个坑----没有交代问题的前提条件。我认为完美的答案应该是:
“从生活角度讲,男人和女人是同一类,钢笔和铅笔是同一类,但男人和钢笔不是同一类。
从Java中类与对象的关系来说,男人和女人是同一类,钢笔和铅笔是同一类,男人和钢笔也是同一类。”
面试官还问过我一个对象问题:
面试官:若我是一个完全不懂IT和编程的人,你能给我解释一下什么是对象吗?
我:在JAVA中,对象就是一类数据的实例化,他们有着一种或几种的相同特征。
面试官:你认为一个普通人听得懂这个吗?你只需要说万物皆对象就好,再举几个生活中的例子,没必要去背概念。
最后,我还是收到了这加公司的Offer,也是我工作生涯所进的第一家公司,也让我认识到了什么叫资产阶级的剥削,当然,这些都是后话了。。。
int转换为CString:
CString csName;
int num;
csName.Format("%d", num);
CString转换为int:
CString csName;
int num = atoi(csName);
int转CString就不细说了,使用format即可,
这里简单介绍下CString转int的一种简便方法
CString strNum("100");
int num;
//ANSI
num = atoi(strNum);
num = _ttoi(strNum);
//UNICODE
num = atoi(CT2A(strNum.Getbuff()));
num = _ttoi(strNum);
总结:
使用 _ttoi 可以适用于 ANSI和UNICODE两种版本。
int 转化为SCtring:
int n = 123; CString str;
str.Format("%d",n); 报错的话则改为:str.Format(_T("%d"),n); 或者 str.Format(TEXT("%d"),n); 即可
CString 转化为 int:
CString str("123");
int n= _ttoi(str);
原文:https://blog.csdn.net/myruo/article/details/81505405
一、前提 开启zookeeper服务端,用客户端连接。输入help,查看可使用命令,如下图所示:
操作无非就是增删改查等。
二、增加 格式: create[-s][-e]path data acl
path:即路径,由于zookeeper是一个树形结构,所以创建的时候就是一个Path节点,就是路径
data:节点对应的值,保存的少量数据
[-s]有序节点 [-e]临时节点
注:节点临时有序节点、临时节点、持久有序节点 和 持久节点。
1.创建节点
eg: create/node_11
2.创建有序的持久化节点
eg: create-s/node_1/node_1_12
3.创建临时节点(基于会话级别)
eg: create-e/node_1/node_1_23
三、查询 getpath[watch]
eg: get/node_1
四、修改 setpath data[version]
eg: set/node_1 abc
五、删除 deletepath[vsersion]
eg: delete/node_1
发现报:Node not empty:/node1,说明node1下面存在节点,不可以删除。
所以,删除其中一个子节点:
delete/node_1/node_1_1
查看node_1 下面的节点:
ls/node_1
六、查看 ls 和 ls2 和 stat
s /node_1
ls2 /node_1
stat /node_1
ls2和stat命令输出的信息更加详细,结果一样。
七、给节点设置限制 setquota-n|-b val path
-n的时候,val表示创建的子节点数量,path为指定的节点
-b的时候,val表示创建节点的数据量,path为指定的节点
1.首先查看/node1下子节点的数量,使用 : ls /node1,发现/node_1下面有两个子节点:
运用C语言打印出菱形 #include <stdio.h> #include <stdlib.h> void main() { int line; //菱形总行数 int column; //菱形总列数 int i; //当前行 int j; //当前列 printf("请输入菱形的行数(奇数):"); scanf("%d", &line); if(line%2==0) // 判断是否是奇数 { printf("请输入奇数\n"); exit(1); } column = line; //总行数和总列数相同 for(i=1; i<=line; i++) //所有行 { if(i<(line+1)/2+1) //上半部分(包括中间一行) { for(j=1; j<=column; j++) //上半部分的所有列 { if((column+1)/2-(i-1)<=j&&j<=(column+1)/2+(i-1) ) { printf(“*”) } else { printf(" "); } } } else { //下半部分 for(j=1; j<=column; j++) { //下半部分的所有列 if((column+1)/2-(line-i)<=j&&j<=(column+1)/2+(line-i) ) { printf("
我们知道xWR1243和xWR1443 EVM是3TX4RX雷达,xWR1642 EVM是2TX4RX雷达,我们不仅要掌握1TX4RX模式的使用还要学会使用MIMO雷达模式。本文主要介绍如何在mmWave Studio上设置MIMO模式(2TX4RX)以及MATLAB如何处理MIMO数据?
1、MIMO雷达介绍 MIMO(Multiple-Input-Multiple-Output,多输入多输出)雷达是指具有多个TX天线,多个RX天线的雷达,MIMO雷达是一种能够提高角度分辨率的有效方法。我们知道,雷达角度分辨率与接收天线阵列的孔径大小相关,孔径越大,分辨率越高。
因此,当RX天线数目越多,雷达角度分辨率越高。其中,使用N个TX天线,M个RX天线的MIMO雷达的角度分辨率可以等效于使用1TX,N*M RX天线的SIMO(Single-Input-Multiple-Output,多输入多输出)雷达。例如,TI xWR1xxx系列毫米波雷达采用1TX4RX时的角度分辨率约为30°,采用2TX4RX(等效于1TX8RX)的角度分辨率约为15°。
对于2TX4RX雷达,对应TX1的4RX间的相位差为 [ 0,w,2w,3w ],对应TX2的4RX间的相位差为 [ 4w,5w,6w,7w ]。 因此,2TX4RX的雷达等效于1TX8RX雷达。
MIMO雷达发射天线的复用技术必须保证RX天线能够在接收端分离出不同TX天线的回波信号。TI文档中介绍了两种复用技术:TDM模式(Time Division Multiplexing,时分复用)和 BPM模式(Binary Phase Modulation,二相调制)。
(1)TDM模式
(2)BPM模式
2、mmWave Studio中的MIMO模式设置(2Tx-4Rx) (1)TDM模式
(2)BPM模式
3、MIMO数据的Matlab处理 (1)TDM模式
(2)BPM模式
关于MIMO雷达的介绍,主要参考文档 “MIMO Radar”(SWRA554A),以及TI e2e论坛的帖子:
[1] TDM模式的mmWaveStudio配置
问题描述:使用PyTorch的DataLoader,讲num_workers改为非零数字后, 运行程序报错RuntimeError: CUDA error: initialization error解决方法:不可在DataLoader或DataSet内将任何数据放到CUDA上,而是等到程序运行出DataLoader之后(也就是到了train里的时候)将数据放到CUDA上。 原因猜测:
DataLoader使用num_workers时将数据load到“缓冲区”,如果在还未成功将数据load到“缓冲区”的时候把数据放到CUDA上(该操作相比于load数据更为费时),此时load数据进程转向load下一组数据,从而导致CUDA initialization error(如果猜测与事实有出入,还希望有识之士能够在评论区指正)
C语言使用QRcode生成二维码的简单操作
首先需要QRcode源码包
可以参考这位大神的文章:
https://blog.csdn.net/qq_21475601/article/details/71480028
下面是我的代码:
生成的话 只需要源码的三个文件 分别是 data_type.h,QR_Encode.c,QR_Encode.h int main(void){
EncodeData("aaa");
int i,j;
for(i=0;i<MAX_MODULESIZE;i++){
for(j=0;j<MAX_MODULESIZE;j++){
if(m_byModuleData[i][j] == 1)
printf("卍");
else
printf(" ");
}
printf("\n");
}
return 0;
}
效果图:
仅供参考!
1、右键点击解决工程->项目属性
2、配置属性->生成事件->生成后事件
在命令行中输入:"$(TargetPath) >$(outdir)\1.txt"
3、重新编译整个项目,此时就会在debug目录下多了一个1.txt文件,里面就是程序运行时的控制台输出结果。
转载于:https://www.cnblogs.com/cgc0415/p/10952051.html
modelsim-alter 仿真时出现# ERROR: No extended dataflow license exists
View ——>dataflow 取消显示
testbench编写的 m o n i t o r 和 monitor和 monitor和display函数无法在models-alter仿真中无法使用,但波形正常显示
重装系统,重装软件无法解决
卸载软件,清除注码表,新建立英文账户,使用英文账户安装,破解,使用软件,不会出现上面所有错误
定义一个学生类Student,包括3个数据成员:学号id,姓名name,分数score;两个静态数据成员:总分total和学生人数count;带参数的构造函数用来初始化对象,成员函数ChangeScore用来修改分数,静态成员函数GetAverage用来打印计算得到的平均分 我的第一篇博客
C++学习记录
#include <iostream> #include <string> using namespace std; class Student { public: Student(int id,string name,double score):id(id),name(name),score(score) //带参数的构造函数初始化对象 { count++; total+=score; } void ChangeScore(double newScore) { total+=newScore-score; //因为是静态,所以定义一个新变量newScore score=newScore; } static double GetAverage() { return total/count; } private: int id; string name; double score; static double total; static int count; }; double Student::total=0.0f; int Student::count=0; // 类外对静态数据成员进行定义声明 int main() { Student s1(01,"Wang",78); Student s2(02,"Liu",85); Student s3(03,"Chen",90); cout<<"The average score is:"
上文 : WordPress从0开始建站(一):教练,我想建网站!,WordPress已经安装成功,今天我们来解决昨天遗留的三个问题:
初步实现网站美化快速导入CSDN博客CSS样式定制网站 话不多说,且看如何实现。(这该死的沙雕作者终于不在前面扯那么多废话了)
一、初步美化 :大哥你看我美不美 登陆
浏览器输入进入你的公网IP地址,登陆WordPress进入管理界面:
选主题
选择:外观–>主题–>添加,进入到主题选择界面,选一个你喜欢的主题。
比如我选择的是:Bhari 主题,点击安装后,再次进入到主题管理界面便可以看到它了。
启用主题,并开始自定义。
自定义主题简介
进入到自定义界面:
可以看到,左侧红框便是用来自定义主题,同时它也被我分为两部分:
1部分:1部分比较简单,大家自己琢磨一会儿就能明白了。在接下来我们会举几个例子供参考。2部分:2部分便是自己添加CSS来改变网站主题样式了,在 三、CSS样式定制有详细讲诉。 实例:修改顶部图像
在上图1部分,我们看到有一栏叫做:顶部图像,点击进入后选择添加图像:
嗷~很不幸,出错了:没有上级目录写权限。这是因为我们对目录wp-content操作权限不够。
打开Xshell,连接云服务器,键入以下命令,修改目录wp-content权限为777(可被任意用户读写)
chmod -R 777 /var/www/html/wp-content # -R表示还同时修改wp-content子目录权限为777 这个时候,我们再次选择文件便发现,可以正常选择图像了~(我没合适图就不修改了hhh)
二、导入CSDN博客 来到我们的新窝,虽然还很简陋,但是 斯是陋室,惟吾德馨 嘛~可问题他喵的又来了,怎么让别人知道我们的德馨 呢?如果你写过CSDN博客,那么自然希望快速转入,很遗憾,在我写这篇博文之前还没找到一个能用的办法快速导入CSDN博客(可能因为毕竟作者500°近视)。
那么我有吗?那当然~有一个不(很)成熟的办法献丑(炫耀)一下。
导出CSDN
进入我们的CSDN博客,点击编辑,可以在右侧看到:导出为HTML文件 :
点击导出,保存导出后的HTML文件。
导入WordPress
进入控制台(仪表盘),选择新建文章,进入代码编辑模式:
用记事本(当然也可以其它)打开刚刚下载的博客HTML文件,复制粘贴。
同时插入<!--more-->这段代码,使得首页只展示代码前文字。
点击发布,查看文章。发现问题:
点击查看文章,显示错误找不到文章
他人输入你IP(或域名)地址,文章图片不显示
代码高亮不够满意
优化:解决文章不显示
问题
解决
设置固定链接朴素模式即可:
再次刷新界面便发现可以查看文章了。
优化:解决图片不显示和文章两侧留白
问题
解决
图片不显示,是因为CSDN反盗链,在头部设置忽略refer。
<meta name="referrer" content="no-referrer"> 优化:解决代码高亮
解决
代码高亮可以下载一个插件名为:highlight.js
接着你可以在已下载的插件 启用,同时设置你喜欢的样子全都有~
我个人比较喜欢:vs 高亮模式
1.sdk接口
https://developer.android.google.cn/reference/packages,能够在谷歌网站查询到的接口,参考google官网
2.非 SDK 接口:
除以上的 SDK 接口外,其他都是非 SDK 接口
调用非SDK会出现的问题:通过反射或者JNI访问非公开接口时会触发警告/异常
3.非 SDK 接口管控名单
https://developer.android.com/preview/non-sdk-q
4.系统是如何实现这个限制的
请参考如下文章。
https://www.jianshu.com/p/c41567b2c574
FMMU:现场总线内存管理单元;
FMMU的作用非常关键,通俗的讲,它将报文逻辑数据地址和从站的物理地址相互转化、映射,这样的话,一包报文就可以装载多个从站、多种格式的数据;
以下是学习时的截图,讲的是数据地址0x00010011偏移3位 至 0x00010013第0位映射0x0F01第一位至0x0F02第六位,想更好的理解FMMU,这两张图的对应关系需要好好看明白。
FMMU操作请注意以下几点:
1、每一个数据地址单元只允许一个FMMU读和另一个FMMU写,或者被同一个FMMU进行读写交换;
2、同一个FMMU对逻辑地址单元读写操作与一个FMMU读另一个FMMU写,结果是一样的;
3、FMMU按位读写操作不影响报文其他位,所以可以将多种类型、多个从站的数据放入同一包报文;
关于Unity中单独提取mesh组件并保存 作为一个新入职的程序猿,老大给我分配了个任务,让我从一个Fbx模型中提取他的mesh。=。=这可如何是好,从未遇到过这个,最后只能求助谷歌了(别问为啥是谷歌),果然网络上还是有大佬的,终于找到了解决方法。
在这感谢TinyHum博主的文章,使用以下代码,调用SaveAsset函数,就能把mesh保存在Assets目录下(当然目录你可以自己选)。在磁盘上是.asset的文件,在project中看到的是一个mesh符号的文件,注意,挂载的object上必须有mesh组件
public Transform object; private string name; void SaveAsset() { Mesh mesh = object.GetComponent<MeshFilter>().mesh; AssetDatabase.CreateAsset(mesh , "Assets/" + name + ".asset"); }
你说你想建个很酷的站,但是对知识一无所知;你于是遍搜详细教程,却难寻合心意,大佬一笔而过只言片语,留你抓耳挠腮。
这么巧啊,你也是小白。
如果你不懂什么叫服务器,php听起来好像很顺口?linux…是一个人吗?前端?当然会一点点啦。那么这个从0开始建站系列博文,只需一个赞点不了吃亏点不了上当,教你从0开始搭建一个自己的个人博客网站。
一、准备:工欲善其事 一般而言,我们有三种方式选择搭建自己的网站。
简介所需环境难度时间WordPress从头搭建网页太繁琐?WP帮助您。只需要配置好WP软件运行所需LNMP/LAMP环境(后面详细解释)。就像ppt模板一样,只要专注写博客即可,网站自动生成。LNMP/LAMP一般一天Github Pages和WordPress类似,页面更加简洁。Node.js+Git+Hexo一般一天个人从头搭建熟悉建站前后端知识,难度较大,新手暂不推荐-较难- 这次我们选择的是利用WordPress软件来搭建自己的网站,但是无论哪种,首先我们需要准备:
服务器:本次搭建使用阿里云服务器。网站要保持24小时不间断、网络连接带宽etc.普通电脑自然难以胜任, 自己专门买服务器维护门槛太高,租用云服务器是不二选择。域名:买来服务器会分配一个公网IP,如196.11.11.111,搭建好环境网站上线别人就可以通过这个IP访问你的网站。但是人要衣装,网站也要牌面,我们需要一个更好听易记的名字来访问你的网站,这就是域名。 以下是获取流程。
1.1 云服务器 云服务器购买 比较为人熟知的分别是:阿里云服务器 & 腾讯云服务器。腾讯云服务器学生优惠很实在10元/月,撸了一年羊毛,今天我们来撸一撸阿里云学生优惠羊毛hhh。
点击进入:阿里云学生优惠
选择:云服务器 ECS。
预装环境:CentOS 7。轻量应用服务器 可以直接选择WordPress镜像…那么本文完作者猝。但是想要认真折腾服务器,为以后自己从头建站做准备(而且似乎用不了学生优惠)。建议大家还是选择云服务器 ECS–CentOS 7镜像,认真走完这个流程。
地域:没得选。买国内服务器要进行备案,这个稍后细说。
设置好你的登陆账号密码确认购买即可。你可以在你的阿里云控制台查看你购买的云服务器ECS。
1.2 域名 域名购买最好也在阿里云购买,可以少些解析麻烦事儿。购买地址:阿里云域名 。
购买过程就没什么好说啦,但是会要求我们进行实名认证才能购买。找到右上角头像先进行实名认证:
认证完就可以愉快的进行购买域名了。第一次网络拥有自己一个小窝,想想有没有点小激动呢hhhh~
1.3 备案 上面提到域名解析到国内服务器需要备案(如香港等不用)。大家可以先按照流程填写信息,在等待过程中,我们可以先部署我们的小窝。
官方备案流程:阿里云备案
1.4 解析域名 什么是解析域名?简单来说,用你的域名如:www.baidu.com 来访问你的网站,而不是用144.144.144.144 这种IP地址来访问。没有备案,DNS解析很多功能无法正常进行,但是我们还是可以直接利用域名进入我们的网站。
解析流程:阿里云添加网站解析
二、搭建WP环境 WordPress软件给我提供一个快速生成博客网站环境,但是也需要配置好它运行的环境。简单来说,我们需要:
一个Linux系统:本文已经搭建好CentOS 7一个Web服务器:我们选用的是Apache服务器。简单来说它的作用就是将你的电脑变成一台服务器,让电脑开放特定网络端口,接收来自网络上发送的HTTP请求,对请求的内容进行处理并作出相应的响应。一个数据库系统:选择MariaDB,CentOS 7以上版本已不再支持使用MySQL。一个Web 服务器生成网页的程序:PHP自然是不二选择。 Linux+Apache+MariaDB+PHP == 我们之前说的LAMP环境。准备好了吗,接下来便开始具体安装搭建。
2.0 安装Xshell 安装软件如果每次都要上阿里云打开虚拟机,实在太麻烦啦。我们可以安装Xshell在Windows界面下用来访问远端不同系统下的服务器,从而达到方便操作远程控制终端的目的。
Xshell有家庭/学校免费版:Xshell官网下载 OR Xshell百度云下载
安装一直点下一步傻瓜似安装,后可以看到Xshell界面,选择文件–新建:
按照上图填好信息,然后再点击用户身份验证,输入登陆账号密码(就是我们在购买云服务器时设置的):
点击确定。然后在Xshell界面选择:会话管理 - 阿里云服务器 右击 - 打开,便连接到我们的服务器了。
C++11中,当我们定义一个类的成员函数时,如果后面使用"=delete"去修饰,那么就表示这个函数被定义为deleted,也就意味着这个成员函数不能再被调用,否则就会出错。
#include <cstdio> class TestClass { public: int func(int data)=delete; }; int main(void) { TestClass obj; obj.func(100); return 0; } 编译时直接报错,如下,
在C++11之前,当我们希望一个类不能被拷贝,就会把构造函数定义为private,但是在C++11里就不需要这样做了,只需要在构造函数后面加上=delete来修饰下就可以了。
巧妙用法 这里说个=delete的巧妙用法,在C++里会有很多隐式类型转换,如下代码,
#include <cstdio> class TestClass { public: void func(int data) { printf("data: %d\n", data); } }; int main(void) { TestClass obj; obj.func(100); obj.func(100.0); return 0; } 输出如下,
当我们把100.0传给obj.func()时,发生了隐式类型转换,由double转为了int,有时我们不希望发生这样的转换,我们就是希望传进来的参数和规定的类型一致,那么此时可以使用=delete来达到这个目的,如下,
#include <cstdio> class TestClass { public: void func(int data) { printf("data: %d\n", data); } void func(double data)=delete; }; int main(void) { TestClass obj; obj.
MyBatis sql中test判断Boolean 【三种方式】: <select id="queryAddress" resultType="com.caox.model.Address"> select id, address, remark from address where 1=1 <if test="flag==true"> and address = #{address} </if> </select> <update id="updateHaveNewComment"> <choose> <when test="flag==true"> UPDATE epc_subject_center s SET s.have_new_comment=1 WHERE s.id=#{id} </when> <otherwise> UPDATE epc_subject_center s SET s.have_new_comment=0 WHERE s.id=#{id} </otherwise> </choose> </update> <update id="updateHaveNewComment"> <choose> <when test="flag"> UPDATE epc_subject_center s SET s.have_new_comment=1 WHERE s.id=#{id} </when> <otherwise> UPDATE epc_subject_center s SET s.have_new_comment=0 WHERE s.id=#{id} </otherwise> </choose> </update>
-----------------------------强行删除数据库-----------------------------
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname='dbname' AND pid<>pg_backend_pid(); DROP DATABASE dbname; -----------------------------创建数据库实例-----------------------------
create database dbname owner postgres; -----------------------------导入、导出(需要输入密码)-----------------------------
#备份结构 pg_dump -h 172.16.100.209 -p 9999 -U postgres -s khb_001_hazcj_080 > /tmp/khb_001_hazcj_080.backup #备份数据 pg_dump -h 172.16.100.209 -p 9999 -U postgres -a khb_001_hazcj_080 > /tmp/khb_001_hazcj_080_data.backup #恢复结构 psql -d test -h 192.168.171.129 -p 5432 -U postgres -f /tmp/khb_001_hazcj_080.backup #恢复数据 psql -d test -h 192.168.171.129 -p 5432 -U postgres -f /tmp/khb_001_hazcj_080_data.backup #说明:-h主机名 -p端口 -U用户名 -s只备份机构 -a只备份数据 -----------------------------导入、导出(无需输入密码,但是pg_hba.
qemu-img convert -f raw openwrt.img -O vmdk openwrt.vmdk
https://www.qemu.org
转载于:https://blog.51cto.com/singoe/2401154
-- coding:utf-8 -- #将图片转成json code码
导入相关的库 from sys import argv
from base64 import b64encode
from json import dumps
ENCODING = ‘utf-8’ # 指定编码形式
SCRIPT_NAME, IMAGE_NAME, JSON_NAME = argv # 获得文件名参数
读取二进制图片,获得原始字节码,注意 ‘rb’ with open(IMAGE_NAME, ‘rb’) as jpg_file:
byte_content = jpg_file.read()
# 把原始字节码编码成 base64 字节码
base64_bytes = b64encode(byte_content)
将 base64 字节码解码成 utf-8 格式的字符串 base64_string = base64_bytes.decode(ENCODING)
用字典的形式保存数据 raw_data = {}
raw_data[“name”] = IMAGE_NAME
raw_data[“image_base64_string”] = base64_string
将字典变成 json 格式,缩进为 2 个空格 json_data = dumps(raw_data, indent=2)
1、事务注解一般用在业务层
2、在业务逻辑中抛出的异常若是被try-catch了,事务是无法回滚的,所以正确的操作是在遇到异常场景需要回滚时,手动抛出RuntimeException(默认情况下Spring 中的事务处理只对RuntimeException 方法进行回滚,所以,如果
将Runtime Exception 替换成普通的Exception 不会产生回滚效果。 )
3、spring中的事务是以AOP为基础的,是应用代理模式实现的
4、Spring实现事务时,提取事务标签的顺序为:方法事务声明-->方法所在类事务声明-->接口方法事务声明-->接口方法所在类事务声明
5、对于事务处理,最重要的是要获取事务对应的属性,如果没有事务对应的属性值,事务将无从处理,事务的所有信息从创建事务开始就保存在transactionInfo中,包括事务回滚都要依赖该信息进行处理。
6、事务回滚处理(Spring处理异常事务机制)
(1)事务回滚条件
Spring事务异常处理机制只会对RuntimeException 和Error 级别的异常执行回滚操作,执行具体回滚的函数如下:
public boolean rollbackOn(Throwable ex) {
return (ex instanceof RuntimeException || ex instanceof Error);
}
当然我们可以对上述两种类型的异常进行扩展处理,达到自己对指定常的回滚,并利用注解的方式实现
@Transactional(rollbackFor = xxxException.class)
(2)事务回滚处理 两步:
触发器监听函数 执行真正的回滚操作,在执行回滚操作的时候要考虑是否有嵌套事务(根据 savePoint来判断,若有嵌套事务,则对嵌套事务单独进行回滚,不回滚外事务。)
(3) 回滚后的信息清除 无论事务是否回滚成功都必须执行
设置事务状态为完成,避免事务重复执行
如果当前事务是新的同步状态,则将事务信息从当前线程中清除掉
释放事务占用的资源(数据库连接资源等)
如果在当前事务事前有事务挂起,需要将挂起的事务恢复
https://refactoringguru.cn/design-patterns/chain-of-responsibility
解决方法
将窗口最大尺寸和最小尺寸设置为一样即可
top = Tk() # 创建顶级窗口 top.minsize(560, 545) # 最小尺寸 top.maxsize(560, 545) # 最大尺寸 top.mainloop() 转载于:https://www.cnblogs.com/diyi/p/10926208.html
TIME_WAIT过多危害 网络情况不好时,如果主动方无TIME_WAIT等待,关闭前个连接后,主动方与被动方又建立起新的TCP连接,这时被动方重传或延时过来的FIN包过来后会直接影响新的TCP连接;同样网络情况不好并且无TIME_WAIT等待,关闭连接后无新连接,当接收到被动方重传或延迟的FIN包后,会给被动方回一个RST包,可能会影响被动方其它的服务连接。过多的话会占用内存,一个TIME_WAIT占用4k大小 解决方法 相关参数优化调整(当然得根据服务器的实际情况配置,这里着重讲参数意义):
既然知道了TIME_WAIT的用意了,尽量按照TCP的协议规定来调整,对于tw的reuse、recycle其实是违反TCP协议规定的,服务器资源允许、负载不大的条件下,尽量不要打开,当出现TCP: time wait bucket table overflow,尽量调大下面参数:
tcp_max_tw_buckets = 256000
调整次参数的同时,要调整TIME_WAIT_2到TIME_WAIT的超时时间,默认是60s,优化到30s:
net.ipv4.tcp_fin_timeout = 30
其它TCP本身的配合参数类似与synack重传次数、syn重传次数等以后介绍,优化后也是有所益处的。
下面再说一下linux里TIME_WAIT专有的优化参数reuse、recycle,默认也都是关闭的,这两个参数必须在timestamps打开的前提下才能生效使用 net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
机器作为客户端时起作用,开启后time_wait在一秒内回收
net.ipv4.tcp_tw_recycle = 0 (不要开启,现在互联网NAT结构很多,可能直接无法三次握手)
开启后在3.5*RTO(RTO时间是根据RTT时间计算而来)内回收TIME_WAIT,并60s内同一源ip主机的socket
connect请求中的timestamp必须是递增的,对于服务端,同一个源ip可能会是NAT后很多机器,这些机器timestamp递增性无可保证,服务器会拒绝非递增请求连接,直接导致不能三次握手。
注意 tcp_tw_recycle:顾名思义就是回收TIME_WAIT连接。可以说这个内核参数已经变成了大众处理TIME_WAIT的万金油,如果你在网络上搜索TIME_WAIT的解决方案,十有八九会推荐设置它,不过这里隐藏着一个不易察觉的陷阱:
当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,也就是说对服务端而言这些客户端实际上等同于一个,可惜由于这些客户端的时间戳可能存在差异,于是乎从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。参考:tcp_tw_recycle和tcp_timestamps导致connect失败问题。
tcp_tw_reuse:顾名思义就是复用TIME_WAIT连接。当创建新连接的时候,如果可能的话会考虑复用相应的TIME_WAIT连接。通常认为「tcp_tw_reuse」比「tcp_tw_recycle」安全一些,这是因为一来TIME_WAIT创建时间必须超过一秒才可能会被复用;二来只有连接的时间戳是递增的时候才会被复用。官方文档里是这样说的:如果从协议视角看它是安全的,那么就可以使用。这简直就是外交辞令啊!按我的看法,如果网络比较稳定,比如都是内网连接,那么就可以尝试使用。
不过需要注意的是在哪里使用,既然我们要复用连接,那么当然应该在连接的发起方使用,而不能在被连接方使用。举例来说:客户端向服务端发起HTTP请求,服务端响应后主动关闭连接,于是TIME_WAIT便留在了服务端,此类情况使用「tcp_tw_reuse」是无效的,因为服务端是被连接方,所以不存在复用连接一说。让我们延伸一点来看,比如说服务端是PHP,它查询另一个MySQL服务端,然后主动断开连接,于是TIME_WAIT就落在了PHP一侧,此类情况下使用「tcp_tw_reuse」是有效的,因为此时PHP相对于MySQL而言是客户端,它是连接的发起方,所以可以复用连接。
说明:如果使用tcp_tw_reuse,请激活tcp_timestamps,否则无效。
参考:https://blog.huoding.com/2013/12/31/316
为了给学校安装一个文件平台,我尝试了大大小小各种方法。其中nextcloud占用了大量的时间,安装系统、配置环境,解决报错,前前后后几十次都有。
最终,我有点扛不住了,我选择使用snap,几条命令,环境完美,傻瓜安装。唯一的问题就是挂载硬盘,教程来源于网络:
方法是:首先你的数据盘需要挂载到/media下,比如我挂载到/media/data;其次执行sudo snap connect nextcloud:removable-media命令;然后在config.php文件里修改数据存储目录,比我修改数据存储目录为/media/data/nextcloud;然后根据楼主的做法,将默认存储目录里的文件全部拷贝到你自定义的存储目录里,比如我的就是/media/data/nextcloud;最后重启nextcloud!
修改目录,更改权限,简单,爽!!!真香!!!
PS:我现在又在尝试UNAS了>_>
搭建SSM demo详细步骤 前言搭建思路新手入门搭建方法1).环境搭建2)整合spring框架3)整合springmvc框架4)整合MyBatis框架5)整合spring和mybatis 前言 最近看面试题的时候,刷到有面试官的抱怨,说面试了30多个,让他们搭建个SSM(spring+springMVC+mybatis),都没一个搭建出来.于是乎扪心自问,自己如果盲打的话,应该也是不行,所以来整理一下,希望通过整理,能让大家和我一起回顾一下.
搭建思路 搭建方法有两种,.一种是比较基础的,可以很容易看出哪里出错,一步步搭建;新手学习的话,建议选择方法一,因为每一步都相对比较独立,错误信息比较容易找.如果要快速搭建代码请点击一下链接
----------------------->十分钟快速搭建SSM Demo框架技能get
使用环境:
eclipsetomcat8.0maven3.5.3mysql 新手入门搭建方法 1).环境搭建 eclipse整合tomcat,maven(此步骤省略,自行百度)创建项目
创建一个maven项目,习惯勾选简单项目.配置起来虽然麻烦,但是比较好理解
注意在Packaging选择war
如下图所示
3.自行创建以下包和文件夹
4.在pom.xml文件中集中定义依赖版本号 <!-- 集中定义依赖版本号 --> <properties> <junit.version>4.10</junit.version> <spring.version>4.1.3.RELEASE</spring.version> <mybatis.version>3.2.8</mybatis.version> <mybatis.spring.version>1.2.2</mybatis.spring.version> <mysql.version>5.1.32</mysql.version> <druid.version>1.1.6</druid.version> <slf4j.version>1.6.4</slf4j.version> <jstl.version>1.2</jstl.version> <servlet-api.version>2.5</servlet-api.version> <jsp-api.version>2.0</jsp-api.version> <jackson.version>2.4.2</jackson.version> </properties> <dependencies> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> </dependencies> 2)整合spring框架 1.在pom.xml文件中,引入spring的依赖包
ps:需要在标签下引用
<!-- 整合spring框架(包含springmvc) 这个jar文件包含springmvc开发时的核心类, 同时也会将依赖的相关jar文件引入进来(spring的核心jar文件也包含在内) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!--这个jar文件包含对Spring对JDBC数据访问进行封装的所有类 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.
1 s=input('Please input the string:') 2 temp=list(s) 3 temp.reverse() 4 #列表转换为字符串 5 print(''.join(temp)) 转载于:https://www.cnblogs.com/feihujiushiwo/p/10917231.html
事件冒泡:只要有多个元素嵌套,且他们绑定了相同的事件,那么子元素事件触发了,会把他接收到的事件传给自己的父级元素、祖宗元素,一直到window。
注意:事件冒泡和元素的在页面中显示出来的位置没有关系,而是跟html代码中的位置有关系,必须是嵌套关系。也就是说即使有嵌套关系的父子元素,定位在两个不同的地方,点击子元素也会向父元素传递相同的事件触发,也就是说父元素也发生了点击事件。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> <style> #dv1{ width: 300px; height: 200px; background-color: red; } #dv2{ width: 250px; height: 150px; background-color: green; } #dv3{ width: 200px; height: 100px; background-color: blue; } </style> </head> <body> <div id="dv1"> <div id="dv2"> <div id="dv3"></div> </div> </div> <script> document.getElementById("dv1").onclick=function () { console.log(this.id); }; document.getElementById("dv2").onclick=function () { console.log(this.id); }; document.getElementById("dv3").onclick=function (e) { console.log(this.id); }; </script> </body> </html> 2. 引入:事件处理参数对象(e)
必须有事件触发、有处理函数、那么当事件触发时,会自动传入向处理函数传入一个默认有参数,且该参数是一个对象,即事件处理参数对象。
如以下dv对象,绑定了onclick事件,且有处理函数,当点击该div时,控制台输出1,表示,传入了一个默认参数,该参数对象的名字,一般使用event或e,但这不是必须的,可以用任何合法的变量名。