只有累積,沒有奇蹟

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

2019年7月15日 星期一

2019年7月13日 星期六

[C#] Named Arguments 具名引數

前言 
同事在開發專案時詢問某 method 有多個參數,有些參數是選擇輸入有預設值,因參數太多是否有方法可以指定參數名字 ? 否則一堆有設定預設值的在閱讀代碼會造成困擾,不小心也可能傳入錯誤變數,聽到當下建議抽成一個 Model 這樣更容易維護,但他表示由於引用的方法過多會擔心會牽一髮動全身,會有不可預期和毀滅性的災害發生,因此可以使用 具名引數 named arguments 來指定需要傳入的引數名稱與參數值,這篇文章簡單介紹如何使用

使用方式
Sample Code 如下,Employee 類別底下有個取得 FullName 方法,其參數為 firstName、lastName以及有預設值為空的 middleName 與 title,方法會回傳 Hi FullName 
public static class Employee
{
    public static string FullName(string firstName, string lastName, string middleName = "", string title = "")
    {
        if (title == "")
        {
            return $"Hi, {firstName} {middleName} {lastName}";
        }
        else
        {
            return $"Hi, {title} {firstName} {middleName} {lastName}";
        }
    }
}
在沒有 named arguments 一般使用,需要按照方法的引數值依序輸入參數,順序是固定的如果順序錯誤即會帶到異常的數值,套用在 sample method Employee.FullName 如下
var normal = Employee.FullName("tung", "marcus");
var normalOne = Employee.FullName("tung", "marcus", "test");
var normalTwo = Employee.FullName("tung", "marcus", "test", "Mr.");
named arguments 使用上很簡單,指定引數名稱 : 後面加上參數值
無須按照順序指定參數,只需要知道名稱就可以指定參數值,可以從代碼中明確知道某個參數指定哪個值,增加可讀性讓閱讀的同仁不會那麼容易混淆,範例 Code 如下
// first + last
var fullName = Employee.FullName(firstName: "tung", lastName: "marcus");
var fullName0 = Employee.FullName(lastName: "marcus", firstName: "tung");

// title + first + last
var fullName1 = Employee.FullName(firstName: "tung", lastName: "marcus", title: "Mr.");

// first + last + middle
var fullName2 = Employee.FullName(firstName: "tung", lastName: "marcus", middleName: " test");

// title + first + last + middle
var fullName3 = Employee.FullName(firstName: "tung", lastName: "marcus", middleName: " test", title: "Mr.");

使用限制 
使用上有些規定與限制 : 必須先指定位置參數 (positional arguments),在使用具名引數 (named arguments) 否則會有跳出錯誤,如下圖
輸出
可以發現 first + last 中兩個 sample 參數位置錯誤但輸出都是相同
參考
具名和選擇性引數
C# 4.0 Features

2019年7月10日 星期三

[VisualStudio] 解決 Visual Studio 偵錯時啟動緩慢問題

問題 
接獲朋友詢問在使用 Visual Studio 進行 debug 偵錯時緩慢,原本從按下 F5 很快就可進行偵錯現在都要 30 秒以上才可完成,過去經驗得知造成 debug 啟動緩慢時會有幾種原因,Symbol 設定為 Microsoft Server 加載、debug breakpoints、或是 sln 專案檔設定異常都有可能造成此問題,如果在找不出問題就可能要使用 FusionLog 來釐清緩慢原因,這篇就就針對此問題的解決方式做簡單分享,若是有不清楚或是錯誤的地方歡迎討論予糾正。

解決方法
接著就請朋友還原案發現場發現啟動後跳出畫面如下
看到畫面文字顯示 Application 在啟動偵錯模式時會從 Microsoft symbols server loading symbols,且同事公司網站環境不是那麼快,每次啟動都需要重新從 Server 讀取重新 loading 一次,在 Visual Studio 中可以透過設定調整從 local 讀加速啟動速度,設定方式如下
Step 1 : Tool > Options 
Step 2 : Debugging > Symbols 
Step 3 : 設定本機要存放 symbols 的位置
Step 4 : 取消勾選 Microsoft Symbol Servers,避免 Visual Studio 在偵錯時到 Server 下載
設定完後按下OK即完成配置設定
造成原因可能是因為在 debug 是選擇到下載 source code,但朋友說對此畫面根本沒印象
設定完成,遠端幫朋友 debug 解決問題成就達成 !!!

參考
Configuring Visual Studio to Debug .NET Framework Source Code

2019年7月9日 星期二

[VisualStudio] 開啟檔案失敗 : To prevent possible data loss before loading the designer, the following errors must be resolved

問題 
這兩天在開發專案時遇到神奇的事情,要點擊開發好的類別檔案時竟然跳出錯誤,錯誤畫面很像之前在寫 Webform 自訂 UserControl 時異常畫面,錯誤訊息為 'To prevent possible data loss before loading the designer, the following errors must be resolved: ,這篇就就針對此問題的解決方式做簡單分享,若是有不清楚或是錯誤的地方歡迎討論予糾正。

解決方法
異常發生時畫面如下
根據錯誤訊息提供的線索,檔案無法顯示的原因是 
The designer could not be shown for this file because none of the classes within it can be designed
根據過去微薄的記憶中大多在 Windows Form 的設計畫面出現,這份檔案在 Visual Studio 認為找不到設計器要求的基底類別因此無法正常顯示,幸好強者同事告知在 Visual Studio 中可以設定檔案開啟格式,遇到此問題時在檔案按下右鍵選擇  Open With ,設定檔案開啟時使用  CSharp Editor  格式開啟
設定完畢後,重新點擊即可正常開啟,原來因為是因為預設被認定使用 Winform Editor 開啟,所以才會跳出奇怪的畫面,過去也不知道有這功能可以設定覺得神奇,也感謝強者同事支援,宣告此案偵破 ! 

感想
最近都在感冒跟值班這兩件事循環,直到這一兩天才比較好一些,感冒也深深體會到身體健康的重要性,
也間接影響到學習新東西的時間跟自己預期學習的節奏,不知不覺在部落格持續分享了半年在工作學習到的新東西,也希望可以繼續分享下去,謝謝 :)

2019年7月5日 星期五

[.NET] Default 和 NativeImage 資料夾

問題
收到同事反應公司 Server C:\ 硬碟空間嚴重不足,確認後發現 C:\errors 資料空間占了 25g 而且還以驚人的速度成長中,進到資料夾底下查看分 Default 與 NativeImage folder 存放各種應用程式 Log ,如下圖所示
其中竟然還有 w3wp.exe,到底這些是如何記錄的呢 ? 本篇文章簡單記錄解決問題的過程

解決方案
為了追根究柢,點開其中 w3wp.exe 資料夾尋找更多蛛絲馬跡 
*** 組件繫結器記錄項目 (2018/12/26 @ 下午 11:21:27) ***

作業成功。
繫結結果: hr = 0x0。 操作順利完成。

組件管理員的載入來源:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
正在可執行檔下執行  c:\windows\system32\inetsrv\w3wp.exe
--- 下列是詳細的錯誤記錄。

開始 : 原生映像繫結。
  記錄: 開始驗證所有相依性。
  記錄: [Level 1] 開始驗證原生映像相依性 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089。
  相依性名稱: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
  記錄: [Level 1] 開始驗證原生映像相依性 System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089。
  相依性名稱: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
  記錄: [Level 1] 開始驗證 IL 相依性 System.Xaml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089。
  相依性名稱: System.Xaml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL
  記錄: 相依性的驗證成功。
結束   : 操作順利完成。 (發生例外狀況於 HRESULT: 0x00000000 (S_OK))

*** 組件繫結器記錄項目 (2018/12/27 @ 上午 12:55:11) ***

作業成功。
繫結結果: hr = 0x0。 操作順利完成。

組件管理員的載入來源:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
正在可執行檔下執行  c:\windows\system32\inetsrv\w3wp.exe
--- 下列是詳細的錯誤記錄。
當看到 Log 內容時心裡大概就有似曾相似的感覺,在之前 [.NET] 無法載入檔案或組件 'Newtonsoft.Json'  文章有提到過,可以將 CLR 在進行 assembly Binding 時的 Log 資訊存在指定的資料夾,因此第一步就是確認 Fusion 設定是否有啟用,透過以下步驟確認

確認 Fusion 設定 
Step 1 : 左下角開始 > 輸入 "regedit"  >  開啟登入檔
Step 2 : 到 pc \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion 
Step 3 :  經比對寫入 Log 位置,兇手就是它無誤
關閉設定 > 將數值資料修改為 0
ForceLog : 是否啟用,LogPath 為存放位置
Step 4 : 重開機設定才生效

透過以上方式,資料夾已停止紀錄 Log,宣告結案 (握拳

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

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com