跳到主要內容

發表文章

.NET 5.0 筆記

.NET 5.0 上線啦! 這次帶來什麼樣的改變呢? .NET 5.0 的前一版是 .NET Core 3.1。 等等,為什麼不是 .NET 4.x 呢? 難道歪果仁也不喜歡 4 這個數字嗎? 當然不是,這是因為 4.x 很容易跟 .NET Framework 4.x 搞混,造成搜尋上的麻煩。 不過這只是其中一個理由,另一個理由是因為想把 Core 這個詞拿掉,原因是 .NET 5 是接下來的主要實作平台,其支援比 .NET Core 以及 .NET Framework 還要更多類型的應用程式或是更多的平台。 至於 ASP.NET Core 5 還是會有的! 是以 .NET 5 為基礎的核心實作。保留 Core 這個字 就是為了與 ASP.NET MVC 5 作區別 (他們總算了解之前查資料有多困難XD),同樣的 Entity Framework Core 5.0 也會保留 Core 來跟 Entity Framework 5/6 作區別。 還有幾點是蠻重要的,.NET 5 做為未來的主要實作,但並不會取代 .NET Framework 4.x,.NET Framework 4.x 仍然會繼續支援。不過 Web Forms 技術將不會有轉移到 .NET 5 的計畫,取而代之的是有替代方案,例如 Blazor 或是 Razor page。 接下來讓我們期待 .NET 6.0 的登場吧! 畢竟這才是下一個 LTS 的版本阿!~

C# Linq Select() 在 Java 的對應!!

最近用 Java 8 在寫 Android 的 Side Project, 由於因為工作的關係比較熟悉 C#,寫一寫覺得很多地方很不習慣,除了 Json 要使用 Gson library 來做序列化以外,還有 C# 的 LINQ 在 Java 用發也差很多。 這裡特別紀錄一下 C# 中 LINQ 的 Select() var result = productList.Select(x = > x.name).ToList(); Console.WriteLine(result); 在 Java 中 有 Stream() 可以用。例如  String result = productList.stream() .map(p -> p.name) .collect(Collectors.toList()); System.out.println(result); 來完成,之後如果使用到更多的功能,再來補充吧~

Sticky Session 的設定 in K8s

之前有紀錄過開發的網站遇到 CSRF token 認證的問題,事實上解決的方法就是讓使用者盡量存取同一個 Pod 來避免從 A Pod 取得 token,但卻在 B Pod 驗證 token。在 K8s 上可以針對 ingress.yml 裡面去做設定  apiVersion: extensions/v1beta1 kind: Ingress metadata: name: hello-ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/affinity: " cookie " nginx.ingress.kubernetes.io/session-cookie-name: "hello-cookie" nginx.ingress.kubernetes.io/session-cookie-expires: "172800" nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/affinity-mode: persistent nginx.ingress.kubernetes.io/session-cookie-hash: sha1 spec: rules: - host: DOMAIN.NAME http: paths: - path: / backend: serviceName: hello-service servicePort: hello-port 這邊要強調的是 affinity : "cookie" 以及 affinity-mode: persistent。透過設定 persistent 的模式可以令 Po...

C# CSRF attribute 的錯誤追蹤與處理

最近開發網站碰到一個問題,有時候可以登入成功,有時候不行。但明明帳密都是 Google 記憶的,不可能打錯帳號密碼。後來猜想到是 CSRF 認證的問題,由於網站是透過 k8s 建立的,且 replicas: 2。很大可能性是因為拿 token 是跟 A Pod 拿,但登入是跟 B pod 登入,造成 token 無法驗證成功。 想證明這個問題,我們必須去紀錄 Log,由於我們是透過 C# 的 ValidateAntiForgeryToken Attribute 實作 CSRF 的防禦,因此一開始想法是寫一個 ExceptionFilter 去攔截例外。但發現無法攔截 CSRF 的問題。後來找了一段時間發現,CSRF 並不是丟出例外,而是結果回覆 HttpStatusCode 400。查到可實作 IAlwaysRunResultFilter 攔截結果,並判斷是否是 IAntiforgeryValidationFailedResult 的一種。 程式碼如下:  public void OnResultExecuting(ResultExecutingContext context) { if (context.Result is IAntiforgeryValidationFailedResult result) { // Log here } } 但是這樣還不夠。還必須要強制關閉客戶端錯誤的轉換才行,這樣才可以精準的把結果視為 IAntiforgeryValidationFailedResult 至於怎麼關閉則是在註冊 MVC 服務的時候設定 Config SuppressMapClientErrors = true 即可。      services.AddMvc().ConfigureApiBehaviorOptions(options => { options.SuppressMapClientErrors = true; }); 詳細可以參考 MSDN

正規表達式的筆記

掌握正規表達式 一直以來偶爾都會使用正規表達式,但是都沒有一個完整的認識,每次都是問Google大神。最近剛好有一個需求需要大量用到正規表達式,下定決心要把他玩到熟透!因此上網找到一個不錯的網站來訓練 regexone.com  是我找到的一個很不錯的網站,從簡單的到困難的慢慢的讓你快速的得到feedback 又可以測試自己的想法。 透過這個網站的練習,我們可以知道正規表達式可以分成三個程度 第一階段是透過簡單的標記方式來取得模糊搜尋。例如 .(dot), \d, \w, [a-z], [0-9]來限制symbol,透過 ^, +, *, ?, {m,n}, *, ?, {m,n}來限制次數。 第二階段是透過 (...) 來擷取 Group match 第三階段是pattern match ?=.

[學習重構筆記] Part2.重複的程式碼(Duplicated Code)

重複的程式碼 最單純的 Duplicated Code 就是[同一個 class 中的兩個函式含有相同的算式(expression)],這時候最簡單的做法就是Extract Method。提煉出重複的程式碼,然後讓這兩個地點都呼叫提煉出來的那段新的函式。 透過 Resharper Ctrl + R, M 可以快速的重構擷取方法喔! 高階一點的重複,就是抽象之後看起來是重複的,例如檢查密碼,檢查帳號,檢查長度等等,這些抽象看起來就是檢查,這也是一種重複,可以透過某些設計模式來解決。

Docker vs VM 的學習

工作上用到 Docker 也一段時間了,剛接觸到 Docker 時常常會聽到別人這樣解釋," Docker 的 Container 技術,類似於 VM 。差別是 Container 比較小,沒有包含 OS,而 VM 會包含 OS"。 這段話我覺得不算是全錯,所以我一開始也是這樣去解釋給別人聽,直到我聽到我同事在面試求職者時問了這句話,"如果 Container 比較快,比較輕量,優點這麼多,為什麼 VM 沒有被淘汰?" 我才忽然意識到,我並沒有真正瞭解這兩種技術的差別。 事實上,這件事情要從解決問題的角度上出發去理解。任何技術的產生應該都是為了解決某些痛點,從這點來思考的話網路上就有很多文章可以查到了,我把我查到的最清楚的文章連結放下本文最下方,有興趣的可以去看看。 VM 是為了解決硬體的資源共享的問題所產生出來的技術,而這個需求仍然存在,並不會因為有了 Docker 的 Container 技術就取代了。這個可以回答為什麼 VM 沒有被淘汰。因為要解決的問題不一樣,事實上很多 Container 還是跑在 VM 裏頭,可謂是相輔相成。 那 Docker 是為了解決什麼問題才發明的呢? 我的消化與理解是 "解決建置環境的複雜度" 而發明的,每個 Dockerfile 會指定使用的映象檔(image),然後寫下需要安裝的 Tool 指令。按照這個 Dockerfile 上面列下的指令去安裝與建置,就可以重現執行這個 APP Runtime 所需要的環境。這解決了以前工程師常說的那句話 "在我的電腦上跑得好好的,為什麼在正式環境就行不通" 的問題。   參考連結

T-SQL Join 的筆記

 雖然這不是什麼困難的事情,網路上也有很多的資源,但偶而還是會搞混,因此想要好好的搞清楚。 Join 應該都會用兩個圈圈的圖片來代表兩張資料表,然後看是怎樣的 Join 就會塗上資料範圍的顏色 (如下圖)。 但是碰到蠻多人會說 Cross Join 或是 Outer Join。其中 Cross 我是真的不知道。但是 Outer Join 是存在的。因為除了 Inner Join 之外的應該都屬於 Outer Join。像是 Left Outer Join, Right Outer Join 以及 Full Outer Join。 而 Inner Join 的語法也可以簡化成 Join 就好。 最後補上其實還有 Self Join,語法如下,連 Join 都不用寫 SELECT a.custid , b.custid FROM customer a, customer b 對了! 在 MySQL 只有 Inner Join, Left Join, Right Join 而已。

Docker 簡單指令筆記

 最近剛看一個影片在講 Cloud Run, 心血來潮的來試用看看。結果碰到一點小問題,要透過本機端先建立 container 來試跑才能節省時間。因而發現,之前太常使用 k8s 以至於 docker 的指令反而沒那麼熟悉了,特別筆記一下常用的指令。 docker build 建置 docker image by Dockerfile with tag docker build -t {imageName} . docker run 執行 docker container with port mapping local 5566 to docker container 8080 docker run -p 5566:8080 {imageName} docker stop 暫時停止 docker 的執行 docker stop {containerName} docker container start 把停止執行的 container 啟動 docker container start {containerName} docker ps 列出所有 docker container docker ps -a 列出目前執行中的 containner docker ps  docker rm docker rm {containerName} 以上幾個指令就可以在本機環境完整的跑 container 起來測試瞜

ReSharper For VS C# 常用功能概觀介紹

因為目前任職的公司有幫員工購買 ReSharper (R#) 的授權,所以才第一次接觸到這個工具。一開始卡卡的,但是目前已經使用了快三年,覺得如果沒有這個工具就好像電動牙刷沒有電一樣 XD。所以本著好東西要跟別人分享的心態來寫一下目前使用的心得。 ReSharper 的主要功能如下 程式碼檢查,自動重構,快速導航和編碼協助等等的功能。 個人認為 ReSharper 最重要的功能就是提供編碼協助的功能,透過 Alt +  Enter 就可以快速一步一步的把程式碼"生"出來。這也是主要加速開發的主要原因,透過從使用端來 Generate 出產品程式碼,把關注點放在需求上面而非程式碼上。 再來就是自動重構的功能,例如 Extract Method, Introduce Field, Inline Variable. 等等的功能,讓你重構的時候很可以安心重構不用擔心改壞程式碼原本的行為。且很簡單使用,增加重構程式碼的意願。且還有 Ctrl + Shift + R 這個萬解的快捷鍵,可輕鬆入門。 程式碼檢查功能算是那種好像不是最重要的功能,但是少了他又不方便的功能。它可以幫你找出那些程式碼並沒有被用過,哪種寫法可以更好,拼字錯誤,命名大小寫錯誤之類的。 快速導航功能在追 Code 的時候非常好用,Ctrl + T 可以全專案找尋所有的型別、成員,快速定位,快捷鍵 Alt + \ 可以快速定位到目前檔案的成員上面,Ctrl + , 找最近檔案,Shift + Ctrl + , 可以找最近編輯檔案,快又有效且都有搜尋過濾功能。 其他還有很多沒有提到的功能例如 Live template, Code Cleanup 之類的功能也是很好用,之後有時間再慢慢介紹瞜~ 附上一些連結讓大家參考看看 官方介紹影片 VS C# 熱鍵對應表 ReSharper的好處(開發者,產品經理,商業) ReSharper的主要特性

ReSharper C# Shortcut series [ReSharper_EnableDaemon]

  今天在查詢怎麼讓 Resharper 效能提升一點,查到了一個熱鍵很適合在超大型專案上使用,馬上筆記下來。因為在修改公司的老專案時的某些檔案時真的會讓 Resharper 很卡很卡,這時候可以暫時針對這個檔案停止分析,停止分析也不會影響使用 ReSharper 的熱鍵的。這個熱鍵名稱是 [ReSharper_EnableDaemon],預設的 shortcut 是 Ctrl + Shift + Alt + 8。 有需要的朋友可以參考一下。

C# 小坑 [MemoryStream] 無法正確輸出檔案下載

今天在寫一個將資料下載成 Excel 的檔案的 API 時,遇到怎麼下載檔案大小都是 0,且無法開啟的問題。後來發現是因為使用了 MemoryStream 來寫資料,寫完之後它的位置在最後面。因此後來傳給 HttpMessageResponse 的 HttpContent 時,從最後面讀取,因此檔案大小都是 0. 所以加上了一段,把 position 設定回 0 的邏輯才解決這個問題。           public Stream GetReportStream(Report report) { var memoryStream = new MemoryStream(); using (var workbook = new XLWorkbook()) { workbook.AddWorksheet(report.Details, "Details"); workbook.AddWorksheet(report.Summary, "Summary"); workbook.SaveAs(memoryStream); memoryStream.Position = 0; } return memoryStream; }           private static HttpResponseMessage HttpExcelFile(Stream excel, string fileName) { var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(excel) }; result.Con...

[Resharper] fix "if" template

Resharper 2018.2.3 hsa a bug for "if" template will not found the basic expression such as field and local variable. how to fix it? ctrl + Q -> find "template explorer" -> find "c#" -> find "if" and change the "expr" change the expr form smart completion to basic completion

[tips] how to hide vs2017 build progress window

Due to I coding through my mbp laptop. the screen is small, and I don't pin test & solution explorer. when I run all test, I need to popup the test explorer to see test status. but I found the test explorer will dismiss automatically. This bother me a lot. After I survey for a while, I found two setting will affect this. 1. tools -> options - > projects and solutions, uncheck "show output window when build start" 2. codemaid -> options-> progressing, uncheck "show build progress window when a build starts" done. finally I could check test status easily and press <ESC> to dismiss test explorer window.

[TDD之路] 隔離的單元測試

寫程式常常會有很多難以隔離的邏輯,這邊舉一個關於時間的例子。 如果要你寫一個判斷是不是聖誕節的簡單程式你會怎麼寫? public bool IsTodayXmas() { var today = DateTime.Today; if (today.Month == 12 && today.Day == 16) { return true; } else { return false; } } . 上面的邏輯正確且簡單,唯一的缺點是不好測試。為什麼呢? 試著寫一段 Unit Test 看看,你可能會像下面這樣寫 [TestMethod] public void TodayIsXmas() { var checker = new XmasChecker(); var result = checker.IsTodayXmas(); Assert.AreEqual(true, result); } . 這個測試這樣寫的話,只有在聖誕節當天才會 Pass. 所以困難的地方在於怎麼把變動的邏輯給隔離開來。 下面提供幾個作法,在不影響已發佈的使用下來讓程式可以測次,各有優缺點 首先都是先將 DateTime.Today; 這個邏輯提取方法 GetToday(),然後 透過新的建構子 透過新的屬性 透過新的方法 使用繼承,變更 GetToday() 的存取範圍為 Protected virtual 大概是這幾種方法,前三種作法都差不多,GetToday() 邏輯如下 private DateTime? _today = null; private DateTime GetToday() { return _today ?? Dat...

[TDD之路] 與資源檔案相依時導致 CI 測試失敗

CI 上跑測試專案的指令如下 "MSTest.exe /testcontainer:.\bin\Debug\TargetTests.dll /resultsfile:TestResults.trx" 在本機測試都 all pass, 但是在 CI 上面卻失敗。主要原因是測試的物件中有一個跟Bitmap有關的 Image 找不到圖檔導致錯誤。 程式碼如下: public static string ImagePath = Directory.GetCurrentDirectory() + "\\img\\"; public static Image ClockRed = new Bitmap(ImagePath + "Clockred.png"); 看起來ImagePath就是取得當前位置,然後從當前位置的 img 資料夾中找出 Clockred.png 來產生 Bipmap 物件存到 Image裡面。 local 建置與測試一切正常。但執行了 CI 就吐錯誤。 為什麼呢? 主要原因是雖然已經有將 img\Clockred.png copy 到 output 資料夾(bin\debug),但是實際上MSTest.exe執行的目錄卻是在 .\bin\Debug\TestResults\kyo_TI02BT43 2018-03-07 23_46_45\Out 的資料夾。且裡面是沒有 img\Clockred.png 的。 為了解決這個問題,我嘗試了很多取得當前目錄的方法。但問題不在取得目錄,其實目錄是對的,錯的是檔案並不存在。因次找到了一個 deploy 資源檔案到 deploy out 目錄的方法。 就是 DeploymentItem 這個 attribute, 用法可以寫在 [TestClass] 下方 或是 [TestMethod] 下方。 [TestClass] [DeploymentItem(@"img\Clockgraypanel.png", "img")] 就這樣我的測試就可以在 CI 伺服器上跑過了。

[團隊,從傳球開始]

. 最近跟公司的前輩聊天,當時問他有什麼什麼書可以推薦給我,他推薦了我一本書,這本書是"團隊,從傳球開始"。或許是他希望給我一個方向,因為我在目前的團隊裡面是經驗比較多的,需要更有領導力來帶領現在的團隊吧。 . 這本書是關於 John Wooden 這位傳奇教練的領導哲學。Wooden 是美國大學籃球史上最難以超越的總教練,他在 UCLA 執教時讓當時的籃球隊達成全國冠軍七連霸,最長連勝高達八十八次。 . 書中有許多讓我自己感到很有幫助的文字,我把它紀錄下來 . 領導者學無止境,若是停止學習就等同於死了 推銷自己的價值與原則 永遠不要企圖變得比誰更好,但是永遠不要停止成為最好的自己 成功金字塔特質 : 勤奮、熱情 、友情、忠誠、合作、自我控制、專注力、警覺性、衝勁、狀態、技能、團隊精神、鎮定、自信、極致的競爭力 怎麼教 : 先解釋、再示範、跟著做、接著不斷重複 律己最嚴 如果會議時間是三點,而你三點才到,其實你已經遲到了 要快,不要趕;如果你沒空把事情做好,那你怎麼可能還會有空重做一遍? 什麼東西不能教? 人格、靈敏度 跟願意傳球的人在一起 自己負責;最終你所做的決定,決定了你是誰 努力:成功的終極魔數。付出所有的努力,無論是個人或是團隊的一份子,都不是安慰獎或是次等的成就。在我看來,它就是頭獎,它才是最高等級的成就。 別做24/7便利商店;Wooden 的訓練方式是每天只要兩個小時的時間,全心投入,絕對要參與所有訓練的細節。然而一但練球結束,籃球也就跟著結束了。 一直問同樣的問題,[我該如何幫助我們的球隊變得更好?] 別當個大氣球 活在別人的期待是多麼蠢的一件事[太平洋也無法滿足所有人的期待] 擁有好人生 把你的資產最大化 這些摘錄的部份是我快速看過一遍後比較有感的地方。 整本書只有些許地方提到籃球,更多的地方反而是提到領導者的氣量跟原則。像是不斷學習,努力是重要的,勝利並不是最後的評斷。 . 這本書有好多很棒的觀念需要我細細琢磨,我覺得某些想法可以成為我自己的原則。 在看這本書之前我看過史蒂芬-柯維的與[成功有約],我發現這本書也有很多地方有重疊。像是要找到自已的原則,主動積極,努力不懈。 . 覺得最大幫助的幾個要點是,找到自己的路,全心投入事業2小...

加密貨幣交易實戰心得筆記

加密貨幣交易實戰心得筆記 . 對於加密貨幣,雖然公司有個團隊已經在開發相關產品,但我自己只有大概了解什麼是加密貨幣,什麼是比特幣,以及什麼是區塊鍊。雖然稍微知道,但也只是知道,並沒有真的去購買跟投資。 . 幾天前公司舉辦了一場課程,邀請了史旺基到公司分享加密貨幣的交易實戰。課程需要自費,但其中包含了直接幫我們購買比特幣,並將購買的比特幣交易給我們。可以實際接觸到加密貨幣的交易讓我很期待,因此毫不猶豫的就參加了這堂課程。 . 這堂課程並不是在技術上來跟你說什麼是加密貨幣或是區塊鍊的技術是什麼,它著重在由淺入深的介紹什麼是比特幣、什麼是區塊鍊、什麼是去中心化、什麼是挖礦、誰是中本聰、什麼是以太坊以及以太幣、什麼是熱錢包以及冷錢包,等等這類的相關資訊。 . 學習並了解上面介紹的基本資訊之後,課程的重點放在了交易所的介紹與操作上面。我們一步一步的申請了台灣的兩個交易所,分別是 MaiCoin 以及 BitoEX。相信有在投資比特幣的人應該都已經知道,但對於沒有追上潮流的我來說,這個資訊真的是省了我很多研究的時間,立刻感覺前進了一大步,雖然手續費高常常可能卡幣,但中文介面,簡單的認證與交易方式,讓我感覺已經真的觸碰到了比特幣與區塊鍊的邊。 . 除了台灣交易所,更有國際交易平台的介紹與教學,這邊我就不一一介紹了,因為我自己也都還沒申請,而且這些國際平台很多是停止申請帳號的。 . 另外還有更多的資訊,包括怎麼開始投資,投資心法以及不少的中英文介紹資料,包括App的介紹。 . 這堂課除了讓我立刻從門外漢大躍進成初心者,更是直接開始打怪(購買)了,破除了這個最大靜摩擦力之後,我讓我的投資標的又多了一個可能,感覺非常值得。

Cucmber 環境設定 on Mac

因為最近開始開發iOS 但對於測試一直沒有很棒的解法 因此團隊成員發了狠,去徹底研究一個測試框架cucumber跟appium 這裏簡單記錄一下怎麼安裝與設定 主要是參考成員的blogger的設定,再用自己的理解記錄在自己的blogger這邊 首先要安裝 xcode,目的是為了 iOS 模擬器 第二步驟要安裝主角 cucumber  terminal 中指令 sudo gem install cucumber 第三步驟是安裝Appium library terminal 中指令 sudo gem install appium_lib 前往網站 http://appium.io  並點擊 "download appium" 然後選擇下載 " appium-desktop-1.2.7.dmg " 第四步驟安裝RubyMine IDE,目的是為了讀取 feature 檔案並可以透過 IDE 自動產生step 的語法 前往 JetBrain 官網去下載安裝 安裝 pry 套件,這個套件是為了debug用的,特別是他的killer feature "binding.pry" terminal 中指令 sudo gem install pry 即可安裝 安裝 homebrew,這個是個套件管理工具提供 Homebrew 互補了macOS,可以使用 gem 安裝 ruby 套件,而利用brew來安裝依存軟體 安裝方法 terminal 中打指令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 安裝 carthage,這個套件是類似於 CocoaPods 的功能,也是 iOS 套件管理用 terminal 中打指令 brew install carthage 到這已就完成了環境預備安裝 接下來就是打開appium server 然後在已經寫好 feature 的 測試範例專案 位置 透過 terminal 執行 cucumber 就可以跑測試 ---------...

[學習iOS之路] Lifecycle 比較

在開發Android很多年之後終於開始學習寫iOS了 契機就是工作需要,果然工作需求就是推開最大靜摩擦力的原動力啊! 在這邊寫下學習Swift的一些筆記,希望在自己忘記或是需要給別人教學的時候可以起到一點點作用。 因為對Android比較熟悉,所以透過比較來熟悉iOS架構 首先是iOS與android的比較 可以參考這張圖 Android vs iOS lifecycle 與這張 iOS 詳細state 流程 Android lifecycle OnCreate -> OnStart -> OnResume ->(running) -> OnPause -> OnStop -> OnDestroy                        ^                  ^                                  |               |                         |                  |-------------------v               |                         |-----<-----   ...