<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>Raellen&apos;s notes</title><description>A blog of a developer who loves to code and share her knowledge with the world!</description><link>https://astro-docs.vercel.app</link><item><title>辦理失業給付的過程與經驗談</title><link>https://astro-docs.vercel.app/blog/%E8%BE%A6%E7%90%86%E5%A4%B1%E6%A5%AD%E7%B5%A6%E4%BB%98%E7%9A%84%E9%81%8E%E7%A8%8B%E8%88%87%E7%B6%93%E9%A9%97%E8%AB%87</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/%E8%BE%A6%E7%90%86%E5%A4%B1%E6%A5%AD%E7%B5%A6%E4%BB%98%E7%9A%84%E9%81%8E%E7%A8%8B%E8%88%87%E7%B6%93%E9%A9%97%E8%AB%87</guid><description>辦理失業給付的過程與經驗談</description><pubDate>Thu, 08 Jan 2026 16:11:00 GMT</pubDate><content:encoded>&lt;p&gt;很不幸地我被資遣了，由於是非自願離職，可以去勞動力發展署辦理就業保險失業給付。&lt;/p&gt;
&lt;p&gt;以下會列出所有過程，當作紀錄&lt;/p&gt;
&lt;p&gt;以下所有規則僅適用於中華民國地區&lt;/p&gt;
&lt;h2&gt;一、辦理離職&lt;/h2&gt;
&lt;p&gt;離職需要注意幾道程序跟細節：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;資遣預告期&lt;/li&gt;
&lt;li&gt;謀職假&lt;/li&gt;
&lt;li&gt;非自願離職證明書&lt;/li&gt;
&lt;li&gt;其他注意事項&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1. 資遣預告期&lt;/h3&gt;
&lt;p&gt;若勞工以在單位服務滿三個月，根據勞基法，資遣勞工是需要提前預告的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;年資3個月~未滿1年&lt;/strong&gt;：10天前預告。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;年資1年~未滿3年&lt;/strong&gt;：20天前預告。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;年資3年以上&lt;/strong&gt;：30天前預告。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果雇主沒有依法提前預告，雇主&lt;strong&gt;則必須將預告期折算成工資作為補償，另外發給員工「預告工資」；&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;否則勞工可以向勞方勞務提供地（工會為登記所在地）的地方政府(也就是公司所在地的地方政府)申請勞資爭議調解&lt;/p&gt;
&lt;h3&gt;2. 謀職假&lt;/h3&gt;
&lt;p&gt;謀職假就是讓勞工外出謀職的假別&lt;/p&gt;
&lt;p&gt;可以利用這個謀職假去其他公司面試&lt;/p&gt;
&lt;p&gt;呈上題，被通知被資遣到離職日的期間，每七日可以申請兩日的謀職假&lt;/p&gt;
&lt;h3&gt;3. 非自願離職證明書&lt;/h3&gt;
&lt;p&gt;若想申請失業給付，必須要請公司開立有非自願離職證明書&lt;/p&gt;
&lt;p&gt;內容必須包含勞工離職原因、公司用印、負責人簽名或印章&lt;/p&gt;
&lt;p&gt;屆時必須向勞動力發展署提供非自願離職證明書的正本，所以要注意不要拿到影本&lt;/p&gt;
&lt;p&gt;若公司不願提供非自願離職證明書，&lt;/p&gt;
&lt;p&gt;可向公司所在地的勞動部主管機關提出申訴或檢舉。&lt;/p&gt;
&lt;p&gt;利用勞資調解，透過第三方協助解決紛爭&lt;/p&gt;
&lt;p&gt;提起民事訴訟，要求雇主依法補發&lt;/p&gt;
&lt;h3&gt;4. 其他注意事項&lt;/h3&gt;
&lt;p&gt;簽署任何文件之前：&lt;/p&gt;
&lt;p&gt;離職時公司可能會要求簽署離職單或聲明書，&lt;/p&gt;
&lt;p&gt;請一定要看清楚上面寫的條文，只要是涉及「&lt;strong&gt;申請離職&lt;/strong&gt;」等字樣，就絕對不要簽&lt;/p&gt;
&lt;p&gt;因為這代表是勞工自己申請離職，而非公司資遣！&lt;/p&gt;
&lt;p&gt;還有勞工是有交接工作的義務的，最好是雙方簽署一份交接文件，拍照錄影存證&lt;/p&gt;
&lt;p&gt;若已有文件證明交接完畢，後續公司要求任何形式的交接可以不配合&lt;/p&gt;
&lt;h2&gt;二、 辦理失業給付&lt;/h2&gt;
&lt;h3&gt;1.  前往勞動力發展署辦理失業給付認定&lt;/h3&gt;
&lt;p&gt;前往辦理失業給付認定之前，可以先透過電話預約時段，避免在現場等太久&lt;/p&gt;
&lt;p&gt;辦理所需要的必要文件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;非自願離職證明&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;存摺&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;身分證&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;要扶養的父母或小孩的身分證或戶口名簿&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 失業給付認定流程&lt;/h3&gt;
&lt;p&gt;申請失業給付需經過14天無法推介就業或安排職訓的期間 (失業認定)&lt;/p&gt;
&lt;p&gt;大致上流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;失業認定 (14天)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初次認定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再次認定&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;失業認定期間若確實找不到工作，就可以申請初次認定&lt;/p&gt;
&lt;p&gt;只有認定成功後才會提供給付&lt;/p&gt;
&lt;h4&gt;失業認定流程&lt;/h4&gt;
&lt;p&gt;進入勞動力發展署後，會需要先填寫申請書及工作介紹卡，工作部分就是看現場提供的廠商及工作有哪些，自己填寫&lt;/p&gt;
&lt;p&gt;在申請流程中，櫃台人員將會詳細將所有須知都講清楚，&lt;/p&gt;
&lt;p&gt;在認定流程中最需要注意的是，櫃台人員將會開一張介紹卡(可自行選擇哪家廠商)，必須在14天內自行求職並且填寫完畢，透過掛號或是親自繳納的方式提供給人員，否則就無法進行下一步的認定&lt;/p&gt;
&lt;p&gt;←目前我在這個認定的步驟，如果有後續將會繼續更新&lt;/p&gt;
&lt;h3&gt;3. 失業期間的工作&lt;/h3&gt;
&lt;p&gt;成功認定後的失業期間是可以找工作的，但是如果超過「基本工資」(撰文期間最新的基本工資為每月
29,500元)，就不得請領失業給付&lt;/p&gt;
&lt;h4&gt;4. 提早就業獎助津貼&lt;/h4&gt;
&lt;p&gt;在領取失業補助的期間若提早找到工作，就可以領取「提早就業獎助津貼」&lt;/p&gt;
&lt;p&gt;發生被資遣的事情，沒有人願意，所以請各位要爭取自己的權益&lt;/p&gt;
&lt;h2&gt;參考資料：&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ilabor.ntpc.gov.tw/page/layoff/layoff-qa&quot;&gt;1. 資遣通報 Q&amp;#x26;A&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ilabor.ntpc.gov.tw/page/layoff/layoff-qa&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://www.518.com.tw/article/749&quot;&gt;2. 資遣通報、資遣預告日期如何算？資遣員工合法流程這2點不少&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.mol.gov.tw/1607/28162/28296/28410/28412/lpsimplelist&quot;&gt;3. 勞資爭議調解&lt;/a&gt;&lt;a href=&quot;https://www.518.com.tw/article/749&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.518.com.tw/article/749&quot;&gt;4. 謀職假怎麼算？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://kys.wda.gov.tw/News_Content.aspx?n=23&amp;#x26;s=2481&quot;&gt;5. 離職證明書如何申請？範本下載、用途與補助申請&lt;/a&gt;&lt;a href=&quot;https://www.518.com.tw/article/749&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/pexels-karola-g-8547448.D9zP0DyQ.jpg"/><enclosure url="/_astro/pexels-karola-g-8547448.D9zP0DyQ.jpg"/></item><item><title>Astro 加入 Cusdis 作為留言系統</title><link>https://astro-docs.vercel.app/blog/astro-%E5%8A%A0%E5%85%A5-cusdis-%E4%BD%9C%E7%82%BA%E7%95%99%E8%A8%80%E7%B3%BB%E7%B5%B1</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/astro-%E5%8A%A0%E5%85%A5-cusdis-%E4%BD%9C%E7%82%BA%E7%95%99%E8%A8%80%E7%B3%BB%E7%B5%B1</guid><description>Cusdis 加入 Astro的方法、外加添加CSS</description><pubDate>Mon, 13 Oct 2025 21:26:00 GMT</pubDate><content:encoded>&lt;p&gt;Cusdis 官方有提供語法使你可以嵌入留言板在 Astro blog裡&lt;br&gt;
但是有幾個問題&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CSS 很陽春&lt;/li&gt;
&lt;li&gt;如何根據 Astro 客製化 Config&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;1. Astro 客製化的 Config 如何寫&lt;/h2&gt;
&lt;p&gt;需要注意的是 data-page-id 那三個 page 相關的設定&lt;br&gt;
只要照這下面填，留言就能留到各個不同文章&lt;br&gt;
data-app-id請填官方給你的 id&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;div id=&quot;cusdis_thread&quot;
  data-host=&quot;https://cusdis.com&quot;
  data-app-id=&quot;here-is-your-id&quot;
  data-page-id={Astro.url.pathname}
  data-page-url={Astro.url.pathname}
  data-page-title={pageTitle}
&gt;&amp;#x3C;/div&gt;
&amp;#x3C;script async defer src=&quot;https://cusdis.com/js/cusdis.es.js&quot;&gt;&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 改 CSS&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在你嵌入 Cusdis 的頁面加入此 CSS&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-CSS&quot;&gt;&amp;#x3C;script&gt;
const observer = new MutationObserver((mutations) =&gt; {
mutations.forEach((mutation) =&gt; {
if (mutation.addedNodes.length == 0) return;
const iframe = mutation.addedNodes[0];
if (iframe.tagName !== &apos;IFRAME&apos;) return;

const additionalStyles = `
.dark {
background: black;
}
`;

iframe.srcdoc = iframe.srcdoc.replace(&apos;&amp;#x3C;/style&gt;&apos;, additionalStyles + &apos;&amp;#x3C;/style&gt;&apos;);
});
});
observer.observe(document.getElementById(&quot;cusdis_thread&quot;), { childList: true, subtree: true });
&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;additionalStyles&lt;/strong&gt; 裡面加入需要的 CSS&lt;/p&gt;
&lt;p&gt;但是 iframe 本身的高度跟滾動軸那些也被限制，&lt;br&gt;
所以要回到嵌入留言系統的頁面 (也就是上面那頁的父頁面，通常是[slug].astro)加入以下語法&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-CSS&quot;&gt;  #cusdis_thread iframe {
    border-radius: 12px;
    border: 2px solid #b6deef;
    width: 100%;
    min-height: 400px;
    transition: all 0.3s ease;
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根據自己需求在此加入需要的樣式即可&lt;/p&gt;
&lt;p&gt;參考資料：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://barthpaleologue.github.io/Blog/posts/add-and-customize-cusdis-hugo/&quot;&gt;Add and customize Cusdis with Hugo &lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="/_astro/pawel-czerwinski-dxzdthscqfi-unsplash.CgC1-sNF.jpg"/><enclosure url="/_astro/pawel-czerwinski-dxzdthscqfi-unsplash.CgC1-sNF.jpg"/></item><item><title>Youtube 影片下載不求人 (yt-dlp)</title><link>https://astro-docs.vercel.app/blog/youtube-%E4%B8%8B%E8%BC%89%E4%B8%8D%E6%B1%82%E4%BA%BA-yt-dlp</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/youtube-%E4%B8%8B%E8%BC%89%E4%B8%8D%E6%B1%82%E4%BA%BA-yt-dlp</guid><description>利用 yt-dlp 快速下載 Youtube 上的影片</description><pubDate>Wed, 11 Jun 2025 13:11:00 GMT</pubDate><content:encoded>&lt;p&gt;本文以 Windows 系統為主進行教學&lt;/p&gt;
&lt;h2&gt;安裝工具&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/yt-dlp/yt-dlp/releases&quot;&gt;yt-dlp&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下載對應自己系統的版本，若你使用 Windows，請下載yt-dlp.exe&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/yt-dlp/FFmpeg-Builds/releases&quot;&gt;ffmpeg(yt-dlp 訂製版本)&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;依照電腦版本下載，若為 64 位元，就下載 &lt;strong&gt;ffmpeg-master-latest-win64-gpl.zip&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;下載好後解壓縮並放進資料夾，將資料夾命名為 **ffmpeg**&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在電腦任一處建立 yt-dlp 資料夾，並將 yt-dlp.exe 及 ffmpeg 資料夾放在 yt-dlp 裡面&lt;/p&gt;
&lt;h2&gt;設定環境變數&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在搜尋列中搜尋「編輯系統環境變數」，點進去&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-docs.vercel.app/_astro/%E8%9E%A2%E5%B9%95%E6%93%B7%E5%8F%96%E7%95%AB%E9%9D%A2-2025-06-11-132004.B7IlvL5I_ufo1G.webp&quot; alt=&quot;編輯系統環境變數&quot; title=&quot;編輯系統環境變數&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;點選右下角環境變數部分&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-docs.vercel.app/_astro/%E8%9E%A2%E5%B9%95%E6%93%B7%E5%8F%96%E7%95%AB%E9%9D%A2-2025-06-11-132127.CCSnG8za_IW81S.webp&quot; alt=&quot;環境變數&quot; title=&quot;選擇環境變數&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在系統變數下找到 Path，並對Path點兩下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-docs.vercel.app/_astro/%E8%9E%A2%E5%B9%95%E6%93%B7%E5%8F%96%E7%95%AB%E9%9D%A2-2025-06-11-132804.MMcKclbA_ZvDp16.webp&quot; alt=&quot;新增 path&quot; title=&quot;新增 path&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;點選新增，加入剛才 yt-dlp的資料夾&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再一次點選新增，加入yt-dlp底下的ffmpeg中的bin 資料夾 &lt;code&gt;yt-dlp\ffmpeg\bin&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一路按&lt;strong&gt;確定&lt;/strong&gt;，直到按到環境變數視窗也被關掉。一定要按確定，否則不會成功加進去&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;新增設定&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;到 Windows 的 Roaming&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;會在 &lt;code&gt;C:\Users\UserName\AppData\Roaming&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;也可以在搜尋欄搜尋&lt;code&gt;%appdata%&lt;/code&gt;進入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-docs.vercel.app/_astro/%E8%9E%A2%E5%B9%95%E6%93%B7%E5%8F%96%E7%95%AB%E9%9D%A2-2025-06-11-134527.BUqpBjxw_ZnKJ8J.webp&quot; alt=&quot;%appdata%&quot; title=&quot;用 %appdata% 快速進入 Roaming 資料夾&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新建資料夾取名為 yt-dlp，並進入此 yt-dlp 資料夾&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在此新建新文件： config.txt &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在config.txt 中輸入以下內容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;--output &apos;[PATH]\%(title)s.%(ext)s&apos;
--force-ipv4
--concurrent-fragments 8
--part
--continue
--throttled-rate 200K
--retries 10
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--output &apos;[PATH]\%(title)s.%(ext)s&apos;&lt;/code&gt;是設定下載影片要儲存的位置，&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PATH的地方輸入資料夾位置，我的位置在C:\videos，&lt;/p&gt;
&lt;p&gt;所以第一行要改為&lt;code&gt;--output &apos;C:\videos\%(title)s.%(ext)s&apos;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;開始使用&lt;/h2&gt;
&lt;p&gt;用系統管理員角色打開 cmd ，或你習慣的 terminal&lt;/p&gt;
&lt;p&gt;在 cmd 中，輸入 &lt;code&gt;yt-dlp youtube-url&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;youtube-url 網址的部分，就輸入你想下載的 youtube 網址&lt;/p&gt;
&lt;p&gt;接著就會開始下載了，下載完後，可以在你先前設定的下載資料夾中找到&lt;/p&gt;
&lt;h2&gt;參考來源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://home.gamer.com.tw/creationDetail.php?sn=5969214&quot;&gt;【密技】yt-dlp — 傳說中的辣個工具 Ver. 2.0 (2024年重新編寫第二版)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="/_astro/pexels-photo-5077064.DZBURoBQ.webp"/><enclosure url="/_astro/pexels-photo-5077064.DZBURoBQ.webp"/></item><item><title>Django 架設筆記</title><link>https://astro-docs.vercel.app/blog/django-%E6%9E%B6%E8%A8%AD%E7%AD%86%E8%A8%98</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/django-%E6%9E%B6%E8%A8%AD%E7%AD%86%E8%A8%98</guid><description>快速架設 Django 伺服器</description><pubDate>Sat, 07 Jun 2025 22:25:00 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;新增資料夾 &lt;code&gt;project&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;進powershell&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打指令&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Set-ExecutionPolicy RemoteSigned
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按 Y&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;關掉視窗&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;開啟 Anaconda powershell prompt&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;輸入指令&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;	conda init powershell
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;關掉視窗&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;開啟 Anaconda prompt&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安裝 virtualenv&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;pip install virtualenv
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cd到project資料夾&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果要指到D槽,則輸入&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;D:
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打指令 創建虛擬環境&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;virtualenv backendvenv
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;創好後,進入虛擬環境(前面會寫backendvenv)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;backendvenv\Scripts\activate
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安裝 django 專案&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在虛擬環境中，安裝django&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;pip install django
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;確認是否成功&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;django-admin --version
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建立新專案 (myproject的部分改成你的專案名稱)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;django-admin startproject myproject
cd myproject
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;創建後台&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;建立資料庫&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;python manage.py migrate
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;創立後臺管理員帳號&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;python manage.py createsuperuser
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按照它的提示輸入帳號、email、密碼等資訊&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;啟動專案&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;python manage.py runserver
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在瀏覽器輸入這個網址，進入前端介面&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;http://127.0.0.1:8000/
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;輸入這個網址，進入後端控制台&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;http://127.0.0.1:8000/admin
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded><h:img src="/_astro/zai-dian-nao-shang-shi-yong-dai-ma-de-ren-de-bian-cheng-bei-jing.DjThFqdF.jpg"/><enclosure url="/_astro/zai-dian-nao-shang-shi-yong-dai-ma-de-ren-de-bian-cheng-bei-jing.DjThFqdF.jpg"/></item><item><title>[筆記] Python Numpy 常見方法</title><link>https://astro-docs.vercel.app/blog/%E7%AD%86%E8%A8%98-python-numpy-%E5%B8%B8%E8%A6%8B%E6%96%B9%E6%B3%95</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/%E7%AD%86%E8%A8%98-python-numpy-%E5%B8%B8%E8%A6%8B%E6%96%B9%E6%B3%95</guid><description>整理四種 Python Numpy 常見方法</description><pubDate>Thu, 05 Jun 2025 21:23:00 GMT</pubDate><content:encoded>&lt;h1&gt;NumPy 常用方法整理（含參數說明）&lt;/h1&gt;
&lt;h2&gt;1. 建立陣列（Array Creation）&lt;/h2&gt;
&lt;p&gt;| 方法 | 說明 | 參數用途 |
|------|------|-----------|
| &lt;code&gt;np.array([1, 2, 3])&lt;/code&gt; | 從 list 建立陣列 | &lt;code&gt;list&lt;/code&gt;: 欲轉為陣列的 Python list |
| &lt;code&gt;np.zeros((2, 3))&lt;/code&gt; | 建立全為 0 的 2x3 陣列 | &lt;code&gt;shape&lt;/code&gt;: 陣列形狀，如 &lt;code&gt;(rows, cols)&lt;/code&gt; |
| &lt;code&gt;np.ones((2, 3))&lt;/code&gt; | 建立全為 1 的 2x3 陣列 | 同上 |
| &lt;code&gt;np.full((2, 2), 7)&lt;/code&gt; | 建立所有值為 7 的 2x2 陣列 | &lt;code&gt;shape&lt;/code&gt;: 陣列形狀，&lt;code&gt;fill_value&lt;/code&gt;: 欲填入的數值 |
| &lt;code&gt;np.eye(3)&lt;/code&gt; | 建立 3x3 單位矩陣 | &lt;code&gt;N&lt;/code&gt;: 矩陣大小（N x N） |
| &lt;code&gt;np.arange(0, 10, 2)&lt;/code&gt; | 建立從 0 到 10 間隔為 2 的序列 | &lt;code&gt;start&lt;/code&gt;: 起始值，&lt;code&gt;stop&lt;/code&gt;: 結束值（不含），&lt;code&gt;step&lt;/code&gt;: 步長 |
| &lt;code&gt;np.linspace(0, 1, 5)&lt;/code&gt; | 在 0 到 1 間平均產生 5 個數 | &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;num&lt;/code&gt;: 數量 |
| &lt;code&gt;np.random.randint(0, 10, size=5)&lt;/code&gt; | 隨機產生整數陣列 | &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;: 範圍（含 low，不含 high），&lt;code&gt;size&lt;/code&gt;: 數量 |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2. 陣列屬性與操作&lt;/h2&gt;
&lt;p&gt;| 方法 | 說明 | 參數用途 |
|------|------|-----------|
| &lt;code&gt;arr.shape&lt;/code&gt; | 查看形狀 | 無參數，回傳 tuple |
| &lt;code&gt;arr.ndim&lt;/code&gt; | 查看維度數 | 無參數，回傳整數 |
| &lt;code&gt;arr.size&lt;/code&gt; | 總元素數量 | 無參數，回傳整數 |
| &lt;code&gt;arr.dtype&lt;/code&gt; | 元素型別 | 無參數，回傳型別 |
| &lt;code&gt;arr.reshape((3, 2))&lt;/code&gt; | 改變形狀為 3x2 | &lt;code&gt;shape&lt;/code&gt;: 新的形狀，總元素數須一致 |
| &lt;code&gt;arr.flatten()&lt;/code&gt; | 攤平成一維陣列 | 無參數 |
| &lt;code&gt;arr.T&lt;/code&gt; | 轉置 | 無參數 |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3. 數學運算&lt;/h2&gt;
&lt;p&gt;| 方法 | 說明 | 參數用途 |
|------|------|-----------|
| &lt;code&gt;np.add(a, b)&lt;/code&gt; / &lt;code&gt;a + b&lt;/code&gt; | 加法 | &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;: 陣列或數字，形狀需可對應 |
| &lt;code&gt;np.subtract(a, b)&lt;/code&gt; / &lt;code&gt;a - b&lt;/code&gt; | 減法 | 同上 |
| &lt;code&gt;np.multiply(a, b)&lt;/code&gt; / &lt;code&gt;a * b&lt;/code&gt; | 乘法 | 同上 |
| &lt;code&gt;np.divide(a, b)&lt;/code&gt; / &lt;code&gt;a / b&lt;/code&gt; | 除法 | 同上 |
| &lt;code&gt;np.power(a, b)&lt;/code&gt; / &lt;code&gt;a ** b&lt;/code&gt; | a 的 b 次方 | 同上 |
| &lt;code&gt;np.sqrt(a)&lt;/code&gt; | 開根號 | &lt;code&gt;a&lt;/code&gt;: 陣列或數值 |
| &lt;code&gt;np.exp(a)&lt;/code&gt; | e 的 a 次方 | 同上 |
| &lt;code&gt;np.log(a)&lt;/code&gt; | 自然對數 ln(a) | 同上 |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4. 統計函數&lt;/h2&gt;
&lt;p&gt;| 方法 | 說明 | 參數用途 |
|------|------|-----------|
| &lt;code&gt;arr.sum()&lt;/code&gt; | 總和 | &lt;code&gt;axis&lt;/code&gt;: 指定維度（可選），例如 &lt;code&gt;axis=0&lt;/code&gt; 沿列加總 |
| &lt;code&gt;arr.mean()&lt;/code&gt; | 平均值 | 同上 |
| &lt;code&gt;arr.std()&lt;/code&gt; | 標準差 | 同上 |
| &lt;code&gt;arr.var()&lt;/code&gt; | 變異數 | 同上 |
| &lt;code&gt;arr.min()&lt;/code&gt; | 最小值 | 同上 |
| &lt;code&gt;arr.max()&lt;/code&gt; | 最大值 | 同上 |
| &lt;code&gt;arr.argmin()&lt;/code&gt; | 最小值索引 | 同上 |
| &lt;code&gt;arr.argmax()&lt;/code&gt; | 最大值索引 | 同上 |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5. 邏輯與篩選&lt;/h2&gt;
&lt;p&gt;| 方法 | 說明 | 參數用途 |
|------|------|-----------|
| &lt;code&gt;arr &gt; 5&lt;/code&gt; | 元素是否大於 5 | &lt;code&gt;5&lt;/code&gt;: 比較條件，回傳布林陣列 |
| &lt;code&gt;arr[arr &gt; 5]&lt;/code&gt; | 篩選大於 5 的值 | 條件表達式可組合使用 |
| &lt;code&gt;np.where(arr &gt; 5, 1, 0)&lt;/code&gt; | 條件為真則回傳 1，否則 0 | &lt;code&gt;condition&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;: 條件為真則取 &lt;code&gt;x&lt;/code&gt; 否則取 &lt;code&gt;y&lt;/code&gt; |
| &lt;code&gt;np.any(arr &gt; 5)&lt;/code&gt; | 是否有任一符合條件 | &lt;code&gt;condition&lt;/code&gt;: 條件式 |
| &lt;code&gt;np.all(arr &gt; 5)&lt;/code&gt; | 是否全部符合條件 | 同上 |&lt;/p&gt;</content:encoded><h:img src="/_astro/pexels-photo-1181359.ReSkABMO.jpeg"/><enclosure url="/_astro/pexels-photo-1181359.ReSkABMO.jpeg"/></item><item><title>[AI] 10款 Text-to-Code AI 工具</title><link>https://astro-docs.vercel.app/blog/ai-10%E6%AC%BE-text-to-code-ai-%E5%B7%A5%E5%85%B7</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/ai-10%E6%AC%BE-text-to-code-ai-%E5%B7%A5%E5%85%B7</guid><description>利用 AI 快速生成 APP</description><pubDate>Thu, 29 May 2025 14:50:00 GMT</pubDate><content:encoded>&lt;p&gt;以下是 10 款熱門的「文字轉程式碼」（Text-to-Code）AI 工具的介紹，包含其主要特點、優點與缺點，幫助您根據需求選擇合適的開發輔助工具：&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1. &lt;a href=&quot;https://lovable.dev&quot;&gt;Lovable.dev&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特點&lt;/strong&gt;：AI 驅動的全端應用程式生成平台，支援 Supabase、GitHub 整合，並提供 CI/CD、自動部署與即時協作功能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;優點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;無需編碼即可快速建立原型。&lt;/li&gt;
&lt;li&gt;支援多種後端與部署環境。&lt;/li&gt;
&lt;li&gt;適合設計師與非工程背景者使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;錯誤修復需消耗大量 token，可能導致成本上升。&lt;/li&gt;
&lt;li&gt;大型專案可能出現錯誤迴圈，需人工介入。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;2. &lt;a href=&quot;https://rocket.new&quot;&gt;Rocket.new&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特點&lt;/strong&gt;：Rocket MV BASIC 是一個 Visual Studio Code 擴充套件，支援 MV BASIC 編輯、編譯與除錯。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;優點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;整合於 VS Code，提升開發效率。&lt;/li&gt;
&lt;li&gt;提供格式化與除錯功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主要針對 MV BASIC 語言，適用範圍有限。&lt;/li&gt;
&lt;li&gt;缺乏現代 Web 開發支援。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;3. &lt;a href=&quot;https://altan.ai/zh&quot;&gt;Altan.ai&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特點&lt;/strong&gt;：無需拖放或編碼，透過與 AI 對話即可建構應用程式，並提供應用市集與 AI 元件分享。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;優點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;簡單直觀的使用介面。&lt;/li&gt;
&lt;li&gt;適合非技術背景用戶。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;網站有時載入緩慢，穩定性待提升。&lt;/li&gt;
&lt;li&gt;聊天機器人回應有時不夠精確。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;4. &lt;a href=&quot;https://von.dev/&quot;&gt;Von.dev&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特點&lt;/strong&gt;：目前缺乏公開資訊，無法評估其功能與效能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建議&lt;/strong&gt;：等待更多官方資訊釋出後再進行評估。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;5. &lt;a href=&quot;https://www.tempo.new/&quot;&gt;Tempo.new&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特點&lt;/strong&gt;：AI 驅動的應用程式建構平台，支援從需求文檔生成、設計到部署的全流程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;優點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自動生成產品需求文檔（PRD）。&lt;/li&gt;
&lt;li&gt;適合快速開發 AI 應用程式。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;對於複雜應用可能需進一步手動調整。&lt;/li&gt;
&lt;li&gt;尚處於發展初期，功能尚未完善。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;6. &lt;a href=&quot;https://www.trae.ai/&quot;&gt;Trae.ai&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特點&lt;/strong&gt;：輕量級 AI 編輯器，支援即時程式碼預覽、圖像轉程式碼、Claude AI 整合等功能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;優點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完全免費，適合快速專案啟動。&lt;/li&gt;
&lt;li&gt;支援圖像轉程式碼，創新功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;功能尚不穩定，仍在發展中。&lt;/li&gt;
&lt;li&gt;生態系統支援較少。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;7. &lt;a href=&quot;https://bolt.new/&quot;&gt;Bolt.new&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特點&lt;/strong&gt;：基於 StackBlitz 的 WebContainers 技術，透過自然語言提示生成全端應用程式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;優點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快速生成應用程式原型。&lt;/li&gt;
&lt;li&gt;無需本地安裝，瀏覽器即用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;對於複雜應用需手動調整與除錯。&lt;/li&gt;
&lt;li&gt;資源載入有時不穩定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;8. &lt;a href=&quot;https://www.create.xyz/&quot;&gt;Create.xyz&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特點&lt;/strong&gt;：AI 驅動的應用程式建構平台，支援從設計到部署的全流程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;優點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;快速生成功能性應用程式。&lt;/li&gt;
&lt;li&gt;適合創作者與非技術用戶。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺點&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;知名度較低，社群支援有限。&lt;/li&gt;
&lt;li&gt;進階功能與控制權有限。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;9. &lt;a href=&quot;https://reflex.dev/&quot;&gt;Reflex.dev&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特點&lt;/strong&gt;：純 Python 全端框架：Reflex 是一個開源的全端 Python 框架，允許開發者使用純 Python 語言構建前端和後端，無需編寫 JavaScript。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建議&lt;/strong&gt;：前端控制有限：對於需要高度自訂前端的應用，可能需要額外的調整。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;10. &lt;a href=&quot;https://co.dev&quot;&gt;Co.dev&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特點&lt;/strong&gt;：代碼擁有權：用戶擁有生成代碼的完全控制權，方便後續自訂和擴展。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;建議&lt;/strong&gt;：功能限制：目前僅支援 Web 應用，不支援移動應用或瀏覽器擴展。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;總結建議：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初學者與非技術背景者&lt;/strong&gt;：建議使用 Altan.ai、Create.xyz 或 Bolt.new，這些工具提供直觀的介面與快速的應用程式生成能力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需要快速原型開發&lt;/strong&gt;：Lovable.dev 與 Tempo.new 提供從設計到部署的全流程支援，適合快速迭代。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;開發者與進階用戶&lt;/strong&gt;：Trae.ai 提供即時預覽與圖像轉程式碼功能，適合需要更高控制權的用戶。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="/_astro/text-to-app.CKhaSdK-.png"/><enclosure url="/_astro/text-to-app.CKhaSdK-.png"/></item><item><title>RD 與其他角色對任務執行的不同見解</title><link>https://astro-docs.vercel.app/blog/rd-%E8%88%87%E5%85%B6%E4%BB%96%E8%A7%92%E8%89%B2%E5%B0%8D%E4%BB%BB%E5%8B%99%E5%9F%B7%E8%A1%8C%E7%9A%84%E4%B8%8D%E5%90%8C%E8%A6%8B%E8%A7%A3</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/rd-%E8%88%87%E5%85%B6%E4%BB%96%E8%A7%92%E8%89%B2%E5%B0%8D%E4%BB%BB%E5%8B%99%E5%9F%B7%E8%A1%8C%E7%9A%84%E4%B8%8D%E5%90%8C%E8%A6%8B%E8%A7%A3</guid><description>RD 任務執行上的考量</description><pubDate>Tue, 26 Nov 2024 11:24:42 GMT</pubDate><content:encoded>&lt;p&gt;我發現 RD 與其他角色對任務執行的見解有相當程度的不同：&lt;/p&gt;
&lt;p&gt;今天得到一隻minor 任務：&lt;/p&gt;
&lt;p&gt;我與開任務的 RD 確認需要做什麼功能、我回報我這邊狀況、對方表示我將狀況貼到 ticket 上即可，等待上級下一步指示。&lt;/p&gt;
&lt;p&gt;我以為事情到這邊結束了。&lt;/p&gt;
&lt;p&gt;有一個測試工程師碰巧看到這個任務，詢問我說為何還需要等上即確認，不是直接修改就好嗎？&lt;/p&gt;
&lt;p&gt;結果變成我與任務回報者與這位測試工程師，三人一起討論為什麼不要直接修改：&lt;/p&gt;
&lt;p&gt;測試表示這功能修改不是很簡單？直接修改就好，為什麼需要再與上級確認？這樣不是又多一層工？&lt;/p&gt;
&lt;p&gt;任務回報者說：「但你不知道這個節點是否一樣，改下去是否有更多effort，所以才需要等待上級確認，確定要做我們才可以花時間下去改。」&lt;/p&gt;
&lt;p&gt;RD 身為任務執行的第一線人員，對程式碼的理解通常較深刻，所以考慮的大多不是效率，而是任務執行後會否對整個系統造成影響。&lt;/p&gt;</content:encoded><h:img src="/_astro/meeting.DvHs3_JI.jpg"/><enclosure url="/_astro/meeting.DvHs3_JI.jpg"/></item><item><title>Java學習：第1週-Java基礎知識</title><link>https://astro-docs.vercel.app/blog/java%E5%AD%B8%E7%BF%92%E7%AC%AC1%E9%80%B1-java%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/java%E5%AD%B8%E7%BF%92%E7%AC%AC1%E9%80%B1-java%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98</guid><description>數據類型、運算符、控制結構</description><pubDate>Tue, 13 Aug 2024 10:23:29 GMT</pubDate><content:encoded>&lt;h1&gt;一、 數據類型和變量宣告（閱讀和實踐）&lt;/h1&gt;
&lt;h2&gt;1. 基本數據類型（Primitive Data Types）&lt;/h2&gt;
&lt;p&gt;Java中有八種類型的基本數據類型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;整數型:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;byte&lt;/code&gt;（8位）：範圍是 -128 到 127&lt;/li&gt;
&lt;li&gt;&lt;code&gt;short&lt;/code&gt;（16位）：範圍是 -32,768 到 32,767&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int&lt;/code&gt;（32位）：範圍是 -2^31 到 2^31-1&lt;/li&gt;
&lt;li&gt;&lt;code&gt;long&lt;/code&gt;（64位）：範圍是 -2^63 到 2^63-1，需在數字後加 &quot;L&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浮點數型:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;float&lt;/code&gt;（32位）：單精度浮點數，需在數字後加 &quot;F&quot;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;double&lt;/code&gt;（64位）：雙精度浮點數，默認的浮點數類型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;字符型:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;char&lt;/code&gt;（16位）：單個字符，例如 &apos;a&apos;, &apos;A&apos;, &apos;1&apos;, &apos;漢&apos;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;布爾型:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;boolean&lt;/code&gt;：僅有兩個值：&lt;code&gt;true&lt;/code&gt; 或 &lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. 變量宣告（Variable Declaration）&lt;/h2&gt;
&lt;p&gt;在Java中，變量需要先宣告後才能使用。宣告變量的語法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type variableName = initialValue;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;type&lt;/strong&gt;：變量的數據類型（如 &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;double&lt;/code&gt;, &lt;code&gt;char&lt;/code&gt; 等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;variableName&lt;/strong&gt;：變量名稱，需遵循命名規則&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;initialValue&lt;/strong&gt;（可選）：變量的初始值&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;例子&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;int age = 25;           // 整數型變量
double salary = 55000.50; // 浮點數型變量
char grade = &apos;A&apos;;        // 字符型變量
boolean isJavaFun = true; // 布爾型變量


&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 變量的作用域（Scope of Variables）&lt;/h2&gt;
&lt;p&gt;變量的作用域是指變量在程序中可訪問的範圍。Java中的變量主要有三種作用域：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;局部變量（Local Variables）&lt;/strong&gt;：在方法內部宣告，僅在方法內部可見。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;實例變量（Instance Variables）&lt;/strong&gt;：在類中但在方法外宣告，對象實例使用這些變量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;類變量（Class Variables，也稱靜態變量 Static Variables）&lt;/strong&gt;：用 &lt;code&gt;static&lt;/code&gt; 關鍵字宣告，在整個類中共享。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 常量（Constants）&lt;/h2&gt;
&lt;p&gt;如果某個變量的值在程序執行期間不會改變，可以使用 &lt;code&gt;final&lt;/code&gt; 關鍵字將其聲明為常量。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;final int MAX_AGE = 100;


&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5. 實踐練習&lt;/h2&gt;
&lt;p&gt;你可以通過以下簡單的練習來鞏固所學知識：&lt;/p&gt;
&lt;h3&gt;練習 1: 宣告並初始化各種類型的變量&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class DataTypePractice {
    public static void main(String[] args) {
        // 整數型
        byte b = 10;
        short s = 100;
        int i = 1000;
        long l = 10000L;

        // 浮點數型
        float f = 10.5F;
        double d = 20.5;

        // 字符型
        char c = &apos;A&apos;;

        // 布爾型
        boolean isJavaFun = true;

        // 常量
        final int MAX_VALUE = 100;

        // 輸出變量值
        System.out.println(&quot;byte: &quot; + b);
        System.out.println(&quot;short: &quot; + s);
        System.out.println(&quot;int: &quot; + i);
        System.out.println(&quot;long: &quot; + l);
        System.out.println(&quot;float: &quot; + f);
        System.out.println(&quot;double: &quot; + d);
        System.out.println(&quot;char: &quot; + c);
        System.out.println(&quot;boolean: &quot; + isJavaFun);
        System.out.println(&quot;final int: &quot; + MAX_VALUE);
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;練習 2: 嘗試更改常量的值並觀察錯誤&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;final int MAX_VALUE = 100;
MAX_VALUE = 200; // 這行代碼會產生編譯錯誤


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這些練習可以幫助你掌握Java中數據類型和變量宣告的基本概念。如果你在練習過程中遇到任何問題，隨時可以告訴我！&lt;/p&gt;
&lt;p&gt;—&lt;/p&gt;
&lt;p&gt;複習運算符和表達式時，我們將探討Java中的各種運算符類型以及它們的使用方法，然後通過練習來加深理解。&lt;/p&gt;
&lt;h1&gt;二、運算符和表達式&lt;/h1&gt;
&lt;h2&gt;1. 運算符概述&lt;/h2&gt;
&lt;p&gt;Java中的運算符可以分為幾個主要類型：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;算術運算符（Arithmetic Operators）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;關係運算符（Relational Operators）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;邏輯運算符（Logical Operators）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;位元運算符（Bitwise Operators）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;賦值運算符（Assignment Operators）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增量與減量運算符（Increment/Decrement Operators）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;條件運算符（三元運算符 Ternary Operator）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2. 各類運算符的詳細介紹&lt;/h2&gt;
&lt;h3&gt;2.1 算術運算符（Arithmetic Operators）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;加法（+）&lt;/strong&gt;：&lt;code&gt;a + b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;減法（-）&lt;/strong&gt;：&lt;code&gt;a - b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;乘法（*）&lt;/strong&gt;：&lt;code&gt;a * b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;除法（/）&lt;/strong&gt;：&lt;code&gt;a / b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;取餘（%）&lt;/strong&gt;：&lt;code&gt;a % b&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 關係運算符（Relational Operators）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;等於（==）&lt;/strong&gt;：&lt;code&gt;a == b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不等於（!=）&lt;/strong&gt;：&lt;code&gt;a != b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大於（&gt;）&lt;/strong&gt;：&lt;code&gt;a &gt; b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小於（&amp;#x3C;）&lt;/strong&gt;：&lt;code&gt;a &amp;#x3C; b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大於等於（&gt;=）&lt;/strong&gt;：&lt;code&gt;a &gt;= b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小於等於（&amp;#x3C;=）&lt;/strong&gt;：&lt;code&gt;a &amp;#x3C;= b&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.3 邏輯運算符（Logical Operators）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;邏輯與（&amp;#x26;&amp;#x26;）&lt;/strong&gt;：&lt;code&gt;a &amp;#x26;&amp;#x26; b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;邏輯或（||）&lt;/strong&gt;：&lt;code&gt;a || b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;邏輯非（!）&lt;/strong&gt;：&lt;code&gt;!a&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.4 位元運算符（Bitwise Operators）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;按位與（&amp;#x26;）&lt;/strong&gt;：&lt;code&gt;a &amp;#x26; b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按位或（|）&lt;/strong&gt;：&lt;code&gt;a | b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按位非（~）&lt;/strong&gt;：&lt;code&gt;~a&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按位異或（^）&lt;/strong&gt;：&lt;code&gt;a ^ b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;左移（&amp;#x3C;&amp;#x3C;）&lt;/strong&gt;：&lt;code&gt;a &amp;#x3C;&amp;#x3C; n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右移（&gt;&gt;）&lt;/strong&gt;：&lt;code&gt;a &gt;&gt; n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;無符號右移（&gt;&gt;&gt;）&lt;/strong&gt;：&lt;code&gt;a &gt;&gt;&gt; n&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.5 賦值運算符（Assignment Operators）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;賦值（=）&lt;/strong&gt;：&lt;code&gt;a = b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加等於（+=）&lt;/strong&gt;：&lt;code&gt;a += b&lt;/code&gt; （相當於 &lt;code&gt;a = a + b&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;減等於（-=）&lt;/strong&gt;：&lt;code&gt;a -= b&lt;/code&gt; （相當於 &lt;code&gt;a = a - b&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;乘等於（*=）&lt;/strong&gt;：&lt;code&gt;a *= b&lt;/code&gt; （相當於 &lt;code&gt;a = a * b&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;除等於（/=）&lt;/strong&gt;：&lt;code&gt;a /= b&lt;/code&gt; （相當於 &lt;code&gt;a = a / b&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;取餘等於（%=）&lt;/strong&gt;：&lt;code&gt;a %= b&lt;/code&gt; （相當於 &lt;code&gt;a = a % b&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.6 增量與減量運算符（Increment/Decrement Operators）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;前增量（++a）&lt;/strong&gt;：先增加後使用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;後增量（a++）&lt;/strong&gt;：先使用後增加&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前減量（--a）&lt;/strong&gt;：先減少後使用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;後減量（a--）&lt;/strong&gt;：先使用後減少&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.7 條件運算符（三元運算符 Ternary Operator）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;條件運算符&lt;/strong&gt;：&lt;code&gt;condition ? expression1 : expression2&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;如果條件為 &lt;code&gt;true&lt;/code&gt;，返回 &lt;code&gt;expression1&lt;/code&gt; 的值；否則返回 &lt;code&gt;expression2&lt;/code&gt; 的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 實踐練習&lt;/h3&gt;
&lt;p&gt;以下是一些簡單的練習，可以幫助你更好地理解這些運算符的應用。&lt;/p&gt;
&lt;h3&gt;練習 1: 算術運算符&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class ArithmeticOperators {
    public static void main(String[] args) {
        int a = 10, b = 5;
        System.out.println(&quot;a + b = &quot; + (a + b)); // 15
        System.out.println(&quot;a - b = &quot; + (a - b)); // 5
        System.out.println(&quot;a * b = &quot; + (a * b)); // 50
        System.out.println(&quot;a / b = &quot; + (a / b)); // 2
        System.out.println(&quot;a % b = &quot; + (a % b)); // 0
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;練習 2: 關係和邏輯運算符&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class RelationalLogicalOperators {
    public static void main(String[] args) {
        int a = 10, b = 5;
        System.out.println(&quot;a &gt; b = &quot; + (a &gt; b));  // true
        System.out.println(&quot;a &amp;#x3C; b = &quot; + (a &amp;#x3C; b));  // false
        System.out.println(&quot;a == b = &quot; + (a == b)); // false
        System.out.println(&quot;a != b = &quot; + (a != b)); // true

        boolean result = (a &gt; b) &amp;#x26;&amp;#x26; (b &gt; 0); // true
        System.out.println(&quot;(a &gt; b) &amp;#x26;&amp;#x26; (b &gt; 0) = &quot; + result);
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;練習 3: 賦值運算符和增量/減量運算符&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class AssignmentIncrementOperators {
    public static void main(String[] args) {
        int a = 10;
        a += 5; // 相當於 a = a + 5
        System.out.println(&quot;a += 5 = &quot; + a); // 15

        int b = 10;
        System.out.println(&quot;b++ = &quot; + (b++)); // 10 (使用後增加)
        System.out.println(&quot;++b = &quot; + (++b)); // 12 (增加後使用)
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;練習 4: 三元運算符&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class TernaryOperator {
    public static void main(String[] args) {
        int a = 10, b = 5;
        String result = (a &gt; b) ? &quot;a is greater&quot; : &quot;b is greater&quot;;
        System.out.println(result); // &quot;a is greater&quot;
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;三、控制結構（if, switch）&lt;/h1&gt;
&lt;p&gt;在Java中，&lt;strong&gt;控制結構&lt;/strong&gt;（Control Structures）用於控制程式的執行流程，其中 &lt;code&gt;if&lt;/code&gt; 和 &lt;code&gt;switch&lt;/code&gt; 是兩種最常見的選擇結構（Selection Structures）。它們允許程式根據條件的結果來決定執行哪一段代碼。&lt;/p&gt;
&lt;h2&gt;1. &lt;code&gt;if&lt;/code&gt; 控制結構&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;if&lt;/code&gt; 控制結構根據一個或多個條件表達式的結果來決定是否執行某段代碼。這些條件通常是布爾表達式，即它們的結果為 &lt;code&gt;true&lt;/code&gt; 或 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;1.1 基本語法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;if (condition) {
    // 當condition為true時執行的代碼
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.2 &lt;code&gt;if-else&lt;/code&gt; 語法&lt;/h3&gt;
&lt;p&gt;如果條件為 &lt;code&gt;false&lt;/code&gt;，則可以使用 &lt;code&gt;else&lt;/code&gt; 來執行另一段代碼。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (condition) {
    // 當condition為true時執行的代碼
} else {
    // 當condition為false時執行的代碼
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.3 &lt;code&gt;if-else if-else&lt;/code&gt; 語法&lt;/h3&gt;
&lt;p&gt;當有多個條件需要檢查時，可以使用 &lt;code&gt;else if&lt;/code&gt; 來鏈接多個條件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (condition1) {
    // 當condition1為true時執行的代碼
} else if (condition2) {
    // 當condition1為false且condition2為true時執行的代碼
} else {
    // 當所有條件都為false時執行的代碼
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;1.4 範例&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;public class IfElseExample {
    public static void main(String[] args) {
        int num = 10;

        if (num &gt; 0) {
            System.out.println(&quot;The number is positive.&quot;);
        } else if (num &amp;#x3C; 0) {
            System.out.println(&quot;The number is negative.&quot;);
        } else {
            System.out.println(&quot;The number is zero.&quot;);
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解釋:&lt;/strong&gt; 在這個例子中，如果 &lt;code&gt;num&lt;/code&gt; 大於 0，則打印 &quot;The number is positive.&quot;，如果小於 0，則打印 &quot;The number is negative.&quot;，如果等於 0，則打印 &quot;The number is zero.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. &lt;code&gt;switch&lt;/code&gt; 控制結構&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;switch&lt;/code&gt; 控制結構用於根據變量的值來選擇多個代碼塊中的一個來執行。這在處理多個選擇時比使用大量的 &lt;code&gt;if-else&lt;/code&gt; 更加清晰和高效。&lt;/p&gt;
&lt;h3&gt;2.1 基本語法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;switch (expression) {
    case value1:
        // 當expression等於value1時執行的代碼
        break;
    case value2:
        // 當expression等於value2時執行的代碼
        break;
    // 你可以添加更多的case
    default:
        // 當expression不等於任何case值時執行的代碼
        break;
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;**break**&lt;/code&gt;&lt;strong&gt;:&lt;/strong&gt; &lt;code&gt;break&lt;/code&gt; 用來退出 &lt;code&gt;switch&lt;/code&gt; 結構。如果省略 &lt;code&gt;break&lt;/code&gt;，程式將繼續執行下一個 &lt;code&gt;case&lt;/code&gt;，這稱為「穿透」。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;**default**&lt;/code&gt;&lt;strong&gt;:&lt;/strong&gt; &lt;code&gt;default&lt;/code&gt; 是可選的，當 &lt;code&gt;expression&lt;/code&gt; 不匹配任何 &lt;code&gt;case&lt;/code&gt; 時執行 &lt;code&gt;default&lt;/code&gt; 代碼塊。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 範例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class SwitchExample {
    public static void main(String[] args) {
        int day = 3;
        String dayName;

        switch (day) {
            case 1:
                dayName = &quot;Sunday&quot;;
                break;
            case 2:
                dayName = &quot;Monday&quot;;
                break;
            case 3:
                dayName = &quot;Tuesday&quot;;
                break;
            case 4:
                dayName = &quot;Wednesday&quot;;
                break;
            case 5:
                dayName = &quot;Thursday&quot;;
                break;
            case 6:
                dayName = &quot;Friday&quot;;
                break;
            case 7:
                dayName = &quot;Saturday&quot;;
                break;
            default:
                dayName = &quot;Invalid day&quot;;
                break;
        }

        System.out.println(&quot;Day &quot; + day + &quot; is &quot; + dayName);
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解釋:&lt;/strong&gt; 在這個例子中，變量 &lt;code&gt;day&lt;/code&gt; 的值是 3，程式會匹配 &lt;code&gt;case 3&lt;/code&gt;，然後將 &lt;code&gt;dayName&lt;/code&gt; 設為 &quot;Tuesday&quot; 並打印出來。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. &lt;code&gt;if&lt;/code&gt; 和 &lt;code&gt;switch&lt;/code&gt; 的區別&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用途:&lt;/strong&gt; &lt;code&gt;if&lt;/code&gt; 用於處理布爾條件，適合複雜的條件判斷；&lt;code&gt;switch&lt;/code&gt; 適合處理具體值的選擇，如枚舉類型、整數類型等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可讀性:&lt;/strong&gt; 當處理多個選擇時，&lt;code&gt;switch&lt;/code&gt; 結構通常比一連串的 &lt;code&gt;if-else&lt;/code&gt; 更加清晰。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效率:&lt;/strong&gt; 在某些情況下，&lt;code&gt;switch&lt;/code&gt; 可能比多個 &lt;code&gt;if-else&lt;/code&gt; 更高效，特別是當 &lt;code&gt;case&lt;/code&gt; 很多時。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4. 實踐練習&lt;/h2&gt;
&lt;h3&gt;練習 1: 使用 &lt;code&gt;if-else&lt;/code&gt; 控制結構&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class IfElsePractice {
    public static void main(String[] args) {
        int score = 85;

        if (score &gt;= 90) {
            System.out.println(&quot;Grade: A&quot;);
        } else if (score &gt;= 80) {
            System.out.println(&quot;Grade: B&quot;);
        } else if (score &gt;= 70) {
            System.out.println(&quot;Grade: C&quot;);
        } else if (score &gt;= 60) {
            System.out.println(&quot;Grade: D&quot;);
        } else {
            System.out.println(&quot;Grade: F&quot;);
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;練習 2: 使用 &lt;code&gt;switch&lt;/code&gt; 控制結構&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class SwitchPractice {
    public static void main(String[] args) {
        char grade = &apos;B&apos;;

        switch (grade) {
            case &apos;A&apos;:
                System.out.println(&quot;Excellent!&quot;);
                break;
            case &apos;B&apos;:
            case &apos;C&apos;:
                System.out.println(&quot;Well done&quot;);
                break;
            case &apos;D&apos;:
                System.out.println(&quot;You passed&quot;);
                break;
            case &apos;F&apos;:
                System.out.println(&quot;Better try again&quot;);
                break;
            default:
                System.out.println(&quot;Invalid grade&quot;);
                break;
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;為何在 switch 中使用 break 而不是 return&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;switch&lt;/code&gt; 中使用 &lt;code&gt;break&lt;/code&gt; 而不是 &lt;code&gt;return&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;是因為 &lt;code&gt;break&lt;/code&gt; 用來退出 &lt;code&gt;switch&lt;/code&gt; 結構並繼續執行 &lt;code&gt;switch&lt;/code&gt; 之後的代碼。&lt;/p&gt;
&lt;p&gt;而 &lt;code&gt;return&lt;/code&gt; 則會直接退出當前方法，不會執行 &lt;code&gt;switch&lt;/code&gt; 之後的代碼。因此，&lt;code&gt;break&lt;/code&gt; 適用於需要在 &lt;code&gt;switch&lt;/code&gt; 結構後繼續執行其他代碼的情況，而 &lt;code&gt;return&lt;/code&gt; 則適用於需要立即退出方法的情況。&lt;/p&gt;
&lt;h1&gt;四、控制結構（for, while, do-while）&lt;/h1&gt;
&lt;p&gt;控制結構中的迴圈結構（Loop Structures）允許我們重複執行某段代碼。Java中的主要迴圈結構包括 &lt;code&gt;for&lt;/code&gt;、&lt;code&gt;while&lt;/code&gt; 和 &lt;code&gt;do-while&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;1. &lt;code&gt;for&lt;/code&gt; 迴圈&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt; 迴圈通常用於在已知確切迭代次數的情況下使用。它是一個集成的迴圈結構，將初始化、條件檢查和增量操作集中在一個語句中。&lt;/p&gt;
&lt;h3&gt;1.1 基本語法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;for (initialization; condition; update) {
    // 迴圈中要重複執行的代碼
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;initialization:&lt;/strong&gt; 迴圈開始前執行的初始化操作，通常是變量的宣告和賦值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;condition:&lt;/strong&gt; 在每次迭代前檢查的條件，當條件為 &lt;code&gt;true&lt;/code&gt; 時，迴圈繼續執行；當條件為 &lt;code&gt;false&lt;/code&gt; 時，迴圈終止。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;update:&lt;/strong&gt; 每次迭代後執行的操作，通常用來更新迴圈變量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.2 範例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class ForLoopExample {
    public static void main(String[] args) {
        for (int i = 0; i &amp;#x3C; 5; i++) {
            System.out.println(&quot;Iteration: &quot; + i);
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解釋:&lt;/strong&gt; 這個 &lt;code&gt;for&lt;/code&gt; 迴圈從 &lt;code&gt;i = 0&lt;/code&gt; 開始，當 &lt;code&gt;i &amp;#x3C; 5&lt;/code&gt; 時迴圈繼續，每次迭代後 &lt;code&gt;i&lt;/code&gt; 增加1。這將打印 &lt;code&gt;0&lt;/code&gt; 到 &lt;code&gt;4&lt;/code&gt; 的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. &lt;code&gt;while&lt;/code&gt; 迴圈&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;while&lt;/code&gt; 迴圈在每次迭代前檢查條件，並在條件為 &lt;code&gt;true&lt;/code&gt; 時繼續執行迴圈體內的代碼。&lt;/p&gt;
&lt;h3&gt;2.1 基本語法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;while (condition) {
    // 迴圈中要重複執行的代碼
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;condition:&lt;/strong&gt; 這是布爾表達式，當條件為 &lt;code&gt;true&lt;/code&gt; 時，迴圈繼續執行；當條件為 &lt;code&gt;false&lt;/code&gt; 時，迴圈終止。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 範例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class WhileLoopExample {
    public static void main(String[] args) {
        int i = 0;
        while (i &amp;#x3C; 5) {
            System.out.println(&quot;Iteration: &quot; + i);
            i++;
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解釋:&lt;/strong&gt; 這個 &lt;code&gt;while&lt;/code&gt; 迴圈從 &lt;code&gt;i = 0&lt;/code&gt; 開始，當 &lt;code&gt;i &amp;#x3C; 5&lt;/code&gt; 時迴圈繼續，每次迭代後 &lt;code&gt;i&lt;/code&gt; 增加1。這將打印 &lt;code&gt;0&lt;/code&gt; 到 &lt;code&gt;4&lt;/code&gt; 的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;code&gt;do-while&lt;/code&gt; 迴圈&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;do-while&lt;/code&gt; 迴圈與 &lt;code&gt;while&lt;/code&gt; 迴圈類似，但不同的是，它保證至少執行一次迴圈體，因為條件是在每次迭代後檢查的。&lt;/p&gt;
&lt;h3&gt;3.1 基本語法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;do {
    // 迴圈中要重複執行的代碼
} while (condition);


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;condition:&lt;/strong&gt; 這是布爾表達式，當條件為 &lt;code&gt;true&lt;/code&gt; 時，迴圈繼續執行；當條件為 &lt;code&gt;false&lt;/code&gt; 時，迴圈終止。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.2 範例&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class DoWhileLoopExample {
    public static void main(String[] args) {
        int i = 0;
        do {
            System.out.println(&quot;Iteration: &quot; + i);
            i++;
        } while (i &amp;#x3C; 5);
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;解釋:&lt;/strong&gt; 這個 &lt;code&gt;do-while&lt;/code&gt; 迴圈與 &lt;code&gt;while&lt;/code&gt; 迴圈類似，但即使在初始條件不成立的情況下，也會至少執行一次迴圈體中的代碼。這將打印 &lt;code&gt;0&lt;/code&gt; 到 &lt;code&gt;4&lt;/code&gt; 的值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;&lt;code&gt;do-while&lt;/code&gt; 循環與 &lt;code&gt;while&lt;/code&gt; 循環的主要區別在於執行條件的檢查時間點：&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;簡而言之，&lt;code&gt;do-while&lt;/code&gt; 保證循環體至少執行一次，而 &lt;code&gt;while&lt;/code&gt; 可能一次也不執行。&lt;/p&gt;
&lt;h2&gt;4. 迴圈中的控制語句&lt;/h2&gt;
&lt;p&gt;在迴圈中，我們經常使用一些控制語句來更靈活地控制迴圈的執行：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;**break**&lt;/code&gt;&lt;strong&gt;:&lt;/strong&gt; 終止迴圈的執行並跳出迴圈。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;**continue**&lt;/code&gt;&lt;strong&gt;:&lt;/strong&gt; 跳過當前迭代，直接進入下一次迭代。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.1 範例：&lt;code&gt;break&lt;/code&gt; 和 &lt;code&gt;continue&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class LoopControlExample {
    public static void main(String[] args) {
        for (int i = 0; i &amp;#x3C; 10; i++) {
            if (i == 5) {
                break;  // 當 i 等於 5 時，終止迴圈
            }
            if (i % 2 == 0) {
                continue;  // 當 i 是偶數時，跳過當前迭代
            }
            System.out.println(&quot;Iteration: &quot; + i);
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解釋:&lt;/strong&gt; 在這個範例中，當 &lt;code&gt;i&lt;/code&gt; 等於 &lt;code&gt;5&lt;/code&gt; 時，&lt;code&gt;break&lt;/code&gt; 語句將終止迴圈。當 &lt;code&gt;i&lt;/code&gt; 是偶數時，&lt;code&gt;continue&lt;/code&gt; 語句將跳過當前迭代。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. 實踐練習&lt;/h2&gt;
&lt;h3&gt;練習 1: 使用 &lt;code&gt;for&lt;/code&gt; 迴圈&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class ForLoopPractice {
    public static void main(String[] args) {
        // 打印從 1 到 10 的數字
        for (int i = 1; i &amp;#x3C;= 10; i++) {
            System.out.println(i);
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;練習 2: 使用 &lt;code&gt;while&lt;/code&gt; 迴圈&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class WhileLoopPractice {
    public static void main(String[] args) {
        int i = 1;
        // 使用 while 迴圈打印從 1 到 10 的數字
        while (i &amp;#x3C;= 10) {
            System.out.println(i);
            i++;
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;練習 3: 使用 &lt;code&gt;do-while&lt;/code&gt; 迴圈&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class DoWhileLoopPractice {
    public static void main(String[] args) {
        int i = 1;
        // 使用 do-while 迴圈打印從 1 到 10 的數字
        do {
            System.out.println(i);
            i++;
        } while (i &amp;#x3C;= 10);
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;五、基礎練習題&lt;/h1&gt;
&lt;p&gt;在8月12日的基礎練習題中，我們將概括並應用前四天學習的內容，即Java中的數據類型、變量宣告、運算符和表達式，以及控制結構（&lt;code&gt;if&lt;/code&gt;, &lt;code&gt;switch&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;while&lt;/code&gt;, &lt;code&gt;do-while&lt;/code&gt;）。&lt;/p&gt;
&lt;h2&gt;基礎練習題概述&lt;/h2&gt;
&lt;p&gt;這些練習題將幫助你鞏固以下幾個方面的知識：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;數據類型和變量宣告&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;運算符和表達式&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;控制結構（&lt;/strong&gt;&lt;code&gt;**if**&lt;/code&gt;&lt;strong&gt;,&lt;/strong&gt; &lt;code&gt;**switch**&lt;/code&gt;&lt;strong&gt;,&lt;/strong&gt; &lt;code&gt;**for**&lt;/code&gt;&lt;strong&gt;,&lt;/strong&gt; &lt;code&gt;**while**&lt;/code&gt;&lt;strong&gt;,&lt;/strong&gt; &lt;code&gt;**do-while**&lt;/code&gt;&lt;strong&gt;）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;練習題 1: 基本計算器&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;任務:&lt;/strong&gt; 創建一個簡單的計算器程式，它可以執行加法、減法、乘法和除法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import java.util.Scanner;

public class BasicCalculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

	//Scanner 是 Java 中的一個類，用於從用戶輸入中讀取數據。
	//nextDouble 是 Scanner 類中的一個方法，用於讀取用戶輸入的下一個雙精度浮點數（double）。
        System.out.println(&quot;Enter first number:&quot;);
        double num1 = scanner.nextDouble();

        System.out.println(&quot;Enter second number:&quot;);
        double num2 = scanner.nextDouble();

        System.out.println(&quot;Enter an operator (+, -, *, /):&quot;);
        char operator = scanner.next().charAt(0);

        double result = 0;

        switch (operator) {
            case &apos;+&apos;:
                result = num1 + num2;
                break;
            case &apos;-&apos;:
                result = num1 - num2;
                break;
            case &apos;*&apos;:
                result = num1 * num2;
                break;
            case &apos;/&apos;:
                if (num2 != 0) {
                    result = num1 / num2;
                } else {
                    System.out.println(&quot;Error: Division by zero&quot;);
                    return;
                }
                break;
            default:
                System.out.println(&quot;Error: Invalid operator&quot;);
                return;
        }

        System.out.println(&quot;The result is: &quot; + result);
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念應用:&lt;/strong&gt; 使用了數據類型（&lt;code&gt;double&lt;/code&gt;）、運算符（&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;,&lt;/code&gt; , &lt;code&gt;/&lt;/code&gt;）、&lt;code&gt;switch&lt;/code&gt; 控制結構。&lt;/li&gt;
&lt;li&gt;具體來說：這在需要用戶輸入單個字符時特別有用，例如在本例中，用戶輸入操作符（&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;/&lt;/code&gt;）。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scanner.next()&lt;/code&gt; 會讀取用戶輸入的下一個完整字符串。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;charAt(0)&lt;/code&gt; 會提取該字符串的第一個字符（索引為0）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習題 2: 判斷整數的奇偶性&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;任務:&lt;/strong&gt; 輸入一個整數，判斷該整數是奇數還是偶數。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import java.util.Scanner;

public class OddEvenChecker {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println(&quot;Enter an integer:&quot;);
        int number = scanner.nextInt();

        if (number % 2 == 0) {
            System.out.println(number + &quot; is even.&quot;);
        } else {
            System.out.println(number + &quot; is odd.&quot;);
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念應用:&lt;/strong&gt; 使用了數據類型（&lt;code&gt;int&lt;/code&gt;）、運算符（&lt;code&gt;%&lt;/code&gt;）、&lt;code&gt;if-else&lt;/code&gt; 控制結構。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習題 3: 計算1到10的總和&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;任務:&lt;/strong&gt; 使用 &lt;code&gt;for&lt;/code&gt; 迴圈計算並輸出1到10的整數總和。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class SumOfNumbers {
    public static void main(String[] args) {
        int sum = 0;

        for (int i = 1; i &amp;#x3C;= 10; i++) {
            sum += i;
        }

        System.out.println(&quot;Sum of numbers from 1 to 10 is: &quot; + sum);
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念應用:&lt;/strong&gt; 使用了數據類型（&lt;code&gt;int&lt;/code&gt;）、賦值運算符（&lt;code&gt;+=&lt;/code&gt;）、&lt;code&gt;for&lt;/code&gt; 迴圈。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習題 4: 反轉整數數組&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;任務:&lt;/strong&gt; 使用 &lt;code&gt;while&lt;/code&gt; 迴圈反轉一個整數數組的順序。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class ReverseArray {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        int left = 0, right = numbers.length - 1;

        while (left &amp;#x3C; right) {
            // 交換元素
            int temp = numbers[left];
            numbers[left] = numbers[right];
            numbers[right] = temp;

            left++;
            right--;
        }

        // 輸出反轉後的數組
        for (int num : numbers) {
            System.out.print(num + &quot; &quot;);
        }
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念應用:&lt;/strong&gt; 使用了數據類型（&lt;code&gt;int&lt;/code&gt;）、&lt;code&gt;while&lt;/code&gt; 迴圈、陣列操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習題 5: 計算數字的階乘&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;任務:&lt;/strong&gt; 使用 &lt;code&gt;do-while&lt;/code&gt; 迴圈計算一個正整數的階乘。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import java.util.Scanner;

public class FactorialCalculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println(&quot;Enter a positive integer:&quot;);
        int number = scanner.nextInt();

        int factorial = 1;
        int i = 1;

        do {
            factorial *= i;
            i++;
        } while (i &amp;#x3C;= number);

        System.out.println(&quot;Factorial of &quot; + number + &quot; is: &quot; + factorial);
    }
}

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念應用:&lt;/strong&gt; 使用了數據類型（&lt;code&gt;int&lt;/code&gt;）、運算符（``）、&lt;code&gt;do-while&lt;/code&gt; 迴圈。&lt;/li&gt;
&lt;li&gt;為了解決這個問題，可以使用&lt;code&gt;long&lt;/code&gt;類型來存儲更大的數值，甚至可以使用&lt;code&gt;BigInteger&lt;/code&gt;類型來存儲更大的數值而不會溢出。以下是使用&lt;code&gt;BigInteger&lt;/code&gt;的範例：這樣就可以正確計算大數的階乘而不會溢出。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;練習題 6: 最大公因數（GCD）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;任務:&lt;/strong&gt; 使用 &lt;code&gt;if&lt;/code&gt; 和 &lt;code&gt;while&lt;/code&gt; 迴圈計算兩個整數的最大公因數。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import java.util.Scanner;

public class GCDCalculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println(&quot;Enter first integer:&quot;);
        int num1 = scanner.nextInt();

        System.out.println(&quot;Enter second integer:&quot;);
        int num2 = scanner.nextInt();

        while (num1 != num2) {
            if (num1 &gt; num2) {
                num1 -= num2;
            } else {
                num2 -= num1;
            }
        }

        System.out.println(&quot;GCD is: &quot; + num1);
    }
}


&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念應用:&lt;/strong&gt; 使用了數據類型（&lt;code&gt;int&lt;/code&gt;）、&lt;code&gt;if&lt;/code&gt; 控制結構、&lt;code&gt;while&lt;/code&gt; 迴圈。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這樣做的原因是為了計算兩個數字的最大公因數（GCD）。這是一種基於歐幾里得算法的迭代方法。具體步驟如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;比較兩個數字大小&lt;/strong&gt;：如果 &lt;code&gt;num1&lt;/code&gt; 大於 &lt;code&gt;num2&lt;/code&gt;，則將 &lt;code&gt;num1&lt;/code&gt; 減去 &lt;code&gt;num2&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新變量值&lt;/strong&gt;：這樣做的目的是將較大的數字減小，直到兩個數字相等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;繼續迭代&lt;/strong&gt;：如果 &lt;code&gt;num1&lt;/code&gt; 不大於 &lt;code&gt;num2&lt;/code&gt;，則將 &lt;code&gt;num2&lt;/code&gt; 減去 &lt;code&gt;num1&lt;/code&gt;。這樣的迭代過程會不斷縮小兩個數字的差距。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;結束條件&lt;/strong&gt;：當 &lt;code&gt;num1&lt;/code&gt; 等於 &lt;code&gt;num2&lt;/code&gt; 時，兩者的值即為最大公因數。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這種方法的核心在於，每次迭代都將較大的數字減小，直到兩個數字相等。這個相等的數字就是這兩個數字的最大公因數。&lt;/p&gt;</content:encoded><h:img src="/_astro/pexels-divinetechygirl-1181298.F0NbLO_c.jpg"/><enclosure url="/_astro/pexels-divinetechygirl-1181298.F0NbLO_c.jpg"/></item><item><title>Markdown 語法支持</title><link>https://astro-docs.vercel.app/blog/markdown-zh</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/markdown-zh</guid><description>Markdown 是一種輕量級的「標記語言」。</description><pubDate>Fri, 26 Jul 2024 08:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;基本語法&lt;/h2&gt;
&lt;p&gt;Markdown 是一種輕量級且易於使用的語法，用於為您的寫作設計風格。&lt;/p&gt;
&lt;h3&gt;標題&lt;/h3&gt;
&lt;p&gt;文章內容較多時，可以用標題分段：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;# 標題 1

## 標題 2

## 大標題

### 小標題
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;標題預覽會打亂文章的結構，所以在此不展示。&lt;/p&gt;
&lt;h3&gt;粗斜體&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;_斜體文本_

**粗體文本**

**_粗斜體文本_**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;斜體文本&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;粗體文本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;粗斜體文本&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;鏈接&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;文字鏈接 [鏈接名稱](http://鏈接網址)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;文字鏈接 &lt;a href=&quot;http://%E9%8F%88%E6%8E%A5%E7%B6%B2%E5%9D%80&quot;&gt;鏈接名稱&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;行內代碼&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;這是一條 `單行代碼`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;這是一條 &lt;code&gt;行內代碼&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;代碼塊&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;```js
// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
```
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// calculate fibonacci
function fibonacci(n) {
  if (n &amp;#x3C;= 1) return 1
  return fibonacci(n - 1) + fibonacci(n - 2)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;當前使用 shiki 作為代碼高亮插件，支持的語言請參考 &lt;a href=&quot;https://shiki.matsu.io/languages.html&quot;&gt;shiki / languages&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;行內公式&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;這是一條行內公式 $e^{i\pi} + 1 = 0$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;這是一條行內公式 $e^{i\pi} + 1 = 0$&lt;/p&gt;
&lt;h3&gt;公式塊&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} \, dx
$$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;$$
\hat{f}(\xi) = \int_{-\infty}^{\infty} f(x) e^{-2\pi i x \xi} , dx
$$&lt;/p&gt;
&lt;p&gt;當前使用 KaTeX 作為數學公式插件，支持的語法請參考 &lt;a href=&quot;https://katex.org/docs/supported.html&quot;&gt;KaTeX Supported Functions&lt;/a&gt;。&lt;/p&gt;
&lt;h4&gt;圖片&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![CWorld](https://cravatar.cn/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cravatar.cn/avatar/1ffe42aa45a6b1444a786b1f32dfa8aa?s=200&quot; alt=&quot;CWorld&quot;&gt;&lt;/p&gt;
&lt;h4&gt;刪除線&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;~~刪除線~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;~~刪除線~~&lt;/p&gt;
&lt;h3&gt;列表&lt;/h3&gt;
&lt;p&gt;普通無序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- 1
- 2
- 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;普通有序列表&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;1. GPT-4
2. Claude Opus
3. LLaMa
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPT-4&lt;/li&gt;
&lt;li&gt;Claude Opus&lt;/li&gt;
&lt;li&gt;LLaMa&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;列表里可以繼續嵌套語法&lt;/p&gt;
&lt;h3&gt;引用&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&gt; 槍響，雷鳴，劍起。繁花血景。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;槍響，雷鳴，劍起。繁花血景。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;引用里也可以繼續嵌套語法。&lt;/p&gt;
&lt;h3&gt;換行&lt;/h3&gt;
&lt;p&gt;markdown 分段落是需要空一行的。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;如果不空行
就會在一段

第一段

第二段
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;如果不空行
就會在一段&lt;/p&gt;
&lt;p&gt;第一段&lt;/p&gt;
&lt;p&gt;第二段&lt;/p&gt;
&lt;h3&gt;分隔符&lt;/h3&gt;
&lt;p&gt;如果你有寫分割線的習慣，可以新起一行輸入三個減號&lt;code&gt;---&lt;/code&gt; 或者星號 &lt;code&gt;***&lt;/code&gt;。當前後都有段落時，請空出一行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;高級技巧&lt;/h2&gt;
&lt;h3&gt;行內 HTML 元素&lt;/h3&gt;
&lt;p&gt;目前只支持部分段內 HTML 元素效果，包括 &lt;code&gt;&amp;#x3C;kdb&gt; &amp;#x3C;b&gt; &amp;#x3C;i&gt; &amp;#x3C;em&gt; &amp;#x3C;sup&gt; &amp;#x3C;sub&gt; &amp;#x3C;br&gt;&lt;/code&gt; ，如&lt;/p&gt;
&lt;h4&gt;鍵位顯示&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;使用 &amp;#x3C;kbd&gt;Ctrl&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Alt&amp;#x3C;/kbd&gt; + &amp;#x3C;kbd&gt;Del&amp;#x3C;/kbd&gt; 重啟電腦
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;使用 Ctrl + Alt + Del 重啟電腦&lt;/p&gt;
&lt;h4&gt;粗斜體&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;b&gt; Markdown 在此處同樣適用，如 _加粗_ &amp;#x3C;/b&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt; Markdown 在此處同樣適用，如 &lt;em&gt;加粗&lt;/em&gt; &lt;/p&gt;
&lt;h3&gt;其他 HTML 寫法&lt;/h3&gt;
&lt;h4&gt;折疊塊&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;&amp;#x3C;details&gt;&amp;#x3C;summary&gt;點擊展開&amp;#x3C;/summary&gt;它被隱藏了&amp;#x3C;/details&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;h3&gt;表格&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;| 表頭1 | 表頭2 |
| ----- | ----- |
| 內容1 | 內容2 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;| 表頭1 | 表頭2 |
| ----- | ----- |
| 內容1 | 內容2 |&lt;/p&gt;
&lt;h3&gt;注釋&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;在引用的地方使用 [^注釋] 來添加注釋。

然後在文檔的結尾，添加注釋的內容（會默認於文章結尾渲染之）。

[^注釋]: 這里是注釋的內容
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;在引用的地方使用 &lt;a href=&quot;%E9%80%99%E9%87%8C%E6%98%AF%E6%B3%A8%E9%87%8B%E7%9A%84%E5%85%A7%E5%AE%B9&quot;&gt;^注釋&lt;/a&gt; 來添加注釋。&lt;/p&gt;
&lt;p&gt;然後在文檔的結尾，添加注釋的內容（會默認於文章結尾渲染之）。&lt;/p&gt;
&lt;h3&gt;To-Do 列表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;- [ ] 未完成的任務
- [x] 已完成的任務
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 未完成的任務&lt;/li&gt;
&lt;li&gt;[x] 已完成的任務&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;符號轉義&lt;/h3&gt;
&lt;p&gt;如果你的描述中需要用到 markdown 的符號，比如 _ # * 等，但又不想它被轉義，這時候可以在這些符號前加反斜杠，如 &lt;code&gt;\_&lt;/code&gt; &lt;code&gt;\#&lt;/code&gt; &lt;code&gt;\*&lt;/code&gt; 進行避免。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;\_不想這里的文本變斜體\_

\*\*不想這里的文本被加粗\*\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;預覽：&lt;/p&gt;
&lt;p&gt;_不想這里的文本變斜體_&lt;/p&gt;
&lt;p&gt;**不想這里的文本被加粗**&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;內嵌 Astro 組件&lt;/h2&gt;
&lt;p&gt;See &lt;a href=&quot;/docs/integrations/components&quot;&gt;User Components&lt;/a&gt; and &lt;a href=&quot;/docs/integrations/advanced&quot;&gt;Advanced Components&lt;/a&gt; for details.&lt;/p&gt;</content:encoded><h:img src="/_astro/thumbnail.HAXFr_hw.jpg"/><enclosure url="/_astro/thumbnail.HAXFr_hw.jpg"/></item><item><title>[筆記] 自訂 VS Code Snippets (程式碼片段)</title><link>https://astro-docs.vercel.app/blog/%E8%87%AA%E8%A8%82-vs-code-snippets-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E7%89%87%E6%AE%B5</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/%E8%87%AA%E8%A8%82-vs-code-snippets-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E7%89%87%E6%AE%B5</guid><description>紀錄如何新增 VS Code 的 Snippets</description><pubDate>Thu, 16 May 2024 23:07:06 GMT</pubDate><content:encoded>&lt;p&gt;紀錄下如何自訂好用的Snippets 讓寫程式更快速&lt;/p&gt;
&lt;h2&gt;選取 Files &gt; Preferences &gt; Configure User Snippets&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-docs.vercel.app/images/1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;選擇想寫的 Snippets 所使用的語言，我選 JS&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-docs.vercel.app/images/2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;會進入這個編輯畫面&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-docs.vercel.app/images/3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;{
 	&quot;Snippet名稱&quot;: {
 		&quot;prefix&quot;: &quot;觸發Snippet的關鍵字&quot;,
 		&quot;body&quot;: [
 			&quot;console.log(&apos;$1&apos;);&quot;,
 			&quot;$2&quot;
 		],
 		&quot;description&quot;: &quot;Snippet的介紹&quot;
 	}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;body 是一個陣列，每一行的文字是用引號包起，逗號分開&lt;/li&gt;
&lt;li&gt;$1 代表可以自訂的變數&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;打開一個新.js，並輸入剛剛自訂的 prefix，就會發現它自動帶入剛剛設定的 Snippet 囉&lt;/p&gt;
&lt;p&gt;小技巧：可以叫 ChatGPT 幫你把程式碼改成陣列的模式&lt;/p&gt;</content:encoded><h:img src="/_astro/下載.B143Tolc.jpg"/><enclosure url="/_astro/下載.B143Tolc.jpg"/></item><item><title>[筆記] Hugo 部落格採用 Static CMS</title><link>https://astro-docs.vercel.app/blog/%E7%AD%86%E8%A8%98-hugo-%E9%83%A8%E8%90%BD%E6%A0%BC%E6%8E%A1%E7%94%A8-static-cms</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/%E7%AD%86%E8%A8%98-hugo-%E9%83%A8%E8%90%BD%E6%A0%BC%E6%8E%A1%E7%94%A8-static-cms</guid><description>紀錄我將部落格採用Static CMS的過程</description><pubDate>Thu, 09 May 2024 11:34:24 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;之前我就一直想為部落格新增 CMS  (也就是為部落格新增後台管理系統)，&lt;/p&gt;
&lt;p&gt;嘗試了不同系統，諸如：&lt;a href=&quot;https://outstatic.com/docs/getting-started&quot;&gt;OutStatic&lt;/a&gt;、&lt;a href=&quot;https://www.netlify.com/blog/tags/cms/&quot;&gt;Netlify CMS&lt;/a&gt;，前者介面太陽春、後者是已死的系統，&lt;/p&gt;
&lt;p&gt;直到我查到&lt;a href=&quot;https://vrabe.tw/&quot;&gt;鰭狀漏斗&lt;/a&gt;的「&lt;a href=&quot;https://vrabe.tw/blog/continuation-of-netlify-cms/&quot;&gt;重獲新生的 Netlify CMS&lt;/a&gt;」，了解到原來 Netlify CMS後續是有人接手做的，於是我選擇了被分支出來的 Static CMS 作為我部落格新的後台系統&lt;/p&gt;
&lt;h2&gt;教學&lt;/h2&gt;
&lt;p&gt;設置上跟 Netlify CMS挺像的，如果你也想將它加入你的網站，請先閱讀&lt;a href=&quot;https://www.staticcms.org/docs/add-to-your-site-cdn&quot;&gt;這份官方文檔&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;~~但讀起來實在是覺得講得不夠清楚~~&lt;/p&gt;
&lt;p&gt;以下我直接分享我的配置給各位，如果有疑問或想法都可以留言討論&lt;/p&gt;
&lt;h3&gt;資料結構&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在&lt;code&gt;/static/&lt;/code&gt;資料夾內新增&lt;code&gt;admin&lt;/code&gt;資料夾，並且在&lt;code&gt;admin&lt;/code&gt;資料夾內新增&lt;code&gt;config.yml&lt;/code&gt;及&lt;code&gt;index.html&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;static
├── admin
│   ├── config.yml
└── └── index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;&lt;a href=&quot;index.html&quot;&gt;index.html&lt;/a&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;#x3C;!DOCTYPE html&gt;
&amp;#x3C;html&gt;
  &amp;#x3C;head&gt;
    &amp;#x3C;script src=&quot;https://identity.netlify.com/v1/netlify-identity-widget.js&quot;&gt;&amp;#x3C;/script&gt;
    &amp;#x3C;meta charset=&quot;utf-8&quot; /&gt;
    &amp;#x3C;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
    &amp;#x3C;link rel=&quot;stylesheet&quot; href=&quot;https://unpkg.com/@staticcms/app@^4.0.0/dist/main.css&quot; /&gt;
    &amp;#x3C;title&gt;Content Manager&amp;#x3C;/title&gt;
  &amp;#x3C;/head&gt;
  &amp;#x3C;body&gt;
    &amp;#x3C;!-- Include the script that builds the page and powers Static CMS --&gt;
    &amp;#x3C;script src=&quot;https://unpkg.com/@staticcms/app@^4.0.0/dist/static-cms-app.js&quot;&gt;&amp;#x3C;/script&gt;
    &amp;#x3C;script&gt;
      window.CMS.init();
    &amp;#x3C;/script&gt;
    &amp;#x3C;script&gt;
      if (window.netlifyIdentity) {
        window.netlifyIdentity.on(&apos;init&apos;, user =&gt; {
          if (!user) {
            window.netlifyIdentity.on(&apos;login&apos;, () =&gt; {
              document.location.href = &apos;/admin/&apos;;
            });
          }
        });
      }
    &amp;#x3C;/script&gt;
  &amp;#x3C;/body&gt;
&amp;#x3C;/html&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按照以上設置你的 &lt;a href=&quot;index.html&quot;&gt;index.html&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;&lt;a href=&quot;config.yml&quot;&gt;config.yml&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;先貼整個設置再一一講解&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;backend:
  name: git-gateway
  branch: master
publish_mode: editorial_workflow
media_folder: &quot;static/images&quot; # Folder where user uploaded files should go
public_folder: &quot;images&quot;
collections:
  - name: &quot;posts&quot; # Used in routes, e.g., /admin/collections/post
    label: &quot;Posts&quot; # Used in the UI
    folder: &quot;content/posts&quot; # The path to the folder where the documents are stored
    path: &quot;{{slug}}/index&quot;
    media_folder: &quot;/static/images&quot; # Save images in the post&apos;s own folder instead of the static folder
    public_folder: &quot;/images&quot;
    create: true # Allow users to create new documents in this collection
    fields: # The fields for each document, usually in front matter
      - { label: &quot;Title&quot;, name: &quot;title&quot;, widget: &quot;string&quot; }
      - { label: &quot;Subtitle&quot;, name: &quot;subtitle&quot;, widget: &quot;string&quot; }
      - { label: &quot;Publish Date&quot;, name: &quot;date&quot;, widget: &quot;datetime&quot; }
      - { label: &quot;Featured Image&quot;, name: &quot;feature&quot;, widget: &quot;image&quot; }
      - { label: &quot;Body&quot;, name: &quot;body&quot;, widget: &quot;markdown&quot; }
      - { label: &quot;Tags&quot;, name: &quot;tags&quot;, widget: &quot;list&quot;, field: { label: &quot;Tag&quot;, name: &quot;tag&quot;, widget: &quot;string&quot; } }
  - name: &quot;pages&quot;
    label: &quot;Pages&quot;
    files:
      - file: &quot;content/_index.md&quot;
        label: &quot;Home Page&quot;
        name: &quot;home&quot;
        fields:
          - { label: &quot;Title&quot;, name: &quot;title&quot;, widget: &quot;string&quot; }
          - { label: &quot;Blurb&quot;, name: &quot;blurb&quot;, widget: &quot;text&quot; }
          - {
              label: &quot;Section&quot;,
              name: &quot;section&quot;,
              widget: &quot;object&quot;,
              fields:
                [
                  { label: &quot;Heading&quot;, name: &quot;heading&quot;, widget: string },
                  { label: &quot;Text&quot;, name: &quot;text&quot;, widget: &quot;text&quot; },
                ],
            }
      - name: &apos;about&apos;
        label: &apos;About Page&apos;
        file: &apos;content/about.md&apos;
        fields: 
          - {label: &apos;Title&apos;, name: &apos;title&apos;, widget: &apos;string&apos;}
          - {label: &apos;Body&apos;, name: &apos;body&apos;, widget: &apos;markdown&apos;}

      - name: &apos;archive&apos;
        label: &apos;Archive Page&apos;
        file: &apos;content/archive.md&apos;
        fields:
          - {label: &apos;Title&apos;, name: &apos;title&apos;, widget: &apos;string&apos;}
          - {label: &apos;Body&apos;, name: &apos;body&apos;, widget: &apos;markdown&apos;}

&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;backend&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;backend:
  name: git-gateway
  branch: master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;這邊設置你要推上的分支名，我直接設master&lt;/p&gt;
&lt;h5&gt;publish_mode&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;publish_mode: editorial_workflow
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加這行會開啟 Static CMS特有的編輯工作流，雖然改狀態很麻煩，但如果你想要有儲存草稿功能建議添加這行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://astro-docs.vercel.app/images/editorial.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h5&gt;fields&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt; - { label: &quot;Title&quot;, name: &quot;title&quot;, widget: &quot;string&quot; }
      - { label: &quot;Subtitle&quot;, name: &quot;subtitle&quot;, widget: &quot;string&quot; }
      - { label: &quot;Publish Date&quot;, name: &quot;date&quot;, widget: &quot;datetime&quot; }
      - { label: &quot;Featured Image&quot;, name: &quot;feature&quot;, widget: &quot;image&quot; }
      - { label: &quot;Body&quot;, name: &quot;body&quot;, widget: &quot;markdown&quot; }
      - { label: &quot;Tags&quot;, name: &quot;tags&quot;, widget: &quot;list&quot;, field: { label: &quot;Tag&quot;, name: &quot;tag&quot;, widget: &quot;string&quot; } }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;colletctions/post底下的 filelds 就是文字編輯器上編輯 markdown 屬性的地方，請依據自己用的框架、部落格主題去設置這塊&lt;/p&gt;</content:encoded><h:img src="/_astro/static-cms-logo.Bc1ihYs8.svg"/><enclosure url="/_astro/static-cms-logo.Bc1ihYs8.svg"/></item><item><title>[程式] JavaScript ES6 筆記</title><link>https://astro-docs.vercel.app/blog/%E7%AD%86%E8%A8%98-javascript-es6-%E7%AD%86%E8%A8%98</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/%E7%AD%86%E8%A8%98-javascript-es6-%E7%AD%86%E8%A8%98</guid><description>紀錄 JS ES6 的相關語法筆記</description><pubDate>Wed, 08 May 2024 07:14:23 GMT</pubDate><content:encoded>&lt;h2&gt;Destructuring Objects and Arrays&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;const book = {
    id: 1,
    title: &quot;The Lord of the Rings&quot;,
    publicationDate: &quot;1954-07-29&quot;,
    author: &quot;J. R. R. Tolkien&quot;,
    genres: [
      &quot;fantasy&quot;,
      &quot;high-fantasy&quot;,
      &quot;adventure&quot;,
      &quot;fiction&quot;,
      &quot;novels&quot;,
      &quot;literature&quot;,
    ],
    hasMovieAdaptation: true,
    pages: 1216,
    translations: {
      spanish: &quot;El señor de los anillos&quot;,
      chinese: &quot;魔戒&quot;,
      french: &quot;Le Seigneur des anneaux&quot;,
    },
    reviews: {
      goodreads: {
        rating: 4.52,
        ratingsCount: 630994,
        reviewsCount: 13417,
      },
      librarything: {
        rating: 4.53,
        ratingsCount: 47166,
        reviewsCount: 452,
      },
    },
};

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;可以直接取用物件中的key,得到相對應value&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const { title, author, pages, pulicationDate, genres, hasMovieAdaptation} = book; 
console.log(title) // =&gt; The Lord of the Rings

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;可以直接將陣列解構復值&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(rest); // [30, 40, 50];

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;「…」語法，可用在物件或陣列上&lt;/h3&gt;
&lt;p&gt;可以將陣列的值複製進另一個陣列&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const updateBook = {
  ...book,
  moviePublicationDate: &quot;2001-12-19&quot;,
  pages: 1210,
};
//這樣updateBook將會包含book物件的所有屬性，又加上後面兩個屬性

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;模板語法&lt;/h2&gt;
&lt;p&gt;用重音符將${} 包起來，${}中可以放語法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const summary = `${title} is a book`;
console.log(summary) // &apos;The Lord of the Ring is a book;&apos;

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;三元運算符&lt;/h2&gt;
&lt;p&gt;如果第一個邏輯結果為 &lt;code&gt;True&lt;/code&gt; ，返回 ? 後第一個結果，否則返回第二個&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const isBookAvaliable = false;
const canTheBookBeBorrowed = isBookAvaliable ? &apos;Avaliable&apos; : &apos;Unavaliable&apos;;

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;? (可選鏈運算子) 及 ?? (null合併運算子)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;  const librarything = book.reviews.librarything?.reviewsCount ?? 0;

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;**?**&lt;/code&gt; 表示如果 &lt;code&gt;**book.reviews.librarything**&lt;/code&gt; 是 &lt;code&gt;**null**&lt;/code&gt; 或 &lt;code&gt;**undefined**&lt;/code&gt;，則不會試圖訪問 &lt;code&gt;**reviewsCount**&lt;/code&gt; 属性，而是直接返回 &lt;code&gt;**undefined**&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;**?? 0**&lt;/code&gt;：表示如果左側的表達式（&lt;code&gt;**book.reviews.librarything?.reviewsCount**&lt;/code&gt;）的結果是 &lt;code&gt;**null**&lt;/code&gt; 或 &lt;code&gt;**undefined**&lt;/code&gt;，則 &lt;code&gt;**librarything**&lt;/code&gt; 的值將是 &lt;code&gt;**0**&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;|| 邏輯運算子 與 ?? 的區別&lt;/h3&gt;
&lt;p&gt;**&lt;code&gt;??&lt;/code&gt;**是會在左側為 &lt;code&gt;**null**&lt;/code&gt; 或 &lt;code&gt;**undefined**&lt;/code&gt; &lt;strong&gt;時返回右側的值&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;**||**&lt;/code&gt; 則會在左側為任何 &lt;strong&gt;falsy&lt;/strong&gt; (包含 0、false、null、undefined 和 “”) 的值時返回右邊的值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let count = 0;
console.log(count ?? 10);  // 輸出 0，因為 count 不是 null 或 undefined
console.log(count || 10);  // 輸出 10，因為 count 是 falsy 值

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;陣列 .map() 方法&lt;/h3&gt;
&lt;p&gt;用於將陣列中的每個元素按照某種計算規則轉換成新的元素，然後將這些新元素組成一個新陣列返回&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const x = [1,2,3,4,5];
console.log(x.map((el)=&gt; el*2); // [2,4,6,8,10]

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;陣列 .filter() 方法&lt;/h3&gt;
&lt;p&gt;根據特定條件從一個陣列中創建一個新陣列，新陣列只包含符合條件的元素&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let newArray = array.filter(function(item, index, arr), thisArg);

const longBooks = books.filter(book =&gt; book.pages &gt; 500);
console.log(longBooks);
// longBooks 將會只包含那些超過 500 頁的書

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;陣列 .reduce() 方法&lt;/h3&gt;
&lt;p&gt;將陣列中的所有元素累計成單一的結果。&lt;code&gt;**reduce()**&lt;/code&gt; 對陣列中的每個元素（從左到右）執行一個由你提供的 reducer 函數，並將其結果累積起來，最終返回一個單一的值&lt;/p&gt;
&lt;p&gt;&lt;code&gt;**reduce()**&lt;/code&gt; 方法接受兩個參數：一個 reducer 函數和一個可選的初始累加值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;array.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;accumulator&lt;/strong&gt;：累加器累積回調的返回值；它是上一次調用回調後返回的累積值，或者是提供的初始值（&lt;code&gt;**initialValue**&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;currentValue&lt;/strong&gt;：陣列中正在處理的當前元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;currentIndex&lt;/strong&gt;（可選）：陣列中正在處理的當前元素的索引。如果提供了 &lt;code&gt;**initialValue**&lt;/code&gt;，則索引號從 &lt;code&gt;**0**&lt;/code&gt; 開始，否則從 &lt;code&gt;**1**&lt;/code&gt; 開始。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;array&lt;/strong&gt;（可選）：調用 &lt;code&gt;**reduce**&lt;/code&gt; 的陣列。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;initialValue&lt;/strong&gt;（可選）：作為第一個調用 &lt;code&gt;**reduce**&lt;/code&gt; 函數時第一個參數的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果不提供 &lt;code&gt;**initialValue**&lt;/code&gt;，&lt;code&gt;**reduce()**&lt;/code&gt; 會將數組的第一個元素作為初始累加值，並從第二個元素開始執行 reducer 函數。如果陣列為空且沒有提供 &lt;code&gt;**initialValue**&lt;/code&gt;，將拋出一個錯誤。&lt;/p&gt;
&lt;p&gt;範例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const pagesAllBooks = books.reduce((acc, book)=&gt;acc + book.pages,0);


&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;陣列 .filter() 方法&lt;/h3&gt;
&lt;p&gt;排序陣列中的元素&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const arr = [3,6,1,7,9]
const sorted = arr.sort((a,b)=&gt; a-b); // [1,3,6,7,9] 升冪
const down = arr.sort((a,b) =&gt; b-a); // [9,7,6,3,1] 降冪

&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;compareFunction&lt;/strong&gt;（可選）：一個可以自定義如何排序元素的函數。這個函數應該接受兩個參數（通常表示為 a 和 b），並根據比較的需要返回一個數值：
&lt;ul&gt;
&lt;li&gt;如果返回值小於 0，那麼 a 會被排在 b 前面。&lt;/li&gt;
&lt;li&gt;如果返回值等於 0，a 和 b 的相對位置不變。&lt;/li&gt;
&lt;li&gt;如果返回值大於 0，b 會被排在 a 前面。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;因為 &lt;code&gt;**sort()**&lt;/code&gt; 方法對原陣列進行原地排序，使用時要注意可能會改變原始數據。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;新增元素到陣列&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const newBook = {
  id: 6,
  title:&quot;Harry Potter and the Chamber of Secrets&quot;,
  author: &quot;J. K. Rowling&quot;,
}
const booksAfterAdding = [...books, newBook];
console.log(booksAfterAdding);

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;刪除陣列元素&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const booksAfterDelete = books.filter(book =&gt; book.id !== 3);
console.log(books); //結果將不含 id 為 3 的書

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;非同步&lt;/h2&gt;
&lt;h3&gt;Promise&lt;/h3&gt;
&lt;h3&gt;&lt;strong&gt;什麼是 Promise？&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;**Promise**&lt;/code&gt; 是一個對象，代表了一個最終可能完成或失敗的非同步操作的結果。它允許你對非同步操作的成功值或失敗原因進行關聯處理。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Promise 的狀態&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;**Promise**&lt;/code&gt; 有三種狀態：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pending&lt;/strong&gt;（待定）：初始狀態，非同步操作尚未完成也未被拒絕。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fulfilled&lt;/strong&gt;（已實現）：表示相關的非同步操作已成功完成。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rejected&lt;/strong&gt;（已拒絕）：表示相關的非同步操作已失敗。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;創建 Promise&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;你可以使用 &lt;code&gt;**Promise**&lt;/code&gt; 的構造函數來創建一個新的 &lt;code&gt;**Promise**&lt;/code&gt;。構造函數接受一個執行器函數作為參數，這個函數又接受兩個函數作為參數：&lt;code&gt;**resolve**&lt;/code&gt; 和 &lt;code&gt;**reject**&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let myPromise = new Promise((resolve, reject) =&gt; {
    // 非同步操作
    const condition = true;  // 假設條件判斷為非同步操作是否成功
    if (condition) {
        resolve(&apos;Operation successful&apos;);
    } else {
        reject(&apos;Error occurred&apos;);
    }
});

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;strong&gt;使用 Promise&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;當 &lt;code&gt;**Promise**&lt;/code&gt; 被解決或拒絕時，你可以使用 &lt;code&gt;**.then()**&lt;/code&gt; 和 &lt;code&gt;**.catch()**&lt;/code&gt; 方法來處理成功或失敗的結果。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;**.then()**&lt;/code&gt;：接受兩個函數作為參數。第一個函數是在 &lt;code&gt;**Promise**&lt;/code&gt; 被解決時調用的，第二個（可選）函數是在 &lt;code&gt;**Promise**&lt;/code&gt; 被拒絕時調用的。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;**.catch()**&lt;/code&gt;：接受一個函數作為參數，用於處理 &lt;code&gt;**Promise**&lt;/code&gt; 被拒絕的情況。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;fetch(&quot;&amp;#x3C;http://jsonplaceholder.typicode.com/todos&gt;&quot;)
  .then((res)=&gt;res.json())
  .then(data =&gt; console.log(data

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Async &amp;#x26; Await 語法糖&lt;/h3&gt;
&lt;p&gt;在 JavaScript 中，&lt;code&gt;**await**&lt;/code&gt; 是一個用於處理非同步操作的關鍵字，它只能在 &lt;code&gt;**async**&lt;/code&gt; 函數內部使用。&lt;code&gt;**await**&lt;/code&gt; 關鍵字可以暫停 &lt;code&gt;**async**&lt;/code&gt; 函數的執行，等待 &lt;code&gt;**Promise**&lt;/code&gt; 的解決或拒絕，然後恢復 &lt;code&gt;**async**&lt;/code&gt; 函數的執行並返回解決值。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;基本使用&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;要使用 &lt;code&gt;**await**&lt;/code&gt;，首先需要定義一個 &lt;code&gt;**async**&lt;/code&gt; 函數。&lt;code&gt;**async**&lt;/code&gt; 函數是一種返回 &lt;code&gt;**Promise**&lt;/code&gt; 對象的函數。在這個函數體內，你可以使用 &lt;code&gt;**await**&lt;/code&gt; 來等待 &lt;code&gt;**Promise**&lt;/code&gt; 完成。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;async function getTodos() {
  const res = await fetch(&quot;&amp;#x3C;http://jsonplaceholder.typicode.com/todos&gt;&quot;);
  const data = await res.json();
  console.log(data);
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上述代碼中，&lt;code&gt;**somePromise()**&lt;/code&gt; 應該是一個返回 &lt;code&gt;**Promise**&lt;/code&gt; 的函數。當 &lt;code&gt;**Promise**&lt;/code&gt; 被解決時，它的解決值會被賦值給 &lt;code&gt;**result**&lt;/code&gt; 變量。如果 &lt;code&gt;**Promise**&lt;/code&gt; 被拒絕，則會拋出異常，可以使用 &lt;code&gt;**try...catch**&lt;/code&gt; 結構來捕獲這個異常。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;詳細解釋&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;當 &lt;code&gt;**await**&lt;/code&gt; 表達式被執行時，它會暫停包含它的 &lt;code&gt;**async**&lt;/code&gt; 函數的執行。如果 &lt;code&gt;**Promise**&lt;/code&gt; 成功解決，則返回的值會作為 &lt;code&gt;**await**&lt;/code&gt; 表達式的結果。如果 &lt;code&gt;**Promise**&lt;/code&gt; 被拒絕，則拒絕的原因會被拋出作為異常。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;**await**&lt;/code&gt; 只能在 &lt;code&gt;**async**&lt;/code&gt; 函數內部使用。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;**await**&lt;/code&gt; 時，如果不加控制，可能會導致程序的性能下降，因為它會在等待 &lt;code&gt;**Promise**&lt;/code&gt; 解決時暫停函數的執行。在處理多個獨立的 &lt;code&gt;**Promise**&lt;/code&gt; 時，應考慮並行執行它們（如使用 &lt;code&gt;**Promise.all()**&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;**await**&lt;/code&gt; 會將非 &lt;code&gt;**Promise**&lt;/code&gt; 值轉換為立即解決的 &lt;code&gt;**Promise**&lt;/code&gt;，這意味著你可以等待任何值，但這可能會導致不必要的微小延遲。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="/_astro/javascript-736400_640.CTDif_31.png"/><enclosure url="/_astro/javascript-736400_640.CTDif_31.png"/></item><item><title>[程式] Vue 3 改版後與 Vue 2 的差異</title><link>https://astro-docs.vercel.app/blog/vue3%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/vue3%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98</guid><description>紀錄 Vue 3 與 Vue 2 的差異.</description><pubDate>Thu, 24 Nov 2022 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;學習資源&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;影片：
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=bwItFdPt-6M&quot;&gt;Vue 3 Composition API Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ZqgiuPt5QZo&quot;&gt;Vue 3 For Beginners - Full Tutorial Course&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;參考資料：- &lt;a href=&quot;https://book.vue.tw/preface.html&quot;&gt;重新認識 Vue.js | Kuro Hsu&lt;/a&gt; - &lt;a href=&quot;https://medium.com/peerone-technology-%E7%9A%AE%E5%81%B6%E7%8E%A9%E4%BA%92%E5%8B%95%E7%A7%91%E6%8A%80/%E5%8D%87%E7%B4%9A-vue-3-%E5%89%8D-%E4%BD%A0%E5%BF%85%E9%A0%88%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84%E6%94%B9%E5%8B%95-5891a297dbe2&quot;&gt;升級 Vue 3 前，你必須要知道的改動&lt;/a&gt; - &lt;a href=&quot;https://www.fly63.com/article/detial/10595&quot;&gt;Vue3 Hook 到底是啥黑魔法？
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;升級後的重大變革&lt;/h2&gt;
&lt;h3&gt;新增功能&lt;/h3&gt;
&lt;h4&gt;1. &lt;a href=&quot;#Composition-API-%E7%B0%A1%E4%BB%8B&quot;&gt;Composition API&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;相關邏輯可以集中&lt;/li&gt;
&lt;li&gt;減少 this 指向的問題&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#Vue3-%E8%87%AA%E5%AE%9A%E7%BE%A9Hook&quot;&gt;Vue3 自定義Hook&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;使用 Composition API 寫法取代舊版 mixins&lt;/li&gt;
&lt;li&gt;hook是一個函式&lt;/li&gt;
&lt;li&gt;將程式碼拆解，能夠讓各個頁面引用
&lt;ul&gt;
&lt;li&gt;可以當作公用的函式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. useCssVars&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;可以在組件加上自訂的 CSS 變數 var()&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Teleport&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Teleport 可以將定義的內容轉移到目標元素。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. Fragments&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;模板可以省略根元素，避免多出許多不必要的元素&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5. Emits Component Option&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Vue 3 提供 emits 的聲明，用法就像 props 一樣。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;6. Suspense &amp;#x26; Error Boundary&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Suspense 是非同步載入的組件，在資料讀取完成以及渲染完成之前，會先顯示 &lt;strong&gt;#fallback&lt;/strong&gt; 的內容。&lt;/li&gt;
&lt;li&gt;可以不用特地加一個 loading 變數來處理加載資料時的判斷&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7. ::v-slotted &amp;#x26; ::v-global&lt;/h4&gt;
&lt;h3&gt;棄用的功能&lt;/h3&gt;
&lt;h4&gt;1. KeyCode&lt;/h4&gt;
&lt;h4&gt;2. &lt;code&gt;$on&lt;/code&gt;, &lt;code&gt;$off&lt;/code&gt;&amp;#x26; &lt;code&gt;$once&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;移除 &lt;code&gt;$on&lt;/code&gt;, &lt;code&gt;$off&lt;/code&gt;&amp;#x26; &lt;code&gt;$once&lt;/code&gt; 也代表不能再使用&lt;strong&gt;EventBus&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Inline Template Attribute&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;&amp;#x3C;!-- before --&gt;
&amp;#x3C;my-comp inline-template :msg=&quot;parentMsg&quot;&gt;
  {{ msg }} {{ childState }}
&amp;#x3C;/my-comp&gt;

&amp;#x3C;!-- after --&gt;
&amp;#x3C;my-comp v-slot=&quot;{ childState }&quot;&gt;
  {{ parentMsg }} {{ childState }}
&amp;#x3C;/my-comp&gt;
&amp;#x3C;!-- my-comp --&gt;
&amp;#x3C;slot :childState=&quot;childState&quot; /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;4. Filters&lt;/h4&gt;
&lt;h4&gt;5. $listeners&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;在 Vue3 中 $listeners 已經整合到 $attrs&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Vue2:
&amp;#x3C;input type=&quot;text&quot; v-bind=&quot;$attrs&quot; v-on=&quot;$listeners&quot; /&gt;
Vue3:
&amp;#x3C;input type=&quot;text&quot; v-bind=&quot;$attrs&quot; /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Composition API 簡介&lt;/h2&gt;
&lt;h3&gt;Composition API 是什麼&lt;/h3&gt;
&lt;p&gt;Composition API 其實就是要取代 Vue2時，元件與元件間的程式碼與邏輯結構分散，難以重複使用的問題。
也可看作Function-based APIs，就是以函式作為邏輯的中心，將「該放一起的東西放在一起」。&lt;/p&gt;
&lt;h3&gt;Vue2 的 Options API 出了什麼問題？&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/KdPPkrc.png&quot; alt=&quot;&quot;&gt;
原先，Vue2是將不同功能拆開來使用，但是隨著元件的增多。同一個邏輯操作的程式碼卻散佈在各個地方，不但不利於維護，也難以重複使用。&lt;/p&gt;
&lt;h3&gt;功能與邏輯的重複使用&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mixins 不再建議繼續使用&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自定義指令&lt;/strong&gt;
透過app.directive() 來建立一個客製化的指令，假設叫它&apos;img-fallback&apos;&lt;/p&gt;
&lt;p&gt;當圖片載入錯誤時，用預設圖取代&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;//建立新元件
const app = vue.createApp({});

//在 app 註冊自定義指令
app.directive(&apos;img-fallback&apos;, {
    //mounted hook
    mounted(el){
    //當el觸發error事件的時候，把src換成預設圖
        el.add.EventListener(&apos;error&apos;,() =&gt; {
        el.src = &apos;default.png&apos;
        })
    }
})

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此時便可在所有想設定預設圖的&lt;code&gt;&amp;#x3C;img&gt;&lt;/code&gt;標籤加上v-img-fallback的自訂指令&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;&amp;#x3C;div-id=&quot;app&quot;&gt;
&amp;#x3C;img
    v-img-fallback
    src=&quot;noimage.png&quot;
&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此時，當瀏覽器試圖取得不存在的圖檔(noimage.png)時，就會觸發error事件，並且將圖檔置換成預設圖片。&lt;/p&gt;
&lt;p&gt;除了 mounted鉤子外，還有其他的鉤子可以使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;created&lt;/li&gt;
&lt;li&gt;beforeMounted&lt;/li&gt;
&lt;li&gt;mounted&lt;/li&gt;
&lt;li&gt;beforeUpdate&lt;/li&gt;
&lt;li&gt;updated&lt;/li&gt;
&lt;li&gt;beforeUnmount&lt;/li&gt;
&lt;li&gt;unmomunted&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這裡的鉤子函式是「指令」所使用的鉤子函式，與生命週期鉤子沒有直接關係。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;Composition API&lt;/strong&gt;
&lt;img src=&quot;https://i.imgur.com/FXQVReM.png&quot; alt=&quot;&quot;&gt;
將跨元件共用的屬性(如data、computed、methods等)包裝起來，然後再將要使用的元件引入進去。
&lt;img src=&quot;https://i.imgur.com/awzOspm.png&quot; alt=&quot;&quot;&gt;
與mixins最大的差別在於，被import到元件內的屬性，必須要以「物件」或「函式」的形式來將它們引入到元件中。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Vue3 自定義Hook&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;能夠將程式碼拆解，成為能夠引用的公用函式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;範例程式碼：./mouse&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;import { ref, onMounted, onUnmounted } from &quot;vue&quot;;

export function useMousePosition() {
  const x = ref(0);
  const y = ref(0);

  function update(e) {
    x.value = e.pageX;
    y.value = e.pageY;
  }

  onMounted(() =&gt; {
    window.addEventListener(&quot;mousemove&quot;, update);
  });

  onUnmounted(() =&gt; {
    window.removeEventListener(&quot;mousemove&quot;, update);
  });

  return { x, y };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在頁面或組件中引用的方式&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;// 引用整個函式
import { useMousePosition } from &quot;./mouse&quot;;

export default {
  setup() {
      // 定義並return 函式所return的東西即可
    const { x, y } = useMousePosition();
    return { x, y };
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Composition API 核心&lt;/h2&gt;
&lt;p&gt;Compostion API 與 Options API 最大的差別：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元件的實體物件內不會再有 data、computed、methods 與生命週期 Hooks 等屬性
（&lt;strong&gt;禁止再將上述屬性放到實體物件中&lt;/strong&gt;）&lt;/li&gt;
&lt;li&gt;取代原先分散式的結構&lt;/li&gt;
&lt;li&gt;解決以 this 取得屬性所產生的問題&lt;/li&gt;
&lt;li&gt;以新的setup()函式取代&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;setup: 啟動元件的位置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;增加可讀性&lt;/li&gt;
&lt;li&gt;要將模板內會用到的部分 return 出去&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;setup(){
// 將程式邏輯定義在todoList()內
// 增加可讀性
    const {todo, items, add , remove } = todoList();

// 將模板會用到的部分 return 出去
    return {
    todo,
    items,
    add,
    remove
    };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;props 與 context&lt;/h3&gt;
&lt;p&gt;當setup()啟動時，會帶入兩個參數：props與context
由於已經不再使用 this 來存取屬性，所以可以透過 setup 函式提供的 props 物件來取得 props 的內容&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;取代原先以 this 存取屬性的 props&lt;/li&gt;
&lt;li&gt;context名稱可自訂&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;export default {
props {
    defaultNum: {
    type: Number,
    defautl: 0
    }
},
//注意要加上props
    setup(props,context) {
        // 透過prop物件取的對應的屬性
        console.log(props.defaultNum);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;context物件&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;提供了 attrs, slots, emit 三種屬性，分別對應到元件的實體物件上&lt;/li&gt;
&lt;li&gt;可以透過 context.attrs、context.slots、context.emit 來使用&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;&amp;#x3C;template&gt;
    &amp;#x3C;div @click=&quot;clickInfo&quot;&gt;
        子组件 == {{name1}}, {{title1}}
    &amp;#x3C;/div&gt;
&amp;#x3C;/template&gt;
&amp;#x3C;script&gt;
import { reactive } from &apos;vue&apos;
export default {
    name: &apos;child1&apos;,
    props: {
        name: String,
        title: String
    },
    setup(props, context){

        const name1 = reactive(props.name)
        const title1 = reactive(props.title)
        // 子组件点击事件
        const clickInfo = ()=&gt;{
            // 抛出事件
            context.emit(&apos;itemclick&apos;, {name: &apos;emitClick&apos;})
        }
        return { name1, title1, clickInfo };
    }
}
&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ref 與 reactive ： 使值動態響應&lt;/h3&gt;
&lt;p&gt;在Compotision API 中，可以使用ref()來將數值進行包裝，並且回傳一個響應式的「物件」。
這個ref()函式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以包裝原始型別(primitive)，也可以包裝物件或陣列。&lt;/li&gt;
&lt;li&gt;必須後綴.value來讀取數值&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在這個物件內，會提供一個value的屬性，可以透過這個value來更新或讀取狀態內的數值：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;const count = ref(0);
console.log(count.value); //0
count.valut++;
console.log(count.value); //1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例：count.vue&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;&amp;#x3C;template&gt;
    &amp;#x3C;h1&gt;{{ count }}&amp;#x3C;/h1&gt;
    &amp;#x3C;button @click=&quot;plus&quot;&gt;Plus&amp;#x3C;/button&gt;
&amp;#x3C;/template&gt;

&amp;#x3C;script&gt;
    // 透過import 引入 ref
    import { ref } from &apos;vue&apos;;

    export default {
        setup(){
            const count = ref(0)
        }

        return {
            // 透過 ref()包裝的數值可保有響應性
            count,
            plus,
            // 純數值在模板中同樣可以渲染，但不會有響應性追蹤
            nonReactiveCount: 0
        }
    }
&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;ref 與 Dom 節點：替代$ref&lt;/h4&gt;
&lt;p&gt;由於setup()中已無this.$ref可用，要存取DOM中的元素，可利用先前提到的&lt;strong&gt;ref()&lt;/strong&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;&amp;#x3C;template&gt;
    &amp;#x3C;!-- 模板內要加上 ref 屬性 --&gt;
    &amp;#x3C;div ref=&quot;root&quot;&gt;&amp;#x3C;/div&gt;
&amp;#x3C;/template&gt;

&amp;#x3C;script&gt;
    import { ref, onMounted } from &apos;vue&apos;

    export default {
        setup(){
            // 這裡的 root 與 &amp;#x3C;div ref=&quot;root&quot;&gt; 配對
            const root = ref(null);

            //可以透過 root.value 取得實際的 DOM 元素
            onMounted(()=&gt;{
                console.log(root.value);
            })
        return {
            root,
            }
        }
    }
&amp;#x3C;/script&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;v-for 與 ref 複數動態節點 ： v-bind:ref&lt;/h4&gt;
&lt;p&gt;當 DOM 節點是透過 v-for 產生，同時又需要 ref 綁定模板時，
可以透過 v-bind:ref 綁定到某個陣列：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-htmlmixed=&quot;&gt;&amp;#x3C;div
    v-for=&quot;(item, i) in list&quot;
    :ref=&quot; el =&gt; { divs[i] = el }&quot;
&gt;
    {{ item }}
&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如此便能指定divs[0]、divs[1]、divs[2]所對應的&lt;code&gt;&amp;#x3C;div&gt;&lt;/code&gt;節點：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default {
    setup(){
        const list = reactive([1,2,3]);
        const divs = ref ([]);

        //確保在每次更新前重置divs
        onBeforeUpdate(()=&gt; {
            divs.value = [];;lll
        })

        return {
            list,
            divs,
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;reactive() ： 包裝響應式物件的另一種函式&lt;/h4&gt;
&lt;p&gt;除了ref()，也可以使用reactive()來包裝響應式物件。
兩者最大的不同是:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ref()可以包裝原始型別(primitive)，也可以包裝物件或陣列。&lt;/li&gt;
&lt;li&gt;reactive內的參數只能是「物件」&lt;/li&gt;
&lt;li&gt;reactive()存取內部屬性時，不需後綴.value&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;&amp;#x3C;template&gt;
    &amp;#x3C;h1&gt;{{ data.count }}&amp;#x3C;/h1&gt;
    &amp;#x3C;button @click=&quot;data.plus&quot;&gt;plus&amp;#x3C;/button&gt;
&amp;#x3C;/template&gt;

&amp;#x3C;script&gt;
import { reactive } from &quot;vue&quot;
export default {
    setup(){
        //reactive包裝物件
        const data = reactive({
        count:0,
        plus() =&gt; data.count++
        });

        return {
            data
        };
    }
};
&amp;#x3C;/scrpit&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;reactive()回傳一個被ES6 Proxy代理過的物件，才能做到響應式的更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;toRefs 與 reactive：解決ES6解構語法造成的不響應問題&lt;/h4&gt;
&lt;p&gt;使用ES6的展開運算子「...」時，會將物件從響應式狀態抽離，變成普通物件。
因此需要改用 toRefs()&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;&amp;#x3C;template&gt;
    &amp;#x3C;h1&gt;{{ data.count }}&amp;#x3C;/h1&gt;
    &amp;#x3C;button @click=&quot;data.plus&quot;&gt;plus&amp;#x3C;/button&gt;
&amp;#x3C;/template&gt;

&amp;#x3C;script&gt;
import { toRefs } from &quot;vue&quot;
import counter from &quot;./counter&quot;

export default {
    setup(){
        //reactive包裝物件
        const count = counter();

        return {
            ...toRefs(count)
        };
    }
};
&amp;#x3C;/scrpit&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;computed&lt;/h3&gt;
&lt;p&gt;Composition API的computed，要改為函數式的寫法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;要後綴 .value 來讀取值&lt;/li&gt;
&lt;li&gt;computed 的參數為一個 getter 函式，並回傳一個 ref 物件&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;&amp;#x3C;template&gt;
    &amp;#x3C;h1&gt;{{ data.count }}&amp;#x3C;/h1&gt;
    &amp;#x3C;h1&gt;{{ doubleCount }}&amp;#x3C;/h1&gt;
    &amp;#x3C;h1&gt;{{ quadrupleCount }}&amp;#x3C;/h1&gt;

    &amp;#x3C;button @click=&quot;plus&quot;&gt;
        Plus
    &amp;#x3C;/button&gt;
&amp;#x3C;/template&gt;

&amp;#x3C;script&gt;
import { ref, computed } from &quot;vue&quot;
import counter from &quot;./counter&quot;

export default {
    setup(){
        const count = ref(0);

        // computed 的參數為一個 getter 函式，並回傳一個 ref 物件
        const doubleCount = computed(()=&gt; count.value * 2);

        //使用 computed回傳的內容要後綴.value
        const quadrupleCount = computed(()=&gt; doubleCount.value * 2);
        const plus = () =&gt; count.value++;

        return {
            count,
            doubleCount,
            quadrupleCount,
            plus
        };
    }
};
&amp;#x3C;/scrpit&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;computed 的 get 與 set&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;computed 可以傳入 getter&lt;/li&gt;
&lt;li&gt;computed 可以傳入 get 與 set&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;const count = ref(0)

const plusOne = computed({
    get:() =&gt; count.value + 1,
    set:(val) =&gt; {
        count.value = val - 1
    }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;readonly&lt;/h3&gt;
&lt;p&gt;將物件傳到readonly()中，會回傳一個被代理過的「唯獨」物件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;setup() {
    const original = reactive({ count: 0 });
    const copy = readonly(orignal);
    const plus = () =&gt; original.count++;

    return {
        original,
        copy,
        plus,
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;執行plus()後，original.count 會從 0 變成 1
而透過readonly()包裝後回傳的copy物件，內部的.count 也會變成 1&lt;/p&gt;
&lt;h3&gt;methods&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Composition API 不再提供methods&lt;/li&gt;
&lt;li&gt;直接將函式透過setup() return出去即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;watch &amp;#x26; watchEffect&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 Composition API中，要改為函數式語法&lt;/li&gt;
&lt;li&gt;可以觀察單一的 ref 物件&lt;/li&gt;
&lt;li&gt;也可以觀察響應的 reactive 物件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;觀察單一 ref 物件&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;watch(count, (val, oldVal) =&gt; {
    console.log(`new count is $(val), preCount is $(oldVal)`)
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;觀察 reactive 物件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;將傳入 watch()的參數count 改為 ()=&gt;data.count&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;watch(
    ()=&gt;data.count,
    (val, oldVal) =&gt; { console.log(`new count is $(val), preCount is $(oldVal)`)}
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;透過陣列同時 watch 多個屬性&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;callback 是共用的&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;    watch(
        [() =&gt; data.count,() =&gt; data.doubleCount],
        ([newCount, newDoubleCount], [PreCount, PreDoubleCound]) =&gt; {
            console.log(`new count is $(newCount), prevCount is ${prevCount}` )
            console.log(`new doubleCount is $(newDoubleCount), prevDoubleCount is ${prevDoubleCount}` )
        }
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;對不同屬性更新想執行不同的動作&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以分別寫兩個 watch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;觀察陣列或物件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要在watch()中加入第三個參數， &lt;strong&gt;{deep: true}&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;watchEffect&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;當.value更新時，會呼叫callback&lt;/li&gt;
&lt;li&gt;與 watch的差別：
&lt;ul&gt;
&lt;li&gt;watchEffect會在 setup 剛建立時就執行一次&lt;/li&gt;
&lt;li&gt;不需要像watch一樣指定觀察的目標&lt;/li&gt;
&lt;li&gt;內部的callback函式對應數值更新後自動執行( 類似coumputed )&lt;/li&gt;
&lt;li&gt;watchEffect 無法取得更新前的數值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;watchEffect(()=&gt; {
    console.log(&quot;watchEffect&quot;, count.value);
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;解除 watchEffect 觀察&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;個別的watchEffect() 被呼叫後會回傳一個屬於它的停止函式。&lt;/li&gt;
&lt;li&gt;想要解除觀察時，可以呼叫該watchEffect() 所回傳的函式來停止觀察。&lt;/li&gt;
&lt;li&gt;只能在現存元件中使用，如果元件被銷毀，provide 與 inject 的連結就會失效&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;const stop1 = watchEffect(() =&gt; {
    console.log(&quot;watchEffect&quot;, count.value)
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;相依性注入 (Dependency Injection)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Composition API 版的 provide 與 inject
store.js&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;    export {
        todoList: symbol()
    };
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在提供狀態的元件加上provide()，並將內容指定到對應的物件上：
provide.vue&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;//提供者元件
import { ref, provide } from &quot;vue&quot;;
import store from &quot;./store&quot;;

export defautl {
    setup(){
        const todoList = ref([]);

        // 將 todoList 透過 provide 指定到 store.todoList
        provide(store.todoList, todoList);

        return {
            todoList,
        };
    },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在取用的元件，透過inject取出：
inject.vue&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;//取用者元件
import { ref, inject } from &quot;vue&quot;;
import store from &quot;./store&quot;;

export default {
    setup(){
        // 透過inject 取出 store.todoList
        const todoList = inject (store.todoList);

        return {
            todoList,
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Composition API 的生命週期鉤子&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在 Composition API 中，生命鉤子改為函數式的語法：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript=&quot;&gt;//使用時先import
import { onMounted, onUpdated, onUnmounted } from &apos;vue&apos;;

const MyComponent = {
    setup() {

        onMounted(()=&gt; {
            console.log(&apos;mounted&apos;);
        });

        onUpdated(()=&gt; {
            console.log(&apos;updated!&apos;);
        })

        onUnmounted(()=&gt; {
            console.log(&apos;unmounted!&apos;)
        })
    }
}
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/Vue.js_Logo_2.svg.CHAPD0Fz.png"/><enclosure url="/_astro/Vue.js_Logo_2.svg.CHAPD0Fz.png"/></item><item><title>[筆記] Notion:Database基本用法</title><link>https://astro-docs.vercel.app/blog/notiondatabase</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/notiondatabase</guid><description>介紹 Notion 資料庫的基本用法</description><pubDate>Tue, 30 Mar 2021 14:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;
&lt;h2&gt;Relation (關聯)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;- 在表單後建立ADVANED /  ↗︎Relation
- 選擇Select a database，並且關聯到B表單
- 點擊框框添加需要關聯的資料
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;Roll up (查找)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;- **建立了Relation後才能使用Rollup**
- 在B表單中建立 ADVANED / 🔍 Rollup
    - 在Relation中 選取A表單
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h2&gt;Create Linked Database (連結資料庫)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;打&lt;code&gt;/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;輸入&lt;code&gt;Create Linked Database&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;選擇要連結的資料庫，完成&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="/_astro/notion.CzOL5umJ.png"/><enclosure url="/_astro/notion.CzOL5umJ.png"/></item><item><title>[程式] Vue 基本介紹</title><link>https://astro-docs.vercel.app/blog/vue%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9</link><guid isPermaLink="true">https://astro-docs.vercel.app/blog/vue%E5%9F%BA%E6%9C%AC%E4%BB%8B%E7%B4%B9</guid><description>簡單介紹何謂 Vue.js ？ 淺談類MVVM的結構及雙向綁定的特性。</description><pubDate>Wed, 24 Mar 2021 03:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Vue.js 介紹&lt;/h2&gt;
&lt;p&gt;Vue.js 具備直觀的語法讓開發者在學習上都可以輕鬆上手，搭配它簡單的雙向綁定，讓我們可以專注於資料狀態的管理。
搭配它多樣化的延伸工具，可以開發 SPA ( Single Page Application )。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;###MVVM-%E7%9A%84%E6%A6%82%E5%BF%B5&quot;&gt;MVVM 結構&lt;/a&gt;
Vue不是一個完全MVVM的架構，只是受到MVVM的啟發。
&lt;img src=&quot;https://i.imgur.com/1h9vTaA.png&quot; alt=&quot;&quot;&gt;
我們在畫面上看到的外觀就是View，而我們所操控的就是Model。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;資料的動態
ViewModel是與畫面做綁定的，因此寫程式碼時只需要寫Model，資料變動的同時，ViewModel就會去控制視圖的變化。
因此調整視圖或是資料時，View及Model兩邊的資訊會同時變更。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;可以放入多個Vue app(應用程式)
宣告多個 Vue 應用程式，在Vue的開發者工具中就會看見多個&lt;code&gt;&amp;#x3C;root&gt;&lt;/code&gt;
但通常只會建立一個應用程式。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不適用&lt;/strong&gt;巢狀結構
應用程式中不能包另外一個應用程式。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;開發環境
Vue 是透過資料來驅動畫面的，而資料是不斷在變動的，因此除錯時需要了解目前資料的狀態。
基於以上狀況， Vue 較難以使用&lt;code&gt;console.log&lt;/code&gt;的方式來進行除錯， 利用瀏覽器中 Vue 插件的環境來除錯，是比較理想的方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;透過CDN 建置新專案&lt;/h3&gt;
&lt;p&gt;對於製作原型或學習，你可以這樣使用最新版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;script src=&quot;https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quot;&gt;&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;對於生產環境，我們推薦鏈接到一個明確的版本號和構建文件，以避免新版本造成的不可預期的破壞：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;script src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.12&quot;&gt;&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;透過vue-cli 建置新專案&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;$ npm install -g vue-cli
$ vue init webpack-simple [project name]

$ cd [project name]
$ npm install
$ npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;建立應用程式&lt;/h3&gt;
&lt;p&gt;Vue在建立時會宣告一個新的 Vue 應用程式，裡面擺放物件；而生成之後必須綁定一個 HTML 的元素。
而Vue一次只能綁定一個元素，因此綁定ID是比較好的。&lt;/p&gt;
&lt;p&gt;in body&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;div id=&quot;vueApp&quot;&gt;
  {{ text }}
&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in script&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var app = new Vue({
  el: &apos;#vueApp&apos;,
  data: {
    text:&apos;這裡是一串文字&apos;,
    array:[
    {item1},
    {item2}
    ]
  }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;MVVM 的概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ithelp.ithome.com.tw/articles/10213157&quot;&gt;MVVM與MVC的差別&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;MVC 概念&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/sNOvjgw.jpg&quot; alt=&quot;&quot;&gt;
透過Controller轉接去要求Model取資料&lt;/p&gt;
&lt;h4&gt;MVVM 概念&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/6j29skI.png&quot; alt=&quot;&quot;&gt;
ViewModel是與畫面做綁定的，因此寫程式碼時只需要寫Model，資料變動的同時，ViewModel就會去控制視圖的變化。&lt;/p&gt;
&lt;p&gt;因此調整視圖或是資料時，View及Model兩邊的資訊會同時變更。&lt;/p&gt;
&lt;h4&gt;與傳統jQuery的差別&lt;/h4&gt;
&lt;p&gt;傳統的jQuery是直接操作DOM元素，而Vue.js在操作DOM元素時是透過資料的狀態去操作畫面。&lt;/p&gt;
&lt;h3&gt;聲明式渲染&lt;/h3&gt;
&lt;p&gt;Vue.js 的核心是一個允許採用簡潔的模板語法來聲明式地將數據渲染進DOM 的系統：
在script中綁定好元素，再回到元素中用&lt;code&gt;{{}}&lt;/code&gt;去呼叫&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 html 中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;div id=&quot;app&quot;&gt;
  {{ message }}
&amp;#x3C;/div&gt;

&amp;#x3C;script&gt;
var app = new Vue({
  el: &apos;#app&apos;,
  data: {
    message: &apos;Hello Vue!&apos;
  }
})
&amp;#x3C;/script&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Vue指令&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/jianjie/p/12491899.html&quot;&gt;vue指令&lt;/a&gt;
&lt;a href=&quot;https://hsuchihting.github.io/vue-js/20200419/2954354756/&quot;&gt;Vue筆記&lt;/a&gt;
除了使用&lt;code&gt;{{}}&lt;/code&gt;的方式，也可利用指令的方式來綁定資料。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;###v-model-%E9%9B%99%E5%90%91%E7%B6%81%E5%AE%9A&quot;&gt;v-model&lt;/a&gt;：可以實現資料的雙向綁定&lt;/li&gt;
&lt;li&gt;v-text：相當於js的innerText&lt;/li&gt;
&lt;li&gt;v-html：相當於js的innerHTML&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;###v-bind-%E5%8B%95%E6%85%8B%E5%B1%AC%E6%80%A7%E6%8C%87%E4%BB%A4&quot;&gt;v-bind&lt;/a&gt;：（單向）動態綁定一個或多個attribute屬性指令&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;####v-for%E5%AF%AB%E6%B3%95&quot;&gt;v-for、v-if&lt;/a&gt;：做類似forEach的迴圈&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;###v-on-:-%E8%99%95%E7%90%86%E4%BA%92%E5%8B%95%E8%A1%8C%E7%82%BA&quot;&gt;v-on&lt;/a&gt;：處理互動行為&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;常見簡寫&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;v-on:&lt;/code&gt; == &lt;code&gt;@&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v-bind&lt;/code&gt; == &lt;code&gt; &lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;v-model 雙向綁定&lt;/h3&gt;
&lt;p&gt;可以透過本指令，綁定物件的資料。
說明 : 把 &lt;code&gt;input的value值&lt;/code&gt; 和 &lt;code&gt;data里的msg&lt;/code&gt; 绑定到了一起,一方改变,另外一方也会 跟改变&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用方式 : v-model 一般使用在表單元素上&lt;/li&gt;
&lt;li&gt;限制使用：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;#x3C;input&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;#x3C;select&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;#x3C;textarea&gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;重點 : v-model 使用在不同的表单元素上, 绑定的值不一样
v-model 绑定到文本输入框里面 =&gt; 绑定是字符串类型的内容
v-model 绑定到多选框里面 ==&gt; 绑定是布尔类型true/false&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;in body&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;div id=&quot;vueApp&quot;&gt;
    &amp;#x3C;input type=&quot;text&quot; v-model=&quot;message&quot;&gt;
&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in script&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var app = new vue({
    el:&apos;#vueApp&apos;,
    data:{
        imgSrc=&quot;圖片網址&quot;,
        className=&quot;img-fluid&quot;
    }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;v-html&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;預期：&lt;code&gt;string&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;詳細：
更新元素的innerHTML。注意：內容按普通HTML插入-不會作為Vue模板進行編譯。如果試圖使用v-html組合模板，可以重新考慮是否通過使用組件來替代。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://cn.vuejs.org/v2/api/#v-html&quot;&gt;Html注意事項&lt;/a&gt;
在網站上動態渲染任意HTML是非常危險的，因為容易導致XSS攻擊。只在可信內容上使用v-html，永不用在用戶提交的內容上。&lt;/p&gt;
&lt;h3&gt;v-bind 動態屬性指令&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;單向&lt;/strong&gt;動態綁定數據（從M-&gt;V）
透過增加屬性的方式，可以連結圖片或是網址、或是增加class&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cn.vuejs.org/v2/api/#v-bind&quot;&gt;v-bind官方說明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;簡寫：&lt;code&gt;v-bind:&lt;/code&gt; 可簡寫為 &lt;code&gt;:&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;{{}} 不能用在属性值上, 一般使用在 标签内容部分， 位置&lt;/li&gt;
&lt;li&gt;v-bind 動態綁定一個數據 (單向 M -&gt; V)&lt;/li&gt;
&lt;li&gt;v-bind 一般使用在屬性上，任意標籤皆可使用&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;v-bind:class 動態切換&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://v1-cn.vuejs.org/guide/class-and-style.html&quot;&gt;官方說明：Class與Style綁定&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;對象語法：我們可以傳給 v-bind:class 一個對象，以動態地切換 class 。注意 v-bind:class 指令可以與普通的 class 特性共存&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;v-if &amp;#x26; v-for 動態產生多筆資料於畫面上&lt;/h3&gt;
&lt;p&gt;data中可以放入類似JSON的資料結構，也就是可以放置陣列進去。
添加v-for的屬性做類似forEach的迴圈，並且在標籤中渲染出值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;顯示陣列中數值&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt; &amp;#x3C;pre&gt;{{陣列名稱}}&amp;#x3C;/pre&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;v-for寫法&lt;/h4&gt;
&lt;p&gt;作用 ：
巡訪陣列，創造出對應的標籤。&lt;/p&gt;
&lt;p&gt;寫法：
先v-for指定某個陣列，再在標籤中以&lt;code&gt;{{}}&lt;/code&gt;呼叫該陣列的元素&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基本寫法&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;          陣列元素
&amp;#x3C;li v-for=&apos;item in list&apos;&gt;{{ item.name }} {{ item.id }}&amp;#x3C;/li&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;取出陣列索引值&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;            陣列元素,元素對應的索引
&amp;#x3C;li v-for=&apos;(item,index) in list&apos; &gt;{{ item }} {{ index }}&amp;#x3C;/li&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;巡訪特定對象&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;li v-for=&apos;(value,key) in obj&apos;&gt;{{ value }} {{ key }}&amp;#x3C;/li&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;巡訪次数&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;li v-for=&apos;i in 100&apos;&gt;{{ i }}&amp;#x3C;/li&gt;
&amp;#x3C;li v-for=&apos;i in 100&apos;&gt;{{ i - 1 }}&amp;#x3C;/li&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;範例&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在html中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;ui&gt;
  &amp;#x3C;li v-for=&quot;item in list&quot;&gt;
    {{item.name}}
  &amp;#x3C;/li&gt;
&amp;#x3C;/ui&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在script中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;var app = new Vue({
  el: &apos;#app&apos;,
  data: {
    list: [
      {
        name: &apos;小明&apos;,
        age: 16
      },
      {
        name: &apos;媽媽&apos;,
        age: 38,
      },
      {
        name: &apos;漂亮阿姨&apos;,
        age: 24
      }
    ]
  }
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;v-if&lt;/h4&gt;
&lt;p&gt;在v-for的迴圈中加入判斷式&lt;/p&gt;
&lt;p&gt;寫法：
直接在標籤裡面增加v-for的屬性來添加判斷式&lt;/p&gt;
&lt;p&gt;in body&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;ul&gt;
    &amp;#x3C;li v-for=&quot;item in list&quot; v-if=&quot;item.age &amp;#x3C; 25&quot;&gt;
      {{ item.name }} 年齡是 {{ item.age}}
    &amp;#x3C;/li&gt;
&amp;#x3C;/ul&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;v-on : 處理互動行為&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cn.vuejs.org/v2/api/#v-on&quot;&gt;官方說明：v-on&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v-on:&lt;/code&gt; 可簡寫為 &lt;code&gt;@&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;綁定事件，觸發方法會寫在html的元件上，而不是Vue.js的原始碼中。&lt;/p&gt;
&lt;p&gt;寫法：
在input中用v-model綁定text，並在data底下再新增一個 method 物件，然後使用 &lt;code&gt;v-on:觸發方式 = &quot;methods&quot;&lt;/code&gt;來綁定物件。&lt;/p&gt;
&lt;p&gt;在底下利用&lt;code&gt;{{}}&lt;/code&gt;呼叫新的newText值&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;input v-model=&quot;text&quot;&gt;
&amp;#x3C;button v-on:click=&quot;reverseText&quot;&gt;我是按鈕&amp;#x3C;/button&gt;
{{newText}}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;v-on後加上判斷式&lt;/h3&gt;
&lt;p&gt;在v-on後可以加入判斷式，判斷式直接套用物件，就可以不用寫完整的method。
&lt;code&gt;&amp;#x3C;button ＠click=&quot;isTransform = !isTransform&quot;&gt;&amp;#x3C;/button&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;關於&lt;code&gt;this&lt;/code&gt;在 Vue 的用法&lt;/h4&gt;
&lt;p&gt;在 JavaScript 中 &lt;code&gt;this&lt;/code&gt; 在全域環境都會指向 window
如果在 Vue 中 &lt;code&gt;this&lt;/code&gt;則會指向 Vue 的 app&lt;/p&gt;
&lt;p&gt;利用&lt;code&gt;this&lt;/code&gt;指定data底下的物件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;範例：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  var app = new Vue({
    el: &apos;#app&apos;,
    data: {
      text: &apos;&apos;,
      newText: &apos;&apos;
    },
    methods:{
      reverseText: function(){
      console.log(&apos;點我&apos;, this.text);
      this.text = this.newText;
      }
    }
  });
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;修飾符&lt;/h4&gt;
&lt;p&gt;v-on 搭配修飾符，能夠直接調用事件，而不用通過method。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;事件修飾符&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cn.vuejs.org/v2/guide/events.html#%E4%BA%8B%E4%BB%B6%E4%BF%AE%E9%A5%B0%E7%AC%A6&quot;&gt;官方說明：事件修飾符&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;範例：v-on:click.prevent，利用修飾符取代&lt;code&gt;event.preventDefault();&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;a href=&quot;#&quot; v-on:click.prevent&gt;&amp;#x3C;/a&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;按鍵修飾符&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cn.vuejs.org/v2/guide/events.html#%E6%8C%89%E9%94%AE%E4%BF%AE%E9%A5%B0%E7%AC%A6&quot;&gt;官方說明：按鍵修飾符&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;範例：v-on:keyup.enter，submit會在key是enter時調用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;input v-on:keyup.enter=&quot;submit&quot;&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;computed 運算功能&lt;/h3&gt;
&lt;p&gt;computed是app中的一個功能，它透過 &lt;strong&gt;data 中的值的變更&lt;/strong&gt;，將結果回傳於變數中，並且可以運用在畫面上。
在 computed 中所宣告的任何屬性都會是 function ，且它都會 return 一個值。&lt;/p&gt;
&lt;p&gt;範例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;div id=&quot;app&quot;&gt;
    {{ reverseText }}
&amp;#x3C;/div&gt;


&amp;#x3C;script&gt;
    var app = new Vue{
        el: &apos;#app&apos;,
        data: {
            text: &apos;&apos;,
            newText:&apos;&apos;
        },
        computed: {
            reverseText: function(){
            return this.text
            }
        }
    }
&amp;#x3C;/script&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Methods 及 Computed 差別&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;computed&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在監控資料更動後，重新運算結果呈現於畫面上&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;一般來說不會修改資料，只會回傳用於畫面呈現的資料&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;methods&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;就是互動的函式，需要觸發才會運作&lt;/li&gt;
&lt;li&gt;會用來修改資料內容&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;效能 - 資料量大時， computed 只要資料變動就會觸發，無形之中執行次數也會增加，自然會比較慢。
因此在大量資料時，會建議透過 methods 減少不必要的運算喔&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Vue 表單與資料的綁定&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;選項&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;  &amp;#x3C;div class=&quot;form-check&quot;&gt;
    &amp;#x3C;input type=&quot;checkbox&quot; class=&quot;form-check-input&quot; id=&quot;check2&quot; v-model=&quot;checkboxArray&quot; value=&quot;雞&quot;&gt;
    &amp;#x3C;label class=&quot;form-check-label&quot; for=&quot;check2&quot;&gt;雞&amp;#x3C;/label&gt;
  &amp;#x3C;/div&gt;
  &amp;#x3C;div class=&quot;form-check&quot;&gt;
    &amp;#x3C;input type=&quot;checkbox&quot; class=&quot;form-check-input&quot; id=&quot;check3&quot; v-model=&quot;checkboxArray&quot; value=&quot;豬&quot;&gt;
    &amp;#x3C;label class=&quot;form-check-label&quot; for=&quot;check3&quot;&gt;豬&amp;#x3C;/label&gt;
  &amp;#x3C;/div&gt;
  &amp;#x3C;div class=&quot;form-check&quot;&gt;
    &amp;#x3C;input type=&quot;checkbox&quot; class=&quot;form-check-input&quot; id=&quot;check4&quot; v-model=&quot;checkboxArray&quot; value=&quot;牛&quot;&gt;
    &amp;#x3C;label class=&quot;form-check-label&quot; for=&quot;check4&quot;&gt;牛&amp;#x3C;/label&gt;
  &amp;#x3C;/div&gt;
  &amp;#x3C;p&gt;晚餐火鍋裡有&amp;#x3C;span v-for=&quot;item in checkboxArray&quot;&gt;{{item}}&amp;#x3C;/span&gt;。&amp;#x3C;/p&gt;
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/Vue.js_Logo_2.svg.CHAPD0Fz.png"/><enclosure url="/_astro/Vue.js_Logo_2.svg.CHAPD0Fz.png"/></item></channel></rss>