最近有项目在用,于是整理了下,分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>
相关介绍:
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语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
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子句的子查询)
和程序打交道的朋友,工作中很难避免不使用正则表达式,因为它可以很大程度上简化复杂和繁琐的字符串处理工作,关于正则表达式,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
项目做压力测试的时候难免会碰上数据库压力比预期的高,这个时候就要进行数据库和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模式的好处之一。
之前介绍了一个Swing做的原子钟的效果 “Swing Nixieclock(原子钟)效果”,作者放出了制作 Swing原子钟 制作的主要元素 – 原子钟的制造过程。

想看制作过程的移步这里:
先通过绘图工具,绘出原型,绘制过程以及绘制时的参数,要在Swing中使用。
将原型绘制过程中的一些数据,以Java Code 的形式在Swing中体现出来,步骤和通过绘图工具绘制时差不多,一步步来。