2025年3月13日 星期四

Google Apps Script 執行逾時

目前 Google Apps Script 執行超過 6 分鐘,便會發生逾時。
Google Apps Script 限制可參考
https://developers.google.com/apps-script/guides/services/quotas#current_limitations
(雖然文件上寫 Google Workspace 帳號,Script runtime 限制也是 6 分鐘,不過網上有人說是 30 分鐘。我問 Gemini,最初說 30 分鐘,後來問資料來源,變成 6 分鐘。)
 

處理逾時,可優化程式碼,
例如,減少對 Google Sheets 的讀寫次數、資料暫存在陣列中最後一次性寫回、使用快取(Cache Service)、批次分段處理.....


我的情況是抓取上櫃股票股價,想要抓的股票越來越多,最後便逾時了。
所以我選擇批次分段處理,執行時,記錄當下處理到第幾筆資料,下次排程執行接著處理。

記錄當下處理到第幾筆資料,可使用 Properties Service,將「處理到第幾筆的變數值」儲存在屬性中,儲存在屬性的資料,不會隨著 Script 執行完畢消失,下次執行時可取出該屬性值。

屬性有三種,存取權限有差異:

  • Script Properties:All users of a script, add-on, or web app
  • User Properties:The current user of a script, add-on, or web app
  • Document Properties:All users of an add-on in the open document

我選擇儲存在 Script Properties
Class Properties 使用範例(以 Script Properties 為例):

try {
const scriptProperties = PropertiesService.getScriptProperties();

// 將 aaa 這個值,儲存到 k1 這個 key
scriptProperties.setProperty('k1', 'aaa');

// 若要儲存物件,先 JSON.stringify 轉成字串
scriptProperties.setProperty('k23', JSON.stringify({ k2: 'bbb', k3: 'ccc' }));

//一次儲存很多組 key-value,使用 setProperties(properties, deleteAllOthers)
//第2參數 deleteAllOthers 若設為 true,會刪除所有其他屬性
scriptProperties.setProperties({ k4: 'ddd', k5: 'eee', k6: 'fff' });

//取得指定的屬性
const data = scriptProperties.getProperty('k5');//若不存在此鍵,則回傳 null。
console.log('Value: %s', data);

//取得所有屬性
const data_all = scriptProperties.getProperties();//回傳 Object
for (const key in data_all) {
  console.log('Key: %s, Value: %s', key, data_all[key]);
}

//取得所有 key
const key_all = scriptProperties.getKeys();//回傳 String[]
for (let i = 0; i < key_all.length; i++) {
  console.log(key_all[i]);
}

//刪除指定的屬性
scriptProperties.deleteProperty('k5');

//刪除所有屬性
scriptProperties.deleteAllProperties();

} catch (err) {
console.log('Failed with error %s', err.message);
}

處理結果:
排程要從頭處理第 3~92 列資料,處理到第 76 列逾時停止,下一次排程則從第 76 列開始處理,成功處理完成,再下一次排程才再從頭處理第 3~92 列資料。


其他:
從專案設定,可以查看、管理 Script Properties




參考:




2025年2月12日 星期三

Python 套件管理工具 uv 和 pip 的快取

Python 使用套件管理工具 uv 和 pip 安裝套件時,預設會在本地保存快取,之後安裝到相同套件,則不用再次下載,若已用不到快取,可刪除快取釋放空間。


pip uv
版本> py -m pip -V
pip 24.3.1 from C:\Users\xyz\AppData\Local\Programs\Python\Python313\Lib\site-packages\pip (python 3.13)
> uv version
uv 0.5.27 (73e9928d4 2025-02-03)
查看快取資料夾路徑 > py -m pip cache dir
c:\users\xyz\appdata\local\pip\cache
> uv cache dir
C:\Users\xyz\AppData\Local\uv\cache

預設路徑
 macOS and Linux:`$XDG_CACHE_HOME/uv` 或 `$HOME/.cache/uv`
Windows: `%LOCALAPPDATA%\uv\cache`
快取資訊 > py -m pip cache info
Package index page cache location (pip v23.3+): c:\users\xyz\appdata\local\pip\cache\http-v2
Package index page cache location (older pips): c:\users\xyz\appdata\local\pip\cache\http
Package index page cache size: 0 bytes
Number of HTTP files: 0
Locally built wheels location: c:\users\xyz\appdata\local\pip\cache\wheels
Locally built wheels size: 2.3 kB
Number of locally built wheels: 0

快取列表 > py -m pip cache list [<pattern>] [--format=[human, abspath]]

<pattern>:glob expression 或 package name

> py -m pip cache list
No locally built wheels cached.

移除指定快取 > py -m pip cache remove <pattern>

<pattern>:glob expression 或 package name

> py -m pip cache remove aa
WARNING: No matching packages for pattern "aa"
Files removed: 0

清除快取> py -m pip cache purge > uv cache clean
Clearing cache at: AppData\Local\uv\cache
Removed 119321 files (5.9GiB)
會刪除整個快取資料夾
刪除沒用到的快取
> uv cache prune
Pruning cache at: AppData\Local\uv\cache
Removed 272417 files (12.6GiB)
Cache Options --format <list_format>
Select the output format among: human (default) or abspath


相關:
安裝時不保存使用快取
py -m pip install --no-cache-dir <package>
-n, --no-cache
Avoid reading from or writing to the cache, instead using a temporary directory for the duration of the operation
[env: UV_NO_CACHE=]

--cache-dir <CACHE_DIR>
Path to the cache directory.
Defaults to `$XDG_CACHE_HOME/uv` or `$HOME/.cache/uv` on macOS and Linux, and `%LOCALAPPDATA%\uv\cache` on Windows.
[env: UV_CACHE_DIR=]



2025年2月4日 星期二

Windows 本地部署 DeepSeek 模型(使用 Ollama)

在本機部署 deepseek-r1 模型。

環境:
作業系統 Windows 10、
CPU AMD Ryzen 7 3700X、
記憶體 32G、
顯示卡 NVIDIA GeForce GTX 1660 Ti 6G


安裝 Ollama

Ollama (https://ollama.com) 是一個開放原始碼專案,方便在本機部署執行 AI 模型。
支援的 AI 模型,可從 https://ollama.com/library 查看。

  1. https://ollama.com/download 查看各作業系統的安裝方法。
    Windows 是下載安裝檔(OllamaSetup.exe)進行安裝。








  2. 安裝完,會自動執行,在工作列通知區域(小圖示)可以看到執行中的 Ollama,在圖示上案右鍵,可執行 Quit Ollama,關閉退出 Ollama


    關閉 Ollama 後,要再啟動。
    可以從開始功能表,找到 Ollama 執行 (執行後,會出現在工作列通知區域小圖示)。


    或是使用 cmd 命令列,用指令執行 (執行後,退出指令,就會停止)
    >ollama serve


    Ollama 執行後,會使用 11434 PORT
    瀏覽器瀏覽 http://127.0.0.1:11434/
    可看到 「Ollama is running」

    Ollama 的 REST API,便是使用這個網址


  3. Ollama 指令操作
    查看 Ollama 版本
    >ollama -v
    ollama version is 0.5.7

    看 Ollama 可用指令
    >ollama -h
    Large language model runner
    
    Usage:
      ollama [flags]
      ollama [command]
    
    Available Commands:
      serve       Start ollama
      create      Create a model from a Modelfile
      show        Show information for a model
      run         Run a model
      stop        Stop a running model
      pull        Pull a model from a registry
      push        Push a model to a registry
      list        List models
      ps          List running models
      cp          Copy a model
      rm          Remove a model
      help        Help about any command
    
    Flags:
      -h, --help      help for ollama
      -v, --version   Show version information
    
    Use "ollama [command] --help" for more information about a command.

    部署 deepseek-r1
    https://ollama.com/library/deepseek-r1 查看可用版本,有 1.5b(billion)參數 ~ 671b(billion)參數各版本
    參數量越大、模型容量越大、執行須更好的硬體 (我同一台電腦,裝了 1.5B、7B、8B,三者執行速度有明顯差異)

    下載 7b 版本
    >ollama pull deepseek-r1:7b
    pulling manifest
    pulling 96c415656d37... 100% ▕██████████████████████████████████████████████████████████████████▏ 4.7 GB
    pulling 369ca498f347... 100% ▕██████████████████████████████████████████████████████████████████▏  387 B
    pulling 6e4c38e1172f... 100% ▕██████████████████████████████████████████████████████████████████▏ 1.1 KB
    pulling f4d24e9138dd... 100% ▕██████████████████████████████████████████████████████████████████▏  148 B
    pulling 40fb844194b2... 100% ▕██████████████████████████████████████████████████████████████████▏  487 B
    verifying sha256 digest
    writing manifest
    success

    執行 1.5b 版本 (若沒下載過,會先下載再執行)
    >ollama run deepseek-r1:1.5b
    pulling manifest
    pulling aabd4debf0c8... 100% ▕█████████████████████████████████████████████████████████████████████▏ 1.1 GB
    pulling 369ca498f347... 100% ▕█████████████████████████████████████████████████████████████████████▏  387 B
    pulling 6e4c38e1172f... 100% ▕█████████████████████████████████████████████████████████████████████▏ 1.1 KB
    pulling f4d24e9138dd... 100% ▕█████████████████████████████████████████████████████████████████████▏  148 B
    pulling a85fe2a2e58e... 100% ▕█████████████████████████████████████████████████████████████████████▏  487 B
    verifying sha256 digest
    writing manifest
    success
    >>> Send a message (/? for help)

    執行後,便可以輸入文字開始對話互動
    >>> 你是誰
    <think>
    
    </think>
    
    您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。
    
    >>> Send a message (/? for help)

    查看互動時,可用指令
    >>> /?
    Available Commands:
      /set            Set session variables
      /show           Show model information
      /load <model>   Load a session or model
      /save <model>   Save your current session
      /clear          Clear session context
      /bye            Exit
      /?, /help       Help for a command
      /? shortcuts    Help for keyboard shortcuts
    
    Use """ to begin a multi-line message.

    可知要退出對話,可以用 /bye 指令
    >>> /bye


    其他指令:
    目前 Ollama 已下載的模型
    >ollama list
    NAME                ID              SIZE      MODIFIED
    deepseek-r1:7b      0a8c26691023    4.7 GB    3 days ago
    deepseek-r1:8b      28f8fd6cdc67    4.9 GB    3 days ago
    deepseek-r1:1.5b    a42b25d8c10a    1.1 GB    3 days ago
    目前執行的模型(可看到 CPU/GPU 使用比例)
    >ollama ps
    NAME                ID              SIZE      PROCESSOR    UNTIL
    deepseek-r1:1.5b    a42b25d8c10a    2.0 GB    100% GPU     4 minutes from now
    
    >ollama ps
    NAME              ID              SIZE      PROCESSOR          UNTIL
    deepseek-r1:7b    0a8c26691023    5.9 GB    26%/74% CPU/GPU    4 minutes from now





安裝 Open WebUI


用指令跟 AI 互動不怎麼方便,以下安裝 Open WebUI 網頁互動介面。
Open WebUI (https://github.com/open-webui/open-webui) 可經由 Python 套件管理工具或用 Docker 安裝。

這邊用官方推薦的 uv 套件管理工具

  1. 安裝 Python uv 套件管理工具 ( https://docs.astral.sh/uvhttps://github.com/astral-sh/uv )
    這個指令用 cmd 指令視窗就可執行安裝
    > powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
    Downloading uv 0.5.27 (x86_64-pc-windows-msvc)
    Installing to C:\Users\帳號\.local\bin
      uv.exe
      uvx.exe
    everything's installed!
    
    To add C:\Users\帳號\.local\bin to your PATH, either restart your shell or run:
    
        set Path=C:\Users\帳號\.local\bin;%Path%   (cmd)
        $env:Path = "C:\Users\帳號\.local\bin;$env:Path"   (powershell)
    安裝完,會將「C:\Users\帳號\.local\bin」路徑加入系統環境變數,
    裡面有 uv.exe、uvx.exe 兩個執行檔。(uvx 是 uv tool run 的別名)


  2. 新開一個 cmd 指令視窗,新加入的環境變數,在新開的命令列才會生效。
    查看系統可安裝以及已安裝的 Python 版本(列表中 3.13.1、3.11.9 是我之前另外裝的)。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    > uv python list
    cpython-3.14.0a4+freethreaded-windows-x86_64-none    <download available>
    cpython-3.14.0a4-windows-x86_64-none                 <download available>
    cpython-3.13.1+freethreaded-windows-x86_64-none      <download available>
    cpython-3.13.1-windows-x86_64-none                   AppData\Local\Programs\Python\Python313\python.exe
    cpython-3.13.1-windows-x86_64-none                   <download available>
    cpython-3.12.8-windows-x86_64-none                   <download available>
    cpython-3.11.11-windows-x86_64-none                  <download available>
    cpython-3.11.9-windows-x86_64-none                   AppData\Local\Programs\Python\Python311\python.exe
    cpython-3.10.16-windows-x86_64-none                  <download available>
    cpython-3.9.21-windows-x86_64-none                   <download available>
    cpython-3.8.20-windows-x86_64-none                   <download available>
    cpython-3.7.9-windows-x86_64-none                    <download available>
    pypy-3.10.14-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>
    pypy-3.7.13-windows-x86_64-none                      <download available>


  3. 用 uvx 指令在 powershell 執行 Open WebUI
    $env:DATA_DIR="C:\open-webui\data"; uvx --python 3.11 open-webui@latest serve
    開啟 powershell,此指令需 powershell 才能執行

    指令中:

    DATA_DIR,指定資料儲存的目錄,包括上傳、快取、向量資料庫等
    https://docs.openwebui.com/getting-started/env-configuration/

    --python 3.11,目前的 Open WebUI 開發環境是 Python 3.11,所以指定使用  Python 3.11
    https://docs.openwebui.com/#installation-with-pip
    (官網說明:Python 3.11 is the development environment. Python 3.12 seems to work but has not been thoroughly tested. Python 3.13 is entirely untested—use at your own risk.)
    初次執行,會自動下載安裝需要的套件,需一點時間


  4. 執行成功

    打開瀏覽器瀏覽
    http://127.0.0.1:8080/


  5. 新增管理者帳號


  6. 登入後,會自動抓到 Ollama 安裝的模型,上方可以選擇要使用的模型。
    中間對話框,可開始對話。






其他:
原本我電腦已經有安裝 Python 3.11.9,若只指定用 3.11 執行,會直接使用 3.11.9
如果想用新的 3.11.11,須明確指定 3.11.11
$env:DATA_DIR="C:\open-webui\data"; uvx --python 3.11.11 open-webui@latest serve
如此,便會再自動安裝 Python 3.11.11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>uv python list
cpython-3.14.0a4+freethreaded-windows-x86_64-none    <download available>
cpython-3.14.0a4-windows-x86_64-none                 <download available>
cpython-3.13.1+freethreaded-windows-x86_64-none      <download available>
cpython-3.13.1-windows-x86_64-none                   AppData\Local\Programs\Python\Python313\python.exe
cpython-3.13.1-windows-x86_64-none                   <download available>
cpython-3.12.8-windows-x86_64-none                   <download available>
cpython-3.11.11-windows-x86_64-none                  AppData\Roaming\uv\python\cpython-3.11.11-windows-x86_64-none\python.exe
cpython-3.11.9-windows-x86_64-none                   AppData\Local\Programs\Python\Python311\python.exe
cpython-3.10.16-windows-x86_64-none                  <download available>
cpython-3.9.21-windows-x86_64-none                   <download available>
cpython-3.8.20-windows-x86_64-none                   <download available>
cpython-3.7.9-windows-x86_64-none                    <download available>
pypy-3.10.14-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>
pypy-3.7.13-windows-x86_64-none                      <download available>






2025年2月1日 星期六

在 Cloudflare 購買網域

購買網域

  1.  在 Cloudflare https://www.cloudflare.com/ 註冊帳號登入後。
    「網域註冊」->「註冊網域」->搜尋想購買的網域名稱->按「購買」


  2. 填寫註冊者資訊
    這頁有兩個提示訊息:
    • 備註:您無法變更已在 Cloudflare 註冊之網域的名稱伺服器
      (Note: You cannot change the nameservers of a domain registered with Cloudflare)
      =>在 Cloudflare 購買的網域,一定要用 Cloudflare 的 nameserver,如果有改用其他 nameserver 的需求,就可能不適合在 Cloudflare 買網域。
    • Cloudflare 將修訂傳送到此網域 WHOIS 記錄的所有個人資訊。
      (Cloudflare will redact all personal information sent to this domain's WHOIS record.)
      =>這裡填寫的註冊者資訊,不會直接顯示在 WHOIS 上,Cloudflare 會將註冊者資訊刪減隱藏,保護資料隱私。

    註冊者資訊填完,選擇付款方式,即可繼續填相關資料。
    其他:

  3. 付款方式我選信用卡,注意這邊即使沒勾選「啟用自動續約」,網站也會將信用卡資料儲存下來,不過可以自己到帳戶資料裡刪除。


    填完信卡資料,下面的帳單地址,預設會自動帶入前面填的註冊者資訊。
    (這邊我為了截圖,所以刪除留空)

    帳戶類型,如果是個人,就不用填上面的「加值稅/貨物及服務稅」
    填完之後就可以按「驗證地址」

    按了「驗證地址」後,便會出現「完成購買」按鈕,按「完成購買」便會開始進行付款,完成後,即成功購買網域。



手動網域續訂

  1. 網域續訂,可以在任何時候手動續訂,續訂完成,會在原到期時間上,再加上續訂的時間,延長到期日。
    「網域註冊」->「管理網域」->找到要續訂的網域按「管理」


  2. 按「續訂/延長網域」,便可選要續訂幾年、付款,完成續訂。



刪除信用卡資料

  1. 按畫面右上角「帳戶圖示」,出現選單後,按「帳單」

  2. 按「付款」,到付款方式設定頁面,如果有儲存信用卡資料,這邊可進行編輯、刪除。
    (底下的畫面,是已經刪除儲存的信用卡資料)





2024年12月19日 星期四

郵局網路 ATM 出現「晶片卡連線失敗,請檢查晶片卡是否已依正確方向插入讀卡機」錯誤

環境:Win10、瀏覽器 Edge

狀況:
使用讀卡機、晶片卡,可以登入、查詢交易紀錄...,但要執行轉帳時,會出現「晶片卡連線失敗,請檢查晶片卡是否已依正確方向插入讀卡機」錯誤。


查看郵局QA,有一段內容為:

五、 於網路ATM交易,執行插拔卡後出現錯誤訊息 “請檢查晶片是否已依正確方向插入讀卡機!”該如何處理?

答: 因Windows系統啟用智慧卡認證機制「Certificate Propagation」服務,會影響網路ATM晶片卡交易操作,可執行以下步驟後重新開機便可正常使用:

路徑:開始>電腦(按滑鼠右鍵)>電腦管理>服務與應用程式>服務

1. 於「Certificate Propagation」按滑鼠右鍵執行「停止」。

2. 於「Smart Card」按滑鼠右鍵執行「停止」。

3. 於「Smart Card」按滑鼠右鍵執行「啟動」。



要關掉「Certificate Propagation」服務、重啟「Smart Card」服務、重開機。

但原本一直可正常使用,所以我不想改變原本系統服務設定,而且我不想重開機。
又在網路找到其他人說:橡皮擦擦晶片卡、重啟「Smart Card」服務...等解決方式

於是我回想今天跟以前的操作過程有何差異、異常,
今天我先按了網路 ATM 裡的「啟用服務」,但出現「交易逾時」的失敗訊息




之後再使用轉帳功能,便出現「晶片卡連線失敗,請檢查晶片卡是否已依正確方向插入讀卡機」錯誤




解決方式:
重啟「Smart Card」服務




重啟「Smart Card」服務後,便可以正常轉帳。
正常後,我測試再去按網路 ATM 裡的「啟用服務」,結果可重現一樣的問題。


參考:
是否追蹤此瀏覽器的瀏覽量 ?
目前設定:追蹤 修改
(本區塊只有網站管理者看得到)