自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

敖小剑的博客

敖小剑的博客-CSDN同步版本

  • 博客(179)
  • 问答 (1)
  • 收藏
  • 关注

新博客网站

开始启用新的博客网站,基于hexo,搭载在github上。请点击这里访问 "[url=http://skyao.github.io/]Sky's blog[/url]".现在的iteye上的blog不再更新。

2014-04-22 23:26:08 306

使用javap命令查看编译版本信息

之前遇到几次现场故障,都是和class文件有关,比如版本不兼容造成Bad Version错误之类,需要检查class文件的编译版本信息。 一般的方法都是下载回来class文件,用jd打开反编译,这个还是比较方便的,偶尔遇到手头没有jd的情况,就直接找个16机制文件编辑器打开class文件,直接看minor version 和 major version。 今天无...

2013-02-17 15:41:15 455

编码最佳实践(6)--那些年,我们一起建的索引

前几次的编码最佳实践系列,我们都着眼于Java代码,今天我们换个话题,看看另外一个领域,和Java代码大相径庭的SQL。 这次作为素材出场的,是来自项目中的一段SQL,用于BlackWhiteList Adapter,在每次请求时检查一下,看当前用户是否在黑白名单中。 先介绍一下数据库结构,很简单的三张表:BWLIST记录黑白名单信息,BWLISTXADDRES...

2013-01-04 12:01:36 302

编码最佳实践(5)--小心!这只是冰山一角

本期的案例依然是来自实际项目,很寻常的代码,却意外遭遇传说中的Java"内存溢出"。 先来看看发生了什么,代码逻辑很简单,在请求的处理过程中:1. 创建了一个ArrayList,然后往这个list里面放了一些数据,得到了一个size很大的listList cdrInfoList = new ArrayList();for(...) { c...

2012-09-06 15:06:39 175

遭遇drupal keyword search模块bug,不能添加新的页面关键字

这是个非常无聊而无奈的问题,昨晚在解决globalrediect模块的重定向循环问题,我的drupal终于可以开发seo相关的各个功能。 第一时间跑去设置各个页面的关键字,结果立即被打击的不行,只要一点击Add page keyword,立即报错:Notice: Undefined variable: keyword 在 kwresearch_page_keywor...

2012-07-11 08:00:09 204

解决drupal的globalrediect模块的重定向循环问题

昨晚继续折腾俺的小站http://www.javauniversity.net,准备给它加上SEO支持,安装了SEO tools模块和相应的依赖模块。 结果安装完成之后就陷入重定向循环了,每个页面都被重定向到新地址,然后新地址再次被重定向。chrome浏览器会稍后报错说太多重定向,而ie则傻傻的一直在死循环。 google了一圈,很快定位到问题发生在global...

2012-07-11 07:26:50 142

原创 编码最佳实践(4)--小心LinkedHashMap的get()方法

这是一个来自实际项目的例子,在这个案例中,有同事基于jdk中的LinkedHashMap设计了一个LRUCache,为了提高性能,使用了 ReentrantReadWriteLock 读写锁:写锁对应put()方法,而读锁对应get()方法,期望通过读写锁来实现并发get()。 代码实现如下:[code="java"]private ReentrantReadWrit...

2012-06-18 12:28:30 350

原创 编码最佳实践(3)--尽量重用昂贵的初始化对象

这里将要讲述的是一系列的类似案例,都是在各个产品进行performance tuning时被发现的,非常具有普适性。可以说在日常开发中,有非常大的概率遇到相同或者类似的情形,因此需要对其保持警惕以便避免陷入类似的性能问题。 我们从JAXBContext这个对象开始,JAXBContext 是JAXB API的入口,典型的代码实现如下: [code="java"]...

2012-06-17 22:59:42 139

原创 编码最佳实践(2)--推荐使用concurrent包中的Atomic类

这是一个真实案例,曾经惹出硕大风波,故事的起因却很简单,就是需要实现一个简单的计数器,每次取值然后加1,于是就有了下面这段代码:[code="java"] private int counter = 0; public int getCount ( ) { return counter++; ...

2012-06-16 17:46:42 94

原创 编码最佳实践(1)--小心"数据溢出"

最近在公司内部做了一些收集和整理的工作,关于trouble shooting和performace tuning 中遇到并解决的典型问题,做了一些内部分享。我整理了一下,准备陆续放上来分享给大家。 这些问题,单个看每个问题都不算复杂或高深,但是都是在实际项目开发中出现并一度造成困扰的,而且带有一定的普适性,具体表现为不知道这些问题的同学很容易在日常开发中中招。因此我们开了一个...

2012-06-09 23:34:54 113

搜索maven依赖的网站推荐

使用maven填写依赖的时候,常会遇到需要查一下groupId/artifactId和version,有时候还要看看有没有新的版本更新。 原来一直用http://mvnrepository.com/ 这个网站来搜索,最近发现maven官网也提供了类似的功能,http://search.maven.org/。 简单试用了一下search.maven.org,功能基...

2011-12-02 16:04:44 442

cloudfoundry介绍-(1)申请试用

cloudfoundry是vmvare新推出来的开源PaaS平台,我试用了一下,发现还是很不错的。发出来分享给大家。(1) 申请 目前接受申请,要求非常简单,近乎于没有: 1. 打开http://www.cloudfoundry.com/ 2. 点击 Free Sign Up for Cloud Foundry 3. 输入你的email地...

2011-06-11 13:54:55 242

解决gradle与sonar集成过程中的版本问题

初学gradle,一切都还在摸索的过程中。今天刚刚试图将之前基于ant + ivy的一个小项目转移到gradle下,结果在和sonar集成时出现问题。 gradle中支持sonar的方式很简单,gradle提供了一个sonar的plugin,简单的在build.gradle中配置一下就好了:[code="java"]apply plugin: 'sonar's...

2011-05-15 13:07:43 1438

原创 解决junit4.4和jmockit的冲突

今天开发中遇到的问题,代码提交到svn上去之后,hundson很快就红了。 检查hundson,发现该项目下所有的junit测试案例都失败了,所以的case都是一个错误:[code="java"]java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInsta...

2011-04-25 17:26:11 569

写在qcon beijing 2011前夜

在酒店里上网,无聊又来到je,sorry,我还是习惯这么称呼,不习惯用ie。 上一次来北京,是去年12月底,参加javaOne Beijing 2010。实话说非常的失望,回去之后告诉boss,以后的javaOne可以不用继续参加了。 这次,时隔数月,再次被派出来参加qcon,依然还是北京,坐在这个京仪大酒店里面,依稀和上次参加javaOne呆坐在马可波罗很是类...

2011-04-07 22:40:38 102

原创 ubuntu10.10 + vista双启动的grub2设置

新安装了ubuntu10.10版本在公司笔记本上,结果在系统启动方面遭遇很多问题。记录下来以备用。 背景:公司笔记本,安装有vista,必须保留。因此只能考虑vista + ubuntu的双系统。由于vista所在分区是有pointsec软件作硬盘加密,造成ubuntu的grub无法通过正常的方式发现C盘安装的操作系统,必须手工修改。 ubuntu10.10中默...

2011-04-05 18:59:23 130

javaOne归来后对java未来的看法和担忧

上周参加北京的javaOne,今天回到办公室,刚刚在msn上和YHC同学交流了一下对这次javaOne的看法。 我个人对java未来颇有些担忧,尤其在这次javaOne之后。和YHC同学交流后感觉应该不是我一个人有类似的想法,好吧,在征得YHC同学的同意后,我将这段聊天内容贴出来。 有兴趣的同学,一起来聊聊吧。---------- 以下为具体的聊天内...

2010-12-20 17:50:41 109

easymock教程-自定义参数匹配器

    虽然easymock中提供了大量的方法来进行参数匹配,但是对于一些特殊场合比如参数是复杂对象而又不能简单的通过equals()方法来比较,这些现有的参数匹配器就无能为力了。easymock为此提供了IArgumentMatcher 接口来让我们实现自定义的参数匹配器。     我们还是用例子来说话:    public interface Service {        ...

2010-11-30 18:18:00 975

easymock教程-改变同一个方法调用的行为

    在easymock中,对于mock对象的同一个方法,可以为每一次的调用定制不同的行为。在record阶段easymock会精确的记录我们录入的行为,基于每一次的方法调用。     这里有一个官网文档中的例子:    expect(mock.voteForRemoval("Document"))        .andReturn((byte) 42).times(3)   ...

2010-11-30 17:06:00 208

easymock教程-运行时返回值或者异常

        前面的教程中,我们看到easymock可以通过expect方法来设定mock方法的返回值或者异常,但是注意这些案例中设置的返回值都是在调用被测试的类的方法前就已经确定下来的,即我们其实在测试类的代码运行前(实际是在EasyMock.replay()方法调用前)就已经"预知"了返回结果。     但是在某些情况下,我们可能无法预知返回值,比如我们需要根据输入的参数值来决定返回...

2010-11-30 16:36:00 487

easymock教程-partial class mocking

    easymock中提供对于类的mock功能,我们可以方便的mock这个类的某些方法,指定预期的行为以便测试这个类的调用者。这种场景下被mock的类在测试案例中扮演的是次要测试对象或者说依赖的角色,主要测试对象是这个mock类的调用者。但是有时候我们需要将这个测试类作为主要测试对象,我们希望这个类中的部分(通常是大部分)方法保持原有的正常行为,只有个别方法被我们mock掉以便测试。 ...

2010-11-30 14:23:00 144

easymock教程-参数匹配

    easymock中提供了非常多的方法来实现参数匹配,基本能满足一般参数匹配的要求。    我们来具体看一下到底有哪些方法: (1) 基于基本类型的比较         1. eq(X value)方法, X 可以是boolean,byte,char, double,float,int,long,short,T            有多个重载方法,支持基本类型如bo...

2010-11-29 18:57:00 871

easymock教程-命名mock对象

    在创建mock对象的时候,我们可以命名mock对象。     前面我们谈到easymock中有三种mock对象,分别用下面三个方法创建: createMock(Class<T> toMock)createStrictMock(Class<T> toMock)createNiceMock(Class<T> toMock)    ...

2010-11-29 16:34:00 194

easymock教程-放宽调用次数

    对于mock对象上的mock方法的调用,easymock支持指定次数,默认为1,例如Easymock.expect(mock.method1()).andReturn(...);    这里没有显式的指定调用次数,因此效果等同于     Easymock.expect(mock.method1()).andReturn(...).once();    同时e...

2010-11-29 15:55:00 170

easymock教程-mock的限制

    easymock并不是万能的,在使用easymock时有一些限制需要注意。 (1) Object方法的限制    我们都知道java是一个单根继承体系,Object是所有类的基类。在Object类上有几个基本的方法,easymock是不能改变其行为的:equals(), hashCode()和toString()。     即对于easymock创建的mock对象,其e...

2010-11-25 11:12:00 479

easymock教程-创建stub对象

    前面教程中有个章节讨论到mock和stub的概念差别,一般来说easymock如其名所示,主要是用来做mock用的,但是easymock中也提供有对stub的支持, 主要体现在andStubAnswer(),andStubDelegateTo(),andStubReturn(),andStubThrow()和asStub()等方法的使用上。     我们来看一个实际使用的例子:...

2010-11-23 17:51:00 198

sonar 与 NOSONAR

大家都知道sonar是个好东东,在有CI支持的情况下,使用好了可以非常好的控制代码的质量,诸如代码覆盖率,代码规则检查等。 而解决violation的办法,除了正统的修改代码来满足规则外,还有一个变通的方法, NOSONAR。这个标记本意是在一些特殊情况,有不得已的理由不得不违反规则,为了避免sonar继续报错而不得已做了一个"变通"。 NOSONAR本意虽好,...

2010-11-22 10:40:10 3730 2

easymock教程-strict和nice

    在easymock的使用过程中,当创建mock对象时,我们会遇到 strict mock和nice mock的概念。     比如创建mock对象我们通常使用EasyMock.createMock(),但是我们会发现easymock同时提供了两个类似的方法: EasyMock.createNiceMock() EasyMock.createStrictMock() ...

2010-11-19 11:39:00 494

easymock教程-使用MockControl

     在easymock中,通常我们使用一下的代码来创建mock对象    IMyInterface mock = createStrictMock(IMyInterface.class);    replay(mock);    verify(mock);     reset(mock);    如果需要mock多个对象,则需要如此:    IMyInterface1...

2010-10-26 17:18:00 419

easymock教程-class mocking

    前面的例子中,mock的对象都是基于interface,虽然说我们总是强调要面对接口编程,而不要面对实现,但是实际开发中不提取interface而直接使用class的场景非常之多。尤其是一些当前只有一个明确实现而看不到未来扩展的类,是否应该提取interface或者说是否应该现在就提取interface,总是存在争论。     这种情况下,我们就会面临主要测试对象依赖到一个具体类而...

2010-10-26 16:54:00 123

easymock教程-easymock的典型使用

     关于easymock的典型使用方式,在easymock的官网文档中,有非常详尽的讲解,文档地址为 http://easymock.org/EasyMock3_0_Documentation.html,文档的开头一部分内容都是easymock中最基本的使用介绍,虽然是英文,但是非常容易看懂,适用新学者入门。     这里只罗列一些简单的常用功能,依然以前面教程中使用到的测试案例...

2010-10-15 17:14:00 787

easymock教程-record-replay-verify模型

    record-replay-verify 模型容许记录mock对象上的操作然后重演并验证这些操作。这是目前mock框架领域最常见的模型,几乎所有的mock框架都是用这个模型,有些是现实使用如easymock,有些是隐式使用如jmockit。     以easymock为例,典型的easymock使用案例一般如下, 援引上一章中的例子: public class User...

2010-10-15 14:50:00 474

easymock教程-单元测试中的主要测试对象和依赖

     在单元测试中,通常我们都会有一个明确的测试对象,我们测试的主要目的就是为了验证这个类的工作如我们预期。      以下面的简单代码为例:         public interface UserService {            User query(String userId);        }        public class UserServic...

2010-10-14 14:01:00 237

easymock教程-目录

    easymock是目前比较流行的java mock 工具,这个教程将比较详细的介绍easymock的使用。     主要内容来自easymock的官网介绍和教程,我针对日常使用情况进行了一些筛选和补充,另外增加一些个人的理解和认识,希望能对不熟悉easymock的朋友们有所帮助。    如有疏漏,错误或者疑惑,欢迎大家指正和提醒,不胜感激。一. 基本概念  ...

2010-10-14 10:44:00 208

hudson中subversion HEAD check out 的问题及疑惑

近期发现一个问题,hudson执行任务时,经常不能获取到最新的代码,从而导致出现各种问题。 日常开发中的典型例子:发现一个bug,修改代码,本地测试通过,提交代码到subversion,手工激活hudson构建,原本期望hudson获取到刚刚提交的代码并测试/打包/发布。结果事与愿违,测试的结果发现刚刚做出的修改似乎没有生效。正费解之时,再执行一次hudson构建,又成功了... 经历过几...

2010-09-29 23:02:00 144

Maven 3.0 RC1 版本发布

Maven 3.0 的第一个RC版本终于发布了,下面是sonatype给出的发布信息:http://www.sonatype.com/people/2010/09/please-try-maven-3-0-rc1/Maven 在apache上的页面目前还没有放出RC1版本。下面是关于mavne3.*版本相对于2.* 版本的改进列表:https://cwiki.apache.or...

2010-09-20 10:08:00 442

confluence 3.3.1 linux安装笔记

confluence 3.3.1 安装笔记一. 下载  官网下载地址: http://www.atlassian.com/software/confluence/ConfluenceDownloadCenter.jspa 支持多个平台,而且有多个安装版本。对于普通用户,根据各自情况可以考虑合适的版本:One-Click Evaluation Insta...

2010-09-18 15:20:00 183

fisheye2.3.6 安装笔记

之前安装的fisheye2.2.1,破解不是很好用,最近看到fisheye2.3.6版本有出新的破解方式,特地尝试了一下,成功安装。现在将过程简单分享给大家。一. 准备工作 1. 下载fisheye2.3.6 http://www.atlassian.com/software/fisheye/downloads/binary/fisheye-2.3.6.zip...

2010-09-16 00:43:30 133

easymock教程-mock和stub

作为测试的基本概念,在开发测试中经常遇到mock和stub。之前认为自己对这两个概念已经很明白了,但是当决定要写下来并写清楚以便能让不明白的人也能弄明白,似乎就很有困难。 试着写下此文,以检验自己是不是真的明白mock和stub。一. 相同点 先看看两者的相同点吧,非常明确的是,mock和stub都可以用来对系统(或者将粒度放小为模块,单元)进行...

2010-08-26 15:26:54 414

原创 [翻译]Tokyo Tyrant基本规范

Tokyo Tyrant基本规范,翻译自Tokyo Tyrant官网,原文地址http://fallabs.com/tokyotyrant/spex.html。 主要内容为Tokyo Tyrant的介绍,安装,服务器程序,客户端程序,远程数据库API,Lua 扩展,协议和一个针对初学者的教程。一.介绍 Tokyo Tyrant是名为Tokyo Cabin...

2010-08-23 08:25:48 270

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除