2017 年 2 月

第 32 卷,第 2 期

本文章是由機器翻譯。

Mobile DevOps - 透過積極監視應用程式及服務驅動開發

Kraig Brockschmidt | 2017 年 2 月

撰寫行動裝置應用程式完美的世界就是,首先,您知道完全與您的客戶想要立即非常這些成員會產生脫離和第二,您撰寫以滿足這些需求的程式碼會傳遞到這些客戶的立即。簡單地說,沒有任何間距也不會收到客戶的需求、 開發和交付之間。

完成幻想,正確嗎? 如果您已經解決的軟體開發,好吧,至少一小時,您知道實際上是這種情況不關閉。和尚未每位開發人員可能發生這種完美的迴圈,因為它完全是什麼您遇到當您撰寫自己的軟體。事實上,它可能是連結上神奇的程式碼一開始您有什麼。您想出了解,撰寫一些程式碼,按下 F5 瞧 ! 令人讚嘆事情您可以控制和圖形,以您最喜歡的意願...通常很晚到晚上玩。

可能怎麼接下來是您開始撰寫對其他人來說,處理程序中引入各種時間段延隔時間的軟體。相較於按下 f5 鍵,取得程式碼變更遞送給外部客戶所花費的時間一久,因此原始檔控制、 持續整合及連續傳遞至最佳化程序,在這一系列的過往文章中所述。也如此有關通訊 — 相較於撰寫,為您自己的軟體開發人員和客戶時,也能清楚了解客戶的需要和他們的體驗的挑戰就幾乎像前往遙遠的銀河系 !

因此,雖然您曾做過最好提供應用程式和服務可滿足客戶的需求,並嘗試防止缺失進入這些客戶,其實是一些缺失仍能透過它,某些客戶需要仍不符合。這是放置監視、 發行管線的最後一個階段中所述 [圖 1,會成為主要的考量。在這裡,焦點會轉移從傳遞至接聽,這表示要注意的錯誤和問題影響的客戶,並學習中,這表示探索不符合的需求,並驗證所有在第一時間進入的版本建立的假設。您聽聽,您學到什麼餵送回到磁碟機的程式碼的下一系列的發行管線的開頭變更。

監視是基本了解什麼應該磁碟機後續發行版本
[圖 1 監視已基本了解什麼應該磁碟機後續發行版本

簡單地說,監視關閉版本中,確保連續的值傳遞給客戶,資料流之間的迴圈和它的正確值。因此,它的連續驗證的效能,也就是哪些 DevOps 中不可或缺的作法是所有相關資訊。

Mobile Microsoft 運堆疊,HockeyApp 提供監視行動裝置的應用程式,Application Insights 可監視 Web 應用程式和服務。如我們所見,這兩者都提供多種方式可以接聽在現實世界的軟體出發生什麼情況。

監視的文化特性

Kraig 的最後一篇文章中 (msdn.com/magazine/mt791797),他支點與文化特性,連續部署的相關,因為該層級傳遞最佳化需要深入承諾程式碼檢閱和自動化測試。這也表示承諾監視︰

  • 因為沒有套件的測試很完美,一些缺失會到生產環境,讓您的小組必須主動監視當機報告、 遙測、 負載失衡、 分級、 評論和直接客戶的意見反應。這包括監視每個支援的平台上的應用程式的效能和監視您的後端服務的健全狀況。
  • 您的小組必須認可到分類和排列優先順序的問題和餵送開發待處理項目以便更正快速進入後續版本。

此外,監視就是盡可能為您的測試和預備環境,因為它是用於生產環境。監視應用程式並收集遙測撰寫程式碼只為容易 bug 做為任何其他程式碼,並且需要偵錯和疑難排解發行前的時間。監視測試和預備環境,也可以讓您的小組來測試您的程序來處理當機和意見反應。

自訂遙測,您收集應用程式和服務通常設計來解決客戶的使用方式以及您是否達到特定的業務目標有關的問題,例如 (請參閱 Kraig 的文章中,「 檢測您的應用程式的遙測和分析,」,網址bit.ly/2dZH5Vx和他在 Build 2014 簡報,「 了解客戶模式 」 bit.ly/2d1p6fC)。不過,在您的遙測程式碼缺失不會影響客戶。相反地,遙測缺失可以輕鬆地使其失效所收集的資料。高品質資料是所有項目,因此它是必要的動作完全執行測試和預備環境,將該資料與實際執行資料,當然,分開的遙測收集及檢查有任何集合和資料表的錯誤。

測試和預備環境,也協助您在應用程式中測試回應機制。當使用 HockeyApp 發佈的預先啟動軟體測試人員,鼓勵這些軟體測試人員,以透過應用程式本身,提供意見反應,因為這是如何實際客戶將執行它。

最重要的莫過於監視您的測試和預備環境是您練習在當機、 客戶意見反應,以及問題的回應遙測所揭露的方式。簡言之,監視會接聽並回應,因為回應證明您其實正在接聽。回應性,表示收到的意見反應,然後加以設定標準程序,適當地排列優先順序的問題進入您的待處理項目,讓您的開發人員可以取得處理這些。

建立此程序不只是事後 — 您應該也在您第一次發行,直接與組建伺服器設定之前啟動並發行管線。如此一來,您可以練習磨練您的程序與測試和預備環境準備您的第一個版本,因為一旦您開始進行版本、 監視必須持續。

強式的監視程序可以偶數,某種程度來說,構成的初始測試的其他表單中的弱點。花費時間與建立適合的自動化的測試,如此繁多的發行排程條件約束或可用性的合格的候選項目內的專業知識。監視,相反地,需要較特殊的技能,並更快速、 更簡單,比起撰寫一組完整的測試設定您的小組,以供監視活動通常是。通常,您早期採用者可能會比較能夠容許的缺失如果您是用來接聽,並努力解決這些問題,就會信任。良好的監視,然後,可以讓您快速應用程式和服務出客戶,並開始收集重要的遙測資料和意見反應之前一定需要提供您的測試程序。

使用 HockeyApp 監視

行動應用程式的特定挑戰 (和桌面應用程式,太) 是它們數百萬個裝置和裝置組態超出您的控制項上進行安裝。相較於 Web 服務,您無法直接登入使用者的行動裝置和分析記錄檔,或附加偵錯工具。如此一來,您需要另一個系統,可以從這些裝置 (當然顧及隱私權) 擷取損毀和使用方式資訊,並將該資料上傳至中央服務以進行分析。這就是什麼 HockeyApp。

除了提供重要服務之前啟動散發套件 (作為所討論的最後一個時間),HockeyApp 也可協助您持續監視應用程式生命週期的每個版本。您可以收集工作階段、 事件、 當機,以及從您的第一個原型的意見反應,並繼續收集 beta 版,發行候選版本,而最後即時的應用程式中的資訊。這個持續性提供您寶貴的資料的程序中,每個步驟,並藉由監視從最早階段您可以攔截透過其他發行前測試處理程序的缺失。因此,您會注意缺失,它們會影響即時的客戶,可幫助您排定優先順序 star 應用程式的更新中修正程式。

從其中取得資訊,執行應用程式代表檢測應用程式與 HockeySDK。原生 Sdk 可供 Android、 iOS、 Windows 和 macos 上進行。其他 Sdk 支援像是 Xamarin、 Cordova、 反應原生和 Unity 的跨平台技術。

讓我們看看的 Xamarin 應用程式做為範例。首先,必須是唯一的應用程式識別碼 HockeyApp 從每個目標平台。開始建立免費帳戶上hockeyapp.net,然後按一下 [主要儀表板上的 [新的應用程式。此邀請您上傳應用程式套件,或按一下 [建立應用程式以手動方式改為 「 直接輸入詳細資料。無論如何,您會看到一個頁面中所示 [圖 2 (MyDriving iOS 應用程式中, aka.ms/iotsampleapp),其中應用程式識別碼會出現在左上方。

尋找 HockeyApp 入口網站上的應用程式識別碼
[圖 2 HockeyApp 入口網站上尋找應用程式識別碼

為 Xamarin,HockeySDK.Xamarin NuGet 封裝安裝到 Xamarin 方案中每個專案以外,您可以使用 HockeySDK.UWP 的 windows。然後您將初始化期間啟動時,使用從入口網站應用程式識別碼的 SDK。Ios 平台,將下列程式碼內 FinishedLaunching 方法 (AppDelegate.cs),APP_ID_IOS 取代從入口網站的值︰

using HockeyApp;
// ...
var manager = BITHockeyManager.SharedHockeyManager;
manager.Configure("APP_ID_IOS");
manager.StartManager();
manager.Authenticator.AuthenticateInstallation();

此程式碼會自動啟用當機報告、 使用者和工作階段追蹤,並發行前版本的應用程式內更新建置 (即透過 HockeyApp 散發)。若要停用功能,請設定 BITHockeyManager 類別的屬性之前呼叫 StartManager。例如,下列程式碼會停用應用程式內更新功能︰

var manager = BITHockeyManager.SharedHockeyManager;
manager.Configure("APP_ID_IOS");
manager.DisableUpdateManager = true;
manager.StartManager();
manager.Authenticator.AuthenticateInstallation();

在 Android 中,放入一次使用應用程式識別碼、 OnCreate (MainActivity.cs),如下的程式碼,並新增 MetricsManager.Register 的呼叫,因為工作階段追蹤並不會自動完成︰

using HockeyApp.Android;
using HockeyApp.Android.Metrics;
CrashManager.Register(this, "APP_ID_ANDROID");
MetricsManager.Register(Application, "APP_ID_ANDROID");
UpdateManager.Register(this, "APP_ID_ANDROID");

適用於 Windows 與 HockeySDK.UWP NuGet 封裝,它是只要一行應用程式建構函式中︰

HockeyClient.Current.Configure("APP_ID_WINDOWS");

HockeyApp api 的完整文件,請參閱support.hockeyapp.net/kb。Xamarin.iOS 和 Xamarin.Android,特別是查看在 「 如何以整合 HockeyApp 與 Xamarin,「 bit.ly/2elBqGp。對於 Windows,請參閱 < HockeyApp 的應用程式在 Windows 「 在bit.ly/2eiduXf。您可隨時使用 MyDriving 應用程式程式碼做為參考,太。

初始化 sdk,讓我們嘗試的當機報告在 iOS 上。最好的方法是在按鈕處理常式中擲回例外狀況,或使用屬於 HockeySDK 測試損毀。在 iOS 中,例如︰

crashButton.TouchUpInside += delegate {   
  var manager = BITHockeyManager.SharedHockeyManager;
  manager.CrashManager.GenerateTestCrash();
};

之後加入這程式碼 (和 ui 的按鈕),建立並部署發行版本來測試裝置,但不偵錯、 點選按鈕觸發損毀,並再一次啟動應用程式。對話方塊應該會出現,詢問您送出當機報告,並在幾秒鐘後 HockeyApp 入口網站上,會出現損毀。那里,您會看到當機報告,顯示記憶體位址,因為發行組建不包含偵錯符號。但不啟用符號,因為這可讓駭客輕易地在您的應用程式需要反組譯。相反地,您的 Xamarin 專案的 bin 資料夾包含.dSYM (適用於 iOS) 及 (Windows/Android) 的.pdb 檔案,這是獨立的偵錯符號的組合。您可以下列符號檔案上載至 HockeyApp (稱為伺服器端 「 symbolication 」),以便在當機報告將會顯示完整的類別、 方法和檔案名稱,以及行號,如所示 [圖 3

顯示損毀報表的完整符號資訊的 HockeyApp 入口網站
圖 3 顯示損毀報表的完整符號資訊的 HockeyApp 入口網站

當機的 [概觀] 頁面會顯示頻率損毀發生,影響的使用者人數,以及哪些作業系統版本和裝置建立模型的使用者使用。您可以比較這唯一的使用者和應用程式的 [概觀] 頁面上顯示的工作階段的數目。這是良好的應用程式品質測量尋找尤其是在沒有損毀的使用者的百分比的指標。

除了這些標準的度量,您可以取得更多深入了解客戶如何使用您的應用程式藉由將自訂的事件。例如,當使用者開始播放視訊時,就會記錄下列這一行︰

HockeyApp.MetricsManager.TrackEvent("Video started");

您將使用名稱為 「 已啟動的視訊 」 搜尋時 HockeyApp 入口網站中的事件,因此請務必提供每一個事件有意義的名稱。請務必也定義事件層級將會產生有意義且可採取動作的資料。同樣地,如一般指引,請參閱檢測您的應用程式的遙測和分析的部落格文章, bit.ly/2dZH5Vx。請注意 HockeyApp 限制為 300 的唯一事件名稱,每個應用程式,但是會記錄每個事件名稱的執行個體沒有限制。

若要附加至事件的詳細資訊,使用屬性,如下︰

HockeyApp.MetricsManager.TrackEvent(
  "Video Started",
  new Dictionary<string, string> { { "filename", "RickRoll.mp4" } },
  new Dictionary<string, double> { { "duration", 3.5 } }
);

雖然 HockeyApp 中看不到這些屬性和度量,它們可供瀏覽與分析功能,Microsoft Application Insights 中所說明bit.ly/2ekJwjD

若要了解使用者行為很直接洽詢客戶透過 HockeyApp 回函功能,也就是很重要的預先啟動和後續啟動客戶的另一種方式。

當您進行新的測試前階段釋放時,您的測試人員將會收到電子郵件,他們可以直接回覆給報告問題及建議。HockeyApp 剖析這些回應,並會加以收集您在入口網站。然後,前置和後啟動的客戶,您可以整合的意見反應在應用程式中使用 HockeyApp SDK 檢視權限。要用於此用途的 iOS 搖動事件的方法如下︰

public override void MotionEnded(UIEventSubtype motion, UIEvent event)
{
  if (motion == UIEventSubtype.MotionShake)
  {
    var manager = BITHockeyManager.SharedHockeyManager;
    manager.FeedbackManager.ShowFeedbackComposeViewWithGeneratedScreenshot();
  }
}

HockeyApp FeedbackManager 會自動擷取搖晃手勢發生時才會顯示檢視的螢幕擷取畫面。然後,將檢視畫面中使用者可以加上註解螢幕擷取畫面、 附加多個螢幕擷取畫面,並提供描述問題或建議的文字訊息中所示 [圖 4

在 iOS 上註釋螢幕擷取畫面
[圖 4 在 iOS 上的 [註釋螢幕擷取畫面

請傳送意見反應會開啟使用者與您的小組間的交談,並回覆您的小組,一旦使用者取得的應用程式內通知,將交談呢。這可能是其中一個最有價值的 HockeyApp 功能 — 讓您直接連絡與您的客戶,這是難以達成否則。這些直接交談是很棒的專有、 詳細資料來源,以協助您解譯您從遙測事件,取得更廣泛的資料驗證 (或失效)。兩者都是真的有必要的補充。

例如當機報告,使用者意見應該最後建立新工作項目在您開發待處理項目讓您的小組就可以解決問題,在未來的版本。上一步中所示,這會關閉 DevOps 迴圈 [圖 1。事實上,您可以 HockeyApp 直接連接到您的待處理項目按一下 [管理應用程式] 按鈕,然後按一下 Bug 追蹤程式,然後選取您的待處理項目工具 (例如 Visual Studio Team Services)。連線之後,HockeyApp 會自動建立每個當機的群組和意見反應執行緒的新工作項目。

假設您有一個程序來定期分級,並優先處理新工作項目,您可以快速回應當機與意見反應從您的客戶在您的程式碼中做適當的變更。如果您也已設定自動的發行管線,如您所見到這一系列的文章,這些變更會快速建置、 測試並使它們快速地客戶送入發行管理。並在完成該版本時,連續監視作業應該會顯示較少的當機報告、 更加提升客戶滿意度和更強的整體應用程式效能,每個對您的企業很重要的方式。

使用 Application Insights 監視 Web 服務

Application Insights 是一項服務,可讓您清楚檢視 Web 應用程式和服務正在執行,以及使用者如何使用它們。它會通知您只要有問題發生,並且提供診斷資料和工具。它也可以分析和視覺化 HockeyApp,與關聯中的自訂事件的屬性,述bit.ly/2ekJwjD。具備該知識,您可以規劃,並有信心地排定優先順序的未來開發工作。 

Application Insights 適用於各種不同的平台,包括 ASP.NET、 J2EE 和 Node.js,在雲端和私人伺服器上執行的 Web 應用程式。若要檢測應用程式,[平台支援] 頁面上啟動 (bit.ly/2eydqQU)、 選取您的語言/平台的選擇,並遵循指示。有幾個簡單步驟,您便可以監視 Web 應用程式程式碼、 網頁中的用戶端程式碼和其他後端服務儀表板上,從所有元件 (包括 HockeyApp) 一起使索引鍵資料。

典型的群組的效能圖表上的 Web 服務中所示 [圖 5,會顯示類似下列資訊︰

  • 版本註解 (第一次 chart): 藍色點標示部署新的應用程式版本。在 [圖 5,請注意稍微增加的伺服器回應時間,這表示執行某些診斷,以判斷原因。
  • 要求的速率 HTTP Web 服務 (也第一個圖表)︰ 測試要求,並要求搜尋引擎 bot 精簡、 較淡的區段會區分使用者要求。點選的 URL、 用戶端位置和其他維度的細項。
  • 所有要求的平均回應時間 (第二個圖表)︰ 相關聯的例外狀況上似乎不尋常的尖峰。
  • 未能攔截的例外狀況和失敗的要求 (第三個圖表)︰ 顯示要求與回應碼 400 或更多。逐一點選個別失敗和堆疊追蹤。
  • 無法呼叫相依性 (第四個 chart): 顯示資料庫或透過 REST Api 存取的外部元件。尖峰建議一些應用程式失敗會造成另一個元件中發生失敗。
  • 可用性 (第五個圖表)︰ Web 測試來測試全球可用性世界各地傳送來自綜合要求。第一個間隙似乎是相關聯的例外狀況; 急遽上升第二個間隔可能是網路問題,或者伺服器維護。

典型的群組的 Web 服務的應用程式見解效能圖表
[圖 5] 的 Web 服務的應用程式見解效能圖表典型的群組

您也可以取得圖表的各種不同的其他度量,例如使用者、 工作階段和頁面檢視計數。頁面載入時間、 瀏覽器例外狀況和 AJAX 呼叫;系統效能計數器 CPU、 記憶體和其他資源使用狀況。和您自己撰寫的自訂度量。

當然,您不想要盯著等候失敗的圖表,讓 Application Insights 可以傳送不尋常的失敗率、 可用卸除,或任何數目的其他度量,包括詳細的電子郵件通知您自行撰寫程式碼。某些警示的設定自動執行,這類智慧偵測失敗,這辨識您的應用程式的要求失敗的一般模式,然後觸發警示,如果速率超出該信封。電子郵件、 在任何情況下,包含所示的適當報告的連結 [圖 6,透過它您可以診斷問題按一下各個度量的圖表,並查看新的事件。要求記錄檔,您可以瀏覽任何的相依性呼叫、 例外狀況或處理要求時發生的自訂的遙測事件的詳細資料。

點選以查看詳細資料的診斷報告
[圖 6 點選以查看詳細資料的診斷報告

當您已經識別問題時,您需要立即進入開發待處理的問題。如果您有設定自動的發行管線,您可以為您的服務,進行必要的程式碼變更短,以便與快速測試,並將這些變更部署到即時伺服器。

若要協助達成此目標,Application Insights 可讓您輕鬆地在 Visual Studio Team Services 中建立工作項目,直接從詳細資料檢視。只要尋找新工作項目 + 控制項。設定此連線的指示位於bit.ly/2eneoAD

您也可以使用從 Application Insights (和 HockeyApp !) 的診斷功能,直接在 Visual Studio 中使用開發人員分析工具在外掛程式bit.ly/2enBwlg(外掛程式也是可用於 Eclipse)。比方說,處理 Web 要求的過程中會呼叫每個方法的註解的要求和例外狀況數目的程式碼編輯器中。另外還有一個選項來檢測已在作用中的 Web 應用程式的伺服器端讓您大部分的遙測資料,而不需要存取的程式碼。

使用記錄,Application Insights 會擷取從最受歡迎的記錄架構,例如 Log4J、 Nlog、 Log4Net 和 System.Diagnostics.Trace 記錄追蹤。這些事件可以與要求和其他遙測相互關聯,而且不用說,您可以在其中加入自訂事件和度量的診斷或使用量資訊,在您的後端程式碼和用戶端程式碼中。比方說,您可以在要定期監視其中遙測是 Application Insights 物件的內部緩衝區的長度的服務進行下列呼叫︰

telemetry.TrackMetric("Queue", queue.Length);

在 Application Insights 入口網站,然後您可以建立一個圖表,以顯示它,如所示 [圖 7

自訂度量的 Application Insights 中的圖表
自訂度量的 Application Insights 中的圖 7 A 圖表

其他呼叫可以用來計算公司或使用者的事件,例如獲勝,或按一下特定按鈕。可以篩選事件和度量,而且您傳送的其他詳細資訊以區隔。這些事件可以讓您深入了解哪些使用者正在使用您的應用程式,以及這些服務。

如果您想要尋找一般圖表和 Application Insights 提供的搜尋功能之外,您可以使用分析,您可以套用到所有預存的遙測資料的功能強大的查詢語言。在 [圖 8,您正在使用站台我們的所見查詢以決定一天的時間,以及國家/地區具有最多使用者。

在 Application Insights 中分析查詢
[圖 8 Application Insights 中分析查詢

總結

我們希望您喜歡這一系列的文章,以及 Justin Raczak 文章 Xamarin 測試定域機組 (msdn.com/magazine/mt790199),介紹了 Microsoft 運堆疊行動應用程式和其相關聯的後端服務。回頭參考 [圖 1,我們所討論的從來源儲存機制,透過建置發行管線的所有階段,發行管理、 發佈和監視。在此同時,我們只被略述介面︰ 還有更多,以探索您加深您的組建,需視及發佈程序,尤其是其中新增多個層級的自動化測試而言。可能發生在發行管線沿著不同類型的測試會再次顯示在 [圖 1,這裡有一些連結可協助您開始︰

  • 程序的個別單位 (例如方法) 的程式碼的單元測試。請參閱 「 取得啟動與單元測試的跨平台行動應用程式 」,網址bit.ly/2ekXt2v,也就是 Jonathan Carter Kraig Brockschmidt 與 Microsoft Virtual Academy 課程。
  • 整合測試也會使用單元測試工具,但是重點在程式碼 (而非個別的單位) 的單位之間的互動。整合測試通常以唯讀方式使用模擬 (mock) 的資料,從伺服器或資料庫或即時資料。強烈建議使用像是 Xamarin 測試雲端服務的實際裝置上執行整合測試。
  • UI 測試,請參閱 Justin 的上述文件上 Xamarin 測試定域機組。Apache Cordova 應用程式,請參閱 「 UI 測試與 Appium 」 (bit.ly/2dqTOkc) 在 Visual Studio Tools for Apache Cordova 文件中。
  • 安全性或入侵測試模擬攻擊您的應用程式和服務透過各種不同的向量,某些動作的方式,不能理所當然。我們建議 James Whittaker 活頁簿,「 如何中斷軟體安全性 」 (amzn.to/2eCbpW4),以便開始使用。這也是您可能考慮雇用的專業的顧問的區域。
  • 取得使用 Visual Studio 中可用的程式碼剖析工具的許多效能診斷 (資訊bit.ly/2en62c3),以及特定的工具,像是 Xamarin 分析工具 (xamarin.com/profiler)。
  • 載入或壓力測試練習您的後端服務,在各種條件來評估它們如何配合各種層級的需求。在這裡,您也可以評估如何服務擴大和縮小需求,因此可以有效地管理裝載成本。如需詳細資訊,請參閱開始進行效能測試在bit.ly/2ey6Dqe,Visual Studio Team Services 文件中。
  • 當地語系化測試驗證不同的地區設定中的應用程式效能這通常是指直接 UI 測試,以確定當地語系化的資源,並格式化變化正確無誤。它也是非常實用,可以招募世界各地的預先啟動測試人員,因為他們指出技術和文化特性的問題。

我們再次希望您喜歡這一系列,並且想在您的行動裝置應用程式開發工作中的祝一切順利 !


Kraig Brockschmidt擔任 Microsoft 的資深內容開發人員,並著重於運用於行動應用程式。 他寫過的 「 使用 HTML、 CSS 和 JavaScript 程式設計 Windows 市集應用程式 」 (兩個版本) 上的部落格與 Microsoft Press kraigbrockschmidt.com

Thomas Dohmke是 HockeyApp,係由 Microsoft 晚期 2014年中的創辦人。 在 Microsoft,Thomas 是小組程式經理負責推動產品的願景和管理小組的程式經理 HockeyApp 和 Xamarin 測試定域機組。透過電子郵件存取他thdohmke@microsoft.com@ashtom Twitter 上。

Alan Cameron Wills是在 Microsoft 中,撰寫有關 Application Insights 的資深內容開發人員。 他存在及運作里 Ceibwr,Wales 的。

感謝下列 Microsoft 技術專家來檢閱這份文件︰ Simina Pasat