Q_PROPERTY与QSS更新

如果你自定义的控件使用Q_PROPERTY暴露了一个属性(比如color),并且在QSS中使用这个属性作为判断值,如下: TextButton[color=”red”] 但是当你在C++代码中更改了该属性值,你会发现QSS样式并不会生效,因为你需要做如下操作以更新style: Button *button = new Button; ... button->setColor("yellow"); // 更新属性后应立即调用下面两个函数 style()->unpolish(button); style()->polish(button); // force a stylesheet recomputation

SQL SERVER Update from 使用陷阱

update A set from A left join B on 此方法常用来使用根据一个表更新另一个表的数据,来进行数据同步更新。若是A表行与B表行为一对一的对应关系,更新不存在问题,若是A表行与B表行对应关系为一对多的时候,需注意A表更新的列并非B表的累计值,而是第一个数值。 首先建立两个表 A,B 对A表建立触发器查看更新信息 CREATE TABLE yshA ( keyA VARCHAR(10), value INT ) CREATE TABLE yshB ( keyB VARCHAR(10), valueB INT ) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TRIGGER trg_YSHA_Up ON YSHA AFTER UPDATE AS BEGIN SET NOCOUNT ON; DECLARE @now VARCHAR(60) SET @now=convert(varchar,GETDATE()) SELECT *,'i',@now FROM inserted SELECT *,'d',@now FROM deleted END GO 1、对数据进行更新 对表数据进行初始化A INSERT INTO yshA VALUES (1,0) INSERT INTO yshB VALUES (1,1) INSERT INTO yshB VALUES (1,2) SELECT * FROM yshA A LEFT JOIN yshB B ON keyA=keyB 执行结果 UPDATE A SET value = value + valueB FROM yshA A LEFT JOIN yshB B ON keyA=keyB SELECT * FROM yshA 此执行结果理论上 value 应为3 ,实际执行 value 结果为1

Cordova中super.init()出错求助啊cordova5.1.0

我用的是cordova5.1.0 错误提示 Unable to start activity ComponentInfo{cn.com.trcbank.tjydyx/cn.com.trcbank.tjydyx.android.activity.a.NewMainAActivity}: java.lang.NullPointerException java.lang.RuntimeException: Unable to start activity ComponentInfo{cn.com.trcbank.tjydyx/cn.com.trcbank.tjydyx.android.activity.a.NewMainAActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2366) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5322) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at org.apache.cordova.PluginManager.getPlugin(PluginManager.java:172) at org.apache.cordova.PluginManager.startupPlugins(PluginManager.java:98) at org.apache.cordova.PluginManager.init(PluginManager.java:87) at org.apache.cordova.CordovaWebViewImpl.init(CordovaWebViewImpl.java:116) at org.apache.cordova.CordovaActivity.init(CordovaActivity.java:144) at cn.com.trcbank.tjydyx.android.activity.a.NewMainAActivity.onCreate(NewMainAActivity.java:38) at android.app.Activity.performCreate(Activity.java:5350) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1088) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2320) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)? at android.app.ActivityThread.access$800(ActivityThread.java:151)? at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1342)? at android.

Android防止点击过快造成多次响应事件

最近开发过过成中遇到一些小问题,比如一个btn点击用户可能只点击了一次但是后台响应了多次,像一些表单的提交出现这种问题比较棘手,当然解决这种问题的方案比较多:比如自定义单次点击的btn,或者在点击的时候将按钮设置为不可点击,或者做一个计时器等等,这些都是解决的方案,至于具体怎么使用,这就要看程序员的编码风格了,首先来看看具体问题: onClick事件是Android开发中最常见的事件。比如,一个Button,功能是点击会提交一个订单,则一般代码如下 : btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { submitOrder(); } }); 正常情况下这段代码是没什么问题的,但是Android设备的机型性能等千差万别,如果碰到比较卡的手机,则有可能出现submitOrder()函数跳转页面出现延迟的现象。碰到这种现象,则用户就很有可能再次点击一次,从而造成函数被调用两次,出现重复订单的BUG。 一般地,碰到这现象,首先就会想到的就是在点击之后把submitButton设置为不可点击: //代码 btn.setClickable(false); //或者 btn.setEnabled(false); 此方法也确实有效,不过如果submitOrder()方法没有成功,需要再次提交订单时又需要再重复把submitButton设置为可点击状态。如果类似的button比较多时,就显得比较麻烦、混乱。 下面介绍一下我的处理方法: 自定义一个CheckDoubleClickListener,继承自OnClickListener,其中的OnCheckDoubleClick是自定义的一个接口,具体看代码: CheckDoubleClickListener.java package com.huaxia.finance.javastudy.CheckDoubleClick; import android.view.View; import java.util.Calendar; /** * * Created by lp on 2016/12/29. */ public class CheckDoubleClickListener implements View.OnClickListener { public static final int MIN_CLICK_DELAY_TIME = 1000; private long lastClickTime = 0; private OnCheckDoubleClick checkDoubleClick; public CheckDoubleClickListener(OnCheckDoubleClick checkDoubleClick){ this.checkDoubleClick = checkDoubleClick; } @Override public void onClick(View v) { long currentTime = Calendar.

unity3d自定义Toggle组件,解决设置isOn自动调用方法

当我们在使用unity自带的Toggle组件的时候,我们是通过Toggle组件上的isOn属性得知是开启我们的功能面板还是关闭,这时候通常我们会给toggle绑定一个方法,当我们点击toggle的时候,调用方法,同时播放点击音效,可是有些时候,需要我们在切换界面的时候通过其它方法来关闭我们的属性isOn为false,方便我们下次点击的时候,isOn为true,这时候,我们单独对toggle的isOn属性赋值时会调用一次我们的方法,同时还会播放一次声音,恶心的事情就此发生,所以在项目中不得不重写了此组件,以方便项目中多处使用,下面是MyToggle脚本,挂载到对象身上即可,和unity自带的Toggle用法一样,只是在手动设置isOn属性的时候不会自动调用方法。 using System; using UnityEditor; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; using UnityEngine.Serialization; using UnityEngine.UI; /// <summary> /// 自定义Toggle组件 /// </summary> [RequireComponent(typeof(RectTransform))] public class MyToggle : Selectable, IEventSystemHandler, IPointerClickHandler, ISubmitHandler, ICanvasElement { /// <summary> /// toggle为true时切换显示的底图 /// </summary> public Graphic m_ChangeImage; [SerializeField] [FormerlySerializedAs("m_IsActive")] private bool m_IsOn; public MyToggle.ToggleTransition toggleTransition = MyToggle.ToggleTransition.Fade; public Toggle.ToggleEvent onValueChanged = new Toggle.ToggleEvent(); /// <summary> /// 设置ison属性(自动调用一次方法) /// </summary> public bool isOn { get { return this.

Extjs动画效果(自定义动画) Ext Core 预置的 12 个动画功能

Ext Core 通过预置的动画功能,可以让轻松实现动画功能。通过自定义动画配置,可实现更多的动画效果。动画完成后,可通过回调函数实现后续处理 Ext Core 动画 8 个定位点的值与描述 值 描述 tl 左上角 t 顶边中心 tr 右上角 l 左边中心 r 右边中心 bl 左下角 b 底边中心 br 右下角 下面开始介绍 Ext Core 预置的 12 个动画功能。 slideIn/slideOut:元素的滑进或滑出效果。默认 slideIn 是从顶部滑进的,而 slideOut 是从底部滑出的,可通过修改第 1 个参数设置滑进或滑出位置。其使用方法请看下面代码。 var el = Ext.get('elId'); //从顶部滑进 el.slideIn(); //从底部滑出 el.slideOut(); //从左边滑进 el.slideIn('l',{ easing: 'easeOut', duration: .5 }); puff:元素慢慢向四周扩大并逐渐消失。当效果完成后,元素将隐藏(visibility 属性为hidden),不过元素原来所占位置将继续存在。如果需要删除元素,请设置 remove 属性为true。其使用方法请看下面代码。 var el = Ext.get('elId'); //默认方式 el.puff(); //自定义方式,元素消失后删除元素 el.puff({ easing: 'easeOut', duration: .

leetcode 部分题解(python)

leetcode 部分题解(python) 215. Kth Largest Element in an Array 题目链接:https://leetcode.com/problems/kth-largest-element-in-an-array/#/description 思路_第k大的数 利用快速排序的思想;从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况: 1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数; 2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n) class Solution(object): def findKthLargest(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ if len(nums)==1: return nums[0] target = nums[0] i,j = 0,len(nums)-1 while i<j: while i<j and nums[j]>=target: j -= 1 nums[i] = nums[j] while i<j and nums[i]<=target: i += 1 nums[j] = nums[i] nums[i] = target right = len(nums)-j # print(right) if right==k: return nums[j] elif right>k: return self.

css 百叶窗效果

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> body{ background: #1b46e2; } #box{ width: 700px; height: 360px; margin:100px auto; background:repeating-linear-gradient(180deg,rgba(12,84,191,0) 0,rgba(27,70,226,1) 20px) no-repeat 0 -360px,url(img.jpg) no-repeat; transition: 3s; border: 6px solid #269aec; border-radius: 17px; } #box:hover{ background-position: 0 0,0 0; } </style> </head> <body> <div id="box"></div> </body> </html>

MongoDB运行日志自动分割

所谓自动分割MongoDB日志文件,就是指Rotate MongoDB log files,即让MongoDB每天(或每个星期,可自定义控制)生成一个日志文件,而不是将MongoDB所有的运行日志都放置在一个文件中,这样每个日志文件都相对较小,定位问题也更容易。 实现自动分割MongoDB日志的方法可以参考:https://docs.mongodb.com/manual/tutorial/rotate-log-files/ 现在以一个MongoDB实例为例,可以写一个脚本来实现自动分割MongoDB日志 1、配置MongoDB实例启动参数 security: keyFile: /usr/local/mongodb/authentication/keyFile sharding: clusterRole: shardsvr replication: replSetName: rs3 net: port: 27023 storage: dbPath: /data/db_delay_rs3 systemLog: path: /data/log_delay_rs3/mongodb.log destination: file logAppend: true logRotate: rename processManagement: fork: true 配置MongoDB系统日志保存路径,并配置logRotate参数为rename 2、编写自动分割MongoDB日志脚本 #!/bin/bash #Rotate the MongoDB logs to prevent a single logfile from consuming too much disk space. app=mongod mongodPath=/usr/local/mongodb/bin/ pidArray=$(pidof $mongodPath/$app) for pid in $pidArray;do if [ $pid ] then kill -SIGUSR1 $pid fi done exit :wq保存,并命名为logRotate.

OpenCV入门三:OpenCV创建新图像以及遍历图片像素值和设置像素值

1.OpenCV创建一个灰度图,遍历每一行每一列并设置每一行每一列的像素值,并将其保存为图片,但是at方法可读性较高,但是效率不高 #include <iostream> #include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; int main() { Mat M(600,600,CV_8UC1);//创建一个高400,宽200的灰度图的Mat对象 namedWindow("Test"); //创建一个名为Test窗口 for (int i=0;i<M.rows;i++) //遍历每一行每一列并设置其像素值 { for (int j=0;j<M.cols;j++) { M.at<uchar>(i,j)=i*j/20; } } imshow("Test",M); //窗口中显示图像 imwrite("E:/灰度图.jpg",M); //保存生成的图片 waitKey(5000); //等待5000ms后窗口自动关闭 getchar(); } 2.OpenCV创建一个灰度图,使用迭代器iteator遍历每一行每一列并设置每一行每一列的像素值,并保存 随机数填充像素值 #include <iostream> #include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> using namespace cv; using namespace std; int main() { Mat M(400,200,CV_8UC1); namedWindow("Test"); //创建一个名为Test窗口 MatIterator_<uchar>Mbegin,Mend; //遍历所有像素,设置像素值 for (Mbegin=M.begin<uchar>(),Mend=M.end<uchar>();Mbegin!=Mend;++Mbegin) { *Mbegin=rand()%255; } imshow("Test",M); //窗口中显示图像 imwrite("E:/灰度图.jpg",M); waitKey(5000); //等待5000ms后窗口自动关闭 getchar(); } 或者可以这样写

c# winform通过本地WebService接口访问SQL数据库实例

总体思路如下:先建立数据库,再建立webservice,最后通过winform的按钮来调用服务,达到操作数据库的目的。 1.数据库设计 数据库名称:sa ,表名称:C 在sql sever2008 R2下建立表与字段等。 2.建立webservice 2.1启动vs2013,文件》新建项目》选择asp.net web 服务应用程序。 2.2默认按F5 Debug,浏览器自动生成Hello word的页面,表示ws配置成功。 2.3视图》服务器资源管理器》数据连接》添加连接数据库 2.4添加一个类,命名为DBOperation.cs DBOperation.cs using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Data.SqlClient; using System.Text.RegularExpressions; using System.Collections; using System.Collections.Generic; namespace WebServiceTest { public class DBOperation : IDisposable { public static SqlConnection sqlCon; //用于连接数据库 //将下面的引号之间的内容换成上面记录下的属性中的连接字符串 private String ConServerStr = @"Data Source=USER-20160715YA;Initial Catalog=sa;Integrated Security=True"

翼机门禁网络不能PING通的解决办法

1、一个四通道的门禁折腾了4天,原因是网络不通,问济南这个厂家(公司名称就不讲了,人家还要吃饭)的工程师和老总,给的答复是他们没有遇到过这个问题,工程师明确告诉我不支持,而且还话言辞有理的说他们销售的时候都会告诉不支持这个功能。 2、在厂家无法解决的情况下,我想也只有采购其他厂家的门禁控制器。但是我也一直没有放弃,开始由于大概的网络都是划分一VLAN的,服务器在VLAN250,门禁在VLAN50,后来我想把门禁也划到VLAN250,结果还是不能,从服务器上可以ping通调试的笔记本就是无法PING通门禁的IP,但是接在TPLINK5口交换机上笔记本是可以PING通门禁的。今天在研究他们设置门禁主板IP地址软件的时候,发现他们提取的MAC地址全部是一样的。如果这种情况,在三层路由的ARP表中写几个设备的地址是一样的,所以网络肯定不通。 3、报着一试的态度,改了一个门禁主板的IP地址和自编的MAC,保存之后立马和服务端连通了。其它三块主板如法炮制,问题立马解决。

P问题、NP问题以及NP难问题的相关信息查找结果

在研究这方面问题之前,我先查询了一些基础知识,最终总结如下: 首先说明什么是时间复杂度,时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。 也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。 1.不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)的时间复杂度,也称常数级复杂度; 2.数据规模变得有多大,花的时间也跟着变得有多长,这个程序的时间复杂度就是O(n),比如找n个数中的最大值; 3.而像冒泡排序、插入排序等,数据扩大2倍,时间变慢4倍的,属于O(n^2)的复杂度。 4.还有一些穷举类的算法,所需时间长度成几何阶数上涨,这就是O(a^n)的指数级复杂度,甚至O(n!)的阶乘级复杂度。 注:不会存在O(2*n^2)的复杂度,因为前面的那个“2”是系数,根本不会影响到整个程序的时间增长。同样地,O (n^3+n^2)的复杂度也就是O(n^3)的复杂度。因此,我们会说,一个O(0.01*n^3)的程序的效率比O(100*n^2)的效率低,尽管在n很小的时候,前者优于后者,但后者时间随数据规模增长得慢,最终O(n^3)的复杂度将远远超过O(n^2)。我们也说,O(n^100)的复杂度小于O(1.01^n)的复杂度。 容易看出,前面的几类复杂度被分为两种级别,其中后者的复杂度无论如何都远远大于前者: 1)O(1),O(log(n)),O(n^a) 等,我们把它叫做多项式级的复杂度,因为它的规模n出现在底数的位置; 2)O(a^n)和O(n!)型复杂度,它是非多项式级的,其复杂度计算机往往不能承受。 当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。 自然地,人们会想到一个问题: 会不会所有的问题都可以找到复杂度为多项式级的算法呢? 答案是否定的。 有些问题甚至根本不可能找到一个正确的算法来,这称之为“不可解问题”(Undecidable Decision Problem)。 例如:Hamilton回路。 问题是这样的:给你一个图,问你能否找到一条经过每个顶点一次且恰好一次(不遗漏也不重复)最后又走回来的路(满足这个条件的路径叫做Hamilton回路)。 这个问题现在还没有找到多项式级的算法。事实上,这个问题就是我们后面要说的NPC问题。 定义:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。 NP问题不是非P类问题。 NP问题是指可以在多项式的时间里验证一个解的问题。 NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。 比方说,我人品很好,在程序中需要枚举时,我可以一猜一个准。 现在某人拿到了一个求最短路径的问题,问从起点到终点是否有一条小于100个单位长度的路线。它根据数据画好了图,但怎么也算不出来,于是来问我:你看怎么选条路走得最少? 我说,我人品很好,肯定能随便给你指条很短的路出来。然后我就胡乱画了几条线,说就这条吧。那人按我指的这条把权值加起来一看,嘿,神了,路径长度98,比100小。于是答案出来了,存在比100小的路径。 别人会问他这题怎么做出来的,他就可以说,因为我找到了一个比100 小的解。 在这个题中,找一个解很困难,但验证一个解很容易。验证一个解只需要O(n)的时间复杂度,也就是说我可以花O(n)的时间把我猜的路径的长度加出来。 那么,只要我人品好,猜得准,我一定能在多项式的时间里解决这个问题。我猜到的方案总是最优的,不满足题意的方案也不会来骗我去选它。这就是NP问题。 当然有不是NP问题的问题,即你猜到了解但是没用,因为你不能在多项式的时间里去验证它。 一个经典的例子,它指出了一个目前还没有办法在多项式的时间里验证一个解的问题。 很显然,前面所说的Hamilton回路是NP问题,因为验证一条路是否恰好经过了每一个顶点非常容易。但我要把问题换成这样:试问一个图中是否不存在Hamilton回路。这样问题就没法在多项式的时间里进行验证了,因为除非你试过所有的路,否则你不敢断定它“没有Hamilton回路”。 之所以要定义NP问题,是因为通常只有NP问题才可能找到多项式的算法。 我们不会指望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式级的算法。 很显然,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。 关键是,人们想知道,是否所有的NP问题都是P类问题。 目前为止这个问题还没有解决方法。但是,一个总的趋势、一个大方向是有的。人们普遍认为,P=NP不成立,也就是说,多数人相信,存在至少一个不可能有多项式级复杂度的算法的NP问题。 人们如此坚信P≠NP是有原因的,就是在研究NP问题的过程中找出了一类非常特殊的NP问题叫做NP-完全问题,也即所谓的NPC问题。C是英文单词“完全”的第一个字母。正是NPC问题的存在,使人们相信P≠NP。 NP完全问题(NP-C问题),是世界七大数学难题之一。 NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。简单的写法是 NP=P?,问题就在这个问号上,到底是NP等于P,还是NP不等于P。 为了说明NPC问题,我们先引入一个概念——约化(Reducibility,有的资料上叫“归约”) 一个问题A可以约化为问题B的含义即是,可以用问题B的解法解决问题A,或者说,问题A可以“变成”问题B。 “问题A可约化为问题B”有一个重要的直观意义:B的时间复杂度高于或者等于A的时间复杂度。也就是说,问题A不比问题B难。这很容易理解。既然问题A能用问题B来解决,倘若B的时间复杂度比A的时间复杂度还低了,那A的算法就可以改进为B的算法,两者的时间复杂度还是相同。 约化具有一项重要的性质:约化具有传递性。如果问题A可约化为问题B,问题B可约化为问题C,则问题A一定可约化为问题C。 约化的标准概念:如果能找到这样一个变化法则,对任意一个程序A的输入,都能按这个法则变换成程序B的输入,使两程序的输出相同,那么我们说,问题A可约化为问题B。 我们所说的“可约化”是指的可“多项式地”约化(Polynomial-time Reducible),即变换输入的方法是能在多项式的时间里完成的。约化的过程只有用多项式的时间完成才有意义。 NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。 它得是一个NP问题;所有的NP问题都可以约化到它。 证明一个问题是 NPC问题也很简单。 先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它(由约化的传递性,则NPC问题定义的第二条也得以满足。至于第一个NPC问题是怎么来的,下文将介绍),这样就可以说它是NPC问题了。 既然所有的NP问题都能约化成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,NP也就等于P 了。 因此前文才说,“正是NPC问题的存在,使人们相信P≠NP”。我们可以就此直观地理解,NPC问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。 NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条,也就是NP-Hard问题要比NPC问题的范围广。 NPC问题是存在的。确实有这么一个非常具体的问题属于NPC问题——-逻辑电路问题是NPC类问题的“鼻祖”。是第一个NPC问题。其它的NPC问题都是由这个问题约化而来的。 逻辑电路问题是指的这样一个问题:给定一个逻辑电路,问是否存在一种输入使输出为True。 逻辑电路问题属于NPC问题。这是有严格证明的。证明过程相当复杂,其大概意思是说任意一个NP问题的输入和输出都可以转换成逻辑电路的输入和输出(想想计算机内部也不过是一些0和1的运算),因此对于一个NP问题来说,问题转化为了求出满足结果为True的一个输入(即一个可行解)。 有了第一个NPC 问题后,一大堆NPC问题就出现了,因为再证明一个新的NPC问题只需要将一个已知的NPC问题约化到它就行了。后来,Hamilton 回路成了NPC问题,TSP问题也成了NPC问题。 以下为范围示意图:

jsoup.parse 的一个坑

那天,写好一个爬虫 爬取某个网站的数据。 当时调用了公司不知道某个人写的 一个方法 logger.info(joururl); doc= util.getDocument(joururl.toString()); //这里通过url 去得到 网页 本地调试 通过以后 就放到服务器上跑了。 跑着跑着就卡住。 也不报错。 也不停。 当时 以为是内存满了。找了很多方法。 能不重复new的对象坚决不重复new 定义java虚拟机内存 等 还是卡住 后来点进这个方法看才发现问题 这个方法 是这样的 public static Document getDocument(String Url) { try { return Jsoup.connect(Url).userAgent(USER_AGENT).timeout(TIMEOUT).get(); } catch (IOException e) { return null; } } 这里 有什么问题呢。 当网络波动的时候,或者别的原因, 没有拿到网页。 此时。 他catch了。 可是 不抛异常。 那么 程序不会停下来, 不会报错,线程会直接阻塞住。 这就是卡的原因。 所以 应该改进为 Connection.Response response = null; for(int i=1;i<=3;i++){ response = Jsoup.connect(Url).userAgent(USER_AGENT).timeout(TIMEOUT).execute(); int statusCode = response.

使用J-Link烧写一U-boot的烧写+裸板程序烧写(JZ2440-S3C2440)

一、使用J-Link 烧写NOR Flash 注意:J-Link 只支持NOR Flash,不支持NAND Flash。 1、安装J-link 驱动(在Windows 下) 在JZ2440 开发板JLINK 使用手册(JZ2440开发板JLINK使用手册\jlink安装驱动程序目录)中,驱动名为: Setup_JLinkARM_V436e.exe。 双击即可进行安装,安装完成后,桌面上显示两个图标J-Flash和J-Link: 2、使用JLINK 烧写Uboot 到NOR Flash (1)开发板设置为NOR (将NAND/NOR 开关打到NOR一侧)启动,接好J-Link 后,最后启动上电。 (2)启动上电。打开J-Flash ARM V4.36e软件,选择菜单“File”—>“Open project...”,打开“如何烧写S3C2440 裸板程序”文件夹中的“s3c2440.jflash”; (3)选择菜单“Target”->“Connect”;如果连接成功会有提示。 (4)选择菜单“File”—>“Open data file”,打开要烧写的二进制文件,如U-boot.bin,并且在“Enter start address”中输入0并点击OK; 然后会出现下面的界面 (4)选择菜单“Target”->“Program”进行程序烧写,然后选择“是”,烧写完成后点击“确定”。 烧写成功后,下端会有提示。 烧写完成之后,然后需要将JLINK 的转接板从开发板下拆下来,不要连接在一起。 二、使用U-boot进行烧写 NOR Flash 上已经有了U-boot(已经使用J-Link 烧写),使用U-boot 烧写 1、安装USB-串口驱动(在Windows 上) JZ2440 集成的USB-串口,运行“JZ2440v2主光盘\windows\drivers”文件夹中的“PL2303_Prolific_DriverInstaller_v1.7.0.exe”驱动程序。 2、USB口的驱动的安装 (USB 口的驱动为:韦东山六张光盘\开发板资料\百问网JZ2440v2 主光盘\如何烧写S3C2440 裸板程序\驱动\usb 下载驱动\usb 下载驱动-----FriendlyARM USB Download DriverSetup_20090421); 3、接线 (1)然后连接USB-串口线(开发板上的USB-com1 口<---> PC 机的USB 口)。 (2)用另一条USB 线连接PC 机和开发板USB 口(开发板上的USB 口<---> PC 的USB 口); 4、使用SecureCRT 5.

Jsoup解析html某片段的问题

案例问题分析解决办法 案例 在使用jsoup解析html中的某部分片段时,有时候会遇到解析不出字段。下面以案例进行讲解。 <tr> <td class='center'> <font class='blue'> 北京 </font> </td> <td> 36175 </td> <td> 2.03 </td> </tr> <tr> <td class='center'> <font class='blue'> 盐城 </font> </td> <td> 5466 </td> <td> -0.26 </td> </tr> 这是一段html中的字段,我在解析该字段时,无法获得其中的信息。如下是解析代码。 //html为带解析的片段 Document document=Jsoup.parse(html); Elements elements=document.select("tr"); for (Element ele:elements) { String city=ele.select("td[class=center]").text(); int price=Integer.parseInt(ele.select("td").get(1).text()); double rose=Float.parseFloat(ele.select("td").get(2).text())*0.01; System.out.println(city); } 运行程序发现根本没办法获取内容。 问题分析 原来在解析html片段时,Jsoup自动将其补全为html。由于上面的形式是表格里面的一部分内容,所有需要补全。但Jsoup只会添加 信息,而且有可能会把一些信息删除。 如下,为上面html片段,补充的后果。这对解析没有什么帮助。 <html> <head></head> <body> <font class="blue">北京</font>361752.03 <font class="blue">盐城</font>5466-0.26 </body> </html> 解决办法 将表格对应的标签补齐。 String cc="<html> <body> <table> <tbody>"

[python] argparse — 命令行选项、参数和子命令的解析器

15.4. argparse — 命令行选项、参数和子命令的解析器 版本2.7 中新引入。 源代码: Lib/argparse.py argparse模块使得编写用户友好的命令行接口非常容易。程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。 15.4.1. 示例 下面的Python程序代码接收一个整数序列并输出它们的和或者最大值: import argparse parser = argparse.ArgumentParser(description='Process some integers.') parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator') parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the integers (default: find the max)') args = parser.parse_args() print args.accumulate(args.integers) 假设上面的Python代码保存为一个叫做prog.py的文件,它可以在命令行上执行并提供有用的帮助信息: $ python prog.py -h usage: prog.py [-h] [--sum] N [N ...] Process some integers. positional arguments: N an integer for the accumulator optional arguments: -h, --help show this help message and exit --sum sum the integers (default: find the max) 当以适当的参数运行时,它打印出命令行整数的和或者最大值:

在matlab中提取一个比较大的矩阵的部分元素

1.提取大矩阵的一列、一行元素: 一列元素: A(:,j)表示提取A矩阵的第j列全部元素 一行元素: A(i,:)表示提取A矩阵的第i行元素, 于是我们有,A(i, j)表示提取A矩阵的第i行第j列的元素。 2.提取多行多列元素 多行元素: A(i:i+m,:)表示提取A的第i行到第i+m行的元素。 多列元素: A(:,j:j+n)表示提取A的第j列到第j+n列的元素。 提取块: A(i:i+m, j:j+n)表示的是mxn的一个子块的元素。 参考自http://www.ilovematlab.cn/thread-27208-1-1.html

gdb + openocd 调试嵌入式软件

1.openocd是硬件层次的调试,gdb是源码层次的调试。 2.在gdb中可以使用monitor发送openocd的命令,例如monitor reset;halt 3.JTAG有4种复位方式: There are many kinds of reset possible through JTAG, but they may not all work with a given board and adapter. That’s part of why reset configuration can be error prone. System Reset, the SRST hardware signal resets all chips connected to the JTAG adapter, such as processors, power management chips, and I/O controllers. Normally resets triggered with this signal behave exactly like pressing a RESET button.

Oracle 数据库kernel.shmmax 及kernel.sem设置

最近因为拿到一个好配置的生产机器。在装完数据库后,需要对参数进行调优。 首先这个机器内存是128G的 ,而且/dev/shm 设置的是63G (物理内存的一半)。Oracle设置用的是AMM管理,那么就想是否能把这个内存设置大点。 首先这个参数文件在 vi /etc/sysctl.conf 里,重新加载生效是 sysctl -p # System default settings live in /usr/lib/sysctl.d/00-system.conf. # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file # # For more information, see sysctl.conf(5) and sysctl.d(5). #ORACLE SETTING fs.aio-max-nr = 1048576 fs.file-max = 6815744 kernel.shmall = 15728640 kernel.shmmax = 64424509440 kernel.shmmni = 4096 kernel.sem = 5010 641280 5010 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.

ListView 中Item 位置获取

/** * * 获取 ListView 中 当前界面 显示的item 的个数 * 以及 当前点击的Item 在当前显示的ItemL列表 中的位置 * *解决问题 parent.getChildAt(position);有时会报空指针 错误 * */ public class MainActivity extends AppCompatActivity { private List<String > list=new ArrayList<>(); private ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = ((ListView) findViewById(R.id.listView)); for (int i = 0; i < 30; i++) { list.add("测试"+i); } ArrayAdapter arrayAdapter=new ArrayAdapter(this,R.layout.item,list); lv.setAdapter(arrayAdapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 获取 当前 显示的第一个Item 在数据中的位置 int firstVisiblePosition = parent.

es6 javascript的Reflect 对象的方法

Reflect对象的方法清单如下, 共 13 个。 Reflect.apply(target, thisArg, args) Reflect.construct(target, args) Reflect.get(target, name, receiver) Reflect.set(target, name, value, receiver) Reflect.defineProperty(target, name, desc) Reflect.deleteProperty(target, name) Reflect.has(target, name) Reflect.ownKeys(target) Reflect.isExtensible(target) Reflect.preventExtensions(target) Reflect.getOwnPropertyDescriptor(target, name) Reflect.getPrototypeOf(target) Reflect.setPrototypeOf(target, prototype)上面这些方法的作用, 大部分与Object对象的同名方法的作用都是相同的, 而且它与Proxy对象的方法是一一对应的。 下面是对其中几个方法的解释。 ( 1) Reflect.get(target, name, receiver) 查找并返回target对象的name属性, 如果没有该属性, 则返回undefined。 如果name属性部署了读取函数, 则读取函数的 this 绑定receiver。 var obj = { get foo() { return this.bar(); }, bar: function() { ... } }; // 下面语句会让 this.bar() // 变成调用 wrapper.bar() Reflect.get(obj, "

Python数据类型之“集合(Sets)与映射(Mapping)”

一、集合类型(Sets) 集合对象是不同的(不可重复)hashable对象的无序集合。常见用法包括:成员关系测试、移除序列中的重复、以及科学计算,例如交集、并集、差分和对称差分。通俗点来说,集合是一个无序不重复元素的数据集,其基本功能是进行成员关系测试和消除重复元素。 目前有两种内置的集合类型:set 和 frozenset。set类型是可变的--可以使用add() 和 remove()等方法更改其内容。由于它是可变的,它没有hash值,因此它不能被当做字典的键值或另一集合的元素。frozenset类型是不可变的 和 hashable的,它的内容不能再创建后改变,因此它可以用作字典的键值或作为另一个集合的元素。 set类构建函数 class set([iterable]) class frozenset([iterable]) set的构建方式 将一个用逗号分割的元素列表放在一堆花括号内可以创建一个非空set集合,如{'Tom', 'Jerry', 'Peter'}给set的构建函数传递一个空值将会创建一个空set集合(注意:{}表示的是一个空字典而不是空set集合)给set的构架你函数传一个非空iterable参数将会创建一个非空set集合 注意: 再次强调,一个set集合内的元素必须是hashable的(不可变的)。要想表示一个set的set,那么内部的set必须是frozenset对象,因为frozenset是不可变的,是hashable的。 set构建示例 >>> {'Tom', 'Jerry', 'Peter'} # 使用花括号创建非空set集合 {'Jerry', 'Tom', 'Peter'} >>> set() # 使用set构建函数创建空set集合 set() >>> set((1, 2, 3 ,4)) # 使用set构建函数创建非空set集合 {1, 2, 3, 4} >>> set((1, 2, 3 ,['a', 'b', 'c'])) # set集合中的元素必须是不可变的、可哈希的 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' set 和 frozenset都支持的操作 作为无序集合,set不记录元素位置或插入顺序。因此set不支持索引、切片或其他类序列行为。

CAS集群部署基于Redis缓存配置详细方案

CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO )。CAS集群部署首先需要考虑的是ticket票据统一存储的问题,以便于达到每个节点访问的一致性,官方虽然提供了基于memcached方式,但未提供基于Redis方式,项目中需要使用redis,因此仿照memcached方式,新建cas-server-integration-redis工程,来完成工作需求,下面本站素文宅www.yoodb.com就分享一下CAS集群部署基于Redis缓存配置,仅供大家参考学习。 主要特性,具体如下: 1)开源的、多协议的 SSO 解决方案; Protocols : Custom Protocol 、 CAS 、 OAuth 、 OpenID 、 RESTful API 、 SAML1.1 、 SAML2.0 等。 2)支持多种认证机制: Active Directory 、 JAAS 、 JDBC 、 LDAP 、 X.509 Certificates 等; 3)安全策略:使用票据( Ticket )来实现支持的认证协议; 4)支持授权:可以决定哪些服务可以请求和验证服务票据( Service Ticket ); 5) 提 供高可用性:通过把认证过的状态数据存储在 TicketRegistry 组件中,这些组件有很多支持分布式环境的实现, 如: BerkleyDB 、 Default 、 EhcacheTicketRegistry 、 JDBCTicketRegistry 、 JBOSS TreeCache 、 JpaTicketRegistry 、 MemcacheTicketRegistry 等;

支持Windows和Linux的文件目录创建和删除操作

文件目录的创建和删除在Windows和Linux下使用的函数有所不同,这里整理了一份。另外在删除目录时,需要先删除目录中的内容。在这里只做了删除目录的内容,没有做删除当前目录的操作。代码如下: file_util.h #ifndef FILE_UTIL_H #define FILE_UTIL_H #ifdef WIN32 #include <windows.h> #include <direct.h> #include <io.h> #else #include <unistd.h> #include <dirent.h> #include <sys/stat.h> #endif // !WIN32 #include <cstring> #include <string> #ifdef WIN32 #define STRDUP(a) _strdup((a)) #define ACCESS _access #define MKDIR(a) _mkdir((a)) #define RMDIR(a) _rmdir((a)) #else #define STRDUP(a) strdup((a)) #define ACCESS access #define MKDIR(a) mkdir((a), 0755) #define RMDIR(a) rmdir((a)) #endif struct BASE_DIR { #ifdef WIN32 HANDLE dir; WIN32_FIND_DATAA file; bool eof; #else DIR *dir; struct dirent *file; #endif bool file_is_dir; std::string dir_name; std::string file_name; }; int creatDir(const char *p_dir); bool openDir(const char *dir_name, BASE_DIR &base_dir); bool isOpenedDir(const BASE_DIR &base_dir); void closeDir(BASE_DIR &base_dir); bool removeDir(const char *dir_name); #endif // !

HTML5 测试题

1. HTML5 之前的 HTML 版本是什么? A. HTML 4.01 B.HTML 4 C.HTML 4.1 D.HTML 4.9 2. HTML5 的正确 doctype 是? A. <!DOCTYPE html> B. <!DOCTYPE HTML5> C. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 5.0//EN" "http://www.w3.org/TR/html5/strict.dtd"> 3. 在 HTML5 中,哪个元素用于组合标题元素? A. <group> B. <header> C.<headings> D.<hgroup> 4. HTML5 中不再支持下面哪个元素? A. <q> B. <ins> C.<menu> D.<font> 5. HTML5 中不再支持下面哪个元素 A. <cite> B. <acronym> C. <abbr> D. <base> 6. 在 HTML5 中,onblur 和 onfocus 是:

layer弹出层显示在top顶层

因为项目框架用了iframe,所以在用layer时,默认layer.open弹出的窗口只能在iframe子窗口区域显示。现在想让layer在父窗口或者说框架的最顶层显示,想到用top.layer.open或者parent.layer.open,但是没反应。后面想到应该是在父页面中没有导入layer.js文件,导入后就能正常显示在父窗口页面区域了。 显示在顶层窗口 top.layer.open({ type: 2, title: '标题', shadeClose: true, shade: 0.3, area : ['850px' , '450px'], content: 'http://sentsin.com' //这里content是一个URL, }); 显示在父窗口 parent.layer.open({ type: 2, title: '标题', shadeClose: true, shade: 0.3, area : ['850px' , '450px'], content: 'http://sentsin.com' //这里content是一个URL, }); top和parent是浏览器的内置对象,top表示最顶层容器,parent表示父容器,这样一来就是实现了iframe控制父页面或者顶层页面的弹窗效果了。

mysql 在修改添加字段(alter table 表名 add column 或者 modify column)且带unique时提示duplicate entry for key的原因以及解决方案

今天在公司临时维护一张表时,我作了一个小动作,添加一个字段,并且设置为unique时,尽然无法添加字段,我当时就纳闷了,写了这么多sql,这么奇怪的问题还是第一次见,不多说,直接看图 【我的sql文件如下】 【执行sql语句报错:alter table smart_payrecord add column api_pay_no varchar(32) not null unique comment '第三方接口订单号' after pay_no;】 如下图所示! 【于是我怀疑是否是表中存在数据在作怪,于是我把表数据清空(严重警告!真实情况请勿随意清空,注意备份数据),然后再进行添加字段就行了,有图为证】 ②:【推荐】更安全和快捷的科学的方法解决:先把这个字段去掉索引,再进行修改,之所以报错就是因为字段存在索引的原因,一个字段加上unique会默认加上索引的,这个毫无疑问!

Android7.0 klog机制(如何将android log打印到kernel log中)

在分析Android7.0 init进程一文中提到,在init进程中是通过klog来输出log信息的,但是由于log的级别不同可能导致有些添加的log无法输出来。在init .cpp的main函数中初始化klog。 klog_init(); //初始化klog klog_set_level(KLOG_NOTICE_LEVEL); //设置klog的级别为NOTICE system/core/libcutils/klog.c void klog_init(void) { if (klog_fd >= 0) return; /* Already initialized */ //klog_fd默认值为-1,如果大于等于1表示klog已经初始化过,返回 klog_fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC); //打开/dev/kmsg文件,获得文件描述符 if (klog_fd >= 0) { //大于等于0表示,打开成功,init进程的log都会输出到kernel log中 return; } static const char* name = "/dev/__kmsg__"; if (mknod(name, S_IFCHR | 0600, (1 << 8) | 11) == 0) { //如果上面没有打开成功,创建/dev/_kmsg_文件 klog_fd = open(name, O_WRONLY | O_CLOEXEC); //打开文件,获取文件描述符 unlink(name); } } void klog_set_level(int level) { klog_level = level; //将设置的level赋值给klog_level } 在init.

scala代码格式化

开发工具 intellij 插件 Scala、Scalafmt 配置文件( ~/.scalafmt ): --style defaultWithAlign --maxColumn 120 --continuationIndentCallSite 2 --continuationIndentDefnSite 2 格式化快捷键 Ctrl + Shift + L

NGUI-EventDelegate使用

我此时使用的NGUI版本是3.8.2 1、使用EventDelegate需要注意的一个地方 public TweenPosition m_tweenPosition = null; EventDelegate.Add(m_tweenPosition.onFinished,OnTweenPositionFinished); private void OnTweenPositionFinished() { EventDelegate.Remove(m_tweenPosition.onFinished, OnTweenPositionFinished); Debug.Log("Test Finished." ); } m_tweenPosition.PlayForward(); m_tweenPosition.PlayReverse(); 经测试,发现当TweenPosition播放完移除回调后,再次执行播放TweenPosition还会执行OnTweenPositionFinished函数,根本就没移除掉。 上图为TweenPosition基类Update函数中执行onFinished,触发播放完成的地方。 由此图就可以知道,当使EventDelegate添加和移除事件或委托的时候注意一下。 可以使用此函来代替 EventDelegate Add (List<EventDelegate> list, Callback callback, bool oneShot) 这个函数的第三个参数就是只执行一次,当执行完成后会自动移除事件委托。

如何使用STM32CubeMX配置ETH(RMII)

最近,刚接触STM32CubeMX,感觉功能非常强大,特别是对于ETH、USB、FAT等特别方便,不用再像以前那样去找各种移植方法(移植起来既麻烦也耽误时间)。 此处,我以自己手头上的一个板子(STM32F207VCT6)为例,记录一下以太网的配置过程,中间也走了一些弯路,希望其他同志今后在配置ETH的时候可以借鉴参考,以节省自己的开发周期。 具体配置过程: 1、打开STM32CubeMX,并选择好相应的芯片。文中的芯片为STM32F207VCT6,选择后如下图: 2、配置RCC时钟、ETH、PA8以及使能LWIP; 由于此处我们的开发板硬件上为RMII方式,因此选择ETH-RMII,若有同志的开发板为MII方式,请参考MII的配置方法,此处只针对RMII; RCC选择外部时钟源,另外勾选MCO1,软件会自动将PA8配置为MCO1模式,该引脚对于RMII方式很重要,用于为PHY芯片提供50MHz时钟; 使能LWIP; 3、时钟树的相关配置,必须保证MCO1输出为50Mhz,如果这个频率不对会导致PHY芯片无法工作; 我这里因为芯片为207VCT6,为了使MCO1输出为50Mhz,做了PLL倍频参数的一些调整,总体如下:(同志们配置时可根据自己的芯片灵活配置,但需保证MCO1的输出为50Mhz)。下图中的时钟配置参数是一开始配置的,但后来发现网络虽然能通,但丢包严重,后通过百度找到了采用MCO1输出作为时钟的问题,解决方法如下: /* IMPORTANT NOTE ============== This configuration is valid only when MCO pin is used as RMII clock source. To output a 50 MHz clock signal on the MCO pin, the following conditions must be respected: – 25 MHz external crystal connected to OSCIN/OSCOUT pins – RCC_PLLCFGR PLL factors configured as follows: PLLMx = 4, PLLNx = 64, PLLP = 4.

微信登录提示48001,{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}

原因: ①:你的服务号必须是通过腾讯认证,每年是300元,如果没有认证而导致的错误提示,那就去认证,别往下看了!如果你已认证,本条原因排除,那么请继续往下看 ②:你是否是第三方网页,第三方网页的话,那么你的url地址里面的scope这个参数要填写"snsapi_userinfo",否则会报这个错!原因如下! URL地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=ok#wechat_redirect scope参数对应值的解释: snsapi_base 不需要用户点同意,直接跳转到授权后的页面,只能用于获取openid,不能获取用户基本信息 snsapi_userinfo 会征求用户同意,授权后,可以获取用户基本信息

Java常见的几种内存溢出及解决方法

Java常见的几种内存溢出及解决方法【情况一】: java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一个原因是程序中有死循环; 如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决: -Xms3062m -Xmx3062m 【情况二】 java.lang.OutOfMemoryError:GCoverheadlimitexceeded 【解释】:JDK6新增错误类型,当GC为释放很小空间占用大量时间时抛出;一般是因为堆太小,导致异常的原因,没有足够的内存。 【解决方案】: 1、查看系统是否有使用大内存的代码或死循环; 2、通过添加JVM配置,来限制使用内存: -XX:-UseGCOverheadLimit 【情况三】: java.lang.OutOfMemoryError:PermGenspace:这种是P区内存不够,可通过调整JVM的配置: -XX:MaxPermSize=128m -XXermSize=128m 【注】: JVM的Perm区主要用于存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace,这个区域成为年老代,GC在主程序运行期间不会对年老区进行清理,默认是64M大小,当程序需要加载的对象比较多时,超过64M就会报这部分内存溢出了,需要加大内存分配,一般128m足够。 【情况四】: java.lang.OutOfMemoryError:Directbuffermemory 调整-XX:MaxDirectMemorySize=参数,如添加JVM配置: -XX:MaxDirectMemorySize=128m 【情况五】: java.lang.OutOfMemoryError:unabletocreatenewnativethread 【原因】:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。 【解决】:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS/MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过-Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms-Xmx两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。 【情况六】: java.lang.StackOverflowError 【原因】:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。 【解决】:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。 声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向上学吧网站投诉>>

复化的梯形公式、Simpson公式与Cotes公式的比较(用Matlab实现)

对于函数f(x) = sin(x) ,试用复化梯形公式、复化Simpson公式及复化Cotes公式计算积分,并比较其误差。 首先,在MATLAB输入以下程序定义函数: function y=f(x) y=sin(x); 1.复化梯形求积公式的代码 function Tn=Tn(a,b,n) format long h=(b-a)/n; sum=0; for k=1:n-1 sum=sum+f(a+k.*h); end Tn=(f(a)+2*sum+f(b))*h/2; end 2. 复化Simpson公式的代码 function Sn = Sn(a,b,n) format long h = (b-a)/n; sum1 = 0; sum2 = 0; for i = 0:n-1 sum1 = sum1 + f(a+(i+1/2).*h); end for j = 1:n-1 sum2 = sum2 + f(a+j.*h); end Sn = h/6*(f(a)+4*sum1+2*sum2+f(b)); 3. 复化Cotes公式的代码 function Cn = Cn(a,b,n) format long h = (b-a)/n; sum1 = 0; sum2 = 0; for i = 0:n-1 sum1 = sum1 + 32*f(a+(i+1/4).

白话空间统计二十一:密度分析(四)

白话空间统计系列断了好久了……虽然写了很多其他的文章,但是有同学问,还是系列性的文章效果比较好,当然这些文章大部分都能分开来读,没有啥前后联系,但是系列文章最大的特点就是能够形成知识体系,无论是对于写的,还是对于读的,都有很大的好处。 好了,继续写密度分析。密度分析是我写的白话空间统计里面最长的单篇了,正剧写到这里是第四篇,番外写了两篇,但是预计起码还有好几篇才能写完,有时候想,干脆就直接叫做白话密度分析好了……可以开一个大系列。 好了,闲话少说,进入正题。(关于密度分析其他的内容,请查阅以前的文章)。 前面说了很多基本原理,但是可能大家看完之后就一个感觉:懂的说懂的,看不懂的仍然看不懂……好吧,今天虾神照样用画图的方法来说说核密度的基本原理。 首先我们来看看不进行属性加权的核密度分析(仅仅使用空间信息进行核密度分析)。 针对一下两个参数(cell size和bandwidth),我们通过下面的图来对比一下: 数据:美国的城市(区)位置信息。 当搜索半径为2度(1度约108公里左右)的时候,生成的结果如下:明显的看出美国城区密度中心主要有下面几个:东部的纽约城市圈、中部的芝加哥城市圈、西部的旧金山城市圈和洛杉矶城市圈。 当我们的搜索半径扩大到5度(500多公里)的时候,东部的纽约城市圈和芝加哥城市圈还能勉强分开,但是加州的旧金山城市圈和洛杉矶城市圈就已经连成一体了。 当我们把搜索半径扩大到10度(1000多公里)的时候,美国整体就变成了两个热区:东部和西部。 结论:当我们的搜索半径越大的时候,所能表现出来的结论越粗略和抽象,越能表现出整体性的趋势。而搜索半径越小的时候,细节程度越高,越能显示出局部性的趋势。 如何有效的选择搜索半径,就需要看你研究的空间尺度了,这是一个仁者见仁智者见智的过程。 以为上面主要讲的是无属性加权的,下一节继续讲属性加权的密度分析。 待续未完。

GDAL学习笔记——OGR投影(二)

解析坐标系 当OGRSpatialReference对象被创建时,就可以解析该对象所包含的信息。可以使用OGRSpatialReference提供的IsProjected()和IsGeographic() 函数分别判别投影坐标系或地理坐标系是否建立,GetSemiMajor()、GetSemiMinor() 和GetInvFlattening()函数分别获取椭球体的长半轴、短半轴以及扁率的倒数。GetAttrValue()获取PROJCS、GEOGCS、DATUM、SPHEROID和PROJECTION名称的字符串。 GetProjParm()函数获取投影的参数信息。GetLinearUnits()函数获取单位类型,并且转换为单位米。 OGRSpatialReference oPGS; oPGS.SetWellKnownGeogCS( "WGS84" ); std::cout<< "SemiMajor->" << oPGS.GetSemiMajor() << std::endl; std::cout<< "SemiMinor->" << oPGS.GetSemiMinor() << std::endl; std::cout<< "InvFlattening->" << oPGS.GetInvFlattening() << std::endl; 运行结果: 投影转换 OGRCoordinateTransformation类是用于不同坐标系之间的转换,利用OGRCoordinateTransformation()创建OGRCoordinateTransformation类转换对象。利用OGRCoordinateTransformation::Transform()方法进行坐标系转换. //Transform()的函数原型 virtual int OGRCoordinateTransformation::Transform ( int nCount, double * x, double * y, double * z = NULL ) //对于这四个参数:nCount表示要转换点的个数;x,y,z应该分别是三维坐标点的三个值,z可以为NULL,表示只转换水准面上的点。不考虑高程值。 下面是WGS84与Xian 1980/Gauss-Kruger zone 13之间转换的测试代码: OGRSpatialReference oSourceSRS, oTargetSRS; OGRCoordinateTransformation *poCT; double x, y; oSourceSRS.importFromEPSG( 4326 );//WGS84 oTargetSRS.importFromEPSG( 2327 );//Xian 1980/Gauss-Kruger zone 13 poCT = OGRCreateCoordinateTransformation( &oSourceSRS, &oTargetSRS ); x = 10.

恢复受损的mybase数据库

恢复受损的mybase数据库 今天打开mybase软件时,一个随之打开的database弹出提示:“打开指定的数据库,失败。Incorrect version number detected in data stream”,心里一惊,估计是昨天晚上将数据库所在分区由主分区转换为逻辑分区导致的缘故,不管怎么样,想办法恢复吧。我的mybase因为是测试版所以每次启动时都会自动备份,虽然这次也有对应的bak备份文件,但是一些最新的内容并不在bak文件中。在群里一朋友的帮助下,最终得到解决办法如下:首先备份受损的数据库,然后下载Nyf-Repair-Tool(官网上提供的,下载链接为 http://www.wjjsoft.com/cgi-bin/dl.cgi?fid=Nyf-Repair-Tool )对受损的数据库(nyf格式)进行修复,注意同时也需要同名的ssgindex格式文件。还算有点运气,我的数据库居然全部恢复了。不过运气归运气,养成随时备份的习惯真的很重要。。。。 posted on 2016-11-12 22:01 websec80 阅读( ...) 评论( ...) 编辑 收藏 转载于:https://www.cnblogs.com/websec80/articles/6057684.html

java.lang.RuntimeException: Could not generate DH keypair。

本人出现这个错误的原因是,在原来的个人电脑中使用win7 64位系统。然后转项目到win10 64位系统。原来win7使用的jdk6(32位)和7(64位),与tomcat7.一直使用都没有问题。在win10下,使用jdk1.6(32位,64位都试过)一直报上面这个错。使用1.7(64位)没有报错。但是项目正式部署需要1.6。所以必须解决使用1.6来编译。 解决方法如下: 1.下载两个jar包 1.bcprov-ext-jdk15on-1.54.jar 2.bcprov-jdk15on-1.54.jar 2.将下载的两个JAR文件复制到:JDK安装目录\jre\lib\ext下,例如我的就是D:\Program Files (x86)\java\JDK1.6\jre\lib\ext 3.打开java.security文件:在JDK安装目录\jre\lib\security下的java.security文件。 找到security.provider.1=sun.security.provider.Sun换成 security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider 重新执行连接数据库程序就可以。 使用上面的方法可以解决这个问题,但是有我又发现了一个另外的问题。 上面可以使用1.6(64位)之后。当使用的tomcat是7(64位)的时候,会报java.security.NoSuchAlgorithmException: SHA1PRNG SecureRandom not available这个错。 但是虽然报错,不过还是可以正常使用。 当使用1.6(64位)和tomcat6(64位)之后,就没有这个报错,正常使用。 jar包下载地址:http://download.csdn.net/detail/qq_34805046/9681039

oracle日期格式转换 to_date(),to_char()

1、转换函数 与date操作关系最大的就是两个转换函数:to_date(),to_char() to_date() 作用:将字符类型按一定格式转化为日期类型: 具体用法: to_date(''2004-11-27'',''yyyy-mm-dd''),前者为字符串,后者为转换日期格式,注意,前后两者要以一对应。 如:to_date(''2004-11-27 13:34:43'', ''yyyy-mm-dd hh24:mi:ss'') 将得到具体的时间 例子如下: 这个例子中我查询了表中存储时间的两个字段,这两个字段都是varchar2数据类型,执行的结果如图所示 20160726这种表示时间的方式不直观,我前台页面需要的时间展示格式是2016-07-26的格式,所以我需要用to_date()函数来进行转换 转换如下: 我们发现用to_date( x.jlgxsj,'yyyy-mm-dd' )之后字段转化为之后的格式为2016/7/26这种用'/'连接的格式,不是我们想要的效果,这是为什么呢? 我百度了一下发现: 原来因为我to_date了之后这个字段就成了日期类型 日期类型的格式是由一个系统参数决定的 alter session set nls_date_format = ‘yyyy-dd-mm’;你自己需要改一下就好了 但是如果你不想改系统从参数你也可以用下面这种方式来转化成你想要的格式这里就需要借助to_char()函数了: 从执行结果我们很直观的都可以看见,现在已经转化成了我们想要的日期格式。 下面就是执行的sql语句: select to_char( to_date(x.jlgxsj,'yyyymmdd'),'yyyy-mm-dd' )as jlgxsj ,x.ywsj FROM CEN_INTERFACE.TB_SJL_MX x 其中转化的部分语句:to_char( to_date(x.jlgxsj,'yyyymmdd'),'yyyy-mm-dd' )可以看出我们先使用to_date()将字段转化为日期类型,在通过to_char()将转化之后的日期类型转化为我们需要的类型,当然转化之后我们获取的这个值:2016-07-26是个字符串类型。 二、总结 oracle 日期格式 (1)to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错。 是将字符串转化为日期(DATE)格式,而且转化之后的格式与orcal系统日期参数有关 (2)to_char(日期,"转换格式" ) 即把给定的日期按照“转换格式”转换。 是将日期格式转化为字符串格式

微信小程序里没有类似 js的 getElementById 方法。

所有的控件控制都是靠 setData传参数实现的。 例如我们需要做一个效果, 两个按钮, 点击 a 后 b 失效。 具体代码如下: wxml 文件 <button type="default" bindtap="click_btn_a"> 按钮 A </button> <button type="default" plain="{{btn_b_plain}}" disabled="{{btn_b_disabled}}"> 按钮 A </button> js 文件 click_btn_a: function(e) { this.setData({"btn_b_plain":'false'}); this.setData({"btn_b_disabled":'false'}); }, 编译运行 点击按钮A 后 按钮B 立刻实效, 不是特别明白微信小程序的渲染机制,难道用户的任何任何一个操作事件都会触发整个界面重绘一遍。 先记下来后面再慢慢研究吧。

dirent--文件以及文件夹相关操作(跨平台)

windows客户端开发–文件以及文件夹相关操作(windows api) 一文中,主要使用了一些windows api实现文件以及文件夹的相关操作。 c++语言本身不提供文件相关操作,我们也可以使用boost库完成我们想要的功能。 但是为了仅仅一个小功能,引入boost库,似乎有点小题大做吧,那今天就介绍一种“跨平台”的文件操作,dirent。 这里所谓的“跨平台”其实是个伪命题,不是真正意义上的。 let us go!!! 初识dirent 是POSIX.1标准定义的unix类目录操作的头文件,包含了许多UNIX系统服务的函数原型,例如opendir函数、readdir函数. 看到上面的描述,你会理解我所说的用引号引起来的“跨平台”了。 在windows平台上同样可以使用: https://github.com/tronkko/dirent/blob/master/include/dirent.h 只是简单的包含这个头文件dirent.h就可以了,因为这个文件只有八百多行,在博客的最后面,我将会贴上这个源码。 熟悉dirent dirent结构体: struct dirent { long d_ino; /* Always zero */ unsigned short d_reclen; /* Structure size */ size_t d_namlen; /* Length of name without \0 */ int d_type; /* File type */ char d_name[PATH_MAX]; /* File name */ }; typedef struct dirent dirent; DIR: A type representing a directory stream. struct DIR { struct dirent ent; struct _WDIR *wdirp; }; typedef struct DIR DIR; 一些函数:

jquery动态修改表单select的option值,从而间接修改option的选中状态

<!-- 通过php模板标签的方法实现option选中状态,最常用的 --> <select name="sex" id="sex"> <option value="" >请选择性别</option> <option value="1" <{if $info['sex']=='1'}> selected <{/if}> >男</option> <option value="2" <{if $info['sex']=='2'}> selected <{/if}> >女</option> </select> <script type="text/javascript"> //通过jq方式,我不是直接修改值的选中状态,而是直接替换 ,把原来的 //<option value="" >请选择性别</option> //这一段替换为需要的值,其实相当于把需要的值放在第一的位置, //从而实现选中状态 function edit(obj){ if($(obj).attr('sex') == 1){ $("#sex").find("option[text='请选择性别']").val(1).text('男'); } if($(obj).attr('sex') == 2){ $("#sex").find("option[text='请选择性别']").val(2).text('女'); } } </script>

Android按home键之后,再次点击程序图标避免再次重启程序

正在运行的Android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 有些手机会出现这种情况,有些不会,所用的乐视手机就会出现这种情况,而且很诡异的是: 当安装成功后点击打开就会出现这个问题,如果点击完成再从桌面打开就不会出现这个问题,看到有部分人说这是Android系统的一个bug,对此也没有过多的时间去看这个了,先给出我的解决方案,具体原因等项目上线再来研究吧 例如:一个android程序包含两个Activity,分别为MainActivity和OtherActivity,MainActivity为程序启动的Activity。如果程序正位于OtherActivity,点击home键,程序退回到桌面, 在次点击程序图标,程序默认会自动重启,即重新进入MainActivity,而不是进入点击home键的时刻程序所位于的OtherActivity。 在第一个启动页里的onCreate()方法里面添加下面代码就可以了 if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){ finish(); return; } 其他的方面我也没有深入的研究过,这只是应对当前产品上线的bug解决,以后有时间再来研究吧,如果有大神知道原因希望不舍赐教,感谢啦

关于有时select下拉表单selected设置无效的解决方案

<select class="form-control" name="user_level" <strong><span style="color:#ff0000;">autocomplete="off"</span></strong>> <option value="">--请选择--</option> <if condition="$user_info['user_level'] eq '0'"> <option value="0" selected="selected">普通</option> <else /> <option value="0">普通</option> </if> <if condition="$user_info['user_level'] eq '1'"> <option value="1" selected="selected">会员</option> <else /> <option value="1">会员</option> </if> <if condition="$user_info['user_level'] eq '2'"> <option value="2" selected="selected">贵宾</option> <else /> <option value="2">贵宾</option> </if> </select> 以上只是本人的一个案例(thinkphp模板引擎) 如果你懒的看上面的不要紧,下面我直接说吧 正常情况下我们都是这么写的 <select name="自定义名称"> <option value="1">1</option> <option value="2" selected="selected"> 2</option> <option value="3">3</option> </select> 按着上面的写法一般来说没什么问题,可是有时候可能是使用了前段框架的问题,导致红色项没有按我们预期的被选中,如果遇到这种情况我们可以进行如下标准写法就可以解决问题了 <select name="自定义名称" autocomplete="off"</span>> <option value="1">1</option> <option value="2" selected="selected"> 2</option> <option value="

Discuz! X3.0/X3.1/X3.2通用 Apache伪静态规则

1.在后台“全局》SEO设置》URL 静态化”相关复选框全部勾选,点“提交”按钮。 2.下载附件.htaccess直接用FTP上传到论坛根目录即可,不要修改文件名,就是.htaccess 其他目录的话修改第2行“RewriteBase /discuz” 把discuz换成目录名,如在bbs目录则改为:RewriteBase /bbs .htaccess文件放在bbs目录 默认规则如下: RewriteEngine On RewriteBase /discuz RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^topic-(.+)\.html$ portal.php?mod=topic&topic=$1&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^article-([0-9]+)-([0-9]+)\.html$ portal.php?mod=view&aid=$1&page=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^forum-(\w+)-([0-9]+)\.html$ forum.php?mod=forumdisplay&fid=$1&page=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ forum.php?mod=viewthread&tid=$1&extra=page\%3D$3&page=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^group-([0-9]+)-([0-9]+)\.html$ forum.php?mod=group&fid=$1&page=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^space-(username|uid)-(.+)\.html$ home.php?mod=space&$1=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^blog-([0-9]+)-([0-9]+)\.html$ home.php?mod=space&uid=$1&do=blog&id=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^archiver/(fid|tid)-([0-9]+)\.html$ archiver/index.php?action=$1&value=$2&%1 RewriteCond %{QUERY_STRING} ^(.*)$ RewriteRule ^([a-z]+[a-z0-9_]*)-([a-z0-9_\-]+)\.html$ plugin.php?id=$1:$2&%1

贝叶斯决策理论

对于模式识别的方法,大体可以分为基于知识和基于数据的两类。所谓基于知识的方法,主要以专家系统为代表,一般归于人工智能的范畴;而基于数据的方法,则可归于基于数据的机器学习。 基于数据的方法,基础是统计模式识别,即依据统计的原理来建立分类器。 说到统计,则不得不谈到概率,这里罗列一些概率论的机器学习中的基本概念,百度都可以查到,不再赘述: 样本、样本集、类(类别)、特征、已知样本、未知样本、条件概率、先验概率、后验概率、监督学习、非监督学习 下面进入正题: 我们首先来看一个例子,对于身高、体重与性别的关系,想必都有一些感性的认识,比如,一个身高在180CM左右而体重在70KG,那这个人基本就是男性,而一个身高在160CM左右而体重在50KG,那这个人基本就是女性。 注意,这里的用词是‘基本’,因为这个问题我们只能根据我们的经验,通过对生活的观察,来做出相应的猜测,而这个人究竟是男性还是女性我们并不能肯定。 一般来讲,在判断这个人是男性还是女性的时候,我们的脑海中肯定是先估计一下这个人是男性的概率大致为多少,这个人是女性的概率大致为多少,而我们的结论则更倾向于概率较大的那个。 对于这个例子,我们需要有两点先验知识,第一点是男性和女性的总体比例是多少;第二点是男性中身高在180CM左右而体重在70KG比例和女性中身高在180CM左右而体重在70KG的比例。 而我们可以依据同样的原理,来利用计算机对这个问题及思考过程来进行模拟,这就是贝叶斯决策。 对于贝叶斯决策,同样需要两点先验知识: -先验概率,对于上面的例子,也就是男性占中体人数的比例和女性占总体人数的比例,我们分别记为P(man),P(woman) -类条件概率密度,对于上面的例子,也就是男性(女性)中身高在180CM左右而体重在70KG的比例,这个在概率论中则对应于条件概率,我们分别记为P(h=180,w=70|man),P(h=180,w=70|woman) 接下来的工作则是基于概率论中著名的公式,贝叶斯公式: P(ω|x)=P(x|ω)P(ω)P(x) 关于这个公式的证明,很容易,依照条件概率的定义即可得到,感兴趣的读者可以百度一下。这个定理虽然很简单,但是却建立起先验概率和后验概率相互转化的桥梁。 关于这个公式的理解,形象点来讲,就是通过‘我很饿的情况下选择吃包子的概率‘推导出‘我吃包子的情况下我很饿的概率’。 至此,我们不妨将我们的先验知识代入到这个公式中,可以得到: P(man|h=180,w=75)=P(h=180,w=75|man)P(man)P(h=180,w=75) P(woman|h=180,w=75)=P(h=180,w=75|woman)P(woman)P(h=180,w=75) 进而可以得到: λ=P(man|h=180,w=75)P(woman|h=180,w=75)=P(h=180,w=75|man)P(man)P(h=180,w=75|woman)P(woman) λ 的值可以根据先验知识得到,当 λ 大于1时,则可以判断这个人是男性,否则为女性。 基于上述原理,我们就可以设计出贝叶斯分类器。已经证明,在已知先验概率和类条件概率的情况下,上述决策规则错误率最小,故也称之为最小错误率贝叶斯决策。 关于‘最小错误率’的理解:首先有个前提,即为先验概率和类条件概率都已知(都正确)的情况下,这是才是‘最小错误率’,如果训练集中男女比为1,先验概率则各为0.5,而测试集中却全是男性,这时你的先验概率显然是错误的,故也谈不上‘最小错误率’了。但实际上当数据取的最够充分、足够随机的话两个集中的男女比应该是近似一样的,这时即为‘最小错误率’。 那么问题来了,既然贝叶斯决策是最小错误率,那我们为什么还要学习SVM、ANN的呢?直接全用贝叶斯决策不就好了吗? 贝叶斯的优点在于简单直观,但是它有两个致命的缺点: - 类条件概率密度和先验概率:更多的情况下,我们实际上是很难得到类条件概率密度或者先验概率的,此时则无法应用贝叶斯决策。 - 我们的目的是将样本进行准确地分类,而贝叶斯决策却将每一种情况概率都计算一遍,其运行开销之大可想而知。(毕竟我们只是要分类而不是求概率,有点舍本逐末了) 当然,对于根据身高体重来判断性别的问题,使用贝叶斯决策是很合适的,博主采用了100人的训练集和400人的测试集,准确率在90左右,而SVM和ANN的准确率都是低于贝叶斯决策的,这也从侧面验证了贝叶斯决策的‘最小错误率’。这里男女性的先验概率各设为0.5,类条件密度概率则根据高斯分布来估计。 对于多类别的情况: 其原理是一样的,这时的决策规则可以表示为: 若P(ωi|x)=maxj=1,2...cP(ωj|x)=maxj=1,2...cP(x|ωj)P(ωj)$,则x∈ωi 实际上,我们可以将 P(x|ωj)P(ωj) 看作是一个关于 j 的函数,这里j=1,2,...,c,即为 gj(x) ,我们称函数 g 为判别函数,这样,决策过程就转化成为了比较判别函数的大小。 这里需要注意的是,当特征向量维数很高时,若特征向量之间满足概率论中的独立性,则有P(AB)=P(A)P(B),P(A,B|C)=P(A|C)P(B|C),进而将问题简化。但是对于身高体重预测性别的问题,身高体重二维特征向量显然是不独立的,一般来讲,体重越大身高越高,我们称之为正相关,反之则为负相关,这时则需要引入协方差矩阵。 下面我们来看一下正态分布时的统计决策 多元正态分布的概率密度函数定义为: p(x)=1(2/pi)d2|Σ|12exp{−12(x−μ)TΣ−1(x−μ)} 式中, x=[x1,x2,...,xd]T 是 d 维列向量;μ=[μ1,μ2,...,μd]T时 d 维均值向量;Σ是 d∗d 维协方差矩阵; Σ−1 是 Σ 的逆矩阵, |Σ| 是 Σ 的行列式。 对于正态分布(例如上面的身高体重问题)的问题,其决策面方程有如下等价形式(略去常数无关项): gi(x)=−12(x−μi)TΣ−1i(x−μi)−12ln|Σi|+lnP(ωi) 我们只需要将相关数据带入判别函数再以此比较大小做出决断即可。 这里需要指出的是,可以证明,其判别函数要么为线性函数,要么为二次函数,这固定的函数形式使得人们开始考虑直接寻找‘最优’的线性函数或是二次函数来完成分类,而跳过与分类无关的大量概率的计算,进而出现了后续的线性判别法,SVM等方法。

面试基础知识准备

图像基础知识: 1. 常用的图像空间。 2. 简述你熟悉的聚类算法并说明其优缺点。 3. 请描述以下任一概念:SIFT/SURF LDA/PCA 4. 请说出使用过的分类器和实现原理。 5. Random Forest的随机性表现在哪里。 6. Graph-cut的基本原理和应用。 7. GMM的基本原理和应用。 8. 用具体算法举例说明监督学习和非监督学习的区别。 数学知识: 1. 贝叶斯全概率公式题。 2. 最小二乘拟合的公式推导和代码实现。 图像空间 Lab色彩模型除了上述不依 Lab颜色定义示意图 赖于设备的优点外,还具有它自身的优势:色域宽阔。它不仅包含了RGB,CMYK的所有色域,还能表现它们不能表现的色彩。人的肉眼能感知的色彩,都能通过Lab模型表现出来。另外,Lab色彩模型的绝妙之处还在于它弥补了RGB色彩模型色彩分布不均的不足,因为RGB模型在蓝色到绿色之间的过渡色彩过多,而在绿色到红色之间又缺少黄色和其他色彩。 如果我们想在数字图形的处理中保留尽量宽阔的色域和丰富的色彩,最好选择Lab。 参考 http://baike.baidu.com/item/Lab/1514615