权记

一个关于我们生活点滴的网站,一个记录我们酸甜苦辣的日志。

Archive for the ‘编程相关’ Category

最近有项目在用,于是整理了下,分Javascript版和Java两个版本,不过实现大同小异:

Java实现,分成两个方法,方便获取:

public static boolean getSexFromID(String val) {
		boolean sex = false;
		// 15位身份证号码
		if (15 == val.length()) {
			if (Integer.valueOf(val.charAt(14) / 2) * 2 != val.charAt(14))
				sex = true;
			else
				sex = false;
		}
		// 18位身份证号码
		if (18 == val.length()) {
			if (Integer.valueOf(val.charAt(16) / 2) * 2 != val.charAt(16))
				sex = true;
			else
				sex = false;
		}
		return sex;
	}

	public static Date getBirthdayFromID(String val) {
		String birthday = "";
		// 15位身份证号码
		if (15 == val.length()) {
			birthday = val.charAt(6) + "" + val.charAt(7);
			if (Integer.parseInt(birthday) < 10) {
				birthday = "20" + birthday;
			} else {
				birthday = "19" + birthday;
			}
			birthday = birthday + "-" + val.charAt(8) + "" + val.charAt(9)
					+ "-" + val.charAt(10) + "" + val.charAt(11);
		}
		// 18位身份证号码
		if (18 == val.length()) {
			birthday = val.charAt(6) + "" + val.charAt(7) + "" + val.charAt(8)
					+ "" + val.charAt(9) + "-" + val.charAt(10) + ""
					+ val.charAt(11) + "-" + val.charAt(12) + ""
					+ val.charAt(13);
		}
		return birthday;
	}

Javascript实现:

function showBirthday(val){
    var birthday;
    var sex;
    //15位身份证号码
    if (15 == val.length) {
        birthday = val.charAt(6) + val.charAt(7);
        if (parseInt(birthday) < 10) {
            birthday = '20' + birthday;
        }
        else {
            birthday = '19' + birthday;
        }
        birthday = birthday + '-' + val.charAt(8) + val.charAt(9) + '-' + val.charAt(10) + val.charAt(11);
        if (parseInt(val.charAt(14) / 2) * 2 != val.charAt(14))
            sex = '男';
        else
            sex = '女';
    }
    //18位身份证号码
    if (18 == val.length) {
        birthday = val.charAt(6) + val.charAt(7) + val.charAt(8) + val.charAt(9) + '-' + val.charAt(10) + val.charAt(11) + '-' + val.charAt(12) + val.charAt(13);
        if (parseInt(val.charAt(16) / 2) * 2 != val.charAt(16))
            sex = '男';
        else
            sex = '女';
    }
    return sex|birthday;
}

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。

比起之前用的HTMLParser方便很多,而且更轻便。

简单一句就可以搞定HTML过滤:

String  tt ="你访问的是<a href='http://www.quanlei.com/' target='_blank'>权记</a>网站。";
System.out.println(Jsoup.parse(tt).text());

同时还有其他一些更好的支持,比如:

1、对 HTML文档中链接可以进行处理。
2、对可能怀有恶意的HTML进行处理。
3、对 HTML 修改节点的属性、内容等。

更多内容,请查看 jsoup 或者 http://www.oschina.net/p/jsoup

JSON(Java Script Object Notation),是一种语言无关的数据交换格式。 JSON插件是Structs 2 的Ajax插件,通过利用JSON插件,开发者可以很方便,灵活的利用Ajax进行开发。

Json是一种轻量级的数据交换格式,JSon插件提供了一种名为json的Action ResultType 。一旦为Action指定了该结果处理类型,JSON插件就会自动将Action里的数据序列化成JSON格式的数据,并返回给客户端物理视图的JavaScript。简单的说,JSON插件允许我们在JavaScript中异步的调用Action。

而且Action不需要指定视图来显示Action的信息显示而是由JSON插件来负责具体将Action里面具体的信息返回给调用页面。Json的数据格式可简单如下形式: person = { name: ‘Jim’,age: 18,gender: ‘man’}。

如果action的属性很多,我们想要从Action返回到调用页面的数据。这个时候配置includeProperties或者 excludeProperties拦截器即可。而这2个拦截器的定义都在struts2的json-default包内,所以要使用该拦截器的包都要继承自json-default。

<struts>
    <constant value="spring" name="struts.objectFactory" />
    <include file="struts-admin.xml"></include>
    <package name="default" extends="json-default">
        <action class="com.person.PersonAction" name="person" method="view">
            <result type="json">
                <param name="includeProperties">person\.name,persoon\.age,person\.gender </param>
            </result>
        </action>
    </package>
</struts>

Read More

Spring Filter Ordering

相关介绍:

Spring 官方英文:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/security-filter-chain.html#d4e1307

中文翻译:http://www.family168.com/tutorial/springsecurity3/html/web-infrastructure.html#d0e2828

更多介绍:http://www.family168.com/oa/springsecurity/html/ch101-filters.html

本周主题:Apache Nginx Tomcat集群

最近这段时间一个项目处于最后的调试,上线阶段,服务器和程序的优化方面成为最近的重点,以确保项目上线后可以达到预定的目标。

最终上线的配置是Apache+Tomcat集群,Nginx仅仅参与了一下测试,算是体验下,以后估计会在前端上多多使用。

Apache前端使用的是反向代理配置方式,Session Sticky,Tomcat配置sessionDB。

Apache基本上采用默认配置,由于使用prefork模式,因此调整了prefork下的一些参数配置。

Tomcat调整了连接数,Apache和Tomcat在同台机子上,调整了Linux系统的ulimit。

Nginx做前端时,没有配置session同步,压力测试的表现方面,没发现Apache和Nginx有太大差异,不过有一次Apache前端被压挂了,无法关闭httpd。

另外这次将GlashFish和Tomcat做了一个简单的对比,发现GlashFish+自身连接池测试效果要好于Tomcat+DBCP连接池,表现方面一个是内存使用上,另一个是数据库连接数和响应上。

对explain的各个属性一知半解,今天详细的了解一下。 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。

本周主题 — MySQL Explain 详解

Explain语法:explain select … from … [where ...]

例如:explain select * from news;

输出:

+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

下面对各个属性进行了解:

1、id:这是SELECT的查询序列号

2、select_type:select_type就是select的类型,可以有以下几种:

SIMPLE:简单SELECT(不使用UNION或子查询等)

PRIMARY:最外面的SELECT

UNION:UNION中的第二个或后面的SELECT语句

DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询

UNION RESULT:UNION的结果。

SUBQUERY:子查询中的第一个SELECT

DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

DERIVED:导出表的SELECT(FROM子句的子查询)

Read More

和程序打交道的朋友,工作中很难避免不使用正则表达式,因为它可以很大程度上简化复杂和繁琐的字符串处理工作,关于正则表达式,wikimedia上是这样解释的:一个正则表达式通常被称为一个模式 (pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。详细介绍参见这里:正则表达式

本周主题:正则表达式

首先介绍一个不错的正则表达式入门教程:《正则表达式30分钟入门教程》,即使你之前没接触过,也可以很容易入门应用。当然实际看下来肯定不止30分钟了,这篇文章作者几经修正浓缩了一些精华,让想接触的朋友更好的入门和使用,特别推荐。

另外推荐使用的是正则表达式验证工具:REGex TESTER  http://www.regextester.com/ , 随时可以将写好的正则表达式进行在线实时验证。

正则表达式说起来有不少使用方法,但是平常使用的正则表达式还是稍微比较简单,大部分都属于验证框架 或者 服务器上面的一些rewrite规则使用。

下面就整理和收集了一些常用的正则表达式,以备不时之需。

Validate 框架相关

1、匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

2、匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*

3、匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

4、匹配国内电话号码(这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等): \(?0\d{2}[) -]?\d{8}

5、匹配IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

6、匹配身份证:\d{15}|\d{18}

7、用户名可使用中文、英文字母(区分大小写)、数字或部分特殊字符(. _ – @),长度为4~20个字符:/^[\u4e00-\u9fa5A-Za-z0-9\_\-\.@]$/ig

Read More

项目做压力测试的时候难免会碰上数据库压力比预期的高,这个时候就要进行数据库和sql优化,其中一个很好的办法便是分析数据库的慢查询日志。

以前都是手动打开浏览,或者通过Mysql自带的mysqldumpslow来查看,今天分享另外一个工具:mysqlsla

hackmysql.com推出的一款MySQL的日志分析工具

整体来说, 功能非常强大. 数据报表,非常有利于分析慢查询的原因, 包括执行频率, 数据量, 查询消耗等.

格式说明如下:

总查询次数 (queries total), 去重后的sql数量 (unique)

输出报表的内容排序(sorted by)

最重大的慢sql统计信息, 包括 平均执行时间, 等待锁时间, 结果行的总数, 扫描的行总数.

Count, sql的执行次数及占总的slow log数量的百分比.

Time, 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比.

95% of Time, 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间.

Lock Time, 等待锁的时间.

95% of Lock , 95%的慢sql等待锁时间.

Rows sent, 结果行统计数量, 包括平均, 最小, 最大数量.

Rows examined, 扫描的行数量.

Database, 属于哪个数据库

Users, 哪个用户,IP, 占到所有用户执行的sql百分比

Query abstract, 抽象后的sql语句

Query sample, sql语句

除了以上的输出, 官方还提供了很多定制化参数, 是一款不可多得的好工具.

安装和使用也非常简单
安装:

tar zxf http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz
cd mysqlsla-2.03
perl Makefile.PL
make
make install

简单使用:

— Slow log: mysqlsla -lt slow slow.log

— General log: mysqlsla -lt general general.log

— Binary log: mysqlbinlog bin.log | mysqlsla -lt binary -

mysqlsla会自动判断日志类型,缺省会打印出前十条结果,可以通过类似“–top 100”的参数来修改,如果觉得每次输入麻烦,还可以建立一个配置文件“~/.mysqlsla”,在文件里写上:top=100,这样就不用每次都手动输入参数了。

网上看到一篇很好的介绍Bridge模式的文章,分享给大家。

蜡笔与毛笔的故事:http://www.cnblogs.com/zhenyulu/articles/67016.html

蜡笔12种颜色,三类笔,共3×12=36

毛笔12种颜色,三类笔,共3+12=15

通过Bridge模式,我们把乘法运算3×12=36改为了加法运算3+12=15。

作者通过蜡笔盒毛笔的例子,通俗的介绍了Bridge模式的好处之一。

Drawing in code

之前介绍了一个Swing做的原子钟的效果 “Swing Nixieclock(原子钟)效果”,作者放出了制作 Swing原子钟 制作的主要元素 – 原子钟的制造过程。

想看制作过程的移步这里:

Part One

先通过绘图工具,绘出原型,绘制过程以及绘制时的参数,要在Swing中使用。

Part Two

将原型绘制过程中的一些数据,以Java Code 的形式在Swing中体现出来,步骤和通过绘图工具绘制时差不多,一步步来。