Lynn Study Notes

.NET Developer, Open Source Enthusiast

回顧 2023

2023居然沒有紀錄一些年度目標之類的,不知道是不是因為無暇顧及,總之2024年就要好好紀錄一下了。


.NET MS Unit Test

平常工作上的測試框架都是使用xunit,但 .NET自己其實就有測試框架,而且在Vistual Studio的整合度也是最高的,所以我自己私心喜歡MS Test,而Test Deiver的框架,我覺得依照個人喜好,例如BDD的的優點是讓測試敘述易讀,可以讓後續維護方便和非開發人員也能看懂測試案例,但以自己隨便寫的小專案來說,我覺得不需要用到這麼大的陣仗,測試只要包含核心邏輯即可,所以趁著有一點時間來練習一下怎麼使用MS Test。


.NET Queue的進化之路 Channels

以往我們比較熟悉的是Queue和ConcurrentQueue,偶爾也會看到BlockingCollection,Queue的主要概念就是先進先出的原則,舊有的Queue基本的方法就是EnqueueDequeuePeek,但不是Thread safe的,而ConcurrentQueue雖然是Thread safe,但卻不能限制Queue的長度大小,而最新的BlockingCollection雖然可以限制長度了,但相比之下少了Async的支援和一些靈活性,以下是整理比較。


.NET docker image選擇與自訂 Image

容器化已經慢慢變一個趨勢了(當然還有更潮的ServerLess),聽到的大部分公司不是正在前往容器化的路上就是已經完成容器化,甚至Dotnet在建立專案的時候都可以直接建立Dockfile,執行的時候也可以直接用docker container的方式執行,簡直有夠完美,但假設接下來會需要整合自己的CI/CD流程,這個時候就很需要自定義dockerfile了。


使用Sonarqube和SonsarLint幫程式碼分析品質

SonarQube 是一套開源的程式碼品質的管理分析系統,可以拿來檢查程式碼的錯誤、漏洞或是Code smell,支援了超級多的語言和IDE,還可以搭配CI/CD工具去做一些自動化掃描,例如在Jenkins / Github Action / Azure DevOps等等,有些高級的服務雖然要錢,例如說程式碼品質要過才能Merge回去、產生報告等等,但基本的分析其實就已經很實用了。

在每次的CI/CD掃描是很方便的事,但一個團隊一天PR不知道有多少,這樣掃描修改掃描的過程還是蠻花時間的,所以有了SonarLint這工具,可以直接在客戶端使用並掃描當前的程式碼,大大減少了在CICD掃描的過程。


使用docker部屬ElasticSearch Cluster

一直以來對ElasticSearch的使用都是拿來查詢Log、存放訂單資料來提供查詢等等,沒有特別深入的研究他,對於效能上的調教也都還沒實際碰到過,想說在自己Lab裡面架一台ElasticSearch來玩看看,因為Elastic Search Cloud太貴,免費又只能玩30天,雖然有辦法做到無限免費仔,但實在太花本了,就直接架在地端吧!


使用FileStreamResult進行大檔案傳輸

來還技術債啦!!!

剛入職時接到的第一份工作是要匯出一個API回傳的資料,並處理成CSV的格式匯出讓使用者下載,因為格式單純所以那時也沒有使用任何CSV的套件,就單純回傳一個組好的物件。

那時資料量不多,所以也安安穩穩的度過了一年的時間,直到最近資料量暴增,於是發生了OOM 😆

但目前很可惜要處理這問題的人並不是我,所以想說直接來練練手好了


Hello Rust

Rust是一種偏向系統級的程式語言。主要目的是為了高效能和安全的應用程序而設計,於2010年在Mozilla研究所發表,並於2015年達到穩定版本。
詳細內容就看Wiki吧
https://zh.wikipedia.org/wiki/Rust

對這語言好奇的原因是因為連Window的Kernel都準備用Rust來取代C++了,單論效能Rust在具有額外安全保證的程式碼會比C++慢一些,但假設C++也做了一些手工檢查,兩者的效能其實是相似的。


使用TcpClient和TcpListener搭配WireShark來抓取TCP傳輸

常常聽到TCP、UDP等等ProtocolType,但這些東西都被封裝得好好的,實在是沒自己特別寫過,基於好玩想說來測試看看,.NET 自己有實作了TcpClientTcpListener,實現方式也很簡單,不過官網明確說明了建議進階使用者使用Socket Class,因為TcpClientTcpListener建立在System.Net.Sockets.Socket 之上,不過今天是想抓抓看傳輸內容,所以就直接用TcpClientTcpListener吧,Socket Class就等下篇文章了。


Boxing and Unboxing

這兩段程式碼看起來有差嗎?

var count = 0;
//1
Console.WriteLine($"Hello World {count}");
//2
Console.WriteLine($"Hello World {count.ToString()}");