Feeds:
文章
迴響

Archive for 2006 年 08 月

公司在前一陣子推出影音部落格的(http://www.cityfamily.com.tw/allframe2.asp?gotourl…)網路服務,基本上與目前火紅的 YouTube 類似,提供一個可以分享自製短片的社群,使用上還蠻流暢的,雖然目前剛推出並沒有像 YouTube 有這麼多的影片,不過我想是相當有潛力的(如:訂閱與派送服務),目前我個人覺得唯一的缺憾可能是名稱取的不是很好,如果你用 Google 搜尋"影音部落格",你會發現一大佗,使用者很難發現你這個服務,也不容易一眼區分這些服務,不過公司可能有他的考量,如品牌。但是做出產品區隔,並讓使用者容易發現和使用這個服務就是行銷人員該想想的問題。

Read Full Post »

查了一下線上手冊,發現 Access 並不支援類似 MySQL 的

INSERT INTO tablename (field1, field2, …)
VALUES (value1, value2, …), (value11, value21, …), …

只有支援從別的 Table 抓出來在新增的多筆資料語法

INSERT INTO tablename (field1, field2, …)
SELECT (value1, value2, …) FROM tablename2

目前我還不知道有何解法,真是挺頭痛的…輸到用時方恨少….. 看來目前只能用 SQL 產生器了 :b

Read Full Post »

今天看到 Dr. J Q/A 提到這個問題解法摘錄如下,有需要的人也可以試試看

1.按一下「開始」功能表,並從功能表中點選「控制台」,接著執行「網際網路選項」。
2.切換到「連線」分頁,點選〔區域網路設定〕按鈕。
3.勾選「使用自動組態指令碼」,於「網址」方框中輸入「http://proxy.wretch.cc/proxy.pac」,
接著勾選「在您的區域網路…」開頭的選項,在「網址」輸入「proxy.wretch.cc/proxy」,按下〔確定〕按鈕。
4.之後重開瀏覽器,試著連線到無名小站網頁,你就會發現網頁的開啟速度變快不少。

Read Full Post »

[C#]URL 參數編解碼

Uri 類別有提供 HexUnescape 和 HexEscape 兩個靜態方法,支援將 URL 中的參數進行邊解碼。

摘自 MSDN 上得範例:

[編碼]
char  testChar = ‘e’;
if (Uri.IsHexDigit(testChar) == true)
    Console.WriteLine("’{0}’ is the hexadecimal representation of {1}", testChar, Uri.FromHex(testChar));
else
    Console.WriteLine("’{0}’ is not a hexadecimal character", testChar);

string returnString = Uri.HexEscape(testChar);
Console.WriteLine("The hexadecimal value of ‘{0}’ is {1}", testChar, returnString);

[解碼]
string testString = "%75";
int index = 0;
if (Uri.IsHexEncoding(testString, 0))
     Console.WriteLine("The character is {0}", Uri.HexUnescape(testString, ref index));
else
     Console.WriteLine("The character is not hexadecimal encoded");

2006.9.1 補充
HttpUtility.HtmlEncode 和 HttpUtility.HtmlDecode 可以更方便完成該工作

Read Full Post »

網路笑話 ^O^

前天下午
我拿美工刀為我的GK模型整形的時候
小聲說:是那種可愛清涼蘿莉型的喔 ^ ^
因為太過於專注了沒發現到女朋友悄悄的走到我後面來
她突然出聲說:喔~你有這種嗜好阿~~
邪之音:哈~哈~被發現了吧
嚇的我~屁~滾~尿~流~失~了~魂~

手上的美工刀往手掌心一劃
大概過了三秒
掌心的傷口鮮血狂噴
女友當場嚇呆了眼淚馬上飆出來
我馬上叫女友去客廳拿急救箱來
我則捏住手腕高舉過心臟
這時傷口的鮮血不再用噴的了改用流的
這時女友一把鼻涕一把眼淚的為我貼OK蹦
看到她這樣一時心軟安慰了她一句:妳又不是故意了
她聽到這樣眼淚馬上又狂飆出來
她一哭我的鮮血又漸漸冒了出

因為傷口太大了OK蹦包不住
這時我的腦筋一閃 女友MC剛來
我叫她馬上把蘋果麵包拿來
她還一時愣住說:現在都什麼時候了還要吃蘋果麵包阿??
我跟她說是衛生棉她才恍然大悟
這時她還問我要長的還是短的??
我只能苦笑:我要有凹槽的……
我拿起衛生棉迅速的往傷口一蓋繃帶一包
果然血馬上就不流了
女友還拍手說:哇~~!好聰明喔
馬上騎著機車往醫院去

醫生一聽說我用衛生棉包傷口
嚇的趕快把繃帶剪開
看到衛生棉吸了滿滿的血
傷口還在留著血
醫生還說了一句:先生,今天量很多喔!!
量多的時候不要用這種的很容易滲出來
我回答說:今天是第三天阿,我不習慣用加長型的
旁邊的護士還在偷笑
最後縫了12針
要走前醫生還跟我說
下次不要再用衛生棉包紮傷口了

因為衛生棉的超強吸收力只會吸光你的血
並不會讓你的血液凝固

Read Full Post »

ACCESS 的 SQL 保留字

摘自 Microsoft Access 2006 線上說明


下列清單包含所有 Microsoft Jet 資料庫引擎保留的字詞,以用於 SQL 陳述式。列示在清單中的非大寫字母字詞也保留在其他應用程式中。因此,這些字詞個別的說明主題,提供非針對 SQL 用法的一般性描述。

附註  末端加上星號 (*) 的字詞已保留,但目前在 Microsoft® Jet SQL 陳述式中並沒有意義 (例如 LevelTableID)。無底線的字詞沒有連結的解釋。

A

ABSOLUTE ANY
ADD ARE
ADMINDB AS
ALL ASC
Alphanumeric — 參閱 TEXT ASSERTION
ALTER AUTHORIZATION
ALTER TABLE AUTOINCREMENT — h0 m,4 COUNTER
And Avg
AS

B-C

BEGIN COLLATION
Between COLUMN
BINARY COMMIT
BIT COMP, COMPRESSION
BIT_LENGTH CONNECT
BOOLEAN — 參閱 BIT CONNECTION
BOTH CONSTRAINT, CONSTRAINTS
BY CONTAINER
BYTE CONTAINS
CASCADE CONVERT
CATALOG Count
CHAR, CHARACTER — 參閱 TEXT COUNTER
CHAR_LENGTH CREATE
CHARACTER_LENGTH CURRENCY
CHECK CURRENT_DATE
CLOSE CURRENT_TIME
CLUSTERED CURRENT_TIMESTAMP
COALESCE CURRENT_USER
COLLATE CURSOR

D

DATABASE DISALLOW
DATE — 參閱 DATETIME DISCONNECT
DATETIME DISTINCT
DAY DISTINCTROW
DEC, DECIMAL DOMAIN
DECLARE DOUBLE
DELETE DROP
DESC

E-H

Eqv FOREIGN
EXCLUSIVECONNECT FROM
EXEC, EXECUTE FROM 子句
EXISTS GENERAL — 參閱 LONGBINARY
EXTRACT GRANT
FALSE GROUP
FETCH GUID
FIRST HAVING
FLOAT, FLOAT8 — 參閱 DOUBLE HOUR
FLOAT4 — 參閱 SINGLE

I

IDENTITY INPUT
IEEEDOUBLE — 參閱 DOUBLE INSENSITIVE
IEEESINGLE — 參閱 SINGLE INSERT
IGNORE INSERT INTO
IMAGE INT, INTEGER, INTEGER4 — 參閱 LONG
Imp INTEGER1 — 參閱 BYTE
In INTEGER2 — 參閱 SHORT
IN INTERVAL
INDEX INTO
INDEXCREATEDB Is
INNER ISOLATION

J-M

JOIN LONGTEXT
KEY LOWER
LANGUAGE MATCH
LAST Max
LEFT MEMO — 參閱 LONGTEXT
Level* Min
Like MINUTE
LOGICAL, LOGICAL1 — 參閱 BIT Mod
LONG MONEY — 參閱 CURRENCY
LONGBINARY MONTH
LONGCHAR

N-P

NATIONAL Outer*
NCHAR OUTPUT
NONCLUSTERED OWNERACCESS
Not PAD
NTEXT PARAMETERS
NULL PARTIAL
NUMBER — 參閱 DOUBLE PASSWORD
NUMERIC — 參閱 DECIMAL PERCENT
NVARCHAR PIVOT
OCTET_LENGTH POSITION
OLEOBJECT — 參閱 LONGBINARY PRECISION
ON PREPARE
OPEN PRIMARY
OPTION PRIVILEGES
Or PROC, PROCEDURE
ORDER PUBLIC

Q-S

REAL — 參閱 SINGLE SMALLDATETIME
REFERENCES SMALLINT — 參閱 SHORT
RESTRICT SMALLMONEY
REVOKE SOME
RIGHT SPACE
ROLLBACK SQL
SCHEMA SQLCODE, SQLERROR, SQLSTATE
SECOND StDev
SELECT StDevP
SELECTSCHEMA STRING — 參閱 TEXT
SELECTSECURITY SUBSTRING
SET Sum
SHORT SYSNAME
SINGLE SYSTEM_USER
SIZE

T-Z

TABLE UPDATEOWNER
TableID* UPDATESECURITY
TEMPORARY UPPER
TEXT USAGE
TIME — 參閱 DATETIME USER
TIMESTAMP USING
TIMEZONE_HOUR VALUE
TIMEZONE_MINUTE VALUES
TINTINT Var
TO VARBINARY — 參閱 BINARY
Top VARCHAR — 參閱 TEXT
TRAILING VarP
TRANSACTION VARYING
TRANSFORM VIEW
TRANSLATE WHEN
TRANSLATION WHENEVER
TRIM WHERE
TRUE WITH
UNION WORK
UNIQUE Xor
UNIQUEIDENTIFIER YEAR
UNKNOWN YESNO — 參閱 BIT
UPDATE ZONE
UPDATEIDENTITY

Read Full Post »

PDF 版本下載處:http://www.j2eemx.com/rip/article.cfm?ATC_ID=3BCAD617-3048-2B5A-26DC66D50119FB74&frame_down=IN

第二篇學習筆記差點難產,原本我以為 Flex 與 HTML 的概念雷同,於是我以第一篇筆記的框架去寫第二篇時發現並不然,再講今天的主題之前,我先說說寫第這篇文章所遇到的種種問題和疑惑,當然在缺乏文件的情況下我只能挖 sample 的原始碼來 try。

首先遇到第一個問題是檔案名稱問題,這個問題再我的 blog 之前也有提到,我寫第二篇文章的時候,我一開始取的檔名是 var.mxml 內文如下

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="
http://www.adobe.com/2006/mxml" >
<mx:Script>
<![CDATA[
]]>
</mx:Script>
</mx:Application>

基本上,上面的程式只是個空殼,將該檔案編譯時,會得到如下的錯誤訊息
Error: Invalid component name ‘var’: component name must be legal ActionScript class name.

我就納悶為什麼會錯呢?後來我看到 ActionScript 有類似 Java 的規範,檔案名稱必須與(public)類別名稱相同,所以我猜測 *.mxml 應該也遵循相同的規範,於是我嘗試將檔名再分別改為 function.mxml 和 class.mxml 後進行編譯,果然得到相同的錯誤訊息,所以,我們可以得到一個結論,*.mxml 和 *.as 的檔名不能是 ActionScript 中的保留字,否則會得到類似上述的錯誤訊息

第二個遇到的問題是程式的執行流程,我原以為 ActionScript 實作 ECMAScipt 所以執行的模式應該類似 HTML 中的 Javascript,於是我寫了下面的程式碼:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="
http://www.adobe.com/2006/mxml" >
<mx:Script>
<![CDATA[
    var i:int = 99;
    trace( i );
]]>
</mx:Script>
</mx:Application>

我原本預期他會輸出 99,可是在編譯階段就得到下面的錯誤訊息:

Error: Access of undefined property i.

trace( i );

真是奇怪的訊息,我明明有宣告變數 i,也給了型別和初始化,可是編譯器卻告訴我 undefined,這個問題困擾了我好久,最後我挖出 Flex 範例來研究,發現這些範例都在 mx:Application 中使用了 initialize 和 creationComplete 事件,而沒有直接在 mx:Script 區段中直接呼叫函數或進行運算,於是我想可能他有一定的執行流程,而非 HTML 中的 Javascript 寫到哪執行到哪,於是寫了下面的程式簡單的測試一下目前已知的這兩個事件執行順序:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    initialize="onInitialize()"
    creationComplete="onCreationComplete()"
>
<mx:Script>
<![CDATA[ 
function onInitialize():void{
    trace("initialize");
}

function onCreationComplete():void{
    trace("creationComplete");
}

trace("script section");
]]>
</mx:Script>
</mx:Application>

執行結果:
script section
initialize
creationComplete

由上面的結果和我的推論(未來瞭解更多時可能會修正),得到一些結論是,如果只是全域變數的宣告(可讀但不可寫),直接放在 <mx:Script> 但不屬於任何函數即可,如果是要對這些全域變數進行初始化,我想比較適合放在 initialize 事件,這個事件應該是應用程式在進行初始化的時候會被喚起,所以如果屬於 Applicatin 層級的初始化,可以將他放在這個事件中,creationComplete 事件則是 Application 已經建立完成後會被喚起,所以,應用程式實際的操作應該都是在這邊進行操作,我個人覺得這個事件有點類似 C/C++ 的 main() 函數,也就是程式的進入點,所以,我這篇文章就是改用這個框架寫的,如果這樣的說法有誤,煩請指正。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="main()"
>
<mx:Script>
<![CDATA[
    var i:int = 99;
    function main():void{
        trace(++i);
        trace("main");
    }
]]>
</mx:Script>
</mx:Application>

第三個問題是第一篇筆記中提到 mm.cfg 的 trace 設定,我發現 TraceOutPutFileName 設定的目錄如果不存在,則 trace 的輸出就不會產生檔案。

好了… 回歸本篇筆記的主題-變數(variable)

變數在每一種語言中都會有,變數主要是用來儲存程式中需要使用的值,在 ActionScript 中使用 var 敘述來宣告一個變數,如下:

var i;

如果你熟悉 Javascript ,你對於上面的寫法一定不會陌生,但是在 Javascipt 中對於 var 敘述並有沒強制要求,可是 ActionScript 如果你沒有使用 var 敘述,而直接 

i;

會得到 Error: Access of undefined property i 編譯錯誤訊息。

另外,Javascript 中並沒有宣告特定的資料型態,可是在 ActionScript 宣告變數時可以指定資料型態,如下將 i 宣告為 int

var i:int;

宣告的時候也可以直接進行初始化,如:

var i:int = 99;

var i:int;
i = 99;

上面的初始化方式不只能用於基礎型別,也可以用於陣列或自訂型別

var a:Array = ["Arick", "cwc", "mavis"];
var my:MyClass = new MyClass();

假如你有多個變數需要宣告,你可以使用逗號(,)將每一個變數宣告進行分隔串在同一行。下面是將三個變數宣告在同一行的範例:

var a:int, b:int, c:int;

同樣的你也可以在宣告多個變數的同時指定其值。如下面的範例分別指定a,b,c 三個變數值:

var a:int = 10, b:int = 20, c:int = 30;

變數的 Scope 表示的程式碼可以存取該變數的領域,一個全域(global)變數可以在你的程式碼的任何地方進行存取。區域(local)變數則只能在你的程式碼所定義的區域內進行存取。在ActionScript3.0中,變數總是被宣告在 function 或 class 區域中。一個全域變數表示該變數被定義在 class 或 function 以外的區域。假如你宣告一個和全域變相同名稱的區域變數,在區域變數的作用域中將會存取到區域變數而非全域變數。而全域變數仍然存在於函數定義域以外的區域(和大部分的語言一樣)。以下面的範例來簡單的說明這個概念:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="main();"
>
<mx:Script>
<![CDATA[
    var i:int = 99;
    function main():void{
        localValue(); 
        globalValue();
    }

    function localValue():void{
        var i:int = 100;
        trace("[main()] => " + i );

    }

    function globalValue():void{
        trace("[globalValue()] => " + i );
    }
]]>
</mx:Script>
</mx:Application>

執行結果:

ActionScript 變數不同於 C++ 和 Java,他並沒有類似的區塊等級作用域(block-level scope)。所謂的區塊等級作用域就是用{ 和 }包起來的任意敘述區域。在某些程式語言(如:c++和Java)在區塊內宣告的變數對於區塊以外來說是無法存取的。但是 ActionScript 並沒有這個限制。假如你宣告一個變數在區塊中,這個變數不僅在區塊以外仍然有效,在函數內也仍然有效。由於缺少 block-level scope 的實作,所你只要你在函數結束以前宣告變數,你就可以在宣告變數之前存取該變數。這是因為"hoisting"技術所造成的,也就說編譯器會將全部的變數宣告移到函數的頂端。如下範例

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="main();"
>

<mx:Script>
<![CDATA[
    function main():void{
        trace("hoist()");
        hoist();

        trace("nhoist2()");
        hoist2();
    }

    function hoist():void{
        trace("TEST #1");
        trace(‘[hoist()] a = ‘ + a); // 0
        if (a == 1){
            // don’t run here
        }else{
            a = 2;
            trace(‘[hoist()] a = ‘ + a); // 2
        }

        // block-level scope
        {
            var a:int = 1;
        }
        trace(‘[hoist()] a = ‘ + a); //1
        trace("TEST #2");
        for(var iter:int = 0; iter<9; ++iter){
            if (iter == 5){
                var find:int = iter;
            }
        }
        trace(find);
    }

    function hoist2():void{
        var a:int;
        var iter:int;
        var find:int;

        trace("TEST #1");
        trace(‘[hoist()] a = ‘ + a); // 0
        if (a == 1){
            // don’t run here
        }else{
            a = 2;
            trace(‘[hoist()] a = ‘ + a); // 2
        }

        // block-level scope
        {
            a = 1;
        }
        trace(‘[hoist()] a = ‘ + a); //1
        trace("TEST #2");
        for(iter = 0; iter<9; ++iter){
            if (iter == 5){
                find = iter;
            }
        }
        trace(find);
    }

]]>
</mx:Script>
</mx:Application>

執行結果:

上述的 hoist2() 基本上就是 hoist() 經過 compiler 使用 hoisting 技術處理後的結果,也就是將相關變數的宣告提到函數的頂端,所以兩個函數的執行結果是一樣的。但是透過這個對照,我們可以比較清楚為什麼 hoist() 中的 a 為什麼還沒有宣告的情況下卻可以使用。

預設值表示數指定值以前變數本身內含的值。當你第一次使用變數的時候你可以進行初始化。假如你宣告一個變數,但是卻沒有指定值,這個變數就屬於未初始化(uninitialized)。這個未初始化變數的預設值與資料型別相關。下面是資料型態的預設值:

Boolean => false
int => 0
uint => 0

Number => NaN
Object => null
String => null
全部的類別包含自訂類別 => null

沒有指定型別或指定 * => undefined

對於 Number 型態變數的預設值為 NaN(Not a Number),這是 IEEE-754 標準針對非數值所定義的特定值。假如你宣告一個變數,但是卻沒有指定資料型別,預設會被指定為 * ,也就是說該變數不屬於任何一種型別。假如對於這種型別的變數沒有進行初始化,預設值會被指定為 undefined

對於 Boolean, Number, int 和 uint 以外的資料型別,只要屬於未初始化的變數其值皆為 null。這個規則也可以套用在由 Flash Player API 所定義的全部類別和使用者自訂的類別。

null 這個值對於 Boolean, Number, int 和 uint 型別變數來說是不合法的。假如你試圖將 null 指定給這些型別變數,將會使這個值轉換為該型別的預設值。對於 Object 型別變數,你可以指定 null 值。假如你試圖將 undefined 指定給 Object 型別變數,該值將會被轉換為 null。

對於 Number 型別變數,有一個特別的 isNaN( ) 函數,這個函數會判斷變數是否為一個數值,假如是則回傳 true,否則回傳 false。

[note2.mxml]
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="main();"
>

<mx:Script>
<![CDATA[

   function main():void{
      defaultValue();
   }

   function defaultValue():void{
      var i:int;
      var ui:uint;
      var n:Number;
      var s:String;
      var o:Object;
      var a:Array;
      var b:Boolean;
      var m:MyClass;

      trace(" Default Value of Data Type :");
      trace("int = " + i); // 0
      trace("uint = " + ui); // 0
      trace("Number = " + n); // NaN
      trace("String = " + s); // null
      trace("Object = " + o); // null
      trace("Array = " + a); // null
      trace("MyClass = " + m ); // null
      trace("Boolean = " + b); // false 
   }

]]>
</mx:Script>
</mx:Application>

[MyClass.as]
package{
    public class MyClass{
    }
}

 這個範例對於向我這種生手來說,稍微有點複雜(雖然我已經盡量簡化),這個範例使用了兩個檔案,一個是主程式 note2.mxml,另一個是型別定義 MyClass.as,基本上 note2.mxml 沒什麼特別好說的,倒是 MyClass.as 有一些東西需要說明,首先檔案名稱如同本篇的開頭所述必須與類別名稱一樣,因此編譯器才能編譯 note2.mxml 時搜尋到 MyClass.as,原則上如果要管理一個 Flex 應用程式專案, package 後面應該接一個名稱,不過為求簡化且還未討論到 package,所以目前就先知道有這麼一個東西即可。

總結一下,ActionScript 的變數和其他語言使用上有些微的不同,雖然與 Javascript 一樣實作 ECMAScript 標準,可是 ActionScript 的語法更為嚴謹,如需要明確的進行變數宣告與資料型態的指定,對於未指定的資料型態又賦予了 * 型別。這些差異都需要記得,免得寫程式的時候出現奇怪的錯誤。不過說句老實話,我不太喜歡 ActionScript 的語法,感覺他混合了 C++/Java/Javascript 的種種特性,說嚴謹比不上 C++ 嚴謹,說動態又不像 Javascipt 般動態,總覺得寫起來挺礙手礙腳的。

Read Full Post »

Older Posts »