2009年1月27日 星期二

佇列

佇列是先進先出的資料結構,先塞進來的資料就必須先取出。

class Queue{
private $head=0,$tail=0;
private $max=100;
private $data=array();
private $error;

public function pop(){
if($this->head != $this->tail){
$this->head++;
if($this->head >$this->max){
$this->head = $this->head -$this->max - 1;
}
$data = $this->data[$this->head];
unset($this->data[$this->head]);
return $data;
}
}

public function push($data){
$original=$this->tail;
$this->tail++;
if($this->tail >$this->max){
$this->tail = $this->tail - $this->max -1;
}

if($this->tail == $this->head){
$this->error='佇列已滿';
$this->tail=$original;
return false;
}else{
$this->data[$this->tail]=$data;
return true;
}
}

public function showQueue(){
foreach($this->data as $key=>$value){
echo $key.'=>'.$value."\n";
}
}

}

$queue=new Queue();

for($i=0;$i<=2000;$i++){
$queue->push($i);
}

for($i=0;$i<39;$i++){
$queue->pop();
}

for($i=0;$i<100;$i++){
$queue->push($i);
}


$queue->showQueue();


程式碼解說:
Queue::pop() 取出資料
Queue::push() 塞進資料
Queue::showQueue() 列出佇列內的所有資料

2009年1月25日 星期日

更改innodb預設的資料庫存放位置

ubuntu上預設存放innodb資料庫的位置是/va/lib/mysql,這真不是一個存放資料的好位置,如果作業系統是32位元的,單一檔案的上限是2G,最好是使用整個分割區當做innodb資料庫的存放位置,這樣就沒有2G的限制,因為這是分割區,而且效率會比較好。

試了幾個方式都試不出來,花了一整天,真是煩人,不過用google上網找資料,二分鐘內就解決了,感謝google,用起來真方便說,參考網走如下:
http://www.ubuntugeek.com/how-to-change-the-mysql-data-default-directory.html

整個步驟如下:
1.開啟/etc/apparmor.d/usr.sbin.mysqld
2.將/目錄名稱/ r,及目錄名稱/** rwk,加入以/va/lib/mysql開頭的指令行下面
3./etc/init.d/apparmor reload
4./etc/init.d/mysql restart

這樣就可以將innodb的資料存放到不同位置,而不會產生錯誤訊息,使mysql無法啟動

2009年1月24日 星期六

看山又是山

最近把Zend Framework的文件下載後,列印出來,讀讀這些paper,Zend Framework每個物件的用法雖然不同,但背後的運作邏輯卻是相通的,這是一種思考方式的轉變,將程式設計的方式由程序導向的方式轉變為以物件導向的方式進行思考,將傳統程式設計模式以直接解決問題的思考方式,轉變為以設計出架構,將問題分類為不同的階層及架構後,再設計出適當的物件,擺在不同的架構及階層中,再將問題解決。

這種設計方式,站在程式計設師的角度來說,可是一點都不直覺,以設計電腦來做說明,為了讓電腦完成運算的功能,如果以傳統程序導向方式的思考方式,CPU、記憶體、硬碟這些東西,是完成運算的功能,就會把他們全部兜在一起,結果一台電腦中,所有的功能(CPU運算、記憶體的記憶功能、硬碟的儲存功能)就會全部混在一起,而不是分拆成不同的物件,程序導向只要單線思考,以完成功程式的功能即可,物件導向的思考方式就不同,必須將電腦折成CPU、記憶體、硬碟等物件,還要考慮這些物件怎麼連接,如何組合這些物件一起運作,除了要完成必要的功能,還要設計出一套能夠運作的架構,如CPU怎麼與主機板連接,怎麼與記憶體做協同運算。

物件導向的思維邏輯,在於建立一套問題解決的架構,讓經驗可以被重複應用,而不是重複相同的程式編碼作業,就像電腦的設計一樣,將CPU、記憶體、硬碟分拆成不同的元件後,這套元件化的設計階層架構就可以被重複使用,不論CPU的速度是怎麼加快,記憶體的容量如何增長,電腦元件組合的階層架構還是不變的,這就是物件導向的思維方式,從實務經驗建立問題解決的架構。

剛接觸物件導向時,由於只接觸概念部份,認為這真是直覺的方式,只要把程式分拆成一個個的元件,就可以完成程式設計,是非常容易的,就像初學畫的人要畫山一樣,只不過是畫一座山嘛!畫出那座山就好了,這應該就是看山是山的階段。

等到實際撰寫程式碼,這跟傳統程式導向的方式大不相同,變得很複雜,為什麼不直接把功能做出來就好了,為什麼繞了一大圈解決問題,這就跟學畫當中的人心境相同,不過是畫一座山嘛!為什麼還有那麼多的畫法及理論。這是看山不是山的階段,滿腦子想的都是一些技巧及注意事項。

比較熟悉物件導向的思考方式及程式撰寫風格後,會發現世界是那麼的美好,一個個的元件排列組合後就能完成各種程式的功能,這種方式比起傳統的開發方式,架構的彈性及威力不能相比。這就類似技巧比較成熟的畫家,要畫山時,只會想到山的美好,會想表現出山在自己心中的感覺,這就是看山又是山的階段吧!

2009年1月23日 星期五

virtual box灌ubuntu server出問題

環境
作業系統:ubuntu desktop
軟體:virtual box

問題
在ubuntu desktop上的virtual box上安裝完ubuntu server後,重新開機,會出現下面這行錯誤:

this kernel requires the following features not present on your CPU

用google找了一下,十分鐘內就找到解決辦法了

網址:
http://ubuntuforums.org/showthread.php?t=905497

解法:
1.開啟vitual box
2.點選 機器->設定值->一般->進階
3.enable PAE/NX 打勾
4.重新啟動即ok

2009年1月22日 星期四

堆疊

堆疊是一種後進先出的資料結構,這種資料結構類似上部開口的杯子,把從球上方的開口丟進杯子後,就要從上方的開口處取出球。

資料在堆疊中放進去的方式及取出的方式也是相同的,先丟進去的資料,必須等上層的資料都被取出後,才能取出。

這是一種後進先出的方式,最後丟進去的資料,可以最先被取出來使用,最早被丟進去的資料,卻必須在所有資料取出後,才能取出。

class Stack{

private $sp=-1;
private $spMax=100;
private $data=array();

public function pop(){
if($this->sp >= 0){
$result=$this->data[$this->sp];
unset($this->data[$this->sp]);
$this->sp--;
return $result;
}
}

public function push($data){
if($this->sp < $this->spMax){
$this->sp++;
$this->data[$this->sp]=$data;
}
}

public function setSpMax($max){
$this->spMax=(int)$max;
}
}


$stack = new Stack();
$stack->push('a');
$stack->push('b');

echo $stack->pop();
echo '
'."\n";
echo $stack->pop();


程式碼說明:
一個很簡單的類別,專門處理堆疊。

Stack::pop() 取出資料
Stack::push() 放進資料
Stack::setSpMax() 設定堆疊能存放的資料筆數