xshell Error: Unable to initialize gtk, is DISPLAY set properly?

下午想通过ssh连接服务器节点使用VTune,结果显示错误:xshell Error: Unable to initialize gtk, is DISPLAY set properly?

折腾了好长时间才解决,因此记录下做备忘。

排查错误的步骤:

1、检查服务器端是否允许X11Forwarding(/etc/ssh/sshd_config文件中“X11Forwarding=yes”);

2、检查$DISPLAY是否为本机的IP地址;

3、检查XShell是否允许X11Forwarding(http://www.netsarang.com/tutorial/xshell/1018/Using_X11_forwarding)。

latex表格

latex中使用表格(tabular)并且需要对表格添加标题(caption)以便进行引用时,一般需要将表格放在table环境下。但此时表格在文档中的位置会受到多种因素的影响而浮动,不太方便控制。而单独使用tabular时表格会放置在当前位置。那可不可以仅使用tabular表格,同时添加标题呢?

capt-of宏包可以解决这个问题,具体用法是:

先在导言区添加宏包:\usepackage{capt-of},然后

\begin{center}
  \captionof{table}{Caption text goes here}
  \label{table1} % for use in \ref{table1} if you want to refer to the table number
  \begin{tabular}{|c|c|c|c|c|c|}
  % etc.
  \end{tabular}
\end{center}

参考文献:http://stackoverflow.com/questions/803463/caption-outside-table

mbti职业性格分析

MBTI是目前国际上最为流行的职业人格评估工具,它的理论基础是著名心理学家卡尔·荣格先生关于心理类型的划分,后来经过一对母女Katharine Cook Briggs 与Isabel Briggs Myers 研究并加以发展。

这种理论可以帮助解释为什么不同的人对不同的事物感兴趣、擅长不同的工作、并且有时不能互相理解。这个工具已经在世界上运用了将近30 年的时间,夫妻利用它增进融洽、老师学生利用它提高学习、授课效率,青年人利用它选择职业,组织利用它改善人际关系、团队沟通、组织建设、组织诊断等多个方面。在世界五百强中,有80%的企业有MBTI 的应用经验。

MBTI人格共有四个维度,每个维度有两个方向,分别是:

  • 外向(E)与内向(I)
  • 感觉(S)和直觉(N)
  • 思考(T)和情感(F)
  • 判断(J)和直觉(P)

每个人的性格都落于四个维度每一种中点的这一边或那一边,比如落在外向的那一边则说明测试者有外向的“偏好”,如果落在内向的那一边,则说明测试者有内向“偏好”。四个维度,两两组合,共有十六种性格类型。四个维度在每个人身上会有不同的比重,不同的比重会导致不同的表现,关键在于各个维度上的人均指数和相对指数的大小。

REF:http://baike.baidu.com/view/3062806.htm

MBTI在线测试与分析:

分析结果中会有“气质类型”、“性格潜在优略势”、“适于从事的工作”,这些都有助于我们更好地了解自己。

如何做学术报告

这学期写了各种课程报告,也做了各种学术报告,于是有了这篇总结报告经验的文章。首先介绍基本内容,这部分引自中科大安虹老师的课件。

一个优秀的学术报告在内容上应包括如下部分:

背景介绍

  • 报告包括的内容
  • 研究问题的重要性
  • 理解报告所需的辅助信息(重要的术语,思想,观点)

问题陈述

  • 详细叙述想要解决的问题

研究方法

  • 针对研究问题,提出的解决方法
  • 论述这种方法的优点
  • 已有的解决方法

实验结果

  • 实验环境配置
  • 介绍每一个实验需要衡量或证明什么
  • 实验结果展示
  • 介绍期望的结果
  • 对比实际结果与期望结果,并解释出现的差异

结论

  • 总结实验结果
  • 论证结果的重要性
  • 论述结果存在的缺点
  • 论述未来工作

个人觉得“研究问题的重要性”与“实验环境配置”在报告中必须包括。没有重要性后面的介绍也就没有应用点,没有实验环境的介绍,取得再好的实验结果也没有说服力。

在组织好报告的内容之后,需要借助幻灯片来做展示,在制作ppt时要注意的两个要点是:

  • 每一页的文字内容尽可能少
  • 可以通过图、表、动画等表现方式来阐述自己的方法和结论

在完成ppt的制作后,就是报告环节了,这里有一些小建议:

  • 从练习中获取反馈(可以使用排练计时估计报告时间)
  • 每一页ppt讲解的时间大约为两分钟(学术报告一般为20min.所以10-12页差不多)
  • 预留答疑时间

在内容组织上,这篇报告是一个很好的例子:学术报告示例.pdf

人生如戏,全靠演技。介绍报告技巧的相关文章:

http://pages.cs.wisc.edu/~markhill/conference-talk.html

http://www-psych.stanford.edu/~lera/howtogiveatalk.htm

MindManage——记录你的思维

向大家推荐一款软件,MindManage(思维导图)。在准备报告,阅读文献或者撰写论文的时候,我们需要理清思路,列好提纲,使用Word或者Power Point时总是不能让想法很直观的表现出来,特别是有时候我们容易忘记一些很好的想法。这时,MindManager就派上用场了。先给大家看看我写读书报告时绘制的思维导图:

根据上述提纲写报告,思路就清晰多了。有的时候也可以把这个提纲放到ppt中,在报告之前先让大家对你即将讲述的内容的结构有一个很直观的了解。

下面介绍软件的使用方法。MindManager的使用非常简单,只需要记住三个键,Enter、Insert与Delete。Enter键插入同一级标题,Insert插入下一级标题,而Delete的作用就很明显了。掌握着三个键就能满足日常的使用需求了,其他的功能与Office软件中的功能类似,大家自己去尝试吧。

PS:在学校的同学可以使用IPV6下载到软件的破解版,完整的使用教程网上也有很多。

社交网络行为与用户性格

现代心理学认为人的性格可以用五种不同的行为表现方式来描述:

  1. 令人愉快的--乐于助人,能够与他人合作,体谅他人
  2. 有责任心的--严格自律,有组织意识,目标明确
  3. 外向的--社交能力较强,自信、健谈
  4. 神经过敏--情感控制能力差,冲动、焦虑
  5. 开放的--求知欲较强而且喜欢新鲜事物

多年来,心理学家一直在研究依据上述标准划分人类性格的测试方式。最近,中科院的研究人员提出了在线测试的方式:根据用户在社交网络,比如Facebook,人人网上的行为,来确定用户的性格。

实验:首先,200名使用社交网络的志愿者参加标准的性格测试,然后,研究人员分析这些志愿者在社交网络上个人主页的内容,包括年龄、性别、发表博客的频率、博客内容流露出的情感等等。最终,研究人员使用多种数据分析技术来探索性格测试结果与社交网络行为的关系。

结果:不同的在线行为能够很好的体现用户的性格。比如,严格自律的人更倾向于使用住址或邮箱来向他人寻求帮助,而外向的人经常使用表情符号,性格开放的人更新博客的频率较高,而神经过敏的用户,他们的博客经常招致负面评价。

用户在线行为与用户性格存在的关联表明:可以分析用户在社交网络的在线行为来预测用户性格。社交网络可以利用这种关联关系向用户提供个性化的推荐,比如向性格外向的人推荐更多的国际新闻或新的朋友,向性格相同的人推荐同样的书籍与电影,因为他们的偏好可能是相似的。此外,社交网络还可将这个结论推广到商业化应用:比如针对特定用户群体的广告投放。

这个研究也存在一定的缺陷:比如用户对待在线测试与传统测试方式的态度可能有所不同,这造成了在线测试结果的偏差。这个方面是他们未来的研究中需要考虑的。但是,这个研究还是说明了在线行为是获取我们内在性格的丰富、有价值的数据源。

Ref: Big-Five Personality Prediction Based on User Behaviors at Social Network Sites

 

 

 

声音可以看见东西吗?

大家还记得多普勒效应吗?当声源与观察者发生相对运动时,观察者接收到的声音的频率会发生变化。最近,微软研究院的的研究人员利用多普勒效应开发了识别软件SoundWave来识别人体姿势。姿势识别已经不是新鲜的话题,微软的Kinect用摄像头实现了姿势识别。但是利用声音识别姿势的最大的好处是只需扬声器与麦克风就可实现,而这两者几乎是所有笔记本上都有的。

具体做法是:扬声器不断发出20-22KHZ的超声波,如果电脑周围没有物体移动,麦克风接受到的声音频率保持不变,如果物体靠近电脑,麦克风接收到的声音频率变高,物体远离,接收到的频率变低。这种现象发生的方式是可以预测的,通过分析频率可以确定移动物体的大小,物体移动的速度与方向,从而可以推理出人体姿势。

目前SoundWave的识别率达到了90%,而且在用户摆出姿势与电脑的识别反应之间没有明显的延迟。软件可以识别出的姿势包括“手的移动,手臂的弯曲,以及身体与电脑的相对移动。可以利用这些识别出的姿势控制电脑实现交互。比如利用手势来控制网页内容的滑动或者页面之间跳转,人体与电脑的相对移动则可以将电脑睡眠或唤醒。虽然SoundWave能识别的姿势有限,但是对于用户交互交互来说已经足够,特别是用户要记住这些姿势来完成交互。

SoundWave的另一优点就是不受光照的影响,这是传统视觉识别的一大弊端。其实在你的周围有很多感应器,只是你在与他们交互的过程中没有意识到他们的存在。

Ref: http://www.technologyreview.com/web/40368/?mod=chfeatured

ACM CHI上的文章:SoundWave: Using the Doppler Effect to Sense Gestures

 

Ajax 获取JSON数据

首先,介绍一下JSON。JSON(JavaScript Obect Notation)是一种轻量级的数据交换格式,易于人阅读和书写,也易于机器解析和生成。JSON建构与两种结构:

  • “名称/值”对的集合,在不同的语言中,它被理解为对象,记录,结构,字典,哈希表,有键列表或者关联数组。
  • 值的有序列表,大部分语言中,它被理解为数组

JSON具有以下这些形式:

对象是一个无序的,“名称/值”对的集合。一个对象以“{”始,“}”结束。每个名称后面跟一个“:”,“名称/值”对之间用“,”隔开。

数组是值的有序集合,一个数组以“[”开始,“]”结束,值之间用“,”隔开。

值可以是用双引号括起来的字符串,数值,true,false, null,对象或者数组。这些结构可以嵌套。

字符串是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。一个字符即一个单独的字符串。

数值也与C或Java的数值非常类似,除去未曾使用的八进制与十六进制,除去一些编码细节。

getJSON(url,[data],[callback])是JQuery获取JSON数据格式的方法,其中“url”表示请求的地址,可以是生成JSON数据的页面或者JSON数据保存的文件,可选项data表示发送到服务器端的数据,其格式是“key/value”的键值对,另一个可选项“callback”表示加载成功时执行的回调函数。下面是在一个页面中用Ajax获取另一个页面生成的JSON数据的例子:

$.getJSON(
	"jsonGene.jsp", 
	function(data){
		$.each(data, function(index, values){
			$.each(values, function(key, value){
				$("#page").append(value + "<br>");
			});
		});
	});

生成JSON数据的JSP页面为:

<jsp:directive.page contentType="text/html; charset=utf-8"/>
<%@ page import="handle.DBlogic"%>
<%@ page import="handle.Seed"%>
<%@ page import="java.util.*"%>
<%
	DBlogic dblogic = new DBlogic();
	ArrayList<Seed> seedList = dblogic.getdata();
	String str = "[";
	int i;
	for(i=0; i<seedList.size()-1; i++){
		Seed seed = seedList.get(i);
		String temp = "{";
		temp += "\"patternTypes\": " + '"' + seed.getPatternTypes() + '"' + ",";
		temp += "\"pattern1\": " + '"' + seed.getPattern1() + '"' + ",";	
		temp += "\"label\": " + '"' + seed.getLabel()+ '"' + ",";
		temp += "\"value\": " + '"' + seed.getValue() + '"' + ",";
		temp += "\"anotherPattern1\": " + '"' + seed.getAnotherPattern1() + '"';
		temp += "},";
		str += temp;
	}
	Seed seed = seedList.get(i);
	String temp = "{";
	temp +=	"\"patternTypes\": " + '"' + seed.getPatternTypes() + '"' + ",";
	temp += "\"pattern1\": " + '"' + seed.getPattern1() + '"' + ",";	
	temp += "\"label\": " + '"' + seed.getLabel()+ '"' + ",";
	temp += "\"value\": " + '"' + seed.getValue() + '"' + ",";
	temp += "\"anotherPattern1\": " + '"' + seed.getAnotherPattern1() + '"';
	temp += "}";
	
	str += temp;
	str += "]";
	
	out.print(str);
 %>

 生成的JSON对象为:

[
    {
        "patternTypes": "PER,CIT",
        "pattern1": "1177_3_14_;",
        "label": "negPlace",
        "value": "0.5",
        "anotherPattern1": "knock.v DATE @"
    },
    {
        "patternTypes": "PER,CIT",
        "pattern1": "126_14_53_;14_53_24_;",
        "label": "isInCity",
        "value": "0.38888889",
        "anotherPattern1": "marry.v in.p"
    },
    {
        "patternTypes": "PER,CIT",
        "pattern1": "14_53_24_;",
        "label": "isInCity",
        "value": "0.5",
        "anotherPattern1": "marry.v in.p"
    }
]
一直没有获取到页面生成的JSON数据,因为将JSP页面写成了HTML格式,其生成的响应是一个HTML页面,不是格式正确JSON数据,自然获取不到了。
 
ref:
http://www.bejson.com 提供了JSON数据的在线校验,可以查看程序生成的JSON数据格式是否正确
写前台开发的时候,Firefox的firebug插件很好用,可以查看页面发出的请求以及得到相应的数据,对脚本的调试很有帮助。

配置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 

使用JavaMail SMTP协议发送邮件

最近需要实现通过发送邮件让用户找回密码的功能,自己用Socket写了SMTP协议的邮件发送程序,但是很多邮件服务器的anti-spam需要验证发送邮箱的合法性,所以只得放弃,后来发现用javamail包可以很方便的实现。示例程序使用gmail的邮件服务器来发送邮件。关于SMTP端口等配置见下面链接:

https://support.google.com/mail/bin/answer.py?hl=en&answer=13287

注:下面程序需导入javaee-api-6.0.jar 跟 mail.jar

1.使用TLS发送邮件

import java.util.Properties;
 
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
public class SendMailTLS {
 
	public static void main(String[] args) {
 
		final String username = "someoe@gmail.com";
		final String password = "password";
 
		Properties props = new Properties();
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.starttls.enable", "true");
		props.put("mail.smtp.host", "smtp.gmail.com");
		props.put("mail.smtp.port", "587");
 
		Session session = Session.getInstance(props,
		  new javax.mail.Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(username, password);
			}
		  });
 
		try {
 
			Message message = new MimeMessage(session);
			message.setFrom(new InternetAddress("someone@gmail.com"));
			message.setRecipients(Message.RecipientType.TO,
				InternetAddress.parse("someone@yourISP.com"));
			message.setSubject("Testing Subject");
			message.setText("Dear Mail Crawler,"
				+ "\n\n No spam to my email, please!");
 
			Transport.send(message);
 
			System.out.println("Done");
 
		} catch (MessagingException e) {
			throw new RuntimeException(e);
		}
	}
}

2.使用SSL发送邮件

import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
public class SendMailSSL {
	public static void main(String[] args) {
		Properties props = new Properties();
		props.put("mail.smtp.host", "smtp.gmail.com");
		props.put("mail.smtp.socketFactory.port", "465");
		props.put("mail.smtp.socketFactory.class",
				"javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.port", "465");
 
		Session session = Session.getDefaultInstance(props,
			new javax.mail.Authenticator() {
				protected PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication("username","password");
				}
			});
 
		try {
 
			Message message = new MimeMessage(session);
			message.setFrom(new InternetAddress("from@no-spam.com"));
			message.setRecipients(Message.RecipientType.TO,
					InternetAddress.parse("to@no-spam.com"));
			message.setSubject("Testing Subject");
			message.setText("Dear Mail Crawler," +
					"\n\n No spam to my email, please!");
 
			Transport.send(message);
 
			System.out.println("Done");
 
		} catch (MessagingException e) {
			throw new RuntimeException(e);
		}
	}
}