2011年1月28日 星期五

WPF 學習:自動更新

WPF 的應用程式如何自動更新呢?照目前微軟的建議,會使用ClickOnce 的方式來部署。之後,程式就可以照ClickOnce的方式來更新了。

以下是簡單的範例。

範例

xaml

<Window x:Class="AutoUpdate.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Name="panel">
        <TextBlock Text="V1" />
        </StackPanel>
    </Grid>
</Window>

code

using System.Deployment.Application;
using System.Windows;
using System.Windows.Controls;

namespace AutoUpdate
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            AutoUpdateIt();
        }

        private void AutoUpdateIt()
        {
            if (ApplicationDeployment.IsNetworkDeployed)
            {
                var ad = ApplicationDeployment.CurrentDeployment;
                var info = ad.CheckForDetailedUpdate();
                if (info.UpdateAvailable)
                {
                    UpdateApp();
                    DisplayRestartMessage();
                }
            }
        }

        private void UpdateApp()
        {
            ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
            ad.Update();
        }

        private void DisplayRestartMessage()
        {
            var newText = new TextBlock { Text = "程式已經更新。請重新啟動程式" };
            panel.Children.Add(newText);

            var button = new Button() { Content = "Restart" };
            button.Click += (sender, e) => Restart(sender, null);
            panel.Children.Add(button);
        }

        private void Restart(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.Application.Restart();
            Application.Current.Shutdown();
        }
    }
}

程式非常簡單。當程式運作時,發現了有新的版本,就自動下載並更新。更新完後,顯示訊息並讓使用者按「Restart」鍵重新啟動程式。

SNAGHTMLf15e48

範例程式下載

2011年1月27日 星期四

使用SQL Azure 心得

緣由

前天參加了微軟 PDW 的產品發表會,心知微軟的 SQL Server 產品真的是愈來愈強大了。

發表會中又再次提到了SQL Azure 資料庫。心想,不使用一下真的不太行。真的狠下心了,照著小朱的方法,註冊了一個帳號,花個小錢來試用一下。

過程

除了註冊這一回事是比較囉嗦之外,在使用 SQL Azure 真的是極其簡單。直接使用 SSMS (SQL Server Management Studio) 來管理資料庫就可以了。

但是,我的目的仍在於試用。看看SQL Azure雲端資料庫與一般的SQL Server使用上到底有什麼不同處?

差異

其實在 General Guidelines and Limitations (SQL Azure Database) 中已經提到了。但資料實在太多,還是只有親自使用一下才能了解真正的差異。

無法備份/還原

雲端資料庫不需要備份/還原,因為這樣的常見的資料庫管理工作已經不需要專責DBA來執行。當我們寫一份資料到SQL Azure,其實最後會儲存到三個地方。SQL Azure 在同一個資料中心(Data Center)會有兩份一模一樣的資料,當Server A掛掉時,Server B 立即取代。在另一個資料中心(不同的地理位置)還會備份一份資料,做為異地備援。換句話說,真正達到 High Availibility(高可用性)。

可是我已經習慣使用備份/還原的方式來作業了。這一點真的是很不習慣。可能是我之前習慣不好。

沒有 SQL Server Agent 的 Jobs 可用

我們也常用 SQL Server Agent 的 Job 來排程作業,執行常見的 SQL script。這一點也無法在 SQL Azure被設定了。

不能使用 SQL Profiler

sql script 的效能不好?我當然會使用SQL Profiler 看一指令執行的效能資訊。然而,SQL Profiler 無法在 SQL Azure 上執行。

謎之聲:當雲端資料庫的校能不好時,要用什麼工具看效能狀況啊?

不能使用 sp_configure

之前在 SQL Server 的管理經驗,在SQL Azure 可能都不管用了。DBA 常用的 sp_configure,在 SQL Azure 上是不被接受的。

好處

很棒,執行效能與自行建置的SQL Server 幾乎沒兩樣。除了 SSMS 管理時效能似乎慢了一些,但在AP 在執行SQL 指令時的效能似乎沒有任何差別,只看當時的網路狀況。

(待持續整理)

2011年1月24日 星期一

Agile 的開發流程已經是主流了

下表是 2009 年Forrester Research 的報告。

值得注意的是,採用CMMI的開發流程其實很少,只佔2.5%。Agile 的比例佔 35%,其中大部份都採用 Scrum (10.9%)

http://www.ca.com/files/IndustryAnalystReports/agile_development_mainstream_232616.pdf

clip_image002

2011年1月19日 星期三

ASP.NET 發生錯誤: 要解密的資料長度無效

緣由

最近更新客戶的網頁伺服器時,在事件檢件器中發現了下面的錯誤

Type : System.ApplicationException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : 發生錯誤: 要解密的資料長度無效。

由於該網站有建置Web Farm以符合 NLB(Network Load Balance),另外一個網頁伺服器雖然沒有看到這個錯誤,但有另一個看來詭異的錯誤

Type : System.ApplicationException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : 發生錯誤: 這是無效的 webresource 要求。
Query String: d=xA7L75UVc2mKUixrFtavoQ2&t=633722850937794608
Cookie: __utma=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
__utmz=xxxxxxxxxxxxxxxxxxxxxxxx.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
ASP.NET_SessionId=4lflv055rekkuqierw02csa1

毀了,完全看不懂!

原因

找了老半天,這是因為 MS10-070 的因素,我要求客戶上 windows update。而客戶的環境通常只開放一些 IP才可以連入,通常是維護性質的IP。並且,微軟的Windows Update 網站竟然也沒有開放!

windows update幫我們檢視哪些update 需要上,我們只需要按照指示安裝即可。沒有windows update 工具的輔助,該上的更新自然容易沒上了。

MS10-070 如果在Web Farm 的環境下,需要每個加入 Web Farm 的伺服器都要上這些 update,並且每一個都要試著上上看。如下圖,在Windows Server 2003 Service Pack 2 中,如果有安裝 .NET Framework 2.0 SP2,就需要安裝 KB2418241。如果有安裝 NET Framework 3.50 SP1,就要安裝 KB2416473。如果上述兩個.NET 版本都有安裝,則對應的兩個update都要安裝。

image

我的Case,是Web Farm 中這些伺服器安裝這些更新未上齊,而且每個伺服器上的更新還不一致,導致asp.net 的 viewstate需要 check ViewStateMAC (見EnableViewStateMAC)時,發生解密的錯誤。

解決方法

  • 使用Windows Update,將需要上的更新一次上完。這是最佳建議。
  • MS10-070 所顯示的符合Windows 版本,可能需要更的新Update 一次下載回來。每一個都裝裝看。需要的更新自然就會安裝進去,不需要的更新也不會讓我們更新(如下圖)。

image

2011年1月16日 星期日

使用 IIS Express

上一篇介紹 IIS Express 後,這一次談如何使用。

安裝

Internet Information Services (IIS) 7.5 Express 下載後執行。安裝過程完全是「下一步」「是」「完成」的過程,其間沒有任何輸入選項。或者到 Web Platform Installer 來安裝 這個連結

自行啟動 IIS Express

預設的狀況下,是要自行修改 IIS Express 設定及啟動 IIS Express 的。以下就介紹如何在 Visual Studio 2010 上使用 IIS Express。

  • 首先,建立一個 Web Application,並且命名為 WebApplication1。接著,修改 WebApplication1 的 Property,在 “Use Custom Web Server” 中設定為 http://localhost:12345/

image

  • 再來,以notepad 打開 %USERPROFILE%\My Documents\IISExpress\config\applicationhost.config,修改configuration\system.applicationHost\sites 如下
<sites>
    <site name="WebSite1" id="1" > <!-- serverAutoStart="true" -->
        <application path="/">
            <virtualDirectory path="/" physicalPath="%IIS_SITES_HOME%\WebSite1" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation=":8080:localhost" />
        </bindings>
    </site>
    <site name="WebApplication1" id="2">
        <application path="/" applicationPool="Clr4IntegratedAppPool">
            <virtualDirectory path="/" physicalPath="C:\Users\bc\Documents\visual studio 2010\Projects\WebApplication1\WebApplication1" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation=":12345:localhost" />
        </bindings>
    </site>
    ...

我主要增加了一個新的 site,name 為 WebApplication1。id=2,請不要重複即可。在 physicalPath 中,請填入上一步 Visual Studio 所建立的 web Application 的應用程式目錄。bindngInformation 則彷校範例 WebSite1的樣子,修改為 :12345:localhost,意思是使用  localhost 的12345 port

而我將 第一個 Site name=”WebSite1” 的 serverAutoStart 移除掉了。因為我不想一啟動 IISExpress 就會啟動這個WebSite1範例。

  • 最後,按Win+R鍵或在 cmd 中執行下面指令以啟動 IISExpress
"C:\Program Files\IIS Express\IISExpress.exe" site:WebApplication1

執行結果如下圖

image

在Windows 右下方也會出現圖示。在圖示上按右鍵可以查詢執行。

image

當然,我們就可以執行 http://localhost:12345/

image

 

整合Visual Studio 2010 開發環境

上述的設定過程是不是很麻煩呢?是的,可是沒辦法。我們必須等到 Visual Studio 2010 SP1之後,才能享到直接在開發環境中整合設定的好處。使用 Visual Studio 2010 SP1 Beta 時,會多出一個「use IIS Express」的選項,如下畫面。

image

在未使用 IIS Express 的 Web 專案,也會多出一個 Use IIS Express 在快顯選單上。

image

結論

我還是等到 Visual Studio 2010 SP1 好了。這樣比較簡單。但對於其他如  VS 2005, VS2008 等使用者,只好說聲 Sorry,乖乖地自行啟動 IIS Express 吧!

2011年1月15日 星期六

介紹 IIS Express

開發 ASP.NET 的應用程式是我的主要工作。當然我會選擇最適合的開發環境。客戶多屬於企業用戶,我的開發的選擇,多半是 ASP.NET Web Application + SQL Server + IIS。

在內部 Demo 開發技術時,則會偶而使用 Web Development Server 來示範。然而在許多專案上,仍然看到選用 Web Development Server 來開發企業用的程式,雖然知道不妥,也常常宣導,但在 Visual Studio 預設使用 Web Development Server 的狀況,實在無法防止誤用的情形。

以下就探討一下 IIS 7,Web Development Server,及2010/01/13 推出的 IIS Express

使用 IIS

所有的 ASP.NET 應用程式,無論是 WebSite,WebForm,還是最新的 MVC,最終需要部署到 IIS 上。我認為開發環境最好直接使用 IIS,避免開發環境與正式環境差異太大,開發人員與維運人員的認知才會趨於一致。

優點

  • 與正式環境趨於一致。尤其在權限設定差異最為常見。

缺點

  • 設定繁複,且不同版本的 IIS會有不同的設定方式。例如 IIS5, 5.1, 6, 7, 7.5。隨著IIS不同版本,設定的位置,介面,帳號都有極大的不同。
  • 在 Vista 或 Windows 7 上,由於UAC 的限制,需要以管理員權限執行 Visual Studio 才能開發。
  • Windows Home 版本無法安裝 IIS。尤其學生或 SOHO 人員常常經費不多,無法學習或開發簡易的程式。
  • 在 Windows XP 上,只能使用 IIS 5.1。此時如果想要在 XP 上開發 IIS 7 的 ASP.NET 程式就很難了。

想要讓開發人員對不同 IIS 版本都有一定程度的了解,幾乎是不可能的事了。開發人員只能儘快地開發出需求對應的功能,對於如何部署一事,大部份都不太在意。

ASP.NET Web Development Server 的缺點

為了克服 Visual Studio 使用 IIS 的困難,微軟開發了 ASP.NET Web Development Server 這個工具。

優點

  • 簡化開發環境。開發人員不必安裝 IIS。這一點,也克服了 Windows Home 版本無法安裝 IIS 的問題。

缺點

  • 一個應用程式一個 Port。無法使用虛擬目錄。也不適用 Single Sign On 的開發。
  • 不支援 HTTPS
  • 無法使用自訂的驗證方式 ,IPrincipalIIdentity
  • 只能給開發機使用
  • 與 IIS 相比,啟動時間長
  • 直接使用與開發人員所使用的帳號作為執行 security context,而開發人員所登入的帳號常常又是管理員,造成與部署 到IIS的真實狀況 (IUser, network Service, w3wp 等)差異甚大。
  • 無法模擬asp。如果您的程式有 asp 的網頁,就不適用 Web Development Server。
  • 與 IIS 7 上的 http handler, http module 執行方式不同。見 http://charlesbc.blogspot.com/2009/11/aspnet-file-does-not-exist.html 
  • etc.

由於 Web Development Sever 的設計先天上就與真實 IIS 的執行大異其趣,許多怪異的行為層出不窮。我非常不建議使用 Web Development Server 來執行軟體開發專案。

IIS Express

由於 UAC, IIS 7 等後來的技術演變,原先設計的 Web Development Server 早已不符合需求了。微軟也體認到了這一點,於是在2010 年中開始著手開發下一個繼任的版本,也就是 IIS Express 7.5。

優點

  1. 使用 IIS 7 同一個 Kernel。因此行為與 IIS 大致相同。例如可以模定 https,http modules 與 http handlers 也與 IIS 7 的執行結果一致。
  2. 使用與開發人員相同的 security context,因此不受 UAC 的限制。

IIS Express 同時包含了 IIS 與 Web Development Server 的優點。這也是我推薦的原因。

缺點

  1. 還是使用了開發人員的 security context。開發人員容易誤以為程式的執行結果都是對的,卻不知道其實是有許多前題(即安全設定)。

由於 IIS Express 才 release 沒多久,還無法知道有哪些實際的缺點。這個缺點的清單或許會愈列愈多吧。

參考

2011年1月12日 星期三

為 Team Foundation Server 的 Team Project 加上Portal

在建立 Team Project 時,忘了勾選「建立網站」的選項,以致於後來專案都沒有網站可以用。怎麼辦?

此時,可以使用 Team Foundation Server Power Tool 的功能為我們完成任務。

tfpt addprojectportal /collection:http://tfsserver:8080/tfs/DefaultCollection /teamproject:YourTeamProject /processtemplate:"MSF for Agile Software Development v5.0"

2011年1月9日 星期日

Google Search 的進階語法

Google Search的基本語法後,現在說一些進階的語法。這些語法有些不太常用,看看就好。

找檔案 filetype:

當要找特殊檔案時,就需要以 filetype:<ext> 當作指示 hint。例如

mcpd 2010 filetype:pdf
會找出所有含有 mcpd 2010 相關的 pdf 檔案

image

這樣的結果也會包含文章中含有 pdf 檔的連結。如上圖最下方。

找 Url inurl 及 allinurl

上例中 pdf 的內容中(URL)未必含有指定的關鍵字,因為文章內有符合的關鍵字即可。要限定Url 含有關鍵字時,則適合使用 inurl

inurl:mcpd 2010 filetype:pdf

可以找出連結含有 mpcd 或 2010 相關的 pdf 檔。
如果PDF中必須包含所有關鍵字呢?用下面的語法
allinurl:mcpd 2010 filetype:pdf

其他類似用法

intitle:mcpd 2010 filetype:doc 找Title 中含有 mcpd 或2010 的Word 文件
allintitle:mcpd 2010 filetype:doc 找Title 中含有 mcpd 且有2010 的Word 文件
intext:mcpd 2010 只搜尋本文中含有 mcpd 且有2010 的 文章
link:www.bankpro.com.tw 有連結到  www.bankpro.com.tw 的連結
related:www.bankpro.com.tw www.bankpro.com.tw 相關的網站

site:charlesbc.blogspot.com ajax

只搜尋 charlesbc.blogspot.com 內關於  ajax 的文章
cache:charlesbc.blogspot.com 檢視 charlesbc.blog.com 的 cache 版本

2011年1月7日 星期五

Google Search 的基本語法

大家一定都有在 Google 上搜尋過資料吧!Google 的確在搜尋上下過功夫,到目前為止,相同的 key word,Google 的搜尋結果還是比Bing 讓我滿意許多,尤其是搜尋結果的第一筆。

我是知識工作者, 會看我這篇文章的人大部份都是吧!如何快速的搜尋到我們想要的資料,也是我們工作效率的一部份哦!

以下列出搜尋的基本語法

單字搜尋

就是輸入一個英文字句 (Word)。例如 Linq。

Linq

搜尋結果如下

image

多字搜尋

當連續輸入多個字句時,代表 And 的搜尋。例如

ASP.NET WebForm MVC

代表我要搜尋資料內有提到 ASP.NET ,且有 WebForm,且有 MVC 的文章。

image

Or 搜尋

有時我們想要 ASP.NET WebForm 或 ASP.NET MVC 的文章,其他的就不要了。就要下

asp.net (webform or mvc)

or 也可以精簡為 |

asp.net (webform | mvc)
image

排除其他結果搜尋

如果我們只對 ASP.NET MVC 有興趣,但不要看到 ASP.NET WebForm 的文章時,只下 ASP.NET MVC 還是會出現 ASP.NET WebForm 的文章。

image

此時,我們要明確地使用 (-) 來排除 WebForm 的搜尋

ASP.NET MVC -WebForm

搜尋結果如下。所有關於 WebForm 的資料就被排除了

image

完整字句搜尋

有時我們需要完整字句搜尋,找出含有某字句「一字不差」且順序一致的文章。例如

"asp.net mvc vs WebForm"
結果如下

image

該結果不包含 “asp.net webForm vs mvc” 的結果,因為順序不對。

連續密技

將上面的語法混合著用,可以達到更佳的效果。例如,我要找「ASP.NET 中,jQuery 如何使用 ajax 的方法呼叫 Web Service,但不要 asp.net mvc」的文章。

"ASP.NET" "jQuery ajax" "web Service" -"ASP.NET MVC"

結果如下

image

不完整字句搜尋

完整字句搜尋是很方便,但太過嚴格有時很難找到想要的文章。以下面為例, 只會找出”jquery ajax web Service”的完整字句,中間一個字也多不得。

"ASP.NET" "jQuery ajax web Service" -"ASP.NET MVC"

但 “jQuery ajax call web Service”,”jQuery ajax consume web Service “就找不到了。
image
其實,只要加上 * 代表 jQuery ajax 與 web Service 中可以含有不定字數的字句。如下
"ASP.NET" "jQuery ajax * web Service" -"ASP.NET MVC"

結果就包含了jquery ajax call web service can´t pass parameters,jquery ajax call custom web service ,JQuery AJAX调用WEB SERVICE 等文章

image

2011年1月1日 星期六

SQL Server Log 檔案太大了!

昨天去上課。晚上下課一回來,同事就抱怨系統太慢了。

今天早上剛好是民國100年元旦,就來公司檢查有無百年蟲問題吧。順便 Check 一下系統太慢的問題。

一檢查,SQL Server 磁碟沒空間了。當下就知道為什麼慢了。

當務之急,就是將超大的資料庫  log 檔備份並 shink。

SQL Server 2005

以前在 SQL Server 2005 指令會這樣下
use master
go

--備份目前的 log 
backup log DatabaseName to disk='c:\db.log' WITH NOFORMAT
--將 log 清除
BACKUP LOG DatabaseName WITH TRUNCATE_ONLY


--找到 DatabaseNameLog 的值
use DatabaseName
go
select name from sys.database_files
where type_desc = 'log'

--縮減 log file 到 1MB
DBCC SHRINKFILE(DatabaseNameLog, 1)

SQL Server 2008

到了 SQL Server 2008,Trancate_only 的指令正式被取消了。由於資料庫的復原模式為簡單的情形下是不記錄所有的 log資料的。我們可以利用這一點清除 log 資料。因此,替代的方法,是將資料庫的復原模式先換成簡單模式,再調整為完整。指令如下

use master
go

--備份目前的 log 
backup log DatabaseName to disk='c:\db.log' WITH NOFORMAT
--將資料庫復原模式切換到簡單模式
ALTER DATABASE DatabaseName SET RECOVERY SIMPLE WITH NO_WAIT
 

--找到 DatabaseNameLog 的值
use DatabaseName
go
select name from sys.database_files
where type_desc = 'log'

--縮減 log file 到 1MB
DBCC SHRINKFILE(DatabaseNameLog, 1)


--將資料庫復原模式切換到完整模式
USE [master]
GO
ALTER DATABASE [DatabaseName] SET RECOVERY FULL WITH NO_WAIT

Share with Facebook