2010年6月12日 星期六

PEAR安裝

PEAR(PHP Extension and Application Repository)是PHP延伸及應用程式容器
裡面有許多PHP類別,可以提供SOAP服務
PHP4.3.0以後的版本會預設安裝PEAR套件管理工具
它有兩種安裝方式,以下分別說明

1.透過套件管理工具來執行安裝

這個感覺上也是最簡單的方式 ,不用調什麼設定
需要注意的是這個模式的安裝大多需要系統管理者的權限來執行
安裝完PHP後可以在資料夾下找到go-pear.bat檔案
點擊它然後一直按Enter就可以了
當然也可以在cmd模式下執行這個檔案安裝

裝好PEAR後,會在PHP安裝目錄底下會看到 pear.bat 
把PHP安裝目錄加到 PATH 系統變數裡,例如:C:\AppServ\php5; 
接著打開CMD 視窗,一些關於PEAR的指令可以輸入
輸入"pear"可以列出所有指令的清單  
執行"pear list"可以檢視所安裝的套件
想安裝套件可以執行"pear install" 套件名稱
例如輸入"pear install MDB2",這樣就會安裝 PEAR::MDB2 了
順帶一提的是使用MDB2還要以"pear install pear/MDB2#"安裝對主機上的資料庫的driver
例如現在主機上的資料庫系統是MySQL
則需執行"pear install pear/MDB2#mysql"、"pear install pear/MDB2#mysqli"
其他可以考慮安裝的套件有
"HTTP"、"Mail"、"Mail_mime"、"Net_SMTP"、"XML_Parser"、"XML_RPC2"等
有些套件會一併安裝或是需要其他的套件先安裝才能使用
假使有回傳Dependencies failed,install指令要加入"-a"旗標
例如"pear install -a XML_Beautifier"
這樣就能夠一併安裝所需要的套件
套件安裝完後得重新啟動Apache才能使用

如果要使用圖形介面來管理pear
有個套件PEAR_Frontend_Web可以使用
安裝之前還要先裝好"Net_UserAgent_Detect"、"Pager"兩個套件
不過在這份備忘錄撰寫的時候只有beta版
所以安裝的指令會是"pear install PEAR_Frontend_Web-beta"
安裝完後到PEAR資料夾底下(預設是php目錄下)找到 pearfrontendweb.php
複製到想放置的Apache目錄下並改成想用的名稱,之後就可以用這個圖形頁面作pear管理了 
這篇文章的後半段有對這個套件做更詳細的說明

安裝完後記得執行"pear upgrade-all"
它可以對目前的套件進行自動更新
想要移除套件時執行"pear uninstall 套件名稱"
若套件之間有相互依賴性時會在移除時回報錯誤訊息
在uninstall指令後加入"-n"旗標可以強制移除

2.到 http://pear.php.net/go-pear 網頁進行安裝

進入網頁後,將頁面上所有內容複製另存為go-pear.php,放在Apache網頁目錄裡
接著以網頁方式開啟他,例如 http://localhost/go-pear.php
點選NEXT>>後調整參數安裝

Installation prefix   
安裝PEAR的根目錄,有些選項裡的$prefix就是指這個位置
其他選項我不敢亂動太多
記得要在php.ini裡加入你選擇安裝pear的位置
例如:
;***** Added by go-pear
include_path=".;C:\AppServ\php5\pear"
;*****

安裝完成後注意頁面下方會出現 Start Web Frontend of the PEAR Installer >>
點擊它會會連到 PEAR_Frontend_Web 所建立的管理頁面
雖然測試時產生的連結會多一個 "\" 符號,刪除後繼續連結即可


推薦的方法還是第一種較好
go-pear在目錄設定時容易產生紊亂
假使需要圖形介面作管理再同介紹裡一般下載套件使用即可

補充一下,登入PEAR_Frontend_Web的頁面時會出現一個警告,訊息如下:
This package management website is not protected with a password, ...
必須要建立.htaccess檔案增加安全性,才會解除警告
在Linux底下要建立.htaccess似乎沒什麼限制
不過在windows底下要建立檔案則必須使用一點手法
首先到Apache資料夾下的conf打開httpd.conf
找到 AllowOverride None 這行後改成 AllowOverride All
接著我們要增加兩個檔案來做到保護效果
首先在放置PEAR_Frontend_Web管理頁面的資料夾底下新增文字檔案
命名為.htaccess,存檔類型改成所有檔案
內容打上
AuthUserFile  XXX/.htpasswd   #.htpasswd存放路徑 
AuthType Basic
AuthName "Web-based PEAR Frontend"
Require valid-user

設定完成之後在讀取此目錄時會要求輸入帳號、密碼
接著來製作.htpasswd
可以的選擇的做法有二
一是到http://www.htaccesstools.com/htpasswd-generator/ 進行製作
將做出來的文字貼到.htpasswd即可
另一種做法是用cmd開啟Apache/bin底下的htpasswd,輸入指令:
C:\...>cd \AppServ\Apache2.2\bin
htpasswd -c -m .htpasswd admin

-c是建檔  -m是以md5去加密  下一個參數是檔名  接著是帳號
設定完之後會在bin資料夾底下找到一個.htpasswd檔案
.htpasswd放置的位置放在安全的位置即可
如此就完成了

另外,如果要在虛擬主機上使用pear則有別的處理方式
1.到官網下載pear程式
2.解壓縮後將上傳PEAR目錄到想放的目錄下
3.再上傳PEAR.php &  PEAR5.php到相同的目錄下
4.要使用套件時一樣式下載套件後直接上傳到任意位置,使用時依照範例使用相對路徑
5..在撰寫php程式時加入宣告
範例:

<?php
//設定PEAR安裝的絕對路徑
ini_set("include_path", "路徑".
PATH_SEPARATOR.ini_get("include_path"));
//設定要使用的pear函式及相對路徑
require_once "Text/Password.php";
//輸出範例,產生10碼隨機亂數英文
echo Text_Password::create(10,'Pronounceable');
?>

AcionScript 3 筆記(2)

這篇還是以會用到的ActionScript作介紹
提到的有
1.結合陣列和函式
2.function接受不定數量參數寫法
3.使用getChildByName()函式取得元件
4.動態設定元件屬性

1.結合陣列和函式

ActionScript 3 可以將陣列與函式搭配使用

範例程式碼:
var name:Array = ["Joe", "Jon", "Jay"];
name.foreach(showName);

function showName(element:*, index:int, array:Array){
  trace("第" + index + "號的名字是" + element);
}

上述程式的element是表示元素的值,index就是...index嘛,最後的Array是傳進來的array
使用這種寫法就會自動的將參數以上面的方式輸入函式裡
另外以下的使用方法也可以參考:
....//與上述程式碼相同

function showName(element:*, index:int, array:Array){
  //add ", " after elements 
  array[index] = element + ", ";
}
trace("名單有"+name + "以及其他人");

輸出結果會是經過改變的陣列內容

類似的處理還有map、filter、every、some方法

map範例:

var score:Array = [1, 2, 3];
var message:Array = score.map(addString);


function addString(element:*, index:int, array:Array){
 return element + "分";

}
trace("score 是" + score);
trace("message 是" +message);

map與foreach方法的差別在於它具有回傳值

filter範例:
var num:Array = {1,2,3,4,5,6};
var evenList:Array = num.filter(isEven);

function isEven(element:*, index:int, array:Array):Boolean{
   return element%2 == 0;
}
trace("偶數有" + evenList);

filter回傳的會是在判斷式裡是true的值,也就是  "偶數有2,4,6"
every、some的寫法類似filter,但這兩個回傳Boolean值
分別是對整體Array或部分Array作判斷
例如num.every(isEven); //回傳false,因為數列並不全為偶數

2.function接受不定數量參數寫法

這個部分在Java裡有類似的寫法,處理方式也差不多
範例:
function getDishes(plate:String, ...dishList:Array){
  var  dishes:String = dishList.join("、");
  trace(plate + "有" + dishes);
}

getDishes("盒子裡有", "香腸", "空心菜", "炒麵");
不定量參數一定要放在最後面,並且只能用Array形別

3.使用getChildByName()函式取得元件

看到這個名稱就很容易想到 javascript 取得元件的寫法
在Flex裡整個mxml檔案內的元件配置也是呈現DOM階層式
mxml裡的Application標籤宣告即是一個節點
每個節點在執行期都等同於instance實體物件
實際上Flex還會再另外建立一個stage節點於Application上
stage位於整個結構的頂點,可以控制整個Application版面的配置
而這個getChildByName()函式使用方法如下:
 this.getChildByName('a');

它會在整個階層架構中尋找名為a的元件
並將其以DisplayObject的型態回傳

4.動態設定元件屬性 

程式範例:
            public function setAttributeByName(uiIns:UIComponent,aName:String):void {
                // 將物件Class-類別宣告轉成XML資料格式
                 var classInfo:XML = describeType(uiIns);
                // 走訪XML中描述物件中所有的屬性
                for each (var attr:XML in classInfo..accessor) {
                    //過濾如果屬性型態不是writeonly,也就是篩選出可讀寫的屬性
                    if (attr.@access != 'writeonly') {
                        if (attr.@name==aName) {
                            //以Associative array key的方式設定Instance的屬性
                            uiIns[attr.@name]=100;
                        }   
                    }
                }
            }

程式會走訪XML中所有accessor節點並放入attr變數中
假使內容如同傳進來的aName變數
這個function會將指定的屬性設定成100

另外將accessor改換成method,則可以走訪物件資料中的method資料
程式範例:
        public function callMethodByName(uiIns:UIComponent,mName:String):void {
             //用陣列設定傳遞給方法中參數的值,請參考setVisible方法的參數格式
             var args:Array=[false,false];
              var classInfo:XML = describeType(uiIns);
             // 走訪XML中描述物件中所有的方法
             for each (var meth:XML in classInfo..method){
                 if (meth.@name==mName){
                     //以Associative array key的機制動態取得Instance的方法
                     //運用apply方法動態invoke被指定方法與傳遞參數
                     uiIns[mName].apply(uiIns, args);
                    }   
                }
            }

這個範例可以做到動態呼叫元件的函式

2010年6月11日 星期五

出現找不到php_mbstring.dll的處理方式

因為很多模組套件的安裝或是調整都會牽扯到這個dll檔
記錄一下處理方式

1.開啟php.ini
2.將裡面的 extension=php_exif.dll 剪貼在 php_mbstring.dll 之後

完成

2010年6月3日 星期四

phpMyAdmin裡設定foreign key

在phpMyAdmin裡面也是可以用foreign key的

1.先對MySQL設定作調整 ,my.ini裡的skip-innodb用#註解掉,這樣phpMyAdmin就可以使用InnoDB引擎了。註解完後要重新開啟MySQL。

2.進入資料表裡,選取管理選項,會在左下的資料表選項裡找到儲存引擎,改為InnoDB

3.使用關聯選項時要先記得替想參考的key設定index值,這樣才可以連到其他的key

4.選取資料表的結構選項,這時候會發現一個原本沒有的關聯檢視選項,點選它吧

5.修改想調整的key,選項設成CASCADE就調整完了

有設定foreign key的部分在修改刪除時會有影響,謹記並慎用

2010年6月2日 星期三

AcionScript 3 筆記(1)

AcionScript的語言還在摸索中
目前會以Flex會用到的部分來寫
這回提到的是基礎部分
1.變數宣告
2.資料型別判斷
3.型別轉換
4.陣列使用方式
5.for迴圈與for each迴圈寫法
6.AS3的特殊操作符號

1.變數宣告

ActionScipt的變數宣告並不算太嚴謹
它的宣告方式是 var  variable : type
例如: var name : String;

但如果不指定資料型別的話也可以,例如 var  variable;
它的語法會等同於 var variable : *;
*類別與其他資料型別不一樣,它表示暫時不確定之後會寫入什麼型別
當然缺點就是處理*型別會比較花時間囉

2.資料型別判斷

ActionScript 3 的基底資料型別共有 int、Number、String、uint、Boolean
複雜資料型別則包含了 Array、Date、Error、Function、RegExp等
不同於Java的地方是,AS3的所有資料型別都是物件
var sth:int = 1;    會與  var sth:int = new int(1);  相同

AS3用關鍵字 is 來判斷變數的類別,並返回 boolean值表示結果
值得一提的是 AS3 提供了另一個關鍵字 as
在物件符合類別時會回傳物件本身,不符合時則回傳 null
trace(n1 as Number)    //n1為Number型別時回傳n1,否則回傳null

3.型別轉換 

ActionScript作型別轉換的函式就跟他類別的名稱一樣
三種型別:int, Number, uint 對應的轉換式分別為 int(), Number(), uint()
另外將字串轉換為數值還可以用parseint(), parseFloat()
若是無法轉換成數字的值,在int或是uint裡會回傳0,Number值則會回傳NaN

轉換成字串的方法為String(想轉換成字串的值)
轉換成Boolean則用Boolean(),0的值換轉成false,其餘則為true

4.陣列使用方式

使用array的方法為
var arr : Array = ["a", "b", "c"];
要得知陣列長度則可以使用  陣列名稱.length
例如:var num : int = arr.length;

它的Array比較像是java裡面的ArrayList
也可以像下面的方式使用
var nameList : Array = new Array();
nameList.push("John");
nameList.push("Allen");

push()是在陣列結尾加入元素,另外有一個ubshift()則是在陣列開頭加入元素
刪除元素的方法則有pop()和shift()
pop()刪除陣列最後面的元素,shift()刪除陣列最前面的元素
而陣列的index也會因為以上方式而跟著變動

陣列裡面也有sort()方法,他會依照unicode的大小來進行升冪排列
var arr : Array = ["22", "15", "a"];
arr.sort();
trace(arr);
排列結果會是15,22,a

此外也有一些常數可以調整排列順序
Array.DESCENDING會改使用降冪排列
Array.NUMERIC 會將元素視為數值
Array.CASEINSENSITIVE 沒有大小寫差異
Array.UNIQUESORT 陣列內有重複元素時,會停止排序並回傳0
Array.RETURNINDEXEDARRAY不替原本陣列排序,而傳回指定順序的新陣列
使用方式為 arr.sort(Array.DESCENDING);
有多重排序規則需求的話則使用 | 來區隔規則
例如 arr.sort(Array.DESCENDING | Array.NUMERIC);

sortOn方法則是可以依屬性值排列
例如可以依照現有物件的y軸位置來做排列
 arr.sortOn("y ", Array.NUMERIC);

需要反轉陣列的時候則用reverse()函式,如:arr.reverse();
要確認陣列裡面是否已經存在要加入的值可以使用indexOf()和lastIndexOf()
使用方法為 arr.indexOf(要查詢的值);
indexOf會從陣列開頭開始找起,lastIndexOf則從陣列結尾開始找
找到之後會回傳該值的index值
若要將所有的元素結合成字串可以使用join()函式,以下範例:
var numList : Array = [10, 8, 5];
var message :String = numList.join("分和");
trace("結果是" + message + "。");

結果:結果是10分和8分和5

5.for迴圈與for each迴圈寫法

for迴圈使用範例:
var testArray:Array = ["1", "2", "3"];
for(var i:String in testArray){
  trace(testArray[i]);
}

for each迴圈使用範例:
var testArray:Array = ["1", "2", "3"];
for(var num in testArray){
  trace(num);
}

6.AS3的特殊操作符號

[] - 初始化陣列              {x:y} - 初始化對象          x.y or x[y] -訪問屬性
:: - 標識屬性、方法或 XML 屬性或特性的命名空間    @ - 標識 XML 或 XMLList 對象的屬性
.. - 定位到 XML 或 XMLList 對象的後代元素,或(結合使用 @ 運算符)查找匹配的後代屬性
* - 指定屬性是無類型的(特殊運用)