paulwong

#

NoSql存储日志数据之Spring+Logback+Hbase深度集成


http://www.cnblogs.com/xguo/p/3298956.html

posted @ 2014-07-05 23:14 paulwong 阅读(749) | 评论 (0)编辑 收藏

运维工具

运维神器Chef简单介绍和安装笔记
http://www.cnblogs.com/xguo/p/3785346.html

posted @ 2014-07-05 23:11 paulwong 阅读(433) | 评论 (0)编辑 收藏

Maven安装jar文件到本地仓库

在项目开发期间难免遇遭使用的jar包在Maven的中央仓库里没有,比如那个固执的Oracle,这家伙始终不愿意把ojdbc驱动提交到Maven仓库,这件事很郁闷,Maven又不支持引入本地jar文件如果用IDE强行引入在Maven编译的时候又无法通过。

Maven官方提供导入本地jar文件到本地仓库的maven-install-plugin,可是要用的时候又得苦逼的去找命令,用起来也比较麻烦,因此,本文详细介绍一下maven-install-plugin插件的使用,可以导入任意数量的jar文件到本地仓库,是不是很开心那!

配置POM
Maven插件maven-install-plugin

<plugin>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.4</version>
    <inherited>false</inherited>
    <executions>
        <execution>
            <id>install-artifacts.1</id>
            <goals>
                <goal>install-file</goal>
            </goals>
            <phase>validate</phase>
            <configuration>
                <file>${basedir}/libs/ojdbc14.jar</file>
                <groupId>org.oracle</groupId>
                <artifactId>oraclejdbc</artifactId>
                <packaging>jar</packaging>
                <version>14</version>
            </configuration>
        </execution>
        <execution>
            <id>install-artifacts.2</id>
            <goals>
                <goal>install-file</goal>
            </goals>
            <phase>validate</phase>
            <configuration>
                <file>${basedir}/libs/foundation-1.0.jar</file>
                <groupId>org.bg</groupId>
                <packaging>jar</packaging>
                <artifactId>foundation</artifactId>
                <version>1.0</version>
            </configuration>
        </execution>
    </executions>
</plugin>


执行导入

在经过Maven的validate阶段时自动导入安装,在executions里指定插件的goals和maven的phase。
直接执行命令 mvn install:install-file

插件属性

如果要在导入时生成pom文件,增加配置属性:
<generatePom>true</generatePom>

指定自己的POM文件:

<generatePom>false</generatePom>
<pomFile>${basedir}/dependencies/someartifact-1.0.pom</pomFile>
如果JAR自带POM文件无需指定此属性,会自动安装。

http://www.cnblogs.com/xguo/archive/2013/06/04/3117894.html

http://www.cnblogs.com/xguo/archive/2013/06/01/3113146.html

更多详细配置:http://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html

最后提示一句,其实Maven生命周期中的每一个阶段都是一个插件来实现的,而且都可以单独拿出来根据你的使用需要来配置。
详细请查看http://maven.apache.org/plugins/
或者
另一篇Maven相关文章http://www.cnblogs.com/xguo/archive/2013/06/01/3113146.html。

posted @ 2014-07-05 22:37 paulwong 阅读(2288) | 评论 (1)编辑 收藏

Redisclient 1.0 发布,Java 的 Redis 客户端 GUI 工具

redisclient 1.0 正式发布,适用于多个 Redis 版本,主要更新内容如下:

  1. 管理 Redis 服务器

  2. 管理 Redis data favorite

  3. 管理 Redis 数据

    • 新 Redis 数据:string, list, hash, set, sorted set

    • 重命名 Redis 数据

    • 删除 Redis 数据

    • 更新 Redis 数据

    • 剪切,复制,粘贴 Redis 数据

    • 导入,导出 Redis 数据

    • 搜索 Redis 数据

    • 通过关键字,数据类型,大小来排序 Redis 数据

    • 导航历史

RedisClient 是  Redis 客户端 GUI 工具,使用 Java swt 和jedis 编写。它将redis数据以windows资源管理器的界面风格呈现给用户,可以帮助redis开发人员和维护人员方便的建立,修改,删除,查询redis数据,可以让用户方便的编辑数据,可以剪切,拷贝,粘贴redis数据,可以导入,导出redis数据,可以对redis数据排序。

https://github.com/caoxinyu/RedisClient

posted @ 2014-07-04 21:47 paulwong 阅读(354) | 评论 (0)编辑 收藏

DNS收集

国内

1.OpenerDNS:42.120.21.30

2.114DNS:114.114.114.114; 114.114.115.115

3.oneDNS:112.124.47.27

4.aliDNS:223.5.5.5;223.6.6.6

国际:

1.V2EX DNS:199.91.73.222;178.79.131.110

2.Google DNS:8.8.8.8;8.8.4.4

3.OpenDNS:208.67.222.222;208.67.220.220

posted @ 2014-07-04 12:55 paulwong 阅读(164) | 评论 (0)编辑 收藏

Java程序员们最常犯的10个错误

1.将数组转化为列表

将数组转化为一个列表时,程序员们经常这样做:

List<String> list = Arrays.asList(arr);

Arrays.asList()会返回一个ArrayList对象,ArrayList类是Arrays的一个私有静态类,而不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、get()、contains()方法,但是没有增加元素的方法,所以它的大小是固定的,想要创建一个真正的ArrayList类,你应该这样做:

ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

ArrayList的构造方法可以接受一个集合类型,刚好它也是java.util.Arrays.ArrayList的超类。

2.判断一个数组是否包含一个值

程序员们经常这样做:

Set<String> set = new HashSet<String>(Arrays.asList(arr)); 
return set.contains(targetValue);

这段代码起作用,但是没有必要把一个数组转化成列表,转化为列表需要额外的时间。它可以像下面那样简单:

Arrays.asList(arr).contains(targetValue);

或者是:

for(String s:arr){
if(s.equals(targetValue)){
return true;
}
}
return false;

第一种方法比第二种更容易读

3.在一个循环中删除一个列表中的元素

思考下面这一段在循环中删除多个元素的的代码

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(int i=0;i<list.size();i++){
list.remove(i);
}
System.out.println(list);

输出结果是:

[b,d]

在这个方法中有一个严重的错误。当一个元素被删除时,列表的大小缩小并且下标变化,所以当你想要在一个循环中用下标删除多个元素的时候,它并不会正常的生效。

你也许知道在循环中正确的删除多个元素的方法是使用迭代,并且你知道java中的foreach循环看起来像一个迭代器,但实际上并不是。考虑一下下面的代码:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));

for(String s:list){
    if(s.equals("a")){
      list.remove(s);
    }
}

它会抛出一个ConcurrentModificationException异常。

相反下面的显示正常:

        ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b",
                "c", "d"));
        Iterator<String> iter = list.iterator();
        while (iter.hasNext()) {
            String s = iter.next();
            if (s.equals("a")) {
                iter.remove();
            }
        }

.next()必须在.remove()之前调用。在一个foreach循环中,编译器会使.next()在删除元素之后被调用,因此就会抛出ConcurrentModificationException异常,你也许希望看一下ArrayList.iterator()的源代码。

4.Hashtable与HashMap的对比

就算法而言,哈希表是数据结构的一个名字。但是在java中,这个数据结构的名字是HashMap。Hashtable与HashMap的一个重要不同点是Hashtable是同步的。所以你经常不需要Hashtable,相反HashMap经常会用到。

具体请看:

HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap
Top 10 questions about Map

5.在集合中使用原始类型

在Java中原始类型与无界通配符类型很容易混合在一起,拿Set来说,Set是一个原始类型,而Set<?>是无界的通配符类型。
考虑下面使用原始类型List作为参数的代码:

public static void add(List list,Object o){
list.add(o);
}
pulbic static void main(String[] args){
List<String> list = new ArrayList<String>();
add(list,10);
String s = list.get(0);

这段代码会抛出一个异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

at ...

使用原生类型集合是危险的,这是因为原生类型集合跳过了泛型类型检查,并且不是安全的,在Set、Set<?>和Set<Object>中有很大的不同,具体请看Raw type vs. Unbounded wildcard和Type Erasure。

6.访问级别

程序员们经常使用public作为类字段的修饰符,可以很简单的通过引用得到值,但这是一个坏的设计,按照经验,分配给成员变量的访问级别应该尽可能的低。

具体请看:public, default, protected, and private

7.ArrayList与LinkedList的对比

当程序员们不知道ArrayList与LinkedList的区别时,他们经常使用ArrayList,因为它看起来比较熟悉。
然而,它们之前有巨大的性能差别。简而言之,如果有大量的增加删除操作并且没有很多的随机访问元素的操作,应该首先LinkedList。
如果你刚接触它们,请查看ArrayList vs. LinkedList来获得更多关于它们性能的信息。

8.可变与不可变

不可变对象有许多的优点,比如简单,安全等等。但是对于每一个不同的值都需要一个独立的对象,太多的对象可能会造成大量的垃圾回收。
当选择可变与不可变时应该有一个平衡。
一般的,可变对象用来避免产生大量的中间对象。一个典型的例子是连接大量的字符串。
如果你用一个不可变的字符串,你会产生很多需要进行垃圾回收的对象。这很浪费CPU的时间,使用可变对象是正确的解决方案(比如StringBuilder)。

String result="";
for(String s: arr){
  result = result + s;
}

有时在某些情况下也是需要可变对象的,比如将可变对象作为参数传入方法,你不用使用很多语句便可以得到多个结果。
另外一个例子是排序和过滤:当然,你可以写一个方法来接收原始的集合,并且返回一个排好序的集合,但是那样对于大的集合就太浪费了。(来自StackOverFlow的dasblinkenlight’s的答案)

具体请看:Why String is Immutable?

9.父类与子类的构造函数




这个编译期错误的出现是父类默认的构造方法未定义,在java中,如果一个类没有定义构造方法,编译器会默认的为这个类添加一个无参的构造方法。如果在父类中定义了构造方法,在这个例子中是Super(String s),编译器就不会添加默认的无参构造方法,这就是上面这个父类的情形。

子类的构造器,不管是无参还有有参,都会调用父类的无参构造器。因为编译器试图在子类的两个构造方法中添加super()方法。但是父类默认的构造方法未定义,编译器就会报出这个错误信息。

想要修复这个问题,可以简单的通过1)在父类中添加一个Super()构造方法,像下面这样:

public Super(){
  System.out.println("Super");
}

或者2)移除父类自定义的构造方法,或者3)在子类的构造方法中调用父类的super(value)方法。

具体请看:Constructor of Super and Stub

10.使用" "还是构造器

有两种方式可以创建字符串:

//1.使用字符串
String x = "abc";
//2.使用构造器
String y = new String("abc");

有什么区别?

下面的例子会给出一个快速的答案:

String a = "abc";
String b = "abc";
System.out.println(a==b);//true
System.out.println(a.equals(b));//true

String c = new String("abc");
String d = new String("abc");
System.out.println(a==b);//false
System.out.println(a.equals(b));//true

关于它们内存分配的更多信息,请参考Create Java String Using ” ” or Constructor?.

将来的工作

这个列表是我基于大量的github上的开源项目,Stack overflow上的问题,还有一些流行的google搜索的分析。没有明显示的评估证明它们是前10,但它们绝对是很常见的。如果您不同意任一部分,请留下您的评论。如果您能提出其它一些常见的错误,我将会非常感激。

原文链接: programcreek 翻译: ImportNew.com - 林林
译文链接: http://www.importnew.com/12074.html 

posted @ 2014-07-04 10:44 paulwong 阅读(305) | 评论 (0)编辑 收藏

JAVABEAN和JSON STRING互转

TestUser.java
import javax.xml.bind.annotation.XmlRootElement;

import org.codehaus.jackson.annotate.JsonProperty;

@XmlRootElement
public class TestUser {
    
    /*@XmlElement(name="username")*/
    @JsonProperty("username")
    private String userName;
    
    private String email;

    public String getEmail() {
        return email;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "TestUser [userName=" + userName + ", email=" + email + "]";
    }
    
    

}


Test.java
import java.io.IOException;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Test {
    
    private Logger logger = LoggerFactory.getLogger(Test.class);
    
    /*private String getBaseUri()
    {
        return "
http://192.168.1.223:8080/restfull-api";
    }
*/
    
    @Test
    public void testTest()
    {
        ObjectMapper mapper = new ObjectMapper();
        /*AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
        // make deserializer use JAXB annotations (only)
        mapper.getDeserializationConfig().setAnnotationIntrospector(introspector);
        // make serializer use JAXB annotations (only)
        mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
*/
        mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        
        String userStr = "{\"username\":\"paul\",\"email\":\"paul@paul.com\"}";
        try {
            TypeReference<TestUser> temp = new TypeReference<TestUser>(){};
            TestUser testUser = mapper.readValue(userStr, temp);
            System.out.println(testUser.toString());
            
            String result = mapper.writeValueAsString(testUser);
            System.out.println(result);
            
        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}









posted @ 2014-07-04 09:07 paulwong 阅读(595) | 评论 (0)编辑 收藏

2014巴西世界杯淘汰赛赛程

posted @ 2014-07-03 08:36 paulwong 阅读(211) | 评论 (0)编辑 收藏

如何模拟超过 5 万的并发用户

http://www.oschina.net/translate/how-run-load-test-50k-concurrent-users

posted @ 2014-07-02 09:13 paulwong 阅读(311) | 评论 (0)编辑 收藏

Spring Data Dijkstra

一大波Spring Data相关包:
Spring Data Dijkstra SR1 发布,该版本包含如下模块的 59 个问题修复:

建议所有 Dijkstra 用户升级,因为包含重要的 bug 修复。

posted @ 2014-07-01 10:49 paulwong 阅读(254) | 评论 (0)编辑 收藏

仅列出标题
共116页: First 上一页 51 52 53 54 55 56 57 58 59 下一页 Last