2026年1月27日 星期二

三星 Galaxy Tab 螢幕截圖方法

水某研究計畫結束後留下一台三星 Tab A7 Lite 平板, 之前常用來看電子書, 前陣子因為買 BOOX 閱讀器得知 HyRead 可借閱圖書館的電子書與雜誌, 於是也在平板上安裝, 看雜誌時為了做筆記需截圖, 但每次要同按電源+音量小鍵很麻煩, 上谷歌找到下面這篇 :


其中的 "三星手機截圖方法三、輔助快選截圖" : 

前往「設定」→「協助工具」→「互動與敏銳度」→開啟「輔助快選」功能

完成後桌面會出現一個圓形四小孔的常駐浮動按鈕, 按一下就會出現好幾個選項, 按其中的 "螢幕截圖" 就可以把圖抓下來, 再丟到 Dropbox 即可. 

PS :

這支平板記憶體為 3GB/32GB, 寬度比 iPd mini  小一些, 剛好一手可掌握, 握持手感最佳, 左上角有 SIM 卡槽, 插卡即可上網撥電話, 規格參考 :


蝦皮購買手機平板架x5 + 迷你掛錶x5

最近把水某給我的 iPad Mini 5 與三星 Tab A7 Lite 都找出來用, 主要是安裝 HyRead 後可從市圖借閱電子書與雜誌, 抵厚重的實體書好幾倍. 今天在看雜誌時發現應該買個桌上的平板支架, 這樣就可避免手痠了, 蝦皮一個才 24 元, 為了免運加買了掛錶 : 




裕誠智取店取付 230 元免運. 

Windows 安裝米家 App

鄉下老家目前裡裡外外裝了七支攝影機, 平常都用手機的米家 App 關注爸的安全動態, 今天上網搜尋是否有米家 App 的電腦版, 在 Mobile1 找到這篇 :


原來在小米官網就有提供下載網址 : 





但按右上角的 Download 會得到 404, 需往下拉到步驟說明 3 底下的下載按鈕才行 : 




解壓縮下載的 zip 檔會得到一個 XiaomiCameraViewerInstaller.exe 安裝檔, 點擊執行時把預設的簡體中文改為英文 : 




然後一直按 Next 預設安裝下去即可 : 






安裝完畢執行軟體會先要求登入小米帳號, 我是用手機號碼搭配 ak 密碼登入, 會發一個 email 到谷歌信箱, 輸入驗證碼後就會看到攝影機影像了, 可以選擇 4/6/9 分割顯示畫面 :




與手機米家 App 比起來亮度較暗, 且大門口兩支 CW300 攝影機未入列, Mobile1 底下有人提到似乎 1080p 以上的都讀不到, CW300 是 2.5K 超高解析度 (2560x1440), 小米攝影機 2k 標準版都可以讀到. 

按每支攝影機右下角的照相按鈕可以手動拍照, 預設會將 jpg 檔存在桌面, 可以按右上角的帳號頭像點選 Mahage File 更改儲存位置 (例如建一個 D:\XiaomiCamera 來存圖片) : 





婷婷表妹上周為了處理小舅媽攬的外務 (幫市場阿桑解決手機監控攤位問題) 要買一支小米攝影機, 我順便叫她幫我買兩支 C201, 下標後阿桑說不用了, 我叫婷婷三支都給我 (1597 元), 本周來安裝在車庫, 祖堂, 與庫房. 

2026年1月26日 星期一

2026 年第 4 周記事

轉眼 2026 已走過近一個月, 再過三周就是春節啦! 周日下午有一位在附近田裡工作的伯母來問今年要不要年糕, 每年爸似乎都有跟她訂, 我說那就繼續好了. 

周六姊姊回高雄要跟同學商談下周去沖繩旅行的行程, 二哥則是 1/26 與 1/27 要去成大上 IC 設計課程, 因姐姐有王品禮券, 訂了周六晚上七點中正路王品聚餐, 但她出發時忘記把禮券帶回來, 上了高鐵才發現, 菁菁只好改定至聖路上的知名披薩店波士多 (很多外國人) : 





這個周末因為在推進 Gemini CLI 的學習, 所以老家的整理工作停滯, 但至少把浴室外牆掉落的小太陽能板重新固定 (難怪最近浴室感應燈不亮) 並且將螺絲等上油防鏽. 另外也清理了豬舍前的監控木箱與廁所上方被胡瓜頁遮住的 10W 太陽能板, 等我 Gemini CLI 上手, 用 Vibe coding 流程來完成 IoT 專案. 

周日又去了一趟種子行, 想買九層塔與朝天椒苗, 老闆說九層塔缺貨, 只買了四株朝天椒, 一株種鄉下, 三株帶來高雄種陽台. 原本在菜園到處長的草莓最近快絕跡了, 我打算在曬衣場的牆邊搭角鐵架用盆栽來種 (自動灑水), 這樣就不怕蝸牛來吃. 

下周待辦事項 :
  • 豬舍廁所馬桶蓋換新
  • 修理餐廳後面廁所漏水問題
  • 車庫採光板安裝
  • 小蟻攝影機重設
總之, 要趁年前三周大清理才行. 

2026年1月25日 星期日

蝦皮購買插卡手錶 DW100 Pro+ (黑色 3GB + 32GB)

這兩天做了一些插卡手錶市調, 最終選擇蝦皮賣家數碼盟主 (cutefoodiexinwei) 販售的這支 DW100pro+ 3GB/32GB 黑色款, 主要是透過與賣家溝通, 確定此錶為外貿版 (即國際版), 有內建 GPS 晶片與完整 Google 軟體, 電池為市場主流的 800 mAh, 雖不是大電池款, 但因為是要給爸方便聯絡與 Google 地圖定位追蹤之用, 主要是接電話, 應該不需要每天充電. 賣家做活動有送五項品至今天下午五點 : 






扣掉蝦皮折價券 20 元實付 2668 元, 裕誠至取店取付. 下周去遠傳門市買一張月付 149 元的兒童用 SIM 卡給爸使用. 


2026年1月24日 星期六

Gemini CLI 學習筆記 : 郵遞區號查詢小幫手專案 (二)

在前一篇測試中, 我們利用提示詞讓 Gemini CLI 生成程式碼, 正確地透過 API 取得給定地址的郵遞區號, 但是生成的程式是手動另開 DOS 或 PS 視窗執行的, 其實也可以叫 Gemini CLI 幫我們測試, 它會幫我們尋找本機的 Python 環境來執行, 本篇旨在接續先前靠一張嘴寫程式的方法, 叫 AI 測試它自己寫的程式. 

本系列之前的測試文章參考 : 


PS D:\gemini> cd postal-helper-proj1   
PS D:\gemini\postal-helper-proj1> gemini   

然後輸入 /res 或 /resume 恢復之前的對話, Gemini CLI 會找出之前的 session 列表, 可以上下移動選擇要恢復的對話後按 Enter (此處只有編號 1 的對話) :




輸入 : 

> 請幫我測試程式是否正確

Gemini CLI 這次找了一個台中的地址, 執行結果為找不到, 所以它寫了一個 test_api.py 的測試程式, 要求儲存程式檔 :




接著要求執行測試程式 test_api.py : 




測試程式執行時出現錯誤, 它會自行檢查原因與修正, 它發現需修改 postal-helper.py 原始碼, 要求授權 : 




接著修正測試程式 test_api.py : 




執行結果程式已正常, 但查詢台灣大道 99 號結果仍然找不到, 可能是地址有改, 它打算換別的地址測試來測試 : 




改用中港路二段99號就順利傳回郵遞區號了 :




以上的 Gemini CLI 測試中都是使用系統 Python 來執行程式, 如果 Gemini CLI 找不到 Python 執行環境就會出現錯誤. 目前最新的 Python 版本管理工具是 uv 工具, 它整合了 Python 版本, 套件安裝, 以及虛擬環境管理於一體, 使用上比傳統 pip + venv 方便許多, 參考 :


接下來輸入 "我使用 uv 工具" 提示詞看看 Gemini CLI 如何利用 uv 來執行測試, 首先它會初始化 uv 專案, 建立專案描述檔 pyproject.toml :




接著它會編輯 pyproject.toml, 加入腳本定義, 以便能用 uv run 來執行腳本 :




接下來它要求授權修改 postal-helper.py 腳本 : 




程式已改好, 要求授權用 uv run 執行腳本, 傳入地址參數為台北市信義區市府路 1 號 : 





uv run 指令執行成功, 取得正確 6 碼郵遞區號 110204 : 




最後, 我把 Gemini CLI 修改過的 postal-helper.py 抄錄如下 :

import sys
import json
import urllib.parse
import urllib.request
import io

# 確保在 Windows 上輸出為 UTF-8
if sys.platform == "win32" and isinstance(sys.stdout, io.TextIOWrapper) and sys.stdout.encoding != 'utf-8':
    try:
        sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
        sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
    except (AttributeError, io.UnsupportedOperation):
        pass

def get_postal_code(address):
    base_url = "https://zip5.5432.tw/zip5json.py"
    params = {'adrs': address}
    # Ensure the URL is correctly encoded
    url = f"{base_url}?{urllib.parse.urlencode(params)}"
    
    try:
        # User requested 6-digit postal code
        print(f"正在查詢地址: {address} ...")
        
        req = urllib.request.Request(url)
        # Some APIs require a User-Agent
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) PostalHelper/1.0')
        
        with urllib.request.urlopen(req) as response:
            if response.status != 200:
                print(f"錯誤: API 返回狀態碼 {response.status}")
                return

            data = response.read()
            try:
                result = json.loads(data)
            except json.JSONDecodeError:
                print("錯誤: 無法解析 JSON 回應。")
                print(f"回應內容: {data.decode('utf-8', errors='ignore')}")
                return
            
            # The API returns 'zipcode6' for the 6-digit code.
            # Sometimes it might return an empty string or null if not found.
            zip6 = result.get('zipcode6')
            
            if zip6:
                print("-" * 30)
                print(f"地址: {result.get('address', address)}")
                print(f"6碼郵遞區號: {zip6}")
                print("-" * 30)
            else:
                print("找不到該地址的 6 碼郵遞區號。")
                # Show full result just in case useful info is elsewhere
                if 'error' in result:
                    print(f"API 錯誤: {result['error']}")

    except urllib.error.URLError as e:
        print(f"網絡錯誤: {e}")
    except Exception as e:
        print(f"發生未預期的錯誤: {e}")

def main():
    if len(sys.argv) > 1:
        # Join arguments to handle addresses with spaces if not quoted
        address_input = " ".join(sys.argv[1:])
        get_postal_code(address_input)
    else:
        # Interactive mode
        print("台灣 6 碼郵遞區號小幫手 (uv 版)")
        print("用法: uv run postal-helper <地址>")
        print("或在下方輸入地址 (按 Ctrl+C 離開):")
        while True:
            try:
                address_input = input("\n請輸入地址: ").strip()
                if not address_input:
                    continue
                get_postal_code(address_input)
            except KeyboardInterrupt:
                print("\n程式結束。")
                break
            except EOFError:
                break

if __name__ == "__main__":
    main()

Python 學習筆記 : 整合型 Python 版本管理工具 uv

上周胡嘉璽老師的 vibe coding 課堂介紹了uv, 這是比 venv + pip 更好用的新一代整合型 Python 套件與專案管理工具, 使用 Rust 開發故執行速度快. 因為後續 Gemini CLI 與 Claude Code 的學習測試會用到, 所以今天得空來安裝看看. 

uv 的主要功能如下:
  • 可輕鬆且快速地安裝不同的 Python 版本, 並能在這些版本之間進行切換. 
  • 可建立和管理虛擬環境, 以利在不同的專案中使用不同的 Python 版本和套件依賴. 
  • 簡單直觀的命令行介面方便執行版本管理和虛擬環境操作.
  • 可在 Windows, macOS 和 Linux 等系統上跨平台運行.
  • 可在 CI/CD 環境中與其他工具搭配支援自動化工作流程. 
參考官網與 GitHub 說明 : 


網路教學文章參考 : 



1. 安裝 uv :

在 Windows 安裝 uv 的第一個方法是開啟 Power Shell 視窗, 輸入下列指令安裝 :

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

如果已經安裝過軟體管理工具 scoop, 可以用 scoop install uv 來安裝 :

PS C:\Users\tony1> scoop install uv   
Updating Scoop...
Updating Buckets...
... (略) ...
Scoop was updated successfully!
Installing 'uv' (0.9.26) [64bit] from 'main' bucket
uv-x86_64-pc-windows-msvc.zip (21.0 MB) [=====================================================================] 100%
Checking hash of uv-x86_64-pc-windows-msvc.zip ... ok.
Extracting uv-x86_64-pc-windows-msvc.zip ... done.
Linking ~\scoop\apps\uv\current => ~\scoop\apps\uv\0.9.26
Creating shim for 'uv'.
Creating shim for 'uvx'.
Creating shim for 'uvw'.
Making C:\Users\tony1\scoop\shims\uvw.exe a GUI binary.
'uv' (0.9.26) was installed successfully!

安裝完可以用 uv --version 檢查版本 : 

PS C:\Users\tony1> uv --version   
uv 0.9.26 (ee4f00362 2026-01-15)

關於 scoop 安裝參考 :



2. 常用的 uv 指令 :

uv 是一個整合 Python 版本 + 套件 + 虛擬環境管理的工具, 常用指令如下表 : 


 常用 uv 指令  說明
 uv python list   列出本機已安裝及可供 uv 下載安裝的 Python 版本。
 uv python install <version>  下載並安裝指定的 Python 版本 (例如:uv python install 3.12)。
 uv python uninstall <version>  解除安裝指定的 Python 版本 (例如:uv python uninstall 3.12)。
 uv python find <version>  顯示指定的 Python 版本執行檔 python.exe 之安裝路徑。
 uv python dir  顯示 uv 用來存放所有下載安裝之 Python 版本的根目錄。
 uv python pin <version>  鎖定當前專案所使用的 Python 版本。
 uv init  初始化一個新的 Python 專案 (建立 pyproject.toml)。
 uv add <package>  新增套件依賴,並自動更新 lock 檔與環境。
 uv remove <package>  移除套件依賴。
 uv sync  根據 uv.lock 同步專案環境 (安裝/移除套件)。
 uv run <command>  在專案的虛擬環境中執行指令或腳本。
 uv venv  建立一個新的虛擬環境 (預設為 .venv)。
 uv pip install <package>  類似標準 pip install,用於低階套件安裝 (不建議使用)。
 uv tool install <tool>  安裝全域使用的 Python 工具 (如 ruff, black)。
 uv tree  顯示專案依賴關係的樹狀結構圖。
 uv self update  將 uv 更新至最新版本。


注意, 在 uv 專案中不建議使用 uv pip install 來安裝套件, 雖然不會汙染系統 Python (只要不加 --system 參數就很安全), 但不會更新 pyproject.toml, 會使專案依賴清單與實際環境不符. 


3. Python 版本管理 : 

uv python list 會列出目前本機已安裝以及網路上可下載安裝的 Python 版本 :

PS C:\Users\tony1> uv python list  
cpython-3.15.0a5-windows-x86_64-none                 <download available>
cpython-3.15.0a5+freethreaded-windows-x86_64-none    <download available>
cpython-3.14.2-windows-x86_64-none                   <download available>
cpython-3.14.2+freethreaded-windows-x86_64-none      <download available>
cpython-3.13.11-windows-x86_64-none                  <download available>
cpython-3.13.11+freethreaded-windows-x86_64-none     <download available>
cpython-3.12.12-windows-x86_64-none                  <download available>
cpython-3.12.1-windows-x86_64-none                   AppData\Local\Programs\Python\Python312\python.exe
cpython-3.11.14-windows-x86_64-none                  <download available>
cpython-3.10.19-windows-x86_64-none                  <download available>
cpython-3.9.25-windows-x86_64-none                   <download available>
cpython-3.8.20-windows-x86_64-none                   <download available>
pypy-3.11.13-windows-x86_64-none                     <download available>
pypy-3.10.16-windows-x86_64-none                     <download available>
pypy-3.9.19-windows-x86_64-none                      <download available>
pypy-3.8.16-windows-x86_64-none                      <download available>
graalpy-3.12.0-windows-x86_64-none                   <download available>
graalpy-3.11.0-windows-x86_64-none                   <download available>
graalpy-3.10.0-windows-x86_64-none                   <download available>

其中黃底部分即我的 LG Gram 筆電的系統 Python 3.12.1 環境, 其餘為可用 uv python install 下載安裝的版本. 可以在後面用 --only-installed 參數限制僅顯示已安裝的 Python 版本 : 

PS C:\Users\tony1> uv python list --only-installed   
cpython-3.12.1-windows-x86_64-none    AppData\Local\Programs\Python\Python312\python.exe

注意, 使用 uv python install 安裝指定版本的 Python 環境時, uv 會將此 Python 安裝到一個獨立的隔離目錄 (通常在 %LOCALAPPDATA%\uv\python\...), 而不是安裝到 Windows 的系統路徑中, uv 也不會把這個路徑加到系統 PATH 裡. 其次, 可以同時安裝多個 Python 版本, 例如 :

uv python install 3.13 3.10

解除安裝也是可以同時解除安裝多個 Python 版本. 


4. 用 uv run 執行 Python 腳本 : 

先在 PS 中用 notepad 指令啟動記事本, 編輯一個 show_version.py 腳本程式 :

PS C:\Users\tony1> notepad show_version.py   

輸入如下程式碼後存檔 : 

import sys
print(sys.version)

用 uv 安裝的 Python 版本其執行檔位置可用 uv python find 指令找到 :

PS C:\Users\tony1> uv python find 3.12  
C:\Users\tony1\AppData\Local\Programs\Python\Python312\python.exe

然後用此 python.exe 執行腳本 :

PS C:\Users\tony1> C:\Users\tony1\AppData\Local\Programs\Python\Python312\python.exe show_version.py   
3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)]

但不需要這麼麻煩, 用 uv run 指令即可執行 Python 程式 :

PS C:\Users\tony1> uv run show_version.py   
3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)]

因為我的筆電目前只有安裝 Python 3.12.1 而已, 所以 uv 會用系統 Python 來執行腳本. 如果用 uv 安裝多個 Python 版本, 則可在 uv run 後面以 --python 參數指定版本, 例如 : 

uv run --python 3.12 show_version.py

PS C:\Users\tony1> uv run --python 3.12 show_version.py   
3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)]


5. 用 uv init 建立 Python 專案 : 

uv 為了符合 Vibe Coding 的效率提供了兩種建立專案的方式, 第一種是用 mkdir 手動建立專案目錄後進入該目錄, 再用 uv init 指令建立專案檔案 :

mkdir <project_dir>
cd <project_dir>
uv init

例如 :

PS C:\Users\tony1> mkdir my_project

    目錄: C:\Users\tony1

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----       2026/1/24  上午 09:51                my_project

PS C:\Users\tony1> cd my_project   
PS C:\Users\tony1\my_project> uv init   
Initialized project `my-project`
PS C:\Users\tony1\my_project> dir  

    目錄: C:\Users\tony1\my_project

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----       2026/1/24  上午 09:51            109 .gitignore
-a----       2026/1/24  上午 09:51              5 .python-version
-a----       2026/1/24  上午 09:51             88 main.py
-a----       2026/1/24  上午 09:51            156 pyproject.toml
-a----       2026/1/24  上午 09:51              0 README.md

可見 uv init 會在專案資料夾下自動建立下面五個專案檔案 : 
  • pyproject.toml : 專案的核心設定檔 (紀錄依賴套件與專案資訊)
  • .python-version : 紀錄這個專案使用的 Python 版本
  • main.py : 專案主程式範例
  • .gitignore : Git 的忽略清單 (預設會把虛擬環境與快取忽略掉)
  • README.md : 專案的讀我說明文件
主程式 main.py 預設是一個顯示歡迎文字的簡單範例 :

PS C:\Users\tony1\my_project> cat main.py   
def main():
    print("Hello from my-project!")


if __name__ == "__main__":
    main()

可以用 uv run 執行看看 : 

PS C:\Users\tony1\my_project> uv run main.py   
Using CPython 3.12.1 interpreter at: C:\Users\tony1\AppData\Local\Programs\Python\Python312\python.exe
Creating virtual environment at: .venv
Hello from my-project!

也可以用 uv init 讓 uv 自動幫我們建立目錄與專案檔案 :

uv init <project_dir> 

或指定要用的 Python 版本 : 

uv init <project_dir> --python <version>

先用 rm 指令刪除上面手動建立的專案目錄 :

PS C:\Users\tony1> rm my_project -Recurse -Force  

用 uv init 建立專案目錄與檔案 : 

PS C:\Users\tony1> uv init my_project   
Initialized project `my-project` at `C:\Users\tony1\my_project`   
PS C:\Users\tony1> cd my_project  
PS C:\Users\tony1\my_project> dir   

    目錄: C:\Users\tony1\my_project

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----       2026/1/24  上午 10:06            109 .gitignore
-a----       2026/1/24  上午 10:06              5 .python-version
-a----       2026/1/24  上午 10:06             88 main.py
-a----       2026/1/24  上午 10:06            156 pyproject.toml
-a----       2026/1/24  上午 10:06              0 README.md

可見結果一樣. 

如果用 uv init 指令指定 Python 版本建立一個專案, 例如 :

uv init --python 3.13 

那麼在此專案目錄下可以用 uv run xxx.py 執行腳本, 這時就會用此專案的 Python 版本來執行腳本程式. 如果用 uv 安裝了多個版本, 則使用 uv run 指令時 uv 會按照下列順序由上而下依序尋找 python.exe 執行檔 :
  • 專案目錄下 .python-version 檔內設定的 Python 版本
  • 目前啟用的虛擬環境的 Python 版本
  • 專案目錄下 .venv 資料夾內設定的虛擬環境 Python 版本
  • uv 自己安裝的 Python 版本
  • 系統環境變數設定的 Python 版本
可見 .python-version 檔紀錄的 Python 版本是最優先的. 

PS C:\Users\tony1\my_project> cat .python-version      
3.12


6. 用 uv add 安裝套件 :   

先用 uv tree 來檢視專案目錄下的套件依賴關係 :

PS C:\Users\tony1\my_project> uv tree   
Using CPython 3.12.1 interpreter at: C:\Users\tony1\AppData\Local\Programs\Python\Python312\python.exe
Resolved 1 package in 5ms
my-project v0.1.0

由於目前還沒有在專案中安裝套件, 專案內還沒有虛擬環境 (.venv 子目錄不存在), 所以直接讀取了全域安裝 (System Global) 的系統 Python 3.12. 

在 uv 建立的 Python 專案下, 要使用 uv add 來安裝套件, uv 會自動建立一個虛擬環境子目錄 .venv 來放套件與其依賴套件, 例如 :

PS C:\Users\tony1\my_project> uv add requests   
Using CPython 3.12.1 interpreter at: C:\Users\tony1\AppData\Local\Programs\Python\Python312\python.exe
Creating virtual environment at: .venv
Resolved 6 packages in 668ms
Prepared 5 packages in 414ms
Installed 5 packages in 128ms
 + certifi==2026.1.4
 + charset-normalizer==3.4.4
 + idna==3.11
 + requests==2.32.5
 + urllib3==2.6.3

這時再用 uv tree 指令就會顯示此專案下有安裝了那些第三方套件與其依賴套件 : 

PS C:\Users\tony1\my_project> uv tree  
Resolved 6 packages in 2ms
my-project v0.1.0
└── requests v2.32.5
    ├── certifi v2026.1.4
    ├── charset-normalizer v3.4.4
    ├── idna v3.11
    └── urllib3 v2.6.3

可見 requests 的四個依賴套件都掛在它下面, 這比傳統 pip list 一古腦兒列出全部套件還棒. 接下來再安裝 yfinance 與 kbar 套件, 測試一下繪製 K 線圖功能 :

PS C:\Users\tony1\my_project> uv add yfinance   
Resolved 25 packages in 1.48s
      Built multitasking==0.0.12
Prepared 19 packages in 11.09s
Installed 19 packages in 775ms
 + beautifulsoup4==4.14.3
 + cffi==2.0.0
 + curl-cffi==0.13.0
 + frozendict==2.4.7
 + multitasking==0.0.12
 + numpy==2.4.1
 + pandas==3.0.0
 + peewee==3.19.0
 + platformdirs==4.5.1
 + protobuf==6.33.4
 + pycparser==3.0
 + python-dateutil==2.9.0.post0
 + pytz==2025.2
 + six==1.17.0
 + soupsieve==2.8.3
 + typing-extensions==4.15.0
 + tzdata==2025.3
 + websockets==16.0
 + yfinance==1.0

PS C:\Users\tony1\my_project> uv add kbar   
Resolved 35 packages in 2.10s
Prepared 11 packages in 6.29s
Uninstalled 1 package in 134ms
Installed 11 packages in 581ms
 + contourpy==1.3.3
 + cycler==0.12.1
 + fonttools==4.61.1
 + kbar==0.1.5
 + kiwisolver==1.4.9
 + matplotlib==3.10.8
 + mplfinance==0.12.10b0
 + packaging==26.0
 - pandas==3.0.0
 + pandas==2.3.3
 + pillow==12.1.0
 + pyparsing==3.3.2

再次用 uv tree 顯示已安裝套件 : 

PS C:\Users\tony1\my_project> uv tree
Resolved 35 packages in 2ms
my-project v0.1.0
├── kbar v0.1.5
│   ├── matplotlib v3.10.8
│   │   ├── contourpy v1.3.3
│   │   │   └── numpy v2.4.1
│   │   ├── cycler v0.12.1
│   │   ├── fonttools v4.61.1
│   │   ├── kiwisolver v1.4.9
│   │   ├── numpy v2.4.1
│   │   ├── packaging v26.0
│   │   ├── pillow v12.1.0
│   │   ├── pyparsing v3.3.2
│   │   └── python-dateutil v2.9.0.post0
│   │       └── six v1.17.0
│   ├── mplfinance v0.12.10b0
│   │   ├── matplotlib v3.10.8 (*)
│   │   └── pandas v2.3.3
│   │       ├── numpy v2.4.1
│   │       ├── python-dateutil v2.9.0.post0 (*)
│   │       ├── pytz v2025.2
│   │       └── tzdata v2025.3
│   ├── numpy v2.4.1
│   └── pandas v2.3.3 (*)
├── requests v2.32.5
│   ├── certifi v2026.1.4
│   ├── charset-normalizer v3.4.4
│   ├── idna v3.11
│   └── urllib3 v2.6.3
└── yfinance v1.0
    ├── beautifulsoup4 v4.14.3
    │   ├── soupsieve v2.8.3
    │   └── typing-extensions v4.15.0
    ├── curl-cffi v0.13.0
    │   ├── certifi v2026.1.4
    │   └── cffi v2.0.0
    │       └── pycparser v3.0
    ├── frozendict v2.4.7
    ├── multitasking v0.0.12
    ├── numpy v2.4.1
    ├── pandas v2.3.3 (*)
    ├── peewee v3.19.0
    ├── platformdirs v4.5.1
    ├── protobuf v6.33.4
    ├── pytz v2025.2
    ├── requests v2.32.5 (*)
    └── websockets v16.0
(*) Package tree already displayed

執行記事本程式編輯 main.py : 

PS C:\Users\tony1\my_project> notepad main.py   

將 main.py 改成如下 : 

from kbar import KBar   
import yfinance as yf   

def main():
    df=yf.download('0050.TW', start='2024-07-01', end='2024-08-21', auto_adjust=False)    
    df.columns=df.columns.map(lambda x: x[0])    # 改成舊版單層索引
    kb=KBar(df)    # 未傳 font 參數預設使用正黑體
    kb.plot(title='台灣五十(0050.TW)', volume=True)

if __name__ == "__main__":
    main()

用 uv run 執行 main.py :

PS C:\Users\tony1\my_project> uv run main.py  
[*********************100%***********************]  1 of 1 completed
設定字型為: Microsoft JhengHei
使用指定字型: Microsoft JhengHei
字型候選清單: ['Microsoft JhengHei', 'DejaVu Sans', 'Arial']




可見順利繪製了 K 線圖. 


7. 建立 uv 專案的標準流程 :   

最後將 uv 建立 Python 專案的流程摘要整理如下 :


(1). 建立並初始化專案 : 

直接指定專案名稱與 Python 版本一步到位 : 

# 建立一個名為 my_project 的專案, 並指定使用 Python 3.12 

uv init my_project --python 3.12

# 進入專案目錄 

cd my_project


(2). 安裝套件 (關鍵步驟) : 

如果還沒有虛擬環境會自動建立 .venv 子目錄, 然後下載並安裝套件到虛擬環境中 (可以一次安裝多個套件), 最後將套件依賴寫入 pyproject.toml 方便以後管理 :

uv add requests yfinace kbar


(3). 執行程式 : 

不需要先啟動虛擬環境直接用 uv run, 它會自己去用專案裡的環境跑 (假設主程式為 main.py) :

uv run main.py


(4). 同步環境 (可選) : 

如果是從 Github 下載別人的 uv 專案或者換了電腦, 需要執行 uv sync 指令, 它會根據鎖定檔 (uv.lock) 把整個虛擬環境還原回來 : 

uv sync

最後來看一下 .venv 子目錄內容 :

PS C:\Users\tony1\my_project> dir .venv

    目錄: C:\Users\tony1\my_project\.venv

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----       2026/1/24  上午 11:22                Lib 
d-----       2026/1/24  下午 12:36                Scripts  
d-----       2026/1/24  下午 12:36                share
-a----       2026/1/24  上午 11:22              1 .gitignore
-a----       2026/1/24  上午 11:22              0 .lock
-a----       2026/1/24  上午 11:22             43 CACHEDIR.TAG
-a----       2026/1/24  上午 11:22            178 pyvenv.cfg

我們用 uv add 安裝的套件都會放在 Lib\site-packages 裡面. 

2026年1月21日 星期三

蝦皮購買 iPad Mini 5 透明殼

上周跟水某到夢時代熊老闆的店買了一台 7 吋電子紙閱讀器, 以便將手中的 4000 點夢時代點數用掉, 雖然安裝 HyRead 可以借市圖電子書與電子雜誌很方便, 但我覺得閱讀器反應較慢, 還是 iPad 較好用, 於是將擱置已久的 iPad mini 5 拿出來, 安裝 HyRead 後同樣可登入市圖借電子書, 覺得要好好來用它, 便上蝦皮買了兩個透明殼 :





滿 149 免運, 所以就買了兩個, 裕誠智取店取付. 

2026年1月18日 星期日

2026 年第 3 周記事

時序已來到一月中旬, 眼看一個月後就是春節了, 小時候期待過年, 現在年歲越長越是感到恐懼啊! 但一想到年底有年終獎金, 就不覺得有甚麼好怕啦! 呵呵. 不過一轉眼六年後退休, 到時沒薪水沒年終, 過年該是多恐怖的一件事啊! 看來現在就要開始替退休設想了, 退休後起碼要能維持每月 6 萬現金流 (勞保 21K + 勞退 20K + 投資 20K + ...), 以投資年收大約 50 萬回推, 平均 0056 報酬率 5% 簡單計算, 須持有 1000 萬 0056 才行, 加油! 

離過年不到一個月了, 這個周末開始著手整理老家庫房, 周六清了一批回收, 今日去上元買了廚廁清潔劑, 把廚房旁的浴室刷洗乾淨了, 下周要洗另外兩間浴廁, 但主要還是清庫房, 畢竟這一年來累積太多東西, 該丟就丟吧! 今天也在五金行買了一支矽膠槍, 下周要把餐廳後面浴廁的馬桶漏水問題徹底搞定. 

早上去市集時順路到種子行買六棵蔥來補盆栽中之前沒種活的空位, 我發現用盆栽種蔥非常方便, 幾乎沒雜草. 另外還買了 30 株香菜, 也是種在盆栽裡, 應該可以趕上過年之用. 下周再跑一趟種子行買九層塔苗來種, 最近菜園都沒看到半棵, 想做打拋豬沒九層塔不行. 

這一周我把閒暇時光花在 Vibe coding, 我發現 Gemini CLI 其實不輸 Claude Code, 還在持續探索中. 我有非常多小專案要做, 但常常卡在學過的東西生疏淡忘了, 要用時又花很多時間去複習與測試, 現在有 AI 幫我搞定軟體, 完成專案應該可以 50 倍速度前進. 

2026年1月17日 星期六