2026年4月28日 星期二

市圖還書兩本 (React)

前陣子因為在 Vibe Coding 開發中, 發現 AI 經常使用 React 作為前端框架, 於是興起一股學學看的念頭, 從市圖借來幾本 React 的書, 沒有打算深入研究, 只想對核心運作有個基本認識. 不過還沒開卷呢, 下面兩本已被預約須還 :
No.1 作者是 ReacJS 新聞站長, 此書雖較舊了, 但前半部有豐富的 ES6 語法介紹; No.2 書況極新 (2024 年出版), 內容也更豐富, 包含伺服端 React, 與 Next.js 框架等, 下次再回借. 

2026年4月26日 星期日

2026 年第 16 周記事

週五天氣轉陰, 下班時差點淋到雨, 傍晚回鄉下時開始下起小雨, 整個晚上都在下, 甚至連周六也是下整天, 雨天無訪客剛好在家趕 SDD 線上課程的作業, 花了整整一天終於在周六晚上午夜關檔前完成作業上傳, 好險! 45 個學員也只有 9 個趕上截止期限 (我是最後一個哈哈).

幸好今天出太陽, 趕緊將沙發罩洗好拿去曬, 因下周大帥與仲仔要造訪鄉下家, 得事先整理一下客廳. 下午把馬路邊的三棵芒果樹都套袋完畢, 約莫 60 顆左右, 樹梢還有很多太高無法套袋, 下周要去小漢買網子攤開綁在樹下, 這樣等自然熟掉下來時才不會摔壞. 




由於雨季即將來臨, 蔥價會攀高, 早上跑了一趟種子行買了 20 株青蔥苗+一株九層塔+六株皇宮菜, 年初種了一盆香菜長不好, 傍晚全部拔掉改種青蔥, 九層塔也是盆栽, 皇宮菜則暫時放著澆水, 小舅五月初要叫小耕耘機把菜園的土翻一遍, 說之後保留兩畦給他秋天時種小番茄, 其餘我要種菜或種果樹均好, 因為他家那邊也有一個菜園要顧 (去年他朋友借他使用). 菜園南側因為較遠, 種菜澆水較不便, 打算再種兩棵芭樂樹與木瓜樹. 

毛小妹第二胎 (也是四隻) 小貓現在都在室外了, 這梯都很怕人不親, 我一靠近就跑掉. 上一梯的四隻目前只剩小黑與吉哇哇在家, 小乖與哇哇吉都離家超過一個月不回來了. 毛小妹的妹妹捲尾阿姨我也一周未見她出現, 恐怕也不回來了. 雖說不回來, 其實我認為它們應該都是遇險 (中毒/車禍) 回不來. 




車庫雜物實在太多了, 等沖繩回來得來個斷捨離大清理了. 

2026年4月25日 星期六

Gemini CLI 學習筆記 : OpenSpec 初體驗 (三)

離作業交卷只剩 2.5 小時, 刻不容緩繼續進行第三次迭代.

本系列全部測試文章參考 : 


第三次迭代要在前次基礎上添加對數與三角函數科學計算功能, 同樣使用逐步推進模式, 工作流所需指令如下 : 
  • /opsx:new <iteration_name> (建立迭代之專屬的工作區)
  • /opsx:propose <requirements> (依需求起草提案書, 規格定義書, 架構設計書, 與任務清單)
  • /opsx:apply <iteration_name> (依照 tasks.md 中的任務清單逐一實作此迭代功能)
  • /opsx:archive (迭代完成歸檔)
廢話不多說以免誤了軍期, 馬上開工. 


1. 建立迭代之專屬工作區 :   

第三次迭代工作區取名為 calc-scientific :

/opsx:new calc-scientific   



... (略) ...



2. 根據需求填寫提案書 :   

> /opsx:propose "在現有計算器專案上擴充科學計算功能, 包含三角函數 (sin, cos, tan) 與對數 (以 10 為底的 log, 以及自然對數 ln), 請務必處理以下邊界與轉換邏輯:1. 三角函數的輸入值預設為「角度 (Degree)」, 後端需自行轉換為弧度進行計算, 2. 處理 tan(90) 等無效角度的防呆機制, 3. 對數運算需阻擋小於或等於 0 的無效輸入, 並回傳明確的 HTTP 錯誤, 4. 前端介面需優雅地加入這些新按鈕. "



... (略) ...



3. 依據任務清單實作程式碼 :   

> /opsx:apply calc-scientific   



... (略) ...



完成專案實作馬上作人工測試, 開啟 127.0.0.1:5000 網頁果然多了很多科學計算按鈕 :



輸入 30 或 390 按 sin 都會得到正確結果 0.5 :




輸入 -30 按 sin 也得到正確結果 -0.5 :




接下來做 cos 的精度測試, 輸入 90 按 cos 得到一個接近 0 的極小值而非 0, 這是因為我們忘了要 AI 做微小誤差抹零處理之故, 可以在後續迭代中處理掉. 做對數測試, 輸入 1 按 log 得到正確 0, 輸入 0 按 log 則得到 Error (無限大) :




4. 歸檔結案 : 

/opsx: archive   



... (略) ...


第三次迭代歸檔完畢, 終於搞定了, 趕緊來去交作業啦! 


5. 打包專案上傳 GitHub : 

作業繳交要求將專案上傳 GitHub, 然後將 repo 網址填入 Google 試算表內. 


(1). 將所有變更加入暫存區 (打包) : 

D:\gemini\calculator-project>git add .  
warning: in the working copy of '.gemini/commands/opsx/apply.toml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.gemini/commands/opsx/archive.toml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.gemini/commands/opsx/explore.toml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.gemini/commands/opsx/propose.toml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.gemini/skills/openspec-apply-change/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.gemini/skills/openspec-archive-change/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.gemini/skills/openspec-explore/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.gemini/skills/openspec-propose/SKILL.md', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.gitignore', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of '.python-version', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'main.py', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'openspec/changes/archive/2026-04-25-calc-basic/.openspec.yaml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'openspec/changes/archive/2026-04-25-calc-power-root/.openspec.yaml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'openspec/changes/archive/2026-04-25-calc-scientific/.openspec.yaml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'openspec/config.yaml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'pyproject.toml', LF will be replaced by CRLF the next time Git touches it
warning: in the working copy of 'uv.lock', LF will be replaced by CRLF the next time Git touches it

出現的這些 warning 是在 Windows 環境下執行 Git 時常見的警告, 它完全不影響程式碼功能或 GitHub 的上傳結果, 這只是 Git 在提醒換行符號的格式要統一, 因為 OpenSpec 工具或 AI 產生的檔案可能預設使用了 Unix 格式的換行字符 LF, 在 Windows 的命令提示字元下操作時 Git 偵測到這種不一致, 所以主動告知它會自動把這些檔案轉換成 Windows 標準的 CRLF, 因此毋須理會. 


(2). 設定使用者名稱與 Email : 
 
D:\gemini\calculator-project>git config --global user.name "Tony"
D:\gemini\calculator-project>git config --global user.email "blablabla@ms5.hinet.net"   


(3). 提交變更 (貼標籤/存檔) : 

D:\gemini\calculator-project>git commit -m "feat: 完成計算機專案 (基礎運算、次方根號、科學計算)"   
[master (root-commit) 17a5d99] feat: 完成計算機專案 (基礎運算、次方根號、科學計算)   
 44 files changed, 2523 insertions(+)
 create mode 100644 .gemini/commands/opsx/apply.toml
 create mode 100644 .gemini/commands/opsx/archive.toml
 create mode 100644 .gemini/commands/opsx/explore.toml
 create mode 100644 .gemini/commands/opsx/propose.toml
 create mode 100644 .gemini/skills/openspec-apply-change/SKILL.md
 create mode 100644 .gemini/skills/openspec-archive-change/SKILL.md
 create mode 100644 .gemini/skills/openspec-explore/SKILL.md
 create mode 100644 .gemini/skills/openspec-propose/SKILL.md
 create mode 100644 .gitignore
 create mode 100644 .python-version
 create mode 100644 GEMINI.md
 create mode 100644 README.md
 create mode 100644 calculator/__init__.py
 create mode 100644 calculator/logic.py
 create mode 100644 main.py
 create mode 100644 openspec/changes/archive/2026-04-25-calc-basic/.openspec.yaml
 create mode 100644 openspec/changes/archive/2026-04-25-calc-basic/design.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-basic/proposal.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-basic/specs/arithmetic-api/spec.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-basic/specs/calculator-ui/spec.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-basic/tasks.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-power-root/.openspec.yaml
 create mode 100644 openspec/changes/archive/2026-04-25-calc-power-root/design.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-power-root/proposal.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-power-root/specs/advanced-arithmetic/spec.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-power-root/specs/calculator-ui/spec.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-power-root/tasks.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-scientific/.openspec.yaml
 create mode 100644 openspec/changes/archive/2026-04-25-calc-scientific/design.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-scientific/proposal.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-scientific/specs/calculator-ui/spec.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-scientific/specs/scientific-functions/spec.md
 create mode 100644 openspec/changes/archive/2026-04-25-calc-scientific/tasks.md
 create mode 100644 openspec/config.yaml
 create mode 100644 openspec/specs/advanced-arithmetic/spec.md
 create mode 100644 openspec/specs/arithmetic-api/spec.md
 create mode 100644 openspec/specs/calculator-ui/spec.md
 create mode 100644 openspec/specs/scientific-functions/spec.md
 create mode 100644 pyproject.toml
 create mode 100644 static/index.html
 create mode 100644 static/script.js
 create mode 100644 static/style.css
 create mode 100644 test_api.py
 create mode 100644 uv.lock


(4). 在 GitHub 建立空的儲存庫 (Repository) : 

建立一個空專案 (剛好 calculator-project 可用), 注意, 因為在本機已經有 README.md 與 .gitignore 檔案了, 不要勾選 "Add a README" 或 "Add .gitignore" 這兩項, 保持預設的空專案即可, 點擊 Create repository 新增 repo. 



(5). 綁定並推上雲端 : 

告訴本機 Git 這個專案要連線到哪個 GitHub 網址 : 

D:\gemini\calculator-project>git remote add origin https://github.com/tony1966/calculator-project.git  

把專案推上雲端  : 

D:\gemini\calculator-project>git push -u origin main   
Enumerating objects: 67, done.
Counting objects: 100% (67/67), done.
Delta compression using up to 16 threads
Compressing objects: 100% (51/51), done.
Writing objects: 100% (67/67), 39.46 KiB | 3.04 MiB/s, done.
Total 67 (delta 3), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/tony1966/calculator-project.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

此指令會出現詢問視窗, 用預設 manager 按 Select 鈕即可, 然後登入 GitHub 帳號即可上傳. 成功後到 Google sheet 登錄專案 repo 的 GitHub 網址即完成作業繳交啦! 我原以為時間太趕只能聽完課程, 沒想到忙了一整天居然搞定作業了, 哈哈. 

心得 : 親自動手做一遍才能真正學會. 


6. 跳出 Gemini CLI : 

專案結束, 輸入 exit 離開專案 : 




used 從 2% 到 10%, 用掉了 8% 資源. 連續按兩次 Ctrl+C 即可跳出 Gemini CLI 回到 PS 視窗. 

Gemini CLI 學習筆記 : OpenSpec 初體驗 (二)

白天完成初次迭代後, 傍晚快馬加鞭進行第二次迭代.

本系列全部測試文章參考 : 


前一篇的初次迭代由於功能較簡單, 我們使用了 /opsx:ff 快轉指令一鍵生成模式, 快速地完成了從規劃到程式碼生成與測試驗證的工作流. 本篇將在初次碟待的基礎上為基本的四則運算計算器添加次方與根號功能. 

此二次迭代將改用逐步推進模式, 舊版 OpenSec 原本的的工作流需要依序執行下列指令 :
  • /opsx:new <iteration_name> (建立迭代之專屬的工作區)
  • /opsx:propose <requirements> (依需求起草提案書)
  • /opsx:continue (完成規格定義書 spec.md)
  • /opsx:continue (完成架構設計書 design.md)
  • /opsx:continue (完成任務清單 tasks.md)
  • /opsx:apply (依照 tasks.md 中的任務清單逐一實作功能)
  • /opsx:verify (驗證程式碼與規格完整性, 正確性, 一致性)
  • /opsx:archive (迭代完成歸檔)
執行 /opsx:propose 後, AI 只會生成第一份文件 proposal.md (提案書) 並把控制權交還給我們來審查功能描述是否與需求符合. 審查通過後就可執行三個連續的 /opsx:continue 指令, 一次只產出一份文件, 審查通過後再執行下一個 continue 指令. 

第一個 /opsx:continue 指令, 它會生成規格定義書 spec.md, 注意, 這個檔案可能不只一個, 因為在模組化的軟體架構中, 功能會被解耦分拆在不同資料夾, 例如 :

openspec/changes/calc-power-root/specs/arithmetic-api/spec.md
openspec/changes/calc-power-root/specs/calculator-ui/spec.md

每一個功能都會有一個 spec.md 檔, 這些分散的規格定義書共同構成了這次迭代的完整規格.

第二個 /opsx:continue 指令會產生架構設計書 design.md, 主要是描述內部程式碼要怎麼實作, 審查重點在於有沒有過度設計 (Over-engineering), 例如明明 math 套件能做到的功能卻使用 numpy, 這實要將其改為 "使用 Python 內建 math 即可". 

第三個 (也是最後一個) /opsx:continue 指令會生成任務清單 (施工單) tasks.md 檔, 這份文件是設計階段與實作階段之間的最後一座橋樑, 也是 AI 執行 /opsx:apply 時唯一的行動指南, 它只關注具體要做哪些動作. 審查時要檢查施工順序是否合理, 若無問題就可以下達 /opsx:apply 指令叫 AI 依照清單逐一實作程式碼, 完成驗證後即可歸檔. 

但新版的 OpenSec 已經把三次 /opsx: continue 指令整合進 /opsx:propose 裡面了, 所以新版的工作流指令序列改為 :
  • /opsx:new <iteration_name> (建立迭代之專屬的工作區)
  • /opsx:propose <requirements> (依需求起草提案書, 規格定義書, 架構設計書, 與任務清單)
  • /opsx:apply <iteration_name> (依照 tasks.md 中的任務清單逐一實作此迭代功能)
  • /opsx:archive (迭代完成歸檔)
填寫四大核心工件的步驟其實都整合到 /opsx:propose 指令裡了. 


1. 建立迭代之專屬工作區 :   

第二次迭代的目標是要為四則運算計算器添加次方與開根號功能, 因此迭代名稱可取為 calc-power-root : 

> /opsx:new calc-power-root   

同樣地會有一連串的授權詢問, 一律選擇預設的 Allow once 觀察每一步在做甚麼 :



... (略) ...



可見 /opsx: new 指令主要是生成四個核心工件 (artifacts) 的待填空模板, 其中的 spec.md 是每個功能會有一個, 放在各自功能的資料夾下面. 


2. 根據需求填寫提案書 :   

有了核心工件的空模板後, 接下來要用 /opsx: propose 指令注入需求, 讓 AI 協助填寫提案書 : 

> /opsx:propose "在現有的基礎四則運算計算器專案上, 加上次方與開根號功能. 請確保處理好基礎的邊界條件與防呆機制 (例如對負數開偶數根的錯誤處理) 等. "

這時 OpenSpec 偵測到這個需求的主題跟上面剛剛用 /opsx:new calc-power-root 建好的 calc-power-root 工作區完全契合, 詢問是否要把這份提案放進剛才那個工作區? 那是當然的, 選  1. 繼續使用 calc-power-root : 




... (略) ...



可見四大核心工件檔案的填寫都已完成, 開啟這些檔案審查若不需要修改就可以下 /opsx:apply 指令來實作程式碼了. 


3. 依據任務清單實作程式碼 :   

用 /opsx: apply 指令並指定迭代工作區名稱 (防呆防猜測) :

> /opsx:apply calc-power-root  

此指令將依照任務清單 tasks.md 內容依序實作程式碼, 同樣地會有一連串的授權詢問, 一律選擇預設的 Allow once 觀察每一步在做甚麼 :



... (略) ...



這樣就完成專案實作了 (咦, 這次沒跟我說要開啟 127.0.0.1:5000 來測試?), 我前次迭代執行的 uv rum main.py 沒關掉, 馬上測試 2 的 3 次方得到正確結果 8 : 




按 C 鍵清除輸入 49 按開根號也正確得到 7 : 




原先的基本四則運算功能維持一樣沒被改壞, 二次迭代終於完成了. 


4. 歸檔結案 : 

下 /opsx: archive 指令歸檔  :

> /opsx: archive   



... (略) ...



終於完成二次迭代了. 

Gemini CLI 學習筆記 : OpenSpec 初體驗 (一)

最近幾天上完 TibaMe 的規格驅動開發 (SDD) 課程, 準備找一個小專案 (計算器) 用 Gemini CLI 來跑一下 OpenSpec 交作業. 

本系列全部測試文章參考 : 


關於 SDD 我已看完高見龍老師的部落格文章, 摘要整理在這篇 : 



1. Gemini CLI 升版 :

距離上次測試已經過了快三個月了, Gemini CLI 版本應該也演進了不少, 所以先來升版. 開啟 PS 視窗, 輸入下列指令查詢目前本機版本 :

PS D:\gemini> gemini --version  
0.26.0

用下列指令升到最新版 : 

PS D:\gemini> npm install -g @google/gemini-cli@latest   

added 1 package, removed 609 packages, and changed 6 packages in 3m
npm notice
npm notice New minor version of npm available! 11.6.2 -> 11.13.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.13.0
npm notice To update run: npm install -g npm@11.13.0
npm notice
PS D:\gemini> gemini --version
0.39.1   

哇, 一季不見已從 0.26.0 跳到 0.39.1 版. npm 也有新版, 順便也升版 :

PS D:\gemini> npm install -g npm@11.13.0   

removed 60 packages, and changed 90 packages in 9s
PS D:\gemini> npm --version   
11.13.0


2. 安裝 OpenSpec :

OpenSpec 是一款由 Fission AI 研發的開源輕量級規格驅動開發 (SDD) 工具, 是一套讓 AI 程式助理 (coding agents) 遵循規格的工作流程與 CLI 工具, 目前支援 20 種以上 AI 工具, 它的目標是讓工程師與 AI 在開發軟體之前先對規格達成共識, 減少 vibe coding 常見的偏題與反覆修改弊病, 並且能留下規格紀錄與決策脈絡備查, 提高軟體可維護性. 

安裝 OpenSpec 須有 Node v20.19.0 以上執行環境, 先檢視 Node 版本 :

PS D:\gemini> node --version  
v25.2.1

我的 Node 是利用 Scoop 安裝 Node 的, 可管理多版本的 Node, 參考 : 


這樣就可以在 PS 視窗安裝 OpenSpec 了 : 

PS D:\gemini> npm -g install @fission-ai/openspec@latest   

added 74 packages in 34s

這樣就完成 OpenSpec 安裝了. 


3. 用 uv 建立專案目錄 & 加入版控 :

由於作業要求用 OpenSpe 做三次迭代, 我打算用 OpenSpec 來實作一個網頁計算器專案, 第一次迭代要實作基本的四則運算計算機, 第二次迭代添加次方與開根號功能; 第三次迭代則添加對數, 指數, 與三角函數. 

首先用 uv init 指令建立一個專案目錄 : 

PS D:\gemini> uv init calculator-project     
Initialized project `calculator-project` at `D:\gemini\calculator-project`

然後切換到專案目錄下 : 

PS D:\gemini> cd calculator-project     

對此專案進行版本控制, 先檢視 Git 是否已安裝 : 

PS D:\gemini\calculator-project> git --version   
git version 2.52.0.windows.1

關於 Git 安裝與用法參考 :


在專案目錄下用 git init 初始化版控 : 

PS D:\gemini\calculator-project> git init   
Reinitialized existing Git repository in D:/gemini/calculator-project/.git/

版控資訊會儲存在隱藏目錄 .git 底下. 


4. 初始化 OpenSpec :   

接著用 openspec init 指令為此專案做 OpenSpec 的初始化 :

PS D:\gemini\calculator-project> openspec init 

這時會出現 OpenSpec 歡迎畫面 :




按 Enter 會出現 AI 程式代理工具選單, 可以按上下鍵移動指標來選擇要用的 AI 工具, 按 Space 鍵選擇要使用的代理工具 (可複選, 目前已支援 28 種 AI 程式代理工具), 此處我只選 Gemini CLI :




選定的工具名稱會被列在上方的 Selected : 後面




選完後按 Enter 退出 OpenSpec 初始化畫面回到 PS 終端機, 可見已為 Gemini CLI 程式代理建立了 4 個技能 (skills) 與 OpenSpeck 相關之命令 :

Note: OpenSpec collects anonymous usage stats. Opt out: OPENSPEC_TELEMETRY=0
√ Select tools to set up (28 available) Gemini CLI
▌ OpenSpec structure created
√ Setup complete for Gemini CLI

OpenSpec Setup Complete

Created: Gemini CLI
4 skills and 4 commands in .gemini/
Config: openspec/config.yaml (schema: spec-driven)

Getting started:
  Start your first change: /opsx:propose "your idea"

Learn more: https://github.com/Fission-AI/OpenSpec
Feedback:   https://github.com/Fission-AI/OpenSpec/issues

Restart your IDE for slash commands to take effect.

做完上面初始化後, 用 tree /f 指令檢視專案目錄 :

PS D:\gemini\calculator-project> tree /f   
列出磁碟區 新增磁碟區 的資料夾 PATH
磁碟區序號為 1258-16B8
D:.
│  .gitignore
│  .python-version
│  main.py
│  pyproject.toml
│  README.md
├─.gemini
│  ├─commands
│  │  └─opsx
│  │          apply.toml
│  │          archive.toml
│  │          explore.toml
│  │          propose.toml
│  │
│  └─skills
│      ├─openspec-apply-change
│      │      SKILL.md
│      │
│      ├─openspec-archive-change
│      │      SKILL.md
│      │
│      ├─openspec-explore
│      │      SKILL.md
│      │
│      └─openspec-propose
│              SKILL.md
└─openspec
    │  config.yaml
    │
    ├─changes
    │  └─archive
    └─specs

可見 OpenSec 初始化時已在


5. 安裝專案所需套件 :   

雖然對一個計算器專案來說, 只需要純前端 (HTML/CSS/JavaScript) 技術就能完成所有功能, 但為了模擬真實軟體架構常見的前後端搭配組態, 我打算將計算功能邏輯交給後端 Flask 框架來完成, 所以必須先用 uv 工具安裝 Flask, 這樣當 AI 生成程式碼後就可以叫 Gemini CLI  用 uv run 執行專案與驗證結果, 不需要再跳出來處理環境問題. 其次, 在使用 /opsx:verify 進行自動化檢查或測試時, 系統會依賴現有的虛擬環境, 如果環境未就緒 (例如缺少 Flask 套件), 驗證步驟可能會出錯. 

PS D:\gemini\calculator-project> uv add flask   
Using CPython 3.12.1 interpreter at: C:\Users\tony1\AppData\Local\Programs\Python\Python312\python.exe
Creating virtual environment at: .venv
Resolved 9 packages in 758ms
Prepared 7 packages in 466ms
░░░░░░░░░░░░░░░░░░░░ [0/8] Installing wheels...                                                                         warning: Failed to hardlink files; falling back to full copy. This may lead to degraded performance.
         If the cache and target directories are on different filesystems, hardlinking may not be supported.
         If this is intentional, set `export UV_LINK_MODE=copy` or use `--link-mode=copy` to suppress this warning.
Installed 8 packages in 98ms
 + blinker==1.9.0
 + click==8.3.3
 + colorama==0.4.6
 + flask==3.1.3
 + itsdangerous==2.2.0
 + jinja2==3.1.6
 + markupsafe==3.0.3
 + werkzeug==3.1.8

安裝完後用 tree /f 檢視專案目錄, 會多出一個 .venv 隱藏子目錄, 裡面有包含 Flask 與所依賴的 Jinjia 等套件 :

├─.venv
│  │  .gitignore
│  │  .lock
│  │  CACHEDIR.TAG
│  │  pyvenv.cfg
│  │
│  ├─Lib
│  │  └─site-packages
│  │      │  _virtualenv.pth
│  │      │  _virtualenv.py
│  │      │
│  │      ├─blinker
│  │      │      base.py
│  │      │      py.typed
│  │      │      _utilities.py
│  │      │      __init__.py

... (略) ...

│  │      ├─flask
│  │      │  │  app.py
│  │      │  │  blueprints.py
│  │      │  │  cli.py
│  │      │  │  config.py
│  │      │  │  ctx.py
│  │      │  │  debughelpers.py
│  │      │  │  globals.py
│  │      │  │  helpers.py
│  │      │  │  logging.py
│  │      │  │  py.typed
│  │      │  │  sessions.py
│  │      │  │  signals.py
│  │      │  │  templating.py
│  │      │  │  testing.py
│  │      │  │  typing.py
│  │      │  │  views.py
│  │      │  │  wrappers.py
│  │      │  │  __init__.py
│  │      │  │  __main__.py

... (略) ...


6. 編輯專案語境檔 GEMINI.md : 

在之前使用 Vibe coding 的進階方式開發時, 我們透過事先編輯好的專案語境檔 GEMINI.md 一次將專案需求與結構, 程式風格, 任務模板, 限制和偏好等資訊一口氣描述好, 當啟動 Gemini CLI 時它便能了解專案內容, 從而減少來回問答的次數. 這種語境檔因為要交待較多訊息, 所以內容比較冗長, 參考 :


如果使用 OpenSpec 做 SDD 開發, GEMINI.md 就會比較簡短, 例如下面的通用模板 :

# Project Global Guidelines (GEMINI.md)

## 1. AI 角色設定 (通用)
你是一位資深的 [Python 後端與全端] 開發專家,精通 [Flask 框架與現代前端技術],並具備極高的軟體工程素養。

## 2. 技術棧與環境配置 (專案特製)
* 核心語言:Python 3.12+ (嚴格使用 `uv` 進行依賴與環境管理)
* 後端框架:[Flask]
* 前端技術:[Vanilla JS, HTML5, CSS3]
* 其他工具:[若無則免,例如 SQLite, 特定硬體 SDK 等]

## 3. 開發流程與規格遵循 (通用,針對 OpenSpec 用戶)
* 本專案嚴格遵循 Fission AI 的 OpenSpec 工作流 (`/opsx` 指令集)。
* 你的所有實作必須以 `specs/` 目錄下的文件與 `tasks.md` 為「唯一真相來源 (Single Source of Truth)」。
* 絕對禁止在未經使用者同意且未更新 Spec 的情況下,自行發明、擴充或竄改 API 規格與業務邏輯。

## 4. 程式碼風格守則 (通用,Python 標準)
* 必須包含 Type Hints (型別提示) 與清楚的 Docstrings。
* 遵守 PEP 8 命名規範 (變數與函式使用 `snake_case`,類別使用 `PascalCase`)。
* 保持模組化,避免單一檔案過於龐大。

其中專案特製部分視專案而異, 括號 [] 內容需要手動修改, 其他通用部分則適用於任何用 OpenSpec 開發的專案. GEMINI.md 的角色是專案的憲法, 負責告訴 AI 我們這個專案要用甚麼 approach 來做 (How), 而專案的需求 (what) 會放在 /opsx: propose 指令來交待.  

在 PS 視窗的專案目錄下輸入 notepad GEMINI.md :

PS D:\gemini\calculator-project> notepad GEMINI.md  

這時 PS 發現專案目錄下並無 GEMINI.md 檔, 就彈出詢問是否新建此檔, 按是就會開啟記事本 :




複製上面的語境檔通用範本貼到 GEMINI.md 後存檔 (此處我將 ## 2 的其他工具內容改為 [無]) : 




再次用 tree /s 檢視專案目錄下已有此 GEMINI.md 檔了 :

PS D:\gemini\calculator-project> tree /f   
列出磁碟區 新增磁碟區 的資料夾 PATH
磁碟區序號為 1258-16B8
D:.
│  .gitignore
│  .python-version
│  GEMINI.md
│  main.py
│  pyproject.toml
│  README.md
│  uv.lock
├─.gemini
│  ├─commands
│  │  └─opsx
│  │          apply.toml
│  │          archive.toml
│  │          explore.toml
│  │          propose.toml
│  │
│  └─skills
... (略) ...


7. 啟動 Gemini CLI 進行初次迭代  : 

完成上面準備工作後, 終於要開啟 Gemini CLI 開始用 OpenSpec 幹活了. 在專案目錄下輸入 gemini 指令 : 

PS D:\gemini\calculator-project> gemini    

詢問是否信任此目錄, 當然要選 1. Trust folder (calculator-project) 才會進入 Gemini CLI 介面 :





出現 > 提示號表示 AI 已經讀取了 GEMINI.md 內容知道自己是誰, 也知道這個資料夾裡有 OpenSpec 環境, 這樣就可以開始用 OpenSpec 的 斜線指令集 /opsx 進行 SDD 開發了. 

如上所述, 這個專案作業要求至少進行三次開發迭代, 第一次迭代是要做出一個基本的四則運算計算器, 由於較簡單, 此處會使用快轉模式, 直接用 /opsx: ff 指令一鍵生成完成專案規劃與程式碼生成與測試, 整個工作流只需要的指令如下 (依序) :
  • /opsx:new <iteration_name> (建立迭代之專屬的工作區)
  • /opsx:ff <requirements> (依需求快轉生成設計文件與程式碼並完成測試)
  • /opsx:archive (迭代完成歸檔)
其中 iteration_name 是自訂的, 為了專案的易讀性以及讓 AI 能隱約猜到任務方向, 通常會遵循以下命名最佳實踐來取名 :
  • 使用 Kebab-case (連字號命名法) :
    全小寫英文, 單字之間用連字號 - 隔開, 避免使用空格, 大寫或特殊符號. 
  • 具備語意 (Semantic) : 名稱要能直接反映這次迭代的核心目的.
初次迭代我選用 cals-basic 作為工作區名稱. 


(1). 建立迭代之專屬工作區 : 

這會在專案目錄下建立此次迭代之專屬工作區, 例如迭代名稱是 calc-basic 的話就建立對應的資料夾 specs/changes/calc-basic/ 來收納這次迭代的所有相關討論與設計文件. 

系統會自動生成標準 SDD 流程所需的空文件或帶有基礎標題的模板, 例如空的 proposal.md, spec.md, design.md 以及 tasks.md, 此階段相當於是買了一本有分類索引標籤 (提案, 規格, 設計, 任務) 的空白筆記本, 以便在後續工作流中依需求來填空或修改. 

輸入下列指令並於一連串授權詢問時一律選擇預設的 Allow once :

/opsx:new calc-basic  



... (略) ...



工作區建完後, 專案所需的 OpenSpec 模板文件也都已建好, 但它們目前只是空洞的骨架而已, 接下來的工作流 (/opsx:ff 或 /opsx:continue) 就會根據需求來填寫這些標準 SSD 流程的四份核心文件模板 (proposal.md, spec.md, design.md 以及 tasks.md), 如果需求較複雜, 可能也會生成額外的 spec-xxx.md 文件, 相當於是在骨架中進行靈魂注入. 


(2). 依需求快轉 (ff) 生成設計文件與程式碼 : 

此階段 OpenSpec 會根據我們提供的專案需求, 透過 AI 去修改或填空上一個指令 (/opsx: new) 生出的四份核心文件 proposal.md (提案), spec.md (介面規格), design.md (架構設計) 與 tasks.md (任務清單), 並且據此生成程式碼同時完成測試, 可說是集成了 /opsx:propose, /opsx:continue, /opsx: apply, 以及 /opsx: verify 這四個指令的功能於一身, 一氣呵成完成專案實作. 

輸入如下指令來進行快轉 : 

> /opsx:ff "請幫我規劃一個基礎四則運算計算機軟體, 後端使用 Flask 提供 POST API, 前端使用純 HTML/JS, 並提供基本的使用者介面."   



... (略) ...



同樣地, 在它修改生成檔案與依此生成整個專案程式碼過程中會不斷要求授權, 我都選預設的 Allow once, 這樣可以一步步觀察 OpenSpec 做了哪些事, 過程中會顯示生成的程式碼與單元測試檔, 完成後結果如下 :  




這時可以另開一個命令提示字元或 PS 視窗, 切到專案目錄下, 用 python main.py 或 uv run main.py 執行此專案, 然後開啟瀏覽器訪問 http://127.0.0.1:5000 : 

PS D:\gemini> cd calculator-project   
PS D:\gemini\calculator-project> uv run main.py
 * Serving Flask app 'main'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 125-928-819
127.0.0.1 - - [25/Apr/2026 16:44:54] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2026 16:44:54] "GET /static/style.css HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2026 16:44:54] "GET /static/script.js HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2026 16:44:54] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [25/Apr/2026 16:45:11] "POST /api/multiply HTTP/1.1" 200 -
127.0.0.1 - - [25/Apr/2026 16:45:23] "POST /api/divide HTTP/1.1" 400 -

果然顯示了四則運算計算器頁面, 測試計算功能正常 (7 * 8=56, 1 除以 0 顯示 Error ) :





(3). 歸檔結案 : 

完成以上功能驗證後, 就可以用 /opsx: archive 指令檢查所有的 Artifacts 是否齊全, 是的話將此次迭代的所有紀錄, 文件, 與過程收整, 並移動到 archive 資料夾收存 :

> /opsx:archive

同樣地會有一連串的授權請求, 一律選擇預設的 Allow once : 




... (略) ...




可見所有此次迭代的紀錄文件都已歸檔於 openspec/changes/archive/2026-04-25-calc-basic/ 資料夾底下, 這些都是未來維護軟體的重要資料. 好啦! 終於完成初次迭代. 

2026年4月23日 星期四

Python 學習筆記 : 市圖借書與預約爬蟲程式架構

這兩天完成市圖爬蟲改版 (v13), 由於此爬蟲機制較複雜, 由地端與雲端程式共同運作來維護佈署於 Render 的 Serverless 平台上的資料庫 (kmsl_books 資料表), 這與 v10 版之前的系統完全由地端爬蟲程式一手包辦爬取與傳訊完全不同. 爬蟲任務主要由放在高雄家的樹莓派主機負責, 目前主要是市圖借書與預約狀況與母校圖書館自動續借兩個任務而已, 今天抽空畫了一張架構圖以資備忘. 

Pi 3B 對接 render.com 上的 5e6i 這個端點 : 




Pi 3A+  則對接 render.com 上的 fdof 這個端點 :




佈署於樹莓派上的市圖爬蟲程式 ksml_lib_13.py 負責每小時爬取網頁擷取借書與預約狀態後, 呼叫佈署於 render.com 的 serverless 平台函式 update_ksml_books.py, 將資訊儲存在 kmsl_books 資料表裡, 結果如下 :




另外一支本地程式 get_books_messages.py 透過 crontab 驅動定時呼叫 serverless 平台函式 send_books_messages.py 讀取 kmsl_books 資料表, 然後由發送到 Telegram, 參考最近三版異動 :


母校圖書館爬蟲 nkust_lib_11.py 的任務相對簡單, 只是登入網站後按全部續借鈕, 然後瀏覽借書頁面, 擷取已被預約的書目後用 Telegram 傳送通知訊息而已, 參考 :


至於 Pi 400 上佈署的爬蟲與 Pi 3B 的相同 (對接 5e6i), 但正常情況會關掉 crontab 內的 ksml_lib_13.py (不執行), 僅執行 get_books_messages.py 與 nkust_lib_11.py, 若 Pi 3 主機出問題再開啟 Pi 400 的市圖爬蟲. 

2026年4月21日 星期二

沖繩之旅行程規劃 : 5/5~5/8

年初時原本打算入春後帶爸坐郵輪遊沖繩, 但想到上回搭麗星郵輪去香港 (原本是石垣島+沖繩, 因颱風改走香港) 的經驗, 在海上時無法上網形同斷訊, 在船上日吃五餐會變胖, 於是打消了遊輪計畫, 改為搭飛機自助遊, 原本想說嘗試在沖繩自駕, 但又對右駕系統沒自信能駕馭, 那就包車吧! 我跟水某與菁菁加上爸四個人包一台車即可, 不過後來加入岳父母, 小姨子, 與剛高中畢業的外甥, 團員來到 8 人, 所以必須包 10 人座的小巴啦 (Toyota Hiace)!

今天用 Gemini 規劃這四天三夜親子沖繩旅遊行程如下 : 

Day 1 : 5/5 (週一) 抵達那霸入住國際通嘉新酒店

 時間軸  行程說明
 15:55 - 18:45  搭乘華航 CI132 抵達那霸機場,可預約 10人座單程接機直達飯店。
 20:30 -   Check-in國際通嘉新酒店。
 21:00 -   晚餐 + 散步: 踩點國際通。


PS :
  • 晚餐請包車業者沖繩行腳代訂島唄與地料理 Tubaraama 餐廳 21:00 用餐. 

Day 2 : 5/6 (週二) 北部遠征(水族館+古宇利島)

 時間軸 行程說明
 09:00 -  出發 (建議包車 10 小時): 往返北部車程長,包車可在車上補眠。
 11:00 -  古宇利島: 欣賞跨海大橋美景,推薦搭乘古宇利海洋塔的電動導覽車。
 13:00 -  午餐: 北部景觀餐廳(如:百年古家大家)。
 15:00 -  沖繩美麗海水族館: 觀看黑潮之海大水槽與鯨鯊。
 19:00 -  返回那霸晚餐。


Day 3 : 5/7 (週三) 景觀與購物(瀨長島+永旺來客夢)

 時間軸  行程說明
 09:00 -   出發 (包車 10 小時,今天景點較多且分散,包車最省體力。)
 09:40 -   知念岬公園: 欣賞 270 度無敵海景,這裡步道平緩,長輩看海非常舒心。
 11:30 -   瀨長島 Umikaji Terrace: 午餐推薦幸福鬆餅/天使鬆餅 Happy Pancake。
 14:30 -   美國村: 異國風情街區散步,拍拍彩色房子。
 16:30 -   永旺來客夢 (AEON Mall Rycom):直衝寶可夢中心,晚餐: 永旺美食街
 20:00 -   返回國際通: 回飯店後可進行最後採買。


Day 4 : 5/8 (週四) 神社祈福・悠閒歸途

 時間軸  行程說明
 09:00 -   波上宮: 到琉球第一神社祈福。
 12:00 -   午餐: 國際通周邊(如:第一牧志公設市場吃海鮮或道地阿古豬)。
 15:30 -   啟程前往機場: 長輩搭計程車,其他往縣廳站坐單軌 (13-16 分鐘)。
 18:30 - 19:15  搭乘華航 CI2133 返回高雄小港。


💡 行程建議:
  • 知念岬 vs 美國村:
    知念岬在東南角,美國村與永旺在中部。這天行程景點多,需要 10 人座包車接送。
  • 關於「天使鬆餅」:
    瀨長島的幸福鬆餅(Happy Pancake)極熱門,建議事先網路預約,否則現場排隊會很久。
  • 寶可夢中心:
    永旺來客夢的寶可夢中心很大可以慢慢逛,長輩可以帶到商場中間的大型水族箱區坐著休息。

💡 關於美麗海水族館 : 
  • 黑潮之海 (The Kuroshio Sea):
    這是水族館的靈魂。巨大的壓克力水槽中,數隻巨大的鯨鯊與鬼蝠魟在藍色海水中緩緩游動。
  • 海豚秀 (Okichan Theater):
    位於水族館主體建築外的海邊。看表演時可以吹海風、看海景。提醒:海豚表演場地離水族館出口有一小段路,建議推輪椅前往較輕鬆。
  • 觸摸池:
    可以嘗試觸摸海星和海參,是很有趣的互動。
  • 水族館的「鯨鯊餵食秀」:
    通常在下午 15:00 和 17:00 各有一場。鯨鯊會直立起來進食,非常震撼,建議將行程調整在下午抵達,看完餵食秀再離開。
  • 輪椅借用:
    美麗海水族館的入口處提供免費輪椅借用。即便長輩平時行走自如,但水族館園區很大,強烈建議借一台預備,當長輩逛到一半疲累時可以推著他們走,確保行程愉快不掃興。
  • 避開正午陽光:
    5 月的沖繩陽光已很強。建議中午在古宇利島附近的景觀餐廳用餐(吹冷氣看海),下午最熱的時候留在水族館室內,這對長輩的體力保持最有幫助。



💡 古宇利島 (Kouri Island) :

古宇利島被稱為「神之島」或「戀之島」,從本島開車經過古宇利大橋 時,兩側的翡翠綠海色被譽為「古宇利藍」,是沖繩最美的公路景觀之一。
  • 古宇利大橋:
    長約 2 公里。建議請包車司機在過橋時放慢車速,這段路不用走路,坐在車內就能欣賞絕佳海景。
  • 古宇利海洋塔 (Kouri Ocean Tower):
    這裡有自動駕駛的無人導覽小車,會載著全家人緩緩繞行山坡抵達塔頂。沿途會播放語音介紹,並能從高處俯瞰整座大橋,風景極其壯觀。
  • 心形岩 (Heart Rock):
    這位於島的另一端海灘。注意:前往沙灘的路徑較不平坦且多沙,長輩可在車上休息或在岸邊咖啡廳喝茶看海。



💡知念岬公園 (Cape Chinen Park) :

位於沖繩本島東南部的南城市,是一個非常純粹、能讓人感受到大自然震撼的美麗景點。沿著公園的紅色扶手步道往下走一點點,可以拍到步道延伸進大海的感覺。建議停留 30 到 45 分鐘。這裡適合安靜地看海,當作早上的第一個景點,呼吸一下新鮮空氣。知念岬的風有時會比較大,即便 5 月天氣轉熱,建議帶件輕薄的防風外套。
  • 270 度的無敵海景 :
    知念岬三面環海,視野極其開闊。從展望台望出去,可以看到湛藍的太平洋(天氣好時呈現漸層的藍色),還能遠眺被琉球人視為聖島的「久高島」。這裡與其他懸崖景點不同,從停車場到主要的景觀台和草地步道都非常平緩,推輪椅或讓長輩慢慢散步都非常輕鬆。即使長輩不想走太遠,只要下車站在入口附近的涼亭,就能看到極佳的海景,不需要長途跋涉。
  • 滑翔傘愛好者的天堂 :
    這裡因為地形關係,常能看到彩色滑翔傘在空中飛翔,看著滑翔傘配上背景的海景,拍照也非常漂亮。
  • 緊鄰「齋場御嶽」:
    知念岬公園就在琉球王國第一聖地「齋場御嶽」附近(走路約 5-10 分鐘)。對文化感興趣,可以順便去走走;但要注意「齋場御嶽」內有很多崎嶇的石頭路,對長輩來說比較吃力,建議留在知念岬公園看海、吹風即可。



💡瀨長島 :

瀨長島位於那霸機場南端,從那霸市區(嘉新酒店)往南開到瀨長島只要約 20 分鐘,接著再往北去美國村和永旺來客夢百貨,動線非常順。雖然它是一座島,但開車過橋只需要 1 分鐘,完全沒有「搭船」的負擔。因為離機場極近,這裡是看飛機起降的絕佳地點。瀨長島的白色建築是依山坡而建,樓梯較多。建議包車司機直接載到最上層放人,由上往下逛會輕鬆很多。
  • Umikaji Terrace (瀨長島陽台) :
    這是像希臘聖托里尼一樣的純白色建築群,有非常多靠海的露天咖啡廳,可以坐在遮陽傘下吹著海風、看著藍色海洋和飛機。不需要爬高爬低,非常放鬆。也有很多文創小店和網美下午茶店(例如幸福鬆餅),非常適合拍照打卡。
  • 足湯體驗:
    島上有免費的足湯(靠近琉球溫泉瀨長島飯店),如果走累了,在那裡泡腳看飛機也是一種享受。

💡美國村(American Village):

位於沖繩本島中部的北谷町,是一個將美式西海岸風情與沖繩海島氛圍完美融合的綜合型景區。這裡曾經是美軍基地,後來改建為商圈,是沖繩最具異國風情的地方,非常適合下午短暫停留。美國村範圍很大,建議請包車司機載到最靠近海邊的 「Depot Island Seaside」 區下車。那裡是最精華、色彩最鮮艷的區域 (寶可夢迷會發現建築的牆面上隱藏了很多「皮卡丘」彩繪),也是步道起點,從那裡沿著海岸步道往南逛,走到落日海灘 (Sunset Beach) 大約只需 10-15 分鐘,那裡有一間 Aeon 北谷店(超市),可以買點當地零食或飲料,司機可以約在 Aeon 門口接。美國村離永旺來客夢百貨(AEON Mall Rycom)車程只需約 15-20 分鐘,建議下午在美國村拍照散步,傍晚再前往永旺吃晚餐與購物。
  • 獨特的建築與視覺(拍照聖地):
    這裡的建築色彩鮮艷,牆面充滿了各種美式風格的塗鴉與裝飾,隨處都能拍出極具風格的照片。
  • 海濱步道:
    美國村緊鄰著北谷公園的落日海灘。這裡有一條非常平緩的海濱步道,可以一邊吹著海風,一邊散步看海,完全沒有階梯負擔。
  • 美式潮流文創 :
    這裡有很多美式古著店、潮流服飾以及好拍的文創商店。此外,這裡也常能看到大型的模型或獨特的車輛裝飾。也有非常多舒適的戶外咖啡廳(如著名的 Pokébowls 或 ZHYVAGO COFFEE),走累了可以坐在靠海的位子看著來往的各國遊客與美軍家庭,也是一種很不一樣的觀察體驗。
  • 落日夕陽:
    美國村的夕陽是全沖繩前三名的美景。在傍晚時分坐在岸邊看夕陽是非常浪漫的。傍晚在 Depot Island 的紅磚區有時會有街頭魔術表演。





💡永旺來客夢 (AEON Mall Rycom) : 

永旺夢樂城來客夢(AEON Mall Okinawa Rycom)是沖繩規模最大、設施最完善的購物中心,對您的家庭成員來說,這裡不僅是購物點,更是一個全齡化的休閒空間。從美國村到永旺來客夢約 20 分鐘車程. 
  • 震撼的入口大水族箱(Rycom Aquarium):
    一進大門,一樓大廳就有一個巨大的水族箱。雖然比不上美麗海水族館,但裡面有近千條色彩繽紛的熱帶魚和小型鯊魚。
  • 寶可夢中心 (Pokémon Center):
    位於四樓,是沖繩唯一的官方專賣店,有許多沖繩限定(如穿著花襯衫的皮卡丘)的商品。
  • 潮流品牌:
    這裡聚集了 Uniqlo, GU, H&M, Old Navy 等各大品牌,還有日本當地的文創小物,非常適合年輕人。
  • AEON Style:
    二樓有大型超市和藥妝區,可以在這裡一次買齊要帶回台灣的沖繩零食、泡麵或是藥妝,不用在國際通辛苦提貨。
  • Rycom Sky Diner :
    五樓有非常多美食餐廳,從傳統琉球料理、日式豬排、壽司到美式牛排都有。五樓的戶外露台可以俯瞰中部的海景。如果天氣好,在這裡吃午餐或晚餐視野極佳。
  • 美食街:
    三樓、四樓的美食廣場設有寬敞的無障礙座位區。




💡包車資訊 : 

5/6 與 5/7 日兩天需包車, 8 個人需 10 人座的車. 


先掃 LINE 官方帳號 QR 碼 :



然後簡述包車日期與行程概要, 請其報價 :

您好,我打算與親友去沖繩旅行,需要中文司機包車兩天,每天10小時,麻煩您報價,謝謝您。行程大致如下:
沖繩
1.乘客人數:8
2.行李件數:4
3.包車日期:5/6~5/7
4.行程規劃:5/6 古宇利島,水族館;5/7 知念岬公園,瀬長島,美國村,永旺來客夢
5.出發地點:國際通嘉新酒店
6.結束地點:國際通嘉新酒店