跳到主要內容

發表文章

目前顯示的是 10月, 2020的文章

正規表達式的筆記

掌握正規表達式 一直以來偶爾都會使用正規表達式,但是都沒有一個完整的認識,每次都是問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.Content.Headers.ContentDisposition =