<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dev-Notes on Howar31 Blog</title><link>https://blog.howar31.com/tags/dev-notes/</link><description>Recent content in Dev-Notes on Howar31 Blog</description><generator>Hugo</generator><language>zh-tw</language><lastBuildDate>Wed, 22 Apr 2026 23:51:19 +0800</lastBuildDate><atom:link href="https://blog.howar31.com/tags/dev-notes/index.xml" rel="self" type="application/rss+xml"/><item><title>升上 VuePress v2 RC 五個月後，決定再遷移到 Hugo 的紀錄</title><link>https://blog.howar31.com/posts/vuepress-to-hugo-migration/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/vuepress-to-hugo-migration/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;2025 年 11 月才剛從 VuePress v1.8 升上 v2.0.0-rc.26，本以為至少能安穩用個幾年。結果升完五個月就遇到一堆問題，最後在 2026 年 4 月決定&lt;strong&gt;再搬一次&lt;/strong&gt;，這次換到 Hugo。&lt;/p&gt;
&lt;p&gt;這篇記錄從評估、選型、遷移、踩雷到最後部署上線的完整過程，順便也拿這篇當 component 測試文，把 Hugo 版型的 code block、tip、warning、表格、SVG、taxonomy 一次全部跑過。&lt;/p&gt;
&lt;h2 id="為什麼升-v2-才-5-個月就要再搬"&gt;為什麼升 v2 才 5 個月就要再搬？&lt;/h2&gt;
&lt;p&gt;升級前以為是一次「大幅刷新但之後穩定」的投資。升完才真正理解現狀：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VuePress v2 本身自 2022 就卡在 RC&lt;/strong&gt;，到 2026 仍然沒有 stable。這個「卡 RC 3+ 年」的背景是在&lt;strong&gt;升上去之後&lt;/strong&gt;才有切身感受&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;插件生態沒跟上&lt;/strong&gt;：v1 時期依賴的若干插件在 v2 沒有對應版本，有些甚至上游直接放棄維護&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RC 階段的 theme API 仍會 breaking change&lt;/strong&gt;：升 v2 時已經改了一次 theme，完全不想再因為某次 RC 升級又全部改一次&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dev server 啟動 30 秒&lt;/strong&gt;：寫文章的摩擦大到開了就忘記要寫什麼&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;與其繼續賭 v2 什麼時候脫 RC，不如直接換到&lt;strong&gt;生態穩定、建置極快&lt;/strong&gt;的工具。於是評估了 Astro、Next.js、Eleventy、Hugo，最後選 Hugo：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;候選&lt;/th&gt;
 &lt;th&gt;建置速度&lt;/th&gt;
 &lt;th&gt;生態穩定度&lt;/th&gt;
 &lt;th&gt;Runtime 依賴&lt;/th&gt;
 &lt;th&gt;主要缺點&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;極快（幾百毫秒）&lt;/td&gt;
 &lt;td&gt;十年以上穩定&lt;/td&gt;
 &lt;td&gt;Go binary&lt;/td&gt;
 &lt;td&gt;模板語法較陌生&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Astro&lt;/td&gt;
 &lt;td&gt;中等&lt;/td&gt;
 &lt;td&gt;快速演進中&lt;/td&gt;
 &lt;td&gt;Node.js&lt;/td&gt;
 &lt;td&gt;還在 breaking changes&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Next.js&lt;/td&gt;
 &lt;td&gt;慢（依頁面數成長）&lt;/td&gt;
 &lt;td&gt;成熟但偏 App&lt;/td&gt;
 &lt;td&gt;Node.js&lt;/td&gt;
 &lt;td&gt;對靜態部落格 overkill&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Eleventy&lt;/td&gt;
 &lt;td&gt;快&lt;/td&gt;
 &lt;td&gt;小眾但穩定&lt;/td&gt;
 &lt;td&gt;Node.js&lt;/td&gt;
 &lt;td&gt;template 選擇多到雜亂&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Hugo 的勝出原因很簡單：&lt;strong&gt;Go 寫的單一執行檔、零 Node.js、零 npm、template 語法雖然怪但至少不會自己 breaking change&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Discord 完全隱藏封鎖/忽略的訊息</title><link>https://blog.howar31.com/posts/discord-hide-blocked-messages/</link><pubDate>Thu, 01 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/discord-hide-blocked-messages/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;Discord 提供了兩種「照顧心理衛生」的方式來處理不想看到的訊息：&lt;strong&gt;封鎖（Block）&lt;strong&gt;和&lt;/strong&gt;忽略（Ignore）&lt;/strong&gt;。這兩種功能可以幫助使用者避免看到特定使用者或伺服器的訊息，讓聊天環境更加舒適。&lt;/p&gt;
&lt;p&gt;然而，Discord 官方並沒有提供完全隱藏這些訊息的功能。即使你封鎖或忽略了某個使用者，他們的訊息仍然會在聊天室中顯示一個提示，例如「你已封鎖此使用者」或「你已忽略此使用者」的系統訊息。這些提示雖然不會顯示實際的訊息內容，但仍然會在聊天記錄中佔據空間，對於想要完全「眼不見為淨」的使用者來說，這可能還不夠。&lt;/p&gt;
&lt;div class="hint-container tip"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-lightbulb" aria-hidden="true"&gt;&lt;/i&gt;
 Tip
 &lt;/p&gt;
 忽略功能在顯示邏輯（HTML 結構）上與封鎖功能是相同的，因此我們可以使用相同的方法來處理這兩種情況。
&lt;/div&gt;

&lt;h2 id="實作"&gt;實作&lt;/h2&gt;
&lt;h3 id="為什麼選擇-css-injection"&gt;為什麼選擇 CSS Injection？&lt;/h3&gt;
&lt;p&gt;要達成完全隱藏這些訊息提示，我們有幾種方式可以選擇：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Javascript Injection&lt;/strong&gt;：可以動態修改 DOM 元素&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS Injection&lt;/strong&gt;：透過 CSS 選擇器隱藏元素&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我選擇使用 &lt;strong&gt;CSS Injection&lt;/strong&gt; 的方式，主要原因如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;效能考量&lt;/strong&gt;：CSS 的效能通常比 JavaScript 好，不會對頁面造成額外的運算負擔&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;動態載入問題&lt;/strong&gt;：Discord 使用動態載入內容，JavaScript 在處理動態載入的元素時可能會遇到時機問題，需要額外監聽 DOM 變化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;簡單直接&lt;/strong&gt;：CSS 選擇器可以直接針對特定的 HTML 結構進行隱藏，不需要複雜的邏輯&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="解除-developer-tool-防護"&gt;解除 Developer Tool 防護&lt;/h3&gt;
&lt;p&gt;Discord 官方有針對開發者工具（Developer Tool）進行警告與防護機制。在進行以下操作之前，請先解除 Discord 對開發者工具的防護。&lt;/p&gt;
&lt;h4 id="1-無法開啟開發者工具"&gt;1. 無法開啟開發者工具&lt;/h4&gt;
&lt;p&gt;如果你無法使用 &lt;code&gt;Ctrl+Shift+I&lt;/code&gt;（Windows/Linux）或 &lt;code&gt;Cmd+Option+I&lt;/code&gt;（macOS）開啟開發者工具，需要先在設定檔中啟用開發者工具。&lt;/p&gt;
&lt;div class="hint-container warning"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-exclamation-triangle" aria-hidden="true"&gt;&lt;/i&gt;
 Warning
 &lt;/p&gt;
 必須先解除防護後，才能使用 &lt;code&gt;Ctrl+Shift+I&lt;/code&gt;（Windows/Linux）或 &lt;code&gt;Cmd+Option+I&lt;/code&gt;（macOS）開啟開發者工具。
&lt;/div&gt;

&lt;h5 id="windows"&gt;Windows&lt;/h5&gt;
&lt;p&gt;在 Windows 上，請編輯以下檔案：&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;%appdata%/discord/settings.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;settings.json&lt;/code&gt; 中加入以下設定：&lt;/p&gt;</description></item><item><title>從 VuePress v1 升級到 v2</title><link>https://blog.howar31.com/posts/vuepress-v1-to-v2-upgrade/</link><pubDate>Sun, 23 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/vuepress-v1-to-v2-upgrade/</guid><description>&lt;p&gt;使用 VuePress v1 架設 blog 好幾年了，我決定升級到 VuePress v2，主要是想用更現代的建置系統、更好的效能，還有更好的開發體驗。 VuePress v2 帶來了不少改進，包括 Vite 打包工具、Vue 3 支援、TypeScript 支援，還有更模組化的插件架構。&lt;/p&gt;
&lt;p&gt;這篇文章記錄了我從 VuePress v1 升級到 v2 的過程，包括遇到的問題和解決方法。&lt;/p&gt;
&lt;h2 id="為什麼要升級"&gt;為什麼要升級？&lt;/h2&gt;
&lt;p&gt;VuePress v2 有幾個讓我想要升級的理由：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vite 打包工具&lt;/strong&gt; - 建置時間比 webpack 快很多，熱模組替換也更快&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vue 3 支援&lt;/strong&gt; - 現代的 Composition API 和更好的效能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript 支援&lt;/strong&gt; - 型別安全的配置和更好的 IDE 支援&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;/li&gt;
&lt;li&gt;&lt;strong&gt;更好的開發體驗&lt;/strong&gt; - 改進的錯誤訊息和除錯工具&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hint-container tip"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-lightbulb" aria-hidden="true"&gt;&lt;/i&gt;
 Tip
 &lt;/p&gt;
 寫這篇文章的時候，VuePress v2 還在 Release Candidate (RC) 階段 (v2.0.0-rc.26)，不過已經穩定到可以上 production 了。 官方 v2 正式版應該很快就會發布。
&lt;/div&gt;

&lt;h2 id="環境"&gt;環境&lt;/h2&gt;
&lt;p&gt;升級時使用的環境：&lt;/p&gt;</description></item><item><title>Enable Sidecar for Old Devices</title><link>https://blog.howar31.com/posts/sidecar-for-old-devices/</link><pubDate>Wed, 26 Jun 2019 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/sidecar-for-old-devices/</guid><description>&lt;div class="hint-container warning"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-exclamation-triangle" aria-hidden="true"&gt;&lt;/i&gt;
 Edit - 2019.08.06
 &lt;/p&gt;
 Methods mentioned in this post is no longer working in the latest beta version of macOS (10.15 Beta (19A526h)).
&lt;/div&gt;

&lt;div class="hint-container tip"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-lightbulb" aria-hidden="true"&gt;&lt;/i&gt;
 Edit - 2019.07.05
 &lt;/p&gt;
 &lt;ul&gt;
&lt;li&gt;Add some tips.&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;p&gt;The public beta of iPadOS and macOS Catalina is currently live for everyone now. You may go to &lt;a href="http://beta.apple.com/"&gt;Apple website&lt;/a&gt; for more detail info about public beta.&lt;/p&gt;
&lt;p&gt;The Sidecar is a hot feature which let you connect your iPad to Mac wireless or wired. But this feature is actually limited to newer Apple devices. My Macbook Air Early 2015 was not showing the &amp;ldquo;Sidecar&amp;rdquo; icon in System Preference, neither my iPad Pro 11&amp;quot; showing up in my MBA&amp;rsquo;s AirDisplay menu.&lt;/p&gt;</description></item><item><title>Made with Love Snippets</title><link>https://blog.howar31.com/posts/made-with-love/</link><pubDate>Tue, 25 Jun 2019 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/made-with-love/</guid><description>&lt;p&gt;Here are several ways to put &amp;ldquo;Made with Love&amp;rdquo; on your webpage.&lt;/p&gt;
&lt;h2 id="typing-the-heart"&gt;Typing the Heart&lt;/h2&gt;
&lt;h3 id="unicode-character"&gt;Unicode Character&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Made with ❤ by Howar31&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;Made with ❤ by Howar31
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="utf-8-miscellaneous-symbols"&gt;UTF-8 Miscellaneous Symbols&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Made with ♥ by Howar31&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;Made with &amp;amp;#9829; by Howar31
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="html-entities"&gt;HTML Entities&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Made with ♥ by Howar31&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;Made with &amp;amp;hearts; by Howar31
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="icon"&gt;Icon&lt;/h3&gt;
&lt;link rel="stylesheet" type="text/css" href="//code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css" /&gt;
&lt;blockquote&gt;
&lt;p&gt;Made with &lt;i class="icon ion-heart"&gt;&lt;/i&gt; by Howar31&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class="language-html"&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;//code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css&amp;quot; /&amp;gt;
Made with &amp;lt;i class=&amp;quot;icon ion-heart&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; by Howar31
&lt;/code&gt;&lt;/pre&gt;
&lt;link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.2/css/fontawesome.min.css" /&gt;
&lt;blockquote&gt;
&lt;p&gt;Made with &lt;i class="fas fa-heart"&gt;&lt;/i&gt; by Howar31&lt;/p&gt;</description></item><item><title>Proxy Settings Note</title><link>https://blog.howar31.com/posts/proxy-settings/</link><pubDate>Sun, 21 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/proxy-settings/</guid><description>&lt;div class="hint-container tip"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-lightbulb" aria-hidden="true"&gt;&lt;/i&gt;
 Edit - 2019.09.16
 &lt;/p&gt;
 &lt;ul&gt;
&lt;li&gt;Add/Edit &lt;a href="#git"&gt;Git&lt;/a&gt; section.&lt;/li&gt;
&lt;li&gt;Add command for NPM proxy&lt;/li&gt;
&lt;li&gt;Fix typo&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;p&gt;There are so many different system or tool configs to set if you are behind a proxy. This article simply note where and how to set them.&lt;/p&gt;
&lt;p&gt;I will use these settings for the following example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proxy Host: host&lt;/li&gt;
&lt;li&gt;Proxy Port: 3128&lt;/li&gt;
&lt;li&gt;Proxy User: username&lt;/li&gt;
&lt;li&gt;Proxy Password: password&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="hint-container warning"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-exclamation-triangle" aria-hidden="true"&gt;&lt;/i&gt;
 Warning
 &lt;/p&gt;
 You need to &lt;strong&gt;URL encode&lt;/strong&gt; your username or password if special characters contains.&lt;br&gt;
i.g. &lt;em&gt;whitespace&lt;/em&gt; = &lt;code&gt;%20&lt;/code&gt;, &lt;em&gt;&amp;amp;&lt;/em&gt; = &lt;code&gt;%26&lt;/code&gt;, etc&amp;hellip;
&lt;/div&gt;

&lt;h2 id="ubuntu"&gt;Ubuntu&lt;/h2&gt;
&lt;p&gt;Config file path: &lt;code&gt;/etc/environment&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Setup Dockerize GitLab Runner on Synology NAS</title><link>https://blog.howar31.com/posts/docker-gitlab-runner-synology/</link><pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/docker-gitlab-runner-synology/</guid><description>&lt;p&gt;In this article, I will illustrate how to setup a GitLab Runner with docker executor on Synology NAS DSM. And also show you how to setup docker-in-docker for docker executor in a container to call other docker containers/images on the host.&lt;/p&gt;
&lt;h2 id="environment"&gt;Environment&lt;/h2&gt;
&lt;p&gt;I have two Synology NAS and I tested the steps in this article on both devices. And the system (DSM) versions are the same.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Synology DS916+ and DS718+&lt;/li&gt;
&lt;li&gt;DSM 6.2.1-23824 Update 6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although there are some differences from regular Docker installation, I used the Docker package from Synology Package Center which provides GUI for easy management.&lt;/p&gt;</description></item><item><title>Setup VuePress with GitLab Pages on Ubuntu 18.04 LTS</title><link>https://blog.howar31.com/posts/vuepress-ubuntu/</link><pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/vuepress-ubuntu/</guid><description>&lt;p&gt;This is a lite version of setup tutorial about Vuepress docs on Ubuntu. For detailed tutorial I wrote, please visit &lt;a href="https://blog.howar31.com/vuepress-blog-tutorial/"&gt;Create a docs with VuePress on GitLab Pages&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="environment"&gt;Environment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu 18.04.1 LTS&lt;/li&gt;
&lt;li&gt;Node.js 11.14.0&lt;/li&gt;
&lt;li&gt;npm 6.9.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="setup-vuepress"&gt;Setup VuePress&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://vuepress.vuejs.org/guide/"&gt;VuePress Official Guide&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="install-vuepress"&gt;Install VuePress&lt;/h3&gt;
&lt;p&gt;First, install VuePress globally:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;npm install -g vuepress
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or if you want to install locally:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;npm install vuepress
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="hint-container warning"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-exclamation-triangle" aria-hidden="true"&gt;&lt;/i&gt;
 Warning
 &lt;/p&gt;
 With Vuepress installed locally, you may need to use &lt;code&gt;npx vuepress&lt;/code&gt; in command line.
&lt;/div&gt;

&lt;h3 id="config-build-path-for-gitlab-pages"&gt;Config Build Path for GitLab Pages&lt;/h3&gt;
&lt;p&gt;To change the built files destination, we must set it up in config file. By default the config file is not exist, you may create a config file by yourself:&lt;/p&gt;</description></item><item><title>Secure GitLab Pages with Let's Encrypt Certificate</title><link>https://blog.howar31.com/posts/lets-encrypt-ssl-gitlab-pages/</link><pubDate>Sat, 23 Mar 2019 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/lets-encrypt-ssl-gitlab-pages/</guid><description>&lt;div class="hint-container tip"&gt;
 &lt;p class="hint-container-title"&gt;
 &lt;i class="fas fa-lightbulb" aria-hidden="true"&gt;&lt;/i&gt;
 Edit - 2019.06.25
 &lt;/p&gt;
 &lt;ul&gt;
&lt;li&gt;Add &lt;a href="#automatically-renew-and-deploy-certificate-on-gitlab-pages"&gt;About Getting Certificates on Let&amp;rsquo;s Encrypt&lt;/a&gt; section.&lt;/li&gt;
&lt;li&gt;Add &lt;a href="#automatically-renew-and-deploy-certificate-on-gitlab-pages"&gt;Automatically Renew and Deploy Certificate on GitLab Pages&lt;/a&gt; section.&lt;/li&gt;
&lt;li&gt;Add &lt;a href="#references"&gt;References&lt;/a&gt; section.&lt;/li&gt;
&lt;li&gt;Fix typo.&lt;/li&gt;
&lt;/ul&gt;

&lt;/div&gt;

&lt;p&gt;Using SSL to secure your website is not only for safety, but also &lt;a href="https://blog.chromium.org/2017/04/next-steps-toward-more-connection.html"&gt;tell browser not show your website as not secure&lt;/a&gt;. &lt;strong&gt;Let&amp;rsquo;s Encrypt&lt;/strong&gt; provides free SSL/TSL cerfiticates as long as you remember to renew them once in a while. And wildcard certificates can be applied to all the subdomains.&lt;/p&gt;</description></item><item><title>Enable PWA Support for VuePress</title><link>https://blog.howar31.com/posts/vuepress-pwa/</link><pubDate>Fri, 22 Mar 2019 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/vuepress-pwa/</guid><description>&lt;p&gt;PWAs, &lt;strong&gt;Progressive Web Applications&lt;/strong&gt; are web applications which is loaded as a website, but can also provide native app functionalities, such as offline mode, push notification, hardware access, and more. For more info about PWA, please read the articles metioned in &lt;a href="./#references"&gt;References&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="environment"&gt;Environment&lt;/h2&gt;
&lt;p&gt;The environment I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS Mojave, 10.14.3&lt;/li&gt;
&lt;li&gt;VuePress 0.14.10&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I setup &lt;a href="https://blog.howar31.com/"&gt;my blog&lt;/a&gt; as a PWA successfully. You may visit &lt;a href="https://blog.howar31.com/"&gt;my blog&lt;/a&gt; on your phone (Chrome on Android recommended) to see how it works.&lt;/p&gt;</description></item><item><title>Create a Blog with VuePress on GitLab Pages</title><link>https://blog.howar31.com/posts/vuepress-blog-tutorial/</link><pubDate>Wed, 20 Mar 2019 00:00:00 +0000</pubDate><guid>https://blog.howar31.com/posts/vuepress-blog-tutorial/</guid><description>&lt;p&gt;After several years hosting my blog on Wordpress, I decided to move my blog to VuePress so that I may write my blog with Markdown, and also customize my blog with Vue.js.&lt;/p&gt;
&lt;p&gt;VuePress is a Vue-powered static site generator, which can easily help you to setup a SPA website in just few minutes. And with CI/CD and GitLab Pages integration, it becomes one of the best solution for personal blog which can be programmatically themed with Vue.js, automatically publish with CI/CD, and free host with GitLab Pages.&lt;/p&gt;</description></item></channel></rss>