2009年3月31日 星期二

拖拽影片 - 使用 startDrag

使用時機:一次拖拽單一DisplayObject

首先監聽要移動的Clip的MouseDown事件。
當Clip的MouseDown事件被觸發後,監聽Stage的MouseUp。
當Stage的MouseMove事件被觸發後,叫用Clip的StartDrag方法。
當Stage的MouseUp事件被觸發後,移除Stage的MouseUp與叫用Clip的StopDrag方法。

import flash.display.Sprite;
import flash.events.MouseEvent;

/**
* Mouse Move Drag Sample - use startDrag/stopDrag method
*/

public class MouseMoveDrag1 extends Sprite
{
private var ball:Ball;

public function MouseMoveDrag1()
{
init();
}

private function init():void
{
ball = new Ball;
ball.x = 100;
ball.y = 100;
addChild(ball);
ball.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

private function onMouseDown(evt:MouseEvent):void
{
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
ball.startDrag(true);
}

private function onMouseUp(evt:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
ball.stopDrag();
}
}



StartDrag的語法:
startDrag(鎖定中心:boolean,移動邊界:Rectangle);
鎖定中心為是否將拖拽位置的起始點設成物件的中心。
移動邊界為是否設定物件的移動範圍。

如:
var rect:Rectangle = new Rectangle(50, 50, 300, 300);
ball.StartDrag(false, rect);



參考書目:Keith Peters.《Function Actionscript 3.0 Animation》.Friends of ED

拖拽影片 - 使用 mouseMove

使用時機:一次移動多個DisplayObject

首先監聽要移動的Clip的MouseDown事件。
當Clip的MouseDown事件被觸發後,監聽Stage的MouseUp與MouseMove事件。
當Stage的MouseMove事件被觸發後,將滑鼠的X, Y座標設給Clip的X, Y座標。
當Stage的MouseUp事件被觸發後,移除Stage的MouseUp與MouseMove監聽事件。

import flash.display.Sprite;
import flash.events.MouseEvent;

/**
* Mouse Move Drag Sample - use mouseMove event
*/

public class MouseMoveDrag extends Sprite
{
private var ball:Ball;

public function MouseMoveDrag()
{
init();
}

private function init():void
{
ball = new Ball;
ball.x = 100;
ball.y = 100;
addChild(ball);
ball.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}

private function onMouseDown(evt:MouseEvent):void
{
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}

private function onMouseUp(evt:MouseEvent):void
{
stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}

private function onMouseMove(evt:MouseEvent):void
{
// reset the x and y point
ball.x = mouseX;
ball.y = mouseY;
}
}



參考書目:Keith Peters.《Function Actionscript 3.0 Animation》.Friends of ED

編寫Window下的Event Log (下)

三.用VS或Platform SDK的編譯器 Compile 此 resource file。
rc -r resourceFileName.rc
編譯完後會產生一個 .res 檔案。

四.連結resource file 至 DLL。
link -dll -noentry -out:%SYSTEMROOT%\System32\dllFileName.dll resourceFileName.rc
編譯完後會在System32目錄下產生一個 .dll 檔案。

五.把這個event source名稱加到registry中。

#include <windows.h>
#include <iostream>
#include <string>
#include "stdafx.h"

using namespace std;
/**
* This AP is used for add a event source to the Windows System Registry
*/

int main() {
// event log file name in the registry
const char *logName = "Application";
// custom event source name
const char *sourceName = "CustomEvent";
// dll location that contains the custom event message (descriptions)
const char *dllName = "C:\\WINDOWS\\SYSTEM32\\LogMsg.dll";
// number of categories for the event source
DWORD dwCategoryNum = 1;

HKEY hk;
DWORD dwData, dwDisp;

// registry path
string registryPath = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\";
registryPath.append(logName);
registryPath.append("\\");
registryPath.append(sourceName);

// create registry key
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, registryPath.c_str(), 0, NULL,
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hk, &dwDisp))
{
cout << "Could Not Create The Registry key." << endl;
return 0;
}

/* The final registried message file will locate as follows:
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
Services
EventLog
Application
CustomEvent
*/


// set the name of the message file.
if(RegSetValueEx(hk, // subkey handle
"EventMessageFile", // value name
0, // must be zero
REG_EXPAND_SZ, // value type
(LPBYTE)dllName, // pointer to value data
(DWORD)(lstrlen(dllName) + 1) * sizeof(TCHAR) // data size
))
{
cout << "Could Not Set The Event Message File." << endl;
RegCloseKey(hk);
return 0;
}

// set the supported event types.
dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE |
EVENTLOG_INFORMATION_TYPE;

if(RegSetValueEx(hk, // subkey handle
"TypesSupported", // value name
0, // must be zero
REG_DWORD, // value type
(LPBYTE)&dwData, // pointer to value data
sizeof(DWORD) // length of value data
))
{
cout << "Could Not Set The Supported Types." << endl;
RegCloseKey(hk);
return 0;
}

// set the category message file and number of categories.
if(RegSetValueEx(hk, // subkey handle
"CategoryMessageFile", // valuse name
0, // must be zero
REG_EXPAND_SZ, // value type
(LPBYTE)dllName, // pointer to value data
(DWORD)(lstrlen(dllName) + 1) * sizeof(TCHAR) // data size
))
{
cout << "Could Not Set The Category Count." << endl;
RegCloseKey(hk);
return 0;
}

RegCloseKey(hk);
return 1;
}




六.使用ReportEvent function來新增一筆log訊息
在將event source新增至registry之後,就可以用ReportEvent這個function去新增一筆log訊息。
這裡要將步驟二產生出來的.h include進來。
#include <windows.h>
#include <iostream>
#include <string>

#include "stdafx.h"
#include "LogMsg.h"

using namespace std;


/** the event type */
WORD eventType;
/** the event source name */
const char *msgSourceName = "CustomEvent";
/** The event identifier */
DWORD eventID;
/** the count of insert strings. */
const WORD cInserts = 1;
/** the registry handle */
HANDLE h;


bool writeEvent(const WORD &eType, const DWORD &eID, const string &msg){
LPCSTR message = msg.c_str();
bool isSuccess = false;
if(ReportEvent(h, // Event log handle
eType, // Event type
0, // Event category
eID, // Event identifier
NULL, // No user security identifier
cInserts, // Number of sub-stitution strings
0, // No data
&message, // Pointer to the message string
NULL)) // No data.
{
isSuccess = true;
}

if(!isSuccess)
{
cout << "Cannot report the event." << endl;
return false;
}
else
{
return true;
}
}

void main(){

// Get a handle to the event log.
h = RegisterEventSource(NULL, // user local computer
msgSourceName // Event source name
);
if(h == NULL){
cout << "Cannot Register The Event Source." << endl;
return;
}

// Create an error event log
eventType = EVENTLOG_ERROR_TYPE;
eventID = MSG_ERROR;
bool isSuccess = writeEvent(eventType, eventID, msg);
if(isSuccess){
cout << "Succes to create an error event" << endl;
}

if(h != NULL)
DeregisterEventSource(h);
}

2009年3月30日 星期一

編寫Window下的Event Log (上)

Event Log 架構


自定Event並寫入Event Log中的步驟:
一.建立Message Text File (.mc)。
Message file 中定義了event的嚴重性(severity)、產生這個信息的組件名字(facility)及語言等。主要分成兩個部分:Header section 與 Message Definitions。

1.Header Section
用來定義Message Definitions會用到的息訊名稱和語言等關鍵詞。

Statement syntaxDescription
MessageIdTypedef = type
訊息代碼的類型定義。
如 #define name ((type)0xnnnnnnnn)。這個類型必而要夠大才行,可以用DWORD。
SeverityNames=(name=number[:name])
訊息的嚴重級別。Default定義為
SeverityNames={
&nbsp;Success=0x0
&nbsp;Informational=0x1
&nbsp;Warning=0x2
&nbsp;Error=0x3
}
Facility=(name=number[:name])
訊息組件的名稱定義。Default定義為
FacilityNames={
&nbsp;System=0x0FF
&nbsp;Application=0xFFF
}
LanguageNames=(name=number:filename)
語言名稱定義。Ex:
LanguageNames={English=0x409:MSG00409}


2.Message Definitions
每個Message Text File 可以包含一個或多個 Message definitions。

Statement syntaxDescription
MessageID=[number|+number]分配給我個信息的16-bit值
Serverity=name
訊息的嚴重級別。
第一個Message Definition的default值:
Severity=Success
Facility=name
產生此訊息的組件名稱。
第一個Message Definition的default值:
Facility=Application
SymbolicName=name
c/c++ .h 文件中訊息的定義名稱。
#define name ((type)0xnnnnnnnn)
Language=name
使用的語言名稱。
第一個Message Definition的default值:
Language=English
message text此訊息的文字
.結束字符


在訊息編譯器中,任何空格和換行都會被自動忽略。

%n[!format_specifier!]

轉字符定義
%b空格
%t內縮
%r%n換行
%1~%99插入字串符


;// header section
MessageIdTypedef=DWORD

SeverityNames=(
Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
Warning=0x2:STATUS_SEVERITY_WARNING
Error=0x3:STATUS_SEVERITY_ERROR
)

FacilityNames=(
System=0x0:FACILITY_SYSTEM
Runtime=0x2:FACILITY_RUNTIME
Stubs=0x3:FACILITY_STUBS
Io=0x4:FACILITY_IO_ERROR_CODE
)

LanguageNames=(English=0x409:MSG00409)


MessageId=0x2
Severity=Error
Facility=Runtime
SymbolicName=MSG_ERROR
Language=English
Error:%b%1
.
MessageId=0x3
Severity=Warning
Facility=Runtime
SymbolicName=MSG_WARNING
Language=English
Warning:%b%1
.
MessageId=0x4
Severity=Informational
Facility=Runtime
SymbolicName=MSG_INFORMATION
Language=English
Information:%b%1
.


如果要輸入註解可以用:
;// This is a single-line comment.

;/* This is a block comment.
; It spans multiple lines.
;*/


二.用VS或Platform SDK的編譯器 Compile 此 message file。
mc -U messageFileName.mc
編譯完後會產生一個 .h , 一個 .rc 和 .bin 檔案。

參數定義
-c在所有的訊息代碼中設罝Customer位
-d在.h文件中使用Facility和嚴重級別代碼的十進位定義
-o產生OLE2 .h文件
-s插入符號作為每個訊息的第一行
-v產生詳細的輸出
-h pathname產生.h的路徑
-e extension生成.h文件的1~3擴展名
-r pathname生成RC和Bin文件路徑
-x pathname生成的調試文件路徑
-u定義輸入文件為Unicode文件
-U定義訊息內容為二進位,而輸出的二進位文件為Unicode
filename編譯的Message Text File名稱


產生的.h Sample片段

//
// Define the facility codes
//
#define FACILITY_SYSTEM 0x0
#define FACILITY_STUBS 0x3
#define FACILITY_RUNTIME 0x2
#define FACILITY_IO_ERROR_CODE 0x4
//
// Define the severity codes
//
#define STATUS_SEVERITY_WARNING 0x2
#define STATUS_SEVERITY_INFORMATIONAL 0x1
#define STATUS_SEVERITY_ERROR 0x3
//
// MessageId: MSG_ERROR
//
// MessageText:
//
// Error:%b%1
//
#define MSG_ERROR ((DWORD)0xC0050002L)

//
// MessageId: MSG_WARNING
//
// MessageText:
//
// Warning:%b%1
//
#define MSG_WARNING ((DWORD)0x80050003L)

//
// MessageId: MSG_INFORMATION
//
// MessageText:
//
// Information:%b%1
//
#define MSG_INFORMATION ((DWORD)0x40050004L)

2009年3月25日 星期三

IE 與 FIREFOX 的相容性問題

以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox

1. document.form.item 問題
(1)現有問題:
現有程式碼中存在許多 document.formName.item("itemName") 這樣的語法,不能在 MF 下執行
(2)解決方法:
改用 document.formName.elements["elementName"]
(3)其它
參見 2

2. 集合類項目問題
(1)現有問題:
現有程式碼中許多集合類項目取用時使用 (),IE 能接受,MF 不能。
(2)解決方法:
改用 [] 作為下標運算。如:document.forms("formName") 改為 document.forms["formName"]。
又如:document.getElementsByName("inputName")(1) 改為 document.getElementsByName("inputName")[1]
(3)其它

3. window.event
(1)現有問題:
使用 window.event 無法在 MF 上執行
(2)解決方法:
MF 的 event 只能在事件發生的現場使用,此問題暫無法解決。可以這樣變通:
原程式碼(可在IE中執行):
<input type="button" name="someButton" value="提交" onclick="(script removed)gotoSubmit()"/>
...
<script language="javascript">
function gotoSubmit() {
...
alert(window.event); // use window.event
...
}
</script>

新程式碼(可在IE和MF中執行):
<input type="button" name="someButton" value="提交" onclick="(script removed)gotoSubmit(event)"/>
...
<script language="javascript">
function gotoSubmit(evt) {
evt = evt ? evt : (window.event ? window.event : null);
...
alert(evt); // use evt
...
}
</script>
此外,如果新程式碼中第一行不改,與舊程式碼一樣的話(即 gotoSubmit 調用沒有給參數),則仍然只能在IE中執行,但不會出錯。所以,這種方案 tpl 部分仍與舊程式碼兼容。

4. HTML 項目的 id 作為項目名稱的問題
(1)現有問題
在 IE 中,HTML 項目的 ID 可以作為 document 的下屬項目變數名稱直接使用。在 MF 中不能。
(2)解決方法
用 getElementById("idName") 代替 idName 作為項目變數使用。

5. 用idName字串取得項目的問題
(1)現有問題
在IE中,利用 eval(idName) 可以取得 id 為 idName 的 HTML 項目,在MF 中不能。
(2)解決方法
用 getElementById(idName) 代替 eval(idName)。

6. 變數名稱與某 HTML 項目 id 相同的問題
(1)現有問題
在 MF 中,因為項目 id 不作為 HTML 項目的名稱,所以可以使用與 HTML 項目 id 相同的變數名稱,IE 中不能。
(2)解決方法
在宣告變數時,一律加上 var ,以避免歧義,這樣在 IE 中亦可正常執行。
此外,最好不要取與 HTML 項目 id 相同的變數名稱,以減少錯誤。
(3)其它
參見 問題4

7. event.x 與 event.y 問題
(1)現有問題
在IE 中,event 項目有 x, y 屬性,MF中沒有。
(2)解決方法
在MF中,與event.x 等效的是 event.pageX。但event.pageX IE中沒有。
故採用 event.clientX 代替 event.x。在IE 中也有這個變數。
event.clientX 與 event.pageX 有微妙的差別(當整個頁面有滾動條的時候),不過大多數時候是等效的。

如果要完全一樣,可以稍麻煩些:
mX = event.x ? event.x : event.pageX;
然後用 mX 代替 event.x
(3)其它
event.layerX 在 IE 與 MF 中都有,具體意義有無差別尚未試驗。


8. 關於frame
(1)現有問題
在 IE中 可以用window.testFrame取得該frame,mf中不行
(2)解決方法
在frame的使用方面mf和ie的最主要的區別是:
如果在frame標籤中書寫了以下屬性:
<frame src="xx.htm" id="frameId" name="frameName" />
那麼ie可以通過id或者name訪問這個frame對應的window項目
而mf只可以通過name來訪問這個frame對應的window項目
例如如果上述frame標籤寫在最上層的window裡面的htm裡面,那麼可以這樣訪問
ie: window.top.frameId或者window.top.frameName來訪問這個window項目
mf: 只能這樣window.top.frameName來訪問這個window項目

另外,在mf和ie中都可以使用window.top.document.getElementById("frameId")來訪問frame標籤
並且可以通過window.top.document.getElementById("testFrame").src = 'xx.htm'來切換frame的內容
也都可以通過window.top.frameName.location = 'xx.htm'來切換frame的內容
關於frame和window的描述可以參見bbs的『window與frame』文章
以及/test/js/test_frame/目錄下面的測試
----adun 2004.12.09修改

9. 在mf中,自己定義的屬性必須getAttribute()取得
10.在mf中沒有 parentElement parement.children 而用
parentNode parentNode.childNodes
childNodes的下標的含義在IE和MF中不同,MF使用DOM規範,childNodes中會插入空白文本節點。
一般可以通過node.getElementsByTagName()來迴避這個問題。
當html中節點缺失時,IE和MF對parentNode的解釋不同,例如
<form>
<table>
<input/>
</table>
</form>
MF中input.parentNode的值為form, 而IE中input.parentNode的值為空節點

MF中節點沒有removeNode方法,必須使用如下方法 node.parentNode.removeChild(node)

11.const 問題
(1)現有問題:
在 IE 中不能使用 const 關鍵字。如 const constVar = 32; 在IE中這是語法錯誤。
(2)解決方法:
不使用 const ,以 var 代替。

12. body 項目
MF的body在body標籤沒有被瀏覽器完全讀入之前就存在,而IE則必須在body完全被讀入之後才存在

13. url encoding
在js中如果書寫url就直接寫&不要寫&例如var url = 'xx.jsp?objectName=xx&objectEvent=xxx';
frm.action = url那麼很有可能url不會被正常顯示以至於參數沒有正確的傳到服務器
一般會服務器報錯參數沒有找到
當然如果是在tpl中例外,因為tpl中符合xml規範,要求&書寫為&
一般MF無法識別js中的&


14. nodeName 和 tagName 問題
(1)現有問題:
在MF中,所有節點均有 nodeName 值,但 textNode 沒有 tagName 值。在 IE 中,nodeName 的使用好像
有問題(具體情況沒有測試,但我的IE已經死了好幾次)。
(2)解決方法:
使用 tagName,但應檢測其是否為空。

15. 元素屬性
IE下 input.type屬性為只讀,但是MF下可以修改


16. document.getElementsByName() 和 document.all[name] 的問題
(1)現有問題:
在 IE 中,getElementsByName()、document.all[name] 均不能用來取得 div 元素(是否還有其它不能取的元素還不知道)。



參考自:http://twpug.net/modules/smartsection/item.php?itemid=35

2009年3月24日 星期二

Content Type 大全

".*"="application/octet-stream"
".001"="application/x-001"
".301"="application/x-301"
".323"="text/h323"
".906"="application/x-906"
".907"="drawing/907"
".a11"="application/x-a11"
".acp"="audio/x-mei-aac"
".ai"="application/postscript"
".aif"="audio/aiff"
".aifc"="audio/aiff"
".aiff"="audio/aiff"
".anv"="application/x-anv"
".asa"="text/asa"
".asf"="video/x-ms-asf"
".asp"="text/asp"
".asx"="video/x-ms-asf"
".au"="audio/basic"
".avi"="video/avi"
".awf"="application/vnd.adobe.workflow"
".biz"="text/xml"
".bmp"="application/x-bmp"
".bot"="application/x-bot"
".c4t"="application/x-c4t"
".c90"="application/x-c90"
".cal"="application/x-cals"
".cat"="application/vnd.ms-pki.seccat"
".cdf"="application/x-netcdf"
".cdr"="application/x-cdr"
".cel"="application/x-cel"
".cer"="application/x-x509-ca-cert"
".cg4"="application/x-g4"
".cgm"="application/x-cgm"
".cit"="application/x-cit"
".class"="java/*"
".cml"="text/xml"
".cmp"="application/x-cmp"
".cmx"="application/x-cmx"
".cot"="application/x-cot"
".crl"="application/pkix-crl"
".crt"="application/x-x509-ca-cert"
".csi"="application/x-csi"
".css"="text/css"
".cut"="application/x-cut"
".dbf"="application/x-dbf"
".dbm"="application/x-dbm"
".dbx"="application/x-dbx"
".dcd"="text/xml"
".dcx"="application/x-dcx"
".der"="application/x-x509-ca-cert"
".dgn"="application/x-dgn"
".dib"="application/x-dib"
".dll"="application/x-msdownload"
".doc"="application/msword"
".dot"="application/msword"
".drw"="application/x-drw"
".dtd"="text/xml"
".dwf"="Model/vnd.dwf"
".dwf"="application/x-dwf"
".dwg"="application/x-dwg"
".dxb"="application/x-dxb"
".dxf"="application/x-dxf"
".edn"="application/vnd.adobe.edn"
".emf"="application/x-emf"
".eml"="message/rfc822"
".ent"="text/xml"
".epi"="application/x-epi"
".eps"="application/x-ps"
".eps"="application/postscript"
".etd"="application/x-ebx"
".exe"="application/x-msdownload"
".fax"="image/fax"
".fdf"="application/vnd.fdf"
".fif"="application/fractals"
".fo"="text/xml"
".frm"="application/x-frm"
".g4"="application/x-g4"
".gbr"="application/x-gbr"
".gcd"="application/x-gcd"
".gif"="image/gif"
".gl2"="application/x-gl2"
".gp4"="application/x-gp4"
".hgl"="application/x-hgl"
".hmr"="application/x-hmr"
".hpg"="application/x-hpgl"
".hpl"="application/x-hpl"
".hqx"="application/mac-binhex40"
".hrf"="application/x-hrf"
".hta"="application/hta"
".htc"="text/x-component"
".htm"="text/html"
".html"="text/html"
".htt"="text/webviewhtml"
".htx"="text/html"
".icb"="application/x-icb"
".ico"="image/x-icon"
".ico"="application/x-ico"
".iff"="application/x-iff"
".ig4"="application/x-g4"
".igs"="application/x-igs"
".iii"="application/x-iphone"
".img"="application/x-img"
".ins"="application/x-internet-signup"
".isp"="application/x-internet-signup"
".IVF"="video/x-ivf"
".java"="java/*"
".jfif"="image/jpeg"
".jpe"="image/jpeg"
".jpe"="application/x-jpe"
".jpeg"="image/jpeg"
".jpg"="image/jpeg"
".jpg"="application/x-jpg"
".js"="application/x-javascript"
".jsp"="text/html"
".la1"="audio/x-liquid-file"
".lar"="application/x-laplayer-reg"
".latex"="application/x-latex"
".lavs"="audio/x-liquid-secure"
".lbm"="application/x-lbm"
".lmsff"="audio/x-la-lms"
".ls"="application/x-javascript"
".ltr"="application/x-ltr"
".m1v"="video/x-mpeg"
".m2v"="video/x-mpeg"
".m3u"="audio/mpegurl"
".m4e"="video/mpeg4"
".mac"="application/x-mac"
".man"="application/x-troff-man"
".math"="text/xml"
".mdb"="application/msaccess"
".mdb"="application/x-mdb"
".mfp"="application/x-shockwave-flash"
".mht"="message/rfc822"
".mhtml"="message/rfc822"
".mi"="application/x-mi"
".mid"="audio/mid"
".midi"="audio/mid"
".mil"="application/x-mil"
".mml"="text/xml"
".mnd"="audio/x-musicnet-download"
".mns"="audio/x-musicnet-stream"
".mocha"="application/x-javascript"
".movie"="video/x-sgi-movie"
".mp1"="audio/mp1"
".mp2"="audio/mp2"
".mp2v"="video/mpeg"
".mp3"="audio/mp3"
".mp4"="video/mpeg4"
".mpa"="video/x-mpg"
".mpd"="application/vnd.ms-project"
".mpe"="video/x-mpeg"
".mpeg"="video/mpg"
".mpg"="video/mpg"
".mpga"="audio/rn-mpeg"
".mpp"="application/vnd.ms-project"
".mps"="video/x-mpeg"
".mpt"="application/vnd.ms-project"
".mpv"="video/mpg"
".mpv2"="video/mpeg"
".mpw"="application/vnd.ms-project"
".mpx"="application/vnd.ms-project"
".mtx"="text/xml"
".mxp"="application/x-mmxp"
".net"="image/pnetvue"
".nrf"="application/x-nrf"
".nws"="message/rfc822"
".odc"="text/x-ms-odc"
".out"="application/x-out"
".p10"="application/pkcs10"
".p12"="application/x-pkcs12"
".p7b"="application/x-pkcs7-certificates"
".p7c"="application/pkcs7-mime"
".p7m"="application/pkcs7-mime"
".p7r"="application/x-pkcs7-certreqresp"
".p7s"="application/pkcs7-signature"
".pc5"="application/x-pc5"
".pci"="application/x-pci"
".pcl"="application/x-pcl"
".pcx"="application/x-pcx"
".pdf"="application/pdf"
".pdf"="application/pdf"
".pdx"="application/vnd.adobe.pdx"
".pfx"="application/x-pkcs12"
".pgl"="application/x-pgl"
".pic"="application/x-pic"
".pko"="application/vnd.ms-pki.pko"
".pl"="application/x-perl"
".plg"="text/html"
".pls"="audio/scpls"
".plt"="application/x-plt"
".png"="image/png"
".png"="application/x-png"
".pot"="application/vnd.ms-powerpoint"
".ppa"="application/vnd.ms-powerpoint"
".ppm"="application/x-ppm"
".pps"="application/vnd.ms-powerpoint"
".ppt"="application/vnd.ms-powerpoint"
".ppt"="application/x-ppt"
".pr"="application/x-pr"
".prf"="application/pics-rules"
".prn"="application/x-prn"
".prt"="application/x-prt"
".ps"="application/x-ps"
".ps"="application/postscript"
".ptn"="application/x-ptn"
".pwz"="application/vnd.ms-powerpoint"
".r3t"="text/vnd.rn-realtext3d"
".ra"="audio/vnd.rn-realaudio"
".ram"="audio/x-pn-realaudio"
".ras"="application/x-ras"
".rat"="application/rat-file"
".rdf"="text/xml"
".rec"="application/vnd.rn-recording"
".red"="application/x-red"
".rgb"="application/x-rgb"
".rjs"="application/vnd.rn-realsystem-rjs"
".rjt"="application/vnd.rn-realsystem-rjt"
".rlc"="application/x-rlc"
".rle"="application/x-rle"
".rm"="application/vnd.rn-realmedia"
".rmf"="application/vnd.adobe.rmf"
".rmi"="audio/mid"
".rmj"="application/vnd.rn-realsystem-rmj"
".rmm"="audio/x-pn-realaudio"
".rmp"="application/vnd.rn-rn_music_package"
".rms"="application/vnd.rn-realmedia-secure"
".rmvb"="application/vnd.rn-realmedia-vbr"
".rmx"="application/vnd.rn-realsystem-rmx"
".rnx"="application/vnd.rn-realplayer"
".rp"="image/vnd.rn-realpix"
".rpm"="audio/x-pn-realaudio-plugin"
".rsml"="application/vnd.rn-rsml"
".rt"="text/vnd.rn-realtext"
".rtf"="application/msword"
".rtf"="application/x-rtf"
".rv"="video/vnd.rn-realvideo"
".sam"="application/x-sam"
".sat"="application/x-sat"
".sdp"="application/sdp"
".sdw"="application/x-sdw"
".sit"="application/x-stuffit"
".slb"="application/x-slb"
".sld"="application/x-sld"
".slk"="drawing/x-slk"
".smi"="application/smil"
".smil"="application/smil"
".smk"="application/x-smk"
".snd"="audio/basic"
".sol"="text/plain"
".sor"="text/plain"
".spc"="application/x-pkcs7-certificates"
".spl"="application/futuresplash"
".spp"="text/xml"
".ssm"="application/streamingmedia"
".sst"="application/vnd.ms-pki.certstore"
".stl"="application/vnd.ms-pki.stl"
".stm"="text/html"
".sty"="application/x-sty"
".svg"="text/xml"
".swf"="application/x-shockwave-flash"
".tdf"="application/x-tdf"
".tg4"="application/x-tg4"
".tga"="application/x-tga"
".tif"="image/tiff"
".tif"="application/x-tif"
".tiff"="image/tiff"
".tld"="text/xml"
".top"="drawing/x-top"
".torrent"="application/x-bittorrent"
".tsd"="text/xml"
".txt"="text/plain"
".uin"="application/x-icq"
".uls"="text/iuls"
".vcf"="text/x-vcard"
".vda"="application/x-vda"
".vdx"="application/vnd.visio"
".vml"="text/xml"
".vpg"="application/x-vpeg005"
".vsd"="application/vnd.visio"
".vsd"="application/x-vsd"
".vss"="application/vnd.visio"
".vst"="application/vnd.visio"
".vst"="application/x-vst"
".vsw"="application/vnd.visio"
".vsx"="application/vnd.visio"
".vtx"="application/vnd.visio"
".vxml"="text/xml"
".wav"="audio/wav"
".wax"="audio/x-ms-wax"
".wb1"="application/x-wb1"
".wb2"="application/x-wb2"
".wb3"="application/x-wb3"
".wbmp"="image/vnd.wap.wbmp"
".wiz"="application/msword"
".wk3"="application/x-wk3"
".wk4"="application/x-wk4"
".wkq"="application/x-wkq"
".wks"="application/x-wks"
".wm"="video/x-ms-wm"
".wma"="audio/x-ms-wma"
".wmd"="application/x-ms-wmd"
".wmf"="application/x-wmf"
".wml"="text/vnd.wap.wml"
".wmv"="video/x-ms-wmv"
".wmx"="video/x-ms-wmx"
".wmz"="application/x-ms-wmz"
".wp6"="application/x-wp6"
".wpd"="application/x-wpd"
".wpg"="application/x-wpg"
".wpl"="application/vnd.ms-wpl"
".wq1"="application/x-wq1"
".wr1"="application/x-wr1"
".wri"="application/x-wri"
".wrk"="application/x-wrk"
".ws"="application/x-ws"
".ws2"="application/x-ws"
".wsc"="text/scriptlet"
".wsdl"="text/xml"
".wvx"="video/x-ms-wvx"
".xdp"="application/vnd.adobe.xdp"
".xdr"="text/xml"
".xfd"="application/vnd.adobe.xfd"
".xfdf"="application/vnd.adobe.xfdf"
".xhtml"="text/html"
".xls"="application/vnd.ms-excel"
".xls"="application/x-xls"
".xlw"="application/x-xlw"
".xml"="text/xml"
".xpl"="audio/scpls"
".xq"="text/xml"
".xql"="text/xml"
".xquery"="text/xml"
".xsd"="text/xml"
".xsl"="text/xml"
".xslt"="text/xml"
".xwd"="application/x-xwd"
".x_b"="application/x-x_b"
".x_t"="application/x-x_t"


參考自:http://blog.csdn.net/hqywork/archive/2007/11/22/1897633.aspx

動詞的形式與時態

現在式
表示現在的狀態
(I love chocolate ice cream.)
表示現在的反覆動作
(I always drink coffee at breakfast.)
表示一般的事實
(The earth goes around the sun.)
表示確定的預定或計畫
(Our flight leaves at 11:45.)

過去式
表示過去的狀態
(The store was full of young people.)
表示過去的反覆動作
(I usually rode my bicycle to school.)
表示過去做過一次的動作(We went to a concert.)

未來式
will表示未來
(My brother will be twenty next year.)
be going to 表示未來
(I'm going to buy a camera.)

現在進行式
表示現在進行中的動作
(She is playing the piano now.)
表示一定期間內反覆進行的動作
(These days, I am eating a lot of vegetables.)
表示未來的預定
(I'm leaving for Paris tomorrow.)

過去進行式
表示在過去某時間點進行中的動作
(I was watching TV around noon.)
表示過去某個期間內反覆進行的動作
(I was coughing all night long.)
表示從過去看未來的預定
(I thought you were coming home at six.)

未來進行式
表示認為在未來某時間點會進行的動作
(We will be playing tennis at this time tomorrow.)
表示未來某時間點預定要做的動作
(I will be meeting him at the airport next week.)


參考書目:石黑昭博.《朗文英文文法全集》. 朗文出版社

硬體與硬體代號

Linux中,每個硬體裝置都被當成一個檔案。每個裝置都有自己的代號,放在 dev 這個目錄下,如,硬碟的檔案名稱為/dev/hd[a-d]。常見的裝置袋號有:

裝置 代號
IDE硬體機 /dev/hd[a-d]
SCSI硬碟機 /dev/sd[a-d]
CDROM /dev/cdrom
軟碟機 /dev/fd[0-1]
印表機 /dev/lp[0-2]
滑鼠 /dev/mouse
磁帶機(不同的distribution中代號可能會不一樣) /dev/ht0(IDE) 或 /dev/st0(SCSI介面)
網路卡 /dev/ethn(n由0開始)

2009年3月23日 星期一

簡單入門 - Kernel 超簡介

Kernel - 一個作業系統的最底層,由其掌管整個硬體資源的工作狀態,簡單來說就是控制硬體的核心。

核心的基本功能可以是:

System call interface:一些服務與kernel 溝通之後,將硬體的資源進一步的利用。
Process control :系統程序控制中心,所以核心編的越小越好!
Memory management:控制整個系統的記憶體管理!
File system management:檔案系統的管理,如I/O,檔案格式的支援等等,如果核心不認識某個檔案系統,那麼將無法使用該檔案格式的檔案。
Device drivers:裝置的驅動程式,Kernel的主要工作之一。

重要公式 - 邊界與摩擦力

移除出界對像:
if(sprite.x - sprite.width / 2 > right ||
sprite.x + sprite.width / 2 > left ||
sprite.y - sprite.height / 2 > bottom ||
sprite.y + sprite.height / 2 < top)


重置出界對像:
if(sprite.x - sprite.width / 2 > right ||
sprite.x + sprite.width / 2 < left ||
sprite.y - sprite.height / 2 > bottom ||
sprite.y + sprite.height / 2 < top)
{
// 重置影片的位置和速度
}


屏幕環繞出界對像:
if(sprite.x - sprite.width / 2 > right)
{
sprite.x = left - sprite.width / 2;
}
else if (sprite.x + sprite.width / 2 < left)
{
sprite.x = right + sprite.width / 2;
}

if(sprite.y - sprite.height / 2 > bottom)
{
sprite.y = top - sprite.height / 2;
}
else if(sprite.y + sprite.height / 2 < top)
{
sprite.y = bottom + sprite.height / 2;
}


摩擦力應用(Correctly Way):
speed = Math.sqrt(vx * vx + vy * vy);
angle = Math.atan2(vy, vx);

if(speed > friction)
{
speed -= friction;
}
else
{
speed = 0;
}

vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;


摩擦力應用(Easy Way):
vx *= friction;
vy *= friction;



參考書目:Keith Peters.《Function Actionscript 3.0 Animation》.Friends of ED

檢查特定Table是否存在

尋找指定Table是否存在
SELECT name FROM SQLITE_MASTER WHERE type='table'and name='tablename';

reference from:http://www.sqlite.org/faq.html
(7)How do I list all tables/indices contained in an SQLite database

If you are running the sqlite3 command-line access program you can type ".tables" to get a list of all tables. Or you can type ".schema" to see the complete database schema including all tables and indices. Either of these commands can be followed by a LIKE pattern that will restrict the tables that are displayed.

From within a C/C++ program (or a script using Tcl/Ruby/Perl/Python bindings) you can get access to table and index names by doing a SELECT on a special table named "SQLITE_MASTER". Every SQLite database has an SQLITE_MASTER table that defines the schema for the database. The SQLITE_MASTER table looks like this:

CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);

For tables, the type field will always be 'table' and the name field will be the name of the table. So to get a list of all tables in the database, use the following SELECT command:

SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;

For indices, type is equal to 'index', name is the name of the index and tbl_name is the name of the table to which the index belongs. For both tables and indices, the sql field is the text of the original CREATE TABLE or CREATE INDEX statement that created the table or index. For automatically created indices (used to implement the PRIMARY KEY or UNIQUE constraints) the sql field is NULL.

The SQLITE_MASTER table is read-only. You cannot change this table using UPDATE, INSERT, or DELETE. The table is automatically updated by CREATE TABLE, CREATE INDEX, DROP TABLE, and DROP INDEX commands.

Temporary tables do not appear in the SQLITE_MASTER table. Temporary tables and their indices and triggers occur in another special table named SQLITE_TEMP_MASTER. SQLITE_TEMP_MASTER works just like SQLITE_MASTER except that it is only visible to the application that created the temporary tables. To get a list of all tables, both permanent and temporary, one can use a command similar to the following:

SELECT name FROM
(SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master)
WHERE type='table'
ORDER BY name

2009年3月19日 星期四

濾鏡

ActionScript3中的濾鏡種類有:
Drop shadow - 投影濾鏡
Blur - 模糊濾鏡
Glow - 發光濾鏡
Bevel - 斜角濾鏡
Bitmap - 影像濾鏡
Shader - 著色器濾鏡
Gradient bevel - 漸變斜角濾鏡
Gradient glow - 漸變發光濾鏡
Color matrix - 顏色矩陣濾鏡
Convolution - 迴旋濾鏡
Displacement map - 置換圖濾鏡

使用方式 (以BlurFilter為例):
var blur:BlurFilter = new BlurFilter(5, 5, 3);
var filters:Array = new Array();
filters.push(blur);
sprite.filters = filters;


如果要動態改變濾鏡效果,只需要改變原本濾鏡的屬性,
再將它指定給sprite的filters就好。

var bX:Number = 0.5;
var bY:Number = 0.5;
var quality:int = 2;
var blur:BlurFilter = new BlurFilter(bX, bY, quality);
...
sprite.filters = [blur];
...
private function onEnterFrame(evt:Event):void{
blur.blurX += bX;
blur.blurY += bY;
sprite.filters = [blur];
}

重要公式 - 渲染

轉換為十進位:
trace(hexValue);

十進位轉換為十六進位:
trace(decimalValue.toString(16));

顏色合成:
color24 = red << 16 | green << 8 | blue;
color32 = alpha << 24 | red << 16 | green << 8 | blue;


顏色提取:
red = color24 >> 16;
green = color24 >> 8 & 0xFF;
blue = color24 & 0xFf;
alpha = color32 >> 24;
red = color32 >> 16 & 0xFF;
green = color32 >> 8 * 0xFF;
blue = color232 & 0xFF;


過控制點的曲線:
// xt, yt is the point you want to draw through
// x0, y0 and x2, y2 are the end points of the curve

x1 = xt * 2 - (x0 + x2) / 2;
y1 = yt * 2 - (y0 + y2) / 2;
moveTo(x0, y0);
curveTo(x1, y1, x2, y2);



參考書目:Keith Peters.《Function Actionscript 3.0 Animation》.Friends of ED

2009年3月17日 星期二

重要公式 - 速度與加速度

角速度轉換為 x, y 速度向量:
vx = speed * Math.cos(angle);
vy = speed * Math.sin(angle);


角加速度(作用於物體上的force)轉換為 x, y 加速度:
ax = force * Math.cos(angle);
ay = force * Math.sin(angle);


將加速度加入速度向量:
vx += ax;
vy += ay;


將速度向量入坐標:
sprite.x += vx;
sprite.y += vy;



參考書目:Keith Peters.《Function Actionscript 3.0 Animation》.Friends of ED

資料型態轉換

string 轉double
#include <stdlib.h>
double atof(const char *nptr);


string 轉 int
#include <stdlib.h>
int atoi(const char *nptr);


string 轉 long
#include <stdlib.h>
long atol(const char *nptr);


string 轉 unsigned long
#include <stdlib.h>
unsigned long int strtoul(const char *nptr, char **endptr, int base);


int 轉 string
#include <stdio.h>
int sprintf(char *str, const char *fmt, ...);

str - 目標string
fmt - 寫入時使用的格式
%c 以字元方式輸出
%d 10 進位整數輸出
%o 以8進位整數方式輸出
%u 無號整數輸出
%x, %X 將整數以16進位方式輸出
%f 浮點數輸出
%e, %E 使用科學記號顯示浮點數
%g, %G 浮點數輸出,取%f或%e(%f或%E),看哪個表示精簡
%% 顯示 %
%s 字串輸出
... - 輸出數值的順序


int 轉 string (Windows Only)
#include <stdlib.h>
char* itoa(int value, char *str, int base);

value - 要轉換的int值
str - 目標string
base - 轉換時用的基數。ex: 二進位: 2, 十進位: 10, 16進位: 16, etc.

2009年3月16日 星期一

重要公式 - 三角學應用

基本三角函數計算:
角的正弦值(Sine) = 對邊 / 斜邊
角的餘弦值(Cosine) = 鄰邊 / 斜邊
角的正切值(Tangent) = 對邊 / 鄰邊


角度制與弧度制的相互轉換:
弧度 = 角度 * Math.PI / 180
角度 = 弧度 * 180 / Math.PI


向滑鼠指標旋轉(或向某點旋轉):
// substitute mouseX, mouseY with the x, y
// point to rotate to

dx = mouseX - sprite.x;
dy = mouseY - sprite.y;
sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;
// calculate the  velocity of x and y
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed:
sprite.x += vx;
sprite.y += vy;

建立波形:
// assign value to x, y or other property of sprite
// or movie clip, use as drawing coordinates,
// etc.

public function onEnterFrame(evt:Event):void{
value = center + Math.sin(angle) * range;
angle += speed;
}


建立圓形:
// assign position to x and y of sprite
// or movie clip, use as drawing coordinates,
// etc.

public function onEnterFrame(evt:Event):void{
xposition = centerX + Math.cos(angle) * radius;
yposition = centerY + Math.sin(angle) * radius;
angle += speed;
}


建立橢圓形
// assign position to x and y of sprite
// or movie clip, use as drawing coordinates,
// etc.

public function onEnterFrame(evt:Event):void{
xposition = centerX + Math.cos(angle) * radiusX;
yposition = centerY + Math.sin(angle) * radiusY;
angle += speed;
}


計算兩點間距離:
// points are x1, y1 and x2, y2
// can be sprite / movie clip positions,
// mouse coordinates, etc.

dx = x2 - x1;
dy = y2 - y1;
dist = Math.sqrt(dx * dx + dy * dy);



參考書目:Keith Peters.《Function Actionscript 3.0 Animation》.Friends of ED

2009年3月11日 星期三

Blogger 的 ReadMore

For Blogger 用的 ReadMore 收合器
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
<script src="http://cjh829-easy-read-more.googlecode.com/files/cjh829-easy-read-more-2.2.0.js" type="text/javascript"></script>
<script>
EasyReadMoreSettings.Enabled = true;
EasyReadMoreSettings.Read_More_Mode = 'mix';
EasyReadMoreSettings.Mode_Auto_MaxLine = 3;
EasyReadMoreSettings.Mode_Custom_Tag_Type = 'text';
EasyReadMoreSettings.Mode_Custom_Tag_Expr = '##ReadMore##';
EasyReadMoreSettings.Link_Style = 'directlink';
EasyReadMoreSettings.Link_Text = '...繼續閱讀';
EasyReadMoreSettings.Link_Text_title = '繼續閱讀';
EasyReadMoreSettings.Collapse_Link_Text = '顯示摘要...';
EasyReadMoreSettings.Collapse_Link_Text_title = '顯示摘要';
EasyReadMoreSettings.Collapse_MoveToEnd = false;
EasyReadMoreSettings.Collapse_Effect = 'none';
EasyReadMoreSettings.Collapse_Effect_Speed = 'normal';
EasyReadMoreSettings.Index_Page_Style = 'abstract';
EasyReadMoreSettings.Tag_Page_Style = 'title';
EasyReadMoreSettings.Archive_Page_Style = 'title';
EasyReadMoreSettings.Controller_Enabled = true;
EasyReadMoreSettings.Controller_Default_Position = true;
EasyReadMoreSettings.Controller_Splitter = ' | ';
EasyReadMoreSettings.Controller_Full_Text = '完整';
EasyReadMoreSettings.Controller_Abstract_Text = '摘要';
EasyReadMoreSettings.Controller_Title_Text = '標題';
EasyReadMoreSettings.ShowFullPost_Tag = '##ShowAll##';
</script>
<script>EasyReadMore.main()</script>


參考自:繼續閱讀懶人加強版

2009年3月10日 星期二

HTML Encoder

一個可以將HTML的保留字,做encode的網站

http://www.opinionatedgeek.com/DotNet/Tools/HTMLEncode/Encode.aspx

TinyXml - 快速上手

TinyXml是一個小巧好用的C++ XML Parser Library, 原始檔只有6個程式:
tinystr.cpp
tinyxml.cpp
tinyxmlerror.cpp
tinyxmlparser.cpp
tinystr.h
tinyxml.h

TinyXml是屬於DOM類型,不技援驗証的解析器。

TinyXml的關係類別簡介:
TiXmlBase - 最基本的抽象類別
TiXmlNode - 代表 XML 裡的節點,所有其它型態的資料都是繼承此類別
TiXmlDocument - 整個 XML 可以視為一個文件
TiXmlElement - 代表元素節點,可包含子節點及屬性
TiXmlComment - 代表注解
TiXmlDeclaration - 代表 XML 的聲明
TiXmlText - 代表元素節點內的本文節點
TiXmlUnknown - 代表未知節點,通常代表 XML 有錯誤了
TiXmlAttribute - 代表元素的屬性

一、讀取XML檔案
假設有一XML檔案personInfo.xml,內容為:
<?xml version=\"1.0\"?>
<Persons>
<Person ID="1">
<name>Hedy</name>
<age>15</age>
</Person>
<Person ID="2">
<name>Jan</name>
<age>30</age>
</Person>
</Persons>


//產生一個XML的文檔物件。
TiXmlDocument* xmlDoc = new TiXmlDocument(“personInfo.xml”);
xmlDoc->LoadFile();
//獲得根元素,即Persons。
TiXmlElement *rootElement = xmlDoc.rootElement();
//輸出根元素名稱,即輸出Persons。
cout << rootElement->Value() << endl;
//獲得第一個Person節點。
TiXmlElement *firstPerson = rootElement->FirstChildElement();
//獲得第一個Person的name節點和age節點和ID屬性。
TiXmlElement *nameElement = firstPerson->FirstChildElement();
TiXmlElement *ageElement = nameElement->NextSiblingElement();
TiXmlAttribute *IDAttribute = firstPerson->FirstAttribute();
//輸出第一個Person的name內容,即Hedy;age內容,即15;ID屬性,即1。
cout << nameElement->FirstChild()->Value << endl;
cout << ageElement->FirstChild()->Value << endl;
cout << IDAttribute->Value() << endl;


二、讀取XML自Char
讀取xml文字,其實跟讀xml檔案沒什麼差別,但使用到的是 Parse()這個function。
Const char* xmlStr =
“<?xml version=\"1.0\"?>\n” +
“<Persons>\n” +
“<Person ID=\"1\">\n” +
“<name>Hedy</name>\n” +
“<age>15</age>\n” +
“</Person>\n” +
“<Person ID=\"2\">\n” +
“<name>Jan</name>\n” +
“<age>30</age>\n” +
“</Person>\n” +
“</Persons>\n”;

TiXmlDocument xmlDoc;
xmlDoc.Parse(xmlStr);

其他的操作方式就跟讀xml檔是一樣的。

三、產生XML
//產生一個XML的文檔物件。
TiXmlDocument xmlDoc;
//產生XML聲明並連接到 xmlDoc
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );
xmlDoc->LinkEndChild( decl );
//產生一個根元素並連接到 xmlDoc
TiXmlElement *rootElement = new TiXmlElement("Persons");
xmlDoc->LinkEndChild(rootElement);
//產生一個Person元素並連接到 rootElement
TiXmlElement *personElement = new TiXmlElement("Person");
rootElement->LinkEndChild(personElement);
//設置Person元素的屬性。
personElement->SetAttribute("ID", "1");
//產生name元素、age元素並連接到 persionElement
TiXmlElement *nameElement = new TiXmlElement("name");
TiXmlElement *ageElement = new TiXmlElement("age");
personElement->LinkEndChild(nameElement);
personElement->LinkEndChild(ageElement);
//設置name元素和age元素的內容並連接到 nameElement 跟 ageElement
TiXmlText *nameContent = new TiXmlText("Hedy");
TiXmlText *ageContent = new TiXmlText("15");
nameElement->LinkEndChild(nameContent);
ageElement->LinkEndChild(ageContent);
//存到一個自訂的XML檔案
xmlDoc->SaveFile("personInfo.xml");

產生:
<Persons>
<Person ID="1">
<name>Hedy</name>
<age>15</age>
</Person>
</Persons>

2009年3月9日 星期一

SQLite3 SQL語法 - DROP INDEX

statement:

DROP INDEX 陳述式會移除使用 CREATE INDEX 陳述式所加入的索引。指定的索引會從資料庫檔案中完全移除。唯一一個復原索引的方法是重新輸入適當的 CREATE INDEX 命令。

根據預設,DROP INDEX 陳述式不會使資料庫檔案變小。資料庫中的空白空間仍會保留,並供之後的 INSERT 作業使用。若要移除資料庫中的可用空間,請使用 SQLConnection.clean() 方法。如果最初建立資料庫時,將 autoClean 參數設定為 true,則會自動釋放空間。

SQLite3 SQL語法 - CREATE INDEX

statement:

CREATE INDEX 命令包含關鍵字 CREATE INDEX,後面接著新索引的名稱、關鍵字 ON、要編製索引的已建立資料表名稱,和括在括弧裡的欄名稱清單 (清單中所列是資料表中要做為索引鍵值的欄名稱)。

indexed-column:

每個欄名稱後面可以接著 ASC 或 DESC 關鍵字以指定排序順序,但執行階段會忽略指定的排序順序。排序方式固定採用遞增順序。

每個欄名稱後面的 COLLATE 子句會定義該欄中文字值所用的定序順序。預設的定序順序是 CREATE TABLE 陳述式中為該欄定義的定序順序。如果未指定定序順序,則使用 BINARY 定序順序。

單一資料表可附加的索引數目可隨意自訂且沒有限制,一個索引中的欄數也沒有限制。

* 所有圖片轉載自:http://www.sqlite.org

SQLite3 SQL語法 - DROP TABLE

statement:

DROP TABLE 陳述式會移除以 CREATE TABLE 陳述式加入的資料表。卸除的資料表是具有指定 table-name 的資料表。它會從資料庫和磁碟檔案中完全移除。資料表無法復原。與資料表相關聯的所有索引也都會刪除。

根據預設,DROP TABLE 陳述式不會使資料庫檔案變小。資料庫中的空白空間仍會保留,並供之後的 INSERT 作業使用。若要移除資料庫中的可用空間,請使用 SQLConnection.clean() 方法。如果最初建立資料庫時,將 autoClean 參數設定為 true,則會自動釋放空間。

選擇性的 IF EXISTS 子句會抑制資料庫不存在時會發生的錯誤。

* 所有圖片轉載自:http://www.sqlite.org

SQLite3 SQL語法 - CREATE TABLE

statement:

每個欄定義是欄名稱後面接著該欄的資料類型,再接著一個或多個選擇性的欄條件約束。欄的資料類型會限制該欄中可儲存的資料內容。如果試圖在欄中儲存不同資料類型的值,執行階段會儘可能將值轉換為適當類型,或引發錯誤。

column-constraint:

NOT NULL 欄條件約束表示該欄不能包含 NULL 值。

UNIQUE 條件約束會導致對指定的一或多個欄建立索引。這個索引必須包含唯一的索引鍵,也就是針對指定的一或多個欄,任兩列均不得包含重製值或值組合。CREATE TABLE 陳述式可以有多個 UNIQUE 條件約束,包括在欄定義中為多個欄指定一個 UNIQUE 條件約束,和 (或) 多個資料表層級的 UNIQUE 條件約束。

CHECK 條件約束會定義一個要評估的運算式,而且該運算式必須為 True,才會插入或更新列的資料。CHECK 運算式必須解析成 Boolean 值。

欄定義中的 COLLATE 子句會指定比較欄的文字項目時所使用的文字定序函數。預設狀況下會使用 BINARY 定序函數。

DEFAULT 條件約束會指定執行 INSERT 時所用的預設值。這個值可為 NULL、字串常數或數字。預設值也可以是 CURRENT_TIME、CURRENT_DATE 或 CURRENT_TIMESTAMP 這幾個不區分大小寫的特殊關鍵字中的一個。如果值是 NULL、字串常數或數字,每當 INSERT 陳述式未針對該欄指定值時,這個值就會逐字插入欄中。如果值是 CURRENT_TIME、CURRENT_DATE 或 CURRENT_TIMESTAMP,則會將目前的 UTC 日期和/或時間插入欄中。CURRENT_TIME 的格式是 HH:MM:SS。CURRENT_DATE 的格式是 YYYY-MM-DD。CURRENT_TIMESTAMP 的格式是 YYYY-MM-DD HH:MM:SS。

指定 PRIMARY KEY 通常只會在對應的欄上建立 UNIQUE 索引。但如果在具有 INTEGER 資料類型的單一欄上指定 PRIMARY KEY 條件約束,就會使用該欄做為資料表的實際主要索引鍵。這表示該欄只能存放唯一的整數值。如果資料表沒有 INTEGER PRIMARY KEY 欄,則插入列時會自動產生整數索引鍵。只要使用 ROWID、OID 或 _ROWID_ 幾個特殊名稱中的其中一個,便可以隨時存取列的主要索引鍵。不論是明確宣告的 INTEGER PRIMARY KEY 或內部產生的值,都可以使用這些名稱。INTEGER PRIMARY KEY 欄也可以包含關鍵字 AUTOINCREMENT。使用 AUTOINCREMENT 關鍵字時,資料庫在執行 INSERT 陳述式時,會自動在 INTEGER PRIMARY KEY 欄中產生並插入循序遞增的整數索引鍵。

CREATE TABLE 陳述式中只能有一個 PRIMARY KEY 條件約束。它可以是一個欄定義的一部分,也可以一個單一資料表層級 PRIMARY KEY 條件約束。主要索引鍵欄是隱含的 NOT NULL。

接在許多條件約束後面的選擇性 conflict-clause 可以為該條件約束指定另一個預設的條件約束衝突解決演算法。預設值為 ABORT。同一個資料表中的不同條件約束可以使用不同的預設衝突解決演算法。如果 INSERT 或 UPDATE 陳述式指定不同的衝突解決演算法,就會使用該演算法取代 CREATE TABLE 陳述式中指定的演算法。

foreign-key-clause:

額外的條件約束 (如 FOREIGN KEY 條件約束) 不會造成錯誤,但執行階段會予以忽略。

如果 CREATE 和 TABLE 之間出現 TEMP 或 TEMPORARY 關鍵字,則所建立的資料表只會顯示在同一個資料庫連線 (SQLConnection 實體) 中。關閉資料庫連線時,就會自動刪除該資料表。在暫存資料表上建立的任何索引也都是暫時性的。暫存資料表和索引儲存在與主要資料庫檔案不同的另一個檔案中。

如果指定選擇性的 database-name 前置詞,就會在具名資料庫 (以指定的資料庫名稱呼叫 attach() 方法而連接到 SQLConnection 實體的資料庫) 中建立該資料表。除非 database-name 前置詞是 temp,否則,同時指定 database-name 前置詞和 TEMP 關鍵字是錯誤的。如果未指定資料庫名稱,而且沒有 TEMP 關鍵字,則會在主要資料庫 (使用 open() 或 openAsync() 方法連接到 SQLConnection 實體的資料庫) 中建立該資料表。

欄數或資料表的條件約束數目可隨意自訂且沒有限制,另外,列中的資料數量也可隨意自訂且沒有限制。

CREATE TABLE AS 形式會以查詢結果集的形式定義資料表。資料表欄的名稱是結果中欄的名稱。

如果使用選擇性的 IF NOT EXISTS 子句,而且已經有同名的其它資料表,則資料庫會忽略 CREATE TABLE 命令。

使用 DROP TABLE 陳述式可以移除資料表,而使用 ALTER TABLE 陳述式則可以變更限制。

* 所有圖片轉載自:http://www.sqlite.org/

SQLite3 SQL語法 - DELETE

statement:
刪除命令會用來移除資料表中的記錄。

命令包含 DELETE FROM 關鍵字,後面接著要從中移除記錄的資料表名稱。

如果沒有 WHERE 子句,就會移除資料表的所有列。如果有提供 WHERE 子句,則只移除符合運算式的列。WHERE 子句運算式必須解析成 Boolean 值。

* 所有圖片轉載自:http://www.sqlite.org/

SQLite3 SQL語法 - UPDATE

statement:

UPDATE 中的每一個指定會在等號左邊指定欄名稱,並在等號右邊指定任意的運算式。運算式可以使用其它欄的值。所有運算式都評估之後,才會執行任何指定。。

WHERE 子句會用來限制更新的列。WHERE 子句運算式必須解析成 Boolean 值。

選擇性的 conflict-algorithm 可以指定在這一個命令執行期間使用的另一個條件約束衝突解決演算法。


* 所有圖片轉載自:http://www.sqlite.org/


SQLite3 SQL語法 - INSERT

statement:


第一種形式 (使用 VALUES 關鍵字) 會在現有資料表中建立一個新列。如果未指定 column-list,則值的數目必須與資料表中的欄數相同。如果指定 column-list,則值的數目必須符合指定的欄數。資料表中的欄如果未出現在欄清單中,則該欄中將填入建立資料表時所定義的預設值,或填入 NULL (如果未定義預設值)。

第二種形式的 INSERT 陳述式會從 SELECT 陳述式取得資料。如果未指定 column-list,SELECT 結果中的欄數必須完全符合資料表的欄數,否則就必須符合 column-list 中指定的欄數。SELECT 結果中的每一列都會成為資料表中的一個新項目。SELECT 可以是簡單或複合形式。如需允許的 SELECT 陳述式定義。

選擇性的 conflict-algorithm 可以指定在這一個命令執行期間使用的另一個條件約束衝突解決演算法。


* 所有圖片轉載自:http://www.sqlite.org/

SQLite3 SQL語法 - SELECT

statement:


任何隨意的運算式都可做為結果。如果結果運算式是 *,則那一個運算式就會由所有資料表的所有欄取代。如果運算式是資料表的名稱後面接著 .*,則結果就是那一個資料表的所有欄。

select-core:


DISTINCT 關鍵字會導致傳回結果列的子集,這些結果列每個各不相同。NULL 值不會被視為與其它值不同。預設行為是會傳回所有結果列,這也可用關鍵字 ALL 明確指定。

查詢執行時,會針對 FROM 關鍵字後指定的一或多個資料表進行查詢。如果用逗號分隔多個資料表名稱,查詢會使用各個資料表的交叉聯結。JOIN 語法也可用來指定資料表的聯結方式。唯一支援的一種外部聯結類型是 LEFT OUTER JOIN。join-args 中的 ON 子句運算式必須解析成 Boolean 值。FROM 子句中可以使用括在括弧中的子查詢做為資料表。整個 FROM 子句可以完全省略,如此一來,結果將是由 result 運算式清單的值所構成的單一列。

WHERE 子句會用來限制查詢擷取的列數。WHERE 子句運算式必須解析成 Boolean 值。WHERE 子句篩選是在任何群組動作之前執行,所以 WHERE 子句運算式不得包含彙總函數。

GROUP BY 子句會導致一或多個結果列在輸出中合併成單一列。當結果包含彙總函數時,GROUP BY 子句特別好用。GROUP BY 子句中的運算式不一定要是出現在 SELECT 運算式清單中的運算式。

HAVING 子句類似 WHERE,可用來限制陳述式傳回的列。但 HAVING 子句是在 GROUP BY 子句指定的任何群組動作之後套用。因此,HAVING 運算式可以參考包含彙總函數的值。HAVING 子句運算式不一定要出現在 SELECT 清單中。HAVING 運算式和 WHERE 運算式一樣,都必須解析成 Boolean 值。

ORDER BY 子句會導致輸出列經過排序。ORDER BY 子句的 sort-expr-list 引數是做為排序索引鍵的運算式清單。在簡單 SELECT 中,這些運算式不一定要是結果的一部分,但在複合 SELECT (使用 compound-op 運算子的 SELECT) 中,每個排序運算式都必須確實符合其中一個結果欄。每個排序運算式後面可以選擇性的接著一個 sort-order 子句,內含 COLLATE 關鍵字和用於排列文字的定序函數名稱及 (或) 關鍵字 ASC 或 DESC 以指定排序順序 (遞增或遞減)。sort-order 可以省略,這時會使用預設值 (遞增順序)。

LIMIT 子句會設定結果中傳回的列數上限。負數的 LIMIT 表示沒有上限。LIMIT 後面可以選擇性的接著 OFFSET,以指定須略過結果集開頭的多少列。在複合 SELECT 查詢中,LIMIT 子句只能出現在最後的 SELECT 陳述式之後,而且限制適用於整個查詢。請注意,如果 LIMIT 子句中使用 OFFSET 關鍵字,則限制是第一個整數,位移是第二個整數。如果用逗號取代 OFFSET 關鍵字,則位移是第一個數字,而限制是第二個數字。這種看起來很矛盾的語法是為了儘可能與舊式 SQL 資料庫系統相容而故意設計的。

compound-operator:

複合 SELECT 是由兩個或多個簡單 SELECT 陳述式組成,陳述式之間可使用 UNION、UNION ALL、INTERSECT 或 EXCEPT 其中一個運算子連接。在複合 SELECT 中,所有組成的 SELECT 陳述式都必須指定相同數目的結果欄。只有在最後一個 SELECT 陳述式之後 (和唯一的 LIMIT 子句之前,如果指定的話) 才能有一個 ORDER BY 子句。UNION 和 UNION ALL 運算子會合併前後 SELECT 陳述式的結果,成為單一資料表。差別在於,UNION 的所有結果列各不相同,而 UNION ALL 的所有結果則可以有重製項目。INTERSECT 運算子會取得前後 SELECT 陳述式結果的交集。EXCEPT 會取得前一個 SELECT 的結果,從中移除後一個 SELECT 的結果。如果將三個或更多 SELECT 陳述式複合連接在一起,它們會從第一個到最後一個群組在一起。

* 所有圖片轉載自:http://www.sqlite.org

2009年3月6日 星期五

SQLite3 SQL語法 - ALTER TABLE

statement:

ALTER TABLE 命令可讓使用者將現有資料表重新命名或加入新欄。資料表中的欄無法移除。

RENAME TO 語法會用來將以 [database-name.] table-name 識別的資料表重新命名成 new-table-name。這個命令無法用來在附加的資料庫之間移動資料表,只能重新命名相同資料庫中的資料表。

如果重新命名的資料表有觸發程序或索引,它們在重新命名後仍會附加到資料表。但如果有任何檢視定義或由觸發程序執行的陳述式參考到重新命名的資料表,它們不會自動修改為使用新資料表名稱。如果重新命名的資料表有關聯的檢視或觸發程序,您必須手動卸除並重新建立觸發程序或使用新的資料表名稱檢視定義。

ADD [COLUMN] 語法會用來在現有資料表中加入新欄。新欄一定會附加到現有欄清單結束處。column-def 子句可以接受 CREATE TABLE 陳述式中允許的任何形式,但有下列限制:

欄不可以有 PRIMARY KEY 或 UNIQUE 條件約束。
欄不可以有 CURRENT_TIME、CURRENT_DATE 或 CURRENT_TIMESTAMP 的預設值。
如果指定 NOT NULL 條件約束,該欄必須有 NULL 以外的預設值。
ALTER TABLE 陳述式的執行時間不受資料表中的資料量影響。

* 所有圖片轉載自:http://www.sqlite.org

SQLite3 SQL語法 - Aggregate Functions

Default Aggregate Functions:

        avg(X)

                傳回群組中非 NULL X 的平均值。字串和看起來不是數字的 BLOB 值都會解譯為0AVG() 的結果一定是浮點數,即使所有輸入都是整數。

        count(X) count(*)

                第一種形式會傳回群組中 X 不是 NULL 的次 數。第二種形式 (使      * 引數) 會傳回群組中的總列數。

        group_concat(X) group_concat(X, Y)

                結果是一個由所有 X 不是 NULL 連接起來的一個字串,如果有參數Y,它會成為連接X的分隔符號。若省略Ydefault 符號為逗號(,)

        max(X)                    

傳回群組中所有值的最大值。最大值依一般排序順序決定。

        min(X)                     

傳回群組中所有值的最小非 NULL 值。最小值依一般排序順序決定。如果群組中的所有值都是 NULL,則傳回 NULL

        sum(X) tatal(X)

                傳回群組中所有非 NULL 值的數值總和。如果所有值都是 NULLSUM() 會傳回 NULL        TOTAL() 則傳回 0.0TOTAL() 的結果一定是浮點值。如果所有非 NULL輸入都是整數,SUM() 的結果是整數值。如果 SUM() 的任何輸入不是整數也不是 NULL,則 SUM() 會傳回浮點值。這個值可能是正確總和的近似值。

2009年3月4日 星期三

SQLite3 之 SQL 語法

SQLite 3 所支援之SQL 語法:

 

l          aggregate functions

l          ALTER TABLE

l          ANALYZE

l          ATTACH DATABASE

l          BEGIN TRANSACTION

l          comment

l          COMMIT TRANSACTION

l          core functions

l          CREATE INDEX

l          CREATE TABLE

l          CREATE TRIGGER

l          CREATE VIEW

l          CREATE VIRTUAL TABLE

l          date and time functions

l          DELETE

l          DETACH DATABASE

l          DROP INDEX

l          DROP TABLE

l          DROP TRIGGER

l          DROP VIEW

l          END TRANSACTION

l          EXPLAIN

l          expression

l          INDEXED BY

l          INSERT

l          keywords

l          ON CONFLICT clause

l          PRAGMA

l          REINDEX

l          RELEASE SAVEPOINT

l          REPLACE

l          ROLLBACK TRANSACTION

l          SAVEPOINT

l          SELECT

l          UPDATE

l          VACUUM