QT: 样式表(stylesheet)

QT: Style Sheet QT 样式表的使用可以很方便定制化自己的界面风格。它的使用方法很类似于HTML中的样式表(CSS)。 样式表是一些列的格式规则组成。一条格式规则由一个选择器(selector)和一个声明组成: 其中选择器指定了对哪些控件起作用;声明语句指定了哪些属性进行了定制化。下述示例中QPushbutton是选择器, 花括号中的语句是声明,它是由一些键值对组成,各个键值对之间利用分号分割 。注意 样式表对大小写不敏感。同样地, 在一个声明语句前可以同时存在多个选择器, 各个选择器之间通过逗号风格就可以了。 QPushButton { color: red} 选择器类型 一些列举了一些常用的类型选择器。具体可以参考此处。 选择器示例说明通用选择器*匹配所有的空间类型选择器QPushButton匹配所有的QPushButton类及其子类的实例属性选择器QPushButton[flat=“false”]匹配所有QPushButton属性flat为false的实例类选择器.QPushButton匹配所有的QPushButton类的实例ID选择器QPushButton#okButton匹配所有的object name为okButton的QPushButton实例派生选择器QDialog QPushButton匹配所有的QDialog的子(/孙)控件中的QPushButton子选择器QDialog>QPushButton匹配所有的QDialog子控件中的QPushButton 子控件 对于一个复杂的控件, 为了对其样式进行定制就有必要能够访问其子控件, 比如下拉框的下拉按钮等。在选择器的后面添加子控件选项, 就可以对控件中的子控件进行定制化。示例如下: QComboBox::drop-down{ image: url(dropdown.png)} 子控件的放置位置永远是相对于一个参考控件(父控件)的, 这个父控件也可以是另外一个子控件。例如QComboBox的::drop-down 默认是放置在QComboBox的padding 矩形的右上角位置, 而::drop-down子控件的::drop-down 是默认放置在content 矩形的中心位置。这个放置位置可以通过 subcontrol-origin属性来设置。例如: QComboBox { margin-right: 20px;} QComboBox::drop-down { subcontrol-origin: margin} 同时, 子控件的位置可以设置为相对位置 (与初始化的位置相比较)。而绝对位置的变化是相对于参考控件来进行改变。 QComboBox::down-arrow { image: url(down_arrow.png);} QComboBox::down-arrow:pressed { position: relative;top: 1px; left: 1px;} 一旦子控件的位置进行了确定,那么它就可以利用 box model 的相关属性来进行定制化。子控件的变化会引起其他所有的子控件做出相应的变化,因此定制化一个子控件意味着对所有的自控件做出了改变。更多子控件列表可以参考此处。 ###伪态 选择器可以根据应用的状态包含伪装态以做出不同的变化。伪态常常出现在选择器的最后,用冒号进行分隔。甚至伪态可以非、与、或。更多伪态列表可以参考此处。 QPushButton:hover { color: white } QRadioButton:!

keil 5 : Error: L6218E: Undefined symbol 问题解决方法小记

最近学习嵌入式开发,因项目框架较大,部分内容改动,在将别人单独写的串口读取数据源码添加到工程中后,编译出现以下问题: 通过查询资料,都是在说未定义引下的错误。 回头检查项目,源文件加入到工程,头文件也已包含。而后多次尝试编译,未果;关闭重启,亦未果。。。 询求正点原子技术支持,远程协助,还是未能解决。。。 编译通不过,调试无法进行,苦恼一天。。。。 后来,多次将源文件多项目中删除后重新添加,无意间发现,项目中的源文件既有*.c,也有*.cpp,也就是说有的是用C语言写的,有的是用C++写的程序。于是乎,上网查了下在keil中两种语言的使用区别,发现keil工程同时有c文件和CPP文件时,c文件的函数在cpp文件中是无法直接访问的。 也就是说,正常的include“”xxx.h“”那肯定是不行的,编译会提示说未定义错误。原来如此!!!我的工程是C++文件调用C文件中的函数,所以即使源文件添加了,也出现未定义错误。根据网上提供的解决方法,将 #include "XXX.h" 改为 extern "C" { #include "XXX.h" } 然后再编译, 0 Error(s), 0 Warning(s). OK !! 总结: 1.一般情况下,Error: L6218E: Undefined symbol 若是由于未定义引起的错误,可以根据错误提示定位到相应的问题行,然后将相应的函数进行定义即可,网上大多也都是针对这种情况下的未定义错误进行解答; 2.如未将.c/.cpp源文件添加到工程中,也会出现此错误; 3.若工程中已经添加了源文件,也包含了相应的头文件,依然出现错误 Error: L6218E: Undefined symbol ,则检查是否是由于在Keil中混用C和c++引起的。这种情况下,除了像上述那样在源文件中包含头文件外,还可以在头文件中使用 #ifdef __cplusplus extern "C" { #endif void xxxxx(xxx) #ifdef __cplusplus } #endif 这样的条件编译,在源文件中直接使用#include ""包含头文件亦可。

标签中的字体颜色随机生成

**获取标签中的文字,使文字颜色随机生成** 结果展示html部分随机获取数组中的色值***实现的功能: *** 步骤如下总结 结果展示 html部分 <div class="box"> <div class="box-center"> <div class="box-left"> <div class="box-two"> <div class="app-txt"> 那些年我们很好~ </div> </div> </div> </div> 随机获取数组中的色值 ***实现的功能: *** 获取标签中的内容,从数组中随机获取一个色值,使标签中的内容前面四个字为一个随机色值,后面的内容为一个随机色值。 步骤如下 用each遍历获取相同className中的内容;从数组中随机获取一个色值;将获取的文字内容去除空格,进行切分,分为两部分,第一部分为4个字,后面整体为一部分;从数组中随机再获取一个色值,判断两个色值不一样;js动态设置文字颜色;切分的两部分文字进行拼接;渲染到页面上。 // 随机颜色 var color= ["#D0021B", "#417505", "#9013FE", "#002EFA", "#417505", "#9013FE", "#8b572a", "#002EFA", "#BD10E0", "#ff5a00", "#3FA536", "#B92281"]; //遍历获取相同classname中的内容 $('.app-txt').each(function(index,dom){ var txt=$(this).html(); //去除内容中的空格 var txt=txt.replace(/\s*/g,""); //对内容进行切分 var txt4=txt.substring(0, 4) var end=txt.substring(4,end); //从数组中随机获取 //此时获取的是色值所在数组中的序号 var col=Math.round(Math.random()*color.length) var col2=Math.round(Math.random()*color.length) //判断两个色值是否一样 if(col!=col2){ //对文字进行颜色设置 //拼接两段文字 //渲染到界面上 var txt4=$(this).html("<font color="

js的replace()方法的用法,以及replace替换含有 '$1'的string字符串的解决方案

replace替换对应的字符串 stringObject.replace(regexp/substr,replacement) replacement 可以是字符串,也可以是函数。 1、当replacement是字符串的时候 let str = 'I am me, I not me'; str = str.replace('I','he');// 部分替换 console.log(str); // he am me, I not me str = str.replace(/me/g,'he');// /g 是全局替换 console.log(str); // he am he, I not he 2、当需要替换的字符串是正则表达式的时候 let str = '10.00,22,20.11'; str = str.replace(/\d+(\.\d+)?/,'$10.00'); // /\d+(\.\d+)?/ 这个正则表达式是表示带小数的数字,例如:10.00 //中文货币符号替换成美元货币符号 console.log(str); // .000.00,22,20.11 这个时候发现,replace把10.00替换成$10.00的时候,却变成了 .000.00 原因是因为 $1 是切割正则表达式的第一个括号 (\.\d+),所以就分成了两步 第一步:(/\.\d+/) = '$1' ===> $1 = '.00' 第二步:'$10.00' = '$1' + '0.

数字图像处理复习总结

复习着感觉记不住,于是乎,有了这篇博文,如果也同样选修了数字图像处理课程的小伙伴们可以参考一哈! 纯手码字…逢考必过! 概念 采样与量化 灰度变换缓慢的景物:粗采样、细量化有大量细节变化的图像:细采样、粗量化 采样不够出现马赛克;量化不够出现假轮廓 锐化:突出灰度的过渡部分(增强图像的细节边缘和轮廓,有利于图像的处理) 方法:微分法和高通滤波微分法包括梯度算子法和拉普拉斯算子法;高通滤波包含空域高通滤波和频域高通滤波 平滑:用于模糊处理和降低噪声 例:低通滤波、均值滤波、中值滤波(属于局部处理) 平滑和锐化 区别:图像锐化用于增强图像边缘,导致高频分量增强,会使图像清晰;图像平滑用于消除图像噪声,但也容易引起边缘的模糊 联系:都属于图像增强,改善图像效果 图像增强:通过某种技术有选择的突出对某一具体应用有用的信息,削弱或抑制一些无用的信息 基于图像的灰度直方图,根据所在空间不同,分为空域和频域两种常用的彩色增强有:真彩色增强技术、假彩色增强技术、伪彩色增强技术 一阶微分:用梯度算子来计算 特点:对于亮的边,边的变化起点是正的,结束是负的;对于暗的边,结论相反;常数部分为0用途:用于检测图像中边的存在 二阶微分:用拉普拉斯算子来计算 特点:二阶微分在亮的一边是负的,在暗的一边是正的。常数部分为0用途: 二次导数的符号,用于确定边上像素是亮的一边还是暗的一边。0跨越,确定边的准确位置 一阶微分算子和二阶微分算子在提取图像细节信息时有何不同? 一阶微分算子产生较粗的边缘,二阶微分算子处理对细节有较强的响应,如细线和孤立点。二阶微分有一个过度,即从正回到负。在一幅图像中,该现象表现为双线。 点处理: 例:二值化 灰度方差:说明图像对比度(方差小,对比度小;方差大,对比度大) 直方图均衡化:对在图像中像素的个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减,从而达到清晰图像的目的。 图像分割的结果图像为二值图像,所以通常又称为图像分割为图像的二值化处理 腐蚀是一种消除连通域边界点,使边界向内收缩的处理 膨胀是将与目标区域背景点合并到该目标物中,使目标物边界向外部扩张的处理 只存在噪声的复原——空间滤波 均值滤波器: 算术均值滤波器(最简单的均值滤波器)几何均值滤波器(几何均值滤波器比算术减少了对图像的模糊)谐波均值滤波器(对于"盐"噪声较好,但不适用于"胡椒"噪声;善于处理高斯噪声)逆谐波均值滤波器 统计排序滤波器: 中值滤波器(过度重复使用可能会对图像造成模糊)最大值和最小值滤波器(对于胡椒噪声(暗,值非常低),用最大值滤波器,发现图像中最亮点非常有用;对于盐粒噪声,用最小值滤波器,发现图像中最暗点非常有用)中点滤波器修正后的阿尔法均值滤波器 由于脉冲噪声(椒盐噪声)的存在,算术均值滤波器和几何均值滤波器没有起到良好作用;中值滤波器和阿尔法滤波器效果更好,阿尔法最好。 共点直线群的Hough变换是一条正弦曲线 边缘检测是将边缘像元识别出来的一种图像分割技术 细化:提取线宽为一个像元大小的中心线操作 图像复原的关键是建立退化模型,原图像f(x,y)是通过一个系统H及加入加性噪声n(x,y)而退化成一幅图像g(x,y)的, g ( x , y ) = H [ f ( x , y ) ] + n ( x , y ) g ( x , y ) = H [ f ( x , y ) ] + n ( x , y ) g(x,y)=H[f(x,y)]+n(x,y)

二维坐标系中的向量旋转公式

1、在二维坐标系中,一个向量可以使用三角函数来表示,左图中的向量用三角函数表示为: x0 = |R| * cosA y0 = |R| * sinA 2、右图是将左图中向量逆时针旋转B之后得到的向量,它的向量可表示为: x1 = |R| * cos(A + B) = |R| * cosA * cosB - |R|* sinA * sinB y1 = |R| * sin(A + B) = |R| * sinA * cosB + |R| *cosA * sinB 将1中的式子带到2中可以化简成下面这样: x1 = x0*cosB - y0*sinB y1 = y0*cosB + x0*sinB 当旋转方向是逆时针时,B取负值,如果旋转方向是顺时针方向,则B取正值 3、下图是一个例子,它是将向量v逆时针旋转a,得到向量v0,v0的向量表示为如下,这里不用管K,他是一个比例系数

ProtoBuf序列化和反序列化方法

最近公司需要将以前的协议全都改成ProtoBuf生成的协议,再将结构体打包和解包过程终于到一些问题 ,无法使用Marshal.SizeOf计算结构体大小,最后找了一下ProtoBuf的文档,可以用它自带的序列化和反序列化方法解决问题。 下面分享一下方法吧。 1 /// <summary> 2 /// 将消息序列化为二进制的方法 3 /// </summary> 4 /// <param name="meg">要序列化的对象</param> 5 /// <returns></returns> 6 public static byte[] Serizlize(object meg) 7 { 8 try 9 { 10 //涉及格式转换,需要用到流,将二进制序列化到流中 11 using (MemoryStream ms = new MemoryStream()) 12 { 13 //使用ProtoBuf工具的序列化方法 14 ProtoBuf.Serializer.Serialize(ms, meg); 15 16 //定义二级制数组,保存序列化后的结果 17 byte[] result = new byte[ms.Length]; 18 //将流的位置设为0,起始点 19 //ms.Seek(0, SeekOrigin.Begin); 20 ms.Position = 0; 21 //将流中的内容读取到二进制数组中 22 ms.Read(result, 0, result.

spark运行报错:java.io.IOException: Connection reset by peer

大神们,请看下这个错误!!! 2019-01-02 15:43:55 [ rpc-server-3-3:318175 ] - [ WARN ] Exception in connection from /10.216.44.41:56770 java.io.IOException: Connection reset by peer at sun.nio.ch.FileDispatcherImpl.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) at sun.nio.ch.IOUtil.read(IOUtil.java:192) at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288) at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1106) at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:343) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:123) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138) at java.lang.Thread.run(Thread.java:748) 2019-01-02 15:43:55 [ dispatcher-event-loop-1:318178 ] - [ INFO ] Removed broadcast_25_piece0 on hbwy38:14873 in memory (size: 355.

SpringSecurity和wangeditor上传图片时403

SpringSecurity和wangeditor上传图片时403 上传图片之前设置xhr editor.customConfig.uploadImgHooks = { before: function (xhr, editor, files) { **var token = $("meta[name='_csrf']").attr("content"); var header = $("meta[name='_csrf_header']").attr("content"); xhr.setRequestHeader(header, token);** // 图片上传之前触发 // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件 }, success: function (xhr, editor, result) { }, fail: function (xhr, editor, result) { }, error: function (xhr, editor) { }, timeout: function (xhr, editor) { }, customInsert: function (insertImg, result, editor) { // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!) // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果 // 举例:假如上传图片成功后,服务器端返回的是 {url:'.

Mac Mini换固态硬盘

新年新气象,今天来把mini升级下,换个固态硬盘。 mini型号: A1347 , 2013版 材料: 固态硬盘一个,螺丝刀一套(里面需包含六角T6、T8和M2的螺丝刀),U盘一个,拨片一个。如图: 一.将U盘做成苹果系统盘 1.先去apple store下载系统:搜索macos,会看到当前的系统,直接下载即可。如 2.插入U盘,格式化成mac日志格式 打开 “应用程序 → 实用工具 → 磁盘工具”,将U盘「抹掉」(格式化) 成「Mac OS X 扩展(日志式)」格式、GUID 分区图,并将U盘命名为「Sierra」。 3.打开终端,参考如下命令,具体路径换成本机的实际路径 sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/SIERRA 执行该命令后,等待一会儿。 Ready to start. To continue we need to erase the volume at /Volumes/SIERRA. If you wish to continue type (Y) then press return: y Erasing disk: 0%... 10%... 20%... 30%... 100% Copying to disk: 0%... 10%... 20%... 30%... 40%... 50%.

程序养生

程序员的职业病 程序员的职业生涯中,健康问题尤为突出。随着时间的流逝,梦想可能渐渐暗淡,激情可能慢慢消退,但是,有一点却很肯定,我们的身体大不如前,视力下降,腰疼,颈椎病,失眠,神经衰弱,此类慢性疾病接踵而来。 身体是自己的,也是一辈子的事情,我向来不建议为了事业,而牺牲身体。身体的还是有很强的自我修复能力,小病不用看,大病看不好这是目前的医疗现状。那年我曾因为工作生活压力大而胸闷,去过一个知名的中医院,吃了2个月的中药也不见效,中医虽好,可是良医难遇。求人不如求己,自己的身体自己锻炼。 想要健康的生活,心态很重要,长期生活在焦虑中,身体状况是不可能好的。随着年纪的增长,心态会慢慢发生变化,对名利也不会看得很重。平淡真实过着每一天,寡忧寡欲,减少对各种欲望的需求,坚持锻炼身体。西方医学认为纵欲只是流失了蛋白质,水,碳水化合物等一些物质,身体还会自动修复,这种理论不对,一滴精十滴血,这个过程为消耗人体的先天元气,元精。,长期的这样,人的先天元气逐渐损失,身体就会越来越差,身体素质抵抗力下降,各种小毛病会找上门来。 从健康角度来看,程序员这个职业有几个不利的因素产生的职业病 1.长时间静坐 长时间的静坐导致身体血液流通不顺畅,经常引起身体颈椎,腰椎疼痛。 2.脑力的消耗 要不停地接收新知识,新算法,持续脑力消耗会造成偏头痛。 3.压力 工作压力,家庭压力;赶项目要经常加班,由于程序员工资偏高,并且工作时间较长,所以另一半要考虑顾家,这也是为什么经常听到程序员因压力过大而跳楼的原因(普遍在35岁以上)。 4.长时间的专注 编程时需要长时间地专注在某一个问题上,所以对眼睛的伤害也很大。 5.电脑的辐射 程序员一定要与电脑打交道(云计算人员可能要接触到服务器,那种辐射更大) 到去年我从事软件开发工作近十年了,平时没有体育运动,长年的伏案工作导致肩背不适。在今年初尤为明显,腰部凉,上班坐八个小时腰疼,肩膀上脖子两侧的肌肉疼。去年底吃了两瓶六味地黄丸没有见到效果,索性不再吃药了。自找方法,自求健康。 程序员的养生功法--易筋经 感恩中国传统的文化和养生健身方法,遇到了易筋经这神奇的功法,经中所说,强筋健骨尤小效,灵丹一粒种心苗。我想只要勤奋,坚持练习,至少能收到强身健体的效果。从年初到现在练习易筋经已有300天,中间由于工作偶有间断,总体还是坚持练习下来,现在每天晚上练习正身图到翻身图一遍。 易筋经动作的入门,从开始练习正身图时,踮脚都站不稳,小腿抖动,通过不断的努力,加强练习,正身图动作做下来,踮脚站稳。半身图开始练时马步站不住,从高位马步入手,外八字站,慢慢的坚持,从前三式到前六式,慢慢加功最后能一气呵成站下半身图,四个月下来,掌握了正身图到翻身图的动作,动作虽不标准,但体力上可以一气呵成的做下来。下半年练习的过程中学习贴吧和群中的师兄的练功心得和体会,进行一些动作方面的校正,正身图双脚平行,踮脚站立,勾尾闾顶命门,半身图中马步双脚平行,两膝向外撑,找到了开胯的感觉。练功又有了一些进步。 易筋经的呼吸入门,开始练习时就知道呼吸要保持慢,匀,绵,那时动作不熟,体力不强,很难做到呼吸缓慢,均匀。先从学习动作架式开始,呼吸自然,等动作熟练,体力上升,慢慢调整呼吸到慢,匀,绵。练习到现在大部分动作做可以做到呼吸慢,匀了。 易筋经的心境入门,心境很难做好,练习到现在也只是进步了一点,刚开始练习时内心杂念纷飞,无法平静,按经中所说:壹志凝神,即用想一个念头来代替万念,慢慢的做到了心中一念,心中有所平静,平时读读《心经》、《道德经》、《金刚经》练练心性,静静心,一年下来练功时心里平静了不少。 易筋经的功效,初步收到了强身健身的效果,现在上班坐一天腰不疼了,每天再坚持练习易筋经,腰部没有疼的感觉,最近一 个月每次练完功后后腰冰凉,冒凉气,可能是腰部排寒气,但是还是不能太长时间久坐用腰。肩膀上面的锁骨处的肌肉不疼了。身体抵抗力提高,今年冬天有两次感冒症状一天就好,往年感冒都得一周才好,还有一个比较明显的变化就是体重下降,我身高170厘米,体重从去年140斤体重下降到130斤。练易初获强身功效,还得继续坚持、加强深入练习。 持续编程,持续养生 以后的工作生活,秉持着持续编程就要持续养生的原则,编程不止,易筋不止。程序员的你们,如果开始入行,或正在路上,你们都会或早或晚的遇见这些职业病,如若相信经典,坚持练习定会还你一个强健的身体。程序猿们一起来易筋吧!

Linux初认识(二)

1. 图形登陆模式 普通用户: username:student ( password:student 超级用户: username: root password:redhat 登陆方式: not listed---->root---->redhat 2. 文本界面登陆 Red Hat Enterprise Linux Server 7.0 (Maiop) #系统版本 Kernel 3.10.0-123.el7.x86_64 on an x86_64 #内核版本 desktop0 login: <-----输入用户名称 passwd: <-----输入密码(输入密码为了安全没有回显) 3. 当图形出现问题 ctrl + alt + f2 进入到虚拟控制台(F2-F6) 回到图形 (F1 F7) 超级用户登陆 输入init 3 ##关闭图形 超级用户登陆 输入init 5 ##开启图形 4.在Linux中如何运行命令 命令 参数 目标 ls -s test ls --size test 注意: 1).参数用来指定命令的某些功能,可以加也可以不加 2).命令和参数和目标之间要空格分开 3).参数中“-”表示单词的缩写,“- -”表示单词的全拼 4).在执行命令时通常遵循这些规则,特殊情况除外

CentOS7安装mysql (2)修改默认密码

1、安装完成后启动mysql:service mysqld start 2、登录mysql:mysql -uroot -p,发现需要输入密码,可是我们安装没有设置过密码,直接回车也报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO),莫方 3、开启mysql免密登录,vi /etc/my.cnf [mysqld]下添加 skip-grant-tables ,保存后重启mysql服务:service mysqld restart 4、mysql -uroot -p重新登录,这时不需要密码了,然后执行修改密码SQL: update mysql.user set authentication_string="new pwd" where user="root"; 其中new pwd处改为自己的密码 5、退出重新修改/etc/my.cnf ,删除免密登录配置skip-grant-tables,重启mysql服务:service mysqld restart 6、使用新密码登录:mysql -uroot -p

查看文件夹下文件个数,子文件夹中文件个数

当前文件夹下 ls -l |grep "^-"|wc -l 子文件夹 for f in *; do [ -d ./"$f" ] && find ./"$f" -maxdepth 1 -exec echo \; | wc -l && echo $f; done linux统计文件夹下文件个数 https://www.cnblogs.com/digittube/p/6159292.html 写博客记录下自己在开发中遇到的点点滴滴,对自己的学习技术,梳理难点还是有很大帮助的 第一次写博客,还是从简单的入手吧 实习时写了一个下载图片的程序,下载完之后要统计下载的图片个数(按uid分文件夹存储的,每天大约1000多个uid) 统计某当前目录下的文件个数: ls -l | grep "^-" | wc -l 统计当前目录下的文件个数(含子文件夹): ls -lR | grep "^-" | wc -l 统计当前目录下文件夹个数: ls -l | grep "^d" | wc -l 解释一下各个命令:ls -l列出目录下的所有文件,R参数表示递归子目录,grep "^-"表示筛选出文件,grep "^d"表示筛选出文件夹,wc -l 表示统计行数

rem自适应布局

原文链接:http://caibaojian.com/web-app-rem.html 摘要:rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个px字号,则可以来算出元素的宽高。本文讲的是如何使用rem实现自适应。 rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了。但是我对rem综合评价是用来做web app它绝对是最合适的人选之一。 rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。· 为什么web app要使用rem? 这里我特别强调web app,web page就不能使用rem吗,其实也当然可以,不过出于兼容性的考虑在web app下使用更加能突显这个单位的价值和能力,接下来我们来看看目前一些企业的web app是怎么做屏幕适配的。 1、实现强大的屏幕适配布局: 最近iphone6一下出了两款尺寸的手机,导致的移动端的屏幕种类更加的混乱,记得一两年前做web app有一种做法是以320宽度为标准去做适配,超过320的大小还是以320的规格去展示,这种实现方式以淘宝web app为代表作,但是近期手机淘宝首页进行了改版,采用了rem这个单位,首页以内依旧是和以前一样各种混乱,有定死宽度的页面,也有那种流式布局的页面。 我们现在在切页面布局的使用常用的单位是px,这是一个绝对单位,web app的屏幕适配有很多中做法,例如:流式布局、限死宽度,还有就是通过响应式来做,但是这些方案都不是最佳的解决方法。 例如流式布局的解决方案有不少弊端,它虽然可以让各种屏幕都适配,但是显示的效果极其的不好,因为只有几个尺寸的手机能够完美的显示出视觉设计师和交互最想要的效果,但是目前行业里用流式布局切web app的公司还是挺多的,看看下面我收集的一些案例: 2.固定宽度做法 还有一种是固定页面宽度的做法,早期有些网站把页面设置成320的宽度,超出部分留白,这样做视觉,前端都挺开心,视觉在也不用被流式布局限制自己的设计灵感了,前端也不用在搞坑爹的流式布局。但是这种解决方案也是存在一些问题,例如在大屏幕手机下两边是留白的,还有一个就是大屏幕手机下看起来页面会特别小,操作的按钮也很小,手机淘宝首页起初是这么做的,但近期改版了,采用了rem。 3.响应式做法 响应式这种方式在国内很少有大型企业的复杂性的网站在移动端用这种方法去做,主要原因是工作大,维护性难,所以一般都是中小型的门户或者博客类站点会采用响应式的方法从web page到web app直接一步到位,因为这样反而可以节约成本,不用再专门为自己的网站做一个web app的版本。 4.设置viewport进行缩放 天猫的web app的首页就是采用这种方式去做的,以320宽度为基准,进行缩放,最大缩放为320*1.3 = 416,基本缩放到416都就可以兼容iphone6 plus的屏幕了,这个方法简单粗暴,又高效。说实话我觉得他和用接下去我们要讲的rem都非常高效,不过有部分同学使用过程中反应缩放会导致有些页面元素会糊的情况。 <meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no"> rem能等比例适配所有屏幕 上面讲了一大堆目前大部分公司主流的一些web app的适配解决方案,接下来讲下rem是如何工作的。 上面说过rem是通过根元素进行适配的,网页中的根元素指的是html我们通过设置html的字体大小就可以控制rem的大小。举个例子: html{ font-size:20px; } .btn { width: 6rem; height: 3rem; line-height: 3rem; font-size: 1.2rem; display: inline-block; background: #06c; color: #fff; border-radius: .

【Anaconda】'conda' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题:'conda' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 环境:WIN10+Anaconda3 原因分析:可能是环境变量没有添加(在安装时,没有点击Add to Path 选项,因为下面写的not recommend) 解决办法: 1.找到Anaconda3的安装路径 C:\Users\XXX\Anaconda3 C:\Users\XXX\Anaconda3\Scripts 2.添加环境变量 右键我的电脑--属性--高级系统设置--高级--环境变量 找到系统变量中的Path变量,双击或者点击编辑。 将找到的安装路径加到Path中。 3.检查是否成功 已经可以正常使用。 注意上述操作是使命令在base环境下可以使用,如果要在虚拟环境中使得命令可以使用,还要将虚拟环境添加到环境变量中。比如: C:\Users\XXX\Anaconda3\envs\tensorFlow C:\Users\XXX\Anaconda3\envs\tensorFlow\Scripts

lua require绝对路径文件时 module not found解决方法

lua进行require绝对路径时,会从package.path中进行遍历 print(package.path)会得到类似下面的结果: --> "lualibs/p4ulibs/?.lua;lualibs/?.lua;lualibs/?/?.lua;lualibs/?/init.lua;" 故我们可以通过对package.path修改, 来让lua对我们的个人路径进行包含 假设我们的路径为/var/test/test1.lua package.path = package.path..";/var/test/?.lua" local test1 = require("test1") 即可.

节点层次(DOM学习的第一天)

DOM可以将任何HTML或XML文档描绘成一个由多层节点构成的结构。节点分为几种不同的类型,每种类型分别表示文档中不同的信息及(或)标记。每个节点都拥有各自的特点,数据和方法,另外也与其他节点存在某种关系。节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构。以下面的HTML为例: <html> <head> <title>Simple Page</title> </head> <body> <p>Hello World!</p> </body> </html> 可以将这个简单的HTML文档表示为一个层次结构,图10-1所示 文档节点是每个文档的根节点。在这个例子中,文档节点只有一个子节点,即<html>元素,我们称之为文档元素。文档元素是文档的最外层元素,文档中的其他所有元素都包含在文档元素中。每个文档只能有一个文档元素。在HTML页面中,文档元素始终都是<html>元素。在XML中,没有预定义的元素,因此任何元素都可以成为文档元素。 每一段标记都可以通过树中的一个节点来表示:HTML元素通过元素节点表示,特性(attribute)通过特性节点表示,文档类型通过文档类型节点表示,而注释则通过注释节点表示。总共有12种节点类型,这些类型都继承自一个基类型。

装完虚拟机后、虚拟机可以ping通主机、可是主机ping不通虚拟机的问题

很多同学在装完虚拟机后会ping不通虚拟机的ip、这可能是有几个问题导致的 1:没有配置Host-Only 网卡(NAT是与主机共享网络然后连接外网的、Host-Only是与主机通信的),这是配置Host-Only网卡即可 设置完毕之后如果发现还是无法ping通、这是因为win虚拟机对应的网卡IP默认的是自动获取、在没有指定的情况下默认是 169.254.0.0网段下面的B类地址、与主机设置的192.168.10.100不在同一个网段下(linux下好像不是)。 linux 主机网卡配置: vboxnet0 Link encap:以太网 硬件地址 0a:00:27:00:00:00 inet 地址:192.168.10.100 广播:192.168.10.255 掩码:255.255.255.0 inet6 地址: fe80::800:27ff:fe00:0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1 接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0 发送数据包:1423 错误:0 丢弃:0 过载:0 载波:0 碰撞:0 发送队列长度:1000 接收字节:0 (0.0 B) 发送字节:200976 (200.9 KB) 从而导致主机与虚拟机的ip不在同一个网段(与子网掩码相与判断),所以ping的时候就没有这个路由协议、就解析不了IP地址、所以ping不通。 解决办法有两个: 1:绑定静态路由协议:找到虚拟机的对应网卡IP,例如是(164.111.111.111), 在主机执行命令 route add 164.111.111.111 主机网关 即可、linux 下用 route 命令查看是否绑定成功、windows好像是 route PRINT,这种办法一重启就没了、下面介绍第二种方法 2:上面说到原因是因为他们网段不在同一个所以无法ping通、这时手动指定虚拟机的ip即可: win + R、输入 control, 点开网络和共享中心 更改适配器设置、右键点击自己设置的host-only网卡的网络,属性, 双击 INternet 协议版本4 选中 使用下面的IP地址、我这边主机的IP设置的是192.

JavaScript常用操作,常用类

算术运算符 重点关注 算数,赋值,逻辑运算符,三目运算符 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>运算符</title> </head> <body> 运算符 </body> <script> // 算术运算符 // + | - | * | / | % | ++ | -- console.log(5 / 2); // 2.5 // 取整 console.log('%d', 5 / 2); // "2" var num = parseInt(5 / 2); // 2 console.log(num); // 取模(求余) console.log(5 % 2); // 1 // 任何一个自然数对 n 取余, 结果为 [0, n-1] // 自增|自减 ++|-- // ++就是自增1, --就是自减1 var num = 10 console.

CAS5.2x单点登录(十二)---------使用redis进行存储ticket

之前我们已经说过了cas的基本操作,我们cas中连个比较重要的东西一个是tgt一个就是st,而我们也知道cas默认的tgt以及st是存储在内存中的。但是假如我们需要部署cas的集群的话,那么这种方式显然不能达到我们的要求。 因此参考cas的文档我们可以看到关于cas对我们提供的几种存储ticket的方式 而对于我们集群我们通常用的最多的就是使用redis来进行操作。我们这节也将会使用redis来存储我们的ticket。 首先我们需要找到官方文档中对redis引用的介绍。 引入redis存储的maven依赖 <dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-redis-ticket-registry</artifactId> <version>${cas.version}</version> </dependency> 然后查看redis的配置,如下图所示 我们在application配置文件配置上面的内容,我这边的配置如下所示 cas.ticket.registry.redis.host=localhost cas.ticket.registry.redis.port=6379 cas.ticket.registry.redis.database=0 cas.ticket.registry.redis.use-ssl=false cas.ticket.registry.redis.use-pool=false cas.ticket.registry.redis.timeout=2000 然后我们重新打包并部署。然后运行起来,然后去登录cas,登录成功后,我们去redis下面看下是否存储了我们的ticket 到这里我们已经完成了ticket的redis话,其实这种目的的好处就是对于集群时候共享ticket。为了程序的健壮性,我们往往需要部署集群,因此内存存储ticket的方式是行不通的。而redis或者jpa存储ticket的好处就是可以在集群中共享。

修复 j-link "the connected j-link is defective" 警告

一、现象 j-link ob 提示 “the connected j-link is defective” 警告,每次下载都需要点击确定关闭,另外单步调试经常死机。 二、解决方法 参考这篇帖子。 具体就是修改 IAR 安装路径下的 JLinkARM.dll 文件。路径为:D:\Program Files (x86)\IAR Systems\Embedded Workbench 7.5\arm\bin。KEIL 同理。 用UltraEdit打开JLinkARM.dll,查找85 C0 75 77 6A 01 E8, 发现只搜到一处,将75改成EB后保存。

图像卷积和池化操作后的特征图大小计算方法

一,卷积操作 若图像为正方形:设输入图像尺寸为WxW,卷积核尺寸为FxF,步幅为S,Padding使用P,经过该卷积层后输出的图像尺寸为NxN: 若图像为矩形:设输入图像尺寸为WxH,卷积核的尺寸为FxF,步幅为S,图像深度(通道数)为C,Padding使用P,则: 卷积后输出图像大小: , , 输出图像的通道数=C 注意:Padding的作用用于解决图像边缘信息损失的问题 如same:(same模式只有步长为1时,输入和输出的尺度才相同) 输入特征图为5x5,卷积核为3x3,外加padding 为1,则其输出尺寸为 二,池化操作 设输入图像尺寸为WxH,其中W:图像宽,H:图像高,D:图像深度(通道数),卷积核的尺寸为FxF,S:步长 池化后输出图像大小: 池化后输出图像深度为D 当进行池化操作时,步长S就等于池化核的尺寸,如输入为24x24,池化核为4x4,则输出为 若除不尽,则取较小的数,如池化核为7x7,则输出为,不是用四舍五入,就是取最小的整数,即使为3.9,也是 取3 三,空洞卷积(也称扩张卷积,膨胀卷积)--dilated convolution 其中 d为空洞卷积的空洞率(正常的卷积d=1),p为padding,k为kernel size 举个例子: 下面的空洞卷积核是d=2,k=2的空洞卷积卷积核。 当d=2,k=2时,-d(k-1)-1 = -3,即相当于 一个k=3的正常卷积核。下图的正好是3x3的。

Mac mini 2018 win10 外接显卡终极教程

Mac mini 2018 win10 外接N卡应该算是最简单了。但是有些小问题,比如说总是需要插拔雷电3的线材,对于强迫症或者偏执来说总是感觉不爽。 一种解决方案是用refind 启动方法,将refind 目录拷贝到EFI目录下。 win 10 下挂载EFI 分区的一个非常好的简便的方法就是, 先用diskgenius 给EFI分区分配一个盘符。然后在任务管理器- 文件-运行新任务-浏览里面就能打开EFI分区了。随后我们就可以将refind 拷贝到这里。然后在在旁边新建一个custom文件夹,将apple_set_os.efi 文件夹放入custom 文件夹下。随后我们用easyuefi 工具将refind_x64.efi 文件设置为第一个启动。 开机之后,就进入了 refind 的引导界面,这时候,我们要先点击apple_set_os 这一项,然后进入win10 。 就可以核显和独显一起启动了。貌似这样就完美了,但是很蛋疼的是有时候,独显启动不了,进入系统还要插拔一下雷电3 的线材。而且每次都要选择一下,这个过程很不爽。 第一个改进的地方是: 将refind 启动项改为默认 apple_set_os 然后timeout 改为-1,则可以省略一个步骤。 进入refind 界面之后直接用键盘移动光标就可以进入win10 系统了。 后来想了想,如果一直用win10 系统的话,我们其实可以直接将apple_set_os 在UEFI中设置为第一个,然后windows_boot_loader 设置为第二个,这样,系统就默认先进入apple_set_os 然后就在进入win10 。这样就也不用refind 界面去选择了。很方便。 接下来,为了降低epgu 在win10 中没有启动的几率,只连接独显上的显示器接口即可。这样保证每次都能启动 起来外置显卡。 值得注意的是重启之后,没有问题。关机之后,再启动也无缝能启动外置显卡。但是关机之后不要马上再开机。如果马上再开机,有一定的几率启动不起来。等个1分钟之后,就绝对能启动起来了。经过多天的使用与体验,觉得这种方法对于外置GPU来讲应该是最好不过的了。使用感良好。如果想让机器一直放着,减少雷电3 接口的拔插次数,无疑应该这么做。

router中的params和query的区别

const routes = [ { name: 'users', path: '/users/:id', component: Users }, { path: '/books', component: Books } ] // params使用场景 router.push('/users/123') // 跳转时 router.push({ // 另一种方式跳转 name: 'users', params: { id: 123 } }) // 获取id route.params.id // 123 // 实际URL地址 => localhost:8080/users/123 // query使用场景 router.push('books?q=123') // 跳转时 router.push({ // 另一种方式跳转 path: '/books', query: { q: 123 } }) // 获取query route.query.q // 123 // 实际URL地址 => localhost:8080/books?q=123 转载于:https://www.

Unity 之 打包PC端参数 -- 打包不输出日志

PC端打包参数: Inspector – > PlayerSettings Company Name:设置公司名称 Product Name:设置项目名称,这个获取窗体句柄的时候用的到 Default Icon:默认的exe图标,更改打包好的exe文件的icon Default Cursor:默认的鼠标图标,就是更改鼠标样式 Cursor Hotspot:鼠标热点坐标 Resolution and Presentation:分辨率和演示 Default Is Full Screen: 是否全屏 Default is Native Resolution:是否自动设置分辨率,(勾选:自动匹配分辨率,没勾选:则会弹出两个参数设置窗体的高度和宽度。) Run in BackGround:当程序失去焦点后是否继续运行。(是否在后台运行) Standalone Player Options:独立播放 Capture Single Screen:捕获单屏,(勾选:单屏幕显示,第二显示器变暗;不勾选:可以在分屏中显示) Display Resolution Dialog:是否显示选择分辨率的框,(Disabled 禁用 Enabled 启用 Hidden by default默认隐藏) Use player Log: 写入带有调试信息的日志。 Resizable Window: 打成窗口模式后是否可以拖动窗体边界。 Mac App Store Validation:开启Mac应用商店验证。 Visible In Background:如果Visible In Background这个选项不挑勾的话,那每当打开文件,或者我切换到别的窗口时,U3D程序会自动最小化。 但是如果这个选项挑勾的话,则U3D程序就会像一个Windows窗口一样置后,但不会最小化。 Force single Instance:同时只允许打开一个程序。 Supported Aspect Ratios :支持的宽高比

利用.htaccess绑定子域名到子目录

利用.htaccess绑定域名到子目录,前提你的空间服务器必须支持apache的rewrite功能,只有这样才能使 用.htaccess。如果你的空间是Linux服务器 一般默认都开启了的。 首先在本地建个txt文件,复制下面的代码修改替换你要绑的域名和目录,并传到网站主目录下再改成为.htaccess。 下面是以 music.xmgho.com 绑定到子目录music为例的.htaccess代码. <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # 绑定music.xmgho.com 到子目录music RewriteCond %{HTTP_HOST} ^music\.xmgho\.com$ [NC] RewriteCond %{REQUEST_URI} !^/music/ RewriteRule ^(.*)$ music/$1?Rewrite [L,QSA] #可以绑定多个 只需重复上三行代码并更改一下域名、目录名 就好了 </IfModule> 如果你以完成上面的步骤 你的子域名应该可以访问了 但你会发现在浏览器上访问 主域名+绑定的域名目录 也可以访问,可这并不是我们想要的 接下来我们完成最后一步;在每一个绑定的目录中 如music目录中 也增加一个 .htaccess 文件 .htaccess代码如下: <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / #只许绑定的域名访问 RewriteCond %{HTTP_HOST} !^music\.xmgho\.com$ [NC] RewriteRule (.*) http://music.xmgho.com/$1 [L,R=301] #对绑定目录下与 同名的目录的处理 RewriteCond %{REQUEST_URI} ^\/music\/ [NC] RewriteCond %{QUERY_STRING} !^(.*)?Rewrite RewriteRule ^(.*)$ /%{REQUEST_URI}/%{REQUEST_URI}/$1?Rewrite [L,QSA] </IfModule> 完成以上步骤,你会惊喜发现已经达到你想要效果了。

使用docker部署基于selenium和chrome-headless的爬虫

无论是测试还是爬虫的一些工作,有时候都会用到selenium去对chrome执行自动化操作,这里介绍一下如何使用docker快捷方便的部署相关应用。 1. selenium+chrome镜像 通过docker search selenium我们发现,有一个docker镜像叫做selenium/standalone-chrome。 看名字应该是包含了selenium和chrome,按照之前的方式我们是在本机上直接调用webdriver控制chrome,而在虚拟机上我们可以使用远程调用。 先翻一下官方文档,发现有两种启动方式: $ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:3.141.59-dubnium #OR $ docker run -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome:3.141.59-dubnium 这里看到镜像名称后面有标签,如果pull的是latest版本的话那么可以忽略。 2. 启动selenium+chrome服务 现在我们测试启动selenium+chrome服务。 执行下面的语句启动容器: docker run -d -p 4444:4444 --shm-size=2g selenium/standalone-chrome 这里容器暴露了一个4444端口用于连接,使用一下python代码(命名为spider.py)连接selenium服务,生成webdriver: from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities driver = webdriver.Remote( command_executor="http://127.0.0.1:4444/wd/hub", desired_capabilities=DesiredCapabilities.CHROME ) driver.get("http://www.baidu.com") print(driver.title) driver.close() 执行前要确保python3环境中安装了selenium: pip install selenium 然后执行代码,返回以下结果说明访问容器成功: 百度一下,你就知道 3. 使用python镜像 现在我们还在本机上执行python代码,有时候也足够了,如果想要在docker上一键部署python+selenium+chrome的话,请继续往下面看。 先pull一个alpine3.6版本的python镜像: docker pull python:alpine3.6 然后根据我们的需求,定制一下这个python镜像,这里我们在里面安装好selenium就行了,所以编写如下的Dockerfile:

Spark 2.4.0编程指南--Spark SQL UDF和UDAF

Spark 2.4.0编程指南–Spark SQL UDF和UDAF 更多资源 github: https://github.com/opensourceteams/spark-scala-maven-2.4.0 视频 Spark 2.4.0编程指南–Spark SQL UDF和UDAF(bilibili视频) : https://www.bilibili.com/video/av38193405/?p=4 width="800" height="500" src="//player.bilibili.com/player.html?aid=38193405&cid=67137841&page=4" scrolling="no" border="0" allowfullscreen="true"> 文档 (官网文档): http://spark.apache.org/docs/2.4.0/sql-getting-started.html#aggregations 前置条件 已安装好java(选用的是java 1.8.0_191)已安装好scala(选用的是scala 2.11.121)已安装好hadoop(选用的是Hadoop 3.1.1)已安装好spark(选用的是spark 2.4.0) 技能标签 了解UDF 用户定义函数(User-defined functions, UDFs)了解UDAF (user-defined aggregate function), 用户定义的聚合函数UDF示例(统计行数据字符长度)UDF示例(统计行数据字符转大写)UDAF示例(统计总行数)UDAF示例(统计最大收入)UDAF示例(统计平均收入)UDAF示例(统计按性别分组的最大收入)官网: http://spark.apache.org/docs/2.4.0/sql-getting-started.html#aggregations UDF 用户定义函数(User-defined functions, UDFs)是大多数 SQL 环境的关键特性,用于扩展系统的内置功能。 UDF允许开发人员通过抽象其低级语言实现来在更高级语言(如SQL)中启用新功能。 Apache Spark 也不例外,并且提供了用于将 UDF 与 Spark SQL工作流集成的各种选项。 用户定义函数(User-defined functions, UDFs)UDF对表中的单行进行转换,以便为每行生成单个对应的输出值 ##示例 得到SparkSession BaseSparkSession /** * 得到SparkSession * 首先 extends BaseSparkSession * 本地: val spark = sparkSession(true) * 集群: val spark = sparkSession() */ class BaseSparkSession { var appName = "

深度学习: ILSVRC竞赛(ImageNet竞赛)

参考:https://blog.csdn.net/jningwei/article/details/80026826 ILSVRC比赛 即我们所说的 ImageNet比赛 。 Large Scale Visual Recognition Challenge (ILSVRC): 由于深度学习技术的日益发展,使得机器视觉在ILSVRC的比赛成绩屡创佳绩,其错误率已经低于人类视觉,若再继续举办类似比赛已无意义,是故大家对电脑视觉技术的期待由相当成熟的 image identification 转向尚待开发的 image understanding 。 ILSVRC 2017 已是最后一届举办。2018年起,将由WebVision竞赛(Challenge on Visual Understanding by Learning from Web Data)来接棒。WebVision所使用的dataset抓取自浩瀚的网络,不经过人工处理与label,难度大大提高,但也会更加贴近实际运用场景。 正是因为ILSVRC 2012挑战赛上的AlexNet横空出世,使得全球范围内掀起了一波深度学习热潮。这一年也被称作“深度学习元年”。此后,ILSVRC挑战赛的名次一直是衡量一个研究机构或企业技术水平的重要标尺。因此,即使ILSVRC挑战赛停办了,但其对深度学习的深远影响和巨大贡献,将永载史册。 历届冠军做法: 参考: http://www.image-net.org/challenges/LSVRC/ ILSVRC 歷屆的深度學習模型

关于umi的一些基本配置

蚂蚁金服的ant design是一个很好的前端框架封装,但是在使用的过程中往往会遇到一些配置问题,比如使用ant design pro 3.0以上版本时,它采用了新的umi作为底层架构,在这里做一些它的配置简单的记录。 plugins Type: ArrayDefault: [] export default { plugins: [ 'umi-plugin-react', // When the plugin has parameters, it is an array, and the second item of the array is a parameter, similar to the babel plugin. ['umi-plugin-react', { dva: true, }], ], }; routes Type: ArrayDefault: null 配置路由,如果配置了 routes,则约定式路由会不生效。 disableRedirectHoist 类型:Boolean默认值:false 禁用 redirect 上提。 出于一些原因的考虑,我们在处理路由时把所有 redirect 声明提到路由最前面进行匹配,但这导致了一些问题,所以添加了这个配置项,禁用 redirect 上提。 history Type: StringDefault: browser 类型:String 默认值:browser

Android Dialog弹出方式动画

//自定义Dialog class myDialog extends Dialog{ private Window window = null; public myDialog(Context context) { super(context); } public void showDialog(int layoutResID, int x, int y){ setContentView(layoutResID); windowDeploy(x, y); //设置触摸对话框意外的地方取消对话框 setCanceledOnTouchOutside(true); show(); } //设置窗口显示 public void windowDeploy(int x, int y){ window = getWindow(); //得到对话框 window.setWindowAnimations(R.style.dialogWindowAnim); //设置窗口弹出动画 window.setBackgroundDrawableResource(R.color.vifrification); //设置对话框背景为透明 WindowManager.LayoutParams wl = window.getAttributes(); //根据x,y坐标设置窗口需要显示的位置 wl.x = x; //x小于0左移,大于0右移 wl.y = y; //y小于0上移,大于0下移 // wl.alpha = 0.6f; //设置透明度 // wl.gravity = Gravity.BOTTOM; //设置重力 window.

红黑树(Red-Black Tree)图文解析

文章目录 红黑树简介红黑树的应用红黑树的基本操作——左旋和右旋红黑树的基本操作——添加红黑树的基本操作——删除红黑树的C++实现C++程序运行结果 红黑树简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它是一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。 红黑树的特性: (1)每个节点要么是黑色,要么是红色。 (2)根节点为黑色 (3)每个叶子节点(NIL)均为黑色。[注:这里的叶子节点指的是空(NIL或者NULL)的叶子节点!!!] (4)如果一个节点是红色的,那么它的子节点必须是黑色的。 (5)从一个节点到该节点的子孙节点NIL的所有路径上包含相同数目的黑节点。[注:这里指到叶子节点的路径] 特别说明: ①特性(3)中的叶子节点,指的是只为空(NIL或NULL)的节点。 ②特性(5),确保没有一条路径会比其他路径长出两倍。因为,红黑树是相对接近平衡二叉树。 红黑树示意图如下: 红黑树的应用 红黑树的应用十分广泛,以至于我们多多少少了解一些总是有好处的。红黑树可以用来储存有序数据[1],时间复杂度是O(logn),效率非常高。 例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树实现的。 红黑树的基本操作——左旋和右旋 红黑树虽然特殊,但它也是一种树类型的数据结构,少不了增删查这类的操作。但在介绍添加、删除之前,我们需要先介绍一下旋转操作,这主要是出于对红黑树特性的考虑。毕竟在删除或者添加节点之后,很有可能会破坏原有的红黑树结构特性,这时候旋转操作就必不可少了,这和AVL树有一点点相像。总而言之,旋转的目的是让树保持红黑树的特性。 旋转包含两种:左旋和右旋。下面会分别进行介绍。 1.左旋 对节点F进行左旋,意味着将节点F变为其右孩子节点R的左孩子节点,并将节点R的左子树变为节点F的右子树。可参考下图进行理解(此处暂时忽略节点的颜色问题): 对左旋稍微有点概念之后,可以结合伪代码进行理解“如何对节点x进行左旋”。 LEFT-RORATE(T, x) y ← right[x] //前提条件: 假设x的右孩子是y。下面开始正式操作 right[x] ← left[y] //将 “y的左孩子” 设为 “x的右孩子”,即 将β设为F的右孩子 p[left[y]] ← x //将 “x” 设为 “y的左孩子的父亲”,即 将β的父亲设为F p[y] ← p[x] //将 “x的父亲” 设为 “y的父亲” if p[x] = nil[T] then root[T] ← y //情况1: 如果 “x的父亲” 是空节点,则将y设为根节点 else if x = left[p[x]] then left[p[x]] ← y //情况2: 如果x是它父节点的左孩子,则将y设为“x的父节点的左孩子” else right[p[x]] ← y //情况3: (x是它父节点的右孩子) 将y设为 “x的父节点的右孩子” left[y] ← x //将 “x” 设为 “y的左孩子” p[x] ← y //将 “x的父节点” 设为 “y” 理解左旋之后,不妨进行一个小测验吧,如下图所示是红黑树操作过程的某个状态,现在我们要对节点0040进行左旋,自己动手尝试一下吧,答案点这里哟[2]。

LSTM预测股价的APP

根据之前的代码:LSTM预测股票收盘价做了一点修改。 首先收集数据: import tushare as ts import pandas as pd def get_data(code, date): #数据准备/data preparation #变量选取Open,High,Low,Close,Volume等,以浦发银行股票为例 pro = ts.pro_api('f3bbc97d0ffbbed8666e6f7c82e712165950d048987f5d6cfbf1e0ce') #token可以在新版tushare的网站上找到 stock_data = pro.query('daily', ts_code = code, start_date = '20000101', end_date = date) stock_data = stock_data[::-1] #倒序,使日期靠前的排在前面 stock_data.reset_index(drop=True, inplace=True) #把每行的索引改为“0、1、2……” return stock_data 然后进行预处理: import numpy as np from sklearn.preprocessing import MinMaxScaler def preprocess(stock_data, day, seq_length, data_dim, output_dim, visual_window): xy = stock_data[['open', 'close', 'high', 'low', 'vol', 'pct_chg', 'amount']] #选取需要的features xy = np.

vue中上传图片转base64处理,并向后台发送处理...;

1. 上传图片时:pc端正常可以传多张图片;手机端只能一张一张上传;(可以完善); 使用前端框架有:WeUi,vant ; style: /*改造上传图片 */ .applay-uploadimg .weui-uploader__bd{ margin-bottom: 0;margin-right: 0; } .applay-uploadimg .weui-uploader__input-box{width: 100px; height: 100px;} .applay-uploadimg .weui-uploader__file { margin-right: 15px;position: relative;width: 100px; height: 100px;} .applay-uploadimg .weui-uploader__file .upload-del{padding-top: 3px;position: absolute;right: 0px;bottom: 0;width: 100%;background-color: rgba(0,0,0,.5);} html:代码: <!-- 身份证照片 --> <div class="van-cell van-field"> <div class="van-cell__title"> <span>身份证照片</span> </div> <div class="van-cell__value font-size12 font-metud mt-5"> 大小不超过3M,最多上传2张! </div> </div> <div class="posrev bg-white applay-uploadimg"> <div class="weui-uploader__bd plr-15"> <ul class="weui-uploader__files" id="uploaderFiles"> <template v-for='(value, key) in entity.

Endnote X8激活注册信息

使用以下激活信息进行注册: Name:胡萝卜周 Organization:www.carrotchou.blog Product Key:3VHLX-TJJ74-SAM4N-38HEX-KNUCL 来自网络 转载于:https://www.cnblogs.com/XYYCKL/p/10116152.html

《内部排序算法比较》

《内部排序算法比较》 一、【问题描述】 在教科书中,各种内部排序算法的时间复杂度分析结果只给出算法的大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以获得直观感受 【基本要求】 (1) 对6种常用内部排序算法进行比较:冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序 (2) 待排序的表长不小于100,其中数据要用伪随机数产生,至少用5组不同的输入数据做比较 (3) 比较指标为关键字参加的比较次数和关键字的移动次数 二、概要设计 1(可排序表的抽象数据类型定义: ADT OrderableList{ 数据对象:D={ai|ai?IntegerSet,i=1,2,„,n,n?0} 数据关系:R1={<ai-1,ai>|ai-1,ai?D,i=2,„,n} 基本操作: InitList(n) 操作结果:构造一个长度为n,元素值依次为1,2,„,n的有序表。 RandomizeList(d,isInverseOrder) 操作结果:首先根据isInverseOrder为True或False,将表置为逆序或正序,然后将表进行d(0 ?d?8)级随机打乱。d为0时表不打乱,d越大,打乱程度越高。 RecallList() 操作结果:恢复最后一次用RandomizeList随机打乱得到的可排序表。 ListLength() 操作结果:返回可排序表的长度。 ListEmpty() 操作结果:若可排序表为空表,则返回Ture,否则返回False。 BubbleSort( &c, &s) 操作结果:进行起泡排序,返回关键字比较次数c和移动次数s。 InsertSort( &c, &s) 操作结果:进行插入排序,返回关键字比较次数c和移动次数s。 SelectSort ( &c, &s) 操作结果:进行选择排序,返回关键字比较次数c和移动次数s。 QuickSort(&c, &s) 操作结果:进行快速排序,返回关键字比较次数c和移动次数s。 ShellSort(long &c, long &s) 操作结果:进行希尔排序,返回关键字比较次数c和移动次数s。 HeapSort (&c, &s) 操作结果:进行堆排序,返回关键字比较次数c和移动次数s。 ListTraverse(visit()) 操作结果:依次对L中的每个元素调用函数visit()。 }ADT OrderableList 2(本程序包含两个模块: 1)主程序模块 void main(){ 初始化; do{ 接受命令; 处理命令; }while(“命令”~=“退出”); } 2)可排序表单元模块——实现可排序表的抽象数据类型; 各模块之间的调用关系如下:

【JokerのZYNQ7020】AXI4_Lite_GPIO。

软件环境:vivado 2017.4 硬件平台:XC7Z020 今天主要是BB一下基于AXI4_Lite总线slave从端,增加自定义GPIO操作的方法。 先新建个基于AXI4_Lite总线的自定义IP部分。Tools------------> Create and Package New IP。 然后选择Create a new AXI4 peripheral。 名字什么的最好起的有标志性一点,主要是存放的地方要设置好,以便后面其他工程调用的时候,也能找到。 接口类型选择Lite,Slave模式。 选Edit Ip,进入编辑模式。 打开以后就是下图这个样子,图里第一个红框可以认为是顶层文件,做外部接口用的,真正的功能和总线时序实现是在下面红框的文件里。因为模版的代码有点多,所以这里只说明该动的地方在哪,没说明的就是没动过的。 具体AXI4_Lite总线时序这次先不谈,先说这次文件怎么改, 开下面那个红框文件,18行用户接口那里,增加一个4位的LED输出,为什么是四位不是八位,因为我只有四个灯啊,当然你想八位也没什么问题,但是有用的还是只有四位啊。 接口OK了以后,在400行,加LED控制部分,写到总线上的数据会写到slv_reg0~slv_reg3,这里我们使用slv_reg0,将写到slv_reg0的数据传给LED,来改变LED的状态。 内层实现部分做好了,别忘了修改外层接口,老样子,18行增加外部接口,72行增加传给下层的接口。 都弄好了以后,两个文件分别按保存,然后在Design Sources里,双击这个文件。 在Ports and interfaces里,看到上面提示,刷新一下模块对外的接口。 噹 噹 噹 噹~新增加的LED接口就刷出来啦。 最后,在Review and Package里,重新封装一下IP,自定义基于AXI4_Lite的GPIO就搞定了。 回到主工程,Create block design后,搜索刚才新建的自定义IP的名字就能找到了。 搭建好的外部框架是下面这个样子。 然后老套路呀,Generate the output products,Create a HDL wrapper。加入管脚约束文件。产生Bitstream,最后导入SDK。 set_property PACKAGE_PIN J16 [get_ports {LED_o_0[0]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED_o_0[0]}] set_property PACKAGE_PIN K16 [get_ports {LED_o_0[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED_o_0[1]}] set_property PACKAGE_PIN G15 [get_ports {LED_o_0[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED_o_0[2]}] set_property PACKAGE_PIN H15 [get_ports {LED_o_0[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {LED_o_0[3]}] SDK中new application然后添加如下测试代码,就能看到四个LED轮流闪烁。 #include <stdio.

NodeMCU初探

注:内容均为作者亲身试验,如有雷同。。那也是操作实在没法不同了 一、准备工作 1.配置Java环境 不赘述,网上教程一把一把的而且都一样,这里留一个比较完整的链接。 win10 Java环境变量配置 注意一下!由于下文第四点提到的ESPlorer的原因,配置Java时下载的jdk版本最好是jdk8。过高的版本会导致这个软件一连接串口就闪退而无法运行。 2.下载相应配置的固件 这里选用云编译的方法,通过官网来下载。固件下载戳这里 这里需要填写一个可用邮箱接收固件下载地址。 这些选项是可选择的功能,按自己需求选择。 然后按照邮箱里的地址去下载即可。 3.下载烧录固件的软件及烧入 固件烧录软件推荐NodeMCU Flasher 有三个地方需要设置 1.串口(COM口) 以下三步完成之后按flash烧录固件 2.固件选择及地址位 首先,绿色部分是你下载的固件存放的地址以及固件名字(我的:D:\NodeMCU\nodemcu2.0.0 master\nodemcu-master-13-modules-2018-12-04-17-05-10-float.bin)【对了,听说按那个齿轮就能直接选择相应bin文件哦】 其次,前面那个小方框一定要把那个×点出来才行 最后,齿轮后的为0x00000(这个我没有具体研究过,不是很了解差别) 3.波特率 注意:烧录固件时设置的波特率必须和连接串口时设置的波特率相同,否则单片机会返回乱码。 4.下载开发软件(ESPlorer) 这里附上软件的下载地址,里面还有上面的固件烧录软件(flasher)以及下载好的一个固件(可直接用,若有特殊需求就自己去官网配叭) 链接:https://pan.baidu.com/s/1fI0_9QtNwxinYPllqRWnIQ 提取码:knt0 软件压缩包打开之后是这些东西,直接点击.bat文件即可使用(注意:除了软件还会打开一个cmd窗口,不能关,否则软件也会一起关) 当然这是英文版。,这里很建议大家所有开发软件都用英文版,对于掌握单片机等都有一定帮助(虽然前期容易懵)。 若是用不惯,这里有个老哥把jar汉化了,可以一用——汉化版ESPlorer 不过打开jar文件的一种方法是需要在cmd中进行,不会请自行百度,不再赘述。 软件界面如下图 简要介绍一下、 1)右边部分是用来显示单片机状态的。 2)右边上面的open按钮上面是串口,右边数字是波特率,设置为烧录时设置的(一般都是9600或115200)。调完按open按钮连接。 出现图中前8行文字说明连接成功,软件上面四个灯会有三个变绿. 3)右边下面是函数区,可以对单片机输入一些函数等进行一定操作? 4)左边部分是代码区,是用来编程的。 5)左边部分上面一行图案分别是:新建文件,打开文件,重新加载,保存文件和关闭文件。 新建文件写完程序在保存时,文件后缀名为.lua 。 6)左边下面右下角Upload点击之后,选择相应文件打开即可自动下载进单片机了。 5.简单例程操作 贴下上图中代码【2s暗2s亮】(就跟51点亮流水灯一样简单emmmm ) KEY=0 pin=4 gpio.mode(pin,gpio.OUTPUT) tmr.alarm(1,2000,1,function() if KEY==0 then KEY=1 gpio.write(pin,gpio.LOW) else KEY=0 gpio.write(pin,gpio.HIGH) end end) 步骤更简单 1)串口连接 2)写好代码存为lua文件(因为用的是lua语言) 3)下载Upload 4)success 5)效果如下 话到此处,已经完成了NodeMCU的第一步探索。 这里附上一个资料网站(这东西的资料是真的不多) NodeMCU各模块的使用,自然还是英文的,看客们加油叭。嘻嘻。

关于c#控制台程序部署到Linux系统

首先我的是c#写的unity服务器在本机测试能连接1000个客户端理论上可以一台电脑4万个人,我是使用的是阿里云云服务器学生版10块一个月,好了正式进入今天的主题如何在linux上运行c#就像java一样不过比java简单多了。 其实百度mono官网也可以的只不过有坑,https://www.mono-project.com/download/stable/#download-lin-ubuntu 这是mono的官网,首先第一步要分清楚你的linux是什么样的发行版。会用Linux系统的应该都会知道Linux发行版是什么吧, 不会的输入这个命令: 1.lsb_release -a 即可列出所有版本信息: 这个命令适用于所有的Linux发行版,包括Redhat、SuSE、Debian…等发行版。 2、cat /etc/redhat-release 这种方法只适合Redhat系的Linux: 3、cat /etc/issue 此命令也适用于所有的Linux发行版。 第二步我已我的ubuntn16.04为列 在mono官网找到自已发行版 输入找到的发行版下面的命令 第三步画蓝线的部分都要安装 sudo apt install mono-devel 执行后输入蓝线的部分 像这样 sudo apt install mono-complete 第四步使用 上传win系统的exe程序使用命令 mono 程序名字 如: 注意:你要进入存放的文件夹内使用mono命令 还有就是win系统和linu系统传输文件我推荐使用 WinSCP 这个可以传输文件但是如果使用命令行会出现异常 大家就用他来传输文件就行了 执行命令行的就用 putty 这个软件 以上两个程序网上搜索可以找到 有什么不懂的可以评论问我 最后说一句使用Linux系统一般都是作为服务器的 所以我们要强烈使用c/c++这种和linux匹配的语言

微信公众号服务器配置token验证

pom中引入jar: <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>3.1.0</version> </dependency> token验证方法: /** * 将微信公众号发送来的加密后的消息体解密 * @return * @throws Exception */ @GetMapping(produces = "text/plain;charset=utf-8",value = "/msg") public static String msgEncrypt( @RequestParam(name = "signature",required = false) String signature, @RequestParam(name = "timestamp",required = false) String timestamp, @RequestParam(name = "nonce", required = false) String nonce, @RequestParam(name = "echostr", required = false) String echostr ) throws Exception{ System.out.print("进入token验证"); System.out.print("signature:"+signature); String token = "token"; //字典序排序 String[] strs = new String[]{token,timestamp,nonce}; Arrays.

MongoDB日志分割

mongo默认是没有进行日志分割的,所有的日志持续写到一个文件中。缺点是很明显的,日志文件会越来越大 占用过多磁盘空间日志文件写入性能越来越低问题排查越来越困难 配置分割策略 要实现日志分割,首先要配置日志分割策略,在mongodb的配置中,systemLog下添加logRotate配置。 logRotate总共有两种取值: rename 说实话,不是很理解这个名字。 这种策略下,需要写一个shell脚本,加到crontab里面 shell脚本内容如下: #!/bin/sh datafile=/var/run/mongodb logfile=/var/log/mongodb days=15 /bin/kill -SIGUSR1 `cat $datafile/mongod.pid` find $logfile/ -mtime +$days -delete crontab配置每晚凌晨0点执行 0 0 * * * /opt/shell/mongodb_log_rotate.sh > /dev/null 2>&1 & 脚本干了两件事 给mongod进程发出SIGUSR1信号之后,mongod就会乖乖的分割日志。清除超过15天的日志 reopen 如果是通过Linux或者Unix系统的logRotate工具来分割,就需要指定reopen, 当然logappend必须也不能少。关闭文件然后重新打开可以防止日志文件丢失。 你需要在/etc/logrotate.d/目录下新建一个名为mongod的文件,加上如下内容: /var/log/mongodb /*log { create 0644 mongod mongod daily rotate 15 missingok notifempty compress sharedscripts postrotate /bin/kill -USR1 `cat /run/mongodb/mongod.pid 2>/dev/null` 2>/dev/null || true endscript } 这个配置文件的权限必须为-rw-r--r--,不然logrotate不认。 分割之后的文件名格式就是文件名加上分割的时间戳,如mongod.log.2018-05-16T13-08-58。当然这个时间格式可以通过timeStampFormat来配置,默认的是iso8601-local,还可以选择ctime和iso8601-utc

自定义函数strcomp(),实现两个字符串的比较

Description 编写函数strcomp(char *s1, char *s2),实现两个字符串的比较,返回值为1、0或-1,分别表示s1>s2 , s1=s2 , s1<s2 Input 多组测试数据,每组输入两个字符串(字符串长度小于80)。 Output 根据字符串的大小关系,输出1、0或-1 Sample Input china chinese world hello sea sea Sample Output -1 1 0 #include<stdio.h> //strcmp函数进行比较 int strcmp(char *str1,char *str2) { if(str1!=NULL && str2!=NULL) { while(*str1++ !='\0' && *str2++ !='\0') { if(*str1>*str2) return 1; else if(*str1<*str2) return -1; else continue; } //如果两个都为空,直接返回0 if((*str1 == '\0') && (*str2 == '\0')) return 0; //如果前一个为空后一个不为空,s1<s2,返回-1 else if((*str1 == '\0') && (*str2 !

arcgis server for javacript 动态创建矢量、栅格图层

自arcgis server 10.1 之后就支持动态图层了, 这种特性大家可以去官网看一下: https://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//00sq000000n1000000 其应用场景即为后台会生成大量的图层、如果把这些图层全部发布为服务在进行展示会大量的小号服务器资源、所以自arcgis server 10.1 就引进了动态图层的概念,下面介绍 如何加载动态矢量数据、动态加载栅格数据。 添加动态工作空间: 打开 arcgis server 管理器找到已发布的图层服务 添加完毕之后注意“保存并重新启动”。否则不会生效、之后点击 URL下面的REST URL、如出现下面表示成功 这里我创建了两个动态工作空间、一个Shapefile “labWorldShpWS”、一个 Raster “labWorldRasterWS” 添加动态矢量图层: 直接上代码 $(function() { require(["esri/map", "dojo/dom", "dojo/on", "esri/layers/DynamicLayerInfo", "esri/layers/ArcGISDynamicMapServiceLayer", "esri/layers/FeatureLayer", "esri/layers/RasterLayer", "esri/layers/TableDataSource", "esri/layers/LayerDataSource", "esri/layers/RasterDataSource", "dojo/domReady!" ], function ( Map, dom, on, DynamicLayerInfo, ArcGISDynamicMapServiceLayer, FeatureLayer, RasterLayer, TableDataSource, LayerDataSource, RasterDataSource) { var map = new Map("mapDiv"); var dynamicLayer = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/labWorldFolder/labWorldService/MapServer"); // http://localhost:6080/arcgis/rest/services/{站点}/{服务名字}/MapServer var baseMapLayer = new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/labWorldFolder/labWorldService/MapServer"); map.

玩转OpenCV 4.0(一):调用Dis光流算法示例

玩转OpenCV 4.0(一):调用Dis光流算法示例 调用DIS光流的源码如下:对应CMakelists如下: 调用DIS光流的源码如下: #include "opencv2/core/utility.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/video.hpp" #include <iostream> using namespace std; using namespace cv; static void help() { printf("Usage: dis_optflow <video_file>\n"); } int main(int argc, char **argv) { VideoCapture cap; if (argc < 2) { help(); exit(1); } cap.open(argv[1]); if(!cap.isOpened()) { printf("ERROR: Cannot open file %s\n", argv[1]); return -1; } Mat prevgray, gray, rgb, frame; Mat flow, flow_uv[2]; Mat flow_Farneback; Mat flow_uv_Farneback[2]; Mat mag, ang; Mat mag_Farneback, ang_Farneback; Mat hsv_split[3], hsv; Mat hsv_split_Farneback[3], hsv_Farneback; Mat rgb_Farneback; Ptr<DenseOpticalFlow> algorithm = DISOpticalFlow::create(DISOpticalFlow::PRESET_MEDIUM); int idx = 0; while(true) { cap >> frame; if (frame.