在河里抓鱼的熊

抓鱼杂谈

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

使用动态规划法实现斐波那契数列计算

without comments

动态规划法概述

动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等。

动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。
动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。

斐波那契数列计算

一般方法

javascript实现:

function fib(n){
	if(n == 1 || n == 0)
		return 1;
	return fib(n-1)+fib(n-2)
}

当计算fib(5)时
fib(5)
fib(4) + fib(3)
(fib(3) + fib(2)) + (fib(2) + fib(1))
((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
(((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
这种方法的问题在于对相同的子问题进行了多次重复计算,其计算量呈指数上升。如果能将计算过的结果存储起来,就避免了大规模的重复计算。

使用动态规划

原理:

将计算过的值存储起来,不用每次都递归计算得出。这样将极大的提高计算效率

javascript实现:

var fibmap = {0:1, 1:1};
function fib2(n){
	if(typeof fibmap[n] === "undefined"){
		fibmap[n] = fib2(n-2) + fib2(n-1);
	return fibmap[n];
}

Written by qianxiong

December 17th, 2011 at 5:04 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

使用jboss的minimal配置,加快服务器启动

without comments

jboss如果使用default配置,仅部署了一个只有index.jsp的war项目启动都要耗费17s,等待过程还是比较漫长的,加快服务器启动的方法就是采用minimal配置。

不过默认的minimal配置总是无法启动,这里摘抄一位外国友人的方法(原文)并翻译如下:

Step 1: Copy “Tomcat” Service to the Custom Configuration

cp -R server/default/deploy/jbossweb-tomcat50.sar server/custom/deploy/

Step 2: Modify Tomcat’s Configuration

找到jbossweb-tomcat50.sar/META-INF下的jboss-service.xml文件,将下面两行注释掉:
<depends optional-attribute-name="SecurityManagerService"
proxy-type="attribute">jboss.security:service=JaasSecurityManager
</depends>
<depends>jboss:service=TransactionManager</depends>

Step 3: Copy over some needed libraries

server/default/lib copy下列jar包到 server/custom/lib里:

javax.servlet.jar javax.servlet.jsp.jar jbosssx.jar jboss-j2ee.jar jboss.jar commons-logging.jar

Step 4: Try it out!

以上是以custom配置为例,其实对于minimal配置而言更广泛,同样实用。采用以上配置后,启动时间仅需3s!

Written by qianxiong

May 6th, 2011 at 1:08 am

Posted in 技术,笔记

Tagged with , ,

Javascript的对象与数组

without comments

Object:

  1. 当Object被当作函数而不是构造器被调用时,它将扮演类型转换器的角色。
    typeof 522  //"number"
    typeof Object(522) //522
    var a = Object(522);
    typeof a  //"object"
    

     

    1. Object ( [ value ] ):
      如果value为null,undefined或不提供,则创建并返回一个新的Object对象。这跟使用Object构造方法一样。
  2. Object 构造方法
  3. Object构造器的属性
    除了包含一个内部属性length(此值总是1)外,还包含: 

    1. Object.prototype
      包含三个属性:{DontEnum, DontDelete, ReadOnly}待补充
  4. Object的Prototype对象的属性
    1. Object.prototype.constructor:内建object构造器
    2. Object.prototype.toString ( ):待补充
    3. Object.prototype.toLocaleString ( ):待补充
    4. Object.prototype.valueOf ( )
    5. Object.prototype.hasOwnProperty (V):检查是否包含V属性。
      var obj = {name:"zhanglin", age:25};
      var p = obj.hasOwnProperty("name"); //p = true
      var q = obj.hasOwnProperty("sex"); //q = false
      
    6. Object.prototype.isPrototypeOf (V):待补充
    7. Object.prototype.propertyIsEnumerable (V):待补充

Array:

 

null:

undefined:

typeof:

 

Written by qianxiong

March 31st, 2011 at 1:34 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

正则与中文

without comments

在正则表达式中,拉丁字符的匹配很是方便,可是如果要匹配的内容中有中文或者中文标点符号就很恼火。今天特意对中文码表做了细致的了解,分享给大家。
按照Unicode Block分别介绍:

  1. Basic Latin(\u0020-\u007E):
    这些是基本的可见ASCII码
  2. HalfWidth and FullWidth Forms(\uFF01-\uFFEE)
    全角符号(\uFF01-\uFF60):包含了大部分中文输入法所输入的符号。
    半角符号(\uFF61-\uFFEE):
  3. Genaral Punctuation(\u2000-\u206F):
    包含减号、破折号、省略号、单双引号、百分号、千分号、章节符号、分秒符号
  4. CJK Synmbols and Punctuation(\u3000-\u303F):
    常见的有下列符号《》「」『』【】〖〗
  5. CJK Unified Ideograph(\u4E00-\u9FFF):
    包含所有的中文汉字。因为从9FCC到最后都未定义,所以正则表达式中直接验证\u4E00-\u9FCB即可。有些朋友在介绍中文的正则匹配时说是从\u4E00-\u9FA5,但是在9FA5之后还有30个可见字,8个不可识别字(已分配,但无汉字实现),虽然最后有52个编码未分配,但起码也要在9FC3处结束,而不是9FA5。
  6. CJK Compatibility Ideographs(\uF900-\uFAFF):
    另一块汉字区域。FADA-FAFF未分配,所以仅在\uF900-\uFAD9有汉字。不过,这一区域的汉字在CJK Unified Ideograph块中都存在,不知道当初卫生么会分配这么一小块来放汉字!

Written by qianxiong

July 1st, 2010 at 1:21 pm

Posted in 技术

Tagged with , ,