發表文章

目前顯示的是 7月, 2008的文章

FTP工作時的二種連接模式

FTP中的兩種工作方式 : 防火牆有很多種,其中有一些會禁止那些不是從內部網路IP發出的連接請求。而ftp協議是個很老的東東,沒有考慮這個問題。可以這樣簡單描述一般ftp的工作原理: client對server發出請求:「嗨,我的xxPort正等著你傳送資料呢,sever聽到這個請求,就會建立一個連接,指向這個Port,並且開始傳送資料。這就回到了我們的問題,如果發出請求的client在防火牆的後面,而這個防火牆禁止外部IP建立連接,那麼當然server(在外部)不能建立與client的連接。 所以,過了幾年,人們修改了ftp協議以應付這種情況。這就是passive mode,工作原理如下:client向server發出passive命令,server回答說:「資料在xxPort等你,自己來拿。」 而這回則由client建立指向server的連接,從而取得資料。這就避免了防火牆的限制。   FTP是一種文件傳輸協議,它支持兩種模式,一種方式叫做Standard (也就是 Active,主動方式),一種是 Passive (也就是PASV,被 動方式)。 Standard模式 FTP的客戶端發送 PORT 命令到FTP server。Passive模式FTP的客戶端發送 PASV命令到 FTP Server。 接著下面,介紹一個ftp,這兩種方式的工作原理:   Standard模式FTP 客戶端首先和FTP Server的TCP 21Port建立連接,通過這個通道發送命令,客戶端需要接收資料的時候在這 個通道上發送PORT命令。 PORT命令包含了客戶端用什麼Port接收資料。在傳送資料的時候,服務器端通過自己的TCP 20Port發 送資料。 FTP server必須和客戶端建立一個新的連接用來傳送資料。   Passive模式在建立控制通道的時候和Standard模式類似,當客戶端通過這個通道發送PASV 命令的時候,FTP server開啟一個 位於1024和5000之間的隨機Port並且通知客戶端在這個Port上傳送資料的請求,然後FTP server 將通過這個Port進行資料的傳送, 這個時候FTP server不再需要建立一個新的和客戶端之間的連接。   現在的FTP軟體裡面包括在IE5以上的版本裡面也已經支持這兩種模式了。一般一些FTP客戶端的軟體就...

轉字串為table的函數

在程式中,你可以呼叫這個函數來將字串轉為table,當然您的字串是規格化的,比如您有一個字串→str=" coffee,spring,worm,tea"(是用逗號來分隔的字串內容),那麼你可以在程式中寫:tb_back = DelimitedStringToTable(str, ","); 你可以得到一個table名為tb_back,而其內容就是四個字串。 function DelimitedStringToTable(DelimitedString, Delimiter) tbReturn = {}; local strWorking; local nPos = nil; local strData; local nTableIndex = 1; local nDelimiterLength = String.Length(Delimiter); if(nDelimiterLength tbReturn[nTableIndex] = DelimitedString; return tbReturn; end strWorking = DelimitedString; nPos = String.Find(strWorking,Delimiter); while(nPos ~= -1)do strData = String.Left(strWorking,nPos-1); tbReturn[nTableIndex] = strData; nTableIndex = nTableIndex + 1; local nLength = String.Length(strWorking); strWorking = String.Right(strWorking,nLength - (nPos + (nDelimiterLength-1))); nPos = String.Find(strWorking,Delimiter); end if(strWorking ~= "")then tbReturn[nTableIndex] = strWorking; end return tbReturn; end

Script-Tip012程式的除錯

*寫程式出現錯誤是常發生的事,當您的程式越寫越多,就愈容易犯邏輯錯誤,譬如重覆定義了變數,或符號打錯了,有時為了找一個小錯誤會花上您一天的時間。 AMS提供了很完善的除錯機制,讓您在程式執行錯誤時可以很快地找到錯誤的地方。所有在AMS中的Script都使用同一個除錯技術。 不過有一點是您必須了解的,在有些function,modules或script並不必然能除錯的,尤其是一些外界開發者所寫的用於AMS的程式,可能有它們自己的除錯方式,您必須要自行去讀取這些作者的文件,以了解如何發現錯誤。 ※您所寫的程式可能千變萬化(程式語言彈性本來就很大),程式引擎通常只能捕捉明顯的寫法錯誤,其他您就不要太苛求了! 在AMS中,當您執行程式時,程式引擎所能捕捉的錯誤有二類: 語法錯誤和功能性錯誤 *語法錯誤 這類型的錯誤,通常是您的程式寫法有缺損或錯誤,在您預覽或建立(build)您的程式時會被捕捉到。例如: foo = 上列的程式碼算是很明顯的式子不完整,定義了變數卻沒有指定值給它。 語法錯誤還有一種是您使用內建涵數,但卻沒有傳入規定的參數個數,不過這種錯誤在預覽及建立程式時,不會被捕捉到,直到執行期才會出現錯誤。 例如: Dialog.Message("大家好"); 如上式,使用訊息對話盒的涵數,至少要傳入二個參數(可參閱各action說明),但只傳入一個,在預覽或建立時都不會捕捉錯誤,因為程式引擎檢查了涵數名稱沒有錯,括號也沒少,也有";"當結尾,所以就不認為有錯,不過這行程式在執行時便會出現錯誤訊息說明少了參數。 ※如果您參考一下使用手冊中,Dialog.Message的涵數模型如下: code:-------------------------------------------------------------------------------- number Dialog.Message ( string Title, string Text, number Type = MB_OK, number Icon = MB_ICONINFORMATION, number DefaultButton = MB_DEFBUTTON1 ) -----------------------------------------------...

Script-Tip011其他內建涵數

*dofile AMS的程式引擎完全支援LUA程式程言,您可以將程式寫在外面存成*.lua(純文字檔),在您的 AMS程式中再以dofile將外部程式檔引入及執行。 語法: dofile(lua檔路徑); 您可以用這種方式來幫助您整理及分類龐大的程式碼,每執行一次上述的語法,路徑中的lua 檔便會重新讀入並執行一次。 *require 與dofile一樣是引入外部的lua檔並執行,不同的地方在於,程式啟動後,以require引入的lua檔 只會執行一次,並存於記憶體中,就算您在某個event中再require一次,程式引擎也不會重讀 路徑中的lua檔。 語法: require(lua檔路徑); ※require很適合您將變數的初始化或專案會用到的涵數寫在lua然後引入,這樣可避免大量的 變數式及functions寫在global script中,程式碼多到您自己眼花。 ※只要您將您要引入的外部lua檔,放入專案的Modules目錄中,您在寫路徑的時候就不必寫完 整路徑,只要寫檔名就行了,這適用於dofile及require 例如:您寫了一個外部檔test.lua並放入專案的Modules目錄中,那您引入的語法: dofile("test.lua"); 或 require("test.lua"); *type 這個內建涵數是讓您用來取得一個變數所帶的資料型別的,語法: my_var = type(變數); 依資料的不同,它會傳回六種字串名:"nil","number","string","boolean","table","function" 例如: a = 898; my_var = type(a); --my_var會得到"number"這個字串值 b = "coffeeworm"; two_var = type(b); --two_var會得到"string"這個字串值 ※在程式實務中,有時您必須確認一下變數的型別是不是您所想要的,以避免出錯。 範例: code:------------------------------------------...

Script-Tip010字串的操作

*連接字串:您可以利用 .. 這個運算子來連結二個字串,或者連結字串和數字,數字會轉為 字串。 code:-------------------------------------------------------------------------------- Fullname = "Coffee".." worm"; --這時Fullname的值為"Coffee worm" d = 365; text = "一年有"..d.."天"; --這時text的值為"一年有365天" -------------------------------------------------------------------------------- ※為了程式閱讀方便,.. 並不一定要緊靠著字串或變數 foo = "test"..var; 寫成 foo = "test" .. var;也可以 *字串的比較 在寫程式的時候,經常會需要比對二個字串是否一樣,AMS內定使用 == 這個符號作為比對 符號,中文的話沒什麼問題,比對英文時預設是大小寫視為不同的(二個英文字串必須大小寫 都一樣,字串才會相等),比對的結果為布林值。 範例: code:-------------------------------------------------------------------------------- str_one = "CoffeeWorm"; str_two = "CoffeeWorm"; if str_one == str_two then Dialog.Message("比對結果", "二個字串相同"); else Dialog.Message("比對結果", "二個字串不同"); end -------------------------------------------------------------------------------- 上例會顯示二個字串相同 ※如果您希望比對時不...

Script-Tip009關於functions的使用

涵數是AMS中很有用的功能,分為內建涵數及自訂涵數,像Dialog.Message即為內建涵數,您只要提供所需的參數給它,它便為您呈現對話盒,AMS的內建涵數非常的多,只要熟悉他們的用法,您就可以做大部份的事了,當然您也可以自行定義您所需要的涵數,稱為自訂涵數,您需要按照下列的程式模型來定義: function 涵數名(參數) 欲執行的程式 return 值; end 以function關鍵字為首,以end結尾,參數是可有可無的,視您的需要,之中包著您的程式碼,若使用return關鍵字,則可讓涵數的執行有「傳回值」。 下面是一個簡單的自訂涵數範例: code:-------------------------------------------------------------------------------- function Helloworld() Dialog.Message("Welcome" , "Hello World !!!"); end -------------------------------------------------------------------------------- 上面是一個沒有參數,沒有傳回值的涵數,名為Helloworld(),您可以在任何地方呼叫它,只要在程式上打入下列這一行: Helloworld(); 如此就會呼叫這個涵數並執行其程式碼,會出現一個對話盒(標題為Welcome,文字為Hello World !!!) ※有一件要特別注意的是:在您呼叫某個涵數之前,必須確定它已經在記憶體中被初始化(即涵數已被執行過),所以我們通常會將自訂涵數集中寫在Globals Functions中,如此當程式啟動時便可確保這些涵數都已初始化了。 *涵數的傳入值(參數) 以下範例: code:-------------------------------------------------------------------------------- --定義一個含有一個參數的涵數 function HelloWorld(a1) Dialog.Message("title", a1); end --在其他地方呼叫它 HelloWorld("大家好!...

Script-Tip008關於Tables(Arrays)

在AMS中Tables是一個特別且非常有用的資料型別,您可用它來存放各類型的資料值,包含function或其他Tables *建立Tables 有二種方法可以在程式中建立Tables第一種方法是用{ }將元素值包含在裡面,如下: my_tables = {"元素一","元素二","元素三"}; 或 my_tables = {name = "coffee", tel = "06-2841700"}; ※Tables本身有二種陣列(Arrays)類型,像上面第一種是「數列式」,第二種是「關聯式」的。 第二種建立Tables的方法,是先建一個空的Tables再加入元素,如下: my_tables = {}; my_tables[1] = "元素一"; my_tables[2] = "元素二"; my_tables[3] = "元素三"; 或 my_tables = {}; my_tables.name = "coffee"; my_tables.tel = "06-241700"; 上面的說明中第一種寫法是針對數列式的Tables,第二種是針對關聯式的Tables * 存取Tables中的元素(存在Tables中的資料,每一筆以 , 分開) 儲存在Tables中的資料稱為「元素」,每個元素都含有一個key(鍵),這個key就關聯著它所代表的值,而這個key就是我們所謂的「索引(index)」。在AMS中Tables包含二種列陣,一為數列型陣列,它的index是數列組成,由1開始,另一類是關聯型的陣列,它的index可以是字串、數字、涵數。 ※數列型陣列 --這個Tables中含有四個元素,值是e1,e2,e3,e4,它們的index是1~4 n_table = {"e1","e2","e3","e4"}; --存取其中元素的方法→ Tables名[第幾個元素],如n_table[2]代表第二個元素的值 Dialog.Message("table test", n_table[2...

Script-Tip007結構化程式控制

AMS的程式引擎接受的程式控制為 if , while , repeat , for *if 的語法: if 條件式 then --欲執行的程式 end if , then , end是語法中的關鍵字,一定要使用的,如果條件式成立(即true)那麼if和end之間的程 式碼才會被執行 例如: code:-------------------------------------------------------------------------------- x = 50; if x > 10 then Dialog.Message("title","文字對話盒"); end -------------------------------------------------------------------------------- 上面的例子中,對話盒那行程式是會被執行的,因為條件式「x>10」是成立的。 條件式也可以是複雜的,如下: code:-------------------------------------------------------------------------------- y = 3; if (y+7)*10 == 100 then Dialog.Message("title","文字對話盒"); end -------------------------------------------------------------------------------- 在 if 控制式中也予許加入 else 和 elseif 等關鍵字來增加分支判斷式,如 code:-------------------------------------------------------------------------------- x = 100; if x 100 -------------------------------------------------------------------------------- *For 迴圈 當您很確定所要執行的迴圈次數,使用for便是一個好選擇,其程式模型如下: for 變數 = 開始數, 結束數,...

Script-Tip006程式語法與運算子

所謂的程式語法即是變數與值的評定方法,可能是單純的指定一個數值給變數,也有可能是 複合的運算式子的結果指定給變數,您也可使用括號來改變式子的運算順序,不然就如同我 們所學的數學一樣,電腦會依「先乘除後加減」的順序來運算一個式子。 以下都是可行的寫法: code:-------------------------------------------------------------------------------- a = 10; a = (5+1)*2; a = 100/10; a = 100/(5*2); -------------------------------------------------------------------------------- 除以上的例子外還有很多,自己想像吧! *算術運算子 算術運算子專司數字的處理 + 加法運算子 - 減法運算子 * 乘法運算子 / 除法運算子 unary - 負數符號 ※其實只要您學過數學方程式,這個部份就如同數學一般只是 = 號在電腦中不是「等於」的 意思,而是「將右側的運算結果指定給左側的意思」,這一點是要常常注意的。 *比較運算子 這種運算子提供您比較二側的變數或值的功能,其結果是以布林值來表示(true / false) > 大於 = 大於等於 ~= 比較二側是否不相等 == 比較二側是否相等 以下範例: code:-------------------------------------------------------------------------------- 10 > 20; --結果為false a = 10; a > 5; --結果為true "Coffee" ~= "Spring" --結果為true -------------------------------------------------------------------------------- 這兒特別提到「字串」的比較,在AMS中字串是分大小寫的,所以二側的字串要一模一樣才 會相等。 code:---------------------------------------------------------------------------...

Script-Tip005資料型別

*Number(數值) 在AMS中,Number代表所有的數字性的值,不像其他開發程式還將數值分為整數、單精數、 倍精數、.....,只有一類:就是數字,可容許的數值表示如下: 4 4. .4 0.4 4.57e-3 0.3e12 *String(字串) 所謂的String(字串)是指一連串的字元的集合,例如:"我的測試" 這個字串即是一個4個中文字 元的字串,若您的字串是英文,一個英文字母也是一個字元,這說明了AMS是支持雙位元編 碼的,所以您可以放心的使用中文字。 字串可以含有非常長的字元(甚至長至整篇文章),其中也可以包含空白字元,也可以包含合 法的8-bit ASCII字元或null(\0),您必須將欲表示的字串置於成對的 " " 或 ' '中,通常是使用 前者,在程式引擊方面,AMS會自動分配記憶體的使用,不需您操心。 例如以下的表示法: code:-------------------------------------------------------------------------------- name = "Joe blow"; Lastname = 'worm'; Dialog.Message("Hello","我是咖啡虫!"); -------------------------------------------------------------------------------- 有時候,您想在字串中顯示單括號(' ')或雙括號(" ")您可以如下的寫法: code:-------------------------------------------------------------------------------- title = "小朋友,你們知道 '神木' 在哪裡嗎?" --這個字串可顯示 '神木' title2 = '小朋友,你們知道 "神木" 在哪裡嗎?' --這個字串可顯示 "神木" ---------------------------...

Script-Tip004變數型態及變數值

*動態型別處理 AMS的程式語言與其他如C語言不同的地方是:AMS採動態型別處理,定義及使用變數前並 不需要「宣告」「變數」的型別,變數的型別會自動隨著它所握住的值的資料型別動態地改 變。 這可讓程式開發者省了不少犯錯的機會,以往使用C或C++... 的程式員,常因為要記住變數目 前的型別而傷腦筋。 例如:在C++中要使用一個變數j且指定一個值10給它,要如下寫法 code:-------------------------------------------------------------------------------- int j; --這一行便是宣告j的型別是整數 j = 10; -------------------------------------------------------------------------------- 但是在AMS中您只要這樣寫: code:-------------------------------------------------------------------------------- j = 10; -------------------------------------------------------------------------------- AMS會視您放入變數中的值是什麼型別而動態地變化變數的型別。 所以您可以如下這樣寫也不會有錯: code:-------------------------------------------------------------------------------- j = 10; j = "這是測試"; -------------------------------------------------------------------------------- 這種寫法在C++中,便會造成錯誤。 *根據上面所述,我們不用去討論變數的型別問題,只要關係資料有哪些型別就行了。 在AMS中,有六種資料型別:number(數值),string(字串),nil(無),boolean(布林值),function(涵數),table(表)

Script-Tip003關於變數

*什麼是「變數(Variables)」 以寫程式而言,「變數」是非常重要的,不管您使用何種語言,您都會用到,簡單地說,所謂的變數即是一個 「值(Values)」的代號或位置握柄,而這個「值」是可以變更和重覆使用的,例如: code:-------------------------------------------------------------------------------- amount = 10; -------------------------------------------------------------------------------- 這個程式碼,便是定義一個變數名為 amount ,並且指定一個值→10,請注意,是「指定」不是「等於」, amount 這個變數的值未必會一直都是10,您可以這樣想,變數是一個容器,而值便是放入容器中的東西,它隨 時可以被更換。 例如: code:-------------------------------------------------------------------------------- amount = 10; amount = amount + 20; -------------------------------------------------------------------------------- 上面程式碼的意思是說,定義一個變數叫做 amount,先指定它的值是 10,接著在第二行中,把amount中的值 拿出來加上20再放回amount中,所以程式執行到此,amount的值是30,這樣的式子在數學是不對的,但在程式 中卻是可行的。 code:-------------------------------------------------------------------------------- a = 10; b = a; -------------------------------------------------------------------------------- 上面的程式的意思是定義一個變數叫做 a,先指定它的值是 10,再定義一個變數名為b,將「a的值」放入b中 ,所以這時b的值也變成了10 *變數的範圍 在AMS中,變數預...

Script-Tip002程式的重要概念

*AMS的程式碼是全域性的: 在runtime(執行期)時,程式引擊預設是認得您所定義的所有變數(varable)及函數(function)的,例如您在gobal function中或On Startup中定義了一些變數值,例如:myvar = 5; 或函數如: code: ________________________________________ function myfunction(a1,a2) -----您的程式 end ________________________________________ 之類的,在程式開始執行後,在任一個event中,這些變數或function都是可見的,可用的。 *在AMS中,變數及函數的命名是有分別大小寫的: abc=5; 和 Abc=3; 這二個式子中,abc與Abc被視為二個不同的變數,同理,您命名函數時也要注意大小寫的問題。 *程式注解:您的程式不斷地發展會越寫越長,您最好養成為自己所寫的程式加上注釋,以便日後維護方便, 而所謂的注解,即是在程式碼中不會被執行的部份,僅是給程式員看的解釋。 在AMS中,定義某一行不執行的方法就是在該行的最前面加上 (--)兩個短線號,也就是說 -- 之後的字元都會被 視為注解而不會執行。如: code: ________________________________________ --這是注解文字 MyVar = 6; a = MyVar+3; b = a; --注解文字也可以在這兒 ________________________________________ 多行注解可以使用 --[[ 和 ]]-- 來框住注解文字,如: code: ________________________________________ --[[ 這是多行 注解的 範例 ]]-- a = 10; ________________________________________ *分行符號,在AMS中予許您使用( ; )分號來分開同一行的兩句敘述,以下範例都是可被接受的程式寫法。 第一種: code: ________________________________________ a = 10 MyVar = a _______________________________________...

Script-Tip001程式碼寫到那裡

在AMS中,程式碼可以寫的地方很多,主要寫在各物件的Action窗格,不同的物件又會有不同類型的Event(事件),而所謂的事件即是您可指定,在某個物件的什麼狀態下才執行所寫的程式碼。在物件導向的程式中,所有的東西都可視為物件,大到整個程式本身,或小至一個按鈕,AMS也不例外。 以整個程式而言有以下事件: On Startup :在程式啟動的時候 On Shutdown :在程式關閉的時候 以Page(頁面:AMS的呈現單位)而言 On Show :在頁面呈現的時候 On Close: 在離開這個頁面的時候 On Audio :在這個頁面中的音樂軌的音樂播完時 On Timer: 當計時器啟動時 On Key: 當鍵盤被按下時 On Preload: 當頁面第一次載入記憶體時程式物件及頁面物件是很特別的,它們可能不需要使用者刻意以滑鼠去觸發,可以用來執行一些您想要在程式啟動時就執行的程式。 其他的物件所含的事件就大都由使用者的滑鼠來觸發,常見的是: On Click: 當物件被按下時 On Double-Click: 當物件被雙按時 On Enter :當滑鼠移上物件時 On Leave: 當滑鼠離開物件時 其他事件還有: On Focus :當物件成為焦點時→這在input及listbox上才有 On Finish :當影片播完時 On FSCommand: 當Flash有FSCommand時 On Loaded :當某個url載入完畢時 On Navigate: 當網頁物件的網址改變時 On Pause :當影片暫停時 On Play: 當影片開始播放時 On Stop: 當影片停止時 On Select: 當某個選項被選擇時:如listbox.... 以上是大略的整理也講得差不多了,唯AMS是開放架構,不斷地有新的PLUG-IN被開發而加入新功能,新的PLUG-IN也可能會有特殊的事件,這就要自行參閱其說明文件了,一般來說PLUG-IN都是要額外付錢買的,一旦您買了,作者都會提供完整的說明書。

咖啡虫的網誌開張

網誌開張