TechDays 2011隨堂筆記0915
| | 2 | | 16,360 |
【WP7整合Azure – Windows Azure Toolkit介紹】
- 手機App開發的
春秋大夢: 程式魔人的救贖~~ 明明熱愛Coding卻陷入為公司、為客戶寫自己沒興趣程式的磨難中,Markplace創造出不靠美工、業務、行銷就能用程式碼換銀子的可能(註: 但不代表每個阿貓阿狗都能靠此糊口) - 雲端Storage: 電腦、行動裝置愈來愈多,需要可以隨時存取的共用儲存空間... (Dropbox、Google Docs、Azure…)
- 為何Mobile Application需要雲端?
* 硬體限制: CPU運算能力、Memory/Storage有限
* 應用軟體需求: 即時訊息(FB、MSN)、內容更新
* 人為因素: 刷機(JB)或換機(連絡人/行程表備分) - 雲端服務的成本:
* CPU、Memory空間、Storage空間、網路頻寬,每一項都要以量計價
* Web Hosting vs Cloud: Web Hosting固然便宜,但在可靠度、穩定性及可擴充性方面無法與Cloud相比 - Apple Cloud用了Azure、Brower to WP7(講師寫的App)由Web Hosting換Azure後速度快7倍
- 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等其他帳號體系,無需自己處理,使用者也樂得少記一組帳密) - 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 - 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,否則申請上架肯定被退件 - ASP.NET Membership可使用TableStorageMembershipProvider,以Azure Storage當成帳號資料來源。(TableStorageRoleProvider,TableStorageProfilerProvider,TableStorageSessionProvider,VS2010有提供MVC版的專案範本)
- Access Control Service
* Windows Live、Facebook、Google帳號嘛也通
* Facebook整合: 要建立Facebook應用程式,並在Azure做設定。登入後會得到 RequestSecurityTokenResponse: Email of Facebook, Name of Account, Access Token - WAToolkit Andriod版因為語系關係,只能在模擬器上跑。WAToolkit iOS版因為語系關係,只能在英文版上跑(有解法)。
【WP7 MVVM設計模式】
- What’s MVVM?
View –> ViewModel –> Model
ViewModel說穿了就是View's Model,View在用的Model - MVVM歷史: Martin Fowler發表Presentation Model(PM),但當時缺乏可實現它的技術。2005 WPF上場,已能實現PM設計模式(Binding是關鍵),MS做了修改,生出MVVM。2007 Silverlight上場,但與WPF在功能上有差距,要實現MVVM要繞路很花功夫。到WP7.1,Sliverlight與WPF更接近,實現MVVM的難度大滅。
- MVVM很複雜: 一堆實作: Prism(MS官方版), MVVM Light Toolkit, Catel, Caliburn Micro, Simple MVVM Toolkit… 不同Framework的玩法差異很大
- Why MVVM?
* Unit Test (此時,冷不防昨天的筆記文忽然被講師Moli搬上大銀幕作為單元測試的註腳,看到自己的文章被放大到超過5公尺寬,好壯觀,忍不住想按個讚! 不過,馬上也被Moli當場點名... :P)
* 跨平台(限Windows的平台) Web/RIA/WP/WinForm…
* 希望與美工設計師和平相處,搞UI的跟寫程式的從此橋歸橋、路歸路,設計師的產出成果不要被Developer糟蹋… - 範例: 台北市政府公開資料,格式為XML,將其轉成Entity Class,定義Property對應XML中的值。
- 使用Blend開發(Create DataContext),將Entity Class轉換成IDE設計階段可以存取的資料來源(XAML模擬的假資料),可直接拖拉欄位綁到Silverlight上的元素。
- ** 使用Expression可以增加氣質,但無法改變沒有天分的事實 **
- CodeBehind的問題: Expression也會去更動.xaml, .xaml.cs,設計師跟工程師還是會有衝突
- UI Design Pattern的選擇: MVC, MVP, PM(衍生MVVM)。共通點(祖訓) => 1) 一定要把UI跟Logic徹底切開 2) UI認識Model, Model不應知道UI的存在,
- ViewModel相當於View與Model間的中間層,對Model而言是View的角色、對View而言是Model的角色
- Binding要順利運作,資料需用Property存放(不可用Field)
- DesignerProperty.IsInDesignTool… 判斷是在Design Time, Run Time
- Developer負責ViewModel及Model,Designer負責XAML及CodeBehind ,避免衝突
- View與ViewModel的溝通方式
Data Binding(與資料做連結)、Command(與程式碼做連結)、Behavior(Action與Trigger的合體,比Command更好用,且可重複利用) - 要順利Binding,Entity要實做INotifyPropertyChange介面,並宣告 PropertyChangedEventHandler ProertyChanged事件(供View去掛載事件觸發UI的同步更新), Property改變時則要呼叫OnPropertyChanged Method觸發ProertyChanged事件
- WP7.0不支援ICommand(透過ActionCommand繞遠路)、WP7.1支援ICommand(與WPF同)
- Command: Designer可利用Expression Blend將按鈕的事件連結到Developer寫在Entity裡的程式碼
- Command限制: 不是所有Control都Support Command,Command通常表示"按下"語意(那"載入"呢?),解決之道,用Behavior(用Trigger+Action)擴大Command的效益
- MVVM的缺點!!
* Data Binding很強,但很多錯誤要等到RunTime才會發現
* Data Binding效能不夠好(在手持裝置上更明顯)
* WPF/Silverlight實作MVVM的方法很多,眾多Framework各有千秋(每一家都有自己的搞法),缺乏統一標準 - 介紹MVVM Light Toolkit
* 跟中文版VS有相容問題
* 新增加專案樣版(含Model及ViewModel資料夾)
* XAML會新增一個Global Resource宣告
* 簡單的事變得超麻煩!! 例如 第一頁翻第二頁: 新增MVVM View(Page) -> 新增ViewModel –> ViewModelLocator(CodeSnippet) –> 使用RelayCommand –> NaviMessage –> ReceiveMessage(…) 用Design Pattern是要付出代價的,因此未必所有場合都適用
【.NET程式效能調校與偵錯】
- 誰會最先反應效能問題? User!
- 效能調校的極限在哪裡? 有所謂的最佳化嗎? (註: 沒有,端賴你願意付出多少代價)
* 了解客戶的期望(只有可接受/不可接受,沒有最佳/最好)
* 80/20原則: 開始階段花20%的力氣提升了80%效能,後面可能花80%的力只提升不到20% - 效能問題處理步驟:
* 縮小問題範圍: 鎖定有問題的Module、Class甚至Method,並試圖重現問題
* 不同階段用不同工具: Profiler、MemoryDump
* BugFix後的迴歸測試(防止修好一個問題又生出兩個) - 三大效能指標: CPU、I/O、Memory
- 耗用CPU資源的元凶: 重度數學運算、無窮迴窮、失控的遞迴、過多的Thread(Context-Switching)
- I/O調整: Defragment、RAID、善用Cache機制
- 記憶體術語:
* 處擬記憶體: x86: 上限4GB,再切成UserModel及KernalModel,x64 16TB(理論值為16EB,但現階段無對應硬體,所以Windows只實作到16TB)
* Memory Manager將每個Process的記憶體位址對映到實體記憶體 - /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位元程式則不用擔心這個)
- /PAE由32bit->36bit,可以將記憶體空間由4GB提高到64GB,RAM足夠時可減少Paging機率
- AWE: 啟動後可使用超過4GB的空間,但只能用來放資料,不能放程式
- 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中,對效能衝擊不大,一般可以忽略 - 工作管理員: 記憶體使用量->Working Set、認可大小/虛擬記憶體大小 –> Private Bytes。不同的OS用詞還不一樣,需要懶人包/CheatSheet
- 效能監視工具:
% 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來得慢 - Visual Studio效能精靈: 取樣(週期性中斷App蒐集資料)、檢測(計算每一個Function執行時間)、並行(針對多執行緒)
- 取樣: 每次樣本Callstack都出現的Method(頻率高或速度慢)=>調校重點
可針對1) 一個或多個專案 2) 外部程式 3) ASP.NET程式 - Profiler的報表提供圖表檢視,還可以連結到Source Code的位置,並可比對兩份報表的差異
- 除錯TIPS:
* 自訂Exception最好加上[Serializable],以便被WCF、WS機制保留下來
* 請throw,而不要throw ex(才能保留Stacktrace)
* 善用Trace寫Log
* 每次編譯請保留Symbol檔,在Production上可視需要移除(保留時寫Log才會有程式行數) - Application_Error: Global Exception Handle,但還是有攔不到的Exception(ex: Main Thread以外發生的Exception,所以Multithread程式最好自己加上try..catch)
- Trace關鍵字 TraceSource、TraceListener、Switch、SourceSwitch、TraceFilter
- 範例: System.Net.Sockets的Class其實已埋了寫Trace的程式碼,可以透過config開啟switch(Verbose),可獲得額外的Debug資訊
- IntelliTrace -> 在發生Exception的時點,左側會出現一些小Icon,可以往前追CallStack的歷程,還可以倒帶回去重新執行CallStack中的步驟,並能蒐集使用者的操作記錄(Guesture...)以便重現問題
(不支援Native C++、Silverlight)
註: Enable IntelliTrace後,就不能在編輯後繼續(Edit and Continue)
【IIS 7.5開發、管理與擴充】
- IIS7.5的優點:
安全性: 功能委派、AppPool個別化帳號(參考)、Request Filter
支援PHP(FastCGI效能更好)
高可用性: 集區管理功能更完整(定時回收...)
效能: 多工作者處理緒、支援壓縮(比IIS6不人道的設法方便很多[見證])、Kernel Mode SSL(不需要在KernelMode/UserMode切換,效能更好)
執行期診斷
易於設定: appcmd、PowerShell
容易擴充: 例如: IIS6時代要做到URL Rewrite很困難 - IIS6 ISAPI架構、疊床架屋,IIS7則將.NET模組直接整到處理流程中,所有Request都可交由.NET處理=>URL Rewrite很容易
- IIS7.5管理模組->透過Platform Installer安裝(VS2010工具列有個"安裝Web元件") 裝好IIS管理員下方就會有出現Icon
- 重要的擴充功能: 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之用)
- IIS7管理命令列工具(appcmd): C:\Windows\System32\inetsrv, appcmd list sites, appcmd add site /Name:site_name…, appcmd delete site “…”, appcmd list apppools
- URL Rewirte: Rule-based, RegularExpression比對, 可利用ServerVariable及HTTP Header判斷,可以匯入mod_rewrite定義(from Apache)
- Why URL Rewrite?
改版後相容舊網址、SEO、User-Friendly URL便於使用者記憶、隱藏檔案結構、引導智慧性手機連線到特定頁面 - URL Rewrite Demo: /Customer.aspx?id=ABC –> /Customer/ABC,還可以設定特定Pattern進行封鎖,遇到時中止連線或傳回403/404...
- 若要在本機專案時測試URL Rewrite: 使用IIS Express,因VS Dev Server不支援
- URL Rewrite、Default Page(index.html…)等設定都已結合在web.config中,Copy到哪都會跟過去(包含IIS 7.5)
- 功能委派(Feature Delegate): 可以將某個功能設成唯讀,底下的子網站就不能透過web.config設定該功能(ex: 電腦金鑰、URL Rewrite),試圖設定還會出錯
- WebDeploy: msdeploy.exe(參考),裝了WebDeploy模組,在Web Application上按右鍵選單會出現"部署"選項
- IIS 7.5活動分析與監督
監督工作者處理緒(Worker Processor)、設定發生異常時觸發(可設定失敗要求追蹤規則,例如: 超過10秒寫Log,Default Web Site要啟用站台追蹤功能)
XML + XSL可以直接看排版後的結果。 - 利用Log Parser及Log Parser Lizard可以使用Query語法查詢特定的Request(例如: 執行時間最久的前20個Request)
- 安全控制功能: URL Scan,過濾無效或有攻擊嫌疑的Request,可以依據副檔名、URL內容(例如: ..\..\老梗)、QueryString、特定資料夾、HTTP Verb、HTTP Header、QueryString/HTTP Header長度(溢位攻擊手法)
- 超危險的網頁寫法示範: ShowDoc.aspx?file=../../SomeWebAppFolder/web.config,任由使用者指定任意路徑顯示檔案是很恐怖的程式設計方式,跟SQL Injection一樣危險。
- Dynamic IP Restriction: 在指定時間內收到來自同一IP的Request次數超過標準就鎖定該IP柰止存取,只能設定在Default Web Site層次,可防DoS、暴力猜密碼(註: 因不能指定URL,似乎不能只針對猜密碼網頁鎖定攔阻)
【Sharepoint 2010開發: HTML+jQuery】
- 目標: 加入HTML5、引用jQuery、用JS客製UI、Javascript Client Object Model、OData Service(REST衍生的資料存取規格,把URL當成SQL玩)
- Sharepoint 2010預設不支援HTML5,故要修改v4master: 去除<meta http-equiv=”X-UA-Compatible” content=”IE-8” />相容及修改<!DOCTYPE html>
- Sharepoint 2010直接用瀏覽器就可以加入客製開發的程式與檔案
Demo: 在首頁放入WebPart(內容編輯器),編輯內容,切換到HTML View加入HTML及Javascript,在其中插入<canvas>
Demo: 將js及css放在Layout目錄(or 文件庫 /SiteAssets/*.css) - 三種引用JS的方式: <script src=”…”>, Sys.loadScript(), <SharePoint:ScriptLink …>
- 讓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” /> - 修改外觀(Ribbon)
Ribbon可自訂按鈕,透過Sharepoint專案/模組來定義 - SP.UI.ModalDialog.showModalDialgo(options) <== 顯示Sharepoint風格的對話框(可指定URL), options.dialogReturnValueCallback = function()可在ModalDialog關閉時呼叫
- SP.UI.Notify 顯示右上角黃色訊息 / SP.UI.Status 顯示紅色狀態條
- Why Client Object Model?
* 不用在Server端放程式
* Office 360的沙箱專案不能存取站台以外的資源 - /_layouts/SP.js(SP.debug.js未壓縮版,供JS Intellisense) 內含了Client Object Model相關程式,在Server端則由Client.svc接受XML Request,傳回JSON
- 查詢: SP.ClientContext.get_Current().executeQuery() or executeQueryAsync()
- 已有佛心牛人將繁瑣的步驟包成jQuery程式庫囉! jquery.SPServices-0.6.2.js @ CodePlex
- Odata:
* 基於ADO.NET Data Service
* 用HTTP Verb決定操作: GET(讀取), PUT(新增), MERGE(修改), DELETE(刪除)
* 格式: /_vti_bin’/ListData.svc/{ListName}[({No})]/[{Attribute}]
查詢語法: 加上?以$filter, $select, $expand, $orderby等參數 - 更新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,大會過陣子就會寄出光碟片,裡面將包含所有課程的簡報、範例程式、教學錄影,還有大會花絮。