Fork me on GitHub
Hi, I’m Yang Peng

Here are some thoughts of mine

fastjson对Date的处理

fastjson对日期的序列化方式:

一种方法是通过注解

1
2
@JSONField (format="yyyy-MM-dd HH:mm:ss")
public Date birthday;

另一种是通过SerializeConfig:

1
2
3
4
5
6
private static SerializeConfig mapping = new SerializeConfig();
private static String dateFormat;
static {
    dateFormat = "yyyy-MM-dd HH:mm:ss";
    mapping.put(Date.class, new SimpleDateFormatSerializer(dateFormat));
}

json字符串中使用单引号:

1
String text = JSON.toJSONString(object, SerializerFeature.UseSingleQuotes);
Read on →

Java8中的lambda表达式

2014年3月18日,Oracle终于发布Java8正式版。在新的版本里面加入了很多特性, 总共增加了55个新特性,其中最最吸引人的就是Lambdas表达式和Stream函数式编程,本文详细讲解这两个特性。

其他特性比如日期API,泛型,反射,注解,集合框架,并发,Nashorn引擎等等这里暂时就不详细介绍了。 具体可以参考:http://openjdk.java.net/projects/jdk8/features

昨天参加了Oracle的Java8宣讲活动,有幸目睹了Simon Ritter的风采,写个总结来分享下。

Java并发编程演变:

版本 发布年份 并发技术
1.4 2002 java.lang.Thread
5 2004 java.util.concurrent(jsr166)
6 2006 Phasers, etc(jsr166)
7 2011 Fork/Join Framework(jsr166y)
8 2014 Project Lambda

先来一个小例子见识下Java8的威力! Read on →


使用xmemcached客户端

Xmemcached是基于java nio实现的高性能可扩展的memcached客户端。它的主要特点:

  1. 高性能,稳定可靠,已经在众多公司的众多项目里得到应用。
  2. 功能完备:客户端分布式、权重、最新最完整的协议支持。
  3. 可扩展,易于集成
  4. 可动态增删memached节点
  5. 客户端操作统计
  6. NIO连接池

等等,更多信息请见wiki文档。废话不多讲,先上代码: Read on →


快速排序和二分查找

快速排序算法和二分搜索算法:

算法主要分为排序算法、搜索算法、图算法。图算法我用得不多,没有发言权,本文就不说了。

排序算法中最快的是快速排序算法,搜索算法中最快的是二分搜索算法。我也最喜欢这2 个算法。 因为它们是使用递归实现的,代码简洁清晰,效率又非常高。

根据我的理解,算法的本质就是数学。根据输入和设定的目标,采用有限的步骤实现输出。通常,使用计算机实现的算法,都会用到循环,这样才能发挥计算机高速运算的优势。

循环和递归是等效的,这已经被科学家所证明。数学上没有循环,只有递归的概念,因此使用递归代替循环表示算法有很多好处:

  1. 递归的代码要比循环简洁很多,也优雅很多。
  2. 递归的代码可以用数学方式建模,可以从数学角度验证其正确性。

很多函数式语言甚至没有循环的概念和关键字,强迫你使用递归来实现循环。如,ErLang 。 递归也有一些缺点,递归使用栈来保存函数地址和参数、返回值,而栈是有一定大小的,过多的递归调用可能会造成栈溢出。但是,递归算法会容易转变为循环。我更欣赏递归的简洁,除非真的出现栈溢出的问题,我是不会使用循环的。


二分搜索算法

理论:

二分搜索算法用于针对已排序的集合进行搜索。

它的原理是:

  1. 找到排序数组的中间元素,如果它匹配目标值,那么就返回它在数组中的索引。
  2. 如果没有找到,那么判断中间值比目标值大还是小, 如果中间值比目标值大,那么就对第一个元素到middle-1 的元素递归这个过程。 如果中间值比目标值小,那么就对middle+1 到最后一个元素。
  3. 如果结束的索引小于开始的索引,返回-1 ,表示没有找到。
  4. 如果子集合有2 个元素,那么各自比较。因为Java 的整数除法会舍弃小数,如果数组只有2 个元素,那么middle 值一直都是第一个元素。

经过上述的递归过程,最终将返回匹配元素的索引,或者是-1 ,表示找不到。 Read on →


linux上安装memcached

一 准备安装文件

下载memcached与libevent的安装文件:

memcached下载地址:memcached-1.4.15.tar.gz

libevent下载地址:libevent-2.0.21-stable.tar.gz

二 具体安装步骤

  1. 由于memcached依赖于libevent,因此需要安装libevent。由于linux系统可能默认已经安装libevent,执行命令:
1
rpm -qa|grep libevent 
  1. 查看系统是否带有该安装软件,如果有执行命令:
1
2
# 由于系统自带的版本旧,忽略依赖删除
rpm -e libevent-1.4.13-4.el6.x86_64 –nodeps
  1. 安装libevent命令: Read on →

利用递归算法并行化解决谜题框架

我们将谜题定义为:包含一个初始位置,一个目标位置,以及用于判断是否是有效移动的规则集。

规则集包含两部分:计算从指定位置开始的所有合法移动,以及每次移动的结果位置。

下面先给出表示谜题的抽象类,其中的类型参数P和M表示位置类和移动类。根据这个接口,我们可以写一个简单的串行求解程序,该程序将在谜题空间Puzzle Space中查找,直到找到一个解答或者找遍了整个空间都没有发现答案。注:一个移动M代表一步

1
2
3
4
5
6
7
8
9
10
/** 表示 搬箱子 之类谜题的抽象类*/
public interface Puzzle<P, M> {
    P initialPosition();

    boolean isGoal(P position);

    Set<M> legalMoves(P position);

    P move(P position, M move);
}

下面的PuzzleNode代表通过一系列的移动到达的一个位置,其中保存了到达该位置的移动以及前一个Node。只要沿着PuzzleNode链接逐步回溯,就可以重新构建出达到当前位置的移动序列。 Read on →


Nginx的安装和配置

nginx在工作中已经有好几个环境在使用了, 今天自己也整理一份安装文档和nginx.conf配置选项的说明,留作以后参考。

负载均衡配置(包括健康检查)、缓存(包括清空缓存)配置实例,请参考:http://seanlook.com/2015/06/02/nginx-cache-check/

ssl加密请参考:http://seanlook.com/2015/05/28/nginx-ssl/

1. 安装nginx

操作系统:CentOS 6.5_x86_64

1.1 选择稳定版本

我们编译安装nginx来定制自己的模块,首先安装缺少的依赖包:

1
sudo yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

这些软件包如果yum上没有的话可以下载源码来编译安装,只是要注意编译时默认安装的目录, 确保下面在安装nginx时能够找到这些动态库文件(ldconfig)。

http://nginx.org/en/download.html 下载稳定版nginx-1.8.0.tar.gz到/usr/local/src下解压。

为了后续准备我们另外下载2个插件模块: https://github.com/yaoweibin/nginx_upstream_check_module/archive/v0.3.0.tar.gz —— 检查后端服务器的状态, https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/c78b7dd79d0d.zip (建议在/usr/local/src下解压后将目录重命名为nginx-sticky-module-ng-1.2.6) —— 后端做负载均衡解决session sticky问题。

Read on →

利用httpd对Tomcat进行负载均衡

环境说明

操作系统:CentOS 6.5_x86_64

前提:提前准备好编译环境,防火墙和selinux都关闭

主机IP:两台机器,192.168.203.103、192.168.203.104

安装软件:jdk-8u51-linux-x64, apache-tomcat-8.0.24, tomcat-connectors-1.2.41, httpd-2.2.15, httpd-devel-2.2.15

一、两台机器都安装JAVA8

1
2
3
sudo rpm -qa | grep jdk
jdk-1.7.0_45-fcs.x86_64
sudo rpm -e jdk-1.7.0_45

下载JDK8的包

1
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz"

如果上述链接失效,请去官网下载最新的源码包。

1
2
3
4
5
6
cd /opt/
tar xzf jdk-8u51-linux-x64.tar.gz
cd /opt/jdk1.8.0_51/
sudo chown -R root:root /opt/jdk1.8.0_51/
sudo alternatives --install /usr/bin/java java /opt/jdk1.8.0_51/bin/java 2
sudo alternatives --config java

得到以下输出,选择刚刚安装的jdk8即可: Read on →


python函数装饰器详解

装饰器简介

python有着强大的表达式语法和函数特性,其中一个我的最爱便是装饰器。 在设计模式中,装饰器能够在不使用子类的情况下动态的修改函数、方法或类的功能。

当你需要扩展某个函数的功能却不想直接修改这个函数的时候,装饰器就可以派上用场了。 实现装饰器模式有很多种方法,但是python通过强大的语法支持来让这个变得相当容易。

在这篇文章中我将深入讲解Python的函数装饰器,并通过一系列的源码示例来彻底讲清楚这个东西。 所有例子都在Python2.7下运行通过,不过只需要稍作改变就可以运行在Python3上了, 甚至我猜测什么都不用改变都可以的,读者可以自己去试试。

本质上来讲,装饰器是以包装器形式工作的,其实就是在执行目标函数之前或之后加入自己的逻辑, 而不需要改变目标函数本身就可以增强它的功能,也就是说装饰了它。 Read on →


centos6上安装Hadoop和HBase

安装前的准备

操作系统:CentOS 6.5 64位

在linux环境安装Hadoop之前,我们需要使用到ssh,所以要先安装ssh,并且创建一个hadoop用户

备注: 下面所有的命令中,以#开头的表示是root用户,以$开头的是普通用户

安装SSH

先切换到root用户,执行下列步骤

1
2
3
4
5
rpm -qa |grep ssh  #检查是否装了SSH包
yum install openssh-server  #安装ssh
chkconfig --list sshd #检查SSHD是否设置为开机启动
chkconfig --level 2345 sshd on  #如果没设置启动就设置下.
service sshd restart  #重新启动

创建hadoop用户 Read on →