發表文章

[C#] 無法載入檔案或組件 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040)

圖片
如提,當專案使用 .NET Framework 時,多少會出現這個問題,尤其是多個專案使用同個套件,如果調整版本時,連帶的依賴套件也會變動,就會造成父子專案的套件版本不同,以下紀錄解決方式。 以下附上情境:  System.IO.FileLoadException: 無法載入檔案或組件 'System.Text.Json, Version=8.0.0.4, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040) 分析:       1. 系統認為套件要使用 System.Text.Json, Version=8.0.0.4     2. 但專案中使用的套件 不是  System.Text.Json, Version=8.0.0.4 解決方式:      1. 先確認 bin 裡面的套件版本是多少 。(看起來是 7.0.0)                2. 檢查 App.Config 或是 Web.Config 的套件版本是多少。(看起來是 8.0.4)                3. 檢查 .csproj 的套件版本是多少。(看起來是 8.0.4)                  4. 把  App.Config, Web.Config, .csproj 的版本都改成 7.0.0      5. 清除方案 > 重建方案     

[C#] 節流策略 - Debounce & Throttle

圖片
    最近有一個案子類似搶票功能,雖然公司流量跟台鐵相比真的不足為奇,但因同事們撰寫程式都會發生超賣或太慢的狀況,導致主管總覺得這個很複雜。 當然超賣的根本原因跟節流沒有太大的關係,這部分有機會再紀錄。 主要是設計架構上可以透過節流策略,加強系統的承載能力,所以實作該策略了。 Debounce(去抖動) ● 作用:在事件頻繁觸發時,只在最後一次事件觸發後的一段時間內執行。 ● 特點:若在等待時間內再次觸發,計時器重置,直到最後一次觸發後才執行。 ● 應用場景:表單輸入自動保存、搜尋框輸入後延遲查詢、網路請求。 Throttle(節流) ● 作用:在固定的時間間隔內限制事件的觸發次數。 ● 特點:保證在特定時間段內最多執行一次,即使事件頻繁觸發。 ● 應用場景:滾動監聽、按鈕防連點、視窗調整大小事件、網路請求。 Trailing Throttle(結合去抖動和節流) ● 作用:在固定的時間間隔內限制事件的觸發次數,並 確保執行最後一次 事件 。 ● 特點:保證在特定時間段內最多執行一次,即使事件頻繁觸發,且會 執行最後一次事件 。 ● 應用場景: 節流情境下,但需要執行最後一次 事件 。 這邊也附上一個js的應用場景( throttle vs debounce ),比起rxjs的圖,這應該是最好理解的方式了,大家可以觀察一下兩者的區別。 Debounce(去抖動) using System; using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; public static class Debouncer { static ConcurrentDictionary _tokens = new ConcurrentDictionary (); public static void Debounce(string uniqueKey, Action action, int millisecondsDelay) { // 如果已經存在 uniqueKey 的 ...

[Testing] 壓力測試 load testing - locust

圖片
    簡單紀錄一個壓力測試工具 - Locust,Locust 是一個開源的壓力測試工具,用於模擬大規模並發用戶請求來測試 Web 應用和 API 的性能。它使用 Python 腳本定義測試行為,支持分佈式測試,並提供簡潔的 Web 界面來監控測試結果,適合進行靈活且可擴展的性能測試。 Locust 特點: 1. 使用簡單:基於 Python 腳本,靈活且易於編寫自定義測試場景。 2. 實時監控:提供友好的 Web UI,實時查看測試結果和性能數據。 3. 可擴展性強:支持分佈式測試,能夠模擬大量並發用戶。 情境: 1 . 目的為搶票。 2 . 組合兩個API測試,一個是取票(book_event),一個是取得當前票數名額資料(search_event)。 3 . 提供一組使用者資料,做為壓力測試資料。 4 . 每次隨機取一個使用者發起請求。 提前補充: 1. Locust有很多進階的應用,目前只記錄最基本的功能。

[SQL] Oracle查無資料 (因 SESSION, NLS, AMERICA...因素)

圖片
    如題,近期公司導入 Oracle,導致程式碼需要調整,卻遇到當前環境查無資料! 但窗口卻說權限有開了,所以紀錄下解決問題的方式。 ● 情境: 1. 窗口提供同義詞(Synonyms) 2. 因公司別不同,窗口也提供一個方法切換公司別,假設為 SET_COMPANYID_CONTEXT ● 解決思路: 1. 先詢問窗口他們使用了哪些NLS_PARAMETERS,通常會變的是 NLS_LANGUAGE,因為中文版更新頻率低,所以常使用美國版。 2. 再來就是更新當前環境的NLS_PARAMETERS,確認看看有無資料。 3. 最後就是在程式中提前設定好NLS_PARAMETERS。 Step1: 查看當前環境的 NLS_PARAMETERS -- 查詢出當前環境的 NLS_PARAMETERS SELECT * FROM V$NLS_PARAMETERS; -- 查詢出可使用的 VLS VALUE SELECT * FROM V$NLS_VALID_VALUES Step2: 當前環境執行語法,確認是否有資料 ALTER SESSION SET NLS_LANGUAGE='AMERICAN' Step3: 程式提前設定  NLS_PARAMETERS 重點是要在每個 connection 連接後,提前設定即可。 //... using (var sessionCommand = connection.CreateCommand()) { // 修改 NLS_LANGUAGE sessionCommand.CommandText = "ALTER SESSION SET NLS_LANGUAGE='AMERICAN'"; sessionCommand.ExecuteNonQuery(); // 修改 NLS_DATE_LANGUAGE (假設比對結果有差異就要加上) sessionCommand.CommandText = "ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'"; sessionCommand.ExecuteNo...

[SQL] DB Lock

  Sql Server 常常會遇到 Lock 的問題,重點是要查出哪邊卡住,並且看如何處理,以下查詢方式。 SELECT r.session_id, r.status AS [指令狀態], r.command AS [指令類型], r.wait_time/1000.0 AS [等待時間(秒)], s.client_interface_name AS [連線資料庫的驅動程式], s.host_name AS [電腦名稱], s.program_name AS [執行程式名稱], t.text AS [執行的SQL語法], r.blocking_session_id AS [被鎖定卡住的session_id] FROM sys.dm_exec_requests r INNER JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t WHERE s.is_user_process = 1; 上圖可以看到被 session_id 79 卡住了,但重點是時間非常就,狀態是 KILLED/ROLLBACK,表示已經執行KILL了,還是卡住。這就需要重啟SQL Server了。 若是一般的執行,應該Kill就可以了。 參考資料: https://www.uuu.com.tw/Public/content/article/20/20201207.htm

[Linux] Docker中 COPY 和 -v 的使用場景

  使用 -v 參數來掛載外部路徑到 Docker 容器內是開發階段非常常見的做法。這樣做的好處是,你可以在本地編輯代碼,並立即在 Docker 容器內看到變更,無需每次都重新構建映像。以下是兩種情況的對比: 1. 使用 COPY 指令在構建映像時複製文件 這種方法適合於構建最終的生產環境映像。構建完成後,所有的應用程式文件都被複製到了 Docker 映像中。 Dockerfile 複製程式碼 示例: FROM php: 8.2 -cli WORKDIR / var /www # 會將本地的檔案複製到 WORKDIR /var/www COPY . . RUN php -r "file_exists('.env') || copy('.env.example', '.env');" && \ php artisan key:generate && \ composer install EXPOSE 8000 CMD [ "php" , "artisan" , "serve" , "--host" , "0.0.0.0" , "--port" , "8000" ] 2. 使用 -v 參數在運行容器時掛載本地路徑 這種方法適合於開發階段。你可以在本地編輯代碼,並立即在 Docker 容器內看到變更。 Dockerfile 示例(更簡單): FROM php: 8.2 -cli WORKDIR / var /www RUN php -r "file_exists('.env') || copy('.env.example', '.env');" && \ composer install EXPOSE 8000 CMD [ "php" , "artisan" , "serve" , "--host" , "0.0.0....

[Program] 三分鐘連猴子都能理解的遞迴核心

圖片
  不論您是否有寫過程式,本文目的就是讓任何人都可以在三分鐘理解遞迴的核心。 遞迴是程式中很常使用的到,但對於初學者來說確實有一點門檻,本篇就以[反向重組字串]範例說明。 目標: 反向重組字串,假設我有一個字串為"ABCD",我要反向重組字串為"DCBA"。 這個看似很容易,但是 如果有10000個字呢?  這時候就可用使用程式的 遞迴 來完成了。 反向重組字串,我們從人類的角度看,就是: 『把最後一個字記錄下來,並且把那個字移除,並組合起來』 然後不斷重複這個邏輯對吧,這就是遞迴! 而程式中就會把這個邏輯定義成一個方法 function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 遞迴我認為可以拆解成兩個字,對照本範例如下: *把最後一個字記錄下來,並且把那個字移除 => 「遞」 *資料組合起來 => 「迴」 *要執行「迴」的步驟時,須要觸發判斷條件,也就是終止「遞」的步驟,否則就是無窮迴圈!! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 而把這個過程轉成一個固定邏輯,重複使用該邏輯就是遞迴的核心!!! 遞迴的核心就是 "自己" 呼叫 "自己" ! 也因為自已呼叫自己,會有一層一層往內傳、多層嵌套的概念,就向俄羅斯娃娃一樣~ 那先用一張圖,快速理解 反向重組字串 的過程。 後面用文字說明主邏輯: 1. 第一次呼叫方法,傳入 'ABCD' ,紀錄最後一碼 'D' ,並移除 'D' ,將 'ABC' 往下傳。 2. 第二次呼叫方法,傳入 'ABC' ,紀錄最後一碼 'C' ,並移除 'C' ,將 'AB' 往下傳。 3. 第三次呼叫方法,傳入 'AB' ,紀錄最後一碼 'B' ,並移除 'B' ,將 'A' 往下傳。 4. 第四次呼叫方法,傳入 'A' ,紀錄最後一碼 'A' ,並移除 'A...

[Web] 使用 OpenSSL 建立開發測試用途的自簽憑證(Self-Signed Certificate)和設置Domain Name

圖片
  這次要實作 OpenSSL 來建立自簽憑證和設置Domain Name,這個憑證是用來做開發測試用途,不是真正的憑證,所以不用花錢買,只要自己建立就可以了。 本次多數都是參照保哥的文章,由於我使用 windows,如果是 linux 或其他系統的話,請參照 保哥的文章。 實作環境: 本機 以下示範如何在 Windows 主機使用 OpenSSL 建立 CA 憑證。 一. 第一步是要取得 OpenSSL。建議使用 Cmder,以下也以 Cmder 示範。( https://cmder.app/  下載mini版本即可。) 二. 建議目錄放置產生的憑證,以 D:\SSL 示範 三. 建立 ssl.conf 設定檔,內容如下: [req] prompt = no default_md = sha256 default_bits = 2048 distinguished_name = dn x509_extensions = v3_req [dn] C = TW ST = Taiwan L = Taipei O = miketest1234 CA OU = miketest1234 CA emailAddress = miketest1234@mail.com CN =  .miketest1234.net [v3_req] subjectAltName = @alt_names [alt_names] DNS.1 =  .miketest1234.net DNS.2 = *.localhost DNS.3 = localhost IP.1 = 127.0.0.1 四. 透過 OpenSSL 命令產生私密金鑰(server.key) 與 自簽憑證檔案(server.crt): openssl req -x509 -new - nodes - sha256 - utf8 - days 3650 - newkey rsa : 2048 - keyout server .key -out server .crt - config ssl .conf 五. 透過 OpenSSL 命令產生 PKCS#12 憑證檔案 ( .pfx 或  .p12),此步驟要輸入密碼來保護憑證檔案。 ope...

[Web] Nginx+IIS+asp.net mvc 實現負載平衡(load balancing)

圖片
  當網站的人數使用量增加時,會出現效能、吞吐量...議題,所以常見的做法就是負載平衡,簡單說就是同個系統重複建置(例如建置4個: A, B, C, D),但是透過一個主要的入口,系統自動分配使用者訪問到A, B, C, D其中一個系統,達到分散流量的目的。 本次目的: 使用 Asp.net + Mvc + NGinx + IIS 分布式部署和負載平衡,一個網站分布式部署四個port分別是8001~8004,並且我使用nginx會設定port 8888,並且由系統自動分配導至 8001~8004 其中一個。 Step1: 建立Asp.net mvc網站 (這邊就是新開專案而已。) Step2: IIS建立網站 執行發佈後,發佈檔複製四個,每一個的Index.chtml都給上對應編號1~4。 並建立四個網站,port從 8001~8004 Step3: 安裝 Nginx (官網: https://nginx.org/en/download.html ) 我使用的是 windows 版,版本是 1.20, 安裝後就解壓縮。 。 Step4: 設定 Nginx 將 conf\nginx.conf 內容置換為以下。 worker_processes 1 ; events { worker_connections 1024 ; } http { include mime.types; default_type application/octet-stream; sendfile on ; keepalive_timeout 65 ; #gzip on; upstream myapp { server 127.0.0.1:8001 ; server 127.0.0.1:8002 ; server 127.0.0.1:8003 ; server 127.0.0.1:8004 ; } server { listen 8888 ; location / { proxy_pass http://mya...

[Linux] Windows安裝Wsl2 + Ubuntu22.04 + Docker +Oracle

圖片
  因近期本機需要使用Oracle,考量權限問題,所以使用如標題上的方案,紀錄如下。 1. 啟用WSL必要元件 控制台 —> 程式和功能 —> 開啟或關Windows功能 —> 勾選Hyper-V平台 —> 執行PowerShell指令 —>  重開機!!! 以系統管理員身執行以下 PowerShell 指令: dism .exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux / all /norestart dism .exe /online /enable-feature /featurename:VirtualMachinePlatform / all /norestart 2. 將WSL預設版本調成WSL2 wsl -- set - default -version 2 3. Microsoft Store 安裝 Ubuntu 由於版本會有差異,那目前我的Ubuntu是 22.04版 裝好後就啟用,並且設定帳號密碼(基本上命令自元的密碼輸入都是看不到的喔~) # 或是使用指令安裝也可以 # 查看版本號 wsl -l -o # 安裝指定版本 wsl --install -d Ubuntu-20.04 4. 使用WSL // 列出WSL指令 wsl -h // 列出所有已經安裝的Linux發行版,表示可以切換不同的linux環境 wsl -l // 執行Linux 發行版並進入Shell (目前我的版本是 Unbuntu,也可以執行其他版本) wsl -d Ubuntu // 目前使用 wsl -d Ubuntu -20.4 // 若是妳安裝這個版本,就用這個 // 執行Linux,若要退出,輸入 exit exit 5. 更換Systemd 簡單來說,systemd就是啟動、管理Linux的,由於我們使用windows,所以要更換版本。 我們使用  ubuntu-wsl2-systemd-script ,先下載下來。 5.1 先調整裡面的一個文件 enter-systemd-namespace,  -a 改為 -m -p 5.2 ,並且cmd再指向這個...