2008年8月31日 星期日

php無法執行

最近這幾天,在apache上都沒辦法跑php,我本以為是改了哪邊的設定檔,才造成只要一執行php檔,就造成php檔被下載,而不是被執行的狀況。

設定檔找了老半天,都找不到錯誤,不過把apache的php_gtk2的功能拿掉,立刻就正常了,真是見鬼了,前一陣子在玩php-gtk,只是弄個測試程式玩玩,沒想到會造成php在apache的環境下無法執行,不過也多了一次經驗。也不錯啦。

強化上傳目錄的安全性

如果在網頁程式中實做上傳檔案的功能,為了強化程式的安全性,會針對檔案的附檔名做過濾,並且限制上傳的目錄位置。這樣做的目的,只有一個,確保使用者不會亂來,在server上動手腳。

除了在程式中,使用程式碼確保server的安全外,還可以在apache中設定,再加上一道防護措施,
就是在上傳目錄中,新增.htaccess檔,這個檔案中再加上下面這道命令

php_flag engine off

那麼這個目錄下的php檔案都不會被apache解譯及執行。

要這麼做,你的apache的override必須設成All。

2008年8月10日 星期日

fibonacci數列的遞迴解法

fibonacci數列
1,1,2,3,5,8,13,21,55,.......

第一個及第二個數字是1
第三個以後的數字是前面兩個數字相加後的和

求fibonacci第n個數字的解法
使用遞迴的解法


function fibonacci($n){
if($n==1 ||$n==2){
return 1;
}else{
return fibonacci($n-1)+fibonacci($n-2);
}
}


echo fibonacci(10);

在我的機器上,如果代入fibonacci(40)
機器就會超過允許的執行時間,一個小小的程式,竟然耗用那麼多的時間,實在是可怕。

下面這行程式是一個無窮迴圈,會造成一樣的結果。
while(1){}

2008年8月7日 星期四

merge

merge的解法
1.將要merge的兩個陣列進行排序
2.將陣列a及陣列b的每個元素進行比較
3.比較後將元素放入另一個陣列c
4.如果陣列a或陣列b已經沒有元素可以進行比較,將還沒比較的元素加到陣列c的後面


public function mergeAction(){
$this->_helper->viewRenderer->setNoRender();

/**
* 製做陣列a
*/
$length_a=rand(8,10);

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

/**
* 將陣列a進行排序
*/
$a=$this->sort($a);


/**
* 製做陣列b
*/
$length_b=rand(11,13);

for($i=0;$i<$length_b;$i++)
$b[]=rand(100,200);

/**
* 將陣列b進行排序
*/
$b=$this->sort($b);

/**
* 將陣列a及陣列b,merge為單一陣列
*/
$com_a=0;
$com_b=0;
while($com_a<$length_a && $com_b<$length_b){
if($a[$com_a]<$b[$com_b]){
$c[]=$a[$com_a];
$com_a++;
}else{
$c[]=$b[$com_b];
$com_b++;
}
}

while($com_a<$length_a){
$c[]=$a[$com_a];
$com_a++;
}

while($com_b<$length_b){
$c[]=$b[$com_b];
$com_b++;
}


/**
* a陣列
*/
foreach($a as $num)
echo $num."
\n";

echo "


";

/**
* b陣列
*/
foreach($b as $num)
echo $num."
\n";

echo "


";

/**
* merge陣列a及陣列b後的c陣列
*/
foreach($c as $num)
echo $num."
\n";

}

public function sort(array $a){
$left=0;
$right=sizeof($a)-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;

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;
}
return $a;
}

css網頁排版


http://www.w3schools.com/css/tryit.asp?filename=trycss_float6

用css排版,排版的程式碼感覺比較清爽,沒有一堆的表格標籤,只是用dreamweaver進行css排版,不知道為什麼,版面總是亂七八糟的,不知道是不是因為使用的dreamweaver的版本老舊的關係,只好用eclipse,慢慢敲css程式碼到編輯器裡頭,還好eclipse的aptana plugin有支援css碼的自動完成功能,敲完第一個字母,就有相關的屬性顯示,不然光是查相關的屬性資料,就會覺得很煩。

w3schools的網站有一拖拉庫的範例,如果把每個範例都key個幾遍,相信一定功力大增,不過這種從下而上的學習法,如果套用到我身上,我可能會水土不服,我比較能夠適應從上而下的學習方式,也就是有整體概念了,再從細部追蹤每一個細節,當然,整體概念跟實做細節是環環相叩的,缺一不可。只是當我有全部的整體概念後,進行這些細部的實作,會感覺比較踏實,不會有不知道這些程式碼到底要幹嘛的感覺。

這個網站只有在我搞清楚整個css運作的來龍去脈以後,才能夠真正發揮他的功能,在真正清楚背後運作概念後,key in這些程式碼,說實在的,剛開始很興奮,到現在卻感覺有點枯燥。必須追蹤每一行程式碼的作用,感覺有點辛苦,應該要找一些更方便的工具,不要手工打這些碼,實在是很累。但這些基礎功,是必須的,不然,根基不穩是不能夠蓋房子的,就算蓋出來,也很容易塌的



div.container{
margin:0px;
border:1px solid gray;
width:100%;
}

div.header,div.footer{
color:white;
background-color:gray;
clear:both;
margin:0px 0px 0px 0px;
}

div.left{
float:left;
width:160px;
margin:0;
padding:10px;
}

div.content{
position:relative;
margin-left:190px;
margin-top:0px;
border-left:1px solid gray;
padding:10px;
}

h1.head{
font-size:60px;
padding:0;
margin:0;
}

2008年8月6日 星期三

二元搜尋法

二元搜尋法的觀念
1.資料已排序好
2.取排序好的中間位置的值,與想要找的值做比對
3.如果比對不成功,搜尋範圍就剩原來的一半,
4.一直重覆步驟2,3



/**
* 以shaker法進行排序,以便進行二元搜尋。
*/
$length=rand(8,10);

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

$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;

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=$i;
}

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


/**
* 設定要找尋的值
*/
$search='192';


/**
* 二元搜尋法
*/
$low=0;
$high=$length-1;
$flag=0;

while($low<=$high){
$mid=(int)(($low+$high)/2);
if($search>$a[$mid]){
$low=$mid+1;
}elseif($search<$a[$mid]){
$high=$mid-1;
}else{
$flag=1;
break;
}
}

if($flag)
echo '所要找的值的陣列表示法是:'."\$a[$mid]"."
\n";
else
echo '找不到!';

2008年8月5日 星期二

shell排序法

gap為1,2,4,8,16,32...


$length=rand(8,20);

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

for($gap=(int)($length/2);$gap>0;$gap=(int)($gap/2)){
for($i=$gap;$i<$length;$i++){
for($j=$i;$j>=$gap;$j-=$gap){
if($a[$j-$gap]>$a[$j]){
$tmp=$a[$j-$gap];
$a[$j-$gap]=$a[$j];
$a[$j]=$tmp;
}else{
break;
}
}
}
}

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



gap為1,4,13,40,121...


$length=rand(10,20);

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

for($gap=1;$gap<(int)($length/3);$gap=($gap*3+1))
;

while($gap>0){
for($i=$gap;$i<$length;$i++){
for($j=$i;$j>=$gap;$j-=$gap){
if($a[$j]<$a[$j-$gap]){
$tmp=$a[$j];
$a[$j]=$a[$j-$gap];
$a[$j-$gap]=$tmp;
}else{
break;
}
}
}
$gap=($gap-1)/3;
}

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

2008年8月4日 星期一

jQuery編輯器

http://www.aptana.com/node/187
http://www.aptana.com/docs/index.php/Plugging_Aptana_into_an_existing_Eclipse_configuration

安裝aptana的eclipse plugin

安裝這個plugin後,編輯css,javascript,html比較方便,編輯器會以不同顏色顯示函數、變數等不同屬性的語句,如果不小心打錯字,或是記錯物件名稱,或是語法有錯誤,就會出現紅色的警告錯誤訊息,比較容易找到哪個地方出錯,可以方便地進行除錯。

左邊視窗有專案裡頭的檔案列表,可以方便地檢視專案裡頭的檔案及目錄列表,可以清楚掌握目前有哪些檔案在專案裡頭,如果要增刪檔案或是修改檔名,也是在同一個作業環境下進行,不用再切換到其他的檔案管理軟體進行作業,比較方便。

aptana的plugin有支援jQuery等許多的javascript的framework,尤其是支援jQuery,真的是太好了,因為jQuery最簡單了,其他的javascript的framework,只要光看語法,就讓我頭暈,不像jQuery的語法那麼直覺,上次研習,介紹了YUI這套framework,語法比起jQuery,簡直就是文言文跟白話文的對比,YUI的語法實在繁複,後來上網找另一套framework—dojo,也是覺得沒有jQuery那麼親切,後來還是決定用jQuery,整個jQuery的語法簡潔明瞭,就像網站上的slogan說的--write less, do more,而且現在jQuery發展一套UI,可以很方便的套用,試用了一下,真的是方便啊,最適合我這種懶人了。

安裝流程
文件開頭的第二個網址就列出了安裝步驟,而且是圖文並茂的詳細步驟。

開啟eclipse

點選help->software updates->Find and Install->search for new features to install->next

填入下載網址:http://update.aptana.com/install/studio/3.2/ 及name

再來看看畫面,一直按下一步就裝好了。