2008年12月30日 星期二

PowerGUI Script Editor

要寫 PowerShell 的 script 是一件痛苦的事,因為不像 c# 有 Visual Studio 的 IDE 開發環境支援。
因此, PowerGUI 誕生了。請參考這裡

2008年12月29日 星期一

Sql Server 改 Computer name

Sql Server 在安裝前,必須先設好 Computer name。如果安裝後才想改Computer name,就會有些問題。如果實在需要改 Computer name, 請參考

http://msdn.microsoft.com/en-us/library/ms143799.aspx

2008年12月21日 星期日

第一次使用 Crystal Report, 感覺很差

使用 Crystal Report, 真的是吃了不少苦頭。

        Crystal Report 的確有相當不少的優點。但也有不少的缺點。

  1. 對於開發人員不夠友善。例如想要全選/複製,就常常會碰釘子。小技巧:不要選到特殊的 image control,就可以多選。當多選時,找不到複製的編輯命令時,就代表有些 control 無法與別的 control 一起複製。
  2. 效能不佳。我想要使用 Crystal Report 輸出成 PDF,因為其輸出的 中文PDF 可以使用搜尋文字的功能,而Reporting Service 輸出的 中文PDF 卻不行。(20090217 見 http://msdn.microsoft.com/zh-tw/library/ms159713(SQL.90).aspx, 在 sql server 2005 sp3 已有 embbed font了,就可以搜尋)。但沒想到Crystal Report 輸出成 PDF 的效能卻奇差無比。每轉一張竟要 1.4 秒 (at Intel Core2 CPU 6300@1.86GHz, 3.00 GB Ram)
  3. 要license. Visual Studio 內附的是陽春版,只能同時 5 個 client存取。多了就會出 Exception. 不像 Reporting Service (Client, rdlc),是免費的。
  4. 買了開發版後,也有限制,PrintJobLimit 就是我碰的一例。
  5. 在開發機器裝了 Crystal Report 2008 後,可以開發了。但一旦重開機後,在 Visual Studio 2008 開啟報表,就會出現如圖一的嚴重錯誤。把整個 Visual Studio 弄掛掉。或者如圖二的錯誤訊息。圖二的錯誤訊息,相信寫 C++ 的人並不寞生,這是使用指標寫資料到memory,寫錯了長度造成的memory crash。
  6. 很秏資源。每產生一個 PDF 檔,伺服器Memory 就秏掉了2-3 MB,必須等到下一次的 Garbage Collection 時才會回收。在 C:\Windows\Temp 也需要產生 *.rpt 的暫存檔案。因為很秏資源,又無法改進,只好加入 PrintJobLimit 來限制出錢的客戶。雖然可以修改 registry 來修改限制的上限,那也只不過是倒果為因罷了。

我目前的建議:不要使用 Crystal Report,除非有特殊原因。因為感覺很差啦!

圖一:一打開就掛掉

image

圖二:有些則是

image

2008年12月18日 星期四

Print Job Limit 報表次數的限制

第一次使用 Crystal Report ,但在壓力測試時發生了問題。

在每經一段時間後,Web Server 就再也無法吃報表的需求了。

clip_image002

錯誤原因是:載入報表失敗

clip_image004

查到一個 resource http://blog.csdn.net/daisylh/archive/2006/12/12/1439312.aspx ,說明 ReportDocument 記得要 Close(), 所以我就改成如下的程式

      ReportDocument customerReport = new ReportDocument();
      customerReport.Load(reportFilePath);
      customerReport.SetDataSource(rs);
      ExportOptions exportOpts = new ExportOptions();
      PdfRtfWordFormatOptions pdfOpts = ExportOptions.CreatePdfRtfWordFormatOptions();
      exportOpts.ExportFormatType = ExportFormatType.PortableDocFormat;
      exportOpts.ExportFormatOptions = pdfOpts;
      response.Clear();
      response.Buffer = true;
      response.ContentType = "application/pdf";
      customerReport.ExportToHttpResponse(ExportFormatType.PortableDocFormat,
        response, false, "aaa.pdf");
      customerReport.Close();
      customerReport.Dispose();
可惜,沒有用。我發現 ExportToHttpResponse 執行完後,網頁就結束了。下面兩行的 Close() 與 Dispose() 是不會執行的。 改成如下的 using block,就可以了,
      using (ReportDocument customerReport = new ReportDocument()) {
      customerReport.Load(reportFilePath);
      customerReport.SetDataSource(rs);
      ExportOptions exportOpts = new ExportOptions();
      PdfRtfWordFormatOptions pdfOpts = ExportOptions.CreatePdfRtfWordFormatOptions();
      exportOpts.ExportFormatType = ExportFormatType.PortableDocFormat;
      exportOpts.ExportFormatOptions = pdfOpts;
      response.Clear();
      response.Buffer = true;
      response.ContentType = "application/pdf";
      customerReport.ExportToHttpResponse(ExportFormatType.PortableDocFormat,
        response, false, "aaa.pdf");
      }

2008年12月15日 星期一

Vista 的 Opened Program,有些程式無法執行

一直很困擾我的一件事。我的 Vista 的 Opened Program,有些程式無法執行。
例如 Office 等。

然而,不使用Opened Program 或 Pined Program 來執行,改以 All program/Microsoft Office/...來執行就可以。
這樣好難過。

為什麼呢?今天終於狠下心來,找到了答案。
答案很機車,竟是 Context Menu item 不對。

所謂的 Context Menu item 即右鍵的快速Menu。如果其上有不對的項目,就會發生許多怪異的現象。

我的例子,就是安裝過 Foxy, 然後移除。然而 Context Menu 並未移除掉。(bug?) (天之聲:誰叫你安裝惡名昭彰的 Foxy...)

之後,就一直這樣了。

要如何解這個問題呢?我使用了shexview , 然後將 Foxy 的項目 disable 就完成了。

image
我還以為中毒了呢!(天之聲:哪來這麼多毒)

Hyper-V MMC Snap-In

使用遠端桌面來操作 Hyper-V MMC Snap-In時,有個常見的問題。也就是使用 mouse 進入 guest 時,會發生 Mouse not captured in Remote Desktop session. 的警告,如下圖。

image

此時,按照說明來試著安裝 Integration service ,卻怎麼樣也行不通。看來是我的天份不足了。

不過, Virtual Server 2005 可使用 Internet Explorer 來模擬 Console,反而 Hyper-V不行?這說不通了。

原來,Hyper-V也有類似的功能,只不過不能使用 Internet Explorer 而已。

參考 Description of the Windows Vista Service Pack 1 Management Tools update for the release version of Hyper-V ,安裝後就可使用 Snap-In 來操作了。

2008年12月11日 星期四

整合 Windows Vista 和 Office 2007 的基礎學習園地

整合 Windows Vista 和 Office 2007 的基礎學習園地

為了讓一般使用者更加了解 Windows Vista 和 Office 2007 的使用方法,我們在技術支援網站上特地彙整來至 Windows Online, Office Online 以及 TechNet 網站上有用的 how-to 文章,線上學習視訊和網路廣播等豐富學習資訊,敬請善加利用。立刻體驗...


線上立即傳送技術問題
選取一項產品來檢視此產品可用的支援選項

線上檢視問題處理狀況
登入 Windows Live ID 後,您就可以線上檢視 已傳送的問題處理狀況

IIS 6 上的 FTP Site 如何設定使用者目錄

找了一會兒。原來預設沒有「使用者目錄」的功能。

如果要建立,必須參考這一篇 http://www.microsoft.com/taiwan/technet/community/columns/insider/iisi0606.mspx

2008年12月8日 星期一

System.Security.Cryptography.CryptographicException: Key not valid for use in specified state

今日測試時,在下列第二行一直發生System.Security.Cryptography.CryptographicException: Key not valid for use in specified state 的錯誤。中文訊息是「機碼用在特定狀態時無效」

RSACryptoServiceProvider provider = cert.PrivateKey as RSACryptoServiceProvider;

RSAParameters signPrivateKey = provider.ExportParameters(true);

沒看過耶!查了 Google 大神也是無效。
結果,重匯 pfx (即有私鑰的憑證) 就好了?

真是怪

今日證實,是程式寫錯了。
使用provider.ExportParameters(true),即將私鑰匯出,這是不對的。
我只需要將私鑰拿來簽章即可。
如下

      XmlDocument doc = new XmlDocument();
      doc.LoadXml(origXml);

      //匯入私鑰
      X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
      store.Open(OpenFlags.ReadOnly);
      X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindByThumbprint, certificateThumbPrint, true);
      if (certs.Count == 0)
        throw new CryptographicException("The certificate could not be found.");

      X509Certificate2 cert = certs[0];

      RSACryptoServiceProvider provider = cert.PrivateKey as RSACryptoServiceProvider;

      SignedXml signXml = new SignedXml(doc);
      signXml.SigningKey = provider;

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 就顯示特別好用囉!

Share with Facebook