會知道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年9月24日 星期五
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++ 果然需要嚴謹一點才行
2010年3月28日 星期日
vbscript colon
在 vbscript 中 可以用冒號 ":" 來在一行中執行多個 statement
例如:
dim a : a=1
或者是
dim a, b, c
a=1 : b=2 : c=3
算是一個蠻好用的小知識
例如:
dim a : a=1
或者是
dim a, b, c
a=1 : b=2 : c=3
算是一個蠻好用的小知識
cmd /k /?
在cmd.exe下 鍵入 command /? 就會顯示出該 command 的參數說明
而 cmd.exe 的 /k 參數就是啟動 cmd 後執行跟在 /k 後的指令 並且保留命令視窗
若要在一行中執行多個指令 則指令間需要用 "&" 隔開
而 cmd.exe 的 /k 參數就是啟動 cmd 後執行跟在 /k 後的指令 並且保留命令視窗
若要在一行中執行多個指令 則指令間需要用 "&" 隔開
2009年12月30日 星期三
php 物件的static method最好要以static keyword清楚標示
因為一時心血來潮 想知道呼叫php物件的 static method 跟 non-static method 在效率上有沒有差別
就寫了簡單的程式測試一下 一開始我的物件的method只有一個 並沒有以 static 關鍵字宣告:
class T
{
public f()
{
}
}
而只是以兩種不同的方式呼叫:
1.
$o = new T();
$o->f();
2.
T::f();
結果以第二種方式 花的時間大概是 第一種方式的兩倍 讓我非常驚訝
後來我在php官網發現了造成效率差距這麼巨大的原因
Calling non-static methods statically generates an E_STRICT level warning.
即使在 php.ini 中的 error_reporting 設為 E_ALL 用第二種方式呼叫 method也不會出現 warning
因為 E_ALL 是不包含 E_STRICT 的 所以我便以為這樣寫的 code 是合法的 真是大錯特錯
我後來把 class 改寫:
class T
{
public function f()
{
}
public static function sf()
{
}
}
再以 T::sf() 呼叫 static method
結果是呼叫 static method 或是 non-static method 時間都差不多 感覺這樣才是合理的狀態
然後 我把 error_reporting 改成 E_ALL | E_STRICT 了
寫 code 還是要嚴謹一點才好
就寫了簡單的程式測試一下 一開始我的物件的method只有一個 並沒有以 static 關鍵字宣告:
class T
{
public f()
{
}
}
而只是以兩種不同的方式呼叫:
1.
$o = new T();
$o->f();
2.
T::f();
結果以第二種方式 花的時間大概是 第一種方式的兩倍 讓我非常驚訝
後來我在php官網發現了造成效率差距這麼巨大的原因
Calling non-static methods statically generates an E_STRICT level warning.
即使在 php.ini 中的 error_reporting 設為 E_ALL 用第二種方式呼叫 method也不會出現 warning
因為 E_ALL 是不包含 E_STRICT 的 所以我便以為這樣寫的 code 是合法的 真是大錯特錯
我後來把 class 改寫:
class T
{
public function f()
{
}
public static function sf()
{
}
}
再以 T::sf() 呼叫 static method
結果是呼叫 static method 或是 non-static method 時間都差不多 感覺這樣才是合理的狀態
然後 我把 error_reporting 改成 E_ALL | E_STRICT 了
寫 code 還是要嚴謹一點才好
2009年9月12日 星期六
windows的handle
這裡有說明了 windows 系統中的 handle 代表的意義
windows kernel 幫每個 process 維護一份 handle table
table 中的 entry 指向該 handle 所代表的 object
因為是每個 process 一份 handle table 所以一個 handle value 只對使用該 handle 的 process 有意義
windows kernel 幫每個 process 維護一份 handle table
table 中的 entry 指向該 handle 所代表的 object
因為是每個 process 一份 handle table 所以一個 handle value 只對使用該 handle 的 process 有意義
訂閱:
文章 (Atom)