在网站上实现对身份证号码合法性的校验可以有效预防 PHP 脚本接收到注册表单传递过来的非法身份证号码。

中国(大陆)公民身份证号码每一位所代表的意义,网上很多文章都有介绍,在此就不赘述。其中身份证号码的最后一位是校验码,根据前 17 位计算得到。算法大概是这样:把前 17 位的每一个数字和一串加权因子相乘,再计算这些乘积的和;把这些乘积的和模 11 得到的数字作为序号,最后在一个校验码串中提取出与序号相对应的字符。当然,网上也有不少文章描述如何计算这个校验码,下面尝试用 PHP 脚本来完成这一工作。

假设某中国(大陆)公民的身份证号码前 17 位是:44010221990101001(注:此人出生于2199年)。根据上面的算法,代码应该是这样的:

<?php
$body 
'44010221990101001'//身份证号码前 17 位,可以从各种数据源中获得(如数据库、用户提交的表单等)
$wi = array(7910584216379105842); //加权因子
$ai = array('1''0''X''9''8''7''6''5''4''3''2'); //校验码串

for ($i 0$i 17$i ++) //按顺序循环处理前 17 位
{
    
$b = (int) $body{$i}; //提取前 17 位的其中一位,并将变量类型转为实数
    
$w $wi[$i]; //提取相应的加权因子
    
$sigma += $b $w//把从身份证号码中提取的一位数字和加权因子相乘,并累加
}

$number $sigma 11//计算序号
$check_number $ai[$number]; //按照序号从校验码串中提取相应的字符
echo $body $check_number//输出
?>
运行以上代码之后,可以算出该身份证的校验码为 9 。

- 阅读剩余部分 -

这里是中央电视台、这里是中央电视台。公元 2008 年 1 月 11 日 8 时 41 分,本台收到热心观众 badbuild 发来的一条短讯,内容是:

我妻高××今天早晨顺利生下大胖儿子,我做爸爸啦!——胡××。 本台代表全国十四亿同胞向 badbuild 发去了慰问回电:

恭喜 BB、贺喜 BB;BT 出世、一统江湖。 这是令人激动的一天,这是令人难忘的一天;这是伟大的一天,这是深刻的一天;这是承前启后、继往开来的一天,这是长江后浪推前浪、跟着前浪一起晃的一天。就在这一天、就在今天,BT 出世了。全国人民笑了、沸腾了,中国人民的 BT 事业后继有人了!

欲知更多有关 BT 的故事,请访问 BT 之家:BBITT.com

最近折腾了一台 HP Pavilion dv2727tx,着实让我烦闷。首先,这机器的价格在杭州大约在 8.3K 上下,预装 Windows Vista Home Premium。从 Vista 折腾到 XP,然后很无奈地再从 XP 折腾回 Vista 大约花了十个小时(累计时间)。在此顺带拜谢 Hewlett-Packard 公司及其售后技术支持工程师、Microsoft Corporation

整个折腾过程是这样的。该机器出厂预装 Vista 及一大堆 HP 的垃圾软件,整个硬盘 160GB 只有两个分区:C 分区 140GB,安装好的 Vista 及 HP 捆绑软件净占 20GB;D 分区是 HP 的系统恢复数据备份分区。在如此 BT 的分区情况下,不得不尝试对其实施重新分区。由于该机器并未自带恢复光盘,只带了一张关于系统恢复的说明的纸,上面写着若需要 HP 系统恢复光盘,请到某处订购;所以寻思着使用 PQ 或类似功能的软件来实施分区调整。尝试了 PQ 并找寻了众多同类软件,均不支持 Vista 系统。而使用第三方系统引导盘进入 DOS 然后打开 PQ 并不能查询到当前磁盘的分区情况。无奈之下打算对其实施全盘重新 FDISK,然后安装 XP 系统。

接下去使用了 XP 系统安装光盘的分区工具对硬盘实施了重新分区,但不能顺利安装 XP 系统。到检测系统设备那一步就会蓝屏,然后报 ACPI 的错误。致电 HP 售后技术支持,被告知需要刷 BIOS 才可以解决该机器不能安装 XP 系统的问题。据 HP 某工程师说,这是 HP Pavilion dv2000 系列的通病,属于主板 BIOS 版本问题。而这位工程师建议的刷 BIOS 行为是对该机器主板 BIOS 的一次降低版本操作,dv2727tx 默认配置的 BIOS 版本是 F.21,需要刷回到 F.13 才能解决问题。暂且不谈本人对该工程师的敬仰犹如滔滔江水连绵不绝,诧异之下在网上找到了这样一段文字

HP 最近推出了一批新型号的机器,很多人在改装 XP 的时候遇到很多问题,解决方法:
必须刷 BIOS 才能装 XP 的机型:DV272X(DV2726、2727、2728、2729),V370X 系列(V3704、3706)。
这几个型号的机子一定要刷回 F13 的 BIOS 才能够顺利装 XP ,那种按 F7 的安装法虽然可以成功安装 XP ,但有几个致命缺陷:
1、有两个设备的驱动是黄色惊叹号,分别是软盘驱动器和 ICH8 2843;
2、无线网卡可以装上驱动但搜索不到无线网络;
3、不能正常关机。
当然刷 F13 的 BIOS 后也不是十全十美,尽管驱动可以全部顺利装上,也没有 F7 安装法出现的问题,但是在声卡驱动上还是存在问题(声卡是 Conexant HD SmartAudio 221,HP 的新机器的声卡基本上都换成这个声卡),表现为声卡可以正常工作,但是麦克风不能正常工作,插上耳机的话喇叭和耳机会同时发声,只能等 HP 发布新的 XP 声卡驱动了。但相比 F7 安装法刷 BIOS 的方法存在的问题相对比较可以忽略,当然刷 BIOS 会有风险,刷不刷就由你了。
其他象 V374X(3743、3742等)型号的机器可以不用刷 BIOS 就能够照老方法装 XP,驱动也可以全部装上,当然声卡和上面要刷 BIOS 的机器存在一样的问题。
附上 F13 和 F21 的 BIOS 地址:
F13:ftp://ftp.hp.com/pub/softpaq/sp36501-37000/sp36745.exe
F21:ftp://ftp.hp.com/pub/softpaq/sp37501-38000/sp37915.exe
PS:DV272X(DV2726、2727、2728、2729),V370X 系列(V3704,3706)的 BIOS 是可以通用的,刷之前最好把电池也装上再插电,以免发生断电意外。另外刷 BIOS 必须进 VISTA 或用进 VISTA PE 刷,再次提醒:刷 BIOS 会有风险,请三思而行。
链接:http://blog.zol.com.cn/624/article_623887.html
这款机器比较特殊,过段时间就会有解决方法的,HP 客服现在也没有最新的可以解决声卡的驱动。
看到这里我真的吐血了。刷 BIOS 肯定是不行的,毕竟不是自己的机器,不能轻易尝试。试着在安装 XP 的时候按 F7 跳过电源设备检测,确实可以顺利安装好 XP 系统。当然,其后果也与上文所述一致,还多了一个声卡驱动问题,可以参看此文

万般无奈之下,打算重新装回 Vista,再寻找其他途径折腾。于是联系经销商,请他们帮忙从其他同型号的机器上制作一套 HP 系统恢复盘出来(比较后悔的是当初拿到机器的时候没有自己制作恢复盘,光等这两张恢复盘就等了半天)。拿到恢复光盘后发现 HP 的系统恢复盘只能对整个硬盘进行恢复,无法选择单个分区。我哭笑不得,只能任由 HP 来 QJ 他的儿子。

QJ 完毕之后,在 Vista 系统的磁盘管理工具中发现了 Vista 的一项新功能:对磁盘分区的收缩和扩展。但非常遗憾的是,即便是可以收缩,其最大收缩量也只能是原先分区的 50%左右。放弃之。后来再次反复折腾 PQ 与其他类似软件,均告失败。于是,我对这台机器再也没有任何想法,一丁点都没有了。

在我绝望的时候,又是一台崭新的 HP Pavilion dv2727tx 到货了。这次经销商学乖了,出货前就给重新分区了一下,较原先那台的分区情况是好多了。您知道原先那台机器最后是怎么摆平的吗?我在新的机器上安了一个 80GB 的移动硬盘,对其做了一次全盘 Ghost,然后又把移动硬盘安装到原先那台机器上,Ghost 还原。完成。

无奈了,我。真的。

公司的服务器组遍布伟大祖国的大江南北,操作系统也都不相同。最近使用 Cacti + RRDTool + Net-SNMP 对这些服务器实施了统一的性能监控管理。单纯的 Cacti 不是监控工具,她基于 AMP 环境和 SNMP 协议,使用 snmpget 获取流量数据,使用 RRDTool 组件绘图。并且 Cacti 有个别名,叫做“仙人掌”。她的界面非常漂亮,你根本无需明白那些 RRDTool 的复杂参数就能轻易地绘出漂亮的图形。另外,她提供了强大的数据管理和用户管理功能,可以与 LDAP 结合进行用户的验证。还提供了自定义模板的功能,让你添加自己的 snmp_query 和 script。可以说,Cacti 将 RRDTool 复杂难懂的缺点都补足了。所以,Cacti 被认识是 MRTG 的最佳替代品。

1、监控管理端配置

监控端基于 FreeBSD 6.2 操作系统、AMP(ApacheMySQLPHP)环境,其安装配置过程在此不赘述,请寻求搜索引擎的帮助。值得注意的是,PHP 最好加上 SNMP 的支持。在编译的时候,加上 -enable-snmp。另外,PHP 不能运行在安全模式下,否则 Cacti 将不正常,无法调用 /usr/local/bin/ 下面的文件。除此之外,有一种说法称 MySQL 5 以上的版本不能正常运行 Cacti,就我的个人测试,暂未发现类似的情况。

安装完 AMP 之后开始下载并安装 RRDTool。值得注意的是,RRDTool 1.2.x 版本是用 libart 和 freetype 画图,相比 1.1.x 版本,前者的绘图速度会稍稍慢一些。从 1.2.x 版本开始,RRDTool 不再自带外部的 lib 库,所以需要从这里下载这些库来安装。而 1.1.x 版本自带了 GD 库,可惜这个 GD 库不支持中文,绘中文的时候会出现乱码。

这里选用 1.2.26 版本的 RRDTool,所以需要先安装 lib 库。

安装 cgilib

#tar -zxvf cgilib-0.5.tar.gz
#cd cgilib-0.5
#vi cgi.c
去掉:

#include <malloc.h> 然后:

#vi cgitest.c 将第 116 行

printf ("<h3>Cookie "Library" set</h3>\n"); 改为:

printf ("<h3>Cookie \"Library\" set</h3>\n"); 因为 cgilib 版本为 linux 版本,用 make 无法安装,所以:

#gmake
#gmake install
#cp *.h /usr/include/
#cp libcgi* /usr/lib
安装 zlib

#tar -zxvf zlib-1.2.2.tar.gz
#cd zlib-1.2.2
#./configure --prefix=/usr
#make
#make install
安装 libpng

#tar -zxvf libpng-1.2.8-config.tar.gz
#cd libpng-1.2.8-config
#cp scripts/makefile.gcmmx makefile
#./configure --disable-shared --prefix=/usr
#make
#make install
安装 freetype(需事先安装 gmake):

#tar -zxvf freetype-2.1.10.tar.gz
#mv /usr/bin/make /usr/bin/make.bak
#./configure --disable-shared --prefix=/usr
#make
#make install
#mv /usr/bin/make.bak /usr/bin/make
安装 libart_lgpl

#tar -zxvf libart_lgpl-2.3.17.tar.gz
#./configure --disable-shared --prefix=/usr
#make
#make install
安装 RRDTool

#tar -zxvf rrdtool-1.2.6.tar.gz
#./configure
#make
#make install
#cp /usr/local/rrdtool/bin/* /usr/local/bin/
#ln -s /usr/local/rrdtool-1.2.6 /usr/local/rrdtool
安装 net-snmp

#tar -zxvf net-snmp-5.2.1.2.tar.gz
#cd net-snmp-5.2.1.2
#./configure
#make
#make install
安装完成后运行 snmpget、snmpwalk 测试是否安装成功。

安装 Cacti

#cp cacti-0.8.7a.tar.gz /www
#cd /www/
#tar -xzvf cacti-0.8.7a.tar.gz
#mv cacti-0.8.7a cacti
#chown -R www:www cacti/
分配数据库权限:

#mysql -u root -p
mysql>create database cacti;
mysql>grant all privileges on cacti.* to cactiuser@localhost 
identified by 'password';
mysql>quit;
修改 Cacti 配置文件:

#vi /www/cacti/include/config.php
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "password";
导入数据库:

/usr/local/mysql/bin/mysql -u root -p cactidb < /www/cacti/cacti.sql 设置刷新时间:

#crontab -e
*/1 * * * * /usr/local/php/bin/php /www/cacti/poller.php > /dev/null 2>&1
这里的 */1 代表每一分钟执行一次。

2、被监控端配置

2.1、FreeBSD 系统

未完待续。

2.2、Windows 2003 系统

未完待续。

前段时间折腾了一个 SQL Server 数据库异地备份解决方案,使用了一些不够完美不够和谐的方法完成了设计需求。昨天看到一款软件叫做 NcFTP,经过思考,有了下面的优化方案。

原先的方案需要在双方服务器上安置批处理并加入计划任务,他们之间的先后顺序是没有握手联系的,只能依靠时间来排序。最佳途径应该还是只在一台服务器上安置批处理。原先需要在备份服务器上通过 curl 来 pull 当天的备份,现在有了 NcFTP,我们可以让数据库服务器主动 push 备份文件到备份服务器上。

@set ftp_ip=0.0.0.0
@set ftp_port=1234
@set ftp_user=this_is_ftp_user
@set ftp_passwd=this_is_ftp_passwd
@set ncftp_path=C:/Program Files/NcFTP

"%ncftp_path%ncftpput.exe" -u %ftp_user% -p %ftp_passwd% -P %ftp_port% %ftp_ip%/tmp.rar
而删除备份服务器上的旧备份文件,也可以抛弃 Henry Xu 同学用 C++ 写的程序了,可以使用 Resource kit 里的命令 FORFILES。

- 阅读剩余部分 -