2008年9月26日 星期五

jQuery的身份證驗證plugin

/**
* 驗證身份證字號是否正確的jquery plugin
* 用法:jQuery('身份證字號的id').idCheck();
* 傳回值:
* 合法---傳回true
* 非法---傳回false
* 作者:羅仁治
* 版本:1.0
* 版權:隨你使用,但須保留這段說明文字。
*/
jQuery.fn.idCheck = function(){
var real_id = this.val();
real_id = real_id.toUpperCase();


var pattern = /^[A-Z]{1}[0-9]{9}$/;
if (!pattern.test(real_id)) {
return false;
}

if (check(real_id)) {
return true;
}
else {
return false;
}


function check(real_id){
var first = real_id.substr(0, 1);
switch (first) {
case 'A':
first = '10';
break;
case 'B':
first = '11';
break;
case 'C':
first = '12';
break;
case 'D':
first = '13';
break;
case 'E':
first = '14';
break;
case 'F':
first = '15';
break;
case 'G':
first = '16';
break;
case 'H':
first = '17';
break;
case 'I':
first = '34';
break;
case 'J':
first = '18';
break;
case 'K':
first = '19';
break;
case 'L':
first = '20';
break;
case 'M':
first = '21';
break;
case 'N':
first = '22';
break;
case 'O':
first = '35';
break;
case 'P':
first = '23';
break;
case 'Q':
first = '24';
break;
case 'R':
first = '25';
break;
case 'S':
first = '26';
break;
case 'T':
first = '27';
break;
case 'U':
first = '28';
break;
case 'V':
first = '29';
break;
case 'W':
first = '32';
break;
case 'X':
first = '30';
break;
case 'Y':
first = '31';
break;
case 'Z':
first = '33';
break;
}

var value = first.concat(real_id.substr(1, 8));

var sum = parseInt(value.substr(0, 1));

for (var i = 1; i <= 9; i++) {
sum = sum + parseInt(value.substr(i, 1)) * (10 - i);
}

single = 10 - (sum % 10);

if (parseInt(real_id.substr(9, 1)) == single) {
return true;
}
else {
return false;
}
}
};

2008年9月25日 星期四

身份證字號的validator

下面程式是參考
http://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%9C%8B%E6%B0%91%E8%BA%AB%E5%88%86%E8%AD%89


這篇文章的身份證字號檢查公式,轉換成Zend framework的validator,進行身份證號碼的驗證。

有了公式之後要進行驗證就比較容易,不用看程式碼去倒推公式,如果沒有公式,光看程式碼,看個老半天,也看不出個所以然來,還要去適應各種程式碼的寫法,太累了,這個公式真是造福大家,直接將公式轉換成Zend Framework的程式碼,就容易多了。

require_once('Zend/Validate/Abstract.php');

class App_Validate_IdCheck extends Zend_Validate_Abstract{
const SIZE='size';
const FORMAT='format';
const CHECK='check';

protected $_messageTemplates=array(
self::SIZE=>"'%value%' 身份證字串長度不符合。",
self::FORMAT=>"'%value%' 的第一個字元必須是英文字母,其他必須是數字。",
self::CHECK=>"'%value%' 是非法的身份證字號。"
);

public function isValid($value){
$this->_setValue($value);
if(strlen($value) !=10){
$this->_error(self::SIZE);
return false;
}

$value=strtoupper($value);
if(!ereg("[A-Z]{1}[0-9]{9}",$value)){
$this->_error(self::FORMAT);
return false;
}

if($this->check($value)){
return true;
}
else{
$this->_error(self::CHECK);
return false;
}
}

private function check($value){
$first=array('A'=>10,'B'=>11,'C'=>12,'D'=>13,'E'=>14,
'F'=>15,'G'=>16,'H'=>17,'I'=>34,'J'=>18,
'K'=>19,'L'=>20,'M'=>21,'N'=>22,'O'=>35,
'P'=>23,'Q'=>24,'R'=>25,'S'=>26,'T'=>27,
'U'=>28,'V'=>29,'W'=>32,'X'=>30,'Y'=>31,
'Z'=>33);
/**
* convert the first alpha character to two digits
* and combines to the rest digits
*/
$value=$first[$value[0]].substr($value,1);

$sum=(int)$value[0];
for($i=1;$i<=9;$i++){
$sum+=$value[$i]*(10-$i);
}

/**
* get the single-digit of 10-$sum
*/
$single=10 - ($sum % 10);

if($single == $value[10]){
return true;
}
else{
return false;
}
}
}

判斷身份證字號的處理邏輯

http://blog.nahoya.com/archives/2007_12/177

http://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%B0%91%E5%9C%8B%E5%9C%8B%E6%B0%91%E8%BA%AB%E5%88%86%E8%AD%89

處理邏輯
1.判斷身份證字號的字串長度,長度必須等於10個字元。
2.判斷身份證字號的字串格式,第一個字元必須是英文字母,第二個字元必須是數字1或數字2,其他的字元必須是數字。
英文
縣市 / 地區
數字
A
台北市
10
B
台中市
11
C
基隆市
12
D
台南市
13
E
高雄市
14
F
台北縣
15
G
宜蘭縣
16
H
桃園縣
17
I
嘉義市
34
J
新竹縣
18
K
苗栗縣
19
L
台中縣
20
M
南投縣
21
英文
縣市 / 地區
數字
N
彰化縣
22
O
新竹市
35
P
雲林縣
23
Q
嘉義縣
24
R
台南縣
25
S
高雄縣
26
T
屏東縣
27
U
花蓮縣
28
V
台東縣
29
W
金門縣
32
X
澎湖縣
30
Y
陽明山管理局
31
Z
連江縣
33
3.每個縣市都有一個相對應的英文字母代表,每個英文字母也都有一個對應的二位數
4.將英文字母轉換為二個數字字元與原來的數字字串進行合併,轉換為十一個數字字元。
5.轉換後的數字字串總共有11個數字字元,將前十個數字進行如下的運算
第一個數字+
第二個數字*9+
第三個數字*8+
第四個數字*7+
第五個數字*6+
第六個數字*5+
第七個數字*4+
第八個數字*3+
第九個數字*2+
第十個數字*1
6.第5個步驟運算得到的和,只取個位數部份
7.用十減去第6步驟得到的值,與第4步驟得到的值的第十一個數字字元進行比對。
如果相同,表示身份證字號是正確的
如果不相同,表示身份證字號是不正確的

2008年9月14日 星期日

字型位置

ubuntu上字型放置的位置

/usr/share/fonts/truetype/

要用到gd函式庫配合php輸出時就要用到字型了

2008年9月12日 星期五

防堵apache的dos攻擊

http://www.novell.com/coolsolutions/feature/19958.html

第一步
安裝apache的evasive模組
apt-get install libapache2-mod-evasive

第二步
(1)/etc/apache2/mods-enabled

(2)/etc/apache2/mods-available

在(1)這個目錄下建mods-esave.conf檔,內容如下,
再將這個檔soft link到(2)這個目錄


DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10


第三步
重新啟動apache

第四步
連接測試網站,以非常快的速度快按重新整理,如果出現403 forbidden表示安裝成功。

2008年9月3日 星期三

樹狀目錄plugin

http://abeautifulsite.net/notebook.php?article=58

上面這個網址的jquery的plugin可以顯示目錄下的檔案結構,還附上php程式碼,可以直接拿來用在網站上,如果要改寫,應該不難,只要php檔輸出的格式跟css檔難搭到就可以了。

css:負責外貌
php:負責內容輸出
jquery plugin:負責取回php輸出的資料並將資料顯示或隱藏

2008年9月2日 星期二

下載檔案的問題

Zend Framework的response物件會暫存許多網頁內容,要將存入資料庫中的檔案下載前,必須清空response物件,不然會出現錯誤訊息,這個錯誤找了好久,才找到。

多加一道命令,清空respone物件

$this->getResponse()->clearBody();

ie跟firefox處理下載的中文檔名方式也不同,經由ie下載的檔案要先以urlencode()函數處理過,才能下載,經由firefox下載的檔案就不能以urlencode()函數處理過,不然下載的檔名會是編碼過的字串。

處理的邏輯,不難,只要判斷使用者的瀏覽器類型,再分別處理就可以了。

2008年9月1日 星期一

分頁的action helper

很久之前就想要寫一個分頁的物件,本來的構想是在server端把資料的總頁數抓出來後,再送到client,使用jQuery的pagination plugin進行處理,不過如果完全由jQuery的plugin進行處理,會有安全性的問題,一定要由server端再進行確認的處理,同樣的事情,server端及client端,兩邊都要做,真的是有點囉嗦,後來就決定完全由server端進行分頁的處理。

server端的分頁物件的撰寫邏輯是這樣的:

如果頁數少於或等於十筆,就顯示全部頁數。

如果頁數大於十筆,就分成三種狀況做處理

目前頁數小於第五頁,就顯示1~5頁及最後兩頁,其他的用三個點號顯示

總頁數減目前頁數的絕對值小於或等於五頁,就顯示前二頁及最後五頁,其他的用三個點號顯示
非以上兩種狀況,就顯示前二頁及最後兩頁及目前頁數與目前頁數的前二頁與後二頁,其他的用三個點號顯示

分頁的外觀設定,就由client端的css做設定,server端的程式就專注在頁數的計算,將程式邏輯及外觀設定做清楚的切割。

分頁物件的css設定

在樣板中將server傳來的page資料用div包起來,設定顯示的css碼即可

假設div的設定是
server傳來的page資料


非目前頁數的css設定

.page ul li a{
css設定資料
}

目前頁數的css設定

.page ul li span{
css設定資料
}

整個物件花了不少時間思考,該怎麼做,想通後,心裡滿高興的,雖然網路上有非常多的分頁物件可以參考,不過要一行行拆解,真是花時間,而且看得頭昏眼花,眼睛不舒服,就不太想再看這些程式碼了,最後還是決定自己寫一個,比較能夠掌控,而且整個物件的用法也有一致性,不會感覺怎麼有個物件的用法跟整個程式的搭配度不太吻合。