配置SVN服务器开机自启动

启动SVN服务器有两种方式:

1.第一种手动输入cmd命令,svn服务端软件服务的启动可以通过cmd命令来启动,定位到subversion的安装目录,我的机器是C:\Program Files\Subversion\bin, 输入命令 svnserve –d –r D:\Repositories,其中D:\Repositories是svn版本库的目录。

第二种把subversion的服务添加到windows服务,作为开机自动启动的服务,同样可以通过cmd命令来完成。打开DOS窗口,进入System32目录下,输入如下命令:
sc create svnserve binPath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service --root D:\Repositories" displayname= "SVN Serve" depend= Tcpip start= auto

其中,sc是windows自带的服务配置程序,参数binPath表示svnserve可执行文件的安装路径,由于路径中的"Program Files"带有空格,因此整个路径需要用双引号引起来。而双引号本身是个特殊字符,需要进行转义,因此在路径前后的两个双引号都需要写成\"

--service参数表示以windows服务的形式运行,--root指明svn repository的位置,service参数与root参数都作为binPath的一部分,因此与svnserve.exe的路径一起被包含在一对双引号当中,而这对双引号不需要进行转义。

displayname表示在windows服务列表中显示的名字, depend =Tcpip 表示svnserve服务的运行需要tcpip服务,start=auto表示开机后自动运行。

 

安装服务后,svnserve要等下次开机时才会自动运行。如果创建完服务后不想重启,就继续在命令行下输入

net start svnserve

若要停止svn服务,在命令行输入:

net stop svnserve

若要卸载svn服务,则执行

sc delete svnserve 

java 删除文件夹

用Java的File类删除文件夹时发现,如果文件夹下有其他文件则此文件夹无法删除,需要递归的删除。

	public void deleteFile(File fileDir)
	{	
		if(fileDir.exists())
		{
			if(fileDir.isFile())
			{
				fileDir.delete();
			}
			else if(fileDir.isDirectory())
			{
				for(File file : fileDir.listFiles())
				{
					this.deleteFile(file);
				}
				fileDir.delete();
			}
		}
		else
		{
			System.err.println("directory does not exist!");
		}
	}

Java 读取 doc docx pdf rtf txt html 文件文本内容

最近需要解析用户上传文档的文本内容,自己没有搜到很好的资料,在http://scturtle.is-programmer.com/的介绍下,找到了一些参考资料,于是很快的完成了基本文件格式的解析。下面把资料的链接跟代码地址附上

1.MS doc/docx/Excel/Powerpoint/...

解析微软的office文件有Apache的POI类库支持,只是doc/docx的工作还在完善之中,所以解析出来的格式不是很精确,比如图片部分不能完全去除掉会在解析得到的文本中留下部分乱码。

REF: http://poi.apache.org/

2.pdf

解析pdf文件有Apache pdfBox类库的支持,解析效果还不错。

REF:http://pdfbox.apache.org/

3. html

解析html有很强大的工具htmlParser, 无需保存网页文件,只需给一个网页链接,就可以得到html文件中的文本内容,而且可以自动过滤很多无用标签,很是强大。

REF: http://htmlparser.sourceforge.net/

REF: http://perfectlife.iteye.com/blog/366084

4 rtf

解析rtf有javax类库的支持,只需import javax.swing.text.rtf.RTFEditorKit;就能解决问题

5. txt

这个就无需解析了,直接读取文件的文本内容就行了。

其他的参考资料(未找到原文,所以文中提供的dll链接库无法下载,可以直接下载github上的代码)

REF: http://blog.sina.com.cn/s/blog_622bd1660100rk1r.html

REF: http://apps.hi.baidu.com/share/detail/16966435

代码在gitHub的下载地址: https://github.com/jia1546/content-extraction

PageRank on undirected and weighted graph

最近需要用PageRank算法实现无向带权图节点的ranking,具体的PageRank算法介绍可以参考维基百科http://en.wikipedia.org/wiki/Pagerank

最初的PageRank算法是针对有向图的,迭代方程为:$PR(P_{i}) = \frac{1-d}{n}+d \sum_{p_{j}\in M(p_{i})} \frac{PR(p_{j})}{L(p_{j})}$,其中$PR(p_{i})$是顶点$p_{i}$的PageRank值,$L(p_{j})$是顶点$p_{j}$的出度。

在无向带权图中,改进迭代方程:$PR(P_{i}) = \frac{1-d}{n}+d \sum_{p_{j}\in M(p_{i})} \frac{weight(p_{j}) \times PR(p_{j})}{degree(p_{j})}$ 其中$weight(p_{j})$是边$(p_{i}, p_{j})$的权重,$degree(p_{j})$是顶点$p_{j}$的度数。

在实际迭代计算式,选择好的数据结构很重要,上面迭代公式中主要的计算就是边$(p_{i}, p_{j})$的权重与顶点$p_{j}$的度数。使用Map<String, ArrayList<MapEntry>> 来表示边(node1, <node2, weight>),这样计算权重与度数是都很方便。

实现代码与测试数据可在github上下载:https://github.com/jia1546/PageRank

FitNesse测试之Script table

script table 主要用于检测软件的行为是否正确,比如模拟用户登录过程,堆栈操作过程等等。

script table 的格式是:

第一行关键字Script + 测试类的名字 表明这是一个script table

以后的每一行都对应类中的一个行为,并且可以加上关键字check, ensure, reject, show, start 等等来检测行为是否正确执行。这些关键字的含义见:http://fitnesse.org/FitNesse.UserGuide.SliM.ScriptTable 这里主要用到check, check关键字位于第一列,后面是带有返回值的函数,最后是期望输出的值。如果两者相等则此列标识为绿色,否则为红色。

这次的作业是检测 Java 1.7中双端队列(Double Ended Queue)中栈的实现是否正确,所谓双端队列就是可以从队列两端进行元素的插入和删除,如果从一端插入,从另一端删除,则是队列,从同一端删除则是栈。用script table 来检测栈的四种行为:instantiate, push(e), pop(), peek(),同时检查栈是否是LIFO的

用于生成script table的代码为:

!define TEST_SYSTEM {slim}
 
!path /home/jia1546/workspace/Test/bin

!define COLLAPSE_SETUP {true}
!define COLLAPSE_TEARDOWN {true}
 
|import|
|c0403 |

!|Script    |StackMethodTests |
|instantiateMyStack           |
|pushMyStack|1                |
|check      |countOfElements|1|
|check      |peekMyStack    |1|
|check      |peekMyStack    |1|
|check      |popMyStack     |1|
|check      |countOfElements|0|

!|Script    |StackMethodTests|
|instantiateMyStack          |
|pushMyStack|1               |
|pushMyStack|2               |
|pushMyStack|3               |
|check      |popMyStack  |3  |
|check      |popMyStack  |2  |
|check      |popMyStack  |1  |

生成的script table为:

对应测试类的代码为:

package c0403;
import java.util.ArrayDeque;
import java.util.Deque;
import java.math.*;

public class StackMethodTests {
	private int num;
	private Deque<Integer> theStack;
	final int SCALE = 1000;		//define the range of the random integer
	final int TIMES = 100;		//define the times used in Different-But-Equivalent technique
	
	public void instantiateMyStack(){
		//theStack = StaticStack.myStack;
		theStack = new ArrayDeque<Integer>();
	}
	
	public void pushMyStack(int num){
		theStack.addFirst(num);
	}
	
	public int popMyStack(){
		return theStack.removeFirst();
	}
	
	public int peekMyStack(){
		return theStack.peekFirst(); 
	}
	
	public int countOfElements(){
		return theStack.size();
	}
	
	/*
	 * push 100 elements and then pop those 100 elements
	 */
	public void pushThenPop(){
		for(int i=0; i<TIMES; i++){
			int n = (int)(Math.random() * SCALE);
			this.pushMyStack(n);
		}
		for(int i=0; i<TIMES; i++){
				this.popMyStack();
		}
	}
	
	/*
	 * push and pop a random element 100 times
	 */
	public void pushAndPop(){
		for(int i=0; i<TIMES; i++){
			int n = (int)(Math.random() * SCALE);
			this.pushMyStack(n);
			this.popMyStack();
		}
	}
}

测试结果为:

PS: 最近的deadline太多了,接下来是有关performance test的测试工具JMemter的话题。

初识FitNesse

FitNesse是一个开源测试框架,主要用于接受测试,也就是比对开发软件实际输出与期望输出是否相同。FitNesse最大的特点在于本身是一个简单的web sever, 在项目初设计测试用例时,可以通过编写网页的形式来展示,这样极大方便非编程人员的测试工作。

下面通过一个最简单的例子---Decision Table Test来验证除法运算正确性,讲述FitNesse的使用方法及工作原理

1. 下载及安装FitNesse可参考:http://fitnesse.org/FitNesse.UserGuide.DownloadingAndInstallingFitNesse

2. 编写web page, 设计测试用例

这里测试用例采用判定表的形式,前面几列对应输入,也就是对应测试类中的Set方法,最后一列对应输出,对应需要测试类中的计算。网页中编写代码为:

!define TEST_SYSTEM {slim}

!path /home/jia1546/workspace/Test/bin

!|c0403.Division                |
|numerator|denominator|quotient?|
|10       |2          |5.0      |
|12.6     |3          |4.2      |
|100      |4          |25.0     |

第一行:使用FitNesse的slim模块,也就是使用网页的形式描述测试用例

第二行:测试类**.class所在的路径

表名:测试类的名称,c0403 package下的Division这个类

表头:numerator, denominator 对应类中的setNumerator(), setDeniminator()这两个方法,quotient对应double quotient()这个方法,注意quotient后面有个问号,说明这个方法是有返回值的。

保存后对应的网页:

下面是测试类的代码

package c0403;
import fit.ColumnFixture;

public class Division extends ColumnFixture{
	private double numerator;
	private double denominator;
	
	public void setNumerator(double numerator) {
		this.numerator = numerator;
	}
	public void setDenominator(double denominator) {
		this.denominator = denominator;
	}
	
	public double quotient(){
		return numerator / denominator;
	}
}

点Test按钮则开始测试,测试结果如下:

测试用例中的绿色显示结果正确。

到这里你也许猜出了这个测试工具的工作原理了吧,Slim根据网页中的classpath去调用测试类,将测试用例的输入给测试类中对应的set方法,然后slim将程序中对应方法的实际输出跟测试用例的期望输出相比较,如果相同,则测试用例通过。那如何将HTML中表单的值正确解析并输入到程序中呢,注意到程序中的import跟extend,这就告诉测试类该如何处理获得的表单数据。

Java Scanner 中next() 与nextLine()的区别

最近写程序,把Scanner next() 与 nextLine()混合使用时很容易出错,还是先了解下它们的区别吧。

关键在于:next() 方法遇见第一个有效字符(非空格,换行符)时,开始扫描,当遇见第一个分隔符或结束符(空格或换行符)时,结束扫描。这时使用nextLine(),继续读,有可能读入第一个字符是空格或换行符。

这篇文章的例子描述得很清楚。解析Scanner之next与nextLine区别.pdf

Java 文件IO编码

在处理Java文件IO是经常会出现编码问题,在输入输出流中指定文件编码即可

BufferedReader input = null;
InputStreamReader reader=new InputStreamReader(new FileInputStream(input_fileName),"gb2312"); 
input = new BufferedReader(reader);

PrintWriter output = new PrintWriter(output_fileName,"gb2312");
input_fileName = "E:/extract/"+((Integer)i).toString()+".txt";

 

重定向Java输出

   程序中时用第三方接口,我希望将程序结果输出到字符串中,这样可以嵌入到网页中,但是接口的函数中固定输出到终端,试了n种方法,包括jar文件的反编译,修改其中的class文件,在打包,但是这样会出现各种问题,在无奈之余,在网上搜到一篇文章http://zhouzaibao.javaeye.com/blog/338113,重定向printStackTree到字符串,正是我所需要的

  1.  StringWriter sw = new StringWriter();  
  2.  PrintWriter pw = new PrintWriter(sw);  
  3.  ex.printStackTrace(pw);  
  4.  return sw.toString();  

轻松解决了问题!