2015年2月26日 星期四

Windows 7 安裝 pyminizip

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月16日 星期一

log4net 沒有寫 log

曾經碰過 log4net 一個奇怪的問題, 就是在程式中呼叫 GetLogger 的時間點不同有時會讓 log 檔案出不來

後來發現這是因為在程式中有用到一個 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

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!