关于jquery中callback函数的使用

今天在做一个网站开发的过程中遇到了一个小问题,解决之后,发现这应该是很多学习jquery的新手朋友们会遇到的问题,故在这里记录一下。

基本需求和实现要点:这是一个购物网站,在用户点击“收藏店铺”或者“收藏商品”之后,用ajax把数据传递给后台进行处理,后台返回一个值给html,再由html根据返回的值,在页面上用一个模态框显示信息,随后模态框淡出。

在这里,为了简化问题,我们暂时不谈后台的处理。

似乎看上去,对模态框,用一个fadeout方法来处理就可以了,但是事实上,用户可能会进行连续多次的点击收藏,此时模态框就不一定能正确显示和淡出了。为此,我们自然而然的得到另外一种方案,就是在模态框淡出之后,删除该模态框元素,待下次再点击,再创建这个元素。

于是顺着这个思路,我犯了一个错误。

我在jquery中写了这么三句代码

$(document.body).append('<div id="top_alert">'+text+'</div>');
$('#top_alert').fadeOut(3000);  
$('#top_alert').remove();

按照往常编程的逻辑思维,元素fadeOut之后,被删除。而事实上,按照上面的写法,我们是看不到fadeOut的效果的,因为在我们还没看到效果,下面的remove已经起作用了,即元素已经被删除。

这里就是我们新手经常会犯的错误之一。

事实上,jquery给我们提供了callback函数这种机制,就是用来解决这个问题的。

我们常常看到一些jquery函数会有callback这个参数,比如

$(selector).fadeOut(speed,callback);

这里fadeOut方法的第二个参数callback,就是一个回调函数,意思就是说,在fadeOut 函数执行完之后,会执行callback函数。

回到刚开始的问题,此时就很明朗了。我只需要把$(‘#top_alert’).remove();这一句写进callback函数里面就行了。具体实现如下:

$(document.body).append('<div id="top_alert">'+text+'</div>');
$('#top_alert').fadeOut(3000,function(){
$('#top_alert').remove();

这样就可以不出错的实现该效果了。

如何使用中科院分词系统(java版)

做数据挖掘,分词是很重要、很基础的一个环节。单独实现一个分词系统并不是一件简单的事情,特别是对于中文而言。好在中科院已经有一套开源的分词系统NLPIR,我们可以直接拿来使用,很方便。下面我就记录一下基于java怎么使用这套系统。

首先看一下关于分词系统的简介

NLPIR汉语分词系统(又名ICTCLAS2013),主要功能包括中文分词;词性标注;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码。新增微博分词、新词发现与关键词提取;张华平博士先后倾力打造十余年,内核升级10次。

我们首先到官网的下载页面:http://ictclas.nlpir.org/downloads

下载第一个“NLPIR/ICTCLAS2015分词系统下载包”即可,如下图

中科院分词系统

下载之后,解压缩。

进入子目录下的sample文件夹,你会看到有各种示例,我们要用的是java的示例,即“JnaTest_NLPIR”,如下图:

分词系统java示例

打开eclipse,import这个工程,过程就不再赘述了。

import之后,这时候你去跑,是会报错的。

java报错

其实,我们需要改几个地方。

1.回到刚才解压的下载包,进入目录下的lib文件夹,选择你机器对应的版本,比如我是win32的,我就复制win32这个文件夹,粘贴到eclipse工程和src同级目录下,此时工作目录应是如图所示:

添加win32文件夹

2.修改第一行的代码,将NLPIR文件的路径更改为现在的路径,如下:

// 定义并初始化接口的静态变量
CLibrary Instance = (CLibrary) Native.loadLibrary(
       "./win32/NLPIR", CLibrary.class);

3.回到解压的文件夹目录下,复制“data”文件夹到eclipse的工程里,最终工程目录结构如下:

最终目录结构

4.更改主函数的第一行代码里面的路径,默认是这样:

String argu = "D:\\NLPIR";

更改为:

String argu = "./";

即工作路径。

最终代码如下:

package code;

import java.io.UnsupportedEncodingException;

import utils.SystemParas;

import com.sun.jna.Library;
import com.sun.jna.Native;

public class NlpirTest {

	// 定义接口CLibrary,继承自com.sun.jna.Library
	public interface CLibrary extends Library {
		// 定义并初始化接口的静态变量
		CLibrary Instance = (CLibrary) Native.loadLibrary(
				"./win32/NLPIR", CLibrary.class);

		public int NLPIR_Init(String sDataPath, int encoding,
				String sLicenceCode);

		public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);

		public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
				boolean bWeightOut);
		public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,
				boolean bWeightOut);
		public int NLPIR_AddUserWord(String sWord);//add by qp 2008.11.10
		public int NLPIR_DelUsrWord(String sWord);//add by qp 2008.11.10
		public String NLPIR_GetLastErrorMsg();
		public void NLPIR_Exit();
	}

	public static String transString(String aidString, String ori_encoding,
			String new_encoding) {
		try {
			return new String(aidString.getBytes(ori_encoding), new_encoding);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) throws Exception {
		String argu = "./";
		// String system_charset = "GBK";//GBK----0
		String system_charset = "UTF-8";
		int charset_type = 1;

		int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
		String nativeBytes = null;

		if (0 == init_flag) {
			nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
			System.err.println("初始化失败!fail reason is "+nativeBytes);
			return;
		}

		String sInput = "据悉,质检总局已将最新有关情况再次通报美方,要求美方加强对输华玉米的产地来源、运输及仓储等环节的管控措施,有效避免输华玉米被未经我国农业部安全评估并批准的转基因品系污染。";

		//String nativeBytes = null;
		try {
			nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);

			System.out.println("分词结果为: " + nativeBytes);

			CLibrary.Instance.NLPIR_AddUserWord("要求美方加强对输 n");
			CLibrary.Instance.NLPIR_AddUserWord("华玉米的产地来源 n");
			nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
			System.out.println("增加用户词典后分词结果为: " + nativeBytes);

			CLibrary.Instance.NLPIR_DelUsrWord("要求美方加强对输");
			nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
			System.out.println("删除用户词典后分词结果为: " + nativeBytes);

			int nCountKey = 0;
			String nativeByte = CLibrary.Instance.NLPIR_GetKeyWords(sInput, 10,false);

			System.out.print("关键词提取结果是:" + nativeByte);

			nativeByte = CLibrary.Instance.NLPIR_GetFileKeyWords("D:\\NLPIR\\feedback\\huawei\\5341\\5341\\产经广场\\2012\\5\\16766.txt", 10,false);

			System.out.print("关键词提取结果是:" + nativeByte);

			CLibrary.Instance.NLPIR_Exit();

		} catch (Exception ex) {
			// TODO Auto-generated catch block
			ex.printStackTrace();
		}

	}
}

运行结果如下(截图不完全,请以你的eclipse的输出为准):

中科院分词系统运行结果

 

至此,一个例子就跑起来了。我稍微解释一下。

1.关于结果

分词的结果,是每个词语后面再跟一个斜杠,斜杠后面是词性,关于词性,可以参看刚才下载解压的文件目录下的“doc”文件夹里的文档。这里不做解释了。

当然,你也可以选择不要显示词性,只需将

CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);

中第二个参数改为0即可。

2.关于方法的调用

这套分词系统里面有丰富的功能,这个可以参看“doc”文件夹里面的文档,那里均有说明,由于使用了JNA,我们可以很方便的使用相关的c++方法。

要使用这些功能,我们需要在代码的接口中声明这些方法,如:

public interface CLibrary extends Library {
		// 定义并初始化接口的静态变量
		CLibrary Instance = (CLibrary) Native.loadLibrary(
				"./win32/NLPIR", CLibrary.class);

		public int NLPIR_Init(String sDataPath, int encoding,
				String sLicenceCode);

		public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);

		public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
				boolean bWeightOut);
		public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,
				boolean bWeightOut);
		public int NLPIR_AddUserWord(String sWord);//add by qp 2008.11.10
		public int NLPIR_DelUsrWord(String sWord);//add by qp 2008.11.10
		public String NLPIR_GetLastErrorMsg();
		public void NLPIR_Exit();
	}

声明之后,就可以在主函数里面调用了。具体的调用细节、参数设定等,还是那句话,看文档!

就先写到这里,再次感慨中科院的分词系统的厉害!

使用wordpress代码高亮插件

考虑到这是一个半技术性的博客,代码不可少,那么代码高亮就更必不可少了。好在wordpress是个强大的博客系统,很多问题都可以通过插件方便的解决。而之前看到关于代码高亮的一款JavaScript 库SyntaxHighlighter,搜了一下,果然有相关的wordpress插件,叫做SyntaxHighlighter Evolved。

插件安装过程就不再赘述了,去搜索SyntaxHighlighter Evolved安装即可,支持最新版的wordpress。

怎么使用呢?来个例子。比如我要显示一段html的代码,那么我们可以直接编辑代码:

SyntaxHighlighter代码用法

我们看一下具体的效果:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>PHP Code Example</title>
</head>
<body>
    <h1>PHP Code Example</h1>

    <p><?php echo 'Hello World!'; ?></p>

    <p>This line is highlighted.</p>

    <div class="foobar">
        This    is  an
        example of  smart
        tabs.
    </div>

    <p><a href="http://wordpress.org/">WordPress</a></p>
</body>
</html>

效果似乎还不错,在手机上测试了一下,同样可以正常显示。需要提到的一点是,多行代码高亮显示,只需要在行号之间用英文逗号隔开即可,像上面的例子,我就是加了highlight=”3,5″这一个参数。

同时,插件还支持各种风格的代码显示,几乎所有主流编程语言都能显示,详细设置的话直接在“wordpress后台–设置–SyntaxHighlighter”中进行更改即可。更高级的功能,一般都很少用上,这里就不多说了。有时间的朋友,还可以自定义css,把代码的显示弄的有个人特色一点。

另,找到一篇很详细介绍这个插件使用的文章,供大家参考:http://www.diguage.com/archives/59.html

java中怎么在数组里面存放数组

今天在用java写程序的时候,遇到一个问题,怎么在数组里面里面存放数组呢?

如你所知,在java里面声明一个数组是这样的:

String arr[]或者int arr[]等等,即要声明其数据类型,String arr[]代表数组里面要存放字符串,而int arr[]代表数组里面要存放整型数,依次类推。

那我想在数组里面存放数组该怎么办?百度了一下,发现竟然没什么人遇到这个问题。后来我才发现,应该是我死脑筋了。动手了一番,得以解决。如下:

其实java中有许多的数据结构可以供给我们直接使用,如map,list,set,对于我这个问题而言,直接用一个List就额可以解决了。

首先导入一个包

 import java.util.ArrayList;

随后声明初始化一个ArrayList即可,如:

ArrayList<String[]> test = new ArrayList();

这个ArrayList的意思是,里面的每一个元素都是String数组,这样,我们就相当于在数组里面存放了数组,而ArrayList是动态数组,自然是比数组更加容易使用且功能更加强大的了。加入数据直接使用add方法,取出数据直接使用get方法,很方便。

那怎么遍历它呢?

很直观的,我们可以用两个for循环嵌套:

for(String[] str : test)
    for(String str1 : str)
        System.out.println(str1);

当然你使用变量或者Iterator来循环也是没问题的。详情百度之,这里就不多介绍了。