vue中watch的详细用法

在vue中,使用watch来响应数据的变化。watch的用法大致有三种。 1.最简单的watch用法 <input type="text" v-model="cityName"/> new Vue({ el: '#root', data: { cityName: 'shanghai' }, watch: { cityName(newName, oldName) { // ... } } }) 直接写一个监听处理函数,当每次监听到 cityName 值发生改变时,执行函数。 2.对象里的属性监听 immediate 当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。 比如当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true。 监听的数据后面写成对象形式,包含handler方法和immediate,之前我们写的函数其实就是在写这个handler方法 deep 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。 设置deep: true 则可以监听到cityName.name的变化,此时会给cityName的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性: watch: { 'cityName.name': { handler(newName, oldName) { // ... }, deep: true, immediate: true } } 数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听。

springboot2.0+websocket集成【群发消息+单对单】(二)

https://blog.csdn.net/qq_21019419/article/details/82804921 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_21019419/article/details/82804921 第二篇,主要是使用socketjs,stomp模式的websocket简单实现。 第一篇的地址:springboot2.0+websocket集成【群发消息+单对单】 参考: http://tech.lede.com/2017/03/08/qa/websocket+spring/ https://blog.csdn.net/mr_zhuqiang/article/details/46618197 继续上次的项目。如果对下面的代码有部分看不明白的,请到上一篇看看流程,或者到文末贴出项目的git地址。 1. 先从配置开始,WebStompConfig 代码中的注释基本能够解释清楚每行的意思了,这里就不再细说 完整代码 package com.example.websocketdemo1.stomp; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.ChannelRegistration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; /** * EnableWebSocketMessageBroker 注解表明: 这个配置类不仅配置了 WebSocket,还配置了基于代理的 STOMP 消息; * registerStompEndpoints() 方法:添加一个服务端点,来接收客户端的连接。将 “/chat” 路径注册为 STOMP 端点。这个路径与之前发送和接收消息的目的路径有所不同, 这是一个端点,客户端在订阅或发布消息到目的地址前,要连接该端点,即用户发送请求 :url=’/127.0.0.1:8080/chat’ 与 STOMP server 进行连接,之后再转发到订阅url; * configureMessageBroker() 方法:配置了一个 简单的消息代理,通俗一点讲就是设置消息连接请求的各种规范信息。 * * @author linyun * @date 2018/9/13 下午5:15 */ @Configuration @EnableWebSocketMessageBroker

沙漏验机官方最新版 v3.6.1

点击下载来源:沙漏验机官方最新版 v3.6.1 沙漏验机是一款功能强大、操作简单、使用方便的手机检验软件,是目前全球独创的验机神器,使用沙漏验机可以轻松对自己的手机进行检验,检验手机是否为正品,非常好用。它可以查看手机所有详细信息,例如手机序列号查询,是否激活、剩余空间、电池信息、手机序列号等内容,还可以清理手机空间。独创的验机功能,强大专业的刷机功能,设备颜色验机、底层指纹码和当前指纹码查看等强大功能,更多功能等你来发现。本站为用户提供沙漏验机官方最新版免费下载,是一款检验手机不错的软件,欢迎有需求的用户前来本站下载使用! 使用教程 沙漏验机怎么用 沙漏验机使用教程 1、安装软件后双击沙漏验机桌面快捷方式打开软件 2、现在给大家演示一下怎么使用沙漏验机检验自己的iPhone是否为正品原装手机,点击沙漏验机主界面中的沙漏验机,就可以开始对手机进行检验了 3、沙漏验机正在进行手机检验,检验需要一定的时间,请耐心等待 4、检验完成,手机没有异常 5、点击沙漏验机主界面中的导出,就可以将手机的信息导出到电脑中,点击保存就可以将手机信息txt文档保存到电脑中 6、手机信息导出成功,这时候沙漏验机会弹窗提示信息导出成功,点击确定就可以打开手机信息 功能特色 1、电源管理 一键重启,关机,进入恢复模式,退出恢复模式,再也不用那么麻烦的长按了 2、验机功能 行业首创,验机速度快速,结果清晰明了,买了新iPhone?试试沙漏验机吧 3、其他功能 文件管理,强力刷机,删除废图标,更全面的设备信息,还有更多… 更新日志 沙漏验机 v3.6.1更新日志:(2019-08-16) 新功能 1、地区信息增加汉化 修复 1、修复界面显示问题 2、修复DLL初始化问题 沙漏验机 v2.8.0更新日志: 1、支持第三方推流功能 2、支持手游投屏功能 3、支持你画我猜功能 4、修复了部分已知问题 特别说明 提取码:eugr

javascript打印交替换色99乘法表

<script> var table='<table border ="1">'; //99乘法表 for(var r=1;r<10;r++){ //奇数行 if(r%2==1){var tr='<tr class ="odd_color">'; //偶数行 }else{var tr='<tr class ="even_color">'; } for(var c=1;c<=r;c++){ tr +='<td>'+c+'*'+r+'='+r*c+'</td>'; } tr+='<tr>'; //拼接到table table+=tr } //把table的闭合标签拼接 var tab = table+'<table>' document.write(tab) </script>

Vim几种跳转方式

Vim几种跳转方式 ps: 以下时我常用的一些跳转指令,用于参考和复习记忆。还有一些后续会更新。 文件内跳转 移动光标 普通模式下左h,右l,上k,下j。(可以使用数字+hlkj,实现跳跃式移动)。 字符间跳转 跳转到当前字符的前面:普通模式下i。跳转到当前字符的后面:不同模式下a。 字符串间跳转 向右跳:普通模式下跳转到串首w,普通模式下跳转到串尾e。向左跳:普通模式下跳转到串首b,普通模式下跳转到串尾be(这个似乎没有专门的指令)。高亮文件内的某字符串所有出现处,并在高亮处跳转:先将光标移动值至目标字符串处按*。 高亮匹配结果中往下跳:n。高亮匹配结果中往上跳:N。 关闭高亮:noh。 行内跳转 跳转到行末:普通模式下键入$光标移至行末,普通模式下键入A光标移至行末且进入插入模式。跳转到行首:普通模式下键入0(^会忽略行首的空格,跳到第一个非空格字符处,0则跳到第一列)光标移至行首,普通模式下键入I光标移至行首且进入插入模式。跳转到行内某个字符(比如字符a):往后跳f + a,往前跳F + a。另外还有t键,往后跳到某字符前面t + a,往前跳到某字符后面T + a。 行间跳转 跳转到文件的首行:普通模式下gg。跳转到文件的尾行:普通模式下G。普通模式下跳转到指定行:100gg或者100G。命令模式下跳转到指定行: :100。 ps:以上两种形式都能跳转到文件的指定行(第100行)。跳转到文件的50%:50%。在可视行(可视行指Vim看起来是单独的一行,实际是某一行内容太多而换行显示,可视行不会累加行号。相对的就是实际行,实际行累加行号)间跳转:往上gk,往下gj。 符号间跳转 函数体间的跳转(注:只能跳到函数体开头,即{处)。 跳到上一个函数体:[[。调到下一个函数体:]]。 匹配字符{}、[]、()间的跳转:%。 屏幕移动(翻页) 保持光标位置不变(不变是相对的,当光标所在行超出光标可活动行范围时,光标保持在最上/最下可活动行)移动屏幕:向上翻页ctrl + y,向下翻页ctrl + e。滚动半屏:向上滚动半屏ctrl + u,向下滚动半屏ctrl + d。滚动一屏:向上滚动一屏ctrl + b,向下滚动一屏ctrl + f。 文件间跳转 Buffer缓存文件间跳转 跳转到下一个Buffer文件::bn。跳转到上一个Buffer文件::bp。 .h和.c文件间的跳转(此内容依赖于插件vim-scripts/a.vim) .h和.c文件切换::A。跳转到光标所在的问紧啊::IH,这个指令用来跳转到#include后面的文件很有用。 针对光标的跳转 光标历史位置往前(旧)调ctrl i。 光标历史位置往后(新)调ctrl o。 特殊位置标记的跳转(注意:以下这些跳转动作都只能在文件内,不支持跨文件跳转) 跳转到上次修改的地方:``.`。跳转到上次进入插入模式的地方:``^`。给文件某位置(这里的位置是你添加标记时的光标位置)添加标记后跳转。添加标记:m a~z,这里的a~z既能是大写也能是小写,是区分大小写的。跳转到某标记位置:a~z, 这个标记要是已经添加过的。 删除某个标记::delmarks a~z,删除全部标记::delmarks!。 有关语法的跳转(前提时ctags已经生成了标签) 跳转到定义处:ctrl ]。跳转到声明处:[然后ctrl i。

mavon-editor 使用教程,上传图片,以及配置, 并且接续存储的md格式的数据

mavon-editor是一款基于vue的markdown编辑器,比较适合博客系统。由于官网对于一些细节的说明不够详细,这里对这里对该编辑器的使用做一个总结。 安装 npm install mavon-editor --save 基本使用 在vue-cli构建的脚手架离得main.js可以像这样引用: // 全局注册 import Vue from 'vue' import mavonEditor from 'mavon-editor' import 'mavon-editor/dist/css/index.css' // use Vue.use(mavonEditor) new Vue({ 'el': '#main' }) 在具体的组件里html里定义挂载点 <div id="main"> <mavon-editor v-model="value"/> </div> 效果如下 图片上传: 先将挂在点里的方法写好,就像这样 <mavon-editor v-model="form.content" ref="md" @imgAdd="handleEditorImgAdd" @imgDel="handleEditorImgDel" /> @imgAdd @imgDel 分别是添加图片和删除图片 具体代码如下 handleEditorImgAdd (pos, $file) { let formdata = new FormData() formdata.append('file', $file) this.imgFile[pos] = $file let instance = this.$axios.create({ withCredentials: true, headers: { Authorization: token // 我上传的时候请求头需要带上token 验证,不需要的删除就好 } }) instance.

vue2 上传图片,使用axios发送FormData 格式数据,参数为空

最近在用vue2 做项目的时候碰到一个简单的上传图片功能,用的是axios ,用FromData 发送数据,但是发现参数从事穿不过去。 但是console.log 文件的时候明明是有的, 就算是设置 axios 的header headers:{ 'Content-Type':'multipart/form-data' } 还是不管用。而且还设置不上去,我信了你的邪哦,经过一番百度总算找到了答案, 是需要设置 withCredentials:true , 表示跨域请求时是否需要使用凭证. 默认为false 完整代码如下 authen(event) { event.preventDefault(); let formData = new FormData(); formData.append('fileUpload1',this.files); formData.append('fileUpload2',this.files2); formData.append('fileUpload3',this.files3); formData.append('uid',this.userID); formData.append('name',this.name); // 创建一个空的axios 对象 const instance=axios.create({ withCredentials: true // 如果发送请求的时候需要带上token 验证之类的也可以写在这个对象里 }) instance.post('http://pay.m6zf.com/index.php?s=/api/user/approved.html',formData).then(res=>{ if(res.code == 200){ alert('提交成功'); this.$router.push({ path: "/Profit" }); }else{ alert("请输入完整再提交"); } }) } 然后在请求就有数据了。

ubuntu16.04编译CEF的arm版

CEF介绍 Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。除了提供C/C++接口外,也有其他语言的移植版。来自百度百科。 各代码官网源码URL(需要梯子): cef: https://bitbucket.org/chromiumembedded/cef/src/master/ chromium: https://chromium.googlesource.com/chromium/src https://github.com/otcshare/chromium-src(与官网不完全相同,patch有些打不上) depot_tools: https://chromium.googlesource.com/chromium/tools/depot_tools.git install-build-deps.sh: https://chromium.googlesource.com/chromium/src/+/master/build/install-build-deps.sh automate-git.py: https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py 整体步骤: 下载源码depot_tools cef chromium #1 mkdir ~/cef/automate mkdir ~/cef/chromium_git下载安装依赖 #2 cd ~/cef curl ‘https://chromium.googlesource.com/chromium/src/+/master/build/install-build-deps.sh?format=TEXT’ | base64 -d > install-build-deps.sh chmod 755 install-build-deps.sh sudo ./install-build-deps.sh --arm #3 sudo apt-get install libgtkglext1-dev #4 cd ~/cef git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH=~/cef/depot_tools:$PATH #6 cd ~/cef/automate wget https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py配置环境变量执行 automate.py #7.1 #创建~/cef/chromium_git/update.sh脚本,将下面的内容写入update.sh脚本中 #!/bin/bash export CEF_USE_GN=1

Oracle中to_char()函数的用法

Oracle中to_char()函数的用法 日期转换: to_char(date,'格式') select to_date('2005-01-01 ','yyyy-MM-dd') from dual; select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual; 对时间戳,加上随机数 update tableName set TB_SAVETIME = TO_TIMESTAMP(to_char(TB_SAVETIME,'YYYY-MM-DD HH24:MI:SS')||to_char(dbms_random.value(0,5)/10000,'9.999999') , 'YYYY-MM-DD HH24:MI:SS.FF6') ; 处理数字: to_char(number,'格式') select to_char(88877) from dual; select to_char(1234567890,'099999999999999') from dual; select to_char(12345678,'999,999,999,999') from dual; select to_char(123456,'99.999') from dual; select to_char(1234567890,'999,999,999,999.9999') from dual; to_char(salary,'$99,99') select TO_CHAR(123,'$99,999.9') from dual; 用于进制转换:将10进制转换为16进制 select to_char(4567,'xxxx') from dual; select to_char(123,'xxx') from dual; 例子: 1 to_char 例子 2 输入 输出 3 to_char(now(),'Day, HH12:MI:SS') 'Tuesday , 05:39:18' 4 to_char(now(),'FMDay, HH12:MI:SS') 'Tuesday, 05:39:18' 5 to_char(-0.

MAC下安装nginx的正确姿势 实践笔记

MAC下安装nginx的正确姿势 实践笔记 我使用macOS Mojava 10.14.6版本 1.安装brew:官网地址:brew.sh 2.查找nginx版本3.安装nginx4.卸载nginx5.查看nginx安装信息(eg:安装目录)6.查看已安装的软件7.启动、停止、重启nginx(推荐)8.nginx原生常用命令启动、停止、重新加载配置文件(不推荐)9.查询nginx进程: 我使用macOS Mojava 10.14.6版本 1.安装brew: 官网地址:brew.sh /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 2.查找nginx版本 brew search nginx 3.安装nginx brew install nginx #默认是最新版本 #指定版本安装方式为:nginx@版本号 eg:brew install nginx@1.12.2 4.卸载nginx brew uninstall nginx brew uninstall nginx@版本号 5.查看nginx安装信息(eg:安装目录) brew info nginx #网页目录: /usr/local/var/www #默认配置文件:/usr/local/etc/nginx/nginx.conf #会被加载的配置文件: /usr/local/etc/nginx/servers/ 6.查看已安装的软件 brew list 7.启动、停止、重启nginx(推荐) brew services start nginx brew services stop nginx brew services restart nginx 8.nginx原生常用命令启动、停止、重新加载配置文件(不推荐) nginx #启动nginx nginx -s reload #重新加载配置文件 ,热加载配置文件 nginx -s quit #:推荐 待nginx进程处理任务完毕进行停止 nginx -s stop #:先查出nginx进程id再使用kill命令强制杀掉进程。 9.

Linux—进程间通信和同步(消息队列)

目录 消息队列 1. 消息缓冲区结构 2. 结构msgid_ds 3. 结构 ipc_perm 4. 内核中的消息队列关系 5. 键值构建ftok()函数 6. 获得消息msgget()函数 7. 发送消息msgsnd()函数 8. 接收消息msgrcv()函数 9. 消息控制msgctl()函数 4. 消息队列的例子 1. 显示消息属性的函数msg_show_attr() 2. 主函数main() 消息队列 消息队列是内核地址空间中的内部链表,通过Linux内核在各个进程之间传递内容。消息顺序地发送到消息队列中,并以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一地进行标识。内核中的消息队列是通过IPC的标识符来区别的,不同的消息队列之间是相对独立的。每个消息队列中的消息,又构成一个独立的链表。(进程间通信—IPC(Inter-Process Communication)) 1. 消息缓冲区结构 常用的结构是msgbuf结构。程序员可以以这个结构为模板定义自己的消息结构。在头文件<linux/msg.h>中,它的定义如下: struct msgbuf { long mtype; char mtext[1]; }; 在结构msgbuf中有以下两个成员。 □ mtype:消息类型,以正数来表示。用户可以给某个消息设定一个类型,可以在消息队列中正确地发送和接收自己的消息。 例如,在socket编程过程中,一个服务器可以接受多个客户端的连接,可以为每个客户端设定一个消息类型,服务器和客户端之间的通信可以通过此消息类型来发送和接收消息,并且多个客户端之间通过消息类型来区分。 □ mtext:消息数据。消息数据的类型为char,长度为1。在构建自己的消息结构时,这个域并不一定要设为char或者长度为1。可以根据实际的情况进行设定,这个域能存放任意形式的任意数据,应用程序编程人员可以重新定义msgbuf结构。 例如: struct msgbuf { long mtype; char mtext[10]; long length; }; 上面定义的消息结构与系统模板定义的不一致,但是mtype是一致的。 消息在通过内核在进程之间收发时,内核不对mtext域进行转换,任意的消息都可以发送。具体的转换工作是在应用程序之间进行的。 但是,消息的大小,存在一个内部的限制。在Linux中,它在Linux/msg.h屮的定义如下: #define MSGMAX 8192 消息总的大小不能超过8192个字节,这其中包括mtype成员,它的长度是4个字节(long 类型)。 2. 结构msgid_ds 内核msgid_ds结构—IPC对象分为3类,每一类都有一个内部数据结构,该数据结构是由内核维护的。对于消息队列而言,它的内部数据结构是msgid_ds结构。对于系统上创建的每个消息队列,内核均为其创建、存储和维护该结构的一个实例。该结构在Linux/msg.h中定义,如下所示。

H3C三层交换机之IRF虚拟化技术详解及配置

博文大纲: 一、IRF是什么?二、IRF技术的优点三、IRF的相关基本概念四、IRF的运行模式与配置方式五、IRF的角色选举六、IRF技术的配置详解七、IRF及MAD配置的显示及维护命令 一、IRF是什么? 目前,网络中主要存在两种结构的通信设备,固定盒式设备和模块框式分布式设备。固定盒式设备成本低廉,但没有高可用性支持;模块框式分布式设备具有高可用性、高性能、高端口密度的优点,但投入成本高。针对盒式设备和模块框式分布式设备的这些特点,一种结合了两种设备优点的IRF虚拟化技术应运而生。 IRF称之为智能弹性架构,是H3C自主研发的硬件虚拟化技术,它的核心思想是将多台设备通过IRF物理端口连接在一起,进行必要的配置后,虚拟化成一台“分布式设备”。使用这种虚拟换技术可以集合多台设备的硬件资源和软件处理能力,实现多台设备的协同工作、统一管理和不间断维护(简单说,IRF技术就是“硬件虚拟化技术”,将多个硬件设备虚拟化出一台更大的硬件设备)。 二、IRF技术的优点 1、简化管理 IRF架构形成之后,可以连接到任何一台设备的任何一个端口就以登录统一的逻辑设备,通过对单台设备的配置达到管理整个智能弹性系统以及系统内所有成员设备的效果,而不用物理连接到每台成员设备上分别对它们进行配置和管理。 2、简化业务 IRF形成的逻辑设备中运行的各种控制协议也是作为单一设备统一运行的,例如路由协议会作为单一设备统一计算,而随着跨设备链路聚合技术的应用,可以替代原有的生成树协议,这样就可以省去了设备间大量协议报文的交互,简化了网络运行,缩短了网络动荡时的收敛时间。 3、弹性扩展 可以按照用户需求实现弹性扩展,保证用户投资。并且新增的设备加入或离开IRF架构时可以实现“热插拔”,不影响其他设备的正常运行。 4、高可靠 IRF的高可靠性体现在链路,设备和协议三个方面。成员设备之间物理端口支持聚合功能,IRF系统和上、下层设备之间的物理连接也支持聚合功能,这样通过多链路备份提高了链路的可靠性;IRF系统由多台成员设备组成,一旦Master设备故障,系统会迅速自动选举新的Master,以保证通过系统的业务不中断,从而实现了设备级的1:N备份;IRF系统会有实时的协议热备份功能负责将协议的配置信息备份到其他所有成员设备,从而实现1:N的协议可靠性。 5、高性能 对于高端交换机来说,性能和端口密度的提升会受到硬件结构的限制。而IRF系统的性能和端口密度是IRF内部所有设备性能和端口数量的总和。因此,IRF技术能够轻易的将设备的交换能力、用户端口的密度扩大数倍,从而大幅度提高了设备的性能。 三、IRF的相关基本概念 1、角色 IRF中每台设备都称为成员设备,成员设备按照功能不同,分为两种角色: master:负责管理整个IRF。slave:作为master的备份设备运行,当master故障时,系统会自动从slave中选举出一个新的master接替原master工作。 master和slave均由成员设备选举产生。一个IRF中同时只能存在一台master,其他成员设备都是slave。 2、IRF端口:一种专用于IRF的逻辑结构,分为IRF-port1和IRF-port2,需要和IRF物理端口绑定之后才能生效。 3、IRF物理端口:设备上可以用于IRF连接的物理端口。IRF物理端口可能是IRF专用接口,以太网接口或者光口(设备上哪些端口可用作IRF物理端口与设备型号有关,要以实际情况为准)。通常情况下,以太网接口和光口负责向网络中转发业务报文,当它们与IRF端口绑定后就成为了IRF物理端口,用于成员设备之间转发报文。可转发的报文包括IRF相关协商报文及需要跨成员设备转发的业务报文。 4、IRF合并:两个IRF各自已经稳定运行,通过物理连接和必要的配置,形成一个IRF,这个过程就是IRF合并。 5、IRF分裂:一个IRF形成后,由于IRF链路故障,IRF中两相邻成员设备物理上不连通,一个IRF变成两个IRF,这个过程就是IRF分裂。 6、成员优先级:成员优先级是成员设备的一个属性,主要用于角色选举过程中确定成员设备的角色。优先级越高当选master的可能性越大,设备的默认优先级为1,如果想让某台设备当选master,则在组建IRF前,可以通过命令行手动提高该设备的成员优先级。 四、IRF的运行模式与配置方式 IRF的运行模式分为IRF模式和独立运行模式,设备出厂时默认处于独立运行模式。若在本次运行过程中,没有修改设备的运行模式,则下次启动会继续使用本次启动的运行模式;若在本次运行过程中,修改了设备的运行模式,则设备会自动重启,切换到新的模式。 当设备从独立模式切换到IRF模式后,即使只有一台设备也会形成IRF,因为管理和维护IRF也需要耗费一定的系统资源,所以,如果当前组网设中设备不需要和别的设备组成IRF,建议将运行模式配置为独立运行模式。 chassis convert mode irf命令用来将设备的运行模式切换到IRF模式。 五、IRF的角色选举 确定成员设备角色为master或slave的过程称为角色选举,角色选举会在拓扑变更的情况下产生,如IRF建立、新设备加入、master设备离开或故障等。 角色选举规则如下: 当前master优先(IRF系统形成时,没有master设备,所有加入的设备都认为自己是master,会跳转到第二条规则继续比较)。成员优先级大的优先。系统运行时间长的优先。桥(交换机设备)MAC地址小的优先。 从上面第一条开始判断,若判断的结果是多个最优,则继续判断下一条,直到找到唯一最优的成员设备才停止比较。此最优成员设备就是master,其他成员设备就都是slave咯。 关于IRF的相关理论知识还有它的工作原理、管理和维护及多IRF冲突检测(MAD功能)等等,这里就不说了(我懒),可以参考网络虚拟化IRF技术,这个链接上关于IRF介绍的很详细了。 下面来一个简单的网络环境应用一下IRF技术。 六、IRF技术的配置详解 1、环境如下: 2、需求分析: (1)由于H3C模拟器中无法模拟PC机,所以使用路由器代替。 (2)PC1及PC2分别属于vlan2和vlan3中,其各自对应的网关分别为192.168.2.1及192.168.3.1。配置在SW1和SW2上(SW1及SW2使用IRF技术虚拟化为一台三层交换机)。 (3)最终实现效果为:SW1和SW2宕掉其中任何一台,都不会影响PC1和PC2的通信。 3、开始配置: 1、首先配置基础部分(PC1、PC2、SW3及SW4): PC1配置如下: <H3C>sys //进入系统视图 [H3C]in g0/0 //进入接口 [H3C-GigabitEthernet0/0]ip add 192.168.2.10 24 //配置IP地址 [H3C-GigabitEthernet0/0]quit [H3C]ip route 0.0.0.0 0.0.0.0 192.168.2.1 //配置默认路由,相当于指定网关 PC2配置如下(相关配置和PC1类似,就不写注释了): <H3C>sys [H3C]in g0/0 [H3C-GigabitEthernet0/0]ip add 192.

雪花算法(04)机器信息

时间部分生成后,下一步是机器信息,占10位。我们这里把机器信息分成两部分,一部分是数据中心id,占5位,一部分是机器id,占5位。这两个id可以在部署项目的时候根据不同的机器自定义不同的id,这样能人为的保障每个id都不同。比如: /** 设置数据中心id为1 */ private static final long DATA_ID = 1L; /** 设置机器id为2 */ private static final long WORK_ID = 2L; 也可以根据自己机器的情况自动生成,不过有很小很小的风险会重复,这个风险碰到的几率不大,当然如果能手动设置还是最好的。我们来说一下自己生成的情况。 我们的jdk库中,有api可以获取本地机器的hostname和hostaddress,我们来看一下: 我们来把hostname的信息作为数据中心id,把hostaddress的信息作为机器id,如何把两个字符串改为两个数字id呢?其实很简单。获取字符串的字节数组,然后把数组的每个数字相加,对节点数的最大值取余: 每个id的长度都是5,二进制中5个1的最大值就是31,所以数据id和机器id每个的最大值也是31,下面是获取两个id的方法: 如果出现异常,返回一个随机数,保证id的可靠性。下面可以定义两个的id了: 因为机器信息分成了两部分分别生成的,所以,要分别位移,数据id要向左位移17位,机器id要向左位移12位。正好占据10位。 现在我们再来看下第二部分机器信息的限制,这两个id每个的值都占五位,二进制的值从 00000 到11111,整数的范围就是0-31之间共32个。那么雪花算法可以部署的机器数就是32*32=1024个,这是机器信息的限制,现在看这数字也是足足的够了。注意如果自己给这两个参数赋值,也要限制在31之内。 代码地址:https://gitee.com/blueses/snowflake-demo 04

java.lang.ClassNotFoundException问题的解决

作者:朱金灿 来源:https://blog.csdn.net/clever101 调试运行一个java项目出现错误,错误信息如下: 严重: Error configuring application listener of class [com.xxx.pie.client.xxx.xxx] java.lang.ClassNotFoundException: 怎么理解这个错误信息呢?我们知道java项目生成的jar文件实际上是class文件的集合。这个错误实际上是告诉我们class文件没找到。那么生成的class文件放在哪里呢?默认是放在WEB-INF\classes目录。我到一个目录下一看,原来是空的。那么为什么没生成呢?原因估计是有个工程在进行Valid(应该是js、html文件的校验),阻塞了编译线程。于是我重启了一个elipse,重新构建工程就好了。

吞吐量

吞吐量的计算公式 指单位时间内系统处理用户的请求数 从业务角度看,吞吐量可以用:请求数/秒、页面数/秒、人数/天或处理业务数/小时等单位来衡量 从网络角度看,吞吐量可以用:字节/秒来衡量

tinyMediaManager(媒体文件管理) 3.0.3

点击下载来源:tinyMediaManager(媒体文件管理) 3.0.3 tinyMediaManager是一款可用于搜索、筛选甚至排序收藏的电影、图片、音乐等多功能媒体文件管理软件,使用它,可以用它获得来自不同网站电影的所有相关元数据,非常方便。多功能媒体文件管理这款软件安装简单,界面简明,操作简单,功能强大,使用方便,欢迎大家下载使用! tinyMediaManager 安装方法 1、tinyMediaManager软件解压后,在安装之前,需先进行安装软件需要的组件或者操作环境,点击chromeinstall-8u131进行环境组件的安装 2、进入环境组件的安装向导界面,点击安装 3、正在进行下载安装的程序,请大家进行耐心的等待 4、环境安装完成之后,需要进行点击您需要进行安装的软件应用程序 使用方法 tinyMediaManager使用方法 从themoviedb.org,IMDB,ofdb.de,zelluloid.de获取数据,hd-trailers.net 创建NFO使用XBMC,MediaPortal 自动重命名文件和文件夹 movieset管理 组织电影收藏 对于moviesets集艺术品 支持NFO标签为XBMC,MediaPortal moviesets 电视节目管理: 发现电视节目和子目录-强大的集/季测试集 从thetvdb.com获取数据 创建使用NFO XBMC 多系统支持:Windows、Linux、Mac OSX 自动更新: 在启动时自动更新确保您一直有最新版本 功能特色 你可以用它获得来自不同网站电影的所有相关元数据。你方便的搜索、筛选和排序你收藏的电影、图片、音乐等等。 tinyMediaManager可以产生科迪和MediaPortal NFOs兼容以及进口NFOs写的其他工具从不同的媒体经理容易迁移。 tinyMediaManager是仅有500多KB大小的媒体文件管理软件,你可以用它获得来自不同网站电影的所有相关元数据。 你方便的搜索、筛选和排序你收藏的电影、图片、音乐等等。 电影管理 tinymediamanager能够下载元数据你的电影从各种在线网站,如电影数据库(IMDB ofdb TMDB),,,zelluloid,和moviemeter。 您可以检查的细节,原标题,流派,运行时,生产,口语,情节,船员,演员,媒体数据(如视频,音频,字幕),和媒体文件。 该实用程序下载多个图像,以便您可以选择首选的艺术品。此外,您可以为您的电影添加本地照片。 你可以下载你的电影预告片列表可通过电影数据库和hd-trailers.net,以及开放直接在您的Web浏览器的拖车。 更重要的是,你可以自由地使用不同的标准,如流派,认证,年份,丢失的元数据,缺少艺术品,缺少字幕,新电影和重复的电影过滤。当涉及到排序,您可以查看项目升序或降序顺序和标题,年,评级,运行时,或视频码率。搜索选项也在功能列表上。 tinymediamanager可以手动编辑元数据,生成XBMC和MP兼容NFOs,进口NFOs,命名的电影文件和文件夹,并更新所选电影的媒体信息。 电影的设置选项 如果你计划组织一些相互连接的项目,可以使用电影集。例如,你可以储存指环王收藏。此外,您可以设置艺术品和自动分配电影到电影集。 电视节目的特点 您可以导入您的电视节目的文件结构,并检测出的文件/目录名称的插曲和季节信息。此外,你可以将元数据和艺术品,手动更改元数据,以及写XBMC兼容NFOs。 特别说明 提取码:bfvy

接口测试与postman

一.接口测试: 接口测试即功能测试,实质是各种操作数据库。 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等 --百度百科 二.接口测试分类: 程序对外接口:从别的网站或服务器上获取资源的调用,比如某网站购物时,调用支付宝或微信或其他支付接口。 程序对内接口:程序内部方法直接的接口调用。比如电商平台的前台和后台之间接口调用,前台开发人员用HTML或CSS或JS等技术,后台开发人员用JAVA,PYTHON等语言,若用户从前台输入数据,怎样将数据传到后台呢?主要是通过http协议的get或post请求来实现前后端的数据传递,这些都是接口测试的一部分。 三.接口的组成: 1.接口说明文档; 2.接口url; 3.请求方法:post或get 4.请求参数、参数类型、请求参数说明; 5.返回参数说明; 由接口文档可知,接口至少应有请求地址、请求方法、请求参数(入参和出参)组成,部分接口有请求头header,cookie。 标头 (header):是服务器以HTTP协议传HTML资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔,一般存放cookie、token等信息 那么,header和入参有什么关系?它们不都是发送到服务器的参数吗? 首先,它们确实都是发送到服务器里的参数,但它们是有区别的,header里存放的参数一般存放的是一些校验信息,比如cookie,它是为了校验这个请求是否有权限请求服务器,如果有,它才能请求服务器,然后把请求地址连同入参一起发送到服务器,然后服务器会根据地址和入参来返回出参。也就是说,服务器是先接受header信息进行判断该请求是否有权限请求,判断有权限后,才会接受请求地址和入参的。 四.接口测试一般需要注意的点: 1.检查接口返回的数据是否与预期结果一致; 2.请求结果是否正确; 3.接口的安全性: a.绕过验证,比如说购买了一个商品,它的价格是300元,提交订单时,将商品的价格改成负数元,后端有没有做验证,那么这时是否余额会增加? b.绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,若传一个普通用户,能不能修改成功?或传一个其他的卖家能不能修改成功? c.参数是否加密,比如说登陆接口,用户名和密码是不是加密,如果不加密,别人拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。 d.密码安全规则,密码的复杂程度校验 4.参数组合: 现在有一个操作商品的接口,有个字段type,传1的时候代表修改商品,商品id、商品名称、价格有一个是必传的,type传2的时候是删除商品,商品id是必传的,这样就要测参数组合了,type传1的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。 5.异常验证: 所谓异常验证,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,传入字符串类型,长度是10的,传11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。 6.接口用例的设计举例: 五.请求状态码说明: 1、200 2开头的都表示这个请求发送成功,最常见的就是200,就代表这个请求是ok的,服务器也返回了。 2、300 3开头的代表重定向,最常见的是302,把这个请求重定向到别的地方了, 3、400 400代表客户端发送的请求有语法错误,401代表访问的页面没有授权,403表示没有权限访问这个页面,404代表没有这个页面 4、500 5开头的代表服务器有异常,500代表服务器内部异常,504代表服务器端超时,没返回结果 六.接口测试常用工具: 接口测试的工具很多,比如 postman、jmeter、loadrunner、SoapUI等,比较常见的是postman和jmeter。简介下postman和jmeter。 1.Postman是谷歌的一款接口测试插件,它使用简单,支持用例管理,支持get/post、文件上传、响应验证、变量管理、环境参数管理等功能,可以批量运行,并支持用例导出、导入。 2.jmeter是一款100%纯Java编写的免费开源的工具,它主要用来做性能测试,相比loadrunner来说,它内存占用小,免费开源,轻巧方便、无需安装,越来越被大众所喜爱。 七.postman: Postman是一种网页调试与发送网页http请求的chrome插件。我们可以用来模拟get或者post或者其他方式的请求来调试接口。常见模拟场景有:get请求、post/k-v、post/json、添加cookie、添加header、上传文件。分别举例介绍。 1.get请求传参: 接口文档说明如下: 因为是get请求,因此可以直接在浏览器访问,当然也可以使用postman请求,浏览器直接访问: postman模拟get请求调用接口:点击Params,输入参数及value,可输入多个用&连接,即时显示在URL链接上,所以,GET请求的请求头与请求参数如在接口文档中无特别声明时,可以不填。另外,注意HTTP状态码和请求的耗时,HTTP状态码是200时,代表这个接口请求是正确的。 2.post请求--表单提交,以key-value形式传参,接口介绍如: 使用postman来模拟post请求,form-data提交,它是网页表单用来传输数据的默认格式,可以模拟填写表单,并且提交表单。 3.post请求--模拟上传文件。接口信息: 使用postman来模拟post请求,form-data提交,可以上传一个文件作为key的value提交。但该文件不会作为历史保存,只能在每次需要发送请求的时候,重新添加文件。如: 4.post请求--提交json。接口说明如下: 使用postman来模拟post请求,入参是json,当我们选择了JSON(application/json)时,postman会在Headers自动设置了Content-Type,如图: Headers里自动添加Content-Type:application/json: 当然,提交json时,也可以选择Text,如图: 5.post请求--添加cookie。接口文档说明如下: 使用postman来模拟post请求,依据接口文档得知需求,该接口访问时需添加cookie,请求方式:post,输入url,Body 中选取"form-data" 格式,输入所需的key-value,再在Headers里写入Cookie值(上面接口文档写明:cookie中key为登录的用户名,value从登录接口中获取,登陆成功之后会返回sign), 点击"Send", 即可在"Response" 中查看返回的结果: 输入key,value页面:

CDN(内容分发网络)技术简介

个人总结:CDN是一个包括了分布式存储、负载均衡、网络请求的重定向和内容管理4个组件的整体系统 下面描述来自网络:https://www.idcjia.net/a18264411.html 内容分发网络(Content delivery network或Content distribution network,缩写:CDN)是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。 CDN是一个包括了分布式存储、负载均衡、网络请求的重定向和内容管理4个组件的整体系统,它的主要思想就是把内容资源从网络中心分发到离用户距离较近(或者别的条件)的网络边缘地带,利用其负载均衡技术将用户访问请求重定向到边缘服务器上,减小访问的响应时间,减缓骨干网络的压力。一个CDN网络主要由边缘节点构成。 之前Steam在国内经常出现网络错误的原因就是CDN的问题:由于国家出台了相关规定,Steam不能使用曾经在国内架设的CDN(国内的CDN不能给未经备案的网站提供服务),因此针对国区更换为了境外的CDN,这就引发了一系列的访问问题。 CDN的缺点在于其扩展性差,CDN服务器容易成为系统的瓶颈。 P2P(点对点网络)技术简介 对等式网络(peer-to-peer, 简称P2P),又称点对点技术,是无中心服务器、依靠用户群(peers)交换信息的互联网体系,它的作用在于,减低以往网路传输中的节点,以降低资料遗失的风险。与有中心服务器的中央网络系统不同,对等网络的每个用户端既是一个节点,也有服务器的功能,任何一个节点无法直接找到其他节点,必须依靠其户群进行信息交流。 P2P网络是一种共享网络,其中每个节点都是服务的供应者和接受者,每个节点都共享自己一部分硬件资源(计算能力、存储能力、传输能力等)。 P2P的缺点也就因此凸显了出来:难以监管,盗版和乱七八糟的东西没法管制,而且还会“偷”网速(比如以前的迅雷)。 PCDN(P2P+CDN) 我们可以发现CDN和P2P的优缺点实际上是互补的,因此就有把这两种技术结合起来使用的想法。 例如采用上层CDN下层P2P的网络架构。在CDN的基础上(仍然由中心服务器发给边缘服务器),在边缘服务器引入可管理的P2P自治区,由边缘服务器(可能是多个)和用户们组成,这样既能监管内容,也可以降低骨干网络的压力。 还有一种就是在边缘服务器间建立P2P架构,就是把CDN服务器以P2P的方式连接起来,降低中心节点的负载。

网站出现502错误nginx 414 Request-URI Too Large解决方法

最近https://www.cftr.net/网站迁移服务器,用的lnmp环境,迁移到新的环境后不断出现502错误。 网站出现502错误nginx 414 Request-URI Too Large解决方法 经排查,是因为脚本超时时间(max_execution_time):设置的太短,调到900s,子进程max_children调到1000 网站正常运转了。 没过几天,采集出现问题了,甚至出现514 错误,还有nginx 414 Request-URI Too Large和unix:/tmp/php-cgi.sock failed (2: No such file or directory 经排查。调整了Nginx以下几个参数, 客户端请求头缓冲区大小,如果请求头总长度大于小于128k,则使用此缓冲区, #请求头总长度大于128k时使用large_client_header_buffers设置的缓存区 client_header_buffer_size 128k; #large_client_header_buffers 指令参数4为个数,128k为大小,默认是8k。申请4个128k。 large_client_header_buffers 4 128k; 当http 的URI太长或者request header过大时会报414 Request URI too large或400 bad request错误。 fastcgi_connect_timeout 900; fastcgi_send_timeout 900; fastcgi_read_timeout 900; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fasrcgi链接超时时间太短会导致unix:/tmp/php-cgi.sock failed (2: No such file or directory出现错误。 PHP调整了以下参数: socket超时时间(default_socket_timeout):180s 经过以上调整,网站已经可以持续运行了。 除非注明,否则均为乐海购原创文章,转载请以链接形式标明本文地址 本文链接:https://www.lehaigou.com/2019/0809209993.shtml

内核调试 /proc/kmsg 和 dmesg

dmesg 打印内核启动过程的所有信息,/proc/kmsg也是打印内核的信息, 但是与dmesg 有不同, 第一次执行/proc/kmsg 打印到目前位置的所有内核信息,再次执行/proc/kmsg, 不打印打印过了的信息,打印第一次执行之后的信息,下面举个例子: 第一次执行dmesg打印: A B C 第一次执行/proc/kmsg打印: A B C 第二次执行dmesg打印: A B C D 第2次执行/proc/kmsg打印: D 依次类推。 --------------------- 版权声明:本文为CSDN博主「zlcchina」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/zlcchina/article/details/24195331