【WP7整合Azure – Windows Azure Toolkit介紹】

投影片及範例下載

  1. 手機App開發的春秋大夢: 程式魔人的救贖~~ 明明熱愛Coding卻陷入為公司、為客戶寫自己沒興趣程式的磨難中,Markplace創造出不靠美工、業務、行銷就能用程式碼換銀子的可能(註: 但不代表每個阿貓阿狗都能靠此糊口)
  2. 雲端Storage: 電腦、行動裝置愈來愈多,需要可以隨時存取的共用儲存空間... (Dropbox、Google Docs、Azure…)
  3. 為何Mobile Application需要雲端?
    * 硬體限制: CPU運算能力、Memory/Storage有限
    * 應用軟體需求: 即時訊息(FB、MSN)、內容更新
    * 人為因素: 刷機(JB)或換機(連絡人/行程表備分)
  4. 雲端服務的成本:
    * CPU、Memory空間、Storage空間、網路頻寬,每一項都要以量計價
    * Web Hosting vs Cloud: Web Hosting固然便宜,但在可靠度、穩定性及可擴充性方面無法與Cloud相比
  5. Apple Cloud用了Azure、Brower to WP7(講師寫的App)由Web Hosting換Azure後速度快7倍
  6. Windows Azure Toolkit(WA Toolkit): for WP7, Android, iPhone
    * Storage Service Access Library
    * Push Notification for WP7 & iOS
    * Access Control Service Library(認證服務,除了Azure內建的服務外,也可以接FB、Google等其他帳號體系,無需自己處理,使用者也樂得少記一組帳密)
  7. Storage Service Library
    * Table Storage API: 兩種做法 WP7->Azure or WP7–>AppServer–>Azure (後者似乎沒有享用到好處)
    * Azure Storage並不像傳統DB的Schema概念,每一筆Row的欄位數目、型別不見得要相同
    * 關鍵字: account, shareKey, partition, createTableIfNotExist
    * Blob Service: CloundBlobContainer, CloundBlobClient, ListBlobWithPrefix
  8. Push Notification:
    WP7 App向MPNS(Microsoft Push Notification Service)要一個Uri –> WP7 App將Uri交給App Server –> App Server將通知內容與Uri交給MPNS -> MPNS將通知傳給WP7手機
    關鍵字: ToastPushNotificationMessage, TilePushNotificationMessage
    註: Toast Notification有符號編碼問題
    * App要訳得向使用者確認是否啟用Push Notification,否則申請上架肯定被退件
  9. ASP.NET Membership可使用TableStorageMembershipProvider,以Azure Storage當成帳號資料來源。(TableStorageRoleProvider,TableStorageProfilerProvider,TableStorageSessionProvider,VS2010有提供MVC版的專案範本)
  10. Access Control Service
    * Windows Live、Facebook、Google帳號嘛也通
    * Facebook整合: 要建立Facebook應用程式,並在Azure做設定。登入後會得到 RequestSecurityTokenResponse: Email of Facebook, Name of Account, Access Token
  11. WAToolkit Andriod版因為語系關係,只能在模擬器上跑。WAToolkit iOS版因為語系關係,只能在英文版上跑(有解法)。

【WP7 MVVM設計模式】

  1. What’s MVVM?
    View –> ViewModel –> Model
    ViewModel說穿了就是View's Model,View在用的Model
  2. MVVM歷史: Martin Fowler發表Presentation Model(PM),但當時缺乏可實現它的技術。2005 WPF上場,已能實現PM設計模式(Binding是關鍵),MS做了修改,生出MVVM。2007 Silverlight上場,但與WPF在功能上有差距,要實現MVVM要繞路很花功夫。到WP7.1,Sliverlight與WPF更接近,實現MVVM的難度大滅。
  3. MVVM很複雜: 一堆實作: Prism(MS官方版), MVVM Light Toolkit, Catel, Caliburn Micro, Simple MVVM Toolkit… 不同Framework的玩法差異很大
  4. Why MVVM?
    * Unit Test (此時,冷不防昨天的筆記文忽然被講師Moli搬上大銀幕作為單元測試的註腳,看到自己的文章被放大到超過5公尺寬,好壯觀,忍不住想按個讚! 不過,馬上也被Moli當場點名... :P)
    * 跨平台(限Windows的平台) Web/RIA/WP/WinForm…
    * 希望與美工設計師和平相處,搞UI的跟寫程式的從此橋歸橋、路歸路,設計師的產出成果不要被Developer糟蹋…
  5. 範例: 台北市政府公開資料,格式為XML,將其轉成Entity Class,定義Property對應XML中的值。
  6. 使用Blend開發(Create DataContext),將Entity Class轉換成IDE設計階段可以存取的資料來源(XAML模擬的假資料),可直接拖拉欄位綁到Silverlight上的元素。
  7. ** 使用Expression可以增加氣質,但無法改變沒有天分的事實 **
  8. CodeBehind的問題: Expression也會去更動.xaml, .xaml.cs,設計師跟工程師還是會有衝突
  9. UI Design Pattern的選擇: MVC, MVP, PM(衍生MVVM)。共通點(祖訓) => 1) 一定要把UI跟Logic徹底切開 2) UI認識Model, Model不應知道UI的存在,
  10. ViewModel相當於View與Model間的中間層,對Model而言是View的角色、對View而言是Model的角色
  11. Binding要順利運作,資料需用Property存放(不可用Field)
  12. DesignerProperty.IsInDesignTool… 判斷是在Design Time, Run Time
  13. Developer負責ViewModel及Model,Designer負責XAML及CodeBehind ,避免衝突
  14. View與ViewModel的溝通方式
    Data Binding(與資料做連結)、Command(與程式碼做連結)、Behavior(Action與Trigger的合體,比Command更好用,且可重複利用)
  15. 要順利Binding,Entity要實做INotifyPropertyChange介面,並宣告 PropertyChangedEventHandler ProertyChanged事件(供View去掛載事件觸發UI的同步更新), Property改變時則要呼叫OnPropertyChanged Method觸發ProertyChanged事件
  16. WP7.0不支援ICommand(透過ActionCommand繞遠路)、WP7.1支援ICommand(與WPF同)
  17. Command: Designer可利用Expression Blend將按鈕的事件連結到Developer寫在Entity裡的程式碼
  18. Command限制: 不是所有Control都Support Command,Command通常表示"按下"語意(那"載入"呢?),解決之道,用Behavior(用Trigger+Action)擴大Command的效益
  19. MVVM的缺點!!
    * Data Binding很強,但很多錯誤要等到RunTime才會發現
    * Data Binding效能不夠好(在手持裝置上更明顯)
    * WPF/Silverlight實作MVVM的方法很多,眾多Framework各有千秋(每一家都有自己的搞法),缺乏統一標準
  20. 介紹MVVM Light Toolkit
    * 跟中文版VS有相容問題
    * 新增加專案樣版(含Model及ViewModel資料夾)
    * XAML會新增一個Global Resource宣告
    * 簡單的事變得超麻煩!! 例如 第一頁翻第二頁: 新增MVVM View(Page) -> 新增ViewModel –> ViewModelLocator(CodeSnippet) –> 使用RelayCommand –> NaviMessage –> ReceiveMessage(…)  用Design Pattern是要付出代價的,因此未必所有場合都適用

【.NET程式效能調校與偵錯】

  1. 誰會最先反應效能問題? User!
  2. 效能調校的極限在哪裡? 有所謂的最佳化嗎? (註: 沒有,端賴你願意付出多少代價)
    * 了解客戶的期望(只有可接受/不可接受,沒有最佳/最好)
    * 80/20原則: 開始階段花20%的力氣提升了80%效能,後面可能花80%的力只提升不到20%
  3. 效能問題處理步驟:
    * 縮小問題範圍: 鎖定有問題的Module、Class甚至Method,並試圖重現問題
    * 不同階段用不同工具: Profiler、MemoryDump
    * BugFix後的迴歸測試(防止修好一個問題又生出兩個)
  4. 三大效能指標: CPU、I/O、Memory
  5. 耗用CPU資源的元凶: 重度數學運算、無窮迴窮、失控的遞迴、過多的Thread(Context-Switching)
  6. I/O調整: Defragment、RAID、善用Cache機制
  7. 記憶體術語:
    * 處擬記憶體: x86: 上限4GB,再切成UserModel及KernalModel,x64 16TB(理論值為16EB,但現階段無對應硬體,所以Windows只實作到16TB)
    * Memory Manager將每個Process的記憶體位址對映到實體記憶體
  8. /3GB(boot.ini的啟動參數) 針對x86系統,將UserModel拉大到3GB。(案例: 改了/3G,但Application還是只能吃到1.7GB! 記得要用editbin.exe將PE Header LargeAddressAware屬性設成true,或是在Build程式時指定。dumpbin.exe可以查看Application can handle large (>2GB) addresses,x64位元程式則不用擔心這個)
  9. /PAE由32bit->36bit,可以將記憶體空間由4GB提高到64GB,RAM足夠時可減少Paging機率
  10. AWE: 啟動後可使用超過4GB的空間,但只能用來放資料,不能放程式
  11. Working Set: 程式的實體記憶體用量,不用Paging就可讀取
    Working Set-Priv: 只專屬該程式的實體記憶體,其他Process不能存取
    Reserved Memory: VirtualAlloc或HeapAlloc宣告的空間(尚未使用)
    Committed Memory: 配置給Process用的空間
    Virtual Bytes: 宣告變數後,保留的空間。(Out-Of-Memory指的是Virtual Bytes)
    Private Bytes: 給值後的變數空間就歸入Private Bytes(不含共享記憶體)。工作管理員的VM Size就是Private Bytes
    Pool Memory: MemoryManager會建立兩種記憶體空間供核心層元件配置系統記憶體
    * Paged Pool Memory: 可以被寫到分頁檔
    * NonPaged Pool Memory: 例如: 滑鼠Driver用的Memory
    Hard Paged Fault: App要的資料不在WorkingSet,必須由Page檔讀取
    Soft Paged Fault: 不在目前Working Set-Priv,但存在Woking Set-Shared中,對效能衝擊不大,一般可以忽略
  12. 工作管理員: 記憶體使用量->Working Set、認可大小/虛擬記憶體大小 –> Private Bytes。不同的OS用詞還不一樣,需要懶人包/CheatSheet
  13. 效能監視工具:
    % Processor Time > 70/CPU
    Processor Queue > 2/CPU
    Process and Thread Objects也有以上兩種Counter,可用以觀察哪一個Process耗用CPU
    Aavailable Bytes (<5% 實體記憶體)
    Pages / sec (Page Input + Page Output) 沒有特定標準,只能用Baseline來比對
    Page Faults / sec (Soft + Hard page fault) 評比標準同上
    Avg Read Queue Length ( > 2 / disk,RAID時要除以HD數)
    Avg Write Queue Length ( > 2 / disk)
    % Disk Time (>50%)
    Avg Disk Read Sec/Read 10-20ms OK 20-50ms Slow
    註: ECC的記憶體會因需計算Parity,速度較一般RAM來得慢
  14. Visual Studio效能精靈: 取樣(週期性中斷App蒐集資料)、檢測(計算每一個Function執行時間)、並行(針對多執行緒)
  15. 取樣: 每次樣本Callstack都出現的Method(頻率高或速度慢)=>調校重點
    可針對1) 一個或多個專案 2) 外部程式 3) ASP.NET程式
  16. Profiler的報表提供圖表檢視,還可以連結到Source Code的位置,並可比對兩份報表的差異
  17. 除錯TIPS:
    * 自訂Exception最好加上[Serializable],以便被WCF、WS機制保留下來
    * 請throw,而不要throw ex(才能保留Stacktrace)
    * 善用Trace寫Log
    * 每次編譯請保留Symbol檔,在Production上可視需要移除(保留時寫Log才會有程式行數)
  18. Application_Error: Global Exception Handle,但還是有攔不到的Exception(ex: Main Thread以外發生的Exception,所以Multithread程式最好自己加上try..catch)
  19. Trace關鍵字 TraceSource、TraceListener、Switch、SourceSwitch、TraceFilter
  20. 範例: System.Net.Sockets的Class其實已埋了寫Trace的程式碼,可以透過config開啟switch(Verbose),可獲得額外的Debug資訊
  21. IntelliTrace -> 在發生Exception的時點,左側會出現一些小Icon,可以往前追CallStack的歷程,還可以倒帶回去重新執行CallStack中的步驟,並能蒐集使用者的操作記錄(Guesture...)以便重現問題
    (不支援Native C++、Silverlight)
    註: Enable IntelliTrace後,就不能在編輯後繼續(Edit and Continue)

【IIS 7.5開發、管理與擴充】

  1. IIS7.5的優點:
    安全性: 功能委派、AppPool個別化帳號(參考)、Request Filter
    支援PHP(FastCGI效能更好)
    高可用性: 集區管理功能更完整(定時回收...)
    效能: 多工作者處理緒、支援壓縮(比IIS6不人道的設法方便很多[見證])、Kernel Mode SSL(不需要在KernelMode/UserMode切換,效能更好)
    執行期診斷
    易於設定: appcmd、PowerShell
    容易擴充: 例如: IIS6時代要做到URL Rewrite很困難
  2. IIS6 ISAPI架構、疊床架屋,IIS7則將.NET模組直接整到處理流程中,所有Request都可交由.NET處理=>URL Rewrite很容易
  3. IIS7.5管理模組->透過Platform Installer安裝(VS2010工具列有個"安裝Web元件") 裝好IIS管理員下方就會有出現Icon
  4. 重要的擴充功能: IIS 7.5 Express, Web Deployment, URL Rewrite, URL Authorizing, Request Filtering, IP and Domain Restriction / Dynamic IP Restriction, Application Request Routing(可作為WebFarm Load Balance之用)
  5. IIS7管理命令列工具(appcmd): C:\Windows\System32\inetsrv, appcmd list sites, appcmd add site /Name:site_name…, appcmd delete site “…”, appcmd list apppools
  6. URL Rewirte: Rule-based, RegularExpression比對, 可利用ServerVariable及HTTP Header判斷,可以匯入mod_rewrite定義(from Apache)
  7. Why URL Rewrite? 
    改版後相容舊網址、SEO、User-Friendly URL便於使用者記憶、隱藏檔案結構、引導智慧性手機連線到特定頁面
  8. URL Rewrite Demo: /Customer.aspx?id=ABC –> /Customer/ABC,還可以設定特定Pattern進行封鎖,遇到時中止連線或傳回403/404...
  9. 若要在本機專案時測試URL Rewrite: 使用IIS Express,因VS Dev Server不支援
  10. URL Rewrite、Default Page(index.html…)等設定都已結合在web.config中,Copy到哪都會跟過去(包含IIS 7.5)
  11. 功能委派(Feature Delegate): 可以將某個功能設成唯讀,底下的子網站就不能透過web.config設定該功能(ex: 電腦金鑰、URL Rewrite),試圖設定還會出錯
  12. WebDeploy: msdeploy.exe(參考),裝了WebDeploy模組,在Web Application上按右鍵選單會出現"部署"選項
  13. IIS 7.5活動分析與監督
    監督工作者處理緒(Worker Processor)、設定發生異常時觸發(可設定失敗要求追蹤規則,例如: 超過10秒寫Log,Default Web Site要啟用站台追蹤功能)
    XML + XSL可以直接看排版後的結果。
  14. 利用Log Parser及Log Parser Lizard可以使用Query語法查詢特定的Request(例如: 執行時間最久的前20個Request)
  15. 安全控制功能: URL Scan,過濾無效或有攻擊嫌疑的Request,可以依據副檔名、URL內容(例如: ..\..\老梗)、QueryString、特定資料夾、HTTP Verb、HTTP Header、QueryString/HTTP Header長度(溢位攻擊手法)
  16. 超危險的網頁寫法示範: ShowDoc.aspx?file=../../SomeWebAppFolder/web.config,任由使用者指定任意路徑顯示檔案是很恐怖的程式設計方式,跟SQL Injection一樣危險。
  17. Dynamic IP Restriction: 在指定時間內收到來自同一IP的Request次數超過標準就鎖定該IP柰止存取,只能設定在Default Web Site層次,可防DoS、暴力猜密碼(註: 因不能指定URL,似乎不能只針對猜密碼網頁鎖定攔阻)

【Sharepoint 2010開發: HTML+jQuery】

投影片及範例程式下載

  1. 目標: 加入HTML5、引用jQuery、用JS客製UI、Javascript Client Object Model、OData Service(REST衍生的資料存取規格,把URL當成SQL玩)
  2. Sharepoint 2010預設不支援HTML5,故要修改v4master: 去除<meta http-equiv=”X-UA-Compatible” content=”IE-8” />相容及修改<!DOCTYPE html>
  3. Sharepoint 2010直接用瀏覽器就可以加入客製開發的程式與檔案
    Demo: 在首頁放入WebPart(內容編輯器),編輯內容,切換到HTML View加入HTML及Javascript,在其中插入<canvas>
    Demo: 將js及css放在Layout目錄(or 文件庫 /SiteAssets/*.css)
  4. 三種引用JS的方式: <script src=”…”>, Sys.loadScript(), <SharePoint:ScriptLink …>
  5. 讓VS2010可以啟用SP.js Javascript Intellisense的方法<% #if SOME_UNDEFINED_CONSTANT %><script>ExecuteOrDelayUntilScriptLoaded(“/_layouts/SP.debug.js”) ...
    但沙箱式視覺化組件.ascx,會找不到"/_layouts/*",改用C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\SP.debug.js
    註: ascx –> ascx.g.cs (全部編進DLL,才不會改到Sharepoint的東西)
    .js檔案則用/// <reference path=”C:\Program….\SP.debug.js” />
  6. 修改外觀(Ribbon)
    Ribbon可自訂按鈕,透過Sharepoint專案/模組來定義
  7. SP.UI.ModalDialog.showModalDialgo(options) <== 顯示Sharepoint風格的對話框(可指定URL), options.dialogReturnValueCallback = function()可在ModalDialog關閉時呼叫
  8. SP.UI.Notify 顯示右上角黃色訊息 / SP.UI.Status 顯示紅色狀態條
  9. Why Client Object Model?
    * 不用在Server端放程式
    * Office 360的沙箱專案不能存取站台以外的資源
  10. /_layouts/SP.js(SP.debug.js未壓縮版,供JS Intellisense) 內含了Client Object Model相關程式,在Server端則由Client.svc接受XML Request,傳回JSON
  11. 查詢: SP.ClientContext.get_Current().executeQuery() or executeQueryAsync()
  12. 已有佛心牛人將繁瑣的步驟包成jQuery程式庫囉! jquery.SPServices-0.6.2.js @ CodePlex
  13. Odata:
    * 基於ADO.NET Data Service
    * 用HTTP Verb決定操作: GET(讀取), PUT(新增), MERGE(修改), DELETE(刪除)
    * 格式: /_vti_bin’/ListData.svc/{ListName}[({No})]/[{Attribute}]
    查詢語法: 加上?以$filter, $select, $expand, $orderby等參數
  14. 更新Tips: 在jQuery AJAX的beforeSend對XHR做手腳:
    xhr.setRequestHeader(“If-Match”, etag); //etag由查詢的結果取得
    xhr.setRequestHeader(“X-HTTP-Method”, “MERGE”);

Comments

# by HackMan

第一次參加TechDays 有個問題想請教黑大 大會會提供所有課程的簡報、範例與影片檔給學員嗎?

# by Jeffrey

to HackMan,大會過陣子就會寄出光碟片,裡面將包含所有課程的簡報、範例程式、教學錄影,還有大會花絮。

Post a comment