[小菜一碟] 使用 C# 將民國日期的字串轉換成西元日期

四年一次會出現的不是只有總統大選,還有 2 月 29 日的問題,程式如果寫得不夠久大概也不會遇到,像今年就有可能會收到像是「113/02/29」、「113年2月29日」這樣的日期字串,在 C# 中如果直接先轉成西元日期的 113/02/29,再加上 1911 年,像這樣:

DateTime.ParseExact("113/02/29", "yyy/MM/dd", null).AddYears(1911);

那我們的程式應該已經爆了,因為西元 113 年沒有 2 月 29 日,關於閏年的問題,在 C# 我們有更優雅的做法。

...繼續閱讀 »

[料理佳餚] 用 Azure Cognitive Services(認知服務)的 Custom Text Classification(自訂文字分類)來辨識色情廣告

客戶的網站有提供部落格的功能,讓會員可以在上面寫一些文章,經營得算是頗有流量,有流量就容易吸引一些蹭流量的人,色情廣告就是其中之一,目前客戶在色情廣告上的處理仍然是採用人工封鎖的方式,成本高又反應慢,所以打算引入 Azure Cognitive Services(認知服務)的 Custom Text Classification(自訂文字分類),來讓阻擋色情廣告這件事情可以更有效率一些。

...繼續閱讀 »

[小菜一碟] 善用 SQL Server 唯一條件約束(UNIQUE Constraints)來避免因併發產生重複的唯一值

講到資料庫的唯一值,第一個我們會想到就是主索引鍵(Primary Key),那同一個資料表內除了主索引鍵之外會不會有其他的唯一值?我之前遇過的一個需求就有,它是一個部落格的功能,讀者可以收藏文章,同一篇文章不能重複收藏,而讀者可以對已收藏的文章進行任意的排序,所以「讀者 ID + 文章 ID」就成了資料表的主索引鍵,而「讀者 ID + 序號」就是資料表中的另一組唯一值。

...繼續閱讀 »

[廚餘回收] 解決 Gmail 不支援應用程式或裝置透過簡易郵件傳輸通訊協定(SMTP)傳送電子郵件

有一天 Jenkins 不再寄發建置結果通知信,追查原因是因為 Google 更新了一項安全性政策

為保護您的帳戶安全,自 2022 年 5 月 30 日起,如果第三方應用程式或裝置只要求您以使用者名稱和密碼登入 Google 帳戶,Google 將不再支援這些應用程式或裝置。

不過這也不是沒有退路,我們可以改使用應用程式密碼登入帳戶

...繼續閱讀 »

[廚餘回收] 在 ASP.NET Core 中誤用 async void 竟引發了 502(Bad Gateway)

這個是我最近處理的一個問題,使用者回報網站某個功能壞了,而且發現最近時不時網站會顯示 502(Bad Gateway)的畫面,雖然多重新整理幾次它就好了,但是這並不正常,我隨即捲起袖子開始一系列的追查動作,誓言一定要將兇手緝捕歸案。

...繼續閱讀 »

[廚餘回收] Cloudflare 不時吐 502(Bad Gateway),追查發現是 Nginx 發生了「99: Cannot assign requested address」的錯誤。

前幾天,公司的網站在尖鋒時刻,不時會從 Cloudflare 吐出 502(Bad Gateway),查看 Web 伺服器、DB 伺服器的 CPU、記憶體全都沒有過載的情況,把調查對象轉往 Nginx,從錯誤日誌當中看到了下面這個錯誤訊息:

99: Cannot assign requested address

...繼續閱讀 »

[料理佳餚] Castle.DynamicProxy 非同步方法的攔截器

有使用 Castle DynamicProxyAutofac.Extras.DynamicProxy 也是相依於它)實作 AOP 的朋友應該對 IInterceptor 這個介面不陌生,實作這個介面就能得到一個攔截方法的攔截器,但是目前 IInterceptor 只提供同步的版本,如果攔截的對象是非同步方法,事情就會變得麻煩一些,我們來看看該怎麼做?

...繼續閱讀 »