习题8-2 在数组中查找指定元素 (15分)

一、需求 本题要求实现一个在数组中查找指定元素的简单函数。函数接口定义如下 int search( int list[], int n, int x ); 其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数; x是待查找的元素。如果找到,则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。 二、裁判测试程序样例 #include <stdio.h> #define MAXN 10 int search( int list[], int n, int x ); int main() { int i, index, n, x; int a[MAXN]; scanf("%d", &n); for( i = 0; i < n; i++ ) scanf("%d", &a[i]); scanf("%d", &x); index = search( a, n, x ); if( index != -1 ) printf("index = %d\n", index); else printf("

通过手撸线程池深入理解其原理(下)

==> 学习汇总(持续更新) ==> 从零搭建后端基础设施系列(一)-- 背景介绍 摘要:上篇实现了简单的无锁线程池,中篇实现了简单的加锁线程池,本篇着重剖析java线程池源码。 一、基础概念 其实,把下面这些参数概念理解了,看线程池源码像看helloworld一样简单。 corePoolSize 核心线程数量,什么是核心线程呢?就是一创建出来就常驻内存,不退出不销毁,直观点看,代码长这样public void run(){ while(true){ //不停的执行任务或者等待执行任务 } } maximumPoolSize 最大线程数量,什么是最大线程数呢?就是这个线程池最多能同时运行的线程数量。比如核心线程数是5,最大线程数是10,那么当5个核心线程不够用的时候,会最多再创建5个线程,达到最大线程数10。那么疑问就来了,非核心线程会被回收吗?答案是不确定,根据你设置的存活时间来定。keepAliveTime 线程保持存活的时间,通俗的讲就是,某个线程在给定的时间内没有接活,那么就会退出销毁了。那么这个设置只对非核心线程有效吗?答案是否定的,线程池还有个参数可以设置核心线程也能被回收。BlockingQueue 阻塞队列,什么是阻塞队列呢?和普通的队列有什么不一样?这人家的名字不是已经告诉你了嘛,区别在于人家可以阻塞。就是当队列为空的时候可以阻塞在那里等着。来简单看看其中一个阻塞队列LinkedBlockingDeque的实现。public E takeFirst() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lock(); try { E x; //如果队列一直为空,那么就一直阻塞在那 //当队列不为空了,notEmpty.await()会被唤醒 while ( (x = unlinkFirst()) == null) notEmpty.await(); return x; } finally { lock.unlock(); } } …… public E pollFirst(long timeout, TimeUnit unit) throws InterruptedException { long nanos = unit.toNanos(timeout); final ReentrantLock lock = this.

ZUCC操作系统原理习题 设备和文件管理

由ZUCC INTERSECTION题库提供答案。 1.磁带上的文件只能是()。 编号选项A以双字为单位存取B直接存取C顺序存取D随机存取 2.下列哪种设备不是从设备分配策略角度来说的。 编号选项A独享设备B虚拟设备C共享设备D系统设备 3.考虑一个含有100个数据块的文件。假如文件控制块(和索引块,当用索引分配时)已经在内存中。如果想在文件的第45块后面,插入一个数据块,那么,采用()时,操作时间最长。假设待添加块的信息已在内存中。 编号选项A连续分配策略B链接分配策略C多级索引分配策略D单级索引分配策略 4.访问磁盘的时间不包括()。 编号选项A寻道时间BCPU调度时间C读写时间D旋转等待时间 5.在下面的I/O控制方式中,需要CPU干预最少的方式是_____。 编号选项A直接存储器访问DMA控制方式B程序I/O方式C中断驱动I/O控制方式DI/O通道控制方式 6.某操作系统采用双缓冲传送磁盘上的数据。设从磁盘将数据传送到缓冲区所用时间为T1,将缓冲区中数据传送到用户区所用时间为T2(假设T2<<T1),CPU处理数据所用时间为T3,则处理该数据,系统所用总时间为()。 编号选项AT1+T2+T3BMAX(T2,T3)+T1CMAX(T1,T3)DMAX(T1,T3)+T2 7.为了允许不同用户的文件具有相同的文件名,通常在文件系统中采用()。 编号选项A约定B重名翻译C多级目录D路径 8.一般情况下,用户不免要对操作系统中管理的设备进行一些设置,这时所用到的设备名,通常是_____。 编号选项A物理设备名B逻辑设备名C虚拟设备名D共享设备名 9.某磁盘寻道,采用最短寻道时间优先算法,如果将要访问的磁道分别是27,136,58,100,72,40,而当前磁头在80道上,则磁头移动的道数是()。 编号选项A80B136C165D162 10.文件使用完毕后应该()。 编号选项A释放B备份C卸下D关闭 11.某磁盘采用位示图管理磁盘空间,磁盘共有16个盘面,每个盘面有80个磁道,每个磁道有16个扇区,则该磁盘位示图占用()磁盘空间。 编号选项A2KBlKC2.5KD3.5K 12.SPOOLing系统提高了下列_____计算机资源的利用率。 编号选项A独占设备B共享设备C文件D主存设备 13.()调度算法总是从等待访问者中挑选等待时间最短的那个请求先执行。 编号选项A电梯B单向扫描C最短寻找时间优先D先来先服务 14.系统为了管理文件,设置了专门的数据结构–文件控制块(FCB)。FCB是在执行下列()系统调用时建立的。 编号选项AcreateBopenCreadDwrite 15.在文件存储设备管理中,有三类常用的空闲块管理方法,即位图向量法,空闲块链表链接法和()。 编号选项A一级目录法B索引法C多级目录法D分区法 16.通过硬件和软件的功能扩充,把原来独占的设备改造成若干用户共享的设备,这种设备称为_____。 编号选项A存储设备B虚拟设备C系统设备D用户设备 17.CPU输入数据的速度远远高于打印机的打印速度,为了解决这一矛盾,可采用_____。 编号选项A并行技术B虚存技术C缓冲技术D通道技术 18.对磁盘进行移臂调度的目的是缩短() 编号选项A传送时间B启动时间C寻找定位时间D旋转延迟时间 19.常用的文件存取方式有随机存取和()。 编号选项A页式存取B记录存取C流式存取D顺序存取 20.下列算法中用于磁盘调度的是_____。 编号选项ALRU算法B时间片轮转法C优先级高者优先算法DSCAN算法 @Power By Exercises-Manager

VSCode搭建C/C++编译环境

期末实在是太痛苦了,各种报告论文作业要写,简直不要太惆怅啊。还好,还好,马上就要结束了,再考完几场试,这迷人的网课终于要结束了。哈哈哈哈哈。网课结束这学期也就结束了,总的来说个人收获还是不错的,因为没有浪费自己的时间,这就是最好的结果。 前天,一起学习的伙伴问我VSCode能不能用运行C和C++语言,我也没用过,就去CSDN上看教程,就是需要装插件,再配置俩文件就ok了。今天,我把搭建的过程写下吧,方便以后忘记了,可以再回头看看。 VSCode中需要的插件 第一个:C/C++ 这个插件是用来搭建环境的; 第二个:Code Runner 是用来运行C、C++代码的。 搭建环境的步骤 1.安装上面的插件; 2.插件装好之后,还是不行的,需要在电脑上装编译调试器,这里我用的是MinGW,去官网下载,点击download。 3.下载后,安装MinGW即可。 点击All Packages ,下图中的两个文件必须选择,是c和c++的编译环境。 这个gdb的文件,是调试代码用的,我也安装了,如果不需要可以不选择。 选择好之后,点击installation,选择Apply changes。继续下一步,安装即可。安装的过程中可能会出错,关闭继续安装就好了。结束后,再安装一遍,直达整个安装过程不出错就说明文件全部安装好了。 4.配置环境变量 此电脑右键——属性 5.检测是否安装成功 window+R进入cmd,输入两个命令:gcc -v ;g++ -v。如果出现了相应的信息,则说明安装成功。 配置tasks和launch文件 首先新建一个文件夹,使用VSCode打开。这里我新建的文件夹是专门用来存放C和C++文件的。 使用VSCode打开此文件夹,编写一个.c文件。发现会报错,所以,现在需要在当前的文件夹中新建.vscode文件夹,用来存放tasks.json 、launch.json文件。我这里给出的配置文件里含有配置debug的语句,若是不想要,可以去掉。 launch.json { "version": "0.2.0", "configurations": [{ "name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示 "type": "cppdbg", // 配置类型,这里只能为cppdbg "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加) "program": "${workspaceFolder}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径 "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可 "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,一般设置为false "cwd": "${workspaceFolder}", // 调试程序时的工作目录,一般为${workspaceFolder}即代码所在目录 "environment": [], "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台 "

深入理解TypeScript - 认识TypeScript&配置详解

为什么使用TypeScript? 最初使用TypeScript开发项目的时候,觉得很繁琐,定义每一个变量还要加上类型,尤其是对象形式的,几乎每一个用到的都要定一个接口,还要为每一个接口起一个易读的名字,写起来很麻烦。 但是,目前用TypeScript的人越来越多,尤其是一些大厂,大的项目。github上面很多开源项目也都是ts语法编译的。所以不得不重新考虑下它的价值,为什么会有那么多人选择使用它? 新建一个空文件夹。 我们都知道JavaScript是一种弱类型语言,定义一个变量可以赋予任何类型的值: // index.js var js = '若类型语言' js = true; 上面的写法是允许的。 在TypeScript中,这种写法是不允许的: // foo.ts var ts = '类型检查' ts = true 即使我没有给ts变量定义类型,它也会被推断为string类型,只要有了类型,它就不能被赋值为其它类型。可以在编译阶段就发现大部分错误,这总比在运行时候出错好。 定义一个函数: // foo.ts function foo(type: string) { return function (obj: any): boolean { return Object.prototype.toString.call(obj) === `[object ${type}]` } } foo('Object') 当调用这个函数的时候,可以很方便的看好这个函数的参数类型和返回值,从而知道使用方式。 综合意思可以总结TypeScript一些优点: TypeScript 增加了代码的可读性和可维护性 § 类型系统实际上是最好的文档,大部分的函数看看类型的定义就可以知道如何使用了可以在编译阶段就发现大部分错误,这总比在运行时候出错好 TypeScript还有一些特点: TypeScript 是 JavaScript 的超集,.js 文件可以直接重命名为 .ts 即可即使不显式的定义类型,也能够自动做出类型推论可以定义从简单到复杂的几乎一切类型即使 TypeScript 编译报错,也可以生成 JavaScript 文件兼容第三方库,即使第三方库不是用 TypeScript 写的,也可以编写单独的类型文件供 TypeScript 读取 模块 全局模块 一个TypeScript项目中,使用的是新的方式写代码,但是运行在浏览器端的还是JavaScript,所以需要将写好的ts文件编译成js文件,TypeScrip提供这样的功能。

操作元素之修改样式属性

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> div { width: 200px; height: 200px; background-color: pink; } </style> </head> <body> <div></div> <script> // 1. 获取元素 var div = document.querySelector('div'); // 2. 注册事件 处理程序 div.onclick = function() { // div.style里面的属性 采取驼峰命名法 this.style.backgroundColor = 'purple'; this.style.width = '250px'; } </script> </body> </html>

C++ Prim算法Kruskal算法构造可以使n个城市连接的最小生成树

数据结构课程设计(最小生成树) 获取源码在文末 本来是给一个同学做的课设作业 现在分享给大家 希望大家多加支持 1、 设计目的和要求 (1)、实验题目:给定一个地区的n 个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并得到的最小生成树的代价。 (2)、实验要求: 1、城市间的距离网采用的邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。 2、表示城市间距离网的邻接矩阵(要求至少6个城市,10条边) 3、最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。 2、 设计内容及步骤 (1)、问题分析及采用数据结构: 1、根据题目要求,首先要建立城市间的距离网,并且采用邻接矩阵表示,则使用到的数据结构是图的形式。图的作用是实现城市的距离网,采用顺序存储结构。数据结构可以用如下表示: typedef struct { SeqList Vertices; //存放图中各结点 int edge[MaxVertices][MaxVertices]; //存放权值的二维数组 int num_edge; //图的边数 }Graph; 2、完成距离网的存储后,就要用Prim算法和Kruskal算法来实验最小生成树。 Prim算法是以结点为最小生成树的开始,再找其相应的最小边来实现。可以设计为两个参数,一个参数为图G,另一个参数是通过函数得到的最小生成树结点数据和相应结点的边的权值数据closeVertex.所以其数据结构可以定义如下: typedef struct { DataType vertex; int weight; }TreeNode; Kruskal算法是以图中最小边开始慢慢寻找最小生成树的代价。所以它的结构包含最小边及边的两结点的下标,标置位是判断结点是否已经参加比较。其结构可以定义如下: typedef struct { int row; //行下标 int col; //列下标 int weight; //边权值 int flag; //标志位 }TreeEdge;//边信息 (2)算法设计 1、首先设计的是顺序表,用来存放图中的各个结点的信息。这样可以看到结点的多少,又可以知道每个结点对应的下标,便于操作。 2、图的操作:图的操作主要体现在要实现城市的距离网的信息,所以其操作有:初始化,插入结点、插入边。 A、 初始化GraphInitiate(G,n);初始化图G,n个结点个数。 B、 插入结点InsertVertex(G,vertex);在图中插入结点vertex. C、 插入结点InsertEdge(G,v1,v2,weight);在图中插入边<v1,v2>,边<v1,v2>的权值为weight. 3、prim算法的设计:Prim算法的函数设计为void Prim(Graph G);

分支限界法(一)LC-检索

一般方法 1、LC-检索 2、15-谜问题 3、LC-检索的抽象化控制 4、LC-检索的特性 一般方法 分治限界法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。但是二者搜索方式不同。 n-皇后问题的显示约束条件是同一行和同一列,因为显式约束条件是x,y都在[1,n]之间,在判断的时候就是按相等判断同时这就是判断行和列。隐式约束是对角线。 上面的编号不是进行搜索时候的编号,是按照显式约束条件生成的完全解空间树按照深度优先的次序编的号(看节点8,4567不是不存在而是在当前这个解空间树里不显示,相当于对完全解空间树进行剪枝) 是将生成节点的全部儿子也放进去了相同点就是使用限界函数来剪枝 FIFO:谁最先进去的就把谁先作为E-节点; LIFO:谁后进入的将谁先作为E-节点 ⭕️里的是之前用回溯的顺序,外面的是用这种方法生成的顺序 节点计算结果:有啥好的解决办法呢?因为现在分支限界的节点数很明显大于回溯了 一、LC-检索 由之前的一般方法中只有FIFO和LIFO这两种方法,完全没有体现出对可能具有答案节点的节点的照顾,只有对这些节点予以特殊照顾才能让我们更快的找到最后的答案。 给或借点表示中的节点赋予优先权 能不能有这样的优先级,这样的优先级应该怎么设置呢? 状态空间树中的任何节点只有以下几种可能 从上帝视角定义一个节点成本函数C(x):上帝视角就意味着我们不可能达到的视角,其实就是在当前情况下,还没有对🌲进行遍历就已经知道了下面是否有答案节点,如果有答案节点是否是最小的,俗称“先知”。 其实得到精确的成本函数C(x)的过程就是找到最优解的过程,就没啥意义了,所以要想办法大致估计节点成本。 对C(x)的一个估计: 由两个部分组成,就相当于由以往的经验对未来进行预测,但是这种预测是有误差的;同时要考虑到当前节点的成本,综合考量这两部分在整个的节点成本估计函数的比例。 进入活节点表里面的节点应该有它的C🎩值,谁的C🎩值最小,就把它作为下一个E-节点。 LC-检索的特殊情况 其实BFS和D-检索都可以用当C🎩的表达式中两种函数的特殊选择来表示。 因为g(x)=0,无影响;f(h(x))=节点的级数,也就是BFS队列实现的默认一样。 实际上是用一个限界函数的标准表示形式来统一所有情况。 为啥是D-检索呢?首先忽略f(h(x))的影响,而g(X)的定义是对于当前节点的子节点比当前的节点小,所以要将所有的小的算完才能选取,就相当于是堆栈检索 过程分析: 首先是根节点1,然后生成子节点2、3,压入堆栈,然后弹出节点3,生成节点4,5压入,然后弹出节点5,依次这样进行。 二、15谜问题 合法移动:空格周围的牌移到空格 position(3)=2;position(5)=7;position(12)=8;position(16)=6;(空格位置) less(X):明明号码比当前的值小,位置却比当前的值大的个数 ⚠️X的取值是在初始状态下进行取值 如何判断目标状态是否能达到? 给出判断目标状态是否在初始状态的状态空间中。 当然求解每一个节点的时候都需要用定理9.1先判断一下是否可以达到目标状态。 如果能往上到达棋盘的边界则一直向上移动,到了边边之后,就进行下一个向右,继续进行一直向右移动,到头,over and over 所以需要给出成本估计函数:C🎩 ⚠️C🎩是C的下界 ⚠️g🎩是最小移动数 最长从现在的位置如果可以到目标位置我最少不得不移动这些个位置,才能物归原位。 虽然一步到不了目标状态,但是如果要想到达一定要移动节点7移动1步 方法3:LC-检索 当前实例下,LC-检索几乎和使用精确函数c一样有效,LC-检索的选择性比很多检索方法强很多。主要是因为C🎩函数选择的好。 三、LC-检索的抽象化控制 抽象化控制思想 什么时候判断一个节点是答案节点非常重要。 算法的终止条件 如果LC检索算法在进行E-节点选择的时候使用的是最小堆,就是每一层的元素都先进入最小堆,这时候每一个状态的最小值都是在最小堆的堆顶,就实现了每一次都拿出最小值。活节点表的实现不同 问题变成了估计函数C🎩如何选择?C🎩具有什么样的特性才能算作好的估计函数? 四、LC-检索的特性 因为下一步是选择C🎩值小的活节点为E-节点,按照上图的C🎩必须得选择左子树,而最小节点却在右子树。 可是这样的C🎩通常得不到,因为你需要提前知道两个点的C的大小关系 其实如果C🎩和C的“单调性”是一样的,就可以用来代表,实际上的意义是一样的。 一般可以找到一个易于计算、且具有如下特性的C🎩:对于每一个节点X,都有C🎩<=C(x) 但是这样设计的话算法LC也未必能找到最小答案节点。 一个E-节点在生成儿子节点的时候就进行判断是否是答案节点;生成儿子节点的时候不判断是否是答案节点全部进入活节点表,在出表的时候再进行判断是否是答案节点。 因为第一种算法在子节点还没有完全进入活节点表中的时候就如果直接对当前的节点进行判断的话,可能会忽略掉后来有可能进入的更小节点;但是第二种在所有子节点都进入活节点表之后再进行判断的话,就可以从一个整体的角度进行判断哪个是最小的,最合适的。 第一个框:因为节点E是在全部都进入活节点表之后进行,所以C🎩(E)是活节点表里面最小的。 第二个框:C(L)是什么?从L出发能到达的成本最小的答案节点。 注意前提:如果有答案节点的话 五、分配问题 最小成本的计算,就要选择每个人在4个任务里面选择自己成本最少的,把这个成本作为最小成本,但是这个最小成本下界并不一定是一个合法成本,因为有可能两个人会选中同一个任务 每行的最小元素之和不是每行元素之和。

Kafka从上手到实践 - Kafka集群:Kafka Listeners | 凌云时刻

凌云时刻 · 技术 导读:这一章节主要对和Listener相关的四个配置项做以详细解释。 作者 | 计缘 来源 | 凌云时刻(微信号:linuxpk) 概述 listeners、advertised.listeners、listener.security.protocol.map、inter.broker.listener.name这四个配置项可能是大家最容易混淆和最不容易理解的。 在解释这些配置项之前,我们先来明确几个概念。 部署Broker的阿里云ECS称为Host Machine。 在阿里云ECS里启动的Producer或者Consumer,比如使用Kafka CLI启动的称为Internal Client。 在大家的IDEA中使用Java编写的,或者第三方的Producer/Consumer,称为External Client。 Host Machine具有外网IP和内网IP。 Internal Client可以同时和Host Machine的外网IP及内网IP通信。 External Client只能和Host Machine的外网IP通信。 多个阿里云ECS之间可以同时通过外网IP及内网IP通信。 既在这个特定的场景下,Host Machine之间可以同时通过外网IP及内网IP通信。 再换句话说就是不同Host Machine上的Broker之间可以同时通过外网IP及内网IP通信。 如上图所示,是一个很常见的Kafka集群场景,涵盖了上述的概念。图中那些通信虚线箭头就是靠Kafka的Listener建立的,并且是通过Kafka中不同的Listener建立的,这些Listener分为Internal Listener和External Listener。如下图所示: 那么这些Listener的创建以及内外部如何通信都是由上面那四个配置项决定的。 listener.security.protocol.map 先来看listener.security.protocol.map配置项,在上一章节中介绍过,它是配置监听者的安全协议的,比如PLAINTEXT、SSL、SASL_PLAINTEXT、SASL_SSL。因为它是以Key/Value的形式配置的,所以往往我们也使用该参数给Listener命名: listener.security.protocol.map=EXTERNAL_LISTENER_CLIENTS:SSL,INTERNAL_LISTENER_CLIENTS:PLAINTEXT,INTERNAL_LISTENER_BROKER:PLAINTEXT 使用Key作为Listener的名称。就如上图所示,Internal Producer、External Producer、Internal Consumer、External Consumer和Broker通信以及Broker之间互相通信时都很有可能使用不同的Listener。这些不同的Listener有监听内网IP的,有监听外网IP的,还有不同安全协议的,所以使用Key来表示更加直观。当然这只是一种非官方的用法,Key本质上还是代表了安全协议,如果只有一个安全协议,多个Listener的话,那么这些Listener所谓的名称肯定都是相同的。 listeners listeners就是主要用来定义Kafka Broker的Listener的配置项。 listeners=EXTERNAL_LISTENER_CLIENTS://阿里云ECS外网IP:9092,INTERNAL_LISTENER_CLIENTS://阿里云ECS内网IP:9093,INTERNAL_LISTENER_BROKER://阿里云ECS内网IP:9094 上面的配置表示,这个Broker定义了三个Listener,一个External Listener,用于External Producer和External Consumer连接使用。也许因为业务场景的关系,Internal Producer和Broker之间使用不同的安全协议进行连接,所以定义了两个不同协议的Internal Listener,分别用于Internal Producer和Broker之间连接使用。 通过之前的章节,我们知道Kafka是由Zookeeper进行管理的,由Zookeeper负责Leader选举,Broker Rebalance等工作。所以External Producer和External Consumer其实是通过Zookeeper中提供的信息和Broker通信交互的。所以listeners中配置的信息都会发布到Zookeeper中,但是这样就会把Broker的所有Listener信息都暴露给了外部Clients,在安全上是存在隐患的,我们希望只把给外部Clients使用的Listener暴露出去,此时就需要用到下面这个配置项了。 advertised.listeners advertised.listeners参数的作用就是将Broker的Listener信息发布到Zookeeper中,供Clients(Producer/Consumer)使用。如果配置了advertised.listeners,那么就不会将listeners配置的信息发布到Zookeeper中去了: advertised.listeners=EXTERNAL_LISTENER_CLIENTS://阿里云ECS外网IP:9092 这里在Zookeeper中发布了供External Clients(Producer/Consumer)使用的ListenerEXTERNAL_LISTENER_CLIENTS。所以advertised.listeners配置项实现了只把给外部Clients使用的Listener暴露出去的需求。 inter.broker.listener.name 这个配置项从名称就可以看出它的作用了,就是指定一个listener.security.protocol.map配置项中配置的Key,或者说指定一个或一类Listener的名称,将它作为Internal Listener。这个Listener专门用于Kafka集群中Broker之间的通信: inter.broker.listener.name=INTERNAL_LISTENER_BROKER listener 和 advertised.

前后端分离nginx部署配置

一、nginx部署简介1、优点2、nginx安装3、配置 一、nginx部署简介 1、优点 结合 Nginx 来部署前后端分离项目算是目前的主流方案。一来部署方便,二来通过动静分离也可以有效提高项目的运行效率。 大家知道我们项目中的资源包含动态资源和静态资源两种,其中:动态资源就是那些需要经过容器处理的资源,例如 jsp、freemarker、各种接口等。 静态资源则是那些不需要经过容器处理,收到客户端请求就可以直接返回的资源,像 js、css、html 以及各种格式的图片,都属于静态资源。 将动静资源分开部署,可以有效提高静态资源的加载速度以及整个系统的运行效率。在前后端分离项目部署中,我们用 Nginx 来做一个反向代理服务器,它既可以代理动态请求,也可以直接提供静态资源访问。无论是动态请求还是静态请求,都是首先到达 Nginx,再从 Nginx 上去查找页面或接口,这样,原本存在的所谓跨域问题现在就不存在了。 2、nginx安装 1、nginx安装:wget http://nginx.org/download/nginx-1.17.0.tar.gz 2、然后解压下载的目录,进入解压目录中,在编译安装之前,需要安装两个依赖: yum -y install pcre-devel yum -y install openssl openssl-devel 3、开始编译安装: ./configure make make install 4、启动nginx进入 sbin目录,执行./nginx 5、配置nginx,进入/usr/local/nginx,vi nginx.conf 当然我这里是按照资源类型来拦截的,即后缀为 js、css、ico 等的文件,统统都不进行请求分发,直接从本地的root /home/Web/project/vhr/dist/ 目录下读取并返回到前端(我们需要将静态资源文件上传到 root /home/Web/project/vhr/dist/目录下)。 3、配置 首先配置上游服务器server 服务器弹性公网地址:8081 ,Nginx监听80端口,所有的请求都会通过反向代理访问上游服务器

使用直播组件注册人脸信息,快照方法却没反应;原来微信小程序端需要先开始推流后才能正常拍照

用户人脸注册 使用uni-app框架开发应用和微信小程序,需要用户进行人脸注册。 一般的操作: 用户点击人脸注册按键,直接调用系统相机进行拍照,拍摄成功返回照片路径。 这样做可以满足功能需求,当时使用体验上并不好,各家相机的功能优化及风格各不相同,甚至还会出现无法指定使用前置摄像头的问题。 用推流来做头像拍摄功能 优化方案: 用户人脸页面点击注册按键,直接将空头像区域变成推流预览区域,注册按键改为拍照,点击拍照调用推流快照方法,实现人脸注册。整个流程都在一个页面上,无多余页面跳转操作,体验更上一层楼。 小程序快照调用无果 通过实操,已经在安卓和苹果端实现了上述优化效果。 但是在小程序上调用LivePusherContext.snapshot没反应。 多方打听并调试后确认,小程序上的快照方法需要在开始推流后才能正常使用。 给推流加上地址,测试地址:rtmp://live.hkstv.hk.lxdns.com/live/hks。 点击注册按键后,自动循环检查推流状态,只要推流失败了又重新发起推流。 至此,处理了人脸注册三端使用体验一致的优化。

Spring 之 Cglib (动态代理)

Spring 之 Cglib (动态代理) Cglib 的FastClass 会比一般的java的动态代理快很多。下面代码中有简单的说明 /** * @ClassName TargetPojo * @Author 莫邪 * @Description TODO * @Date Created in 0:17 2020/4/8 * @Version 1.0 */ //被代理的类 public class TargetPojo { public void pojoMethod(){ System.out.println("TargetPojo pojoMethod run"); } } /** * @ClassName DefaultMethodInterceptor * @Author 莫邪 * @Description TODO * @Date Created in 0:38 2020/4/8 * @Version 1.0 */ //默认的代理方法实现接口,cglib 定义被代理后会执行的接口方法 public class DefaultMethodInterceptor implements MethodInterceptor { private Object target;//被代理对象 public DefaultMethodInterceptor(Object target){ this.

SPI读取NRF24L01

NRF24L01数据通道 NRF24L01 配置为接收模式时可以接收6路不同地址但是相同频率的数据。每个数据通道都拥有自己的地址。接收数据通道0,:RX_ADDR_P0拥有40位可配置地址,RX_ADDR_P1–RX_ADDR_P5 的地址为:32位公用地址 + 8位各自的地址 接收端确认收到地址后会记录下发送通道的地址TX_ADDR,然后以此地址作为目标地址发送应答信号, 发送端的数据通道的接收地址RX_ADDR_Px 要与发送端地址相同,以确保接收到正确的应答信号 SPI指令和读写时序 NRF24L01中的通信协议 部分代码 ```cpp //NRF24L01寄存器操作命令 #define NRF_READ_REG 0x00 //读配置寄存器,低5位为寄存器地址 #define NRF_WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址 #define RD_RX_PLOAD 0x61 //读RX有效数据,1~32字节 #define WR_TX_PLOAD 0xA0 //写TX有效数据,1~32字节 #define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用 #define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用 #define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送. #define NOP 0xFF //空操作,可以用来读状态寄存器 //SPI(NRF24L01)寄存器地址 #define CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能; //bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能 #define EN_AA 0x01 //使能自动应答功能 bit0~5,对应通道0~5 #define EN_RXADDR 0x02 //接收地址允许,bit0~5,对应通道0~5 #define SETUP_AW 0x03 //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节; #define SETUP_RETR 0x04 //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时 250*x+86us #define RF_CH 0x05 //RF通道,bit6:0,工作通道频率; #define RF_SETUP 0x06 //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益 #define STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发 //bit5:数据发送完成中断;bit6:接收数据中断; #define MAX_TX 0x10 //达到最大发送次数中断 #define TX_OK 0x20 //TX发送完成中断 #define RX_OK 0x40 //接收到数据中断 #define OBSERVE_TX 0x08 //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器 #define CD 0x09 //载波检测寄存器,bit0,载波检测; #define RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前 #define RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前 #define RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等; #define RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等; #define RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等; #define RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等; #define TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等 #define RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法 #define RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法 #define RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法 #define RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法 #define RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法 #define RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法 #define NRF_FIFO_STATUS 0x17 //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留 //bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.

HTTP协议中的1xx,2xx,3xx,4xx,5xx状态码分别表示什么,列举常见错误码及含义

转载:https://www.cnblogs.com/zouer/p/4991948.html HTTP协议状态码介绍 HTTP协议状态码,是指在HTTP协议运作中由客户端发出请求连接,服务端建立连接,客户端发出HTTP请求,服务端返回响应信息,而在这个过程张由于客户端或服务端的问题会返回相应的错误代码并显示给用户,对应的错误代码表示不同的错误信息,根据这个信息用户可以调整相应的操作来修改出现的错误,最终避免错误的再现。 状态码含义 1XX类状态码信息表示:临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1XX响应 2XX类状态码信息表示:服务器成功的接收了客户端请求 3XX类状态码信息表示:客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同页面,或者通过代理服务器重复该请求 4XX类状态码信息表示:发生错误,客户端似乎有问题。例如:客户端请求不存在的页面,客户端为提供有效的身份验证信息 5XX类状态码信息表示:服务器遇到错误而不能完成该请求 状态码 含义 100——客户必须继续发出请求 101——客户要求服务器根据请求转换HTTP协议版本 200——交易成功 201——提示知道新文件的URL 202——接受和处理、但处理未完成 203——返回信息不确定或不完整 204——请求收到,但返回信息为空 205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件 206——服务器已经完成了部分用户的GET请求 300——请求的资源可在多处得到 301——删除请求数据 302——在其他地址发现了请求数据 303——建议客户访问其他URL或访问方式 304——客户端已经执行了GET,但文件未变化 305——请求的资源必须从服务器指定的地址得到 306——前一版本HTTP中使用的代码,现行版本中不再使用 307——申明请求的资源临时性删除 400——错误请求,如语法错误 401——请求授权失败 402——保留有效ChargeTo头响应 403——请求不允许 404——没有发现文件、查询或URl 405——用户在Request-Line字段定义的方法不允许 406——根据用户发送的Accept拖,请求资源不可访问 407——类似401,用户必须首先在代理服务器上得到授权 408——客户端没有在用户指定的饿时间内完成请求 409——对当前资源状态,请求不能完成 410——服务器上不再有此资源且无进一步的参考地址 411——服务器拒绝用户定义的Content-Length属性请求 412——一个或多个请求头字段在当前请求中错误 413——请求的资源大于服务器允许的大小 414——请求的资源URL长于服务器允许的长度 415——请求资源不支持请求项目格式 416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段 417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求 500——服务器产生内部错误 501——服务器不支持请求的函数 502——服务器暂时不可用,有时是为了防止发生系统过载 503——服务器过载或暂停维修 504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长 505——服务器不支持或拒绝支请求头中指定的HTTP版本

SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 实现分库分表

今天项目不忙,想搞一下shardingJDBC分库分表看看,主要想实现以下几点: 舍弃xml配置,使用.yml或者.properties文件+java的方式配置spring。使用 Druid 作为数据库连接池,同时开启监控界面,并支持监控多数据源。不依赖 com.dangdang 的 sharding-jdbc-core 包。此包过于古老,最后一次更新在2016年。目测只是封装了一层,意义不大。感觉如果不是dangdang公司内部开发,没必要用这个包。(且本人实测不能和最新的Druid包一起用,insert语句报错) 折腾了半天,网上找的例子大部分跑不通。直接自己从零开搞,全部组件直接上当前最新版本。 SpringBoot: 2.3.0 mybatis: 2.1.3 druid: 1.1.22 sharding-jdbc: 4.1.1 注意:这里因为是自己边看源码边配置,(sharding官网的例子可能是版本问题基本没法用,GitHub 我这里网络基本打不开),所以数据源和sharding大部分用java代码配置。部分配置,应该可以简化到 .yml / .properties 文件中。如您有兴趣优化,成功后可发一份demo给116269651@qq.com,感谢。 Sharding-JDBC简介 Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 Sharding-JDBC定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。支持任意实现JDBC规范的数据库。目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。 Sharding配置示意图 简单的理解如下图,对sharding-jdbc进行配置,其实就是对所有需要进行分片的表进行配置。对表的配置,则主要是对分库的配置和分表的配置。这里可以只分库不分表,或者只分表不分库,或者同时包含分库和分表逻辑。

unityEvent 含参数的使用

unity 内置的事件,unityevent 的 使用。最多使用四个参数。且参数类型有限制,只能使用简单的Bool值,int值,string等类型,不支持自定义类的作为形参。 using UnityEngine; using System.Collections; using UnityEngine.Events; using System; public class EventTry : MonoBehaviour { public Events_Bool currentChanged; // Use this for initialization // bool isc; void Start () { currentChanged.AddListener(isOK); } // Update is called once per frame void Update () { if(Input.GetKeyDown(KeyCode.S)) { // isc = true; currentChanged.Invoke(true); } if (Input.GetKeyUp(KeyCode.D)) { // isc = false; currentChanged.Invoke(false); } } public void isOK(bool I) { if (I) { print("

unity 按键键值检测。

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class KeyCodeTest : MonoBehaviour { public Text t; public KeyCode currentKey; public Event e; // Update is called once per frame void Update() { //ONGUI里面检测不到shift ctrl的按下,虽然不知道为什么,但是可以在update里面单独检测其输出 if(Input.GetKeyDown(KeyCode.LeftShift)) { Debug.LogError("Update,LeftShift"); } else if(Input.GetKeyDown(KeyCode.RightShift)) { Debug.LogError("Update,RightShift"); } } void OnGUI() { if(Input.anyKeyDown) { e = Event.current; if(e.isKey) { currentKey = e.keyCode; Debug.Log("Current Key is : " + currentKey.ToString()); Debug.Log("Current Key is : "

C语言编程规范 学习笔记

C语言编程规范 一、代码总体原则1、清晰2、简洁3、选择适合的风格,与代码原有风格保持一致 二、头文件背景术语定义原则 2.1 头文件中适合放置接口的声明,不适合放置实现原则 2.2 头文件应当职责单一原则 2.3 头文件应该向稳定的方向包含规则 2.1 每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口规则 2.2 禁止头文件循环依赖规则 2.3 .c/.h文件禁止包含用不到的头文件规则 2.4 头文件应当自包含规则 2.5 总是编写内部#include保护符(#define 保护)规则 2.6 禁止在头文件中定义变量规则 2.7 只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过extern的方式使用外部函数接口、变量规则 2.8 禁止在extern "C"中包含头文件建议 2.1 一个模块通常包含多个.c文件,建议放在同一个目录下,目录名即为模块名。为方便使用者,建议每一个模块提供一个.h,文件名为目录名。建议 2.2 如果一个模块包含多个子模块,则建议每一个子模块提供一个对外的.h,文件名为子模块名。建议 2.3 头文件不要使用非习惯用法的扩展名,如.inc建议 2.4 同一产品统一包含头文件排列方式 三、函数背景原则 3.1 一个函数仅完成一件功能原则 3.2 重复代码尽可能提炼成函数规则 3.1 避免函数过长,新增函数不超过50行(非空非注释行)规则 3.2 避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层规则 3.3 可重入函数应避免使用共享变量;若需使用,则应通过互斥手段(关中断,信号量)对其加以保护规则 3.4 对参数的合法性检查,由调用者负责还是由接口函数负责,应在项目组/模块内应统一规定。缺省由调用者负责。规则 3.5 对函数的错误返回码要全面处理规则 3.6 设计高扇入,合理扇出(小于7)的函数规则 3.7 废弃代码(没有被调用的函数和变量)要及时清除建议 3.1 函数不变参数使用const建议 3.2 函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用建议 3.3 检查函数所有非参数输入的有效性,如数据文件、公共变量等建议 3.4 函数的参数个数不超过5个建议 3.5 除打印类函数外,不要使用可变长参函数建议 3.6 在源文件范围内声明和定义的所有函数,除非外部可见,否则应该增加static关键字 四、标识符命名与定义4.1 通用命名规则原则 4.1 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解原则 4.

使用iai_kinect2标定kinectV2相机

实验背景:因为需要制作bundlefusion需要的数据集,所以需要使用kinectV2相机获取rgbd图像,年前的时候在我的笔记本上安装了libfreenect2库和iai_kinect2,标定过一次kinecv2相机,然后使用kinectv2相机实时获取的图像实现elasticfusion稠密重建.但是由于当时时间紧迫,很多东西都没有搞明白,所以趁这次机会将一些问题整理一下,记录一下. 环境搭建: 1. 安装了ROS的kinetic版本 libfreenect2和iai_kinect2的安装参考文章: https://www.cnblogs.com/li-yao7758258/p/7445429.html 2. 下载libfreenect2 $ cd Downloads $ git clone https://github.com/OpenKinect/libfreenect2.git 3.安装libfreenect2的依赖 sudo apt-get install build-essential cmake pkg-config libturbojpeg libjpeg-turbo8-dev mesa-common-dev freeglut3-dev libxrandr-dev libxi-dev 安装libusb sudo apt-add-repository ppa:floe/libusb sudo apt-get update sudo apt-get install libusb-1.0-0-dev 安装GLFW3 cd libfreenect2/depends sh install_ubuntu.sh sudo dpkg -i libglfw3*_3.0.4-1_*.deb 4. 继续安装libfreenect2库 $ cd libfreenect2 $ mkdir build $ cmake ../ $ make -j4 $ sudo make install 5. 使用lsusb指令测试kinectv2相机有没有链接成功. 6. 编译iai_kinect2

Xilinx FPGA Partial Reconfiguration 部分重配置 详细教程

Partial Reconfiguration(部分重配置)在现在的FPGA应用中越来越常见,我们这次的教程以Project模式为例来说明部分重配置的操作过程。 这里我们使用的Vivado版本是2017.2,使用的例程是Vivado自带的wavegen工程,并在工程中增加一个计数器模块,如下图所示 这个模块的代码也很简单,就是加1计数 module count_add( input clk, input rst, output reg [7:0] res ); always @ (posedge clk ) begin if(rst) res <= 8'b0; else res <= res + 1'b1; end endmodule 我们要把这个模块当做Reconfiguration Module,把它替换成另外一个module: count_sub,就是每个周期减1计数。 module count_sub( input clk, input rst, output reg [7:0] res ); always @ (posedge clk ) begin if(rst) res <= 8'b0; else res <= res - 1'b1; end endmodule 下面开始进行Partial Reconfiguration的配置 首先打开工程,并将其中一个Reconfiguration Module添加到工程中即可,这里我们选择将count_add添加到工程中,选择Tools->Enable Partial Reconfiguration

采用基于“五元中值组取中值分割法”的线性 时间选择算法,找出 N 个元素集合 S 中的第 k个最小的元素,使其在线性时间内解决

#include<iostream> #include<math.h> #include<time.h> #include<stdlib.h> usingnamespace std; constint INF = 2147483647; classSortableList { public: SortableList(intmSize) { maxSize= mSize; l= newint[maxSize + 1]; n= 0; } ~SortableList() { delete[]l; } void Input(); void Output(); void MergeSort(); void QuickSort(); void Select(intk) { int j = 0; j= Select(k, 0, n -1, 5); cout<<"第k小元素是:"<< l[k]; } private: int *l; int n; //数组中已有元素个数 int maxSize; void MergeSort(intleft, intright); void Merge(intleft, intmid, intright); void InsertSort(intleft, intright); void Swap(inti, intj); //交换下标为 i和 j的数组元素 void QuickSort(intleft, intright); int Partition(intleft, intright);// 分化操作 int RPartition(intleft, intright); int Select(intk, intleft, intright, intr); }; voidSortableList::InsertSort(intleft, intright) { for (int i = left + 1; i <= right; i++) { int j = i; int temp = l[i]; while (j>left&&temp<l[j- 1]) { l[j]= l[j - 1]; j--; } l[i]= temp; } } voidSortableList::Input() { cout<<"

modbus的寄存器的地址

modbus的地址,其实modbus的规范里面写的很明确了,但是最近还有人问我,其实这个很简单的。 00001至09999是离散输出(线圈)-----Coil status 10001至19999是离散输入(触点)-----Input status 30001至39999是输入寄存器(通常是模拟量输入)------Input register 40001至49999是保持寄存器 -------Holding register

install git lfs on ubuntu

sudo apt-get install software-properties-common sudo curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh > script.sh sudo bash script.sh sudo apt-get install git-lfs git lfs install 参考网页

Python base64库 解码本地txt文本字符串

Python base64库 解码本地txt文本字符串 使用base64还原由图片加密而成的字符串。 Raw字符串: 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U9TKbjRDpqiVKWplilqZolZ2oxkVU9RWTFErp9AuFbejnU84hXY5YYraL/owupVMUXvCh1l/GX3MTaaold1ohkxRK1PUyhS1MkWt7EYzKqaorZiiVk6hXSpuRzufcArtcsIUtV/0YXQrmaL2hA+z/jL6mJtMUSu70QyZolamqJUpamWKWtmNZlRMUVsxRa2cQrtU3I52PuEU2uWEKWq/6MPoVjJF7QkfZv1l9DE3maJWdqMZMkWtTFErU9TKFLWyG82omKK2YopaOYV2qbgd7XzCKbTLCVPUftGH0a1kitoTPsz6y+hjbjJFrexGM2SKWpmiVqaolSlqZTeaUTFFbcUUtXIK7VJxO9r5hFNolxOmqP2iD6NbyRS1J3yY9ZfRx9xkilrZjWbIFLUyRa1MUStT1MpuNKNiitqKKWrlFNql4na08wmn0C4nTFH7RR9Gt5Ipak/4MOsvo4+5yRS1shvNkClqZYpamaJWpqiV3WhGxRS1FVPUyim0S8XtaOcTTqFdTpii9os+jG4lU9Se8GHWX0Yfc5MpamU3miFT1MoUtTJFrUxRK7vRjIopaiumqJVTaJeK29HOJ5xCu5wwRe0XfRjdSqaoPeHD/Nxl9OOQU2iXE6aorZii9oQpaiumqK2YovaEKWplitoTpqiVKWor/hq6gexGM77odrTzzT5q/NwF9SOSU2iXE6aorZii9oQpaiumqK2YovaEKWplitoTpqiVKWor/hq6gexGM77odrTzzT5q/NwF9SOSU2iXE6aorZii9oQpaiumqK2YovaEKWplitoTpqiVKWor/hq6gexGM77odrTzzT5q/NwF9SOSU2iXE6aorZii9oQpaiumqK2YovaEKWplitoTpqiVKWor/hq6gexGM77odrTzzT5q/NwF9SOSU2iXE6aorZii9oQpaiumqK2YovaEKWplitoTpqiVKWor/hq6gexGM77odrTzzT5q/NwF9SOSU2iXE6aorZii9oQpaiumqK2YovaEKWplitoTpqiVKWor/hq6gexGM77odrTzzT5q/NwF9SOSU2iXE6aorZii9oQpaiumqK2YovaEKWplitoTpqiVKWor/hq6gexGM77odrTzzT5q/NwF9SOSU2iXE6aorZii9oQpaiumqK2YovaEKWplitoTpqiVKWor/hq6gexGM77odrTzzT5q/NwF9SOSU2iX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 第一次解码:还原成图片 import base64 with open(r'F:\Program Files\QQFiles1\619342297\FileRecv\202003.关于爬虫的需求.txt','r') as f: imgdata=base64.b64decode(f.read()) file=open('decode1.jpg','wb') file.write(imgdata) file.close() 得到一二维码图片,扫码后得到一串简单的字符串(下图str),继续进行第二次解码:还原成真是字符串 str='aHR0cHMlM0EvL2NiZ2FwcC5mcC5wcy5uZXRlYXNlLmNvbS9maWxlLzVlNTM5ZDdmNWU2MDI3NmE1YjQ4ZGU4YkJJeVQ1RTBYMDIvYXR0YWNobWVudC9jb20ubmV0ZWFzZS54eTJjYmctNC44LjUtNDA4OS0yOTMuYXBrJTBBJXU1QjlFJXU3M0IwJXU3NjdCJXU1RjU1JXU1NDhDJXU0RTBCJXU1MzU1JXU0RUQ4JXU2QjNFJXU1MjlGJXU4MEZE' # with open(r'F:\Program Files\QQFiles1\619342297\FileRecv\202003.关于爬虫的需求.txt','r') as f: file=open('decode1.txt','wb') file.write(base64.b64decode(str)) file.close() 得到最终字符串: https%3A//cbgapp.fp.ps.netease.com/file/5e539d7f5e60276a5b48de8bBIyT5E0X02/attachment/com.netease.xy2cbg-4.8.5-4089-293.apk%0A%u5B9E%u73B0%u767B%u5F55%u548C%u4E0B%u5355%u4ED8%u6B3E%u529F%u80FD

Python排序小案例集

Python 排序 sorted & sort 1、Exampe1:给这些日期文本排序。 import time a=['2月9日', '2月8日', '2月7日', '2月6日', '2月5日', '2月4日', '2月3日', '2月2日', '2月1日', '2月12日', '2月11日', '2月10日', '1月31日', '1月30日', '1月29日', '1月28日', '1月27日', '1月26日', '1月25日', '1月24日', '1月23日'] 方法一: b=np.reshape(sorted(a,key=lambda x: (int(re.search(r'(\d+)月',x).group(1)),int(re.search(r'(\d+)日',x).group(1)))),(7,3)) 方法二: c=np.reshape(sorted(a,key=lambda x:time.mktime(time.strptime('%d年' % 2020+x,'%Y年%m月%d日'))),(7,3)) print(b,c,sep='\n') 执行结果: [['1月23日' '1月24日' '1月25日'] ['1月26日' '1月27日' '1月28日'] ['1月29日' '1月30日' '1月31日'] ['2月1日' '2月2日' '2月3日'] ['2月4日' '2月5日' '2月6日'] ['2月7日' '2月8日' '2月9日'] ['2月10日' '2月11日' '2月12日']] [['1月23日' '1月24日' '1月25日'] ['1月26日' '1月27日' '1月28日'] ['1月29日' '1月30日' '1月31日'] ['2月1日' '2月2日' '2月3日'] ['2月4日' '2月5日' '2月6日'] ['2月7日' '2月8日' '2月9日'] ['2月10日' '2月11日' '2月12日']] Process finished with exit code 0 2、Example2:根据数组b里的顺序排列a二维数组。

请将文件MP_verify_xxxxxx.txt上传至填写域名或路径指向的web服务器(或虚拟主机)的目录 已解决

之前验证微信安全域名遇到一个坑,配了好久都不行,于是就记录一下 进入nginx配置文件,一般在 vim/usr/local/nginx/nginx.conf 然后加入, 重启nginx ./nginx -s reload server { listen 80; server_name MP_verify_pXqLI7YleleCTxNH.txt; location /MP_verify_pXqLI7YleleCTxNH.txt { alias /usr/local/nginx/MP_verify_pXqLI7YleleCTxNH.txt; #静态css,js路径 } location = /50x.html { root html; } } 推荐自己的资料库: https://mfk.hllfy.top

Spring 源码分析衍生篇八 :ConfigurationClassPostProcessor 下篇

文章目录 一、前言1. ConfigurationClassPostProcessor 二、举例三、 代码分析1. enhanceConfigurationClasses1.1 newEnhancer(configClass, classLoader)1.2 createClass(newEnhancer(configClass, classLoader)); 2. 回调函数2.1 BeanMethodInterceptor#intercept2.1.1 enhanceFactoryBean 2.2 BeanFactoryAwareMethodInterceptor#intercept 四、总结 一、前言 本文是 Spring源码分析:Spring源码分析二:BeanFactoryPostProcessor 的处理 的衍生文章。主要是因为本人菜鸡,在分析源码的过程中还有一些其他的内容不理解,故开设衍生篇来完善内容以学习。 ConfigurationClassPostProcessor 的分析受篇幅所限,分为上下两篇 上篇 分析 postProcessBeanDefinitionRegistry 方法的调用。 下篇 分析 postProcessBeanFactory 方法的调用。 ConfigurationClassPostProcessor 是非常重要的一个 后处理器。 ConfigurationClassPostProcessor 完成了 配置类的解析和保存。将所有需要注入的bean解析成 BeanDefinition保存到 BeanFactory 中。 1. ConfigurationClassPostProcessor 首先来讲解一下 ConfigurationClassPostProcessor 的结构图如下。 可见ConfigurationClassPostProcessor 接口实现了BeanDefinitionRegistryPostProcessor(BeanFactory 的后处理器) PriorityOrdered(设置自己的优先级为最高) 和各种 Aware 接口。 我们这里重点看的是 BeanDefinitionRegistryPostProcessor 接口的两个方法: // 完成对 @Bean 方法的代理 void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException; // 允许在Spring容器启动后,在下一个阶段开始前,添加BeanDefinition的定义 void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException; 关于这两个方法的调用时机和作用,我们在之前的文章已经讲过,这里不再赘述。

Spring 源码分析衍生篇七 :ConfigurationClassPostProcessor 上篇

文章目录 一、前言1. ConfigurationClassPostProcessor 二 、ConfigurationClassPostProcessor1. processConfigBeanDefinitions1.1 checkConfigurationClassCandidate1.1.1. isConfigurationCandidate 1.2 parser.parse(candidates);1.2.1 处理 @Component 注解1.2.2 处理 @PropertySource 注解1.2.3 处理 @ComponentScan、@ComponentScans 注解1.2.4 处理 @Import、ImportSelector、ImportBeanDefinitionRegistrar1.2.5 处理 @ImportResource 注解1.2.6 处理 @Bean修饰的方法1.2.7 处理接口默认方法1.2.8 处理父类 1.3 parser.validate();1.4 this.reader.loadBeanDefinitions(configClasses);1.4.1 registerBeanDefinitionForImportedConfigurationClass1.4.2 loadBeanDefinitionsForBeanMethod1.4.3 loadBeanDefinitionsFromImportedResources1.4.4 loadBeanDefinitionsFromRegistrars 三、总结 一、前言 本文是 Spring源码分析:Spring源码分析七:BeanFactoryPostProcessor 的处理 - invokeBeanFactoryPostProcessors 的衍生文章。主要是因为本人菜鸡,在分析源码的过程中还有一些其他的内容不理解,故开设衍生篇来完善内容以学习。 ConfigurationClassPostProcessor 的分析受篇幅所限,分为上下两篇 上篇 分析 postProcessBeanDefinitionRegistry 方法的调用。 下篇 分析 postProcessBeanFactory 方法的调用。 本篇巨长,请做好心理准备!!!!! 本篇巨长,请做好心理准备!!!!! 本篇巨长,请做好心理准备!!!!! ConfigurationClassPostProcessor 是非常重要的一个 后处理器。 ConfigurationClassPostProcessor 完成了 配置类的解析和保存以及@Component 注解、@Import 等注解的解析工作 。将所有需要注入的bean解析成 BeanDefinition保存到 BeanFactory 中。 1. ConfigurationClassPostProcessor 首先来讲解一下 ConfigurationClassPostProcessor 的结构图如下。

大学食堂

电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。 某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。 Input 多组数据。对于每组数据: 第一行为正整数n,表示菜的数量。n<=1000。 第二行包括n个正整数,表示每种菜的价格。价格不超过50。 第三行包括一个正整数m,表示卡上的余额。m<=1000。 n=0表示数据结束。 Output 对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。 Sample Input 1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0 Sample Output -45 32 思路:我们先用一个背包容量为5的背包装东西,背包里东西装得越多,钱越少。在背包装满之后,饭卡里的余额肯定是大于等于5的,根据题意可以知道只要饭卡大于等于5元,我们就可以买任何的东西,我们可以再减去一个最贵的菜,这样饭卡的剩下的钱就可以最少了了。先将菜的价格排序。 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[1010],a[1010]; int main() { int T; while(scanf("%d",&T)&&T) { memset(dp,0,sizeof(dp)); int i,j; for(i=1; i<=T; i++) scanf("%d",&a[i]);//输入数据 sort(a+1,a+1+T);//排序 int c; scanf("%d",&c); if(c>=5)//背包容量一开始减了5,所以在背包装了最多之后,饭卡的余额=5+背包剩余容量≥5 { for(i=1; i<T; i++) { for(j=c-5; j>=a[i]; j--) { dp[j]=max(dp[j],dp[j-a[i]]+a[i]); } } printf("

通过接口url查是哪个服务,以及WebService接口调用soapui使用

通过接口url查是哪个服务及调用WebService接口soapui使用 接口文档: url: http://137.32.126.168:8080/services/queryCardType?wsdl(测试环境) 通过上面的url:http://137.32.126.168:8080/services/queryCardType?wsdl知道,所在服务器是137.32.126.168 进入137.32.126.168这个服务器: 通过上面url: http://137.32.126.168:8080/services/queryCardType?wsdl知道所占用的端口是8080 找到8080进程id: netstat -tunpl | grep 8080 根据进程id找到项目 ps -ef|grep 47544 找到项目jar包部署的路径: find ./ -name soapws.jar soapUI使用(用于webService接口测试): 入参: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://quickstart.samples/xsd"> <soapenv:Header/> <soapenv:Body> <xsd:getCardInfo> <!--Optional:--> <input><![CDATA[<?xml version="1.0" encoding="UTF-8"?> <requestMessage> <modelName>EC8B</modelName> <pageNo>1</pageNo> <pageSize>20</pageSize> </requestMessage> ]]></input> </xsd:getCardInfo> </soapenv:Body> </soapenv:Envelope> 一:新建一个soap工程 二:连接到自己要测试的接口 三:填写入参,并执行 返回失败报文: 返回成功报文:

宝塔环境搭建教程

阿里云ECS服务器搭建宝塔环境教程-保姆级教程 1.建立远程连接 2.输入密码后登入服务器 3.从宝塔官网复制下载安装代码 4.粘贴到图二服务器命令行,按回车 5.耐心等到下图出现,点击y 6.耐心等待宝塔环境的网址、账号、密码出现,可以将其保存起来,用以日后登录宝塔环境。 7.在服务器里配置宝塔的环境,首先点击配置规则 8.点击添加安全组规则 9.添加8888,80,888规则,这几个是宝塔的常用端口 如图是8888端口的,80和888如图更改就好了 10.配置好了就可以登录图六的网址,使用图六账号密码 11.登录成功后按照提示安装基本环境。如果错过了也没关系,之后可以在软件商店自行配置。 12.安装成功后宝塔环境就搭建完成了!可以用下试试了!

正则表达式——高级模块

re.match 是从头开始匹配 re.search 不会从头开始,会直接从第一个满足条件的数据开始 search 需求:匹配出文章阅读数的次数 #coding =utf-8 import re ret=re.search(r"\d+","阅读次数为 9999") ret.group() 运行结果: “9999” findall查找出所有符合正则表达式的元素,并放入到列表里面 sub 元素进行替换 Sub替换的时候就会把符合正则的所有数据都替换掉 Sub 调用函数实现自增功能 返回的是什么就会替换成什么 split 根据匹配进行切割字符串,并返回一个列表 。

程序员小白浅谈python的变量赋值和c语言的区别

程序员小白浅谈python的变量赋值和c语言的区别: 1)python内存空间:有堆和栈两个区间 所有变量在栈里面 数据存在堆里面 变量在栈里面保存的是数据的内存地址 2)python里是先开辟一个堆空间,空间大小跟数据的大小所决定,比如一个字节,就开辟一个字节的空间。 如果有一个变量的值改变,就重新再开辟一个空间,大小也跟数据大小所决定,先前的销毁,所以两个值的内存空间不一样,数据也不会溢出 所以python里原来的值和新赋的值内存空间不一样 3)c语言中,所有东西都放在栈区间,如果需要放在堆区间,要用malloc的方法 4)c语言,定义变量要先声明类型 int a=10 c 存储空间是由类型决定的,类型的大小决定了数据的大小,在有新的值赋值进来,把之前的抹掉。 然后再放新的数据,内存空间与地址是固定的,并且数据可能会溢出 简单来说呢, 就是java和c存储数据就是先根据类型挖坑,再往坑里放数据,有新的数据进来,就把之前的数据抹掉,在把新的数据放进去 python 里是根据数据先挖个坑,再放数据,如果有数据改变,就先根据新数据的大小和类型重新挖个坑,再把新数据放进去 所以说python里变量可以赋值不同类型的变量,并且不会溢出 python里 id可以查看变量的内存地址 a=10 print(hex(id(a))) a=20 print(hex(id(a)))

正则表达式——匹配多个字符

{1,3}表示\d这个数可以是一位或者3位 指定手机号: 问号?意味着,问号前面的东西可以有可以没有,有的话有且只有一个,不允许出现多个 判断手机号格式是否正确: 星号和加号的区别 星号可有可无,加号最少只能有1个,不能没有 案例: 案例: re.match :默认匹配开头 因为加了$ 符号,所以要对其中所有的元素进行比较,判断全部是否符合要求。 判断邮箱地址是否符合要求: 如果在正则表达式中需要用到了某些普通的字符,比如?(表示前面的元素可有可无),比如 . (表示任意一个字符)等,仅仅需要在他们面前添加一个反斜杠进行转义。 二者选一的时候可以利用python里面的或符号,并且把这个选项都用小括号括起来 Group(2)对应的是第二个括号里面的东西,第一个括号对应的是@符号期面的名字,第2个对应的是@符号后面的数字,因为没有第三个小括号,所以最后报错了 小括号代表分组,然后\加数字,就代表该数字对应的分组信息(分组下标从1开始)

Vue.js中 watch 的高级用法

参考链接:https://blog.csdn.net/wandoumm/article/details/80259908 假设有如下代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type="text" v-model="firstName"></p> </div> new Vue({ el: '#root', data: { firstName: 'Dawei', lastName: 'Lou', fullName: '' }, watch: { firstName(newName, oldName) { this.fullName = newName + ' ' + this.lastName; } } }) 上面的代码的效果是:当我们输入firstName后,wacth监听每次修改变化的新值,然后计算输出fullName。 这里 watch 的一个特点是,最初绑定的时候是不会执行的,要等到 firstName 改变时才执行监听计算。 那我们想要一开始就让他最初绑定的时候就执行改怎么办呢?使用handler方法和immediate属性 handler方法和immediate属性 我们需要修改一下我们的 watch 写法,修改过后的 watch 代码如下: watch: { firstName: { handler(newName, oldName) { this.fullName = newName + ' ' + this.lastName; }, // 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法 immediate: true } } 我们给 firstName 绑定了一个handler方法,最初绑定的时候就执行

C语言-查漏补缺

文章目录 常见知识点1.union 常见知识点 1.union 1、union中能够定义多个成员, union的大小由最大的成员的大小决定。 2、union成员共享同一块大小的内存, 一次仅仅能使用当中的一个成员。 3、对某一个成员赋值,会覆盖其它成员的值(由于他们共享一块内存。 但前提是成员所占字节数同样。当成员所占字节数不同一时候仅仅会覆盖对应字节上的值, 比方对char成员赋值就不会把整个int成员覆盖掉。 由于char仅仅占一个字节。而int占四个字节 4、联合体union的存放顺序是全部成员都从低地址開始存放的。

ZYNQ学习日志-------软硬件调试

工程创建 可以按照hello world的步骤一步一步建立,也可以直接将工程全部拷贝过来。方法上篇已有步骤,此次直接拷贝。 IP核添加 此次工程用到了字节的两个IP核,math_ip和GPIO_LITE_ML_1.0,其中math就是一个普通加法器,可直接用vivado自带的加法器,一样的用法,GPIO是输出流水灯控制的核。将这两个文件夹拷入新建的工程下,然后在setting中,IP目录下的Repository中将拷贝过来的IP核添加进去。 随后就打开block design,将math_ip_v1_0添加 再将GPIO添加 添加完之后就可以连线了,由于这的布线十分简单,使用自动连线就行。run connection automation。 连好都就如图 如果觉得布局很乱,就右键空白处,regenerate layout。 其中,led管脚是要输出的,需要添加约束的,在BD中,给它一个输出管脚。 完成后继续添加IP, 双击新出的VIO IP核,进行配置,,输入1个管脚,输出3个管脚 将此IP手动连接。与math连接,对应相连即可。 继续添加ila,并配置 再将其连线,clk连clk,另一个连LED 觉得图不好看,就重新布局,右键空白处,regenerate layout。 给四个led口添加约束,新建一个XDC文件,并写入 set_property PACKAGE_PIN J16 [get_ports {GPIO_LED[0]}] set_property PACKAGE_PIN K16 [get_ports {GPIO_LED[1]}] set_property PACKAGE_PIN G15 [get_ports {GPIO_LED[2]}] set_property PACKAGE_PIN H15 [get_ports {GPIO_LED[3]}] set_property IOSTANDARD LVCMOS33 [get_ports {GPIO_LED[*]}] #bit compress set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design] 我们的工程是拷贝过来的,更改了底层文件后,顶层文件也更改了,所以需要重新生成,先将原来的顶层文件remove 删除后,再生成 此步可能会出现一些问题,所以需要检查,可以打开头文件代码看看是否有output的存在,因为我们是需要输出4位LED的,所以必然存在 如果没有,就继续删除顶层,创建顶层,若还是不行,在下面输入框重置工程 正确后进入下一步。 这步完成后就可以生成bit文件进入SDK了。

zabbix学习随笔(一):zabbix离线安装

这里写自定义目录标题 zabbix安装1、安装环境2、下载安装包3、数据库安装与初始化4、安装服务与依赖5、修改配置6、启动服务7、配置agent zabbix安装 碰到一些不大不小的坑,解决起来也不难,多是依赖问题,由于从来没有接触过zabbix,所以网上一些理所当然认为就该如此操作的东西我也看不懂,只能各种猜各种尝试,好在没有费多长时间就解决了。 我会把遇到的坑都详细列出来,避免后来者踩到同样的坑里面 1、安装环境 操作系统:Centos7.7 数据库:mysql5.7 zabbix:4.2.8 2、下载安装包 公司服务器没有接入外网,只有一台服务器有外网,因此选择离线安装的方式 zabbix的官网没法下载安装包,因此在清华的源站下载 https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.2/rhel/7/x86_64/ 我这里使用的mysql版的zabbix,因为mysql使用了多年已经习惯,不喜欢mysql的也可以使用别的数据库版本的 把所有的包都下载下来准没错 其中还包括一些依赖 [root@linux1 zabbix]# ll 总用量 10216 -rw-r--r--. 1 root root 56448 6月 1 15:53 fping-3.10-1.el7.rf.x86_64.rpm -rw-r--r--. 1 root root 59584 6月 2 09:08 php-bcmath-5.4.16-48.el7.x86_64.rpm -rw-r--r--. 1 root root 578968 6月 2 09:09 php-common-5.4.16-48.el7.x86_64.rpm -rw-r--r--. 1 root root 517760 6月 2 09:13 php-mbstring-5.4.16-48.el7.x86_64.rpm -rw-r--r--. 1 root root 427304 6月 2 09:08 zabbix-agent-4.2.8-1.el7.x86_64.rpm -rw-r--r--. 1 root root 298540 6月 2 09:08 zabbix-get-4.

JS 中向数组末尾添加元素的push方法【学习记录】

push()方法: 可向数组的末尾添加一个或多个元素,并返回新的长度。 语法: arrayObject.push(newelement1,newelement2,....,newelementX) 注意: push()方法是将参数直接添加到原数组的尾部,它不是创建一个新的数组,而是在原数组的基础上进行修改,push()和pop()方法使用数组提供的先进后出栈的功能。 用法: <script type="text/javascript"> var arr = new Array(3) arr[0] = "George" arr[1] = "John" arr[2] = "Thomas" document.write(arr + "<br />") document.write(arr.push("James") + "<br />") document.write(arr) </script> 输出: George,John,Thomas 4 George,John,Thomas,James 提示: 如果想在数组的头部插入元素,请参考unshift方法的使用。

QT之实现简陋聊天

相关知识:QT,数据库,TCP/IP,Socket; 1.登陆界面 包含登陆和注册两种功能,思路如下: 难点:建立服务器和数据库,数据库保存数据,服务器与数据库产生联系 解决:数据库与服务器放在同一个类中,登陆和注册时,客户端与服务端连接,传输数据给服务端,然后通过数据库来处理数据。 大致步骤:创建ui界面 => {connect(登陆按钮,客户端主动连接服务器),connect(服务器得到新连接,connect(客户端readReady,服务器读取数据))} => 客户端写入数据 ->服务器读取数据 => 使用数据库 => 根据数据输出信息/注册账号。 2.实现聊天 如下为基本功能和实现思路: 参考博文: https://blog.csdn.net/weixin_40011728/article/details/77924196https://www.cnblogs.com/yuweifeng/p/9382841.htmlhttps://www.cnblogs.com/lifexy/p/10921958.html 上述博文的内容比我的硬核多了… 新发现一个难点:一个服务器连接多个客户端时,要想清楚怎么去确定不同的客户端,之前的错误代码使得一个客户端登陆,结果包括没连接的客户端都登陆了。 效果展示: 数据库展示: 可以说就实现了正常软件基本功能中的一小部分,后续检查发 现注册信息为空没有设置… 如果要优化界面应该不会比做这些功能难,拿QPaint画画,搞些和文件相关的连接应该就可以。 上面两条应该就是体力活了,但是聊天软件本来应该像QQ一样,最起码能加好友,但是我目前没有想好怎么做,这类知识全是第一次接触,可以说大半部分照着参考博文抄来的,查了很多资料去了解各种函数,有时候数据库的操作失败也是莫名其妙的,再继续下去不如系统地学点知识再来做一回。 全部代码如下: mylogin.h #ifndef MYLOGIN_H #define MYLOGIN_H #include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QMessageBox> #include "myregister.h" #include "server_sqlite.h" namespace Ui { class MyLogin; } class MyLogin : public QWidget { Q_OBJECT public: explicit MyLogin(QWidget *parent = nullptr); ~MyLogin(); void clientSend(QString message); signals: void toSignUp(); void sendContent(QString content); void createUi(QString); void refreshList(QString); private slots: void signIn(); void clientRead(); void updateSign(); private: Ui::MyLogin *ui; QTcpSocket *clientTcp; }; #endif // MYLOGIN_H mylogin.

如何搭建消费金融风控体系

本文是《风控总监训练营》前三课的学习笔记。 四类参与者 消费金融市场中有四类参与者,分为为银行、P2P、持牌消金和小贷以及行业巨头。各自的优势和劣势如下图: P2P由于监管的原因将逐渐退出或者转型,银行和行业巨头掌握着资金和流量的优势(银行资金成本低,行业巨头有消费场景)。消费金融和小贷公司则多数没有场景,风险容忍度也不高,受到监管制约。 另外一种方法将消费金融参与者分为3类。分别为金融系、场景系、互联网系。金融系比如商业银行、持牌消金及小贷;场景系指线上线下的消费场景方作为业务发起点;互联网系比如线上分期,如蚂蚁金服、京东金融等。 商业银行通过信用卡和现金贷双通道开展消费金融业务。现金贷如招行的"e招贷"、浦发的"万用金"等,向存量信用卡客户提供现金贷服务,年化5%-14%。此外,银行也在尝试B2C网上商城,提供商品交易、生活服务等,但客户群体仍为银行信用卡存量客户。 银行的核心优势在于资金成本和风控能力。其风控和审批模式过于依赖央行征信体系,消费者多维度数据及信息收集不足,风控成本高,坏账接受度低且审批周期长。且产品同质化较高,主要对象仍是信用卡存量客户。 资金来源 商业银行可以吸收公众存款来获得较低的资金成本,其它消费金融参与主体的资金来源包括注册资金、同业拆借、发行金融债券、股东资金、ABS、P2P资金等。各渠道资金成本的对比如下: 成本分析 消费金融业务的目标是获得合理的可接受的利润。收入来源于利息和手续费以及逾期产生的罚息,加在一起年化不能超过24%。成本主要由资金成本、营销成本(获客)、风险成本(风控数据源、坏账等)、运营成本(客服、审核、催收等)以及其他成本(人力)。对利润分析这块感兴趣的可以参考《消费金融真经》的第11章,消费信贷产品的利润分析。 业务类型 消费金融业务可以分为无场景和有场景。无场景有现金贷,有场景比如教育分期、医美分期、租房分期等更多垂直消费场景。 无场景关注欺诈风险和信用风险,有场景重点在操作风险和经营风险。 比如合约机业务,门店欺诈风险就比个人信用风险造成的损失大,更需要重点防范。 风控流程搭建基本就是一套相对固定的方法,贷前各类数据源验证+评分卡,贷中做好监控,贷后做好催收。 贷前:准入政策、个人信息验证、黑名单策略、反欺诈策略、信用评分、额度策略。贷中:各类指标以及用户行为的监控。贷后:催收、不良资产处置等。 此外,搭建风控体系还需要从不同的角度考量。比如管理层,则需要考虑是业务导向还是风险导向;业务层则需要了解业务场景和渠道,以及产品的额度、期限、费率、还款等各类要素等等;支持层则需要考虑风控系统是采购/自研/定制,以及如何打通数据并做好监控。 审批流程设计 业务与风控系统地架构设计如下图: 反欺诈 欺诈与反欺诈是一个不断相互博弈的过程,需要针对欺诈原因进行分解,然后再设计反欺诈规则。常见的欺诈类型有如下: 伪冒身份。 这种情形可以通过信息验证、人脸识别等技术识别手段进行加强。资料造假。 可以建立自有规则提高资料造假的成本。常客老赖。 通过接入外部名单识别。中介黑产。 通过埋点监控,比如用户环境属性、网络IP地址、设备指纹、地理位置等进行虚拟机识别、代理识别以及行为识别。 下面是一些基于通讯录详单制定的一些反欺诈规则。更多关于反欺诈的内容可以参看之前的文章。 策略分析 贷前贷中环节的监控主要是监控运营类和风险类两类指标。运营类指标如客户数量、环节转化率、放款额;风险类指标有业务指标(Vintage、首逾率)、策略表现(命中率)以及用户行为特征统计等。 业务监控 主要是监控关键业务指标及其变化趋势,比如申请量、通过率、转化率等,目的是及时发现申请异常,做好及时防范。指标的划分维度有时间粒度、地域、渠道等,需要设定预警。比如转化率突然升高,可能意味着营销事件的发生或者欺诈等。 策略监控 主要是对风控策略的通过率、命中率等进行监控。及时发现风控策略的异常表现,预防未知风险。 用户监控 一是通过埋点监控用户的行为指标,如页面停留时间等,防止机器操作等恶意欺诈行为;二是通过后台获取用户的各类属性,如设备指纹等,制定反欺诈规则,防范团伙作案、集中申请等风险。 策略优化 策略优化的目的可以从两个思路出发: 提升通过率,同时保持目标坏账率;保持目标通过率,同时降低坏账率。 常用到的指标有K-S曲线、Lift Chart、ROC曲线。 优化策略常用的方法有Swap Set Analysis。又叫作换入换出分析或者交换集分析。不仅可以用于策略的优化也可以用于模型的优化。 首先,需要基于测试数据对比、分析新旧策略。 换入的为原策略拒绝,新策略通过的,有480个; 换出的为原策略通过,新策略拒绝的,有210个。这两部分客群是需要重点关注的。再计算各个客群的坏账率。 然后对比新旧策略的通过率和坏账率,可以看到通过率升高15.5%,坏账率降低2.4%。换入换出分析的目的就是拿好人交换坏人,最后通过AB测试决定是否参与决策。 【作者】:Labryant 【原创公众号】:风控猎人 【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。 【转载说明】:转载请说明出处,谢谢合作!~

unity 里用代码控制增加后者删除标签Tag和层Layer

通过unityEditor 类可以实现将命令挂在菜单栏当中,用于自动创建Tag和layer. using System; using System.Collections; using System.Reflection; using UnityEditor; using UnityEngine; public class TagManagerData { public static string[] tags = new string[] { "Unity11" ,"xigua" }; public static string[] sortingLayers = new string[] { "enmey" , "friend" }; public static string[] layers = new string[] { "wall" ,"ground" }; } [InitializeOnLoad] public class AutoWriteSettings { static AutoWriteSettings() { bool hasKey = PlayerPrefs.HasKey("WriteSettings"); if (hasKey == false) { PlayerPrefs.SetInt("WriteSettings", 1); OnWrite(); } } [MenuItem("

MySQL 异常: "Host 'xxx' is not allowed to connect to this MySQL server"

远程连接提示:Host 'xxx' is not allowed to connect to this MySQL server。是mysql未开启mysql远程访问权限导致。 解决方法 登录到mysql: mysql -uroot -ppwd查看user表 # 使用数据库mysql use mysql; # 查看主机和用户 mysql> select host, user from user; +-----------+------------------+ | host | user | +-----------+------------------+ | localhost | mysql.infoschema | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | +-----------+------------------+ 4 rows in set (0.00 sec) 表中host、user字段标识了可以访问数据库的主机和用户。例如上面的数据就表示只能本地主机通过root用户访问。 为了让数据库支持远程主机访问,有两种方法可以开启远程访问功能。 第一种(改表法): 修改host字段的值,将localhost修改成需要远程连接数据库的ip地址。或者直接修改成%。修改成%表示,所有主机都可以通过root用户访问数据库。为了方便,我直接修改成%。命令: mysql> update user set host = '%' where user = 'root'; 再次查看user表, 修改成功,输入命令mysql> FLUSH PRIVILEGES; 回车使刚才的修改生效,再次远程连接数据库成功。

xilinx fpga 部分动态重配置(Partial Reconfiguration)设计实现

1.测试环境 采用xilinx fpga xc7vx690t,实现动态跑马灯,验证部分动态重配置(Partial Reconfiguration)功能 pm1:间隔1s闪动 pm2:间隔4s闪动 顶层文件:top pm_led:实现动态重配置,实现1s和4s闪动 led2:固定2s闪动,验证重配置,即在下载重配置bit时,改灯会一直闪烁 2.实现步骤 led:实现部分动态冲加载功能 led2_2s:实现固定2s闪动功能 新建工程 根据选择型号,新建工程,完毕后,使能Partial Reconfiguration 导入源文件 创建Partial Reconfiguration 右键点击module led,选择 在对话框中输入相应的pd和pm名字, 这里分别输入led和led_1s 配置Partial Reconfiguration 点击向导后,在出现的对话框中,点击next 输入led_4s作为一个新的pm,pd还是led,然后添加文件led_4s.v, 注意该文件的module名字仍然为led 之后根据提示操作即可 3.综合 综合完成之后,打开综合结果,并执行如下操作 画出一块作为pblock,保存,工具会将pblock约束添加到约束文件中,然后执行reports》report drc 为了加快速度,只选择上图部分即可 4.实现及生成bit 按照正常操作即可 5.下载 通过jtag下载bit,先下载整体bit,然后下载部分bit,可验证功能 6.文件及约束 文件已上传 参考已上传资源Partial Reconfiguration.rar 7.注意点 led_4s.v文件的module名字仍然为led 具体参考ug947

MySQL 应用高可用部署方案(shell+router+mgr)

官方结构图 2、具体步骤 (1)搭建mysql group application,参考 Mysql 高可用方案 MGR(Mysql Group Replication)配置及常见问题 (2)mysql主节点安装mysql shell mysqlsh 进入mysql-shell 客户端 shell.connect('root@node1:3306); var cluster = dba.createCluster('prodCluster', {adoptFromGR: true}); cluster.status(); 集群正常.。 (3) 应用服务器安装mysql-router,并且配置mysql 3台主机及IP转换 /etc/hosts mysqlrouter --bootstrap ic@ic-1:3306 --user=root 输完密码后,mysql-router会自动获取cluster信息,并生成mysqlrouter.conf在安装目录。 (4) 启动mysql-router mysqlrouter & (5) 应用服务器配置mysql-router 读写端口 6446 实现mysql failover时的高可用,对应用无感。 jdbc.ums.url=jdbc:mysql://192.168.100.35:6446/ums?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false 3 注意事项 (1) mysql-router 由于并发能力为500,所以官方推荐每个应用节点部署一个mysql-router节点。因此也增加了部署复杂度。 (2) 应用如果多节点部署,每个应用节点应连接自己节点mysql-router 4、状态查看 (1) 用mysql shell 连接mysqlrouter地址 mysqlsh --uri root@192.168.100.35:6446 (2)查看cluster状态 cluster = dba.getCluster(); cluster.status(); mysqlsh --uri root@localhost:6446ysqlsh --uri root@localhost:644 5、参考文献

Hadoop授权令牌解释(原标题 Hadoop Delegation Tokens Explained)

转载:https://blog.cloudera.com/hadoop-delegation-tokens-explained/ 很好的文章,但是要翻墙转载给国内的伙伴,有问题请联系删除 第一部分谷歌翻译版;下边有英语版 Apache Hadoop的安全性是在2009年左右设计和实施的,此后一直保持稳定。但是,由于缺少有关此领域的文档,因此出现问题时很难理解或调试。设计了委托令牌,并将其作为身份验证方法在Hadoop生态系统中广泛使用。这篇博客文章介绍了Hadoop分布式文件系统(HDFS)和Hadoop密钥管理服务器(KMS)上下文中的Hadoop委托令牌的概念,并提供了一些基本代码和故障排除示例。值得注意的是,Hadoop生态系统中还有许多其他服务也使用委托令牌,但为简洁起见,我们仅讨论HDFS和KMS。 此博客假设读者了解的基本概念验证,Kerberos的,为了理解认证流程的目的; 以及HDFS体系结构和HDFS透明加密,以了解什么是HDFS和KMS。对于对HDFS透明加密不感兴趣的读者,可以忽略此博客文章中的KMS部分。可以在此处找到有关Hadoop中的一般授权和身份验证的先前博客文章。 Hadoop安全性快速入门 Hadoop最初是在没有真实身份验证的情况下实施的,这意味着存储在Hadoop中的数据很容易遭到破坏。此安全功能后来于2010年通过HADOOP-4487添加,其主要目的有以下两个: 防止未经授权访问HDFS中存储的数据在实现目标1的同时不增加大量成本。 为了实现第一个目标,我们需要确保 任何访问群集的客户端都经过身份验证,以确保它们是他们声称的身份。集群中的所有服务器都经过身份验证,可以成为集群的一部分。 为了这个目标,选择Kerberos作为基础身份验证服务。添加了其他机制,例如委托令牌,块访问令牌,信任等,以补充Kerberos。特别是,引入了代币令牌以实现第二个目标(有关方法,请参阅下一节)。以下是简化图,说明了在HDFS上下文中使用Kerberos和委派令牌的位置(其他服务类似): 图1:HDFS身份验证机制的简化图 在上面的简单HDFS示例中,有几种身份验证机制在起作用: 最终用户(乔)可以使用Kerberos与HDFS NameNode对话最终用户(joe)提交的分布式任务可以使用joe的委派令牌访问HDFS NameNode。这将是本博客文章其余部分的重点HDFS数据节点使用Kerberos与HDFS NameNode对话最终用户和分布式任务可以使用“块访问令牌”访问HDFS DataNode。 我们将在本博文结尾的“ 其他使用令牌的方式 ”部分中简要介绍上述机制。要了解Hadoop的安全设计的详细信息,请参阅设计文档在HADOOP-4487和Hadoop的安全架构演示。 什么是授权令牌? 从理论上讲,可以完全使用Kerberos进行身份验证,但是在像Hadoop这样的分布式系统中使用时,它就有其自身的问题。想象一下,对于每个MapReduce作业,如果所有工作任务都必须使用委派的TGT(票证授予票证)通过Kerberos进行身份验证,则Kerberos密钥分发中心(KDC)将很快成为瓶颈。下图中的红线说明了这个问题:一个工作可能有成千上万的节点到节点通信,导致相同数量的KDC流量。实际上,它会在非常大的集群中无意中对KDC 进行分布式拒绝服务攻击。 图2:显示Hadoop中身份验证扩展问题的简化图 因此,引入了委托令牌作为一种轻量级身份验证方法,以补充Kerberos身份验证。Kerberos是一种三方协议。相反,委托令牌身份验证是一种两方身份验证协议。 授权令牌的工作方式是: 客户端最初通过Kerberos向每台服务器进行身份验证,然后从该服务器获取委托令牌。客户端使用委派令牌来与服务器进行后续身份验证,而不是使用Kerberos。 客户端可以并且经常确实将委托令牌传递给其他服务(例如YARN),以便其他服务(例如映射器和化简器)可以作为客户端进行身份验证并代表客户端运行作业。换句话说,客户端可以将凭据“委派”给那些服务。授权令牌有一个到期时间,需要定期更新以保持其有效性。但是,它们不能无限期地更新–使用寿命最长。在过期之前,也可以取消委托令牌。 委托令牌消除了分发Kerberos TGT或密钥表的需求,如果这些密钥或密钥表受到破坏,将授予对所有服务的访问权限。另一方面,委派令牌严格与其相关的服务绑定在一起,并最终到期,如果暴露,则造成的损害较小。此外,委派令牌使凭证更新更加轻便。这是因为更新的设计方式使得更新过程仅涉及更新程序和服务。令牌本身保持不变,因此不必更新已经使用令牌的所有参与者。 出于可用性的原因,委派令牌由服务器保留。HDFS NameNode将委托令牌保留到其元数据(也称为fsimage和编辑日志)。KMS以ZNodes的形式将委派令牌保持在Apache ZooKeeper中。即使服务器重新启动或故障转移,这也可使委托令牌可用。 服务器和客户端在处理委托令牌方面有不同的职责。以下两个部分提供了一些详细信息。 服务器端的委托令牌 该服务器(即图2中的HDFS NN和KMS)负责: 发行委托令牌,并存储它们以进行验证。根据请求续订委派令牌。在客户端取消委派令牌或它们到期时删除委派令牌。通过对照存储的委托令牌验证提供的委托令牌来验证客户端。 Hadoop中的委托令牌是根据HMAC机制生成和验证的。委托令牌中有两部分信息:公共部分和私有部分。委托令牌以哈希图的形式存储在服务器端,公共信息作为键,私有信息作为值。 公共信息以标识符对象的形式用于令牌标识。它包括: 类 令牌的种类(HDFS_DELEGATION_TOKEN或kms-dt)。令牌还包含种类,与标识符的种类匹配。 所有者 拥有令牌的用户。 续订 可以续签令牌的用户。 真实用户 仅在所有者被假冒时相关。如果令牌是由模拟用户创建的,则这将标识模拟用户。 例如,当oozie冒充用户joe时,所有者将为joe,而实际用户将为oozie。 发行日期 令牌发行的时代时间。 最长日期 令牌可以更新到的时期。 序列 号 UUID以标识令牌。 主密钥ID 用于创建和验证令牌的主密钥的ID。 表1:令牌标识符(委托令牌的公共部分) 私有信息由AbstractDelegationTokenSecretManager中的类DealerTokenInformation表示,它对安全性至关重要,并且包含以下字段: 更新日期 令牌预计将更新的时期。 如果小于当前时间,则表示令牌已过期。 密码 使用主密钥作为HMAC密钥计算为令牌标识符的HMAC的密码。 它用于验证客户端提供给服务器的委派令牌。 跟踪号码 跟踪标识符,可用于在多个客户端会话之间关联令牌的用法。

HTTP代理怎样使用

关于HTTP代理在我们查询百度百科的时候会显示:代理客户机的HTTP访问,主要代理浏览器访问网页,它的端口通常为80、8080、3128等。 百度百科的解释太过于模糊了我们来细致的说一下什么叫HTTP代理,说HTTP代理,那我们最先就得来讲一下WEB代理了。 代理,简言之便是“中介”,而Web代理(proxy)服务器是网络的中间实体。代理位于客户端和服务器之间,饰演“中间人”的角色,在各端点中间不停传输HTTP报文。 Web上的代理服务器是意味着客户端进行事务管理的中间人。要是没有Web代理,HTTP客户端就需要直接与HTTP服务器进行对话。有了Web代理,客户端就可以与代理进行对话,接着由代理代表客户端与服务器进行交流。客户端依然会完成对事务的处理,但它是通过代理服务器提供的优质服务来实现的。HTTP的代理服务器既是Web服务器也是Web客户端。HTTP客户端会向代理上传请求报文,代理服务器必须像Web服务器一样,正确地处理请求和连接,接着返回响应。 同时,代理自身要向服务器发送请求,这样,其行为就必须像正确的HTTP客户端一样,要上传请求并接收响应 倘若要建立自己的HTTP代理,就需要认真地遵循为HTTP客户端和HTTP服务器制定的规则。HTTP代理IP可用于了解竞争对手信息、优化自身网站结构、确保内容的质量数量,以及及时掌握数据分析,还可以进行软文推广,效果对比一目了然。 那么HTTP代理是怎样使用的? 1、极光HTTP代理提取ip 2、提取ip-ip提取完成 3、提取ip进行使用(360浏览器为例) 当今,以信息科技为代表的新一波科技和产业革命已经萌发,为社会经济发展注入了强劲动力。在如此大好形势下,互联网也是迎来了迅猛发展,而此时怎样把好的东西推广出去,变成了一件及其重要的事情,HTTP代理IP是一种有效的推广方式,它能够过滤重复代码或者页面、步骤重复情况;还可以用于合理分析现有数据,了解自身不足。

REST:使用Controller端点?

在一般的REST架构中,基本概念是资源。 在资源之后,下一步是为这些资源开发一个统一接口,这在HTTP领域通常意味着: 创建为POST 阅读就是GET 更新为PUT(或部分更新为PATCH) 删除已删除 在现实世界中,不可避免地某些操作不会很好地映射到资源。 通常这是少数操作,例如重置密码。 可以将它们建模为 / password /上的PUT 或作为 控制器端点和到/ resetpassword的POST 后者可能被认为比纯REST更接近于程序化REST,但是有时客户和客户希望您务实。 本文提供了有关何时考虑使用Controller选项的建议。 动作是否映射到CRUD? 现实应用程序中的几个动作无法很好地映射到CRUD。 例如,贝宝的取消计费协议API是: POST /v1/payments/billing-agreements/agreement_id/cancel 取消动作很少能很好地映射到资源的CRUD。 它可以解释为: 一些资源被创建(取消记录) 一些资源被更新(某些状态列可能被设置为取消) 或某些资源被删除(订单请求被删除)。 客户为什么要关心取消的处理方式? 难道它总是会改变吗? 在某些情况下,使用HTTP隧道的API不能很好地映射到CRUD问题。 在取消帐单协议中,这将是: POST /v1/payments/billing-agreements/agreement_id 与身体: { "operation":"cancel" } 这被认为是反模式,决不能使用。 而是应使用控制器端点。 资源状态或工作流程? 在REST体系结构中,客户端或服务器之间的每个请求通常都会更改资源状态(写操作)或应用程序状态(查询或读操作)。 但是,在现实世界中,工作流是不可避免的。 例如,重置密码流程通常包括: 向用户询问userId(通常是电子邮件) 系统检查系统上是否存在电子邮件 向用户发送包含重置密码链接的电子邮件 确保用户只有一定时间才能单击链接 当用户单击链接时,他们可能会被问到一系列问题 他们将被要求重新输入新密码,以确保没有错字 当客户端操作是复杂工作流的一部分时,资源状态和应用程序状态更改可能不容易建模。 它们可能不会同步发生,并且可能会根据工作流的建模方式或工作流何时需要添加额外的步骤进行更改。 在这种情况下,请考虑使用控制器端点。 无需PUT的REST 在某些情况下,可以设置参数以避免使用PUT,而可以使用POST到另一个表示意图的端点。 例如,要更改地址而不是将PUT调用到/ address /,客户端将调用POST到/ changeaddress并完全避免使用PUT。 这里的想法是使命令/查询分离更严格。 有关更多信息,请参见https://www.thoughtworks.com/insights/blog/rest-api-design-resource-modeling。 通常,建议使用PUT / PATCH进行更新/部分更新,并且仅在前两个原因之一适用时才使用控制器端点。 那么,为什么何时使用控制器样式终结点可能涉及主观性。 以上至少可以帮助您做出决定。 请记住,在您考虑采用这种方法的情况下,它应该永远只是少数API。 您在常规的Uniform Interface之外,无法进行独特的样式操作,但是您仍然希望使它们对API的客户来说很直观。 翻译自: https://www.

python,Excel表格追加数据,不覆盖原数据。

import xlwt,xlrd import xlutils.copy xing=1 #要追加或修改的行数的数据 filename = "每日更新" #要追加或者修改表格的文件名。 def writeadd(): data = xlrd.open_workbook(filename+".xls")#读入表格 ws = xlutils.copy.copy(data) #复制之前表里存在的数据 table=ws.get_sheet(0) table.write(xing, 1, label="data1") #追加数据 table.write(xing, 2, label="data2") #追加数据 table.write(xing, 3, label="data3") #追加数据 table.write(xing, 4, label="data4") #追加数据 ws.save(filename +".xls") #保存的有旧数据和新数据 writeadd()

phpstorm误删文件恢复

用phpstorm误删了文件, 然后去电脑回收站看看,发现回收站并没有 然后在phpstrom 点击项目文件夹右键Local History -> show history,可以查看历史的记录 然后找到你想要恢复的那一版 在右键点击如图所示 成功恢复

H桥的三种驱动方式

三种H桥驱动方式 受限单极驱动 (高端驱动)负载与GND相连。 即H桥的上半桥臂用PWM控制,而下半桥臂常开。 T0时刻Q1接PWM,Q2、Q3关闭,Q4常开。Q1不能立即导通,D1导通短时间续流,电流I增大,电压为U。t1时刻,Q1关断,且不能立即关断,D1导通短时间续流,之后D2导通续流 t2时刻之后,Q3输入PWM控制,Q1、Q4关,Q2常开。Q3不能立即导通,D3导通续流,电流反向增大,电压为-U,t3时刻Q3关闭,且不能立即关闭,D3导通短时间续流,D4导通续流 (低端驱动)负载于电源正极相连。 即上半桥臂导通,下半桥臂用PWM控制,相当于负载于电源正极相连。 低端驱动导通类似于高端驱动,不同的是下管关闭时续流环变成上桥臂与负载 优点:控制方式简单。 缺点:不能刹车 (借助这 4 个开关还可以产生电机的另外 2 个工作状态: A) 刹车 —— 将Q2 、Q4开关(或Q1、Q3)接通,则电机惯性转动产生的电势将被短路,形成阻碍运动的反电势,形成“刹车”作用。 B) 惰行 —— 4个开关全部断开,则电机惯性所产生的电势将无法形成电路,从而也就不会产生阻碍运动的反电势,电机将惯性转动较长时间。) 不能能耗制动,在负载超过设定速度时不能提供反向力矩。调速静差大,调速性能很差,稳定性也不好。 单极驱动 即对H桥一侧的半桥输入高级定时器产生的互补PWM控制 (高端驱动)即上桥臂输入PWM控制,除PWMN控制的下桥臂的另一下桥臂常开。相当于负载与GND相连。 t0时刻Q1、Q4导通,电流I增加电压为U,t1时刻Q1截止,Q2导通,电流I减小,电压为电机产生的小负电压,此时Q2、Q4形成通道续流。 (此时mos做续流通道有两个好处1.mos导通压降低比二极管发热少,效率更高2.二极管不能产生反向电流,而mos管可以通过反向电流) (低端驱动)即下桥臂输入PWM控制,除PWMN控制的上桥臂的另一上桥臂常开。相当于负载与电源正极相连。 与单极高端驱动模式相似,只是把PWM的控制信号换到了下半桥,把常开的桥臂换到了上半桥,相当于把电机负载与电源正极相连。与高端驱动不同的是,低端驱动在PWM控制桥臂关闭时,电路的续流通道换为上桥臂导通续流。即Q1和Q3导通续流。 单极驱动模式 优点:启动快,能加速,刹车,能耗制动,能量反馈,调速性能不如双极模式好,但是相差不多,电机特性也比较好。如果接成H桥模式,也能实现反转。 在负载超速时也能提供反向力矩。 缺点:刹车时,不能减速到0,速度接近0速度时没有制动力。不能突然倒转。动态性能不好,调速静差稍大。 刹车:电机反电动势在PWM关断时间伏秒数会大于电源电压在PWM开通时间加在电机上的伏秒数,即电机会产生反向电流,使电机产生反向力矩,如果这个力矩大的话,电机就可以刹车。反向电流还可以在PWM开通时反馈回母线电容和电池中,做到能量回馈,如果电池为二次电池,能量反馈是有好处的。 在控制PWM占空比时,占空比变大电机加速,占空比减小,速度减小。如果占空比在瞬间减小电机反电动势伏秒值会很大,产生刹车的效果,如果占空比突然减小到零,相当于把电机短路,即把电机直接短路。这是急刹车,会对电机,mos管有损伤。 3. 双极模式 电枢电压极性是正负交替的。需要两组互补PWM同时对4个MOS管进行控制。 其中Q1和Q2是一组互补PWM,Q3和Q4是另一组互补PWM。 t0时刻Q1和Q4导通, t1时刻,Q3和Q4反向,因为Q3不能立即导通且感性负载电流方向不能突变所以D3导通续流(图中D2为D3,写错了) t2时刻Q1和Q2反向,Q2、Q3、负载和母线电容续流, t3时刻,负载电流过零,Q2、Q3、负载和母线电容电流反向。 t4时刻Q3、Q4反向Q4不能立即导通,D4导通续流,t5时刻Q1、Q2反向。 下图为全过程的电流,电压图 优点:能正反转运行,启动快,调速精度高,动态性能好,调速静差小,调速范围大,能加速,减速,刹车,倒转,能在负载超过设定速度时提供反向力矩,能克服电机轴承的静态摩擦力,产生非常低的转速。 缺点:控制电机复杂,在工作期间,4个MOS管都处于开关状态,功耗大。

关于annaconda导包pandas报错C extension的问题

关于annaconda导包pandas报错C extension的问题 ImportError: C extension: No module named ‘pandas._libs.tslib’ not built. If you want to import pandas from the source directory, you may need to run ‘python setup.py build_ext --inplace --force’ to build the C extensions first. 解决方法 先卸载 pip uninstall pandas 再安装 pip install pandas

手把手带你入门区块链(实践:ubuntu服务器搭建以太坊私有链)

一、区块链简单介绍1、区块链的简单介绍2、区块链的简单实现架构2、区块链的实现流程 二、ubuntu服务器搭建以太坊私有链1、安装以太坊私有链环境2、创建创世块3、初始化区块链4、开启geth私链客户端5、创建账户及挖矿等 一、区块链简单介绍 1、区块链的简单介绍 区块链的最主要的目的就是去中心化,比如我们银行、支付宝、微信等都存在着一个中心为我们服务,要是哪一天银行等崩了(实际不可能吧),后果可想而知,所以区块链出现就是解决这种中心化比较严重的问题。 2、区块链的简单实现架构 这里以以太坊私有链作简单的介绍,其组成主要包括普通客户和矿工,普通客户主要是实现双向交易,矿工则主要是负责交易验证等并且通过挖矿来挣取奖励。 2、区块链的实现流程 二、ubuntu服务器搭建以太坊私有链 1、安装以太坊私有链环境 为了避免后面出错,建议安装一下go语言环境 sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository -y ppa:ethereum/ethereum sudo add-apt-repository -y ppa:ethereum/ethereum-dev sudo apt-get update sudo apt-get install ethereum 输入geth -h显示如下则安装环境正确 2、创建创世块 作为区块链, 链子总要有个头,所以需要创建一个创世块作为头部,才好往下添加,创世文件名称命名为genesis.json,内容如下,为json格式,这一步一定要在从本地电脑上传到服务器上,而且需要校验json的格式是否正确,否正会因为格式问题导致后面初始化出错,推荐json校验的工具:json校验工具 { "config":{ "chainId":666, "homesteadBlock":0, "eip150Block":0, "eip150Hash":"0x0000000000000000000000000000000000000000000000000000000000000000", "eip155Block":0, "eip158Block":0, "byzantiumBlock":0, "constantinopleBlock":0, "petersburgBlock":0, "istanbulBlock":0, "ethash":{ } }, "nonce":"0x0", "timestamp":"0x5ddf8f3e", "extraData":"0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit":"0x47b760", "difficulty":"0x00002", "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase":"0x0000000000000000000000000000000000000000", "alloc":{ }, "number":"0x0", "gasUsed":"0x0", "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000" } 3、初始化区块链 输入命令如下,其中初始化之前需要新建文件夹data01用于存放链的数据 geth --datadir data01 init genesis.

解决:Caused by: redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. 报错: Caused by: redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value 2. 报错代码: /** * 写入 list * * @param key * @param values */ public <V> Long setList(String key, Collection<V> values) { listOperations = redisTemplate.opsForList(); Long okCount = listOperations.leftPushAll(key, values); // 此行报错 return okCount; } 3. 错误的原因是我在set的时候先放入的是A类型的数据。后来我由于代码写错了,又想要放入B类型的数据。放入失败并报错。 4. 保证数据类型一致就 OK了。 

解决:Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRA

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1. redisTemplate 报错: Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object 2. 报错代码行: Object dd = valueOperations.get(key); 3. 解决,找到配置类,注释掉这一行: om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); PS:对应配置方法完整代码 : /** * retemplate相关配置 * * @param factory * @return */ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.

error: invalid compressed data to inflate file #14: bad zipfile offset (local header sig):

原因是:zip文件太大,不能直接使用unzip name.zip的命令进行解压; 解决方案: 1. 看到CSDN上一篇博客说使用jar xvf full.zip这个命令进行解压,实测可以; 2. stateoverflow上有一种方案是:zip -F file.zip --out file-large.zip 然后再使用命令 unzip file-large.zip 就可以了,不过效果未知,都可以试试。

Mysql 5.7.30-winx64 解压版安装教程

1、下载地址 https://dev.mysql.com/downloads/file/?id=487427 2、配置环境变量 进入环境变量编辑path,添加mysql的bin目录路径。 3、配置文件 从MySQL 5.7.18开始,my-default.ini不再包含在分发包中或由分发包安装,此时需要自己新建my.ini文件 新建的my.ini配置如下 //如果有my-default.ini文件可以不用新建,直接在my-default.ini的[mysqld]下增加安装目录的数据存放目录; [mysqld] character-set-server=utf8 #绑定IPv4和3306端口 bind-address = 0.0.0.0 port = 3306 sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" #默认数据库引擎 default_storage_engine=innodb innodb_buffer_pool_size=1000M innodb_log_file_size=50M # 设置mysql的安装目录 # basedir=D:\IT\mysql\mysql-5.7.27 # 设置mysql数据库的数据的存放目录 datadir=D:\IT\mysql\mysql-5.7.27\data # 允许最大连接数 max_connections=200 # skip_grant_tables [mysql] # mysql客户端默认的字符集,5.7才有的,5.6以及之前的版本没有default-character-set属性 default-character-set=utf8 [mysql.server] default-character-set=utf8 [mysql_safe] default-character-set=utf8 [client] port = 3306 plugin-dir=D:\IT\mysql\mysql-5.7.27\lib\plugin 4、初始化和启动 用管理员身份运行cmd进入mysql的bin目录,输入mysqld -install,如果出现安装后没反应或者提示丢失MSVCP120.dll,先去微软官网下载Visual C++ Redistributable Packages for Visual Studio 2013 或者用以下地址 x86:http://download.microsoft.com/download/1/8/0/180fa2ce-506d-4032-aad1-9d7636f85179/vcredist_x86.exe x64:http://download.microsoft.com/download/1/8/0/180fa2ce-506d-4032-aad1-9d7636f85179/vcredist_x64.exe 下载完成后双击运行并安装此“.exe”。 之后再输入命令提示安装成功; 输入net start mysql启动如果报以下错: 需要再使用如下命令(成功后会在mysql目录下出现data目录,如果没出现则更换如下命令) 1、mysqld --initialize(命令初始化数据库时会随机生成密码,这样在修改密码时Enter password要输入随机生成的密码,随机密码还要去找,比较麻烦。这个随机密码在data目录下.

费马小定理和欧拉定理

费马小定理: 内容:假如a是一个整数,p是一个质数,那么ap - a是p的倍数,可以表示为 ap ≡ a (mod p) 如果a不是p的倍数(即gcd(a, p) == 1),这个定理也可以写成 ap-1 ≡ 1 (mod p) 变形得a * ap-2 ≡ 1 (mod p),所以a关于模p的逆元x = ap-2 (mod p),用快速幂模可快速求之。 算法时间复杂度:O(logn) 模板代码: LL pow_mod(LL a, LL b, LL p) { //a的b次方取模p LL ret = 1; while (b) { if(b & 1) ret = (ret * a) % p; a = (a * a) % p; b >>= 1; } return ret; } LL Fermat(LL a, LL p) { //费马小定理求a关于b的逆元 return pow_mod(a, p-2, p); } 3.

Spring的Event事件处理使用详解

Spring中使用事件非常简单,只需要以下的几个步骤: 1.定义事件,继承ApplicationEvent2.定义监听,要么实现ApplicationListener接口,要么在方法上添加@EventListener注解3.发布事件,调用ApplicationContext.publishEvent()或者ApplicationEventPublisher.publishEvent(); 下面我们就用一个例子来说下具体的用法: 比如用户注册成功以后,系统要给用户发送一封邮件,同时还要给用户发放优惠券,为了跟注册流程解耦,可以在注册成功以后发出一个事件,让其他服务来监听。 定义用户注册成功事件: //自定义事件需要继承ApplicationEvent public class UserRegisterEvent extends ApplicationEvent { private String username; public UserRegisterEvent(Object source, String username) { super(source); this.username = username; } public String getUsername() { return username; } } 定义发送邮件和发放优惠券的监听: //可以实现ApplicationListener接口监听事件 @Component @Order(2)//可以使用order指定顺序,越小优先级越高 public class MailUserRegisterListener implements ApplicationListener<UserRegisterEvent> { @Override public void onApplicationEvent(UserRegisterEvent event) { System.out.println(Thread.currentThread().getName()+"-给用户"+event.getUsername()+"发送邮件!"); } } //也可以使用@EventListener监听事件 @Component @Order(1) public class CouponUserRegisterListener { @EventListener public void sendCoupon(UserRegisterEvent event) { System.out.println(Thread.currentThread().getName()+"-给用户"+event.getUsername()+"发送优惠券!"); } } 用户注册成功以后发送事件出来:

Lua之pcall和xpcall

如果需要在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码, pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo 这里的33是给指定的function传的参数. 如以下代码: if pcall(function(i) print("i am "..i) end, 33) then print("true") else print("false") end --如果要传多个参数 <pre name="code" class="plain">if pcall(function(i,j) print("i am "..i..j) end, 33,44) then print("true") else print("false") end 执行的结果是: i am 33 true 或 i am 3344 true Lua提供了xpcall函数,xpcall接收第二个参数——一个错误处理函数,当错误发生时,Lua会在调用桟展看(unwind)前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息了. debug库提供了两个通用的错误处理函数: debug.debug:提供一个Lua提示符,让用户来价差错误的原因 debug.traceback:根据调用桟来构建一个扩展的错误消息 xpcall(function(i) print(i) error('error..') end, function() print(debug.traceback()) end, 33) 输出结果: stack traceback: test.lua:1: in function <test.lua:1> [C]: in function 'error' test.lua:1: in function <test.

MATLAB非线性规划学习笔记

主要使用的MATLAB函数 非线性规划的MATLAB主要函数为fmincon,在MATLAB中的形式为: 它的返回值是向量x,其中 FUN 是用M 文件定义的函数 f (x);X0是x的初始值; A,B,Aeq,Beq 定义了线性约束 A* X ≤ B, Aeq * X = Beq ,如果没有线性约束,则 A=[ ],B=[ ],Aeq=[ ],Beq=[ ];LB 和UB 是变量x 的下界和上界,如果上界和下界没有约 束,则LB=[],UB=[],如果x 无下界,则LB 的各分量都为-inf,如果x 无上界,则UB 的各分量都为 inf;NONLCON 是用M 文件定义的非线性向量函数C(x),Ceq(x);OPTIONS 定义了优化参数,可以使用Matlab 缺省的参数设置。 函数调用 options=optimset('largescale','off'); [x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[], 'fun2', options) 目标优化函数 function f=fun1(x) f=sum(x.^2)+8; 约束条件 function [g,h]=fun2(x); g=[-x(1)^2+x(2)-x(3)^2 x(1)+x(2)^2+x(3)^3-20]; %非线性不等式约束 h=[-x(1)-x(2)^2+2 x(2)+2*x(3)^2-3]; %非线性等式约束 结果 除了fmincon外,还有其他MATLAB内置函数用于求解非线性规划。如,fminbnd,quadprog,fseminf,fminmax等。 特殊求解方法 梯度法(最速下降法) 我们求解函数的最小值的时候,总是可以从当前点出发,每次都沿着当前点的梯度方向下降,这样就能够找到最低点。基本流程如下: 主函数如下 clc x=[-1;-1]; [f0,g]=detaf(x); r=[]; while norm(g)>0.0000001 p=g/norm(g); t=0.

按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。

题目:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。 void InputArray(int *p, int m, int n); int FindMax(int *p, int m, int n, int *pRow, int pCol); 输入提示信息: “Input m, n:” "Input %d%d array:\n" 输入格式:"%d,%d" 输出提示信息和格式:“max = %d, row = %d, col = %d\n” // 按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。 #include <stdio.h> #define M 10 #define N 10 void Transpose(int a[][N], int at[][M], int m, int n); void InputMatrix(int a[][N], int m, int n); void PrintMatrix(int at[][M], int n, int m); int main() { int s[M][N], st[N][M], m, n; printf("

APP热启动与冷启动

冷启动:当用户启动应用程序时,后台没有该应用程序的进程,这时系统会重新给应用程序分配一个进程,这种方法就叫冷启动。 热启动:当用户启动应用程序时,后台已经有了该程序的进程(通过,退出,home键退出让应用程序在后台继续执行)当再次点开APP马上能够恢复到上次使用的状态,不需要再回到手机的首页打开应用程序,这个方式就叫热启动。

利用栈和队列实现图的深度优先遍历与广度优先遍历

利用栈和队列实现图的深度优先遍历与广度优先遍历 代码中描述的图为下图: 结果: 深度优先遍历 [A, F, G, E, H, D, I, C, B] 广度优先遍历 [A, B, F, C, G, I, E, D, H] import java.util.*; public class Test3 { // 深度 public void DFS(HashMap<String, String> map, String startNode) { // 定义一个访问数组,判断当前节点是否访问过 ArrayList<String> visited = new ArrayList<>(); // 使第一个节点入栈 Stack<String> stack = new Stack<>(); stack.push(startNode); while (!stack.isEmpty()) { // 出栈 String node = stack.pop(); // 判断当前节点是否访问过 if (!visited.contains(node)) { visited.add(node); String[] linkNode = map.

机器人运动学 DH参数

对于一个机械臂,这里已旋转副连接为例,描述需要用到两个参数,连杆转角和连杆长度。这连个都是机械臂本身结构决定的参数。用于描述机械臂两端连接轴的数学关系,转角和公垂线的距离 在用于描述两个机械臂之间的关系时候,可以使用简化后的模型描述,也即使用两个公垂线的偏距和夹角表述连接关系。 定义公垂线在空间的轴线上的偏移为连杆偏距,偏差的角度定义为关节角。 连杆和连接之间的关系可以使用上述的四个参数:连杆长度、连杆转角、连杆偏距和关节角 描述。 关节角由驱动电机进行控制,其他三个参数都是由结构确定的,结构确定后不会再改变。 通过使用上述四个参数描述结构运动关系的规则称为Denavit-Hartenberg参数,这也是比较常用的一种方法 坐标系的描述: 机器人学前几章一般都是讲的空间变换,就是为这里机械臂的空间位置描述准备的。只要在机械臂每个关节上面建立坐标系,就可以从基座推导到尾端或者从尾端推导到工具在基座空间的坐标。 建立坐标系的规则: 1、选择旋转轴线,作为Z轴; 2、选择相邻两个Z轴的公垂线作为X轴; 3、通过右手定则,拇指和Z轴重合,其他手指和X轴重合,其他手指再旋转90度所指方向为Y轴。 4、原点基座坐标尽可能和1关节重合,简化计算。最后工具关节也要尽量简化计算 DH参数和坐标系的关系: 连杆长度:ZY平面的间距,一般都是正数 连杆转角:相邻两个坐标Z轴的间距,也即绕X1轴从Z1到Z2的夹角 偏移矩:公垂线在Z轴上的坐标,更准确是坐标系1原点在坐标系2的Z轴上的投影,方向为从投影点到坐标系2的原点,也即投影到Z负 偏移矩为正,否则为负 关节角:X轴延长线和下个X轴的夹角,绕Z2,从X1旋转到X2 连杆0为基座 连杆n为工具

EDUSOHO踩坑笔记之十八:前端开发之编译打包

EDUSOHO踩坑笔记之十八:前端开发之编译打包 编译打包 实时编译 Source map编译实体文件常见错误 模块不存在app crashed内存泄漏端口被占用系统默认最大文件打开数过少 编译打包 EduSoho 使用webpack编译打包前端模块,配置文件为 webpack.config.js: module.exports = { output: { path: 'web/static-dist/', // 用于生产环境下的输出目录 publicPath: '/static-dist/', // 用于开发环境下的输出目录 }, libs: { // 独立打包的类库,共用的依赖,在 twig 页面上调用({% do script(['libs/base.js']) %}) 'vendor': ['libs/base.js'], // 可以是一个 JavaScript 文件, 'jquery-validation': ['libs/js/jquery-validation.js'], 'echo-js': ['echo-js'], // 也可以是一个 NPM 依赖包 // ... }, noParseDeps: [ // 设置不需要解析的依赖,以加快编译速度 'jquery/dist/jquery.js', 'bootstrap/dist/js/bootstrap.js', // ... }, onlyCopys: [ //对于自成一体的前端模块,纯拷贝该组件下的文件到 `web/static-dist/libs` 目录下 { name: 'es-ckeditor', // 模块的编译打包输出名 ignore: [ // 需忽略复制的文件及目录 '**/samples/**', '**/lang/!

汽车常用连接器接口定义

OBD II 连接器 也称SAE J1962连接器,其包含有CAN线,K线,J1850总线。 1. J1962公接头(中间)和J1962母接头(下)标题 表1 OBD-II连接器端口定义 ContactGeneral allocation1,3,8,9,11,12,13 Assignment of contacts 1,3,8,9,11,12 and 13 in the vehicle connector is left to the discretion of the vehicle manufacture. 2Bus positive line of SAE J1850.4Chassis ground5Signal ground6CAN_H line of ISO 15765-47K line of ISO 9141-2 and ISO 14230-410Bus negative line of SAE J185014CAN_L line of ISO 15765-415L line of ISO 9141-2 and ISO 14230-416Permanent positive voltage CAN DB9

Spring Boot:使用Thymeleaf布局方言的Thymeleaf模板装饰器

介绍 在所有Thymeleaf模板上重用页眉和页脚的问题经常在StackOverflow上提出。 在本文中,我将向您展示如何使用Thymeleaf布局方言来结构化模板,以在Spring Boot应用程序中实现更高的代码可重用性。 创建一个Spring Boot应用程序 让我们使用Spring Initializer创建一个具有所需依赖项的空项目。 我为空项目选择了以下内容: 在最喜欢的IDE中加载项目后,只需将thymeleaf和thymeleaf-layout-dialect版本更新为项目pom.xml中的“”即可: <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version> <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version> 注意:我在这个示例中使用了Spring Boot 1.5.8.RELEASE。 一旦发布了稳定的2.0版本,我将相应地更新文章。 定义基本模板 如果使用的是Spring Boot,则无需为使用Thymeleaf和Thymeleaf布局方言进行任何配置。 自动配置支持将配置使用Thymeleaf模板所需的所有bean。 让我们在src\main\resources\templates位置创建base.html : <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <head> <title layout:title-pattern="$CONTENT_TITLE - $LAYOUT_TITLE">Base</title> <meta name="description" content=""/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="https://bootswatch.com/4/cerulean/bootstrap.min.css" /> </head> <body> <nav class="navbar navbar-light bg-light"> <span class="navbar-brand mb-0 h1">Decorator Sample</span> </nav> <div class="container"> <nav aria-label="breadcrumb" role="navigation"> <ol class="breadcrumb"> <th:block layout:fragment="breadcrumb"> </th:block> </ol> </nav> <div class="

Python浏览器自动化爬取淘宝商品信息

Python爬取淘宝商品信息 python爬虫的库有很多,在这里我们使用selenium的自动化库,导入其中的webdriver包来实现 使用到的库有selenium, time, re 需提前安装浏览器自动化工具Chromedriver 根据你的chrome版本找到最近的版本下载 下载:Chromediver 使用chrome浏览器爬取 1.输入关键字查询 if __name__ == '__main__': kw = input('请输入宁要查询的商品名称:') drive = webdriver.Chrome('chromedriver.exe') drive.get('https://www.taobao.com/') input_div = drive.find_element_by_id('q') input_div.send_keys(kw) infolist = [] 2.找到我们要爬取的页码数 def drive_(): drive.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click() time.sleep(15) reg = re.compile('(\d+)') total_page = drive.find_element_by_xpath('//div[@class="inner clearfix"]/div[@class="total"]').text pagenum = int(reg.search(total_page).group(1)) return pagenum 3.由于爬取的淘宝为动态网页,需下拉才可加载网页,不然爬取不到下面的数据 使用js实现下拉功能: def drop_down(): for i in range(1,11,2): time.sleep(0.5) j = i / 10 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' %j drive.execute_script(js) 4.接下来爬取数据

并发编程工具类-CountDownLatch的使用和原理解析

1、CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。 2、CountDownLatch 常用方法说明 CountDownLatch(int count); //构造方法,创建一个值为count 的计数器。 ​ await();//阻塞当前线程,将当前线程加入阻塞队列。 ​ await(long timeout, TimeUnit unit);//在timeout的时间之内阻塞当前线程,时间一过则当前线程可以执行, ​ countDown();//对计数器进行递减1操作,当计数器递减至0时,当前线程会去唤醒阻塞队列里的所有线程。 3、用CountDownLatch 来优化我们的报表统计 功能现状 运营系统有统计报表、业务为统计每日的用户新增数量、订单数量、商品的总销量、总销售额…等多项指标统一展示出来,因为数据量比较大,统计指标涉及到的业务范围也比较多,所以这个统计报表的页面一直加载很慢,所以需要对统计报表这块性能需进行优化。 问题分析 统计报表页面涉及到的统计指标数据比较多,每个指标需要单独的去查询统计数据库数据,单个指标只要几秒钟,但是页面的指标有10多个,所以整体下来页面渲染需要将近一分钟。 解决方案 任务时间长是因为统计指标多,而且指标是串行的方式去进行统计的,我们只需要考虑把这些指标从串行化的执行方式改成并行的执行方式,那么整个页面的时间的渲染时间就会大大的缩短, 如何让多个线程同步的执行任务,我们这里考虑使用多线程,每个查询任务单独创建一个线程去执行,这样每个统计指标就可以并行的处理了。 要求 因为主线程需要每个线程的统计结果进行聚合,然后返回给前端渲染,所以这里需要提供一种机制让主线程等所有的子线程都执行完之后再对每个线程统计的指标进行聚合。 这里我们使用CountDownLatch 来完成此功能。 模拟代码 1、分别统计4个指标用户新增数量、订单数量、商品的总销量、总销售额; 2、假设每个指标执行时间为3秒。如果是串行化的统计方式那么总执行时间会为12秒。 3、我们这里使用多线程并行,开启4个子线程分别进行统计 4、主线程等待4个子线程都执行完毕之后,返回结果给前端。 ​ //用于聚合所有的统计指标 private static Map map=new HashMap(); //创建计数器,这里需要统计4个指标 private static CountDownLatch countDownLatch=new CountDownLatch(4); ​ public static void main(String[] args) { ​ //记录开始时间 long startTime=System.currentTimeMillis(); ​ Thread countUserThread=new Thread(new Runnable() { public void run() { try { System.

JS闭包产生条件、作用、生命周期

闭包 1. 概括2. 闭包产生条件3. 闭包的作用4. 闭包的生命周期 1. 概括 闭包就是能够读取其他函数内部变量的函数,或者子函数在外调用(子函数所在的夫函数的作用域不会被释放) 2. 闭包产生条件 函数嵌套 例如: function A() { function B() { } } 内部函数引用了外部函数中的数据(属性、函数) 例如: function A() { var a = "a"; function B() { console.log(a); } } 执行外部函数(也可理解为定义内部函数) 例如: function A() { var a = "a"; function B() { console.log(a); } } A(); 3. 闭包的作用 使函数内部变量在函数执行完之后继续存在于内存中(延长变量使用时间)让函数外部能够操作函数内部的数据 例如: function A() { var a = "a"; function B() { a += "a"; console.

对Lambda表达式的疑问

目录 Lambda 概念Lambda 表达式的结构Lambda 表达式举例Lambda 表达式与匿名类的区别个人疑问 Lambda 概念 Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。 Lambda 表达式的结构 Java 中的 Lambda 表达式通常使用 (argument) -> (body) 语法书写,例如: (arg1, arg2…) -> { body } (type1 arg1, type2 arg2…) -> { body } 让我们了解一下 Lambda 表达式的结构。 1、一个 Lambda 表达式可以有零个或多个参数 2、参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同 3、所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c) 4、空圆括号代表参数集为空。例如:() -> 42 5、当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a 6、Lambda 表达式的主体可包含零条或多条语句 7、如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致

PHP MD5withRSA、SHA1withRSA、SHA256withRSA算法签名

MD5withRSA签名 签名: openssl_sign($data, $signature, $pkeyid,OPENSSL_ALGO_MD5 ); 验签: openssl_verify($data, $signature, $pkeyid, OPENSSL_ALGO_MD5); 代码如下: <?php class Md5RSA{ /** * 利用约定数据和私钥生成数字签名 * @param $params 待签数据 * @return String 返回签名 */ public function sign($params) { if (empty($params)) { return false; } $privateKey = file_get_contents(dirname(__FILE__).'/rsa_private_key.pem');//私钥 if (empty($privateKey )) { return false; } $pkeyId = openssl_get_privatekey($privateKey ); if (empty($pkeyId )) { return false; } $verify = openssl_sign($params, $signature, $pkeyId, OPENSSL_ALGO_MD5); openssl_free_key($pkeyId); return $signature; } /** * @param $params待验证数据 * @param $signature 数字签名 * @return true 验证成功 false 验证失败 */ public function isValid($params='', $signature='') { if (empty($params) || empty($signature)) { return false; } $publicKey = file_get_contents(dirname(__FILE__).

Truetype&Harfbuzz&FreeType联合应用完全解析(二)

本章主要简单介绍FreeType,以及结合TrueType来写一个代码示例 你将学习到的知识点有 什么是FreeType,它和TrueType、OpenTrue有什么联系写代码实现使用FreeType读取TrueType字体文件,生成位图数据,然后在屏幕上把位图数据显示出来。笔者使用Qt的窗口来模拟屏幕,实现真正的从字符串数据到可视的字符的效果。效果图如下: TrueType和FreeType的简单应用 1. FreeType介绍2.TrueType+FreeType生成位图数据总结 1. FreeType介绍 百度百科:FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。支持单色位图、反走样位图的渲染。 直白地说,freetype就是用来生成字体的位图的一个开源函数库。它可以渲染truetype、opentype、type1等字体文件。truetype在上一篇博客已经介绍过,而opentype是truetype的一个升级版。opentype是Microsoft和Adobe之间竞争与合作的产物,它嵌入了PostScript字体,功能更加强大。 2.TrueType+FreeType生成位图数据 准备材料: truetype字体文件KhmerUI.ttf,这是高棉语的字体文件freetype字体引擎源码,这里使用的是freetype-2.10.1ubuntu16.04,我是虚拟机里面运行的安装Qt Creator 以上材料的下载链接在这里。 ubuntu16.04安装freetype: 一般在ubuntu下,解压并进入源码根目录,直接: ./configure make sudo make install 三部曲,我选择最简单的安装方式。安装过程中可能会出现依赖问题,请自行查找资料解决。 ubuntu16.04安装Qt Creator 使用Qt是为了模拟屏幕来显示渲染出来的字符位图数据,我使用的Qt版本是Qt Creator 3.4.2 (opensource),读者可以去Qt官网上直接下载安装文件。 工作流程 回顾一下前一章的freetype加载字符到渲染出字符的点阵数据的流程 初始化freetype库使用freetype库打开truetype文件(一般是.tty后缀的文件),加载字符的全部数据设置字符的大小根据要显示的字符设置字符的编码方式,freetype默认使用的是Unicode编码。一般情况是这样的: (1)要显示的字符使用utf8格式编码 (2)使用freetype渲染前,需要将utf8转换Unicode编码,转换算法网上可以搜索到很多渲染字符成为需要的点阵数据,然后一个个刷到屏幕上字符的显示的位置要根据字符的度量调整,才能正常显示 开始写代码: 目录结构 . ├── contrib -----第三方库头文件 │ ├── freetype2 -------freetype2库的头文件 ├── encoding_conv.c ----utf8转换成ucs2的函数接口 ├── encoding_conv.h ├── font.qrc ├── fonts │ └── KhmerUI.ttf -------高棉语truetype文件 ├── lib │ ├── freetype-2.

[算法入门]分块入门之求最大值

分块入门之求最大值 分块,优美的暴力 Description Input 第一行给出一个数字N,接下来N+1行,每行给出一个数字Ai,(1<=i<=N<=1E5) 接来给出一个数字Q(Q<=7000),代表有Q个询问 每组询问格式为a,b即询问从输入的第a个数到第b个数,其中的最大值是多少 Output 如题所述 Sample Input 10 0 1 2 3 2 3 4 3 2 1 0 5 0 10 2 4 3 7 7 9 8 8 Sample Output 4 3 4 3 2 第一眼看很容易想到用暴力循环枚举区间的最值,但当n极大时,暴力直接原地爆炸。而分块就可以用空间换时间达到时空平衡。 可以把这想象成一个班级,一天老师问从编号i~j的同学中最高的是哪个,老师可以挨着一个个问做比较,但当班级里的人数很大的时候,老师肯定会累死。而分块就相当于班级里的小组,对于不是处于完整的小组,老师挨个问就可以;对于完整的小组,老师就只想要问小组长——分块维护的状态,就可以快速得到答案。 分块的一些基础 块数:一般取q=sqrt(n),表示一个块(小组)有多少个元素(成员)。整块:完整的块(小组),如一个块有10个元素,那么这10个你都能进查询行操作。残块:不完整的块,一个块本来有10个元素,而你能进行查询操作的只有<10个 有了块的基本概念后,还需要了解块的id与元素id直接的转换方法 对于a[i],它所对应的块的下标就是(i-1)/sqrt(n)+1,可以用一个数组to[i]=(i-1)/q+1来存下,表示a[i]对应的块的编号就是to[i] 对于第i个块,它所对应的最左下标就是(i-1)*q+1,所对应的最右下标为min(n,tu[l]*q),注意,因为最右边的块是有可能为残块,如果直接访问最右边会出界,所以要跟n求min。上面的公式可以自己堆一遍并拿几个数测试下加强记忆 能进行这些操作后,就可以着手解决这道题了。 输入和预处理 cin>>n>>m;//n,元素个数,m,访问个数 n++;//题目数据下标是从0开始,一般从1开始好操作 q=sqrt(n); for(int i=1;i<=n;i++){ cin>>a[i]; to[i]=(i-1)/q+1;//预处理第i个元素对应的块的下标 //c[i]表示第i个块最大的值(状态) c[tu[i]]=max(a[i],c[tu[i]]);//提前预处理出第i个块的最大值 } 输入查询操作 for(int i=1;i<=m;i++){ int l,r; scanf("%d %d",&l,&r); l++;//题目数据下标是从0开始,但代码处理时是从1开始 r++; find(l,r); } 对于查询区间[x,y]中最值可以直接查询区间里块的最值再做比较,但x和y不一定能刚好圈住完整的块,在左和有有可能出现残块,残块就只能暴力循环比较。

MATLAB聚类分析学习笔记

这里写目录标题 聚类分析的基本概念基本思想研究主要内容样本间距离的概念明考夫斯基距离马氏距离 聚类方法系统聚类法基本思想基本步骤MATLAB实现 动态聚类基本思想基本步骤MATLAB实现 小结 聚类分析的基本概念 基本思想 聚类分析的基本思想:是根据一批样品的多个观测指标,具体地找出一些能够度量样品或指标之间相似程度的统计量,然后利用统计量将样品或指标进行归类。把相似的样品或指标归为一类,把不相似的归为其他类。直到把所有的样品(或指标)聚合完毕. 相似样本或指标的集合称为类。 研究主要内容 如何度量事物之间的相似性 ? 怎样构造聚类的具体方法以达到分类的目的? 样本间距离的概念 每个样本有p个指标,因此每个样本可以看成p维空间中的一个点,n个样本就组成p维空间中的n个点,这时很自然想到用距离来度量n个样本间的相似程度。 样本X i _{i} i​和样本X j _{j} j​间的距离有多种定义方式,这里给出常用的几种。 明考夫斯基距离 明考夫斯基距离又叫明氏距离,其公式为: 当q的取值不同时又可以分成以下几种常用的距离: 以上几种距离主要有以下两个缺点: 1.距离的值与各指标的量纲有关,具有一定的人为性。任何一个变量计量单位的改变都会使距离的值改变。 2.距离的定义没有考虑各个变量之间的相关性和重要性。以上距离是把各个变量都同等看待,将两个样品在各个变量上的离差简单地进行了综合。 马氏距离 马氏距离又称为广义欧氏距离。 马氏距离考虑了观测变量之间的相关性。如果假定各变量之间相互独立,即观测变量的协方差矩阵是对角矩阵,此时马氏距离就是标准化的欧氏距离。 马氏距离不受指标量纲及指标间相关性的影响 聚类方法 系统聚类法 基本思想 先将n个样品各自看成一类,然后规定样品之间的“距离”和类与类之间的距 离。选择距离最近的两类合并成一个新类,计算新类和其它类(各当前类)的距离,再 将距离最近的两类合并。这样,每次合并减少一类,直至所有的样品都归成一类为止 基本步骤 系统聚类法的基本步骤: 计算n个样品两两间的距离 d i j _{ij} ij​ ,记作D= {d i j _{ij} ij​ } 。构造n个类,每个类只包含一个样品。合并距离最近的两类为一新类。计算新类与各当前类的距离。重复步骤3、4,合并距离最近的两类为新类,直到所有的类并为一类为止。画聚类谱系图。决定类的个数和类 MATLAB实现 pdist函数用来计算样本间的距离 其基本形式为: 其中Distance表示距离的类型,如’chebchev’,‘minkowshi’ 其返回为具有X所有元素个数的排列数的一个向量,比如输入10个元素,C 10 2 _{10}^{2} 102​,即为45个元素的向量。 该函数通常与squareform(D)函数搭配使用。squareform函数可以将pdist(X)函数返回的向量转化为邻接矩阵。如下例所示: 得到邻接矩阵后用LInkage函数创建系统聚类树,并用Dendrogram来做出聚类的树形图。 这两个函数的用法这里就不累述了。 接下来给出一个简单的例子: a=rand(30,2); x=pdist(a); y=linkage(x); dendrogram(y) 动态聚类 基本思想 选取若干个样品作为凝聚点,计算每个样品和凝聚点的距离,进行初始分类,然后根据初始分类计算其重心,再进行第二次分类,一直到所有样品不再调整为止。

Spring源码分析二:BeanFactoryPostProcessor 的处理

文章目录 一、前言二、BeanFactoryPostProcessor & BeanDefinitionRegistryPostProcessor三、代码分析1. BeanFactory2. 代码分析2.1 getBeanFactoryPostProcessors()2.2 invokeBeanFactoryPostProcessors 一、前言 本文是笔者阅读Spring源码的记录文章,由于本人技术水平有限,在文章中难免出现错误,如有发现,感谢各位指正。在阅读过程中也创建了一些衍生文章,衍生文章的意义是因为自己在看源码的过程中,部分知识点并不了解或者对某些知识点产生了兴趣,所以为了更好的阅读源码,所以开设了衍生篇的文章来更好的对这些知识点进行进一步的学习。 本文分析的方法是 AbstractApplicationContext#invokeBeanFactoryPostProcessors,是 前篇内容的继续部分。 本文衍生篇: Spring 源码分析衍生篇八 :ConfigurationClassPostProcessor 上篇Spring 源码分析衍生篇九 :ConfigurationClassPostProcessor 下篇 强烈建议阅读完本文后阅读衍生篇内容。与后续文章有关联!!! 强烈建议阅读完本文后阅读衍生篇内容。与后续文章有关联!!! 强烈建议阅读完本文后阅读衍生篇内容。与后续文章有关联!!! PS : 个人感觉,实现IOC的两个核心后处理器 : ConfigurationClassPostProcessor 解析配置类(这里的配置类不仅仅局限于@Configuration 注解,还包括 @Import、 @ImportResource 等注解),将解析到的需要注入到Spring容器中的bean的BeanDefinition保存起来AutowiredAnnotationBeanPostProcessor 解析bean中的 需要自动注入的bean @Autowired 和 @Inject @Value注解。 二、BeanFactoryPostProcessor & BeanDefinitionRegistryPostProcessor 由于 invokeBeanFactoryPostProcessors 方法中主要就是对BeanFactoryPostProcessor 的处理,所以这里简单的介绍一下 BeanFactoryPostProcessor 及其子接口 BeanDefinitionRegistryPostProcessor。其结构如下图: BeanFactoryPostProcessor 相比较于 BeanPostProcessor 方法是很简单的,只有一个方法,其子接口也就一个方法。但是他们俩的功能又是类似的,区别就是作用域并不相同。BeanFactoryPostProcessor的作用域范围是容器级别的。它只和你使用的容器有关。如果你在容器中定义一个BeanFactoryPostProcessor ,它仅仅对此容器中的bean进行后置处理。BeanFactoryPostProcessor 不会对定义在另一个容器中的bean进行后置处理,即使这两个容器都在同一容器中。 BeanFactoryPostProcessor 可以对 bean的定义(配置元数据)进行处理。Spring IOC 容器允许 BeanFactoryPostProcessor 在容器实际实例化任何其他bean之前读取配置元数据,并有可能修改它,也即是说 BeanFactoryPostProcessor 是直接修改了bean的定义,BeanPostProcessor 则是对bean创建过程中进行干涉。 BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor 的区别在于:

互联网中常见的推荐算法合集

在上网购物、看小说、买电影票的时候,都会遇到各种各样的推荐,给我们推荐一些我们曾经买过或收藏过的同类型产品,或者是推荐一些我们看过的小说题材相同的小说。那这些产品推荐都是如何实现的呢?我们今天就来聊聊这些“无聊”的算法。 在互联网的应用中,常用的推荐算法有:协同过滤推荐算法(Collaborative Filtering Recommendation)、内容推荐算法(Content-based Recommendation)、相似性推荐算法(Similarity Recommendation)、关联规则推荐算法(Association Rule Based Recommendaion)。不同的算法都有不同的应用场景,合理的应用这些算法,能够为我们带来更多的经济效益。 协同过滤推荐算法(Collaborative Filtering Recommendation) 协同过滤算法在电子商务领域可以说是炙手可热,很多的电商平台都是使用的它来做的自己平台的商品推荐。 啥是协同过滤呢? 简而言之,就是找到相同兴趣的群体,将这个群体中感兴趣的其他信息推荐给用户。 我们用一个简单的例子来说明这个算法: 我喜欢看网络小说,但是,看网络小说最讨厌的是什么?就是书荒。一本书看完了,下一本看什么呢?挨个的翻开看几章?浪费时间。看书评吧,不是喷子就是托。 这个时候,协同过滤就有用了。 我是用户A,我喜欢看《极品家丁》、《斗破苍穹》、《诛仙》,这些是我的兴趣。怎么定义我的兴趣呢?可以是我看过超过100章的书,可以是我收藏的书,可以是我好评过的书,总之,我们要先行定义一个纬度。 我的兴趣有了,其他用户也会有同样的兴趣,当其他用户的兴趣和我的兴趣相同时,就可以把这些用户感兴趣的书都推荐给我了。 具体的实施步骤如下: 我们先要建立一个大表,X轴就是我们所有的小说(从数据库中可以获得),Y轴就是我们所有的用户(从数据库中可以获得)。 然后我们将每个用户感兴趣的小说在XY的交叉点中都标注出来(在日志中可以获得),也就如下表示: 标注出来以后,我们就可以看到,我这个葛大爷的爱好是《极品家丁》、《斗破苍穹》和《诛仙》,而张大爷和李大爷和我有相同的兴趣爱好。而张大爷和李大爷还比我多看了一些小说,而这多出来的部分,就体现除了协同,也就可以作为对我的推荐了。 下一次,当我打开看小说的APP的时候,系统就可以向我推荐这两本小说了,而我也就有很大的可能性去打开观看。 内容推荐算法(Content-based Recommendation) 啥是内容推荐算法呢? 内容推荐算法,其实就是对于用户的历史数据进行分析,抽象出内容的共性,然后根据这些共性进行推荐的算法。 我们也举一个例子来说明一下: 我还是喜欢看小说,我经常通过一些条件来搜索小说,我常常搜索:完本、玄幻、200万字以上。而我搜索的行为,就成了我的历史日志记录。根据我的这些日志记录进行共性的抽象,然后在根据抽象出来的共性内容去搜索小说,然后把这些小说推荐给我。 具体的实施步骤如下: 我通过搜索,选中了3本书并且进行了阅读,而这三次我分别搜索了 玄幻、男频、完本、200万字以上 玄幻、男频、完本、100-200万字 玄幻、男频、连载、不限 我们根据上诉内容进行抽象,可以得到一个最终的结果,就是玄幻、男频、不限、不限的结果,根据这个结果,我们可以去进行搜索,然后按照最新更新或者小说热度对结果集进行排序后推荐给用户,这样,这个结果也能够满足用户的需求。 当然,如果用户查询的次数非常多,导致结果的精度差,我们还可以有其他的一些手段来提高精确度,例如只使用最近3天的查询记录或者只使用最近3次查询记录。 相似性推荐算法(Similarity Recommendation) 协同过滤推荐算法和内容推荐算法都是需要用户有一定量的历史数据,然后再根据这些历史数据进行分析再进行推荐。 那针对新用户应该怎么办呢?那么相似性推荐算法就能够解决这个问题。 啥是相似性推荐算法? 相似性推荐算法,也叫相似度推荐算法,是通过对物品的特性进行分析,然后找出类似物品进行推荐的一种算法。 在相似性算法中,有一个距离(Distance)的概念,两者的距离越近,表示两者相似性越高,距离越远,则相似性越低。通过这个概念,如果我点击了一个小说,那么系统就可以根据这个小说于其他小说的相似性高低,为我推荐合适的小说了。 而计算这个距离,又有非常多的方式,这也是相似性算法的核心。有欧几里得距离(Eucledian Distance)曼哈顿距离(Manhattan Distance)明可夫斯基距离(Minkowski distance)余弦相似度(Cosine Similarity)等等很多种算法,我这里就不具体讲算法了(我也讲不明白,哈哈,大家有兴趣可以自己百度)。 具体实施步骤如下: 我还是喜欢看小说,我打开了《诛仙》这本书,这本书都有些什么属性呢? 我们为小说设置了8个属性,也就相当于8个维度,我们将《诛仙》这本书的所有属性作为了原点,然后通过距离算法计算这些属性之间的距离,汇总后,总距离最近的,也就是最值得推荐的。 假设:属性相同的距离为0,反之为1。 我们就可以得到distance = f(题材)+f(作者)+f(状态)+……+f(类型); 我们去遍历所有的小说,然后计算这个距离。找到一本《诛仙前传:蛮荒行》的书。这本书的属性有6个都与《诛仙》相同,2个不同。最后我们计算出distance为2,是距离最近的一本书,于是进行了推荐。 我们这里虽然将不同的属性权重都假设相同了,但是在现实中,不同属性的权重是不同的。也由于这个不是基于用户的历史数据来做出的推荐,因此,每个用户的推荐结果也是相同的。 关联规则推荐算法(Association Rule Based Recommendaion) 关联规则推荐是电商中使用比较广泛的一种推荐算法,最经典的一个案例就是,把啤酒放在尿布的旁边,能够提升啤酒的销量。 啥是关联规则推荐呢? 要明白关联规则推荐,先要明白关联规则。关联规则就是通过对数据的挖掘和分析,找出物体与物体之间的关联性。而关联规则推荐就是依靠物体之间的关联性进行的一种推荐。 我们还是用我看小说来举例吧 当我找到一本我喜欢看的书的时候,这本书是《诛仙》,我将它加入到了我的书单中,这时,系统就为了推荐了其他几本书(《神墓》、《盘龙》等等),告诉我也可以一起加入到书架中,这种推荐,一般就是关联规则推荐。 关联规则推荐是如何实施的呢?我们再来说一下具体的实施步骤:

【PHP】关于字符串和数值比较的问题

关于字符串和数值比较 前段时间面试碰到一个面试题。关于对字符串和数值比较的问题。很有意思。 $a = [0 => 1, "aa" => 5, 3, 4]; foreach ($a as $item => $value) { echo $item == "aa" ? 5 : $value; } 1.执行结果:5534 2.问题分析: 第一次循环:echo 0 == “aa” 时会将"aa"转换成整数,转换会从第一个字符开始如果不是整数就转换成0. 3.同理,‘aa’ + 1时结果也为 1. ‘1aa’+1时结果为2。

MNN Resize error for ConvertTensor,The input is not ready,Can’t run session because not resized

背景: 使用vs2017编写加载mnn模型并推理输入图片的程序,发生如下错误 The 321's input is not ready Resize error for 321, code=3 Resize error for ConvertTensor3, code=3 Can't run session because not resized 由于一开始在linux下生成的项目可执行文件也报了这个错误输出,其他推理的输出也是正常的;根据https://github.com/alibaba/MNN/issues/107 的回答还以为没什么事,但换到windows下使用同样的代码在vs中执行同样的任务时候 linux下运行可执行文件的输出: The 321's input is not ready Resize error for [Convolution], 321, code=3 尝试(无效): 1.查看了大量的使用函数的源代码,找到报错信息输出的函数内参数的变化; 2.另外还是用了逐步debug到函数内部,但这种方式不能追溯到dll中封装好的函数; 3.也同时尝试了不同版本的visual stuido 4.试了不同的mnn模型,但都是onnx生成的 解决: 出错的问题是因为在根据以下网址https://pytorch.org/tutorials/advanced/super_resolution_with_onnxruntime.html 将pytorch模型转为onnx模型时,直接使用了例子中的export函数的全部内容,即全部参数,但根据https://github.com/alibaba/MNN/issues/463上作者的回答,在vs读取mnn模型推理时(即runtime)需要fix input shape,而以下生成onnx模型的代码中的dynamic_axes把模型输入的batchsize改成了不定项,所以得到的onnx,mnn模型的输入尺寸均不定,即使在vs加入下列代码也没有用,因为已经在c++里用的时候已经是runtime,不支持runtime的resize。 interpreter->resizeTensor(input_tensor, input_dims); interpreter->resizeSession(ultraview_session); 生成onnx模型的代码 # Input to the model x = torch.randn(1, 1, 224, 224) torch_out = torch_model(x) # Export the model torch.

聊聊你不知道的Java变量转型

单枪匹马你别怕,一腔孤勇又如何,这一路你可以哭,但不能怂。 请关注:源码猎人 目录 简介 标识符命名规则 类变量(静态变量) 实例变量 局部变量 变量数据类型 基本类型之间的转换 常见面试题 简介 Java变量分为类变量、实例变量、局部变量。在Java语言中,所有的变量在使用前必须声明。定义变量就是要告诉编译器这个变量的数据类型,这样编译器才知道需要分配多少空间给它,以及它能存放什么样的数据。在程序运行过程中空间的值是变化的,这个内存空间就成为变量。为了便于操作,给这个变量取个名字,称为变量名。 变量名必须遵循标识符命名规则。 标识符命名规则 应以字母、下划线、美元符开头,后跟字母、下划线、美元符或数字,Java标识符大小写敏感,长度无限制 java中能用作标识符的有:26个英文字母(大、小写),数字,下划线,美元符号$,但是不能以数字开头。 类名首个字母必须大写,多个单词组成的,每个单词首字母都要大写。 方法名一般首个字母小写(构造方法例外),多个单词组成方法名,后面单词首字母大写。 变量命名规则同方法名名。 不能使用java中的关键字做标识符 类变量(静态变量) 类变量也称为静态变量,在类中以static关键字声明,但必须在方法构造方法和语句块之外无论一个类创建了多少个对象,类只拥有类变量的一份拷贝静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变静态变量储存在静态存储区。经常被声明为常量,很少单独使用static声明变量静态变量在程序开始时创建,在程序结束时销毁与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型默认值和实例变量相似。数值型变量默认值是0,布尔型默认值是false,引用类型默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化静态变量可以通过:ClassName.VariableName的方式访问类变量被声明为public static final类型时,类变量名称必须使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致 实例变量 实例变量声明在一个类中,但在方法、构造方法和语句块之外当一个对象被实例化之后,每个实例变量的值就跟着确定实例变量在对象创建的时候创建,在对象被销毁的时候销毁实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见实例变量具有默认值。数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默认值是null。变量的值可以在声明时指定,也可以在构造方法中指定实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用对象引用访问 局部变量 局部变量声明在方法、构造方法或者语句块中局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁访问修饰符不能用于局部变量局部变量只在声明它的方法、构造方法或者语句块中可见局部变量是在栈上分配的局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用 变量数据类型 在Java中,变量分为两种:基本类型的变量和引用类型的变量。 其中,8种基本数据类型是Java语言内嵌的,在任何操作系统中都具有相同大属性,而引用数据类型是在Jawa程序中由编程人员自己定义的变量类型。 1、变量整数类型 整数类型变量用来存储整数数值,即没有小数部分的值。在Java中,为了给不同大小范围内的整数合理地分配存储空间,整数类型分为4种不同的类型:字节型(byte)、短整型(short),整型(int)和长整型(long) 类型位数范围默认值byte8位(有符号)-2^7 ~ 2^7 - 10short16位(有符号)-2^15 ~ 2^15 - 10int32位(有符号)-2^31 ~ 2^31 - 10long64位(有符号)-2^63 ~ 2^63 - 10L或0l 计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit。它的二进制表示范围从00000000~11111111,换算成十进制是0~255,换算成十六进制是00~ff。 2、变量浮点数类型 浮点数类型变量用来存储小数数值。在Java中,浮点数类型分为两种:单精度浮点数( float)和双精度浮点数( double)。 double型所表示的浮点数比 float型更精确,两种浮点数所占存储空间的大小以及取值范围如下图所示。 类型位数范围默认值float32位(符合IEEE 754)1.4E-45 ~ 3.4028235E380.0fdouble64 位(符合IEEE 754)4.9E-324 ~ 1.7976931348623157E308.0d 在Java中,一个小数会被默认为 double类型的值,因此在为一个float类型的变量赋值时需要注意一点,所赋值的后面一定要加上字母F(或者小写f),而为 double类型的变量赋值时,可以在所赋值的后面加上字符D(或小写d),也可以不加。

数据结构:折半查找/二分查找算法,详解,图解 -- 数据结构算法集

折半查找/二分查找算法 折半/二分查找算法冒泡排序算法插入排序算法选择排序算法快速排序算法希尔排序算法堆排序算法归并排序算法 给出一个list和一个元素,判断出list中是否存在该元素 浅短理解: 折半查找算法是对于有序的序列而言的,每次查找后折半,大概缩短了一半的查找区间,是一种效率较高的查找算法。 要求: list必须是顺序结构,且按照关键词大小进行有序排列。 思路: 在有序序列中查找元素,每次取序列中间的元素,如果与要查找元素相等,程序结束; 如果查找元素大于中间元素,则取中间元素后面的序列再进行如上的查找; 如果查找元素小于中间元素,则取中间元素前面的序列再进行如上的查找; 直到找到元素相等,查找成功,或者序列为空,查找失败,程序结束。 python版本:Python2.7.5 # _*_ encoding:utf-8 _*_ def binary_search(lists, key, left, right): ''' lists:有序序列/list key:要查找的元素 left:查找的起始位置 right:查找的结束位置 -方便使用递归 return:返回查找元素下标 ''' # 查找的起始位置大于等于结束位置,查找失败程序结束 if left >= right: return None mid = (right - left) // 2 + left # 折半,中间元素下标 if lists[mid] > key: # 中间元素大于查找元素,则查找前半序列 return binary_search(lists, key, left, mid - 1) elif lists[mid] < key: # 中间元素小于查找元素,则查找后半序列 return binary_search(lists, key, mid + 1, right) else: # 中间元素等于查找元素,程序结束返回下标 return mid if __name__ == '__main__': lt = [3,7,10,11,20,33,36,40,88] index = binary_search(lt, 33, 0, len(lt)) print u'元素位置:{}'.

告诸位技术同胞大佬!!!

近日,发现其他网站大量复制粘贴我这里的博文, 既不注明原文链接,也没有注明作者,这样的网站毫无底线,完全是流氓网站。 鉴于这种情况的出现,本人今天以后的博文全部只能粉丝可见。 下面我要挨个投诉,申诉,直到删除复制的我的博文, 不限于起诉维权,反正一无所有,咱就死磕到底!!! For Video Recommendation in Deep learning QQ Group 277356808 For Speech, Image, Video in deep learning QQ Group 868373192 I'm here waiting for you

荣耀30Pro真实评测 令人心动的全能旗舰

5G商用化之后,一直被5G网络的高速度所吸引,想换一部5G手机。2020年5G手机百家争鸣,一时间各种5G产品让人眼花缭乱,正当我不知道怎么选的时候,今年4月发布的荣耀30Pro突然出现在面前,并带来眼前一亮的感觉,稍加犹豫,便入手了这款“大杯”旗舰荣耀30Pro,如今已经使用一段时间,今天就来给大家说说这款手机的真实体验。 与其他5G手机不同,荣耀30Pro在外观上并没有选择平庸,这也是我选择荣耀30Pro的主要原因。它使用超大logo,玻璃背板设计,在手机上展示出光影之美,颜值格外的高。近期推出了名为流光幻镜的新色,将后盖化为一面明镜,并且支持自定义图案,虹彩流转,镜中有境,漂亮的不像一台5G手机。手感方面官方数据显示重量为190g,搭配它的超薄机身,拿在手中轻巧灵活,让人不舍得放下。 一直在拍照方面是强项的荣耀,在荣耀30Pro上也配备了旗舰级的影像系统。这部手机采用50倍潜望式长焦镜头,支持双结构OIS光学防抖和AIS长焦超级防抖。对于我这种拍照总爱手抖的人,这两种技术简直不要太好用,即使手持高倍拍摄荣耀30Pro的相机依然稳如泰山,拍照体验非常棒。另外长焦画中画也是我很喜欢的一个功能,在变焦到一定倍数后,画面中会自动出现一个小框,帮助你确定拍摄范围,也能更快的找到要拍摄的物体。看似平平的长焦画中画功能在实际拍摄中能带来很便捷的体验,能看出荣耀30Pro在相机技术方面非常细心和人性化。 另外要说的一个方面就是配置了,如果说最开始是被荣耀30Pro漂亮的外观所吸引,那么后来就是“陷于才华”。它搭载麒麟990 5G芯片,拥有很高的性能分数,对于我日常使用的各类大型游戏都能轻松应对,没有卡顿的情况出现。除了这些荣耀30Pro在AI能力上排名全球第一,个人认为人工智能发展到现在,好的AI能力一定会对手机的各个方面带来优化,也能为相机能力带来提升,增强实际使用体验。 最后说一下5G能力,荣耀30Pro有着许多的自研5G技术,为5G性能提供保障。在拿到手机安装软件的时候,明显感觉到荣耀30Pro超凡的下载速度。在高铁中上网时,朋友中只有我的荣耀30Pro能够做到看视频不卡,玩游戏延迟低,不受高速状态的影响,在5G其他方面荣耀30Pro也都有着旗舰级的表现。 这个六一儿童节荣耀推出了很多优惠政策,还有超级升值活动,我看了下在电商平台荣耀30系列补贴价仅为2699元起,非常合适。1日当晚,荣耀30系列还获得了全平台3000至5000元5G手机销量冠军,也印证了大众对它的认可。综合来讲荣耀30Pro确实是一款各方面都非常优秀的手机,令人心动,更是当之无愧的5G旗舰。

使用Forge,WildFly Swarm和Arquillian开发微服务

在本文中,我们将看到如何使用WildFly Swarm和Forge开发微服务,以及如何使用Arquillian和Rest Assured对其进行测试。 WildFly Swarm提供了一种创新的方法来打包和运行Java EE应用程序,方法是将它们与足够的服务器运行时一起打包以“ java -jar”您的应用程序。 JBoss Forge是一个软件开发工具,可扩展您的Java IDE,并提供用于不同技术和解决方案的向导和扩展(附加组件)。 Arquillian是一个简化Java中间件集成测试的平台。 它处理了容器管理,部署和框架初始化的所有工作,因此您可以专注于编写测试(实际测试)的任务。 REST Assured将动态语言(例如Ruby和Groovy)中的REST服务的测试和验证的简便性带入了Java域。 http://downloads.jboss.org/forge/releases/3.4.0.Final/forge-distribution-3.4.0.Final-offline.zip或导航至http://forge.jboss.org/download并下载Eclipse,Netbeans或IntelliJ的插件。 对于此示例,我将使用CLI之一。 安装Forge并在PATH环境变量中提供它之后,就可以开始使用它了。 首先,转到要存储项目的目录并运行forge。 几秒钟后,您将看到Forge已启动,并且可以键入命令了: 之后,您需要安装wildfly-swarm插件 。 为此,只需在Forge shell上键入next命令: > addon-install-from-git --url https://github.com/forge/wildfly-swarm-addon 然后将下载并安装最新的插件。 完成此设置步骤后,您可以通过调用以下命令开始创建微服务: > project-new --top-level-package org.superbiz --named foo --type wildfly-swarm 此命令创建一个名为foo的新项目,其中准备了满足所有wildfly swarm要求的pom.xml 。 下一步是添加野生群片段。 片段是一种定义您希望在运行时能够使用的模块的方法。 > wildfly-swarm-add-fraction --fractions microprofile 在这种情况下,添加微轮廓部分。 这意味着在运行时CDI + JSON-P + JAXRS将可用.Addon还创建了一个JAX-RS端点作为示例,您可以通过运行以下两个命令来检查它: > cd src/main/java/org/superbiz/rest/HelloWorldEndpoint.java > ls 然后返回项目的根目录,让我们调用为微服务创建Arquilian测试的命令 > wildfly-swarm-new-test --target-package org.superbiz --named HelloWorldEndpointTest --as-client 在这种情况下,该测试称为HelloWorldEndpointTest,并且测试将以Arquillian as-client模式运行(这意味着该测试未部署在容器内,将在本地运行时运行)。 您可以使用以下两个命令检查生成的代码: > cd src/test/java/org/superbiz > cat HelloWorldEndpointTest.

Web系统中出现 localhost 将您重定向的次数过多问题

最新测试软件的时候,有个功能打开页面的时候就出现了如标题中提到的问题 然而通过查找资料,说一个代码中死循环了,导致一跳转到同一个页面多次。 下面来说明一下,为什么会出现上面的错误,为什么其他功能不会出现那个问题呢 首先要说一下,error_page.jsp 是系统的一个错误提示页面,在这里是一个没有权限提示页面(例如:很抱歉,您没有权限访问当前系统资源,请联系管理员。) 我们系统中访问控制(权限管理)是用的 Apache Shiro框架,通过shiro资源控制器代码分析最终找到了问题所在: 1、在系统后台跳转错误页面时,请确认页面是否可以正常访问,是否会被拦截等等。(在我们的系统中,是页面访问不到,导致shiro过滤器死循环了) unauthorizedUrl : <property name="unauthorizedUrl" value="/page/error_page.jsp"></property> 由于系统中的 unauthorizedUrl 页面,即 /page/error_page.jsp 页面访问不到,所以在 上面的shiro 过滤器中死循环了,shiro过滤器永远跳转到 /page/error_page.jsp ,跳转的页面被拦截或不允许外部直接访问导致问题。无法返回页面到客户端浏览器中。 解决办法: 在shiro配置文件中配置 /page路径的文件允许访问即可(即不过滤资源) 最后页面(无权限提示页面)可以正常显示了: 也可以看看下面这篇文章 JavaWeb: localhost 将您重定向的次数过多 https://www.codeleading.com/article/33502441303/

解决Mac安装MySQL后Navicat连接出现2003和2000异常

今天突然想使用本地的MySQL服务了,在终端使用MySQL命令可以连接上MySQL,结果用Navicat功能始终就是连接不上我的MySQL,气的我老血都吐出来了,先开始报错 2003 - Can’t connect to MySQL server on ‘127.0.0.1’(61 “Connection refused”) 然后百度了好久,都还不行,然后我试着这个, 然后居然有报了另外一个错, ** 2000 (HY000): Unknown MySQL error** 然后翻墙看了谷歌才发现问题,原来是发现可能是SSL的问题,然后再编辑连接页面把 Use SSL 勾选了就好了。 然后就好了,很神奇

span源码解析

CLI命令 vpp 端口镜像注册了两个命令: 设置端口镜像set interface span VLIB_CLI_COMMAND (set_interface_span_command, static) = { .path = "set interface span", .short_help = "set interface span <if-name> [l2] {disable | destination <if-name> [both|rx|tx]}", .function = set_interface_span_command_fn, }; 显示端口镜像的设置信息show interface span VLIB_CLI_COMMAND (show_interfaces_span_command, static) = { .path = "show interface span", .short_help = "Shows SPAN mirror table", .function = show_interfaces_span_command_fn, }; 源码 设置端口镜像 static clib_error_t * set_interface_span_command_fn (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { span_main_t *sm = &span_main; u32 src_sw_if_index = ~0; u32 dst_sw_if_index = ~0; span_feat_t sf = SPAN_FEAT_DEVICE; span_state_t state = SPAN_BOTH; int state_set = 0; //参数解析 while (unformat_check_input (input) !

vue-cli中自定义播放器样式

<template> <div class="custom-video_container" ref="custom-video_container" @mouseover="handleControls($event, 'start')" @mouseleave="handleControls($event, 'end')"> <video class="custom-video_video" ref="custom-video" :poster="videoOption.poster"> <p>设备不支持</p> </video> <!-- 控制区域背景 --> <transition name="fade"> <div class="custom-video_control" v-show="!videoState.hideControl || !videoState.play"> <div class="row1"> <!-- 进度条 --> <div class="custom-video_control-bg" @mouseleave="handlePrograssleave" @mousedown="handlePrograssDown" @mouseup="handlePrograssUp" @mousemove="handlePrograssMove"> <div class="custom-video_control-bg-outside" ref="custom-video_control-bg-outside"> <span class="custom-video_control-bg-inside" ref="custom-video_control-bg-inside"> </span> <span class="custom-video_control-bg-inside-point" ref="custom-video_control-bg-inside-point" ></span> </div> </div> </div> <div class="row2"> <div class="row2-left"> <!--播放按钮--> <div class="custom-video-play-container"> <span class="custom-video_play custom-video_play-play icon_icon_video_paly" @click="play('btn')"> </span> <span class="custom-video_play custom-video_play-pause icon_icon_video_suspend" @click="pause('btn')"> </span> </div> <!

老司机带你入门Java基础概念

因为学习所以收获,因为收获所以不寂寞。 请关注:源码猎人 目录 Java简介 Java特性 Java环境概述 Java工作原理 面向对象 对象 类 方法 继承 封装 多态 变量 常见面试题 Java简介 Java是一门面向对象编程语言,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。 Java语言不使用指针,而是引用 Java语言具有功能强大并且简单易用,Java自带内存回收器GC,使得程序员不必为内存管理而担忧。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 Java特性 Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 Java程序必须在Java平台上才能编译和执行,Java程序只依赖Java平台不依赖操作系统 Java环境概述 JDK称为Java开发包或Java开发工具,是一个编写Java程序的开发环境和运行平台。 JDK是整个Java的核心,它包括了Java运行环境,一些Java工具和Java的核心类库(Java API)。 不论什么Java应用服务器实质都是内置了某个版本的JDK。主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK。 Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE(JAVA Runtime Environment),JRE是支持Java程序运行的标准环境 。 Java工作原理 由四方面组成: Java编程语言Java类文件格式Java虚拟机Java应用程序接口 当编辑并运行一个Java程序时,需要同时涉及到这四种方面。 使用文字编辑软件或集成开发环境在Java源文件中定义不同的类,通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用 面向对象 面向对象是在结构化设计方法出现很多问题的情况下应运而生的。 结构化设计方法缺点如下: 结构化设计方法审视问题的视角过于局限,它将属性和行为分开,使得应用程序的日后维护和扩展相当困难,甚至一个微小的变动,都会波及到整个系统。结构化设计方法抽象级别太片面,他是基于过程做抽象,将问题域中具有明确功能定义的操作抽取出来,并将其作为一个实体看待。这种抽象级别对于软件系统结构的设计显得有些武断,并且稳定性差,导致很难准确无误地设计出系统的每一个操作环节。结构化设计方法只封装了各个功能模块,而每个功能模块可以随意地对没有保护能力客体属性实施操作,并且由于描述属性的数据与行为被分割开来,所以一旦某个客体属性的表达方式发生了变化,或某个行为效果发生了改变,就有可能对整个系统产生影响。结构化程序设计方法的基本单位是模块,每个模块只是实现特定功能的过程描述,因此,它的可重用单位只能是模块。 结构化设计方法的这些缺点驱使人们寻求一种新的程序设计方法,以适应现代社会对软件开发的更高要求,面向对象由此产生。 对象 对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。 对象包含两个含义,其中一个是数据(属性),另外一个是动作(方法)。 对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。 类 类是具有相同特性(数据元素)和行为(功能)的对象的抽象。 对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象 类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性 类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述 类映射的每一个对象都具有这些数据和操作方法,类的继承具有层次性和结构性,高层次对象封装复杂行为,具体细节对该层次知识保持透明,可以减小问题求解的复杂度。 方法 方法是指对象能够进行的操作或行为,在C++中一般称方法为函数,但是在Java中不这么叫,只有构造方法会称为构造函数。 方法是类中的定义函数,其具体的作用就是对对象进行描述操作 继承 继承简单地说就是一种层次模型,这种层次模型能够被重用。层次结构的上层具有通用性,但是下层结构则具有特殊性。在继承的过程中类则可以从最顶层的部分继承一些方法和变量。 类除了可以继承以外同时还能够进行修改或者添加。通过这样的方式能够有效提高工作效率。 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。 封装 封装是将数据和代码捆绑到一起,对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。 封装防止了程序相互依赖性而带来的变动影响,面向对象的封装比传统语言的封装更为清晰、更为有力。 主要目的是对数据和行为的包装和信息的隐藏。 多态 多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。

Lingo整数规划学习笔记

目录 整数规划的介绍及其基本形式定义分类特点求解方法 具体实例及Lingo求解题型1:常见形式的整数规划题型2:0-1整数规划相互排斥的计划相互排斥的约束条件固定费用问题指派问题 混合整数规划 小结 整数规划的介绍及其基本形式 定义 规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法,往往只适用于整数线性规划。目前还没有一种方法能有效地求解一切整数规 分类 如不加特殊说明,一般指整数线性规划。对于整数线性规划模型大致可分为两类: 1 o {^o} o 变量全限制为整数时,称纯(完全)整数规划。 2 o {^o} o变量部分限制为整数的,称混合整数规划。 特点 (i) 原线性规划有最优解,当自变量限制为整数后,其整数规划解出现下述情况: ①原线性规划最优解全是整数,则整数规划最优解与线性规划最优解一致。 ②整数规划无可行解。 (ii) 整数规划最优解不能按照实数最优解简单取整而获得。 求解方法 (i)分枝定界法—可求纯或混合整数线性规划。 (ii)割平面法—可求纯或混合整数线性规划。 (iii)隐枚举法—求解“0-1”整数规划: ①过滤隐枚举法; ②分枝隐枚举法。 (iv)匈牙利法—解决指派问题(“0-1”规划特殊情形)。 (v)蒙特卡洛法—求解各种类型规划。 具体实例及Lingo求解 题型1:常见形式的整数规划 model: sets: var/1,2/:x,y; link(var,var):a;!定义集合,以及赋给集合不同的属性名,有点像C语言里面的类class; endsets data: a=9 7 7 20; y=56 70;!给有属性名的集合赋值; enddata max=40*x(1)+90*x(2);!目标函数,Lingo中识别目标函数是用max和min来,所以目标函数语句写在哪都可; @for(var:@gin(x)); @for(var(i):@sum(var(j):a(i,j)*x(j))<y(i));!Lingo中除了一些特殊的模块,其他的语句均为约束语句; end 题型2:0-1整数规划 0 −1型整数规划是整数规划中的特殊情形,它的变量x j {_j} j​ 仅取值0 或1。这时x j {_j} j​ 称为0 −1变量,或称二进制变量。x j {_j} j​ 仅取值0 或1 这个条件可由下述约束条件:0 ≤x j {_j} j​ ≤ 1 ,整数所代替,是和一般整数规划的约束条件形式一致的。在实际问题中,如果引入 0 −1变量,就可以把有各种情况需要分别讨论的线性规划问题统一在一个问题中讨论了。我们先介绍引入0 −1变量的实际问题,再研究解法.

supervisor 状态state汇总

获取进程状态示例: root@kean:~# supervisorctl status XXX1 BACKOFF Exited too quickly (process log may have details) XXX2 RUNNING pid 3607, uptime 1:23:09 众所周知,通过supervisorctrl status能获取到组件的状态信息,那么 supervisor 一共能反馈多少状态呢?查询了官方文档后,在这里做一下汇总: STOPPED:进程因为停止请求而停止,或从未启动过 STARTING:过程因为启动请求,正在启动中 RUNNING:进程正常运行中 BACKOFF:进程进入了STARTING状态,但随后退出太快而无法转移到RUNNING状态。 STOPPING:进程由于停止请求正在停止中 EXITED:进程从RUNNING状态退出(可能正常,也可能异常) FATAL:进程无法成功启动 UNKNOWN:未知状态(考虑supervisor出错)

VPP端口镜像

什么是端口镜像 端口镜像(port Mirroring)功能通过在交换机或路由器上,将一个或多个源端口的数据流量转发到某一个指定端口来实现对网络的监听,指定端口称之为“镜像端口”或“目的端口”,在不严重影响源端口正常吞吐流量的情况下,可以通过镜像端口对网络的流量进行监控分析。在企业中用镜像功能,可以很好地对企业内部的网络数据进行监控管理,在网络出故障的时候,可以快速地定位故障。 目的 为了方便对一个或多个网络接口的流量进行分析(如IDS产品、网络分析仪等),可以通过配置交换机或路由器来把一个或多个端口(VLAN)的数据转发到某一个端口,即端口镜像,来实现对网络的监听。 端口镜像功能是对网络流量监控的一个有效的安全手段,对监控流量的分析可以进行安全性的检查,同时也能及时地在网络发生故障时进行准确的定位。 功能 镜像的功能简单地说就是将被监控流量镜像到监控端口,以便对被监控流量进行故障定位、流量分析、流量备份等,监控端口一般直接与监控主机等相连。 监视到进出网络的所有数据包,供安装了监控软件的管理服务器抓取数据,如网吧需提供此功能把数据发往公安部门审查。而企业出于信息安全、保护公司机密的需要,也迫切需要网络中有一个端口能提供这种实时监控功能。在企业中用端口镜像功能,可以很好的对企业内部的网络数据进行监控管理,在网络出现故障的时候,可以做到很好地故障定位。 备注:交换机把某一个端口接收或发送的数据帧完全相同的复制给另一个端口;其中被复制的端口称为镜像源端口,复制的端口称为镜像目的端口。 别名 端口镜像通常有以下几种别名: Port Mirroring 通常指允许把一个端口的流量复制到另外一个端口,同时这个端口不能再传输数据。Monitoring Port 监控端口Spanning Port 通常指允许把所有端口的流量复制到另外一个端口,同时这个端口不能再传输数据。SPAN port 在 Cisco 产品中,SPAN 通常指 Switch Port ANalyzer。某些交换机的 SPAN 端口不支持传输数据。Link Mode port这样,这些流量就可以被一个特殊的设备监控。它对发现和修理故障有很大的帮助。 备注:vpp中的端口镜像为SPAN port。 分类 端口镜像根据不同的分类标准,镜像类型也不一样。 根据镜像作用的端口模式来划分,端口镜像分为以下三种类型: 入口镜像:只对从该端口进入的流量进行镜像。出口镜像:只对该端口的发出的流量进行镜像。双向镜像:支持对该端口收到和发出的双向流量进行镜像。 根据镜像功能划分,端口镜像分为两种类型: 流镜像:如果端口上配置了ACL并启用,则认为是流镜像。流镜像只采集经过ACL过滤后的数据包,否则认为是纯端口镜像。对于ACL流量采集方式,支持在端口的方向(出向、入向和双向三种)上绑定标准访问列表和扩展访问列表。纯端口镜像:对端口进出的流量进行镜像。 根据镜像工作的范围划分,端口镜像分为两种类型: 本地镜像:源端口和目的端口在同一个路由器上。远端镜像:源端口和目的端口分布在不同的路由器上,镜像流量经过某种封装,实现跨路由器传输。 vpp span 端口镜像用于网络交换机上,以将在一个交换机端口上看到的网络数据包的副本发送到另一交换机端口上的网络监视连接。 可供网络工程师或管理员用来衡量性能,分析和调试数据或诊断网络上的错误。 RX traffic node 有一个静态节点可以镜像传入的数据包。 span-input: 由于传入缓冲区可以在内部重用,因此创建传入缓冲区的副本。 传输链:dpdk-input -> span-input -> 原始缓冲区发送到ethernet-input进行处理缓冲区副本发送到interface-output 配置 支持两种配置方式:CLI和API CLI配置 set interface span <if-name> [disable | destination <if-name>] 参数 <if-name>: 被镜像接口名destination <if-name>: 目的接口名disable: 删除镜像 API配置 添加镜像: sw_interface_span_enable_disable src GigabitEthernet0/8/0 dst GigabitEthernet0/9/0 sw_interface_span_enable_disable src_sw_if_index 1 dst_sw_if_index 2 参数

MATLAB打开nc文件并读取nc文件数据

MATLAB打开nc文件 ncdisp('E:\**\**.nc') 输入该命令后命令行窗口会显示该nc文件的基本信息 MATLAB读取nc文件 根据上一步中nc文件的基本信息提取nc文件的相应数据。 time=ncread('E:\**\**.nc','time') 将nc文件中所需要的数据保存至txt文档 首先,将所需要的数据提取出来 start=[125,89,123] count=[17,14,124] tmax=ncread('E:\**\**.nc','tmax',start,count) 其中,start 表示开始读取数据的地方,本例即从第125行89列123页开始读取; count 表示要读取的个数,本例即为要读取17行14列124页; 本例默认步长为1,故未添加 stride。 最后,将数据保存至txt文档 fid=fopen('E:\**\***.txt','w') 其中,‘w’ 表示打开***.txt文档并删除之前的数据重新写入,若没有该文档,即创建一个新文档并写入数据。 ‘a’ 表示在原有的数据基础上后续添加数据,保留原有数据。 其余表达见下,摘自MATLAB帮助文件。 ‘r’ : open file for reading ‘w’ : open file for writing; discard existing contents ‘a’ : open or create file for writing; append data to end of file ‘r+’ : open (do not create) file for reading and writing ‘w+’ : open or create file for reading and writing; discard

图形学变换——平移、旋转和缩放

图形学变换 一、概述二、平移二、旋转三、缩放 一、概述 在齐次坐标中,所有的仿射变换都可以使用如下形式的 4 x 4 矩阵来表示 点 p ( x , y , z ) p (x, y, z) p(x,y,z) 表示方式为 向量 a ⃗ ( x , y , z ) \vec a (x, y, z) a (x,y,z) 表示方式为 关于齐次坐标的理解参考博文:齐次坐标 二、平移 平移(translation)变换把点沿着给定方向移动固定距离, p ′ = p + d p' = p + d p′=p+d 如下图所示。 比如:将点 p ( 1 , 1 , 1 ) p (1, 1, 1) p(1,1,1),往 X X X 轴正方向移动 1单位,往 Y Y Y 轴正方向移动 2 单位, 往 Z Z Z 轴正方向移动 3 单位,最终坐标是 p ′ ( 2 , 3 , 4 ) p'(2, 3, 4) p′(2,3,4)

tp和laravel 模板输出 html标签

问题:layui里面 输出 tp5 的 数据时把 标签的 < 转换了,如下所示: 在tp里面 这样写 就可以解决问题了: 在laravel 里面是如下使用: laravel 正常输出是双大括号 输出html是{!! $a !!}