tag:blogger.com,1999:blog-70340836421133528132024-02-07T14:13:23.650+08:00RobinNotes這是程式開發、資料庫設計及其他生產力工具的使用筆記分享Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comBlogger185125tag:blogger.com,1999:blog-7034083642113352813.post-60243051736565127302022-07-29T14:42:00.006+08:002022-07-29T15:15:11.555+08:00MAUI 發行 Android 產生 APK/AAB 檔案<div style="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;"></div> <div class="ennote"><div><span style="font-size: 16px;">在 Visual Studio 2022 Preview 新增任一 MAUI 專案,包括:</span></div><div><span style="font-size: 16px;">.NET MAUI App</span></div><div><span style="font-size: 16px;">.NET MAUI Blazor</span></div><div><span style="font-size: 16px;"><span style="--en-markholder: true;"><br /></span></span></div><div><span style="font-size: 16px;">以下說明三個步驟產生 APK/AAB 檔案。</span></div><div><span style="font-size: 16px;"><span style="--en-markholder: true;"><br /></span></span></div><h3>A. 建立 Key Store 檔案</h3><div><span style="font-size: 16px;"><span style="--en-markholder: true;"><br /></span></span></div><div><span style="font-size: 16px;">選單 > VIEW > Terminal > Developer PowerShell</span></div><div><br /></div><div style="--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, "Courier New", monospace; font-size: 12px; padding: 8px;"><div>keytool -genkey -v -keystore myapp.keystore -alias key -keyalg RSA -keysize 2048 -validity 10000</div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfE5Abbn2I5uHCxlY09e4Vsm4_6pvPOpmIIYb-Kbz49Hsv3TCRRlXgznwvOi8ik0Njo_bSa2aLgU40HZIlWlnV9F7EJozFSmasN2JZCyBN2JUZCl9esyN5ASB-XuLFUG_R4EYnDlyjpdFrgFbSiJlwCC-GsqKz08zTn0P-JdDMXW3bYN-LvAFr5Ut4rA/s1301/maui-publish-android-apkaab.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="661" data-original-width="1301" height="325" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfE5Abbn2I5uHCxlY09e4Vsm4_6pvPOpmIIYb-Kbz49Hsv3TCRRlXgznwvOi8ik0Njo_bSa2aLgU40HZIlWlnV9F7EJozFSmasN2JZCyBN2JUZCl9esyN5ASB-XuLFUG_R4EYnDlyjpdFrgFbSiJlwCC-GsqKz08zTn0P-JdDMXW3bYN-LvAFr5Ut4rA/w640-h325/maui-publish-android-apkaab.png" width="640" /></a></div><br /><div><br /></div><div>檔案總管可看到 myapp.keystore 檔案</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg6WJxckcMpDNraayzcdf7CbkuoS_D5oQIkY8JL96Ailgeky4HQldI4cTUCOzeGu6JYusyxYlcdgqk2SzROnlapaSYeLnPwRO7Xt950hK67Je28mHliERM6eCnJ-CM5vR_42qW5rBscbP78ae0W1w1pG1d9WCA2DCvc-6tDahQ1-22l9zQbLqrPWsGZdw"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7125679179921536162" src="https://blogger.googleusercontent.com/img/a/AVvXsEg6WJxckcMpDNraayzcdf7CbkuoS_D5oQIkY8JL96Ailgeky4HQldI4cTUCOzeGu6JYusyxYlcdgqk2SzROnlapaSYeLnPwRO7Xt950hK67Je28mHliERM6eCnJ-CM5vR_42qW5rBscbP78ae0W1w1pG1d9WCA2DCvc-6tDahQ1-22l9zQbLqrPWsGZdw=s320" /></a><h3><br /></h3><h3>B. 專案設定 Keystore </h3><div>(1) 專案檔 > 右鍵 > Property > Android > Package Signing</div><div>(2) 勾選 Sign the .APK file using the following keystore details.</div><div>(3) 瀏覽選取上述 keystore 檔案</div><div>(4) 輸入密碼</div><div>(5) 輸入別名</div><div>(6) 輸入密碼</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgF450JDx6RIvbmBu8RMbwNzpKpSYSy3W4w5PZNnKI8u0uB_IG6p-4WZ2rMQ6YXWLY5skdoXsV3UbkPw4IBdcLiM1Z1uL6qRB3fAQ3B22yjO-o-7GLyEhVC7dZbJgwdE88E7flH0ngTuQQRoylv_brRHF2Et8B7iCdSIHjTFN7uKTnd2L_z4Xm3gFI30Q"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7125679180301112098" src="https://blogger.googleusercontent.com/img/a/AVvXsEgF450JDx6RIvbmBu8RMbwNzpKpSYSy3W4w5PZNnKI8u0uB_IG6p-4WZ2rMQ6YXWLY5skdoXsV3UbkPw4IBdcLiM1Z1uL6qRB3fAQ3B22yjO-o-7GLyEhVC7dZbJgwdE88E7flH0ngTuQQRoylv_brRHF2Et8B7iCdSIHjTFN7uKTnd2L_z4Xm3gFI30Q=s320" /></a><div><br /></div><h3>C. 發行 App </h3><div>(1) 設定方案組態 Release</div><div>(2) 模擬器選擇 Android</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhSWL9iSi2znTsD5RW6Z0T5uVSfxWp-eagDFNffVlnLYjvCZdGzaW2qp3zbLUNJWxO_l1bPDJLfX8zNszatBqize3_CcwGiRci9ZS8zdlVkz4ZpjiHw53zWEcg8iGX4PNE1-1U8gCZGq7Fe527TdVqvOljg5r_xLZ9qeZXr5Ib_ADAD8ojVcJ52PNmRxg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7125679188737642994" src="https://blogger.googleusercontent.com/img/a/AVvXsEhSWL9iSi2znTsD5RW6Z0T5uVSfxWp-eagDFNffVlnLYjvCZdGzaW2qp3zbLUNJWxO_l1bPDJLfX8zNszatBqize3_CcwGiRci9ZS8zdlVkz4ZpjiHw53zWEcg8iGX4PNE1-1U8gCZGq7Fe527TdVqvOljg5r_xLZ9qeZXr5Ib_ADAD8ojVcJ52PNmRxg=s320" /></a><div><br /></div><div>(3) 專案 > 右鍵 > Publish</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjQMgk0z8eoJ_A127hXVPlNSyACQbr7wOisGnKDG3nygEtBpUP8O9PQ1CQQNMaDkdI8aTHDF7zlRHovRgkiaoEP5N1gJdSnjljsR_SZ6DxrEW5ayl58EDtqdx7RnpfjrOyzz7plnct5NOhM1oX4OH7hFo6vjS2Tlm2v7nRxyqwZBgQDwr-9rYDYMSTpig"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7125679193431162402" src="https://blogger.googleusercontent.com/img/a/AVvXsEjQMgk0z8eoJ_A127hXVPlNSyACQbr7wOisGnKDG3nygEtBpUP8O9PQ1CQQNMaDkdI8aTHDF7zlRHovRgkiaoEP5N1gJdSnjljsR_SZ6DxrEW5ayl58EDtqdx7RnpfjrOyzz7plnct5NOhM1oX4OH7hFo6vjS2Tlm2v7nRxyqwZBgQDwr-9rYDYMSTpig=s320" /></a><div><br /></div><div>完成後,可以在 專案目錄\bin\Release\net6.0-android 目錄下可以看到 AAB 與 APK 檔案。</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEh9hh4IRpf9QtQxvBc9-Vsie2LSacjIAantaJ9bfxTjC_6Gvo4K_iU0SS8dEYkcwZOV_BjpXTDFCTOQcx087-8JtPrT8gfOrYN_SWTE65k-TSIBnZacmdGsXf9fq8P00w7_Xf41SAwEshQE3Cu9NKIKNXAuQW1NrIkFfC5iKEN1B3w8Q-Ih77KMWAfdQg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7125679197126078226" src="https://blogger.googleusercontent.com/img/a/AVvXsEh9hh4IRpf9QtQxvBc9-Vsie2LSacjIAantaJ9bfxTjC_6Gvo4K_iU0SS8dEYkcwZOV_BjpXTDFCTOQcx087-8JtPrT8gfOrYN_SWTE65k-TSIBnZacmdGsXf9fq8P00w7_Xf41SAwEshQE3Cu9NKIKNXAuQW1NrIkFfC5iKEN1B3w8Q-Ih77KMWAfdQg=s320" /></a><div><br /></div><div>***--Signed.aab --> 上架 Google Play 需要上傳這個檔案。</div><div>***--Signed.apk --> 可以提供讓 Android 手機下載,手動安裝 APP。</div><div><br /></div><div><br /></div><hr /><h2 style="text-align: left;">參考連結</h2><div>文章 : <a href="http://t.mail-svc.evernote.com/f/a/CBYRgudYoS4dmNB_iJwP2Q~~/AADd_wA~/RgRkxgRxP0RIaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvZG90bmV0L21hdWkvYW5kcm9pZC9kZXBsb3ltZW50L292ZXJ2aWV3VwNzcGNCCmLgcX_jYiBgiCNSIHJvYmlubGkxOTczLmV2ZXJub3RlQGJsb2dnZXIuY29tWAQAAAAG" rev="en_rl_none">Publish a .NET MAUI app for Android - .NET MAUI | Microsoft Docs</a></div><div><br /></div><div>影片 : <a href="http://t.mail-svc.evernote.com/f/a/o_sLYGWkfZVAFRJFXa7RiA~~/AADd_wA~/RgRkxgRxP0QcaHR0cHM6Ly95b3V0dS5iZS9qZlNWYl9SUjdYMFcDc3BjQgpi4HF_42IgYIgjUiByb2JpbmxpMTk3My5ldmVybm90ZUBibG9nZ2VyLmNvbVgEAAAABg~~" rev="en_rl_none">Create a Signed and Publishable .NET MAUI Android App in VS2022</a></div><div><img src="https://www.evernote.com/etpa/bb06bb48-21c0-4de5-a926-eb44c06357c5" style="height: 1px; width: 1px;" /> <img alt="" border="0" height="1" src="http://t.mail-svc.evernote.com/q/cD88_f72_S85T30KgP_KUw~~/AADd_wA~/RgRkxgRxPlcDc3BjQgpi4HF_42IgYIgjUiByb2JpbmxpMTk3My5ldmVybm90ZUBibG9nZ2VyLmNvbVgEAAAABg~~" width="1" /></div></div>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-83658987958707147142022-07-22T14:33:00.003+08:002022-07-29T15:17:26.972+08:00MAUI 更換應用程式圖示與轉場圖片<div style="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;"></div> <div class="ennote"><div><br /></div><div>MAUI 預設的應用程式圖示 (App Icon) 與轉場圖片 (Splash) ,如下兩圖:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCa2_IqNDIIV6Gs5R_8BVnoFug8lybZpxmLX4SfVXJinDMtjhokCnDfMNSLX-fDjp1iMmR9U78ZJD6b_4a3OZdxXoIDikh_2g4rbi0v2dAPBkBExsQjUP9CpWGlneaLtBPegTbI4OiBjFLupTAy9Nnjvd0iiAEU596DlrL3IuvzogrH2YrVD7EPit82g/s1602/maui-change-app-icon-splash-images.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1602" data-original-width="1080" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCa2_IqNDIIV6Gs5R_8BVnoFug8lybZpxmLX4SfVXJinDMtjhokCnDfMNSLX-fDjp1iMmR9U78ZJD6b_4a3OZdxXoIDikh_2g4rbi0v2dAPBkBExsQjUP9CpWGlneaLtBPegTbI4OiBjFLupTAy9Nnjvd0iiAEU596DlrL3IuvzogrH2YrVD7EPit82g/w432-h640/maui-change-app-icon-splash-images.png" width="432" /></a></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge5NcASUdaSVMRGIN7OBNOM-eaWtDDsWhLMP0_E6iq_7X-AT1aiHi8GkvZ1e54qvHZHwaVaz3K33_RvlmKl9tBVr17vt7o9Xu1mxolY9w4UPUYdFrZhSjYESljerAk9XeR_0Wz8IdYZrd1she27yAMSmNeYGIPHHceJ753MUPUn-kpvrbZNGcNVdQXFQ/s2340/maui-change-app-icon-splash-images2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2340" data-original-width="1080" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge5NcASUdaSVMRGIN7OBNOM-eaWtDDsWhLMP0_E6iq_7X-AT1aiHi8GkvZ1e54qvHZHwaVaz3K33_RvlmKl9tBVr17vt7o9Xu1mxolY9w4UPUYdFrZhSjYESljerAk9XeR_0Wz8IdYZrd1she27yAMSmNeYGIPHHceJ753MUPUn-kpvrbZNGcNVdQXFQ/w296-h640/maui-change-app-icon-splash-images2.png" width="296" /></a></div><br /><div><br /></div><hr /><div>Visual Studio MAUI 專案檔可以找到對應程式圖示與轉場圖片的 SVG 檔案名稱,最簡易更換圖片的方式,將欲更換的 SVG 檔案 XML 內容直接貼上。</div><ul><li><div>應程式圖示主圖示檔案 \Resources\AppIcon\appiconfg.svg</div></li><li><div>應程式圖示背景檔案 \Resources\AppIcon\appicon.svg</div></li><li><div>轉場圖片檔案 Splash\splash.svg</div></li></ul><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiMqZjQMxZjphMWbwacllpMrtPtykF4yj49mKQHbD1a-t17fvoFCNiuL8UKLpW74zZRkKxAOv4ZkOyhyCuDxwJi85K7jOvDdFgR6epRu-3hu5TPtbrA8v-suL-pntDGnhtyHadh6XSYaYzlvQqqpsmaE1Qg77yFt8a9OTTmFXsqde0nY1YzGECQhrP82Q"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7123080545978534274" src="https://blogger.googleusercontent.com/img/a/AVvXsEiMqZjQMxZjphMWbwacllpMrtPtykF4yj49mKQHbD1a-t17fvoFCNiuL8UKLpW74zZRkKxAOv4ZkOyhyCuDxwJi85K7jOvDdFgR6epRu-3hu5TPtbrA8v-suL-pntDGnhtyHadh6XSYaYzlvQqqpsmaE1Qg77yFt8a9OTTmFXsqde0nY1YzGECQhrP82Q=s320" /></a><div><br /></div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhOU8ppWiUYA3bF47DQZZ_LwhhV1egfz9VMJYtvxfUst07J6V1gkGGSkaESeJSpK1tVtXoM6GfrZFHzZx_495ncPTnw9yI7Fl7iaZuZWF3FgX6uDoaovUA_L7fHwJ8zL9UICTuW0qNxIW6d4O6lYBpe60ks_AmK2lSvqv9dy-SNME4Hgkc9XVr43plzEw"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7123080544790001298" src="https://blogger.googleusercontent.com/img/a/AVvXsEhOU8ppWiUYA3bF47DQZZ_LwhhV1egfz9VMJYtvxfUst07J6V1gkGGSkaESeJSpK1tVtXoM6GfrZFHzZx_495ncPTnw9yI7Fl7iaZuZWF3FgX6uDoaovUA_L7fHwJ8zL9UICTuW0qNxIW6d4O6lYBpe60ks_AmK2lSvqv9dy-SNME4Hgkc9XVr43plzEw=s320" /></a><div><br /></div><div>不建議更換檔案名稱。</div><div>若將原檔案刪除,再新增同檔名的檔案,需要調整各檔案的 Build Action 與 Copy to Output Directory</div><div><br /></div><div>應程式圖示主圖示檔案</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiOezoVf7B8QjxiuKzfGJOUm_63-nAvI13lIrQLIzYYbL5ebHue67qZs4rRDHefBMZp10qaG_zOIcz-7DrhQ4J2W0NuITEy0rfbdj1HYiZL398pNNf9WaQEngP8hWdZacV1pgL1OfLncSsklehPpYnTpMMqPCW2VUJsZHV4H9cJcfMswnSIYtmtbkCoGA"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7123080549281304658" src="https://blogger.googleusercontent.com/img/a/AVvXsEiOezoVf7B8QjxiuKzfGJOUm_63-nAvI13lIrQLIzYYbL5ebHue67qZs4rRDHefBMZp10qaG_zOIcz-7DrhQ4J2W0NuITEy0rfbdj1HYiZL398pNNf9WaQEngP8hWdZacV1pgL1OfLncSsklehPpYnTpMMqPCW2VUJsZHV4H9cJcfMswnSIYtmtbkCoGA=s320" /></a><div><br /></div><div>應程式圖示背景檔案</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhwgoMq5mGmPN4uOiC3GX1d9iGuNYwjJqkYn9FNGKT1A7xVErHuIm2oWik2VPTVygSfMlAV4f3qjLZiV2Ho3qc2tU_JVsiwhu_aLl_nN9RkioaZS0ku1u3rDaSnaqfqyxWdmw_gRG6LFgqgdaLXI7D3RazXvgYq-CcphWPVT56KOFtpqe9Y8WgbjeZSYg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7123080549284139314" src="https://blogger.googleusercontent.com/img/a/AVvXsEhwgoMq5mGmPN4uOiC3GX1d9iGuNYwjJqkYn9FNGKT1A7xVErHuIm2oWik2VPTVygSfMlAV4f3qjLZiV2Ho3qc2tU_JVsiwhu_aLl_nN9RkioaZS0ku1u3rDaSnaqfqyxWdmw_gRG6LFgqgdaLXI7D3RazXvgYq-CcphWPVT56KOFtpqe9Y8WgbjeZSYg=s320" /></a><div><br /></div><div>轉場圖片檔案</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhwwbmH9dMMqwVuuev0GfInxTJ3i1pb_hA_tL0unQHM6EnemIKTGhDl2fKgNrzkOeO2d0tsMYmfGIZinblI-Z4Vh6r7JK-z4fw9lAItg9I7q6bRiEOmg-YjT6a1Ltk_OHyuNqel9S5yS-Qc_RGBVdsJ8q82fFUU3Xhr6o5e_R6D_uVOeY8twCNhjU763w"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7123080553227047074" src="https://blogger.googleusercontent.com/img/a/AVvXsEhwwbmH9dMMqwVuuev0GfInxTJ3i1pb_hA_tL0unQHM6EnemIKTGhDl2fKgNrzkOeO2d0tsMYmfGIZinblI-Z4Vh6r7JK-z4fw9lAItg9I7q6bRiEOmg-YjT6a1Ltk_OHyuNqel9S5yS-Qc_RGBVdsJ8q82fFUU3Xhr6o5e_R6D_uVOeY8twCNhjU763w=s320" /></a><div><br /></div><div>修改後成果</div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj3eEbqGVPv9spJSK1aQwqLhS6bPPG6hntnA1oFIP7VFLOX36qm9zDn65EDPpwz0y7E6IITbmf7I4kiAg042QQJ3PwvABbpFJ3riVcxxjUoaCqz-5N8Ro6nog2KS8XnKT-aaBO67ivfnEIGuMSVz3LZO5thsOvFUCbl3p9ReEyeJ-M6orPlhkz-_ppmgw"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7123080553330761922" src="https://blogger.googleusercontent.com/img/a/AVvXsEj3eEbqGVPv9spJSK1aQwqLhS6bPPG6hntnA1oFIP7VFLOX36qm9zDn65EDPpwz0y7E6IITbmf7I4kiAg042QQJ3PwvABbpFJ3riVcxxjUoaCqz-5N8Ro6nog2KS8XnKT-aaBO67ivfnEIGuMSVz3LZO5thsOvFUCbl3p9ReEyeJ-M6orPlhkz-_ppmgw=s320" /></a><div><br /></div><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjVXNkkB11mhhbPrw5taSE0jv1dT_1IPcp-xrx1xuGLH9xBCC_te28PvAR4g5CJWrbyhLPxiyVzAkqEDvXY0AKxr92NS_t8uUCuLr3btQ4r0H8XxisbFTplPATDp8Qe-k1Axfx9vt_VF7GE1_Xr-VKmto3pdMtNSUFeMvA7Fh5NC5zrKnUoV-EQm0kAXA"><img alt="" border="0" id="BLOGGER_PHOTO_ID_7123080561386310530" src="https://blogger.googleusercontent.com/img/a/AVvXsEjVXNkkB11mhhbPrw5taSE0jv1dT_1IPcp-xrx1xuGLH9xBCC_te28PvAR4g5CJWrbyhLPxiyVzAkqEDvXY0AKxr92NS_t8uUCuLr3btQ4r0H8XxisbFTplPATDp8Qe-k1Axfx9vt_VF7GE1_Xr-VKmto3pdMtNSUFeMvA7Fh5NC5zrKnUoV-EQm0kAXA=s320" /></a><div><br /></div><div><br /></div><div>實作參考原始碼</div><div><a href="http://t.mail-svc.evernote.com/f/a/jfAKI0GnUpmOdAaA7f3-pw~~/AADd_wA~/RgRkvMj9P0Q-aHR0cHM6Ly9naXRodWIuY29tL3JvYmlubGkvTXlCYXNpY0xhYi90cmVlL21haW4vTWF1aUNoYW5nZUljb25XA3NwY0IKYtn9Q9pigG0kdlIgcm9iaW5saTE5NzMuZXZlcm5vdGVAYmxvZ2dlci5jb21YBAAAAAY~" rev="en_rl_none">MyBasicLab/MauiChangeIcon at main · robinli/MyBasicLab (github.com)</a></div><div><br /></div><div>SVG 線上檢視工具程式</div><div><a href="http://t.mail-svc.evernote.com/f/a/48llapN2PqiNpzURvcugYg~~/AADd_wA~/RgRkvMj9P0QaaHR0cHM6Ly93d3cuc3Zndmlld2VyLmRldi9XA3NwY0IKYtn9Q9pigG0kdlIgcm9iaW5saTE5NzMuZXZlcm5vdGVAYmxvZ2dlci5jb21YBAAAAAY~" rev="en_rl_none">SVG Viewer - View, save, and optimize SVGs</a></div><div><br /></div></div> <img src="https://www.evernote.com/etpa/ae4bea82-08c9-4b65-b541-c799b7b8841f" style="height: 1px; width: 1px;" /> <img alt="" border="0" height="1" src="http://t.mail-svc.evernote.com/q/KAgxfxzTUxkhYrWF54Hmfw~~/AADd_wA~/RgRkvMj9PlcDc3BjQgpi2f1D2mKAbSR2UiByb2JpbmxpMTk3My5ldmVybm90ZUBibG9nZ2VyLmNvbVgEAAAABg~~" width="1" /> Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-21739141641899571802022-05-11T10:27:00.017+08:002022-05-12T11:01:56.246+08:00Blazor 發行後用戶端自動更新<p> </p><h1 data-en-clipboard="true" data-pm-slice="1 1 []">前言</h1><div>目前 Blazor 改版發行後,用戶端可能會繼續操作上一版的程式,直到網頁重新整理才能取得新版本程式,由於無法逐一通知使用者改版,最好能自動偵測改版並自動更新。這功能或許未來 Blazor 核心即可解決,在那之前自己先動手改善。</div><div><br /></div><div>[<a href="https://github.com/robinli/BlazorAutoRefreshUpdate" target="_blank">Blazor Auto Refresh Update</a>] 範例提供以下三種 Blazor 型態發行新版程式時,瀏覽器(用戶端)可以自動重新整理網址取得新版程式。</div><ul><li>Blazor Server App</li><li>Blazor WebAssembly App</li><li>Blazor WebAssembly App + PWA</li></ul><div><br /></div><div>主要是參考 <a href="https://blazortrain.com/" target="_blank">Blazor Train</a> 教學影片 [<a href="https://www.youtube.com/watch?v=IdauS04L7H8" target="_blank">Handling App Updates: Carl Franklin's Blazor Train Ep 60</a>],</div><div>將 .NET 5.0 改版為 .NET 6.0,另外 PWA 專案中增加一個訊息畫面。</div><h1><div class="separator" style="clear: both; text-align: center;"><a href="https://i.imgur.com/IR15aLk.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Software Update UI" border="0" data-original-height="306" data-original-width="731" src="https://i.imgur.com/IR15aLk.png" title="Software Update" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div></h1><h1>開發環境</h1><div><ul style="text-align: left;"><li>Visual Studio 2022</li><li>.NET 6.0</li><li>預設的 Blazor 範本</li></ul></div><div><br /></div><h1>追蹤程式碼</h1><div>取得原始碼 [<a href="https://github.com/robinli/BlazorAutoRefreshUpdate" target="_blank">Blazor Auto Refresh Update</a>] 👈GitHub</div><div><br /></div><div>程式碼修改細節,可以透過 Find in Files 輸入: <span data-code="true" style="background-color: #fcff01;">Auto Refresh Update Tip</span></div><div>檢視所有程式碼片段。</div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://i.imgur.com/wzU4sgu.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Find in Files" border="0" data-original-height="442" data-original-width="797" src="https://i.imgur.com/wzU4sgu.png" title="Find in Files" /></a><a href="https://i.imgur.com/wzU4sgu.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a></div><br /></div><div><br /><br /><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://i.imgur.com/6WYaAZ4.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="Key in: Auto Refresh Update Tip" border="0" data-original-height="503" data-original-width="584" src="https://i.imgur.com/6WYaAZ4.png" title="Key in: Auto Refresh Update Tip" /></a></div><br /><div><br /></div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://i.imgur.com/st7s85A.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Find Result" border="0" data-original-height="800" data-original-width="734" src="https://i.imgur.com/st7s85A.png" title="Find Result" /></a></div><br /><div><br /></div><div><br /></div><h1>發行程序</h1><h4 style="text-align: left;">Blazor Server App </h4><div>不用修改任何檔案。</div><div><br /></div><div><br /></div><h4 style="text-align: left;">Blazor WebAssembly App </h4><div>發行新版本需要修改 appsettings.json 版本編號。</div><ul><li>appsettings.json</li><li>Index.razor (非必要)</li></ul><div><br /></div><h4 style="text-align: left;">Blazor WebAssembly App + PWA </h4><div>發行新版本需要修改以下檔案內的版本編號。</div><ul><li>appsettings.json</li><li>Toolbar.razor</li><li>service-worker.published.js</li><li>Index.razor (非必要)</li></ul><div><br /></div><div><br /></div><h1>參考資源</h1><div>Blazor Train 教學影片 [<a href="https://www.youtube.com/watch?v=IdauS04L7H8" target="_blank">Handling App Updates: Carl Franklin's Blazor Train Ep 60</a>] 👈YouTube</div><div><br /></div><div><br /></div>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-11133887229262944212022-01-17T17:04:00.003+08:002022-07-22T14:35:03.352+08:00使用 T-SQL 計算帳齡分析 Aging Analysis Report<h1>需求說明</h1><p>常見帳齡分析的報表例如:客戶帳齡分析、產品庫存呆滯天數分析...等。 </p><p>舉例一組簡化的客戶發票資料,包括單號、日期、金額, </p><p>欲將發票資料依天數組距加總統計,得到客戶帳齡分析, </p><p>如下圖。 </p><p><img src="https://drive.google.com/uc?id=1eAFfeY6iCMcQHqbC1SskQJRDvbpHb4Sa"><br></p><p> <br></p><h1>原始資料 </h1><p>交易資料中必要欄位有: </p><p>一個日期欄位 : 用來計算與指定日期相差幾天 </p><p>一個數值欄位 : 用來各組距彙總時的數值 </p><div style="color:#000000;background-color:#FFFFFF;"><pre><span style="color:#0000FF;">DECLARE</span> @SourceData <span style="color:#0000FF;">AS</span> <span style="color:#0000FF;">TABLE</span>(DOCNO <span style="color:#0000FF;">varchar</span>(16), TRANS_DATE <span style="color:#0000FF;">date</span>, AMOUNT <span style="color:#0000FF;">int</span>)
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> @SourceData(DOCNO, TRANS_DATE, AMOUNT)
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021011501'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-01-15'</span>),AMOUNT=300 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021052601'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-05-26'</span>),AMOUNT=400 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021060701'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-06-07'</span>),AMOUNT=300 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021060801'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-06-08'</span>),AMOUNT=400 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021060901'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-06-09'</span>),AMOUNT=700 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021071001'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-07-10'</span>),AMOUNT=800 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021071101'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-07-11'</span>),AMOUNT=900 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021081201'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-08-12'</span>),AMOUNT=1000 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021081301'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-08-13'</span>),AMOUNT=1100 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021081401'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-08-14'</span>),AMOUNT=1200 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021081501'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-08-15'</span>),AMOUNT=1300 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021091601'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-09-16'</span>),AMOUNT=1400 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021101701'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-10-17'</span>),AMOUNT=1500 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021101801'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-10-18'</span>),AMOUNT=1600 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021111901'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-11-19'</span>),AMOUNT=1700 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021112001'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-11-20'</span>),AMOUNT=1800 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021112101'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-11-21'</span>),AMOUNT=1900 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021122201'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-12-22'</span>),AMOUNT=2000 <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DOCNO=<span style="color:#A31515;">'2021122001'</span>, TRANS_DATE=<span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>,<span style="color:#A31515;">'2021-12-20'</span>),AMOUNT=2100 ;
<span style="color:#0000FF;">select</span> * <span style="color:#0000FF;">from</span> @SourceData;
</pre></div><p><img src="https://drive.google.com/uc?id=1doIk-9gX_ItfaverwlaobOl04eO1-C_3"><br></p><p> </p><p> </p><p>定義天數組距 </p><p>0 ~ 30 : 表示 0 天至 30 天 </p><p>31 ~ 60 : 表示 31 天至 60 天 </p><p>以此類推 </p><div style="color:#000000;background-color:#FFFFFF;"><pre><span style="color:#0000FF;">DECLARE</span> @AgeGroup <span style="color:#0000FF;">AS</span> <span style="color:#0000FF;">TABLE</span>(DATE_FROM <span style="color:#0000FF;">int</span>, DATE_TO <span style="color:#0000FF;">int</span>, AGE_GROUP <span style="color:#0000FF;">varchar</span>(16))
<span style="color:#0000FF;">insert</span> <span style="color:#0000FF;">into</span> @AgeGroup(DATE_FROM, DATE_TO, AGE_GROUP)
<span style="color:#0000FF;">select</span> DATE_FROM=0, DATE_TO=30, AGE_GROUP=<span style="color:#A31515;">'0 ~ 30'</span> <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DATE_FROM=31, DATE_TO=60, AGE_GROUP=<span style="color:#A31515;">'31 ~ 60'</span> <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DATE_FROM=61, DATE_TO=90, AGE_GROUP=<span style="color:#A31515;">'61 ~ 90'</span> <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DATE_FROM=91, DATE_TO=180, AGE_GROUP=<span style="color:#A31515;">'91 ~ 180'</span> <span style="color:#0000FF;">union</span>
<span style="color:#0000FF;">select</span> DATE_FROM=181, DATE_TO=360, AGE_GROUP=<span style="color:#A31515;">'181 ~ 360'</span>
<span style="color:#0000FF;">select</span> * <span style="color:#0000FF;">from</span> @AgeGroup
</pre></div><p><img src="https://drive.google.com/uc?id=1TqZzt5j9UH0A_Le_Ep2VBeFJcTd2mHf_"><br></p><p> <br></p><h1>計算步驟<br></h1><h2>1. 延伸原始資料 </h2><p>(1) Age : 計算交易資料日期 [TRANS_DATE] 與指定日期 (@Calculate) 相差幾天 </p><p>(2) 天數組距 : 由 [Age ] 對應組距名稱 </p><div style="color:#000000;background-color:#FFFFFF;"><pre><span style="color:#0000FF;">DECLARE</span> @Calculate <span style="color:#0000FF;">Date</span> = <span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>, <span style="color:#A31515;">'2022-01-01'</span>)
<span style="color:#0000FF;">select</span> *
<span style="color:#0000FF;">from</span>(
<span style="color:#0000FF;">select</span> P1.*
<span style="color:#008000;">/*Age: 計算交易資料日期 [TRANS_DATE] 與指定日期 (@Calculate) 相差幾天 */</span>
, Age = <span style="color:#0000FF;">DATEDIFF</span>(<span style="color:#FF00FF;">day</span>, P1.TRANS_DATE, @Calculate)
<span style="color:#0000FF;">from</span> @SourceData P1
) P2
<span style="color:#0000FF;">outer</span> apply(
<span style="color:#008000;">/*天數組距 : 由 [Age] 對應組距名稱*/</span>
<span style="color:#0000FF;">select</span> Ag.DATE_FROM, Ag.AGE_GROUP
<span style="color:#0000FF;">from</span> @AgeGroup Ag
<span style="color:#0000FF;">where</span> P2.Age>=Ag.DATE_FROM <span style="color:#0000FF;">and</span> P2.Age<=Ag.DATE_TO
) A
</pre></div><p><img src="https://drive.google.com/uc?id=1n2uWLC5wAlnH2usdhfoE72Jz3Cjo1ZU6"><br></p><p><br></p><p>2.依照組距加總數值 </p><p>利用 PIVOT TABLE 產生各組距的加總。 </p><div style="color:#000000;background-color:#FFFFFF;"><pre><span style="color:#0000FF;">DECLARE</span> @Calculate <span style="color:#0000FF;">Date</span> = <span style="color:#FF00FF;">convert</span>(<span style="color:#0000FF;">date</span>, <span style="color:#A31515;">'2022-01-01'</span>)
<span style="color:#008000;">/*依照組距加總數值*/</span>
<span style="color:#0000FF;">select</span> [0 ~ 30] = <span style="color:#FF00FF;">sum</span>(<span style="color:#FF00FF;">isnull</span>([0],0))
, [31 ~ 60] = <span style="color:#FF00FF;">sum</span>(<span style="color:#FF00FF;">isnull</span>([31],0))
, [61 ~ 90] = <span style="color:#FF00FF;">sum</span>(<span style="color:#FF00FF;">isnull</span>([61],0))
, [91 ~ 180] = <span style="color:#FF00FF;">sum</span>(<span style="color:#FF00FF;">isnull</span>([91],0))
, [181 ~ 360] = <span style="color:#FF00FF;">sum</span>(<span style="color:#FF00FF;">isnull</span>([181],0))
<span style="color:#0000FF;">from</span>(
<span style="color:#0000FF;">select</span> *
<span style="color:#0000FF;">from</span>(
<span style="color:#0000FF;">select</span> P1.*
<span style="color:#008000;">/*Age / 天數 : 計算交易資料 [日期] 與指定日期相差幾天*/</span>
, Age = <span style="color:#0000FF;">DATEDIFF</span>(<span style="color:#FF00FF;">day</span>, P1.TRANS_DATE, @Calculate)
<span style="color:#0000FF;">from</span> @SourceData P1
) P2
<span style="color:#0000FF;">outer</span> apply(
<span style="color:#008000;">/*天數組距 : 由 [Age / 天數] 對應組距名稱*/</span>
<span style="color:#0000FF;">select</span> Ag.DATE_FROM, Ag.AGE_GROUP
<span style="color:#0000FF;">from</span> @AgeGroup Ag
<span style="color:#0000FF;">where</span> P2.Age>=Ag.DATE_FROM <span style="color:#0000FF;">and</span> P2.Age<=Ag.DATE_TO
) A
) Src
pivot(
<span style="color:#FF00FF;">sum</span>(AMOUNT)
<span style="color:#0000FF;">for</span> Src.DATE_FROM <span style="color:#0000FF;">in</span>([0],[31],[61],[91],[181])
) Pvt
</pre></div><p><br></p><p><img src="https://drive.google.com/uc?id=11NSRJoGXHPsRurhp2pBNv7yLiTvynVgC"><br></p><p><br></p><h1>相關連結</h1><a href="https://gist.github.com/robinli/06cfe8e9c34e92bde29ab76b2b829b7f">T-SQL 查詢指令完整範例</a> <p><a href="https://note.robinks.net/2022/01/aging-analysis-report-using-excel.html">使用 Excel 計算帳齡分析 Aging Analysis Report</a></p><p> </p><p><br></p>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-68314930222415047452022-01-17T13:56:00.004+08:002022-01-17T17:19:43.160+08:00使用 Excel 計算帳齡分析 Aging Analysis Report<h1>需求說明 </h1><div>常見帳齡分析的報表例如:客戶帳齡分析、產品庫存呆滯天數分析...等。 </div><div>舉例一組簡化的客戶發票資料,包括單號、日期、金額, </div><div>欲將發票資料依天數組距加總統計,得到客戶帳齡分析, </div><div>如下圖。 </div><div><img src="https://drive.google.com/uc?id=1YkzNfJvGJi4921dmdEROs01ycnU3GPIb"><br></div><div><br></div><h1>原始資料 </h1><div>交易資料中必要欄位有: </div><div>一個日期欄位 : 用來計算與指定日期相差幾天 </div><div>一個數值欄位 : 用來各組距彙總時的數值 </div><div><img src="https://drive.google.com/uc?id=16Y6wlfg7adAavZe6qdMa64QtiZk0YF1w"><br></div><div> </div><div>定義天數組距 </div><div>0 ~ 30 : 表示 0 天至 30 天 </div><div>31 ~ 60 : 表示 31 天至 60 天 </div><div>以此類推 </div><div><img width="500" src="https://drive.google.com/uc?id=1YzwXoZEsgVQGYcxPJoYBb9zEe10klFmZ#0.5848624826172624"><br></div><div> </div><h1>計算步驟 </h1><h2>1. 延伸原始資料 </h2><div>(1) Age / 天數 : 計算交易資料 [日期] 與指定日期相差幾天 </div><div>(2) 天數組距 : 由 [Age / 天數] 對應組距名稱 </div><p><img src="https://drive.google.com/uc?id=1_-tEbjz79XNeyY-pvbQXReVU2aq3sxju"><br></p><div> </div><div>公式如下</div><p>D38 = DATEVALUE($B$<span>35</span>)-DATEVALUE(B38)<br></p><div>E38 = VLOOKUP(D38,$A$27:$C$31,3,TRUE) </div><p><br></p><h2>2. 依照組距加總數值 </h2><div>利用 Excel 函式 SUMIF 產生各組距的加總。 </div><div><img src="https://drive.google.com/uc?id=1PP3DfHCqCnlp1x2ouHH_8rmig8BmGeHu"><br></div><div><br></div><p>公式如下</p><p>A62 = SUMIF($E$38:$E$56,A61,$C$38:$C$56) </p><div>B62 = SUMIF($E$38:$E$56,B61,$C$38:$C$56) </div><p><br></p><h1>相關連結</h1><p><a href="https://1drv.ms/x/s!ArFAjQrFv6CGt5AUQ0mzHLAueOYWsg?e=VfMsQf">下載範例 Excel 檔案</a></p><p><a href="https://note.robinks.net/2022/01/aging-analysis-report-using-t-sql-query.html">使用 T-SQL 計算帳齡分析 Aging Analysis Report</a><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></p><p><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></p><div> </div><div> </div><div><br></div><p></p>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-29085469376521693862021-12-28T16:44:00.017+08:002021-12-28T16:48:38.071+08:00T-SQL Two Dimension Pivot Table<p>將原始資料 </p><div data-codeblock="true" data-en-clipboard="true" data-pm-slice="2 2 []" style="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, "Courier New", monospace; font-size: 12px; padding: 8px;"><div data-plaintext="true">select BRAND='ASUS', QTY=1, AMT=200</div><div data-plaintext="true">union all </div><div data-plaintext="true">select BRAND='BENQ', QTY=1, AMT=200</div><div data-plaintext="true">union all </div><div data-plaintext="true">select BRAND='ASUS', QTY=1, AMT=200</div><div data-plaintext="true">union all </div><div data-plaintext="true">select BRAND='BENQ', QTY=1, AMT=200</div><div data-plaintext="true">union all </div><div data-plaintext="true">select BRAND='MSI', QTY=1, AMT=200</div></div><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMiTzD3Y7gbPt2hntC2wvzEemmQ1b7L7Lc4tUbb4j4CCla7AC6slOdrnyrrbZA9x3XcJlhsAior5Lq-6wjvcy8BgYk1auS7l863SaGRmPambOHdIK-Uj4Gah2VhvHbStTUUaQwNZHCxPR/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="175" data-original-width="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcMiTzD3Y7gbPt2hntC2wvzEemmQ1b7L7Lc4tUbb4j4CCla7AC6slOdrnyrrbZA9x3XcJlhsAior5Lq-6wjvcy8BgYk1auS7l863SaGRmPambOHdIK-Uj4Gah2VhvHbStTUUaQwNZHCxPR/s16000/image.png" /></a></div><p>依各品牌匯總數量、金額,做出以下的統計表</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw_2pzcNPngA5FLLocXyv6mqebXxBSuUJkeSgmdpAmPMRBKizUsue8GOo4XG72QXVWaGGxSOYIMJFlRQWBxw7BEDVmEUdZFSVR5DOG4xJ5YZiYZAdcZVcGiKFkjtWyZDj1_EO-IbY-DuKC/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="59" data-original-width="631" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw_2pzcNPngA5FLLocXyv6mqebXxBSuUJkeSgmdpAmPMRBKizUsue8GOo4XG72QXVWaGGxSOYIMJFlRQWBxw7BEDVmEUdZFSVR5DOG4xJ5YZiYZAdcZVcGiKFkjtWyZDj1_EO-IbY-DuKC/s16000/image.png" /></a></div><br /><br /><p></p><h2 style="text-align: left;">解決方法 1 - Group By 加條件式 </h2><div data-codeblock="true" data-en-clipboard="true" data-pm-slice="2 2 []" style="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, "Courier New", monospace; font-size: 12px; padding: 8px;"><div data-plaintext="true">select ASUS_QTY = SUM(IIF(Src.BRAND='ASUS', Src.QTY, 0)) </div><div data-plaintext="true"> , ASUS_AMT = SUM(IIF(Src.BRAND='ASUS', Src.AMT, 0)) </div><div data-plaintext="true"> , BENQ_QTY = SUM(IIF(Src.BRAND='BENQ', Src.QTY, 0)) </div><div data-plaintext="true"> , BENQ_AMT = SUM(IIF(Src.BRAND='BENQ', Src.AMT, 0)) </div><div data-plaintext="true"> , MSI_QTY = SUM(IIF(Src.BRAND='MSI', Src.QTY, 0)) </div><div data-plaintext="true"> , MSI_AMT = SUM(IIF(Src.BRAND='MSI', Src.AMT, 0)) </div><div data-plaintext="true">from( </div><div data-plaintext="true"> select BRAND='ASUS', QTY=1, AMT=200 </div><div data-plaintext="true"> union all </div><div data-plaintext="true"> select BRAND='BENQ', QTY=1, AMT=200 </div><div data-plaintext="true"> union all </div><div data-plaintext="true"> select BRAND='ASUS', QTY=1, AMT=200 </div><div data-plaintext="true"> union all </div><div data-plaintext="true"> select BRAND='BENQ', QTY=1, AMT=200 </div><div data-plaintext="true"> union all </div><div data-plaintext="true"> select BRAND='MSI', QTY=1, AMT=200 </div><div data-plaintext="true">) Src</div></div><p><br /></p><h2 style="text-align: left;">解決方法 2 - Pivot Table </h2><p>做多維度 Pivot Table 時,會排除相同的資料,導致第二維度彙總有遺漏資料狀況。
變通作法,先在每筆資料賦予唯一的流水號,即可解決。 </p><div data-codeblock="true" data-en-clipboard="true" data-pm-slice="2 2 []" style="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, "Courier New", monospace; font-size: 12px; padding: 8px;"><div data-plaintext="true">select ASUS_QTY = SUM(ASUS_QTY)</div><div data-plaintext="true"> , ASUS_AMT = SUM(ASUS_AMT)</div><div data-plaintext="true"> , BENQ_QTY = SUM(BENQ_QTY)</div><div data-plaintext="true"> , BENQ_AMT = SUM(BENQ_AMT) </div><div data-plaintext="true"> , MSI_QTY = SUM(MSI_QTY)</div><div data-plaintext="true"> , MSI_AMT = SUM(MSI_AMT)</div><div data-plaintext="true">from (</div><div data-plaintext="true"> select RNO=row_number() over (order by BRAND)</div><div data-plaintext="true"> , BRAND1 = Src.BRAND+'_QTY'</div><div data-plaintext="true"> , BRAND2 = Src.BRAND+'_AMT'</div><div data-plaintext="true"> , Src.*</div><div data-plaintext="true"> from(</div><div data-plaintext="true"> select BRAND='ASUS', QTY=1, AMT=200</div><div data-plaintext="true"> union all </div><div data-plaintext="true"> select BRAND='BENQ', QTY=1, AMT=200</div><div data-plaintext="true"> union all </div><div data-plaintext="true"> select BRAND='ASUS', QTY=1, AMT=200</div><div data-plaintext="true"> union all </div><div data-plaintext="true"> select BRAND='BENQ', QTY=1, AMT=200</div><div data-plaintext="true"> union all </div><div data-plaintext="true"> select BRAND='MSI', QTY=1, AMT=200</div><div data-plaintext="true"> ) Src</div><div data-plaintext="true">) T</div><div data-plaintext="true">PIVOT </div><div data-plaintext="true">( </div><div data-plaintext="true"> SUM (QTY) </div><div data-plaintext="true"> FOR BRAND1 IN ([ASUS_QTY],[BENQ_QTY],[MSI_QTY]) </div><div data-plaintext="true">) AS pvt1</div><div data-plaintext="true">PIVOT </div><div data-plaintext="true">( </div><div data-plaintext="true"> SUM (AMT) </div><div data-plaintext="true"> FOR BRAND2 IN ([ASUS_AMT],[BENQ_AMT],[MSI_AMT]) </div><div data-plaintext="true">) AS pvt2</div></div>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-80611542128427278882021-12-21T13:40:00.002+08:002021-12-21T13:54:00.145+08:00Azure DevOps 看板中顯示前後期工作<div>Azure DevOps 工作看板可以將本期、前一期、下一期的工作,以不同的顏色區分顯示,一目了然。 </div><p><img src="https://drive.google.com/uc?id=1EQQoB94nztwTQxItPeROSMU9E4XkExQY"><br></p><div> </div><h2>設定方式 </h2><div>進入 Azure DevOps > Boards > Boards </div><div><img src="https://drive.google.com/uc?id=113Isc1ya93dEfQhLIqjTKfwqQCHf0YCM"><br></div><div> </div><div>在主畫面右上角點擊設定的 Icon </div><div><img src="https://drive.google.com/uc?id=1hdD9subgqj8kD3r4xeAKbv8V3Rs1a7Nq"><br></div><div> </div><div>設定當期顯示的顏色 </div><div>(1)在開窗畫面中進入 Settings > Styles </div><div>(2)點擊新增一個 [Style rule] </div><div>(3) Field 輸入 Iteration Path </div><div>(4) Value 輸入 @currentIteration </div><div><img src="https://drive.google.com/uc?id=1Hzcia23u3rnIBJpwjS5MssTUH-Bg3U3I"><br></div><div> </div><div> </div><div>設定前一期顯示的顏色 </div><div>同上述步驟點擊新增一個 [Style rule] </div><div>Field 輸入 Iteration Path </div><div>Value 輸入 @currentIteration - 1 </div><div><img src="https://drive.google.com/uc?id=1cssEqrFtHchcIzp5Cl3zaRMI-9G_RnL7"></div><p><br></p><p></p>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-37662124987571005462021-11-05T14:53:00.002+08:002022-07-22T14:35:27.321+08:00Blazor Print Example<h1>程式開發步驟</h1><p>以 Visual Studio 2019 新增 Blazor Server 專案。</p><h2>Step 1 加入 jQuery </h2><p> <img src="https://drive.google.com/uc?id=1X2AFKdEUL-E340QEYR9R8Kk_W-slda21"></p><p> </p><p> <img src="https://drive.google.com/uc?id=1303zxE1GZNc06zey85mmaEETP7EBPFBk"></p><p> </p><h2>Step 2 設定列印要隱藏 CSS </h2><p>將不須列印的部分加上 css class : hideWhenPrint<br></p><p>Shared/MainLayout.razor </p><div style="color:#000000;background-color:#FFFFFF;"><pre>@inherits LayoutComponentBase
<span style="color:#0000FF;"><</span><span style="color:#A31515;">div</span> <span style="color:#FF0000;">class</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"page"</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"><</span><span style="color:#A31515;">div</span> <span style="color:#FF0000;">class</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"sidebar hideWhenPrint"</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"><</span><span style="color:#A31515;">NavMenu</span> <span style="color:#0000FF;">/></span>
<span style="color:#0000FF;"></</span><span style="color:#A31515;">div</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"><</span><span style="color:#A31515;">div</span> <span style="color:#FF0000;">class</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"main"</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"><</span><span style="color:#A31515;">div</span> <span style="color:#FF0000;">class</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"top-row px-4 hideWhenPrint"</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"><</span><span style="color:#A31515;">a</span> <span style="color:#FF0000;">href</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"https://docs.microsoft.com/aspnet/"</span> <span style="color:#FF0000;">target</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"_blank"</span><span style="color:#0000FF;">></span>About<span style="color:#0000FF;"></</span><span style="color:#A31515;">a</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"></</span><span style="color:#A31515;">div</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"><</span><span style="color:#A31515;">div</span> <span style="color:#FF0000;">class</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"content px-4"</span><span style="color:#0000FF;">></span>
@Body
<span style="color:#0000FF;"></</span><span style="color:#A31515;">div</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"></</span><span style="color:#A31515;">div</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"></</span><span style="color:#A31515;">div</span><span style="color:#0000FF;">></span>
</pre></div><p> <br></p><h2>Step 3 呼叫 JavaScript </h2><p>wwwroot/js/print.js </p><div style="color:#000000;background-color:#FFFFFF;"><pre>function Print() {
$(<span style="color:#A31515;">".hideWhenPrint"</span>).hide();
window.print();
$(<span style="color:#A31515;">".hideWhenPrint"</span>).show();
}<br></pre></div><p><br></p><p>Pages/_Host.cshtml </p><div style="color:#000000;background-color:#FFFFFF;"><pre><span style="color:#0000FF;"><</span><span style="color:#A31515;">script</span> <span style="color:#FF0000;">src</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"~/jquery/jquery.min.js"</span><span style="color:#0000FF;">></span><span style="color:#0000FF;"></</span><span style="color:#A31515;">script</span><span style="color:#0000FF;">></span>
<span style="color:#0000FF;"><</span><span style="color:#A31515;">script</span> <span style="color:#FF0000;">src</span><span style="color:#0000FF;">=</span><span style="color:#0000FF;">"~/js/print.js"</span><span style="color:#0000FF;">></span><span style="color:#0000FF;"></</span><span style="color:#A31515;">script</span><span style="color:#0000FF;">></span>
<br></pre></div><p>Blazor Call JavaScript</p><div style="color:#000000;background-color:#FFFFFF;"><pre><span style="color:#0000FF;">private</span> <span style="color:#0000FF;">void</span> Print()
{
jsRunTime.InvokeVoidAsync(<span style="color:#A31515;">"Print"</span>);
}
</pre></div><p><br></p><h1>原始碼 </h1><p><a href="https://github.com/robinli/BlazorPrintExample">GitHub - BlazorPrintExample</a></p><p><br></p><p>執行結果</p><p><img src="https://drive.google.com/uc?id=1WgZSxPYImmkUwynnhqfI-GbBsiS_MkM5"><br></p><p><br></p><p><img src="https://drive.google.com/uc?id=1nqSamwq_yrxznlx6ExglS7A3SOB-21T4"><br></p><p><br></p><h1>參考 </h1><p>Blazor : Generate Quick PDF || Easy Trick || 100% Free </p><p><a href="https://youtu.be/btp9LkmrBig">https://youtu.be/btp9LkmrBig</a></p><p><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></p><p><br></p>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-42368594264637753892021-10-07T15:13:00.001+08:002021-10-07T15:17:14.106+08:00使用 Gpg4Win 驗證 Notepad++ 安裝程式<div>Step 1 下載 Gpg4Win </div><div>下載網址: <a href="https://gpg4win.org/get-gpg4win.html">https://gpg4win.org/get-gpg4win.html</a> </div><div><img src="https://drive.google.com/uc?id=1WLs7yLKXlM1cIOlwin3DFEAI3U1X2tmI"><br></div><div> </div><div>Step 2 建立個人私鑰 </div><div>開啟 Kleopatra 建立個人私鑰 </div><div><img src="https://drive.google.com/uc?id=1d-A2G-Hlzf2GzRxHComQbbd8zZenNBjL"><br></div><div><br></div><div><img src="https://drive.google.com/uc?id=1MW2ik8YHlWInGzmQbYoyO7IjQ_QMJE6P"><br></div><p><br></p><div>Step 3 匯入 Notepad++ 公鑰 </div><div>下載 <a href="https://notepad-plus-plus.org/gpg/nppGpgPub.asc">https://notepad-plus-plus.org/gpg/nppGpgPub.asc</a> </div><div>另存為 nppGpgPub.asc </div><div> </div><div>Kleopatra > 點擊 Import > 選取上述下載的檔案 </div><div><img src="https://drive.google.com/uc?id=1_sTiZbCXQmMlwCXYT--NLgnJjbBdZKXf"><br></div><div> </div><div>Step 4 下載 Notepad++ 安裝程式與 GPG Signature 檔案 </div><div>下載網址: <a href="https://notepad-plus-plus.org/downloads/v8.1.5/">https://notepad-plus-plus.org/downloads/v8.1.5/</a> </div><div><img src="https://drive.google.com/uc?id=1ZqI6xE84sdhh4pDoGsJmy2bkcsVjiL22"><br></div><div> </div><div>Step 5 驗證 </div><div>Kleopatra > 點擊 [Decrypt/Verty...] > 選取上述下載檔案 npp.8.1.5.Installer.x64.exe.sig </div><div><img src="https://drive.google.com/uc?id=1AciUlZ3czTXJc9sTpULNw8_92ndePuja"><br></div><div>出現 The signature is valid and the certificate's validity is fully trusted </div><div>表示通過驗證</div><p></p>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-61066390330984079622021-07-01T09:52:00.001+08:002021-07-01T09:54:53.217+08:00Notepad++ 安裝後基本設定<h1>下載安裝最新版本</h1> <p><a href="https://notepad-plus-plus.org/downloads/">Downloads | Notepad++ (notepad-plus-plus.org)</a></p> <hr /> <h1>新增與使用 Theme</h1> <p><img alt="Notepad++ Theme Preview" src="https://draculatheme.com/static/img/screenshots/notepad-plus-plus.png" /></p> <p>下載 Theme 範本 *.xml </p> <p><a href="https://draculatheme.com/notepad-plus-plus">Dark theme for Notepad++ and 188+ apps — Dracula (draculatheme.com)</a></p> <p><a href="https://raw.githubusercontent.com/dracula/notepad-plus-plus/master/Dracula.xml">https://raw.githubusercontent.com/dracula/notepad-plus-plus/master/Dracula.xml</a></p> <p>儲存於 C:\Users\YourName\AppData\Roaming\Notepad++\themes</p> <p>開啟 Notepad++ > 選單 > Settings > Style Configuratior > Select theme > 選擇 Dracula</p> <p> </p> <hr /> <h1>修改字體大小</h1> <p><a href="https://drive.google.com/uc?id=1opXRFdl47aj2NhD231jigqfTOk7AHB4k"><img title="image" style="display: inline; background-image: none;" border="0" alt="image" src="https://drive.google.com/uc?id=1Jg48G1EkkgCNL61d5lA0tVviLi2v-4H2" width="754" height="427" /></a></p> <p> </p> <hr /> <h1>設定無法識別的附檔名</h1> <p>例如 cshtml 或 razor 不能突顯關鍵字</p> <p> </p> <p>選單 > Settings > Style Configurator, under Language select HTML, and add razor in the User ext box.</p> <p><a href="https://drive.google.com/uc?id=19Q6jD6SfDEgAMFEXhgZ7n8pB0L4zqDYp"><img title="image" style="display: inline; background-image: none;" border="0" alt="image" src="https://drive.google.com/uc?id=1ll3U4hIWhEMLzqvmYyXUdGRFQzkLz1vJ" width="754" height="430" /> </a></p>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-19894791434383186762021-03-12T15:29:00.001+08:002021-03-12T15:34:05.257+08:00SQL Server 執行 xp_cmdshell 錯誤排解<h2>問題說明</h2> <p>在 SSMS 執行 xp_cmdshell 出現以下的錯誤訊息</p> <p>SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for 'xp_cmdshell' in SQL Server Books Online.</p> <p> </p> <h2>解決方式</h2> <p>參考 <a href="https://www.mssqltips.com/sqlservertip/1020/enabling-xpcmdshell-in-sql-server/">Enabling xp_cmdshell in SQL Server</a></p> <p>執行 T-SQL</p> <pre>-- this turns on advanced options and is needed to configure xp_cmdshell
exec sp_configure 'show advanced options', '1'
RECONFIGURE
-- this enables xp_cmdshell
exec sp_configure 'xp_cmdshell', '1'
<p>RECONFIGURE</p></pre>
<p> </p>
<p>或從 SSMS 介面調整設定</p>
<p><a href="https://drive.google.com/uc?id=1jerLAFhz6dwZH2QFjBbKFSmpJ0fJJ7I4"><img title="2021-03-12_14-56-36" style="display: inline; background-image: none;" border="0" alt="2021-03-12_14-56-36" src="https://drive.google.com/uc?id=1YUqJR9AOBJ81FQc2mJQckWV6vXUW3p4S" width="454" height="490" /></a></p>
<p><a href="https://drive.google.com/uc?id=1ZMXO0cO9wizf1acMSAm9CI2QqX4q2g-j"><img title="2021-03-12_14-57-00" style="display: inline; background-image: none;" border="0" alt="2021-03-12_14-57-00" src="https://drive.google.com/uc?id=1c9XdbZCdxVvfEALa_Du74LQEiqBBhR_6" width="765" height="662" /></a></p>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-7426217271753985412021-02-03T16:00:00.002+08:002021-02-03T16:03:24.639+08:00Visual Studio / VSCode 執行命令提示字元<p><b>Visual Studio 2019</b></p> <p>開啟 Command Prompt 視窗</p> <p>方法 1 : 從選單 >  VIEW >  點擊 Terminal</p> <p>方法 2 : 快捷鍵 CTRL + `</p> <p><a href="https://drive.google.com/uc?id=1ojtw8R8Ncidtnsq4P2bCI9a8jIHdx0-z"><img title="image001" style="display: inline; background-image: none;" border="0" alt="image001" src="https://drive.google.com/uc?id=1Z-QQwWhoSxONW0539fuM3lVOqHB5ZFPG" width="710" height="301" /></a></p> <p>調整字型大小</p> <p>從選單 > TOOL > 點擊 Option > Environment > Fonts and Colors </p> <p><a href="https://drive.google.com/uc?id=1_D2qhdVqXZqRPbPXnSnf6xi_UuUwkQ9-"><img title="image002" style="display: inline; background-image: none;" border="0" alt="image002" src="https://drive.google.com/uc?id=18OfFBkLmfqIPC6-T0kE1nDrcvJevtYeB" width="895" height="557" /></a></p> <hr /> <p><b>VSCode</b></p> <p>開啟 Command Prompt 視窗</p> <p>方法 1 : 從選單 >  VIEW >  點擊 Terminal</p> <p>方法 2 : 快捷鍵 CTRL + `</p> <p><a href="https://drive.google.com/uc?id=1-Hm74vcXfTWHtHNV9oxj5e0m1iYJpXZk"><img title="image003" style="display: inline; background-image: none;" border="0" alt="image003" src="https://drive.google.com/uc?id=1VN-Z06rt-ImYpacoej6VESkvK02e8PhH" width="825" height="238" /></a></p> <p>調整字型大小</p> <p>快捷键:</p> <p>放大:Ctrl + =</p> <p>缩小:Ctrl + -</p> <p>復原:Ctrl + NumPad0</p> <hr />Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-87441451604258125222021-01-04T17:14:00.001+08:002022-03-28T11:30:19.462+08:00Windows 10 調整磁碟區大小<div>在 Windows 10 磁碟管理 / Disk Management 可以直接調整磁碟容量的大小,即使是作業系統磁碟區也可以。</div>
<div><br /></div>
<div>Disk Management 有兩個功能:</div>
<div>Extend Volume : 將指定的磁碟區容量變大</div>
<div>Shrink Volume : 將指定的磁碟區容量變大</div>
<div><br /></div>
<div>以下是將C 磁碟區分割為兩個磁碟區後,再回復原狀的步驟。</div>
<div><br /></div>
<hr />
<div><br /></div>
<h3>第一個硬碟只有 C 磁碟,欲將其一切為二的作法</h3>
<div><br /></div>
<div>Step 1 : Shrink Volume 將 C 磁碟區容量變小</div><div><br /></div>
<img height="638" src="https://locker.ifttt.com/v2/2554243/1615540489721-5ff76ba9b78334ae/a5d04b369903b596fa66b87d2fc37713d55ba5eb2febe23d1628f8a7a64cbd35/d186b556-e052-57bb-2139-54a4a568d115?sharing_key=febf8abb179306f6497572dc0ed24ba5" style="--en-naturalheight: 638; --en-naturalwidth: 742;" width="742" />
<div><br /></div><div><br /></div>
<div>Step 2 : 第一個硬碟剩餘的容量,新增磁碟代號</div><div><br /></div>
<img height="638" src="https://locker.ifttt.com/v2/2554243/1615540490663-a3bbdd4bdb7b63ac/8707bcfd556b64c0b3ce70291c9fe3faad5dc38c46e4852f1ea3295bda33269b/6a8c0db9-6dee-1f69-a528-5a2625545cc4?sharing_key=a103b68dba6b8c26afe432a491a5be6c" style="--en-naturalheight: 638; --en-naturalwidth: 774;" width="774" />
<div><br /></div><div><br /></div>
<div>完成,第一個硬碟有 C 磁碟區與 Z 磁碟區</div><div><br /></div>
<img height="638" src="https://locker.ifttt.com/v2/2554243/1615540491549-1337b2043412941b/9907771b22778ba1ca20bf8b2a48b51df3485e6bdcebe326d295ac3671d96326/8e4bf8f6-85f9-5f66-a8a9-07e5cdc0b8db?sharing_key=36c1138bc75bb93363f736f1d186b328" style="--en-naturalheight: 638; --en-naturalwidth: 774;" width="774" />
<div><br /></div>
<hr />
<h3>第一個硬碟有 C , Z 兩個磁碟區,欲將其合併為一個的作法</h3>
<div><br /></div>
<div>Step 1 : 刪除 Z 磁碟區</div><div><br /></div>
<img height="638" src="https://locker.ifttt.com/v2/2554243/1615540492438-190e81cdb2321ba1/03de25556f55e5278fc82d257f9352e3a24935b6ad08ecaabb14bb9a76e5e8ca/34313b87-7922-4068-aefd-d185cf087d6f?sharing_key=6931fbb91641be58e5440a0010a9773a" style="--en-naturalheight: 638; --en-naturalwidth: 774;" width="774" />
<div><br /></div><div><br /></div>
<div>Step 2 : 將 C 磁碟區容量變大</div><div><br /></div>
<img height="638" src="https://locker.ifttt.com/v2/2554243/1615540493257-ffe07eacdc479d79/00608ef1a75208ea2930ace68ae523e5d8fbac35fd90fa77973846db6e650243/6c981c17-267a-417c-554e-e06aa1ef8e73?sharing_key=b8c717cc5c17ecd25bb5e07c23886a7b" style="--en-naturalheight: 638; --en-naturalwidth: 774;" width="774" />
<div><br /></div><div><br /></div>
<div>完成,第一個硬碟回復原狀,只剩 C 磁碟區</div><div><br /></div>
<img height="597" src="https://locker.ifttt.com/v2/2554243/1615540494063-0a170ee040c9f232/df209a7021d3341ee99fbf413a8b6a2a901c5557187f6bfd5ab7c0283ad0240e/1b41bdab-3fdd-4d01-382b-753928a3b738?sharing_key=dfe1d07d980195086d6138ae4eb462a2" style="--en-naturalheight: 597; --en-naturalwidth: 754;" width="754" />
<div><br /></div>
<hr />
<div><br /></div>
Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-40709607837730649672020-12-23T17:18:00.001+08:002021-03-12T17:43:47.586+08:00Hexo 架設部落格<div>開站第一篇先介紹這個網站建置的方式,這是透過 <a href="https://hexo.io/zh-tw/docs/index.html">Hexo</a> 產生靜態網頁,發行到 GitHub 網站上。</div>
<div><br /></div>
<div>Hexo 是一個產生靜態網頁工具程式,以 Makedown 語法撰寫文章內容,可以在本機端產生網頁與瀏覽,一鍵發行到 GitHub 上。</div>
<div><br /></div>
<div>目前會在 Evernote 撰寫文章,使用 VSCode 來調整 Makedown 語法與執行 Hexo 指令。</div>
<hr />
<div><span style="color:rgb(24, 133, 226);">安裝與使用步驟</span></div>
<div><br /></div>
<div>檢查本機環境</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>node -v</div>
<div><br /></div>
<div>git version</div>
</div>
<div><br /></div>
<div>建議使用 Node.js 10.0 以上版本,git 2.2 以上版本</div>
<div><br /></div>
<div><br /></div>
<div>安裝 hexo 命令</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>npm install -g hexo-cli</div>
</div>
<div><br /></div>
<div>建立目錄 init</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo init test</div>
</div>
<div><br /></div>
<div>產生網站頁面 generate</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo g</div>
</div>
<div><br /></div>
<div>啟動網站 server</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo s</div>
</div>
<div><br /></div>
<div>瀏覽本機網站</div>
<div><a href="http://localhost:4000" rev="en_rl_none">http://localhost:4000</a></div>
<div><br /></div>
<div>新增文章 new</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo new post "Post Title"</div>
</div>
<div>也可以簡化</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo new "Post Title"</div>
</div>
<div>每次增修檔案或內容,均需要再產生一次才能瀏覽</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo g</div>
</div>
<div><br /></div>
<div>瀏覽新產生的文章</div>
<div><a href="http://localhost:4000/2020/12/24/Creat-blog-by-Hexo">http://localhost:4000/2020/12/24/Creat-blog-by-Hexo</a>/</div>
<div>(網址中有包含今天日期)</div>
<div><br /></div>
<div>新增草稿文章 new draft</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo new draft "Draft Title"</div>
</div>
<div>草稿不能瀏覽</div>
<div><br /></div>
<div>新增頁面 new page</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo new page "Page Title"</div>
<div>hexo g</div>
</div>
<div><br /></div>
<div>瀏覽新產生的頁面</div>
<div><a href="http://localhost:4000/Page-Title" rev="en_rl_none">http://localhost:4000/Page-Title</a></div>
<div><br /></div>
<div><br /></div>
<div>安裝 Git 部署套件</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>npm install hexo-deployer-git --save</div>
</div>
<div><br /></div>
<div>部署到 Github</div>
<div>修改 _config.yml 發行的網址,取代下面最後一行</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div># Deployment</div>
<div>## Docs: https://ift.tt/3ey9tMW</div>
<div>deploy:</div>
<div> type: git</div>
<div> repo: https://ift.tt/3bDuzri</div>
</div>
<div><br /></div>
<div>執行部署</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo d</div>
</div>
<div><br /></div>
<div>產生完成即部署網站</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>hexo g -d</div>
</div>
<div><br /></div>
<div>瀏覽 GitHub 的網站</div>
<div><a href="https://blog.robinks.net" rev="en_rl_none">https://blog.robinks.net</a></div>
<div><br /></div>
<hr />
<div><span style="color:rgb(24, 133, 226);">切換主題</span></div>
<div><br /></div>
<div>所有主題 <a href="https://hexo.io/themes">https://hexo.io/themes</a>/</div>
<div><br /></div>
<div>不錯的主題</div>
<div><a href="https://github.com/theme-kaze/hexo-theme-Kaze">https://github.com/theme-kaze/hexo-theme-Kaze</a></div>
<div><a href="https://github.com/zhwangart/hexo-theme-ocean">https://github.com/zhwangart/hexo-theme-ocean</a></div>
<div><br /></div>
<div><br /></div>
<div><br /></div>
<div>切換主題步驟</div>
<div><a style="--en-preferPlainlink:true;" href="https://www.youtube.com/watch?v=5ROIU_9dYe4&feature=emb_logo" rev="en_rl_none">https://www.youtube.com/watch?v=5ROIU_9dYe4&feature=emb_logo</a></div>
<div><br /></div>
<div>安裝到本機</div>
<div style='--en-codeblock:true;box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", 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;'>
<div>git clone https://ift.tt/3laOqRV ./hexo-huweihuang</div>
<div>cd hexo-huweihuang</div>
<div>npm install</div>
</div>
<div><br /></div>
<hr />
<div><span style="color:rgb(24, 133, 226);">線上教學</span></div>
<div>Hexo教程第一期 简介</div>
<div><a style="--en-preferPlainlink:true;" href="https://youtu.be/PsXWbI2Mqu0" rev="en_rl_none">https://youtu.be/PsXWbI2Mqu0</a></div>
<div><br /></div>
<div>Hexo教程第二期 安装与使用</div>
<div><a style="--en-preferPlainlink:true;" href="https://youtu.be/xvIRGmKWpFM" rev="en_rl_none">https://youtu.be/xvIRGmKWpFM</a></div>
<div><br /></div>
<div>Hexo教程第三期 写作</div>
<div><a style="--en-preferPlainlink:true;" href="https://youtu.be/HLJ9jJy7CMg" rev="en_rl_none">https://youtu.be/HLJ9jJy7CMg</a></div>
<div><br /></div>
<div>Hexo教程第四期 Front Matter</div>
<div><a style="--en-preferPlainlink:true;" href="https://youtu.be/Rl48Yk4A_V8" rev="en_rl_none">https://youtu.be/Rl48Yk4A_V8</a></div>
<div><br /></div>
<div>Hexo教程第五期 配置文件</div>
<div><a style="--en-preferPlainlink:true;" href="https://youtu.be/A0Enyn70jKU" rev="en_rl_none">https://youtu.be/A0Enyn70jKU</a></div>
<div><br /></div>
<div>Hexo教程第六期 命令</div>
<div><a style="--en-preferPlainlink:true;" href="https://youtu.be/mgdXi5npArQ" rev="en_rl_none">https://youtu.be/mgdXi5npArQ</a></div>
<div><br /></div>
<div>Hexo教程第七期 部署</div>
<div><a style="--en-preferPlainlink:true;" href="https://youtu.be/B0yVJ46CTR8" rev="en_rl_none">https://youtu.be/B0yVJ46CTR8</a></div>
<div><br /></div>
<hr />
<div><span style="color:rgb(24, 133, 226);">Hexo 說明文件</span></div>
<div><a href="https://hexo.io/zh-tw/docs/index.html">https://hexo.io/zh-tw/docs/index.html</a></div>
<hr />
<div><br /></div>
Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-58302606455684104642020-08-30T11:33:00.002+08:002021-03-12T17:43:13.437+08:00還原手機已刪除的照片 Recovery Deleted Photo on Phone<p>手機相片刪除後,可以試著透過"手機相片還原" App 找回來,測試幾款 App 後,以這款 App - Photo Recovery App, Deleted video recovery 為例,圖解找回刪除的照片。</p> <a href="http://note.robinks.net/2020/08/recovery-deleted-photo-on-phone.html#more">閱讀更多 »</a>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-62375410074785322602020-02-27T12:14:00.001+08:002020-02-27T12:17:35.817+08:00在 .NET 中開始使用 Google Drive API以 .NET 程式開發 Google Drive APIs 應用,事前準備工作有:<br>
<ol>
<li> 建立 APIs 專案</li>
<li>啟用 Google Drive API</li>
<li>輸入 OAuch 授權時顯示的 Application Name</li>
<li>建立並下載 Client Secrets 檔案</li>
</ol>
<a href="http://note.robinks.net/2020/02/get-started-with-google-drive-api-in.html#more">閱讀更多 »</a>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-45408674801322361792020-01-17T18:18:00.001+08:002020-01-17T18:18:16.016+08:00VS 資料庫專案發行到不同定序的 SQL Server<p>先說明一下我的 Visual Studio 資料庫專案開發流程,區分三階段:</p> <p>1 資料庫設計與程序開發</p> <p>我直接在開發資料庫上變更資料表結構與撰寫相關程序 (預存程序、觸發、方法...)</p> <p>2 匯入原始碼</p> <p>使用 Visual Studio 資料庫專案,從開發資料庫將所有資料庫結構、觸發、預存程序,方法...等,</p> <p>透過 Schema Compare 比對匯入 Visual Studio 專案。</p> <p>3 資料庫發行 Publish DataBase </p> <p>資料庫發行在 Visual Studio 是將原始碼與發行資料庫作比對後,可以產生語法或直接更新資料。</p> <a href="http://note.robinks.net/2020/01/vs-sql-server.html#more">閱讀更多 »</a>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-21340767978476866792019-09-05T12:31:00.001+08:002019-09-05T14:41:37.395+08:00SYM FNX 125 購車贈送的 307P 防水騎士後背包<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEw7cZ7BbpRX78lHbry9ka52iGId3CU5H7BnpdupA1orr-j7s6_AXD-DlZDo_qFgcjYO5b_L126k6Qp3-2oiN0KHRAS5rTVMY62QfrKiQ8GwNz-bGwRwILkeYOvBKGOx-i3cWN5qagLh2u/s1600/IMG20190905084435.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEw7cZ7BbpRX78lHbry9ka52iGId3CU5H7BnpdupA1orr-j7s6_AXD-DlZDo_qFgcjYO5b_L126k6Qp3-2oiN0KHRAS5rTVMY62QfrKiQ8GwNz-bGwRwILkeYOvBKGOx-i3cWN5qagLh2u/s1600/IMG20190905084435.jpg"></a></div>
<br>
2019年 9 月份購買 SYM FNX 125,另贈送一個 307P 防水騎士後背包,特別是這背包上有印 FNX x JET S 的字樣,FNX 與 JET 的車主會感覺很酷 !!<br>
以下是這個包的簡單開箱照。<br>
<a href="http://note.robinks.net/2019/09/sym-fnx-125-307p.html#more">閱讀更多 »</a>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-91953063982381040232019-08-23T14:26:00.001+08:002019-09-05T14:35:17.598+08:00Visual Studio 快捷鍵中使用數字鍵盤的點 Visual Studio Tips 重構的快捷鍵是 Ctrl+.<br>
<br>
但預設狀況下 [Ctrl] + 數字鍵盤中的 [.] 是無效的,如下圖右方的 [.] 鍵。<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX3Y1sfZV4Z3HofRnsbdvNVdHnk8vY-4jPxCeS9spRD8W99QBZmJKrTaKwpUoP5XqNe5eJVg7-rTqsQEvJovBirIHDRSOn-wTpwD-SlVUwFpiXdkn5DsAQYBufq82e7s8pQQYq2dQJ3UeU/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1201" data-original-width="1600" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX3Y1sfZV4Z3HofRnsbdvNVdHnk8vY-4jPxCeS9spRD8W99QBZmJKrTaKwpUoP5XqNe5eJVg7-rTqsQEvJovBirIHDRSOn-wTpwD-SlVUwFpiXdkn5DsAQYBufq82e7s8pQQYq2dQJ3UeU/s1600/1.jpg"></a></div>
<br>
<br>
<a href="http://note.robinks.net/2019/08/ctrl-dot-with-numpad-keyboard-with.html#more">閱讀更多 »</a>Robin 李瑞彬http://www.blogger.com/profile/12099030895162332774noreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-72114675106494878212019-08-02T08:12:00.002+08:002019-09-05T14:36:06.492+08:00Visual Studio 2019 設定使用 ASP.NET Blazor Core Blazor 專案<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; font-size: 14px; margin: 0px; padding: 0px;">
<div style="box-sizing: border-box; margin: 0px; padding: 0px;">
<br>
<div style="-en-clipboard: true;">
<div style="-en-clipboard: true;">
<div>
本文介紹在 Visual Studio 2019 中建立 Blazor App 的開發環境需要的準備步驟。</div>
<div>
<br></div>
<div>
<span style="font-weight: bold;">環境準備</span></div>
<div>
<br></div>
<div>
1. Visual Studio 2019 設定使用 Preview SDK</div>
<div>
<br></div>
<div>
由於 .NET Core 目前是屬於 Preview 版本,需要在 Visual Studio 設定可使用 Preview .NET Core SDK</div>
<div>
設定步驟:</div>
<div>
開啟 Visual Studio > 選單 > Tools > Option > Environment > Preview Features</div>
<div>
選取 [ Use previews of the .NET Core SDK ]</div>
<div>
如下圖</div>
<div>
<br></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVFX_YqgvVVnHJOVl1YHeflDCUmtYqrITlNlaPAsuDJWYjYUByEavHHMzgQ3IRzJPsZ9QXBKL3WqYuGjgdHLi7T2CHJ8KAEAuTTEsu91hH_-x_RKLCOnCl42BF6Eqv9B27qkmQxvQFHE90/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="487" data-original-width="805" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVFX_YqgvVVnHJOVl1YHeflDCUmtYqrITlNlaPAsuDJWYjYUByEavHHMzgQ3IRzJPsZ9QXBKL3WqYuGjgdHLi7T2CHJ8KAEAuTTEsu91hH_-x_RKLCOnCl42BF6Eqv9B27qkmQxvQFHE90/s1600/1.png"></a></div>
<div>
<br></div>
<div>
<br>
</div></div></div></div></div><a href="http://note.robinks.net/2019/08/visual-studio-2019-aspnet-blazor-core.html#more">閱讀更多 »</a>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-19833042885926296912019-07-25T10:08:00.001+08:002019-07-25T10:09:17.063+08:00SSMS 修正斷行符號<div class="ennote">
<div>
<div>
<span style="font-weight: bold;">問題描述</span></div>
<div>
當預存程序或其他資料庫程式碼中,包含了非 Windows 的斷行符號,</div>
<div>
在資料庫專案進行比對時,</div>
<div>
會顯示檔案有差異,但看不到差異的文字內容,</div>
<div>
更新至原始碼後,</div>
<div>
再一次比對仍會顯示檔案有差異...</div>
<div>
<br /></div>
<div>
<br /></div>
<hr />
<div>
<span style="font-weight: bold;">解決方法 </span></div>
<div>
SSMS 開啟自動檢查編碼,並進行修正為Windows 斷行符號。</div>
<div>
<br /></div>
<div>
步驟如下:</div>
<div>
<br /></div>
<div>
SSMS 開啟自動檢查編碼</div>
<div>
1: Open SSMS </div>
<div>
2: Got to Tools > Options</div>
<div>
3: Expand the Environment Tab</div>
<div>
4: Select Documents> Check the option for consistent line ending on load.</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJwbKaklp7As_T5x34FpICXkmudcoa5xMnvNb3_IhecxcKVsCBB-7XphvSoDcpnOY1XTi8_tXu2eOeZhABbtmT1e02SP0qvVuYVhW5vmQbtzsF-LQuFSSqhr3zWLWQ78dCVgDXpoF9lwA/s1600/484534d73259d3692102259bf89f20e4-715878.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6717416545773658066" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYJwbKaklp7As_T5x34FpICXkmudcoa5xMnvNb3_IhecxcKVsCBB-7XphvSoDcpnOY1XTi8_tXu2eOeZhABbtmT1e02SP0qvVuYVhW5vmQbtzsF-LQuFSSqhr3zWLWQ78dCVgDXpoF9lwA/s1600/484534d73259d3692102259bf89f20e4-715878.png" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
開啟有問題的預存程序,</div>
<div>
會提示有編碼問題,請按下 [Yes] 進行修正</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinbHxgIEafkE5r5L1AxL4AM4SIA0hIsacA-O5zORYPRPmjpI-QvS8qyHaBbjVnQsRUQ5Pt3E2SgNeK5l4SSkCj-slUIm6mS_56AG1PPyJ_SP_620rxKNVgJj3NFqncMf084rB_2jnrXpQv/s1600/4a404bcba06c7382f40ee0f7a1e92886-721140.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_6717416570534648994" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinbHxgIEafkE5r5L1AxL4AM4SIA0hIsacA-O5zORYPRPmjpI-QvS8qyHaBbjVnQsRUQ5Pt3E2SgNeK5l4SSkCj-slUIm6mS_56AG1PPyJ_SP_620rxKNVgJj3NFqncMf084rB_2jnrXpQv/s1600/4a404bcba06c7382f40ee0f7a1e92886-721140.png" /></a></div>
<div>
<br /></div>
<br />
<hr />
參考資料</div>
<div>
CRLF跟LF之區別 --- 隱形的 bug</div>
<div>
<a href="http://violin-tao.blogspot.com/2016/05/crlflf-bug.html">http://violin-tao.blogspot.com/2016/05/crlflf-bug.html</a></div>
<div>
<br /></div>
<div>
Git 在 Windows 平台處理斷行字元 (CRLF) 的注意事項</div>
<div>
<a href="https://blog.miniasp.com/post/2013/09/15/Git-for-Windows-Line-Ending-Conversion-Notes">https://blog.miniasp.com/post/2013/09/15/Git-for-Windows-Line-Ending-Conversion-Notes</a></div>
<div>
<br /></div>
</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-26409267798520928032019-07-21T09:59:00.000+08:002019-07-21T09:59:44.677+08:00Slack 訊息與 Trello 工作有官方整合 App<div class="ennote">
<div>
<div>
<b>Slack -> Trello</b></div>
<div>
在 Slack 中直接新增與編輯 Trello 工作卡</div>
<div>
<br /></div>
<div>
<a href="https://slack.com/apps/A074YH40Z-trello">https://slack.com/apps/A074YH40Z-trello</a></div>
<div>
<br /></div>
<div>
<a href="https://help.trello.com/article/1049-slack-app">https://help.trello.com/article/1049-slack-app</a></div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6a74ilCPfTOUeKkMaER3yKO6akZQiaj3gt2GR3ymPDKlYRhKcHy7q3b8e4n1V5HDtHAKWR4VP7GahMZ8fBSoF0RYAxIf6tFGd5Xsy_Q4QykmKSJnVUxvGMQH00XDFCiuq-4LFmHYc_jxk/s1600/b75e12a537ce5e155727ea42e77d01bc-729045.gif"><img alt="" border="0" height="250" id="BLOGGER_PHOTO_ID_6715929691752405794" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6a74ilCPfTOUeKkMaER3yKO6akZQiaj3gt2GR3ymPDKlYRhKcHy7q3b8e4n1V5HDtHAKWR4VP7GahMZ8fBSoF0RYAxIf6tFGd5Xsy_Q4QykmKSJnVUxvGMQH00XDFCiuq-4LFmHYc_jxk/s400/b75e12a537ce5e155727ea42e77d01bc-729045.gif" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<hr />
<div>
<span style="font-weight: bold;">Trello -> </span><span style="font-weight: bold;">Slack </span></div>
<div>
編輯 Trello 工作卡時,同步訊息到 Slack</div>
<div>
<a href="https://trello.com/power-ups/55a5d917446f51777421000a/slack">https://trello.com/power-ups/55a5d917446f51777421000a/slack</a></div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTns2VofydTKW1GOOExA94ObZSHOZqd1yw3KYD5xsU_VpCfrFa7rAjdvSo3wajRPF4CKVad0GaHBMLKYx_8mGRX6AWYQNK7uXaNol9ugQcyO46_cidcmaUXEau7rVkedEJdHQktPoYD7J6/s1600/db6aa637523349dd4cb72cd31d7c1e8d-734000.jpeg"><img alt="" border="0" height="410" id="BLOGGER_PHOTO_ID_6715929709116408562" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTns2VofydTKW1GOOExA94ObZSHOZqd1yw3KYD5xsU_VpCfrFa7rAjdvSo3wajRPF4CKVad0GaHBMLKYx_8mGRX6AWYQNK7uXaNol9ugQcyO46_cidcmaUXEau7rVkedEJdHQktPoYD7J6/s640/db6aa637523349dd4cb72cd31d7c1e8d-734000.jpeg" width="640" /></a></div>
<div>
<br /></div>
<hr />
<div>
<br /></div>
</div>
</div>
<table cellpadding="0" cellspacing="0" style="border-top: 1px solid #e6e6e6; margin-bottom: 16px; margin-top: 32px; padding-top: 16px; width: 100%px;"> <tbody>
<tr> <td style="color: #333333; font-family: "helvetica" , "arial" , sans-serif; font-size: 13px; line-height: 16px; text-align: left;">Evernote helps you remember everything and get organized effortlessly. <a href="https://www.evernote.com/getit?utm_source=service&utm_medium=email&utm_content=emailNote&email_name=emailNote&email_guid=6675084b-2087-48be-afb6-9acf667f1d87&email_link=download_app" style="color: #5fb336; text-decoration: none;" target="_blank">Download Evernote</a>. </td> </tr>
</tbody></table>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-10984349623714276222019-07-15T12:38:00.000+08:002019-07-15T12:39:18.789+08:00Windows 10 建立虛擬磁碟<div class="ennote">
<div>
Windows 10 磁碟管理中可以新增虛擬磁碟,建立與解除虛擬磁碟步驟如下:</div>
<div>
<br /></div>
<hr />
<div>
掛載虛擬磁碟</div>
<div>
<br /></div>
<div>
[Winodws] 鍵 > 右鍵 > [磁碟管理]</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR5gslCL2MCyO3Q3OPNBP4vvAN-E43gsMs2jMOU7ma77CBobV9IIdDH9Pc_gxkuCDr0EEXEXKpICy4Vl3P-pZvro93QDIv7O23Jn-Kamk9xfZSDCGwPEKK9bcm7_Xv4UbY6_GE9KpLNika/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="532" data-original-width="269" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR5gslCL2MCyO3Q3OPNBP4vvAN-E43gsMs2jMOU7ma77CBobV9IIdDH9Pc_gxkuCDr0EEXEXKpICy4Vl3P-pZvro93QDIv7O23Jn-Kamk9xfZSDCGwPEKK9bcm7_Xv4UbY6_GE9KpLNika/s1600/1.jpg" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
進入 磁碟管理 </div>
<div>
開啟選單 [Action] > [Create VHD]</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0C0NIMuAbnySYoi5CxRxT62MHyoJtOZ4d7u8sh4Y_eW6ju89d4znXx3YfXCBOIbiSY5wl_QUvbx19LgoWNSHgY4sIQOTVxRfA5kPvvaUyLaifFaJWpSQjMn36r2MneVssoKQppmAsgEiv/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="597" data-original-width="754" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0C0NIMuAbnySYoi5CxRxT62MHyoJtOZ4d7u8sh4Y_eW6ju89d4znXx3YfXCBOIbiSY5wl_QUvbx19LgoWNSHgY4sIQOTVxRfA5kPvvaUyLaifFaJWpSQjMn36r2MneVssoKQppmAsgEiv/s1600/2.png" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
輸入虛擬磁碟儲存的位置與容量大小</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh83VbuaXruqlNszAejJfPC1Fc0_f8YK3dF6XPYzVeykgzobS0sy9nkfTWlg8U5r0TNNPgpfopWnSreYGi4bKsbElmIo0w8526JjBFZ7KM4gJTmXt09cv5tzuHXGxhOWpgL5YHcu2oSBG3W/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="436" data-original-width="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh83VbuaXruqlNszAejJfPC1Fc0_f8YK3dF6XPYzVeykgzobS0sy9nkfTWlg8U5r0TNNPgpfopWnSreYGi4bKsbElmIo0w8526JjBFZ7KM4gJTmXt09cv5tzuHXGxhOWpgL5YHcu2oSBG3W/s1600/3.png" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
在新增的磁碟按右鍵 > 初始化</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZYaqbLpl-aXljGJqqUp57F_1h78nXW21vu8G8xOAulHeMfaK2CY37SI1Ca3mzmJeAY3YM-Asw7Sy3oJiXiKyclU_-3wMv2bskU_JMAvYkIjnSJDu50E-MB07unop7-TjvAZaPh_gWZo8/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="597" data-original-width="776" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZYaqbLpl-aXljGJqqUp57F_1h78nXW21vu8G8xOAulHeMfaK2CY37SI1Ca3mzmJeAY3YM-Asw7Sy3oJiXiKyclU_-3wMv2bskU_JMAvYkIjnSJDu50E-MB07unop7-TjvAZaPh_gWZo8/s1600/4.png" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
完成初始化後,新增磁碟區</div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLiAhfd7ec0ZuSBLIzJ5JN4I0NBXyOXijn1TpDo3BFtLYFtoqiVqNt8rzNelahbcTyKNEYzr2DRjW2INSTV4MpE7cXqGv53-XpJWtzMX4rexe2BCOJoZFKClqdxsVSd07Lww4MpIHKJ8tV/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="597" data-original-width="754" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLiAhfd7ec0ZuSBLIzJ5JN4I0NBXyOXijn1TpDo3BFtLYFtoqiVqNt8rzNelahbcTyKNEYzr2DRjW2INSTV4MpE7cXqGv53-XpJWtzMX4rexe2BCOJoZFKClqdxsVSd07Lww4MpIHKJ8tV/s1600/5.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfiGgy1HldqSWiGGGybIA4z-58hcwjsLWf0TNugU90YaggnyTrnm-l9J3wlS9kXWiAtkAVWuSEyRLAM-CTI5sbqLXCP8ol2gOp7eHKuy6TVSLSq2pNOYXx-z5xtpSHSNV2IIfjkPljgFof/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="393" data-original-width="499" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfiGgy1HldqSWiGGGybIA4z-58hcwjsLWf0TNugU90YaggnyTrnm-l9J3wlS9kXWiAtkAVWuSEyRLAM-CTI5sbqLXCP8ol2gOp7eHKuy6TVSLSq2pNOYXx-z5xtpSHSNV2IIfjkPljgFof/s1600/6.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_ZtOZRfnOjDCMeNe8ZfkglTLYghyphenhyphen1_pLyQOcboIrAbqTomUaUE7VssB67H_fulQvDEn6jPh67hQhgOVcf9tlx_0n1LKfjryKYBhmoZymr8lpjSMKLic_yhPF-VskTQujIxw19uPVNt10i/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="393" data-original-width="499" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_ZtOZRfnOjDCMeNe8ZfkglTLYghyphenhyphen1_pLyQOcboIrAbqTomUaUE7VssB67H_fulQvDEn6jPh67hQhgOVcf9tlx_0n1LKfjryKYBhmoZymr8lpjSMKLic_yhPF-VskTQujIxw19uPVNt10i/s1600/7.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUawR45CbQgrEwgK_3l8_7pg3fg-loOJ3NW8FxWMinHV6pZ_dTumA__ipWSwfkcEaYOWXHymIRUtOWtlY41BiLhhZIN2du_VB8YI8ORd7asna1rZynt1YA-MImcCMSGLBqfJIg9rqZsdSa/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="393" data-original-width="499" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUawR45CbQgrEwgK_3l8_7pg3fg-loOJ3NW8FxWMinHV6pZ_dTumA__ipWSwfkcEaYOWXHymIRUtOWtlY41BiLhhZIN2du_VB8YI8ORd7asna1rZynt1YA-MImcCMSGLBqfJIg9rqZsdSa/s1600/8.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE9AIpt8j6o-DI_W66I-GyVeYlSixl5mkqJ404WnF8kM1sqH-NjiDGUvE5Uub5jyfjGjd8tfZv9AF25SbMh1KYUBZmDBH9MlnNSR4EgHSOYOfpAAPCJ7814u0-t0E8E1ZIH5Ng3_2D-xQP/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="393" data-original-width="499" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhE9AIpt8j6o-DI_W66I-GyVeYlSixl5mkqJ404WnF8kM1sqH-NjiDGUvE5Uub5jyfjGjd8tfZv9AF25SbMh1KYUBZmDBH9MlnNSR4EgHSOYOfpAAPCJ7814u0-t0E8E1ZIH5Ng3_2D-xQP/s1600/9.png" /></a></div>
<br /></div>
<div>
<br /></div>
<div>
完成後,在檔案總管中可以看到新的磁碟
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOgDJwSPRBdJRlcfB5DqQxAgB3SSs8VoQguy_ZEKbqS2zoHoHn_eiMKS8W4VUFgSdlf5LWQn6KqGXCKidKepselj1J363oJkri7rtoCtexCFrUeu_dYS6ycMqka70uU5lOtCeMtEQM3JO6/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="212" data-original-width="523" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOgDJwSPRBdJRlcfB5DqQxAgB3SSs8VoQguy_ZEKbqS2zoHoHn_eiMKS8W4VUFgSdlf5LWQn6KqGXCKidKepselj1J363oJkri7rtoCtexCFrUeu_dYS6ycMqka70uU5lOtCeMtEQM3JO6/s1600/10.png" /></a></div>
<br /></div>
<div>
<br /></div>
<hr />
<div>
解除虛擬磁碟</div>
<div>
<br /></div>
<div>
點擊要解除虛擬硬碟 按右鍵 [解除虛擬磁碟]<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyuplTCJE74jzXYZnRo-fKN2P57r-USMjFfrMlAn__smVuScKtbiXcHpTzdjFpbjiPC1B2ZlaPGMYByiIiHa53iGDhK9lT4hog4GAIMnj4jM70Xtb7j_tr-QlCcwuj2nD1fvZfkXcLIW9b/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="597" data-original-width="776" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyuplTCJE74jzXYZnRo-fKN2P57r-USMjFfrMlAn__smVuScKtbiXcHpTzdjFpbjiPC1B2ZlaPGMYByiIiHa53iGDhK9lT4hog4GAIMnj4jM70Xtb7j_tr-QlCcwuj2nD1fvZfkXcLIW9b/s1600/11.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhebiOhf3EJukS4LdpesEHtVYEWtPuPrxMjv1brh8Mx8yk6xH-gkDtU9ddVv_hqZnBuqObEQhUk-yDA-FdHaM4ZTm2w2GP2lah5tM1lWK0D1eoiulwu_zG8G2R4FeaINNHAIlNNAAFZDrzY/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="242" data-original-width="482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhebiOhf3EJukS4LdpesEHtVYEWtPuPrxMjv1brh8Mx8yk6xH-gkDtU9ddVv_hqZnBuqObEQhUk-yDA-FdHaM4ZTm2w2GP2lah5tM1lWK0D1eoiulwu_zG8G2R4FeaINNHAIlNNAAFZDrzY/s1600/12.png" /></a></div>
<br /></div>
</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-48242298424179394532019-04-30T17:38:00.000+08:002019-08-05T10:47:17.896+08:00SQL Server Partition Table T-SQL 分割資料表實作步驟<div class="ennote">
<div style="min-height: 11pt; text-align: left;">
<br /></div>
<div style="min-height: 11pt; text-align: left;">
1 新增空白資料庫</div>
<div style="background-color: rgb(251 , 250 , 248); border-radius: 4px; border: 1px solid rgba(0 , 0 , 0 , 0.15); box-sizing: border-box; color: rgb(51 , 51 , 51); font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace; font-size: 12px; padding: 8px;">
<div>
USE [master]</div>
<div>
GO</div>
<div>
CREATE DATABASE [PartitionTableLab]</div>
<div>
CONTAINMENT = NONE</div>
<div>
ON PRIMARY</div>
<div>
( NAME = N'PartitionTableLab', FILENAME = N'F:\SQL_DATA\PartitionTableLab.mdf' , SIZE = 1024KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )</div>
<div>
LOG ON</div>
<div>
( NAME = N'PartitionTableLab_log', FILENAME = N'F:\SQL_DATA\PartitionTableLab_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 1024KB )</div>
<div>
GO</div>
</div>
<div style="min-height: 11pt; text-align: left;">
<br /></div>
<div style="min-height: 11pt; text-align: left;">
<br /></div>
<div style="min-height: 11pt; text-align: left;">
<br /></div>
<div style="min-height: 11pt; text-align: left;">
2 以年度建立 Partition Function 與 Partition Schema</div>
<div style="background-color: rgb(251 , 250 , 248); border-radius: 4px; border: 1px solid rgba(0 , 0 , 0 , 0.15); box-sizing: border-box; color: rgb(51 , 51 , 51); font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace; font-size: 12px; padding: 8px;">
<div>
USE [master]</div>
<div>
GO<br />
<br /></div>
<div>
ALTER DATABASE [PartitionTableLab] ADD FILEGROUP [FG_2012];</div>
<div>
ALTER DATABASE [PartitionTableLab] ADD FILEGROUP [FG_2013];</div>
<div>
ALTER DATABASE [PartitionTableLab] ADD FILEGROUP [FG_2014];</div>
<div>
GO<br />
<br /></div>
<div>
ALTER DATABASE [PartitionTableLab] ADD FILE ( NAME = N'HIS_2012', FILENAME = N'F:\SQL_DATA\PartitionTableLab_his_2012.ndf'</div>
<div>
, SIZE = 1024KB , FILEGROWTH = 1024KB )</div>
<div>
TO FILEGROUP [FG_2012]</div>
<div>
GO</div>
<div>
ALTER DATABASE [PartitionTableLab] ADD FILE ( NAME = N'HIS_2013', FILENAME = N'F:\SQL_DATA\PartitionTableLab_his_2013.ndf'</div>
<div>
, SIZE = 1024KB , FILEGROWTH = 1024KB )</div>
<div>
TO FILEGROUP [FG_2013]</div>
<div>
GO</div>
<div>
ALTER DATABASE [PartitionTableLab] ADD FILE ( NAME = N'HIS_2014', FILENAME = N'F:\SQL_DATA\PartitionTableLab_his_2014.ndf'</div>
<div>
, SIZE = 1024KB , FILEGROWTH = 1024KB )</div>
<div>
TO FILEGROUP [FG_2014]</div>
<div>
GO</div>
<div>
USE [PartitionTableLab];</div>
<div>
GO<br />
<br /></div>
<div>
/*</div>
<div>
DROP TABLE Orders;</div>
<div>
DROP PARTITION SCHEME P_Scheme;</div>
<div>
DROP PARTITION FUNCTION P_Func;</div>
<div>
*/</div>
<div>
/*建立 Partition Function 與 Partition Schema */</div>
<div>
CREATE PARTITION FUNCTION P_Func(datetime)</div>
<div>
AS RANGE RIGHT FOR VALUES</div>
<div>
(convert(date, '2013-01-01')</div>
<div>
,convert(date, '2014-01-01')</div>
<div>
);</div>
<div>
GO<br />
<br /></div>
<div>
CREATE PARTITION SCHEME P_Scheme</div>
<div>
AS PARTITION P_Func TO (FG_2012, FG_2013, FG_2014);</div>
<div>
GO</div>
</div>
<div style="min-height: 11pt; text-align: left;">
<br /></div>
<div style="min-height: 11pt; text-align: left;">
<br /></div>
<div style="min-height: 11pt; text-align: left;">
<br /></div>
<div style="min-height: 11pt; text-align: left;">
3. 建立資料表並填入資料至其中一個年度, 驗證該年度的分割資料表實體檔案有增加</div>
<div style="background-color: #fbfaf8; border-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; padding: 8px;">
<div>
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;">/*新增資料並儲存於 Partition Schema */</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;">CREATE TABLE Orders(</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;"><span style="white-space: pre;"> </span>OrderID int NOT NULL,</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;"><span style="white-space: pre;"> </span>OrderDate datetime NOT NULL,</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;"><span style="white-space: pre;"> </span>OrderRemark nchar(1024) NULL,</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;"><span style="white-space: pre;"> </span>CONSTRAINT PK_Orders PRIMARY KEY CLUSTERED </span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;"><span style="white-space: pre;"> </span>(</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;"><span style="white-space: pre;"> </span>OrderID ASC,</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;"><span style="white-space: pre;"> </span>OrderDate ASC</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;"><span style="white-space: pre;"> </span>) ON P_Scheme(OrderDate)</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;">) ON [PRIMARY];</span></span><br />
<span style="color: #333333; font-family: monaco, menlo, consolas, courier new, monospace;"><span style="font-size: 12px;">GO</span></span></div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
<br /></div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
/*查詢 Partition 有幾筆資料 */</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
SELECT index_id, partition_number, rows</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
FROM sys.partitions</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
WHERE object_id = OBJECT_ID('Orders')</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
ORDER BY index_id, partition_number;</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
GO<br />
<br /></div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
/*新增多筆資料在單一年度中*/</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
DECLARE @OrderRemark char(1024)</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
DECLARE @X1 int = 1, @X2 int = 1;</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
WHILE (@X1<=@X2)</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
BEGIN</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
DECLARE @run int = 1, @end int = 330</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
WHILE (@run<=@end)</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
BEGIN</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
SET @OrderRemark = convert(varchar(36),NEWID())+'|'+convert(varchar(36),NEWID())+'|'+convert(varchar(36),NEWID());</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
insert into Orders(OrderID, OrderDate, OrderRemark)</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
values((@X1*@end+@run), DATEADD(day, @run, convert(date, '2013-01-01')), @OrderRemark)</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
SET @run = @run + 1;</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
END</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
SET @X1 = @X1 + 1;</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
END</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
GO<br />
<br /></div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
/*新增一個年度的儲存檔案 */</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
ALTER DATABASE [PartitionTableLab] ADD FILEGROUP [FG_2015];</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
GO</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
ALTER DATABASE [PartitionTableLab] ADD FILE ( NAME = N'HIS_2015', FILENAME = N'F:\SQL_DATA\PartitionTableLab_his_2015.ndf'</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
, SIZE = 1024KB , FILEGROWTH = 1024KB )</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
TO FILEGROUP [FG_2015];</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
GO</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
ALTER PARTITION SCHEME P_Scheme</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
NEXT USED FG_2015;</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
GO</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
ALTER PARTITION FUNCTION [P_Func]()</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
SPLIT RANGE (convert(date, '2015-01-01'));</div>
<div style="color: #333333; font-family: monaco, menlo, consolas, "courier new", monospace; font-size: 12px;">
GO</div>
</div>
<div style="text-align: left;">
<br />
<br />
4. 回復重新建立分割資料表<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmznzLe2yu9UcDJVM2myj-hyYj1Su6geKhkygeX5t0bxnwJEIuknLIfUHp43bwY1INKmZlGFr2yaTOwG00UPzFMH4xyt0eVEb1VfLw-nhw5rgeOGlNuDTiXj5Q3TUXTxAV-ZS74yQHrI6m/s1600/2019-08-05_10-21-01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="722" data-original-width="1017" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmznzLe2yu9UcDJVM2myj-hyYj1Su6geKhkygeX5t0bxnwJEIuknLIfUHp43bwY1INKmZlGFr2yaTOwG00UPzFMH4xyt0eVEb1VfLw-nhw5rgeOGlNuDTiXj5Q3TUXTxAV-ZS74yQHrI6m/s1600/2019-08-05_10-21-01.jpg" /></a></div>
<br />
<div style="-en-clipboard: true; text-align: left;">
從各個分割資料表中移回主要資料表</div>
<div style="-en-codeblock: true; background-color: #fbfaf8; border-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; padding: 8px;">
<div>
<span style="font-size: 10pt;">ALTER TABLE Orders DROP CONSTRAINT PK_Orders</span></div>
<div>
<span style="font-size: 10pt;">GO</span></div>
<div>
<span style="font-size: 10pt;"><br /></span></div>
<div>
<span style="font-size: 10pt;">ALTER TABLE Orders ADD CONSTRAINT PK_Orders PRIMARY KEY CLUSTERED</span></div>
<div>
<span style="font-size: 10pt;">(</span></div>
<div>
<span style="font-size: 10pt;"> OrderID ASC,</span></div>
<div>
<span style="font-size: 10pt;"> OrderDate ASC</span></div>
<div>
<span style="font-size: 10pt;">) ON [PRIMARY]</span></div>
<div>
<span style="font-size: 10pt;">GO</span></div>
<div>
<span style="font-size: 10pt;"><br /></span></div>
<div>
<span style="font-size: 10pt;">/*查詢 Partition 有幾筆資料 */</span></div>
<div>
<span style="font-size: 10pt;">SELECT index_id, partition_number, rows</span></div>
<div>
<span style="font-size: 10pt;">FROM sys.partitions</span></div>
<div>
<span style="font-size: 10pt;">WHERE object_id = OBJECT_ID('Orders')</span></div>
<div>
<span style="font-size: 10pt;">ORDER BY index_id, partition_number;</span></div>
<div>
<span style="font-size: 10pt;">GO</span></div>
</div>
<br />
<div style="text-align: left;">
<div>
<br /></div>
<div>
<br /></div>
<div>
從主要資料表移置個分割資料表</div>
<div style="-en-codeblock: true; background-color: #fbfaf8; border-radius: 4px; border: 1px solid rgba(0, 0, 0, 0.15); box-sizing: border-box; color: #333333; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; padding: 8px;">
<div>
<span style="font-size: 10pt;">ALTER TABLE Orders DROP CONSTRAINT PK_Orders</span></div>
<div>
<span style="font-size: 10pt;">GO</span></div>
<div>
<span style="font-size: 10pt;"><br /></span></div>
<div>
<span style="font-size: 10pt;">ALTER TABLE Orders ADD CONSTRAINT PK_Orders PRIMARY KEY CLUSTERED</span></div>
<div>
<span style="font-size: 10pt;">(</span></div>
<div>
<span style="font-size: 10pt;"> OrderID ASC,</span></div>
<div>
<span style="font-size: 10pt;"> OrderDate ASC</span></div>
<div>
<span style="font-size: 10pt;">) ON P_Scheme(OrderDate)</span></div>
<div>
<span style="font-size: 10pt;">GO</span></div>
<div>
<span style="font-size: 10pt;"><br /></span></div>
<div>
<span style="font-size: 10pt;">/*查詢 Partition 有幾筆資料 */</span></div>
<div>
<span style="font-size: 10pt;">SELECT index_id, partition_number, rows</span></div>
<div>
<span style="font-size: 10pt;">FROM sys.partitions</span></div>
<div>
<span style="font-size: 10pt;">WHERE object_id = OBJECT_ID('Orders')</span></div>
<div>
<span style="font-size: 10pt;">ORDER BY index_id, partition_number;</span></div>
<div>
<span style="font-size: 10pt;">GO</span></div>
</div>
</div>
<br />
<br /></div>
</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-7034083642113352813.post-49758030554122129322019-03-27T15:16:00.001+08:002021-08-29T14:15:47.439+08:00T-SQL 透過 XOR / AND 運算式做複合式判斷 1, 2, 4, 8, 16 列舉值<div class="ennote">
<div>
<div>
若想用一個數值表示多個條件是否成立,這些複合條件設計一個列舉 ,</div>
<div>
每個條件對應一個 <span style="color: rgb(84 , 84 , 84); font-family: "arial" , sans-serif; font-size: small; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">2 的幕次方,如:</span>1, 2, 4, 8, 16...</div>
<div>
<br /></div>
<div>
舉例 </div>
<div>
1 號條件值 = 1: 0001</div>
<div>
2 號條件值 = 2: 0010</div>
<div>
3 號條件值 = 4: 0100</div>
<div>
4 號條件值 = 8: 1000</div>
<div>
<br /></div>
<div>
有個變數 A 包含 1 號條件與 3 號條件 ,用 XOR 運算變數 A 等於 5</div>
<div>
0001</div>
<div>
0100</div>
<div>
------</div>
<div>
0101</div>
<div>
<br /></div>
<div>
比對 變數 A 是否有包含 3 號條件,用 AND 運算會得到 4,與 3 號條件的值相同,表示成立</div>
<div>
0101</div>
<div>
0100</div>
<div>
------</div>
<div>
0100</div>
<div>
<br /></div>
<div>
比對 變數 A 是否有包含 數值 2,用 AND 運算會得到 0,與 2 號條件的值不同,表示不成立</div>
<div>
0101</div>
<div>
0010</div>
<div>
------</div>
<div>
0000</div>
<div>
<br /></div>
<hr />
<div>
以 T-SQL 實作範例</div>
<div style="min-height: 11pt; text-align: left;">
<br /></div>
<div style="min-height: 11pt; text-align: left;">
<div style="background-color: rgb(251 , 250 , 248); border-radius: 4px; border: 1px solid rgba(0 , 0 , 0 , 0.15); box-sizing: border-box; color: rgb(51 , 51 , 51); font-family: "monaco" , "menlo" , "consolas" , "courier new" , monospace; font-size: 12px; padding: 8px;">
<div>
/*Enums */</div>
<div>
DECLARE @Gold int = 1, @Silver int = 2, @Pearl int = 4, @Diamond int = 8;</div>
<div>
DECLARE @MyGift int;</div>
<div>
<br /></div>
<div>
/*Add some */</div>
<div>
SET @MyGift = @Gold | @Diamond;</div>
<div>
<br /></div>
<div>
/*Check if I have */</div>
<div>
select 'I have Gold', IIF(@Gold & @MyGift = @Gold, 'Yes', 'No')</div>
<div>
union all</div>
<div>
select 'I have Silver', IIF(@Silver & @MyGift = @Silver, 'Yes', 'No')</div>
<div>
union all</div>
<div>
select 'I have Pearl', IIF(@Pearl & @MyGift = @Pearl, 'Yes', 'No')</div>
<div>
union all</div>
<div>
select 'I have Diamond', IIF(@Diamond & @MyGift = @Diamond, 'Yes', 'No')</div>
</div>
</div>
<div style="min-height: 11pt; text-align: left;">
<span style="font-size: 9pt;"><br /></span></div>
</div>
<div>
<br /></div>
</div>
Unknownnoreply@blogger.com