2013年6月27日

紀錄文 - Visual Studio 2013 Preview!!

是的,又遇到一年一度的Windows OS 大拜拜Build 2013!!,每年到了這個時候,又要開始熬夜的熬夜,學習的學習,還記得大概是前年吧,遇到這個Build大拜拜的時候,還剛好是台灣的TechDays...不斷要熬夜的看Windows 8,隔天還要努力的在TechDays聽課…

而這次的大拜拜,Microsoft端出了Windows 8.1和Visual Studio 2013、Windows Server 2012 R2,SQL Server 2014,和上次不同的是,這次比較沒有統一叫做2012了XD。

還記得當初Visual Studio 2012測試的時候,老實說,讓我感受到震撼的就是那個配色XDD,而回想當初,其實現在2013推出,老實說,真的沒過多久,其實這也是拜Microsoft跑敏捷、Scrum的成果,但反過來說,我們這些白老鼠們,可能就會累死了…

OK,回到主題,雖然這次Visual Studio 2013 Preview很快地推出,但大家其實也不用太擔心,因為Preview到正式版本,還有一段路要走~

最後,這篇依舊是個沒有啥內容深度的紀錄文Orz…留給我自己做個紀錄紀錄…畢竟以後正式版,還有很多調幅的空間,所以請各位大哥大姊前輩學姊們多多見諒了喔~

最後,如果有興趣搶先遊玩,可以參考小弟最後的連結,小弟我會把所有的下載連結放在最後面。

這次,比較特別的是,小弟沒用自己的PC,來測試這些新軟體,而是使用Windows Azure來測試,或許大家會想說,是因為小弟特別愛用Azure嗎??..其實是因為小弟的PC掛掉了- -…

目前Azure已經有放上了Windows Server 2012 R2 Preview和SQL Server 2014 CTP1,甚至,如果有興趣的話,也可以玩玩看Sharepoint 2013~( 也有提供VS2013的VM,但小弟想自己裝一次..SO~~ )

image

除此之外,MSDN也提供下載,不過這次速度滿快的,除了MSDN的人員外,MS也提供了一般使用者下載。( 不過不是放在MSDN,而是放在其他的位置 )

image

另外,這次MS很有誠意的,也把繁體中文語系給丟上了來!!超佛心的啦!!

image

下載完後,就是安裝畫面,基本上和2012沒啥兩樣。

image

另外,這次比較特別的是,原本要額外安裝,並且歸屬於SQL Server的SSDT,現在內含到Visual Studio 2013了( 難怪好友Terry說,他在SQL Server 2014沒看到- -… ),此外,Windows Phone 8 SDK預設是沒勾選的…因為跑Windows Phone 8的模擬器,是要啟用Hyper-V的。

image

開啟後,Visual Studio 2013會要求我們登入,根據中文敘述,會同步狀態設定,至於到底會做到怎樣,等下一個版本再裝起來的時候,就可以知道了=v=。

image

登入後,就是啟動前的設定畫面,可以從這邊設定,喜歡的配置,並且選擇顏色,現在藍色也可以自由選擇了。 ( 小弟當然還是用黑色阿!!! ),另外,比較特別的是那紅底白字的SC,不知道是不是名子的縮寫。

image

開啟後,就是令人熟悉的中文介面!!其實和Visual Studio 2012外觀差不多,所以中文翻譯大致上也應該是直接套用吧,而比較特別的是,右上角會出現名子,還有在搜尋旁邊有一個提示的旗子標示,至於那個笑臉,如果有裝過Office 2013體驗版的朋友們,可能就會有印象,那個是回報用的,我猜未來正式版,那個笑臉應該會不見吧…

image

而如果打開WEB專案,可以發現,現在統整到ASP.NET Web應用程式…

image

打開後,可以再選擇自己要的~~,當然,這方面的更新,之前前輩們都寫得很詳細了,就讓小弟草草帶過吧~ ( 逃 ) ( p.s 或許大家會發現有些東西還沒翻譯,那是正常的,官方也提到,那是因為有些東西還沒翻譯完~ Preview嘛~~ )

image

至於Cloud專案,很抱歉,還是要自己取得SDK ( 翻 )。

image

基本上就這樣了~~詳細的,有空再玩吧~@@~

最後附上下載網址。

http://www.microsoft.com/visualstudio/cht/2013-downloads

2013年6月23日

Windows Azure - 在Web Site下使用Azure SQL Database來存放Session

之前在4月的時候,講過Azure的課程,當時在Web Site底下,要使用Azure SQL Database來存放Session是件很麻煩的事情,因為還要建立資料庫等等。

但現在不用那麼麻煩了,經過小朱前輩的指導,現在官方已經使用Code First來自動建立資料庫了!!,所以之前寫的那篇,大家可以扔到垃圾場去了..

以下文章是前篇的改良版。

相信如果有讀過這篇( p.s 現在官方強烈建議,不要再用Azure Storage當Cache了),那可能會知道,不管是Cloud Service或是Web Site,前面都會有用到Load Balance,當然,如果後面只有一個站台,那就沒甚麼差,但如果後面有兩台以上的站台來分流,那Session的議題就變得很重要了…

而Cloud Service很佛心的準備了內建Cache來解決這部分的問題 ( 不然用Azure Cache會貴森森… ),那Web Site呢!?其實除了貴森森的Azure Cache外,還有大家常知的…沒錯!!就是使用SQL Server來存放Session!!

當然,我們不會傻傻的Web放到Azure上,但卻把Session放在陸地上…所以,這篇的目的,就是要介紹,如何使用Azure的SQL Database來存放Session!! ( 嗯,或許大家會擔心效能上的問題,但根據可靠情報指出,目前Azure 上的SQL Database都是用SSD喔!! )

準備SQL Database

首先,我們當然要先去SQL Database來開一個新的SQL Server,這邊我們是要測試,所以很快的快速創建就好。

image_thumb5

是的,這樣db就完成了,不用像以前一樣,麻煩的做一堆事情,而到這邊,SQL Database就準備妥當了。

ASP.NET的修改( MVC同 )

其實ASP.NET的處理很簡單,我們首先先到NuGet取得以下套件,到線上的地方去搜尋Universal Providers,就可以找到Microsoft ASP.NET Universal Providers Code Libraries和Microsoft ASP.NET Universal Providers,而其實真正重要的是Code Libraries,也可以只裝Code Libraries。

( 其實也可以直接安裝ASP.NET Universal Providers,裝上去的時候,也會一併把ASP.NET Universal Providers Core裝上,其實Core是ASP.NET Universal Providers的底層核心,當安裝ASP.NET Universal Providers的時候,就會順便把ASP.NET Universal Providers Core裝起來,並且順便修改Web.Config;但如果直接裝Core,則不會協助幫忙修改Web.Config,變成要自己在Web.Config加上等下講到的程式碼。 )

image

如果直接裝了Microsoft ASP.NET Universal Providers,那它會自動在Web.config加入以下的Tag。

    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>
    <membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager defaultProvider="DefaultRoleProvider">
      <providers>
        <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </roleManager>
    <!--
            If you are deploying to a cloud environment that has multiple web server instances,
            you should change session state mode from "InProc" to "Custom". In addition,
            change the connection string named "DefaultConnection" to connect to an instance
            of SQL Server (including SQL Azure and SQL  Compact) instead of to SQL Server Express.
      -->
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>

是的,其實Microsoft ASP.NET Universal Providers不只是session而已,他還包含了User 、Role等東西,所以覺得Web.config很雜亂的話,也可以把其他的註解調或是刪掉也可以啦…

而現在,我們還需要修改一下Web.Config裡面的SessionState那邊,改成Custom的設定就可以了。( 或許有人會問,為什麼要填寫Customer,而不是SQLServer,原因很簡單,因為官方上面那串綠色的註解是這樣寫的阿XDDD,官方上面寫到,如果要部屬到Cloud環境,而且有多個Instances的話,要把InProc改為Custom,這也就是為什麼要改成Custom的原因… ),其次,因為我們會存放到Azure SQL Database,所以還要改一下連線字串,那連線字串的名稱呢!?是的,就是第二個紅色框框"DefaultConnection"。

image

會變成如下

    <sessionState mode="Custom" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" 
             type="System.Web.Providers.DefaultSessionStateProvider, 
             System.Web.Providers, Version=1.0.0.0, Culture=neutral, 
             PublicKeyToken=31bf3856ad364e35" 
             connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>

接下來

我們用搜尋的方式找到DefaultConnection( 建議用搜尋的方式,這樣才不會不小心建了兩次的DefaultConnection ),並填入連線字串,而再填入前,要先找到Azure SQL Database的連線字串。

image

然後選擇儀表板

image

然後選擇連線字串,就可以看到了,接下來就把整個連線字串複製下來。

image

最後貼到Web.conig。

image

會變成如下

  <connectionStrings>
    <add name="DefaultConnection" providerName="System.Data.SqlClient" 
         connectionString="Server=tcp:dkegao7az4.database.windows.net,1433;
         Database=ASPNETSessionTest;User ID=sky@dkegao7az4;Password=自己的密碼;
         Trusted_Connection=False;Encrypt=True;Connection Timeout=30" />
  </connectionStrings>

完成後,如果有存取到Session,就可以用瀏覽器的Developer工具來查看Cookie裡面紀錄的Session ID。

image_thumb51

我們可以透過Azure的db管理工具,看到Sessions Table已經自動幫我們建立起來了。

image

我們也可以從裡面看到,已經有對應的SessionID了,所以可以確定,這樣就已經把SESSION存放到DB裡面去了。

image_thumb4

題外話,因為Web Site前面的LB機制會自動認ip,所以通常狂按F5是測試不出來的,所以如果覺得這樣還不能證明,還可以手動去調整Web Site,如果沒有把Session存放到DB裡面去,當改變Web Site的時候,是會掉Session的,但如果存到db裡面去,就不會有這種問題了。

image

基本上,這樣就完成了~

後記

現在透過Web Site,其實整個機制就和一般使用IIS一樣的方便,而且Azure DB的效能也好很多,重點是,也不用自己多做甚麼事情,幾乎都可以輕鬆搞定,這邊,也很感謝小朱前輩利用中午吃便當的時候,一邊被我騷擾,一邊和我說有這種東西,在這邊再次感謝他,如果大家有興趣,下面的參考資料,也有小朱前輩上次上課的超詳細步驟解說!!

最後的最後,也提醒大家一下,這邊的範例,因為方便,所以在撰寫的時候就直接把Connection換成Azure SQL Database,如果在真正的專案執行上,也可以透過VS的發佈工具,動態的改變DB的Connection String,讓開發的時候使用LocalDB,正式的時候,使用Azure SQL Database喔~

以上,謝謝大家~~

參考資料

專案下載

Windows Azure - 錯誤The page cannot be displayed because an internal server error has occurred.

最近朋友問到小弟一個問題Azure Web Sites的問題,錯誤的畫面是。

The page cannot be displayed because an internal server error has occurred.

如下圖,就這樣的簡潔有力。

image

而朋友就算把CustomerErrors mode 關掉,還是只會出現如上的畫面。

<system.web>
<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.5" />
<customErrors mode="Off" />

通常,發生這種錯誤,幾乎都是Server層級的錯誤,有可能Web.config設定出錯之類的,所以也不會出現傳說中的黃底畫面。

那這種問題該如何解決呢?,就必須透過log機制去看了,在看之前,我們必須先把log機制打開;如下圖,將詳細錯訊息設成開啟。image

這時候,我們再登入FTP,就可以找到DetailedErrors的目錄。( 如果不知道如何登入FTP的朋友們,可以參考這篇,雖然那篇是講上傳,但Log的紀錄也是存放在同樣位置。)

image

進入後,就可以看到ErrorPage00001.htm,這就是錯誤畫面,我們把這個複製出來看看。

image

如下圖,我們熟悉的畫面就出現了,這時候我們就可以知道詳細的錯誤訊息來解決了~

image

大致上就這樣,給剛好有遇到問題的朋友們吧~

Scrum - 台灣第一次的敏捷國際研討會

6/20是台灣首次的敏捷國際演討會,說到敏捷,雖然台灣喊了很久,但一直在產業裏面都起不太來,而過了好長的一段時間,台灣終於有比較大規模的研討會了。

而這次,其實最吸引我的是神級的人物Scrum的創辦人之一Ken,所以抱持著朝聖的心情,就跑去瞻望一下=v=,其次,這次吸引我的另外一個原因,是幾乎都請到國外有經驗的公司經理來分享,不過比較可惜的是,這方面的分享,還是比較偏重於敏捷的好處…針對如何導入,還有導入的過程與方法,比較沒有多的琢磨,不過這也是因為每個場次時間不夠的關係。

以下是這次的圖文紀錄,大家就看看圖吧

第一場,是由神級的人物,Scrum的創辦人之一Ken Schwaber視訊來幫我們演講。

IMG_1631

原本Ken打算直接來到會場,但因為身體欠安,所以現場直接用Skype和Ken進行會議,

IMG_1632

Ken特別提到,大型Team更需要Scrum與敏捷,因為在過程中,要整合每一個團隊,更需要利用不斷迭代來進行整合。

接下來下一場,有提到Story是最重要的,而且是由Story產生Test Case,剛好也和小弟之前讀的書,相吻合,這又讓我想到91哥的BDD。

IMG_1633

其次,講者有提到,SCRUM的幾個重點。

  1. 分解故事
  2. 定期交貨
  3. 敏捷與Architecture的關係

比較有意思的是Architecture這塊,所以講者列出了下圖,而依據專案團隊的大小,就會有不同的做法,其中也提到,如果真的是大型系統,也不可能沒有文件,畢竟定義大型系統,還是會需要文件產出,總之,和寫Code一樣,系統的大小,也會取決於不同的做法。

IMG_1634

另外,有提到關於Story的三個重點

  1. 要不斷的整理Story,而整理的Story之時間點,應該在下次開始前,完成。
  2. Requirement Analyst,Developer,Tester都要出席
  3. INVEST,也就是Independent、Negotiable、Valuable、Estimable、Smail、Testable.

但可惜的是INVEST因為時間不夠,也沒時間講解清楚。

而最後講到這張投影片的時候,時間有點不夠,所以跳著講了,滿可惜的,大家就看看投影片吧。

IMG_1635

下一場是講PM和敏捷之間的關係。

講者有提到,敏捷其實不會完全改變整個企業流程,真正會變動的,可能只有中間一小塊。

IMG_1637

有提到目前公司舊有的流程。

IMG_1638

實際上,導入敏捷主要影響中間那塊而已,但這個部分,其實小弟是保留著一些看法,不過畢竟小弟不是專業的PM,這個問題,就留給專業的PM人員吧= =+。

最後,講者的總結。

敏捷很棒,但不是萬靈丹。

IMG_1639

下一場,是好友Franma,和熟悉的TFS,因為是好友,所以特別把他的人拍進去 ( 誤 )…Franma目前在國內也幫許多家超大型企業導入過敏捷,所以他講課的內容,深深的感受到,他在台灣導入敏捷的心路歷程XDDD。

不過也因此,他的內容,也非常的貼切台灣團隊遇到的問題。

IMG_1640

他首先提到,微軟的團隊已經分散到世界各地,但散在世界各地,要如何統一哩?

IMG_1641

結論當然是TFS,Microsoft目前全部都使用TFS來進行管控了,從一開始的VS,到現在的Windows 全部都用TFS做管理了。

IMG_1642

另外,Microsoft現在也開始執行敏捷( Scrum的創辦人之一Ken,都親自駐點到MS裡面指導了=V= ),所以現在產品更新從原本的18~24個月,變成每三個月 ( 所以我們快被搞死了= = )

這時候講到Daily Scrum,是否有Daily Meeting,就可以看出這個Scrum的成效了。

IMG_1643

這時候講到Product Backlog的關係,應該是由上而下。

IMG_1644

下面這張圖,更提到了由上而下,才能順利地抓出每個功能與進度。

IMG_1645

接下來,下午場次,是很特別,從對岸同胞過來講的。

2013-06-20 13.08.39

他有提到以前公司很難推動的,現在則非常容易推動,甚至自然而然就發生了。

2013-06-20 13.22.35

然後敘說,公司怎樣才會有優勢。

2013-06-20 13.28.25

最後講到敏捷的Scrum和XP。

2013-06-20 13.35.38

全部講完後,接下來是全體發問時間,不過因為距離有點遠,所以手殘,照片就糊掉了,請大家見諒阿XDD,而發問時間,其實還滿訝異的,大家發問的問題還滿多的,而基本上遇到的問題都還是"如何說服老闆"XDD,而基本上,就還是先從小團隊慢慢做起吧,當有成效的時候,才比較好和老闆推薦。

2013-06-20 13.48.17

最後是頒獎和抽獎品時間,獎品聽說有Ken的簽名書,和iPad Mini,正當我還在猶豫,我到底是比較想要Ken的簽名書還是iPad Mini的時候,就已經抽獎完了- -…

2013-06-20 14.43.54

最後,也很感謝Dann的邀請,參加了後續的高峰會議,而高峰會議真的談論了很多東西,而最令人深刻的還是CMMI和敏捷的議題;而講師也明確的提出,這是不牴觸的,就如前面提到,在大型的公司裡面,還是會需要流程的文件與控管,而CMMI Level 3也加入了Scrum的項目,但小弟CMMI還沒深入研究,就不再這邊多發表意見了…

以上,就是這次參加活動的照片,期待的第二年的舉辦喔!!

2013年6月17日

SQL Server - 神奇又好用的File Table

老實說,完全沒想到,會寫到SQL Server的這個功能,也多虧了公司內,強大的DBA同事Winnie,和神人百敬老師的一步一步指導,所以就在這邊紀錄一下,不然根據小弟的老人痴呆,大概過幾天就忘記了吧- -…

但是開始前,還是要敘述一下,甚麼是File Table,是的,顧名思義,就是存放檔案的Table,但存放的不是超級大的二進位檔案,而是這個檔案的資料,例如,檔名等資訊。

不過就只存放這些東西,好像也沒甚麼大不了的?,但File Table真正神奇的是,它可以和目錄去做關聯!!是的,簡單的說,就是某個路徑下,存放了某個檔案後,Table就會自動新增這筆資料,如果砍掉,這筆資料就會自動消失!!

沒錯,就是這樣的神奇,所以,基於小弟要朝向"潮"的型男之路邁進,所以決定嘗試一下這個很"潮"的技術…

首先,開始前先提醒大家,目前LocalDB是不支援此功能的,如有興趣,可以裝SQL Server 2012的正式版本,或是SQL Server 2012 Express,目前小弟是裝Express版本。

如果是第一次安裝,其實可以看到FILESTREAM,預設是沒有安裝的,其實File Table底層就是FILESTREAM,如果這邊不知道該怎麼輸入,也可以先略過,未來再開啟。

image

當裝完後,要使用File Table,就一定要打開FILESTREAM,要打開FILESTREAM就必須先打開SQL Server組態管理員(如下圖),其中最後面允許遠端存取,通常都會打勾,但下圖沒截到圖,所以這邊提醒一下大家。另外要注意的是windows共用名稱,這個名稱未來會變成目錄結構之一,所以也在這邊提醒大家一下。

image

接下來,用SSMS登入後,我們要執行一下如下指令。

EXEC sp_configure filestream_access_level, 2 
RECONFIGURE

完成如下圖,完成之後,我們再重新開一下SQL Server。

image

接下來,我們要用SSMS來進行設定,我們先選擇我們這台SQL Server,並且設定伺服器屬性,先去如下圖的位置,確定FILESTREAM存取權限是否已啟用完整存取。

image

SQL Server設定完後,我們要針對要執行的DB,進行設定,以下圖,我們要針對Test的db進行設定。我們這邊要設定檔案群組。

image

設定完檔案群組後,我們要繼續設定檔案的部分。我們要新增一個FILESTREAM的檔案。

image

接下來,我們再到選項的地方,我們要填入FILESTREAM目錄名稱,並且把FILESTREAM非交易式存取設定為Full,這樣才能讓檔案總管來存取,如果沒有設定Full,就只能透過SQL Server來進行檔案的存取,但透過SQL Server進行檔案的存取,其實是會消耗SQL Server的IO的,所以沒有特別需要,還是利用檔案總管來存取比較好;其次,目錄名稱也請特別注意,這個部分未來也會形成存取檔案的目錄結構之一。

image

最後,我們就使用T-SQL語法來建立File Table。

image

當然,他會產生一長串的T-SQL如下圖,我們只要稍微編修一下。

image

編修後的Code如下,基本上,比較需要注意的是FILETABLE_DIRECTORY的這個設定,這個設定也會牽涉到目錄結構,如果大家對其他語法有不懂的,底下的參考連結有MSDN的網址,大家可以去看看喔。

-- =========================================
-- Create FileTable template
-- =========================================
USE Test
GO

IF OBJECT_ID('dbo.FileTable', 'U') IS NOT NULL
  DROP TABLE dbo.FileTable
GO

CREATE TABLE dbo.FileTable AS FILETABLE
  WITH
  (
    FILETABLE_DIRECTORY = 'FS',
    FILETABLE_COLLATE_FILENAME = database_default
  )
GO

建立完成後,就會看到新的Table了。

image

最後,我們只要用檔案總管,就可以來新增檔案;這時候,大家可以發現,必須要用網路芳鄰的方式來存取檔案,而這個路徑,就是我們一路設定過來的路徑名稱。

image

最後,如果我們在這個資料夾,新增一個txt檔案,再回到Table裡面去看,我們可以發現,Table已經同步更新了喔!!

image

此外,如果我們從資料庫刪除了此筆資料,那檔案也會同步不見喔!!有沒有超級方便的!?

到這邊就完成了,當然,除了透過檔案總管外,也可以透過資料庫來存取資料,如果想知道更詳細的作法,可以參考MSDN喔!!

後記

還是要感謝老師們,不捨棄我的教我一步一步完成QQ…

參考資料