HashMap 剖析与理解

序言 ConCurrentHashMap 是一个被忽视的Java Concurrent包下面的类,在满足并发的「安全性」,和「活跃性」的前提下,做到了与不考虑线程安全的 HashMap 同等效率. 作者是大名鼎鼎的Doug Lea,他老人家在Java 并发领域做的贡献,确实是我们的榜样。下篇文章,对ConCurrentHashMap做一个分析,希望这个代码中的闪光点,能够对各位读者产生启发。这里先介绍HashMap做的实现,便于后面我们理解2者的差异,以及[Doug Lea]完成的ConCurrentHashMap类具有那些惊为天人的地方。这里我们先看看JDK里面是如何实现 HashMap 的。 JDK 是如何定义Map接口的 在设计一个通用的模块和功能的时候,我们需要静下心来分析下根本需求是什么?根据这个需求来建立我们的根本需求。 Map,就是Key-Value对,通过Key可以快速找到对应的Value,核心的需求是Put和Get方法。 public void put(K,V); public V get(K); 在实际的需求里面,虽然不同于Collection,但是一些基础功能和需求是共通的,所以需要额外地加上一些基础方法,比如isEmpty(),size()等。于是而后在原来的基础上添加了其他基础抽象,最后形成的接口大体可以如下 public void clear(); public boolean containsKey(Object key); public boolean containsValue(Object value); public Set<Map.Entry<K,V>> entrySet(); public boolean equals(Object object); ... public V remove(Object key); public int size(); 在这个时候,可能会有2个问题 1)为什么Map接口没有继承自Collection? 这个在JDK的问题里面所说的是Map,和Collection根本是两个东西,具体可以参考下面的引用 This was by design. We feel that mappings are not collections and collections are not mappings. Thus, it makes little sense for Map to extend the Collection interface (or vice versa).

给Xcode已有项目添加git代码仓库

问题: 创建项目的时候没有勾选创建本地代码仓库,项目无法使用git,如下图 解决方案 这个时候需要手动创建代码仓库了,打开终端cd 到你的项目,如下 cd XXproject (找到你的项目,cd ls配合使用) git init ( 初始化本地代码仓库 ) git add . (这里说一下,add添加要提交的文件名,.是选中所有的意思,现在一般使用 git add -A) git commit -m "init commit" (提交,“”里面是对这次提交的注释) 重启Xcode看效果:

Flex 手机项目学习文档

 ios - 让flash builder手机项目支持iphone5,5s全屏(去掉上下黑边) 2014-12-13 20:06 发布:yuhang 浏览:17 flash builder开发手机项目时,发布air程序到iphone上后,如果是iphone5或iphone5s的话,会发现程序并不会占满整个屏,上下还是会有黑边。 解决办法: 1,弄一张图片,高度1136,宽度640,空白的图片也行。 2,将其命名为 Default-568h@2x.png,放在项目的src目录下,和你的 project-app.xml 放在一起。 3,重新发布ipa,在iPhone5上运行,你就能得到正确的屏幕尺寸了。 说明: 1,568h代表的是:568×2=1136。 2,你不必显示这张图片,不必把在放在舞台上,不必在你的代码的任何地方使用这张图片。 3,你只需要保证这张图片在打包的时候被加入到ipa中就行了,Flash Buidler会自动做这件事的,。 如果你不放心,你可以在ipa打包成功之后,随便找个压缩软件打开它,看看解压后能不能找到这个图片。 运行提示找不到设备 1) 查看itunes 的服务是否起动(Bonjour服务),测试。。。。。,如果还没连上 2)"D:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0\lib\aot\bin\iOSBin\idb.exe" -devices 看能不能找到设备,如果还找不到。复制:C:\Program Files (x86)\Common Files\Apple\Apple Application Support\SQLite3.dll 到:D:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0\lib\aot\bin\iOSBin 或:D:\Program Files (x86)\Apache Flex\Apache Flex SDK 4.10.0\lib\aot\bin\iOSBin(下载的Apache Flex) 3)再次执行"D:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\sdks\4.6.0\lib\aot\bin\iOSBin\idb.exe" -devices 看结果 , 看到了设备的UID FlashBuilder 4.

acdream 1060 递推数 (找循环节,矩阵乘法)

题意: 已知A(0) = 0 , A(1) = 1 , A(n) = 3 * A(n-1) + A(n-2) (n ≥ 2) 求 A(A(A(A(N)))) Mod (1e9 + 7) 题解: 因为任何数取摸到最后都会形成循环节,于是只要找到每层中循环节的大小,热按后用摸上循环节的结果作为标号不断迭代。找到循环节后,就是赤裸裸的矩阵乘法。 #include<stdio.h> #include<iostream> #include<math.h> #include<algorithm> #include<string.h> using namespace std; typedef long long ll; const ll MOD1 = 1000000007; const ll MOD2 = 222222224; const ll MOD3 = 183120; const ll MOD4 = 240; ll MOD; struct Marix{ ll maze[2][2]; Marix(){ memset(maze,0,sizeof maze); } }; Marix mutil(const Marix &a,const Marix &b){ Marix c; for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ for(int k=0;k<2;k++) c.

java基础入门-对象与对象变量

package com.ray.object; /** * 对象与对象变量 * * @author ray * @since 2015-04-22 * @version 1.0 * */ public class Person { public Person (){} public static void main(String[] args) { Person bill = new Person(); Person jack; System.out.println(bill.toString()); //下面这里直接报错,对象变量没有实例出真实的对象出来 System.out.println(jack.toString()); } } 在上面的代码里面bill是对象,jack只是对象变量 bill因为已经实例化,所以他可以打印具体的东西 但是,jack没有实例化,所以如果需要打印东西,编译器直接报错 版权声明:本文为博主原创文章,未经博主允许不得转载。

.net 获取当前DLL所在目录

string dllPath = Path.GetDirectoryName(new Uri(this.GetType().Assembly.CodeBase).AbsolutePath; 静态函数中则不可用: string dllPath = Path.GetDirectoryName(new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

ios 页面的跳转

登录时跳转方法 1.主要是根据情况设置谁为window.rootViewcontroller的问题。在appdelegate.h文件中监听通知,登录与退出。在默认加载时window.rootViewcontroller 设置为登录的viewcontroller。当登录成功后发送通知,在appdelegate中接收通知,将修改window.rootViewController为uitabbarcontroller.相应的当退出时,发送退出通知,这时在appdelegate中接收到退出通知,将window.rootViewController设置为登录的viewcontroller. 2. 默认就设置uitabbarController为window.rootViewController. 在登录时使用presentviewcontroller弹出登录的viewcontroller.这样你看到的第一个视图就是登录的视图。当登录成功后dismiss登录viewcontroller,发通知重新reload tabbarcontroller 。退出时重新present登录窗口就可以了 第二种方法,可以处理那种也不需要登录也可以查看某些内容的app.当需要登录时present出来登录视图就可以了。 跳转的方式有两种 ViewController* sec = [[ViewController alloc]init]; // 通过导航来push到下一页面 self.navigationController pushViewController:sec animated:YES]; //直接显示指定页面 [self presentViewController:sec animated:YES completion:nil ]; //回跳 //导航来pop回去 ViewController* tVC = [[ViewController alloc]init]; [self.navigationController popViewControllerAnimated:YES]; //对应present回去 [self dismissViewControllerAnimated:YES completion:nil];

关于Keil如何设置只编译修改过的文件

以前用的都是51单片机程序小,点击和点击时间都差不多,可是最近在用stm32的官方库,这是点击全部编译就要浪费大量的时间, 实际上点击原本只会编译修改过的文件其实现的原理和makefile差不多(未考证),而不管文件是否改动都会全部重新编译一遍。 可是我在用keil的过程中发现即使点击工程中的所有文件包括未修改的都要重新编译(可能是把keil的默认设置在无意的情况下改了),简直不堪忍受,特别是在移植GUI的时候编译一遍足足需要5分钟,PS一下公司电脑也比较破。 后来发现可以通过这样的操作避免整个工程重新编译: 然后再弹出的对话框选择: 1,不选(没有勾)2,半选(灰色的勾)3,全选(黑色的勾) 对比后颜色不一样吧。 我的keil版本是

fatal error C1083: 无法打开源文件:“WIN32”: No such file or directory(VS)的解决方法

在vs2010编译一个c++工程时候提示问题: fatal error C1083: 无法打开源文件:“WIN32”: No such file or directory 在网上搜了一下,大都说是include的问题,可是仔细研究没发现include有什么问题,首先说下工程情况: 工程是一个VC工程直接扩展到vs上的,当然扩展的时候会因为一些变量的声明空间而报错,比如在vs中: for(int i=0;i<N;++i) i的声明空间只在for循环内,出了for循环就不认识i这个变量了。而vc中int i一次,以后就不用再int了; 还会遇到的问题就是比如: int l=sqrt(a);//a为int型 vs会提示sqrt调用不明确,因为sqrt函数总共有三种重载形式。如下图所示: 这时可以改成: int l=sqrt((double)a);// 改正完以上语法错误后,在工程里又添加了一些其他的.h及.cpp文件,经过一番调整合并,解决了所有的语法错误,在Debug下编译通过,可以运行。接下来在Release下编译,那么问题来了: fatal error C1083: 无法打开源文件:“WIN32”: No such file or directory 经过一番琢磨,发现可能是VC和VS之间转化的问题,其中涉及到一个文件: project.vcxproj 该文件记录了整个项目中的组织结构,有哪些.h文件,有哪些.cpp文件,有哪些文件夹,将原工程内的project.vcxproj文件删除,重新打开sln,发现缺少文件,再将删除的project.vcxproj文件添加回去,发现还是会有同样的问题。 这里提供解决方法: 重新建立一个工程,将原来的.h,.cpp文件拷贝过去重新编译 使用以上方法可以将上述问题解决,但可能会遇到另外一个问题: error C2011: “SomeClass”:“class”类型重定义 我们仔细查看项目,并没有发现SomeClass的两个定义,那么问题来了,怎么会报这样的错误呢 再仔细检查,发现主文件中自己有了一个#include“SomeClass”,其包含的另一个头文件中也#include“SomeClass”,造成了重复包含。我们删去主文件中的#include“SomeClass”,问题得到解决。  

给定一个字符串,找到包含该字符串所有字符的最短子串

这题是豌豆荚二面的一个算法题,和leetcode的某些题目类似。其思路是这样的 首先遍历一次字符串,求出字符串不同字符的数目为每一个字符保存一个列表,记录该字符在字符串中出现的索引记录待求字符串的首字母的索引start(初始值为0),结束索引end(初始值为length-1)记录可能的待求字符串的首字母的索引值为pStart(初始值为0)重新遍历字符串,当前索引为index 更新没有遍历的字符的数目,更新当前字符对应的索引列表。如果pStart处字符对应的列表长度大于1,则从索引列表中移出pStart,并将pStart加1,并重复该过程如果index处字符是第一次出现,则将剩余字符数目减一如果剩余字符数目为0时,且子字符串[pStart:index]比[start:end]短,则更新[start:end]为[pStart:index]返回子字符串[start:end 你会发现[start:end]为待求字符串。可以在纸上画画看 class Solution { String getShortestSubString(String str) { if (str == null || str.length() <= 1) { return str; } // 记录目标字符串的起始索引 int start = 0, end = str.length() - 1; // 记录目标字符串的开始位置 int pStart = 0; Map<Character, List<Integer>> map = new HashMap<Character, List<Integer>>(); for (int index = 0; index < str.length(); index++) { map.put(str.charAt(index), null); } int remainingCharacter = map.keySet().size(); for (int i = 0; i < str.

python任意进制加法

#!/usr/bin/python import sys,time start = sys.argv[1] end = sys.argv[2] size = sys.argv[3] def add(start,end,size): def add1(number,size): number[-1] += 1 if number[-1] == size: del number[-1] if number == []: number.append(1) else: if number[-1] == size - 1: number = add1(number,size) else: number[-1] += 1 number.append(0) return number else: return number start = map(int,start.split("_")) end = map(int,end.split("_")) size = int(size) result_list = [] result_list.append(list(start)) number = start while number != end: number = add1(number,size) result_list.

服务器开启远程桌面控制

最近要将项目做重新的服务器上做项目部署。为了方便维护服务器,故需要开启服务器的远程桌面控制。于是就演示下操作的过程,配上图文,更加直观。 1、首先,打开“服务器管理器”找到里面的“远程桌面”,或者“计算机”--“属性”--“系统”--“远程设置”。然后打开远程桌面的设置面板。一般情况是将“远程协助”打上勾就好了。但是如果是第一次设置,那么就会出现“远程协助”是灰色的,无法打钩: 2、那么接下来先解释下原因,这是因为Windows 2008的安全性很高,默认是没有安装远程协助的控件的。所以需要先安装这个控件。于是具体操作是:“服务器管理器”——“添加功能”,找到“远程服务器管理工具”,然后找到“远程协助”打上勾。 然后“下一步”——“安装”接着等上几分钟。 3、接下来就是执行第一步的操作,这时候就会发现灰色的勾可以打上了。至此,远程协助就已经开启了。 4、那么开启好了远程协助,如何远程连接呢,很简单,首先查看服务器的ip地址。在同一网段的其他PC上开启“远程桌面”,在远程上输入服务器的ip地址便可。

IIS7错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")......

IIS 7访问的时候出现以下异常: 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")...... 解决方案: 因为 IIS 7 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改。 运行命令行 C:\windows\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers 。 其中的 handlers 是错误信息中红字显示的节点名称。 如果modules也被锁定,可以运行 C:\windows\system32\inetsrv\appcmd unlock config -section:system.webServer/modules 注意:cmd.exe要以管理员身份启动,在c:\windows\system32下找到cmd.exe,右键管理员启动,输入上面的命令即可。

ztree 修改数据 默认勾选节点 数据回显

var treeObj = $.fn.zTree.getZTreeObj(treeid); var data = $("#hiddentree"+'${model.objUid}').val(); var datas = data.split(','); var inputtree = ''; var d = ''; for(var i = 0;i<datas.length;i++){ treeObj.checkNode(treeObj.getNodesByParam("id", datas[i],null)[0],true, true); inputtree += treeObj.getNodesByParam("id", datas[i],null)[0].name+","; d = inputtree.substring(0,inputtree.length-1); $("#inputtree"+'${model.objUid}').val(d); } 注:treeid:tree的ID treeObj:tree对象 treeObj.getNodesByParam("id", datas[i],null)[0] 根据键值获取相应的节点,[0]获取第一个object就是你需要的数据节点 treeObj.checkNode(nodes,true,true)checkNode方法根据相应节点,进行勾选 treeObj.getNodesByParam("id", datas[i],null)[0].name 获取节点数据的相应的属性

JNI快速入门手册

快速入门 1. 设置环境变量 windows下配置以下环境变量,以及JAVA的环境变量(不在此列出) PATH C:\MinGW\bin; LIBRARY_PATH C:\MinGW\lib C_INCLUDEDE_PATH C:\MinGW\include CPLUS_INCLUDE_PATH C:\MinGW\include\c++\3.4.2;C:\MinGW\include\c++\3.4.2\mingw32;C:\MinGW\include\c++\3.4.2\backward;C:\MinGW\include Linux下配置以下环境变量,要么配置到/etc/profile 里要么配置到用户目录的.bash_profile里 export JAVA_HOME=/usr/lib/jvm/java-6-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 2. 编写Test.java class Test{ { System.loadLibrary("test"); } public native void display(); public native double sum(double x, double y); public static void main(String[] args){ Test a = new Test(); System.out.println(a.sum(3,5)); a.display(); } } 3. 由Test.java自动生成Test.h $javah Test 注意不用在Test后跟上.java,否则会出错。 有可能报错: error: cannot access Test class file for Test not found javadoc: error - Class Test not found.

//查找,最后一次出现x

//查找,最后一次出现x #include <stdio.h> int main() { int a[10],i,x,k=0; for(i=0;i<=9;i++) scanf("%d",&a[i]); scanf("%d",&x); for(i=9;i>=0;i--) { if(a[i]==x) { printf("%d在该数组中最后一次出现的位置:%d\n",x,i); k++; break; } } if(k==0)printf("NotFound\n"); }

java 中 a++ 和 ++a 的区别

首先,我们在IDE 工具里面编写 代码来看效果 由此可见,a++ 是先运行程序,然后执行+1 而 ++a 是在先+1 ,然后执行程序。

(单片机原理与应用)大液晶屏的游戏设计(推箱子)

中文摘要 设计一款在以51单片机为核心的硬件系统中运行的推箱子游戏。游戏一共9关,功能包括:1、显示游戏开机界面和游戏界面;2、按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,通过小人推动箱子,把箱子推到指定的目的地为过关,箱子只能推不能拉;3、用于可以任意选关,并能随时退出、进入游戏;4、每一关都有时间计时,显示当前玩家的游戏耗时。 关键字:推箱子、51单片机 前言 推箱子是一个来自日本的经典游戏,目的是在训练逻辑思考能力。在一个规定区域中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。本设计利用C语言将推箱子游戏移植到51单片机的硬件系统,选择基于51单片机的推箱子游戏设计作为本次课设的题目。 系统的开发过程 第一节 硬件设计 根据设计目标,整个系统框图如下: 图一:总体设计框图 第一小节AT89C51简介 AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4kbytes的可编程的Flash只读程序存储器,兼容标准8051指令系统及引脚,并集成了 Flash 程序存储器,既可在线编程(ISP),也可用传统方法进行编程,因此,低价位AT89C51单片机可应用于许多高性价比的场合,可灵活应用于各种控制领域,对于简单的测温系统已经足够。单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。芯片AT89C51的引脚排列如图二所示: 图二:AT89C51单片机引脚图 第二小节晶振电路的设计 单片机晶振电路的设计如图三所示。XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。按照理论上AT89C51使用的是12MHz的晶振,但实测使用11.0592MHz。所以设计者通常用的是11.0592MHz。 图三:单片机晶振电路 第三小节游戏显示电路的设计 选用内置T6963C控制控制器的12864图形点阵液晶(以下简称Lcd12864)做为显示模块。 T6963C控制器的最大特点具是有硬件初始值设置功能,显示驱动所需的参数,例如:占空比系数、每行驱动传输的字节数、字符的字体选择等均由引脚电平设置。所以,液晶显示模块在上电时T6963C控制器就进行初始化设置,软件操作的主要精力就可以全部用于显示界面的设计上。 LCD12864和单片机以模拟方式连接,即通过模拟操作时序的方法控制液晶显示。具体的接线图如图四所示: 图四:显示电路设计图 第五小节按键电路的设计 本设计用到的按键不多,故最后选择使用7个轻触按键连接成2*4-1矩阵键盘,作为按键电路,如图五所示: 图五:按键设计电路图 第二节 界面设计 第一小节 Lcd12864显示驱动程序 准备向Lcd12864进行操作时,首先要读取lcd12864的当前的状态,只有lcd12864不忙的时候才能读写操作和数据。相关函数如下: /************************************************** 函数名:status_bit_01() 功能:状态位sta1(读/写指令),sta0(读/写数据)判断 入口参数: 返回值:状态值i ***************************************************/ /********************************************* 函数名:write_data(unsigned char dat) 功能:写数据 入口参数:8位数据dat 返回值: *********************************************/ /********************************************* 函数名:write_cmd1(unsigned char cmd) 功能:写命令,无参数 入口参数:8位命令cmd 返回值: *********************************************/ /********************************************* 函数名:write_cmd2(unsigned char cmd) 功能:写单参数命令 入口参数:8位数据dat,8位命令cmd 返回值: *********************************************/ /************************************************ 函数名:write_cmd3(unsigned char cmd) 功能:写双参数命令 入口参数:8位数据data1,8位数据data2,8位命令cmd 返回值: *************************************************/

(操作系统)模拟操作系统的页面置换

一、 需求分析 设计程序模拟先进先出(FIFO)置换算法,最佳(OPT)置换算法和最近最少用(LRU)置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。 程序的设计主要是测试先进先出FIFO,最佳置换OPT和最近最少用LRU页面置换算法的效率以及过程,对于程序员设计有很多帮助,不同的场合用不同的算法可以提高程序的效率。 二、详细设计 1、数据结构 int a[320];//存放320条指令 int p;//存放页大小 int page[320];//存放合并后要使用的页号 int PageNumber;//存放页号数量 int piece;//存放块数 2、算法流程图 a.先进先出(FIFO)置换算法: b.最近最少用(LRU)置换算法: c.最佳(OPT)置换算法: 三、 软件测试 1、如图一所示,通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成: A:50%的指令是顺序执行的 B:25%的指令是均匀分布在前地址部分 C:25%的指令是均匀分布在后地址部分 具体的实施方法是: A:在[0,319]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1 的指令 C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m' D:顺序执行一条指令,其地址为m'+1 E:在后地址[m'+2,319]中随机选取一条指令并执行 F:重复步骤A-E,直到320 次指令 图1.指令地址 2、如图2所示,页面大小的取值范围为1K,2K,4K,8K,16K。按照页面大小将指令地址转化化为页号。对于相邻相同的页号,合并为一个。 图2.合并后的页地址流 3.选择不同的块数和不同的页面置换算法会得出不同的缺页率,为了方便观察比较,下面选取相同的块数(4块)和不同的页面置换算法,求出缺页率。如图3-a,3-b,3-c所示: 图3-a.最佳置换算法(节选) 三、 总结 本次实验主要用DOS界面实现模拟操作系统的页面置换功能。在本次实验中,没有用到MFC界面,使得实验数据冗长,不过也更能直观反应是否缺页,便于统计。实现先进先出、最近最少用和最佳置换算法时候,一开始的思路都有初始化进入内存块数的页数的函数,后来再次看的时候发现太冗长而且没有这个必要。 附:源程序 //PageReplacement.cpp #include<iostream> #include<time.h> #include<iomanip> #include"FIFO.h" #include"LRU.h" #include"OPT.h" using namespace std; void Random(int a[],int n); int Translate(int a[],int Page[],intn,int p); int main() { inta[320];//存放320条指令

Node.js加密算法库Crypto

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 创业者,程序员(Java,R,Javascript)weibo:@Conan_Zblog: http://blog.fens.meemail: bsspirit@gmail.com 转载请注明出处: http://blog.fens.me/nodejs-crypto/ 前言 密码技术是互联网应用的一项最基本的技术之一,主要保证了数据的安全。安全定义是多维度的,通过不可逆的hash算法可以保证登陆密码的安全;通过非对称的加密算法,可以保证数据存储的安全性;通过数字签名,可以验证数据在传输过程中是否被篡改。 我们要做互联网应用,数据安全性一个是不容忽视的问题。不然可能会造成,如CSDN的100万用户明文密码被泄露事情;携程网,100万用户个人信息泄露事情等。 Node.js的Crypto库就提供各种加密算法,可以非常方便地让我们使用密码技术,解决应用开发中的问题。 目录 Crypto介绍Hash算法Hmac算法加密和解密算法签名和验证算法salt算法程序代码 1. Crypto介绍 Crypto库是随Nodejs内核一起打包发布的,主要提供了加密、解密、签名、验证等功能。Crypto利用OpenSSL库来实现它的加密技术,它提供OpenSSL中的一系列哈希方法,包括hmac、cipher、decipher、签名和验证等方法的封装。 Crypto官方文档:http://nodejs.org/api/crypto.html 2. Hash算法 哈希算法,是指将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。 通常我们对 登陆密码,都是使用Hash算法进行加密,典型的哈希算法包括 ‘md5′,’sha’,’sha1′,’sha256′,’sha512′,’RSA-SHA’。下面我们就做一下算法的测试。 系统环境 Win7 64bitNodejs:v0.10.31Npm:1.4.23 创建项目 ~ cd D:\workspace\javascript> ~ D:\workspace\javascript>mkdir nodejs-crypto && cd nodejs-crypto 新建文件hash.js,打印出所支持的hash算法。 ~ vi hash.js var crypto = require('crypto'); # 加载crypto库 console.log(crypto.getHashes()); # 打印支持的hash算法 运行程序 ~ node hash.js [ 'DSA', 'DSA-SHA', 'DSA-SHA1', 'DSA-SHA1-old', 'RSA-MD4', 'RSA-MD5', 'RSA-MDC2', 'RSA-RIPEMD160', 'RSA-SHA', 'RSA-SHA1', 'RSA-SHA1-2', 'RSA-SHA224', 'RSA-SHA256', 'RSA-SHA384', 'RSA-SHA512', 'dsaEncryption', 'dsaWithSHA', 'dsaWithSHA1', 'dss1', 'ecdsa-with-SHA1', 'md4', 'md4WithRSAEncryption', 'md5', 'md5WithRSAEncryption', 'mdc2', 'mdc2WithRSA', 'ripemd', 'ripemd160', 'ripemd160WithRSA', 'rmd160', 'sha', 'sha1', 'sha1WithRSAEncryption', 'sha224', 'sha224WithRSAEncryption', 'sha256', 'sha256WithRSAEncryption', 'sha384', 'sha384WithRSAEncryption', 'sha512', 'sha512WithRSAEncryption', 'shaWithRSAEncryption', 'ssl2-md5', 'ssl3-md5', 'ssl3-sha1', 'whirlpool' ] 我们看到支持Hash真是不少,究竟怎么选择适合,我也说不清楚。以我对算法的理解,我会以加密计算时间和编码长度,做选择的依据。下面就简单地比较一下几种常见算法。

hive 处理敏感字段

背景: 近日,接到一需求,需要过滤到客户地址(去掉单元楼层等敏感信息),如“××市××区北××路××大厦A座16层”,只提供“××市××区北××路××大厦”。 此类需求,除了通过java程序编写UDF实现,也通过hive原生函数regexp_replace也可以实现。 regexp_replace函数说明: 注意,过滤地址关键点:regexp_replace(address,'正则表达式内容(\\d+号楼|\\d+单元|\\d+号|\\w座|.....)','') 1、正则表达式内容可以根据需求灵活确定; 2、需要使用到转义字符\\; 3、此类需求,也可以参考regexp_extract函数。 实例: SELECT address , regexp_replace(regexp_replace(address,'办公|塔楼|房间|主卧|次卧|左侧|右侧|前面|后面|商铺|厂房|大厅|前台|对面|旁边|部队|分队|侧门|-|。|,|,|',''),'\\d+号楼|\\d+单元|\\d+巷|\\d+号|\\d+旁|\\d+门|\\d+层|\\d+楼|\\d+室|\\d+座|\\d+栋|\\d+幢|\\d+队|\\d+房|\\d+户|\\d+东|\\d+西|\\d+南|\\d+北|\\d+仓|\\d+弄|\\d+副|\\d+附|\\d+组|\\d+班|\\d+年|\\d+处|\\d+院|\\w座|\\w区|\\w\\d+|a-zA-Z|','') FROM table; From:My E-mail share,Hive函数regexp_replace应用分享,2015/2/10 (周二) 15:20

shell脚本学习网站

1、 Shell编程基础 http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80 2、 Shell教程 http://c.biancheng.net/cpp/view/6994.html

mysql set names utf8原理

mysql_query("SET NAMES UTF8"); ,这里 相当于执行了三句: SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8; 这3个变量的作用: 信息输入路径:client→connection→server; 信息输出路径:server→connection→results。 换句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的,破坏性的。 但这里要声明一点,“SET NAMES UTF8”作用只是临时的,MySQL重启后就恢复默认了。 1、数据库采用UTF8 编码,而页面申明编码是GB2312 ,这是最常见的产生乱码的原因。这时候在PHP脚本里面直接SELECT数据出来的就是乱码,需要在查询前先使用: mysql_query("SET NAMES GBK"); 来设定MYSQL连接编码,保证页面申明编码与这里设定的连接编码一致(GBK是GB2312的扩展 )。如果页面是UTF-8 编码的话,可以用: mysql_query("SET NAMES UTF8"); 注意是UTF8而不是一般用的UTF-8。假如页面申明的编码与数据库内部编码一致可以不设定连接编码。 注:事实上MYSQL的数据输入输出比上面讲的更复杂一些,MYSQL配置文件my.ini中定义了2个默认编码,分别是[client]里的 default -character-set和[mysqld] 里的default-character-set 来分别设定默认时候客户端连接和数据库内部所采用的编码。我们上面指定的编码其实是MYSQL客户端连接服务器时候的命令行参数 character_set_client,来告诉MYSQL服务器接受到的客户端数据是什么编码的,而不是采用默认编码。 1. mysql_query(set names **)中** 要与html页面一致; 2. html文件编码要与meta文件编码申明一致

Hive异常:UDFArgumentTypeException No argument is expected

背景: 今日在某集市执行一hivesql,sql没有问题,在数据仓库里执行没有问题。 但是在某集市执行后,一直提示UDFArgumentTypeException No argument is expected,很蛋疼。 其中,这个sql涉及到到row_number()、regexp_replace等函数。 分析: 经sql分段排查,是由于使用到row_number()函数才报错。 由此可判断,如果某个函数udf出问题的话,会报这个异常:UDFArgumentTypeException No argument is expected 解决办法: 重新加载可用的udf包。 将udf包上传到堡垒机(比如路径为: add jar /home/dd_sdm/udf/RowNumberUDF1.jar) hive > add jar /home/dd_sdm/udf/RowNumberUDF1.jar; hive > create temporary function row_number as 'com.example.hive.udf.RowNumberUDF'; hive> your hivesql 以上经历,供参考。

vs.net打包自动检测环境并安装.net framework

vs.net打包或者制作安装程序时进行自动检测环境并安装.net framework的设置方法: 1. 新建一个“安装和部署”的项目; 2. 然后点击“视图”菜单,选择“编辑器”--“文件系统”,然后将要打包的程序以及相关文件添加进来,之后程序将自动检测依赖项; 3. 再次选择“视图”菜单,选择“编辑器”--“启动条件”,打开这个界面后会自动启动条件里一般都会自动添加“.NET Framework”项; 4. 右键点击应用程序名选择“属性”,在弹出的属性页对话框中,点击“系统必备”按钮; 5. 在“请选择要安装的系统必备组件”里把“.NET Framework 2.0”复选框勾上; 6. 在“指定系统必备的安装位置”里选中“从与我应用程序相同的位置下载系统必备组件”,这样就可以保证你下载的.net framwork版本跟自己所做的程序需要的.net framwork版本相同; 7. 确定后再次编译,在debug文件夹下会自动下载并生成“dotnetfx”文件夹,里面有应用程序需要的.net framwork安装程序; 8. 选中第3步的启动条件选项卡,展开“启动条件”文件夹,点击“.NET Framework”,切换到属性管理器中,将其属性“InstallUrl”的值设置为“dotnetfx\dotnetfx.exe”路径即可; 9. 再次编译安装程序就完整的制作出来啦。

数据库查询优化

1 使用SET NOCOUNT ON 选项: 缺省地,每次执行SQL语句时,一个消息会从服务端发给客户端以显示SQL语句影响的行数。这些信息对客户端来说很少有用。通过关闭这个缺省值,你能减少在服务端和客户端的网络流量,帮助全面提升服务器和应用程序的性能。为了关闭存储过程级的这个特点,在每个存储过程的开头包含“SET NOCOUNT ON”语句。 2 正确使用UNION和UNION ALL: 许多人没完全理解UNION和UNION SELECT是怎样工作的,因此,结果浪费了大量不必要的SQLServer资源。当使用UNION时,它相当于在结果集上执行SELECT DISTINCT。换句话说,UNION将联合两个相类似的记录集,然后搜索重复的记录并排除。如果这是你的目的,那么使用UNION是正确的。但如果你使用UNION联合的两个记录集没有重复记录,那么使用UNION会浪费资源,因为它要寻找重复记录,即使你确定它们不存在。 所以如果你知道你要联合的记录集里没有重复,那么你要使用UNION ALL,而不是UNION。UNION ALL联合记录集,但不搜索重复记录,这样减少SQLServer资源的使用,从而提升性能。 3 尽量不用SELECT * : 绝大多数情况下,不要用 * 来代替查询返回的字段列表,用 * 的好处是代码量少、就算是表结构或视图的列发生变化,编写的查询SQL语句也不用变,都返回所有的字段。但数据库服务器在解析时,如果碰到 *,则会先分析表的结构,然后把表的所有字段名再罗列出来。这就增加了分析的时间。 4 慎用SELECT DISTINCT: DISTINCT子句仅在特定功能的时候使用,即从记录集中排除重复记录的时候。这是因为DISTINCT子句先获取结果集然后去重,这样增加SQLServer有用资源的使用。当然,如果你需要去做,那就只有去做了。 当如果你知道SELECT语句将从不返回重复记录,那么使用DISTINCT语句对SQLServer资源不必要的浪费。 5 少用游标: 任何一种游标都会降低SQLServer性能。有些情况不能避免,大多数情况可以避免。所以如果你的应用程序目前正在使用TSQL游标,看看这些代码是否能够重写以避免它们。如果你需要一行一行的执行操作,考虑下边这些选项中的一个或多个来代替游标的使用: 使用临时表 使用WHILE循环 使用派生表 使用相关子查询 使用CASE语句 使用多个查询 上面每一个都能取代游标并且执行更快。 如果你不能避免使用游标,至少试着提高它们的速度,找出加速游标的方法。 6 选择最有效率的表名顺序: SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当SQLSERVER处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;然后扫描第二个表(FROM子句中最后第二个表);最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。 例如: 表 TAB1有 16384 条记录,表 TAB2 有5条记录,选择TAB2作为基础表 (最好的方法): select count(*) from TAB1 a, TAB2 b 选择TAB1作为基础表 (不佳的方法): select count(*) from TAB2 a, TAB1 b

让lager的日志文件按日期滚动起来

lager是一个很强大得日志系统,但是在实际使用的时候发现lager貌似不能在运行后随意的更改错误日志的文件名称。 这是因为lager在为它自己添加event_handler的时候,是直接将日志输出文件名作为handler的名称的一部分输入进去得。 lager:status/0 代码如下 status() -> Handlers = gen_event:which_handlers(lager_event), TraceCount = case length(element(2, lager_config:get(loglevel))) of 0 -> 1; N -> N end, Status = ["Lager status:\n", [begin Level = get_loglevel(Handler), case Handler of {lager_file_backend, File} -> io_lib:format("File ~s at level ~p\n", [File, Level]); lager_console_backend -> io_lib:format("Console at level ~p\n", [Level]); _ -> [] end end || Handler <- Handlers], "Active Traces:\n", [begin LevelName = case Level of {mask, Mask} -> case lager_util:mask_to_levels(Mask) of [] -> none; Levels -> hd(Levels) end; Num -> lager_util:num_to_level(Num) end, io_lib:format("

[DBNETLIB][ConnectionOpen(Invalid Instance())] 无效的连接 的解决办法

Provider=SQLOLEDB.1;Persist SecurityInfo=False;User ID=sa;Data Source=192.168.1.28,1433 连接SQL server 2008 报错: [DBNETLIB][ConnectionOpen (InvalidInstance()).] [DBNETLIB][ConnectionOpen (InvalidInstance()).]无效的连接。 以前写的是: “Provider=SQLOLEDB.1;Persist SecurityInfo=False;User ID=**;PWD=**;Initial Catalog=DatabaseName;DataSource=IP” 解决方法1: 改成 “Provider=SQLOLEDB.1;Persist SecurityInfo=False;User ID=**;PWD=**;Initial Catalog=DatabaseName;DataSource=IP,1433″ 就是把”Data Sourse = IP” 改为”Data Sourse =IP,端口”,就连接正常 解决方法2: 改成 “Provider=SQLOLEDB.1;Persist SecurityInfo=False;User ID=**;PWD=**;Initial Catalog=DatabaseName;DataSource=IP,1433″ 就是把”Data Sourse = IP” 改为”Data Sourse =服务器别名(如localhost\sqlexpress,就是打开SQL Server Management Studio Express时在左侧上端那个名字)”,就连接正常

asp内置函数formatdatetime使用示例代码

asp内置函数formatdatetime使用示例代码 formatdatetime(now(),0) ’则返回2004-10-18 11:45:53 formatdatetime(now(),1) ’则返回2004年10月18日 formatdatetime(now(),2) ’则返回2004-10-18 formatdatetime(now(),3) ’则返回11:47:12 formatdatetime(now(),4) ’则返回11:47 weekDayName(weekDay(date())) 则返回 星期一、星期二等汉字显示。

常用分词方法总结分析

最近对自然语言处理中常见任务的方法做了一下整理总结,并对不同方法做了一些对比分析,资料主要来源于网络以及相关的论文。 1.中文分词 中文句子是由字组成的连续字符串。为了理解中文语义,首先需要将句子划分为以词为基本单位的词串,这就是中文分词。词是最小的能够独立活动的有意义的语言成分,英文单词之间是以空格作为自然分界符的,而汉语是以字为基本的书写单位,词语之间没有明确的区分标记,因此中文分词是中文信息处理的基础和关键。另外,对于词的定义也没有完全明确的一种说法,比较抽象的解释是语言中有意义的能单说或用来造句的最小单位。在1993年作为国家标准公布的《信息处理用现代汉语分词规范》中,文本中的词语被称为“分词单位”,以区别于语言学中更严格的“词”概念。 常用的分词方法主要有:基于字符串匹配的方法、基于规则的方法。 1.1 基于字符串匹配的方法 基于字符串匹配的方法又称为机械分词方法或字典匹配方法,它主要依据词典的信息,而不使用规则知识和统计信息,按照一定的策略将待切分的汉字串与词典中的词条逐一匹配,若在词典中找到该词条,则匹配成功,否则做其它相应的处理。机械分词法依据待切分文本扫描的方向不同,分为正向匹配、逆向匹配以及双向匹配;依据分词过程是否与词性标注过程相结合,又可分为单纯分词方法和分词与标注相结合的一体化方法;依据每次匹配优先考虑长词还是短词,分为最大匹配和最小匹配。常用的基于字符串匹配的分词方法通常是将上述几种单一方法组合起来使用,例如:基于字符串的正向最大匹配、逆向最大匹配、双向最大匹配以及最少切分等。 1.1.1 正向最大匹配分词算法 根据匹配不成功时重新切取的策略区分,机械匹配分词法又分为增字匹配法和减字匹配法。增字法一般与最小匹配相结合,而减字法常与最大匹配相结合。因此正向最大匹配法采用减字匹配法较为常见,其基本思想是:假设己知机器词典中最长词条的长度为N,则以N作为减字开始的长度标准,首先将待扫描的文本串S从左向右截取长度为N的字符串W1,然后在词典中查找是否存在该字符串W1的词条。如果匹配成功,则W1标记为切分出的词,再从待扫描文本串的N+1位置开始扫描;如果匹配失败,将截取长度减1后,再从S中截取此长度的字符串W1’,重复上述匹配过程,直至截取长度为1为止。以扫描完句子作为整个匹配过程结束。其算法流程如图所示,经过这一流程处理后,原本的句子S将被切分成W1W2…Wn的词序列,每一个Wi均为词典中的词条或者是原子。 图1 正向最大匹配流程图 1.1.2 逆向最大匹配分词 逆向最大匹配分词法,其基本思想与正向最大匹配分词法大体一致,只是扫描方向换成了从右至左。换句话说,当扫描汉语句子时,根据词典中最长词条的长度,从句末开始向左截取出汉语字符串与词典中的词条匹配,匹配流程与减字法相同,直至扫描到句首为止。例如,待切分字串为“他说的确实在理”时,正向最大匹配分词法的分词结果为“他/说/的确/实在/理/”,逆向最大匹配分词法的分词结果为“他/说/的/确实/在理/”,根据汉语原意,逆向最大匹配的分词结果是正确的,而正向最大匹配是错误的。据统计结果表明,单纯使用正向最大匹配法的错误率为1/169,单纯使用逆向最大匹配法的错误率为1/245,显然逆向最大匹配分词法较正向最大匹配分词法在切分准确率上有了较大提高,这一结果与汉语中心语偏后有一定的关系。为了节省处理待匹配字符串的时间,逆向最大匹配通常将词典中的词条也组织成逆序,例如“逆向”这一词条,在逆向最大匹配的分词词典中以“向逆”形式存储。 1.1.3 双向最大匹配分词算法 这种分词算法侧重于分词过程中检错和纠错的应用,其基本原理是对待切分字符串采用正向最大匹配和逆向最大匹配分别进行正向和逆向扫描和初步切分,并将正向最大匹配初步切分结果和逆向最大匹配初步切分结果进行比较,如果两组结果一致,则判定分词结果正确,如果存在不一致,则判定存在着切分歧义,需要进一步采取技术手段来消解歧义。 1.1.4最少切分分词算法 该分词算法依据最少切分原则,从几种分词算法切分结果中取切分词数最少一种的。比如,从正向最大匹配和逆向最大匹配两者中选择词数较少的方案,当词数相同时,采取某种策略,选择其中一个。 1.2 基于统计的方法 词是固定的字的组合,在文本中相邻的字同时出现的次数越多越有可能是一个词,因此计算上下文中相邻的字联合出现概率,可以判断字成词的概率。通过对语料中相邻共现的各个字的组合频度进行统计,计算它们的互现信息。互现信息体现了汉字之间结合关系的紧密程度,当紧密程度高于某一个阈值时,可判定该字组构成一个词。这种方法的优点是不受待处理文本领域的限制,不需要专门的词典。统计分词以概率论为理论基础,将汉字上下文中汉字组合串的出现抽象成随机过程,随机过程的参数可以通过大规模语料库训练得到。基于统计的分词采用的原理有互信息、N元统计模型以及其它的统计模型如隐马尔科夫模型、条件随机场模型、神经网络模型及最大熵模型等。 1.2.1互信息原理 互信息算法的主要思想是对于字符串x和字符串y,使用公式计算其互信息值P(x,y),用值的大小判断x和y之间的结合程度。公式如下。 (1) 其中P(x,y)为字符串x和y共现的频率,p(x)和p(y)分别是字符串x和y出现的频率。 当P(x,y)>0时,表示x和y之间具有较高的相关关系,并且互信息值P(x,y)越大,相关性就越强。当其值超过某一预设的阈值时可以判定为一个词。 当P(x,y)=0时,表示x和y之间的关系不明确。 当P(x,y)<0时,表示x与y负相关,基本不会组成一个词。 1.2.2 N元统计模型 N元统计模型的主要思想是:一个单词的出现与其上下文环境中出现的单词序列密切相关,第n个词的出现只与前面n-1个词相关,而与其它任何词都不相关。即假定语言满足马尔科夫性,可表示为: (2) 假设句子S由w1w2…wn组成且满足马尔科夫性,那么句子S出现的概率可以通过联合概率公式计算成: (3) 根据阶数N在模型中取值不同,N元语法统计模型的名称也有所不同,如N=2称为bigram模型,N=3称为trigram模型。从理论上来说,随着N取值增加,模型越能发映出语言的内在结构,精度也就越高,但是计算参数与语料训练集的规模也要相应增大,因此在实际应用中一般取N为2、3、4较为合适。 以此类推,N元模型就是假设当前词的出现概率只同它前面的N-1个词有关而得出的。 在式(3)中,条件概率表示在词串出现的情况下wi出现的概率。在大规模语料库训练的基础上,根据大数定律,最大似然估计值可计算为: (4) 其中,表示词序列在训练语料中同时出现的次数。以bigram模型为例,具体说明如何应用该统计模型解决分词中的问题。根据式(3)、(4)可得: (5) 对句子S进行全切分法进行分词,根据式(5)计算每一种分词结果的概率,选择最优结果,即求出概率P(S)的极大值,这一过程可表示为: (6) 在实际计算中,为防止机器误将很小的概率值当做零来处理,通常采用负对数处理的方式将问题转化为求极小值问题,具体公式表示为: (7) 1.3 基于字符串匹配的分词方法和基于统计的分词方法对比 字符串匹配方法算法简单,易于理解和实现,并且切分速度较快,成为分词方法中最流行的。因为字典匹配的方法不考虑具体的语言环境和定义,最大的缺点就是不能处理多词冲突和新词情况,严重依赖于词表。单纯采用字符串匹配的方法不能满足中文信息处理对分词结果准确度的要求。 基于统计的方法能够较好的切分歧义和识别新词,目前受到了研究者越来越多的重视。不受待处理文本的领域限制,不需要特定的词典,能够有效的自动排出歧义,较好的识别未登录词。缺点是需要大量的训练文本用于建立统计模型的参数,方法的计算量较大,对于常用词的识别精度差,且分词精度和训练文本的选择有关,会存在一些共现频度高但是并不是词的常用字组。

matlab 画图中线型及颜色设置 matlab 作图 标注

matlab受到控制界广泛接受的一个重要原因是因为它提供了方便的绘图功能.本章主要介绍2维图形对象的生成函数及图形控制函数的使用方 法,还将简单地介绍一些图形的修饰与标注函数及操作和控制MATLAB各种图形对象的方法. 第一节 图形窗口与坐标系 一.图形窗口 1.MATLAB在图形窗口中绘制或输出图形,因此图形窗口就像一张绘图纸. 2.在MATLAB下,每一个图形窗口有唯一的一个序号h,称为该图形窗口的句柄.MATLAB通过管理图形窗口的句柄来管理图形窗口; 3.当前窗口句柄可以由MATLAB函数gcf获得; 4.在任何时刻,只有唯一的一个窗口是当前的图形 窗口(活跃窗口);figure(h)----将句柄为h的窗口设置为当前窗口; 5.打开图形窗口的方法有三种: 1)调用 绘图函数时自动打开; 2)用File---New---Figure新建; 3)figure命令打开,close命令关 闭. 在运行绘图程序前若已打开图形窗口,则绘图函数不再打开,而直接利用已打开的图形窗口;若运行程序前已存在多个图形窗 口,并且没有指定哪个窗口为当前窗口时,则以最后使用过的窗口为当前窗口输出图形. 6.窗口中的图形打印:用图形窗口的File菜单中 的Print项. 7.可以在图形窗口中设置图形对象的参数.具体方法是在图形窗口的Edit菜单中选择Properties项,打开图 形对象的参数设置窗口,可以设置对象的属性. 二.坐标系 1.一个图形必须有其定位系统,即坐标系; 2.在一个图形 窗口中可以有多个坐标系,但只有一个当前的坐标系; 3.每个坐标系都有唯一的标识符,即句柄值; 4.当前坐标系句柄可以由 MATLAB函数gca获得; 5.使某个句柄标识的坐标系成为当前坐标系,可用如下函数:axes(h) h为指定坐标系句柄值. 6.一些有关坐标轴的函数: 1)定义坐标范围:一般MATLAB自动定义坐标范 围,如用户认为设定的不合适,可:axis([Xmin, Xmax, Ymin, Ymax]) 来重新设定;292) 坐标轴控制:MATLAB的缺省方式是在绘图时,将所在的坐标系也画出来,为隐去坐标系,可用axis off;axis on则显示坐标轴(缺省值). 3)通常MATLAB的坐标系是长方形,长宽比例大约是 4:3,为了得到一个正方形的坐标系可用:axis square 4)坐标系横纵轴的比例是自动设置的,比例可能不一样,要得到相同比 例的坐标系,可用:axis equal 第二节 二维图形的绘制 一. plot函数 plot 函数是最基本的绘图函数,其基本的调用格式为: 1.plot(y)------绘制向量y对应于其元素序数的二维曲线图, 如果y为复数向量,则绘制虚部对于实部的二维曲线图. 例:绘制单矢量曲线图. y=[0 0.6 2.3 5 8.3 11.7 15 17.7 19.4 20]; plot(y) 由于y矢量有10个元素,x坐标自动定义为[1 2 3 4 5 6 7 8 9 10].

.Net 获取文件的CRC32标识

public class FileToCRC32 { private static UInt32[] Crc32Table = { 0x00000000,0x77073096,0xEE0E612C,0x990951BA, 0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3, 0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988, 0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91, 0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE, 0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7, 0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5, 0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172, 0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B, 0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940, 0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59, 0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116, 0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924, 0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D, 0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A, 0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433, 0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818, 0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01, 0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457, 0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C, 0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65, 0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2, 0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB, 0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0, 0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086, 0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F, 0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4, 0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD, 0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A, 0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683, 0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1, 0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE, 0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7, 0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC, 0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5, 0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252, 0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60, 0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79, 0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236, 0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F, 0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04, 0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D, 0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713, 0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38, 0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21, 0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E, 0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777, 0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C, 0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2, 0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB, 0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0, 0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9, 0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6, 0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF, 0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D}; /// <summary> /// 获取文件的CRC32标识 /// </summary> /// <param name="

关于 .Net中文件拖放的问题

今日需要做个功能,就是客户直接拖动文件到winForm界面上,然后显示文件内容。 其实这个功能点就是 获取拖动文件的路径即可。 一般都是需设置三个地方: 1、接受文件的控件的 AllowDrop 属性设置为 true。 2、接受文件的控件加上 DragDrop 事件。 this.dgv_openJsonFile1.Cursor = System.Windows.Forms.Cursors.Default; if(!e.Data.GetDataPresent(DataFormats.FileDrop)) { return; } var path = e.Data.GetData(DataFormats.FileDrop) as string[]; if(path != null && path.Length > 0) { var jsonPath = path[0]; if(!string.IsNullOrEmpty(jsonPath)) { // TODO:jsonPath 及文件的路径。。。 } } 3、接受文件的控件加上 DragEnter事件。 if(e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effect = DragDropEffects.Link; this.dgv_openJsonFile1.Cursor = System.Windows.Forms.Cursors.Arrow; } else { e.Effect = DragDropEffects.None; } 只需以上三个即可 可是我却搞了很久没搞出来。 知道最后才知道,原来是因为 权限问题: 因为不同权限提升级别的程序之间无法共享拖放消息。您可以做一个简单的实验。用管理员运行记事本,然后从 Windows 资源管理器拖 TXT 文件进去,可以发现文件根本不会打开。因为 Windows Explorer 的权限提升级别为 InvokeAsUser,而不是 RequireAdministrator。 同样级别的权限提升账户运行的程序可以 Share 拖放。 如果不涉及到系统的资源,如拖文件。自己程序内的拖动与 UAC 的级别无关。 我的原因是因为我以管理员身份运行了VS···去掉以管理员身份运行,及正常。

安卓开发中Theme.AppCompat.Light的解决方法

styles.xml中<style name="AppBaseTheme" parent="Theme.AppCompat.Light">提示如下错误,这是版本问题。 error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'. 解决方法: 在Eclipse中打开任意一个.java文件,输入 android.R.style. 这时你会看到一个提示列表,仔细看看,再对比一下,看哪个与原有的最接近就选择哪个。用将下划线替换成"."就可了。 将 <style name="AppBaseTheme" parent="Theme.AppCompat.Light"> 改为 <style name="AppBaseTheme" parent="android:Theme.Light"> 同理,将 <style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 改为 <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">

03-LoadRunner常见问题及实现

1. 常见问题 1.1. 日志查看 1) 打开扩展日志,勾选runtimesettings--->log-->always send messages和extendedlog; 2) 使用lr_output_message,lr_error_message,lr_log_message函数打印日志; 3) 查看mdrv.log和output.txt文件。 1.2. 造成HTTP-500错误 1) 运行的用户数过多,对服务器造成的压力过大,服务器无法响应,则报HTTP500错误。减小用户数或者场景持续时间; 2) 该做关联的地方没有去做关联,则报HTTP500错误。进行手工或者自动关联; 3) 录制时请求的页面、图片等,在回放的时候服务器找不到,则报HTTP500错误,若该页面无关紧要,则可以在脚本中注释掉; 4) 参数化时的取值有问题,则报HTTP500错误。可将参数化列表中的数值,拿到实际应用系统中进行测试,可排除问题; 5) 更换了应用服务器(中间件的更换,如tomcat、websphere、jboss等),还是利用原先录制的脚本去运行,则很可能报HTTP500错误。因为各种应用服务器处理的机制不一样,所录制的脚本也不一样,解决办法只有重新录制脚本; 6) Windows xp2 与ISS组件不兼容,则有可能导致HTTP500错误。对ISS组件进行调整后问题解决; 1.3. 解决数据库查询结果过大,导致录制失败 c:\windows或者c:\winnt目录下寻找vugen.ini文件,修改 [SQLOracleInspector] CmdSize=100000 (C:\ProgramFiles\HP\LoadRunner\config) LR默认查询的数据大小为:55000,如果你一次性查询数据超过此范围的话,你可以修改此选项 其中不同协议的数据修改节为: ODBC - [ODBCInspector] Ctlib - [SQLCTLibInspector] Dblib - [SQLDBLibInspector] Informix - [SQLInspector] DB2 - [DB2CLIInspector] 1.4. 将connect()中的密文改为明文 修改vugen.ini文件中 [LRDCodeGeneration] AutoPasswordEncryption=OFF 1.5. 添加并运用附加变量 通过选择【Rum-timeSetting】>【General】>【Additional attributes】项,添加需要的参数 代码如下: Action() { LPCSTRhost; host= lr_get_attrib_string("hostname"); lr_output_message("附加变量:%s",host); return0; }

jquery中如何以逗号分割字符串

javascript本身就是带split方法的 定义和用法 split() 方法用于把一个字符串分割成字符串数组。 语法 stringObject.split(separator,howmany) 参数 描述 separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。 howmany 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。 返回值 一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 separator 自身。 但是,如果 separator 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。 <script> var str=new String(); var arr=new Array(); str="ddd,dsd,3,dd,g,k"; arr=str.split(',');//注split可以用字符或字符串分割 for(var i=0;i<arr.length;i++) { alter(arr[i]); } </script>

[Silverlight]解决Silverlight无法…

在Silverlight开发过程中,经常时不时的会碰到Silverlight无法调试的问题。我就遇到下面几种情况: 1. Web Application+Silverlight,F5进入调试状态之后无法跟进Silverlight程序中下的断点 2. 项目中有两个Silverlight工程,其中一个Silverlight程序中有一个鼠标点击事件会将当前页面导航到另外一个Silverlight程序的承载页面。第一个Silverlight程序断点正常,但是第二个Silverlight程序中的断点不能自动停下来 3. 无论是在TestPage模式下调试还是在Web工程上调试,只要打开了Silverlight调试开关,那么启动的时候会提示“Unable to start debugging. Cannot locate Microsoft Internet Explorer”。如果你是直接Ctrl+F5运行,有时候也会出现一样的问题。 单个Silverlight工程无法调试 对于第一个问题,请检查如下设置是否正确: 1. 确认启用了Silverlight调试。双击Asp.Net工程中的属性文件夹打开属性设置页,找到Web一栏,在此页卡的最下面有几个调试选项,如下图所示: 确认最后一项“Silverlight”之前的勾是勾上的。 2. 确保浏览器访问的Xap包是最新的。检查IE是否已经清除了缓存,或者ClientBin中的Xap因为某些原因没能更新(如因配置管理导致无法覆盖) 3. 检查Asp.Net工程是否绑定了Silverlight应用。可以通过asp.net工程的属性面板中的Silverlight Application页卡查看是否绑定成功。如下: 4. 检查Silverlight工程的StartupObject是否设置正确。有时候我们对工程的命名空间进行重命名,会导致Silverlight应用程序的入口对象失效,从而导致无法启动等情况。 IE8下无法同时调试多个Silverlight工程?! IE8和以往的IE不大一样,它的多标签是采用多进程的方式来实现的。整个窗口是一个框架进程,每个Tab标签页是一个独立的子进程(实际上,IE8会根据内存动态控制Tab进程的数目,因此多个标签页可能会共存于同一个进程之中)。当你尝试在多个标签页中打开不同的Silverlight应用程序时,例如从SilverlightApplication1中打开新页面到SilverlightApplication2页面,这个时候你会发现,SilverlightApplication2应用程序无法调试。 这是因为,Visual Studio除了启动窗口进程之外,不会自动帮我们Attach其他的包含Silverlight应用程序的进程,如果我们需要在多个标签页(或者多个窗口)中同时调试不同的Silverlight应用程序,那么我们必须自己手动Attach这些进程。 举个简单的例子,我有两个Silverlight工程,其中SilverlightApplication1中包含链接指向SilverlightApplication2页面,点击链接会在新标签页中打开SilverlightApplication2的承载页面。 为了Attach相应的进程,首先我们需要找到SilverlightApplication2承载页面对应的进程。打开ProcessExplorer,我们可以看到三个进程。 其中的ID为4528的是父进程,也就是框架进程,用于管理不同的标签进程之间的通信等事务。5160和5248分别对应着两个标签页进程。至于哪个对应哪个我们在这里无法根据进程号确定。 我们再打开Visual Studio中的Attach窗口(菜单=>Debug=>Attach to process…) 这里列出了所有系统可用的进程清单,我们可以看到三个IE进程,其中一个是灰色的,这表示了这个进程已经被Attach到Visual Studio的调试器上了。排除了框架进程4258外,就剩下5248这个进程了,这个进程就是我们要找的SilverlightApplication2对应的承载页面的进程了。选中之后Attach到调试器上,我们发现,SilverlightApplication2中的断点还是显示为空心红圈,依然无法调试。 这是因为我们指定的进程代码类型不正确。我们注意到,上图中最上面有一个Attach to,后面显示的是Automatic,这个代表着Visual Studio的调试器会自动帮我们选择进程的调试类型,例如是托管代码调试,还是脚本调试,等等。我们选中5248这个进程,发现Visual Studio给我们选择的方式是脚本调试。 在Visual Studio中,脚本调试和Silverlight调试是不能共存的,这也就是为什么有时候你按下F5的时候,Visual Studio会提示你,调试Silverlight程序会暂时关闭脚本调试的功能。因此在脚本调试下,我们无法跟进Silverlight应用程序的断点。 这里额外说一点,IE8高级选项中的禁用脚本调试设置对Visual Studio一点影响都没有,因为Visual Studio 2008在调试器启动的时候会自动启用脚本调试(可以通过注册表禁用此特性),除非在Web Application属性中打开了Silverlight调试。 回到刚才的问题,由于Visual Studio帮我们自动选择的调试类型有误,导致我们无法调试SilverlightApplication2,因此我们需要手动指定Attach类型。点击Attach to后侧的select按钮。 在弹出的选择代码类型窗口中勾选上Silverlight。确定之后再次Attach,我们发现,这一次,断点真的起作用了。 当然,如果这种方式比较麻烦的话,我们也可以通过改变IE8的Tab进程创建方式来让不同标签页共存于一个进程中。在注册表HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main下面有一个TabProcGrowth键值(DWORD类型),当其设置为0时, IE框架和Tab工作在一个进程里面,Tab采用线程的方式创建,同时IE的保护模式(Protect Mode)会关闭。TabProcGrowth=1时IE框架和Tab工作在不同的进程里面。TabProcGrowth>1时,此值将决定IE8最多创建的Tab进程数目。如果TabProcGrowth 不存在,则会根据可用的物理内存数量决定Tab进程的数量。 调试时无法打开IE窗口的问题 这个问题是我最近才遇到的,我也不知道为什么突然之间,我的Silverlight工程按下F5的时候无法调试,弹出下面这个对话框:Unable to start debugging. Cannot locate Microsoft Internet Explorer.

Discuz!X3.2学习笔记(一)

最近要做一个论坛,找了一个比较成熟的模板Discuz!X3.2。 几天下来见识了这个论坛功能的庞大,也学习了功能强大的后台管理。但是终究还是需要对discuz进行二次开发满足功能需求。 针对discuz!X3.2初级的学习,发现还是那样,开始不爱听,后续听不懂。那怎么办呢?写篇笔记来督促自己的学习深度和进度。 安装注意: 1数据库前缀名要写一个复杂一点的名称,建立用户,并创建用户数据库。 2discuz!X安装完成后要尽量删除安装文件,安装根目录下的install目录。 3后台管理入口文件名要修改。 discuz!X程序的卸载 1删除discuz!x目录 2discuz!x数据库删除 3discuz!数据库账号删除 完成了前面的基本搭建过程之后,可能需要的修改主要包括两个方面: 一个是对于风格的修改 另外一个是对界面内容的修改。 界面风格 内容修改 如果相对discuz!X进行开发的时候,为了保证以后升级的过程中不会因为之前的修改对升级造成影响,要尽量不要在原来的文件目录中直接进行修改。 系统开发的三种状态: 文件 config/config_global.php 变量 $_config['plugindeveloper'] 状态 NULL 不开启插件开发模式,不开启嵌入点 1开启插件开发模式,不开启嵌入点 2开启插件开发模式,开启嵌入点。 按照需求设置上面的参数值之后,进入相应的开发模式。 要成为一个网站开发的全栈工程师,需要掌握的知识主要包括以下几门语言: 1 HTML现在已经是html5.0,支持了音视频的标签,已经不用再安装flash插件。 2 DIV+CSS,css层叠样式表 3 php 4 js 5 sql 哎……看起来也是很麻烦的样子,最好是便查看网站源代码边进行学习。 Discuz!X3.2学习笔记(二) http://blog.csdn.net/codectq/article/details/42499911

一个多线程程序挂起问题解决

文章出处:http://www.dbafree.net/?p=1128 N个线程,做同样的事,跑的一直好好的,突然某个线程就挂住了。于是使用 ps -eLf|grep name查看了线程相关的PID,并对其进行了strace.如下: $ strace -p 13251 Process 13251 attached - interrupt to quit futex(0x1fcc500, FUTEX_WAIT_PRIVATE, 0, NULL 发现其一直hang在futex-FUTEX_WAIT_PRIVATE这里,可以看到futex一直在wait状态,长时间被挂起,就好象睡觉睡着了,没有人叫他起床。 我们的程序代码如下: while 1: #操作线程共享变量: #1.操作一个线程安全的队列 if(queue.size>0): queue.get() #2.操作线程不安全的hash结构,不过N个线程操作的key都是各不同的 #操作方式为hash{线程名}=xxx)。 hash{thread_name}=xxx 开始有点怀疑这个hash字典,因为非线程安全的,不过strace看到的是一个futex,那么应该和它关系不大,而跟线程安全的queue有更大的关系。因为futex可以对它进行保护。 于是先了解futex相关的情况,下面这段解释很清楚: Futex是一种用户态和内核态混合的同步机制。首先,同步的进程间通过mmap共享一段内存,futex变量就位于这段共享 的内存中且操作是原子的,当进程尝试进入互斥区或者退出互斥区的时候,先去查看共享内存中的futex变量,如果没有竞争发生,则只修改futex,而不 用再执行系统调用了。当通过访问futex变量告诉进程有竞争发生,则还是得执行系统调用去完成相应的处理(wait 或者 wake up)。简单的说,futex就是通过在用户态的检查,(motivation)如果了解到没有竞争就不用陷入内核了,大大提高了low-contention时候的效率。 FUTEX_WAIT: 原子性的检查uaddr中计数器的值是否为val,如果是则让进程休眠,直到FUTEX_WAKE或者超时(time-out)。也就是把进程挂到uaddr相对应的等待队列上去。 futex这个方法,有timeout等参数,如果不加timeout参数,它会一直被阻塞,直到FUTEX_WAKE int futex (int *uaddr, int op, int val, const struct timespec *timeout,int *uaddr2, int val3); 所以基本确认,挂起是由于futex没有被唤醒的原因导致的。 if(queue.size()>0 #在多线程并发情况,执行下面这步get操作的时候,可能队列是空的,此时get()方法会阻塞 queue.get() 而我在另一个线程里面,如果执行了queue.put(),那么应该是可以唤醒get()的,难道程序会这么笨? 于是检查了下我的put方法,发现我其实不是一个真正的put.代码如下: for 1..1000 tmpqueue.put(xx) #因为queue并没有真正的put,而是直接指向了一个新对象,所以不能唤醒get. queue=tmpqueue 找到了原因,问题就好解决了。当然因为程序设计上面的问题,我不能修改put的情况,于是,我修改get()方法,增加timeout参数。问题解决。 if(queue.

AD导入之后器件变绿的问题

导入之后器件变绿的问题 元件出现绿色是DRC规则检查出错的警告颜色,如果元件没有问题就要考虑是不是DRC规则检查设置问题,一般可能大家经常碰到的是元件距离问题导致的,大多情况是规则没有设置好,具体方法为: 设计>规则,将Silk screenOvercomponetPads和SilkToSilkClearance两个选项取消即可。 也可以直接按T,M忽略规则。 还有一种可能就是ad有个room,其作用是限制你的器件再一个区域内,不用可以删掉,否则也会出现这样的问题。 也有可能是之前已导入过一次,然后将所有的器件双删掉了,又从原理图中导了一次,所以变绿了,这种问题从规则设置里也可以解决,或者是从新建立PCB,再次导入之后也可以。

我们可能会遇到的距离量算方法

在看空间统计相关的文档资料的时候,看到了几个有关距离丈量方法的术语词汇,诸如:欧式距离、曼哈顿距离、切比雪夫距离…… 老外习惯于使用名字来命名算法,可是对于门外汉们,是一种困惑,今天就整理下,一起温故知新。 1. 欧式距离(Euclidean Distance) 欧式距离是我们在直角坐标系中最常用的距离量算方法,例如小时候学的“两点之间的最短距离是连接两点的直线距离。”这就是典型的欧式距离量算方法。 通常这这个距离的获取是基于我们熟悉的“勾股定理”,解算三角形斜边得到的。 看看维基百科:http://en.wikipedia.org/wiki/Euclidean_distance 2. 曼哈顿距离(Manhattan Distance) 曼哈顿距离是与欧式距离不同的一种丈量方法,两点之间的距离不再是直线距离,而是投影到坐标轴的长度之和。 还是看图吧,图比文字更显见。 图中绿色的线为欧式距离的丈量长度,红色的线即为曼哈顿距离长度,蓝色和黄色的线是这两点间曼哈顿距离的等价长度。 想想我们下象棋的时候,车炮兵之类的,是不是要走曼哈顿距离? 如果不会下象棋,没关系,看下面的例子: 在美国道路会像这样是很多的规则的网格状,从A到B通常无法去沿直线行走,而是会避开建筑物,走几个街区到达。 图中蓝色的线即为曼哈顿距离的典型应用场景。 看看维基百科:http://en.wikipedia.org/wiki/Taxicab_geometry 3. 切比雪夫距离(Chebyshev distance) 数学上,切比雪夫距离是将2个点之间的距离定义为其各坐标数值差的最大值。 网上搜索,好多有关这个距离的解释,大多都是采用国际象棋中的王的走步来作为例子,王可以前后左右走,还可以斜前斜后走,一共8个方向可以认为距离均等。 也就是在下面3×3邻域内,中心网格的中心点到8个邻域网格中心点的距离相等。 看看维基百科:http://en.wikipedia.org/wiki/Chebyshev_distance

UseCase事件流描述规范

文/fasiondog 整理需求用例的编写规范,分享部分UseCase事件流描述规范。其中,准则5~10、12来自《编写有效用例》([美] Alistair Cockburn 著)一书,其它为自身实践和要求。 事件流包含正常事件流、可选事件流、异常事件流程,前述三者合在一起的本质就是用文字描述的流程。事件流由文字描述的步骤组成,写作过程中应遵循以下准则,这些准则是对用例写作过程中的常见问题和最佳实践的总结。下述规范中如没有特殊说明,事件流同时指正常事件流、可选事件流、异常事件流。 准则1:文字描述与流程图保持一致 事件流的本质其实就是文本描述的流程。因此,对用例辅以说明的流程图应与文字表述的事件流保持一致。事实上,用例是以文字描述为主,流程图为辅。编写用例应该养成“先写文字后画图”的习惯。保持一致意味着: 流程图中的动作(含判断)的数量与事件流中的步骤数量一致(由于不同的图形表示方法的限制,最低程度应保证和正常事件流中的步骤数量一致)流程图中的动作(含判断)与事件流中的步骤描述一致 准则2:步骤描述遵循“主+谓+宾”结构 句子的结构应简单明了:“主语+谓语动词+直接宾语”,辅以必要的修饰词。 准则3:一个步骤描述中仅包含一个主语 在一个步骤中仅包含一个主语,这意味着一个步骤描述中可以是一个执行者执行一个动作,也可以是一个执行者执行多个连贯的动作,但不能出现多个执行者执行多个不同的任务。例如: 错误的描述形式: 1.【用户】输入订购号码,【系统】发现这个号码与本月中奖号码匹配,将用户和订购号码注册为当月的中奖者,发电子邮件给销售经理,祝贺客户,并告诉他们如何领取奖金 正确的描述形式1: 1.【用户】输入订购号码。 2.【系统】发现这个号码与本月中奖号码匹配,将用户和订购号码注册为当月的中奖者,发电子邮件给销售经理,祝贺客户,并告诉他们如何领取奖金。 正确的描述形式2: 1.【用户】输入订购号码。 2.【系统】发现这个号码与本月的中奖号码匹配。 3.【系统】将用户和订购号码注册为当月的中奖者。 4.【系统】发电子邮件给销售经理。 5.【系统】祝贺客户,并告诉他们如何领取奖金。 在编写用例时,可以根据此准则,对较冗长的多个步骤进行合理的合并。所谓合理,是指合并后的步骤,应不影响可选事件流、异常事件流的插入点。 准则4:在步骤中明确标识参与人 通过在步骤中使用“【参与人】”的方式明确标识“参与人(Actor)”,防止因遗漏主语(以及部分宾语),而使读者不知道谁是活动的执行者。示例: “【用户】插入ATM卡并输入PIN。” 准则5:从系统外部的角度来编写用例 缺少经验的用例编写者(尤其是对系统内部实现有所了解的开发人员)在描述用例场景时,经常有意或无意实现系统内部结构并试图从系统内部动作来描述系统。他们可能写出这样的句子“读取ATM卡和PIN号码,并从账户余额中扣除一定数量。” 而从系统外部来编写用例,则是: 1.【用户】插入ATM卡并输入PIN号码; 2.【系统】从账户余额中扣除一定数量。 准则6:显示过程向前推移 选择过小的步骤将导致用例过长。如果一个用例有13~17个步骤,说明每一个步骤完成的工作过少。如果将一些小的步骤合并,可以使用例的可读性更好、更清晰,并且保持原有的基本信息。一般,一个用例的步骤数量应控制在7个以内。 为了有效合并用例步骤,应找到具有较高层次目标的步骤。可以提出这样的问题“为什么参与人需要做这件事?”。可能,需要多次询问此问题才能得到满意的答案,而这个问题的答案就是步骤实现的目标。以下是一个通过问“为什么”来提高目标层次的例子。 “用户按下Tab键” 为什么用户要按下Tab键?是为了将焦点移到地址框中。为什么她要将焦点移到地址框中呢?因为在系统开始工作前,她要输入用户名和地址。她想让系统完成一些工作,为了使系统工作,她必须输入她的用户名和地址。 因此,一个清晰描述过程向前移动的主动语态句子是: “【用户】输入名字和地址” 准则7:显示参与人的意图而不是动作 通过操纵用户界面来描述用户的动作,这是编写用例时常见的一种严重错误,它使得编写的目标处于一个很低的层次。界面细节描述使得需求文档质量变差,主要体现在: 文档冗长拖沓使阅读困难、维护费用高昂。任何用户界面的变化都将导致用例文档失效 通常情况下,当一些连续步骤的数据在同一方向上运动时,可以将这些步骤合并成一个步骤(视情况而定,合理合并)。如下面的示例及对它的修改: 修改前: 1.【系统】要求用户输入姓名 2.【用户】输入姓名 3.【系统】要求用户输入地址 4.【用户】输入地址 5.【用户】点击“确定” 6.【系统】显示用户的简介 修改后: 1.【用户】输入姓名与地址 2.【系统】显示用户的简介 准则8:“确认”而不是“检查是否” 大家经常会遇到描述系统检查某个条件的步骤。而在步骤描述中,使用“检查”这个动词并不好,这样说并没有让过程明显的向前发展,它并不是真正的目的,同时它使得检查的结果是不确定的。那么为什么系统要检查条件?答案是为了确认、验证或确保某些事情。这些都是很好的可以表示目标的动词。例如,可以将“系统检查密码是否正确”替换为: “【系统】验证密码正确” 准则9:习惯用语:“用户让系统A与系统B交互” 在编写用例时,可能会遇到如下情况,正在设计的系统A需要从系统B中获取信息,或者与系统B有一个交互过程。通常可以使用两个步骤来描述: 1.【用户】通知【系统A】从【系统B】获取数据 2.【系统A】从【系统B】获取后台数据。 上述写法虽然可以接受,但在某些情况下显得笨拙和冗余,尤其是用例比较复杂时。更好的写法如下: 1.【用户】命令【系统A】从【系统B】获取后台数据 准则10:习惯用语:“循环执行步骤X到Y,直到条件满足” 有时候,我们会遇到需要重复的步骤。对于只有一个步骤需要重复,可以直接在步骤中描述,如:“【用户】在各种各样的产品目录中寻找、直到发现所需要的产品。” 对于多个步骤需要重复的情况,可以把表达重复执行的语句放在这些重复步骤的前面或后面。例如: 1.【客户】提供账号或名字和地址 2.【系统】查出客户的爱好信息 3.【客户】选择一个商品,并做上购买的标记 4.

Jxl导出Excel(跨行、设置列宽、设置行高、自动对齐、自定义背景等)

package com.exl.test; import java.awt.Color; import java.io.File; import jxl.CellView; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Colour; import jxl.format.UnderlineStyle; import jxl.write.Label; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import com.exl.utils.ColourUtil; public class Test { public static void main(String[] args) throws Exception { String title="报表测试"; String[] navTitle= {"第一行","第二行","第三行","第四行","第五行","第六行","第七行","第八行"}; String[][] content={ {"1","2","第naionfdapfn三行","第四niaodnfoanfdas行","第noandfoasnjdf五行","第六sdfadsafas行","第afdadfasdfs七a行","第adfasfdasf八行"}, {"2","2","第三行","第四行","第五行","第六行","第七行","sssssssssss第八sss行"}, {"3","2","第三行","第四行","第五行","第六行","第七行","第八行sssssssssssss"}, {"4","2","第三行","第四行","第sssssssssssssss五行","第ssssssssssssssssssss六行","第七行","第八行sssssssss"}, {"5","2","第三行","第ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd四行","第五行","第六行","第七行","第八行"}, {"6","2","第三行","第四行","第五行","第六行","第七行","第八行"}, {"7","2","第三行","第四ddddddddddddddddddddddddddddddd行","第五行","第六行","第七行","第八行"}, {"8","2","第三行","第四行","第五行","第六行","第七行","第八行"}, {"9","2","第三行","第ddddddddddddddddddddddddddddddd四行","第五行","第六行","第七行","第八行"}, {"10","2","第三行","第四行","第五行","第六行","第七行","第八行"}, {"11","2","第三行","第四行","第五行","第六dddddddddddddd行","第七行","第八行"}, {"12","2","第三行","第四行","第五行","第六行","第七行","第八行"}, {"13","2","第三行","第四行","第五行","dddddddddddddddddddddd第六行","第七行","第八行"}, {"14","2","第三行","第四行","第五行","第dddddddddddddddddddddd六行","第七行","第八行"}, }; String filePath="D:\\DesignSource\\tempT"; String fileName="NewProject.xls"; File dir=new File(filePath); if(!

word中段落里面的选项“如果定义了文档网格,则对齐到网格”起什么作用?

上面这张图片大家都不陌生吧,但相信很多朋友都不知道“文档网格”的作用。我最近在调整论文格式时就被这个所谓的“文档网格”给搞惨啦! 出现的问题是:我完全按照论文的模板地使用了相同的段落设置,也就是段前段后间距还有行距,完完全全与论文模板一致。但是,怎么看感觉都跟模板的格式有点不协调。古意人的论文标题比较长占据了两行,但是特别让我感到疑惑的是,无论怎么调整行间距,论文标题两行之间都有很大的行距。模板的标题也是两行,行距是“单倍行距”,两行之间就离得很近。我的设置跟模板一模一样,但是标题的第一行跟第二行就是隔得很开,这到底是怎么回事呢? 百度谷歌了好久,没有找到解决办法,因为这个问题很难用简短的语言来描述。古意人认为是模板和我的论文可能有哪些设置上的不同,于是到处点一点论文的设置与模板的设置进行对比。终于让我找到问题的关键所在了:文档网格。 看到上面这张图了吗?在页面设置里面有这样一个“网格”选项。模板里面是“无网格”,而我的论文里面是“只指定行网格”,这样一来,虽然我们在段落里面的设置都是一样的,但是模板是“无网格”,所以段落选项里勾选了“如果定义了文档网格……”就没起作用了! 问题解决后,我们都很想问一个问题:网格到底是个什么玩意儿??? 所谓网格,就好比是我们用方格稿纸写字,按格子每格一个字。网格就好比是隐藏在页面里的横竖格子,一般的人不大注意,但如果你要按你的目的排一页的行数和每行字数时就发挥作用了。 如果是无网格,页面的字间距和行高就按默认的排列。如果你要用5号字,每页25行,每行30字,你就会发现要达到目的很麻烦。这时如果你选了“指定行和字符网格”的话,只要在下面的字体中选上你现在用的字“5号”,再在“行”中设定25,在“字符”中设定“30”,这时网格就会按你的要求将页面划成 25×30的网格(当然是看不出的),这样很快就达到你设定的效果。 行网格规定了一页内能分几行,行与行之间是1倍行距。字符网格规定了一行里有几个字符,字符间距为字体的标准间距。

js去除文本中的html标签

引入:考虑到文本是从富编辑器中取到的数据,有时候我们可能不需要显示格式,这时候需要去除html标签,而只需要其中的文本即可。 方式一:利用innerText,jQuery利用text() innerText会自动剔除html标签 <span class='content_hidden' style="display:none">${info.content}</span> <div class="fixed3" id="content_div" style="height:auto;"> 简 介:<span id="content_body"></span> </div>然后通过js设置值: $("#content_body").text($(".content_hidden").text()); 方式二:利用正则表达式删除html标签: function delHtmlTag(str){ return str.replace(/<[^>]+>/g,"");//去掉所有的html标记 } $("#content_body").text(delHtmlTag("${info.content}")); 等....

【BZOJ】3053: The Closest M Points(kdtree)

http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ。。。。 没看到有多组数据啊。。。。。斯巴达!!!!!!!!!!!!!!!!! 本题裸的kdtree,比上一题还要简单。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 对于当前点,判断进入左或右子树,然后看答案是否能过分割线。。如果能,进入右或左子树。。。。。。。。。并且如果答案个数小于k,也要进入。。 然后就浪吧。。。。。。。。。。。 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> #include <set> #include <map> using namespace std; typedef long long ll; #define rep(i, n) for(int i=0; i<(n); ++i) #define for1(i,a,n) for(int i=(a);i<=(n);++i) #define for2(i,a,n) for(int i=(a);i<(n);++i) #define for3(i,a,n) for(int i=(a);i>=(n);--i) #define for4(i,a,n) for(int i=(a);i>(n);--i) #define CC(i,a) memset(i,a,sizeof(i)) #define read(a) a=getint() #define print(a) printf("%d", a) #define dbg(x) cout << (#x) << "

maven hadoop2.x库依赖

2.2.0 替换成自己相应版本 <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-common</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>2.2.0</version> </dependency> </dependencies>

chr码值对应列表大全

Chr("0") 为0的字符 Chr("1") Chr("2") Chr("3") Chr("4") Chr("5") Chr("6") Chr("7") 响铃 Chr("8") 回格 Chr("9") tab(水平制表符) Chr("10") 换行 Chr("11") tab(垂直制表符) Chr("12") 换页 Chr("13") 回车 chr(13)&chr(10) 回车和换行的组合 Chr("14") Chr("15") Chr("16") Chr("17") Chr("18") Chr("19") Chr("20") Chr("21") Chr("22") Chr("23") Chr("24") Chr("25") Chr("26") 结束 End Chr("27") 脱离 Pause break Chr("28") Chr("29") Chr("30") Chr("31") Chr("32") 空格 SPACE Chr("33") ! Chr("34") " Chr("35") # Chr("36") $ Chr("37") % Chr("38") & Chr("39") ’ Chr("40") ( Chr("41") ) Chr("42") * Chr("

C币帮助文档

目录 什么是C币 C币有什么用 C币声明 什么是C币 C币是CSDN推出的虚拟货币。 C币有什么用 1. 官方赠送的C币有效期为一年(到账后一年内),购买的C币不过期。C币到期后我们有权单方处置该等到期的C币,包括但不限于取消相应C币、使C币失效等; 2. 使用C币购买下载频道内资源,需要扣除相应的C币数量。自下载之日起30日内重复下载同一资源免费,30日后再次下载需要扣除相应的C币数量; 3. 用户可以直接使用C币下载站内资源等。 C币声明 1. 购买的C币套餐或获得的C币一经使用,概不支持退款或返现。 2. C币的获得均需在CSDN站内完成,通过任何第三方平台或软件获得C币均属于非正当途径,并极有可能造成您的信息泄露。如经过查证,确认用户通过非法途径获得C币,我们将冻结其CSDN帐户并取消所获得全部C币。 为维护社区准则,营建良好的社区氛围,避免您的信息安全与社区资产受到损失,我们建议您通过正规渠道(CSDN站内)获得CSDN C币。