2014年2月27日 星期四

SC好用指令 - 更改BinPath和刪除Service


在「服務」這功能項裡面,有許多的Service元件,供許多的軟體的執行檔設定,我們可以更改它的路徑。在命令提示字元下,輸入下列的命令:

SC CONFIG 
MySQL(服務名稱) binPath= "C:\Server/MySQL/bin/mysqld"(執行路徑)
也可以刪除服務(Service),語法如下:

sc delete 
mysql(服務名稱)

-雲遊山水為知已、逍遙一生而忘齡- 電腦神手


2014年2月25日 星期二

MVC 5 for Visual Studio 2012 Add View & Controller menu options disappeared - 無法顯示 Add View 和 Controller選單

有使用Visual Studio 2012的話,有些開發者會透過Nuget來更新Microsoft.AspNet.Mvc 5的版本。但是會出現一個這樣有趣的狀況,如下圖:



原本Add的選單中,應該會出現的View和Controller,這時候都消失了,這是因為MVC5版本採用了Razor 3的引擎,Entity Framework Tools和Web Tools版本並沒有安裝新版來對應的原故。

必須要安裝下列選項:

ASP.NET and Web Tools 2013.1 for Visual Studio 2012
Entity Framework 6 Tools for Visual Studio 2012








如果上方連結無法下載的話,下面是MSDN的線上說明連結:
Announcing release of ASP.NET and Web Tools 2013.1 for Visual Studio 2012
ASP.NET and Web Tools 2013.1 for Visual Studio 2012

上面的元件安裝完成之後,應該就會看到View和Controller這兩個選項,如下圖:




-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2014年2月24日 星期一

Visual Studio 2012 自行偵錯

Visual Studio 2012本身有內建的指令,可以讓開發者自行處理當Visual Studio遇到的問題。可以在Visual Studio的啟動程式(devenv.exe,路徑在C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE)下參數,讓Visual Studio收集資訊,可以參考這些資訊理來判讀Visual Studio發生了什麼問題:

/Build
以指定的方案組態建置方案或專案。例如 "Debug",可用於多重平台,組態名稱必須以引號括住並包含平台名稱。例如: "Debug|Win32"。

/Clean
刪除組建輸出。

/Command
啟動 IDE 並執行命令。

/Deploy
建置並部署指定的組建組態。

/Edit
在這個應用程式正在執行的執行個體中開啟指定的檔案。如果沒有執行個體正在執行,則會以簡易視窗配置啟動新的執行個體。

/LCID
在 IDE 中設定 UI 的預設語言。

/Log
將 IDE 活動記錄至指定的檔案,以進行疑難排解。

/Out
附加建置記錄至指定的檔案。

/Project
指定要建置、清除或部署的專案。必須搭配Build、/Rebuild、/Clean 或 /Deploy 使用。

/ProjectConfig
覆寫方案組態中指定的專案組態。例如 "Debug"。如果可能用於多重平台,組態名稱必須以引號括住並包含平台名稱。例如:"Debug|Win32"。必須搭配 /Project 使用。

/Rebuild
清除後,再以指定的組態建置方案或專案。

/ResetAddin
移除與指定之增益集相關的命令和命令 UI。

/ResetSettings
還原 IDE 的預設值,選擇性的重設為指定的 VSSettings 檔。

/ResetSkipPkgs
清除所有加入至 VSPackages 的 SkipLoading 標記。

/Run
編譯並執行指定的方案。

/RunExit
編譯並執行指定的方案,然後關閉 IDE。

/SafeMode
在安全模式中啟動 IDE 並載入最少的視窗。

/Upgrade
升級專案,或升級方案以及其中的所有專案。將視需要建立這些檔案的備份。如需備份程序的詳細資訊,請參閱有關 [Visual Studio 轉換精靈] 的說明。

/debugexe
開啟要偵錯的指定可執行檔。此命令列的其餘部分會傳遞到這個可執行檔當做它的引數。

/diff
比較兩個檔案。接受四個參數:SourceFile、TargetFile、SourceDisplayName (選擇性)、TargetDisplayName (選擇性)

/TfsLink
開啟 Team Explorer 並為提供的成品 URI (如果已註冊)啟動檢視器。 /useenv使用 PATH、INCLUDE、LIBPATH 和 LIB 環境變數來代替 VC++ 建置的 IDE 路徑。


用devenv.exe /log的方式來產生的記錄檔,記錄檔的位置會在「C:\Users\(UserName)\AppData\Roaming\Microsoft\VisualStudio\11.0」下的ActivityLog.xml,記錄檔最上方有三個欄位「infos、warnings、errors」,最主要要注意errors,而且會使用紅色高亮度顯示來提醒。

若要從命令列附加偵錯工具,可使用下列指令:
VsJITDebugger.exe -p

下面的指令可以將Visual Studio回復至初始狀態:
devenv.exe /resetuserdata

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2014年2月22日 星期六

C# - Using JSON.NET Basic

JSON是一個基於JavaScript對資料列化的一個技術,一種輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。儘管JSON是Javascript的一個子集,但JSON是獨立於語言的文字格式,並且採用了類似於C語言家族的一些習慣。

C#對於JSON的處理,有非常方便的類別可以使用,筆者要介紹的是JavaScriptSerializer這一個類別。以下是基本的例子

首先定義一個字串變數,格式如同下面的例子:

string json = "[{Name:'John Simith',Age:35},{Name:'Pablo Perez',Age:34}]";

以下是定義一個Person的 class:

public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
}

開發者可以deserialize JSON 的String 成Array的結構:

JavaScriptSerializer js = new JavaScriptSerializer();

Person[] persons =  js.Deserialize<Person[]>(json);

下面是輸出的方式:

Console.WriteLine("Result: {0}\n", people[0].Name);


-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2014年2月21日 星期五

Visual Studio - Build Solution and Rebuild Solution - 建置專案與重建專案

用過Visual Studio產品的人,剛開始都會有一個不太懂的問題,就是在專案(Solution)上,會出現建置專案Build Solution和重建專案Rebuild Solution。很多人按下了之後,大部分感覺不出來這兩個的差異性。
筆者在這小小的分享這兩者的不同之處。

  • Build Solution建置專案 - 編譯時會事先檢查原始碼,如果有修改,則重新編譯,沒有修改的部份,則不需要重新編譯。
  • Rebuild Solution重建專案 - 不管是否有事先修改,專案下所有的程式碼,都會重新編譯。

所以,建置專案與重建專案的差別在於是否有檢查原始碼,在簡單的專案上,其實兩者差別不大,因為建置的時間不會太長,但是如果是專案很大的的話,Rebuild Solution建置上會消耗許多的時間;Build Solution只會編譯有修改的部分,使用上可能要特別注意。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2014年2月20日 星期四

SQL Server Management Studio - export csv - 將Query出來的結果匯出CSV檔

SQL Server Management Studio這套微軟的產品,有一個非常方便的功能。就是它可以將Query出來的結果,另存為CSV,方法很簡單,只要依下面的部驟即可:

1.按下New Query,將要語法輸入完後,下面的Results會出現結果。




2.在Results的結果視窗空白處按滑鼠右鍵,會出現選單,按下「Save Results As...」,會跳出要儲存電腦位置的視窗,它可以存成兩種格式,一種是CSV,另一種是TXT,一般是預設CSV。




3.開啟存放的路徑下自訂的CSV檔名,就可以看到匯出結果。




-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2014年2月19日 星期三

ASP.NET MVC4 驗證規則自行撰寫

資訊工程開發時,有一項非常重要的學問,就是資料驗證。因為資料在傳輸的過程中,難免會有有心人士的惡意動作,隨意的存取資科,這時候開發者就作出保護資料的演譯。早期的開發驗證技術都是開發者自行撰寫,不過現今的程式語言,強大如微軟,內建的函式庫都有非常豐富的驗證元件供開發者使用。不過開發者也能自行撰寫所需要的驗證程式,大部分會用的的技術,就是利用正則表示式來實作我們所需要的資料驗證,但是這樣的欄位一個或兩個都還覺得簡單,要修改也只需要修改那一兩個,但是如果這個驗證套用到多次,而且又有不同的類別檔的時候,做法就會有不一樣。

在專案上新增一個Login的Class檔案,繼承VlidationAttribute,這樣Login類別就有基本的驗證功能,範例如下:

public class Login : VlidationAttribute
{
    public override bool IsValid(object val)
    {
        if (val == nullreturn true;
        if (val is String)
            return Regex.IsMatch(val.ToString(), "^09[0-9]{8}");

        return true;
    }

}

在C#函式庫中,IsMatch本身就是bool的回傳值,所以利用直接回傳這個值,就可以表示是否已經通過驗證。這樣Server端就有基本的驗證,Client端要以JavaScript的方式來做驗證,因為可以減少伺服器因為大家存取造成擁塞的情形,另外也需要IClientValidatable介面來處理。繼承了這個介面後,要實作GetClientValidationRules。下面是實作範例

public IEpassword<ModelClientValidationRule> GetClientValidationRules(ModelMetadata meta, ControllerContext cont)
{
    ModelClientValidationRule Rule = new ModelClientValidationRule
    {
        //這個屬性的值必須要是小寫內容,否則會出錯
        ValidationType = "login",
        ErrorMessage = FormatErrorMessageFormatErrorMessage(meta.GetDisplayName())
    };
    Rule.ValidationParameters["input"] = "XXXXXX";
    yield return Rule;
}

public class Login : ValidationAttribute, IClientValidatable
{
        public override bool IsValid(object val)
        {
            if (val == null) return true;
            if (val is String)
                return Regex.IsMatch(val.ToString(), "^[A-Za-z0-9]+$");
            return true;
        }

        public IEpassword<ModelClientValidationRule>  GetClientValidationRules(ModelMetadata meta, ControllerContext cont)
        {
            ModelClientValidationRule Rule = new ModelClientValidationRule
            {
                ValidationType = "login",
                ErrorMessage = FormatErrorMessage(meta.GetDisplayName())
            };
            Rule.ValidationParameters["input"] = "XXXXXX";
            yield return Rule;
        }
}

之後需要放置一段JavaScript語法在前端做驗證,採用jquery.validate和jquery.validate.unobtrusive這2個函式庫,JavaScript的邏輯是複寫的IsValid這個Method中的C#語法轉換成JavaScript語法,最後將這段JavaScript語法再掛載到Client頁面上即可。

<script type="text/javascript">
 $.validator.addMethod("login", function (val, element, param) {
    if (value == false) return true;
    return (/^[A-Za-z0-9]+$/.test(val))
});
$.validator.unobtrusive.adapters.addSingleVal("login", "input");
</script>


-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2014年2月18日 星期二

C# - Postback生命週期

寫Web程式,不可缺乏的就是資料的傳送過程,最常採用的就是Get和Post這兩種方法。用微軟開發的技術,通常已經把一般寫Web會運用到的原理,透過元件封包,直接在底層處理好了。開發者只要透過reguest這個類別,就可以取得所有的傳送資訊。
網站運作的基本邏輯是:網頁對於伺服器而言是幾近於完全無保留狀態 (Stateless) 的, 所以網頁的每次重新載入 (Postback) 都和第一次載入時一樣; 你反正每次都要從伺服器端把整個網頁都重新傳過來一次。這是早期網頁的運作原理,不過現在的技術導人了Ajax的概念後,很多的技術就改善了這樣的重覆讀取頁面的過程。

因此, 在 PostBack 之後, 一般人認為還在看同一個網頁,但是整個網頁在背景中已經來回重新讀取傳送一遍。因為網頁底層結構運作,讓表單上原本輸入或變化的東西都還會存在,使用者完全看不出來這個網頁其實已經在背景中重新傳過一次了。所以當 Postback 程序完成, 使用者根本感覺不到網頁有重新讀取頁面的感覺, 因為輸入的文字還在、下拉式選單也停留在他上次選擇的項目, 甚至畫面也停留在他原來捲動的地方。


筆者就來介紹PostBack的觀念:

瀏覽器(Browser)會用Get方式向Server取得第一次載入的資料,此時Page屬性IsPostBack=false;然後執行Page_Load程式。之後當Browser觸發了一個按鈕Button後,不管這按扭元件的底下有沒有陳述句,ASP.net會Post的方式重新導向然後執行一次Server端程式碼,IsPostBack會變更為true。當使用者在瀏覽器(Browser)按下了一個按鈕,不管按鈕有沒有寫程式碼,程式預設會利用Post的方式重新導向再次執行一次Server端的程式碼。此時IsPostBack=true。

範例如下:

<asp:Button ID="mybtn" runat="server" Text="Button"/>

上面的ID就是開發者自訂的類別變數名,runat就是在server上執行編譯的過程,基本上只要是Asp.net表單元件,都會有Postback的功能,html控制項加了 type="submit" 也能達到Postback的功能。

範例如下:

<input type="submit" id="mysbt" value="button" />


不過大部分來說ASP.net預設具有Postback功能的就只有Button,其它的控制項若是要具有Postback功能只要將控制項屬性(Properies)上的AutoPostBack設為true即可。不過不是所有的的控制項(Controls)都有這樣的功能。

以下例子是如何自訂Postback Event,沒有postback功能的類別,就利用GetPostBackEventReference 方法設定Attributes[]:

protected void form_ItemDataBound(object sender, EventArgs e)
{
    Label3.Attributes["onclick"] = Page.ClientScript.GetPostBackEventReference(Label3, string.Empty);
}
private void Label3_OnClick()
{
    Label1.Text = DateTime.Now.ToString();
}


protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        Label1.Text = System.DateTime.Now.ToString();
    }
    else
    {
        Label1.Text = "";
    }
}

上面程式碼中,利用Page.IsPostBack判斷網頁是否是第一次執行,以便依判斷式來處理不同的情況。在ASP.net運作原理上, Page_Load() 事件的發生是很後面的,所以初學者在 Page_Load() 程序中才在頁面上動態加入控制項,卻在 Paeg.Load 事件之前就想存取這些控制項。理想上通常要避免動態加入控制項,增進讀取的效能。

初學者還會遇到的問題是 GridView/FormView 等容器的編輯樣板中。由於這些容器有很多事件 ,例如RowDataBound, RowCommand...等,透過Trace可以找到FindControl() 指令下面的結果。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2014年2月17日 星期一

T-SQL - Serial Number Renumber流水號重新編號

流水號在資料庫設計上是很常見的一個索引編排的模式之一,假如有一張Table 名為Books,id是流水號,sn是自行定義的序號。如果刪除一筆資料,要sn就要依群組總數從新編排):


假設一個情況是刪除一筆資料,之後sn就要依群組總數從新編排:



--將s1群組重新編號


declare @sn INT
select @sn = 0
UPDATE Books
SET @sn = @sn + 1,
     sn = @sn
WHERE category ='s1'
執行結果就會如下圖所示,sn依category的群性而重新編排:


-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2014年2月16日 星期日

新版的Windows8.1 update(KB2919355)更新失敗


201404月微軟又釋出了Windows8.1 update(KB2919355)的更新版本,不過在安裝時出現了無法安裝的狀況,筆者整理了一些大部分可以處理的,如有新的修正方式,會另行分享補上。

錯誤情況 - 0×80073712
Windows 更新錯誤 0×80073712 解決方法

方法 1:執行疑難排解員。然後,開啟 Windows Update,並再次嘗試安裝更新。
下載:http://go.microsoft.com/?LinkId=9830262

方法 2:執行 DISM 工具

1. 從螢幕右邊邊緣撥動進來,然後點選 [搜尋](如果使用滑鼠,請指向螢幕的右上角。將滑鼠指標往下移,然後按一下 [搜尋])

2. 在搜尋方塊中輸入命令提示字元。

3. 在搜尋結果清單中,往下撥動或在 [命令提示字元] 上按右鍵,然後點選或按一下 [以系統管理員身分執行]

4. [系統管理員:命令提示字元] 視窗中,輸入下列命令。在每個命令之後按下 ENTER 鍵:
·         DISM.exe /Online /Cleanup-image /Scanhealth
·         DISM.exe /Online /Cleanup-image /Restorehealth

5. 如果要關閉 [系統管理員:命令提示字元] 視窗,請輸入 Exit,然後按下 ENTER

6. 再次執行 Windows Update

其它的修正問題,可以從log檔去找出其它的問題狀況:

Windows圖示鍵+R開啟「執行」視窗,輸入wuapp。然後點擊左邊的查看更新歷史記錄,按兩下失敗的更新,查看是否有錯誤代碼,如果有的話可提供一下錯誤資訊給微軟。
也可以嘗試以下操作後更新:

一、重新命名SoftwareDistribution資料夾:

  1. Windows圖示鍵+R開啟「執行」視窗,輸入“services.msc”打開服務,在服務中禁用Windowspdate服務。
  2. 打開C:\Windows右鍵點擊SoftwareDistribution選擇重命名(例如可以重命名為SoftwareDistribution_old)
  3. 重命名完成後重新啟用Windows Update服務。

二、無痕的啟動方式,關閉所有的元件:

  1. Windows圖示鍵+R,輸入msconfig,顯示 [系統設定]
  2.  [系統設定]對話方塊中的服務選項上,點選隱藏所有 Microsoft 服務核取方塊,然後點選[全部停用](如果啟用了指紋識別功能,不要關閉相關服務)。
  3. [系統設定]對話方塊的啟動選項上,點選 [開啟工作管理員]
  4. 在工作管理員的啟動選項上,針對每個啟動項,選擇啟動項並按一下停用
  5. 關閉[工作管理員]
  6.  [系統設定]對話方塊的[啟動]選項上,按一下 [確定],然後重新開機。

以下是恢復為正常啟動的步驟:

  1. Windows圖示鍵,輸入msconfig,顯示 [系統設定]
  2.  [一般]選項上,點選 [正常啟動]選項。
  3. 點選  [服務]選項並清除隱藏所有 Microsoft 服務旁的核取方塊,然後點選[全部啟用]
  4. 接下來,點按或按一下啟動選項卡,然後點選 [開啟工作管理員]
  5. 在工作管理員中,啟用所有的啟動程式,然後點選 [確定]
  6. 重新開機電腦。

三、修復組件:

Windows圖示鍵+X,選擇命令提示字元(系統管理員),然後輸入以下指令(也可以使用右鍵的 [複製] & [貼上]):

  • dism/Online /Cleanup-Image /CheckHealth
  • dism/Online /Cleanup-Image /RestoreHealth

在重啟後更新到99%時發生錯誤,只提示更新失敗並回滾更新操作,未顯示錯誤代碼
此後使用Windows Update獨立安裝程式也出現了相同的問題
在更新歷史記錄查到的錯誤代碼為 800F0922

wuapp中查到的錯誤代碼為800F0922:

在第三步的dism/Online /Cleanup-Image /RestoreHealth出現錯誤0x800F0906
dism.loghttp://pan.baidu.com/share/link?shareid=46091135&uk=2919252844
此後運行wuapp更新總是在尋找修正時出現錯誤8024402F。

然後用獨立安裝程式Windows8.1-KB2919355-x64無法解決,在重啟後更新到99%時出錯回傳新的CBS.log

http://pan.baidu.com/share/link?shareid=65890717&uk=2919252844

根據描述,在檢查更新時出現錯誤,代碼為8024402F,可以參考以下方案:
1.運行Microsoft Fix It,連結:http://support.microsoft.com/fixit/zh-tw
  • 連結:http://go.microsoft.com/?LinkId=9830262
  • 如果出現錯誤,提供錯誤資訊到微軟。
2.關閉 Windows更新,等待 10 15 分鐘,然後再次運行 Windows 更新。

  • “Windows+R”輸入“services.msc”打開服務,在服務中禁用 Windowspdate 服務。
  • “Windows+R”輸入“services.msc”打開服務,在服務中禁用 Windows Update 服務。
-雲遊山水為知已逍遙一生而忘齡- 電腦神手