在 css 裡面 元素的 width 和 height 可以用百分比表示
代表這個元素的寬和高為父元素的百分比
但是因為是使用父元素的寬和高來當基準 一定要確定父元素的寬和高也正確的設定了
否則可能會出現排版亂掉的情況
2010年10月1日 星期五
VBScript 和 JavaScript 的 string 是 pass by reference
在寫 scripting language 時 都知道變數通常可分為 primitive type 跟 reference type
primitive type 是 pass by value 而 reference type 是 pass by reference
可能語言會宣稱自己只有 pass by value (例如 java, 雖然他不是 scripting 語言)
但是保持一個觀念就是 reference type 的變數被傳進一個函式後
函式對這個變數做的改變在函式退出後還可以看的到
不過對 javascript 和 vbscript 來說 string 是特別的 string 不是物件 所以他是 primitive type
但是 string 又可以是任意長度的 所以如果 string 如果是 pass by value 將會很沒有效率
所以在實作上通常把他作為 pass by reference
如果只用 primitive type 和 reference type 來 分別 pass by value 和 pass by reference
可能會對 string 的 pass rule 搞錯了
primitive type 是 pass by value 而 reference type 是 pass by reference
可能語言會宣稱自己只有 pass by value (例如 java, 雖然他不是 scripting 語言)
但是保持一個觀念就是 reference type 的變數被傳進一個函式後
函式對這個變數做的改變在函式退出後還可以看的到
不過對 javascript 和 vbscript 來說 string 是特別的 string 不是物件 所以他是 primitive type
但是 string 又可以是任意長度的 所以如果 string 如果是 pass by value 將會很沒有效率
所以在實作上通常把他作為 pass by reference
如果只用 primitive type 和 reference type 來 分別 pass by value 和 pass by reference
可能會對 string 的 pass rule 搞錯了
2010年9月29日 星期三
vbscript default method 和 default property
在VBScript裡面的class可以有所謂 default method 和 default property 他的作用是可以讓人不需要用 method name 或 property name 就可以呼叫
此外一個class 只能有一個 default method 和 default property 否則會造成錯誤
如以下例子為 default method
class FOO
public default function no_name
msgbox "default function called"
no_name = "i am FOO"
end function
end class
dim o : set o = new FOO
msgbox o()
以上的程式會跳出兩個msgbox 可以得知 no_name 在執行到 o() 時被呼叫
在VBScript 裡面的 dictionary 還有 collection 物件都有 default property
collection 和 dictionary 的 default property 就是 Item property
可以讓人在 coding 時方便許多
例如 要在 dictionary 取一個 key 是 "kerker" 的 value
嚴謹的寫法是 dict.Item("kerker")
但是因為 default property 的關係 用 dict("kerker") 也可以 這樣用起來就方便多了
不過網路上關於 VBScript 的 default method, default property資料好像蠻少的 而且有人說最好不要用這個特性
因為這樣會讓寫出來的code 難以閱讀
此外一個class 只能有一個 default method 和 default property 否則會造成錯誤
如以下例子為 default method
class FOO
public default function no_name
msgbox "default function called"
no_name = "i am FOO"
end function
end class
dim o : set o = new FOO
msgbox o()
以上的程式會跳出兩個msgbox 可以得知 no_name 在執行到 o() 時被呼叫
在VBScript 裡面的 dictionary 還有 collection 物件都有 default property
collection 和 dictionary 的 default property 就是 Item property
可以讓人在 coding 時方便許多
例如 要在 dictionary 取一個 key 是 "kerker" 的 value
嚴謹的寫法是 dict.Item("kerker")
但是因為 default property 的關係 用 dict("kerker") 也可以 這樣用起來就方便多了
不過網路上關於 VBScript 的 default method, default property資料好像蠻少的 而且有人說最好不要用這個特性
因為這樣會讓寫出來的code 難以閱讀
2010年9月27日 星期一
Scripting.Dictionary
在 VBScript 或是 Jscript 中有一個很好用的物件叫做Scripting.Dictionary
他就像是 C++ 的 map, PHP 的 array 是一個關聯陣列 (不過Jscript的物件已經可以當關聯陣列用了 所以這個物件對Jscript不太需要)
這個物件有一個很好的特性 就是他的 Items() 和 Keys() method 傳回的陣列元素的順序就是元素加入物件時的先後順序
利用這個特性 用這個物件實做出像是 Stack 或是 Queue 就非常容易了
並沒有任何公開文件聲明Scripting.Dictionary物件必須維持此特性 只能說這是Scripting.Dictionary內部資料結構的實作造成這個事實
雖然依賴這種未公開特性去寫code有風險 只要微軟改變這個物件的實作 就可以讓這一性質消失
但是我覺得微軟應該不會再對Scripting.Dictionary有什麼變動了 沒有這個必要 VBScript 也不是微軟的焦點
所以如果有需要 就用這個特性寫下去吧 畢竟要自己實作 Stack 或是 Queue 太麻煩了
他就像是 C++ 的 map, PHP 的 array 是一個關聯陣列 (不過Jscript的物件已經可以當關聯陣列用了 所以這個物件對Jscript不太需要)
這個物件有一個很好的特性 就是他的 Items() 和 Keys() method 傳回的陣列元素的順序就是元素加入物件時的先後順序
利用這個特性 用這個物件實做出像是 Stack 或是 Queue 就非常容易了
並沒有任何公開文件聲明Scripting.Dictionary物件必須維持此特性 只能說這是Scripting.Dictionary內部資料結構的實作造成這個事實
雖然依賴這種未公開特性去寫code有風險 只要微軟改變這個物件的實作 就可以讓這一性質消失
但是我覺得微軟應該不會再對Scripting.Dictionary有什麼變動了 沒有這個必要 VBScript 也不是微軟的焦點
所以如果有需要 就用這個特性寫下去吧 畢竟要自己實作 Stack 或是 Queue 太麻煩了
2010年9月24日 星期五
利用adodb.stream作編碼轉換
會知道adodb.stream有這個功能是因為我用winhttprequest物件去要求網頁時
該網頁回傳的是用 big-5 編碼的網頁 導致我出現亂碼
接著我上網搜尋在 vbscript 中作編碼轉換的資料 於是發現 adodb.stream 有這種功能
如以下例子
dim http : set http = createobject("WinHttp.WinHttpRequest.5.1")
http.Open "http://some_big-5_page.html"
http.Send
http.WaitForResponse
msgbox http.ResponseText
Dim oStream : Set oStream = CreateObject("adodb.stream")
oStream.Type = 1 '以二進位方式操作
oStream.Mode = 3 '可同時進行讀寫
oStream.Open '開啟物件
oStream.Write http.ResponseBody '將 content 寫入物件內
oStream.Position = 0 '從頭開始
oStream.Type = 2 '以文字模式操作
oStream.Charset="Big5" '設定編碼方式
msgbox oStream.ReadText()
在這裡會發現第一次 跳出來的視窗有亂碼 但是第二次的視窗就正常了
adodb.stream很好很強大 而且它支援多種編碼 不只是big-5
真的很方便
該網頁回傳的是用 big-5 編碼的網頁 導致我出現亂碼
接著我上網搜尋在 vbscript 中作編碼轉換的資料 於是發現 adodb.stream 有這種功能
如以下例子
dim http : set http = createobject("WinHttp.WinHttpRequest.5.1")
http.Open "http://some_big-5_page.html"
http.Send
http.WaitForResponse
msgbox http.ResponseText
Dim oStream : Set oStream = CreateObject("adodb.stream")
oStream.Type = 1 '以二進位方式操作
oStream.Mode = 3 '可同時進行讀寫
oStream.Open '開啟物件
oStream.Write http.ResponseBody '將 content 寫入物件內
oStream.Position = 0 '從頭開始
oStream.Type = 2 '以文字模式操作
oStream.Charset="Big5" '設定編碼方式
msgbox oStream.ReadText()
在這裡會發現第一次 跳出來的視窗有亂碼 但是第二次的視窗就正常了
adodb.stream很好很強大 而且它支援多種編碼 不只是big-5
真的很方便
2010年5月22日 星期六
XMLHttpRequest物件的setRequestHeader
似乎是因為安全上的考量 現在使用 XMLHttpRequest 物件的 setRequestHeader method 時
有許多的 header field 不能設定 referer 就是其中一個
假使用以下的code
//vbscript code
xmlhttp.open ...
xmlhttp.setRequestHeader "referer", "http://..."
xmlhttp.send
我用 MSXML2.XMLHTTP.3.0 測試過了
用 sniffer 看實際送出的封包 會發現 referer 並沒有被加到 http header 中
上網找了資料 似乎 firefox safari 都有做這樣的保護措施
不過不知道為什麼好像資料很少 連 msdn 上面的 xmlhttprequest 物件說明也沒有註明這件事
就因為這樣害我找了好久的 bug = =
有許多的 header field 不能設定 referer 就是其中一個
假使用以下的code
//vbscript code
xmlhttp.open ...
xmlhttp.setRequestHeader "referer", "http://..."
xmlhttp.send
我用 MSXML2.XMLHTTP.3.0 測試過了
用 sniffer 看實際送出的封包 會發現 referer 並沒有被加到 http header 中
上網找了資料 似乎 firefox safari 都有做這樣的保護措施
不過不知道為什麼好像資料很少 連 msdn 上面的 xmlhttprequest 物件說明也沒有註明這件事
就因為這樣害我找了好久的 bug = =
2010年4月3日 星期六
long long int
最近寫 acm 很常需要用到較大的數字 int 有時不敷使用
因此有用到了 long long int 這個型別
這個型別大小為 8 byte 在 C99 標準中有定義
scanf 或是 printf 系列函式用到這個型別時 要用 %lld 來表示
之前沒查資料 直接用 %ld 結果程式跑出來結果錯誤
寫 c/c++ 果然需要嚴謹一點才行
因此有用到了 long long int 這個型別
這個型別大小為 8 byte 在 C99 標準中有定義
scanf 或是 printf 系列函式用到這個型別時 要用 %lld 來表示
之前沒查資料 直接用 %ld 結果程式跑出來結果錯誤
寫 c/c++ 果然需要嚴謹一點才行
訂閱:
文章 (Atom)