TEST

2010年6月17日 星期四

ASSERT的使用時機

ASSERT全大寫表示它是全域的。它是一種假設,當假設不成立時,程式就得全部中止。且只作用在Debug時,為的就是讓你在Debug時可以更快地寫程式、找出錯誤。Release時會不會假設就不成立了?有可能,但通常寫程式Debug時就會出現ASSERT出錯的情況,在此時就會快速的發現錯誤,如果Relese版本才出錯,就是考慮的不夠嚴謹,有些ASSERT沒有設定,或是某種情況Relese版才出現。此時更需要Unit Test配合。

寫程式需不需要到處都先假設?

被呼叫端的函式比如fun(obj * o);就必須成立一假設ASSERT(NULL!=o);
為何不return error code或throw exception,要考慮的是上層有沒有檢查就呼叫。通常是會檢查的,就沒有返回錯誤碼或丟例外的必要,但並不能保證。

如果上層要檢查那上上層要不要檢查?在每一層都必須檢查是無謂的。

通常一個軟體設計會分成三個模組,也就是所謂的MVC,是指模組而言。在程式邏輯可分成Controller、UI、Library三層,是有點類似的。Controller呼叫UI和Library,而UI傳送使用者event給Controller。在大型的軟體,可能Controller上還會有一個總體的Controller,Library可能還會呼叫別的Library。
實際的程式可能是C1->C2->L1->L2->L3,UI可能由C1整合(C1<->UI),

設有一程式輸入名子就可以知道工作時數來取得Payment(薪水、股票)
UI(input)<->C1->C2->
fun1(string name)->fun2(int work_time)->fun3(Payment * pay);

fun1就必須有ASSERT(!name.IsEmpty());
fun2就必須有ASSERT(work_time>0);
fun3就必須有ASSERT(NULL!=pay);

在此情況*下L1,L2,L3都必須ASSERT,而C1或C2就必須檢查避免傳遞無效名子。Controller會去使用UI跟Library,被呼叫端UI跟Library就必須要假設是被正常使用。

但Controller不能有ASSERT,因為它不能有任何的假設情況,必須把會發生的都考慮進去,遇到不正常的時候就阻擋。而被呼叫端都必須要確認情況是成立的才能繼續執行。煩惱就交給上層,下層就只要假設就好了。

C++ 編程規範70提到error有三種:

  • Precondition(前條件)
  • Postcondition(後條件)
  • Invariant(不變性)

書中講得很清楚,在此不重述。只有不變性比較抽象,不變性就是滿足一個有效狀態(valid states)物件的條件。比如說一個有帳號、密碼的物件,帳號和密碼必須是成對且正確對應的,其中一個有錯就是error、無效狀態。這很明顯不該使用ASSERT來保證*。

書中說到Postcondition也可用ASSERT來確認:

"假設你呼叫某個API函式,其文件說它總是返回正值,但你懷疑該函式有臭蟲,那麼你可以在呼叫該函式後使用assert驗證其結果。"

這我認為是多餘的,不是很建議。當此API函式出錯有兩種解法:

  • API可以修改:修改API錯誤,但不管Debug還是Release時還是要再確認。
  • API不可修改:此時也不能用ASSERT中止,且Release版本也不希望出現這個錯誤,當然是由上層想辦法檢查繞過來解決。

不管Debug還是Release時,你還是得再一次確認結果是你所預期的,此時可搭配Unit Test來確認。要不然就是上層自行檢查來避開,沒有必要用ASSERT。Postcondition真的有需要ASSERT時,我覺得只有在驗算的時候,比如設計類似Excel的軟體,寫了兩個演算法來計算同樣的數學式,一個是用來驗算,而且只有Debug版本會算兩次比較慢,不相等的話就一定是其中一個有錯。

總結ASSERT的使用時機:

  • Precondition
  • 當你寫的程式是被使用的UI或Library,請多多利用ASSERT來防範吧。

*這只是假命題,fun1也可以接受空名子再處理,fun2可以用unsign int限制,fun3也可以傳reference防null物件,所以實際上用到ASSERT的情況不多。
*不要用ASSERT報告執行期錯誤[C++ 編程規範68]。

2010年5月23日 星期日

安裝設定Wine執行Zoundry Raven

請先參考 [教學] 圖解 wine 入門 來安裝wine、cabextract,不用裝ies4linux,以winetricks裝ie6、msxml3、mfc40、mfc42、wininet。
打開Configure Wine,還需要用到Windows的shlwapi.dll,在libraries頁中新增輸入shlwapi,之後將c:\Windows\system32目錄下的shlwapi.dll複製到~/.wine/drive_c/Windows/system32下,可以覆蓋。

請勿安裝1.1.42版本,在編輯區會沒有滑鼠游標,害我重裝了一整天也沒用......><",後來才知道是bug
後來裝了1.2-rc1版,又遇到一個bug,某些地方字型無法平滑化,目前無解,尚可執行就勉強用了。請看最後有解決了。

之後以下例的方式新增字型:
將/usr/share/fonts/中要新增字型檔案連結到~/.wine/drive_c/windows/Fonts
修改./wine/system.reg 全部替換成自己要的字型。

[Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes]
"Arial CE,238"="PMingLiU"
"Arial CYR,204"="PMingLiU"
"Arial Greek,161"="PMingLiU"
"Arial TUR,162"="PMingLiU"
"Courier New CE,238"="PMingLiU"
"Courier New CYR,204"="PMingLiU"
"Courier New Greek,161"="PMingLiU"
"Courier New TUR,162"="PMingLiU"
.....

修改視窗亂碼:
修改./wine/system.reg

[Software\\Microsoft\\Windows NT\\CurrentVersion\\FontLink\\SystemLink]
"Lucida Sans Unicode"="DroidSansFallback.ttf,Droid Sans Fallback"
"Microsoft Sans Serif"="DroidSansFallback.ttf,Droid Sans Fallback"
"PMingLiU"="DroidSansFallback.ttf,Droid Sans Fallback"
"SimSun"="DroidSansFallback.ttf,Droid Sans Fallback"
"Tahoma"="DroidSansFallback.ttf,Droid Sans Fallback"

字型平滑化:
修改./wine/user.reg

[Control Panel\\Desktop]
"DragFullWindows"="0"
"FontSmoothing"="2"
"FontSmoothingGamma"=dword:00000578
"FontSmoothingOrientation"=dword:00000001
"FontSmoothingType"=dword:00000002

[Software\\Wine\\X11 Driver]
"ClientSideAntiAliasWithCore"="Y"
"ClientSideAntiAliasWithRender"="Y"
"ClientSideWithCore"="Y"
"ClientSideWithRender"="Y"
"Managed"="Y"

執行畫面:

另外可考慮安裝Wine-doors來使用其他程式。

1.2-rc1版某些地方字型無法平滑化,最後跟據回報bug頁的解法是說不是wine的問題,可能是我裝在9.04上的關係吧。
新增一檔案~/font.conf,輸入以下內容就可以了。

<?xml version="1.0"?><!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="font" >
<edit mode="assign" name="rgba" >
<const>rgb</const>
</edit>
</match>
<match target="font" >
<edit mode="assign" name="hinting" >
<bool>true</bool>
</edit>
</match>
<match target="font" >
<edit mode="assign" name="hintstyle" >
<const>hintmedium</const>
</edit>
</match>
<match target="font" >
<edit mode="assign" name="antialias" >
<bool>true</bool>
</edit>
</match>
</fontconfig>

2010年5月5日 星期三

自訂Beagle搜尋rar、big5編碼txt

Beagle是很好用的桌面搜尋,預設是只搜尋使用者家目錄,且不會找隱藏資料夾裡的檔案。有些文件如.doc裡面的中文是搜尋不到的,英文可以。但.odt、.pdf中英文都可以。對我來說,主要還有以下缺點:
  • 但是如果是rar壓縮檔裡面的資料就找不到。
  • 搜尋中文時,以前是big5編碼的純文字內容就會找不到,我有不少以前的資料是用big5存的阿。
分享一下解決方法:
安裝完Beagle後,到/etc/beagle新增external-filters.xml加入資料如下:
<?xml version="1.0" encoding="utf-8"?>
<external-filters>
<filter>
  <mimetype>application/x-rar</mimetype>
  <extension>.rar</extension>
  <command>rar</command>
  <arguments>lb %s</arguments>
</filter>

<filter>
  <mimetype>text/plain</mimetype>
  <!--mimetype>application/gedit</mimetype-->
  <extension>.txt</extension>
  <command>iconv</command>
  <arguments>-f big5 -t utf-8 %s</arguments>
</filter>
</external-filters>
然後到console

beagle-config --beagled-reload-config

就可以了。
但是之前已經index過得檔案就不會重新index喔,所以當然還是找不到,把舊index刪除 ,重新index就可以了。

如果你不確定增加external-filters有沒有成功,可以試試以下指令來確認:
beagle-info --list-filters
會列出所有支援的filters,在這個例子應該出現;
FilterExternal - Version 10 (/usr/lib/beagle/Filters/Filters.dll)
  - MimeType: application/x-rar
  - Extension: .rar
  - MimeType: text/plain
  - Extension: .txt
要確認是不是指令下錯,可以使用:
beagle-extract-content --show-generated test.rar
beagle-extract-content --show-generated test.txt
來測試你要尋找有包含資料的檔案,如果他的輸出內容有包含你要搜尋的字串就對了。
.doc裡面的中文搜尋不到,目前不急用就先不解了。
參考:
http://www.linux.com/news/software/applications/254610:desktop-search-engines-compared
http://beagle-project.org/ExternalFiltersRepository#Rar_filter
http://osdir.com/ml/dashboard-hackers/2010-03/msg00006.html

2010年2月3日 星期三

在windows單機上使用rsync備份

首先至cwRsync下載安裝檔cwRsync_4.0.3_Installer.zip,只要單機用不需要安裝server版。
安裝完之後,並沒有將rsync所需環境參數設定進系統,而是寫在範例檔C:\Program Files\cwRsync\cwrsync.cmd。把指令寫在範例檔最後,直接執行即可。
rsync -av --delete /cygdrive/c/Temp/test/ /cygdrive/c/Temp/test2/ >>test
rsync -av --delete-after --exclude-from=rsync_exclude.txt /cygdrive/d/ /cygdrive/z/company/ >rsync3.log

rsync_exclude.txt內容範例
#System file
RECYCLER/
System Volume Information/
Thumbs.db

#no use data
not sync/
*.obj
*.pch
*.ncb
*.bsc
*.ilk
*.pdb

2009年12月7日 星期一

在 windows mobile 使用 log4net

我自己的步驟如下:

  1. 下載log4net解壓縮,複製bin\netcf裡dll檔案到專案。在專案加入 Reference: log4net.dll
  2. 設定log4net設定檔
    重要:
    1. Net CF的log4net設定檔不支援中文註解
    2. 一定要包含在<configuration>...</configuration>
  3. 引入using
    using log4net;
  4. 在程式一開始的地方去解析 log4net 的 configuration.
    log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("logconfig.xml"));
  5. 接著在你想要進行 log 的類別宣告這一個屬性.
    protected static readonly ILog log = LogManager.GetLogger(typeof( your_class_name ));
  6. 使用時Debug < Info < Warn < Error < Fatal
    log.Info( "your message here." );
  7. 可以利用 log4net.Repository.ILoggerRepository r = LogManager.GetRepository();去看 r.Configured 屬性,如果是 false,表示沒設定到。

不使用設定檔的方式,上述步驟略過2、5,在6之後加入以下設定程式



log4net.Appender.RollingFileAppender a = new log4net.Appender.RollingFileAppender();
a.Name = "RollingFileAppender";
a.File = "log.txt";
a.AppendToFile = true;
a.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Size;
a.MaxSizeRollBackups = 3;
a.MaximumFileSize = "1KB";
a.StaticLogFileName = true;
a.Layout = new log4net.Layout.PatternLayout(@"{%level}%date{MM/dd HH:mm:ss} - %message%newline");
a.ActivateOptions();
a.Threshold = log4net.Core.Level.Debug;
log4net.Config.BasicConfigurator.Configure(a);

Reference:
在 multi-thread 的環境當中使用 log4net
log4net (史帝芬心得筆記)
log4net-configuration-for-rockin-loggin-part-2

2009年12月2日 星期三

Windows Mobile 6.x Emulator 在 VirtualBox 的連線方式

我自己的步驟如下:

  1. 在Guest OS安裝MS Loopback 網卡 http://support.microsoft.com/kb/839013/
  2. 在Guest OS將Bind到Host網卡的那張網卡上啟用網路共用(Internet Connections Share,ICS)。此時在Guest OS中的MS Loopback網卡會自動連線,IP將會被強制設為192.168.0.1,Subnet mask為255.255.0.0
  3. 在Guest OS安裝Virtaul Machine Network Service安裝後請記得要重新開機。原下載已移除,可以安裝MS Virtual PC 2007,或找其他載點。
  4. 開啟WM6模擬器在工具列中的File>Configure..>network Enable NE2000 PCMCIA adapter and bind to :Microsoft Loopback adapter-Virtual Machine network service,Reset WM6。

  5. 再回到Start>Settings>Connections>Connections>Advanced>Select Networks>確認Programs that automatically connect to Internet 是設定為My Work Network。應該可以正常使用Mobile IE連上Internet了。

Reference:
Mobile 6.0 Emulator在Virtual PC 2007的連線問題

2009年11月27日 星期五

如何重調整VirtualBox系統硬碟大小

  1. 首先備份你的虛擬系統。
  2. 下載 gparted Live CD ISO
  3. 新增一個虛擬硬碟符合想要的大小,把她掛上要調整大小的系統。
  4. 掛上gparted iso檔。
  5. 以光碟開機後,選系統硬碟,右鍵copy,
  6. 在選擇新硬碟Device->Partition Table後,右鍵Paste,
  7. 把容量拉到最大,確定之後Apply,大概等個幾分鐘。
  8. 最後這個步驟一定要作才能開機喔,右鍵->Manage Flags,勾選Boot。
  9. 以上完成複製到新硬碟,在VirtualBox在新增系統硬碟選這個就行嘍。





Reference:
Re-sizing a VirtualBox Virtual Disk Image File