2008/10/31

[ Java ] About Method Overloading

Java 方法成員多載 (Method Overloading) 範例:


public class CMath1 {
int Add(int num1, int num2) {
return (num1+ num2);
}
double Add(double num1, double num2){
return(num1 + num2);
}
}


public class MethodOverloading {
public static void main(String[] args) {
CMath1 sum = new CMath1();
int a1 = 50, a2 = 20;
System.out.println(a1 +"+"+a2+"="+sum.Add(a1, a2));
double d1 = -10.99, d2 = 4.11;
System.out.println(d1+"+"+d2+"="+sum.Add(d1, d2));
}
}

輸出:

50+10=60
-10.99+4.11=-6.88

說明:

Java 所提供的方法成員多載(Method Overloading)允許程式設計師使用相同的方法名稱命名,在傳統的程式語言中方法(或稱函數)只要參數中的個數或型態不同就必需要獨立使用不同的方法名稱,因此造成許多設計上的不便,上頭為兩數交換的程式會使用相同的Add()方法名稱,而Java會自動針對所使用的參數個數及型態去判斷並執行所對應的方法。

2008/10/25

[ Java ] About Call By Value

Java 傳值呼叫 (Call By Value) 範例:


public class JCallByValue {
static void Change(int x, int y){
int t;
t = x;
x = y;
y = t;
System.out.println("Change Method:");
System.out.println("x= "+x+" y="+y);
}

public static void main(String[] args){
int x = 3, y = 5;
System.out.println("main Method -- Before Call Change() Method:");
System.out.println("x= "+x+" y="+y);
Change(x,y);
System.out.println("main Method -- After Call Change() Method:");
System.out.println("x= "+x+" y="+y);
}
}


執行結果:

main Method -- Before Call Change() Method:
x= 3 y=5
Change Method:
x= 5 y=3
main Method -- After Call Change() Method:
x= 3 y=5

說明:

雖然 Change() Method 內的 x,y 變數與 main 主程式中的 x,y 相同,但其所佔有的記憶體位置不同所以主程式在呼叫完 Change() 這個方法之後 x,y 的值並不會改變。Java 的 boolean、char、byte、short、int、long、float、double等資料型別的『變數』用於方法中的參數皆屬傳值呼叫,而 Array、Object...等的參數則為傳參考值呼叫 (Call By Reference) 因為它們在記憶中會佔用相同的記憶體。

2008/10/07

[ FBSD ] Convert Unix / Linux Certificate Format

在 Unix / Linux 下我們會經常使用私鑰及公鑰簽署產生憑證 ( Certificate ) ,但是在 Unix / Linux 下我們所產生的憑證檔案格式皆為 PEM 格式,而微軟 Windows 中所支援的憑證格式卻是 PKCS#12 及 DER 等... 當跨平台時不同的格式如果要互用該怎麼辦?沒關係強大的 OpenSSL 還是有轉換的方式。

a) 將 PEM 格式轉成 PKCS#12 格式

# openssl pkcs12 -export -in myclient.crt.pem -out myclient.p12 -name "My Cert" -inkey /etc/ssl/private/myclient.key.pem # 將 .pem 格式轉成 .p12 格式


b) 將 PEM 格式轉成 DER 格式

# openssl x509 -in myroot.crt.pem -outform DER -out myroot.der # 轉換格式將 .pem 格式轉成 .der

2008/10/06

[ LOS ] Mail Attack & Delete Postfix selected mailq

上星期遇到我替公司架設的 CentOS Mail Gateway 遭到大量灌信,我發現後已經過了半個多小時的時間,整個 MailQ 中就已經有 4000 多封來自 service@kcg.gov.tw 高雄市政府 Service 的來信而且不斷的成長,我們的 Server 是 P4 2.8 算是已經不錯,Mail Gateway 上面有跑 Amavisd-new 及 ClamAV 和 Spamassassin,每天的報表統計 Mail Gateway 大約會處理約 40 萬封來信 ( 9成5是垃圾信 )。

攻擊發生後 CPU 幾乎 100% 大量 Mailq 會造成整個公司的正常信都嚴重延遲,感覺起來這樣的攻擊行為比較像是一種 Mail 的 DoS ( Deny of Service ) 攻擊,它讓正常的服務幾近攤瘓,平常經驗告訴我若攻擊行為停止我們這台 Mail Gateway 要處理這些佇列中的信是需要再花上 4 ~ 5 個小時以上時間來慢慢消化 MailQ,雖然我可以等信但是長官可不能等,現在是個 凡事都求快的光世代,若是我告訴長官說信要等半天才收得到 ~ 這可嚴重了,哈哈 ~ 搞不好因此損失上百萬的定單,這下子不黑掉才怪。

還好攻擊者的 Mail From: 都來自 service@kcg.gov.tw 因此還算好處理,可先在 Postfix 的 header_checks 中擋掉 service@kcg.gov.tw 的來信,接著再下行指令就可清掉那些垃圾 MailQ。個人覺得像這樣的攻擊方式 Mail 的 From: service@kcg.gov.tw 很有可能是假造的,也很有可能是收 service@kcg.gov.tw 的那個 User 電腦中毒因而造成大量發信攻擊。

# vi /etc/postfix/header_checks # 加入要擋掉的來原信
/^From:.service\@kcg\.gov\.tw/ DISCARD Attack Mail

# postmap -q - regexp:/etc/postfix/header_checks < /etc/postfix/header_checks # 重新讓 Postfix 新 header_checks 生效

# mailq | grep "service@kcg.gov.tw" | cut -d " " -f1 | cut -d'*' -f1 | postsuper -d - # 刪掉所有來自service@kcg.gov.tw的MailQ

2008/10/03

[ LOS ] CentOS Enable Hard Disk Quota

在 CentOS 中如果已經加裝好一棵切為 ext3 格式的硬碟後要如何在這棵硬碟上啟動 Quota 功能?我新增加的硬蝶編號為 hdc 是掛在主機版的 Second IDE2 介面,硬碟的 Jump 是調 Master 所以編號是 hdc,若是裝在主機版的 Primery IDE1 硬碟的編號就會是 Master -> hda、Slave -> hdb。

# df # 可先查看我已經掛載的硬碟 Partition
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
11712616 1317836 9790212 12% /
/dev/hda1 101086 18120 77747 19% /boot
tmpfs 257140 0 257140 0% /dev/shm
/dev/hdc1 28389472 40076 26883868 1% /rhome

# vi /etc/fstab # 調整 fstab 針對這個獨立切出來的 Partition 加上 usrquota 及 grpquota

/dev/hdc1 /rhome ext3 defaults,usrquota,grpquota 1 2

# mount -o remount /rhome # 重新 mount 讓新的設定值生效

# mount # 查看 /rhome 這個 Partition 是否已經有 usrquota 及 grpquota

/dev/hdc1 on /rhome type ext3 (rw,usrquota,grpquota)

# quotacheck -cug /rhome # 初始化 quota 會比較久要等一下

# ls -l /rhome # rhome 目錄下會多出兩個檔
total 68
-rw------- 1 root root 7168 Oct 3 12:41 aquota.group
-rw------- 1 root root 7168 Oct 3 12:36 aquota.user

# quotaon -ug /rhome # 啟動 quota

# edquota -u justin # 針對 justin 這個 User 做 Quota 設定 ( 設定 Qouta 時權限要 root 才能生效 )
Disk quotas for user justin (uid 30000):
Filesystem blocks soft hard inodes soft hard
/dev/hdc1 7200 0 0 6 0 0

# edquota -g 30000 # 針對 Group 30000 做 Quota 設定
Disk quotas for group 30000 (gid 30000):
Filesystem blocks soft hard inodes soft hard
/dev/hdc1 24 8192 10240 6 50 60

# su - justin # 切換到 justin 這個 User

$ quota -g 30000 # 查看 Group 30000 原本所使用的容量 bloks 為 24
Disk quotas for group Justin Lin (gid 30000):
Filesystem blocks quota limit grace files quota limit grace
/dev/hdc1 24 8192 10240 6 50 60

$ dd if=/dev/zero of=test bs=1M count=7 # 手動建立一個 7 M 大的 test 檔案
7+0 records in
7+0 records out
7340032 bytes (7.3 MB) copied,0.0581825 秒,126 MB/s

$ quota -g 30000 # 查看 Group 30000 所使用的容量 bloks 已經增加到 7204
Disk quotas for group Justin Lin (gid 30000):
Filesystem blocks quota limit grace files quota limit grace
/dev/hdc1 7204 8192 10240 7 50 60

$ dd if=/dev/zero of=test2 bs=1M count=4 # 再建個 test2 的檔大小為 4M , 因為超出 10M 空間所以系統告知滿了
hdc1: warning, group block quota exceeded.
hdc1: write failed, group block limit reached.
dd: 寫入 ‘test2’: 硬碟 quota 滿了
3+0 records in
2+0 records out
3104768 bytes (3.1 MB) copied,0.0264653 秒,117 MB/s

$ quota -g 30000 # 查看 Group 30000 滿了 blocks 會多個 * 號
Disk quotas for group Justin Lin (gid 30000):
Filesystem blocks quota limit grace files quota limit grace
/dev/hdc1 10240* 8192 10240 8 50 60


Reference:

http://ms.ntcb.edu.tw/~steven/article/quota.htm