Help
RSS
API
Feed
Maltego
Contact
Domain > blog.miniasp.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-03-24
65.52.168.70
(
ClassC
)
Port 443
HTTP/1.1 200 OKContent-Length: 96532Content-Type: text/html; charsetutf-8Date: Mon, 24 Mar 2025 18:26:50 GMTAccess-Control-Allow-Credentials: trueAccess-Control-Allow-Headers: Content-Type, AuthorizationAccess-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONSAccess-Control-Allow-Origin: https://localhost:7082Access-Control-Expose-Headers: Request-ContextCache-Control: private, max-age300Expires: Mon, 24 Mar 2025 18:31:50 GMTStrict-Transport-Security: max-age31536000; includeSubDomainsContent-Style-Type: text/cssContent-Script-Type: text/javascriptRequest-Context: appIdcid-v1:7ad65f9b-06c0-45ec-89e9-c0011db7e65cX-Content-Type-Options: nosniffContent-Security-Policy: default-src * unsafe-eval unsafe-inline data: blob:;X-Frame-Options: SAMEORIGINReferrer-Policy: strict-origin-when-cross-originPermissions-Policy: fullscreen(self), camera(), microphone() !DOCTYPE html>html langzh-Hant-TW>head>meta http-equivcontent-type contenttext/html; charsetutf-8 /> link relcontents titleArchive href/archive /> link relstart titleThe Will Will Web href/ /> link typeapplication/rsd+xml reledituri titleRSD hrefhttps://blog.miniasp.com/rsd.axd /> link typeapplication/rdf+xml relmeta titleSIOC hrefhttps://blog.miniasp.com/sioc.axd /> link typeapplication/apml+xml relmeta titleAPML hrefhttps://blog.miniasp.com/apml.axd /> link typeapplication/rdf+xml relmeta titleFOAF hrefhttps://blog.miniasp.com/foaf.axd /> link typeapplication/rss+xml relalternate titleThe Will Will Web hrefhttps://feeds.feedburner.com/TheWillWillWeb /> link typeapplication/opensearchdescription+xml relsearch titleThe Will Will Web hrefhttps://blog.miniasp.com/opensearch.axd />meta nameviewport contentwidthdevice-width, initial-scale1.0, maximum-scale5.0 />meta propertyfb:pages content119279178101235 />link relstylesheet href/Custom/Themes/Standard-2015/css/bootstrap.min.css />link relstylesheet href/Custom/Themes/Standard-2015/css/main.min.css />link relstylesheet href/Custom/Themes/Standard-2015/css/responsive.min.css />link relshortcut icon hreffavicon.ico typeimage/x-icon />meta nametwitter:card contentsummary />meta nametwitter:site content@Will_Huang />meta nametwitter:creator content@Will_Huang /> script async srchttps://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?clientca-pub-4707105512864121 crossoriginanonymous>/script> meta namedescription content記載著 Will 在網路世界的學習心得與技術分享 - 記載著 Will 在網路世界的學習心得與技術分享 - The Will Will Web /> meta namekeywords content.NET Core,.NET Framework,AI,Angular,AngularJS,ASP.NET,ASP.NET Core,ASP.NET MVC,ASP.NET Web API,Azure DevOps,C#,Container,CSS,DevOps,Entity Framework,Git,Golang,IIS,Java,JavaScript,Jenkins,Kubernetes,LINQ,Linux,Microsoft Azure,MySQL,Office,Office 365,Oracle,PHP,Security,SQL Server,Subversion,Tips,Unit Testing,VBA,Visual Basic,Visual Studio,VS2010 Tips,Web,Windows,Windows Phone 7,介紹好用工具,心得分享,未分類,多奇快訊,系統管理,前端工程研究,專案管理,團隊合作,網路管理 /> meta nameauthor contentWill Huang />meta propertyog:type contentwebsite />meta propertyog:site_name contentThe Will Will Web />meta propertyfb:app_id content1572310523097892 />title> 記載著 Will 在網路世界的學習心得與技術分享 | The Will Will Web/title>/head>body classltr>div idfb-root>/div> form methodpost action/ idaspnetForm>div classaspNetHidden>input typehidden name__VIEWSTATE id__VIEWSTATE valueLoyjFpxV9Ss+EItTTtD+9xLM0x2lrmzb5R8pAsKK+6TwFn90wDeFpWwUYs6PGzI2AZgqvIT4ohd98Thn797vt7z7yuLGVWCMy3cUE7nf5V1L3QF82zlIPZ3nZ9b1QiMyvtwIp4+HnLzFuJJ1KgD3gL3l3JWxKGDt3bQY1qeoT/dsuZv4 />/div> header classheader> div classnavbar navbar-inverse rolenavigation> div classcontainer> div classnavbar-header> button typebutton classnavbar-toggle data-togglecollapse data-target.navbar-collapse> span classsr-only>Toggle navigation/span> span classicon-bar>/span> span classicon-bar>/span> span classicon-bar>/span> /button> /div> div classnavbar-collapse collapse> ul classnav navbar-nav > li>a hrefhttps://blog.miniasp.com/>首頁/a>/li> li>a hrefhttps://blog.miniasp.com/archive>文章彙整/a>/li> li>a hrefhttps://blog.miniasp.com/contact>與我聯絡/a>/li> /ul> ul classnav navbar-nav navbar-right> li>a href/Account/login.aspx idctl00_aLogin relnofollow>登入/a>/li> /ul> /div> /div> /div> div classtitle-wrapper> div classcontainer> picture> source srcset/Custom/Themes/Standard-2015/images/logo.avif typeimage/avif> source srcset/Custom/Themes/Standard-2015/images/logo.webp typeimage/webp> img loadinglazy width72 height72 src/Custom/Themes/Standard-2015/images/logo.jpg classpull-left logo altThe Will Will Web /> /picture> hgroup classpull-left> h1>a hrefhttps://blog.miniasp.com/>The Will Will Web/a>/h1> h2>記載著 Will 在網路世界的學習心得與技術分享/h2> /hgroup> div idsocial-icons classpull-right social-icon> a hrefhttps://www.facebook.com/will.fans titleWill 保哥的技術交流中心 target_blank> picture> source srcset/Custom/Themes/Standard-2015/images/facebook.avif typeimage/avif> source srcset/Custom/Themes/Standard-2015/images/facebook.webp typeimage/webp> img src/Custom/Themes/Standard-2015/images/facebook.png width48 height48 altsocial media - facebook/> /picture> /a> a hrefhttps://www.youtube.com/@Will_Huang titleWill 保哥 target_blank> picture> source srcset/Custom/Themes/Standard-2015/images/youtube.webp typeimage/webp> img src/Custom/Themes/Standard-2015/images/youtube.png width48 height48 altsocial media - youtube/> /picture> /a> a hrefhttps://twitter.com/Will_Huang title@Will_Huang 保哥的推特 target_blank> picture> source srcset/Custom/Themes/Standard-2015/images/twitter.avif typeimage/avif> source srcset/Custom/Themes/Standard-2015/images/twitter.webp typeimage/webp> img width48 height48 altsocial media - twitter src/Custom/Themes/Standard-2015/images/twitter.png /> /picture> /a> a hrefhttps://mastodon.social/@doggy8088 titleWill 保哥 target_blank> picture> source srcset/Custom/Themes/Standard-2015/images/mastodon.webp typeimage/webp> img src/Custom/Themes/Standard-2015/images/mastodon.png width48 height48 altsocial media - mastodon/> /picture> /a> a hrefhttps://www.plurk.com/willh title★★★ Will 保哥的噗浪 ★★★ target_blank> picture> source srcset/Custom/Themes/Standard-2015/images/plurk.avif typeimage/avif> source srcset/Custom/Themes/Standard-2015/images/plurk.webp typeimage/webp> img width48 height48 altsocial media - plurk src/Custom/Themes/Standard-2015/images/plurk.png /> /picture> /a> a hrefhttps://feeds.feedburner.com/TheWillWillWeb titleRSS 訂閱 target_blank> picture> source srcset/Custom/Themes/Standard-2015/images/rss.avif typeimage/avif> source srcset/Custom/Themes/Standard-2015/images/rss.webp typeimage/webp> img width48 height48 altrss src/Custom/Themes/Standard-2015/images/rss.png /> /picture> /a> /div> /div> /div> /header> section classcontainer> div classrow> section classcol-md-8 content-wrapper> div idctl00_cphBody_divError>/div> div idctl00_cphBody_PostList1_posts classposts>article classpost idpost0> header classpost-header> h2 classpost-title> a href/post/2025/03/05/How-to-correctly-use-Big5-encoding-in-NET-Core>如何在 .NET Core、.NET 5+ 與 ASP.NET Core 正確使用 Big5 編碼/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, 如何在 .NET Core、.NET 5+ 與 ASP.NET Core 正確使用 Big5 編碼, 由於從 .NET Core 1.0 開始,就沒有自動載入 BIG5 編碼的 Encoding 資料,所以你沒辦法直接透過 Encoding.GetEncoding(\Big5\) 取得 Encoding 物件。在 .NET Core 3.1 之前,還需要須額外安裝 System.Text.Encoding.CodePages 套件才行。不過,從 .NET 5 開始,這個套件成為了 .NET SDK 的一部分,不再需要額外安裝。但即便如此,你還是要特別執行一段註冊以使用此編碼。接下來,我們將深入探討如何註冊這些編碼並正確使用它們在不同的場景中。, https://blog.miniasp.com/post/2025/03/05/How-to-correctly-use-Big5-encoding-in-NET-Core)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/03/05 14:11/span> span classpost-category>📁 a href/category/NET-Core>.NET Core/a>, a href/category/ASPNET-Core>ASP.NET Core/a>, a href/category/C>C#/a>/span> /div> /header> section classpost-body text idfb_6e70092d-175f-4c7f-b33c-7264d28b6075> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>由於從 .NET Core 1.0 開始,就沒有自動載入 code>BIG5/code> 編碼的 code>Encoding/code> 資料,所以你沒辦法直接透過 code>Encoding.GetEncoding(Big5)/code> 取得 code>Encoding/code> 物件。在 .NET Core 3.1 之前,還需要須額外安裝 code>System.Text.Encoding.CodePages/code> 套件才行。不過,從 .NET 5 開始,這個套件成為了 .NET SDK 的一部分,不再需要額外安裝。但即便如此,你還是要特別執行一段註冊以使用此編碼。接下來,我們將深入探討如何註冊這些編碼並正確使用它們在不同的場景中。/p>p>... a classmore href/post/2025/03/05/How-to-correctly-use-Big5-encoding-in-NET-Core#continue>繼續閱讀/a> .../p> /section> /article>article classpost idpost1> header classpost-header> h2 classpost-title> a href/post/2025/03/04/Understanding-WAV-format-and-PCM-encoding>理解 WAV 格式:從 PCM 編碼格式到檔案大小計算方法/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, 理解 WAV 格式:從 PCM 編碼格式到檔案大小計算方法, 最近正在設計一個「即時口譯」的應用,可以幫助我們客戶在舉辦現場活動或即時線上活動時,可以提供多語言的口譯服務。我們需要將語音輸入訊號轉換為文字,然後再轉換為其他語言的語音。在這個過程中,首先要先深入瞭解常見的 WAV 格式,瞭解之後才能做一些更深層的細部操作。這篇文章將深入探討 WAV 格式,從 PCM 編碼格式到檔案大小計算方法,讓我們更好地處理音頻資料。, https://blog.miniasp.com/post/2025/03/04/Understanding-WAV-format-and-PCM-encoding)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/03/04 11:14/span> span classpost-category>📁 a href/category/AI>AI/a>/span> /div> /header> section classpost-body text idfb_2dd35824-cc74-4d5e-95ae-584b18963022> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>最近正在設計一個「即時口譯」的應用,可以幫助我們客戶在舉辦現場活動或即時線上活動時,可以提供多語言的口譯服務。我們需要將語音輸入訊號轉換為文字,然後再轉換為其他語言的語音。在這個過程中,首先要先深入瞭解常見的 WAV 格式,瞭解之後才能做一些更深層的細部操作。這篇文章將深入探討 WAV 格式,從 PCM 編碼格式到檔案大小計算方法,讓我們更好地處理音頻資料。/p>p>... a classmore href/post/2025/03/04/Understanding-WAV-format-and-PCM-encoding#continue>繼續閱讀/a> .../p> /section> /article>article classpost idpost2> header classpost-header> h2 classpost-title> a href/post/2025/02/28/google-chirp>使用 Google Chirp 通用語音模型進行高品質語音識別與文字轉錄/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, 使用 Google Chirp 通用語音模型進行高品質語音識別與文字轉錄, 最近研究了多套語音轉文字的模型,今天這篇文章我打算來分享一套由 Google 發展的 Chirp 通用語音模型 (Google USM),該模型能夠在單一模型中統一處理多種語言的數據,為使用者提供更精, https://blog.miniasp.com/post/2025/02/28/google-chirp)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/02/28 17:04/span> span classpost-category>📁 a href/category/AI>AI/a>/span> /div> /header> section classpost-body text idfb_c48f26d2-8335-4690-b658-7faacc79c1fc> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>最近研究了多套語音轉文字的模型,今天這篇文章我打算來分享一套由 Google 發展的 a hrefhttps://cloud.google.com/speech-to-text/v2/docs/chirp-model>Chirp/a> 通用語音模型 (a hrefhttps://arxiv.org/pdf/2303.01037>Google USM/a>),該模型能夠在單一模型中統一處理多種語言的數據,且主要用來處理短音頻(小於1分鐘)和長音頻(1分鐘至8小時)的應用情境。/p>p>... a classmore href/post/2025/02/28/google-chirp#continue>繼續閱讀/a> .../p> /section> /article>article classpost idpost3> header classpost-header> h2 classpost-title> a href/post/2025/02/07/How-to-use-the-Chrome-Web-Store-Publish-API-to-automate-the-publishing-of-a-Chrome-Extension>如何使用 Chrome Web Store Publish API 自動化發佈 Chrome Extension/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, 如何使用 Chrome Web Store Publish API 自動化發佈 Chrome Extension, 我現在維護著幾套不同的 Chrome 擴充套件,每次發佈新版本時都需要手動上傳更新,覺得有點麻煩,所以我這幾天研究了一下 Chrome Web Store Publish API 並設定了 GitHub Actions 來自動化發佈 Release 與 Chrome Extension,真的方便太多了。這篇文章我就來說說這個設定的過程。, https://blog.miniasp.com/post/2025/02/07/How-to-use-the-Chrome-Web-Store-Publish-API-to-automate-the-publishing-of-a-Chrome-Extension)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/02/07 23:58/span> span classpost-category>📁 a href/category/Web>Web/a>/span> /div> /header> section classpost-body text idfb_eb56e254-4072-4c66-97b0-fd7bbe3074f1> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>我現在維護著幾套不同的 Chrome 擴充套件,每次發佈新版本時都需要手動上傳更新,覺得有點麻煩,所以我這幾天研究了一下 a hrefhttps://developer.chrome.com/docs/webstore/using-api>Chrome Web Store Publish API/a> 並設定了 a hrefhttps://github.com/features/actions>GitHub Actions/a> 來自動化發佈 Release 與 Chrome Extension,真的方便太多了。這篇文章我就來說說這個設定的過程。/p>p>... a classmore href/post/2025/02/07/How-to-use-the-Chrome-Web-Store-Publish-API-to-automate-the-publishing-of-a-Chrome-Extension#continue>繼續閱讀/a> .../p> /section> /article>article classpost idpost4> header classpost-header> h2 classpost-title> a href/post/2025/02/04/Software-people-watch-the-Trauma-Center-observations-and-thoughts>軟體人看韓劇《外傷重症中心》— 我的觀察與感想/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, 軟體人看韓劇《外傷重症中心》— 我的觀察與感想, 我在春節期間看了 Netflix 熱播的韓劇《外傷重症中心》,我在追劇的過程中不僅被劇情吸引,還不禁將劇中的情節與軟體開發的日常進行對比。這部劇不僅展現了醫療救援的緊張與挑戰,也讓我思考了許多與職場、專業精神相關的議題。以下是我從軟體人的角度出發,對這部劇的一些觀察與感想。, https://blog.miniasp.com/post/2025/02/04/Software-people-watch-the-Trauma-Center-observations-and-thoughts)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/02/04 18:05/span> span classpost-category>📁 a href/category/心得分享>心得分享/a>, a href/category/專案管理>專案管理/a>, a href/category/團隊合作>團隊合作/a>/span> /div> /header> section classpost-body text idfb_0c11976e-3d79-4ee6-88eb-be6d977cb5bf> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>我在春節期間看了 Netflix 熱播的韓劇《a hrefhttps://www.netflix.com/watch/81677629?source35>外傷重症中心/a>》,我在追劇的過程中不僅被劇情吸引,還不禁將劇中的情節與軟體開發的日常進行對比。這部劇不僅展現了醫療救援的緊張與挑戰,也讓我思考了許多與職場、專業精神相關的議題。以下是我從軟體人的角度出發,對這部劇的一些觀察與感想。/p>p>... a classmore href/post/2025/02/04/Software-people-watch-the-Trauma-Center-observations-and-thoughts#continue>繼續閱讀/a> .../p> /section> /article>article classpost idpost5> header classpost-header> h2 classpost-title> a href/post/2025/01/25/How-to-add-Swagger-UI-in-ASPNET-Core-9>如何在 ASP.NET Core 9 加入 Swagger UI 介面/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, 如何在 ASP.NET Core 9 加入 Swagger UI 介面, 微軟從 ASP.NET Core 9 開始正式支援 OpenAPI 規格,並推出 Microsoft.AspNetCore.OpenApi NuGet 套件,在建立 ASP.NET Core Web API 專案時,預設就會加入可以產生 OpenAI 規格的端點。不過,對許多開發人員來說,常用的 Swagger UI 介面卻不見了。今天這篇文章我就來說說怎樣把 Swagger UI 加回專案中。, https://blog.miniasp.com/post/2025/01/25/How-to-add-Swagger-UI-in-ASPNET-Core-9)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/01/25 14:50/span> span classpost-category>📁 a href/category/ASPNET-Core>ASP.NET Core/a>, a href/category/ASPNET-Web-API>ASP.NET Web API/a>/span> /div> /header> section classpost-body text idfb_90a46baf-7a73-4e50-bf71-7440b4676a49> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>微軟從 ASP.NET Core 9 開始正式支援 a hrefhttps://www.openapis.org/>OpenAPI/a> 規格,並推出 a hrefhttps://www.nuget.org/packages/Microsoft.AspNetCore.OpenApi>Microsoft.AspNetCore.OpenApi/a> NuGet 套件,在建立 ASP.NET Core Web API 專案時,預設就會加入可以產生 OpenAI 規格的端點。不過,對許多開發人員來說,常用的 Swagger UI 介面卻不見了。今天這篇文章我就來說說怎樣把 Swagger UI 加回專案中。/p>p>... a classmore href/post/2025/01/25/How-to-add-Swagger-UI-in-ASPNET-Core-9#continue>繼續閱讀/a> .../p> /section> /article>article classpost idpost6> header classpost-header> h2 classpost-title> a href/post/2025/01/23/How-to-send-email-using-Gmail-REST-API>如何使用 Google 的 OAuth 2.0 與 Gmail 的 REST API 發信/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, 如何使用 Google 的 OAuth 2.0 與 Gmail 的 REST API 發信, 前陣子在企業授課 OAuth 2.0 的時候,我原本想現場示範走 Google 的 OAuth 2.0 流程,並且在取得 Access Token 之後怎樣透過原始的 REST API 發信。原本以為, https://blog.miniasp.com/post/2025/01/23/How-to-send-email-using-Gmail-REST-API)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/01/23 22:45/span> span classpost-category>📁 a href/category/心得分享>心得分享/a>/span> /div> /header> section classpost-body text idfb_3714fe15-36d3-499b-8704-663e94df5680> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>前陣子在企業授課 OAuth 2.0 的時候,我原本想現場示範走 Google 的 OAuth 2.0 流程,並且在取得 Access Token 之後怎樣透過原始的 REST API 發信。原本以為這是個很簡單的任務,誰知道膝蓋中了一箭,拿 Token 都很簡單,唯讀「a hrefhttps://developers.google.com/gmail/api/guides/sending>發信/a>」的困難度超出了我的想像,原因無他,就是 Google 的參考文件實在是寫太爛了。這篇文章我打算跟大家說個官方文件沒寫的資訊,教大家怎樣順利透過 a hrefhttps://developers.google.com/gmail/api/reference/rest>Gmail API/a> 發出郵件。/p>p>... a classmore href/post/2025/01/23/How-to-send-email-using-Gmail-REST-API#continue>繼續閱讀/a> .../p> /section> /article>article classpost idpost7> header classpost-header> h2 classpost-title> a href/post/2025/01/18/Tidy-First-A-Personal-Exercise-in-Empirical-Software-Design-Notes>《先整理一下?個人層面的軟體設計考量》讀後心得分享/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, 《先整理一下?個人層面的軟體設計考量》讀後心得分享, 最近看了一本書 Tidy First?: A Personal Exercise in Empirical Software Design,作者是令人景仰的 Kent Beck 大神,他是一位擁有 Wikipedia 頁面的人物,也是美國著名的軟體工程師和作家,在軟體工程領域有著深遠的影響力。這本書整理了 32 個「整理程式碼」的技巧,他並不是一本強調 Clean Code 或 Refactoring 的技巧,而是一些更細微的、個人層面的軟體設計考量,這些技巧都是作者在多年軟體開發經驗中的心得,也是他在日常開發中的一些習慣,我真的越看越亢奮,因為很多內容其實也跟我二十多年的開發經驗相吻合,有種為什麼不早點看到這本書的感覺,我特別整理了這本書的讀後心得,希望大家可以從中獲益。, https://blog.miniasp.com/post/2025/01/18/Tidy-First-A-Personal-Exercise-in-Empirical-Software-Design-Notes)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/01/18 20:16/span> span classpost-category>📁 a href/category/心得分享>心得分享/a>/span> /div> /header> section classpost-body text idfb_357359db-0a27-494b-b59a-db7e10eb5dd8> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>最近看了一本書 a hrefhttps://www.amazon.com/Tidy-First-Personal-Exercise-Empirical/dp/1098151240>Tidy First?: A Personal Exercise in Empirical Software Design/a>,作者是令人景仰的 a hrefhttps://wiki.c2.com/?KentBeck>Kent Beck/a> 大神,他是一位擁有 a hrefhttps://en.wikipedia.org/wiki/Kent_Beck>Wikipedia/a> 頁面的人物,也是美國著名的軟體工程師和作家,在軟體工程領域有著深遠的影響力。這本書整理了 32 個「整理程式碼」的心法,他並不是一本強調 Clean Code 或 Refactoring 的技巧,而是一些更細微的、個人層面的軟體設計考量,這些技巧都是作者在多年軟體開發經驗中的心得,也是他在日常開發中的一些習慣,我真的越看越亢奮,因為很多內容其實也跟我二十多年的開發經驗相吻合,有種為什麼不早點看到這本書的感覺,我特別整理了這本書的讀後心得,希望大家可以從中獲益。這本書在台灣已有翻譯書,名為 a hrefhttps://www.tenlong.com.tw/products/9786263249615?list_namesrh>先整理一下?|個人層面的軟體設計考量/a>,大家有興趣也可以買來看看。/p>p>... a classmore href/post/2025/01/18/Tidy-First-A-Personal-Exercise-in-Empirical-Software-Design-Notes#continue>繼續閱讀/a> .../p> /section> /article>article classpost idpost8> header classpost-header> h2 classpost-title> a href/post/2025/01/11/Encoding-pitfalls-of-the-AT-symbol-in-ASPNET-Core-MVC-Razor-syntax>ASP.NET Core MVC 的 Razor 語法對於 @ 符號的編碼陷阱/a> div classpull-right stylemargin-top: 15px> button typebutton classbtn btn-success btn-xs onclickshare(event, ASP.NET Core MVC 的 Razor 語法對於 @ 符號的編碼陷阱, 前幾天我們公司有個網站準備上一個新版,工程師發出 PR (Pull request) 之後請我進行程式碼審核(Code Review),結果我發現他本次的修正項目不太合理,他改了一個前端套件的資料夾名稱。我當下覺得不妙,一個已經測試數月,也準備上線的網站,怎麼還會在最後一刻修改資料夾名稱呢?我反問工程師為什麼要改這些地方時,卻得到一個我不是很滿意的回答,因此退件請他重改。這不是一個什麼嚴重的技術問題,改改資料夾名稱就正常了,但是卻又激起我追根究底的柯南精神,真相只有一個,我要找出來!, https://blog.miniasp.com/post/2025/01/11/Encoding-pitfalls-of-the-AT-symbol-in-ASPNET-Core-MVC-Razor-syntax)>分享/button> /div> /h2> div classpost-info clearfix> span classpost-date>📅 2025/01/11 13:39/span> span classpost-category>📁 a href/category/ASPNET-Core>ASP.NET Core/a>, a href/category/ASPNET-MVC>ASP.NET MVC/a>, a href/category/心得分享>心得分享/a>/span> /div> /header> section classpost-body text idfb_30facc1b-86d6-468c-a41a-c4f82366c3cb> style>.copy-button { position: absolute; top: 0.75rem; right: 0.75rem; padding: 0.5rem; border: none; border-radius: 0.375rem; background-color: rgba(255, 255, 255, 0.1); cursor: pointer; opacity: 0; transition: all 0.2s ease; display: flex; align-items: center; gap: 0.5rem; backdrop-filter: blur(4px); color: #666;}/* 滑鼠懸停效果 */pre:hover .copy-button { opacity: 1;}.copy-button:hover { background-color: rgba(255, 255, 255, 0.2); transform: scale(1.05); color: #000;}.copy-button:active { transform: scale(0.95);}/* 圖示樣式 */.copy-icon, .check-icon { width: 1.2rem; height: 1.2rem; fill: currentColor; transition: all 0.2s ease;}/* 成功複製時的動畫效果 */@keyframes checkmark { 0% { transform: scale(0); } 50% { transform: scale(1.2); } 100% { transform: scale(1); }}.check-icon:not(.hidden) { animation: checkmark 0.2s ease-in-out; color: #10B981; /* 成功綠色 */}.hidden { display: none;}/* 為 pre 元素添加相對定位和漸層背景 */pre { position: relative; padding-right: 4rem; background: linear-gradient(to right, rgba(255, 255, 255, 0.1), transparent);}/style>script>document.addEventListener(DOMContentLoaded, function() { const codeBlocks document.querySelectorAll(pre); codeBlocks.forEach(block > { const button document.createElement(button); button.type button; button.className copy-button; button.setAttribute(aria-label, Copy code); button.innerHTML ` svg classcopy-icon viewBox0 0 24 24 width24 height24> path dM16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z/> /svg> svg classcheck-icon hidden viewBox0 0 24 24 width24 height24> path dM9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z/> /svg> `; button.addEventListener(click, function() { const code block.querySelector(code) || block; const text code.textContent; navigator.clipboard.writeText(text).then(() > { const copyIcon button.querySelector(.copy-icon); const checkIcon button.querySelector(.check-icon); copyIcon.classList.add(hidden); checkIcon.classList.remove(hidden); setTimeout(() > { copyIcon.classList.remove(hidden); checkIcon.classList.add(hidden); }, 2000); }); }); block.appendChild(button); });});/script> p>前幾天我們公司有個網站準備上一個新版,工程師發出 PR (Pull request) 之後請我進行程式碼審核(Code Review),結果我發現他本次的修正項目不太合理,他改了一個前端套件的資料夾名稱。我當下覺得不妙,一個已經測試數月,也準備上線的網站,怎麼還會在最後一刻修改資料夾名稱呢?我反問工程師為什麼要改這些地方時,卻得到一個我不是很滿意的回答,因此退件請他重改。這不是一個什麼嚴重的技術問題,改改資料夾名稱就正常了,但是卻又激起我追根究底的柯南精神,真相只有一個,我要找出來!🕵️♂️/p>p>... a classmore href/post/2025/01/11/Encoding-pitfalls-of-the-AT-symbol-in-ASPNET-Core-MVC-Razor-syntax#continue>繼續閱讀/a> .../p> /section> /article>/div>div styleclear:both; display:block> ul idPostPager>li classPagerLinkDisabled>以後的文章/li>li classPagerLinkCurrent>1/li>li classPagerLink>a href/?page2>2/a>/li>li classPagerLink>a href/?page3>3/a>/li>li classPagerLink>a href/?page4>4/a>/li>li classPagerLink>a href/?page5>5/a>/li>li classPagerLink>a href/?page6>6/a>/li>li classPagerLink>a href/?page7>7/a>/li>li classPagerLink>a href/?page8>8/a>/li>li classPagerLink>a href/?page9>9/a>/li>li classPagerLink>a href/?page10>10/a>/li>li classPagerEllipses>.../li>li classPagerLink>a href/?page204>204/a>/li>li classPagerLink>a href/?page205>205/a>/li>li classPagerLink>a href/?page2>以前的文章/a>/li>/ul>/div> /section> aside classcol-md-4 sidebar-wrapper> div idwidgetzone_be_WIDGET_ZONE classwidgetzone>script> function felo_search(id) { var text document.getElementById(id).value; if (text.length > 0) { var encodedText encodeURIComponent(text + site:blog.miniasp.com); window.open(`https://felo.ai/search?q${encodedText}&modeverbose&invitedOLn1YloyaD3j`, _blank); } }/script>style> .search-container { position: relative; display: flex; /* 使用 flex 排版 */ gap: 8px; /* 元素間距 */ } .search-input { flex: 1; /* 填滿剩餘空間 */ padding: 8px 8px 8px 32px !important; /* 上右下左 的內距 */ background-image: url(https://felo.ai/icon.svg); background-repeat: no-repeat; background-position: 5px center; background-size: 20px; border: 1px solid #ccc; /* 新增邊框 */ border-radius: 4px; /* 圓角 */ } /* 按鈕樣式 */ .search-container inputtypebutton { white-space: nowrap; /* 避免文字換行 */ cursor: pointer; /* 滑鼠游標變指示 */ }/style>div classWidget widget search> div classWidgetContent widget-content> div idsearchbox> div classsearch-container> input typetext idfelo-txt-fb38ecdd-5813-4d10-8c5f-8d901c7c731e classsearch-input placeholder使用 Felo Search 提問 onkeypressif (event.keyCode 13) { felo_search(felo-txt-fb38ecdd-5813-4d10-8c5f-8d901c7c731e); return false; } accesskeys />input typebutton classsearch-button onkeypressfelo_search(felo-txt-fb38ecdd-5813-4d10-8c5f-8d901c7c731e); onclickfelo_search(felo-txt-fb38ecdd-5813-4d10-8c5f-8d901c7c731e); value解答 /> /div> /div> /div>/div>div classWidget widget search> div classWidgetContent widget-content> div idsearchbox> input typetext idtxt-fb38ecdd-5813-4d10-8c5f-8d901c7c731e placeholder搜尋... onkeypressif (event.keyCode 13) { BlogEngine.search(/, txt-fb38ecdd-5813-4d10-8c5f-8d901c7c731e); return false; } />input typebutton onkeypressBlogEngine.search(/, txt-fb38ecdd-5813-4d10-8c5f-8d901c7c731e); onclickBlogEngine.search(/, txt-fb38ecdd-5813-4d10-8c5f-8d901c7c731e); idsearchbutton value搜尋 /> /div> /div>/div>div classWidget widget monthlist> h3 classWidgetHeader widget-header>每月文章/h3> div classWidgetContent widget-content> ul idmonthList>li onclickBlogEngine.toggleMonth('year2025') classyear>2025 ul idyear2025 classopen> li>a href/2025/03/default>三月/a> (2)/li> li>a href/2025/02/default>二月/a> (3)/li> li>a href/2025/01/default>一月/a> (5)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2024') classyear>2024 ul idyear2024 classclose> li>a href/2024/12/default>十二月/a> (2)/li> li>a href/2024/11/default>十一月/a> (3)/li> li>a href/2024/10/default>十月/a> (5)/li> li>a href/2024/09/default>九月/a> (6)/li> li>a href/2024/08/default>八月/a> (3)/li> li>a href/2024/07/default>七月/a> (5)/li> li>a href/2024/06/default>六月/a> (3)/li> li>a href/2024/05/default>五月/a> (7)/li> li>a href/2024/04/default>四月/a> (8)/li> li>a href/2024/03/default>三月/a> (11)/li> li>a href/2024/02/default>二月/a> (7)/li> li>a href/2024/01/default>一月/a> (4)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2023') classyear>2023 ul idyear2023 classclose> li>a href/2023/12/default>十二月/a> (5)/li> li>a href/2023/11/default>十一月/a> (9)/li> li>a href/2023/10/default>十月/a> (12)/li> li>a href/2023/09/default>九月/a> (13)/li> li>a href/2023/08/default>八月/a> (15)/li> li>a href/2023/07/default>七月/a> (5)/li> li>a href/2023/06/default>六月/a> (3)/li> li>a href/2023/05/default>五月/a> (4)/li> li>a href/2023/04/default>四月/a> (12)/li> li>a href/2023/03/default>三月/a> (8)/li> li>a href/2023/02/default>二月/a> (5)/li> li>a href/2023/01/default>一月/a> (17)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2022') classyear>2022 ul idyear2022 classclose> li>a href/2022/12/default>十二月/a> (14)/li> li>a href/2022/11/default>十一月/a> (11)/li> li>a href/2022/10/default>十月/a> (14)/li> li>a href/2022/09/default>九月/a> (17)/li> li>a href/2022/08/default>八月/a> (10)/li> li>a href/2022/07/default>七月/a> (11)/li> li>a href/2022/06/default>六月/a> (4)/li> li>a href/2022/05/default>五月/a> (10)/li> li>a href/2022/04/default>四月/a> (5)/li> li>a href/2022/03/default>三月/a> (9)/li> li>a href/2022/02/default>二月/a> (9)/li> li>a href/2022/01/default>一月/a> (15)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2021') classyear>2021 ul idyear2021 classclose> li>a href/2021/12/default>十二月/a> (12)/li> li>a href/2021/11/default>十一月/a> (5)/li> li>a href/2021/10/default>十月/a> (6)/li> li>a href/2021/09/default>九月/a> (13)/li> li>a href/2021/08/default>八月/a> (16)/li> li>a href/2021/07/default>七月/a> (13)/li> li>a href/2021/06/default>六月/a> (13)/li> li>a href/2021/05/default>五月/a> (7)/li> li>a href/2021/03/default>三月/a> (1)/li> li>a href/2021/02/default>二月/a> (1)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2020') classyear>2020 ul idyear2020 classclose> li>a href/2020/12/default>十二月/a> (3)/li> li>a href/2020/11/default>十一月/a> (1)/li> li>a href/2020/10/default>十月/a> (3)/li> li>a href/2020/09/default>九月/a> (7)/li> li>a href/2020/08/default>八月/a> (7)/li> li>a href/2020/07/default>七月/a> (9)/li> li>a href/2020/06/default>六月/a> (2)/li> li>a href/2020/05/default>五月/a> (5)/li> li>a href/2020/03/default>三月/a> (4)/li> li>a href/2020/02/default>二月/a> (5)/li> li>a href/2020/01/default>一月/a> (4)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2019') classyear>2019 ul idyear2019 classclose> li>a href/2019/12/default>十二月/a> (7)/li> li>a href/2019/11/default>十一月/a> (2)/li> li>a href/2019/10/default>十月/a> (5)/li> li>a href/2019/09/default>九月/a> (1)/li> li>a href/2019/06/default>六月/a> (3)/li> li>a href/2019/04/default>四月/a> (4)/li> li>a href/2019/03/default>三月/a> (3)/li> li>a href/2019/02/default>二月/a> (7)/li> li>a href/2019/01/default>一月/a> (12)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2018') classyear>2018 ul idyear2018 classclose> li>a href/2018/12/default>十二月/a> (3)/li> li>a href/2018/11/default>十一月/a> (1)/li> li>a href/2018/10/default>十月/a> (4)/li> li>a href/2018/09/default>九月/a> (12)/li> li>a href/2018/08/default>八月/a> (4)/li> li>a href/2018/06/default>六月/a> (2)/li> li>a href/2018/05/default>五月/a> (3)/li> li>a href/2018/04/default>四月/a> (6)/li> li>a href/2018/02/default>二月/a> (1)/li> li>a href/2018/01/default>一月/a> (2)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2017') classyear>2017 ul idyear2017 classclose> li>a href/2017/12/default>十二月/a> (2)/li> li>a href/2017/10/default>十月/a> (3)/li> li>a href/2017/09/default>九月/a> (4)/li> li>a href/2017/07/default>七月/a> (1)/li> li>a href/2017/06/default>六月/a> (1)/li> li>a href/2017/05/default>五月/a> (1)/li> li>a href/2017/04/default>四月/a> (1)/li> li>a href/2017/02/default>二月/a> (3)/li> li>a href/2017/01/default>一月/a> (4)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2016') classyear>2016 ul idyear2016 classclose> li>a href/2016/12/default>十二月/a> (4)/li> li>a href/2016/11/default>十一月/a> (1)/li> li>a href/2016/10/default>十月/a> (1)/li> li>a href/2016/09/default>九月/a> (4)/li> li>a href/2016/08/default>八月/a> (3)/li> li>a href/2016/07/default>七月/a> (2)/li> li>a href/2016/05/default>五月/a> (1)/li> li>a href/2016/04/default>四月/a> (1)/li> li>a href/2016/03/default>三月/a> (3)/li> li>a href/2016/02/default>二月/a> (3)/li> li>a href/2016/01/default>一月/a> (2)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2015') classyear>2015 ul idyear2015 classclose> li>a href/2015/12/default>十二月/a> (6)/li> li>a href/2015/11/default>十一月/a> (4)/li> li>a href/2015/10/default>十月/a> (3)/li> li>a href/2015/09/default>九月/a> (5)/li> li>a href/2015/08/default>八月/a> (1)/li> li>a href/2015/07/default>七月/a> (4)/li> li>a href/2015/06/default>六月/a> (2)/li> li>a href/2015/05/default>五月/a> (3)/li> li>a href/2015/04/default>四月/a> (1)/li> li>a href/2015/03/default>三月/a> (1)/li> li>a href/2015/02/default>二月/a> (3)/li> li>a href/2015/01/default>一月/a> (2)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2014') classyear>2014 ul idyear2014 classclose> li>a href/2014/12/default>十二月/a> (3)/li> li>a href/2014/11/default>十一月/a> (2)/li> li>a href/2014/10/default>十月/a> (3)/li> li>a href/2014/09/default>九月/a> (3)/li> li>a href/2014/08/default>八月/a> (1)/li> li>a href/2014/07/default>七月/a> (4)/li> li>a href/2014/06/default>六月/a> (2)/li> li>a href/2014/05/default>五月/a> (4)/li> li>a href/2014/04/default>四月/a> (5)/li> li>a href/2014/03/default>三月/a> (4)/li> li>a href/2014/02/default>二月/a> (1)/li> li>a href/2014/01/default>一月/a> (7)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2013') classyear>2013 ul idyear2013 classclose> li>a href/2013/12/default>十二月/a> (1)/li> li>a href/2013/11/default>十一月/a> (8)/li> li>a href/2013/10/default>十月/a> (1)/li> li>a href/2013/09/default>九月/a> (2)/li> li>a href/2013/08/default>八月/a> (4)/li> li>a href/2013/07/default>七月/a> (5)/li> li>a href/2013/06/default>六月/a> (8)/li> li>a href/2013/05/default>五月/a> (9)/li> li>a href/2013/04/default>四月/a> (8)/li> li>a href/2013/03/default>三月/a> (10)/li> li>a href/2013/02/default>二月/a> (9)/li> li>a href/2013/01/default>一月/a> (10)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2012') classyear>2012 ul idyear2012 classclose> li>a href/2012/12/default>十二月/a> (4)/li> li>a href/2012/11/default>十一月/a> (6)/li> li>a href/2012/10/default>十月/a> (6)/li> li>a href/2012/09/default>九月/a> (4)/li> li>a href/2012/08/default>八月/a> (5)/li> li>a href/2012/07/default>七月/a> (10)/li> li>a href/2012/06/default>六月/a> (5)/li> li>a href/2012/05/default>五月/a> (6)/li> li>a href/2012/04/default>四月/a> (10)/li> li>a href/2012/03/default>三月/a> (12)/li> li>a href/2012/02/default>二月/a> (1)/li> li>a href/2012/01/default>一月/a> (6)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2011') classyear>2011 ul idyear2011 classclose> li>a href/2011/12/default>十二月/a> (3)/li> li>a href/2011/11/default>十一月/a> (7)/li> li>a href/2011/10/default>十月/a> (8)/li> li>a href/2011/09/default>九月/a> (14)/li> li>a href/2011/08/default>八月/a> (15)/li> li>a href/2011/07/default>七月/a> (10)/li> li>a href/2011/06/default>六月/a> (10)/li> li>a href/2011/05/default>五月/a> (11)/li> li>a href/2011/04/default>四月/a> (11)/li> li>a href/2011/03/default>三月/a> (13)/li> li>a href/2011/02/default>二月/a> (14)/li> li>a href/2011/01/default>一月/a> (13)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2010') classyear>2010 ul idyear2010 classclose> li>a href/2010/12/default>十二月/a> (13)/li> li>a href/2010/11/default>十一月/a> (10)/li> li>a href/2010/10/default>十月/a> (16)/li> li>a href/2010/09/default>九月/a> (17)/li> li>a href/2010/08/default>八月/a> (12)/li> li>a href/2010/07/default>七月/a> (22)/li> li>a href/2010/06/default>六月/a> (15)/li> li>a href/2010/05/default>五月/a> (11)/li> li>a href/2010/04/default>四月/a> (14)/li> li>a href/2010/03/default>三月/a> (17)/li> li>a href/2010/02/default>二月/a> (17)/li> li>a href/2010/01/default>一月/a> (26)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2009') classyear>2009 ul idyear2009 classclose> li>a href/2009/12/default>十二月/a> (16)/li> li>a href/2009/11/default>十一月/a> (18)/li> li>a href/2009/10/default>十月/a> (18)/li> li>a href/2009/09/default>九月/a> (23)/li> li>a href/2009/08/default>八月/a> (20)/li> li>a href/2009/07/default>七月/a> (26)/li> li>a href/2009/06/default>六月/a> (24)/li> li>a href/2009/05/default>五月/a> (21)/li> li>a href/2009/04/default>四月/a> (26)/li> li>a href/2009/03/default>三月/a> (30)/li> li>a href/2009/02/default>二月/a> (27)/li> li>a href/2009/01/default>一月/a> (26)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2008') classyear>2008 ul idyear2008 classclose> li>a href/2008/12/default>十二月/a> (30)/li> li>a href/2008/11/default>十一月/a> (31)/li> li>a href/2008/10/default>十月/a> (31)/li> li>a href/2008/09/default>九月/a> (29)/li> li>a href/2008/08/default>八月/a> (31)/li> li>a href/2008/07/default>七月/a> (31)/li> li>a href/2008/06/default>六月/a> (30)/li> li>a href/2008/05/default>五月/a> (30)/li> li>a href/2008/04/default>四月/a> (31)/li> li>a href/2008/03/default>三月/a> (31)/li> li>a href/2008/02/default>二月/a> (29)/li> li>a href/2008/01/default>一月/a> (33)/li> /ul> /li>li onclickBlogEngine.toggleMonth('year2007') classyear>2007 ul idyear2007 classclose> li>a href/2007/12/default>十二月/a> (31)/li> li>a href/2007/11/default>十一月/a> (37)/li> li>a href/2007/10/default>十月/a> (13)/li> /ul> /li> /ul> /div>/div>div classWidget widget categorylist> h3 classWidgetHeader widget-header>文章分類/h3> div classWidgetContent widget-content> ul idcategorylist> li> a relnofollow href/category/feed/NET-Core>img classrssButton altRSS feed for .NET Core src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: .NET Core href/category/NET-Core>.NET Core span>(87)/span>/a> /li> li> a relnofollow href/category/feed/NET-Framework>img classrssButton altRSS feed for .NET Framework src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: .NET Framework href/category/NET-Framework>.NET Framework span>(241)/span>/a> /li> li> a relnofollow href/category/feed/AI>img classrssButton altRSS feed for AI src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: AI href/category/AI>AI span>(24)/span>/a> /li> li> a relnofollow href/category/feed/Angular>img classrssButton altRSS feed for Angular src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Angular href/category/Angular>Angular span>(40)/span>/a> /li> li> a relnofollow href/category/feed/AngularJS>img classrssButton altRSS feed for AngularJS src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: AngularJS href/category/AngularJS>AngularJS span>(11)/span>/a> /li> li> a relnofollow href/category/feed/ASPNET>img classrssButton altRSS feed for ASP.NET src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: ASP.NET href/category/ASPNET>ASP.NET span>(226)/span>/a> /li> li> a relnofollow href/category/feed/ASPNET-Core>img classrssButton altRSS feed for ASP.NET Core src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: ASP.NET Core href/category/ASPNET-Core>ASP.NET Core span>(67)/span>/a> /li> li> a relnofollow href/category/feed/ASPNET-MVC>img classrssButton altRSS feed for ASP.NET MVC src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: ASP.NET MVC href/category/ASPNET-MVC>ASP.NET MVC span>(111)/span>/a> /li> li> a relnofollow href/category/feed/ASPNET-Web-API>img classrssButton altRSS feed for ASP.NET Web API src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: ASP.NET Web API href/category/ASPNET-Web-API>ASP.NET Web API span>(17)/span>/a> /li> li> a relnofollow href/category/feed/Azure-DevOps>img classrssButton altRSS feed for Azure DevOps src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Azure DevOps href/category/Azure-DevOps>Azure DevOps span>(67)/span>/a> /li> li> a relnofollow href/category/feed/C>img classrssButton altRSS feed for C# src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: C# href/category/C>C# span>(150)/span>/a> /li> li> a relnofollow href/category/feed/Container>img classrssButton altRSS feed for Container src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Container href/category/Container>Container span>(42)/span>/a> /li> li> a relnofollow href/category/feed/CSS>img classrssButton altRSS feed for CSS src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: CSS href/category/CSS>CSS span>(29)/span>/a> /li> li> a relnofollow href/category/feed/DevOps>img classrssButton altRSS feed for DevOps src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: DevOps href/category/DevOps>DevOps span>(32)/span>/a> /li> li> a relnofollow href/category/feed/Entity-Framework>img classrssButton altRSS feed for Entity Framework src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Entity Framework href/category/Entity-Framework>Entity Framework span>(26)/span>/a> /li> li> a relnofollow href/category/feed/Git>img classrssButton altRSS feed for Git src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Git href/category/Git>Git span>(39)/span>/a> /li> li> a relnofollow href/category/feed/Golang>img classrssButton altRSS feed for Golang src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Golang href/category/Golang>Golang span>(2)/span>/a> /li> li> a relnofollow href/category/feed/IIS>img classrssButton altRSS feed for IIS src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: IIS href/category/IIS>IIS span>(106)/span>/a> /li> li> a relnofollow href/category/feed/Java>img classrssButton altRSS feed for Java src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Java href/category/Java>Java span>(29)/span>/a> /li> li> a relnofollow href/category/feed/JavaScript>img classrssButton altRSS feed for JavaScript src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: JavaScript href/category/JavaScript>JavaScript span>(116)/span>/a> /li> li> a relnofollow href/category/feed/Jenkins>img classrssButton altRSS feed for Jenkins src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Jenkins href/category/Jenkins>Jenkins span>(7)/span>/a> /li> li> a relnofollow href/category/feed/Kubernetes>img classrssButton altRSS feed for Kubernetes src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Kubernetes href/category/Kubernetes>Kubernetes span>(17)/span>/a> /li> li> a relnofollow href/category/feed/LINQ>img classrssButton altRSS feed for LINQ src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: LINQ href/category/LINQ>LINQ span>(36)/span>/a> /li> li> a relnofollow href/category/feed/Linux>img classrssButton altRSS feed for Linux src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Linux href/category/Linux>Linux span>(124)/span>/a> /li> li> a relnofollow href/category/feed/Microsoft-Azure>img classrssButton altRSS feed for Microsoft Azure src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Microsoft Azure href/category/Microsoft-Azure>Microsoft Azure span>(82)/span>/a> /li> li> a relnofollow href/category/feed/MySQL>img classrssButton altRSS feed for MySQL src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: MySQL href/category/MySQL>MySQL span>(15)/span>/a> /li> li> a relnofollow href/category/feed/Office>img classrssButton altRSS feed for Office src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Office href/category/Office>Office span>(53)/span>/a> /li> li> a relnofollow href/category/feed/Office-365>img classrssButton altRSS feed for Office 365 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Office 365 href/category/Office-365>Office 365 span>(41)/span>/a> /li> li> a relnofollow href/category/feed/Oracle>img classrssButton altRSS feed for Oracle src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Oracle href/category/Oracle>Oracle span>(11)/span>/a> /li> li> a relnofollow href/category/feed/PHP>img classrssButton altRSS feed for PHP src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: PHP href/category/PHP>PHP span>(25)/span>/a> /li> li> a relnofollow href/category/feed/Security>img classrssButton altRSS feed for Security src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Security href/category/Security>Security span>(83)/span>/a> /li> li> a relnofollow href/category/feed/SQL-Server>img classrssButton altRSS feed for SQL Server src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: SQL Server href/category/SQL-Server>SQL Server span>(136)/span>/a> /li> li> a relnofollow href/category/feed/Subversion>img classrssButton altRSS feed for Subversion src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Subversion href/category/Subversion>Subversion span>(35)/span>/a> /li> li> a relnofollow href/category/feed/Tips>img classrssButton altRSS feed for Tips src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Tips href/category/Tips>Tips span>(196)/span>/a> /li> li> a relnofollow href/category/feed/Unit-Testing>img classrssButton altRSS feed for Unit Testing src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Unit Testing href/category/Unit-Testing>Unit Testing span>(12)/span>/a> /li> li> a relnofollow href/category/feed/VBA>img classrssButton altRSS feed for VBA src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: VBA href/category/VBA>VBA span>(5)/span>/a> /li> li> a relnofollow href/category/feed/Visual-Basic>img classrssButton altRSS feed for Visual Basic src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Visual Basic href/category/Visual-Basic>Visual Basic span>(5)/span>/a> /li> li> a relnofollow href/category/feed/Visual-Studio>img classrssButton altRSS feed for Visual Studio src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Visual Studio href/category/Visual-Studio>Visual Studio span>(132)/span>/a> /li> li> a relnofollow href/category/feed/VS2010-Tips>img classrssButton altRSS feed for VS2010 Tips src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: VS2010 Tips href/category/VS2010-Tips>VS2010 Tips span>(23)/span>/a> /li> li> a relnofollow href/category/feed/Web>img classrssButton altRSS feed for Web src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Web href/category/Web>Web span>(203)/span>/a> /li> li> a relnofollow href/category/feed/Windows>img classrssButton altRSS feed for Windows src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Windows href/category/Windows>Windows span>(84)/span>/a> /li> li> a relnofollow href/category/feed/Windows-Phone-7>img classrssButton altRSS feed for Windows Phone 7 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: Windows Phone 7 href/category/Windows-Phone-7>Windows Phone 7 span>(14)/span>/a> /li> li> a relnofollow href/category/feed/介紹好用工具>img classrssButton altRSS feed for 介紹好用工具 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: 介紹好用工具 href/category/介紹好用工具>介紹好用工具 span>(269)/span>/a> /li> li> a relnofollow href/category/feed/心得分享>img classrssButton altRSS feed for 心得分享 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: 心得分享 href/category/心得分享>心得分享 span>(96)/span>/a> /li> li> a relnofollow href/category/feed/多奇快訊>img classrssButton altRSS feed for 多奇快訊 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: 多奇快訊 href/category/多奇快訊>多奇快訊 span>(9)/span>/a> /li> li> a relnofollow href/category/feed/系統管理>img classrssButton altRSS feed for 系統管理 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: 系統管理 href/category/系統管理>系統管理 span>(391)/span>/a> /li> li> a relnofollow href/category/feed/前端工程研究>img classrssButton altRSS feed for 前端工程研究 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: 前端工程研究 href/category/前端工程研究>前端工程研究 span>(24)/span>/a> /li> li> a relnofollow href/category/feed/專案管理>img classrssButton altRSS feed for 專案管理 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: 專案管理 href/category/專案管理>專案管理 span>(9)/span>/a> /li> li> a relnofollow href/category/feed/團隊合作>img classrssButton altRSS feed for 團隊合作 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: 團隊合作 href/category/團隊合作>團隊合作 span>(11)/span>/a> /li> li> a relnofollow href/category/feed/網路管理>img classrssButton altRSS feed for 網路管理 src/Content/images/blog/rssButton.png width12 height12>/a> a titleCategory: 網路管理 href/category/網路管理>網路管理 span>(31)/span>/a> /li> /ul> /div>/div>/div> /aside> /div> /section> footer classfooter> div classcontainer> div classwidgets-footer clearfix> div idwidgetzone_Footer_Widget classwidgetzone>div classWidget widget textbox> h3 classWidgetHeader widget-header>免責聲明/h3> div classWidgetContent widget-content stylepadding: 20px> p stylefont-family: 微軟正黑體;>本網站對於任何使用或引用本網站網頁資料引致之損失或損害,概不負責。本網站亦有權隨時刪除、暫停或編輯本網站所登載之各項資料,以維護本網站之權益。除法律有強制規定外,在任何情況下,本網站對於 (1) 使用或無法使用本網站之各項服務;(2) 經由本網站取得訊息或進行交易;(3) 第三人在本網站上之陳述或作為;以及 (4) 其他與本網站服務有關之事項所致生之任何直接、間接、附帶、特別、懲罰性或衍生性損害,一概不負賠償責任。/p> /div>/div>div classWidget widget textbox> h3 classWidgetHeader widget-header>專業證照/h3> div classWidgetContent widget-content stylepadding: 20px> p>a hrefhttps://www.credly.com/users/will-huang-tw/badges target_blank>img src/Custom/Themes/Standard-2015/images/credly.png border0 altCredly width200 height100 loadinglazy />/a>/p>p>主要專業證照如下:/p>ol>li>a hrefhttps://www.credly.com/badges/db87a7cf-efa5-4f99-95e8-2679c9b51f70>Microsoft Certified: Azure Solutions Architect Expert/a>/li>li>a hrefhttps://www.credly.com/badges/378b5243-903e-43b3-98ce-a3d2ccc93712>Microsoft Certified: DevOps Engineer Expert/a>/li>li>a hrefhttps://www.credly.com/badges/c88b8b47-a4bd-41e1-89a7-182a34f8bd74>CKAD: Certified Kubernetes Application Developer/a>/li>/ol> /div>/div>div classWidget widget textbox> h3 classWidgetHeader widget-header>微軟最有價值專家 & Google 開發專家/h3> div classWidgetContent widget-content stylepadding: 20px> p>a titleWill 保哥於 2008 年 4 月獲得微軟技術社群暨最有價值專家第七屆第三回合微軟「最有價值專家」(Most Valuable Professional, MVP),至今連續 15 度當選微軟最有價值專家(MVP) href/post/2008/04/02/I-was-elected-Microsoft-MVP-2007-Q3-for-ASPNET> picture> source srcset/Custom/Themes/Standard-2015/images/MicrosoftMVP.avif typeimage/avif /> source srcset/Custom/Themes/Standard-2015/images/MicrosoftMVP.webp typeimage/webp /> img src/Custom/Themes/Standard-2015/images/MicrosoftMVP.png border0 altWill 保哥於 2008 年 4 月獲得微軟技術社群暨最有價值專家 第七屆第三回合微軟「最有價值專家」(Most Valuable Professional, MVP),主要得獎領域是在 ASP/ASP.NET 技術與線上社群部分。 width111 height172 loadinglazy />/picture>/a> a titleWill 保哥於 2018 年榮獲 Angular 領域的 Google Developer Expert (GDE) 開發專家 hrefhttps://developers.google.com/community/experts/directory?hlzh-tw&specializationangular&textWill%20%E4%BF%9D%E5%93%A5>picture>img src/Custom/Themes/Standard-2015/images/AngularGDE.png border0 altAngular GDE - Google Developers Experts width143 height170 loadinglazy /> /picture>/a>/p>p styledisplay: none;>a hrefhttps://mastodon.social/@doggy8088 relme>Mastodon/a>/p> /div>/div>/div> /div> /div> div classend-line text-center> p classtext-muted credit>Copyright © 2025 by a hrefhttps://www.facebook.com/will.fans target_blank>Will 保哥/a> @ a hrefhttps://www.duotify.com/ target_blank>多奇數位創意有限公司/a>p> /div> /footer> div classaspNetHidden> input typehidden name__VIEWSTATEGENERATOR id__VIEWSTATEGENERATOR valueCA0B0334 />/div>/form> script src/Scripts/blog.min.js>/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]