2008年7月31日 星期四

shaker排序法--單邊

只有單邊的shaker排序法,應該比雙邊的shaker排序法慢

$length=rand(8,10);

for($i=0;$i<$length;$i++)
$a[]=rand(200,300);

$left=0;
$right=$length-1;

while($left<$right){
$shift=0;
for($i=$left;$i<$right;$i++){
if($a[$i]>$a[$i+1]){
$tmp=$a[$i];
$a[$i]=$a[$i+1];
$a[$i+1]=$tmp;
$shift=$i;
}
}
$right=$shift;
}


foreach($a as $num)
echo $num."\n";
}

2008年7月30日 星期三

shaker排序法

$length=rand(8,10);
for($i=0;$i<$length;$i++)
$a[]=rand(100,200);

$left=0;
$right=$length-1;
while($left<$right){
for($i=$left;$i<$right;$i++){
if($a[$i]>$a[$i+1]){
$tmp=$a[$i];
$a[$i]=$a[$i+1];
$a[$i+1]=$tmp;
$shift=$i;
}
}
$right=$shift;

for($i=$right;$i>$left;$i--){
if($a[$i]<$a[$i-1]){
$tmp=$a[$i];
$a[$i]=$a[$i-1];
$a[$i-1]=$tmp;
$shift=$i;
}
}
$left=$shift;
}

foreach($a as $num)
echo $num."
\n";

2008年7月29日 星期二

氣泡排序法

執行時間
O(n^2)

error_reporting(E_ALL|E_STRICT);
ini_set('display_errors','on');

$length=rand(8,10);
for($i=0;$i<$length;$i++)
$a[]=rand(100,200);


for($i=0;$i for($j=count($a)-1;$j>$i;$j--){
if($a[$j]<$a[$j-1]){
$tmp=$a[$j];
$a[$j]=$a[$j-1];
$a[$j-1]=$tmp;
}
}
}


foreach($a as $value)
echo $value."\n";

2008年7月28日 星期一

直接插入法

執行時間
O(n^2)


$length=rand(8,15);
for($i=0;$i<$length;$i++)
$a[]=rand(100,200);

for($i=1;$i for($j=$i;$j>0;$j--){
if($a[$j]<$a[$j-1]){
$tmp=$a[$j];
$a[$j]=$a[$j-1];
$a[$j-1]=$tmp;
}
}
}

foreach($a as $value)
echo $value."\n";

直接選擇法

執行時間
O(n^2)



$a=array(8,49,9,29,30,46,20,31);

for($i=0;$i<(count($a)-1);$i++){ $min=$a[$i]; $min_pos=$i; for($j=$i+1;$j$a[$j]){
$min=$a[$j];
$min_pos=$j;
}
}

$tmp=$a[$i];
$a[$i]=$a[$min_pos];
$a[$min_pos]=$tmp;
}

foreach($a as $value){
echo $value."\n";
}

ubuntu的啟動管理

安裝啟動管理程式

apt-get intsll sysvconfig


啟動管理程式的使用

圖形介面的使用

sysvconfig

文字介面的使用

sysvconfig --enable apache2

sysvconfig--disable apache2

sysvconfig --listlinks |grep apache2

2008年7月23日 星期三

memcached的使用

http://dev.mysql.com/doc/refman/5.0/en/index.html
http://tw2.php.net/manual/en/book.memcache.php

Memcached

introduction
在一般的IT環境下,如果要擴增程式的使用人數,最大的問題會卡在程式的執行速度,經常存取的資訊,如果使用mysql做為後端存取的資料庫,速度就會變得慢,因為資訊的存取,必須透過執行sql語法,取得資料庫內相關的資料,而拖慢執行速度。

memcached是一個簡單的、具有高度伸縮性的key-based快取,快取來源不受限制,他也是一個備份的RAM,可以讓應用程式進行非常快速地存取,要使用memcached,必須在一台或多台主機上執行memcached,讓使用者共享快取內儲存的物件,因為每台主機都是使用RAM儲存資訊,存取的速度遠遠快過從硬碟上進行資訊的存取,這樣的話,相對於從資料庫存取資料,效能的增進是非常明顯的。快取只是容納資訊的空間,你可以在快取內儲存任何資料,如果儲存的是複雜的資料結構,可以在資料存進快取前,先進行複雜的資料庫操作,再將資料放進快取中,可以大幅減少mysql server的負擔。

使用memcached的一般性作法是修改應用程式,讓應用程式改為從memcached讀取資料,如果需要的資訊不在memcached裡頭,程式就改由mysql讀取資料,再將資料寫入memcached裡頭,以後如果要存取相同資料,就可以發揮memcached資料快速存取的優勢。

在memcached的架構中,所有的client可以送出key與任何一台memcached伺服器連繫,在這個架構中,每個client可以與圖中的任何伺服器連繫,在client上,當送出要求時,key會先被hash,這個hash值會被用來選取memcached伺服器,memcached伺服器由client決定,可以使程式維持輕量化。

當client送出key時,會執行同一套演算法,相同的key,會產生相同的hash值,同一部memcached伺服器就會被選為資料來源,使用這個方法,快取資料被分散放置在所有的memcached伺服器上,而這些快取資訊可以被所有的client存取,結果就是,以記憶體做為資料儲存處的分散式快取,這類型的快取尤其適合複雜的資料結構,存取速度遠遠快過直接從資料庫存取資料。

在memcached伺服器中的資料永遠不會放在磁碟上,記憶體中的快取可以從後端的資料庫(mysql)取得資料,如果memcached伺服器當掉了,可以改為由mysql取得資料,當然,速度會變得比較慢。


Installing memcached

在ubuntu上安裝memcached非常輕鬆,只要輸入下面這道指令,再按enter就安裝好了

apt-get install memcached

memcached的啟動

在ubuntu上啟動memcached伺服器

/etc/init.d/memcached start

參數配置

參考/etc/memcached.conf設定檔的說明會更清楚

-u 執行身份
-m 記憶體容量(快取容量,單位為MB)
-p 指定port
-d 以daemon方式執行
-t 指定執行緒的數量
-l 指定執行的網路介面


memcached deployment

memcached有許多不同的佈署方式及策略,正確的佈署方式取決於你的應用程式及環境,當在系統中佈署memcached,你必須考量下列的注意事項

*memcached只是一項快取機制,如果資料很重要,在存取的過程中不能因為漏失,再從不同的地方存取,就不能使用memcached。

*memcached沒有內建的安全機制,至少,你必須確定,memcached伺服器只能在內部網路存取,而且memcached伺服器使用的port不能被外部網路存取。如果memcached含有敏感性資料,這些資料在存進memcached前要先被加密。

*memcached不提供復原機制,因為memcached之間沒有任何的溝通協定,如果一台memcached故障了,你必須將這台memcached從列表中移除,再重新載入資料,再將資料寫入另一台memcached伺服器中,

*如果client及memcached分別在不同的機器上,資料傳送延遲性如果造成問題,可以把memcached服務移到client端的機器上。

*key的長度是由memcached伺服器決定,預設的最大長度是250byte

*只使用一台memcached絕不是一個好的想法,尤其是服務多個client時,最少提供二台
memcached,才可以恰當地管理機器當機的狀況,如果可以的話,應該多建置幾台memcached
伺服器。當增加或移除memcached伺服器時,key/value的配置及hash值就會受到影響,如果要避免這些問題,必須研究memcached的hash type。


Memory allocation within memcached

當你第一次啟動memcached伺服器,memcached參數指定的記憶體數量不會自動配置給memcached,相反地,當開始將資料存進memcached的快取時,才會進行記憶體的分配。

當你開始將資料存在快取中,memcached不會為每個存入快取的資料一一配置記憶體空間,而是一次配置一個區塊,以進行記憶體空間的有效利用,避免快取資料過期時,造成記憶體空間配置的零碎化。

memcached裡頭的快取記憶體配置,以page為單位,每一page預設是1M,一個或多個page組成一個slab。

當memcached啟動時,不會進行slab及page的配置,只有當資料存進快取時,才會在page中切出適當大小的chunk,把資料存進chunk中,每一個chunk,會儲存一筆資料的value跟key,而page中每筆chunk的大小都必須一樣。

例如,memcached啟動時,有一筆資料的大小是800k,須要存入快取,這時就會建立一個slab,這個slab中page的chunk大小就是1M,一個page就只有一個chunk。

如果存入快取的資料是250K,那麼,就會建立一個slab,這個slab會再建立一個page,這個page會再切成4個大小相同的chunk。如果還有6筆250K的資料要存入快取,這個slab會再建立第二個相同的page進行資料的儲存。

資料如果超過1M,由於chunk預設是不能超過一M,而且資料必須塞進chunk中,因此超過一M的資料就會無法存入快取當中。


Using namespaces

memcached是非常簡單的key/value型式的儲存系統,無法自動將資料進行分類,例如,如果你使用mysql資料表傳回的id當做存入memcached快取的key時,就有可能有二筆由mysql資料表傳回的資料,雖然內容不同,id卻相同,存入快取時這二筆資料就會相互覆蓋,造成資料讀取的錯誤。

一些程式的API會在資料存入快取時,自動建立命名空間,實務上,這些命名空間,只是在存取資料時,在key前加上區別的字串。

你可以自己實做命名空間,只要存取快取資料時,在key前加上自定的字串就可以了,如加上”user_”字串。


Data Expiry

memcached快取資料的過期有二種狀況,如果要插入新的資料到快取中,但是沒有適當地slab可以存資料時,最近最少使用的資料會被移除,以騰出空間讓新的資料存入。

這個方法可以確保被移除的資料,是不再被使用的,或是已經很久不被使用的,但如果memcached的快取容量,比正常狀況使用時小很多時,你就會看到很多尚在使用的資料被移除了。

啟動memcached時啟用 -M參數,會在記憶體不足時發出警告,而不是自動刪除舊有的資料。

第二種快取過期的狀況,是直接刪除快取資料,或是設定資料過期的時間。

一種典型的應用就是設定使用者儲存的session資料,快取過期的時間。


在php中使用memcached

api的安裝

apt-get install php5-memcache


程式範例

程式名稱:a.php
class Test{
public $model;
public $color;
}

$test=new Test();
$test->model='bmw';
$test->color='red';

$cache=new Memcache();
$cache->connect('localhost',11211);
$cache->set('car',$test);


程式名稱:b.php
class Test{
public $model;
public $color;
}

connect('localhost',11211);
$car=$cache->get('car');

echo $car->model;
echo “\n”;
echo $car->color;
echo “\n”;

跑完a.php程式後,再跑b.php,就會跑出下面的結果
bmw
red

程式中物件的二個屬性都是經由serialize後,由a.php存在快取中,如果其他的程式要取用這二個屬性,只要有快取的key值,就可以得到這個物件的屬性。

2008年7月7日 星期一

輸出mysql的schema

這是在mysql workbench的說明文件上看到的一個方法,如果要輸出資料庫裡頭已建好的資料庫架構,可以下這道指令,把整個資料庫的schema都輸出成sql指令檔,再用mysql workbench的輸入功能,將sql指令檔輸入到mysql workbench,就可以看到完整的資料庫架構圖。

指令用法:
mysqldump 資料庫名稱 --no-data>輸出檔名

2008年7月3日 星期四

忘記mysql的root密碼

http://blog.tmu.edu.tw/tedyeng/000096.html

一、停用mysql

二、重新啟動mysql
mysqld -u root --skip-grant-tables &

三、修改root密碼
use mysql;
UPDATE user SET password=password('new password') where user='root';
FLUSH PRIVILEGES;