Query Expression Syntax vs Method Chaining Syntax
當我們在 C# 中使用 LINQ 查詢語法(Query Syntax)時,這種查詢語法看起來簡潔且易於理解,但實際上,.NET 的 Common Language Runtime(CLR)並不直接支援這種語法。CLR 主要還是處理方法呼叫 (method calls) 和其他基本的程式碼結構。
簡單的例子
12345678910111213int[] numbers = [ 5, 10, 8, 3, 6, 12 ];//Query syntax:(查詢語法)IEnumerable<int> numQuery1 = from num in numbers where num % 2 == 0 orderby num select num;//Method syntax:(方法語法)IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);
看起來是兩種完全不同的寫法,但 本質上查詢語法只是語法糖 (syntactic suga ...
OOM (一. Managed Heap & Generational Management)
上班, 免不了要處理一些維運和監控的工作(請假)。然而,有時會遇到自己無法理解,也不知從何下手解決的異常情況,例如記憶體不足 (Out of Memory, OOM)。為了更好地應對這類問題,嘗試探索一下記憶體管理的相關知識,看看能夠理解到什麼程度
Managed Heap為了做到記憶體管理,在 .NET 中 當我們建立一個物件時,不是直接從 OS 的記憶體中分配,而是會從 .NET Runtime 已經預先分配的 Managed Heap 中分配記憶體。舉凡一般的 Reference Type 操作以及資料庫連線,都在這個範圍內Managed Heap 本質上是一長條的記憶體空間。.NET 會維護一個指向 Managed Heap 中下一個可用地址的指標。當 .NET 被要求創建一個新物件時,它會在這個地址分配所需的空間給這個物件,並將指標向前移動,以指向下一個可用地址。
Address Size Type0x00ad21e0 16 System.Int32[]0x00ad21f0 20 System.String0x00ad2204 32 MyClass0 ...
HttpClient - Header 都亂了,我還怎麼好好當人
我們人生中最尷尬的某些時刻,不是沉默,而是訊息傳錯像是你在聊天室打了一句「我覺得主管頭好禿」,下一秒才發現你傳的是公司群組聊天室。你懊悔、你重開手機假裝這一切會 Reset、數秒鐘後你開始思考辭職信該不該寫得文藝一點。
又或者你做為一個老師,把生活中的小抱怨傳到學生群組中
來自 Thread 一篇貼文的情境支援
這種「錯頻溝通」其實不只在人生會發生,連程式也會。我們寫程式時,也會很天真地以為,訊息只會送到我們想送的人那裡。但如果發送 Request 時,將秘密資訊設定在 HttpClient.DefaultRequestHeaders 上,相當於把「寫給 A 的情書,貼在公共佈告欄」。
📲 為什麼會這樣?HttpClient 是一個設計上建議共用的元件,也就是說,我們應該用一個 HttpClient instance 去處理多個 request,以節省資源、避免連線耗盡(像是 socket exhausted)。
但問題也就來了:既然大家都用同一支手機在傳訊息,那麼貼在手機上的「身份識別貼紙」(也就是 DefaultRequestHeaders 裡的 token)是不是有可能搞混?
...
BaseAddress - 那一撇,決定了命運的方向
這是一隻蛇蛇。突發奇想想用 / 畫出來當開場,欸還真不錯,看著看著竟有點可愛(?)
🐍 寄錯的明信片有時候,一行程式碼,就像一張寄出的明信片。
你滿懷誠意地寫下問候、地址、郵遞區號,甚至還貼上特別版的郵票,只為讓那封來自心底的訊息,抵達你想念的那個人手上。
但你忘了一件事──地址格式要「符合規格」。
就像 HttpClient 看著那個不完整的 BaseAddress,露出一種:「呃,好啦我自己猜看看好了」的尷尬表情。於是它猜錯了,訊息雖然出發了,但永遠沒有人收到。
🐍 建立實驗讓我們來實驗一下 BaseAddress 設定錯誤會發生甚麼事吧!
1.Autofac 註冊HttpClient12345678910111213141516171819public class ServiceModule : Module{ protected override void Load(Autofac.ContainerBuilder builder) { builder.RegisterType<BoredHttpClient>() .As& ...
DateTimeOffset
煩惱DateTime.Now and DateTime.UtcNowDateTime.Kind時區轉換日期轉字串字串轉 DateTimeDateTimeOffset會議邀約實作練習工作上時不時就會碰到時間的處理
DB 該存甚麼時間?
部署到不同環境會不會有時區問題?
收發推播會不會因為時間處理不周導致收發有問題?首先我們先簡單確認一下這兩者在我們台灣的本機執行會印出什麼時間:
1234DateTime.Now.Dump(); //// 5/12/2024 9:16:01 PMDateTime.UtcNow.Dump(); //// 5/12/2024 1:16:01 PM
DateTime.Now 給的是那台機器的 Local Time,所以我在我的本機執行,抬頭看看時鐘,嗯嗯一模一樣
(我曾經有在 Code 裡面看到 DateTime.Now.ToLocalTime() 的寫法..)
DateTime.UtcNow 給的是目前的世界標準時間,而台灣、香港都比標準時間所在的位置快了 8 個小時,所以會得到比時鐘少 8 小時的結果承襲上一段,雖然好像理所當然,但假如這個時間在程式 ...
Asynchronous - 第一章:雲端中的未竟之事
呼叫器🎵 章節一:傳訊以後的沉默 —— S3 上傳的非同步陷阱明確等待,確保任務完成先執行、後等待,彈性處理任務進度非同步方法其實長這樣你說等等,那我就等等洗內褲的故事...用 Throughput 的眼光看非同步 —— 效率不是來自加速,而是來自不浪費非同步的最佳戰場:I/O Bound vs CPU Bound那杯咖啡,終究會響起提示音
我拿著號碼呼叫器,坐在靠窗的位置。
咖啡廳裡播放著熟悉的爵士樂,氣味是熱牛奶與咖啡豆交融後的溫暖。呼叫器還沒響,但我確定店員剛剛有聽見我點了那杯熟成黑咖啡。
我不確定她現在是不是正在打奶泡,或是還在處理上一張訂單;我也不確定我該不該起身確認一下。但最終我選擇坐著,等她做好準備、等震動響起,等那杯「尚未完成的事」,被端到我手中。
這是一段將資料上傳到 S3 的程式碼
12345678910111213private async Task UpdateS3DataAsync(string s3RecordData, string s3Path){ using var stream = new MemoryStream(Encodin ...
Asynchronous - 第二章:任務 (Task)
breakfastcallback in 早餐callback 之難一. 線性程式碼回歸callback 之難二. 自己管完成狀態callback 之難三. try/catch 沒用任務 ( Task )try/catch 有用了自動錯誤拆包,不再面對可怕的 AggregateException自動包裝 return,不必自己 new Task.Resultsummary清晨,陽光還沒透進窗簾,我們站在廚房前,準備煮一頓早餐。那是個沒有 await、沒有 Task 的年代,一切流程只能靠一層層的 callback 撐起來。煮早餐這件事,得先等水滾、再控火候、再計時間,哪一步出錯,就得重來。每一個選擇都得接在前一個選擇的屁股後面,像在搭積木,一層接一層,沒有省略鍵
所謂的 Callback,其實本質就是:「這件事我現在做不完沒關係,我先把『之後要幹嘛』這個決定權丟出去,等你搞定了,再來叫我回來接著做。」事情還沒弄好,整個流程不卡死在原地
現實生活中有太多事都不是即刻完成的──水要時間才會滾、I/O 要等、網路請求要等、使用者要按個鈕、檔案要讀完……如果我們什麼都等完再做就 ...
架站 (一. Cloudfare體驗)
想來玩玩看 Cloudfare 的 CDN,
將網站託管到 cloudflare具體來說,這個託管就是將網站的 DNS 記錄 (A, CNAME…) 和流量管理轉移到 Cloudflare 平台上,Cloudflare 會去解析您的域名,將流量導向正確的 IP 地址,如此一來,訪客的流量會經過 Cloudflare,這樣可以利用 Cloudflare 的 CDN、緩存、壓縮等功能來加速和優化網站。
1.首先要先去買網域,看是 GoDaddy還是啥的
Appwork 時期買的,趁續約金額變成 40 倍前再拿來做做實驗 (網站還順便被數落一番)
2.重新設定 Name Server 為 Cloudfare
確認 cloudflare DNS 設定1.確認 Proxy Status => Proxied
如此一來,當有人透過 cofstyle.shop 瀏覽網站時,Cloudflare DNS 在解析這個 Domain 會回傳其 CDN Proxy 主機的 Anycast IP 而非我的主機真實 IP,Cloudflare 在全球各地放了很多台相同 IP 的主機,從美國、 ...
OutputCache
🍂 與其他快取的差異最大的差異,是他快取的維度是整個 API 回傳的結果,但與 Redis 等獨立快取系統相比,OutputCache 的使用門檻較低,無需額外安裝與維護快取伺服器,只要設定好屬性即可立即套用,對中小型應用特別友善。
🍂 專案觀察
Cache.Config集中管理設定值
🍂 設定OutputCache 屬性,我們可以指定多項快取參數,其中的 Location 是非常關鍵的設定,它決定了快取資料的儲存位置,包含:
Client 快取存在用戶端(例如瀏覽器)。
Server 快取存在伺服器的記憶體中。
Any 交由系統決定最合適的位置。
在使用 OutputCache 機制時,快取資料的仍受到一定限制,以避免對系統資源造成過大負擔。以下為主要的限制項目:
SizeLimit 指快取區域的總容量上限。當快取資料總量達到此上限時,若未進行資料逐出(Eviction),系統將不再快取任何新的回應。預設上限為 100 MB。
MaximumBodySize 指單一回應(Response Body)可被快取的最大容量。若回應內容超過此大小,系統將不進 ...
Flag Enum - 人生應該有更多種可能性
LivesSingle AnswerFlag EnumBiswise那些喜歡玩遊戲的人進階的需求 : 一串文字轉化成 FlagEnum結語上回聊了 Enum 對這世界建立秩序的重要性,但還有一個問題是,一個東西可能會同時擁有「多個狀態」,我們希望可以用「一個變數」表示出這些狀態的「組合」。正如同人不只是單一角色,而是多重身分的集合,在人生裡,我們每個人都不只是一種角色:
可能是學生、同時是 朋友的情感諮商專家、同時是家庭的支撐者、同時是某個創作者、夢想家,普通的 Enum 是「單選題」
例如有個權限控管的 Enum
1234567enum FilePermission{ Read, Write, Execute}
導致只能寫
1var permission = FilePermission.Read;
通常我們會希望同時可以 Read 和 Write,怎麼辦?這時候可能會想用 List、Array、HashSet 等來處理,但這樣會比較麻煩,判斷時也比較繞口,十分痛苦
12var permissionList = new List<F ...














