2008年11月30日 星期日

VS2010: Quick Search 的小工具

在以往,要在 Visual Studio 中找資料,是相當方便的事,前提是你要輸入正確的字串。
但有時,程式碼一多,隨著時間飛逝,記憶也跟著「揮發」掉了。
只剩下片斷的資訊了。

因此,Quick Find 這類必須輸入正確資訊的搜尋工具就不夠用了。

在VS2010,多了一個 Quick Search 的搜尋工具。
以鍵盤輸入 「Ctrl + ,   」,就會出現如下的視窗。

輸入 win後,所有符合的結果就會被列舉出來。

image

更好用的是,當輸入 or ch 後,可以找到 Order....Change 之類的結果。

image

結論是:搜尋更方便了,我的記憶可以放多一點在與家人相處的時光。

2008年11月27日 星期四

The RSA key container could not be opened

使用設定檔加密時,竟然出現錯誤

System.Configuration.ConfigurationErrorsException: Failed to decrypt using provider 'RsaProtectedConfigurationProvider'. Error message from the provider: The RSA key container could not be opened. (C:\MyApp.config line 141) ---> System.Configuration.ConfigurationErrorsException: The RSA key container could not be opened.

 

找了好久,原因竟出現在:使用者不同人。

但,我在 Vista 上,明明是同一個 user 啊?為何會失敗呢?

原來,在Visual Studio 上,我執行的身份是 run as administrator,而以檔案總管點擊兩下執行的身份則不是 administrator,因此解密失敗了。

此同時證明了在 Vista 上,有無 run as administrator 的差異大了。

2008年11月24日 星期一

Suggested Performance Counters to Watch (IIS 6.0)

客戶有交代一個需求

希望能撰寫類似 watch dog 功能的監看程式

安裝在每一台Web主機上

當發現IIS運作異常時,

自動Reset或Restart IIS

我目前是以網頁吐出為判斷依據

但希望能加強預警機制

藉進一步觀查某些指標 (ex: cpu, memory...etc)

來判斷IIS是否快當了...

問題是,要判斷那些指標;

或者是可以觀察那些行為

來達定預警的目的。

 

要看什麼東西呢?原來微軟早已有了答案。see Suggested Performance Counters to Watch (IIS 6.0)

VSTS Load Test 出現 urs.asmx

在使用Visual Studio 2008 錄製 Web test 時,竟出現 https://urs.microsoft.com/urs.asmx 這樣的怪 web request

 

image

原來是 IE7 的 phishing filter 功能所致。將該功能關閉即可。

image

2008年11月23日 星期日

遠端桌面

使用遠端桌面時,可直接輸入 mstsc 即可,不必點選一堆的 menu.

再來,如果不想使用新的 session,而是使用 console 登入,可使用 mstsc /v:172.16.1.2 /console

其中 172.16.1.2 是遠端電腦的 ip 啦

VS2008 Error: To prevent possible data loss before loading the designer, the following errors must be resolved

開發 Windows Form 時,竟然發生如下的錯誤。這是要檢視 Form 的designer 時發生的。

image

看一下程式碼,發現了一個事情。為了程式運作,我在該程式的 code behind 加上了一個類別,並且加在 Form 的上面。
換句話說,該程式碼的第一個類別不是 Form。

image

將TmpStruct 移到該段程式的最下方就好了。

原來 window form 的 team 為了方便,一定會把第一個 class 當作 Form

VS2010 的 Web 部署方式

新版的Web application 部署方式將有重大的變化。

新的方式是會建置一個 package,裡面包含 zip file, cmd file, 及配置的 xml file。

將這三個檔案,以 usb disk copy 到 target server 上,執行 cmd 檔即安裝完畢。

包含 config, iis setting, certificates, com, ... etc

可以做到 on click depoyment

 

image

2008年11月22日 星期六

crystal report 部署

asp.net 的程式,部署後失敗了。畫面如下

image

原因是沒有安裝 Crystal Report

在開發機器上(有安裝 Visual Studio 2008),在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5 可以找到安裝的程式。

2008年11月19日 星期三

Java 以 DES 加密,C# 解密

工作上,別的系統以java 實作,但我們的系統仍以 dotnet 實作。問題來了,需要加解密。試了幾次,答案如下。

import javax.crypto.*;
import javax.crypto.spec.*;

public class TestMain {
public static void main(String[] args) throws Exception
{
byte[] rgbIV = {(byte)11, (byte)12,(byte)13,(byte)14,
(byte)15,(byte)16,(byte)17,(byte)18};

byte[] rgbKey = {(byte)21, (byte)22,(byte)23,(byte)24,
(byte)25,(byte)26,(byte)27,(byte)28};

byte[] encrypedBytes = desEncrypt("AB123456", rgbKey, rgbIV );
String encrypedString = new sun.misc.BASE64Encoder().encode(encrypedBytes);
System.out.println(encrypedString);
}


public static byte[] desEncrypt(String message, byte[] rgbKey, byte[] rgbIV) throws Exception {
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(rgbKey);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(rgbIV);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
return cipher.doFinal(message.getBytes("UTF-8"));
}
}

加密後的字串為 uv0cplrvtQ9KnRXKKd+MuQ==


使用 c# 來解密。當然需要使用同一把key



using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApplication13
{
class Program
{
static void Main(string[] args)
{
byte[] rgbIV = {(byte)11, (byte)12,(byte)13,(byte)14,
(byte)15,(byte)16,(byte)17,(byte)18};

byte[] rgbKey = {(byte)21, (byte)22,(byte)23,(byte)24,
(byte)25,(byte)26,(byte)27,(byte)28};

string reslut = DecryptString("uv0cplrvtQ9KnRXKKd+MuQ==", rgbIV, rgbKey);
Console.WriteLine(reslut);
}


///
/// DES解密字符串
///

/// 待解密的字符串
/// 解密密鑰,要求為8位,和加密密鑰相同
/// 解密成功返回解密後的字符串
public static string DecryptString(string cipherText, byte[] rgbIV, byte[] rgbKey)
{
byte[] inputByteArray = Convert.FromBase64String(cipherText);
DESCryptoServiceProvider dcsp = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dcsp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
}
}

最近這裡寫的比我更詳細,請參考

2008年11月12日 星期三

Framework Design(2) : Property

Property 一般用來封裝 private member field。

  1. Property  應該愈簡單愈好,且不該 throw exception
  2. Property 不該與其他 Property 相關。設定一個 Property 時不該影響到其他的 Property
  3. Property 可以以任意順序來設定

Property 與 Method 有一定的相似度。何時應該用 Method 呢?

  1. 代表一種轉換時。例如 .ToString()
  2. 使用 Property 會導致 side effect 時
  3. 須要較長時間運算時
  4. 回傳陣列時
舉例來說,下面範例是不好的程式碼。因為會讓 calling method 誤認為 Roles 這個 property 取得的成本很低。

 public class User
  {
    public Role[] Roles
    {
      get { return roles_from_database; }
    }
  }

  //calling method
    User user = new User();
    for (int i = 0; i < user.Roles.Length; i++)
    {
      Role role = user.Roles[i];
      //more
    }
此時應改成 method, 就不會讓人誤會了
 public class User
  {
    public Role[] GetRoles()
    {
      get { return roles_from_database; }
    }
  }

  //calling method
    User user = new User();
    Role[] userRoles = user.GetRoles();
    for (int i = 0; i < userRoles .Length; i++)
    {
      Role role = userRoles[i];
      //more
    }

Framework Design(2) : Property

Property 一般用來封裝 private member field。

  1. Property  應該愈簡單愈好,且不該 throw exception
  2. Property 不該與其他 Property 相關。設定一個 Property 時不該影響到其他的 Property
  3. Property 可以以任意順序來設定

Property 與 Method 有一定的相似度。何時應該用 Method 呢?

  1. 代表一種轉換時。例如 .ToString()
  2. 使用 Property 會導致 side effect 時
  3. 須要較長時間運算時
  4. 回傳陣列時

Framework Design(1) : 建構子應該只傳參數

Constructors are lazy

建構子應該只傳參數。不要在建構時就做了一堆的事。下面的code 就不好。

  public class XmlFile
  {
    string data;
    public XmlFile(string filename)
    {
      data = File.ReadAllText(filename);
    }
  }

該改成下面的事即可

  public class XmlFile
  {
    string filename;
    public XmlFile(string filename)
    {
      this.filename = filename;
    }

    public void DoWork()
    {
      string data = File.ReadAllText(filename);
      //do more
    }

2008年11月10日 星期一

Html snippet

在 VS2005  時,已經有許多的 c# snippets 了。這次又增加了 html snippets.

image

按下兩次 tab 鍵後,就可以長出如下的 script tag 了。真的人性化許多

image

試試看吧。有許多的驚喜哦!

image

2008年11月7日 星期五

SQL 2005 重要效能計數物件(Performance Counter)及建議值

Object

Counter

Preferred Value

Description

Memory

Available Mbytes

> 100MB

 

Paging File

%Usage

< 70%

 

Process (sqlservr)

%Privileged Time

< 30% of %Processor Time (sqlservr)

 

Processor

%Privileged Time

< 30% of Total %Processor Time

 

PhysicalDisk

Avg. Disk Sec/Read

< 8ms

 

PhysicalDisk

Avg. Disk sec/Write

< 8ms (non cached) < 1ms (cached)

 

SQLServer:Access Methods

Forwarded Records/sec

< 10 per 100 Batch Requests/Sec

 

SQLServer:Access Methods

FreeSpace Scans/sec

<10 per 100 Batch Requests/Sec

 

SQLServer:Access Methods

Full Scans / sec

(Index Searches/sec)/(Full Scans/sec) > 1000

 

SQLServer:Access Methods

Page splits / sec compare with batch requests/sec  

SQLServer:Access Methods

Workfiles Created/Sec

< 20 per 100 Batch Requests/Sec

 

SQLServer:Access Methods

Worktables Created/Sec

< 20 per 100 Batch Requests/Sec

 

SQL Server:Buffer Manager

Buffer Cache hit ratio

> 90% , OLTP system 應大於 97%

Checkpoint pages/sec, Lay writes/sec, Page life expectancy

 

SQL Server:Buffer Manager

Checkpoint pages/sec

Page written do disk during the checkpoint process, free up SQL Server cache
Number of pages flushed to disk per second by a checkpoint or ther operation that required all dirty pages to be flushed
當下列情況發生時,代表 Memory pressure

High Checkpoint pages/sec

High lzay writes/sec

low page life expectancy (<300 seconds)
 

SQL Server:Buffer Manager

Free list stalls/sec

< 2

 

SQL Server:Buffer Manager

Lazy Writes/Sec

< 20

 

SQL Server:Buffer Manager

Page Life Expectancy
Time in seconds the data pages, on average, stay in SQL cache

> 300
小於300時,代表

  • Memory pressure
  • Memory constraints
  • Code SQL Server cache
  • Missing indexes, or poor query plans
 

SQLServer:Buffer Manager

Page lookups/sec

(Page lookups/sec) / (Batch Requests/sec) < 100

Number of requests to find a page in the buffer pool. When the ratio of page lookups to batch requests is much greater than 100, this is an indication that while query plans are looking up data in the buffer pool, these plans are inefficient. Identify queries with the highest amount of logical I/O's and tune them.

SQL Server:Locks

Lock Requests/sec

(Lock Request/sec)/(Batch Requests/sec) < 500

 

SQLServer:SQL Statistics

SQL Compilations/sec

< 10% of the number of Batch Requests/Sec

 

SQLServer:SQL Statistics

SQL Re-Compilations/sec

< 10% of the number of SQL Compilations

 

參考

https://blogs.msdn.com/jchiou/archive/2007/11/21/sql-2005-performance-counter.aspx

http://www.grumpyolddba.co.uk/monitoring/Performance%20Counter%20Guidance%20-%20SQL%20Server.htm

2008年11月5日 星期三

Enumerable.Range

在寫測試時,常常需要產生整數陣列的資料。之前都是這樣寫的

	int[] ints = new int[5];
     	for (int i = 0; i < 5; i++)
	    ints[i] = i;
現在發現,這樣寫比較快。不過必須是.net 3.5
	int[] ints = System.Linq.Enumerable.Range(1, 5).ToArray();

2008年11月4日 星期二

dynamic

以往在 c#3.0 ,使用 anonomous type時,有個嚴重的限制。那就是不能離開該 scope 如下

class Program
  {
    static void Main(string[] args)
    {
      var q = new { Name = "Charles", Id = 1 };
      Console.WriteLine("Name = {0}, Id = {1}", q.Name, q.Id);
    }
  }
q 是一個 anonomous type, 無法離開 Main 的範圍。因此無法將 q 的結果以下面的方式表示,因為會出現 compile time 錯誤。System.Object 沒有 Name 及 Id 的屬性。
class Program
  {
    static void Main(string[] args)
    {
      var q = new { Name = "Charles", Id = 1 };
      DoWriteMessage(q);
    }

    private static void DoWriteMessage(object q)
    {
      Console.WriteLine("Name = {0}, Id = {1}", q.Name, q.Id);
    }
  }
然而,使用 C#4.0 的 dynamic 就完成了
class Program
  {
    static void Main(string[] args)
    {
      var q = new { Name = "Charles", Id = 1 };
      DoWriteMessage(q);
    }

    private static void DoWriteMessage(dynamic o)
    {
      Console.WriteLine("Name = {0}, Id = {1}", o.Name, o.Id);
    }
  }

dynamic 說明了 o 在 compile time 是什麼型別不重要,一切等到 runtime 再說。到了 runtime 時,取出 o 的Name 及 Id 屬性。

必須注意到,o 在 coding 時完全無法使用 intellisense,畢竟它是 dynamic 啊!

2008年11月3日 星期一

C#4.0 三個重點

Declarative Programming

Concurrency

Dynamic

Enterprise Library 4.1 發佈

Enterprise Library 4.1 發佈
可到此處下載

2008年11月2日 星期日

C# 4.0: Optional parameter

抄自 VB的。看來還是許多人要求這樣的功能。

class Program
    {
        static void Main(string[] args)
        {
            M(5);
            M(10, 13);
	    M(y: 13, x: 10);  //named parameters,有點像 T-SQL 的 stored procdure
        }

        static void M(int x, int y = 7)
        {
            Console.WriteLine("x = {0}, y = {1}", x, y);
        }
    }

當參數一多時,named parameters 就顯示特別好用囉!

Visual Studio 2010 and .NET Framework 4.0 CTP download link

正式地來說,應該download here, 可惜該網頁的 download mamanger.

 

應急地,只好直接以 http 下載了。
下載後,需要帳號及密碼,請看 Q7

2008年11月1日 星期六

Windows 7 的 UAC

Windows Vista 的 UAC,一直是我所喜愛的功能,雖然它會不斷的跳出對話框來打斷我。但為了防毒,心干情願矣。
但看來很多人仍習慣 XP以前的超大權限,一點也不怕病毒。(我在氣勢上就輸了)

Windows 7 的UAC則多增加了設定。有四個層級可設定彈跳視窗

  1. 永達詢問。詢問時等待使用者的回應,此時其他程式的視窗全部不見了。此相當於 Vista 的預設值。
  2. 當程式或使用者修改設定時,但不會停止其他程式的運作。也就是說仍然可以操作其他的程式。
  3. 使用者修改設定時,不會受到中斷。但程式要修改Windows 設定時,才會中斷並詢問使用者。此為 Windows 7 的預設值。
  4. 永不詢問。此相當於XP以前的設定。

個人喜好的問題,還是1,也就是最嚴格的設定。
3 則是微軟最大的讓步了呢。此當作預設值果然是符合行銷的手法。

如果您選4,那就代表您真的很有勇氣了。

 

image

Share with Facebook