2010年10月1日 星期五

css 的 width 和 height 用百分比表示

在 css 裡面 元素的 width 和 height 可以用百分比表示
代表這個元素的寬和高為父元素的百分比
但是因為是使用父元素的寬和高來當基準 一定要確定父元素的寬和高也正確的設定了
否則可能會出現排版亂掉的情況

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 搞錯了

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 難以閱讀

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 太麻煩了

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
真的很方便

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 = =

2010年4月3日 星期六

long long int

最近寫 acm 很常需要用到較大的數字 int 有時不敷使用
因此有用到了 long long int 這個型別
這個型別大小為 8 byte  在 C99 標準中有定義

scanf 或是 printf 系列函式用到這個型別時 要用 %lld 來表示

之前沒查資料  直接用 %ld 結果程式跑出來結果錯誤
寫 c/c++ 果然需要嚴謹一點才行