python 內建有 zipfile library, 但是它沒辦法創建有密碼的 zip 檔案
所以必須要用第三方 lib, 例如 pyminizip
在 windows 上安裝完最新的 python 2.7.9 會連 pip 也一起安裝進去
但直接用 pip install pyminizip 會出現 error 找不到 zlib.h
在 pypi 上 pyminizip 的介紹有寫道它依賴於 zlib, 所以必須要先安裝 zlib
到 zlib 官網 可以下載到 windows 版的 zlib dll, lib 跟 header 檔
這邊有一個要注意的是下載的 lib 檔名稱為 zdll.lib, 應該是錯的
要記得改名為 zlib.lib, 否則之後 link 會出現錯誤
根據 pip 的 error log 顯示, 在 pip install pyminizip 的過程中需要 compile 一些 .c 檔
這些 .c 檔會用到 zlib.h
所以要把 zlib.h zlib.lib 放到適當的地方讓 cl.exe 找的到, 像是 VC++ 裡預設的目錄
C:\Program Files\Microsoft Visual Studio 9.0\VC\include
C:\Program Files\Microsoft Visual Studio 9.0\VC\lib
如果安裝了不只一版 VC++, error log 裡也會告訴你他是用哪一版 VC++ 去 compile 的
接著照 zlib 的 readme, 把 zlib1.dll 放到
C:\windows\system32\
C:\windows\system
然後再執行 pip install pyminizip, 就可以很順利的成功了
2015年2月26日 星期四
2015年2月16日 星期一
log4net 沒有寫 log
曾經碰過 log4net 一個奇怪的問題, 就是在程式中呼叫 GetLogger 的時間點不同有時會讓 log 檔案出不來
後來發現這是因為在程式中有用到一個 library, 那個 library 也有使用到 log4net
但是卻沒有在 AssemblyInfo.cs 裡面宣告 log4net config
所以假如在用到該 lib 後面才呼叫 GetLogger 的話, log 檔案都不會出現
解法很簡單, 只要在使用到該 lib 之前呼叫 GetLogger 就可以了
後來發現這是因為在程式中有用到一個 library, 那個 library 也有使用到 log4net
但是卻沒有在 AssemblyInfo.cs 裡面宣告 log4net config
所以假如在用到該 lib 後面才呼叫 GetLogger 的話, log 檔案都不會出現
解法很簡單, 只要在使用到該 lib 之前呼叫 GetLogger 就可以了
2015年2月12日 星期四
不能直接從 Object 轉成 Enum 型別
最近遇到一個問題, 就是從 SqlDataReader 讀到的整數轉成 Enum 型別會有 exception
試過轉型成 String 沒甚麼問題, 但就是轉成 Enum 型別會出錯
後來發現因為都是用下標運算子去存取 DataReader, 所以拿到的型別是 Object
而在 DataBase 中存取的整數欄位型別是 TinyInt, 也就是 byte 型別
經過實驗才發現, 原來 Object 中存放 byte 型別時, 不能直接轉型成 Enum
Object 只有存放 int 型別時才能直接轉型成 Enum
試過轉型成 String 沒甚麼問題, 但就是轉成 Enum 型別會出錯
後來發現因為都是用下標運算子去存取 DataReader, 所以拿到的型別是 Object
而在 DataBase 中存取的整數欄位型別是 TinyInt, 也就是 byte 型別
經過實驗才發現, 原來 Object 中存放 byte 型別時, 不能直接轉型成 Enum
Object 只有存放 int 型別時才能直接轉型成 Enum
public enum E
{
E1
}
byte b = 1;
Object o = b;
E e = (E)o; // Exception!!
int i = 1;
o = i;
E e = (E)o; // Works find!
2015年1月8日 星期四
SQL query with like
在 C# 使用 SQL query 的參數如果要加 % 的話, 要用 + 號
例如
例如
cmd.CommandText = "select * from MyTable where Arg like @Arg+'%'";
2015年1月7日 星期三
定位 PE file section table 位置
PE header 中有一個欄位叫做 SizeOfHeaders.
但是這個欄位實際上只是方便給人看得, PE 檔案實際上的 header 大小不一定要跟這個值一樣
程式也可以順利執行
因此, 當要定位 section table 時, 也不能用 SizeOfHeaders 來算
正確的算法應該是
dosHeader.e_lfanew +
sizeof(ntHeaders.FileHeader) +
sizeof(ntHeaders.Signature) +
ntHeaders.FileHeader.SizeOfOptionalHeader;
Reference:
http://bbs.pediy.com/showthread.php?t=152786
但是這個欄位實際上只是方便給人看得, PE 檔案實際上的 header 大小不一定要跟這個值一樣
程式也可以順利執行
因此, 當要定位 section table 時, 也不能用 SizeOfHeaders 來算
正確的算法應該是
dosHeader.e_lfanew +
sizeof(ntHeaders.FileHeader) +
sizeof(ntHeaders.Signature) +
ntHeaders.FileHeader.SizeOfOptionalHeader;
Reference:
http://bbs.pediy.com/showthread.php?t=152786
2015年1月5日 星期一
VMWare unknown invalid VM
最近在 VMWare ESXi 上面發現了有台 VM 顯示 Unknown invalid
發現是因為 VMWare host 讀不到 .vmx 檔案時會出現這個錯誤
但是去 datastore 看時發現 .vmx 檔案還在, 也可以讀取
看來應該不用重新建立 VM
只要把 VM 從 Inventory 移除再加入就好了
Reference:
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2172
發現是因為 VMWare host 讀不到 .vmx 檔案時會出現這個錯誤
但是去 datastore 看時發現 .vmx 檔案還在, 也可以讀取
看來應該不用重新建立 VM
只要把 VM 從 Inventory 移除再加入就好了
Reference:
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2172
2014年10月21日 星期二
Windows server 2008 R2 SP1 kernel socket leak
最近發現在 server 2008 上面跑的 service 出現 connection error,
經過測試, 確定網路是通的
後來自己寫了小程式去做 socket connect 測試, 發現只要同時開多個 socket, 一定會出現 exception
an operation on a socket could not be performed because the system lacked sufficient buffer space
上網查了資料, 這個錯誤常常是因為 windows 有 socket port range 限制, 但是 application 頻繁的打開跟關閉 socket 所已 port number 達到 windows 規定上限
http://blog.zhaojie.me/2010/08/lack-of-dynamic-ports-when-frequently-open-and-close-socket.html
http://blog.miniasp.com/post/2010/11/17/How-to-deal-with-TIME_WAIT-problem-under-Windows.aspx
這種情況通常等個一會讓 windows 把關掉的 socket port number 再重用, 就可以避開
但是我遇到的情況是不管等多久這個 exception 都會出現
繼續查資料發現 windows 還有一個 known issue, kernel socket leak
http://support.microsoft.com/kb/2577795
當這個 issue 發生時, 因為是 kernel 沒有把 socket 正確關閉, 所以除了重開機不然沒救
這個 KB 描述的現象跟我遇到的非常相似, 而且我使用的 server 剛好就是該 KB 有提到的
server 2008 R2 SP1.
可惜的是沒有一個方法可以確定是不是真的發生了 kernel socket leak, 只能先裝上 hotfix
再看看之後會不會發生
經過測試, 確定網路是通的
後來自己寫了小程式去做 socket connect 測試, 發現只要同時開多個 socket, 一定會出現 exception
an operation on a socket could not be performed because the system lacked sufficient buffer space
上網查了資料, 這個錯誤常常是因為 windows 有 socket port range 限制, 但是 application 頻繁的打開跟關閉 socket 所已 port number 達到 windows 規定上限
http://blog.zhaojie.me/2010/08/lack-of-dynamic-ports-when-frequently-open-and-close-socket.html
http://blog.miniasp.com/post/2010/11/17/How-to-deal-with-TIME_WAIT-problem-under-Windows.aspx
這種情況通常等個一會讓 windows 把關掉的 socket port number 再重用, 就可以避開
但是我遇到的情況是不管等多久這個 exception 都會出現
繼續查資料發現 windows 還有一個 known issue, kernel socket leak
http://support.microsoft.com/kb/2577795
當這個 issue 發生時, 因為是 kernel 沒有把 socket 正確關閉, 所以除了重開機不然沒救
這個 KB 描述的現象跟我遇到的非常相似, 而且我使用的 server 剛好就是該 KB 有提到的
server 2008 R2 SP1.
可惜的是沒有一個方法可以確定是不是真的發生了 kernel socket leak, 只能先裝上 hotfix
再看看之後會不會發生
訂閱:
文章 (Atom)