9月 25, 2010

Java 的 UpCasting 與 DownCasting



口訣:
  • UpCasting - 如果你的本質是「子型別」,但把你視為「父型別」來看。
  • DownCasting - 如果本質是「父型別」,但把你視為「子型別」來看。
討論在 Java 中的 UpCasting 與 DownCasting 問題
public class Animal
{
public void run() {}
public void eat() {}
}

public class Fish extends Animal
{
public void swim() {}
}

1. UpCasting 父類別的參考指向子類別物件

Animal ref = new Fish()
記法: UpCasting 就是把「子類別物件」交由「父類別參考」指著 (由下往上提了) 這就是常用的「多型」概念。為何可以這樣做?因為「父類別」能存取的變數、呼叫的函式,在子類別中都有(兒子比老爸強),所以不會出錯
例如:ref.run() 與 ref.eat() 這兩個動作在 Fish 物件中,都是可以辦到的。

2. DownCasting 子類別的參考指向父類別物件,需要強制轉型

Fish ref = (Fish)new Animal()     /* 強制轉型做 DownCasting */
記法: DownCasting 就是把「父類別物件」交由「子類別參考」指著(由上往下降了)經由強制轉型,可以順利編譯完成,但是將來會有機會發生 runtime error 因為: 照理來說 ref 為 Fish 型態,所以支援 ref.swim() 是天經地義。但 ref 骨子裡是 Animal 跟本就沒辦法做到 swim() 這個功能,結果就是 runtime error

9月 18, 2010

數位簽章 (digital signature)

[數位簽章]

重點提示:

(1) 簽章 = 身份辨識(真的是你) + 不可否認(是你做的) + 完整性(資料沒被偷改)
(2) private 與 public key 可以互解;使用 public key 加密,則可用 private key 解密。
(3) 不可否認性:我用 "私 key" 加密,如果你能用 "公 key" 解開,表示訊息來源是我。
(4) hash function 兩者事先知道

流程:

要傳給對方的訊息:msg

msg--hash--> msg digest (使用 hash 保證完整性)
msg digest --私key--> signature (訊息是我送的,不可否認)

然後就可以傳送 [msg][signature] 給對方
但這樣 msg 都被看光光柳, 所以用對方 public key 再包一次

[msg][signature] --收件者 公key--> 對方公key([msg][signature])

收件者進行驗證:
收件者用 private key 進行解密:得到 [msg] [signature]
這邊別忘了 signature 當初是被 發送者用私key 加密過了

[signature] --發送者公 key --> msg digest (*)
[msg] ----hash---> msg digest (**)

(**)式的 digest 是我算出的
(*) 式的 digest 是我解開信封得到的

比較兩者,如果相同,表示信件內容未遭修改
而且又有你的 signature,所以表示 信件是你發的,你不能否認

9月 17, 2010

rTorrentWeb: Web UI of rTorrent

Web directory [/var/www/rtorrentweb/]?
rTorrentWeb directory [/usr/local/share/rtorrentweb/]?
Data directory [/var/local/rtorrentweb/]?
URL to WWW dir [http://x.x.x.x/rtorrentweb/]?
Web server username [www-data]?
rTorrent username [root]?

9月 14, 2010

微調 64MB 網頁伺服器

置原預設 rsyslog 改用 syslog-ng


apt-get install syslog-ng && dpkg --purge rsyslog
節省近 20MB 記憶體;另外 logcheck 也可分析 syslog-ng 所產生的記錄檔。

設定 MySQL 參數


使用 /usr/share/doc/mysql-server-5.0/examples/my-small.cnf
取代預設 my.cnf

設定 lighttp fast-cgi 參數


"max-procs" => 1
"PHP_FCGI_CHILDREN" => "1",
"PHP_FCGI_MAX_REQUESTS" => "1000"

修改 php 使用記憶體 - /etc/php5/cgi/php.ini


memory_limit = 32M

9月 09, 2010

[OpenVZ] /proc/self/oom_adj: Operation not permitted

採用 OpenVZ 架構的主機,一直噴錯誤訊息:
error writing /proc/self/oom_adj: Operation not permitted
修正兩個檔案,把 SSHD_OOM_ADJUST 那行註解:
  1. /etc/init.d/ssh
  2. /etc/default/ssh