<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7034083642113352813</id><updated>2026-08-07T11:55:28.152+08:00</updated><category term="SQL Server"/><category term="T-SQL"/><category term="VisualStudio"/><category term=".NET"/><category term="研討會"/><category term="Office"/><category term="ASP.NET"/><category term="PowerDesginer"/><category term="Tools"/><category term="網路應用"/><category term="Google"/><category term="IIS"/><category term="MVC"/><category term="WPF"/><category term="Windows Azure"/><category term="Windows8"/><category term="HTML&amp;CSS"/><category term="筆記"/><category term="Blazor"/><category term="Json"/><category term="LINQ"/><category term="SQL Azure"/><category term="Sidewaffle"/><category term="Windows Azure Media Service"/><category term="facebook"/><category term="jQuery"/><category term="MAUI"/><category term="Server"/><category term="Silverlight"/><category term="VSCode"/><category term="WCF"/><category term="Windows"/><category term="Accounting"/><category term="Android-App"/><category term="Evernote"/><category term="Git"/><category term="Networking"/><category term="Startup"/><category term="Trello"/><category term="VibeCoding"/><title type='text'>RobinNotes</title><subtitle type='html'>這是程式開發、資料庫設計及其他生產力工具的使用筆記分享</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://note.robinks.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://note.robinks.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>188</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-2042274502740696153</id><published>2026-08-07T11:55:28.152+08:00</published><updated>2026-08-07T11:55:28.152+08:00</updated><title type='text'>讓資料庫也進入 AI 開發流程：Visual Studio Database Project × Codex 的 ERP SQL Server 開發實務</title><content type='html'>&lt;p&gt;&amp;nbsp;在 ERP 或企業級系統裡，SQL Server 很少只是「放資料的地方」。資料表當然在裡面，但真正決定系統怎麼運作的商業規則，常常躲在 View、Trigger、Stored Procedure、Function，還有跨資料表的檢核邏輯裡。系統跑得愈久，這些關係就愈盤根錯節。一個看起來不大的需求，最後可能牽動好幾張表、數支預存程序，甚至某個平常沒什麼人碰的 Trigger。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;5:1-5:97;271-367&quot; dir=&quot;ltr&quot;&gt;傳統作法多半是直接進 SQL Server 改物件，改完再把 SQL Script 留存下來。短期看起來很快，時間一久卻會出現一個尷尬的狀況：資料庫成了真正的最新版，原始碼反而只剩下修改紀錄。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;7:1-7:166;369-534&quot; dir=&quot;ltr&quot;&gt;AI Coding Agent 開始進入日常開發之後，我想把這個關係翻過來：讓 Database Project 成為資料庫結構與程式碼的唯一依據，Codex 只動專案裡的原始碼，最後由開發者看差異、決定要不要部署。對 Stored Procedure、Trigger 和商業邏輯比重都很高的 ERP 系統來說，這條界線特別重要。&lt;/p&gt;&lt;h2 class=&quot;mt-3 -mb-1 text-[1.125rem] font-bold&quot; data-sourcepos=&quot;9:1-9:31;536-566&quot; dir=&quot;ltr&quot;&gt;第一步：先把 SQL Server 變成可以管理的專案&lt;/h2&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;11:1-11:128;568-695&quot; dir=&quot;ltr&quot;&gt;Visual Studio 的 SQL Server Database Project，可以把既有資料庫的 Schema 匯進一般專案結構。既有的 ERP 資料庫可以先匯入 Database Project，把資料庫物件轉成 &lt;code class=&quot;bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]&quot;&gt;.sql&lt;/code&gt; 原始碼，例如：&lt;/p&gt;&lt;ul class=&quot;[li_&amp;amp;]:mb-0 [li_&amp;amp;]:mt-1 [li_&amp;amp;]:gap-1 [&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1&quot; data-sourcepos=&quot;13:1-19:25;697-790&quot; dir=&quot;ltr&quot;&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;13:1-13:9;697-705&quot;&gt;Tables&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;14:1-14:8;706-713&quot;&gt;Views&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;15:1-15:20;714-733&quot;&gt;Stored Procedures&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;16:1-16:12;734-745&quot;&gt;Functions&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;17:1-17:11;746-756&quot;&gt;Triggers&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;18:1-18:9;757-765&quot;&gt;Schema&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;19:1-19:25;766-790&quot;&gt;Index、Constraint 等結構定義&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;21:1-22:166;792-1139&quot; dir=&quot;ltr&quot;&gt;Microsoft 把 SQL Database Project 定義為「單一資料庫 Schema 中 SQL 物件的本機表示」。它用宣告式 T-SQL，每個物件都有自己的定義檔，要調整物件就直接改這份定義，而不是累積一串曾經手動執行過的 ALTER Script。這聽起來只是管理方式不同，但實際做過就會發現，資料庫從此開始有一般程式碼該有的可讀性和可追溯性。 參考：&lt;a class=&quot;underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current&quot; href=&quot;https://learn.microsoft.com/en-us/sql/tools/sql-database-projects/sql-database-projects?view=sql-server-ver17&quot;&gt;Microsoft Learn — What are SQL database projects?&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;24:1-24:11;1141-1151&quot; dir=&quot;ltr&quot;&gt;例如原本資料庫中的：&lt;/p&gt;&lt;div aria-label=&quot;text code&quot; class=&quot;relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100&quot; data-sourcepos=&quot;26:1-31:4;1153-1245&quot; role=&quot;group&quot; tabindex=&quot;0&quot;&gt;&lt;div class=&quot;sticky opacity-0 group-hover/copy:opacity-100 group-focus-within/copy:opacity-100 top-2 py-2 h-12 w-0 float-right&quot;&gt;&lt;div class=&quot;absolute right-0 h-8 px-2 items-center inline-flex z-10&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;text-text-500 font-small p-3.5 pb-0&quot;&gt;text&lt;/div&gt;&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;pre class=&quot;code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed p-3.5&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; color: #14181f;&quot;&gt;&lt;code class=&quot;language-text&quot; style=&quot;background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial;&quot;&gt;dbo.ORDER_HEAD
dbo.ORDER_LINE
dbo.CreateProcess_SalesOrder
dbo.TR_ORDERHD_Update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;33:1-33:116;1247-1362&quot; dir=&quot;ltr&quot;&gt;匯入後都會變成 Database Project 裡可以搜尋、比較、放進版本控制的 SQL 原始碼。從這一刻起，AI 看到的不再只是使用者貼進提示詞裡的一小段 Stored Procedure，而是整個資料庫專案可以追查的上下文。&lt;/p&gt;&lt;h2 class=&quot;mt-3 -mb-1 text-[1.125rem] font-bold&quot; data-sourcepos=&quot;35:1-35:38;1364-1401&quot; dir=&quot;ltr&quot;&gt;第二步：讓 Codex 直接工作在 Database Project&lt;/h2&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;37:1-38:97;1403-1642&quot; dir=&quot;ltr&quot;&gt;接下來只要把 Codex 的工作目錄指向 Visual Studio Database Project 所在的資料夾。OpenAI 的文件說明，Codex 可以在專案目錄中檢視檔案、分析程式碼、修改檔案並執行開發工具，不必再把 Stored Procedure 一段段複製到對話視窗。 參考：&lt;a class=&quot;underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current&quot; href=&quot;https://learn.chatgpt.com/docs/codex/cli&quot;&gt;OpenAI Codex — Work against your local repository&lt;/a&gt;&lt;/p&gt;&lt;h3 class=&quot;mt-2 -mb-1 text-base font-bold&quot; data-sourcepos=&quot;40:1-40:33;1644-1676&quot; dir=&quot;ltr&quot;&gt;為什麼不讓 Codex 直接連接 SQL Server？&lt;/h3&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;42:1-42:137;1678-1814&quot; dir=&quot;ltr&quot;&gt;為什麼不乾脆讓 Codex 直接連 SQL Server，需要什麼就即時查 Table Schema、Stored Procedure、Function、Trigger 和物件相依性？技術上做得到。但對 ERP 或企業級系統，我不會拿這個當預設模式。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;44:1-44:184;1816-1999&quot; dir=&quot;ltr&quot;&gt;一個原因是上下文成本。要理解一個大型 ERP 資料庫，Codex 得反覆查 Metadata 和物件定義，再把結果帶回來分析。資料庫裡若有數百、數千個物件，Schema 和 Procedure 反覆讀取，很快就會吃掉大量上下文。Database Project 已經把這些定義攤成原始碼檔案，Codex 可以先搜關鍵字和引用關係，只打開真正相關的檔案，路徑清楚很多。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;46:1-47:75;2001-2260&quot; dir=&quot;ltr&quot;&gt;另一個原因比較現實：存取風險。直接連線就得給資料庫的 Network Access 和 Credential，即使原本只想讀 Schema，只要帳號或工具同時有寫入權限，就得多防一層誤執行 DDL、DML，甚至碰到正式資料的可能。OpenAI 對 Codex 權限的說明也強調 Filesystem 和 Network Access 都該限縮在完成工作所需的最小範圍。 參考：&lt;a class=&quot;underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current&quot; href=&quot;https://learn.chatgpt.com/docs/permissions&quot;&gt;OpenAI Docs — Permissions&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;49:1-49:169;2262-2430&quot; dir=&quot;ltr&quot;&gt;所以我會將 Database Project 當成 Codex 與 SQL Server 之間的一層隔離。Codex 取得的是完整、可搜尋的資料庫程式碼，但不需要 SQL Server 帳號，也不用直接碰資料庫；分析和修改都停在 Source Code，真正的 Database Update 留到後面的人工 Review 和部署階段。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;51:1-51:173;2432-2604&quot; dir=&quot;ltr&quot;&gt;舉一個常見的 ERP 需求：訂單送出簽核時，如果送單者本身也是第一層簽核群組成員，就不能自己審自己的單；系統還得依 Workflow 規則判斷要不要加一層簽核。這種情況不必一開始就告訴 Codex「改哪一支 Stored Procedure」。比較好的做法，是先把商業需求和限制條件講清楚，讓它自己從 Database Project 追出來：&lt;/p&gt;&lt;ol class=&quot;[li_&amp;amp;]:mb-0 [li_&amp;amp;]:mt-1 [li_&amp;amp;]:gap-1 [&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1&quot; data-sourcepos=&quot;53:1-58:29;2606-2772&quot; dir=&quot;ltr&quot;&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;53:1-53:33;2606-2638&quot;&gt;找出訂單簽核流程的入口 Stored Procedure。&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;54:1-54:32;2639-2670&quot;&gt;搜尋 Workflow 定義資料表及欄位被哪些物件使用。&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;55:1-55:32;2671-2702&quot;&gt;追蹤 Stored Procedure 之間的呼叫關係。&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;56:1-56:21;2703-2723&quot;&gt;分析現有簽核邏輯與新需求的衝突點。&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;57:1-57:20;2724-2743&quot;&gt;提出修改方案及可能受影響的範圍。&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;58:1-58:29;2744-2772&quot;&gt;確認方案後，再修改需要變更的 &lt;code class=&quot;bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]&quot;&gt;.sql&lt;/code&gt; 檔案。&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;60:1-60:75;2774-2848&quot; dir=&quot;ltr&quot;&gt;這跟叫 AI「幫我寫一段 SQL」差很多。它不再只是個 SQL 產生器，而是能讀既有系統、追相依關係，再依需求改程式碼的 Coding Agent。&lt;/p&gt;&lt;h2 class=&quot;mt-3 -mb-1 text-[1.125rem] font-bold&quot; data-sourcepos=&quot;62:1-62:22;2850-2871&quot; dir=&quot;ltr&quot;&gt;第三步：把 AI 的能力留在原始碼層&lt;/h2&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;64:1-64:25;2873-2897&quot; dir=&quot;ltr&quot;&gt;這大概是整套流程裡我最堅持的一點。責任切成兩塊。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;66:1-66:10;2899-2908&quot; dir=&quot;ltr&quot;&gt;Codex 負責：&lt;/p&gt;&lt;ul class=&quot;[li_&amp;amp;]:mb-0 [li_&amp;amp;]:mt-1 [li_&amp;amp;]:gap-1 [&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1&quot; data-sourcepos=&quot;68:1-73:14;2910-3035&quot; dir=&quot;ltr&quot;&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;68:1-68:22;2910-2931&quot;&gt;閱讀 Database Project&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;69:1-69:44;2932-2975&quot;&gt;搜尋相關資料表、Trigger、Function、Stored Procedure&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;70:1-70:14;2976-2989&quot;&gt;分析程式邏輯與相依關係&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;71:1-71:9;2990-2998&quot;&gt;提出實作方案&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;72:1-72:23;2999-3021&quot;&gt;修改 SQL Project 中的原始碼&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;73:1-73:14;3022-3035&quot;&gt;協助檢查變更與潛在問題&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;75:1-75:22;3037-3058&quot; dir=&quot;ltr&quot;&gt;Visual Studio 和開發者負責：&lt;/p&gt;&lt;ul class=&quot;[li_&amp;amp;]:mb-0 [li_&amp;amp;]:mt-1 [li_&amp;amp;]:gap-1 [&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1&quot; data-sourcepos=&quot;77:1-82:31;3060-3176&quot; dir=&quot;ltr&quot;&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;77:1-77:11;3060-3070&quot;&gt;檢視所有實際變更&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;78:1-78:25;3071-3095&quot;&gt;Build Database Project&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;79:1-79:26;3096-3121&quot;&gt;比對 Project 與目標 Database&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;80:1-80:11;3122-3132&quot;&gt;檢查部署 SQL&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;81:1-81:13;3133-3145&quot;&gt;決定哪些變更可以部署&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;82:1-82:31;3146-3176&quot;&gt;將核准的 Schema 變更同步至 SQL Server&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;84:1-84:148;3178-3325&quot; dir=&quot;ltr&quot;&gt;「Codex 只修改原始碼」不是能力不夠，是刻意畫出來的邊界。這讓 AI 產生的每一筆修改，都留在可以閱讀、可以 Diff、可以 Review、也可以回復的狀態——比起把 AI Coding Agent 直接接上 Production Database、讓它自己跑 DDL 或改資料，安心很多。&lt;/p&gt;&lt;h2 class=&quot;mt-3 -mb-1 text-[1.125rem] font-bold&quot; data-sourcepos=&quot;86:1-86:35;3327-3361&quot; dir=&quot;ltr&quot;&gt;第四步：回到 Visual Studio 檢視 AI 做了什麼&lt;/h2&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;88:1-88:70;3363-3432&quot; dir=&quot;ltr&quot;&gt;Codex 做完，不代表需求已經套進資料庫了。回到 Visual Studio，Database Project 裡被改動的還只是原始碼。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;90:1-90:87;3434-3520&quot; dir=&quot;ltr&quot;&gt;搭配 Git，可以清楚看到哪些檔案被修改、哪些欄位新增或刪除、Stored Procedure 哪幾段邏輯被改寫、Trigger 有沒有動到，以及有沒有混進需求之外的變更。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;92:1-92:168;3522-3689&quot; dir=&quot;ltr&quot;&gt;接著 Build Database Project。SQL Project 的 Build 會驗證物件間的參照，還有目標 SQL 平台的語法，並產生 &lt;code class=&quot;bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]&quot;&gt;.dacpac&lt;/code&gt; 部署產物。這一道人工 Review 對長期維護的 ERP 而言不是走個形式：AI 可以負責產生修改，但這個修改究竟該不該進資料庫，還是得由懂業務、懂風險的人來判斷。&lt;/p&gt;&lt;h2 class=&quot;mt-3 -mb-1 text-[1.125rem] font-bold&quot; data-sourcepos=&quot;94:1-94:37;3691-3727&quot; dir=&quot;ltr&quot;&gt;第五步：比較 Project 與 Database，再決定是否同步&lt;/h2&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;96:1-97:176;3729-4120&quot; dir=&quot;ltr&quot;&gt;最後用 Schema Compare 比對，Source 是 Database Project，Target 是開發或測試環境的 SQL Server Database。Visual Studio 會把兩邊的 Schema 差異列出來。Microsoft 也說明，Schema Compare 可以用來檢視 Database 與 Project 間的物件差異，選定的差異能套用到任一邊，也能產生實際部署用的 SQL Script。 參考：&lt;a class=&quot;underline underline underline-offset-2 decoration-1 decoration-current/40 hover:decoration-current focus:decoration-current&quot; href=&quot;https://learn.microsoft.com/en-us/sql/tools/sql-database-projects/howto/compare-database-project?view=sql-server-ver17&quot;&gt;Microsoft Learn — Compare a database and a project&lt;/a&gt;&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;99:1-99:34;4122-4155&quot; dir=&quot;ltr&quot;&gt;真正 Update 或 Publish 之前，這裡還能再確認一次：&lt;/p&gt;&lt;ul class=&quot;[li_&amp;amp;]:mb-0 [li_&amp;amp;]:mt-1 [li_&amp;amp;]:gap-1 [&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1&quot; data-sourcepos=&quot;101:1-105:22;4157-4272&quot; dir=&quot;ltr&quot;&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;101:1-101:13;4157-4169&quot;&gt;是否新增預期中的欄位&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;102:1-102:29;4170-4198&quot;&gt;是否只修改預期中的 Stored Procedure&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;103:1-103:15;4199-4213&quot;&gt;是否意外 Drop 物件&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;104:1-104:37;4214-4250&quot;&gt;是否造成 Table rebuild 或大量 Data Motion&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;105:1-105:22;4251-4272&quot;&gt;部署 Script 是否包含高風險操作&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;107:1-107:49;4274-4322&quot; dir=&quot;ltr&quot;&gt;確認過了，才把變更同步到開發或測試資料庫，測完再依公司的發布流程進正式環境。整個流程大概長這樣：&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;107:1-107:49;4274-4322&quot; dir=&quot;ltr&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjh9j4k8NUdGF-3prg9l7jHeQZIKCeFHR1XZg5KVJoUi7JPe0-Ha3Zt164suZNSkk1GK1tehn7cevSi9TsJUFIlydPZ5m8TR9IFIRDBhnr7e8Tjbr7QF_58euXDweHKNIVtv1ScPmbvEsgXUK7JOmd0k97rw8E1tY0R694wuxaDEfe5ahGOBnWNDpGAgILt&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;941&quot; data-original-width=&quot;1672&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjh9j4k8NUdGF-3prg9l7jHeQZIKCeFHR1XZg5KVJoUi7JPe0-Ha3Zt164suZNSkk1GK1tehn7cevSi9TsJUFIlydPZ5m8TR9IFIRDBhnr7e8Tjbr7QF_58euXDweHKNIVtv1ScPmbvEsgXUK7JOmd0k97rw8E1tY0R694wuxaDEfe5ahGOBnWNDpGAgILt=s1600&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 class=&quot;mt-3 -mb-1 text-[1.125rem] font-bold&quot; data-sourcepos=&quot;118:1-118:31;4605-4635&quot; dir=&quot;ltr&quot;&gt;Database Project 的價值不只是方便部署&lt;/h2&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;120:1-120:103;4637-4739&quot; dir=&quot;ltr&quot;&gt;如果只把 Database Project 當成另一種發布 SQL 的工具，其實低估了它。對 AI 輔助開發來說，它更重要的作用，是把資料庫程式變成一個 AI 能完整閱讀、理解、修改的 Codebase。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;122:1-122:203;4741-4943&quot; dir=&quot;ltr&quot;&gt;以前我們可能在 SSMS 裡找到一支 Stored Procedure，複製給 AI，改完貼回去。AI 只看得到局部，自然不知道同一個欄位是不是還被其他 Procedure、Function 或 Trigger 用著。整個 SQL Server Schema 都存在 Database Project 裡以後，Codex 就能從專案層級處理問題：搜引用、看相鄰物件、對照既有設計，再判斷真正該改哪些檔案。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;124:1-124:88;4945-5032&quot; dir=&quot;ltr&quot;&gt;這對 ERP 特別有用，因為 ERP 的需求很少只是單一 SQL 問題，往往橫跨資料結構、商業規則、簽核流程、庫存、成本、會計——一個地方調整，很容易在另一個地方留下後座力。&lt;/p&gt;&lt;h2 class=&quot;mt-3 -mb-1 text-[1.125rem] font-bold&quot; data-sourcepos=&quot;126:1-126:16;5034-5049&quot; dir=&quot;ltr&quot;&gt;企業系統仍要守住的安全線&lt;/h2&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;128:1-128:64;5051-5114&quot; dir=&quot;ltr&quot;&gt;就算用了這套模式，Database Project 的 Publish 也不該當成無條件自動更新。以下這些變更還是得人工檢查：&lt;/p&gt;&lt;ul class=&quot;[li_&amp;amp;]:mb-0 [li_&amp;amp;]:mt-1 [li_&amp;amp;]:gap-1 [&amp;amp;:not(:last-child)_ul]:pb-1 [&amp;amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3 print:block print:space-y-1&quot; data-sourcepos=&quot;130:1-136:42;5116-5281&quot; dir=&quot;ltr&quot;&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;130:1-130:27;5116-5142&quot;&gt;Drop Table / Drop Column&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;131:1-131:12;5143-5154&quot;&gt;欄位型別或長度縮減&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;132:1-132:16;5155-5170&quot;&gt;NOT NULL 欄位新增&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;133:1-133:18;5171-5188&quot;&gt;大型資料表的 Index 變更&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;134:1-134:31;5189-5219&quot;&gt;可能造成 Data Motion 的 Schema 修改&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;135:1-135:20;5220-5239&quot;&gt;需要搬移、轉換或修補既有資料的需求&lt;/li&gt;&lt;li class=&quot;font-claude-response-body whitespace-normal break-words pl-2&quot; data-sourcepos=&quot;136:1-136:42;5240-5281&quot;&gt;Pre-Deployment / Post-Deployment Script&lt;/li&gt;&lt;/ul&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;138:1-138:66;5283-5348&quot; dir=&quot;ltr&quot;&gt;Schema 是宣告式的，但 ERP 的資料帶著歷史和業務意義。結構應該長成什麼樣子，跟既有資料怎麼安全走到新結構，其實是兩件事。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;140:1-140:116;5350-5465&quot; dir=&quot;ltr&quot;&gt;比較穩健的做法，是把需求交給 Codex 分析和開發，變更留在 Source Code；人員透過 Diff、Build、Schema Compare 和 Deployment Script Review，握住最後一道資料庫變更權。&lt;/p&gt;&lt;h2 class=&quot;mt-3 -mb-1 text-[1.125rem] font-bold&quot; data-sourcepos=&quot;142:1-142:6;5467-5472&quot; dir=&quot;ltr&quot;&gt;結語&lt;/h2&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;144:1-144:101;5474-5574&quot; dir=&quot;ltr&quot;&gt;導入 Codex 之後，我反而覺得 SQL Server Database Project 比以前更有價值。它在 SQL Server 和 AI Coding Agent 之間，放進了一條清楚的路徑：&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;146:1-146:69;5576-5644&quot; dir=&quot;ltr&quot;&gt;&lt;strong&gt;Database → Project → AI 修改 Source Code → Human Review → Database&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;148:1-148:175;5646-5820&quot; dir=&quot;ltr&quot;&gt;這不是讓 AI 拿到更大的資料庫權限，反而是把它的能力收攏在更容易控制、更容易稽核的 Source Code 層。對長期維護的 ERP 或企業系統來說，重點從來不是讓 AI 多寫幾支 Stored Procedure，而是讓資料庫開發慢慢有一般軟體工程早就習慣的東西：版本控制、差異檢視、Code Review、可重現部署，還有清楚的變更責任邊界。&lt;/p&gt;&lt;p class=&quot;font-claude-response-body break-words whitespace-normal&quot; data-sourcepos=&quot;150:1-150:42;5822-5863&quot; dir=&quot;ltr&quot;&gt;資料庫也成為 Code 之後，AI 才真正有機會參與企業系統完整而可控的開發流程。&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2042274502740696153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2042274502740696153'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2026/08/ai-visual-studio-database-project-codex.html' title='讓資料庫也進入 AI 開發流程：Visual Studio Database Project × Codex 的 ERP SQL Server 開發實務'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjh9j4k8NUdGF-3prg9l7jHeQZIKCeFHR1XZg5KVJoUi7JPe0-Ha3Zt164suZNSkk1GK1tehn7cevSi9TsJUFIlydPZ5m8TR9IFIRDBhnr7e8Tjbr7QF_58euXDweHKNIVtv1ScPmbvEsgXUK7JOmd0k97rw8E1tY0R694wuxaDEfe5ahGOBnWNDpGAgILt=s72-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-3811899631087509434</id><published>2025-11-20T15:50:00.001+08:00</published><updated>2025-11-20T15:53:58.901+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>SQL Server 資料庫 Log 檔成長行為與定期備份實測分析</title><content type='html'>&lt;p&gt; &lt;/p&gt;&lt;h1 data-end=&quot;84&quot; data-start=&quot;60&quot;&gt;資料庫 Log 檔成長行為與定期備份實測分析&lt;/h1&gt;
&lt;p data-end=&quot;201&quot; data-start=&quot;86&quot;&gt;記錄交易時產生大量 Log，Log 檔案隨交易成長。&lt;br data-end=&quot;115&quot; data-start=&quot;112&quot;&gt;
執行 Log 備份僅釋放可重用空間，實體檔案大小不變。&lt;br data-end=&quot;145&quot; data-start=&quot;142&quot;&gt;
執行 Log 壓縮可縮小實體檔案。&lt;br data-end=&quot;165&quot; data-start=&quot;162&quot;&gt;
以下以 YourDataBase 測試未備份與定期備份 Log 的差異。&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRuKNUykpBYPaUui-FPbQXYkpbauat5Xe2D2E_HK2Xbjj1GehvY6dHvdbekjmKrRnDJFZl6Ts6AbJC9Idnz0YOIPVqct5g9Snc0h_F-1nJvsZ63kK5ZS2WA0ZaqUO5mFqHmeN7aXA7LodWgzLzbsLpj-PZHrf65RR8MAeoOTf58FNRPsVfbtS-OJ4FiT15/s1024/ChatGPT%20Image%20Nov%2020,%202025,%2003_52_44%20PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;1024&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRuKNUykpBYPaUui-FPbQXYkpbauat5Xe2D2E_HK2Xbjj1GehvY6dHvdbekjmKrRnDJFZl6Ts6AbJC9Idnz0YOIPVqct5g9Snc0h_F-1nJvsZ63kK5ZS2WA0ZaqUO5mFqHmeN7aXA7LodWgzLzbsLpj-PZHrf65RR8MAeoOTf58FNRPsVfbtS-OJ4FiT15/s16000/ChatGPT%20Image%20Nov%2020,%202025,%2003_52_44%20PM.png&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;p data-end=&quot;201&quot; data-start=&quot;86&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;a href=&quot;http://note.robinks.net/2025/11/sql-server-log.html#more&quot;&gt;閱讀更多 »&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/3811899631087509434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/3811899631087509434'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2025/11/sql-server-log.html' title='SQL Server 資料庫 Log 檔成長行為與定期備份實測分析'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRuKNUykpBYPaUui-FPbQXYkpbauat5Xe2D2E_HK2Xbjj1GehvY6dHvdbekjmKrRnDJFZl6Ts6AbJC9Idnz0YOIPVqct5g9Snc0h_F-1nJvsZ63kK5ZS2WA0ZaqUO5mFqHmeN7aXA7LodWgzLzbsLpj-PZHrf65RR8MAeoOTf58FNRPsVfbtS-OJ4FiT15/s72-c/ChatGPT%20Image%20Nov%2020,%202025,%2003_52_44%20PM.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-383210650602617811</id><published>2025-10-27T11:26:00.010+08:00</published><updated>2025-10-27T13:46:19.708+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="VibeCoding"/><title type='text'>🚀 我的第一次 Vibe Coding 體驗：和 ChatGPT 一起從 0 開始寫程式</title><content type='html'>&lt;p data-end=&quot;211&quot; data-start=&quot;113&quot;&gt;這次是我第一次嘗試 &lt;strong data-end=&quot;138&quot; data-start=&quot;123&quot;&gt;Vibe Coding&lt;/strong&gt; —— 用 ChatGPT 直接討論、規劃、撰寫、修正一個完整的應用程式。&lt;br data-end=&quot;178&quot; data-start=&quot;175&quot;&gt;
整個過程就像是和一位隨時在線、耐心又懂技術的「虛擬夥伴」一起開發。&lt;/p&gt;
&lt;hr data-end=&quot;216&quot; data-start=&quot;213&quot;&gt;
&lt;h3 data-end=&quot;235&quot; data-start=&quot;218&quot;&gt;💬 1. 從需求討論開始&lt;/h3&gt;
&lt;p data-end=&quot;348&quot; data-start=&quot;237&quot;&gt;一開始，我在 ChatGPT 上描述想做的應用功能，它很快就幫我輸出了一份&lt;strong data-end=&quot;286&quot; data-start=&quot;274&quot;&gt;完整的程式規格書&lt;/strong&gt;，包含前後端架構、功能流程和資料設計。&lt;br data-end=&quot;308&quot; data-start=&quot;305&quot;&gt;
這個階段的體驗很像是跟 PM 或系統設計師開會，從模糊想法變成具體可執行的藍圖。&lt;/p&gt;&lt;p data-end=&quot;348&quot; data-start=&quot;237&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh8JoBvqsHXc992-FXooWH8-L7YnufXFj7YrmuH0Kp_tETsLBT4MSxq2UidaFSNAk_CQuuRXgheTRZt-Qibb3fy-NscrSJGqoECFPcSkR1klNBwgh0CG3gECNzuI1xFVRlkmuHi1wwBpDMQAtVmbgC-TpbVvdACHCg_pnuELavyvThoMWntsqzonOfMd_d8&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;813&quot; data-original-width=&quot;854&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh8JoBvqsHXc992-FXooWH8-L7YnufXFj7YrmuH0Kp_tETsLBT4MSxq2UidaFSNAk_CQuuRXgheTRZt-Qibb3fy-NscrSJGqoECFPcSkR1klNBwgh0CG3gECNzuI1xFVRlkmuHi1wwBpDMQAtVmbgC-TpbVvdACHCg_pnuELavyvThoMWntsqzonOfMd_d8=s16000&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr data-end=&quot;353&quot; data-start=&quot;350&quot;&gt;&lt;h3 data-end=&quot;384&quot; data-start=&quot;355&quot;&gt;🧩 2. 技術選型：Tauri + SQLite&lt;/h3&gt;
&lt;p data-end=&quot;436&quot; data-start=&quot;386&quot;&gt;ChatGPT 根據需求建議我採用 &lt;strong data-end=&quot;422&quot; data-start=&quot;404&quot;&gt;Tauri + SQLite&lt;/strong&gt; 組合，理由清楚又合理：&lt;/p&gt;
&lt;ul data-end=&quot;497&quot; data-start=&quot;437&quot;&gt;
&lt;li data-end=&quot;469&quot; data-start=&quot;437&quot;&gt;
&lt;p data-end=&quot;469&quot; data-start=&quot;439&quot;&gt;&lt;strong data-end=&quot;448&quot; data-start=&quot;439&quot;&gt;Tauri&lt;/strong&gt; 可以包成桌面應用程式，體積小、效能佳&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;497&quot; data-start=&quot;470&quot;&gt;
&lt;p data-end=&quot;497&quot; data-start=&quot;472&quot;&gt;&lt;strong data-end=&quot;482&quot; data-start=&quot;472&quot;&gt;SQLite&lt;/strong&gt; 適合離線、單機的資料儲存&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;534&quot; data-start=&quot;499&quot;&gt;這對我來說也是第一次完整實作這種組合，算是一次實際學習新技術的好機會。&lt;/p&gt;
&lt;hr data-end=&quot;539&quot; data-start=&quot;536&quot;&gt;
&lt;h3 data-end=&quot;562&quot; data-start=&quot;541&quot;&gt;⚙️ 3. 安裝開發套件與組態設定&lt;/h3&gt;
&lt;p data-end=&quot;617&quot; data-start=&quot;564&quot;&gt;這一段特別 &amp;quot;有趣&amp;quot; 。&lt;br data-end=&quot;575&quot; data-start=&quot;572&quot;&gt;
我完全是&lt;strong data-end=&quot;607&quot; data-start=&quot;579&quot;&gt;照著 ChatGPT 的指示一步步下指令安裝套件&lt;/strong&gt;、設定專案環境。&lt;/p&gt;
&lt;p data-end=&quot;686&quot; data-start=&quot;619&quot;&gt;中途遇到錯誤？&lt;br data-end=&quot;629&quot; data-start=&quot;626&quot;&gt;
我直接把錯誤訊息貼回去，它立即分析並教我怎麼修。&lt;br data-end=&quot;656&quot; data-start=&quot;653&quot;&gt;
這樣的互動真的比查 Stack Overflow 還快又準。&lt;/p&gt;
&lt;hr data-end=&quot;691&quot; data-start=&quot;688&quot;&gt;
&lt;h3 data-end=&quot;717&quot; data-start=&quot;693&quot;&gt;🧑‍💻 4. 建立與執行最小可行程式&lt;/h3&gt;
&lt;p data-end=&quot;794&quot; data-start=&quot;719&quot;&gt;當環境準備好後，ChatGPT 開始帶我一步步&lt;strong data-end=&quot;767&quot; data-start=&quot;742&quot;&gt;在 VS Code 中建立檔案、貼入原始碼&lt;/strong&gt;。&lt;br data-end=&quot;771&quot; data-start=&quot;768&quot;&gt;
每個階段都能立即編譯、執行，快速看到成果。&lt;/p&gt;
&lt;p data-end=&quot;893&quot; data-start=&quot;796&quot;&gt;最棒的是，每當遇到 Bug，我只要複製錯誤訊息回給 ChatGPT，它就立刻指出問題、修正程式。&lt;br data-end=&quot;847&quot; data-start=&quot;844&quot;&gt;
感覺就像隨身攜帶一位結合 &lt;strong data-end=&quot;884&quot; data-start=&quot;860&quot;&gt;Tech Lead + Debug 助手&lt;/strong&gt; 的 AI 導師。&lt;/p&gt;
&lt;hr data-end=&quot;898&quot; data-start=&quot;895&quot;&gt;
&lt;h3 data-end=&quot;932&quot; data-start=&quot;900&quot;&gt;🔄 5. 當 ChatGPT 與本機程式「脫線」的時候&lt;/h3&gt;
&lt;p data-end=&quot;1056&quot; data-start=&quot;934&quot;&gt;後來發現 ChatGPT 的上下文無法持續追蹤我電腦裡的最新程式內容，導致修改越來越難同步。&lt;br data-end=&quot;983&quot; data-start=&quot;980&quot;&gt;
於是我改用 &lt;strong data-end=&quot;1011&quot; data-start=&quot;989&quot;&gt;VS Code 的 Codex 模式&lt;/strong&gt;，讓 AI 直接在本機端編輯程式碼。&lt;br data-end=&quot;1032&quot; data-start=&quot;1029&quot;&gt;
這樣就能即時看見修改效果，不再需要手動貼來貼去。&lt;/p&gt;&lt;p data-end=&quot;1056&quot; data-start=&quot;934&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEheAFF8vRdhoGBh9xS4UKxMg8OgEmbYQSe6VokdYkccRHnbGy9GcdeqwjUyqG7pJk_120moZXkxl1RDujAY99RBEcyY0faxBsZooW0OydzOlN60x0kQRgEEc8xjmgFb6aA7hRuVVvA9tlrT-vmp5Wbt6UNsBQLlCPLU9_wusWMKRWMJSvVE6hZDGEiYPnbT&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;925&quot; data-original-width=&quot;780&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEheAFF8vRdhoGBh9xS4UKxMg8OgEmbYQSe6VokdYkccRHnbGy9GcdeqwjUyqG7pJk_120moZXkxl1RDujAY99RBEcyY0faxBsZooW0OydzOlN60x0kQRgEEc8xjmgFb6aA7hRuVVvA9tlrT-vmp5Wbt6UNsBQLlCPLU9_wusWMKRWMJSvVE6hZDGEiYPnbT=s16000&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1061&quot; data-start=&quot;1058&quot;&gt;&lt;h3 data-end=&quot;1114&quot; data-start=&quot;1091&quot;&gt;🧭 6. Codex 開發與版本管理&lt;/h3&gt;
&lt;p data-end=&quot;1223&quot; data-start=&quot;1116&quot;&gt;在 Codex 模式下開發、測試功能都更順暢。&lt;br data-end=&quot;1142&quot; data-start=&quot;1139&quot;&gt;
當功能測試完善後，我會&lt;strong data-end=&quot;1170&quot; data-start=&quot;1153&quot;&gt;將原始碼簽入 GitHub&lt;/strong&gt;，確保每次修改都有版本控制。&lt;br data-end=&quot;1187&quot; data-start=&quot;1184&quot;&gt;
這樣可以避免下一次修改意外覆蓋或破壞現有功能，也方便後續維護與協作。&lt;/p&gt;
&lt;p data-end=&quot;1313&quot; data-start=&quot;1225&quot;&gt;🔗 &lt;strong data-end=&quot;1236&quot; data-start=&quot;1228&quot;&gt;成品連結&lt;/strong&gt;：&lt;a class=&quot;decorated-link&quot; data-end=&quot;1313&quot; data-start=&quot;1237&quot; href=&quot;https://github.com/robinli/examstudy&quot; rel=&quot;noopener&quot; target=&quot;_new&quot;&gt;https://github.com/robinli/examstudy&lt;/a&gt;&lt;/p&gt;&lt;p data-end=&quot;1313&quot; data-start=&quot;1225&quot;&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhWY3IzZMz_xGnUfcsnU5UlawZ68RxXZfw2LeS3kZauRyUWmS3GC2nPCylQd9bPIALg8fJtuXpS8IjrAdlg3Z_ZG6aME8bQdQ_bLUEzo_CE9cIBtT2jNuhHxdaR95gkIxyVmgFhEIMA_03VLrdlP6GvSvQBX-GJmpIBFjWF4jbKYfm6IxZcdJj0mTW9mvmt&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;974&quot; data-original-width=&quot;1293&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhWY3IzZMz_xGnUfcsnU5UlawZ68RxXZfw2LeS3kZauRyUWmS3GC2nPCylQd9bPIALg8fJtuXpS8IjrAdlg3Z_ZG6aME8bQdQ_bLUEzo_CE9cIBtT2jNuhHxdaR95gkIxyVmgFhEIMA_03VLrdlP6GvSvQBX-GJmpIBFjWF4jbKYfm6IxZcdJj0mTW9mvmt=s16000&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;hr data-end=&quot;1061&quot; data-start=&quot;1058&quot;&gt;&lt;/div&gt;&lt;h3 data-end=&quot;1079&quot; data-start=&quot;1063&quot;&gt;🌟 7. 回顧這次體驗&lt;/h3&gt;
&lt;p data-end=&quot;1107&quot; data-start=&quot;1081&quot;&gt;這次 Vibe Coding 的體驗讓我深刻感受到：&lt;/p&gt;
&lt;ul data-end=&quot;1208&quot; data-start=&quot;1109&quot;&gt;
&lt;li data-end=&quot;1144&quot; data-start=&quot;1109&quot;&gt;
&lt;p data-end=&quot;1144&quot; data-start=&quot;1111&quot;&gt;ChatGPT 不只是「回答問題」的工具，而是能協作開發的夥伴&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1173&quot; data-start=&quot;1145&quot;&gt;
&lt;p data-end=&quot;1173&quot; data-start=&quot;1147&quot;&gt;即使不熟悉新技術，也能在 AI 的引導下完成專案&lt;/p&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1208&quot; data-start=&quot;1174&quot;&gt;
&lt;p data-end=&quot;1208&quot; data-start=&quot;1176&quot;&gt;最重要的是，學會如何「和 AI 對話」，遠比學某個框架更關鍵&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1213&quot; data-start=&quot;1210&quot;&gt;
&lt;h3 data-end=&quot;1223&quot; data-start=&quot;1215&quot;&gt;✨ 小結&lt;/h3&gt;
&lt;p data-end=&quot;1298&quot; data-start=&quot;1225&quot;&gt;第一次 Vibe Coding，從無到有打造出可執行的應用程式，&lt;br data-end=&quot;1260&quot; data-start=&quot;1257&quot;&gt;
過程中不僅學到 &amp;quot;技術&amp;quot;，也學會&lt;strong data-end=&quot;1295&quot; data-start=&quot;1273&quot;&gt;如何讓 AI 成為真正的程式開發夥伴&lt;/strong&gt;。&lt;/p&gt;&lt;p data-end=&quot;1298&quot; data-start=&quot;1225&quot;&gt;下一步，我打算挑戰更進階的功能，讓 ChatGPT 幫我設計 UI、整合 API ——&lt;br data-end=&quot;1603&quot; data-start=&quot;1600&quot;&gt;
期待下一次的「人機共創」更順暢、更強大！&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;http://note.robinks.net/2025/10/vibe-coding-chatgpt-0.html#more&quot;&gt;閱讀更多 »&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/383210650602617811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/383210650602617811'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2025/10/vibe-coding-chatgpt-0.html' title='🚀 我的第一次 Vibe Coding 體驗：和 ChatGPT 一起從 0 開始寫程式'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEh8JoBvqsHXc992-FXooWH8-L7YnufXFj7YrmuH0Kp_tETsLBT4MSxq2UidaFSNAk_CQuuRXgheTRZt-Qibb3fy-NscrSJGqoECFPcSkR1klNBwgh0CG3gECNzuI1xFVRlkmuHi1wwBpDMQAtVmbgC-TpbVvdACHCg_pnuELavyvThoMWntsqzonOfMd_d8=s72-c" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-6024305173656512730</id><published>2022-07-29T14:42:00.006+08:00</published><updated>2022-07-29T15:15:11.555+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MAUI"/><title type='text'>MAUI 發行 Android 產生 APK/AAB 檔案</title><content type='html'>&lt;div style=&quot;border-width: 0px!important; border: 0px; color: transparent; display: none; font-size: 0px; line-height: 0px; margin: 0px; max-height: 1px; opacity: 0; padding: 0px; visibility: hidden; width: 1px;&quot;&gt;&lt;/div&gt;   &lt;div class=&quot;ennote&quot;&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;在 Visual Studio 2022 Preview 新增任一 MAUI 專案，包括：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;.NET MAUI App&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;.NET MAUI Blazor&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;--en-markholder: true;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;以下說明三個步驟產生 APK/AAB 檔案。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;--en-markholder: true;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;A. 建立 Key Store 檔案&lt;/h3&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;span style=&quot;--en-markholder: true;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;選單 &amp;gt; VIEW &amp;gt; Terminal &amp;gt; Developer PowerShell&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;--en-codeblock: true; background-color: #fbfaf8; background-position: initial initial; background-repeat: initial initial; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; padding: 8px;&quot;&gt;&lt;div&gt;keytool -genkey -v -keystore myapp.keystore -alias key -keyalg RSA -keysize 2048 -validity 10000&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfE5Abbn2I5uHCxlY09e4Vsm4_6pvPOpmIIYb-Kbz49Hsv3TCRRlXgznwvOi8ik0Njo_bSa2aLgU40HZIlWlnV9F7EJozFSmasN2JZCyBN2JUZCl9esyN5ASB-XuLFUG_R4EYnDlyjpdFrgFbSiJlwCC-GsqKz08zTn0P-JdDMXW3bYN-LvAFr5Ut4rA/s1301/maui-publish-android-apkaab.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;661&quot; data-original-width=&quot;1301&quot; height=&quot;325&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfE5Abbn2I5uHCxlY09e4Vsm4_6pvPOpmIIYb-Kbz49Hsv3TCRRlXgznwvOi8ik0Njo_bSa2aLgU40HZIlWlnV9F7EJozFSmasN2JZCyBN2JUZCl9esyN5ASB-XuLFUG_R4EYnDlyjpdFrgFbSiJlwCC-GsqKz08zTn0P-JdDMXW3bYN-LvAFr5Ut4rA/w640-h325/maui-publish-android-apkaab.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;檔案總管可看到 myapp.keystore 檔案&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg6WJxckcMpDNraayzcdf7CbkuoS_D5oQIkY8JL96Ailgeky4HQldI4cTUCOzeGu6JYusyxYlcdgqk2SzROnlapaSYeLnPwRO7Xt950hK67Je28mHliERM6eCnJ-CM5vR_42qW5rBscbP78ae0W1w1pG1d9WCA2DCvc-6tDahQ1-22l9zQbLqrPWsGZdw&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7125679179921536162&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg6WJxckcMpDNraayzcdf7CbkuoS_D5oQIkY8JL96Ailgeky4HQldI4cTUCOzeGu6JYusyxYlcdgqk2SzROnlapaSYeLnPwRO7Xt950hK67Je28mHliERM6eCnJ-CM5vR_42qW5rBscbP78ae0W1w1pG1d9WCA2DCvc-6tDahQ1-22l9zQbLqrPWsGZdw=s320&quot; /&gt;&lt;/a&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;B. 專案設定 Keystore &lt;/h3&gt;&lt;div&gt;(1) 專案檔 &amp;gt; 右鍵 &amp;gt; Property &amp;gt; Android &amp;gt; Package Signing&lt;/div&gt;&lt;div&gt;(2) 勾選 Sign the .APK file using the following keystore details.&lt;/div&gt;&lt;div&gt;(3) 瀏覽選取上述 keystore 檔案&lt;/div&gt;&lt;div&gt;(4) 輸入密碼&lt;/div&gt;&lt;div&gt;(5) 輸入別名&lt;/div&gt;&lt;div&gt;(6) 輸入密碼&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgF450JDx6RIvbmBu8RMbwNzpKpSYSy3W4w5PZNnKI8u0uB_IG6p-4WZ2rMQ6YXWLY5skdoXsV3UbkPw4IBdcLiM1Z1uL6qRB3fAQ3B22yjO-o-7GLyEhVC7dZbJgwdE88E7flH0ngTuQQRoylv_brRHF2Et8B7iCdSIHjTFN7uKTnd2L_z4Xm3gFI30Q&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7125679180301112098&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgF450JDx6RIvbmBu8RMbwNzpKpSYSy3W4w5PZNnKI8u0uB_IG6p-4WZ2rMQ6YXWLY5skdoXsV3UbkPw4IBdcLiM1Z1uL6qRB3fAQ3B22yjO-o-7GLyEhVC7dZbJgwdE88E7flH0ngTuQQRoylv_brRHF2Et8B7iCdSIHjTFN7uKTnd2L_z4Xm3gFI30Q=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;C. 發行 App &lt;/h3&gt;&lt;div&gt;(1) 設定方案組態 Release&lt;/div&gt;&lt;div&gt;(2) 模擬器選擇 Android&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhSWL9iSi2znTsD5RW6Z0T5uVSfxWp-eagDFNffVlnLYjvCZdGzaW2qp3zbLUNJWxO_l1bPDJLfX8zNszatBqize3_CcwGiRci9ZS8zdlVkz4ZpjiHw53zWEcg8iGX4PNE1-1U8gCZGq7Fe527TdVqvOljg5r_xLZ9qeZXr5Ib_ADAD8ojVcJ52PNmRxg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7125679188737642994&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhSWL9iSi2znTsD5RW6Z0T5uVSfxWp-eagDFNffVlnLYjvCZdGzaW2qp3zbLUNJWxO_l1bPDJLfX8zNszatBqize3_CcwGiRci9ZS8zdlVkz4ZpjiHw53zWEcg8iGX4PNE1-1U8gCZGq7Fe527TdVqvOljg5r_xLZ9qeZXr5Ib_ADAD8ojVcJ52PNmRxg=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(3) 專案 &amp;gt; 右鍵 &amp;gt; Publish&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjQMgk0z8eoJ_A127hXVPlNSyACQbr7wOisGnKDG3nygEtBpUP8O9PQ1CQQNMaDkdI8aTHDF7zlRHovRgkiaoEP5N1gJdSnjljsR_SZ6DxrEW5ayl58EDtqdx7RnpfjrOyzz7plnct5NOhM1oX4OH7hFo6vjS2Tlm2v7nRxyqwZBgQDwr-9rYDYMSTpig&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7125679193431162402&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjQMgk0z8eoJ_A127hXVPlNSyACQbr7wOisGnKDG3nygEtBpUP8O9PQ1CQQNMaDkdI8aTHDF7zlRHovRgkiaoEP5N1gJdSnjljsR_SZ6DxrEW5ayl58EDtqdx7RnpfjrOyzz7plnct5NOhM1oX4OH7hFo6vjS2Tlm2v7nRxyqwZBgQDwr-9rYDYMSTpig=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;完成後，可以在 專案目錄\bin\Release\net6.0-android 目錄下可以看到 AAB 與 APK 檔案。&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh9hh4IRpf9QtQxvBc9-Vsie2LSacjIAantaJ9bfxTjC_6Gvo4K_iU0SS8dEYkcwZOV_BjpXTDFCTOQcx087-8JtPrT8gfOrYN_SWTE65k-TSIBnZacmdGsXf9fq8P00w7_Xf41SAwEshQE3Cu9NKIKNXAuQW1NrIkFfC5iKEN1B3w8Q-Ih77KMWAfdQg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7125679197126078226&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh9hh4IRpf9QtQxvBc9-Vsie2LSacjIAantaJ9bfxTjC_6Gvo4K_iU0SS8dEYkcwZOV_BjpXTDFCTOQcx087-8JtPrT8gfOrYN_SWTE65k-TSIBnZacmdGsXf9fq8P00w7_Xf41SAwEshQE3Cu9NKIKNXAuQW1NrIkFfC5iKEN1B3w8Q-Ih77KMWAfdQg=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;***--Signed.aab --&amp;gt; 上架 Google Play 需要上傳這個檔案。&lt;/div&gt;&lt;div&gt;***--Signed.apk --&amp;gt; 可以提供讓 Android 手機下載，手動安裝 APP。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;參考連結&lt;/h2&gt;&lt;div&gt;文章 : &lt;a href=&quot;http://t.mail-svc.evernote.com/f/a/CBYRgudYoS4dmNB_iJwP2Q~~/AADd_wA~/RgRkxgRxP0RIaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L21hdWkvYW5kcm9pZC9kZXBsb3ltZW50L292ZXJ2aWV3VwNzcGNCCmLgcX_jYiBgiCNSIHJvYmlubGkxOTczLmV2ZXJub3RlQGJsb2dnZXIuY29tWAQAAAAG&quot; rev=&quot;en_rl_none&quot;&gt;Publish a .NET MAUI app for Android - .NET MAUI | Microsoft Docs&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;影片 : &lt;a href=&quot;http://t.mail-svc.evernote.com/f/a/o_sLYGWkfZVAFRJFXa7RiA~~/AADd_wA~/RgRkxgRxP0QcaHR0cHM6Ly95b3V0dS5iZS9qZlNWYl9SUjdYMFcDc3BjQgpi4HF_42IgYIgjUiByb2JpbmxpMTk3My5ldmVybm90ZUBibG9nZ2VyLmNvbVgEAAAABg~~&quot; rev=&quot;en_rl_none&quot;&gt;Create a Signed and Publishable .NET MAUI Android App in VS2022&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://www.evernote.com/etpa/bb06bb48-21c0-4de5-a926-eb44c06357c5&quot; style=&quot;height: 1px; width: 1px;&quot; /&gt;    &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://t.mail-svc.evernote.com/q/cD88_f72_S85T30KgP_KUw~~/AADd_wA~/RgRkxgRxPlcDc3BjQgpi4HF_42IgYIgjUiByb2JpbmxpMTk3My5ldmVybm90ZUBibG9nZ2VyLmNvbVgEAAAABg~~&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/6024305173656512730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/6024305173656512730'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2022/07/maui-publish-android-apkaab.html' title='MAUI 發行 Android 產生 APK/AAB 檔案'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfE5Abbn2I5uHCxlY09e4Vsm4_6pvPOpmIIYb-Kbz49Hsv3TCRRlXgznwvOi8ik0Njo_bSa2aLgU40HZIlWlnV9F7EJozFSmasN2JZCyBN2JUZCl9esyN5ASB-XuLFUG_R4EYnDlyjpdFrgFbSiJlwCC-GsqKz08zTn0P-JdDMXW3bYN-LvAFr5Ut4rA/s72-w640-h325-c/maui-publish-android-apkaab.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-8365898795870714714</id><published>2022-07-22T14:33:00.003+08:00</published><updated>2022-07-29T15:17:26.972+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MAUI"/><title type='text'>MAUI 更換應用程式圖示與轉場圖片</title><content type='html'>&lt;div style=&quot;border-width: 0px!important; border: 0px; color: transparent; display: none; font-size: 0px; line-height: 0px; margin: 0px; max-height: 1px; opacity: 0; padding: 0px; visibility: hidden; width: 1px;&quot;&gt;&lt;/div&gt;   &lt;div class=&quot;ennote&quot;&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;MAUI 預設的應用程式圖示 (App Icon) 與轉場圖片 (Splash) ，如下兩圖：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCa2_IqNDIIV6Gs5R_8BVnoFug8lybZpxmLX4SfVXJinDMtjhokCnDfMNSLX-fDjp1iMmR9U78ZJD6b_4a3OZdxXoIDikh_2g4rbi0v2dAPBkBExsQjUP9CpWGlneaLtBPegTbI4OiBjFLupTAy9Nnjvd0iiAEU596DlrL3IuvzogrH2YrVD7EPit82g/s1602/maui-change-app-icon-splash-images.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1602&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCa2_IqNDIIV6Gs5R_8BVnoFug8lybZpxmLX4SfVXJinDMtjhokCnDfMNSLX-fDjp1iMmR9U78ZJD6b_4a3OZdxXoIDikh_2g4rbi0v2dAPBkBExsQjUP9CpWGlneaLtBPegTbI4OiBjFLupTAy9Nnjvd0iiAEU596DlrL3IuvzogrH2YrVD7EPit82g/w432-h640/maui-change-app-icon-splash-images.png&quot; width=&quot;432&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge5NcASUdaSVMRGIN7OBNOM-eaWtDDsWhLMP0_E6iq_7X-AT1aiHi8GkvZ1e54qvHZHwaVaz3K33_RvlmKl9tBVr17vt7o9Xu1mxolY9w4UPUYdFrZhSjYESljerAk9XeR_0Wz8IdYZrd1she27yAMSmNeYGIPHHceJ753MUPUn-kpvrbZNGcNVdQXFQ/s2340/maui-change-app-icon-splash-images2.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2340&quot; data-original-width=&quot;1080&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge5NcASUdaSVMRGIN7OBNOM-eaWtDDsWhLMP0_E6iq_7X-AT1aiHi8GkvZ1e54qvHZHwaVaz3K33_RvlmKl9tBVr17vt7o9Xu1mxolY9w4UPUYdFrZhSjYESljerAk9XeR_0Wz8IdYZrd1she27yAMSmNeYGIPHHceJ753MUPUn-kpvrbZNGcNVdQXFQ/w296-h640/maui-change-app-icon-splash-images2.png&quot; width=&quot;296&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;hr /&gt;&lt;div&gt;Visual Studio MAUI 專案檔可以找到對應程式圖示與轉場圖片的 SVG 檔案名稱，最簡易更換圖片的方式，將欲更換的 SVG 檔案 XML 內容直接貼上。&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;應程式圖示主圖示檔案 \Resources\AppIcon\appiconfg.svg&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;應程式圖示背景檔案&amp;nbsp; \Resources\AppIcon\appicon.svg&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;轉場圖片檔案 Splash\splash.svg&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiMqZjQMxZjphMWbwacllpMrtPtykF4yj49mKQHbD1a-t17fvoFCNiuL8UKLpW74zZRkKxAOv4ZkOyhyCuDxwJi85K7jOvDdFgR6epRu-3hu5TPtbrA8v-suL-pntDGnhtyHadh6XSYaYzlvQqqpsmaE1Qg77yFt8a9OTTmFXsqde0nY1YzGECQhrP82Q&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7123080545978534274&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiMqZjQMxZjphMWbwacllpMrtPtykF4yj49mKQHbD1a-t17fvoFCNiuL8UKLpW74zZRkKxAOv4ZkOyhyCuDxwJi85K7jOvDdFgR6epRu-3hu5TPtbrA8v-suL-pntDGnhtyHadh6XSYaYzlvQqqpsmaE1Qg77yFt8a9OTTmFXsqde0nY1YzGECQhrP82Q=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhOU8ppWiUYA3bF47DQZZ_LwhhV1egfz9VMJYtvxfUst07J6V1gkGGSkaESeJSpK1tVtXoM6GfrZFHzZx_495ncPTnw9yI7Fl7iaZuZWF3FgX6uDoaovUA_L7fHwJ8zL9UICTuW0qNxIW6d4O6lYBpe60ks_AmK2lSvqv9dy-SNME4Hgkc9XVr43plzEw&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7123080544790001298&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhOU8ppWiUYA3bF47DQZZ_LwhhV1egfz9VMJYtvxfUst07J6V1gkGGSkaESeJSpK1tVtXoM6GfrZFHzZx_495ncPTnw9yI7Fl7iaZuZWF3FgX6uDoaovUA_L7fHwJ8zL9UICTuW0qNxIW6d4O6lYBpe60ks_AmK2lSvqv9dy-SNME4Hgkc9XVr43plzEw=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;不建議更換檔案名稱。&lt;/div&gt;&lt;div&gt;若將原檔案刪除，再新增同檔名的檔案，需要調整各檔案的 Build Action 與 Copy to Output Directory&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;應程式圖示主圖示檔案&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiOezoVf7B8QjxiuKzfGJOUm_63-nAvI13lIrQLIzYYbL5ebHue67qZs4rRDHefBMZp10qaG_zOIcz-7DrhQ4J2W0NuITEy0rfbdj1HYiZL398pNNf9WaQEngP8hWdZacV1pgL1OfLncSsklehPpYnTpMMqPCW2VUJsZHV4H9cJcfMswnSIYtmtbkCoGA&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7123080549281304658&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiOezoVf7B8QjxiuKzfGJOUm_63-nAvI13lIrQLIzYYbL5ebHue67qZs4rRDHefBMZp10qaG_zOIcz-7DrhQ4J2W0NuITEy0rfbdj1HYiZL398pNNf9WaQEngP8hWdZacV1pgL1OfLncSsklehPpYnTpMMqPCW2VUJsZHV4H9cJcfMswnSIYtmtbkCoGA=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;應程式圖示背景檔案&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhwgoMq5mGmPN4uOiC3GX1d9iGuNYwjJqkYn9FNGKT1A7xVErHuIm2oWik2VPTVygSfMlAV4f3qjLZiV2Ho3qc2tU_JVsiwhu_aLl_nN9RkioaZS0ku1u3rDaSnaqfqyxWdmw_gRG6LFgqgdaLXI7D3RazXvgYq-CcphWPVT56KOFtpqe9Y8WgbjeZSYg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7123080549284139314&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhwgoMq5mGmPN4uOiC3GX1d9iGuNYwjJqkYn9FNGKT1A7xVErHuIm2oWik2VPTVygSfMlAV4f3qjLZiV2Ho3qc2tU_JVsiwhu_aLl_nN9RkioaZS0ku1u3rDaSnaqfqyxWdmw_gRG6LFgqgdaLXI7D3RazXvgYq-CcphWPVT56KOFtpqe9Y8WgbjeZSYg=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;轉場圖片檔案&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhwwbmH9dMMqwVuuev0GfInxTJ3i1pb_hA_tL0unQHM6EnemIKTGhDl2fKgNrzkOeO2d0tsMYmfGIZinblI-Z4Vh6r7JK-z4fw9lAItg9I7q6bRiEOmg-YjT6a1Ltk_OHyuNqel9S5yS-Qc_RGBVdsJ8q82fFUU3Xhr6o5e_R6D_uVOeY8twCNhjU763w&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7123080553227047074&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhwwbmH9dMMqwVuuev0GfInxTJ3i1pb_hA_tL0unQHM6EnemIKTGhDl2fKgNrzkOeO2d0tsMYmfGIZinblI-Z4Vh6r7JK-z4fw9lAItg9I7q6bRiEOmg-YjT6a1Ltk_OHyuNqel9S5yS-Qc_RGBVdsJ8q82fFUU3Xhr6o5e_R6D_uVOeY8twCNhjU763w=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;修改後成果&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj3eEbqGVPv9spJSK1aQwqLhS6bPPG6hntnA1oFIP7VFLOX36qm9zDn65EDPpwz0y7E6IITbmf7I4kiAg042QQJ3PwvABbpFJ3riVcxxjUoaCqz-5N8Ro6nog2KS8XnKT-aaBO67ivfnEIGuMSVz3LZO5thsOvFUCbl3p9ReEyeJ-M6orPlhkz-_ppmgw&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7123080553330761922&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj3eEbqGVPv9spJSK1aQwqLhS6bPPG6hntnA1oFIP7VFLOX36qm9zDn65EDPpwz0y7E6IITbmf7I4kiAg042QQJ3PwvABbpFJ3riVcxxjUoaCqz-5N8Ro6nog2KS8XnKT-aaBO67ivfnEIGuMSVz3LZO5thsOvFUCbl3p9ReEyeJ-M6orPlhkz-_ppmgw=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjVXNkkB11mhhbPrw5taSE0jv1dT_1IPcp-xrx1xuGLH9xBCC_te28PvAR4g5CJWrbyhLPxiyVzAkqEDvXY0AKxr92NS_t8uUCuLr3btQ4r0H8XxisbFTplPATDp8Qe-k1Axfx9vt_VF7GE1_Xr-VKmto3pdMtNSUFeMvA7Fh5NC5zrKnUoV-EQm0kAXA&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_7123080561386310530&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjVXNkkB11mhhbPrw5taSE0jv1dT_1IPcp-xrx1xuGLH9xBCC_te28PvAR4g5CJWrbyhLPxiyVzAkqEDvXY0AKxr92NS_t8uUCuLr3btQ4r0H8XxisbFTplPATDp8Qe-k1Axfx9vt_VF7GE1_Xr-VKmto3pdMtNSUFeMvA7Fh5NC5zrKnUoV-EQm0kAXA=s320&quot; /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;實作參考原始碼&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://t.mail-svc.evernote.com/f/a/jfAKI0GnUpmOdAaA7f3-pw~~/AADd_wA~/RgRkvMj9P0Q-aHR0cHM6Ly9naXRodWIuY29tL3JvYmlubGkvTXlCYXNpY0xhYi90cmVlL21haW4vTWF1aUNoYW5nZUljb25XA3NwY0IKYtn9Q9pigG0kdlIgcm9iaW5saTE5NzMuZXZlcm5vdGVAYmxvZ2dlci5jb21YBAAAAAY~&quot; rev=&quot;en_rl_none&quot;&gt;MyBasicLab/MauiChangeIcon at main · robinli/MyBasicLab (github.com)&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SVG 線上檢視工具程式&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;http://t.mail-svc.evernote.com/f/a/48llapN2PqiNpzURvcugYg~~/AADd_wA~/RgRkvMj9P0QaaHR0cHM6Ly93d3cuc3Zndmlld2VyLmRldi9XA3NwY0IKYtn9Q9pigG0kdlIgcm9iaW5saTE5NzMuZXZlcm5vdGVAYmxvZ2dlci5jb21YBAAAAAY~&quot; rev=&quot;en_rl_none&quot;&gt;SVG Viewer - View, save, and optimize SVGs&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt; &lt;img src=&quot;https://www.evernote.com/etpa/ae4bea82-08c9-4b65-b541-c799b7b8841f&quot; style=&quot;height: 1px; width: 1px;&quot; /&gt;    &lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;1&quot; src=&quot;http://t.mail-svc.evernote.com/q/KAgxfxzTUxkhYrWF54Hmfw~~/AADd_wA~/RgRkvMj9PlcDc3BjQgpi2f1D2mKAbSR2UiByb2JpbmxpMTk3My5ldmVybm90ZUBibG9nZ2VyLmNvbVgEAAAABg~~&quot; width=&quot;1&quot; /&gt;  </content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/8365898795870714714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/8365898795870714714'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2022/07/maui-change-app-icon-splash-images.html' title='MAUI 更換應用程式圖示與轉場圖片'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCa2_IqNDIIV6Gs5R_8BVnoFug8lybZpxmLX4SfVXJinDMtjhokCnDfMNSLX-fDjp1iMmR9U78ZJD6b_4a3OZdxXoIDikh_2g4rbi0v2dAPBkBExsQjUP9CpWGlneaLtBPegTbI4OiBjFLupTAy9Nnjvd0iiAEU596DlrL3IuvzogrH2YrVD7EPit82g/s72-w432-h640-c/maui-change-app-icon-splash-images.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-2173914164189957180</id><published>2022-05-11T10:27:00.017+08:00</published><updated>2022-05-12T11:01:56.246+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blazor"/><title type='text'>Blazor 發行後用戶端自動更新</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h1 data-en-clipboard=&quot;true&quot; data-pm-slice=&quot;1 1 []&quot;&gt;前言&lt;/h1&gt;&lt;div&gt;目前 Blazor 改版發行後，用戶端可能會繼續操作上一版的程式，直到網頁重新整理才能取得新版本程式，由於無法逐一通知使用者改版，最好能自動偵測改版並自動更新。這功能或許未來 Blazor 核心即可解決，在那之前自己先動手改善。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[&lt;a href=&quot;https://github.com/robinli/BlazorAutoRefreshUpdate&quot; target=&quot;_blank&quot;&gt;Blazor Auto Refresh Update&lt;/a&gt;]&amp;nbsp;範例提供以下三種 Blazor 型態發行新版程式時，瀏覽器(用戶端)可以自動重新整理網址取得新版程式。&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Blazor Server App&lt;/li&gt;&lt;li&gt;Blazor WebAssembly App&lt;/li&gt;&lt;li&gt;Blazor WebAssembly App + PWA&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;主要是參考 &lt;a href=&quot;https://blazortrain.com/&quot; target=&quot;_blank&quot;&gt;Blazor Train&lt;/a&gt; 教學影片 [&lt;a href=&quot;https://www.youtube.com/watch?v=IdauS04L7H8&quot; target=&quot;_blank&quot;&gt;Handling App Updates: Carl Franklin&#39;s Blazor Train Ep 60&lt;/a&gt;]，&lt;/div&gt;&lt;div&gt;將 .NET 5.0 改版為 .NET 6.0，另外 PWA 專案中增加一個訊息畫面。&lt;/div&gt;&lt;h1&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://i.imgur.com/IR15aLk.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Software Update UI&quot; border=&quot;0&quot; data-original-height=&quot;306&quot; data-original-width=&quot;731&quot; src=&quot;https://i.imgur.com/IR15aLk.png&quot; title=&quot;Software Update&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/h1&gt;&lt;h1&gt;開發環境&lt;/h1&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Visual Studio 2022&lt;/li&gt;&lt;li&gt;.NET 6.0&lt;/li&gt;&lt;li&gt;預設的 Blazor 範本&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;追蹤程式碼&lt;/h1&gt;&lt;div&gt;取得原始碼 [&lt;a href=&quot;https://github.com/robinli/BlazorAutoRefreshUpdate&quot; target=&quot;_blank&quot;&gt;Blazor Auto Refresh Update&lt;/a&gt;] 👈GitHub&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;程式碼修改細節，可以透過 Find in Files 輸入:&amp;nbsp;&lt;span data-code=&quot;true&quot; style=&quot;background-color: #fcff01;&quot;&gt;Auto Refresh Update Tip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;檢視所有程式碼片段。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://i.imgur.com/wzU4sgu.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Find in Files&quot; border=&quot;0&quot; data-original-height=&quot;442&quot; data-original-width=&quot;797&quot; src=&quot;https://i.imgur.com/wzU4sgu.png&quot; title=&quot;Find in Files&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://i.imgur.com/wzU4sgu.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://i.imgur.com/6WYaAZ4.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Key in: Auto Refresh Update Tip&quot; border=&quot;0&quot; data-original-height=&quot;503&quot; data-original-width=&quot;584&quot; src=&quot;https://i.imgur.com/6WYaAZ4.png&quot; title=&quot;Key in: Auto Refresh Update Tip&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://i.imgur.com/st7s85A.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;Find Result&quot; border=&quot;0&quot; data-original-height=&quot;800&quot; data-original-width=&quot;734&quot; src=&quot;https://i.imgur.com/st7s85A.png&quot; title=&quot;Find Result&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;發行程序&lt;/h1&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Blazor Server App&amp;nbsp;&lt;/h4&gt;&lt;div&gt;不用修改任何檔案。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Blazor WebAssembly App&amp;nbsp;&lt;/h4&gt;&lt;div&gt;發行新版本需要修改 appsettings.json 版本編號。&lt;/div&gt;&lt;ul&gt;&lt;li&gt;appsettings.json&lt;/li&gt;&lt;li&gt;Index.razor (非必要)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Blazor WebAssembly App + PWA&amp;nbsp;&lt;/h4&gt;&lt;div&gt;發行新版本需要修改以下檔案內的版本編號。&lt;/div&gt;&lt;ul&gt;&lt;li&gt;appsettings.json&lt;/li&gt;&lt;li&gt;Toolbar.razor&lt;/li&gt;&lt;li&gt;service-worker.published.js&lt;/li&gt;&lt;li&gt;Index.razor (非必要)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;參考資源&lt;/h1&gt;&lt;div&gt;Blazor Train 教學影片 [&lt;a href=&quot;https://www.youtube.com/watch?v=IdauS04L7H8&quot; target=&quot;_blank&quot;&gt;Handling App Updates: Carl Franklin&#39;s Blazor Train Ep 60&lt;/a&gt;] 👈YouTube&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2173914164189957180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2173914164189957180'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2022/05/blazor-app-auto-update.html' title='Blazor 發行後用戶端自動更新'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-1113388722926294421</id><published>2022-01-17T17:04:00.003+08:00</published><updated>2022-07-22T14:35:03.352+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL"/><title type='text'>使用 T-SQL 計算帳齡分析 Aging Analysis Report</title><content type='html'>&lt;h1&gt;需求說明&lt;/h1&gt;&lt;p&gt;常見帳齡分析的報表例如：客戶帳齡分析、產品庫存呆滯天數分析...等。&amp;nbsp;&lt;/p&gt;&lt;p&gt;舉例一組簡化的客戶發票資料，包括單號、日期、金額，&amp;nbsp;&lt;/p&gt;&lt;p&gt;欲將發票資料依天數組距加總統計，得到客戶帳齡分析，&amp;nbsp;&lt;/p&gt;&lt;p&gt;如下圖。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1eAFfeY6iCMcQHqbC1SskQJRDvbpHb4Sa&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;&lt;/p&gt;&lt;h1&gt;原始資料&amp;nbsp;&lt;/h1&gt;&lt;p&gt;交易資料中必要欄位有：&amp;nbsp;&lt;/p&gt;&lt;p&gt;一個日期欄位 : 用來計算與指定日期相差幾天&amp;nbsp;&lt;/p&gt;&lt;p&gt;一個數值欄位 : 用來各組距彙總時的數值&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;color:#000000;background-color:#FFFFFF;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;DECLARE&lt;/span&gt; @SourceData &lt;span style=&quot;color:#0000FF;&quot;&gt;AS&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;TABLE&lt;/span&gt;(DOCNO &lt;span style=&quot;color:#0000FF;&quot;&gt;varchar&lt;/span&gt;(16), TRANS_DATE &lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;, AMOUNT &lt;span style=&quot;color:#0000FF;&quot;&gt;int&lt;/span&gt;) 
 
&lt;span style=&quot;color:#0000FF;&quot;&gt;insert&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;into&lt;/span&gt; @SourceData(DOCNO, TRANS_DATE, AMOUNT) 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021011501&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-01-15&#39;&lt;/span&gt;),AMOUNT=300 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021052601&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-05-26&#39;&lt;/span&gt;),AMOUNT=400 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021060701&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-06-07&#39;&lt;/span&gt;),AMOUNT=300 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021060801&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-06-08&#39;&lt;/span&gt;),AMOUNT=400 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021060901&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-06-09&#39;&lt;/span&gt;),AMOUNT=700 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021071001&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-07-10&#39;&lt;/span&gt;),AMOUNT=800 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021071101&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-07-11&#39;&lt;/span&gt;),AMOUNT=900 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021081201&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-08-12&#39;&lt;/span&gt;),AMOUNT=1000 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021081301&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-08-13&#39;&lt;/span&gt;),AMOUNT=1100 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021081401&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-08-14&#39;&lt;/span&gt;),AMOUNT=1200 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021081501&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-08-15&#39;&lt;/span&gt;),AMOUNT=1300 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021091601&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-09-16&#39;&lt;/span&gt;),AMOUNT=1400 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021101701&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-10-17&#39;&lt;/span&gt;),AMOUNT=1500 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021101801&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-10-18&#39;&lt;/span&gt;),AMOUNT=1600 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021111901&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-11-19&#39;&lt;/span&gt;),AMOUNT=1700 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021112001&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-11-20&#39;&lt;/span&gt;),AMOUNT=1800 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021112101&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-11-21&#39;&lt;/span&gt;),AMOUNT=1900 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021122201&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-12-22&#39;&lt;/span&gt;),AMOUNT=2000 &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DOCNO=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021122001&#39;&lt;/span&gt;, TRANS_DATE=&lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;,&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2021-12-20&#39;&lt;/span&gt;),AMOUNT=2100 ; 

&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; * &lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt; @SourceData; 
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1doIk-9gX_ItfaverwlaobOl04eO1-C_3&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;定義天數組距&amp;nbsp;&lt;/p&gt;&lt;p&gt;0 ~ 30 : 表示 0 天至 30 天&amp;nbsp;&lt;/p&gt;&lt;p&gt;31 ~ 60 : 表示 31 天至 60 天&amp;nbsp;&lt;/p&gt;&lt;p&gt;以此類推 &amp;nbsp;&lt;/p&gt;&lt;div style=&quot;color:#000000;background-color:#FFFFFF;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;DECLARE&lt;/span&gt; @AgeGroup &lt;span style=&quot;color:#0000FF;&quot;&gt;AS&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;TABLE&lt;/span&gt;(DATE_FROM &lt;span style=&quot;color:#0000FF;&quot;&gt;int&lt;/span&gt;, DATE_TO &lt;span style=&quot;color:#0000FF;&quot;&gt;int&lt;/span&gt;, AGE_GROUP &lt;span style=&quot;color:#0000FF;&quot;&gt;varchar&lt;/span&gt;(16)) 
 
&lt;span style=&quot;color:#0000FF;&quot;&gt;insert&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;into&lt;/span&gt; @AgeGroup(DATE_FROM, DATE_TO, AGE_GROUP) 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DATE_FROM=0, DATE_TO=30, AGE_GROUP=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;0 ~ 30&#39;&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DATE_FROM=31, DATE_TO=60, AGE_GROUP=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;31 ~ 60&#39;&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DATE_FROM=61, DATE_TO=90, AGE_GROUP=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;61 ~ 90&#39;&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DATE_FROM=91, DATE_TO=180, AGE_GROUP=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;91 ~ 180&#39;&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;union&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; DATE_FROM=181, DATE_TO=360, AGE_GROUP=&lt;span style=&quot;color:#A31515;&quot;&gt;&#39;181 ~ 360&#39;&lt;/span&gt;   
 
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; * &lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt; @AgeGroup 
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1TqZzt5j9UH0A_Le_Ep2VBeFJcTd2mHf_&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;&lt;/p&gt;&lt;h1&gt;計算步驟&lt;br&gt;&lt;/h1&gt;&lt;h2&gt;1. 延伸原始資料&amp;nbsp;&lt;/h2&gt;&lt;p&gt;(1) Age&amp;nbsp; :&amp;nbsp; 計算交易資料日期 [TRANS_DATE] 與指定日期 (@Calculate) 相差幾天&amp;nbsp;&lt;/p&gt;&lt;p&gt;(2) 天數組距 :&amp;nbsp; 由 [Age ] 對應組距名稱&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;color:#000000;background-color:#FFFFFF;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;DECLARE&lt;/span&gt; @Calculate &lt;span style=&quot;color:#0000FF;&quot;&gt;Date&lt;/span&gt; = &lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;, &lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2022-01-01&#39;&lt;/span&gt;) 

&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; * 
&lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt;( 
 &lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; P1.* 
  &lt;span style=&quot;color:#008000;&quot;&gt;/*Age: 計算交易資料日期 [TRANS_DATE] 與指定日期 (@Calculate) 相差幾天 */&lt;/span&gt; 
  , Age = &lt;span style=&quot;color:#0000FF;&quot;&gt;DATEDIFF&lt;/span&gt;(&lt;span style=&quot;color:#FF00FF;&quot;&gt;day&lt;/span&gt;, P1.TRANS_DATE, @Calculate) 
 &lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt; @SourceData P1 
) P2 
&lt;span style=&quot;color:#0000FF;&quot;&gt;outer&lt;/span&gt; apply( 
 &lt;span style=&quot;color:#008000;&quot;&gt;/*天數組距 :  由 [Age] 對應組距名稱*/&lt;/span&gt; 
 &lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; Ag.DATE_FROM, Ag.AGE_GROUP 
 &lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt; @AgeGroup Ag 
 &lt;span style=&quot;color:#0000FF;&quot;&gt;where&lt;/span&gt; P2.Age&amp;gt;=Ag.DATE_FROM &lt;span style=&quot;color:#0000FF;&quot;&gt;and&lt;/span&gt; P2.Age&amp;lt;=Ag.DATE_TO 
) A 
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1n2uWLC5wAlnH2usdhfoE72Jz3Cjo1ZU6&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;2.依照組距加總數值&amp;nbsp;&lt;/p&gt;&lt;p&gt;利用 PIVOT TABLE 產生各組距的加總。&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;color:#000000;background-color:#FFFFFF;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;DECLARE&lt;/span&gt; @Calculate &lt;span style=&quot;color:#0000FF;&quot;&gt;Date&lt;/span&gt; = &lt;span style=&quot;color:#FF00FF;&quot;&gt;convert&lt;/span&gt;(&lt;span style=&quot;color:#0000FF;&quot;&gt;date&lt;/span&gt;, &lt;span style=&quot;color:#A31515;&quot;&gt;&#39;2022-01-01&#39;&lt;/span&gt;) 
 
&lt;span style=&quot;color:#008000;&quot;&gt;/*依照組距加總數值*/&lt;/span&gt;  
&lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; [0 ~ 30] = &lt;span style=&quot;color:#FF00FF;&quot;&gt;sum&lt;/span&gt;(&lt;span style=&quot;color:#FF00FF;&quot;&gt;isnull&lt;/span&gt;([0],0))  
 , [31 ~ 60] = &lt;span style=&quot;color:#FF00FF;&quot;&gt;sum&lt;/span&gt;(&lt;span style=&quot;color:#FF00FF;&quot;&gt;isnull&lt;/span&gt;([31],0))  
 , [61 ~ 90] = &lt;span style=&quot;color:#FF00FF;&quot;&gt;sum&lt;/span&gt;(&lt;span style=&quot;color:#FF00FF;&quot;&gt;isnull&lt;/span&gt;([61],0))  
 , [91 ~ 180] = &lt;span style=&quot;color:#FF00FF;&quot;&gt;sum&lt;/span&gt;(&lt;span style=&quot;color:#FF00FF;&quot;&gt;isnull&lt;/span&gt;([91],0))  
 , [181 ~ 360] = &lt;span style=&quot;color:#FF00FF;&quot;&gt;sum&lt;/span&gt;(&lt;span style=&quot;color:#FF00FF;&quot;&gt;isnull&lt;/span&gt;([181],0))  
&lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt;(  
 &lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; *  
 &lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt;(  
  &lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; P1.*  
   &lt;span style=&quot;color:#008000;&quot;&gt;/*Age / 天數 :  計算交易資料 [日期] 與指定日期相差幾天*/&lt;/span&gt;  
   , Age = &lt;span style=&quot;color:#0000FF;&quot;&gt;DATEDIFF&lt;/span&gt;(&lt;span style=&quot;color:#FF00FF;&quot;&gt;day&lt;/span&gt;, P1.TRANS_DATE, @Calculate)  
  &lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt; @SourceData P1  
 ) P2  
 &lt;span style=&quot;color:#0000FF;&quot;&gt;outer&lt;/span&gt; apply(  
  &lt;span style=&quot;color:#008000;&quot;&gt;/*天數組距 :  由 [Age / 天數] 對應組距名稱*/&lt;/span&gt;  
  &lt;span style=&quot;color:#0000FF;&quot;&gt;select&lt;/span&gt; Ag.DATE_FROM, Ag.AGE_GROUP  
  &lt;span style=&quot;color:#0000FF;&quot;&gt;from&lt;/span&gt; @AgeGroup Ag  
  &lt;span style=&quot;color:#0000FF;&quot;&gt;where&lt;/span&gt; P2.Age&amp;gt;=Ag.DATE_FROM &lt;span style=&quot;color:#0000FF;&quot;&gt;and&lt;/span&gt; P2.Age&amp;lt;=Ag.DATE_TO  
 ) A  
) Src  
pivot(  
 &lt;span style=&quot;color:#FF00FF;&quot;&gt;sum&lt;/span&gt;(AMOUNT)  
 &lt;span style=&quot;color:#0000FF;&quot;&gt;for&lt;/span&gt; Src.DATE_FROM &lt;span style=&quot;color:#0000FF;&quot;&gt;in&lt;/span&gt;([0],[31],[61],[91],[181])  
) Pvt 
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=11NSRJoGXHPsRurhp2pBNv7yLiTvynVgC&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h1&gt;相關連結&lt;/h1&gt;&lt;a href=&quot;https://gist.github.com/robinli/06cfe8e9c34e92bde29ab76b2b829b7f&quot;&gt;T-SQL 查詢指令完整範例&lt;/a&gt;&amp;nbsp;&lt;p&gt;&lt;a href=&quot;https://note.robinks.net/2022/01/aging-analysis-report-using-excel.html&quot;&gt;使用 Excel 計算帳齡分析 Aging Analysis Report&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/1113388722926294421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/1113388722926294421'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2022/01/aging-analysis-report-using-t-sql-query.html' title='使用 T-SQL 計算帳齡分析 Aging Analysis Report'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-6831493022241504745</id><published>2022-01-17T13:56:00.004+08:00</published><updated>2022-01-17T17:19:43.160+08:00</updated><title type='text'>使用 Excel 計算帳齡分析 Aging Analysis Report</title><content type='html'>&lt;h1&gt;需求說明&amp;nbsp;&lt;/h1&gt;&lt;div&gt;常見帳齡分析的報表例如：客戶帳齡分析、產品庫存呆滯天數分析...等。&amp;nbsp;&lt;/div&gt;&lt;div&gt;舉例一組簡化的客戶發票資料，包括單號、日期、金額，&amp;nbsp;&lt;/div&gt;&lt;div&gt;欲將發票資料依天數組距加總統計，得到客戶帳齡分析，&amp;nbsp;&lt;/div&gt;&lt;div&gt;如下圖。&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1YkzNfJvGJi4921dmdEROs01ycnU3GPIb&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;h1&gt;原始資料&amp;nbsp;&lt;/h1&gt;&lt;div&gt;交易資料中必要欄位有：&amp;nbsp;&lt;/div&gt;&lt;div&gt;一個日期欄位 : 用來計算與指定日期相差幾天&amp;nbsp;&lt;/div&gt;&lt;div&gt;一個數值欄位 : 用來各組距彙總時的數值&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=16Y6wlfg7adAavZe6qdMa64QtiZk0YF1w&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;定義天數組距&amp;nbsp;&lt;/div&gt;&lt;div&gt;0 ~ 30 : 表示 0 天至 30 天&amp;nbsp;&lt;/div&gt;&lt;div&gt;31 ~ 60 : 表示 31 天至 60 天&amp;nbsp;&lt;/div&gt;&lt;div&gt;以此類推 &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img width=&quot;500&quot; src=&quot;https://drive.google.com/uc?id=1YzwXoZEsgVQGYcxPJoYBb9zEe10klFmZ#0.5848624826172624&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;h1&gt;計算步驟&amp;nbsp;&lt;/h1&gt;&lt;h2&gt;1. 延伸原始資料&amp;nbsp;&lt;/h2&gt;&lt;div&gt;(1) Age / 天數 :&amp;nbsp; 計算交易資料 [日期] 與指定日期相差幾天&amp;nbsp;&lt;/div&gt;&lt;div&gt;(2) 天數組距 :&amp;nbsp; 由 [Age / 天數] 對應組距名稱&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1_-tEbjz79XNeyY-pvbQXReVU2aq3sxju&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;公式如下&lt;/div&gt;&lt;p&gt;D38 = DATEVALUE($B$&lt;span&gt;35&lt;/span&gt;)-DATEVALUE(B38)&lt;br&gt;&lt;/p&gt;&lt;div&gt;E38 = VLOOKUP(D38,$A$27:$C$31,3,TRUE)&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;2. 依照組距加總數值&amp;nbsp;&lt;/h2&gt;&lt;div&gt;利用 Excel 函式 SUMIF 產生各組距的加總。&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1PP3DfHCqCnlp1x2ouHH_8rmig8BmGeHu&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;公式如下&lt;/p&gt;&lt;p&gt;A62 = SUMIF($E$38:$E$56,A61,$C$38:$C$56)&amp;nbsp;&lt;/p&gt;&lt;div&gt;B62 = SUMIF($E$38:$E$56,B61,$C$38:$C$56)&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h1&gt;相關連結&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://1drv.ms/x/s!ArFAjQrFv6CGt5AUQ0mzHLAueOYWsg?e=VfMsQf&quot;&gt;下載範例 Excel 檔案&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://note.robinks.net/2022/01/aging-analysis-report-using-t-sql-query.html&quot;&gt;使用 T-SQL 計算帳齡分析 Aging Analysis Report&lt;/a&gt;&lt;b&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;u&gt;&lt;/u&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sup&gt;&lt;/sup&gt;&lt;strike&gt;&lt;/strike&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;u&gt;&lt;/u&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sup&gt;&lt;/sup&gt;&lt;strike&gt;&lt;/strike&gt;&lt;b&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;u&gt;&lt;/u&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sup&gt;&lt;/sup&gt;&lt;strike&gt;&lt;/strike&gt;&lt;br&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/6831493022241504745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/6831493022241504745'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2022/01/aging-analysis-report-using-excel.html' title='使用 Excel 計算帳齡分析 Aging Analysis Report'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-2908546937652169386</id><published>2021-12-28T16:44:00.017+08:00</published><updated>2021-12-28T16:48:38.071+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL"/><title type='text'>T-SQL Two Dimension Pivot Table</title><content type='html'>&lt;p&gt;將原始資料&amp;nbsp;&lt;/p&gt;&lt;div data-codeblock=&quot;true&quot; data-en-clipboard=&quot;true&quot; data-pm-slice=&quot;2 2 []&quot; style=&quot;background-color: #fbfaf8; background-position: initial initial; background-repeat: initial initial; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.14902); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; padding: 8px;&quot;&gt;&lt;div data-plaintext=&quot;true&quot;&gt;select BRAND=&#39;ASUS&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;union all &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;select BRAND=&#39;BENQ&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;union all &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;select BRAND=&#39;ASUS&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;union all &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;select BRAND=&#39;BENQ&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;union all &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;select BRAND=&#39;MSI&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMiTzD3Y7gbPt2hntC2wvzEemmQ1b7L7Lc4tUbb4j4CCla7AC6slOdrnyrrbZA9x3XcJlhsAior5Lq-6wjvcy8BgYk1auS7l863SaGRmPambOHdIK-Uj4Gah2VhvHbStTUUaQwNZHCxPR/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;175&quot; data-original-width=&quot;289&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMiTzD3Y7gbPt2hntC2wvzEemmQ1b7L7Lc4tUbb4j4CCla7AC6slOdrnyrrbZA9x3XcJlhsAior5Lq-6wjvcy8BgYk1auS7l863SaGRmPambOHdIK-Uj4Gah2VhvHbStTUUaQwNZHCxPR/s16000/image.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;依各品牌匯總數量、金額，做出以下的統計表&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw_2pzcNPngA5FLLocXyv6mqebXxBSuUJkeSgmdpAmPMRBKizUsue8GOo4XG72QXVWaGGxSOYIMJFlRQWBxw7BEDVmEUdZFSVR5DOG4xJ5YZiYZAdcZVcGiKFkjtWyZDj1_EO-IbY-DuKC/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;59&quot; data-original-width=&quot;631&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw_2pzcNPngA5FLLocXyv6mqebXxBSuUJkeSgmdpAmPMRBKizUsue8GOo4XG72QXVWaGGxSOYIMJFlRQWBxw7BEDVmEUdZFSVR5DOG4xJ5YZiYZAdcZVcGiKFkjtWyZDj1_EO-IbY-DuKC/s16000/image.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;解決方法 1 - Group By 加條件式&amp;nbsp;&lt;/h2&gt;&lt;div data-codeblock=&quot;true&quot; data-en-clipboard=&quot;true&quot; data-pm-slice=&quot;2 2 []&quot; style=&quot;background-color: #fbfaf8; background-position: initial initial; background-repeat: initial initial; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.14902); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; padding: 8px;&quot;&gt;&lt;div data-plaintext=&quot;true&quot;&gt;select ASUS_QTY = SUM(IIF(Src.BRAND=&#39;ASUS&#39;, Src.QTY, 0)) &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, ASUS_AMT = SUM(IIF(Src.BRAND=&#39;ASUS&#39;, Src.AMT, 0)) &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, BENQ_QTY = SUM(IIF(Src.BRAND=&#39;BENQ&#39;, Src.QTY, 0)) &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, BENQ_AMT = SUM(IIF(Src.BRAND=&#39;BENQ&#39;, Src.AMT, 0)) &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, MSI_QTY = SUM(IIF(Src.BRAND=&#39;MSI&#39;, Src.QTY, 0)) &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, MSI_AMT = SUM(IIF(Src.BRAND=&#39;MSI&#39;, Src.AMT, 0)) &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;from( &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	select BRAND=&#39;ASUS&#39;, QTY=1, AMT=200 &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	union all  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	select BRAND=&#39;BENQ&#39;, QTY=1, AMT=200 &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	union all  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	select BRAND=&#39;ASUS&#39;, QTY=1, AMT=200 &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	union all  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	select BRAND=&#39;BENQ&#39;, QTY=1, AMT=200 &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	union all  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	select BRAND=&#39;MSI&#39;, QTY=1, AMT=200 &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;) Src&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;解決方法 2 - Pivot Table&amp;nbsp;&lt;/h2&gt;&lt;p&gt;做多維度 Pivot Table 時，會排除相同的資料，導致第二維度彙總有遺漏資料狀況。
變通作法，先在每筆資料賦予唯一的流水號，即可解決。&amp;nbsp;&lt;/p&gt;&lt;div data-codeblock=&quot;true&quot; data-en-clipboard=&quot;true&quot; data-pm-slice=&quot;2 2 []&quot; style=&quot;background-color: #fbfaf8; background-position: initial initial; background-repeat: initial initial; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.14902); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12px; padding: 8px;&quot;&gt;&lt;div data-plaintext=&quot;true&quot;&gt;select ASUS_QTY = SUM(ASUS_QTY)&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, ASUS_AMT = SUM(ASUS_AMT)&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, BENQ_QTY = SUM(BENQ_QTY)&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, BENQ_AMT = SUM(BENQ_AMT)	&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, MSI_QTY = SUM(MSI_QTY)&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	, MSI_AMT = SUM(MSI_AMT)&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;from (&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	select RNO=row_number() over (order by BRAND)&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		, BRAND1 = Src.BRAND+&#39;_QTY&#39;&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		, BRAND2 = Src.BRAND+&#39;_AMT&#39;&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		, Src.*&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	from(&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		select BRAND=&#39;ASUS&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		union all &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		select BRAND=&#39;BENQ&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		union all &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		select BRAND=&#39;ASUS&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		union all &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		select BRAND=&#39;BENQ&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		union all &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;		select BRAND=&#39;MSI&#39;, QTY=1, AMT=200&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;	) Src&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;) T&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;PIVOT  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;(  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;    SUM (QTY)  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;    FOR BRAND1 IN ([ASUS_QTY],[BENQ_QTY],[MSI_QTY])  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;) AS pvt1&lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;PIVOT  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;(  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;    SUM (AMT)  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;    FOR BRAND2 IN ([ASUS_AMT],[BENQ_AMT],[MSI_AMT])  &lt;/div&gt;&lt;div data-plaintext=&quot;true&quot;&gt;) AS pvt2&lt;/div&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2908546937652169386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2908546937652169386'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/12/t-sql-two-dimension-pivot-table.html' title='T-SQL Two Dimension Pivot Table'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMiTzD3Y7gbPt2hntC2wvzEemmQ1b7L7Lc4tUbb4j4CCla7AC6slOdrnyrrbZA9x3XcJlhsAior5Lq-6wjvcy8BgYk1auS7l863SaGRmPambOHdIK-Uj4Gah2VhvHbStTUUaQwNZHCxPR/s72-c/image.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-8061154212842727888</id><published>2021-12-21T13:40:00.002+08:00</published><updated>2021-12-21T13:54:00.145+08:00</updated><title type='text'>Azure DevOps 看板中顯示前後期工作</title><content type='html'>&lt;div&gt;Azure DevOps 工作看板可以將本期、前一期、下一期的工作，以不同的顏色區分顯示，一目了然。&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1EQQoB94nztwTQxItPeROSMU9E4XkExQY&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;h2&gt;設定方式&amp;nbsp;&lt;/h2&gt;&lt;div&gt;進入 Azure DevOps&amp;nbsp; &amp;gt; Boards &amp;gt; Boards&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=113Isc1ya93dEfQhLIqjTKfwqQCHf0YCM&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;在主畫面右上角點擊設定的 Icon&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1hdD9subgqj8kD3r4xeAKbv8V3Rs1a7Nq&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;設定當期顯示的顏色&amp;nbsp;&lt;/div&gt;&lt;div&gt;(1)在開窗畫面中進入 Settings &amp;gt; Styles &amp;nbsp;&lt;/div&gt;&lt;div&gt;(2)點擊新增一個 [Style rule]&amp;nbsp;&lt;/div&gt;&lt;div&gt;(3) Field 輸入 Iteration Path&amp;nbsp;&lt;/div&gt;&lt;div&gt;(4) Value&amp;nbsp; 輸入 @currentIteration &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1Hzcia23u3rnIBJpwjS5MssTUH-Bg3U3I&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;設定前一期顯示的顏色&amp;nbsp;&lt;/div&gt;&lt;div&gt;同上述步驟點擊新增一個 [Style rule]&amp;nbsp;&lt;/div&gt;&lt;div&gt;Field 輸入 Iteration Path&amp;nbsp;&lt;/div&gt;&lt;div&gt;Value 輸入 @currentIteration - 1&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1cssEqrFtHchcIzp5Cl3zaRMI-9G_RnL7&quot;&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/8061154212842727888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/8061154212842727888'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/12/azure-devops-highlight-current-iteration.html' title='Azure DevOps 看板中顯示前後期工作'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-3766212498757100546</id><published>2021-11-05T14:53:00.002+08:00</published><updated>2022-07-22T14:35:27.321+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blazor"/><title type='text'>Blazor Print Example</title><content type='html'>&lt;h1&gt;程式開發步驟&lt;/h1&gt;&lt;p&gt;以 Visual Studio 2019 新增 Blazor Server 專案。&lt;/p&gt;&lt;h2&gt;Step 1 加入 jQuery&amp;nbsp;&lt;/h2&gt;&lt;p&gt;&amp;nbsp;&lt;img src=&quot;https://drive.google.com/uc?id=1X2AFKdEUL-E340QEYR9R8Kk_W-slda21&quot;&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src=&quot;https://drive.google.com/uc?id=1303zxE1GZNc06zey85mmaEETP7EBPFBk&quot;&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h2&gt;Step 2 設定列印要隱藏 CSS&amp;nbsp;&lt;/h2&gt;&lt;p&gt;將不須列印的部分加上 css class : hideWhenPrint&lt;br&gt;&lt;/p&gt;&lt;p&gt;Shared/MainLayout.razor &amp;nbsp;&lt;/p&gt;&lt;div style=&quot;color:#000000;background-color:#FFFFFF;&quot;&gt;&lt;pre&gt;@inherits LayoutComponentBase

&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;page&quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
    &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;sidebar hideWhenPrint&quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
        &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;NavMenu&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;/&amp;gt;&lt;/span&gt; 
    &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
    &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;main&quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
        &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;top-row px-4 hideWhenPrint&quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
            &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;a&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;https://docs.microsoft.com/aspnet/&quot;&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;_blank&quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt;About&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
        &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
        &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;content px-4&quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
            @Body 
        &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
    &lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Step 3 呼叫 JavaScript&amp;nbsp;&lt;/h2&gt;&lt;p&gt;wwwroot/js/print.js&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;color:#000000;background-color:#FFFFFF;&quot;&gt;&lt;pre&gt;function Print() {
    $(&lt;span style=&quot;color:#A31515;&quot;&gt;&quot;.hideWhenPrint&quot;&lt;/span&gt;).hide();
    window.print();
    $(&lt;span style=&quot;color:#A31515;&quot;&gt;&quot;.hideWhenPrint&quot;&lt;/span&gt;).show();
}&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Pages/_Host.cshtml&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;color:#000000;background-color:#FFFFFF;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;script&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;~/jquery/jquery.min.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;script&lt;/span&gt; &lt;span style=&quot;color:#FF0000;&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&quot;~/js/print.js&quot;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#A31515;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;&amp;gt;&lt;/span&gt; 
&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Blazor Call JavaScript&lt;/p&gt;&lt;div style=&quot;color:#000000;background-color:#FFFFFF;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;color:#0000FF;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color:#0000FF;&quot;&gt;void&lt;/span&gt; Print()
{
    jsRunTime.InvokeVoidAsync(&lt;span style=&quot;color:#A31515;&quot;&gt;&quot;Print&quot;&lt;/span&gt;);
}
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h1&gt;原始碼&amp;nbsp;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/robinli/BlazorPrintExample&quot;&gt;GitHub - BlazorPrintExample&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;執行結果&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1WgZSxPYImmkUwynnhqfI-GbBsiS_MkM5&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1nqSamwq_yrxznlx6ExglS7A3SOB-21T4&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h1&gt;參考&amp;nbsp;&lt;/h1&gt;&lt;p&gt;Blazor : Generate Quick PDF || Easy Trick || 100% Free&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://youtu.be/btp9LkmrBig&quot;&gt;https://youtu.be/btp9LkmrBig&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;i&gt;&lt;/i&gt;&lt;u&gt;&lt;/u&gt;&lt;sub&gt;&lt;/sub&gt;&lt;sup&gt;&lt;/sup&gt;&lt;strike&gt;&lt;/strike&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/3766212498757100546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/3766212498757100546'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/11/blazor-print-example.html' title='Blazor Print Example'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-4236859426463775389</id><published>2021-10-07T15:13:00.001+08:00</published><updated>2021-10-07T15:17:14.106+08:00</updated><title type='text'>使用 Gpg4Win 驗證 Notepad++ 安裝程式</title><content type='html'>&lt;div&gt;Step 1 下載 Gpg4Win&amp;nbsp;&lt;/div&gt;&lt;div&gt;下載網址: &lt;a href=&quot;https://gpg4win.org/get-gpg4win.html&quot;&gt;https://gpg4win.org/get-gpg4win.html&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1WLs7yLKXlM1cIOlwin3DFEAI3U1X2tmI&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Step 2 建立個人私鑰&amp;nbsp;&lt;/div&gt;&lt;div&gt;開啟 Kleopatra 建立個人私鑰&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1d-A2G-Hlzf2GzRxHComQbbd8zZenNBjL&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1MW2ik8YHlWInGzmQbYoyO7IjQ_QMJE6P&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div&gt;Step 3 匯入 Notepad++ 公鑰&amp;nbsp;&lt;/div&gt;&lt;div&gt;下載 &lt;a href=&quot;https://notepad-plus-plus.org/gpg/nppGpgPub.asc&quot;&gt;https://notepad-plus-plus.org/gpg/nppGpgPub.asc&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;另存為 nppGpgPub.asc&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Kleopatra &amp;gt; 點擊 Import &amp;gt; 選取上述下載的檔案&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1_sTiZbCXQmMlwCXYT--NLgnJjbBdZKXf&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Step 4 下載 Notepad++ 安裝程式與 GPG Signature 檔案&amp;nbsp;&lt;/div&gt;&lt;div&gt;下載網址: &lt;a href=&quot;https://notepad-plus-plus.org/downloads/v8.1.5/&quot;&gt;https://notepad-plus-plus.org/downloads/v8.1.5/&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1ZqI6xE84sdhh4pDoGsJmy2bkcsVjiL22&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Step 5 驗證&amp;nbsp;&lt;/div&gt;&lt;div&gt;Kleopatra&amp;nbsp; &amp;gt; 點擊 [Decrypt/Verty...] &amp;gt; 選取上述下載檔案 npp.8.1.5.Installer.x64.exe.sig&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;img src=&quot;https://drive.google.com/uc?id=1AciUlZ3czTXJc9sTpULNw8_92ndePuja&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;出現 The signature is valid and the certificate&#39;s validity is fully trusted &amp;nbsp;&lt;/div&gt;&lt;div&gt;表示通過驗證&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/4236859426463775389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/4236859426463775389'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/10/gpg4win-notepad.html' title='使用 Gpg4Win 驗證 Notepad++ 安裝程式'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-6106639033098407962</id><published>2021-07-01T09:52:00.001+08:00</published><updated>2021-07-01T09:54:53.217+08:00</updated><title type='text'>Notepad++ 安裝後基本設定</title><content type='html'>&lt;h1&gt;下載安裝最新版本&lt;/h1&gt;  &lt;p&gt;&lt;a href=&quot;https://notepad-plus-plus.org/downloads/&quot;&gt;Downloads | Notepad++ (notepad-plus-plus.org)&lt;/a&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;h1&gt;新增與使用 Theme&lt;/h1&gt;  &lt;p&gt;&lt;img alt=&quot;Notepad++ Theme Preview&quot; src=&quot;https://draculatheme.com/static/img/screenshots/notepad-plus-plus.png&quot; /&gt;&lt;/p&gt;  &lt;p&gt;下載 Theme 範本 *.xml &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://draculatheme.com/notepad-plus-plus&quot;&gt;Dark theme for Notepad++ and 188+ apps — Dracula (draculatheme.com)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/dracula/notepad-plus-plus/master/Dracula.xml&quot;&gt;https://raw.githubusercontent.com/dracula/notepad-plus-plus/master/Dracula.xml&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;儲存於 C:\Users\YourName\AppData\Roaming\Notepad++\themes&lt;/p&gt;  &lt;p&gt;開啟 Notepad++ &amp;gt; 選單 &amp;gt; Settings &amp;gt; Style Configuratior &amp;gt; Select theme &amp;gt; 選擇 Dracula&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;hr /&gt;  &lt;h1&gt;修改字體大小&lt;/h1&gt;  &lt;p&gt;&lt;a href=&quot;https://drive.google.com/uc?id=1opXRFdl47aj2NhD231jigqfTOk7AHB4k&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://drive.google.com/uc?id=1Jg48G1EkkgCNL61d5lA0tVviLi2v-4H2&quot; width=&quot;754&quot; height=&quot;427&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;hr /&gt;  &lt;h1&gt;設定無法識別的附檔名&lt;/h1&gt;  &lt;p&gt;例如 cshtml 或 razor 不能突顯關鍵字&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;選單 &amp;gt; Settings &amp;gt; Style Configurator, under Language select HTML, and add razor in the User ext box.&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://drive.google.com/uc?id=19Q6jD6SfDEgAMFEXhgZ7n8pB0L4zqDYp&quot;&gt;&lt;img title=&quot;image&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;image&quot; src=&quot;https://drive.google.com/uc?id=1ll3U4hIWhEMLzqvmYyXUdGRFQzkLz1vJ&quot; width=&quot;754&quot; height=&quot;430&quot; /&gt;&amp;#160;&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/6106639033098407962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/6106639033098407962'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/07/notepad-basic-setting.html' title='Notepad++ 安裝後基本設定'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-1989479143438318676</id><published>2021-03-12T15:29:00.001+08:00</published><updated>2021-03-12T15:34:05.257+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL"/><title type='text'>SQL Server 執行 xp_cmdshell 錯誤排解</title><content type='html'>&lt;h2&gt;問題說明&lt;/h2&gt;  &lt;p&gt;在 SSMS 執行 xp_cmdshell 出現以下的錯誤訊息&lt;/p&gt;  &lt;p&gt;SQL Server blocked access to procedure &#39;sys.xp_cmdshell&#39; of component &#39;xp_cmdshell&#39; because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of &#39;xp_cmdshell&#39; by using sp_configure. For more information about enabling &#39;xp_cmdshell&#39;, search for &#39;xp_cmdshell&#39; in SQL Server Books Online.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;解決方式&lt;/h2&gt;  &lt;p&gt;參考 &lt;a href=&quot;https://www.mssqltips.com/sqlservertip/1020/enabling-xpcmdshell-in-sql-server/&quot;&gt;Enabling xp_cmdshell in SQL Server&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;執行 T-SQL&lt;/p&gt;  &lt;pre&gt;-- this turns on advanced options and is needed to configure xp_cmdshell

exec sp_configure &#39;show advanced options&#39;, &#39;1&#39;

RECONFIGURE

-- this enables xp_cmdshell

exec sp_configure &#39;xp_cmdshell&#39;, &#39;1&#39;

&lt;p&gt;RECONFIGURE&lt;/p&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;或從 SSMS 介面調整設定&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://drive.google.com/uc?id=1jerLAFhz6dwZH2QFjBbKFSmpJ0fJJ7I4&quot;&gt;&lt;img title=&quot;2021-03-12_14-56-36&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;2021-03-12_14-56-36&quot; src=&quot;https://drive.google.com/uc?id=1YUqJR9AOBJ81FQc2mJQckWV6vXUW3p4S&quot; width=&quot;454&quot; height=&quot;490&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://drive.google.com/uc?id=1ZMXO0cO9wizf1acMSAm9CI2QqX4q2g-j&quot;&gt;&lt;img title=&quot;2021-03-12_14-57-00&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;2021-03-12_14-57-00&quot; src=&quot;https://drive.google.com/uc?id=1c9XdbZCdxVvfEALa_Du74LQEiqBBhR_6&quot; width=&quot;765&quot; height=&quot;662&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/1989479143438318676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/1989479143438318676'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/03/sql-server-xpcmdshell.html' title='SQL Server 執行 xp_cmdshell 錯誤排解'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-742621727175398541</id><published>2021-02-03T16:00:00.003+08:00</published><updated>2025-12-15T11:38:55.199+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="VisualStudio"/><category scheme="http://www.blogger.com/atom/ns#" term="VSCode"/><title type='text'>Visual Studio / VSCode 執行命令提示字元</title><content type='html'>&lt;p&gt;&lt;b&gt;Visual Studio 2019&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;開啟 Command Prompt 視窗&lt;/p&gt;  &lt;p&gt;方法 1 : 從選單 &amp;gt;&amp;#160; VIEW &amp;gt;&amp;#160; 點擊 Terminal&lt;/p&gt;  &lt;p&gt;方法 2 : 快捷鍵 CTRL + `&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://drive.google.com/uc?id=1ojtw8R8Ncidtnsq4P2bCI9a8jIHdx0-z&quot;&gt;&lt;img title=&quot;image001&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;image001&quot; src=&quot;https://drive.google.com/uc?id=1Z-QQwWhoSxONW0539fuM3lVOqHB5ZFPG&quot; width=&quot;710&quot; height=&quot;301&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;調整字型大小&lt;/p&gt;  &lt;p&gt;從選單 &amp;gt; TOOL &amp;gt; 點擊 Option &amp;gt; Environment &amp;gt; Fonts and Colors &lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://drive.google.com/uc?id=1_D2qhdVqXZqRPbPXnSnf6xi_UuUwkQ9-&quot;&gt;&lt;img title=&quot;image002&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;image002&quot; src=&quot;https://drive.google.com/uc?id=18OfFBkLmfqIPC6-T0kE1nDrcvJevtYeB&quot; width=&quot;895&quot; height=&quot;557&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;b&gt;VSCode&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;開啟 Command Prompt 視窗&lt;/p&gt;  &lt;p&gt;方法 1 : 從選單 &amp;gt;&amp;#160; VIEW &amp;gt;&amp;#160; 點擊 Terminal&lt;/p&gt;  &lt;p&gt;方法 2 : 快捷鍵 CTRL + `&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;https://drive.google.com/uc?id=1-Hm74vcXfTWHtHNV9oxj5e0m1iYJpXZk&quot;&gt;&lt;img title=&quot;image003&quot; style=&quot;display: inline; background-image: none;&quot; border=&quot;0&quot; alt=&quot;image003&quot; src=&quot;https://drive.google.com/uc?id=1VN-Z06rt-ImYpacoej6VESkvK02e8PhH&quot; width=&quot;825&quot; height=&quot;238&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;調整字型大小&lt;/p&gt;  &lt;p&gt;快捷键：&lt;/p&gt;  &lt;p&gt;放大：Ctrl + =&lt;/p&gt;  &lt;p&gt;缩小：Ctrl + -&lt;/p&gt;  &lt;p&gt;復原：Ctrl + NumPad0&lt;/p&gt;  &lt;hr /&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/742621727175398541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/742621727175398541'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/02/command-prompt-in-visual-studio-vscode.html' title='Visual Studio / VSCode 執行命令提示字元'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-8744145160425812522</id><published>2021-01-04T17:14:00.001+08:00</published><updated>2022-03-28T11:30:19.462+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows"/><title type='text'>Windows 10 調整磁碟區大小</title><content type='html'>&lt;div&gt;在 Windows 10 磁碟管理 / Disk Management 可以直接調整磁碟容量的大小，即使是作業系統磁碟區也可以。&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Disk Management 有兩個功能：&lt;/div&gt;
&lt;div&gt;Extend Volume : 將指定的磁碟區容量變大&lt;/div&gt;
&lt;div&gt;Shrink Volume : 將指定的磁碟區容量變大&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;以下是將C 磁碟區分割為兩個磁碟區後，再回復原狀的步驟。&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;第一個硬碟只有 C 磁碟，欲將其一切為二的作法&lt;/h3&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Step 1 : Shrink Volume 將 C 磁碟區容量變小&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;img height=&quot;638&quot; src=&quot;https://locker.ifttt.com/v2/2554243/1615540489721-5ff76ba9b78334ae/a5d04b369903b596fa66b87d2fc37713d55ba5eb2febe23d1628f8a7a64cbd35/d186b556-e052-57bb-2139-54a4a568d115?sharing_key=febf8abb179306f6497572dc0ed24ba5&quot; style=&quot;--en-naturalheight: 638; --en-naturalwidth: 742;&quot; width=&quot;742&quot; /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Step 2 : 第一個硬碟剩餘的容量，新增磁碟代號&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;img height=&quot;638&quot; src=&quot;https://locker.ifttt.com/v2/2554243/1615540490663-a3bbdd4bdb7b63ac/8707bcfd556b64c0b3ce70291c9fe3faad5dc38c46e4852f1ea3295bda33269b/6a8c0db9-6dee-1f69-a528-5a2625545cc4?sharing_key=a103b68dba6b8c26afe432a491a5be6c&quot; style=&quot;--en-naturalheight: 638; --en-naturalwidth: 774;&quot; width=&quot;774&quot; /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;完成，第一個硬碟有 C 磁碟區與 Z 磁碟區&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;img height=&quot;638&quot; src=&quot;https://locker.ifttt.com/v2/2554243/1615540491549-1337b2043412941b/9907771b22778ba1ca20bf8b2a48b51df3485e6bdcebe326d295ac3671d96326/8e4bf8f6-85f9-5f66-a8a9-07e5cdc0b8db?sharing_key=36c1138bc75bb93363f736f1d186b328&quot; style=&quot;--en-naturalheight: 638; --en-naturalwidth: 774;&quot; width=&quot;774&quot; /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h3&gt;第一個硬碟有 C , Z 兩個磁碟區，欲將其合併為一個的作法&lt;/h3&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Step 1 : 刪除 Z 磁碟區&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;img height=&quot;638&quot; src=&quot;https://locker.ifttt.com/v2/2554243/1615540492438-190e81cdb2321ba1/03de25556f55e5278fc82d257f9352e3a24935b6ad08ecaabb14bb9a76e5e8ca/34313b87-7922-4068-aefd-d185cf087d6f?sharing_key=6931fbb91641be58e5440a0010a9773a&quot; style=&quot;--en-naturalheight: 638; --en-naturalwidth: 774;&quot; width=&quot;774&quot; /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Step 2 :&amp;nbsp; 將 C 磁碟區容量變大&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;img height=&quot;638&quot; src=&quot;https://locker.ifttt.com/v2/2554243/1615540493257-ffe07eacdc479d79/00608ef1a75208ea2930ace68ae523e5d8fbac35fd90fa77973846db6e650243/6c981c17-267a-417c-554e-e06aa1ef8e73?sharing_key=b8c717cc5c17ecd25bb5e07c23886a7b&quot; style=&quot;--en-naturalheight: 638; --en-naturalwidth: 774;&quot; width=&quot;774&quot; /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;完成，第一個硬碟回復原狀，只剩 C 磁碟區&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;img height=&quot;597&quot; src=&quot;https://locker.ifttt.com/v2/2554243/1615540494063-0a170ee040c9f232/df209a7021d3341ee99fbf413a8b6a2a901c5557187f6bfd5ab7c0283ad0240e/1b41bdab-3fdd-4d01-382b-753928a3b738?sharing_key=dfe1d07d980195086d6138ae4eb462a2&quot; style=&quot;--en-naturalheight: 597; --en-naturalwidth: 754;&quot; width=&quot;754&quot; /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/8744145160425812522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/8744145160425812522'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/03/windows-10.html' title='Windows 10 調整磁碟區大小'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-4070960783773064967</id><published>2020-12-23T17:18:00.001+08:00</published><updated>2021-03-12T17:43:47.586+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="網路應用"/><title type='text'>Hexo 架設部落格</title><content type='html'>&lt;div&gt;開站第一篇先介紹這個網站建置的方式，這是透過 &lt;a href=&quot;https://hexo.io/zh-tw/docs/index.html&quot;&gt;Hexo&lt;/a&gt; 產生靜態網頁，發行到 GitHub 網站上。&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Hexo 是一個產生靜態網頁工具程式，以 Makedown 語法撰寫文章內容，可以在本機端產生網頁與瀏覽，一鍵發行到 GitHub 上。&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;目前會在 Evernote 撰寫文章，使用 VSCode 來調整 Makedown 語法與執行 Hexo 指令。&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;span style=&quot;color:rgb(24, 133, 226);&quot;&gt;安裝與使用步驟&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;檢查本機環境&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;node -v&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;git version&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;建議使用 Node.js 10.0 以上版本，git&amp;nbsp; 2.2 以上版本&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;安裝 hexo 命令&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;npm install -g hexo-cli&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;建立目錄 init&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo init test&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;產生網站頁面 generate&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo g&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;啟動網站 server&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo s&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;瀏覽本機網站&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://localhost:4000&quot; rev=&quot;en_rl_none&quot;&gt;http://localhost:4000&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;新增文章 new&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo new post &quot;Post Title&quot;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;也可以簡化&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo new &quot;Post Title&quot;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;每次增修檔案或內容，均需要再產生一次才能瀏覽&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo g&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;瀏覽新產生的文章&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://localhost:4000/2020/12/24/Creat-blog-by-Hexo&quot;&gt;http://localhost:4000/2020/12/24/Creat-blog-by-Hexo&lt;/a&gt;/&lt;/div&gt;
&lt;div&gt;(網址中有包含今天日期)&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;新增草稿文章 new draft&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo new draft &quot;Draft Title&quot;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;草稿不能瀏覽&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;新增頁面 new page&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo new page &quot;Page Title&quot;&lt;/div&gt;
&lt;div&gt;hexo g&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;瀏覽新產生的頁面&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://localhost:4000/Page-Title&quot; rev=&quot;en_rl_none&quot;&gt;http://localhost:4000/Page-Title&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;安裝 Git 部署套件&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;npm install hexo-deployer-git --save&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;部署到 Github&lt;/div&gt;
&lt;div&gt;修改 _config.yml 發行的網址，取代下面最後一行&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;# Deployment&lt;/div&gt;
&lt;div&gt;## Docs: https://ift.tt/3ey9tMW&lt;/div&gt;
&lt;div&gt;deploy:&lt;/div&gt;
&lt;div&gt;&amp;nbsp; type: git&lt;/div&gt;
&lt;div&gt;&amp;nbsp; repo: https://ift.tt/3bDuzri&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;執行部署&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo d&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;產生完成即部署網站&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;hexo g -d&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;瀏覽 GitHub 的網站&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://blog.robinks.net&quot; rev=&quot;en_rl_none&quot;&gt;https://blog.robinks.net&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;span style=&quot;color:rgb(24, 133, 226);&quot;&gt;切換主題&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;所有主題 &lt;a href=&quot;https://hexo.io/themes&quot;&gt;https://hexo.io/themes&lt;/a&gt;/&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;不錯的主題&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://github.com/theme-kaze/hexo-theme-Kaze&quot;&gt;https://github.com/theme-kaze/hexo-theme-Kaze&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://github.com/zhwangart/hexo-theme-ocean&quot;&gt;https://github.com/zhwangart/hexo-theme-ocean&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;切換主題步驟&lt;/div&gt;
&lt;div&gt;&lt;a style=&quot;--en-preferPlainlink:true;&quot; href=&quot;https://www.youtube.com/watch?v=5ROIU_9dYe4&amp;amp;feature=emb_logo&quot; rev=&quot;en_rl_none&quot;&gt;https://www.youtube.com/watch?v=5ROIU_9dYe4&amp;amp;feature=emb_logo&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;安裝到本機&lt;/div&gt;
&lt;div style=&#39;--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;&#39;&gt;
&lt;div&gt;git clone https://ift.tt/3laOqRV ./hexo-huweihuang&lt;/div&gt;
&lt;div&gt;cd hexo-huweihuang&lt;/div&gt;
&lt;div&gt;npm install&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;span style=&quot;color:rgb(24, 133, 226);&quot;&gt;線上教學&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;Hexo教程第一期 简介&lt;/div&gt;
&lt;div&gt;&lt;a style=&quot;--en-preferPlainlink:true;&quot; href=&quot;https://youtu.be/PsXWbI2Mqu0&quot; rev=&quot;en_rl_none&quot;&gt;https://youtu.be/PsXWbI2Mqu0&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Hexo教程第二期 安装与使用&lt;/div&gt;
&lt;div&gt;&lt;a style=&quot;--en-preferPlainlink:true;&quot; href=&quot;https://youtu.be/xvIRGmKWpFM&quot; rev=&quot;en_rl_none&quot;&gt;https://youtu.be/xvIRGmKWpFM&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Hexo教程第三期 写作&lt;/div&gt;
&lt;div&gt;&lt;a style=&quot;--en-preferPlainlink:true;&quot; href=&quot;https://youtu.be/HLJ9jJy7CMg&quot; rev=&quot;en_rl_none&quot;&gt;https://youtu.be/HLJ9jJy7CMg&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Hexo教程第四期 Front Matter&lt;/div&gt;
&lt;div&gt;&lt;a style=&quot;--en-preferPlainlink:true;&quot; href=&quot;https://youtu.be/Rl48Yk4A_V8&quot; rev=&quot;en_rl_none&quot;&gt;https://youtu.be/Rl48Yk4A_V8&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Hexo教程第五期 配置文件&lt;/div&gt;
&lt;div&gt;&lt;a style=&quot;--en-preferPlainlink:true;&quot; href=&quot;https://youtu.be/A0Enyn70jKU&quot; rev=&quot;en_rl_none&quot;&gt;https://youtu.be/A0Enyn70jKU&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Hexo教程第六期 命令&lt;/div&gt;
&lt;div&gt;&lt;a style=&quot;--en-preferPlainlink:true;&quot; href=&quot;https://youtu.be/mgdXi5npArQ&quot; rev=&quot;en_rl_none&quot;&gt;https://youtu.be/mgdXi5npArQ&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;Hexo教程第七期 部署&lt;/div&gt;
&lt;div&gt;&lt;a style=&quot;--en-preferPlainlink:true;&quot; href=&quot;https://youtu.be/B0yVJ46CTR8&quot; rev=&quot;en_rl_none&quot;&gt;https://youtu.be/B0yVJ46CTR8&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;span style=&quot;color:rgb(24, 133, 226);&quot;&gt;Hexo 說明文件&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;https://hexo.io/zh-tw/docs/index.html&quot;&gt;https://hexo.io/zh-tw/docs/index.html&lt;/a&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/4070960783773064967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/4070960783773064967'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2021/03/copy-of-hexo.html' title='Hexo 架設部落格'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-5830260645568410464</id><published>2020-08-30T11:33:00.002+08:00</published><updated>2021-03-12T17:43:13.437+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Android-App"/><title type='text'>還原手機已刪除的照片 Recovery Deleted Photo on Phone</title><content type='html'>&lt;p&gt;手機相片刪除後，可以試著透過&amp;quot;手機相片還原&amp;quot; App 找回來，測試幾款 App 後，以這款 App - Photo Recovery App, Deleted video recovery 為例，圖解找回刪除的照片。&lt;/p&gt;  &lt;a href=&quot;http://note.robinks.net/2020/08/recovery-deleted-photo-on-phone.html#more&quot;&gt;閱讀更多 »&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/5830260645568410464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/5830260645568410464'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2020/08/recovery-deleted-photo-on-phone.html' title='還原手機已刪除的照片 Recovery Deleted Photo on Phone'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-6237541007478532260</id><published>2020-02-27T12:14:00.001+08:00</published><updated>2020-02-27T12:17:35.817+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Google"/><title type='text'>在 .NET 中開始使用 Google Drive API</title><content type='html'>以 .NET 程式開發 Google Drive APIs 應用，事前準備工作有：&lt;br&gt;
&lt;ol&gt;
&lt;li&gt; 建立 APIs 專案&lt;/li&gt;
&lt;li&gt;啟用 Google Drive API&lt;/li&gt;
&lt;li&gt;輸入 OAuch 授權時顯示的 Application Name&lt;/li&gt;
&lt;li&gt;建立並下載 Client Secrets 檔案&lt;/li&gt;
&lt;/ol&gt;
&lt;a href=&quot;http://note.robinks.net/2020/02/get-started-with-google-drive-api-in.html#more&quot;&gt;閱讀更多 »&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/6237541007478532260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/6237541007478532260'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2020/02/get-started-with-google-drive-api-in.html' title='在 .NET 中開始使用 Google Drive API'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-4540867480132236179</id><published>2020-01-17T18:18:00.001+08:00</published><updated>2020-01-17T18:18:16.016+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><category scheme="http://www.blogger.com/atom/ns#" term="VisualStudio"/><title type='text'>VS 資料庫專案發行到不同定序的 SQL Server</title><content type='html'>&lt;p&gt;先說明一下我的 Visual Studio 資料庫專案開發流程，區分三階段：&lt;/p&gt;  &lt;p&gt;1 資料庫設計與程序開發&lt;/p&gt;  &lt;p&gt;我直接在開發資料庫上變更資料表結構與撰寫相關程序 (預存程序、觸發、方法...)&lt;/p&gt;  &lt;p&gt;2 匯入原始碼&lt;/p&gt;  &lt;p&gt;使用 Visual Studio 資料庫專案，從開發資料庫將所有資料庫結構、觸發、預存程序，方法...等，&lt;/p&gt;  &lt;p&gt;透過 Schema Compare 比對匯入 Visual Studio 專案。&lt;/p&gt;  &lt;p&gt;3 資料庫發行 Publish DataBase &lt;/p&gt;  &lt;p&gt;資料庫發行在 Visual Studio 是將原始碼與發行資料庫作比對後，可以產生語法或直接更新資料。&lt;/p&gt;  &lt;a href=&quot;http://note.robinks.net/2020/01/vs-sql-server.html#more&quot;&gt;閱讀更多 »&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/4540867480132236179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/4540867480132236179'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2020/01/vs-sql-server.html' title='VS 資料庫專案發行到不同定序的 SQL Server'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-2134076797847686679</id><published>2019-09-05T12:31:00.001+08:00</published><updated>2019-09-05T14:41:37.395+08:00</updated><title type='text'>SYM FNX 125 購車贈送的 307P 防水騎士後背包</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEw7cZ7BbpRX78lHbry9ka52iGId3CU5H7BnpdupA1orr-j7s6_AXD-DlZDo_qFgcjYO5b_L126k6Qp3-2oiN0KHRAS5rTVMY62QfrKiQ8GwNz-bGwRwILkeYOvBKGOx-i3cWN5qagLh2u/s1600/IMG20190905084435.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1200&quot; data-original-width=&quot;1600&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEw7cZ7BbpRX78lHbry9ka52iGId3CU5H7BnpdupA1orr-j7s6_AXD-DlZDo_qFgcjYO5b_L126k6Qp3-2oiN0KHRAS5rTVMY62QfrKiQ8GwNz-bGwRwILkeYOvBKGOx-i3cWN5qagLh2u/s1600/IMG20190905084435.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
2019年 9 月份購買 SYM FNX 125，另贈送一個 307P 防水騎士後背包，特別是這背包上有印 FNX x JET S 的字樣，FNX 與 JET 的車主會感覺很酷 !!&lt;br&gt;
以下是這個包的簡單開箱照。&lt;br&gt;
&lt;a href=&quot;http://note.robinks.net/2019/09/sym-fnx-125-307p.html#more&quot;&gt;閱讀更多 »&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2134076797847686679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2134076797847686679'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2019/09/sym-fnx-125-307p.html' title='SYM FNX 125 購車贈送的 307P 防水騎士後背包'/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEw7cZ7BbpRX78lHbry9ka52iGId3CU5H7BnpdupA1orr-j7s6_AXD-DlZDo_qFgcjYO5b_L126k6Qp3-2oiN0KHRAS5rTVMY62QfrKiQ8GwNz-bGwRwILkeYOvBKGOx-i3cWN5qagLh2u/s72-c/IMG20190905084435.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-9195306398238104023</id><published>2019-08-23T14:26:00.001+08:00</published><updated>2019-09-05T14:35:17.598+08:00</updated><title type='text'>Visual Studio 快捷鍵中使用數字鍵盤的點 </title><content type='html'>Visual Studio Tips 重構的快捷鍵是  Ctrl+.&lt;br&gt;
&lt;br&gt;
但預設狀況下 [Ctrl] + 數字鍵盤中的 [.] 是無效的，如下圖右方的 [.] 鍵。&lt;br&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX3Y1sfZV4Z3HofRnsbdvNVdHnk8vY-4jPxCeS9spRD8W99QBZmJKrTaKwpUoP5XqNe5eJVg7-rTqsQEvJovBirIHDRSOn-wTpwD-SlVUwFpiXdkn5DsAQYBufq82e7s8pQQYq2dQJ3UeU/s1600/1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1201&quot; data-original-width=&quot;1600&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX3Y1sfZV4Z3HofRnsbdvNVdHnk8vY-4jPxCeS9spRD8W99QBZmJKrTaKwpUoP5XqNe5eJVg7-rTqsQEvJovBirIHDRSOn-wTpwD-SlVUwFpiXdkn5DsAQYBufq82e7s8pQQYq2dQJ3UeU/s1600/1.jpg&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://note.robinks.net/2019/08/ctrl-dot-with-numpad-keyboard-with.html#more&quot;&gt;閱讀更多 »&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/9195306398238104023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/9195306398238104023'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2019/08/ctrl-dot-with-numpad-keyboard-with.html' title='Visual Studio 快捷鍵中使用數字鍵盤的點 '/><author><name>Robin 李瑞彬</name><uri>http://www.blogger.com/profile/12099030895162332774</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtFuUiUQFKlK0nunxU0a5WLq8CrALLTplfsQ0_GDnAfd2jS_dx4lqz1XcvI7VNObI-JPL6JQDi6IgW4xyvo7fwp3VyzS9SOrxXwcgJr0xkXy_4u_gHcIMiBUs5rDlzxJk/s220/IMG_20180124_232337_560.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX3Y1sfZV4Z3HofRnsbdvNVdHnk8vY-4jPxCeS9spRD8W99QBZmJKrTaKwpUoP5XqNe5eJVg7-rTqsQEvJovBirIHDRSOn-wTpwD-SlVUwFpiXdkn5DsAQYBufq82e7s8pQQYq2dQJ3UeU/s72-c/1.jpg" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-7211467510649487821</id><published>2019-08-02T08:12:00.002+08:00</published><updated>2019-09-05T14:36:06.492+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blazor"/><title type='text'>Visual Studio 2019 設定使用 ASP.NET Blazor Core Blazor 專案</title><content type='html'>&lt;div style=&quot;box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Roboto, Oxygen, Ubuntu, Cantarell, &amp;quot;Fira Sans&amp;quot;, &amp;quot;Droid Sans&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px; padding: 0px;&quot;&gt;
&lt;div style=&quot;box-sizing: border-box; margin: 0px; padding: 0px;&quot;&gt;
&lt;br&gt;
&lt;div style=&quot;-en-clipboard: true;&quot;&gt;
&lt;div style=&quot;-en-clipboard: true;&quot;&gt;
&lt;div&gt;
本文介紹在 Visual Studio 2019 中建立 Blazor App 的開發環境需要的準備步驟。&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;環境準備&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
1. Visual Studio 2019 設定使用 Preview SDK&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
由於 .NET Core 目前是屬於 Preview 版本，需要在 Visual Studio 設定可使用 Preview .NET Core SDK&lt;/div&gt;
&lt;div&gt;
設定步驟：&lt;/div&gt;
&lt;div&gt;
開啟 Visual Studio &amp;gt; 選單 &amp;gt; Tools &amp;gt; Option &amp;gt; Environment &amp;gt; Preview Features&lt;/div&gt;
&lt;div&gt;
選取 [ Use previews of the .NET Core SDK ]&lt;/div&gt;
&lt;div&gt;
如下圖&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVFX_YqgvVVnHJOVl1YHeflDCUmtYqrITlNlaPAsuDJWYjYUByEavHHMzgQ3IRzJPsZ9QXBKL3WqYuGjgdHLi7T2CHJ8KAEAuTTEsu91hH_-x_RKLCOnCl42BF6Eqv9B27qkmQxvQFHE90/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;487&quot; data-original-width=&quot;805&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVFX_YqgvVVnHJOVl1YHeflDCUmtYqrITlNlaPAsuDJWYjYUByEavHHMzgQ3IRzJPsZ9QXBKL3WqYuGjgdHLi7T2CHJ8KAEAuTTEsu91hH_-x_RKLCOnCl42BF6Eqv9B27qkmQxvQFHE90/s1600/1.png&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href=&quot;http://note.robinks.net/2019/08/visual-studio-2019-aspnet-blazor-core.html#more&quot;&gt;閱讀更多 »&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/7211467510649487821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/7211467510649487821'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2019/08/visual-studio-2019-aspnet-blazor-core.html' title='Visual Studio 2019 設定使用 ASP.NET Blazor Core Blazor 專案'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVFX_YqgvVVnHJOVl1YHeflDCUmtYqrITlNlaPAsuDJWYjYUByEavHHMzgQ3IRzJPsZ9QXBKL3WqYuGjgdHLi7T2CHJ8KAEAuTTEsu91hH_-x_RKLCOnCl42BF6Eqv9B27qkmQxvQFHE90/s72-c/1.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-1983304288592629691</id><published>2019-07-25T10:08:00.001+08:00</published><updated>2019-07-25T10:09:17.063+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server"/><title type='text'>SSMS 修正斷行符號</title><content type='html'>&lt;div class=&quot;ennote&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;問題描述&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
當預存程序或其他資料庫程式碼中，包含了非 Windows 的斷行符號，&lt;/div&gt;
&lt;div&gt;
在資料庫專案進行比對時，&lt;/div&gt;
&lt;div&gt;
會顯示檔案有差異，但看不到差異的文字內容，&lt;/div&gt;
&lt;div&gt;
更新至原始碼後，&lt;/div&gt;
&lt;div&gt;
再一次比對仍會顯示檔案有差異...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;解決方法&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
SSMS 開啟自動檢查編碼，並進行修正為Windows 斷行符號。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
步驟如下：&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
SSMS 開啟自動檢查編碼&lt;/div&gt;
&lt;div&gt;
1: Open SSMS&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
2: Got to Tools &amp;gt; Options&lt;/div&gt;
&lt;div&gt;
3: Expand the Environment Tab&lt;/div&gt;
&lt;div&gt;
4: Select Documents&amp;gt; Check the option for consistent line ending on load.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJwbKaklp7As_T5x34FpICXkmudcoa5xMnvNb3_IhecxcKVsCBB-7XphvSoDcpnOY1XTi8_tXu2eOeZhABbtmT1e02SP0qvVuYVhW5vmQbtzsF-LQuFSSqhr3zWLWQ78dCVgDXpoF9lwA/s1600/484534d73259d3692102259bf89f20e4-715878.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_6717416545773658066&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJwbKaklp7As_T5x34FpICXkmudcoa5xMnvNb3_IhecxcKVsCBB-7XphvSoDcpnOY1XTi8_tXu2eOeZhABbtmT1e02SP0qvVuYVhW5vmQbtzsF-LQuFSSqhr3zWLWQ78dCVgDXpoF9lwA/s1600/484534d73259d3692102259bf89f20e4-715878.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
開啟有問題的預存程序，&lt;/div&gt;
&lt;div&gt;
會提示有編碼問題，請按下 [Yes] 進行修正&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinbHxgIEafkE5r5L1AxL4AM4SIA0hIsacA-O5zORYPRPmjpI-QvS8qyHaBbjVnQsRUQ5Pt3E2SgNeK5l4SSkCj-slUIm6mS_56AG1PPyJ_SP_620rxKNVgJj3NFqncMf084rB_2jnrXpQv/s1600/4a404bcba06c7382f40ee0f7a1e92886-721140.png&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_6717416570534648994&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinbHxgIEafkE5r5L1AxL4AM4SIA0hIsacA-O5zORYPRPmjpI-QvS8qyHaBbjVnQsRUQ5Pt3E2SgNeK5l4SSkCj-slUIm6mS_56AG1PPyJ_SP_620rxKNVgJj3NFqncMf084rB_2jnrXpQv/s1600/4a404bcba06c7382f40ee0f7a1e92886-721140.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;hr /&gt;
參考資料&lt;/div&gt;
&lt;div&gt;
CRLF跟LF之區別 --- 隱形的 bug&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://violin-tao.blogspot.com/2016/05/crlflf-bug.html&quot;&gt;http://violin-tao.blogspot.com/2016/05/crlflf-bug.html&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Git 在 Windows 平台處理斷行字元 (CRLF) 的注意事項&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blog.miniasp.com/post/2013/09/15/Git-for-Windows-Line-Ending-Conversion-Notes&quot;&gt;https://blog.miniasp.com/post/2013/09/15/Git-for-Windows-Line-Ending-Conversion-Notes&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/1983304288592629691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/1983304288592629691'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2019/07/ssms-normalize-line-ending.html' title='SSMS 修正斷行符號'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJwbKaklp7As_T5x34FpICXkmudcoa5xMnvNb3_IhecxcKVsCBB-7XphvSoDcpnOY1XTi8_tXu2eOeZhABbtmT1e02SP0qvVuYVhW5vmQbtzsF-LQuFSSqhr3zWLWQ78dCVgDXpoF9lwA/s72-c/484534d73259d3692102259bf89f20e4-715878.png" height="72" width="72"/></entry><entry><id>tag:blogger.com,1999:blog-7034083642113352813.post-2640926779852092803</id><published>2019-07-21T09:59:00.000+08:00</published><updated>2019-07-21T09:59:44.677+08:00</updated><title type='text'>Slack 訊息與 Trello 工作有官方整合 App</title><content type='html'>&lt;div class=&quot;ennote&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;b&gt;Slack -&amp;gt; Trello&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
在 Slack 中直接新增與編輯 Trello 工作卡&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://slack.com/apps/A074YH40Z-trello&quot;&gt;https://slack.com/apps/A074YH40Z-trello&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://help.trello.com/article/1049-slack-app&quot;&gt;https://help.trello.com/article/1049-slack-app&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6a74ilCPfTOUeKkMaER3yKO6akZQiaj3gt2GR3ymPDKlYRhKcHy7q3b8e4n1V5HDtHAKWR4VP7GahMZ8fBSoF0RYAxIf6tFGd5Xsy_Q4QykmKSJnVUxvGMQH00XDFCiuq-4LFmHYc_jxk/s1600/b75e12a537ce5e155727ea42e77d01bc-729045.gif&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;250&quot; id=&quot;BLOGGER_PHOTO_ID_6715929691752405794&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6a74ilCPfTOUeKkMaER3yKO6akZQiaj3gt2GR3ymPDKlYRhKcHy7q3b8e4n1V5HDtHAKWR4VP7GahMZ8fBSoF0RYAxIf6tFGd5Xsy_Q4QykmKSJnVUxvGMQH00XDFCiuq-4LFmHYc_jxk/s400/b75e12a537ce5e155727ea42e77d01bc-729045.gif&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;Trello -&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Slack&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
編輯 Trello 工作卡時，同步訊息到 Slack&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://trello.com/power-ups/55a5d917446f51777421000a/slack&quot;&gt;https://trello.com/power-ups/55a5d917446f51777421000a/slack&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTns2VofydTKW1GOOExA94ObZSHOZqd1yw3KYD5xsU_VpCfrFa7rAjdvSo3wajRPF4CKVad0GaHBMLKYx_8mGRX6AWYQNK7uXaNol9ugQcyO46_cidcmaUXEau7rVkedEJdHQktPoYD7J6/s1600/db6aa637523349dd4cb72cd31d7c1e8d-734000.jpeg&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; height=&quot;410&quot; id=&quot;BLOGGER_PHOTO_ID_6715929709116408562&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTns2VofydTKW1GOOExA94ObZSHOZqd1yw3KYD5xsU_VpCfrFa7rAjdvSo3wajRPF4CKVad0GaHBMLKYx_8mGRX6AWYQNK7uXaNol9ugQcyO46_cidcmaUXEau7rVkedEJdHQktPoYD7J6/s640/db6aa637523349dd4cb72cd31d7c1e8d-734000.jpeg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; style=&quot;border-top: 1px solid #e6e6e6; margin-bottom: 16px; margin-top: 32px; padding-top: 16px; width: 100%px;&quot;&gt;   &lt;tbody&gt;
&lt;tr&gt;    &lt;td style=&quot;color: #333333; font-family: &amp;quot;helvetica&amp;quot; , &amp;quot;arial&amp;quot; , sans-serif; font-size: 13px; line-height: 16px; text-align: left;&quot;&gt;Evernote helps you remember everything and get organized effortlessly. &lt;a href=&quot;https://www.evernote.com/getit?utm_source=service&amp;amp;utm_medium=email&amp;amp;utm_content=emailNote&amp;amp;email_name=emailNote&amp;amp;email_guid=6675084b-2087-48be-afb6-9acf667f1d87&amp;amp;email_link=download_app&quot; style=&quot;color: #5fb336; text-decoration: none;&quot; target=&quot;_blank&quot;&gt;Download Evernote&lt;/a&gt;.    &lt;/td&gt;   &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2640926779852092803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7034083642113352813/posts/default/2640926779852092803'/><link rel='alternate' type='text/html' href='http://note.robinks.net/2019/07/slack-sync-trello-official-app.html' title='Slack 訊息與 Trello 工作有官方整合 App'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6a74ilCPfTOUeKkMaER3yKO6akZQiaj3gt2GR3ymPDKlYRhKcHy7q3b8e4n1V5HDtHAKWR4VP7GahMZ8fBSoF0RYAxIf6tFGd5Xsy_Q4QykmKSJnVUxvGMQH00XDFCiuq-4LFmHYc_jxk/s72-c/b75e12a537ce5e155727ea42e77d01bc-729045.gif" height="72" width="72"/></entry></feed>