LVM之痛

前一陣子,在公司做過 LVM 實驗之後
發覺 LVM 真是一個不錯的東西,
可以把多個硬碟串成一個大的 volume group.
你可以把他想像成一個容量超大的 heap,而你可以任意向他索取空間(logical volume),也可以任意再 attach physical volume 上去增加 volume group 的容量.
也因此才把 LVM 應用到自己家裡的 server 上~
在應用之後,一切都非常順利
除了 logwatch 每天回報說 hdb 有問題之外.
這裡稍稍為我的 hdb 作一下介紹.
hdb 是我的 Quantum Bigfoot 2G 硬碟,這顆算是古董了吧
從 1997 年服役至今,陪伴我將近 7 年,沒有任何怨言.
以下為了方便稱呼,我把它命名為”小Q一號”.
就在前天,星期六~~
小Q一號突然出現了奇怪的聲音,當時我還不以為意的繼續使用電腦~
到了晚上要關機的時候,發覺小Q一號居然無法 sync,kernel 持續回報說無法驅動它.
此時,我才發現大事不妙,這種懊悔的感覺充斥在我的腦海裡.
我真的很後悔,為什麼以前都忽略了它對我的警告呢??
但是太遲了~~
我已經無法將小Q一號由我所串起的 volume group 中移除~~
由於隔天要很早起床去旅遊,只好先作罷,含淚睡去.
翌日的翌日,也就是今天.
我試圖換上我內人以前所用過的,同樣也是 Quantum Bigfoot 2G 的硬碟,小Q二號.
想說,讓它也披上 physical volume 的外衣,看是否可以騙過我的 server,但是不行,仍然無法啟動.
由於下午要出門到使徒家裡去,只好再次作罷,含淚出門.
剛剛,也就是吃完晚飯後,我上網找到一篇文章(這篇應該是由英文的HOWTO翻譯過來的).
提到了volume group損毀的處置方法:
1.如果physical volume(硬碟)還能動的話,就是先利用 pvmove 先確定該physical volume不再有資料.然後再使用 vgreduce 將該 physical volume 從 volume group 中移掉.
2.如果不幸,硬碟不能動的話,那就只能先替換上同型號的硬碟或更大的硬碟,並使用 vgcfgrestore 強制把設定資料寫到新的 physical volume 上,以回復正常,當然,這麼做是會掉資料的.
我,因為小Q一號已經無法動彈了,也就是說我只能用第二種方法了.
# vgcfgrestore -f /etc/lvmconf/vgtest.conf -i -d -v -n vg0 /dev/hdd1
-f 是指定 volume group 的設定檔檔名
-i 是忽略大小
-d 是 debug
-v 是 verbose
-n 是指明 volume group 的名稱
/dev/hdd1 則是表明新的 physical volume 名稱
就這樣,我終於救回了我的資料.
只是還不知道有哪些資料因此損失了~~
🙁
註:
physical volume: 通常指的是一個 partition, partition type 指定為 0x8e, 以 pvcreate 建立之.
volume group: 以一個或多個 physical volume 所組成的 group.
logical volume: 向 volume group 索取而取得的空間,你可以對此空間作格式化動作.若空間不足或過大,你也可以作動態增減.

對The matrix的頓悟

昨天晚上睡覺不知為何,有點小醒過來,然後就想到駭客任務的結局。

想了一會,發現X的,原來是這樣~~有種頓悟的感覺~~第三集, Neo 最後還是選擇了回到萬物之源,那這樣正如影評所說,不如第二集就選擇回到萬物之源,這樣兩集就結束了,唯一的差別是救了比較多的人。

但是就算救了比較多的人又怎樣??人類仍然要與機器共存。如果你是 The One, 你會怎麼選擇呢??在這樣的一個機器與人類共生的世界,你有能力改變這樣的一個大環境嗎??尤其是在人類打不過機器,而人類自殘又矛盾的情況下??(其實最後萬物之主說的很好,機器不會背信,但是不管人類,就這樣放著,還是會有很多問題產生,不懂??看看歷史吧)

所以最後 Neo,還是選擇了回到萬物之源,以大愛的胸懷保全人類。至於 Smith 只能算是多餘的,他代表的是電腦(robot)世界裡面的失控。但是注意喔,不管怎麼樣,就算 smith 掌控了機器世界,機器人還是一樣統治了世界~~唯一的差別,就是他的考量點不在於共存,而在於毀滅。

現有的萬物之主,則是求共存,以人類發電產生的電力養活機器,也養活錫安的人類,同時也讓存在於虛擬世界的人類得到精神上的滿足。

我認為整部電影要表達的是

  1. 宿命論,有些事情不可改變,雖然感情可以左右,但是基礎模式走向並未改變。所以萬物之主與Oracle可以預測到結果。
  2. 人類感情的影響力。
  3. 共生,機器與人類的共存,與其他生物的共存共生。

gcc 的超強 Warning 選項

想不到
真是想不到
gcc 的 Warning 選項居然可以做到可以檢查你的 code 是不是用了 char, 還有 enumeration 內定義的所有數字是否都被用了
功能真是超強~
但是今天下午被這個玩意兒卡了快一個多小時
真是可惡~~

O-Notation

主要用來表示花費的時間
這在資料結構與演算法上很常見
表示法 名稱 例子
O(1) 常數 陣列索引(Array index)
O(logn) 對數 二元搜尋
O(n) 線性 字串比較
O(nlogn) nlogn 快速排序
O(n^2) 二次方 簡單的排序方法,如 bubble sort
O(n^3) 三次方 矩陣相乘(matrix multiplication)
O(2^n) 指數 集合分割(set partitioning)

葡萄酒釀造

經狐友 summer 兄允許,特此貼上釀造法,以便日後閒暇之餘,可以自行釀造品嚐.
白葡萄釀酒
 每一台斤白葡萄用3.5兩~4兩糖,視白葡萄的甜度來定煻的用量,吃起來酸者,用4兩,甜者,3.5兩,酸澀者,此葡萄不可釀也,比例約 4:1
紅葡萄釀酒
 每一台斤紅葡萄用2兩糖,紅葡萄若是過熟者,可適量減少煻用量少許,已爛之紅葡萄,不可用,比例約8:1
注意事項
使用紅沙煻即可,但不要使用細糖,一般粗糖即可,忌用酒釀
釀酒請使用玻璃缸,封口可用油玻璃紙為最內層(因為該紙不會被酒精所反應,故安全),第二層錫薄紙,最後再加上封蓋,封存三個月(不可少亦不可超過太久)
開封後將酒與葡萄渣分離,使用容器仍以玻璃缸為佳,酒封存方式如上,葡萄渣可食用,可當看電視時的小點心,給老人家偶而食之,可減少體內血脂的累積

Regular Expresstion速記

‘^’表示開頭
‘$’表示結尾
“^$” 比對空字串
‘.’ 僅代表一個任意字元
[0-9]表示 0~9 中的任一字元
‘|’ 表示 2 選 1
‘+’ 表示一次或多次
‘*’ 表示0次或多次
‘?’ 表示0次或1次
grep ‘.’ *.c | wc 計算非空白行數

MSDE安裝

MSDE2000安裝變得十分機車
因此將方法特地紀錄如下
請用指令列輸入
setup sapwd=”your_password” disablenetworkprotocols=0 instancename=”your_instance_name” securitymode=sql
sapwd 指定的是密碼,這是一定要指定的
disablenetworkprotocols 表示是否要對外開放 port, 預設好像是 1 的樣子,表示不對外開放,所以外面也連不進來
instancename 這個則是 instance name, 具名管道會用到,你可以給,也可以不給.
securitymode=sql 指定安全模式,instancename與此合用時,表示是混用模式,預設是 Windows 認證;若不加 instancename,只加此項,表示是 sql 認證模式.
就這樣子囉~~

以 VFP 實作 Singleton Pattern

Singleton,確保類別永遠只有一份實體
Singleton pattern, 簡言之,是一個確保類別永遠只有一份實體的範式(Pattern).
在什麼情況下,我們會用到這個 Pattern 呢??
比如,一台電腦裡在同一時間只能有一個視窗管理員在運行.
一般性的做法,是讓類別自行管理這個唯一個物件實體,讓他確保絕對無法生出第二個物件個體.
那麼在 VFP 裡面要如何實現呢??
讓我們來試試看,首先先定義出 CSingleton 這個Class
*
* Class Singleton
*
DEFINE CLASS CSingleton as Custom
  HIDDEN m_singleton
  m_singleton=.NULL.
  PROCEDURE getInstance
    IF m_singleton==.NULL.
      m_singleton=CREATEOBJECT(“CSingleton”)
    ENDIF
    RETURN m_singleton
  ENDPROC
  PROCEDURE getClassName
    return “I am Singleton Class”
  ENDPROC
ENDDEFINE
我們將 m_singleton 隱藏起來,讓外界無法直接存取,並且提供 getInstance method,讓外界可以透過此 method 取得 m_singleton 這個 instance.
所以當我們需要這個類別的實體時,就可以這麼寫:
lo_object=CSingleton::getInstance()
嘿,等等,別的語言是可以這麼寫,VFP 允許我們這樣用嗎??
此外,我們也沒有辦法隱喻地將 m_instance 放到 heap,像別的語言可以用 static 表明 m_instance 要放到 heap 中,確保只會有一份實體.
VFP 必須要先為 CSingleton 類別產生實體,才能呼叫 getInstance()
也就是要先這樣子
local lo_class, lo_object
lo_class=createobject(“CSingleton”)
lo_object=lo_class.getInstance()
才能讓 lo_object 取得實體.
那這不就違反我們的本意了嗎??
當使用者呼叫了多次 createobject(“CSingleton”), 等於是創建了好幾次 m_singleton,我們就無法讓 m_singleton 是系統中唯一的一個實體了.
那麼還有別的方法嗎??
嗯,用全域變數如何??
我們可以用全域變數搭配一個Function來使用.
所以就可以這麼寫
public m_instance
….
* 主程式
m_instance=.null.

* Function
function getInstance
  if m_instance==.null.
    m_instance=createobject(“CSingleton”)
  endif
  return m_instance
endfunc

* 要使用的時候
lo_object=getInstance()
? lo_object.getClassName()

這樣子總算是解決問題了,只要維持一個良好的撰寫習慣
就可以保證CSingleton的實體是唯一.
可是萬一後繼者不明白,直接去存取了全域變數 m_instance 的話,該怎麼辦呢??
嗯~~再換個方向來想
VFP 不是有個函數叫做 getobject() 嗎??
如果我們將類別轉為 OLEPUBLIC 之後,再使用 getobject() 去取得 instance,就可以取得唯一的實體來使用了.
這也不失為一個不錯的解法.
綜觀上面推論,或許還有其他的方法,是我沒有想到的.(我有想過用 fopen() 或 flock()…等等的)
但是就目前看來,在 VFP 裡面對 Singleton 並沒有一個完美的解法.
只有期待 VFP 未來能加入新的語言特性,讓我們能更靈活的運用了.
附錄: C++ 的解法
class CSingleton {
private:
  static CSingleton* m_instance;
protected: //保護起來,不讓 constructor 直接被叫用.
  Singleton();
  Singleton(const Singleton&);
  Singleton& operator= (const Singleton&);
public:
  CSingleton* getInstance(void) {
    if( m_instance==NULL )
      m_instance=new CSingleton();
    return m_instance;
  }
  char* getClassName(void) {
    return “Hello! Singleton Pattern!!\n”;
  }
}
CSingleton* CSingleton::m_instance=NULL; //因為宣告為 static,所以可以這樣給值.
int main( int argc, char* argv[] ) {
  CSingleton* obj=CSingleton::getInstance;
  printf( “%s”, obj->getClassName());
}