Windows Azure 帳號申請流程

image

開始申請 Windows Azure 帳號

在這邊可以明顯看到免費的範圍是什麼,要注意的是在建立的時候他也需要一組手機號碼以及信用卡,也明確的說明了免費就是 90天而已。如果只是要測試玩玩而已的要非常小心,等收到信用卡帳單的時候通常已經是第二個月了。

image

確認帳號

在這邊需要需入手機號碼,他會用簡訊送來一組密碼之後再輸入在頁面上,要確認你的手機是有效的才有辦法通過這個步驟。

image

輸入信用卡資訊

必填資訊一目瞭然,信用卡看來是躲也躲不過了。

*這邊輸入完信用卡之後,我收到銀行的簡訊通知扣款 40 元,理應是會再退款回來,目的是確認信用卡是可正常扣款的。

image

完成帳號註冊

三個步驟都跑完的話就建立完帳號了,也會收到相關的 mail 說明了收費範圍。

image

image

利用 WebMatrix 2 RC + VS 2012 RC 的 iphone / ipod 模擬器

在 Web Matrix 2 RC 裡面有附加了新加入的功能 iphone / ipod 模擬器。

安裝 Web Matrix 2 RC

直接從 WebPI 下載,或是到官網 http://www.microsoft.com/web/webmatrix/next/

image

WebMatrix Run > Add new

啟動 WebMatrix 之後開啟現有網站或是建立新的網站

image

安裝想要的模擬器

在 Extension Gallery 可以看到目前有三款模擬器可以選擇,iPhone / iPod / WindowsPhone7

image

安裝完之後啟動就可以看到用模擬器執行的網站,這個是用 ASP.NET MVC 4 建立的行動版網站範本。不過啟動之後基本上它就是一個獨立的瀏覽器,可以用來開啟任何網路上的網站,模擬器上右鍵選單也有一些相關的設定可以調整,不過比較可惜的是沒有看到版本的選項 iOS4.3 / Safari ,iOS5 / Safari 之類的,而且因為他是單純的瀏覽器也沒辦法模擬 iOS5 / Opera 。

image

在 VS2012 直接啟動模擬器

VS2012 原有的瀏覽器選擇器新增,程式位置位於 C:UsersYOUAppDataLocalMicrosoft WebMatrixExtensions20RC iPhoneSimulator ElectricMobileSim ElectricMobileSim.exe ,如果是 iPhone 的話引數帶入 “1” , iPod 帶入 “2”

image

參考來源

Simulating an iPhone or iPad browser for ASP.NET Mobile Web Development with WebMatrix 2 or Visual Studio 2012

Metro Style App (7) – 使用 Windows App Certification Kit 基本檢測開發的 Metro App

在開發完 Metro App  之後,微軟也提供了基本的檢測工具對 App 做初步的檢測,這份工具檢測的項目也非常的基本,檢測的項目也不多,一般來說都可以正常通過。在這邊檢測的部分只是程式能不能正確運作而已,但是如果沒有辦法通過的話應該也沒有通過發佈上 App Store 的檢測。

微軟官方介紹

Windows App Certification Kit 白皮書

Windows SDK 下載

Windows App Cert App 是 Windows SDK for Windows 8 Consumer Preview 的其中一項功能,安裝完他並不會顯示在 Metro App 開始列或是傳統桌面上,可以利用 Metro App 的搜尋功能來啟動程式。啟動程式之後 選擇 Validate Metro Style App 會列出機器上全部的 Metro Style App ,有的時候這邊會遇到程式沒有列在上面的情況,是一個已知的 bug ,最後會提到要怎麼做。

image

選擇到想要檢測的 App 之後就可以開始檢測了,大約會執行五到十分鐘,途中也會開啟 App 數次,而且最後會停留在 Metro 的頁面,所以看不到檢測的進度條,反正看他好像沒在動作就可以看看是不是完成了。如果完成的話就會出現要存檔的畫面,這邊存檔的檔案就是結果的 Xml 檔。

image

用 IE 開啟結果的 XML 檔案,裡面會列出通過或是不通過跟警告的部分,主要都是直接關於程式的部分,如果要上架的話 Metro App 還有很多設計方面的規範都不會在這邊檢測到,像下面檢測到的問題是啟動的速度太慢了,為了達到 Metro Style App fast and fluid 的效果,所以有限制啟動時間不能太久。

image

如果在清單中找不到要檢測的 Metro Style App

  1. 必須先啟動 powershell 執行 Get-AppxPackage > out.txt
  2. 在 out.txt 中可以看到全部的 Metro Style App ,在 txt 找到 InstallLocation 這個欄位是空的 App
  3. 用 Remove-AppxPackage <packageFullName> 將這個 App 移除掉 ,再回到 App 清單應該就可以正常顯示 list 了

image


Wack don’t see my app neither from gui, nor command line, nor from visual studio create package dialog

Metro Style 最真實的數位體驗

桌面隱喻 Desktop metaphor

在提到最真實的數位體驗之前,要先題什麼是桌面隱喻。一直以來數位內容其實都被設計為現實生活的延伸,包含我們操作以及理解的方式。

145812-bumptopfull3ddesktop_586

將桌面設計為類似於真正的桌面,文件就長得像放在桌子上的文件,資料夾也像常用的資料夾,一切的一切都是在數位的裝置上,依然保留原本的桌面體驗。就像是象形文字的概念

1253715437_bb7afaa5ff

所以才會說目前為止的數位體驗,其實只算是數位生活的類比體驗,一直以來保留的設計方法讓一直沿用下來。但是這樣做的真的有意義的嗎。這樣是不是真的有幫助到更快的解決問題或是更容易取得資訊。

最真實的數位體驗

沒想到這次 Think different 的居然是微軟,Metro Style 的主軸之一就是最真實的數位體驗,在 Metro Style  下完全拋棄了桌面隱喻這個東西,或許這正是世代交替的時刻。下一個世代的人會不會還沒有看過 mail 就先學會寄發 e-mail ,沒看過通訊錄先有 Facebook ,不會寫字先學會打字,不會翻書前就先會看電子書。

sci-fi-tech-20thcentfox-9

如果在未來的數位生活中,這些類比的東西都不復存在了,那麼這些東西應該是要用什麼方式呈現呢。是不是到目前為止我們認為理所當然的介面其實是不必要的存在。那麼對於接下來的世代,怎麼樣做才是比較好的。

Windows 8 Metro Style 主要設計概念來源

幾項 Metro UI 設計的想法來源,其實蠻有趣的,不是設計出身的人其實並不會想到這麼多。但是仔細了解之後其實 Metro UI 設計並不只是看起來那麼簡單。

Modern Design – Bauhaus

Bauhaus
這建築物現在看起來是很常見的,不過在 19 年代前半卻是非常特別的,在當時的建築中獨立一格,也建立了一派極簡、現代的 Bauhaus 建築風格,而這種風格不只影響到了建築也影響其他各種設計。更加注重功能性,而並非裝飾的部分。

International Typographic Style – Swiss Design

poster
在字體排版方面則是大量引用 International Typographic Style 的概念,讓文字經由排版定位來呈現內容,而且使用不帶有意象的字體,文字本身應該是中立的來呈現內容代表的含意。利用方格圖來設計編排字體,並且適當的留白就成為 International Typographic Style 的主要精神。
swissposter

Motion Design – Cinematography

cinematography
而在 Metro UI 動作設計方面則是希望能像電影一樣吸引人,流暢的動作串接豐富的內容,就像看電影一樣。下面這支 MTV 為了自己的 Mango App 拍攝的廣告應該可以詮釋 Metro 想要帶出來的感受。

Metro Style App (6) Sharing 分享功能

image

Metro Style App 在 API 分享的功能(Sharing ),使用 Sharing 將資訊分享到 Facebook ,Twitter….。不同於其他的 App 如果你要將資訊 PO 到 Facebook 上面,那必須直接去呼叫 Facebook 的 API ,可以被分享的 Target 實在太多了,雖然說 API 大部分都依循著同一套規則,但是實務上還是必須一個一個測試,而且對於使用者來說他不一定同時使用這麼多的平台,假設使用者只有 Facebook 帳號沒有 Google+,那麼 Google+ 的分享按鈕對使用者來說就是沒有意義又浪費版面造成混淆的功能,而且當開發愈想抓住更多平台而串接了更多分享 API ,也就造成這個問題愈來愈嚴重。難道這個問題沒有好的解決方法嗎,如果開發功能還需要利用微積分取得因為分享而加入以及因為太多分享而離開的使用者最大值,那麼也太累了一些。

Microsoft 在 Windows 8 提出了一種解決方案,分享的時候並不是直接呼叫服務的 API 而是呼叫 Windows 8 的 WinRT,而 WinRT 會找尋機器上被設定為可以 Sharing Target 的 App 來做 Sharing 的動作。這是什麼意思呢?就是說如果安裝了 Facebook 的 Metro App 則你的分享就可以分享到 Facebook 上,如果安裝了 Twitter 就可以分享到 Twitter 上,而如果今天有安裝這個 Google+ 這個 App 則使用者應該也就是 Google+ 的使用者。Microsoft 大餅畫得很圓,看起來正是一勞永逸的作法,讓大家的事情都可以做的很少就完工,不過唯一的問題就是 Windows 8 的使用人數能不能推得起來,如果人數太少到大型平台都不願意花費時間來開發 Metro App,那這個 Sharing 可能就只能寄 Email 了。

加入 Sharing content target app sample

為了避免只有 mail 能被分享的窘境,而且可以看到最完整的欄位設定,在 Sharing content target app sample 可以下載到微軟建立作為分享目標的範例 App ,用 VS11 開啟之後在 Local Machine 用 Debug 執行起來之後既可以當作分享的目標了。

image

在 App 中實作分享功能

要實作這個功能,主要是註冊 DataTransferManager 的 DataRequested Event Handler ,並且設定 Request 物件的屬性,讓 Sharing 的功能知道你想要分享的資訊是哪個部分。主要的重點就是取得 Sharing 的事件,在事件中把要分享的資訊整理好設定,Windows 8 的設定功能就會把這些資訊送給 Sharing Target ,接下來的事情就是 Sharing Target 要去煩惱了。

設定文字分享訊息

在 itemDetail.js 的 ready function 加入

var dtm = Windows.ApplicationModel.DataTransfer.DataTransferManager.getForCurrentView();

dtm.addEventListener("datarequested", function (e) {
var request = e.request;
request.data.properties.title = item.title;

// Share recipe text
var recipe = "INGREDIENTSrn";

//設定要分享的資訊
recipe += item.content + "rn";

recipe += ("rnDIRECTIONSrn" + item.directions);
request.data.setText(recipe);

設定圖片分享資訊

// Share recipe image
var image = document.querySelector(".item-image");
var uri = image.getAttribute("src");

// 抓取圖片資訊
if (uri.indexOf("http://") == 0)
uri = new Windows.Foundation.Uri(image.src); // Remote image
else
uri = new Windows.Foundation.Uri("ms-appx:///" + image.getAttribute("src")); // Local images

var reference = Windows.Storage.Streams.RandomAccessStreamReference.createFromUri(uri);
request.data.properties.thumbnail = reference;
var deferral = request.getDeferral();
// 圖片讀進 request.date 裡面
request.data.setBitmap(reference);
deferral.complete();

最後的結果從 Sharing content target app sample 查看的話應該會類似這樣,不同的 Sharing Target 抓取的欄位可能也不盡相同。

image


Sharing content target app sample 分享目標微軟範例

Sharing content source app sample 分享來源微軟範例

API reference for Windows Runtime and Windows Library for JavaScript

在 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

總結

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