谈谈JavaScript的深浅拷贝 - 2019-07-05 14:39:14

为什么要进行拷贝 var obj1={ value: 'a' } var obj2 = obj1; obj2.value='b'; console.log(obj1);//{ value: 'b' } 因为对象是引用类型,所以赋值时的操作仅是赋予相同的地址,当对其中一个对象进行操作时,就会影响其他的对象。解决这个问题就需要拷贝了。 浅拷贝: 使用原生的 Object.assign() 方法就可以实现浅拷贝 var obj1={ value: 'a' } var obj2 = Object.assign({},obj1); obj2.value='b'; console.log(obj1);//{ value: 'a' } 但是如果拷贝的源对象当中包含对象时,OBject.assign()方法只会拷贝对象的引用地址 var obj1={ value: 'a', obj3:{ value2: 'c' } } var obj2 = Object.assign({},obj1); obj2.obj3.value2='b'; console.log(obj1);//{ value: 'a', obj3:{ value2: 'b' } } 深拷贝 如果要拷贝的对象中包含对象,就需要深拷贝了,一般使用原生的方法JSON.parse(JSON.stringify(obj)) j1={ value: 'a', obj3:{ value2: 'c' }, arr:[1,2,3] } var obj2 = JSON.

vue疑难杂症 - 2019-07-05 16:35:33

vue首页白屏(几率性) // 在config文件夹中找到index.js打开把 assetsPublicPath: '/' // 改成 assetsPublicPath: './' // 再次执行 npm run build 就可以了。 消除transition闪屏 .css { -webkit-transform-style: preserve-3d; -webkit-backface-visibility: hidden; -webkit-perspective: 1000; } history模式下404 // 服务器的404页面需要重定向到index.html(nginx) try_files $uri $uri/ /index.html; 解决vue打包vendor过大 在webpack.base.conf.js新增externals配置,表示不需要打包的文件,然后在index.html中通过CDN引入 externals: { "vue": "Vue", "vue-router": "VueRouter", "vuex": "Vuex", "element-ui": "ELEMENT", "BMap": "BMap" } 2、使用路由懒加载 网站被劫持植入广告 https,最稳 在网站页头加入如下代码: <style> html{display : none ; } </style> <script> if( self == top ) { document.

https介绍及中间人攻击 - 2019-07-09 21:55:01

SSL或TLS握手的概述 SSL或TLS握手建立了用于客户端和服务端通信的秘钥。 客户端和服务端SSL或TLS能够相互通信的基本步骤: 确认使用协议的版本 选择加密算法 通过交换和验证数字证书对彼此进行身份验证 使用非对称加密技术生成共享密钥,避免了密钥分发问题。然后SSL或TLS使用共享密钥对消息进行对称加密解密,这比非对称加密更快 综上所述SSL握手的步骤如下: SSL或TLS客户端先向服务端发送一个加密通信请求,叫做ClientHello请求。该请求包含以下信息: 客户端支持的SSL或者TLS版本 客户端生成的随机数,用于生成后续通信的随机字符串(”对话密钥”) 客户端支持的加密算法 SSL或TLS服务端收到客户端请求后,向客户端发出响应,叫做ServerHello。该响应包含以下信息: 服务端从客户端提供的SSL或TLS列表中选择的版本 Sesstion ID 和 另外生成的随机数 服务端的数字证书(如果服务端需要用于客户端身份验证的数字证书,则服务端发送一个客户端证书请求,其中包含受支持的证书类型列表和可接受的认证机构(CAs)的专有名称。) 确认使用的加密算法 客户端收到服务端响应后,首先校验服务端发来的数字证书决定是否继续通信。 证书校验通过,会像服务端发送以下信息: 生成一个随机数,并对这个随机数用从服务端数字证书中取出的公钥加密(用与生成后续通信的“随机密钥”) 如果服务端发送了一个客户端证书请求,客户端将会发送一个用客户端私钥加密的随机字符串和客户端的数字证书,或者没有数字证书的警告。在某些强制客户端证书的实现中,如果客户端没有数字证书责握手会失败 服务端接受并验证客户端证书 客户端向服务端发送一条完成的消息,该消息使用密钥加密,表示握手的客户端部分已经完成。 服务端向客户端发送一条完成的消息,该消息使用密钥加密,表示握手的服务端部分已经完成 在SSL或TLS会话期间,服务端和客户端现在可以交换使用共享密钥对称加密的消息 中间人攻击 中间人攻击过程如下: 服务器向客户端发送公钥。 攻击者截获公钥,保留在自己手上。 然后攻击者自己生成一个【伪造的】公钥,发给客户端。 客户端收到伪造的公钥后,生成加密hash值发给服务器。 攻击者获得加密hash值,用自己的私钥解密获得真秘钥。 同时生成假的加密hash值,发给服务器。 服务器用私钥解密获得假秘钥。 服务器用加秘钥加密传输信息 防范方法: 服务端在发送浏览器的公钥中加入CA证书,浏览器可以验证CA证书的有效性

mysql+mycat搭建高可用集群,主从复制,读写分离 - 2019-07-11 17:33:35

工具准备 mysql两台(版本推荐5.5以上): A主mysql:192.168.10.1:3306, 用户root,密码123456 B备mysql:192.168.10.2:3306, 用户root,密码123456 AB两台服务器中的mysql都创建sync_test数据库 实现mysql主备复制 主要思路:A开启日志,B读取操作日志,同步执行。 配置A主mysql 在mysql安装目录下创建目录和文件mysql/log/mysql-bin.log 修改my.ini [mysqld] server-id=1 #主机标示,整数 port=3306 log-bin="xxx/mysql/log/mysql-bin.log" #确保此文件可写 read-only=0 #主机,读写都可以 binlog-do-db=sync_test #需要备份数据库,多个写多行 binlog-ignore-db=mysql #不需要备份的数据库,多个写多行 允许mysql远程访问(lnmp服务器需要去掉防火墙) mysql -uroot -proot mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.10.*' IDENTIFIED BY 'root' WITH GRANT OPTION; mysql>FLUSH PRIVILEGES; 重启A主mysql数据库 配置B备mysql 在mysql安装目录下创建目录和文件mysql/log/mysql-bin.log 修改my.ini [mysqld] # add for sycn test server-id=2 #从机标识 log-bin="xxx/mysql/log/mysql-bin.

破窗效应与代码质量 - 2019-07-12 18:10:09

破窗效应是犯罪心理学的一个理论,指如果一个建筑,当出现小量破窗的时候,会诱发更多的人为破坏。如果一个建筑出现破窗的时候及时修复,会受到更少破坏。 我们是否有这样的经历,当接手一个代码质量较差的项目,例如一个函数有上百行的代码,函数里有大量的if else,如果让你增加一个功能,你更倾向于直接在目标函数上加入你的改动代码,而不是通读该方法,再进行封装修改呢。 其实这样的修改方式,并没有错,也和个人能力没有关系,因为这种修改方式是最保险,最快捷的,他不但维持代码原有功能正常运行,还添加了新的功能。 但是,这样的项目,就是典型的破窗效应,因为第一个人产生了破窗,没有及时修复,后面来的人,就会更大胆的破坏,最终项目没法维护。 那如何避免项目形成破窗效应呢? 1、制定代码规范:尽量使用自动化工具实时检测,不要试图通过文档规范,文档一般都不会有人看的,前端集成eslint就最好了,vs code可以安装相应插件实时提醒。另外,可以加入git hook,对不符合规范对代码,拒绝进入代码仓库。 2、code review: 静态代码检测,只能检查语法问题,但是对于代码设计问题,需要code review进行纠正,code review可以利用gitlab 或者 github的 pull request模式,对需要合并到主分支的代码进行review。 3、控制圈复杂度:代码好坏的一个重要标准是,函数的圈复杂度,如果一个函数有大量分支,会让人很难理解,所以控制圈复杂度可以有效提高代码质量,vs code可以利用CodeMetrics这款插件实时检查。 4、控制代码重复率:《编写有效的单元测试》书中提到,重复的代码是造成代码bug提高很重要的因素,我们可以利用SonarQube对代码重复率进行扫描,删除重复代码或者对相近的代码进行封装。 5、自动化单元测试:很多人可能会觉得单元测试成本太高,为什么会产生这样的感觉呢,我觉得主要是大家把开发成本理解为开发功能所需要的时间,但是实际上,项目的成本,包含开发成本,维护成本,bug处理成本,代码二次开发成本。开发成本也许只占项目成本的10%,后面功能越是复杂,维护成本将会出现指数增长,前期不去控制复杂度,会给后期带来巨大的成本开销。 那如果已经是一个破烂不堪的项目,又如何拯救它呢? 1、eslint自动修复:还是上面说的代码规范,我们需要利用eslint进行老代码清理,使用eslint –fix命令,可以实行自动格式化。 2、质量仪表盘:如果你在一个团队工作,必须让大家形成共同目标,并能实时感知项目的状态,否则,你清理代码的速度远比不上创造坏代码的速度。SonarQube是你的好帮手,你可以利用他的仪表盘功能,每天查看项目是否有新增坏代码。 3、重构你的核心模块:如果你要经常修改的模块又是核心模块,建议你对其进行重构,重构时,利用单元测试进行覆盖,保障代码质量,同时,团队成本要进行review,防止把代码修改为你喜好的代码,而非大家能理解的代码。 4、使用率低的模块:对于使用率或者修改率较低的代码,就让他随风去把,时间会带走他的。

CentOS7.x 安装 k8s 集群 - 2019-08-21 11:51:05

环境:CentOS7.x 一、配置 hosts vi /etc/hosts 1.2.3.4 etcd-single 二、安装单节点 etcd 下载 wget https://github.com/etcd-io/etcd/releases/download/v3.3.11/etcd-v3.3.11-linux-amd64.tar.gz 安装 tar xzf etcd-v3.3.11-linux-amd64.tar.gz cd etcd-v3.3.11-linux-amd64 cp etcd* /usr/local/bin/ 配置 vi /usr/lib/systemd/system/etcd.service [Unit] Description=etcd [Service] Environment=ETCD_NAME=etcd-single Environment=ETCD_DATA_DIR=/web/etcd/data/etcd-single Environment=ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 Environment=ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 Environment=ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd-single:2380 Environment=ETCD_ADVERTISE_CLIENT_URLS=http://etcd-single:2379 Environment=ETCD_INITIAL_CLUSTER_STATE=new Environment=ETCD_INITIAL_CLUSTER_TOKEN=etcd-single Environment=ETCD_INITIAL_CLUSTER=etcd-single=http://etcd-single:2380 ExecStart=/usr/local/bin/etcd [Install] WantedBy=multi-user.target 启动 systemctl daemon-reload systemctl restart etcd 创建网络 etcdctl --endpoints http://etcd-single:2379 set /coreos.com/network/config '{"NetWork":"10.0.0.0/16","SubnetLen":24,"Backend":{"Type":"vxlan"}}' 三、安装 flannel 使用 yum 安装 安装 yum install flannel -y 配置