在河里抓鱼的熊

抓鱼杂谈

Archive for the ‘实用技巧’ tag

身份证校验码规则(程序实现)

without comments

概述

18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确规定。

GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。

公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其含义如下:

  1. 地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
  2. 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位、2位数字表示,之间不用分隔符。
  3. 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。

校验位的计算方式

  1. 对前17位数字本体码加权求和

    公式为:S = Sum(Ai * Wi), i = 0, … , 16
    其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

  2. 以11对计算结果取模

    Y = mod(S, 11)

  3. 根据模的值得到对应的校验码,对应关系为:

    Y值: 0 1 2 3 4 5 6 7 8 9 10
    校验码: 1 0 X 9 8 7 6 5 4 3 2

  4. javascript编程实现(chrome中测试通过):

    function getCheckCode(code){
    	if(typeof code !== "string")
    		alert("身份证号需要以字符串格式输入,不是数字。请在输入的身份证号两端加上双引号(\")");
    	var W = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
    	var checkcode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
    	var A = new String(code), S=0;
    	for(var i=0; i<A.length; i++){S+=(A[i]*W[i])}
    	console.log('A.length='+A.length+'\nS='+S);
    	var Y = S%11;
    	return checkcode[Y];
    }
    

Written by qianxiong

December 17th, 2011 at 9:24 pm

更新ear/jar包内部部分内容

without comments

地球人都知道ear项目打包发布很麻烦,有时候就一个字的更改,也得要重新导出(Export)整个项目,耗时又费力。倘若能直接更新指定的那个jsp/class/js/css/png文件,而且只需几秒钟,觉得这个方案很好的有木有?那好,我就把尝试N多次终于成功的方法告诉你,有钱的捧个钱场,没钱的捧个人场!

关键语法:

jar uf xxxx.ear absolutePath/filename

一般步骤:

  1. 如果没有子路径,那就直接把替换文件拿过来,放在当前路径下,按上面语法执行;
  2. 如果有子路径,比如META-INF/则先建立这个目录路径。更方便的方式是解压出那个指定的文件,这样就自动生成了子路径。语法如下:
    jar xf xxxx.ear absolutePath/filename

    然后把替换文件放到相应位置,或者直接在解压出来的文件上编辑,完成后按上面语法执行;

Examples:

单层压缩包:

  1. 由于采用了新版的log4j,现在需要更新NGBBoss.ear根目录下的log4j.jar:
    jar uf NGBBoss.ear log4j.jar
  2. 更新NGBBoss.ear中META-INF/目录的application.xml文件:
    jar uf NGBBoss.ear META-INF/application.xml

    注意:外部文件application.xml也得要有一个对应的父目录META-INF/与执行jar命令时的当前路径下。也就是说,当前路径下要有NGBBoss.ear META-INF/ 这两个东东,而application.xml在META-INF/下。

多层压缩包更新:

  1. 如果要更新ear包内的war包中的某个jsp/jpg/html/css/js怎么办?那就只能麻烦一点:
  2. 先把war包取出来;
  3. 再把那个jsp/jpg/html/css/js文件解压出来;
  4. 修改/替换;
  5. 按单层压缩包的更新方式把war包更新了;
  6. 按单层压缩包的更新方式把ear包更新了;

Written by qianxiong

August 15th, 2011 at 12:44 pm

解锁Oracle表

without comments

两句话:

  1. 查询被锁表的相关信息
    select
      se.username, obj.object_name, obj.object_id, lk.session_id, se.serial#
    from
      user_objects obj,
      v$locked_object lk,
      v$session se
    where
      lk.object_id=obj.object_id
      and
      lk.session_id=se.sid;
  2. 解锁
    alter system kill session '{sid},{serial#}';

Written by qianxiong

July 29th, 2011 at 5:51 pm

在旧有项目上开发新功能

without comments

背景:

公司有一套项目的统一版本,一个由6个子项目组成的ejb项目,子系统分别是:commons, dao, bussiniselogic, ejbFacade, delegate, webapp。如果更改了一个jsp页面还好说,把jsp上传到服务器即可;但如果是更改了Action,那就麻烦了:重新打包、发布、重启服务器。项目大了打包发布就很耗时,如果大家很有时间,还打算利用这段时间喝杯咖啡,聊两句,那就无所谓了。如果很着急,或者急于看到自己的更改结果。那最好另想办法让你的程序编译-打包-发布过程快一点!

实践:

下面的方法经是我在经过实践证明可行的:

  1. 新建一个动态web项目。

    命名为webappNew。在build path(如src/main/java/)下对应建立相应项目的名称(commons/, dao/, bussiniselogic/, webapp/)。更改build path,将以上新建的几个子目录设置为build path。别忘了把该有的项目引用和依赖加入进来!

  2. 只在这个新项目下工作。

    开发过程中,将本该放在子项目中的新代码放在这些对应目录之下,如dao下要新增一个类com.maywide.oss.web.util.mkuser.java, 此代码本该新增在项目dao下,但是现在放在此web项目的dao/目录下。这样的目的是不再对dao项目重新编译打包,发布的时候只对此新项目编译、打包。这样能节约很多时间。

  3. 重构/集成

    项目开发完毕,需要对整个项目重构。有了前面新建的对应项目名称的目录,重构将非常简单。只需要将各个目录下的代码copy到对应项目中去就行了!然后删除在第1步中新建的web项目。

问题:

  1. 原web项目不参与编译,新页面怎么运行?

    原有的web项目中带有登录功能、js库、css库、框架设计、BaseAction、BaseAF等等基础内容。如果新建的项目中是完全干净的,所有代码都是新开发的,那没有了这些支撑新web页面/功能正常运行的基础设施,新的web项目是无法正常运行甚至不能运行的。所以,这里有了一个方案:

    1. 新建一个J2EE Utility Project,命名为webappU。将原web项目中的build path复制到webappU,并设置相同的build path,包括resource。
    2. 将webappU包含到webappNew的Java EE module Dependencies中。这样新开发的Action/AF/Bean就可以引用到原有的基础框架。
    3. 将css/、common/、images/、inc/、js/、WEB-INF/、index.jsp等顶层文件拷贝到webappNew中。其它功能按需添加。
  2. 如何进行团队协作?

    以前我们直接使用svn,但是现在webappNew是要被删除的,如何协作呢?Git是一个不错的选择。尤其对于连接服务器不方便但又需要团队协作的情况下!

 

Insert mode

Written by qianxiong

July 2nd, 2011 at 4:48 pm

VIM查找时需要转义的字符

without comments

首先,VIM中在查找时使用正则表达式进行。但是,不能将平常的正则表达式直接搬过来使用。原因是标准正则中有些符号与VIM中的一些固有符号有冲突,这时就需要对这些符号转义,才能表示这个符号表示正则表达式的操作符,否则表示VIM操作符或者字符本意。

对于这些将在VIM Search时需要转义的字符总结如下:

  1. |
  2. &
  3. ()
  4. +
  5. =
  6. ?
  7. \{n,m}  n到m个,按最多匹配
  8. \{-n,m}  n到m个,按最少匹配
  9. <>  匹配单词边缘

Written by qianxiong

September 16th, 2010 at 10:37 am

Posted in 经验之谈

Tagged with , ,

命令行下批处理图片

without comments

每次拍完照片之后,因为照片太大无法直接上传到空间里面,需要将照片缩小。这时总是因为工作量太大而无法让人望而生畏。如果使用windows,而且手头又有photoshop,那很好。因为photoshop里面有个批处理功能叫Action,但是没有在windows下,更没有photoshop,有没有简便的方法可以做这种简单重复的事情呢?
答案是肯定的。那就是命令行的”imagemagick”!imagemagick是一组命令,包括convert, identify, mogrify, composite, montage, compare, stream, display, animate, import, conjure.
使用convert命令对原图做缩放处理,并将缩放后的图片放到resized/目录中:

find . -maxdepth 1 -name '*.JPG' -exec convert {} -resize '1024x1024' resized/{} \;

某些网站的图片上传功能要求后缀名小写,这时需要做一次转换。使用如下命令:

for f in *; do mv $f `echo $f | tr '[:upper:]' '[:lower:]'`; done

或者使用如下命令(更简单):

find resized -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

详情请看这里这里

Written by qianxiong

July 28th, 2010 at 5:56 pm