java代码获取完整的Exception异常信息

下面的java代码可以获取完整的Exception异常信息:

import java.io.PrintWriter;
import java.io.StringWriter;
public class ExceptionTest {
	public static void main(String[] args) {
		try {
			String aa = "";
			System.out.println(aa.substring(3));
		} catch (Exception e) {
			e.printStackTrace();
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw, true));
			String str = sw.toString();
			System.out.println("==========");
			System.out.println(str);
		}
	}
}

控制台打印的信息:

java.lang.StringIndexOutOfBoundsException: String index out of range: -3
	at java.lang.String.substring(String.java:1875)
	at ExceptionTest.main(ExceptionTest.java:8)
==========
java.lang.StringIndexOutOfBoundsException: String index out of range: -3
	at java.lang.String.substring(String.java:1875)
	at ExceptionTest.main(ExceptionTest.java:8)
e.getmessage < e.tostring < e.getStackTrace +e.tostring = e.printStackTrace

蒸发冷却效应

这种效应是指当一个生态群落中的大多数高价值贡献者发现这个群落已经不能提供他们需要的东西, 因而离开的时候,出现的现象。 这种情况一旦发生, 群落的质量就会下降,造成价值第二高的贡献者也发现群落变得平庸了。 每一层的消失都降低了团体的质量, 直到最后剩下的无技能也无知觉的人,他们根本无法知晓自己是在一个平庸的团体里面。
那些最想去结交别人的人,往往是大家最不愿意去结交的人;
那些最想说出自己看法的人,往往是大家最不愿意听他说的人;
那些最想同别人交换名片保持联络的人,往往是大家最不希望拿出名片同他交换的人;
这么说也许更清楚:
最不想来参加聚会的人,正是大家都希望能来聚会的人;
最不想来认识新朋友的人,正是大家最想认识的人;
最不想掏出名片的人,正是大家都想与之交换名片的人;

layer捕获页如何实现

layer捕获页代码如下:

//捕获页
layer.open({
  type: 1,
  shade: false,
  title: false, //不显示标题
  content: $('.layer_notice'), //捕获的元素,注意:最好该指定的元素要存放在body最外层,否则可能被其它的相对元素所影响
  cancel: function(){
    layer.msg('捕获就是从页面已经存在的元素上,包裹layer的结构', {time: 5000, icon:6});
  }
});

但是如果按照官网说的 把要指定的元素放在body外层,则根本找不到该元素。
变通的办法:在body内写一个空白的div,当触发的时候就在空白div内添加html,如果关闭掉弹出层,则把这个div的html代码全部清空。代码如下:

	function parvalueFocus(n){
		 var $ob = $(n);
		 //alert($ob.val());
		  layer.open({
		  type: 1,
		  area: ['600px', '360px'],
		  shadeClose: true, //点击遮罩关闭
		  content: $('#layer_notice'),
		  offset: '100px',
		  cancel: function(){
			  var par = "";
			  //遍历字典名称和字典值放入输入框里
			  //alert($(".newpar_sub").html());
			  //将数据回填
			  $.each( $(".newpar_sub"), function(i, x){
				  //alert(90);
				//获取子元素
				var $x = $(x);
				par = par + $x.children(".parname_sub").val()+":"+$x.children(".parvalue_sub").val()+",";
			});
			 par = par.substring(0,par.length-1);
			 $ob.val(par);
			 $('#layer_notice').html("");
		  }
		});
	 $('#layer_notice').html('<div><a href="#" onclick="appendInputSub();"><i class="icon-plus"></i></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#" onclick="removeInputSub();"><i class="icon-minus"></i></a></div>'+
			 "<div class='newpar_sub'>字典名称:<input class='parname_sub' type='text' value=''/>字典值:<input class='parvalue_sub' type='text' value=''/></div>");
	}

hadoop spark 大数据相关资源

小象《Hadoop 2.X大数据平台V3》
链接:http://pan.baidu.com/s/1nvS7GFJ 密码:tqng
《Spark 1.X 大数据平台V2》11月份班
链接:http://pan.baidu.com/s/1sl6KOGX 密码:qlea
深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存
链接:http://pan.baidu.com/s/1gfsmj3X 密码:50y2
资源整理中…….
欢迎大家补充!

CMU博士Tom Murphy的人工智能超级马里奥

跑了一下CMU博士Tom Murphy的人工智能程序来玩任天堂的超级马里奥,虽然是2013年就出来了,但是还是很激动呀。
这是他本人的博客:http://radar.spacebar.org/
资源都在这个网上有:http://www.cs.cmu.edu/~tom7/mario/
在文章的最下边是论文链接、源程序和编译好的可执行文件。
论文链接:http://www.cs.cmu.edu/~tom7/mario/mario.pdf
源程序:http://sourceforge.net/p/tom7misc/svn/HEAD/tree/trunk/tasbot/
可执行程序:http://www.cs.cmu.edu/~tom7/mario/playfun.7z
解压playfun.7z压缩包,会看到这些程序

playfun7z

playfun7z


打开readme文档,看作者的步骤提示:
1、运行平台是win7 64位系统
2、FCEUX是必须的,录制视频和回放人工智能玩的游戏都是靠这个来播放的。下载链接:http://www.fceux.com/web/download.html FCEUX 2.2.3 win32 Binary
下载超级马里奥的nes文件,用FCEUX完超级马里奥的游戏,并且录制视频
3、创建一个config.txt文件,文件内容包括下边三行文件:

game mario
movie me-playing-mario.fm2
moviename me-playing-mario.fm2

PS:readme文件是这么写的: Modify config.txt to contain e.g. 英文不好,理解为修改一个config.txt文件了,找了半天没找到,哎。其实是自己创建,后来在radar.spacebar.org/f/a/weblog/comment/1/1097 看到别人的评论里详细解释了这个步骤才得以解决。
4、记得在当前目录下有一个叫“mario.nes”的文件,还有录制好的视频命名为“me-playing-mario.fm2”,如下图:

nes

nes


5、点击ansicon.exe 在命令行里运行learnfun.exe 这个应该很快就运行完了
6.运行
playfun.exe –helper 8000
playfun.exe –helper 8001
….
playfun.exe –helper 8005
PS:根据机器配置选择合适的运行个数,否则机器会卡死。还有这个需要的时间特别长,据作者说几分钟的的视频需要运行好多天。我只启动了两个进程。
6、当所有的helper都输出ready,就可以跑主程序了 playfun.exe –master 8000 8001
7.最后会输出mario-playfun-backtrack-269-replacement.fm2文件,再用FCEUX就可以看到了。
mario

mario


这是用程序自己玩马里奥的视频,大概耗时24小时:

利用PostMan开发调试Restful API

利用PostMan开发调试Restful API
下边的图片是postman发送不同类型的请求,注意url和参数的变化:

get

get


delete

delete


post

post


put

put


利用spring mvc实现restful api ,需要修改的部分:

@RestController
还有就是要注意参数获取的方式,

参考后端代码:

/**
 * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.modules.sys.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.jeeplus.common.web.BaseController;
import com.jeeplus.modules.sys.entity.User;
import com.jeeplus.modules.sys.service.SystemService;
/**
 * 用户Controller
 * @author jeeplus
 * @version 2013-8-29
 */
@RestController
@RequestMapping(value = "/user")
public class UserController2 extends BaseController {
	@Autowired
	private SystemService systemService;
	@RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public User viewGET(@PathVariable("id") String id) {
        User user = new User();
        user = systemService.getUser(id);
        System.out.println("get method");
        return user;
    }
	@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    public User viewDELETE(@PathVariable("id") String id) {
        User user = new User();
        user = systemService.getUser(id);
        System.out.println("delete method");
        return user;
    }
	@RequestMapping(value = "", method = RequestMethod.POST)
    public User viewPOST(@ModelAttribute("user")User users) {
        User user = new User();
        user = systemService.getUser(users.getId());
        System.out.println("post method");
        return user;
    }
	@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public User viewPUT(@ModelAttribute("user")User users) {
        User user = new User();
        user = systemService.getUser(users.getId());
        System.out.println("put method");
        return user;
    }
}

Eclipse修改SVN的地址

在Eclipse中选择Windows-> Show View->others  选中SVN资源库  然后选中原有的地址,选择“重新定位”,然后修改url即可

Presto的作用

Presto不是什么
虽然Presto一直被一些个人或者团体称为 数据库 ,但是Presto并不是数据库。
千万不要以为Presto可以解析SQL,那么Presto就是一个标准的数据库。Presto并不是传统意义上的数据库。Presto并不是MySQL、PostgreSQL或者Oracle的代替品。Presto并不能用来处理在线事务。其实很多其他的数据库产品也是被用来设计为数据仓库或者数据分析工具,但是也不能处理在线事务。
Presto是什么
Presto通过使用分布式查询,可以快速高效的完成海量数据的查询。如果你需要处理TB或者PB级别的数据,那么你可能更希望借助于Hadoop和HDFS来完成这些数据的处理。作为Hive和Pig(Hive和Pig都是通过MapReduce的管道流来完成HDFS数据的查询)的替代者,Presto不仅可以访问HDFS,也可以操作不同的数据源,包括:RDBMS和其他的数据源(例如:Cassandra)。
Presto被设计为数据仓库和数据分析产品:数据分析、大规模数据聚集和生成报表。这些工作经常通常被认为是线上分析处理操作。
谁使用Presto?
Presto是FaceBook开源的一个开源项目。Presto在FaceBook诞生,并且由FaceBook内部工程师和开源社区的工程师公共维护和改进。
既然Presto是一个交互式的查询引擎,我们最关心的就是Presto实现低延时查询的原理,我认为主要是下面几个关键点,当然还有一些传统的SQL优化原理,这里不介绍了。
完全基于内存的并行计算
流水线
本地化计算
动态编译执行计划
小心使用内存和数据结构
类BlinkDB的近似查询
GC控制

Java内存泄露

问题的提出
Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。
随着越来越多的服务器程序采用Java技术,例如JSP,Servlet, EJB等,服务器程序往往长期运行。另外,在很多嵌入式系统中,内存的总量非常有限。内存泄露问题也就变得十分关键,即使每次运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。
Java是如何管理内存
为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。
监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。
为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。
以下,我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。以下右图,就是左边程序运行到第6行的示意图。

java memory

java memory


Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。这种方式的优点是管理内存的精度很高,但是效率较低。另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。
什么是Java中的内存泄露
下面,我们就可以描述什么是内存泄漏。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。
通过分析,我们得知,对于C++,程序员需要自己管理边和顶点,而对于Java程序员只需要管理边就可以了(不需要管理顶点的释放)。通过这种方式,Java提高了编程的效率
内存泄露

内存泄露


因此,通过以上分析,我们知道在Java中也有内存泄漏,但范围比C++要小一些。因为Java从语言上保证,任何对象都是可达的,所有的不可达对象都由GC管理。
对于程序员来说,GC基本是透明的,不可见的。虽然,我们只有几个函数可以访问GC,例如运行GC的函数System.gc(),但是根据Java语言规范定义, 该函数不保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能使用不同的算法管理GC。通常,GC的线程的优先级别较低。JVM调用GC的策略也有很多种,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是平缓执行GC,有的是中断式执行GC。但通常来说,我们不需要关心这些。除非在一些特定的场合,GC的执行影响应用程序的性能,例如对于基于Web的实时系统,如网络游戏等,用户不希望GC突然中断应用程序执行而进行垃圾回收,那么我们需要调整GC的参数,让GC能够通过平缓的方式释放内存,例如将垃圾回收分解为一系列的小步骤执行,Sun提供的HotSpot JVM就支持这一特性。
下面给出了一个简单的内存泄露的例子。在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
	Object o=new Object();
	v.add(o);
	o=null;
}

A/B测试:基本概念

网站设计中,我们经常会面临多个设计方案的选择,比如某个按钮是用红色还是用蓝色,是放左边还是放右边。传统的解决方法通常是集体讨论表决,或者由某位专家或领导来拍板,实在决定不了时也有随机选一个上线的。虽然传统解决办法多数情况下也是有效的,但A/B 测试(A/B Testing)可能是解决这类问题的一个更好的方法。
所谓 A/B 测试,简单来说,就是为同一个目标制定两个方案(比如两个页面),让一部分用户使用 A 方案,另一部分用户使用 B 方案,记录下用户的使用情况,看哪个方案更符合设计目标。当然,在实际操作过程之中还有许多需要注意的细节。
A/B 测试并不是互联网测试新发明的方法,事实上,自然界也存在着类似 A/B 测试的事件,比如下图中的达尔文雀。

ab测试

ab测试


达尔文雀主要生活在太平洋东部加拉帕戈斯(Galapagos)的一个名为伊莎贝拉(Isabela)的岛上,一部分生活在岛的西部,另一部分生活在岛的东部,由于生活环境的细微不同它们进化出了不同的喙。这被认为是自然选择学说上的一个重要例证。
同样一种鸟,究竟哪一种喙更适合生存呢?自然界给出了她的解决方案,让鸟儿自己变异(多个设计方案),然后优胜劣汰。具体到达尔文雀这个例子上,不同的环境中喙也有不同的解决方案。
上面的例子虽然和网站设计无关,但包含了 A/B 测试最核心的思想,即:
1、多个方案并行测试;
2、每个方案只有一个变量(比如鸟喙)不同;
3、以某种规则优胜劣汰。
需要特别留意的是第 2 点,它暗示了 A/B 测试的应用范围,——必须是单变量。有时我们的多个设计稿可能会有非常大的差异,这样的情况一般不太适合做 A/B 测试,因为它们的变量太多了,变量之间会有较多的干扰,我们很难通过 A/B 测试的方法来找出各个变量对结果的影响程度。比如,土豆烧肉和豆腐鲫鱼汤都挺美味,但我们很难比较土豆和豆腐哪一个对菜的美味影响更大,而土豆烧肉和豆腐烧肉则是不错的比较。另外,虽然 A/B 测试名字中只包含 A、B ,但并不是说它只能用于比较两个方案的好坏,事实上,你完全可以设计多个方案进行测试,“A/B 测试”这个名字只是一个习惯的叫法。
回到网站设计,一般来说,每个设计方案应该大体上是相同的,只是某一个地方有所不同,比如某处排版、文案、图片、颜色等。然后对不同的用户展示不同的方案。
要注意,不同的用户在他的一次浏览过程中,看到的应该一直是同一个方案。比如他一开始看到的是 A 方案,则在此次会话中应该一直向他展示 A 方案,而不能一会儿让他看 A 方案,一会儿让他看 B 方案。同时,还需要注意控制访问各个版本的人数,大多数情况下我们会希望将访问者平均分配到各个不同的版本上。要做到这些很简单,根据 cookie (比如 cookie 会话ID的最后一位数字)决定展示哪个版本就是一个不错的方法。
下面是 A/B 测试示意图:
ab测试流程

ab测试流程


可以看到,要实现 A/B 测试,我们需要做以下几个工作:
1、开发两个(或多个)不同的版本并部署;
2、收集数据;
3、分析数据,得出结果。
关于 A/B 测试的基本概念就介绍到这里,其余部分我会在后续文章中继续介绍。
http://oldj.net/article/ab-testing-basic-concept/