centos7服务器(free -h)命令详解

简介 centos7服务器linux命令:free -h,查询当前服务器内存使用状况以及剩余内存状况; 实践 1. 如下图: 2. 命令详解: total:服务器内存总大小:7.6G used:已经使用了多少内存:3.8G free:未被任何应用使用的真实空闲内存; shared:被共享的物理内存; buff/cache:缓冲、缓存区内存数,缓存在应用之中; available:真正剩余的可被程序应用的内存数; 3. 说明: 系统剩余内存为:available 总结 实践是检验认识真理性的唯一标准,自己动手丰衣足食~

表情识别(二)--基于CNN分类

说白了,就是个分类任务,但是纯粹的CNN分类,只是对传统方式的提升,本质思路没有改变,效果也不是很明显。 转自:https://blog.csdn.net/walilk/article/details/58709611 前言 [机器学习] 实验笔记系列是以我在算法研究中的实验笔记资料为基础加以整理推出的。该系列内容涉及常见的机器学习算法理论以及常见的算法应用,每篇博客都会介绍实验相关的数据库,实验方法,实验结果,评价指标和相关技术目前的应用情况。 本文主要整理自笔者在表情识别(emotion recognition)研究上的实验笔记资料,给出了表情识别常用的数据库,论文资料,识别方法,评价指标,以及笔者的实验笔记和实验结果。 文章小节安排如下: 1)表情识别的意义 2)表情识别的应用 3)常用的数据库及比赛 4)实验-算法说明 5)实验-效果展示 6)结语 一、表情识别的意义 1.1 什么是表情? 我们天天都在展示自己的表情并且看到其他人的表情,那么表情到底是什么? 看看维基百科的定义: 面部表情是面部肌肉的一个或多个动作或状态的结果。这些运动表达了个体对观察者的情绪状态。面部表情是非语言交际的一种形式。它是表达人类之间的社会信息的主要手段,不过也发生在大多数其他哺乳动物和其他一些动物物种中。 人类的面部表情至少有21种,除了常见的高兴、吃惊、悲伤、愤怒、厌恶和恐惧6种,还有惊喜(高兴+吃惊)、悲愤(悲伤+愤怒)等15种可被区分的复合表情。 1.2 表情的意义? 表情是人类及其他动物从身体外观投射出的情绪指标,多数指面部肌肉及五官形成的状态,如笑容、怒目等。也包括身体整体表达出的身体语言。 参考: https://zh.wikipedia.org/wiki/%E9%9D%A2%E9%83%A8%E8%A1%A8%E6%83%85 简单来说, 面部表情是人体(形体)语言的一部分,是一种生理及心理的反应,通常用于传递情感。 1.3 表情的研究 面部表情的研究始于 19 世纪, 1872年,达尔文在他著名的论著《人类和动物的表情(The Expression of the Emotions in Animals and Man,1872)》中就阐述了人的面部表情和动物的面部表情之间的联系和区别。 1971年,Ekman 和 Friesen 研究了人类的 6 种基本表情 (即高兴、悲伤、惊讶、恐惧、愤怒、厌恶 ) ,并系统地建立了人脸表情图象库,细致的描述了每一种表情所对应的面部变化,包括眉毛、眼睛、眼睑、嘴唇等等是如何变化的。 1978年,Suwa等人提出了在图像序列中进行面部表情自动分析。 从20世纪90年代开始,由Mase和Pentland提出的光流法进行面部表情识别之后,自动面部表情识别进入了新的时期。 1.4 微表情 随着研究的深入和应用的广泛,人们逐渐开始研究一种更细微的表情:微表情。 看维基百科的定义: 微表情是一种人类在试图隐藏某种情感时无意识做出的、短暂的面部表情。 微表情的持续时间仅为 1/25 秒至 1/5 秒,表达的是一个人试图压抑与隐藏的真正情感。 微表情的在自动谎言识别等众多领域有巨大的潜在应用价值,比如那部著名的电视剧《Lie to Me》,卡尔·莱特曼博士就是利用“脸部动作编码系统”(Facial Action Coding System)分析被观察者的肢体语言和微表情,进而向他们的客户(包括FBI等美国执法机构或联邦机构)提供被观测者是否撒谎等分析报告。 随着科技进步和心理学的不断发展,对表情的研究越来越丰富,应用也越来越广泛。有兴趣的读者可以Google一下人类表情的研究历史,以及在心理学用的应用。 二、表情识别的应用 2.

解决docker中中文显示的问题

docker 镜像中遇到了中文乱码无法显示的问题,通过export LANG虽然可以暂时性的解决问题,但是docker 重新进入的话就又开始乱码了,通过半天的摸索,借鉴别人的资料,解决了这个问题。 centos 在Dockerfile中添加这么几行 FROM registry.thunisoft.com:5000/arm/jenkins:latest RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 ENV LC_ALL "zh_CN.UTF-8" 如果提示存在问题的话,可能的原因是没有安装字体及基础包,可以改为如下格式 RUN yum install kde-l10n-Chinese -y RUN yum install glibc-common -y RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 #ENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 ubuntu 对于ubuntu 来说,是没有localedef的可以使用如下的语句 RUN locale-gen zh_CN.UTF-8 ENV LANG zh_CN.UTF-8 ENV LANGUAGE zh_CN ENV LC_ALL zh_CN.UTF-8

在flutter引入CupertinoAlertDialog总是报:The getter 'alertDialogLabel' was called on null

flutter使用CupertinoAlertDialog,点击弹出按键时报: The getter 'alertDialogLabel' was called on null 跳入到上一层dialog.dart中的确有个label: localizations.alertDialogLabel,但是CupertinoAlertDialog没有该属性… 翻阅谷歌发现相同问题,简单尝试下,的确有效: 在main.dart文件中加入localizationsDelegates这个属性,并在其中加入const FallbackCupertinoLocalisationsDelegate(),上面的三个是我加国际化引入的,不需要的不要加。并且在该文件下生成对应的类: class FallbackCupertinoLocalisationsDelegate extends LocalizationsDelegate<CupertinoLocalizations> { const FallbackCupertinoLocalisationsDelegate(); @override bool isSupported(Locale locale) => true; @override Future<CupertinoLocalizations> load(Locale locale) => DefaultCupertinoLocalizations.load(locale); @override bool shouldReload(FallbackCupertinoLocalisationsDelegate old) => false; } 现在,运行工程,CupertinoAlertDialog完美弹出。

vuex 面试题

1、有哪几种属性 有 5 种,分别是 state、getter、mutation、action、module state => 基本数据 getters => 从基本数据派生的数据 mutations => 提交更改数据的方法,同步! actions => 像一个装饰器,包裹mutations,使之可以异步。 modules => 模块化Vuex 2、vuex 的 store 特性是什么 (1) vuex 就是一个仓库,仓库里放了很多对象。其中 state 就是数据源存放地,对应于一般 vue 对象里面的 data (2) state 里面存放的数据是响应式的,vue 组件从 store 读取数据,若是 store 中的数据发生改变,依赖这相数据的组件也会发生更新 (3) 它通过 mapState 把全局的 state 和 getters 映射到当前组件的 computed 计算属性 3、 vuex 的 getter 特性是什么 (1) getter 可以对 state 进行计算操作,它就是 store 的计算属性 (2) 虽然在组件内也可以做计算属性,但是 getters 可以在多给件之间复用 (3) 如果一个状态只在一个组件内使用,是可以不用 getters 4、vuex 的 mutation 特性是什么 action 类似于 muation, 不同在于:action 提交的是 mutation,而不是直接变更状态 action 可以包含任意异步操作 5、vue 中 ajax 请求代码应该写在组件的methods中还是vuex 的action中 如果请求来的数据不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入 vuex 的 state 里 如果被其他地方复用,请将请求放入 action 里,方便复用,并包装成 promise 返回 6、不用 vuex 会带来什么问题 可维护性会下降,你要修改数据,你得维护3个地方 可读性下降,因为一个组件里的数据,你根本就看不出来是从哪里来的 增加耦合,大量的上传派发,会让耦合性大大的增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背 复制代码

数据库候选码和最小依赖集的求解

数据库 候选码 最小函数依赖集 定义求候选码求最小函数依赖集结束 定义 ——我们在书本上或者网上都是可以查询到完整的概念以及定义,但是不了解的朋友就算是看到定义也看不懂,所以这里只讲做题方法,等学会了之后可以根据做题方法反向理解概念以及定义 求候选码 关系模式 R<U,F> U=(A,B,C,D,E,G), F={AB–>C,CD–>E,E–>A,A–>G} 解题步骤 第一步: F如下: AB–>C CD–>E E–>A A–>G 第二步: L(左边有右边没有的元素):BD R(右边有左边没有的元素):G N(两边都没有的元素):∅ LR:(两边都有的元素):ACE 第三步: 合并L和N的元素为X 则有X:B,D 有首先求X的闭包:(BD)+=BD(不是全集U) 则从LR中依次取一个元素到X中,先取A,则有(ABD) 第一次求闭包(ABD)+=ABDGC(元素顺序无关) 第二次求闭包(ABCDG)+=ABCDGE(全集U) 所以A,B,D是一个候选码 再从LR中取C加入X有X=(BCD) 第一次求闭包(BCD)+=BCDE 第二次求闭包( BCDE)+=BCDEA 第三次求闭包(ABCDE)+=ABCDEG(全集U) 所以ABD是一个候选码 再从LR中取E加入X有X=(BDE) 第一次求闭包(BDE)+=BDEA 第二次求闭包( ABDE)+=ABDECG(全集U) 所以EBD是一个候选码 因为(ABD)(BCD)(BDE)的闭包都是U(ABCDEG),所以本题有三个候选码分别是(ABD)(BCD)(BDE)。 求最小函数依赖集 F={ABD->E,AB->G,B->F,C->J,CJ->I,G->H} 解题步骤 第一步: ABD->E AB->G B->F C->J CJ->I G->H 第二步: 1.将F中的所有依赖右边化为单一元素(左边不可拆分) 此题F={ABD->E,AB->G,B->F,C->J,CJ->I,G->H};已经满足 备注:如果有AB->EG,化为单一元素则为AB->E,AB->G 2.去掉F中的所有依赖左边的冗余属性. 做法是属性中去掉其中的一个,看看是否依然可以推导 此题:ABD->E去掉A,则(BD)+不含E,故不能去掉,同理B,D都不是冗余属性 AB->G,也没有 对于CJ->I,因为C->J,然后CJ->I所以J是冗余的,CJ->I将成为C->I F={ABD->E,AB->G,B->F,C->J,C->I,G->H}; 3.去掉F中所有冗余依赖关系. 做法为从F中去掉某关系,如去掉(X->Y),然后在F中求X+,如果Y在X+中,则表明x->是多余的.需要去掉. 此题如果F去掉ABD->E,F将等于{AB->G,B->F,C->J,C->I,G->H},而(ABD)+={A,D,B,F,G,H},其中不包含E所以不是多余的. 同理(AB)+={A,B,F}也不包含G,故不是多余的. B+={B}不多余,C+={C,I}不多余. C->I,G->H不多余.

利用ssh反向隧道实现内网穿透远程控制

1.环境介绍 局域网客户端A-192.168.40.24 广域网服务器B-172.10.12.88 2.安装autossh(客户端A上操作) yum install autossh #使用autossh必须使用客户端A必须使用key认证登录方式 3.配置免密登录(客户端A上操作) ssh-keygen -t rsa ssh-copy-id -i .ssh/id_rsa.pub root@172.10.12.88 # ssh-keygen -t rsa 一直回车,生成私钥和公钥 # ssh-copy-id -i .ssh/id_rsa.pub root@172.10.12.88 复制公钥到hostB的/root/.ssh/authorized_keys中 4.增加远程支持(在服务器B上操作) 4.1方案一:建立服务器B上的正向代理用作本地转发 ssh -fCNL *:3333:localhost:2222 localhost # 因为绑定后的端口只支持服务器B本地访问,所以我们需要把已经映射的端口转发出去 # 3333为本地转发端口,将数据转发到先前已经映射的2222端口,实现外网访问 # 其中的*表示接受来自任意机器的访问 4.2方案二:修改sshd_config vi /etc/ssh/sshd_config GatewayPorts yes 这样可以把监听的端口绑定到任意IP 0.0.0.0上,否则只有本机 127.0.0.1 可以访问 然后重启 sshd 服务: service sshd restart 5.建立客户端A到服务器B的反向代理(客户端A上操作) autossh -M 5678 -f -CNR 2222:localhost:22 root@172.10.12.88 -o TCPKeepAlive=yes -o ServerAliveInterval=60 -o ServerAliveCountMax=3 # 客户端A的22端口已经映射到服务器B的2222端口,可以在通过服务器B的2222端口访问客户端A的22端口,若不执行步骤4操作默认只支持服务器B本地访问 # TCPKeepAlive设置为yes(默认值)则会周期性地检查连接是否存活,当客户端崩溃或者由于其他原因导致连接死掉,那么该项检查会让ssh或scp连接断开 # ServerAliveInterval是指客户端A每隔60秒发送一次请求给server,避免被踢 # ServerAliveCountMax是指发出请求后,server没有响应次数达到3,就自动断开连接,一般server会响应 6.

Android Webview在系统签名下会崩溃报错的解决方案

最近定制系统应用开发用到了系统签名,有个功能用到了WebView这个控件, 正常不添加系统签名情况下WebView是正常的,添加系统签名后Webview崩溃报错: Binary XML file line #46: Binary XML file line #46: Error inflating class android.webkit.WebView 详细看了下错误信息 发现这一行: For security reasons, WebView is not allowed in privileged processes 出于安全原因,特权进程中不允许使用WebView 换句话说就是因为安全性问题系统级应用不允许使用WebView这个控件; 那么是为什么不允许在系统级应用使用呢?那么问题就来了;java嘛,面向Google编程。出事先Google,90%以上的问题都有先辈碰到过,实在没有再去翻源码,查原因; 随即Google 百度一番,得知原因 WebView这个控件在首次运行时会先调用getProvider()方法检测uid,如果是系统进程或者root进程,就直接抛出异常 为什么会有这种安全机制呢?因为WebView允许运行js,如果用户通过js注入,那么js就可以肆无忌惮的使用系统权限, (系统级权限的APP不管要干嘛都可以无需做任何申请提示,可谓是为所欲为)这无疑是一个大漏洞,门户大开。 static WebViewFactoryProvider getProvider() { synchronized (sProviderLock) { // For now the main purpose of this function (and the factory abstraction) is to keep // us honest and minimize usage of WebView internals when binding the proxy.

长轮询 和 短轮询

http 长轮询 和 短轮询 http 长轮询 1)介绍:http 长轮询是server 收到请求后如果有数据,立刻响应请求;如果没有数据 就会 停留 一段时间,这段时间内,如果 server 请求的数据到达(如查询数据库或数据的逻辑处理完成),就会立刻响应;如果这段时间过后,还没有数据到达,则以空数据的形式响应http请求;若浏览器收到的数据为空,会再次发送同样的http请求到server; 2)http 长轮询 的缺点:server 没有数据到达时,http连接会停留一段时间,这会造成服务器资源浪费; 3)看个荔枝:假设有 1000个人停留在某个客户端页面,等待server端的数据更新,那就很有可能服务器这边挂着1000个线程,在不停检测数据是否发生变化,这依然是有问题的; http 短轮询 1)介绍:http 短轮询是 server 收到请求 不管是否有数据到达都直接响应http 请求;如果浏览器收到的数据为空,则隔一段时间,浏览器又会发送相同的http请求到server 以获取数据响应; 2) http 短轮询的缺点:消息交互的实时性较低(server端到浏览器端的数据反馈效率低); http 长轮询 和 短轮询的异同 1)相同点:当server 的数据不可达时,基于http长轮询和短轮询 的http请求,都会 停留一段时间; 2)不同点:http长轮询是在服务器端的停留,而http 短轮询是在 浏览器端的停留; 3)性能总结:从这里可以看出,不管是长轮询还是短轮询,都不太适用于客户端数量太多的情况,因为每个服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满; 原文:https://blog.csdn.net/baidu_38990811/article/details/79172163 

Nginx的405错误解决办法

nginx 配置: location / { root /www/client/domain; index index.shtml index.html; error_page 405 =200 /index.shtml; } 或 location ~* /*\.shtml$ { root /www/client/$domain; index index.shtml index.html; error_page 405 =200 http://$domain$request_uri; } 转载自:https://www.linuxidc.com/Linux/2012-07/66760.htm 感谢大神分享。

什么是Pythonic?

震惊,这篇文章的阅读量竟然远远超过我写的其他很多好文章,可见现在Python的学习有多么火热了。 因为是早期写的文章,质量很一般,看到这么多访问着实惶恐,现在本人主要致力于前端学习,但是Python作为带我入门的语言,自然还是十分喜欢的, 随着越学越多,对于语言风格其实有了更深的认识,推荐大家不要局限于一种语言的设计风格,如果真的爱,请博采众长,以集大成。 下面是原文,基本没有修改过,小白看个新鲜,行家看个热闹即可。 如果你也听说过著名的“the zen of python”,如果你和我一样小白到写的代码总是乱七八糟,如果你也想了解一下真正“Pythonic”的代码是什么样子的话,不妨看下去。 pythonic,简单的翻译就是python风格,pythonic code,就是说你写的代码要带有浓厚的python规范和python风格。往规范了说,PEP 8是你写出规范代码不得不读的文章,至于往python风格来说的话让,嗯,让我们先看看“the zen of python”中的几句话: Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. 渣渣翻译:美丽胜过丑陋,嗯这不废话么,啥是美丽啊;清晰胜过不清晰,嗯,意会吧,言传不了;简单好过复杂,这倒是很好理解;复杂胜过更复杂?后面这个复杂应该有混乱的意思了;平滑胜过嵌套,间隔胜过紧凑,感觉这都是为了可读性服务的呀。 说了这么多,还是不知道pythonic的代码是啥样子的,于是,看例子吧! 例一: 对一个数组里的每个元素做个简单处理: i = 0 while i < len(list): easy_process(list[i]) i += 1 没毛病,够python吗?显然不够,我们都知道更python的应该用for i in range(): for i in range(len(list)): simple_process(list(i)) 这样够python了吧?很遗憾,推荐写法是下面这样:

CppCheck C++静态代码检查工具在Visual Studio(VS)下的配置和使用

摘要 本文介绍如何在Visual Studio(VS)下使用CppCheck检查代码,包括安装和使用两个部分。与网上通过vs外部工具使用CppCheck的方法不同,本文介绍了CppCheck的vs插件,配置更方便,使用体验更好。 介绍 Cppcheck是一个C/C++代码的静态分析工具。与C++编译器和其他许多分析工具不同,Cppcheck不检测代码中的语法错误,只检测那些编译器通常无法检测到的bug类型,目的是只检测代码中真正的错误。下面是Cppcheck的一些检查项: 检查边界溢出检查内存泄漏检查可能的空指针间接引用检查未初始化的变量检查无效的STL使用检查异常安全警告如果过时的或者不安全的函数使用警告未使用的或者冗余的代码检测各种潜在bugs的可疑代码等 所有检查项可以查看这里:https://sourceforge.net/p/cppcheck/wiki/ListOfChecks/ CppCheck使用方法: 命令行调用可视化界面使用作为外部工具使用。若开发工具支持外部工具扩展,可手动配置为外部工具使用作为插件使用。若开发工具包含CppCheck插件,可作为插件使用 本文使用第四重方法,通过插件使用CppCheck。 CppCheck在许多流行的开发工具上已经有对应插件,例如:Visual Studio、Code::Blocks、CLion 、QtCreator 、KDevelop 、Git (Linux)等,完整插件支持看这里:http://cppcheck.net/ 安装 安装CppCheck 在CppCheck官网下载并安装, 本文下载的是cppcheck-1.87-x64-Setup.msi。接着安装vs插件 在cppcheck-vs-addin下载并安装vs插件,本文下载的是CppcheckPlugin_1.3.6.vsix。 注意: vs的CppCheck插件不包含CppCheck本身,因此需要先安装CppCheck再安装CppCheck的vs插件。详情见cppcheck-vs-addin的说明: NOTE: The add-in does not deploy Cppcheck executable. Please, go to Cppcheck website, download the installer and install it before first use of the add-in. The add-in then may prompt for location of the cppcheck.exe. 安装完毕 重启vs,安装完毕,接下来看如何使用。 使用 使用一段测试代码,测试一下CppCheck效果。 使用的测试代码: int main() { int array_temp[100]; int a = array_temp[200]; } 测试结果:

Linux framebuffer双缓冲防止闪烁

昨天写了一篇文章: 使用Linux Framebuffer绘制32位真彩图形: https://blog.csdn.net/dog250/article/details/90113737 并发了朋友圈表示这件事结束了,玩了一天,玩恶心了。 但是我依然是想做出一个可以拖拽的不规则GUI界面(用皮鞋或者小小的照片做界面轮廓)来的。所以半夜就爬起来继续折腾。 无奈,没有找到获取鼠标焦点的好方法,都太复杂,要知道,我是希望在framebuffer上玩啊,不希望依赖那些已经集成在GUI里面的东西。 我不就想模拟个拖拽嘛,简单,用线程控制图片在屏幕上漂移,即: // setPoint方法已经抽象独立了出来,成为一个static方法,以免main函数太长。 while(true) { setPoint(width, height, xoffset%200, yoffset%50); try { Thread.sleep(100); } catch (InterruptedException e) { } xoffset += 2; yoffset += 2; } 这个代码测试下来, 闪烁太厉害了! 根本就没法看: 怎么办?如果简单的图片漂移都这么闪烁,那如果鼠标拖拽移动图片,结局注定令人遗憾。怎么办? 找根源!根源就是 画图的时间太久了! 我可是一个像素一个像素画的啊! 当然了,我知道,如果Java通过JNI将一个像素数组传递到本地代码,然后本地代码直接 memcpy,那将是令人赛里布瑞特的。可是我并不知道如何从Java往本地代码传递大数组…另外,我注意是想把事情做纯粹些。 我不想把事情交给库去解决,我要自己解决! (可能赚钱的经理们又要笑我了,但我就是这样,鄙视业务逻辑。) 利用双缓冲来解决问题。 意思就是说, 逐像素点画图这件耗时的操作,不要直接操作显存,而是操作一块预先分配好的和显存一样大小的缓冲区,等逐点画图完成之后,一次性将该缓冲区的内容memcpy到事先mmap好的显存地址空间。 关于 双缓冲 技术我就不多说了,这技术的解释已经烂大街了,诸如什么流水线相关的形而上解释,看着都烦了,不过确实是那么回事。 直接上代码吧,先看Java代码 Drawimage.java: import java.awt.image.*; import java.io.*; import javax.imageio.ImageIO; public class Drawimage { static File src = null; static BufferedImage img = null; native static void setFB(int x, int y, int rgb); native static void show(int x); static { System.

MPlayer移植步骤

Mplayer移植 目录 Mplayer移植 前期准备: 中期执行: 测试: 后期总结: 前期准备: 1、软件:MPlayer-1.0rc4.tar libmad-0.15.1b.tar 2、环境:Linux虚拟机下,配置交叉编译器,nfs服务,xshell(或者 超级终端),串口驱动(PL2303.。。) 3、硬件:虚拟机下Linux系统,USB转串口线,ARM开发板 中期执行: 1、将MPlayer-1.0rc4.tar libmad-0.15.1b.tar放入新创建的mplayermove文件夹下(此文件夹为mplayer移植的总文件夹), 我将mplayermove文件夹创建在了/home/ryh目录下(这个可以随意) Libmad库配置 ① 创建文件夹 mplayermove 命令:mkdir mplayermove ② 进入mplayermove文件夹下,将MPlayer-1.0rc4.tar libmad-0.15.1b.tar两个文件放入mplayermove文件夹下 命令:cd mplayermove/ ls ③ 解压压缩包libmad-0.15.1b.tar 解压到当前文件夹 命令:tar xzvf libmad-0.15.1b.tar 解压过程 ④ 解压压缩包MPlayer-1.0rc4.tar 命令:tar xzvf MPlayer-1.0rc4.tar 解压过程 ls查看解压后的文件 ⑤ 在mplayermove文件夹下创建文件夹mplayer和libmad (在后面的配置中要将一些文件放入这两个文件夹中。)用于存放lib库和Mplayer应用文件 命令:ls Mkdir mplayer Mkdir libmad ls ⑥ 对libmad库进行一些配置,进入libmad-0.15.1b目录下./configure 进行剪裁(将一些不需要的功能减掉)其中,--prefix表示make install 之后生成的文件存放的路径(路径是绝对路径) ./configure CC=arm-linux-gcc --host=arm-linux --disable-shared --disable-debugging --prefix=/home/ryh/mplayermove/libmad 查看libmad-0.15.1b文件下的Makefile进行(在上一步未执行时,次Makefile一般不会出现,因此必须执行完上一步,才能执行这一步。) ⑦ 输入命令make ,会出现错误信息。 对错误信息进行调试,修改: ⑧ Vim 编译器进入Makefile文件中

vbs入门

最近小编学习了一种很神奇的东西——vbs!下面让我来给大家讲讲这种东西吧! Show Time 创建一个vbs函数msgbox循环 创建一个vbs 第一步,创建一个文本文档(txt): 第二步:改掉它的后缀名 第3步:确认 vbs创建成功! 函数 msgbox 弹出一个消息框 用法: msgbox"orz" 效果如下: 循环 重复做一件事情 代码: do msgbox"orz" loop 效果如下: 和刚才一样,但是关不掉。 今天就到这里了,以后还会持续更新。 更新: vbs进阶——条件分支 vbs进阶——循环

ResNet变体(wide residual network,ResNext,DenseNet,MobileNet,ShuffleNet, Dual path Network)

2015 年,152 层深的 ResNet 横空出世,不仅取得当年ImageNet竞赛冠军,相关论文在CVPR 2016斩获最佳论文奖。ResNet成为视觉乃至整个 AI 界的一个经典。自那以后,ResNet 得到许多调整和改进,2017 年,基于 ResNet 的双通道网络 DPN 再夺ImageNet冠军,并将 200 层 ResNet 的计算量降低了 57%。本文从 ResNet 的背景知识讲起,梳理 Wide Residual Network(WRN)、ResNeXt、MobileNet 等 ResNet 变体,纵览计算机视觉在这两年的飞速发展,向最后一届 ImageNet 竞赛致敬。 2015 年,ResNet 大大吸引了人们的眼球。实际上,早在 ILSVRC2012 分类竞赛中,AlexNet 取得了胜利,深度残差网络(deep Residual Network)[2]就成为过去几年中计算机视觉和深度学习领域最具突破性的工作。ResNet 使得训练深达数百甚至数千层的网络成为可能,而且性能仍然优异。 由于其表征能力强,ResNet 在图像分类任务之外的许多计算机视觉应用上也取得了巨大的性能提升,例如对象检测和人脸识别。 自 2015 年以后,许多研究对 ResNet 架构进行了调整和改进。在这里,我们先为那些不熟悉 ResNet 的人提供一些背景知识;接下来,梳理关于 ResNet 架构的不同变体及相关论文,包括何恺明等人提出的ResNeXt、康奈尔大学、清华大学,Facebook 联合提出的 DenseNet、谷歌 MobileNet、孙剑团队 ShuffleNet,以及最近获得 2017 ImageNet 冠军的颜水成团队的双通道网络 DPN。 重新审视 ResNet:计算机视觉最流行的架构之一 根据泛逼近定理(universal approximation theorem),如果给定足够的容量,一个单层的前馈网络就足以表示任何函数。但是,这个层可能是非常大的,而且网络容易过拟合数据。因此,研究界有一个共同的趋势,就是网络架构需要更深。 从 AlexNet 的提出以来,state-of-the art 的 CNN 架构都是越来越深。虽然 AlexNet 只有5层卷积层,但后来的 VGG 网络[3]和 GoogLeNet(也作 Inception_v1)[4]分别有19层和22层。

anaconda3安装后cmd下python不是内部命令

在环境中配置anaconda安装目录 问题1 : python不是内部命令 解决:path下添加 D:\anaconda 注意这是你的anaconda安装的文件夹 问题2 : pip不是内部命令 解决: path下添加 D:\anaconda\Scripts 成功后的界面 更多详情请关注个人工作号:

anaconda3下载

官方下载地址:https://www.anaconda.com/distribution/#download-section(推介使用下面的镜像地址) 界面: 官方下载很慢,推介清华镜像网站 地址 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 更多详情请关注个人工作号:

高频分量和低频分量

图像中的低频信号和高频信号也叫做低频分量和高频分量。 简单一点说,图像中的高频分量,指的是图像强度(亮度/灰度)变化剧烈的地方,也就是我们常说的边缘(轮廓);图像中的低频分量,指的是图像强度(亮度/灰度)变换平缓的地方,也就是大片色块的地方。 人眼对图像中的高频信号更为敏感。

网线水晶头接法分两种教程

我们家里如果要用网线的话,其实是可以自己接水晶头的,当然你得有一个叫压线钳的工具,有了它你自己就可以接水晶头来做网线了,也无需去买成品,这样就比较灵活,可以自行决定网线的长度,但很多人不知道网线到水晶头的接法顺序,下面就教大家: 1、首先水晶头顺序有两种规范接法,分别是568B 和658A标准 分别对应的网线顺序是: 568B标准:白橙,橙,白绿,蓝,白蓝,绿,白棕,棕 568A标准:白绿,绿,白橙,蓝,白蓝,橙,白棕,棕 而水晶头的接法也分成了: 交叉线的做法是:一头采用568A标准,一头采用568B标准 平行(直通)线的做法是:两头同为568B标准 2、而我们家里网线的RJ45接法是按直通568B来做的,下面就图示给大家怎么接,也就是按白橙,橙,白绿,蓝,白蓝,绿,白棕,棕这种接法接水晶头和网线。 3、把网线拨开后,然把线颜色的顺序按568B标准排列好插到水晶头里,然后用压线钳压一下就接好了。 总结:做网线按上面的顺序找一个压线钳就可以轻松制作了,一般人都可以制作网线了,以后也可以直接记住这个顺序,不用查阅资料。

Docker启动Elasticsearch7.x报错以及解决方法

使用Docker run 命令 docker run -d -p 9200:9200 -p 9300:9300 --name 用户自定义名字 容器ID 会看到一串字符串,一般情况下我们会误以为它启动成功 我们执行docker ps -a是发现它自动退出了 使用docker logs -f 容器ID 查看日志发现: ERROR: [1] bootstrap checks failed [1]: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144] [2]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured 错误提示 告诉我们是ES需要jvm内存太大了,所有我们需要改一下配置,执行下面代码 sysctl -w vm.max_map_count=262144 然后输入下列命令运行一下: docker run -d -e ES_JAVA_POTS="

wx.openLocation苹果手机点击没反应

<button class="check_map" data-longitude="{$value.longitude}" data-latitude="{$value.latitude}" data-name="{$value.hname.'('.$value.address.')'}">查看地图</button> //<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> //var wxconfig = eval('<?php echo json_encode($wxconfig); ?>'); //wx.config(wxconfig[0]); $(".check_map").on('click', function() { var longitude = this.dataset.longitude; var latitude = this.dataset.latitude; var name = this.dataset.name; console.log("定位中!!!"); wx.openLocation({ longitude: longitude, // 经度,浮点数,范围为180 ~ -180。 latitude: latitude, // 纬度,浮点数,范围为90 ~ -90 name: name, // 位置名 address: "", // 地址详情说明 scale: 28 // 地图缩放级别,整形值,范围从1~28。默认为最大 }); }); 字符类型问题,要转成float型 longitude = parseFloat(this.dataset.longitude); latitude = parseFloat(this.dataset.latitude);

Scrapy在安装过程中遇到了错误:error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ ..

安装scrapy pip install scrapy 在安装过程中出现了报错: 解决方法: 此时需要安装一个包,下面是该包的百度云链接: https://pan.baidu.com/s/1E9RWUmAZIpKhxpsdSl7O2w 提取密码:n2pu 如果链接失效了,欢迎给我留言评论 pip install 直接把下号的包拖过去,就不用自己写地址了 图示Twisted这个包安装成功之后,重新安装scrapy pip install scrapy 成功解决问题

连接MYSQL的时候报错:Can't connect to MySQL server on 'localhost' (10061)

连接MYSQL的时候报错:Can't connect to MySQL server on 'localhost' 10061 今天用NAVICAT连接mysql的时候发现连接不上,出现了错误提示: 错误提示: Can’t connect to MySQL server on ‘localhost’ (10061) 这里废话不多说,这边提供解决方案。 先重启服务器可解决大部分问题 错误编号:2003 问题分析: 无法连接到 mysql 服务器,可能的情况为: 1、mysql 服务没有启动,一般是在异常的情况下 mysql 无法启动导致的,比如无可用的磁盘空间,my.ini 里 mysql 的 basedir 路径设置错误等; 2、mysql 服务器资源紧张,导致无法连接。 解决方法: 1、如果你是虚拟主机用户(购买的空间),则联系空间商检查 mysql 是否正常启 动,并确认 mysql 的配置信息(是否为 localhost); 2、如果你是独立主机用户(拥有管理主机权限),则按下面步骤检查: 1)检查是否启动了 mysql 服务。 windows 主机的话,右键点击我的电脑,单击管理,在服务和应用程序中找到 mysql 服务,看是否是已启动的状态。 mysql出现10061错误解决办法 如果出现"error 2003: can’t connect to mysql server on ‘localhost’ (10061)", 说明你的mysql还没有启动。 解决办法:在服务中,启动mysql服务 can’t connect to mysql server on ‘localhost’ (10055)

使用bat文件对文件夹下的图片进行批量重命名与修改后缀

上图为未处理的图片命名 在图片文件夹中新建.txt文本文件,修改后缀为.dat 右键编辑,写入以下命令 @echo off setlocal enabledelayedexpansion set count=100 for /f "delims=" %%i in ('dir /b *.jpg,*.png,*.bmp,*.jpeg,*.gif') do call:Rename "%%~i" pause exit :Rename set /a count+=1 if /i "%~1"=="!count:~1!%~x1" goto :eof if exist "!count:~1!%~x1" goto Rename echo 改名:%1 !count:~1! ren "%~1" "!count:~1!%~x1" goto :eof 保存双击。 命名从01开始,设置 set count=100 命名从0001开始,设置 set count=10000 如果我们想要从038开始排序,可以将第三行代码: set count=10037 批量处理后缀 同样bat文件 编辑 @echooff ren *.bmp *.jpg 将bmp转化为jpg

任务调度框架(6)番外:使用 SpringBoot2.X 实现 Quartz 动态任务的分布式调度

文章目录 SpringBoot2 集成 Quartz集成简单实现Pom依赖编码功能实现 自动配置实现分析自动化配置分析 `QuartzAutoConfiguration`支持功能配置 `QuartzProperties` 小结 Quartz 实现分布式调度回顾分析配置简单实现 Quartz 的任务动态实现数据使用数据库保存任务计划的动态管理手动配置实现的原理动态管理:创建计划任务引擎类任务状态与计划依赖 小结 参考 见名知意,该篇番外主要是要解决如下几个问题: 使用SpringBoot2.x 版本集成 QuartzQuartz 的任务动态实现: 调度任务可以通过页面进行新增、删除、启动、暂定等操作任务数据使用数据库保存任务之间实现简单的依赖 Quartz 实现分布式调度,使用其本身提供的基于数据库的实现 SpringBoot2 集成 Quartz SpringBoot不同的版本对于Quartz 的集成有一定的差别,本文使用 2.1.2.RELEASE 版本。其实通过分析SpringBoot对于Quartz的自动化配置源码,也有助于我们理解Quartz的使用SpringBoot-2.1.2.RELEASE 版本已经集成了对于Quartz的自动化配置,其源码路径为org.springframework.boot.autoconfigure.quartz 集成简单实现 Pom依赖 # Web工程 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> # quartz <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> # 数据库JDBC <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> # 使用MySql <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 编码功能实现 由于Springboot2的自动化配置,不需要做任何配置,直接写JobDetail、Trigger、Job 即可实现 # Job 实现 @DisallowConcurrentExecution public class DemoJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.

win7安装swoole

一、下载Cygwin和swoole Cygwin 官方地址:http://www.cygwin.com/ swoole 官方下载地址:https://github.com/swoole/swoole-src/ 二、安装Cygwin 一直默认下一步,可自行添加163地址,http://mirrors.163.com 搜索安装如下pachkage,最好安装我指定的版本,别漏 默认下一步,直到安装成功 三、安装swoole 下载的swoole-src-master【已解压】放入cygwin64\home下 进入cygwin命令行: 1、cd /home/swoole-src-master 2、phpize 3、./configure 4、make 5、make install 6、vi /etc/php.ini 插入extension=swoole.so 7、php -m查看是否安装成功 碰见的错误: 1、make的时候出现 In file included from /home/swoole-src/swoole.cc:20:0: /usr/include/php/ext/pcre/php_pcre.h:27:10: 致命错误:pcre2.h:No such file or directory #include "pcre2.h" 回答:没有按照如图所示的版本安装pachkage 2、checking how to run the C++ preprocessor... /lib/cpp configure: error: in `/home/swoole-src-master': configure: error: C++ preprocessor "/lib/cpp" fails sanity check See `config.log' for more details 回答:安装包目录下,cmd 执行: C:\cygwin64>setup-x86_64.exe -q -P wget -P gcc-g++ -P make -P diffutils -P libmpfr-devel -P libgmp-devel -P libmpc-devel

JVM常用GC日志打印参数

1. PrintGC 最简单的GC参数。 启用配置:-XX:+PrintGC 日志如下: 根据上面红色方框内的数字1、2、3、4、5说明,1是GC类型,GC:minor GC(young gc),Full GC:major GC,2是GC前堆内存使用量,3是GC后堆内存使用量,4是堆内存总量,5是本次GC耗时 2. PrintGCDetails 打印GC的详细信息 启用配置:-XX:+PrintGCDetails 日志如下: 不同的垃圾回收器,GC日志(表示年代的词)可能会不一样, 和第一节中差不多,->前的是GC前堆内存使用量,->后面是GC后堆内存使用量,括号内是堆内存总量。 对于这个日志,PSYoungGen:年轻代,ParOldGen:老年代,PSPermGen:持久代(方法区) Times: user表示用户态CPU耗时,sys表示系统CPU耗时,real表示GC实际耗时 3. PrintGCTimeStamps GC时,打印进程启动到现在经历的时间 启用配置:-XX:+PrintGCTimeStamps 日志如下: 红色方框内的时间,表示进程启动到现在经历的时间 该参数需要配合其它GC日志打印参数一起使用,如下 4. PrintGCApplicationStoppedTime 打印GC时,应用停顿时间 启用配置:-XX:+PrintGCApplicationStoppedTime 日志如下: 5. PrintGCApplicationConcurrentTime GC时打印应用执行时间 启用配置:-XX:+PrintGCApplicationConcurrentTime 日志如下: 6. PrintHeapAtGC 每次GC前后打印堆信息 启用配置:-XX:+PrintHeapAtGC 日志如下: p.s. 上面几个参数可同时配合使用,同时使用PrintGC和PrintGCDetails时,打印的详细信息。 GC日志信息默认是打印到控制台,如果需要输出到文件,可以使用参数:-Xloggc:gc.log,gc.log是要输出的日志文件,路径为应用启动路径的相对路径下,也可以使用绝对路径。

xml文件报错 error: Error parsing XML: unbound prefix

在网上找到了一段比较好的安卓页面代码,想要添加到自己的项目中去,导入新的layout文件是出现: error: Error parsing XML: unbound prefix,这个错误。 对于我来说,这个错误的意思是说找不到gen目录下的一个含有R.java.文件的包。 这是我找到的代码 一开始我找不到 xmlns:zhy="http://schemas.android.com/apk/res/com.example.zhy_slidingmenu" 这个文件,后来才知道这个文件在gen目录下 之后我把自己项目下的这个文件包替换掉就能够编译成功了。 

Chrome浏览器占用内存过高解决办法

最近一直使用chrome 浏览器进行页面测试,动不动就占用很大的内存,一开始以为是自己的网页加载图片过多导致的,但是后面发现还是太傻太天真,清缓存关网页,还是赶不上直接内存过高直接卡死状态,所以现在就把找的方法再写一下下。实际干货属于转载! 1、常用清缓存方法 shift +ctrl +delete 这个清缓存和历史记录用 2、禁用某些特别占内存的扩展 快捷键 shift+esc 查看chrome 的任务管理器,然后找到扩展程序,如果感觉占得很大,那就结束进程吧 3、临时禁用某些杀毒软件 这个还没找到实例,大概意思就是服务禁用 

“是男人就下一百层”h5游戏全网最详细教学、全代码,js操作

“是男人就下一百层”h5游戏全网最详细教学、全代码,js操作 博主的话游戏展示编程工具介绍游戏代码代码讲解js 第一步 切换div的显示与隐藏js 第二步 在菜单页面用lufylegend插件封装英雄js 第三步 在菜单页面实现挑选英雄js 第四步 在游戏页面生成英雄js 第五步 在游戏页面制作滚动的背景js 第六步 在游戏页面添加地板!js 第七步 定义英雄上升、下降、死亡函数js 第八步 英雄与地板开始作用js 第九步 添加生命条、分数、声音显示js 第十步 排行榜 进行下一个游戏的开发!总结 博主的话 这里博主将展示此游戏的html和js部分的代码,主要是对这些代码的讲解,教大家如何编写这样一个简单的 h5小游戏。希望大家在认真看完博主的文章后,不但能编写“是男人就下一百层”,还可以发散思维,编写更多有 趣的小游戏。 如果想要跑程序的话,还需要css代码和图片资源;在js里面还用到了jq和lufylegend框架,这是开源的, 大家可以到网上下载。 对于要css代码和img资源的,下载地址: https://download.csdn.net/download/qq_43592352/12368545 游戏展示 看图说话 游戏初始界面: 游戏开始: 编程工具介绍 1’ Google浏览器。 我是在Google上跑的游戏,如果大家拿我的文件参照的话,尽量用Google。我做的时候没有考虑兼容性 ,觉得一个小游戏,没必要。 2’VS Code。 这个没什么要求的,我用的是VS Code,只要可以编html、css、js,什么都可以,个人喜好。 3’JQuery和lufylegend插件。 简单的说,它们两个也是js文件。只是被封装起来,方便各种功能的调用。 用的话<script src="js/lufylegend-1.10.1.min.js"></script> <script src="js/jquery-3.3.1.js"></script> 直接在相关的文件里引用就可以了。 4’JQuery介绍 jq简单来说就是对原生js的简化,使js的使用更加方便快捷。 5’lufylegend介绍 lufylegend是一种游戏开发引擎,它是通过html的canvas标签来操作的。里面有一些方法很好用,但是, 它的排版和监听和js一比实在是太麻烦,于是我就抛弃了lufylegend。我的js代码只用了lufylegend一点点的 游戏动作封装的函数。 而且,用lufylegend只是身边正好有一本它的书。个人觉得lufylegend不是最好的游戏引擎。大家对游戏 感兴趣的话,不妨去网上找一些更大众的开源引擎。 游戏代码 <html> <link rel="stylesheet" type="text/css" href="css/index.css"/> <script src="js/lufylegend-1.10.1.min.js"></script> <script src="js/jquery-3.3.1.js"></script> <body> <div id="

Oracle--其他复杂查询

其他复杂查询 当开发数据库应用程序时,除了使用基本查询、数据分组、连接查询、子查询之外,还需要使用集合操作符、层次查询、Flashback查询等。 一、使用集合操作符 集合操作符专门用于合并多条SELECT语句的结果,包括UNION、UNION ALL、INTERSECT和MINUS四个操作符。 这些集合操作符具有相同的优先级,当同时使用多个操作符时,会按照先后顺序引用这些集合操作符。 当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配。 另外,使用集合操作符具有以下限制: 集合操作符不适用于LOB、VARRAY和嵌套表列。 UNION、INTERSECT、MINUS操作符不适用于LONG列。 如果选择列表包含有表达式或者函数,那么必须为表达式或者函数定义列别名。 在介绍如何使用这些集合操作符之前,首先建立MANAGER表和WORKER表。 CREATE TABLE manager(id,name,job,sal) AS SELECT empno,ename,job,sal FROM emp where empno in(select distinct nvl(mgr,0) FROM emp); CREATE TABLE worker(id,name,job,sal) AS SELECT empno,ename,job,sal FROM emp where empno not in (select distinct nvl(mgr,0) FROM emp); 1.UNION UNION操作符用于取得俩个结果的并集。当使用该操作符时,会自动去掉结果集中的重复行,并且会以第一列的结果升序排列。 SELECT id,name,job FROM manager UNION SELECT empno,ename,job FROM emp; 2.UNION ALL UNION ALL操作符用于取得俩个结果集的并集。但与UNION操作符不同,该操作符不会取消重复值,并且不会对结果集数据进行排序。 SELECT id,name,job FROM worker UNION ALL SELECT empno,ename,job FROM emp;

Java基础类库之Observable(观察者模式)

说明 在 Java 程序中,类 Observable 和接口 Observer 的最大功能就是实现观察者模式。 举个例子 例如现在房地产调控比较严格,很多购房者都在关注着房子的价格变化,每当房子价格变化时,所有的购房者都可以观察得到。实际上以上的购房者都属于观察者,他们都在关注着房子的价格。这个观察变化的过程就可以成为观察者模式。 如果实现观察模式 在 Java 中可以直接依靠类 Observable 和 接口 Observer实现以上观察者模式的功能。在Java 应用中,需要被观察的类必须继承于 Observable 类。每个观察者类都需要实现 Observer 接口,其定义如下: public interface Observer{ // 第一个参数表示被观察者实例,第二参数表示修改的内容 void update(Observable o, Object arg) } 代码实例 import java.util.Observable; import java.util.Observer; // 继承 Observable 表示房子可以被观察 class House extends Observable{ private float price; // 加钱 public House(float price) { this.setPrice(price); } public float getPrice() { return price; } public void setPrice(float price) { // 每一次修改的时候都引起观察者的注意 super.

Linux内核驱动学习(八)GPIO驱动模拟输出PWM

文章目录 前言原理图IO模拟输出PWM设备树驱动端调试信息实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM。本篇的学习会将写一个驱动操作GPIO,同样的也可以发生PWM,因此这里还需要部分的硬件配合,需要一块开发板,当然可能还需要一台示波器。 原理图 和上一篇相同,引脚依然是GPIO3_D0,具体硬件肯定会不同,注意参考soc的datasheet和硬件原理图,先定位正确需要操作的GPIO。 IO模拟输出PWM 这里驱动实现的方式是先创建一个内核线程,如何创建内核线程可以参考Linux内核驱动学习(五)KThread学习总结,然后在线程函数一直循环反转IO口的输出。这里的目的单纯是为了学习操作GPIO,不建议项目中通过这种IO口模拟的方式去实现PWM的输出,而应该直接使用自带PWM功能的引脚。 设备树 gpio-demo { compatible = "gpio-demo"; gpios = <&gpio3 0 GPIO_ACTIVE_LOW>; }; 驱动源码中通过of_get_gpio接口去解析gpio。 驱动端 驱动源码中of_device_id结构体变量中的成员.compatible的值必须和设备树的设备节点兼容属性compatible的值相同; static struct of_device_id gpio_demo_of_match[] = { { .compatible = "gpio-demo"}, {}, } MODULE_DEVICE_TABLE(of,gpio_demo_of_match); static struct platform_driver gpio_demo_driver = { .probe = gpio_demo_probe, .driver = { .name = "gpio-demo-device", .owner = THIS_MODULE, .of_match_table = of_match_ptr(gpio_demo_of_match), } }; 在probe函数实现对设备树节点的解析,of_get_gpio对应gpio-demo节点下的gpios属性; 然后ret = devm_gpio_request_one(dev, gpio, GPIOF_DIR_OUT, pdev->name)语句初始化GPIO为输出引脚; static int gpio_demo_probe(struct platform_device *pdev){ int ret,i; struct device *dev = &pdev->dev; struct device_node *node = dev->of_node; if (!

一文了解人脸识别:从实现方法到应用场景都讲明白了

导读:在本文中,我们将会接触到一个既熟悉又陌生的概念——人脸识别。之所以熟悉,是因为人脸识别技术在我们日常生活中应用极其广泛,例如火车站刷脸验票进站、手机人脸解锁等;之所以陌生,是因为我们可能并不了解人脸识别的原理,不了解人脸识别的任务目标、发展历程与趋势。 那么,在本文中,我们将会对人脸识别技术的概念、应用、目标等做简要介绍,以便读者对这项技术有一个立体的认识。 作者:王天庆 如需转载请联系大数据(ID:hzdashuju) 人脸识别技术是如今十分热门的一项技术,掌握人脸识别技术的优势不言而喻。下面,我们将首先介绍人脸识别的基本概况。 01 何为人脸识别 人脸识别技术由来已久,这个概念没有一个严格的定义,一般有狭义与广义之分。 狭义的表述一般是指:以分析与比较人脸视觉特征信息为手段,进行身份验证或查找的一项计算机视觉技术。 从表述上看,狭义的人脸识别技术其实是一种身份验证技术,它与我们所熟知的指纹识别、声纹识别、指静脉识别、虹膜识别等均属于同一领域,即生物信息识别领域。因此,狭义上的人脸识别一般指的是通过人脸图像进行身份确认或查找的场景。 生物信息识别的认证方式与传统的身份认证方式相比,具有很多显著优势。例如传统的密钥认证、识别卡认证等存在易丢失、易被伪造、易被遗忘等特点。而生物信息则是人类与生俱来的一种属性,并不会被丢失和遗忘。 而作为生物信息识别之一的人脸识别又具有对采集设备要求不高(最简单的方式只需要能够拍照的设备即可)、采集方式简单等特点。这是虹膜识别、指纹识别等方式所不具备的优点。 人脸识别的广义表述是:在图片或视频流中识别出人脸,并对该人脸图像进行一系列相关操作的技术。例如,在进行人脸身份认证时,不可避免地会经历诸如图像采集、人脸检测、人脸定位、人脸提取、人脸预处理、人脸特征提取、人脸特征对比等步骤,这些都可以认为是人脸识别的范畴。 02 人脸识别的应用 近些年,随着人脸识别精度的提高,基于该项技术的产品也开始在我们生活中呈现“井喷”之势。 例如,早在2016年2月,北京站就开启了“刷脸”进站模式。如图1-1所示是北京站“刷脸”进站的使用提示。现在,越来越多的火车站开始采用“刷脸”进站方式替代人工检票,有效地加快了检票速度。 ▲图1-1 北京站“刷脸”进站使用提示 人脸识别的另外一个典型应用是手机解锁。随着iPhone X的诞生,苹果手机家族增添了一项新的身份验证方式,即所谓的Face ID。而苹果公司官方宣称,基于Face ID的识别准确率要远高于基于指纹识别的Touch ID。 实际上,通过人脸识别来解锁手机并不算什么新鲜事。早在Android 4.0时期,这项功能就已经集成在操作系统中了。只不过,由于种种原因,这项功能并未取得比较好的效果,因此无论是谷歌还是手机制造厂商都没有对此进行宣传,自然也不会被大众所了解。 值得一提的是,据说苹果公司在这项技术上的研发时间长达5年之久,直至iPhone X才搭载了完备的人脸识别功能,可见高精度的人脸识别技术并不是一种简单的技术。 上面的两个例子只是人脸识别应用的冰山一角,人脸识别技术的典型应用场景可以总结为如下几个场景。 1. 身份认证场景 这是人脸识别技术最典型的应用场景之一。门禁系统、手机解锁等都可以归纳为该种类别。该方法与传统的钥匙开锁、指纹识别、虹膜识别等均属于身份认证。这需要系统判断当前被检测人脸是否已经存在于系统内置的人脸数据库中。如果系统内没有该人的信息,则认证失败。 2. 证件验证场景 证件验证与身份认证相似,也可称为人脸验证,是判断证件中的人脸图像与被识别人的人脸是否相同的场景。在进行人脸与证件之间的对比时,往往会引入活体检测技术。 或许大家对活体检测技术并不陌生,就是我们在使用互联网产品时经常会出现的“眨眨眼、摇摇头、点点头、张张嘴”的人脸识别过程,这个过程我们称之为基于动作指令的活体检测。活体检测还可以借由红外线、活体虹膜、排汗等方法来实现。 不难理解,引入活体检测可以有效地增加判断的准确性,防止攻击者伪造或窃取他人生物特征用于验证,例如使用照片等平面图片对人脸识别系统进行攻击。 3. 人脸检索场景 人脸检索与身份验证类似,二者的区别在于身份验证是对人脸图片“一对一”地对比,而人脸检索是对人脸图片“一对多”地对比。例如,在获取到某人的人脸图片后,可以通过人脸检索方法,在人脸数据库中检索出该人的其他图片,或者查询该人的姓名等相关信息。 这与我们在数据库中进行查询是一样的,但人脸检索要比在数据库中查询常规数据复杂得多,例如该以何种方式才能建立高效的人脸图片检索索引呢? 人脸检索的应用场景非常多,一个典型的例子是在重要的交通关卡布置人脸检索探头,将行人的人脸图片在犯罪嫌疑人数据库中进行检索,从而比较高效地识别出犯罪嫌疑人。 4. 人脸分类场景 我们这里指的人脸分类主要包括判断人脸图片中的人脸是男人还是女人,所属的年龄区间是怎样的,是什么样的人种,该人的表情是什么等。当然,人脸分类能够实现的功能远不止于此,在很多场景中具有重要的应用价值。 例如,社交类App可以通过用户上传的自拍图片来判断该用户的性别、年龄等特征,从而为用户有针对性地推荐一些可能感兴趣的人。 5. 交互式应用场景 美颜类自拍软件大家或许都很熟悉,该类软件除能够实现常规的磨皮、美白、滤镜等功能外,还具有“大眼”“瘦脸”、添加装饰类贴图等功能。 而“大眼”“瘦脸”等功能都需要使用人脸识别技术来检测出人眼或面部轮廓,然后根据检测出来的区域对图片进行加工,从而得到我们看到的最终结果。 添加装饰类贴图也是在这个基础上实现的,可以认为这是一种AR(增强现实)应用。其实,交互式的应用场景远不止于此,还有许多游戏也属于这种交互式的应用场景。 6. 其他应用 上面所述的内容是人脸识别中应用比较广泛的领域。其实,除这些领域外,人脸识别还有许多其他的应用。 例如,人脸图片的重建技术可以应用到通信工程领域,实现低比特率的图片与视频传输;基于人脸识别技术,可以实现人脸图片的合成,甚至直接将一个视频中的人脸完全替换为另外一个人的脸。其中一个经典的项目是DeepFake,利用该项目可以实现“视频换脸”功能,实现的效果足以以假乱真。 我们可以在日常生活中体会到人脸识别技术为我们的生活带来的便利。随着技术的进一步发展,将会有越来越多的人脸识别相关项目落地。在后面的实战内容中,我们将会围绕这些应用场景,具体介绍其原理与实现方法。 03 人脸识别的目标 我们已经介绍了人脸识别的不同应用场景。在不同的应用场景下,人脸识别的目标可能是不相同的。但是,对于绝大多数的人脸识别应用场景,人脸识别的目标是类似的。 人脸识别的大致流程可以描述为:通过人脸识别模型判断图片中是否存在人脸,如果存在人脸,则定位到该人脸的区位,或者提取该人脸图像的高级特征,作为该人脸图像的特征向量,并用在后续对图片的处理中。 由于人脸识别的应用场景不同,上述步骤的选择和侧重点也不尽相同。例如: 定位人脸在图片中的位置,可以用于诸如AR等贴图操作; 通过定位人脸的关键点,可以对人脸图片进行几何变换,通过几何变换可以实现对图像中人脸的校正,与此同时,得到的人脸关键点还可以用来实现诸如“瘦脸”等操作; 如果想要实现的功能并不是对人脸图片的几何变换,而是对图片中的人脸进行特定判断,如判断图片中人脸的性别、年龄等,那么此时的目标是提取出图片中人脸的高级特征,然后根据提取出来的高级特征,使用分类器进行分类,即可以实现诸如性别识别、年龄判断等功能; 对于人脸对比,一个可行的思路仍然是提取图片中人脸的高级特征,然后对这两个特征进行对比,从而得出一个相似度数值,通过比较该数值与预设阈值的大小,从而判别两张图片中的人脸是否属于同一个人。 ▲图1-2 一种人脸对比解决方案的流程图 从上面的介绍中我们可以看出,不同人脸识别应用的很多步骤都是重合的,其差异仅在于操作层次的深浅。通过合理选择、组合对人脸图片的操作层次,就可以实现我们预期的目标。 这个实现过程可以说是“万变不离其宗”,最核心的技术便是提取人脸图像的高级特征,我们将会在后续的例子中逐步印证这一点。

AndroidStudio取消撤销、AS取消撤销;Ctrl+Shift+Z;

一般Window中 Ctrl+Z是撤销 、 Ctrl+Y 是取消撤销; AS中 Ctrl+Z是撤销 、 Ctrl+Shift+Z 是取消撤销 、Ctrl+Y 是删除此行; 如果Ctrl+Shift+Z不能用,查看是不是和其它快捷键冲突,尤其是搜狗输入法很多都和AS快捷键冲突;

win10如何查看文件夹的大小 - 方法大全

文章目录 还在苦恼win10如何查看文件夹的大小?`方法一 ` · 步骤如下:`方法二 ` · 简述如下:`方法三 ` · 简述如下: 还在苦恼win10如何查看文件夹的大小? 基于win10开发商自身的考量,好像没有直接显示文件夹大小的设置,只有单个文件的大小显示。 这里,先给你个方法参考。 方法一 · 步骤如下: 按住 Alt+双击 文件夹,快速打开 属性;按 Esc 瞬间关闭 属性。 方法二 · 简述如下: 鼠标指针指到文件夹,等一会儿就会显示大小的。 如果没有耐心,就不要说不会显示。 多等几秒,确实可以显示整个文件夹的大小 方法三 · 简述如下: 右键,然后选择“属性” 以上就是关于“ win10如何查看文件夹的大小 - 方法大全 ” 的全部内容。

max no of 100 conversations exceeded

今天接到了外围系统连SAP的报修,说连SAP连不上了,查看外围系统日志如下: T:1736 Error in program ‘SearchingProcess’: ======> SAP_CMINIT3 : rc=20 > Connect to SAP gateway failed Connect_PM GWHOST=xxx, GWSERV=sapgwxx, SYSNR=xxx LOCATION CPIC (TCP/IP) on local host ERROR max no of 100 conversations exceeded TIME Sun May 06 11:03:14 201 RELEASE 710 COMPONENT CPIC (TCP/IP) VERSION 3 RC 466 MODULE r3cpic.c LINE 14107 COUNTER 22 我检查了SAP服务器的如下参数。设置的值都远大于100 SAP应用级别参数 – gw/max_conn rdisp/max_comm_entries gw/max_sys SAP DI的OS级别参数 – CPIC_MAX_CONV 后来,经过SAP notes:314530 and 316877,1507034提示,查到还要在java系统的服务器端添加变量CPIC_MAX_CONV。

windows下比telnet服务更安全的有什么可以代替?

众所周知,Windows系统是有提供telnet服务的,类似于Linux的ssh,可以远程登录主机执行命令。但 是众所周知,telnet的网络传输是明文传输的,而linux的ssh则是加密传输的。 windows服务器下,用telnet太不安全了,那么有没有什么类似ssh的更加安全的服务?

什么是ARP协议,都分为那些类型,各自的功能是?

ARP协议:地址解析协议(正向、反向、无故、代理) 1、正向ARP: 当一台设备知道对方的IP地址,不知道对方的MAC 地址时,启动ARP,发送ARP Request请求广播包到其他主机,收到广播包的主机查看,只有该请求的设备才会单播回答ARP Reply响应包 ARP工作流程:三层往二层封装时,先要查询本机的ARP 表,如果有则封装二层,如果没有则启动ARP 来查找关于目标的 MAC,查找完成后记录在ARP 表中。 1)每个主机都会在自己的ARP缓存区中建立一个ARP列表,用来表示IP地址和MAC地址的对应关系 2)当原主机要发送数据时,首先检查ARP表中是否有对应的IP地址的目的主机的MAC地址,如果有,则直接转发数据,如果没有,就想本网段的所有主机发送ARP请求数据包(洪泛),该数据包内容包括:源主机IP地址、源主机MAC地址,目标主机的MAC地址 3)当本网络的所有主机收到了该ARP洪泛数据包时,首先检查数据包中的IP是否是自己,若不是,则忽略,若是,则把数据包的源主机的IP地址和MAC地址写入自己的ARP列表中,若存在则覆盖,后将自己的MAC地址写入ARP的响应包中,告诉源主机自己是他要找的MAC地址 2、反向/逆向ARP: 当一台设备知道对方的MAC地址,不知道对方的IP 地址时,启动ARP,发送ARP Request请求广播包到其他主机,收到广播包的主机查看,只有该请求的设备才会单播回答ARP Reply响应包 3、代理ARP: 1)为什么需要有代理ARP:一个网络范围的设备如果想和另一个网络范围的设备通信时,无法获得另一个网络范围设备的MAC,为什么?网络中的路由器挡住了广播包。需要找到网关,且要知道网关的IP,把数据传到网关才能到达目标,进而需要获得网关的MAC。路由器的一个重要功能就是把局域网广播包限制在该网内,不让扩散,否则会造成网络风暴。ARP request是广播包,它询问的对象若在同一个局域网内,就会回答。但如果不在同一个局域网内,就需要路由器提供一个服务:代理ARP 2)什么是代理ARP : 路由器/三层接口收到ARP request时,若发现查询的目的IP地址在不同子网,路由器/三层接口会扮演代理ARP的角色,代为回答,告诉查询者它所查询的MAC地址 4、免费/无故ARP: 作用:公告自己,检测重复地址,在ARP报文中请求的IP地址为自己的IP地址 重复地址检测,清除主机ARP 缓存,通告数据链路链接标识

minerd和kworkerds感染

检测到服务器有异常文件下载,当时没太注意,执行下面操作解决问题(简单针对于minerd处理) 1、执行 top -i命令查看cpu 使用总过高,使用top -l 查看到是minerd作祟, 2、果断ps -ef | grep ‘minerd’ 查看pid, 3、使用kill -9 程序的pid 杀死掉, 4、到 cd /tmp/下查看是否存有临时文件,如果有rm -rf 删除,没有就算了 5、crontab -l 查看是否有定时,有的话到cd /etc/crontab 查看是否有陌生的定时任务,如果有也是直接删除, 6、然后top 再查看,成功了,然后查阅了资料,说redis 漏洞,果断修改了ssh密码,修改redis的端口,修改了登录数据库密码,一切看起来就是这么简单 然而我把一切想的太过简单,周六周日开心出去泡妞,又收到阿里云同样的通知,无奈再深恨的bug也不能阻挡我缓解压力的事件,周一早上打开阿里云账号,我靠,发生了什么, xx.xx.xxx.xx(ixxxxx...)出现了可疑安全事件:Linux异常文件下载 ,建议您立即登录云盾-态势感知控制台查看详情和处理。 于是登录服务器查看。我嘞靠,输入一条命令ls 反应比乌龟还慢,然后每条命令反应都在3秒才能出结果,靠,3秒男人,我可受不了,于是从花了一天时间才解决掉,废话够多了,看下面, 1、命令 top -i 查看,我去,满满的cpu 2、于是 top -b ,呀有毒,居然没有占用大的cup资源 3、于是又 使用crontab -l 查看,赤裸裸定时任务,这又是什么鬼,矿机不是解决了吗?这那来的任务, 4、cd /tmp/ 下,三个莫名其妙出现的文件,果断 rm -rf 文件名删除 5、ls -al 看下,果然还有隐藏文件,通通删除 6、去cd /etc/crontab ,删除定时任务,然后top -i,得到如下,cup依然张立在哪里,懵逼 7、top -b 多了一个python,干啥的不知道,查看删除进程python 8、最后去查看日志,如下顺着这个日志一步一步走下去, 9、cd /etc,下rm -rf ld.so.preload 10、cd /usr/local/lib下 rm -rf libjdk.

Latex之使用algorithm2e包来写算法

algorithm2e是latex上用来写算法的包。 目前还有很多,比如algorithmc等。两者的语法不同。 使用时要先导入包: \usepackage[ruled,linesnumbered]{algorithm2e} 下面贴出一个示例: \begin{algorithm}[t] \caption{Event Detection} \label{algo:event} \LinesNumbered \KwIn{FFT Bins $B_{1}, B_{2}, B_{3}, ..., B_{n}$} \KwOut{Event start point $S$, end point $E$} \For{i=1:n}{ \eIf{max($B_{i}$) : max($B_{(i+4)}$)$>$-80}{ $S$=i; \tcp*{Start Point} \For{j=S:n}{ \eIf{max($B_{j}$) : max($B_{(j+4)}$)$<$-100}{ $E$=j; \tcp*{End Point} Return [$S,E$]; }{j++;} } }{ i++;} } \end{algorithm} 得到的结果如下: 下载与详细的使用请参考手册 几个注意的点: 在algorithm2e中,\If, \Else, \ElseIf都是会以endif结尾的,而\uIf, \lIf, \uElse, \lElse, \uElseIf, \lElseIf都是不带endif的。u和l的区别是,u是块级元素,而l是行内元素。 比如在上面的示例中,带else的if是\elf,如果只使用\Else会使else后也多出一个end来。\tcc是/* */注释, \tcp是//注释. 在if句使用注释时, \If(注释){条件}使用algorithm2e就不可以再使用\usepackage{algorithm}和\usepackage{algorithmic}. 其他注意事项,这里有一个参考:https://blog.csdn.net/jlu_leven/article/details/8948997

用垃圾清理下,出现谷歌浏览器不能打开的问题解决办法?

目的:修复谷歌浏览器 经过:我使用的电脑经常不关机,使用一段时间就产生很多垃圾文件,系统越用越慢;有时候还要杀毒,两次都导致了谷歌浏览器不能打开!关机重启还是打不开;我最心疼的是我之前收藏的资料;我寻找其它的方法都没有解决!我偶然间使用以下办法找回我想要的资料,分享给大家 我第一步是想到先升级,升级后还是打不开! 第二步打开资源管理器,结束谷歌后台的程序 第三步再打开就可以了,看下自己收藏的网址还在!6666!希望帮到你!

面向对象是一种管理方法,它仅仅是把管理形式从文件层转移到了代码层罢了

面向对象是一种管理方法,它仅仅是把管理形式从文件层转移到了代码层罢了。 在以前主流C、C++语言中,我们一直都只需要写函数式、局部变量、全局变量就完事了,至于如何管理这些东西、该放在哪里,它们根据雏形的面向对象思想,将有关的函数式、各种不同生命周期的变量放在一起,放在同一个文件当中,此时,面向对象的思想通过文件管理的形式体现出来,即:一个文件就是一个类。这是程序员们头脑中的规范和自己的规定,代码并不限制一个文件就只能写一个类,代码中也没有类、对象这种思想。 后来有人尝试将这种除了实现之外的管理思维、面向对象思想在代码里实现,与文件无关,比如Java,一个文件即一个类,诞生了类是模具、对象是实体的思想,把业务分为不同个类分开实现,一般每个类都需要按照Java规定单独创建一个文件。 其实面向对象代码只不过是把面向对象管理方式的体现形式,从文件层次上搬移到了代码层次上而已罢了,面向对象思想重在管理。

操作系统市场份额

1、操作系统市场份额 Windows Server 2008 > Windows Server 2012 > Windows Server 2003 > Linux 以前一直以为服务器操作系统主要是Linux的天下,原来依旧是Windows占主流 2、Unix和Linux

golang context 超时控制

常见方法 context.WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) 指定时长超时结束context.WithCancel(parent Context) (ctx Context, cancel CancelFunc) 手动结束context.WithDeadline(parent Context, d time.Time) (Context, CancelFunc) 指定时间结束 Demo 父ctx超时,关闭所有子ctx package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithTimeout(context.TODO(), time.Second*3) defer cancel() go task(ctx) time.Sleep(time.Second * 10) } func task(ctx context.Context) { ch := make(chan struct{}, 0) go func() { // 模拟4秒耗时任务 time.Sleep(time.Second * 4) ch <- struct{}{} }() select { case <-ch: fmt.

HTML5动画如何最高效地制作?

众所周知,HTML5+CSS3新出了很多动画相关视觉炫酷的支持,用前端就可以做出来动画。 那么怎么做H5动画才是最高效的? 传统的方法就是,通过前端人员用技术代码把UI设计师设计好的素材串联起来,构成动画。中途需要面对很多前端代码,并且调试方法非常低效,改一改代码,看一看,所有的动画部分都得通过代码来创建修改,算是比较麻烦的。如果是不会前端代码的设计师,就无法创建基于H5的动画。即使是前端人员,在开发与调试时的工作也会很啰嗦繁琐,一些基本的代码与概念总是不断地需要面对。 Adobe Animation CC就是一款解决这种基于H5动画开发的软件,利用它可以创作能够运行在前端页面的动画,并且提供可视化操作界面以供设计师使用,轻松开发基本动画内容。并允许设计师用前端代码,在界面创作的基础上,进行更深层次、更复杂的动画拓展。它是一个创作开发工具,面向设计师,让用户能更多地面向设计本身而非技术代码逻辑。 有关Adobe Animation CC的介绍、体验请见:https://blog.csdn.net/camillezj/article/details/80405764 代码是万能的,用代码可以创建出最大复杂度和可能性的作品,但是代码并不人性化,开发效率不高,因此才需要更加贴近用户体验的开发工具,例如Adobe Photoshop处理图片、3D建模、音视频处理等可视化开发工具。这些工具都有一个共同特点就是开发时可实时预览预期效果,所有可能的操作都通过界面列举出来,符合人性。