VSCode: 使用 LiveShare 來即時線上協作吧

在 VSCode 躺了一段時間的 LiveShare 終於派上了用場,這邊就簡單記錄一篇,方便以後推坑的時候用。

Image


當時的情況是這樣的:在風和日麗的某個下午,我和女友去客美多(Komeda)喝超讚的蜂蜜冰咖啡,順便 看著她加班 悠閒地 Coding。

但麻煩的是,我們倆的座位是面對面的兩人座。所以當我們要邊看程式碼邊溝通時,得先把筆電轉 180 度,或是起身走到另一側,非常不方便

就在來回走了幾趟 漸漸不耐煩 之後,突然想起了香香的 LiveShare

LiveShare 可以讓我們在 VSCode 裡即時線上協作,一起編輯同一份程式碼
並且也能看見對方游標的動作、在文件上留言互動等等

當我們正在 WFH,或是像這種懶得走過去(?),但又想要和朋朋們來場 Pair 的時候,LiveShare 就可以派上用場了!

備註:Visual Studio 應該已經內建 LiveShare,
可以從「檔案 > 開始 Live Share 工作階段」來開啟

而 Jetbrains 的朋朋,
請左轉使用 Code with me,同樣也能線上開嚕

……

閱讀全文



使用 AddTypeMap 調整型別映射,讓 Dapper 乖乖寫入 0001-01-01 到 datetime2

Image

這週忙著打黑悟空,簡單記一下前陣子同事遇到的一個場景:

由於曆法的關係,SQL Server 的 datetime 範圍只能從 1753-01-01 開始。
如果我們要寫入 0001-01-01 進去的話就會報錯

SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

補充:關於曆法的部份,有興趣的朋友可以參考這篇:
淺談:消失的日期,以關聯式資料庫的日期資料類型為例 - 德瑞克:SQL Server 學習筆記

這時候通常去把資料表欄位改成香香的 datetime2 就可以搞定,爽爽寫入 0001-01-01。

但如果我們正在使用 Dapper,預設會把 C# 的 DateTime 映射到 SQL Server 的 datetime,所以還是會寫入失敗。

這時候我們就需要明確地請 Dapper 幫我們使用 datetime2 來進行處理。


如果傳遞的只是某個參數,使用 DbType 就行了:

var parameters = new DynamicParameters();
parameters.Add("@Birthday", birthday, DbType.DateTime2);

但如果傳遞的是某個 Model 裡的特定欄位呢?例如:

public class HistoricalEvent
{
    public Guid EventId { get; set; }       // 歷史事件的唯一識別碼
    public string Description { get; set; } // 歷史事件的描述
    public DateTime EventDate { get; set; } // 歷史事件發生的日期, 可能早於 1753 年!
}

這種時候就可以使用 AddTypeMap 來調整一下 Dapper 的映射型別。

……

閱讀全文



.Net: 使用 FeatureManagement 套件來實作功能切換(Feature Toggle)吧

Image

在做上一篇 IOptions 的筆記時,剛好看到 FeatureManagement 這香東西。
馬上來收錄一篇。順便也簡單整理一下 Feature Flag (≒Feature Toggle) 的介紹。

認識一下 Feature Flag

本部落格秉持著「簡單、友善、我好菜」的精神,按照慣例先簡單介紹一下
已經知道的朋友就可以跳過這個小節,直接前往 #環境準備 囉。

假設我們原本有 Old 邏輯:

Old();

天庭傳來諭令,要我們改成 New 邏輯。這簡單,我們就把 Old 砍掉,換成 New。非常自然,改完就佈版

New();

隔天,天庭又傳來諭令,New 需要調整一下,先不要了
現在我們又需要把 New 邏輯砍掉,讓 Old 邏輯回來。
簡單,但看來我們得再上一版

Old();
// New();

再隔天,大家可能猜到天庭又要幹嘛了,總之又上了一版

// Old();
New();

如此往復三萬八千次,工程師終於受不了了:「俺老孫每天在這切換 Old 跟 New,改完還得佈版,每天搞這些就飽了,我滴媽呀,不幹了」

就在老孫關燈走人的那一瞬間,突然靈光一現:等等,俺加個開關還不行嗎?

……

閱讀全文



.Net: 使用 IOptions 取得 appsettings.json 的設定值吧

Image

因為手邊的 .Net Core API 專案越來越多,蠻常會需要讀 appsetting.json 的 Config,每次都要重找文章有點麻煩,這邊就來筆記一篇。


首先簡單介紹一下 appsettings.json 是在幹嘛的:

我們開發的時候,常常會需要弄一些設定值,再用這些設定值用來控制我們程式的某些行為。

例如「某功能的上限值是 10」、「某項開關在測試環境是 false」、「某服務信件的發送者要用 noreply9527」,另外常見的還有連線字串、寫 Log 時的 logging level 等等

這些設定值會和程式碼拆開,放在設定檔集中管理,再讓程式碼從設定檔讀取相關的設定值來用就好。有了設定檔,要調整修改也比較方便:要增加或是修改設定值,都只要先往設定檔衝就行。

既然兩邊拆開了,我們也就可以簡單地替換這些設定值來應對不同狀況(例如正式環境和測試環境套用兩組不同的設定檔,或是在自己電腦測試的時候快速改個值之類的),彈性可說是 UPUP

更重要的是,這樣我們就不需要把一大堆東西寫死在程式碼的各個地方,也就不會要改個值還要先搜尋整個專案再一個一個挖出來改了。我按 Shift Ctrl F 已經按到哭

把設定值抽出去丟到設定檔之後,我們就得到了:集中管理設定值、方便修改和替換、減少程式碼中又重複又寫死的臭東西等等好處。

而在 .Net Core 開始的 .Net API 框架裡,這個設定檔就是 appsettings.json
前面提到的像是日誌等級、功能旗標之類的這些設定值,就會放在 appsettings.json 裡面。

而當我們想要從 appsettings.json 把這些設定值給讀出來的時候,
就可以使用我們的 IOptions 啦!

使用 IOptions 來註冊 & 注入

提醒:這篇的示範會用到一些些 .Net 依賴注入(DI)相關的操作。沒接觸過的朋友可以考慮先閱讀菜雞新訓記:依賴注入

假設我們有個專案,叫做大漢防禦管理系統。專案內的 appsettings.json 有以下內容:

{
  "StrongholdInfo": {
    "Index": 49,
    "Name": "劍閣",
    "Enabled": true, 
    "General": [
      "姜維",
      "廖化",
      "張翼",
      "董厥"
    ]
  }
}

我們正好在開發一個新功能,需要抓到這段設定值。現在就來示範一下:

……

閱讀全文



九日 白金!

Image Image

終於過了!九日沒有慣例的「完成所有成就」的盃,但是放結局獎盃又怕結局名字雷到路過的朋友,就截普通模式通關的盃吧。

按照慣例,留一篇筆記來聊聊心得和體驗,以下有雷。

……

閱讀全文



Fate/Samurai Remnant 白金!

Image

要開玩 DLC 的時候跳了盃,按照慣例來發一下白金心得文~

以下簡單列一下個人覺得的優點(當然有雷)

伊織和 Saber 這對主從很有特色。尤其是主角伊織的成長很有感,也有反應在遊戲性上,後期拿到空之架式的時候割草很爽快。在師徒決戰、伊織使出祕劍的時候,身為 Fate 玩家和動畫宅真的看得非常開心。

除此之外,二週目增加劇情、開始能漸漸窺見到主角內心異常的部份很棒。劍鬼意外地很有魅力,最後的對戰和收尾方式也相當舒服,應該是歷代精神狀況最令人「蛤?」的主角了吧。真不錯。

Image

……

閱讀全文



我買彩券是為了做一個善良的人

我買彩券是為了做一個善良的人
只要還沒開獎,我就有可能會成為億萬富翁

有緊急需求?沒問題
東西又改壞了?沒關係
客戶跑來罵我們全家?當然可以

一個買了彩劵的人,生活充滿希望,行事滿懷善良,心胸寬大、舉止謙讓

畢竟我說不定晚上就發財了,沒必要跟你們計較這些小事。對吧

……

閱讀全文



臥龍:蒼天殞落 白金!

Image

在東漢逛街快一個月,總算白金啦!

這次臥龍玩起來還算挺爽快的,從第一隻 Boss 張梁老師就好好教導玩家的基礎操作。而且意外地能從黃巾之亂一路做到官渡之戰,前期戰役打好打滿,算是蠻有誠意的。

白金之後就開始期待後續的三個 DLC 跟二代了。畢竟三國題材這麼多,實在不怕沒有後作嘛,但 DLC 還要等到六月,這篇就來稍微紀錄一下心得吧。

戰鬥=化解

這次戰鬥主打的是「化解」系統,基本上就是在敵人攻擊的瞬間進行化解,很有中國武術的味兒,也讓我想起隻狼鼓勵玩家要提起勇氣上前拚刀的快感。

初次接觸的時候會覺得這系統做得很不錯,同時帶來了風險和回報:化解失敗就會被捅一刀,而化解成功就可以提升氣勢(可以當成能量條,做任何動作都會消耗),並且得到進攻機會。

除此之外,化解殺招的畫面也很帥,敵人釋放絕招然後主角行雲流水擋掉回擊,很有觀賞樂趣。

因此整個遊戲的主軸就是化解敵人的攻擊和殺招,你來我往地進攻,整個戰鬥就是化解的節奏,打起來挺爽快的。

到這裡我都還是覺得化解真香。但到中後期的時候就開始發現:整個戰鬥過程,就只有化解。

……

閱讀全文



使用 Midjourney AI 繪圖 & Canva 產生 Banner 初體驗

Image

我們在前一篇嘗試自行產生簡單的文字 Banner,我也用了好一陣子(畢竟三年前的新訓文章還是沒整理完嘛)。

直到前陣子逛臉書的時候,看到有人說「我都改用 AI 繪圖工具來產生部落格的配圖了,還沒有版權問題」當下驚為天人:對呀!這不是很不錯嗎!

如此如此,這般這般。立馬開始爬文來嘗試神秘的 AI 繪圖囉!

初嘗試 Midjourney

在網路搜了一下,發現有大神已經整理 Midjourney 入坑詳細步驟,特此感謝:

這邊就稍微紀錄一下,總之先衝到 Midjourney,然後直接註他個冊、登他個入:

Image

……

閱讀全文



使用 .Net 的 System.Drawing 產生簡單的文字 Banner 初體驗

Image

原本我都是用產生 FB 封面的「康熙字典體產生器」來做簡單的文字 Banner,就拿來當作文章的封面照

用了好一陣子也沒啥問題。結果某天文章寫好,吃著火鍋唱著歌,產生器打開一看,服務竟然就沒了!

當下是一個震驚啊,一氣之下決定直接打開 Linqpad 寫一個。

註:現在搜尋康熙字典體產生器,還查得到介面截圖,還真的蠻簡單方便的 Q_Q

以前面的菜雞與物件導向系列 Banner 為例,我們大概需要:

  • 產生一張圖
  • 在圖上面放主標題和副標題
  • 關鍵字可以上色

Image

稍微搜尋一下發現 .Net 已經有 System.Drawing 這個工具可以幫我們完成這些簡單的圖片任務,事不宜遲馬上就來嘗試!

……

閱讀全文