RSSAmplifier

Blog

Peng-Yu Chen

Recent content on Peng-Yu Chen

blog.pengyuc.comRSS feed ↗40 posts

Latest posts

One Owner, Many Channels: Short-Video Accounts per Product

One Inbox, Many Masks gave every product its own contact@ address inside a single Google Workspace seat. Opening the first YouTube Shorts channel for Zestimer asked the follow-on question: sign up as contact@zestimer.com , or as contact@magicparklabs.com ? Both — and which does which turns out to depend on the platform. The address that owns the account should belong to the studio. The address the…

appkit: One Installed Program, and the Xcode Windows It Deletes

English · 中文 English The honest origin story is smaller than the engineering: I got tired of remembering asc flags. Not the hard kind of tired — I could look them up. The kind where every release starts with re-deriving a workflow I had already invented twice, because it lived as shell history in three different repos and none of the three agreed with each other. I wanted one thing that was…

One Inbox, Many Masks: Running Several Products as One Person

I run three products — Zestimer , Furioke , and Tefuda — plus a studio domain, magicparklabs.com . All four domains sit on a single Google Workspace seat, because Workspace charges per user , not per domain: a product needs an address, not an account. Below is the whole click path for adding one new domain, newproduct.com , so its mail lands in the inbox you already have open. You’ll work in…

[Tefuda] One Engine, Three Runtimes: Web, iOS, and Android Share One Ruleset

English · 中文 English Tefuda is a small card game I built. It ships as a website, an iOS app, and an Android app — all three backed by the same server-verified leaderboard. The combination isn’t the hard part. The hard part is that the same ruleset has to hold in four places at once : each of the three clients runs it, and the server recomputes the score itself, trusting nothing the client…

[Tefuda] Sorry, Scunthorpe: 200 Lines Between a Text Box and the Internet

English · 中文 English Tefuda has exactly one field a player can type free text into: sixteen characters, under the results panel, next to a button that says Post. Everything else on screen is a card. One text box. It cost two hundred lines, five languages, and an apology to a town in Lincolnshire. The Cap on the Input Is Not the Cap A name is the one thing a player writes that everybody else reads…

The Free Screenshot Robot: App Store Assets in Ten Languages, Zero Clicks

English · 中文 English Updated 6 August 2026. The shape below is the one I still use; the parts underneath it changed. The pipeline is now one installed program, appkit — the stage-by-stage sections have been rewritten to match, and the fastlane and NumPy versions are gone. If you want the engineering rather than the blueprint, that’s appkit: One Installed Program . App Store screenshots are…

Where 271 GB of "System Data" Went on My Mac

macOS Storage settings told me I had 271 GB of “System Data.” That number made no sense. My whole life on this machine is Claude Code, xcodebuild , and adb install — I don’t hoard 4K movies, I don’t run a fleet of VMs, and I certainly can’t point at a quarter-terabyte of anything I’d call “system.” The short version: “System Data” is a…

2026 Is the Cheapest Year Yet to Start Indie Hacking

Between January and July this year, I shipped two apps by myself. If you had told me that three years ago, I would have assumed you were describing a team. Zestimer , started in January, is an interval workout timer: a library of 212 illustrated exercises, an AI workout builder, a paste-a-YouTube-link-get-a-circuit importer, an Apple Watch app, widgets, eight languages, now at v1.3.4. Furioke ,…

Two Apps, One Philosophy: the Stacks Behind Zestimer and Furioke

This year I shipped two indie apps: Zestimer , an interval workout timer I started in January, and Furioke , a karaoke lyrics companion for learning Japanese that I started at the end of May. Different products, same person, and — it turns out — mostly the same opinions. This post is about the stack and architecture choices behind both: what I deliberately kept identical, what I deliberately made…

Fixing Black Flashes in SwiftUI Zoom Transitions

SwiftUI’s zoom navigation transition can look wonderful when it works: a card or thumbnail stays visually connected to the detail screen, and dismissal feels like the screen knows exactly where it came from. The failure mode is just as memorable. During the first or last frame of the transition, the source card suddenly turns black. Then, a beat later, it resolves back to the app background…

What's in my macOS?

After completely reinstalling macOS, here’s how I like to set up a clean, powerful, and personalized development environment. 1. Initial macOS Configuration 🧑‍💻 User Account Setup Create a temporary Admin user Name it Temp Login with Temp , then: Rename your home folder from jay to Jay Open System Settings > Users & Groups Change Account Name : jay → Jay Change Home Directory : /Users/jay…

macOS Developer Tips

These are handy tools and tweaks that aren’t required for a clean install, but can improve workflow or handle specific tasks. 🔧 Git Utilities Revert repo to a previous commit Rebase without changing timestamps : git rebase -i --root # Change pick → edit GIT_COMMITTER_DATE = 'YYYY-MM-DDTHH:MM:SS' git commit --amend --date = 'YYYY-MM-DDTHH:MM:SS' git rebase --committer-date-is-author-date…

AWS CLI

Learn how to set up AWS CLI for your AWS account in a few easy steps! This comprehensive guide walks you through enabling IAM Identity Center, adding a user to your AWS account, installing and configuring AWS CLI V2, and setting AWS environment variables. You’ll even get to test your AWS CLI skills by creating a role using AWS CLI V2. Follow along and become an AWS CLI pro! Enable IAM…

LeetCode 1453. Maximum Number of Darts Inside of a Circular Dartboard

正在把之前沒做的一些題做一做,剛好看到了這題滿有趣的,因此決定寫篇文章。 題目連結 。 \(O(n^3)\) 數學解 這題就不討論暴力解了,這題用到了一些國中教的數學知識,做起來還是滿有趣的。 以下提供的解法: 枚舉所有點對 \((P, Q)\),找出與 \(P\)、\(Q\) 相切的兩個圓 \(C_1\) 和 \(C_2\):\(O(n^2)\) 檢查其它所有點是否在 \(C_1\) 和 \(C_2\) 間:\(O(n)\) 總時間:\(O(n^3)\) 所以此題的重點在於求出圓心 \(C_1\) 和 \(C_2\)。 示意圖 由圖中可得: $$ \begin{aligned} \alpha_1 + \theta &= \alpha_2 + \theta = 90^{\circ} \\ \alpha_1 &= \alpha_2 \\ \vartriangle AMC_1 & \cong…

Digit DP

第一篇記錄算法的文章,來介紹下新學到的算法:Digit DP。 暴力解 題目模版一般會長的像這樣:給定區間 \([L, R]\) 和一個函數 \(f(x) \to \{\texttt{True}, \texttt{False}\}\),問在 \([L, R]\) 之間的正整數,滿足 \(f(x)\) 的數量有多少? 現在我們可以帶入一個真實的例子,在 \([L = 19, R = 9999]\) 區間,每一位數的總合為 \(k = 23\) 的數字共有幾個? 暴力解用 C++ 代碼演示如下: bool DigitSum ( int num ) { int sum = 0 ; while ( num > 0 ) { sum += num % 10 ; num /= 10 ; } return sum ; } int GetSatisfiedCount ( int l , int r ,…

科技人的各種縮寫

各行各業都有許多屬於他們自己的行話,科技業當然也不例外,還記得初來美國時,聽到各種五花八門的縮寫,總是覺得心好累,無法跟上大家,本文就讓筆者來列舉幾個打字常用的縮寫吧! 職位 DS(Data Scientist):資料科學家 EM(Engineering Manager):工程主管 PE (Principle Engineer):首席工程師 PM (Product Manager or Program Manager):產品經理或專案經理 SA (Solutions Architect):方案架構師 SWE (Software Engineer):軟體工程師 TPM(Technical Program Manager):技術專案經理 科技業常用 NG(New Grad):畢業生 PIP(Performance Improvement Plan):積效改善計畫 TC (Total…

Git Rebase 妙用

前言 Git 能夠有效地幫助你為一份專案寫下對應的日誌。良好、明確的提交歷史(Commit History)能讓日後回來追蹤代碼時,事半功倍,因此筆者認為學習有效地使用 Git,尤其是 rebase 這個功能是尤為重要的。 在終端機中輸入: git rebase --help 就能看到許多 git rebase 的用法,本文將會專注在筆者最常使用的幾個指令中,並談談如何高效地整理提交歷史。 手把手範例 範例會帶讀者實際的操作 git rebase 的用法,並且所有指令設皆能複製貼上。 本範例假設讀者有一定的 git 基礎。 正文開始 首先,建立我們的測試工作環境 git-rebase-demo ,以下所有操作都會在此路徑下完成: mkdir ~/git-rebase-demo && cd $_ git init 新增帶有錯別字的 A.txt 並提交(commit) A.txt : echo…

用 Hugo 搭建,並用 GitHub Actions 佈署你的個人博客!

遇見 Hugo 今天來談談 Hugo 環境設定時所遇到的一些問題及解決辦法。 預備環境 要開始使用 Hugo ,若您的環境跟我一樣是 macOS 的話,可以使用套件管理工具 Homebrew :在終端機輸入以下指令後,便會開始下載需要的套件。 brew install hugo 設定本地端 初始化並創建 Git 倉庫 REPO_NAME = blog hugo new site $REPO_NAME -f yaml cd $REPO_NAME git init git add . git commit -m ' $ hugo new site blog -f yaml' 使用 Git submodules 新增主題 git submodule add --depth = 1 https://github.com/adityatelange/hugo-PaperMod.git…

lower_bound and upper_bound vs floorEntry and ceilingEntry

Example C++ lower_bound : iterator that points to the first (minimum) number >= target. upper_bound : iterator that points to the first (minimum) number > target. map < int , string > map ; map [ 1 ] = 'one' ; map [ 2 ] = 'two' ; map [ 3 ] = 'three' ; map [ 5 ] = 'five' ; map [ 6 ] = 'six' ; // 1 2 3 5 6 map . lower_bound ( 0 ); // ^ map . upper_bound ( 0 ); // ^ // 1 2 3 5 6 map . lower_bound ( 4…

Swift Style Guide

Swift Style Guide Updated for Swift 5.0 The goals are clarity , consistency and brevity , in that order. Clarity at the point of use. Codes should always be consistent within one data set. Pay attention to spelling and case; most frequent problems are with abbreviations. Clarity is more important than brevity. Write a documentation comment. References This guide mainly follows: Swift.org - API…

Anaconda 完美解決 Python 2 和 Python 3 並存問題

前言 Python 3 已經逐漸取代 Python 2,成為普遍開發者所使用的語言,但最囧的是,很多老舊的專案、系統仍然運行著由 Python 2 所編成的環境中,有時為了在舊版本(Python 2)中開發,必需要有一個很好的環境控制方式。 Anaconda 引用維基百科上有關 Anaconda 的敘述: Anaconda 是一種 Python 語言的免費增值開源發行版,用於進行大規模數據處理,預測分析,和科學計算,致力於簡化包的管理和部署。Anaconda 使用軟體包管理系統 Conda 進行包管理。 使用 Anaconda 可以幫我解決以下兩個大問題: 提供 package management:功能類似 pip 提供 virtual environment:解決了 Python 多版本並存問題 你可以在 這裡 下載 macOS 的 Anaconda…

克服 JS 的奇怪部分 - 2. 執行環境與詞彙環境

7. 觀念小叮嚀:名稱/值配對與物件 Conceptual Aside: Name/Value Pairs & Objects Name/Value Pair : A name which maps to a unique value. The name may be defined more than once, but only can have one value in any given context . That value may be more name/value pairs. JS 中的物件,單純的是 Key-Value 的關係,而物件中也可以再包含物件,像 Address 包含 Apartment 。 const Address = { Street : 'Main' , Number : 100 , Apartment : { Floor : 3 , Number…

論文筆記 Prioritized Experience Reply

Paper Link Experience replay 使得 RL agents 能夠記住並重用過去的經驗。 以前的做法是,從 replay memory 中均勻的 sample experience transition。但這種方法只根據他們最初被體驗到的頻率,而不管它們的重要性。 在本文中,開發了一個優先驗體的框架,以便更頻繁地重放重要的 transition,從而更有效地學習。 本文表示,採用此種經驗回放的算法,能夠在 49 種遊戲中,打贏傳統算法 41 次。 1 Introduction RL agents 在觀察到一連串的經驗時,增量地更新其參數。最簡單的做法,即:在更新後,立刻扔掉到來的數據,但這有幾下兩種問題: 強烈的相關性更性破壞了許多隨機梯度下降為基礎的演算法所假設的 i.i.d.。 快速的忘記罕見,但可能會再用到的經驗。 Experience replay…

Reinforcement Learning on OpenAI Gym

Reinforcement Learning: OpenAI Gym 強化學習(Reinforcement Learning,以下簡稱 RL)有別與一般監督式學習(Supervised Learning)與要 end-to-end 的資料訓練。 Reinforcement Learning 介紹 Agent 在某個 state 做了一個 action,而移到下一個 state,環境此時給了 agent 一個 reward,而 agent 則根據這個 reward 調整他的腳步。 聽起來有點抽象?比喻來說: 你是 agent,而環境是家(包括:爸爸、媽媽等),action 是你的行為舉止,state 是你所在的地點,reward 是媽媽給你的獎勵(可能是負的,即:負回饋)。…

論文筆記 Video-to-Video Synthesis

Paper Link 現在 image to image 的 tasks 已經是當紅炸子雞,NVIDIA 這回和 MIT CSAIL 直接更上一層樓,開發出了 video to video 的轉換系統,並且能夠支援到 2K 的解析度,就讓我們來看看這篇 vid2vid 吧! 1 Introduction 建模和動態地重建視覺世界的能力對於構建 intelligent agents 是至關重要的。除了科學興趣導向外,學習連續視覺經驗在計算機視覺、機器人和計算機圖形學中有廣泛的應用。 Figure 1: Generating a photorealistic video from an input segmentation map video on Cityscapes. Top left: input. Top right: pix2pixHD . Bottom left: COVST .…

論文筆記 Computing Machinery and Intelligence

Paper Link 今天是台灣九合一縣市長選舉隔天,決定要來看一篇 1950 年,由計算機科學之父 A.M. Turing 所寫的 Computing Machinery and Intelligence。 這篇 paper 提出了電腦智能當中幾個重要的想法,數學描述不多,主要著重在理論上的描述。 圖靈測試(Turing test)是 AI 領域中,一項著名且具爭議的測試方法。這是以 Alan Turing 在 1950 第一份論文「運算機器與智能」(Computing Machinery and Intelligence)為基礎所設計的問答,目標在分辨機器是否具備人類所具有的智能(Intelligence)。 文本很長,又是 1950 年的英式英文,但我會試著去翻譯並整理這經典的 paper。 1. The Imitation Game 首先圖靈提出了一個問題: &ldquo;Can…

論文筆記 Non-local Neural Networks

Paper Link ss Convolutional 和 recurrent operations 都是一次處理一個 local 鄰域,此篇 paper 提出了 non-local operations 的想法,目的就是要解決即使相距很遠的的 blocks,仍然有可能是彼此有關聯的。 1. Introduction 為什麼要使用深層神經網路? 補捉 long-range dependencies 可能是一個大家會常給出的答案。 舉例來說: sequential data (e.g., in speech, language) 一般來說會採用 recurrent operations,也是為了達成 long-range dependency modeling image data 則常常採用深層的 convolutional operations 因為 convolutional 和…

論文筆記 PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

Paper Link 1 Introduction PointNet 對局部特徵的處理並不完善,在 3D Object Part Segmentation 和 Semantic Segmentation in Scenes 中(即:需要得到每一個點的分數時),原方法是將全局特徵 concatenate 在單點特徵後面,中間忽略了局部特徵的步驟,於是作者提出了 PointNet++ 採用分層神經網路(hierarchical neural network)來對此改善。 另外,點雲的密度是不固定的,因此作者也在 PointNet++ 中提出了 密度適應 的網路結構。 就全局來看,PointNet++ 比 PointNet 多了: 局部特徵提取 密度適應網路 2 Problem Statement 假設 \(X = (M, d)\) 是繼承歐基里德空間 \(\mathbb R^n\)…

論文筆記 PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

Paper Link 1. Introduction 這篇是 Stanford 在 CVPR 2017 所發表的 PointNet,從名字中可以知道是有關處理 3D 資料的論文。全文目標就是要對點雲(point cloud)做各種分類,最關鍵的方法為: single symmetric function max pooling(解決無序性) Figure 1. Applications of PointNet. We propose a novel deep net architecture that consumes raw point cloud (set of points) without voxelization or rendering. It is a unified architecture that learns both global and local point…

論文筆記 OctNet: Learning Deep 3D Representations at High Resolutions

Paper Link 此篇 paper 的主要目的是要解決,但送進網路 training 的 3D 資料是稀疏的(sparse),用原本的描述方式會太耗費記憶體而難以實作,因為實際上很多地方都是沒有值的,本篇 paper 重點是:使用 octree 的方法來表示高解析度的「立體圖像」,卻又不失本來「完整地」表示方式。 1. Introduction 現有的 3D 網路架構,大多會用像類似 2D pixels 的表示方示,在 2D 我們稱之為 pixel,在 3D 的話就稱之為 voxel。同理,在 2D 世界的 convolution kernel 在 3D 就會變成一個長方體,大小可能是 \(3 \times 3 \times 3\) 之類。 引述原 paper 中的描述: a dense and regular 3D voxel grid, and process this grid…

論文筆記 Pointwise Convolutional Neural Networks

Paper Link 在這篇 paper 中,展示了使用 CNNs 去處理 3D point clouds,並且應用在 semantic segmentation 和 object recognition 中。 MathWorks 官網有對 Semantic Segmantation 做了一個基礎的 介紹 : 分割(Segmantation)對於圖像分析任務非常重要。語義分割(Segmantic Segmantation)描述了將圖片中的每個像素與類標籤(class label),例如:花、人、道路、天空、海洋或汽車,相關聯的過程。 1. Introduction 現有的深度學習在處理 3D 資料,像是體積、point clouds、或 multi-view 圖片仍有不少困難。 Volume representation…

論文筆記 Highly-Economized Multi-View Binary Compression for Scalable Image Clustering

Paper Link 講到 image clustering,就必需先來談談什麼是 cluster analysis(聚類分析),在維基百科上給出了下列一段的 定義 : 聚類分析(英語:Cluster analysis,亦稱為群集分析)是對於統計數據分析的一門技術,在許多領域受到廣泛應用,包括機器學習,數據挖掘,模式識別,圖像分析以及生物信息。聚類是把相似的對象通過靜態分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性,常見的包括在坐標系中更加短的空間距離等。 一般把數據聚類歸納為一種非監督式學習。 為避免混淆,此篇文章一律使用原文 image clustering,而不多做無謂的翻譯。 1 Introduction Image clustering 的主要目的為: 發現圖片表示的 自然 和 可解釋結構…

論文筆記 Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields

Paper Link 1. Introduction 這篇 paper 是卡內基美隆大學(Carnegie Mellon University)在 CVPR 2017 所發表的,論文中首先指出了 Pose Estimation 中三個具挑戰性的關鍵: 一張圖片裡有多少人,而這些人擺什麼姿勢和人的大小? 有幾個人是相互疊在一起(overlap)的,他們彼此摭蓋面積? 無法即時(realtime) 另外論文中也提到了一些現有方法存在的瓶頸,現有方法主要是透過 top-down 的方式: person detector single-person pose estimation 來解決此類問題,而這很依賴效能,如果 person detector 失敗了,那方法就沒用了,另外時間也是一項考驗。 2. Method Figure 2: Fig. 2 給出了模型的整個處理過程: 讀進一張圖片大小為…

ES2015

在這篇文章中,會紀錄各種 ES2015 的標準! const 由 var 宣告的變數,可重新賦值: var myName = 'Jay' ; myName = 'Peng-Yu' ; // no problem here! 而由 const 宣告的變數,不能被重新賦值,也不能被重新宣告: const myName = 'Jay' ; myName = 'Peng-Yu' ; // TypeError const myName = 'Peng-Yu' ; // SyntaxError 但是可以新增元素: const numbers = [ 1 , 2 , 3 , 4 ]; numbers . push ( 10 ); // 5 numbers ; // [1, 2, 3, 4, 10] numbers = 'no!' ; // TypeError let let myName = 'Jay'…

Advanced Array Methods

在此附上 Elie Schoppik 講師的 slides 陣列迭代 在 JavaScript 中,callback 是一種常見的函式,這篇文章想要對 JS 中幾種常見迭代(iterate)陣列的方式做個初步的介紹。 主要函式有以下幾種,使用它們可以使程式碼變得更加整潔、清楚! forEach map filter some every reduce forEach 執行步驟: 迭代整個陣列 對每一個值(value)執行一次 callback 回傳 undefined 運行機制: function forEach ( arr , callback ) { for ( let i = 0 ; i < arr . length ; ++ i ) { callback ( arr [ i ], i , arr ); } } 以下讓我們透過例子來深入了解 forEach 的奧妙! Write a…

Testing with Jasmine

在此附上 Elie Schoppik 講師的 slides 為什麼要用 Jasmine? Jasming 提供了各式各樣不同的測試方式 在各種 JavaScript 環境下都能順利運行! Getting Started 新增 html 檔。 連結 CSS、JavaScript 檔。 開始寫測試程式碼! <!DOCTYPE html> < html lang = 'en' > < head > < meta charset = 'UTF-8' /> < title > Jasmine Tests </ title > < link rel = 'stylesheet' href = 'https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.6.2/jasmine.css' /> </ head > < body > < script src =…

bash -> zsh

前言 因為朋友推薦,前陣子開始轉移使用 oh-my-zsh ,起初覺得用了很久的 bash 已經夠好用了,真的有需要轉移到 zsh 上嗎?但經過使用一個月的心得,我能告訴您,zsh > bash。 本身是使用 macOS,不確定使用 Windows 的朋友是否能夠如法砲製,zsh 相比 bash 有許多的優點,像是: 不區分大小寫(方便 tab 補齊路徑名) 能夠上色,有多種主題 能夠顯示 git branch 分支狀態 接下來就來說 zsh 的安裝方法: 安裝 zsh 安裝 oh-my-zsh 安裝 zsh-completions 修改設定 安裝流程 安裝 zsh brew install zsh 並且將預設的 bash 修改為 zsh: chsh -s /usr/local/bin/zsh # change shell to zsh 若日後要換回原廠預設的 bash: chsh -s…

LaTeX 語法整理

前言 使用 LaTeX 這款排版工具也有 1 年多了,有鑑於在查語法時常重複查詢造成效率下降,加上朋友的建議,於是就來整理份常用的 LaTeX 語法吧! 基本 程式碼 LaTeX 程式碼 LaTeX a_1 \(a_1\) x^{2018} \(x^{2018}\) e^{-\alpha t} \(e^{-\alpha t}\) a^3_{ij} \(a^3_{ij}\) e^{x^2} \ne {e^x}^2 \(e^{x^2} \ne {e^x}^2\) 94 \times 87 = 8178 \(94 \times 87 = 8178\) 根號 程式碼 LaTeX 程式碼 LaTeX \sqrt x \(\sqrt x\) \sqrt{x^2 + \sqrt y} \(\sqrt{x^2 + \sqrt y}\) \sqrt[3]{2} \(\sqrt[3]{2}\)…

刪除 Git 提交記錄

前言 在使用 Git 時,我們可能會有些「不那麼整齊」的提交記錄(commit history),這時創建一個新的倉庫(repository),並且將原有資料整份移植過去是個有效的解決方式,但似乎不太聰明,於是我開始尋找是否有更有效率的方法,好在 Stack Overflow 上 這篇文章 給出了一個可用的解答。 刪除提交記錄 若直接刪除 .git 資料夾的話,可能會導致你 git 倉庫出現問題。如果想要刪除所有的提交記錄,且保留目前程式碼的狀態,以下的步驟是安全且可行的: # create a temporary branch git checkout --orphan TEMPORARY_BRANCH # add all files git add -A # commit the changes git commit -am 'Reset Commit History' #…

Hexo Building

前言 近日有感沒有花些心思去整理平時的一些思緒、札記等等,於是決定要開始著手寫部落格。在網路上查了許多資料後,決定使用 Hexo 所提供的服務,裡面也有許多主題可供挑選,而我使用的這個是 NexT ,一款由中國人所設計,非常精緻典雅的主題。 使用 Hexo 來建立個人網站 網誌中的第一篇文章,我想要談談我在使用 Hexo 建立個人網站時並且發布到 GitHub Pages 時所遇到的問題,以及我是怎麼解決的。 環境需求 要開始使用 Hexo ,必需先確保你的電腦有以下的插件: Git Node.js 安裝 Hexo 我們可以藉由 Node.js 輕鬆的安裝 Hexo : npm install hexo-cli -g 初始化倉庫(repository) 你必需先在你的 github 帳戶底下建立一個新的倉庫,名字必需是 <username>.github.io 或是…