在 Windwos 8 移除 Windows Live ID 綁定同步

在 Windows 8 下很多 App 都會要求登入 Windows Live ID (WLID) 帳號,進而同步資訊讓使用者能夠更快的結合各項所需的資訊。

版本:Windows 8 Consumer Preview

在 Windows 8 登入 WLID

在這邊說的登入並不是在設定的地方綁定關聯帳號,而是當用 Local Account 登入的時候,進入到需要 WLID 的 App 例如說 Mail,Calendar,Messaging,People 再登入的時候就會要求 WLID

image

詭異的是假設說當你在 Mail 下登入的時候,這時候 Calendar , Messaging ,People 都會同時同步帳號資訊,只是想收個 mail 結果連好友狀態行事曆 MSN 訊息通通下來了,同步的時候也沒有看到選項可以選擇。如果對 Windows 8 比較熟的人可能會說,那有什麼奇怪的,這四個 App 明明就是同一個只是用 Secondary Tile 讓你以為是四個 App。

一旦登入帳號資訊就全部 App 都可以用

利用 Metro App 的 Setting 這邊幾乎都可以看到帳號資訊,但是並沒有辦法將他移除,Setting 裡面確實是有移除功能的,可是移除功能針對的是第二組以上加入的帳號,他會一直保留住第一組帳號資訊。

image

如果是第二組以上的帳號,在帳號上面右鍵就可以出現 Delete 的選項可以移除,但是第一組帳號不會有這個選項。

image

不只有 Mail,Calendar,Messaging,People 這個 App ,例如說進到 Store 也可以看到這個已經在登入狀態了

image

也就是說現在全部的 App 都有帳號的權限,也可以同步最新的訊息,而 Windows 8 居然連儲存我的密碼勾選都沒有出現就默默幫你做掉這些事。

移除被綁定的 Windows Live ID (WLID)

直接從查詢進到

Control Panel > User Account And Family Safety > Credential Manager

image

這邊可以看到,第一次登入的帳號密碼都已經被 Windows 8 儲存下來了,而在 Metro App 環境也找不到相對應的移除功能。這邊再推出正式版本的時候應該會有再修正的動作,不然在 Metro App 下無法移除的話在平板只有 Metro App 介面就沒辦法做操作了。

觀察特定 IIS Application Pool 使用資源

其實是一個很常見的小技巧,不過不常用有的時候還是會忘記,在 IIS 下我們可能會執行多個 process 來處理多個 web Site ,那假如說今天某一個 Site 狀況不穩定的時候,怎麼用系統管理員觀察特定的 Site 。

image

在系統管理員中看到的都是 w3wp 的 process 這代表著一個個的 Application pool ,所以如果有多個 Web Site 共用 App Pool 就沒有辦法在這邊看出使用情況了,但是在系統管理員中的都是顯示 w3wp 雖然我們知道說這是代表 App Pool 的使用,可是並不知道說哪個對應到哪個 App Pool 。

系統管理員選擇顯示欄位

從顯示 > 選擇欄位,可以看到如下的畫面,在勾選 PID process Id 可以顯示出每一支 process 的 id,再利用這個欄位來做 App Pool 的對應。

image

IIS App Pool 顯示 PID (IIS6)

找到 process id 的對應之後接下來就是要顯示每支 App Pool 執行的 PID 這樣就可以找到每支 App Pool 使用的 CPU 還有記憶體資源。利用 IisApp.vbs 這一支內建的程式可以取得 App Pool PID。

image

這樣就可以跟系統管理員顯示的 w3wp.exe 做對應。

IIS App Pool 顯示 PID (IIS7)

如果是 IIS7 的話則是使用 appcmd list wp 來顯示對應的 PID

image

ASP.NET MVC Customize Base View

在寫 ASP.NET MVC 的時候,我幾乎都會讓 Controller 繼承一個自訂的 BaseController ,在某些情況下會方便不少,像是登入帳號共用 Session 或是一些其他共用的功能跟頁面驗證都可以利用繼承來大量設定。不過在跟 View 整合的時候就會在一頁一頁去用 ViewBag 或是 ViewData 傳參數,有時候很多 View 都會同時用到一樣的 ViewBag 或是 ViewData 。 其實在 ASP.NET MVC 也有 Base View 這種東西。

建立 Base View

Razor View 預設都會繼承 System.Web.Mvc.WebViewPage ,所以原理也是一樣,只要自訂一個類別先繼承 System.Web.Mvc.WebViewPage ,再讓 View 來繼承 Base 類別,就達到了在之間抽離一層來實作一些共用的方法。

public abstract class BaseViewPage<T> : 
System.Web.Mvc.WebViewPage<T>
{
...
}

在這邊必須要繼承 System.Web.Mvc.WebViewPage<T>  泛型的類別就是強型別的類別,加入一個判斷登入語系的 ViewBag ,這個 ViewBag 在 Base Controller 就會判斷完成,所以每一個頁面都會需要用到。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace BaseViewTest.Views
{
public abstract class BaseViewPage<T> :
System.Web.Mvc.WebViewPage<T>
{

public string Language
{
get
{
return ViewBag.Lang;
}
}

public override void Execute()
{

}
}
}

在 MVC 4 之後 System.Web.Mvc.WebViewPage<T> 必須要實作 Execute() 方法。

讓 View 繼承 Base View

建立完 Base View 之後就是要讓其他 View 繼承這個 Class ,這個就需要在 Web.Config 中設定,我是設定在 View 資料夾下的 Web.Config (不是最外層喔)

<pages pageBaseType="BaseViewTest.Views.BaseViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>

在最外層的 Web.Config 也有 <Page pageBaseType> 標籤可以做屬性設定,不過一樣在內層也必須要再設定一次。

直接使用 Base View

接下來如果是需要使用到寫在 Base View 裡面的方法或屬性的時候就只要直接呼叫好了

@Language

SQL Server 利用交易紀錄拯救資料

今天出了一個大包,大概是從寫程式以來最大的問題了。

查詢備份檔案

要利用交易紀錄拯救資料,首先必須要有一個完整的備份 bak ,再來需要有從完整備份開始的不中斷交易紀錄,這樣就可以利用來拯救交易紀錄期間所有資料庫異動。

SELECT 
a.[database_name] as '資料庫名稱',
f.physical_device_name as '備份位置',
CASE a.[type]
WHEN 'D' THEN N'資料庫'
WHEN 'I' THEN N'差異資料庫'
WHEN 'L' THEN N'紀錄'
WHEN 'F' THEN N'檔案或檔案群組'
WHEN 'G' THEN N'差異檔案'
WHEN 'P' THEN N'部分'
WHEN 'Q' THEN N'差異部分'
ELSE N'NULL'
END as '備份類型',
a.[name] as '備份組的名稱',
a.[first_lsn] as '備份組中第一個或最舊的記錄序號',
a.[last_lsn] as '備份組之後下一個記錄的記錄序號',
a.[database_backup_lsn] as '最近的完整資料庫備份之記錄序號',
a.[differential_base_lsn] as '差異備份的基底 LSN',
a.[backup_finish_date] as '備份作業完成的日期和時間',
a.[backup_size] as '備份組的大小 (以位元組為單位)'

FROM
msdb.dbo.backupmediafamily f
INNER JOIN msdb..backupset a ON f.media_set_id = f.media_set_id
INNER JOIN master..sysdatabases b ON
a.database_name COLLATE DATABASE_DEFAULT =
b.name COLLATE DATABASE_DEFAULT
where
a.database_name = 'DatabaseName'
ORDER BY
a.database_name, a.backup_finish_date

在結果之中會顯示每一次備份的紀錄,還有記錄到的紀錄序號,紀錄序號一定要連續不中斷的,一中斷只能說事情大條了。

還原資料庫

接下來我們利用 bak 以及  trn 檔案來還原資料庫,先還原 bak 的完整備份

image

image

先別急著按下確定,這時候我們點下指令碼,把介面替你做掉的 T-SQL 撈出來看看,應該會類似下面這段。

RESTORE DATABASE [Test20120401] 
FROM DISK = N'C:2012_20120309.bak' WITH FILE = 1,
MOVE N'test2012' TO N'C:Program FilesMicrosoft SQL ServerMSSQL10_50.MSSQLSERVERMSSQLDATATest20120401.mdf',
MOVE N'test2012_log' TO N'C:Program FilesMicrosoft SQL ServerMSSQL10_50.MSSQLSERVERMSSQLDATATest20120401_1.ldf',
NORECOVERY, NOUNLOAD, STATS = 10
GO

接下來還原 trn 的部分
image
選擇至某個時間點一樣點下指令碼,接下來讓兩段指令碼合併

RESTORE DATABASE [Test2012] 
FROM DISK = N'C:2012_20120309.bak' WITH FILE = 1,
MOVE N'test2012' TO N'C:Program FilesMicrosoft SQL ServerMSSQL10_50.MSSQLSERVERMSSQLDATATest20120401.mdf',
MOVE N'test2012_log' TO N'C:Program FilesMicrosoft SQL ServerMSSQL10_50.MSSQLSERVERMSSQLDATATest20120401_1.ldf',
NORECOVERY, NOUNLOAD, STATS = 10
GO
RESTORE LOG [Test2012]
FROM DISK = N'C:2012_20120309120405_190000_2012_TRN.trn' WITH FILE = 1,
NORECOVERY, NOUNLOAD, STATS = 10,
STOPAT = N'2012-04-03T22:40:00'
GO

藉由這種方式,我們可以更改變數還有還原時間點還原出不同時間點的資料庫

image

比較資料庫差異性

再來就是利用工具比較還原的資料庫,我們就可以找到每一段區間中間的變動,新增或是刪除的資料列。在這邊我用的工具是 Visual Studio 的 Data Compare

Data > Data Compare > New Data Comparison

image

在這邊的可以選擇來源資料庫跟比較資料庫,Only in Source 或是 Only in Target 也可以單純過濾說被刪除/被新增的資料,選擇完比較的兩邊之後就可以直接開始比較的動作。

image

可以看到我這邊指定了 Only in Source ,各有兩個 Table 少了 20 跟 42 筆資料,點到那一個 Table 的時候下方就會列出差異性的資料,或是選擇上方 Export To Editor 可以匯出將資料塞回 Table 的 T-SQL

image

總結

當然系統安安穩穩的不需要做還原最好,但是誰也不知道哪一天會出大災難,這次的事件真的是學了一次教訓。