只有累積,沒有奇蹟

2019年7月30日 星期二

[Azure] Microsoft Azure 免費 DevOps 電子書開放下載

Devops
Devops 這詞相信大家都有聽過,過去幾年參加各種研討會活動都聽到這詞越來越火紅,在台灣也有相關社群像是 Devops Taiwan 會定期每個月舉辦活動進行交流,以及每年舉辦一次大型研討會的 DevopsDay 盛會邀請各領域的高手來分享相關經驗與實踐Devops 簡略的來說不僅是技術相關,還是種思想與文化的實踐 (詳細定義可以參考 Wiki 說明),提到思想與文化詞往往或許會過於抽象,要如何實踐 Devops 文化則可以參考 O'Reilly 所出版作者為 jennifer davis 所撰寫《Effective DevOps》,中文版則是由 Taiwan Devops 發起人協助翻譯,相信可以對 Devops 實踐與文化 有更多認知

電子書下載
這幾天在 FB 社團看到 Microsoft Azure 官網發布一個好消息,為了有效及建立良好的 Devops 文化,可以透過 Microsoft Azure 官方網站免費下載《Effective DevOps》電子書,僅需要填寫一些資訊則可進行下載
下載網址 : Effective DevOps—Building a DevOps Culture at Scale
在填寫完一些簡單資料之後,即可下載內容滿滿接近 400 頁的 Effective DevOps 電子書,對於想了解 Devops 文化的開發者不能錯過。

Azure Devops
除了下載之外在 Microsoft Azure 也提供 Azure Devops Service 服務,在 Azure Devops 產品網頁也可以透過 Microsoft Build 精選影片了解如何在 Azure 上如何建立雲端應用程式與部署在雲端上建立 CI /CD,Source Code 代碼控制、Azure Kubernetes 應用(AKS) 與其監控機制,相信對於有興趣要將應用程式搬到雲上的朋友可以更容易上手,有興趣的朋友亦可透過此連結了解更多 : 傳送門




2019年7月28日 星期日

[Azure] Microsoft Azure 初體驗

前言
Microsoft Azure 是微軟從 2010 年開始提供的雲端服務,提供多樣化的服務可以讓開發人員將應用程式或是資料庫佈署至雲端,自己過去在 2012 年曾經使用 Microsoft Azure WebSite 服務,當時將公司開發的 ERP 產品佈署在 Windows Azure 上面 (早期叫做 Windows Azure 後來改名為 Microsoft Azure ),由於在 Azure 操作介面上與早期落差很大,因此這篇就先來介紹關於 Azure 基本跟申請帳號流程,也做個筆記稍微紀錄一下。

Azure
首先在申請帳號前,我們先來看看微軟 Azure 官方介紹
Azure 是一款不斷擴大的雲端運算服務組合,可協助組織應對業務挑戰。Azure 可讓您的公司或組織在大規模全球網路上使用慣用工具和架構來自由建置、管理及部署應用程式。
Azure 是微軟提供雲端服務的組合,甚麼是雲端服務 ? 現在到處都可以看到雲端服務的關鍵字,早期因工作關係有接觸稍微對雲端有一些基本認識,根據據美國國家標準和技術研究院的定義,雲端運算服務應該具備以下幾條特徵 (wiki)
  • 隨需應變自助服務。
  • 隨時隨地用任何網路裝置存取。
  • 多人共用資源池。
  • 快速重新部署靈活度。
  • 可被監控與量測的服務。
  • 一般認為還有以下特徵
  • 基於虛擬化技術快速部署資源或獲得服務。
  • 減少用戶終端的處理負擔
  • 降低了用戶對於IT專業知識的依賴。
  • 要符合以上特徵才可以是雲端,並不是將應用程式放到 Internet 上就可以算是雲端服務,另外在雲端中可以分為 IaaS、Paas、Saas 等三種類型,分別如下

  • 基礎設施即服務 (IaaS, Infrastructure as a Service):廠商會負責管理網絡、儲存、伺服器與視覺化功能。
  • 平台即服務(Paas, Platform as a Service):除了前述功能之外,還包括作業系統、中介軟體及執行期。
  • 軟體即服務(Saas, Software as a Service):再加上資料與應用程式,譬如 Office 365 服務,整個系統軟體完全在雲上運作,由廠商負責維護。
  • 微軟的 Azure 有提供的雲端運算資源有 Paas 以及 Iaas 兩種,目前提供約 30 種服務提供開發者使用,在過去早期在推廣雲端服務時企業或是開發者都會對於安全性有所疑慮,Azure 在資料中心與基礎建設也有針對安全性做加強,並使用 AI 做分析可以很快地找出威脅,詳細有興趣可以參考 Azure 安全性介紹,並附上影片讓有興趣的人可以觀看

    申請帳戶
    上面簡單介紹完 Azure 下一步可以開始進行雲端服務的使用,如果沒有 Azure 帳號的開發者,目前微軟提供有興趣的開發者申請免費帳號,可以在 12 個月免費、$ 6,100 的點數以及 25 種以上服務免費使用,詳細說明可以參考官網說明,這裡就不在重複介紹,可以在官網點擊申請免費帳號按鈕
    接著因為要讀取微軟帳號,這一步會要求輸入微軟的帳號以及密碼
    下一步會要求輸入個人資訊,輸入資料有包括四部分,首先看到的是用戶資訊要輸入姓名、聯絡 Email
    接著要進行 Azure 帳戶的手機認證,這裡可以選擇打電話說是收簡訊的方式
    輸入信用卡資訊主要是要做為身分驗證用,如果是試用階段不要升級服務就其他費用產生
    最後就是合約與權益的文件部分,觀看後打勾即可
    看到此頁面就代表登入成功,按下前往網站就可以準備使用 Azure 服務,題外話,這裡翻譯 "您已完全就緒可開始使用 Azure" 感覺有點奇怪呀!
    第一次進入到 Azure 管理介紹時,很貼心的會簡單介紹基本功能與操作方式
    另外如果喜歡看中文版的介面,可以至右上角切換語系

    另外針對從未使用過的新手,還有提供 Learn 教學文件,可以透過 step by step 系統教學的方式,讓你對於 Azure 有更進一步的認知與了解,也可以從 Azure 學習路徑 選擇從不同的角度學習像是顧問、開發者、架構師或是 Devops 人員,搜尋相對應的文章與教學文件來進行學習
    透過以上簡單的幾個步驟完成了註冊 Azure,如果想要了解有提關哪些服務或是產品,都可以至官方網站了解,近期會針對 Azure 開始做一系列的介紹與有興趣的服務進行實作,讓我們一起進入 Azure 的世界, Happy Coding !


    參考
    Azure Overview
    Microsoft Azure

    2019年7月25日 星期四

    [UnitTest] 如何測試目標方法中含有 static method 代碼 ?

    情境
    由於部門過去的 專案幾乎都沒有加上單元測試進行保護,主管在新的一年規劃中開發代碼更有品質,希望開發的專案加上新功能或是修改時要加上單元測試,有些 Legacy Code 寫法是屬於一條龍式的 「義大利麵式碼」特別有親切感(大誤,遇到這種就需要先重構 (refactor) 後物件化比較好寫單元測試,今天主題是單元測試中要被測試的 method 中常常會有相依於某個 Static method在寫 Code 時用 static 物件寫起來很方便,但遇到這種情況在單元測試就需要多下點功夫,以下簡單筆記如何測試 static class 的方法

    解決方案
    舉個例子來說有個需求要去呼叫第三方取得相關資訊,定義一個 ThirdParty 類別其中透過 SendRequest 方法來送出 Request 與第三方 API 溝通,使用 static 的 LoggerHelper 記錄第三方回傳的內容 response 物件其中是 Legacy Code 紀錄 log 方式是 Log message 寫到網路硬碟Sample Code 如下
    using System;
    using NLog;
    
    namespace ConsoleApp1
    {
        public class Program
        {
            static void Main(string[] args)
            {
                var thirdParty = new ThirdPartyClass();
                thirdParty.SendRequest();
    
                Console.ReadKey();
            }
        }
    
        public class ThirdPartyClass
        {
            public void SendRequest()
            {
                //... call 3rd server
                var response = _apiService.PostData();
    
                // log response 
                LoggerHelper.Info($"Call 3rd response is : {response}");
                
                //... more
            }
        }
        public static class LoggerHelper
        {
            private static string filePath = "d:\\logs\\";
    
            public static void Info(string message)
            {
                // 依賴於網路硬碟 X:\logs\info
            }
    
            public static void Error(string message)
            {
                // 依賴於網路硬碟 X:\logs\error
            }
        }
    
        [Test()]
        public void ThirdPartyClassTest()
        {
            ThirdPartyClass thirdParty = new ThirdPartyClass();
            thirdParty.SendRequest();
        }
    }
    
    在之前上 TDD 課時候老師有提到 單元測試準則 : 一次只驗證一件事 SendRequest 方法直接耦合static function 無法進行隔離測試,91哥也在 文章 中指出直接相依 static function 的主要問題是
    • 無謂地佔住記憶體過久
    • 直接耦合造成無法獨立進行單元測試Line 15 : 取得全部參數方法 
    • 無法享用物件導向設計的好處(繼承的重用與擴充、介面的可抽換性、多型的擴充性)
    • race condition
    需要針對此測試方法進行解耦的設計讓 ThirdPartyClass 與 LoggerHelper 都依賴於某物件互相不直接耦合 以達到解耦合的效果過去有學到很多種方法可以達到這件事情,本次介紹的是透過 interface 來解決這問題,說明如下

    Step 1 : 首先先建立一個 ILoggerHelper 介面讓 LoggerHelper 實作  
    備註 : Resharper 快捷鍵 : Ctrl + R ,I
    LoggerHelper 實作 ILoggerHelper 後 Code 如下
    public class LoggerHelper : ILoggerHelper
    {
        private string filePath = @"d:\\logs\\";
    
        public  void Info(string message)
        {
            // 依賴於網路硬碟 X:\logs\info
        }
    
        public  void Error(string message)
        {
            // 依賴於網路硬碟 X:\logs\error
        }    
    }
    
    public interface ILoggerHelper
    {
        void Error(string message);
        void Info(string message);
    }
    
    Step 2 : 此時原本的 ThirdPartyClass 原本依賴的 static LoggerHelper 方法無法使用會出現 error,如下圖所示
    Step 3 : 讓 SendRequest 耦合於 ILoggerHelper 介面ThirdParty Class code 如下
    public class ThirdPartyClass
    {
        private  ILoggerHelper _logger;
    
        public ThirdPartyClass(ILoggerHelper logger)
        {
            _logger = logger;
        }
           
        public void SendRequest()
        {
            //... call 3rd server
            //var response = _apiService.PostData();
    
            // log response 
            _logger.Info($"Call 3rd response is :");
            
            //... more
        }
    }
    
    程式說明 : 
    • 使用建構式注入 _logger  [ 快捷鍵 :  ctorf ]
    • 寫 log 方式由原先 LoggerHelper 改用 _logger
    Step 4 : 在測試建立一個 fakeLoggerHelper 實作 ILoggerHelper 介面,並產生相對應實作方法 Implement  missing member,接著 ThirdPartyClassLog 建構子注入 fakeLoggerHelperCode 如下
    [TestFixture()]
    public class ThirdPartyClassTests
    {
        [Test()]
        public void ThirdPartyClassTest()
        {
            ILoggerHelper fakeLoggerHelper = new fakeLoggerHelper();
            ThirdPartyClass thirdParty = new ThirdPartyClass(fakeLoggerHelper);
            thirdParty.SendRequest();
        }
    
        private class fakeLoggerHelper : ILoggerHelper
        {
            public void Error(string message)
            {
                // do something
            }
    
            public void Info(string message)
            {
                // do something
            }
        }
    }
    
    Step 4 : 重跑一次測試,綠燈 Pass 測試成功 !!
    Summary
    這篇文章是讓測試物件依賴於 interface 來解決測試 static method,其他非 static  method 大多使用 extract & overrite 來處理,想了解更多細節可以看 91大大分享的 [Unit Test Tricks] Extract and Override會讓自己對單元測試了解更多,但建議還是要搭配實務才可以驗證到底自己是否真正了解,否則久了沒用(老了?)有一天還是容易忘記

    參考

    2019年7月23日 星期二

    [VisualStudio] Visual Studio 2019 找回遺失的 StartPage 與 Developer News

    前言
    最近在跟朋友討論 Visual Studio 2019 實用的功能時,偶然發現原本在啟動專案後都有 StartPage 與 Develop New 功能,但在 Visual Studio 2019 這些功能都消失了,讓我想到復仇者聯盟裡的薩諾斯蒐集五顆寶石後,彈指後讓一半的東西消失(誤!!)。在 Visual Studio Develop Developer Community 中文章 Start Page: Please give it back! 提到希望微軟可以恢復原先 StartPage 的配置與功能,這篇文章就來介紹如何把失去的 StartPage 找回來若有問題或是錯誤的地方歡迎一起討論

    Start Page
    首先我們先來看看 Visual Studio 2019 的啟動畫面

    Visual Studio 2017 的啟動畫面
    比較後可以發現在 StartPage 在設計上已經與過去不同,在 Visual Studio 2019 的 StartPage 設計原由可以透過微軟官方 Blog 文章 Get to code: How we designed the new Visual Studio start window 了解到在新版的起始頁面做了一些嘗試與不同配置,因此預設將畫面配置做些調整也把 develop new 區塊移除掉,在 Visual Studio 2019 Preview 版本可以透過設定來開啟
    但此設定在後來的版本就被移除了,在新版的配置選項中以找不到相關設定可以調整

    Start Page
    新版的設定或許會讓有些人不習慣,像我自己個人就對於舊版比較喜歡,從官方回應目前沒看到可能會有讓開發者設定新舊版的機會,但我們還是有辦法可以透過另外一種方法解決,在 Start Page: Please give it back! 討論串中發現可以透過 Visual Studio Marketplace 安裝 Start Page on startup 改善此問題,下載傳送門
    安裝完畢之後要設定開起空白環境才會生效,設定方式為 : Tools > Options > Startup,選擇 Empty environment
    按下儲存重新啟動 Visual Studio 之後即可在 Visual Studio 2019 看到熟悉的畫面

    Developer News
    在新版的 startpage 也沒看到 Developer New 區塊,其實 Developer New RSS 功能並沒有消失,可以在安裝或是更新 Visual Studio Install 工具時右邊區塊看到熟悉的 Developer New 內容
    如果你是習慣在 Visual Studio 中看 Developer News 的開發者,也可以在 Visual Studio Marketplace 安裝 Developer News 找回你想要的資訊,安裝方式不難這邊就省略了

    如果跟我一樣希望在 Visual Studio 2019 可以使用舊版的 startpage 以及 Developer News 的朋友,可以參考這篇文章,希望這篇可以幫助到跟我有相同困擾的開發者 :) 

    2019年7月22日 星期一

    [Windows] 在 Windows Terminal 新增 Linux Bash Commnadline

    前言
    在上一篇文章 [Windows] Windows Terminal Preview 初體驗 介紹了 Windows Terminal 的基本操作與使用,其中提到在安裝完預設提供 command 為 powershell 和 cmd 命令提示字元兩種,其實在 Windows Terminal 支援多種 command line,這一篇文章就來介紹如何在 Windows Terminal Preview 新增 Bash command line 的方法。

    啟用 Linux Bash Shell
    如果要在 Windows Terminal 使用 Bash.exe 需要先啟用 Window OS 的 Linux Bash Shell 功能,公司筆電是使用最新版 Windows 10,因此以下就簡單介紹在 Windows 10 中如何啟用 Linux Bash 

    安裝 Windows Subsystem for Linux
    首先使用管理者 admin 權限開啟 powershell
    接著在 powershell 輸入下列指令
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    安裝完畢之後會詢問是否要重新啟動電腦,選擇 y 就會進行立即重啟的動作

    安裝 Ubuntu
    下一步到 Windows 商店下載 Linux 子系統,在 Microsoft Store 提供多個 Linux 子系統像是 Ubuntu、OpenSUSE、SLES 可以下載,可以在 Store 輸入 Linux 就可以輕易地找到 Ubuntu,下載完畢後可以點選啟用
    第一次啟用 ubuntu 會需要一點時間進行初始化設定與安裝,完畢之後會要求你輸入帳號密碼的動作
    透過以上步驟,順利的完成啟用 Windows Subsystem for Linux 與 安裝 Ubuntu 的動作

    新增 Command Line
    在 Windows Terminal 中的設定可以透過  ⬇  中的 settings 來進行設定,按下後會請使用者選擇想要開啟設定檔的編輯器工具
    在 Windows Terminal 設定檔名為 Profiles.json,要調整可以到下列路徑進行調整
    userName\AppData\Local\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\RoamingState
    找到設定檔後可以透過文字編輯器進行編輯,用 Visual Studo Code 開啟後可以看到  profiles  區塊,在 Windows Terminal 安裝完成之後 profiles 一共有兩個區塊,內容分別定義 powershell 與 cmd 兩種設定,以 powershell 為例配置設定如下
    {
        "acrylicOpacity" : 0.5,
        "background" : "#012456",
        "backgroundImage" : "D:/Marcus/iron_man.jpg",
        "closeOnExit" : true,
        "colorScheme" : "Campbell",
        "commandline" : "powershell.exe",
        "cursorColor" : "#FFFFFF",
        "cursorShape" : "bar",
        "fontFace" : "Fira Code",
        "fontSize" : 14,
        "guid" : "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
        "historySize" : 9001,
        "icon" : "ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png",
        "name" : "Windows PowerShell",
        "padding" : "0, 0, 0, 0",
        "snapOnInput" : true,
        "startingDirectory" : "%USERPROFILE%",
        "useAcrylic" : false
    } 
    重要的項目為 name、guid、commandline 等設定,說明如下
    • guid : 每組 commandline 定義屬於自己專用且不能重複的 guid 
    • name : 顯示在 Windows Terminal  +  中顯示的名字
    • commandline  : 執行的 commandline
    其餘像是 font 字型、字體大小、背景圖都可以針對各自 commandline 需求做調整,另外在 Windows Terminal 中修改是即時的,調整完 json 內容會即時更新正在使用的 Windows Terminal 視窗,透過以上得知在 Windows Terminal 如何定義 commandline 之後,如果要新增新的 commandline 就可以複製一份來調整,在調整上述提到的 guid、name、commandline 等值即可完成,以新增 Linux Bash 為例配置文件如下
    {
        "acrylicOpacity" : 0.75,
        "closeOnExit" : true,
        "colorScheme" : "Campbell",
        "commandline" : "bash.exe",
        "cursorColor" : "#FFFFFF",
        "cursorShape" : "bar",
        "fontFace" : "Consolas",
        "fontSize" : 10,
        "guid" : "{9acb9455-ca41-5af7-950f-6bca1bc9722f}",
        "historySize" : 9001,
        "icon" : "ms-appx:///ProfileIcons/{9acb9455-ca41-5af7-950f-6bca1bc9722f}.scale-100.png",
        "name" : "Linux Bash Shell",
        "padding" : "0, 0, 0, 0",
        "snapOnInput" : true,
        "startingDirectory" : "%USERPROFILE%",
        "useAcrylic" : true
    } 
    新增 Python
    {
        "acrylicOpacity" : 0.75,
        "closeOnExit" : true,
        "colorScheme" : "Campbell",
        "commandline" : "py.exe",
        "cursorColor" : "#FFFFFF",
        "cursorShape" : "bar",
        "fontFace" : "Consolas",
        "fontSize" : 10,
        "guid" : "{1850e97f-16dc-4281-9ea9-0100c4e852c5}",
        "historySize" : 9001,
        "icon" : "C:/Users/marcus/AppData/Local/Programs/Python/Python37/Lib/test/imghdrdata/python.png",
        "name" : "Python",
        "padding" : "0, 0, 0, 0",
        "snapOnInput" : true,
        "startingDirectory" : "%USERPROFILE%",
        "useAcrylic" : true
    } 
    最後要小小提醒的是在編輯 Profiles.json 檔時需多加留意格式,如果對於 json 格式不熟悉可以到現在 json 格式檢查網站進行確認後再貼上,如果格式錯誤會造成讀取異常,可以看到下列畫面
    在重新開啟 Windows Terminal,在點擊右上方的  +  後就可以透過看到新增的 commandline 
    透過以上簡單的幾個步驟就完成在 在 Windows Terminal 新增 Linux Bash,希望有幫助到有需要的朋友 :)

    參考
    終於來了!實測 Windows 10 更新後,安裝使用Bash on Ubuntu on Windows
    How to Install Linux Bash Shell on Windows 10

    Copyright © m@rcus 學習筆記 | Powered by Blogger

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com