<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>軟體 on Parker Chang&#39;s Web</title>
    <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/</link>
    <description>Recent content in 軟體 on Parker Chang&#39;s Web</description>
    <generator>Hugo</generator>
    <language>zh-TW</language>
    <lastBuildDate>Sun, 13 Apr 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://252ae302.my-site-hugo-6kx.pages.dev/software/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>我如何架設 WordPress 網站</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/wordpress-hosting/</link>
      <pubDate>Sun, 13 Apr 2025 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/wordpress-hosting/</guid>
      <description>&lt;p&gt;去年在工作上有處理幾個大型的 WordPress 的網站，來記錄跟分享一下學到的 WordPress 架站策略。&lt;/p&gt;&#xA;&lt;p&gt;這裡之後也會改成 WordPress，改完會再跟上來分享為什麼跟怎麼做的。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;&lt;figure&gt;&lt;img src=&#34;https://s.w.org/style/images/about/WordPress-logotype-standard.png&#34; alt=&#34;WordPress Logo&#34; class=&#34;mx-auto my-0 rounded-md&#34; /&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;wordpresscom-vs-wordpressorg&#34; class=&#34;relative group&#34;&gt;WordPress.com vs WordPress.org &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#wordpresscom-vs-wordpressorg&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;首先來帶一下官方的兩種方案。我身為工程師其實一直都只知道 &lt;a href=&#34;https://wordpress.org/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;WordPress.org&lt;/a&gt;，前陣子有朋友來問我才知道原來還有 &lt;a href=&#34;https://wordpress.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;WordPress.com&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;WordPress.com 是由 Automattic 公司提供的全方位託管服務，在網頁上點一點就能建立網站。但相對地自由度極低，主題客製化困難，很多外掛不能用，免費版陽春到一定得付費。&lt;/p&gt;&#xA;&lt;p&gt;WordPress.org 是可以下載開源的 WordPress 軟體。可以依照自己的需求部署，幾乎沒有任何限制——安裝外掛、修改主題，或進行各種神奇的客製化都很自由。但就是要自己管理伺服器、更新跟備份。&lt;/p&gt;&#xA;&lt;p&gt;不過 WordPress.org 在市場上也有許多整合方案能簡化流程，也不是一定得要找工程師才能弄，而且我有預感用 WordPress.com 的人遲早也是得跳槽，因為限制真的太多又不便宜。&lt;/p&gt;&#xA;&lt;p&gt;本篇也是使用 WordPress.org，是需要懂一點技術，但我會盡量把流程講清楚一點。&lt;/p&gt;&#xA;&lt;h2 id=&#34;wordpressorg-市面上的託管方案&#34; class=&#34;relative group&#34;&gt;WordPress.org 市面上的託管方案 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#wordpressorg-%e5%b8%82%e9%9d%a2%e4%b8%8a%e7%9a%84%e8%a8%97%e7%ae%a1%e6%96%b9%e6%a1%88&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;這邊介紹的我都沒有用過，但可以分析一下價格和一些初步的觀察。&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-傳統虛擬主機如-bluehost&#34; class=&#34;relative group&#34;&gt;1. 傳統虛擬主機（如 &lt;a href=&#34;https://www.bluehost.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;BlueHost&lt;/a&gt;） &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#1-%e5%82%b3%e7%b5%b1%e8%99%9b%e6%93%ac%e4%b8%bb%e6%a9%9f%e5%a6%82-bluehost&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;基本費用是每月 2.95 美金（新台幣 95/月），可以很快地把網站架起來，也可以直接在裡面額外去購買網站的域名。&lt;/p&gt;</description>
    </item>
    <item>
      <title>個人網站</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/my-site/</link>
      <pubDate>Sun, 03 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/my-site/</guid>
      <description>&lt;p&gt;這個網站本身就是一個作品。以下是技術選型與功能概覽。&lt;/p&gt;&#xA;&lt;h2 id=&#34;技術棧&#34; class=&#34;relative group&#34;&gt;技術棧 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e6%8a%80%e8%a1%93%e6%a3%a7&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;項目&lt;/th&gt;&#xA;          &lt;th&gt;選擇&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;靜態生成器&lt;/td&gt;&#xA;          &lt;td&gt;Hugo 0.161&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;主題&lt;/td&gt;&#xA;          &lt;td&gt;Congo v2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CMS&lt;/td&gt;&#xA;          &lt;td&gt;Decap CMS&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;留言&lt;/td&gt;&#xA;          &lt;td&gt;Cusdis&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;部署&lt;/td&gt;&#xA;          &lt;td&gt;Cloudflare Pages&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;功能&#34; class=&#34;relative group&#34;&gt;功能 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e5%8a%9f%e8%83%bd&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;多語系&lt;/strong&gt;：繁體中文（預設）、英文、日文&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;深色模式&lt;/strong&gt;：跟隨系統自動切換&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;目錄&lt;/strong&gt;：長文章自動產生 TOC&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;留言&lt;/strong&gt;：Cusdis 輕量留言系統，深色模式同步&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;訂閱&lt;/strong&gt;：文章頁底嵌入 Substack 訂閱框&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;CMS&lt;/strong&gt;：Decap CMS 提供視覺化編輯介面&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;原始碼&#34; class=&#34;relative group&#34;&gt;原始碼 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e5%8e%9f%e5%a7%8b%e7%a2%bc&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;原始碼存放於 GitHub，透過 Cloudflare Pages 自動部署。推送至 &lt;code&gt;main&lt;/code&gt; 觸發正式環境建置；其他分支觸發預覽環境建置。&lt;/p&gt;</description>
    </item>
    <item>
      <title>用 Hugo 建立靜態網站</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/my-first-tech-post/</link>
      <pubDate>Sat, 02 Mar 2024 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/my-first-tech-post/</guid>
      <description>&lt;p&gt;Hugo 是目前速度最快的靜態網站生成器之一，搭配 Congo 主題可以快速建立一個功能完整的個人網站。&lt;/p&gt;&#xA;&lt;h2 id=&#34;為什麼選擇-hugo&#34; class=&#34;relative group&#34;&gt;為什麼選擇 Hugo &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e7%82%ba%e4%bb%80%e9%ba%bc%e9%81%b8%e6%93%87-hugo&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;速度快&lt;/strong&gt;：毫秒級建置時間&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;無依賴&lt;/strong&gt;：單一執行檔，不需 Node.js&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;彈性高&lt;/strong&gt;：豐富的主題與模板系統&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;安裝步驟&#34; class=&#34;relative group&#34;&gt;安裝步驟 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e5%ae%89%e8%a3%9d%e6%ad%a5%e9%a9%9f&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install hugo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo new site my-site&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd my-site&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git init&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git submodule add https://github.com/jpanther/congo themes/congo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;設定-hugotoml&#34; class=&#34;relative group&#34;&gt;設定 hugo.toml &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e8%a8%ad%e5%ae%9a-hugotoml&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;baseURL&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;https://example.org/&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;title&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;My Site&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;theme&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;congo&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultContentLanguage&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;zh-TW&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;小結&#34; class=&#34;relative group&#34;&gt;小結 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e5%b0%8f%e7%b5%90&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;只需幾分鐘，你就能在本機跑起一個完整的靜態網站，再透過 Cloudflare Pages 免費部署到全球 CDN。&lt;/p&gt;</description>
    </item>
    <item>
      <title>談談 JavaScript 中的 eval、風險及替代方案</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/talk-about-js-eval/</link>
      <pubDate>Sat, 30 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/talk-about-js-eval/</guid>
      <description>&lt;h2 id=&#34;前言&#34; class=&#34;relative group&#34;&gt;前言 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e5%89%8d%e8%a8%80&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;最近用 Google Sheets 提供的 App Script 幫朋友寫了個小爬蟲，來自動化搬運跟整理網頁上資訊，發現 HTML Source 裡&lt;code&gt;&amp;lt;script /&amp;gt;&lt;/code&gt; 的資訊無法直接被讀取，在問 ChatGPT 時，它突然給了我一個有用到 &lt;code&gt;eval&lt;/code&gt; 的實作，之前只知道不要用它，這次決定來認真理解一下 &lt;strong&gt;什麼時候可能用到&lt;/strong&gt; ， &lt;strong&gt;為什麼不要用&lt;/strong&gt; ，以及 &lt;strong&gt;有什麼替代方案&lt;/strong&gt; 。&lt;/p&gt;&#xA;&lt;p&gt;這篇文章會簡單介紹 &lt;code&gt;eval&lt;/code&gt; 後，並帶上一個使用情境跟一個面試考題。&lt;/p&gt;&#xA;&lt;h2 id=&#34;eval-基本介紹&#34; class=&#34;relative group&#34;&gt;&lt;code&gt;eval&lt;/code&gt; 基本介紹 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#eval-%e5%9f%ba%e6%9c%ac%e4%bb%8b%e7%b4%b9&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;eval(script);&lt;/code&gt; 是一個 JavaScript 內建函數。&lt;/p&gt;&#xA;&lt;p&gt;它可以將傳入的 script String 視為 JavaScript 表達式（Expression）或語句（Statement）來執行。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;使用情境：「你信任你要執行的 script 以及 想把 String 當 JS Code 來執行」&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;return-value&#34; class=&#34;relative group&#34;&gt;Return value &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#return-value&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;若參數為 String，則會回應 JS 實際執行的結果，如果該 String 不是可執行的 JS Code，則回傳 &lt;code&gt;Error: {script} is not defined&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>從 Callback 到 Async/Await：以次序淡入動畫為例</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/from-callback-to-async/</link>
      <pubDate>Mon, 21 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/from-callback-to-async/</guid>
      <description>&lt;h2 id=&#34;foreword&#34; class=&#34;relative group&#34;&gt;Foreword &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#foreword&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;這篇文章寫給聽過 Callback Hell, Promise 和 Async/Await 但實務上沒碰過，或是仍不清楚演進的人，我會透過「點擊之後元素要一個個漸入」的功能一步步帶大家看怎麼這三種方式會怎麼實作這功能。&lt;/p&gt;&#xA;&lt;p&gt;功能 MVP 會是這樣：&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;&lt;figure&gt;&lt;img src=&#34;https://252ae302.my-site-hugo-6kx.pages.dev/software-development/from-callback-to-async/fading-example.gif&#34; alt=&#34;Fading Example&#34; class=&#34;mx-auto my-0 rounded-md&#34; /&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;直覺想法：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;漸入在元素上放個 transition 然後點擊時改變 opacity 就好&lt;/li&gt;&#xA;&lt;li&gt;一個個漸入？代表後面的元素漸入需要「等」前面的元素先漸入完畢？&lt;/li&gt;&#xA;&lt;li&gt;在 JS 中要「等」首選就是 setTimeout，一個個等的話，就是一個 setTimeout 結束，再去呼叫另一個 setTimeout 就好。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;於是就寫出了類似這樣的程式碼：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;startBtn&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;startBtn&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;container&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;container&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;first&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;second&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;second&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;third&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;third&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;forth&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;forth&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;fifth&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;fifth&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;resetBtn&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; document.&lt;span style=&#34;color:#a6e22e&#34;&gt;getElementById&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;reset&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;startBtn&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;addEventListener&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;click&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; () {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;display&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;none&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;container&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;classList&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hidden&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;classList&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hidden&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;second&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;classList&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hidden&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a6e22e&#34;&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;third&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;classList&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hidden&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;forth&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;classList&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hidden&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#a6e22e&#34;&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;fifth&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;classList&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hidden&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;setTimeout&lt;/span&gt;(() =&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;              &lt;span style=&#34;color:#a6e22e&#34;&gt;resetBtn&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;classList&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;hidden&amp;#39;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }, &lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          }, &lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }, &lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      }, &lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }, &lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }, &lt;span style=&#34;color:#ae81ff&#34;&gt;500&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;寫完了，各個元素可以每 0.5 秒依序漸入了，可以收工了…嗎？&lt;/p&gt;</description>
    </item>
    <item>
      <title>實作 Google 第三方登入（Vue / Express）</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/google-oauth-login/</link>
      <pubDate>Sun, 23 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/google-oauth-login/</guid>
      <description>&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;&lt;figure&gt;&lt;img src=&#34;https://cdn-images-1.medium.com/max/800/0*Ewxcp0OIGr31jGoo.png&#34; alt=&#34;&#34; class=&#34;mx-auto my-0 rounded-md&#34; /&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;前言&#34; class=&#34;relative group&#34;&gt;前言 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e5%89%8d%e8%a8%80&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;最近公司需要串接第三方登入，因為第一次做，踩了不少坑，也發現 Google 又改版了，爬到的許多文都已經不堪用的，於是來分享紀錄一下串接的流程。&lt;/p&gt;&#xA;&lt;p&gt;基本上，如果你是用 &lt;a href=&#34;https://github.com/google/google-api-javascript-client&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Google Sign-in JavaScript library&lt;/a&gt; 串接的話，Google 已經棄用（&lt;a href=&#34;https://developers.google.com/identity/sign-in/web/reference&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;deprecated&lt;/a&gt;）了，並且將在 2023/03/31 完全捨棄，也就是不讓人下載跟使用，所以之前按照 &lt;a href=&#34;https://developers.google.com/identity/sign-in/web/reference&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;這個流程&lt;/a&gt; 實作的要趕快重構啦！&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;這篇文章會用 Vue3 和 Express 來帶大家來手把手實作簡易的 Google  第三方登入！&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;（除了使用新版的 Sign In With Google button ，也會有新的 Google One Tap 功能）&lt;/p&gt;&#xA;&lt;p&gt;因為我只有使用 Google 原生的 Library，而沒有使用別人包過的，所以如果是 React 的話語法稍微改一下就也可以用囉！&lt;/p&gt;&#xA;&lt;p&gt;現在 Google 登入越來越好串，建議不要用別人包裝過的 library 來減少耦合度，因為敝司最近就是因為之前用的 library 沒在維護了才重新串了一遍。&lt;/p&gt;&#xA;&lt;h2 id=&#34;overview&#34; class=&#34;relative group&#34;&gt;Overview &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#overview&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;串接的流程會分成四個步驟：&lt;/p&gt;</description>
    </item>
    <item>
      <title>談談網頁中的字體 — 設計、檔案格式與前端載入</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/talk-about-web-font/</link>
      <pubDate>Thu, 28 Oct 2021 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/talk-about-web-font/</guid>
      <description>&lt;p&gt;前陣子 設事未深 的字型大補帖引起了一波領取字體的熱潮，除了在簡報、海報、社群貼文之外，你有想過在網頁上是如何使用字體的嗎？&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;&lt;figure&gt;&lt;img src=&#34;https://cdn-images-1.medium.com/max/800/0*OEf5PYLRWXCaS_Op&#34; alt=&#34;typewritter&#34; class=&#34;mx-auto my-0 rounded-md&#34; /&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;photo by &lt;a href=&#34;https://unsplash.com/@diklein&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;David Klein&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Unsplash&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;之前 &lt;a href=&#34;https://www.instagram.com/designnotdeep/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;設事未深&lt;/a&gt; 的字型大補帖引起了一波字體的熱潮，那除了在簡報、海報、社群貼文之外，你有想過在網頁上是如何使用字體的嗎？&lt;/p&gt;&#xA;&lt;p&gt;於是今天就來先分享一些關於在網頁上使用字體的知識和技術細節，前半算是科普，後半關於網頁如何使用字體的部分談比較多技術，不是前端工程師的就斟酌觀看囉！&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;藉由這篇文章，我將會告訴你 👇&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;一個字體的誕生（不專業版）&lt;/li&gt;&#xA;&lt;li&gt;字體的檔案有哪些&lt;/li&gt;&#xA;&lt;li&gt;網頁如何使用字體&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;字體設計流程&#34; class=&#34;relative group&#34;&gt;字體設計流程 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e5%ad%97%e9%ab%94%e8%a8%ad%e8%a8%88%e6%b5%81%e7%a8%8b&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;在開始介紹之前，因為實在太好奇字體如何被設計出來的，於是就問了一下身為設計師的朋友一些關於字體設計的問題，在這邊簡短介紹一下流程開個頭。&lt;/p&gt;&#xA;&lt;p&gt;以繁體中文來說，會先做幾個固定的字 ，這些字做完就能大概涵蓋到中文字的筆畫規律，像是「永」就包括了所有不同筆劃，「鷹」則是可以測試有很多橫筆的情況等等。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;&lt;figure&gt;&lt;img src=&#34;https://cdn-images-1.medium.com/max/800/0*Yn16A9M8O252zZw9.jpg&#34; alt=&#34;&#34; class=&#34;mx-auto my-0 rounded-md&#34; /&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.easyatm.com.tw/wiki/%E6%B0%B8%E5%AD%97%E5%85%AB%E6%B3%95&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;https://www.easyatm.com.tw/wiki/%E6%B0%B8%E5%AD%97%E5%85%AB%E6%B3%95&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;接著可能會使用 &lt;a href=&#34;https://glyphsapp.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;Glyphs&lt;/strong&gt;&lt;/a&gt; 或 &lt;a href=&#34;https://fontforge.org/en-US/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;&lt;strong&gt;FontForge&lt;/strong&gt;&lt;/a&gt; 等軟體來調整各項細節，把大部分中文字做出來後，擺在一起確認一致性，最後就是一股作把剩下的中文字都做完。&lt;/p&gt;&#xA;&lt;h3 id=&#34;網頁中的繁體中文有多少字要設計&#34; class=&#34;relative group&#34;&gt;網頁中的繁體中文有多少字要設計？ &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e7%b6%b2%e9%a0%81%e4%b8%ad%e7%9a%84%e7%b9%81%e9%ab%94%e4%b8%ad%e6%96%87%e6%9c%89%e5%a4%9a%e5%b0%91%e5%ad%97%e8%a6%81%e8%a8%ad%e8%a8%88&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;關於中文字的總量，在教育部的&lt;a href=&#34;https://dict.variants.moe.edu.tw/variants/rbt/home.do&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;異體字字典&lt;/a&gt;收錄了十萬多字，而根據 Google Font 有提供的&lt;a href=&#34;https://richer.tw/google_font_info/noto-serif-tc-cut&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;思源黑體&lt;/a&gt;檔案來看，網頁上會需要載入的字數大概是一萬五千字左右。&lt;/p&gt;&#xA;&lt;p&gt;不專業地介紹完大致上的流程後，設計的細節就不再這邊誤人子弟了，有興趣的可以去看 &lt;a href=&#34;https://blog.justfont.com/&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;justfont blog&lt;/a&gt; 會有更多關於字體的好文可以看。&lt;/p&gt;&#xA;&lt;h2 id=&#34;字體一般來說都以怎樣的檔案格式儲存呢&#34; class=&#34;relative group&#34;&gt;字體一般來說都以怎樣的檔案格式儲存呢？ &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e5%ad%97%e9%ab%94%e4%b8%80%e8%88%ac%e4%be%86%e8%aa%aa%e9%83%bd%e4%bb%a5%e6%80%8e%e6%a8%a3%e7%9a%84%e6%aa%94%e6%a1%88%e6%a0%bc%e5%bc%8f%e5%84%b2%e5%ad%98%e5%91%a2&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;起初電腦的文字都是以點陣圖的方式呈現，這階段與印刷文字還是有很大的落差，因而字體就算設計出來了，也很難在電腦上完整呈現其美感。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Design System — 前端工程師也該知道的那些事</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/design-system/</link>
      <pubDate>Wed, 22 Sep 2021 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/design-system/</guid>
      <description>&lt;p&gt;在講 Design System 之前想要先提到一個觀念：「前期規劃 &amp;gt; 實作」。&lt;/p&gt;&#xA;&lt;p&gt;軟體工程師的本質其實跟建築師很接近，只是他們是建造房屋，我們是建造系統。&lt;/p&gt;&#xA;&lt;p&gt;一個好的房子，它需要良好的架構設計，會需要規劃藍圖、理解整個建物的結構，在前期規劃設計上會花很多的時間。&lt;/p&gt;&#xA;&lt;p&gt;而這概念對應到 網頁 來說，就是 Design System！&lt;/p&gt;&#xA;&lt;h2 id=&#34;design-system-的前身--atomic-design&#34; class=&#34;relative group&#34;&gt;Design System 的前身 — Atomic Design &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#design-system-%e7%9a%84%e5%89%8d%e8%ba%ab--atomic-design&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;講 Design System 之前要先來講講 Atomic Design 這個概念。&lt;/p&gt;&#xA;&lt;p&gt;畢竟整個網頁架構的設計的先驅可以是說由 2013 年 Brad Forst 提出的 Atomic Design 開了第一槍。&lt;/p&gt;&#xA;&lt;p&gt;後續 Google 才在 2014 年做了 Material Design，再到 2016 年由 Airbnb 進而提出了更完整的 Design System，更多細節可以參考 &lt;a href=&#34;https://www.youtube.com/watch?v=TuLY1cYM57g&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Karri Saarinen, Principle Designer at Airbnb&lt;/a&gt; 的演講。&lt;/p&gt;&#xA;&lt;h3 id=&#34;那-atomic-design-是什麼呢&#34; class=&#34;relative group&#34;&gt;那 Atomic Design 是什麼呢？ &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e9%82%a3-atomic-design-%e6%98%af%e4%bb%80%e9%ba%bc%e5%91%a2&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;那我們先來看看張圖：&lt;/p&gt;</description>
    </item>
    <item>
      <title>前端框架第 0 課：學習框架前該知道的事</title>
      <link>https://252ae302.my-site-hugo-6kx.pages.dev/software/frontend-framework-101/</link>
      <pubDate>Sun, 11 Jul 2021 00:00:00 +0000</pubDate>
      <guid>https://252ae302.my-site-hugo-6kx.pages.dev/software/frontend-framework-101/</guid>
      <description>&lt;p&gt;前端框架的選擇一直是很多新手（包括我）的大哉問，我當初是因為公司在用 React 就也只能先寫 React 了，前陣子因緣際會開始碰了一下 Angular ，進而啟發我對於「前端框架」進行更多思考，像是「框架」到底是指什麼？什麼東西可以被稱為「框架」？為何前端需要去使用它？不用它會怎麼樣？聽說 Vue3 很猛，我該去學嗎？等等的問題。&lt;/p&gt;&#xA;&lt;p&gt;而這篇文章就算是我在解決上述一些問題的思考，也是我認為在我們跳下去學一個框架之前，該先知道的一些基本觀念。&lt;/p&gt;&#xA;&lt;h2 id=&#34;簡短講一下網頁發展史&#34; class=&#34;relative group&#34;&gt;簡短講一下網頁發展史 &lt;span class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100&#34;&gt;&lt;a class=&#34;group-hover:text-primary-300 dark:group-hover:text-neutral-700&#34; style=&#34;text-decoration-line: none !important;&#34; href=&#34;#%e7%b0%a1%e7%9f%ad%e8%ac%9b%e4%b8%80%e4%b8%8b%e7%b6%b2%e9%a0%81%e7%99%bc%e5%b1%95%e5%8f%b2&#34; aria-label=&#34;定位點&#34;&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;技術發展日新月異，但其實技術的本質都是在「解決問題」。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;藉由理解技術的脈絡，我相信對於理解眼前的技術跟想像未來的發展都是很有幫助的。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;1990 年代：網頁誕生&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1990 年 12 月 20 日 Tim Berners Lee 寫出了&lt;a href=&#34;http://info.cern.ch/hypertext/WWW/TheProject.html&#34; target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;第一個網站&lt;/a&gt; 並 設計了 World Wide Web&lt;/li&gt;&#xA;&lt;li&gt;這時期以靜態網頁為主，頂多有一些動態的選單和圖片特效&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;2000 年代：Web 2.0 ＋ Ajax&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;2004 年 Web 2.0 的誕生，使得網頁互動性開始提升，像 Facebook (2004)、Youtube (2005) 都是在這時期出來的&lt;/li&gt;&#xA;&lt;li&gt;Ajax 非同步的應用，是讓網頁透過 JS 而不是瀏覽器來發送請求，因而不用重新載入來更新資料&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;2010 年代：網頁應用程式（Web Application ）概念出現&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;從這時候開始，Web 的複雜度跟互動性已經大幅提升，逐漸能做到原先桌面應用程式 ( Desktop Application）才能做到的事&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;為了因應這種高互動性的網站都會需要有的一些基本處理，前端框架就此誕生。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
