2008年2月16日 星期六

程式員四大忌

iThome 看到的,原文是 JavaResearch 的文章:

1. 輕易言敗,沒有自信

2. 浮華不實,自滿自大

3. 死氣沉沉,不求甚解

4. 強調客觀,忽略自身

2008年2月15日 星期五

用 Visual Studio 2005 開發俱 UAC 機制軟體

Microsoft 在 Windows Vista 中新增了一個重要的安全機制,就是 User Account Control (UAC),也就是軟體在執行會用到受保護的資源時,會跳出一個對話方塊詢問是否執行,確定後就會以 Administrator 身份來執行程式,雖然麻煩了一點,不過也帶來可靠的安全性,然而在 Visual Studio 2005 中要怎麼使用這個機制呢?

1. 首先,開啟專案屬性的頁面, 在安全性這個分頁中,將 "啟用 ClickOnce 安全性設定" 勾選,然後在方案總管中就會出現一個名為 app.manifest 的檔案

2. 編輯 app.manifes,在 <security> 與 </security> 中,加入以下項目:
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>

其中 level 的值可以是:

asInvoker:不要求權限,使用 parent process 的權限。
highestAvailable:要求 parent process 的最高權限。
requireAdministrator:要求 Administrator 權限。

3. 存檔後重新編譯,產生的執行檔就俱有 UAC 機制了。

2008年2月9日 星期六

[Note] PHP6 去除的功能

這篇也是從 RunPC 上看來的,因為 PHP4 已停止維護 (請見...),有考慮要升級到 PHP6 的網管人員們可別太衝動,因為 PHP6 移除了一些東西,在升級之前可能要先測試一下原本的 Code 能不能在 PHP6 中運作,以下為移除的項目:

1. register_globals
這大概是最嚴重的,原本只要把 register_globals 設成 On,就可以很自由地存取全域變數,無論它是從何而來,而現在取消了這項功能,程式員必須很清楚地指明變數的來源,雖然會帶來很多麻煩,卻帶來了安全。

2. register_long_array 與 $HTTP_*_VARS
取消了  register_long_array 的設定,並連帶取消 $HTTP_GET_VARS 及 $HTTP_POST_VARS 變數。

3. Magic Quotes
原本若開啟 magic quotes,則系統會幫你的特殊字元加上 '\' ,不過這是在過去為了處理中文字需要的,PHP6 已全面使用 unicode,自然就不需要 Magic Quotes

4. safe_mode
取消 Safe Mode,必免讓程式員誤解它的功能。

[Note] String 與 StringBuilder 之效能

.NET Framework SDK 中提供了另一種特別的 String 類別,其名為 StringBuilder,當你有大量字串要"連接"起來時,可以使用 StringBuilder 來提昇效能,因為如果你宣告一個 String 變數並給它值,日後要改變值的話,就要放棄原本的那塊記憶體,而再配置一塊新的記憶體來存放新值,如果改變值的動作很頻繁則會大大地降低效能,而 StringBuilder 就是用來解決這個問題。

這期的 RunPC 做了個實驗來比較兩者的差異,一開始原作者分別使用 String 與 StringBuilder 來連接大量的靜態子字串如下,結果效能居然是 String 較佳,而差異大概有十倍,這是怎麼回事呢。原因在於我們連結接是靜態的字串,Compiler 在 編譯時期就會幫他們做最佳化,而連接在一起,所以 String 的 Case 等於什麼都做,當然比 StringBuilder 快很多,接著我們改成動態字串 (Run Time 才決定的字串),效能比較就如我們預期,由 StringBuilder 獲勝。

因此,在你決定用 String 或 StringBuilder 時,最好先考慮一下字串被"決定"的 時機,在 Compile Time 或是 Run Time 呢?
public string ConnectStrings_string( )
{
string tmp = "" ;

tmp += "11111111111111111111111111111111111111111111111111111111111"  ;

tmp += "2222222222222222222222222222222222222222222222222222"   ;

tmp += "3333333333333333333333333333333333333333333333333333"  ;

// 中間略

tmp += "100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100"  ;

return tmp ;

}

public string ConnectStrings_stringbuilder( )
{
StringBuilder tmp = "" ;

tmp.Append( "11111111111111111111111111111111111111111111111111111111111"  );

tmp.Append( "2222222222222222222222222222222222222222222222222222"  ) ;

tmp.Append( "3333333333333333333333333333333333333333333333333333"  );

// 中間略

tmp.Append( "100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100" ) ;

return tmp.ToString( ) ;

}