2007年7月28日 星期六

依法行政

最近看到一些blog 與討論,讓我對所謂的依法行政有更深一層的了解,而事件的起源是北投纜車(還不是最近被罵到爆的貓空纜車)。
什麼是依法行政? 北投纜車鑽法律漏洞不執行環評就是馬前市長的口頭禪:依法行政!

繼續閱讀 ....

2007年7月24日 星期二

懶叫又來了!

國民黨真是讓人想不透啊,我真的很懷疑他們的文宣是民進黨派去臥底的,而且一臥就是這麼多年。自從 2004 年選舉那場連戰被人笑掉大牙的懶叫頭網站撤了以後,沒想到過了好幾年,輪到馬英九時竟然又搞出令人匪夷所思的台灣九九網站,讓人從壯陽的久久神功一路聯想到瘋狗配
你以為就只有這樣嗎? 不! 懶叫頭沒了,不過懶叫又出來了! 他們又選了一個藍鳥(藍鵲)當 logo! 拜託來點新鮮的啦...

2007年7月22日 星期日

2012 年國民黨的正副總統人選

現在是 2007 年的七月,人人都知道 2008 年總統大選國民黨的正副總統參選人是誰(雖然有些人認為其簡稱有些不雅,念起來像肖告配),而民進黨的總統人選也已確定,副總統人選據說將在中秋節前決定。
但我現在要告訴大家,其實我連 2012 年國民黨會推的人選都知道了!

繼續閱讀 ....

2007年7月19日 星期四

黑心包子? 黑心新聞? 還是黑心政府?

上個星期中國北京爆發黑心包子事件,不肖業者竟然將瓦楞紙煮爛處理後與病死豬肉混合來當包子的內餡,消息一出果然嚇壞了不少人,不少國際媒體也引用這篇報導。
沒想到這兩天案情大逆轉,這件黑心包子的新聞竟然是北京電視台造假的! 原來是黑心新聞,而不是黑心包子啊!

但在這個什麼都能黑心、造假的國度,我不禁懷疑,也許黑心包子並非造假,後者才是造假的! 黑心包子的新聞被不少國際媒體引用,也許北京當局擔心黑心包子引響形像過大,因此乾脆找個替死鬼,宣稱其實跟本沒這回事!

到底真像是什麼? 我不知道,我想也沒人能回答我,畢竟面對這種國家與政府,天曉得什麼才是真的!

2007年7月17日 星期二

在 VC IDE 的 Find/Replace 使用 Regular Expression

最近公司說要儘量把 compiler warnning 減到最少,在清理 warning 的過程中,我發現有一堆 warning 是來自像底下這種 code:

#define PI 3.14159
DSPfract p = PI;

會出現 warning C4305: 'initializing' : truncation from 'double' to 'float'.

繼續閱讀 ....

2007年7月13日 星期五

Blog 搬家

之前決定要從 Yahoo MyBlog 搬回 Blogger 已經快四個月了,中間幾乎沒寫任何東西。今天決定卯起來把之前在 Yahoo 寫的一篇一篇貼來,反正也沒幾篇。花了點時間,終於搬完了,不過只搬跟程式有關的文章,其他廢話就不浪費力氣了。

Visual Studio text editor 的空白與 Tab 變成特殊符號

連續有兩個人問我,關於Visual Studio text editor 的空白與 Tab 變成特殊符號要怎麼改回來。所有的空白都變成一個點,而 Tab 則變成箭頭,看起來很不習慣,就像這樣:

int.main(int.argc,.char**.argv)
{
→if.(.argc.<.2.)
→→return.-1;
→return.0;
}

在 Tools->Options 找了半天卻找不到,後來在 MSDN forume 問人才得到答案,原來是在 Edit-Advanced->View White Space。而它的熱鍵是連按 Ctrl+R, Ctrl+W,讓有些人不小心誤觸才變成這樣的。

參考 http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1095029&SiteID=1

註:這篇是從 Yahoo Blog 搬過來的,原發文時間為 2007/01/23 14:26。

2007年7月12日 星期四

Cyclic dependency 造成的 memory leak issue

Cyclic dependency主要來自reference counted物件互相持有對方,導致無法順利將其指向所指向的物件解構。其實只需要一個reference counted物件即可說明此例,只要該物件持有自己即可,接下來以此為例說明。

繼續閱讀 ....

昇級到 Visual Studio 2005 Service Pack 1

雖然暫時還不會昇到 Service Pack 1, 不過還是把這篇存下來,到時候昇級時可以先看看人家的狀況,少碰點麻煩。

http://blogs.msdn.com/heaths/archive/2006/12/16/slipstreaming-visual-studio-2005-service-pack-1.aspx

註:這篇是從 Yahoo Blog 搬過來的,原發文時間為 2007/01/12 17:34。


functor 還是 boost 的好用 (續)

這篇寫 member function 的操作。例:

繼續閱讀 ....

functor 還是 boost 的好用

昨天看到有人貼了幾個 link, 比較 STL、Loki、Boost 的 functor,其中 Boost 的 functor 的評論大概還沒寫,所以沒看到(只有標題)

http://blog.csdn.net/hdqqq/archive/2006/01/25/588348.aspx
http://blog.csdn.net/hdqqq/archive/2006/02/07/593877.aspx

我認為跟本也不用考慮了,Boost 的 functor 以 Boost function + Boost bind 組合,彈性是最強大的。你可以把有 n 個參數的的 function 透過 bind 任意指定其中幾個而成為另一個 boost function(也就是 functor),甚至連順序都可以改變! 底下是一些簡單的範例:

繼續閱讀 ....

為何不要用 #define - 再加一個例子,這次兇手是微軟!

才剛寫完一篇為何不要用 #define 的實例,立刻又碰上另外一個。先來看個 example:

#include <windows.h>
int MyMax = std::numeric_limits ::max( );
一切看來很正常,compile 起來也很正常。但當你加入一行 #include 後,一切就毀了。這次的兇手是微軟,追蹤下去後,發現原因是在 ,有一行(應該說一堆)大家都知道的爛 macro:

#define max(a,b) (((a) > (b)) ? (a) : (b))



繼續閱讀 ....

為何不要用 #define

這兩天在拆 header file dependency 時(本公司的 coupling 情況很嚴重),碰到一個 compile error:

error C2632: 'char' followed by 'char' is illegal



繼續閱讀 ....

const 物件的初始化

昨天(2006/9/25, 這篇是搬過來的舊文) Orson 跟我抱怨,說某人 break build 的責任該算在我頭上,因為上星期我的教學課程叫大家多用 const, 可是某人用了 const 造成 g++ compile 不過.

trace 了一下發現他宣告了一個 const 物件而沒有初始化它,VC(不管VC6或VC8都一樣)卻只吐個 warning C4269 而已(跟我想的不一樣),而 g++ 則是出現 compile error.

今天早上來公司後,想到這件事,就決定查查看 SPEC 怎麼寫的。查了好一陣子,終於找到了:



繼續閱讀 ....

自己做個 ScopeGuard

試了 Loki 的 ScopeGuard 後,我覺得可以用 boost 來做到同樣的功能,就自己練習看看。我覺得 Loki 版的有兩點不太好用:

1. 針對 function 與 member function 需要用不同的呼叫(MakeGuard 與 MakeObjectGuard ).
2. 目前它使用的 functor 只接受到三個參數,不夠方便.

自己用 boost 試做,後來發現可以做的很簡單,不需要搞 ScopeGuard 繼承體系,也不需要用 MakeGuard 與 MakeObjectGuard 這類的 template function 來包裝。
原始碼如下:


繼續閱讀 ....

2007年7月11日 星期三

Incredibuild 在 console 模式 build project 的語法

雖然我通常都用 script 在 build,但有時用別人的電腦沒有現成的 script 就比較麻煩,所以還是把這些語法 blog 起來省的忘掉時還要再看 help(順便給其他同事看,免得常常要用 VC IDE 還境開那個有上百個 project 的 solution 檔).
語法:
BuildConsole <其他參數>
常用參數有:
指定 project 名稱:/prj=project name
(這個參數若不指定則會 build 所有的 project)
指定 configuration /cfg=configuration
Clean project 或 solution:/clean
Rebuild:/rebuild
例:
BuildConsole GpiProxy.sln /cfg="Debug|Win32"
BuildConsole GpiProxy.sln /prj="GpiProxy" /cfg="Debug|Win32"
BuildConsole LibCopp.vcproj /cfg="Debug|Win32"
BuildConsole LibCopp.vcproj /cfg="Debug|Win32" /rebuild

以上的 sln/vcpoj 檔都沒寫路徑,要用的時候記得自己要加上去,或是切到該目錄再輸入命令,像這樣:
BuildConsole D:\usr\P4\Shared\Components\GpiProxy\GpiProxy.sln /prj="GpiProxy" /cfg="Debug|Win32"

若不想用 Incredibuild 而想用 VC 的 console build,其實做法也差不多(Incredibuild 的語法要相容於 VC),只是執行檔從 BuildConsole 改成 DevEnv,詳情請參照 MSDN

關閉 VC 環境下的 assert 視窗

這個之前就提了好幾次了,只是每次跟同事提到時,都要重新找一下要怎麼做,乾脆寫在 blog 算了,blog 超久沒寫東西了。
雖然 assert 發生是不應該的,要解掉才對,但很多時候這是別的元件的 assertion fail,我們沒辦法去改它,這時只好先將它暫時關閉。
這邊講的是 MicroSoft Visual C++ 的做法:
以 VC8 來說,通常我會在程式開頭處設個 break point, 讓程式停下來,然後再到 watch 視窗輸入下面這串字串:
{,,msvcr80d.dll}_CrtSetReportMode(2,2)
成功的話會看到 Value = 4,Type 為 int,像這樣:










如果要把 assert 再打開的話就輸入:
{,,msvcr80d.dll}_CrtSetReportMode(2,6)

_CrtSetReportMode 還有很多其他功能,可以參考這邊