顯示具有 Microsoft 標籤的文章。 顯示所有文章
顯示具有 Microsoft 標籤的文章。 顯示所有文章

2012年5月14日

[小技巧] 一次將 MS Excel 中的所有工作表匯出為單一 PDF

前幾天老爸很苦惱的問我說:為甚麼 Excel 另存成 PDF 每次只能存一個工作表阿?如果我要印三個工作表就要存成三個 PDF,好麻煩。

仔細看了一下 Excel 另存成 PDF 的選項中,發現只要把「選項」->「發布內容」中的「整本活頁簿」勾起來,就可以把所有工作表匯出為單一 PDF 了:


其實很多時候只要把「選項」打開,仔細看一下就可以找到想要的功能囉!

2010年8月25日

[Outlook 2007] 如何將 Exchange Server 上的信件收到本機資料夾

以下簡單紀錄之前寫的操作步驟。

步驟一:從控制台進入「郵件」設定


步驟二:選擇目前 Exchange 帳戶所在的設定檔
(若要新增設定檔,請參考:新增 Outlook 電子郵件設定檔),之後點選「內容(R)」按鈕



步驟三: 點選「資料檔」按鈕


步驟四:在「帳戶設定」頁面中,點選「新增(A)...」按鈕



步驟五:在「新的Outlook資料檔」畫面中,使用預設值:Office Outlook 個人資料夾檔案 (.pst)


步驟六:選擇新增的 .pst 檔的儲存位置,並設定檔案名稱



步驟七:在「建立Microsoft個人資料夾」畫面中,設定此資料檔的名稱,此名稱會顯示在Outlook中。



步驟八:在「帳戶設定」畫面中,點選剛剛新增的資料檔,而後再點選上方的「設成預設值(D)」按鈕。



步驟九:此時由跳出的對話視窗中可看出,爾後電子郵件會被收到本機的資料夾,Exchange伺服器上的資料會被清空。



步驟十:啟動 Outlook 2007,此時選擇剛剛修改過的「mPro」設定檔



步驟十一:測試收信,可看到新的信件會被收到剛剛在本機上新增的個人資料夾



步驟十二:在「個人資料夾」上按右鍵,選擇「”個人資料夾”的內容」,可看出此資料夾(.pst)檔是存在本機上。
此外可登入 Exchange Server 確認是否伺服器上面的信件已經清空。





2010年6月15日

[Tools] 利用 Web PI 輔助安裝 SSMSE 2008

首先來個名詞解釋吧

I. 名詞解譯

SSMSE = SQL Server Management Studio Express
也就是 SQL Server 管理工具,相信大家應該都不陌生

Web PI = Microsoft Web Platform Installer
微軟提供的免費 Web Platform 元件安裝工具,目前版本為 2.0
利用此工具可取得目前線上最新版本的安裝程式

II. 問題及解法

坎尼由於之前已先安裝了 SQL Server 2008 Express
由於沒裝 SSMSE,在管理自己機器上資料庫很麻煩

前陣子下載了 SSMSE 2008 來安裝,卻怎樣也找不到安裝的選項
用黑暗兵法 7zip 從安裝檔把 SSMSE 抽出來也不能安裝
ssmse2008Ins00 ssmse2008Ins00_2
以前在裝 SSMSE 2005 都是無腦 Next 一路裝到好
Search 一下才發現,似乎要裝新的執行個體才行
或是一開始就用 SQL Server 2008 Express With Tools 來安裝

突然看到有人說可以用 Web PI 來安裝
坎尼之前用 Web PI 時並沒有看到 SSMSE 的選項啊奇怪
趕緊來打開 Web PI 來看一下
ssmse2008Ins01
最可疑的地方就是 Database 了,但它把已經有綠色勾勾了啊
點開自訂,Bingo! 果然是偷偷藏在這種地方啊
ssmse2008Ins02
勾選之後點下安裝就會開始下載安裝檔
SSMSE 2008 大約是 170MB 左右,請耐心等候
下載完會自動進行安裝,接下來跟著指示做就對了 :D

III. 小結

Microsoft Web Platform Installer 真的是很好用的工具
有興趣的人可以到官網下載使用 :D

2009年4月19日

微軟內部開始實驗的新 QA 機制:Bug Goal

這個月初去微軟位於南港的創新中心(Microsoft Innovation Center, MIC)上課,
在第三天的課程中聽到一個很有趣的觀念,叫做 Bug Goal,以下就來說說這是什麼。

在上一篇文章:微軟的組織架構 & Developer 的工作態度中曾經提到,基本上每個微軟的 team 都是由 PM、dev、以及 tester 組成,而 Bug Goal 就是由 Tester 這邊提出來的新觀念,目前正在美國總部小規模實驗中,如果成效良好,可能會全面推廣。

顧名思義,Bug Goal 指的是 bug 的指標,更清楚一點的說,是指在每個功能區塊中預期會產生多少 bug。一開始聽到這個觀念大家都覺得不可思議,所以花了不少時間討論。

Bug Goal 一開始大概只能靠 manager 從過去的經驗中做一個接近直覺的估計,但是隨著經驗的累積,理論上這個值應該愈來愈精準。訂定 Bug Goal 的目的如下:
  • 激勵 tester 在程式中找出數量足夠的、有意義的 bug,目標就是 Bug Goal 設定的數量。
  • 激勵 dev 寫出更高品質的 code,讓 tester 沒辦法抓出足夠的 bug 來達到 Bug Goal 設定的數量。
    (有點像是故意在 dev 和 tester 之間建立一個良性的競賽,目的在提高品質)
  • 讓 PM 多了一種衡量程式品質的數據,當某一個功能根據過去的經驗,是很容易產生大量的 bug,但專案執行一段時間以後 tester 卻幾乎沒有找到任何 bug 的時候,就應該主動更深入的了解一下專案執行的狀況,當然有可能是程式的品質真的非常好,但有沒有可能是 teser 在偷懶?或者 dev 偷偷把功能簡化,所以程式變得很簡單,不容易出錯?
會影響 Bug Goal 的因素包括:
  • 功能的複雜度
  • dev 的熟練度
  • tester 的熟練度
  • 需求變化的程度
  • ...(可能還有很多其他的因素,總之是要綜合考量這些因素)
有一點要強調的是,tester 找到的 bug count 有沒有 meet Bug Goal 絕對不是一個適合用來衡量 tester 能力的指標,例如 bug 的品質就是一項重要的因素(有沒有濫竽充數?),而有經驗的 tester 在 system design 的階段就會密切參與討論,貢獻自己的專業知識,提高系統的 testability,以及避免可能很難測試的設計,這些都可能造成 bug count 的降低,自然就達不到預先設定的 Bug Goal。

反過來說,達不到 Bug Goal 可以看成是一個好現象(前提是沒有人掩耳盜鈴),而且整個 team 長遠的目標應該是要讓 Bug Goal 越來越低,這表示 team member 的成熟度很高,可以產出高品質的 code。(這當然是個非常遙遠的理想)

2009年4月13日

The “I Suck” button in ASP.NET MVC Visual Studio Project Creation Dialog

上禮拜在看 Channel 9 一部請 ASP.NET MVC 的 PM – Phil Haack 現身說法的訪問中,
他提到了一個由 Scott Hanselman 發明的 private joke:The “I Suck” button.
 
到底這個 button 長什麼樣子呢?

當你安裝好 ASP.NET MVC V1 以後,安裝程式會順便安裝 VS 的 Project Template,
有趣的地方在於,當你 create 一個新的 ASP.NET MVC Application 之後,
VS 馬上會跳出一個詢問你是否要順便建立 unit test 專案的對話框:

ASP.NET MVC_WithUnitTestProject

上圖是系統的預設值,也就是微軟建議你應該順手建立一個 unit test 專案,
如果你 follow 了微軟的建議,那麼這時候螢幕上的就只是一般的「OK Button」。
(PS. Test Framework 不限定 VS Unit Test,也可以用 NUnit 等,作法參考這裡

但是若你選擇忽略微軟的建議,不要建立 unit test 專案,這時候畫面會像下圖這樣:

ASP.NET MVC_NoUnitTestProject

這時候原本的「OK Button」就變成「I Suck Button」了!

我覺得這個 private joke 某種程度上反應了微軟的 devs 對 unit testing 的看法,
也可以感受到他們樂在工作的感覺。可能某種程度也是要表達「MVC Pattern 本來就比較是合作 unit test」這個觀點吧。

接下來有空就來學一下 ASP.NET MVC 好了,順便練習 TDD!

2009年4月5日

微軟的組織架構 & Developer 的工作態度

上週去 Microsoft Innovation Center (MIC, 在南港) 上課,第一天講的是 unit testing,
講師是 Bentham Chang (張濱顯),人蠻開朗的,上課的過程還蠻歡樂。其實關於 unit testing 的作法等等技術細節網路上資料很多,我比較有興趣的是他分享的在微軟工作的經驗,還有微軟的文化。

從 Developer (Dev) 的角度出發,工作上最直接相關的組織長得像下面這個樣子(接下來會大量使用到 Dev 這個 term):

MS_Dev_Map 
雖然我的圈圈畫的很醜,但我想表達的是在 MS 沒有上下階層的關係,三角形好像還是有個頂點:p 當然每種職位一定有 junior/senior 之分,也有各自的 Lead (e.g., Test Lead, Dev Lead)。


基本上從職稱就可以知道大略的工作內容(聽說很多美國公司也是採用類似的架構),PM 就是專案經理,Test(er) 在台灣常常叫 QA,Dev乍看之下好像是PG (Programmer)。

但是在台灣很多公司是 follow IBM Mainframe 時代的 terms,所以會有 PG/PA/SA/SD 等職位(很有 waterfall 的 fu),在上圖中看不出 PA(程式分析)、SA(系統分析)、SD(系統設計) 等職位,但是顯然這絕對不是說在微軟做軟體都不需要經過這些步驟。

我的感覺是 MS 的 PM & Dev 都是一起 co-work 的,只是 PM 面對客戶的時間比較多,主要負責寫 spec(相當於台灣的 PA/SA 的工作),但是過程中要密切跟 Dev (lead) 討論系統設計(SD)的問題,最後由 Dev 負責把程式實作出來(PA 大概算基本能力吧)。

另一個很明顯的重點是 Tester (QA) 是很重要的職位,必須要請人專職負責,而不是把 testing 當做 Dev 的工作中的其中一項。從這裡也可以思考,如果像微軟這樣重視 testing 的公司做出來的產品還是有可能被批的滿頭包,那麼沒有專業請人做 testing 的公司做出來的產品,品質/安全性會是怎麼樣?

扯遠了,Bentham 說,在 MS 內你可以自由選擇要做上述三種工作的哪一種,並且每種職位還可以進一步選擇要做 Indivisual Contributor (IC) 或是 Lead (manager)。

MS 的 Dev 都是很聰明而且非常有自主性的,基本上可以說整間公司都是自我實現的熱血的人(自我實現這個 term 請參考 Maslow’s hierarchy of needs),所以不適合用「公司政策」這種政治性的手段來強迫推行什麼制度(e.x., unit testing),因此 MS 管理 Dev 的原則是先盡可能提供他們一個舒適的工作環境(食物啦、飲料啦),之後要推動政策的時候,只要能夠說出個道理(e.g., unit testing 的好處),就能讓 Dev 自動自發的去執行了。

MS 的 Dev 有什麼需求呢:
  1. (Free) Food:Google 也是這樣搞的。台灣微軟好像也差不多。MIC 和 MIT 都有很多零食飲料。
  2. Quite (environment):就是說喔,不要跟 sales 坐同一間辦公室啦!
  3. Keyboard:在 199x 年的時候 MS 很多 top Devs 比較習慣 unix-like 的 text editor/command-prompt tool,很不喜歡用滑鼠的
  4. Cool idea:設法把公司要推動的東西塑造成很酷的,讓 Dev 認為做這些事情是他們自己想要的
  5. Ship it:「我的程式被幾千萬人使用」是 MS Devs 成就感的來源,所以儘快 ship product 是很重要的
所以要推動 unit testing,首先滿足上述前四項之後,利用第五項來設定一個門檻:unit testing 沒達到門檻就不給你 check in,就不能 ship product,這樣 Devs 就會嚇到了。

另外一個故事是以前 MS 每週會舉辦一個 tool 比賽,因為 Devs 在平常工作的時候很喜歡自己做一些小 tool 來自動化一些重複、繁瑣的工作,因此為了鼓勵這個風氣,每週舉辦一個 tool 比賽讓大家炫耀一下自己的作品,大家覺得不錯的 tool 就會考慮整合到產品中,據說 VSTS 的 testing framework 就是把這類 tool 整合進產品的結果。

呼,寫到這裡有點像流水帳,不過其中有很多可以好好思考的地方。就讓我用「這跟台灣真是差很多阿!」來草草結尾吧,千言萬語,不知從何說起阿~ :p

2009年3月8日

IIS7 未啟用 Application Development Features 會導致 HTTP Error 500.19 (The requested page cannot be accessed because the related configuration data for the page is invalid.)

上禮拜為了寫一個小小的測試程式,必須要實際佈署到 IIS 才能驗證功能是否正確,
所以第一次嘗試在 Win7 Beta (x64) 上設定 IIS7,沒想到不小心就搞了一個多小時…
要啟用 IIS7,(從 Vista 之後)第一步就是從 Control Panel 中的
「Programs and Features」中執行「Turn Windows features on or off」,
在我啟用 IIS7 之後,就開啟 browser 瀏覽到我的測試頁面,結果出現下面這個錯誤:

IIS7_HTTP Error 500.19

hmm … 仔細的看了一下我的 web.config,預設是不會有 <httpErrors /> 這個設定的,
所以應該不是我或者 VS2008 手賤亂改設定造成的問題。
(有趣的是,我只是要瀏覽 .htm 網頁,還不是執行 .aspx 網頁哦)


雖然受到了小小的驚嚇,但是由於 IIS7 提供了非常豐富的錯誤描述資訊,
所以我想這也沒什麼了不起的,想必 Google 一下很快就會有結果了吧!

果不其然, 很快的我就查到了跟我的狀況完全相符的描述:
IIS7 HTTP Errors Configuration on Lockdown

OK, 以下這段是重點:

In order to set <httpErrors /> you have to open up applicationHost.config on your server and unlock the node or specifically set the value for the site you want. I like to unlock the node and set <httpErrors /> within the web.config of my application. I find this much clearer and more isolated then having application specific settings defined within the applicationHost.config on a specific server.


這篇文章提到了 IIS7 錯誤訊息中沒有明講的「applicationHost.config」這個關鍵檔案,
於是繼續搜尋看看這個檔案到底位置在哪,要如何修改:Editing Applicationhost.config on 64 bit Win 2008,嗯,跟我的環境蠻合的,那就仔細讀一下內容吧!

稍微看了一下,這個檔案應該位於在「c:\windows\system32\inetsvr\config\applicationhost.config」,但是正如這篇文章所說,我的 UltraEdit 和 VS2008 顯然都是 32bit application,根本無法開啟這個檔案!(幸好我沒有改內建的 Windows Explorer,所以還看的到檔案)

於是乎,我依照作者的建議,用萬能的 notepad 來開啟 applicationhost.config,
鏘鏘鏘鏘!檔案順利打開了,但是 <httpErrors /> 區塊的設定如下:
<section name="httpErrors" overrideModeDefault="Allow" />
所以完全就是可以允許每個 web application 隨意亂改 httpErrors 的處理方式嘛!
 
那麼揪~~~~竟是為什麼我會收到 HTTP Error 500.19 呢

按照過去的經驗,通常會出現這種好像鬼打牆的靈異現象,很可能是因為某些最基礎(或者說底層)的環境設定不正確,導致系統丟出這種沒頭沒腦的錯誤(仔細看一下上圖,Config Source 指出的區塊根本就和 <httpErrors /> 無關,如果繼續往 <httpErrors /> 這條死胡同裡面鑽,那天就不用睡覺了),於是乎我開始尋找 IIS7 的初始設定有沒有什麼要特別注意的地方,結果無意間看到一篇讓我靈機一動的文章:Server Error HTTP Error 404.3 Not Found,之前在 Vista 上設定 IIS7 的時候也看到這篇,看到 screenshot 我才想到,我忘記設定 Application Development Features 了

在第一次 turn on IIS7 的時候,要特別注意以下設定:
(根據這次實驗,完全不啟用 Application Development Featues 的話,連靜態 html 網頁都開不起來)

IIS7_NecessaryFeatures

設定完成後,在 IIS7 的 Handler Mappings 中可以看到以下內容:
IIS7_HandlerMappings_Correct

後來我又實驗了一下,把 Application Development Features 關掉的話,Handler Mappings 會變成這樣(沒有 .aspx、.asmx mappings):
IIS7_HandlerMappings_Incorrect

此時去瀏覽網頁又會出現 HTTP Error 500.19,所以這個謎的真相就是這樣 … Orz
印象中 IIS6 有個設定叫做 Web Service Extensions,有時候 ASP.NET v2.0.50727 的 mapping 消失的時候,也會出現無法處理 ASP.NET 2.0 網頁 request 的狀況,
但是丟出的錯誤訊息是很明確的(忘記是啥了@@)。IIS7 在這種狀況下居然丟出一個毫不相干的錯誤訊息,反而變成很不 friendly 了 …


(不過也只有像我一樣一開始腦殘忘記設定 Application Development Featurs 的人才會感受到這種痛苦就是了 .. Orz 太信任 IIS7 的錯誤訊息也不一定是件好事…)

2009年3月5日

微軟最新互動技術(穹頂、神桌、從背後摸)

咳咳,騙文章時間又到了 :D

自從訂了 Channel 9、Channel 10,還有 Microsoft Research 之後,總是有看不完的影片,以下幾個是這幾天看到比較酷炫的,分享一下:

穹頂(這是我亂翻的,天文資料的 demo 很炫)

神桌(TOUCH AND GESTURE COMPUTING)(Surface Team 的那位很帥阿!)

從背後摸(Back Of Device Input

同場加映:微軟對 2019 年的展望

2009年3月2日

ASP.NET 2.0+ Complete Event Sequence

對於初學 ASP.NET 的新手來說,搞清楚 ASP.NET 內建的數十種 event 的執行順序是非常重要的(對於專業開發 control 的人應該是超重要的),特別是在處理 Data Binding 的時候更是如此,首先必須大略瞭解 ASP.NET Engne (或者應該說 .aspx 的 HttpHandler) 依序對一些重要系統資源做了甚麼處理(e.g., Load SessionState、Load PageViewState、Run Page Constructor、Unload Control..),才會知道若要對某些資源作處理時,可以把程式寫在哪個 event 的 event handler 中。

關於 event 執行的順序,在 MSDN 上通常叫做「XXX Lifecycle」,例如 Application LifecyclePage Lifecycle 等,雖然各別來看 Application Level &Page Level 的 event sequence 都很清楚,但是 Application events 和 Page events 之間的先後順序呢?

更嚴重的問題是,若採用貼近 Microsoft 所建議的開發模式,Page 上免不了會套用 MasterPage、UserControl、和 Custom Control,這些 Control(這個詞好像不太好=.=)都有自己的 code-behind,因此也都有自己的 Init、Load、Unload 等等 event,
那麼這些 events 跟 Application 和 Page events 之間的先後順序又是怎麼樣呢?
 
而且不要忘記了,MasterPage 上可以擺 UserContrl,而 UserControl 上還可以使用 CustomControl 呢
(喜歡自己用 JSON 手工打造 UI 的網站可能不會用到這麼多東西)


幸好透過偉大的 Google,我們可以找到ranking 很高的示意圖,但是!製圖時間已經是 2004 年,也沒有把 Application Event 納入。

另外一個更新的 reference 是 Jeff 這個好人的 blog post,但看了下面的留言就會發現,這是根據某個 pre-beta 版本而做出來的結果,不符合 production 版的 ASP.NET 2.0 的行為。(經過實測也發現,有些 Jeff 列出的 event 現在已經被拿掉了)
 
(Update 3/1: 這應該就是親愛的小馬王同學的 reference 來源吧?)


那麼到底要如何能夠隨時隨地確認 ASP.NET 的 complete event sequence 呢?!
當然是老老實實的一個一個去實作每個 event 的 event handler,然後以 trace/log 的方式來紀錄事件觸發的順序呀!

為了驗證 ASP.NET 2.0+ 的完整 event sequence,我做了一個簡單的 application,一一實作每個 event 的 event handler,在其中用 log4net 將 event 資訊寫到 .csv 檔中。

為了區別事件是在哪裡發生的,我用了「MasterPage」、「ContentPage」、「UserControlPage」和「CustomControl」等 prefix,並且輸出 UserControl 和 CustomControl 的 ClientID,以利識別 control 所在的頁面。

稍微觀察一下就會發現一些有趣的地方,例如 DataBinding 相關 event 被觸發的次數、相同事件 (e.g., Init) 在不同 Page 會有不同的順序,Session 載入的時機 … 等等。

基本上目前實作的 event handler 都是參考 MSDN 的說明,Jeff 所列出的 event 有些很有趣,例如與 ViewState 相關的 event,但是我挑了幾個來實作都無效,砍尼有空可以再幫我加強這個部份 :p

經過一些整理,完整的 event sequence 長得像下面這個樣子:
(好的 visualization 真的很重要呀 … 這裡論上應該可以弄成一顆樹,會比較好看)
Application_Start
Application_BeginRequest
Application_AuthenticateRequest
Application_PostAuthenticateRequest
Application_AuthorizeRequest
Application_PostAuthorizeRequest
Application_ResolveRequestCache
Application_PostResolveRequestCache
ContentPage_Constructor
Application_PostMapRequestHandler
Session_Start
Application_AcquireRequestState
Application_PostAcquireRequestState
Application_PreRequestHandlerExecute
ContentPage_PreInit
MasterPage_Constructor
UserControlPage_Constructor_
UserControlPage_Constructor_
UserControlPage_Constructor_
UserControlPage_Constructor_
UserControlPage_Constructor_
UserControlPage_Constructor_
CustomControl_OnInit_ctl00_ContentPlaceHolder1_MyUserControl1_MyCustomControl1
ContentPage_GridView1_Init_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
UserControlPage_Init_ctl00_ContentPlaceHolder1_MyUserControl1
CustomControl_OnInit_ctl00_ContentPlaceHolder1_MyCustomControl1
ContentPage_GridView1_Init_ctl00_ContentPlaceHolder1_GridView1
CustomControl_OnInit_ctl00_MyUserControl1_MyCustomControl1
ContentPage_GridView1_Init_ctl00_MyUserControl1_GridView1
UserControlPage_Init_ctl00_MyUserControl1
CustomControl_OnInit_ctl00_MyCustomControl1
ContentPage_GridView1_Init_ctl00_GridView1
MasterPage_Init
ContentPage_Init
ContentPage_InitComplete
ContentPage_PreLoad
ContentPage_Load
MasterPage_Load
UserControlPage_Load_ctl00_ContentPlaceHolder1_MyUserControl1
CustomControl_OnLoad_ctl00_ContentPlaceHolder1_MyUserControl1_MyCustomControl1
ContentPage_GridView1_Load_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
CustomControl_OnLoad_ctl00_ContentPlaceHolder1_MyCustomControl1
ContentPage_GridView1_Load_ctl00_ContentPlaceHolder1_GridView1
UserControlPage_Load_ctl00_MyUserControl1
CustomControl_OnLoad_ctl00_MyUserControl1_MyCustomControl1
ContentPage_GridView1_Load_ctl00_MyUserControl1_GridView1
CustomControl_OnLoad_ctl00_MyCustomControl1
ContentPage_GridView1_Load_ctl00_GridView1
ContentPage_LoadComplete
ContentPage_PreRender
MasterPage_PreRender
UserControlPage_PreRender_ctl00_ContentPlaceHolder1_MyUserControl1
ContentPage_GridView1_DataBinding_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_DataBound_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_PreRender_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
ContentPage_GridView1_DataBinding_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowCreated_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_DataBound_ctl00_ContentPlaceHolder1_GridView1
ContentPage_GridView1_PreRender_ctl00_ContentPlaceHolder1_GridView1
UserControlPage_PreRender_ctl00_MyUserControl1
ContentPage_GridView1_DataBinding_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowCreated_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_RowDataBound_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_DataBound_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_PreRender_ctl00_MyUserControl1_GridView1
ContentPage_GridView1_DataBinding_ctl00_GridView1
ContentPage_GridView1_RowCreated_ctl00_GridView1
ContentPage_GridView1_RowDataBound_ctl00_GridView1
ContentPage_GridView1_RowCreated_ctl00_GridView1
ContentPage_GridView1_RowDataBound_ctl00_GridView1
ContentPage_GridView1_RowCreated_ctl00_GridView1
ContentPage_GridView1_RowDataBound_ctl00_GridView1
ContentPage_GridView1_RowCreated_ctl00_GridView1
ContentPage_GridView1_RowDataBound_ctl00_GridView1
ContentPage_GridView1_RowCreated_ctl00_GridView1
ContentPage_GridView1_RowDataBound_ctl00_GridView1
ContentPage_GridView1_DataBound_ctl00_GridView1
ContentPage_GridView1_PreRender_ctl00_GridView1
ContentPage_SaveStateComplete
CustomControl_Render_ctl00_ContentPlaceHolder1_MyUserControl1_MyCustomControl1
CustomControl_Render_ctl00_ContentPlaceHolder1_MyCustomControl1
CustomControl_Render_ctl00_MyUserControl1_MyCustomControl1
CustomControl_Render_ctl00_MyCustomControl1
CustomControl_Unload_ctl00_ContentPlaceHolder1_MyUserControl1_MyCustomControl1
CustomControl_Dispose_ctl00_ContentPlaceHolder1_MyUserControl1_MyCustomControl1
ContentPage_GridView1_Unload_ctl00_ContentPlaceHolder1_MyUserControl1_GridView1
UserControlPage_Unload_ctl00_ContentPlaceHolder1_MyUserControl1
CustomControl_Unload_ctl00_ContentPlaceHolder1_MyCustomControl1
CustomControl_Dispose_ctl00_ContentPlaceHolder1_MyCustomControl1
ContentPage_GridView1_Unload_ctl00_ContentPlaceHolder1_GridView1
CustomControl_Unload_ctl00_MyUserControl1_MyCustomControl1
CustomControl_Dispose_ctl00_MyUserControl1_MyCustomControl1
ContentPage_GridView1_Unload_ctl00_MyUserControl1_GridView1
UserControlPage_Unload_ctl00_MyUserControl1
CustomControl_Unload_ctl00_MyCustomControl1
CustomControl_Dispose_ctl00_MyCustomControl1
ContentPage_GridView1_Unload_ctl00_GridView1
MasterPage_Unload
ContentPage_Unload
Application_PostRequestHandlerExecute
Application_ReleaseRequestState
Application_PostReleaseRequestState
Application_UpdateRequestCache
Application_PostUpdateRequestCache
Application_EndRequest
Application_PreSendRequestHeaders
Application_PreSendRequestContent
Session_End
Application_Disposed
Application_End

我的測試網站程式可以在這裡下載,跑出來的 csv 檔可以在這裡下載。
PS. log4net 幫我寫的第一筆紀錄的時間格式很詭異,開頭多了一個「þÿ」,如果有高手知道這是甚麼鬼東西,麻煩指點一下 :D

2009年2月27日

[轉貼] Anatomy of a Silverlight Game

這個訪問前幾天開始訂閱 Channel 9 的時候看到的:Anatomy of a Silverlight Game,Nikola Mihaylov 是微軟的員工,他負責測試 Visual Studio 中與 Silverlight 開發有關的部份,因此想利用每天工作接觸到的 Silverlight 底層知識作一個 Silverlight 遊戲,最後的成果就是 Shock.

我覺得他厲害的地方在於熱忱,能夠努力的在下班時間為了興趣製作出一款遊戲,而且不斷思考如何讓遊戲更好玩、如何經營一個遊戲的網站、如何避免駭客利用 Visual Studio 來造假分數(這段要特別推薦一下,他把 function name 命名為「CheatingIsEasyAndLame」、「CheatingIsEasyAndStupid」之類的,結果很有效 XD),甚至還寫了一份 whitepaper 分享他在遊戲製作過程中學到的寶貴經驗(e.g., 如何設計遊戲、遊戲的趣味性、coding 上要注意的事情、sample code ...),真的是令人佩服。

這段訪問大約 13 分鐘左右,推薦一下 :D

2009年2月8日

[Office 2007] The Story of the Ribbon – Office 2007 的設計理念探討

See Jensen Harris’s Blog post.

這個 talk 是 Jensen 在去年三月的 MIX 講的,這篇 blog 只有大略說明了演講的內容,
建議下載完整的錄影檔,才能深入瞭解 Office 2007 背後的設計理念。

這次演講探討的是 Microsoft Office 這套賣出超過四億合法授權的軟體的設計過程,
(也就是說加上非法授權的話,Office 的 User Base 應該超過十億吧 XD)
就像由 Google 來說明網路上熱門關鍵字的發展趨勢一樣有公信力。

Jensen 的演講內容非常有趣,例如大約在一小時整的時候的一段 Eye-tracking study 影片(主題是如何在 Office 2003 中找到「Find」功能),配合恰到好處的配樂,看起來真的是很好笑XD 另外他也常常自我幽默的吐槽 MS,讓整個演講得感覺很輕鬆。

在演講的過程中,Jensen 很有條理的從 Word 1.0 一路講到 Office 2007,
在這個過程中,隨著功能不斷地擴充,Office UI 已經複雜到大大地降低 Usability,
User 必須要投入非常大量的時間,才能得到 Office 的「Sense of Mastery」,
也就是一種能夠充分駕馭 Office 的感覺(某種程度上也可解釋為 Usability)。

當軟體功能簡單時(e.g. notepad),User 很自然的就可以建立「Sense of Mastery」,
但所有軟體公司都不斷持續努力為自家產品增加功能,提供給客戶更高的附加價值,
當軟體功能日趨複雜,要如何維持操作/學習上的簡易,才不至於讓 User 失去(或很難建立)「Sense of Mastery」,就變成一個高難度的問題了。

這個 design problem 不只在 desktop apps 存在,顯然也是 Web apps 不可忽略的。
PS. Word 1.0 & Word 2003 的 screen shot 比較:
Word_1.0

Word 2003

2009年2月2日

64-bit Windows7 Beta (Build 7000) 試用心得

繼 12 月中在三年前的桌機上安裝 32-bit Windows7 Beta (Build 7000) 後,
利用過年這段時間我把工作機(去年8月買的 Thinkpad X61)也灌成 Win7 Beta,
不同的是,這次我灌的是 64-bit 的版本(為了實際上也用不太到的 4GB RAM..||)
用起來基本上還蠻順暢的,利用這次機會多測試了一些開發用的工具的運作情形,
也找到一些好用的 freeware,以下是一些心得:
  • Windows 7 好用的地方
    • Device Stage 很漂亮!不過重點是對無線網卡的支援更完善,在我之前把小黑灌成乾淨的 Vista Ultimate X64 之後,不管怎樣嘗試灌 Lenovo Driver,就是無法辨識無線網路。灌好 Win7 之後,啥也不用作就可以自動搜尋到家裡附近的一大堆無線網路了。
    • Taskbar & JumpList:這功能實在太好用了,舊版的 taskbar 相較之下實在太弱了 … 參考這些影片:基本的介紹For Mac User…不知道為甚麼都沒有提到滑鼠移過去產生的那個視窗,右上角有一個紅色的「x」,按了就可以直接關閉視窗,真的是很方便喔!
      Win7_CloseWindow
    • HomeGroup 功能:參考這篇解說,簡單的說在 Windows 環境中要分享檔案現在更簡單了,之前想要設定 Vista & XP 分享檔案,弄到最後就放棄了=.= 但是要注意只要把「LAN」的「Network Location」設定成「Home Network」即可,連外的網路還是保持「Public Network」就好,如下圖:
       Win7_NetworkLocationSetting
  • 如何設定中文輸入法
    • 在 Enterprise 以上的版本中,可以安裝各語言的完整 language pack(含微軟新注音等),以 Vista 來說,繁中語言包約 1GB,這是最正統且萬無一失的作法。
    • 安裝中文版 Office,會附送微軟新注音、新倉頡等等
    • 用 google 搜尋「new chewing」,可以找到新酷音下載網頁
    • 連到台灣奇摩首頁(http://tw.yagoo.com),在搜尋框輸入「yahoo」及可在 search suggestion 中找到「yahoo 奇摩輸入法」,目前是正式版,應該也不錯用。
      Yahoo_KeyKey
  • 開發用的相關工具
    • Visual Studio 2008 SP1
    • Tortoise SVN Client (1.5.7.15182) 64 bit
    • UltraEdit v14.20
    • Sun VirtualBox 2.1.0(我還順手灌了 Ubuntu 8.10)
  • 其他 freeware 公用程式
    • 7-zip 4.64 64 bit –> 順利取代囉哩八嗦的 WinRAR! 不能製作 .rar 也沒啥關係,.7z 壓縮率更高,或者用 .zip 這個超級 universal 的格式就好。
    • KKMAN 3.0 Beta:雖然安裝過程和安裝完之後,介面上全部都是亂碼一團,但是可以順利的上 BBS 喔!對於沒有要使用到進階功能的人(例如我)來講已經很足夠了。在沒有繁中語言包的情況下,這是我目前唯一知道的一個解決辦法。
    • PicPick:參考重灌狂人,以後不需要 HyperSnap 這個要錢的東西了!
    • Google Desktop:安裝方式參考這裡
    • Google Earth 4.3.7284.3916 … 總之是最新板
    • WorldCommunityGrid:參考官網,還有這篇這篇的說明。
  • 目前仍然不 work 的軟體
    • 虛擬光碟軟體:這應該是最麻煩的問題,網路上很多人討論,比較常用且有名的好像都會落入「無限 reboot 地獄」中,或者是安裝完成但是就是看不到虛擬光碟機。用最新版也沒用。目前我只好直接把 ISO 檔解壓縮出來使用。以下是我試過的軟體:
      • Daemon Tools (Lite)
      • Alcohol
      • Phatom CD(這是我另外嘗試的)
    • Sun VirtualBox 的 Guest Additions(讓 VM 可以 Full Screen Display 的 Utility),這真是太殘念了,目前還不想灌成多重開機的狀態阿…>_<”
    • KKBOX:用 4.0 也沒用,看來它有限定 OS 版本,目前無法辨識 Win7。

2009年1月31日

How To Run Chrome on 64-bit Windows 7

自從過年前手滑把工作機灌成 64-bit Win7 (Buil 7000) 之後, 很快的就發現了 Chrome 呈現一種網頁載入不能的狀態, 雖然安裝的時候有跳出「This Program has compatibility issue.」之類的警告視窗, 不過我以為這就和 VS2005 一樣,不過是 MS 虛晃一招, 只要以 Administrator 權限執行就可以搞定了,沒想到…還真的是不相容 =.=

過了幾天依賴 FF3.1 Beta2 的日子之後(幸好 Google Toolbar 可以灌到 FF3.1 Beta2上,並且支援跟 Chrome 一樣的 Speed Dial),今天早上心血來潮 Google 了一下, 發現在 GIZMODO 上有人分享如何讓 Chrome 在 64-Bit Win7 上正常運作的方法, 作法是修改 Chrome 的執行方式,加上「--in-process-plugins」這個參數。
 
試了一下的確是有用,但是我又在 Chome 的 Issue Tracking System 裡面找到
Issue 4324:Chrome fails to load pages in Windows 7 x 64 bit, 發現其實利用「--no-sandbox」參數也可以達到一樣的效果。

但是仔細看一下回覆之後會發現,這兩種作法之所以可以 work, 原理是這兩個參數「會導致 Chrome 把 Security Sandbox 關閉」!!

相信看到這裡大家都心知肚明,把 Security Sandbox 關閉絕對是極度、極度愚蠢的行為!就像把 Firewall 關閉一樣的愚蠢。總之上目前 Chrome 就是不 support 64-bit Win7 就對了。

從這件事情裡面,還有 Google Desktop 不 Support 64-bit Windows 這一點來看, 實在是很難理解為甚麼自詡為技術超強、超領先,且永遠把使用者擺第一位的 Google 對於 64-bit Windows 是持這種態度?莫非是 64-bit Windows 有甚麼天生隱疾??
 
MS 推出 64-bit Windows 也不是一年兩年了,XP 就有 64-bit version 了不是嗎?

在 Chrome Issue 4324 的第 25 個回覆中,Nicolas 先生是這麼說的:
Major bug? Windows 7 is not even release yet. We will get to it before the official release. The fix is trivial enough, we just did not get to it yet.

我的看法就和第 27 個回覆的 jrlogue 一樣,雖然 Win7 的確是 beta 版,
但是以 MS 的市占率來講,public beta 已經有相當多的人在測試了,
更重要的是,這些先期的測試者絕大多數是開發人員,或是 enthusiasts,
得罪我們這些人可是很容易會讓壞事傳千里的呢!

另一方面,Chrome 在 32-bit Win7 上明明就活的好好的,
為甚麼像 Desktop 一樣碰到 64-bit System 就死了?
感覺這位 Nicolas 先生應該是 Googler 吧?
這種回答真是令人看了不太愉快阿 …

PS. 「googledesktopsetup.exe /force」真的有用,灌起來超快速的,不到 30 秒就灌好了@@

2009年1月6日

Windows 7 Beta (Build 7000) 安裝心得

古語有云:「新年新希望」,由於從 2008 Q4 之後接受大量關於 Win7 的資訊轟炸,
所有的先期測試結果都說 Win7 Beta (Build 7000) 的穩定度非常高,
甚至很多人試用了幾天之後就考慮把 Win7 Beta 當作正式的工作環境來使用,
再加上謠言指出 bt 上已經有一海票的 Win7 Beta 種子,所以上禮拜天我就抓來灌了。

根據微軟的策略,Win7 未來將被應用在 netbook 上,因此比起癡肥的 Vista 輕巧許多,
Windows Team 的 VP – Steven 平常也是用一台灌了 Win7 Beta 的 netbook 在工作,
所以我就拿了一台3年前買的桌機來當實驗品,這台桌機的重要硬體配備如下:
機器準備好之後就開始安裝 Win7,以下是有些曲折的安裝過程:
  • 在將 Win7 Beta 的 ISO 檔下載完畢後,第一個注意到的就是 ISO 檔的大小居然只有 2.43 GB,印象中我的 Vista Ultimate X64 ISO 檔可是有將近 4GB 呢!
  • 迅速的把 ISO 檔燒成光碟後,馬上放進三年前買的桌機,興沖沖的開始重開機…然後就卡住了…囧,不管怎麼試就是無法用 Win7 Beta 光碟開機,最後只好放棄這個安裝方式。
  • 幸好在 Vista 之後,不用光碟開機也可以進行 clean installation,Windows 安裝光碟會把舊的系統打包到一個「Windows.old」的資料夾中,必要的時候還是可以存取舊系統中的系統檔案,因此我就直接在 XP 的環境下開始灌 Win7 囉!
  • 隨著時間的流逝,終於進入到安裝過程的最後一個階段:Complete Installation…,這時候由於等太久,而且好像 installation 字樣後面的「…」也沒有在跑,害我以為當了(搞不好是真的當了=.=),於是我就豪邁的按了重開機!接下來就很慘了,雖然 Windows 安裝程式很 friendly 的偵測到安裝過程意外中斷,因此告訴我安裝將在重開機後繼續進行,但是不管重開幾次都看到同樣的訊息,整個就是鬼打牆,所以我只好默默的接受第一次安裝 Win7 就失敗…囧。
  • 接下來我就拿出可以正常用來開機的 Vista Ultimate 開始重灌,灌好之後就在 Vista 的環境下再接再厲的繼續灌 Win7!結果皇天不負苦心人,這次大概灌了一個小時(感覺硬碟真是有夠慢),終於順利的把 Win7 Beta (Build 7000) 灌好囉!
灌好之後就迫不急待了嘗試了 Aero Shake、Aero Snaps、Jump List、Device Stage (就是Control Panel 中的 Devices and Printers) 等等,至於 Multi-Touch 這種酷炫的功能就無法用三年前的機器來測了 …

基本上在 clean installation 的狀況下,開機以後 RAM 大約被吃掉 410 MB,根據同事的證詞,XP clean installation 的話開機大概要吃掉 200 多 MB,Vista 的我沒注意過,但是基本上現在用這台舊的桌機跑得還蠻順的就是。

關於 Vista 之後對於繁體中文的支援,如果 OS 本身是英文版,那麼可以安裝完整的 language pack,但是根據這個 Vista Help Page,除非是 Enterprise 版以上,否則其他版本只能免費使用 Language Interface Pack (LIP),follow 文件中的 link 進入 Microsoft Local Language 網站之後,畫面像下面這樣:
MS_LLP

結果搞半天還是找不到繁體中文的 language pack 要去哪下載,真是莫名,目前的 Win7 Beta 好歹也是 Ultimate 版,但是在 Windows Update 中就不像 Vista Ultimate 那樣可以直接選擇額外要安裝的 language pack。由於沒有裝 language pack 主要是導致我慣用的 pcman 顯示亂碼(今天還發現有個 2008/12/26 釋出的 2009 beta 版,但裝了以後還是一樣顯示亂碼 =.= ),因此影響不大,只是以後我要利用上班時間偷偷上 BBS 了 :p

以下是我目前安裝的軟體,基本上跑起來都很正常!
Win7_Programs_090106

呼,第一篇在 Win7 上面寫的 blog 就先寫到這邊啦,希望今年能早點看到 Win7 正式版上市!

2008年12月25日

最近很紅的 SQL Server 漏洞 + 如何訂閱 Microsoft Security Advisory

最近跟 SQL Server 有關的新聞不少,一開始我是在一個印度的 SQL Server MVP 的 Blog 上看到關於 SQL Server 2005 SP3 的消息(12/18),沒想到很快的在 12/22 就收到微軟的窗口的 mail,提醒說微軟已經發布 Security Advisory 961040,結果昨天(12/24) iTHome 就已經看到相關的中文報導,還有祭司的 blog 上也有相關消息,最後是今天在保哥的 blog 上也看到相關的消息了,看來有在隨時注意新知的人都能很快跟上進度。

看以上那些報導就可以對這個漏洞有一定程度的瞭解,所以我就不多廢話了,
主要是今天忽然想到,到底 MS Security Advisory 有沒有 RSS Feed 可以訂閱呢?
 
於是我連回 Security Advisory 961040 的網頁,點了網頁上方的 Security Advisory 連結:
Microsoft_SecurityAdvisory

果然順利找到了 RSS Feed:
Microsoft_SecurityAdvisory_RSS

接下來又看到下面還可以訂閱 Windows Live Alert,於是繼續點進去(登入頁略):
WindowsLive_SecurityAlert_Choose

直接全選之後,還有進階設定,我就繼續全選:
WindowsLive_SecurityAlert

最後設定完成的樣子:
WindowsLive_SecurityAlert_MyAlerts

這樣以後就更不容易 miss 掉微軟重要的姿安訊息囉!
最後補充一下前天安裝 SQL Server 2005 SP3 的心得:
  • 安裝前大約花了 1.5 HR 看了 Readme, Installation Guide
    (裡面有說,裝了 SP3 之後,若 SQL Server 相關 Component 發生異常,則無法修復,請整個 server 砍掉重練。雖然聽起來有點恐怖,但發生機率應該極低)
  • 裝的過程大約 30 ~ 45 分鐘,沒什麼困難 (No SSAS, SSRS, Failover Cluster)
  • 共安裝兩台,一台從 RTM –> SP3,另一台從 SP2 –> SP3,裝完都沒甚麼副作用
  • 還沒有安裝的朋友,趕快安裝吧!!

2008年12月21日

Sara Ford 的 Visual Studio Tips 系列結束囉

前天看到 Sara 的 blog 上 po 了最後一個 VS 小技巧 (#382), 講的是如何從Command Prompt下指令執行”System Information”(好像沒甚麼用XD), 同時也宣告 VS Tips 系列的結束,剛剛用 Google Reader 看了一下她的 blog, 「Did you know…」系列的第一篇文章大約是 2007年7月發表的, 所以 382 個小技巧大約寫了將近一年半(都是用她自己的下班時間), 真是令人佩服(跟保哥有得拼)。

不過她又講說,明年會再另外開一個 blog 來延續這個系列@@
看來之後還是有辦法以多多學習如何增進使用 VS 的工作效率囉 ^_^
VS 中有非常多好用的小技巧,若不靠他們這些熟知內情的專家的說明的話,
相信一般人根本就不會注意到,而Sara自己也常說,很多技巧對她來說也很難發掘,
必須要追根究底的去問 VS Team 才能瞭解如何使用,所以這些技巧真是得來不易呀!
善用工具可以大大增進工作的效率,如果沒有看過她的 blog 的朋友,
建議抽空去晃晃,可以先看一下標題,很可能剛好就 hit 到你的需求哦!

以下是一些我覺得蠻有用的小技巧:

2008年12月16日

Microsoft patterns & practices - Application Architecture Guide 2.0 Released!

這是今年老闆丟給我們看的一份文件,年中的時候還只有 1.0,不過今天發表了 2.0 囉!
雖然這份文件份量蠻多的 (387頁),不過內容很充實,有空的話應該要花些時間讀一下。

稍微瞄了一下,除了傳統的 Layer & Tiers Archetype,這次的 release 強調 RIA 的部份,但是很奇怪的用了 Rich Internet Application 這個 Macromedia (Adobe) 提出來的 term,而不是微軟用的 Rich Interactive Application,結果查了一下 Wiki 之後發現, 目前看來應該是 Adobe 的 term 勝出了吧 XD (PS. SL3 的 3D 效果還蠻炫的)

App Arch Guide 內容如下:
Parts
Part I, Fundamentals
Part II, Design
Part III, Layers
Part IV, Archetypes
Forewards
Chapters
Part I, Fundamentals
Part II, Design
Part III, Layers
Part IV, Archetypes
Appendix

2008年11月10日

Microsoft TechEd 2008 補完 -- 技術篇 (Oslo, Rosario)

呼 ... 接下來這篇是 MS TechEd 2008 Taiwan 系列的最後一篇了,主要記錄的是之前漏掉的細節,還有一些新的技術架構的相關資料。因為最後發現要補完太吃力累了,而且沒有實務經驗容易淪為嘴炮,因此以下是之前寫好的部份內容,暫時就先這樣囉!希望明年可以寫比較深入的文章 ...
  1. 第一天早上的主題演講:by Steve Guggenheimer (OEM事業群全球副總裁),主題是「IT Heroes: Changing the World of Information Technology」,有些報導可以參考 iTHome 這篇,裡面提到「Model Driven Development」和「Virtualization」是非常重要的主題之一,關於 MDD 下面會有一些資料,而虛擬化的部分,從2008年10月份的TechNer Magazine以虛擬化為主題就可以看出其重要性,其中這篇講到如何利用「Offline Virtual Machine Servicing Tool」來進行大規模的 VM 升級,還蠻有趣的,不曉得 VMWare 那邊相對應的 Solution 是甚麼。
  2. Oslo (官方網站
    Oslo 是一個全新的塑模平台 (Modeling Platform),涵蓋的範圍遠超過 UML,
    一方面微軟也不認為 UML 有取得非常顯著的成功。它將融合Visual Studio Team System和System Center,讓它們可以彼此協同運用,將應用程式與日常IT作業進一步整合在模型(Model)之下。

    .NET Framework則是企圖擴充WCF和WF這兩種環境,使它們也能具備以模型驅動的程式開發能力。

    SDK CTP下載,其中用來寫「M」的intellipad是個還頗有趣的工具。
  3. Rosario (Overview
    後來仔細讀了一下資料之後發現,Rosario 是下一代 VSTS 的  code-name,至於不是 VSTS 的版本應該還是統稱為 VS2010 吧。 (CTP Download

    (1) 正式支援五個 UML Diagram 
         包括 Activity, Component, Logical Class, Use Case, and Sequence.

    (2) 加強應用程式生命週期管理 (Application Lifecycle Management)
         參考 iTHome 的這篇報導,還有這篇。目標是讓所有貢獻軟體開發的核心開發人員、測試人員到專案經理人、設計人員及企業分析師都能夠參與整個ALM管理,讓參與軟體開發的各式成員將更容易在開發過程中進行協作。包括新的架構檢視工具(Architecture Explorer),Visual Studio 2010 Architecture提供技術人員或非技術人員都能以模型透過圖形化的方式協作,以及定義企業與系統功能。新版本同時支援統一建模語言(Unified Modeling Language,UML)及特定領域語言(Domain Specific Language,DSL)。

    (3) 增強對平行運算的支援

    在簡化平行運算方面,為了善加利用目前流行(且未來會更普遍)的多核心架構
    .NET Frameowrk 4.0將強化對平行運算開發的支援(見參考資料3, TPL, PLINQ),
    在 core library 中新增如 "AsParallel"、"Parallel.For"、"Parallel.Invoke"等語法,
    讓被包覆在其中的程式能夠交由System.Threading.Tasks中的類別來負責,
    有效的將底層複雜的實作隱藏起來,讓開發人員能更快上手。

    但就如同微軟之前將複雜的實作包裝起來的結果(e.g. MS Ajax),
    雖然有效降低開發的進入門檻,但也讓因粗心或不了解細節的開發人員寫出bug的機率大增(如果你根本不會寫,那麼你就不可能寫錯),因此在 tooling 上提供完整的 debug 支援也是很重要的,而這個工作理所當然的落到了 Visual Studio 身上。

    在將平行運算的複雜運作交給 .NET Framework 這個 black box 去執行後,
    底層會自動將運算切割為task,並交由多個CPU來執行,為了能夠更有效的在這樣的環境下 debug,VS debugger 新增了幾種View,包括 "MultiStack", "Task List" 和 "MultiWatch" 等,大致上就是用圖形化的方式讓開發人員能夠快速了解此運算 overall 的執行狀況。此外最重要的 Profiling 工具也沒有缺席。

    其他參考資料:
    (1) Microsoft Unveils Next Version of Visual Studio and .NET Framework
    (2) Improved Support For Parallelism In The Next Version Of Visual Studio
    (3) Microsoft Parallel Computing Developer Center
PDC中有許多更深入的探討,相關資源請參考這裡

雜記: MS PDC 2008 Content & .NET Framework 4.0

話說十一月的文章數量似乎很少:p 最近關於 PDC 的資料實在太多了,
而且只是看看而已也沒什麼特別的心得,so ... 先用這篇文章紀錄一下哪裡可以找到 PDC 完整的內容,還有哪裡可以找到最新版的 .NET Framework 4.0 海報吧!

2008年10月6日

第一次認真寫 VBA --> Report Generator

本篇範例可以到這裡下載。裡面的程式才是最正確的,下面抓的圖有點舊XD
由於最近公司要辦活動,必須統計每堂課的報名狀況,
無奈報名系統產出的 Excel 太過基本,無法快速產出老闆想要的報表,
因此開始試圖用 VBA 自動完成一些重複性高的手動作業
也是我第一次撰寫簡單的 VBA 應用程式,過程還蠻好玩的 (雖然害我少睡很多)
因此以下按照報表產生的步驟來介紹一些我用到的方法和心得:
  1. 首先我做了一張 sheet (Settings),裡面放了一些 Report 的相關設定,
    未來可以繼續擴充,目前最重要的設定是課程名稱和 Worksheet Name的對應,
    例如「A_Very_Long_Name_About_SaaS」對應到「SaaS」,像下面這樣:
    Blog_Set_Worksheet_Name
  2. 接下來是將報名系統產生的 Excel 資料貼到 "Original Data"中,
    並且調整適當的標題,做好資料的排序,再加上「統計資訊」的區塊: 
    Blog_Original_Data_Sortedjpg 
    其中在統計資訊的部分,公式長的像這樣:COUNTIF(D:D,J2)

    這樣的原始資料的問題在於,由於在報名過程中每天的報名人數都會變化,
    如果要用這張 Worksheet 來統計每日 (或每堂課)的報名人數,
    就必須每天調整公式中的 Range
    因此最好是能將每堂課的資訊各自獨立到一張 Worksheet 中,
    如此統計資訊的公式中的 Range 就可以使用整個「欄」, (像上面那樣)
    而不用根據每天的資料筆數來調整公式中的 Range。

    而上述這個「將每堂課的資訊各自獨立到一張 Worksheet 中」的動作,
    如果要每天手動去複製就相當的麻煩,而且複製前還必須要先刪掉舊資料,
    因此如果能透過 VBA 自動將每天報表中的每堂課的資料抽出來放到相對應的 Worksheet 中,統計的公式就會自動計算出最後結果,省時省力。

  3. 在主要的 VB Sub Routine 中,首先會先 loop 過整個 Workbook 內的 Worksheet,
    並且將目前 Worksheet 中已經存在的舊資料刪除,程式像下面這樣:
    Blog_Clean_Worksheet_Data 

  4. 若是第一次執行這個 Sub,要把以下的註解取消,以便根據 Worksheet 名稱來新增 Worksheet,如同註解中說的,看來 VBA 不支援 Try Catch
    Blog_Add_Worksheet
  5. 接下來就會抓取步驟一中設定的對應關係,並且將"Original Data"的標題以及統計資料列複製到每堂課程的 sheet中 (如此每張 sheet 的 Layout 都會是相同的):
    Blog_Main_Process

    其實以上就是這個 Sub 最主要的內容了,接下來會解釋「CopyTitleAndStatistics」和「ProcessData」做的事情。

  6. 實際上執行「複製標題列及統計資訊」的是「CopyTitleAndStatistics」,
    主要的程式像這樣:
    Blog_Copy_Title

  7. 而「ProcessData」則是分成兩段,首先要根據課程名稱,在 HR 原始報表中找出該課程的相關資料(With 區塊主要參考 Excel 內建的範例程式):
    Blog_Search_Source_Data_Area
  8. 接下來則是計算要負制的範圍,並且根據資料筆數來計算 Target Worksheet 要貼上的範圍:
    Blog_Calc_Targt_Data_Aea
  9. 最後產出的報表長的像這樣:
    Blog_Report

    在 "Original Data" 之後已經依據 "Settings" 內的設定自動產生好相對應的 Worksheet,並且將該堂課程的資訊貼進去,這樣就可以檢視每堂課的報名人數統計了。 

  10. 另外我還手動作了一張 "Report Overview" 的 Worksheet,有 summary 的功效:
    Blog_Overview
經過這次的練習,我有以下的心得:
  • 首先要先想好最終要產出的文件到底長甚麼樣子,才能分析裡面有哪些東西可以透過程式自動幫你完成 (或者透過痛苦的反覆人工作業來了解XD)
  • 其實 VBA 還蠻方便的,最大的好處是卡住的時候只要錄個巨集,就能很快的了解狀況,因此說明文件雖然不如 MSDN 好用,但還不致於會造成太大困擾。
  • VBA 也提供方便的 Debug 功能,像是即時運算視窗監看式等等,
    雖然用起來不太習慣,也有一些限制,但還是比 ASP 好太多了
Future Work:
  • 註解裡面有些記錄到嘗試失敗的部分,有空的時候可以再努力看看
  • 目前的 Report_Overview 中的儲存格內容是手動一格格設定的,應該VBA也辦的到
  • 在產生每堂課的 Worksheet 時,可以間隔的設定索引標籤顏色,這樣可讀性更高
平常實在沒甚麼機會接觸 VBA,除非遇到像這種久久才用到一次的報表,希望下次還有其他機會可以練習 :p

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D