2025/9/20

新酷音 : Chewing, ibus 和 fcitx5

ubuntu 24.04 default 的輸入管理器是 iBus.
但是iBus在新酷音有點問題,就是不能記住目前的 input mode (Eng/Chinese),以 Excel 來說,換 cell 輸入法就被 reset 成中文。

fctix5 就沒這個問題。
選 fctix5 然後 apt install fcitix5-chewing 之後,在應用城市會出現企鵝的程式 fctix5-config,右邊那邊選 Chewing 按兩下就可以了。

2025/9/14

claude code router

claude-code 的 api 不是和其他人一樣的 openai (?) 的方式,所以就有人做了一個 gateway,把 anthropic 呼叫轉為openai 呼叫,同時把回應也改成 anthropic api 回應。
當然,這是用 reverse engineering 做的。
claude code router 也是用 npm 安裝。
安裝完後就是setup,他有提供一個 ui 界面,方便設定。
安裝完用:
ccr ui
就會開啟 browser,顯示設定頁面。
以 openrouter 為例,就選新增 provider - openrouter,然後到openrouter 選一些 (free) 或是 $0/M token 的 model。
在 model 的 democode 中會有 model 的名子。
舉例來說: 他的code 就有:
model="z-ai/glm-4.5-air:free"
就是他的model name,填入 provider的 add model.
一個 provider 可以add 一堆 model.

oprouter 需要一個 api_key,所以去settings--API keys 產生一個 key,把 key copy 到剛剛 claude code router 的 UI 的 openrouter 項目。
UI 設定好像這樣就可以了。
之後 'save'
就會在home 之下create ./claude-code-router/config.json

然後就可以用
ccr code
啟動 claude-code
用 stats 看,可以看到 model 還是 anthropic sonnet,
所以要用 command 來改:
/model openrouter, a-ai/glm-4.5-air:free
就可以改成 openrouter 的 glm-4.5-air model


This is my config.json (API_KEY marked)
$ cat .claude-code-router/config.json 
{
  "LOG": true,
  "LOG_LEVEL": "debug",
  "CLAUDE_PATH": "",
  "HOST": "127.0.0.1",
  "PORT": 3456,
  "APIKEY": "123",
  "API_TIMEOUT_MS": "600000",
  "PROXY_URL": "",
  "transformers": [],
  "Providers": [
    {
      "name": "openrouter",
      "api_base_url": "https://openrouter.ai/api/v1/chat/completions",
      "api_key": "sk-or-v1",
      "models": [
        "nvidia/nemotron-nano-9b-v2:free",
        "openrouter/sonoma-sky-alpha",
        "deepseek/deepseek-chat-v3.1:free",
        "z-ai/glm-4.5-air:free",
        "qwen/qwen3-coder:free",
        "moonshotai/kimi-k2:free"
      ],
      "transformer": {
        "use": [
          "openrouter"
        ]
      }
    }
  ],
  "StatusLine": {
    "enabled": false,
    "currentStyle": "default",
    "default": {
      "modules": []
    },
    "powerline": {
      "modules": []
    }
  },
  "Router": {
    "default": "openrouter,openrouter/sonoma-sky-alpha",
    "background": "",
    "think": "",
    "longContext": "",
    "longContextThreshold": 60000,
    "webSearch": "",
    "image": ""
  },
  "CUSTOM_ROUTER_PATH": ""
}



有關openrouter的 model,不是所有model 都 support claude-code-router,需要support tool 的才行: 所以可以follow 說明,在list model 時加上 filter: tool
另外光support tool 好像也不能完全 support claude code router,像mistral 的 model,雖然 support,但是一對tool command 他不認識。


要注意的是,ccr server 啟動之後,修改 config.json 不會生效。
要restart ccr server 才會重新 load config.json

2025/9/2

mediawiki 升級

到 special page (特殊頁面) 去,然後把網址的 : 後面改 "Version" 就會出現版本頁面,例如
  • http://192.168.145.166:9090/index.php/Special:Version
所以知道版本是
  • MediaWiki: 1.25.2
  • PHP: 5.3.3
  • MySQL:5.1.73
安裝的套件有
  • Image Map
  • WikiEditor: 0.4.0
Tag Extension 有:
gallery,imagemap,indicator,nowiki 和 pre

把原 server 的文章,user account 倒出來
mysqldump -u wikiusername -p wikipassword > wikidb.sql
把upload 的 image 倒出來
tar -zcvf wikiimage.tar.gz /path/to/mediawiki/imagepath
這個path 在 LocalSetting.php 中的變數定義
$wgUploadDirectory=/var/lib/www/mediawiki/


clone 下面的 github project.

設定新 MediaWiki 的簡單步驟

以下是設定新 MediaWiki 的簡單步驟,使用這個專案的說明。請先確認你的電腦已經安裝 Docker 和 Docker Compose。

準備工作

  • 複製環境設定檔案:cp .env.example .env
  • 編輯 .env 檔案,設定必要的參數:
    • MW_ADMIN_PASS:管理員密碼(預設 changeme123!,請改掉!)
    • MW_SITE_SERVER:網站伺服器地址(如果不是 http://localhost:9090,請修改)
    • 其他設定如 MW_SITE_NAMEMW_LANG 等,可視需要調整

啟動步驟

  1. 建置並啟動容器:
    docker compose up -d --build

    這會自動下載並安裝 MediaWiki 1.41,包含常用擴充套件(如語意媒體wiki、視覺編輯器等)。

  2. 開啟瀏覽器,前往 http://localhost:9090 查看你的 wiki 網站。
  3. 使用管理員帳號登入:
    • 帳號:Admin
    • 密碼:你在 .env 中設定的 MW_ADMIN_PASS

從現有的 MediaWiki 恢復資料

如果你有一個現有的 MediaWiki 網站,想要將其資料庫和圖片檔案恢復到這個 Docker 環境中,可以按照以下步驟操作:

1. 匯出現有資料

  • 匯出資料庫:
    mysqldump -u [使用者名稱] -p[密碼] [資料庫名稱] > wikidb.sql
  • 打包圖片檔案:
    cd /path/to/old/mediawiki
    tar -czf images.tar.gz images/

    或者使用 zip:

    zip -r images.zip images/

2. 放置檔案

  • 將匯出的 wikidb.sql 檔案放到此專案的 ./data 資料夾中
  • 將打包的圖片檔案(images.tar.gzimages.zip)也放到 ./data 資料夾中

3. 設定環境變數

  • 編輯 .env 檔案,新增或修改以下設定:
    MW_RESTORE_ON_INIT=1
    MW_RESTORE_DB_DUMP=/data/wikidb.sql
    MW_RESTORE_UPLOADS_ARCHIVE=/data/images.zip

    如果資料庫已經有資料表且需要覆蓋,請額外添加:

    MW_FORCE_DB_RESTORE=1

4. 啟動容器

docker compose up -d --build

容器啟動時會自動執行恢復程序,將資料庫和圖片檔案匯入到新的環境中。

注意事項

  • 第一次啟動時,系統會自動安裝 MediaWiki,即使有舊的 LocalSettings.php 但資料庫是空的,也會重新安裝並啟用擴充套件。
  • 如果需要語意媒體wiki(SMW)的設定,請在登入後檢查並執行維護指令(參見 README 的 Maintenance 部分)。
  • 所有資料(資料庫、圖片上傳)會儲存在 Docker 磁碟區中,網站設定檔案會存放在 ./data/LocalSettings.php
  • 如果圖片檔案是使用非 UTF-8 編碼(如繁體中文的 cp950),請在 .env 中設定:MW_ZIP_ENCODING=cp950

如果遇到問題,請檢查 Docker 記錄:docker compose logs -f mediawiki



version 1.44

恭喜!

您已經成功安裝MediaWiki。
安裝程式已自動產生LocalSettings.php檔案, 該檔案中包含了您所有的設定項目。
您需要下載該檔案,並將其放置在您 wiki 的根目錄(index.php 所在的目錄)中,下載應已自動開始。

2025/8/21

codex-cli

codex 安裝就跟 claude-code, gemini-cli 依樣,用 npm
npmm i -g @openai/codex
authentication 依樣會開browser,但是在 headless server (console only)就不能用以前gemini-cli 的方法。
codex提供更簡單的方法: 就是把 auth 過的機器上的 ~/.codex/auth.json copy 到要 auth 的機器上就可以了。

和 claude-code 的比較:
  • codex-cli 有明顯的"thinking"時間,以default model: gpt5-medium 來說,隨便一個簡單小命令都會花 30sec以上的thinking 時間,改用gpt-5 low 也要10sec以上,claude-code大部分回應都很快,幾乎是立即,少數會等待5,6 sec。
  • utility script: 以產生某工作的 script 來看(舉例來說:生成一個在 ubuntu 24.04 server 安裝 docker service 和 nvidia-container-toolkit),claude-code 的 script 比較接近真人寫的,比較容易了解,codex-cli 的 script 比較複雜,比較難了解。雖然script 達成的結果一樣
  • 解決問題/bug時,claude-code解決bug後會自動全面展開,找還有沒有類似的bug沒修正,codex-cli 則是遇到一個改一個。
  • claude-code 有搜尋網路的能力,需要的時候,claude-code 會自動搜尋需要的api 文件,codex-cli 不行,他說因為安全問題,它沒有access internet 的權限,其實這是用mcp agent來達成,不是權限問題。
  • 對於Android 系統和 application 的知識,還是 gemini-cli 最高,codex-cli 反覆debug 的問題,gemini-cli 馬上就找到問題點。
整體來看就是:claude-code 的動作和寫的code比較接近software engineer,codex-cli 則比較像 llm ,猜這是因為 prompting 的關係,codex-cli 可能還在開發中,所以 prompting, mcp agent都寒不完整
codex-cli 目前快速改版中,應該會越來越好。

codex-cli 無法搜尋的解法,就是請它給一個prompt,讓我訊問 chatgpt,之後再把reply 貼回 codex-cli
gemini-cli 也有搜尋能力,是用 mcp:websearch 作到,所以能在無網路存取能力下作到 search internet.

本來以為不會遇到的:
🖐 You've hit your usage limit. Upgrade to Pro (https://openai.com/chatgpt/pricing), 
   or wait for limits to reset (every 5h and every week.).


25/08/27

0.24.0 更新,果然增加 websearch 功能了,thinking 的內容也不輸出了。

2025/7/22

$ python3 development/vndk/tools/header-checker/utils/create_reference_dumps.py -l libcrypto
....
error: external/crosvm/rutabaga_gfx/Android.bp:59:1: "rutabaga_gfx_test_src_lib" depends on undefined module "libgfxstream_backend".
Or did you mean ["libfastdeploy_host" "libtistress-defaults" "slab_test_tests_slab" "zlib_deflate_fuzzer" "zlib_fuzz_defaults" "zlib_inflate_fuzzer"]?
error: external/crosvm/rutabaga_gfx/Android.bp:13:1: "librutabaga_gfx" depends on undefined module "libgfxstream_backend".
Or did you mean ["libfastdeploy_host" "libtistress-defaults" "slab_test_tests_slab" "zlib_deflate_fuzzer" "zlib_fuzz_defaults" "zlib_inflate_fuzzer"]?
..
要加上 -product
python3 development/vndk/tools/header-checker/utils/create_reference_dumps.py -l libcrypto -product rk3576_u

2025/7/7

TP-LINK TL-WN725N, RTL8188EU , on ubuntu 24.04

是 ubuntu-24.04-preinstalled-server-arm64-orangepi-5-plus...
dmesg
[  954.209502] usb 4-1: new high-speed USB device number 4 using ehci-platform
[  954.355029] usb 4-1: New USB device found, idVendor=0bda, idProduct=8179, bcdDevice= 0.00
[  954.355048] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  954.355058] usb 4-1: Product: 802.11n NIC
[  954.355067] usb 4-1: Manufacturer: Realtek
[  954.355075] usb 4-1: SerialNumber: 00E04C0001
[  954.499151] usb 4-1: RTL8188EU rev D (TSMC) romver 0, 1T1R, TX queues 2, WiFi=1, BT=0, GPS=0, HI PA=0
[  954.499173] usb 4-1: RTL8188EU MAC: e8:94:f6:0b:34:f5
[  954.499184] usb 4-1: rtl8xxxu: Loading firmware rtlwifi/rtl8188eufw.bin
[  954.499387] usb 4-1: Firmware revision 11.1 (signature 0x88e1)
[  955.112461] rtl8xxxu 4-1:1.0 wlxe894f60b34f5: renamed from wlan0
原來 loading firmware failed,所以
apt install firmware-realtek
他說是 virtual package,選一個 armbian-firmware,install 玩重新插拔 wifi usb.dmesg 就完成了。
然後 ip link 就可以看到 wlxe894f60b34f5

然後開始
harles-chang@orangepi5-plus:~$ nmcli device wifi list
IN-USE  BSSID              SSID                 MODE   CHAN  RATE        SIGNAL>
        54:78:C9:D4:03:EE  123456789012         Infra  1     65 Mbit/s   100   >
..
然後就可以連線了:
sudo nmcli device wifi connect "ssid" password "thepassword"

2025/7/2

gemini cli, ssh 通過auth

ref: 使用 gemini-cli 要先通過google account 認證。auth 的時候會開啟 browser。
但是在 ssh remote 就沒辦法開啟。
所以可以用上面 ref 的方法。
但是第一步browser 開啟的url 可以直接用 "gemini --debug" 模式啟動 gemini,就會在auth 的時候把 url 印出來。
copy 出來用 browser 打開,login google account, sign in 後,browser 會被重導到一格localhost 的位址,把這個位址 copy 下來。
用 ref 的方法,到 ssh remote 去用 curl 打開就可以。

做上面的事情的時候,gemini 都不能關掉,一職到 gemini 由 waiting 變成 authorize 後才可以關掉。



25/7/16 update

果然 cli 然後要人家開browser未免太無...
所以 0.1.11 版之後,支援no browser
NO_PROWSER=true gemini
這樣啟動後,就會出現一個 url,要你用 browser 去 login,login 玩會顯示一個 code,把她貼回來。