NixOS 上用 Solaar 設定羅技 Master 3S 拇指滾輪來切換前後分頁。

NixOS 上安裝 Solaar

安裝 solaar 並加上 udev rule 讓非 root 也能使用 (ref)

configuration.nix

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
environment.systemPackages = with pkgs; [
solaar
];

services.udev.extraRules = ''
# Allows non-root users to have raw access to Logitech devices.
# Allowing users to write to the device is potentially dangerous
# because they could perform firmware updates.
KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess", OPTIONS+="static_node=uinput"

ACTION == "remove", GOTO="solaar_end"
SUBSYSTEM != "hidraw", GOTO="solaar_end"

# USB-connected Logitech receivers and devices
ATTRS{idVendor}=="046d", GOTO="solaar_apply"

# Lenovo nano receiver
ATTRS{idVendor}=="17ef", ATTRS{idProduct}=="6042", GOTO="solaar_apply"

# Bluetooth-connected Logitech devices
KERNELS == "0005:046D:*", GOTO="solaar_apply"

GOTO="solaar_end"

LABEL="solaar_apply"

# Allow any seated user to access the receiver.
# uaccess: modern ACL-enabled udev
TAG+="uaccess"

# Grant members of the "plugdev" group access to receiver (useful for SSH users)
#MODE="0660", GROUP="plugdev"

LABEL="solaar_end"
# vim: ft=udevrules
'';

之後 rebuild

Solaar 設定 MX Master 3S 拇指滾輪

MX Master 3S 設定打開 Thumb Wheel DirectionThumb Wheel Diversion

config

設定 User-defined rules 做換頁:

rule

在 KDE 設定啟動時執行 Solaar

到 KDE 的 System Settings => Autostart 加入 application Solaar,編輯 properties 到 Application tab 在 Arguments 加上 --window=hide 讓 Solaar 啟動的時候不會把視窗也打開 (ref)。

使用情境

  • 使用 Obsidian、安裝 kanban plugin
  • 有多個不同主題的 kanban
  • 每個 kanban 依據 status 分 list,有名稱為 WIP 的 list
  • kanban 的檔名固定為 [主題] Kanban

想達成的目的

在 daily note 或 homepage 顯示所有 kanban 的 WIP list 內容,可以一眼看出目前有哪些正在進行的事項。

迷之音:為什麼不直接用 todo list 就好?

這算是我自己的習慣,todoist 是我每天會開來看有什麼今天得做的事情的 todo list app,拿來放生活瑣事、做完勾掉通常不會回去翻的待辦事項,像是洗衣服、買日常用品等等。todoist 不放偏向「有目標、維持性或比較像 project」的事情,像是自己的 side project、正在閱讀的書籍等等。

嘗試過用 todoist 來管理 side project,但不習慣在 todo list 寫筆記,而且完成勾掉後預設顯示是隱藏、之後不太會想到到 todo list app 翻筆記。後來改用看板管理這類型的事項,發現用得還算順手,因為我自然而然在兩種模式下開啟「待辦清單」,一是有時效性的「我今天得做什麼?」,二是有段空檔時想知道「最近正在進行些什麼?挑個來繼續吧!」,這兩種模式剛好對應到 todoist 跟看板。另外看板可以讓我知道 side project 整體做過些什麼、打算做什麼、正在做什麼,能比較全面的看到整個 project。

Obsidian 使用 dataviewjs query

看板系統我一開始先用 trello,最近用起 obsidian 也就裝了 kanban plugin,因為有換換病跟搬搬病也就把 trello 的東西搬到 obsidian。

我有兩個主要看板,分別是 side project 跟生活中要持續的事,兩個看板都有一個 WIP 清單,表示「正在做」事項。用了幾天想有個統一的地方可以一次看到兩個看板的 WIP 清單內容,於是邊跟 Sonar 聊天邊寫出了下面這段 dataviewjs query:

1
2
3
4
5
6
7
8
9
10
11
12
let pages = dv.pages(); 

for (let page of pages) {
const filePath = page.file.path;
const markdownContent = await dv.io.load(filePath);
const wipSectionRegex = /(?:^|\n)##\s*WIP[^\n]*\n(.*?)(?=\n##\s|\n#\s|$)/gs;
const wipContent = markdownContent.match(wipSectionRegex);

if (wipContent) {
dv.paragraph(wipContent[0].replace(/^## WIP$/gm, `### ${filePath.slice(5, -10)}`));
}
}

就能顯示出多個 kanban 的內容:

須注意的是放這個 script 的 note 不能有 ## WIP,否則整個 obsidian 一開該 note 就會當掉。我懷疑是因為會 infitie loop,但我沒有證據 aka 還懶得深究。解法簡單粗暴:用一般編輯器打開 obsidian 那個 note,把 ## WIP 改掉即可。

這 script 偏 hard code,在不同前提下需要修改才能使用,像是不叫 WIP 的話 regex 要改、用來替換的 heading 3 字串 slice() 位置也要修改。

我的 n8n 架在 AWS EC2 裡、用 docker 啟動,接在cloudfront distribution 跟 ALB 後面。cloudfront 對外使用 redirect HTTP to HTTPS、origin 是使用 HTTP 連 ALB。ALB 的 listener 是 HTTP、target group 也是用 HTTP 連到 target。

n8n 升級到 v1.86 後 editor 右上角會出現 Connection lost 的警告:

alt text

用瀏覽器的 devtool 看是 web socket wss:// 連線有問題,會想換 protocol 、往 http:// 走。

這篇看起來可以更改 push backend 為 sse ,就可以不使用 web socket。對應的 environment variable (ref):

1
N8N_PUSH_BACKEND=sse

設定 push backend 為 sse 後用 devtool 看沒有對 web socket 的連線,但依然 Connection lost。

發現 n8n 的 log 有這段:

1
2
3
4
5
6
7
8
9
10
11
n8n-1  | Origin header is missing
n8n-1 | ResponseError: Invalid origin!
n8n-1 | at Push.handleRequest (/usr/local/lib/node_modules/n8n/src/push/index.ts:143:10)
n8n-1 | at /usr/local/lib/node_modules/n8n/src/push/index.ts:100:10
n8n-1 | at Layer.handleRequest (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/lib/layer.js:152:17)
n8n-1 | at trimPrefix (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:342:13)
n8n-1 | at /usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:297:9
n8n-1 | at processParams (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:582:12)
n8n-1 | at next (/usr/local/lib/node_modules/n8n/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:291:5)
n8n-1 | at /usr/local/lib/node_modules/n8n/src/auth/auth.service.ts:110:18
n8n-1 | at processTicksAndRejections (node:internal/process/task_queues:105:5)

看來是 cloudfront 往 origin 這段送的 request 缺少 origin header,參考這篇後我直接在 cloudfront distribution 的 origin 設定加 header origin 、value 寫 n8n.mydomain.org:[ALB_LISTENER_PORT]

alt text

解決啦!!🎉🎉🎉

在 cloudfront distribution 設好 header 後,即使把 push backend 改回 web socket 也能正常運作!🥳

修改 /etc/nixos/configuration.nix

1
2
3
4
5
{ config, pkgs, ... }:

{
networking.hostName = "[HOSTNAME]";
}

有用 flakes 的話也要改 /etc/nixos/flake.nix

1
2
3
4
5
6
7
8
9
10
11
{
outputs = { self, nixpkgs }:
let
system = "x86_64-linux";
in {
nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
inherit system;
modules = [ ./configuration.nix ];
};
};
}

[HOSTNAME] 改成要的 hostname,接著 rebuild:

1
sudo nixos-rebuild switch --flake .#[HOSTNAME]

最後重開機!

Perplexity 的 AI 結合 search engine,我在 Open WebUI 上使用起來的感覺比開啟搜尋引擎的其他 AI 好得多,單純 gpt-4 配合 Open WebUI 開啟網頁搜尋常常會出現 error。我還不確定是 Open WebUI 還是 search engine 的問題,目前至少用了 gogoduck 跟 google search engine 都會有 error。

Perplexity 要用 API 至少要有 pro 的訂閱(之前續約手機有送一年的使用 😝),而且也是要儲值才能使用。

Setup

  1. 社群上已經有人寫好 function Perplexity Sonar API with citations 了,進到該 function > Get > Import(或者 export 後手動 import) > 輸入 Open WebUI 的 url 來 import 進自己的 Open WebUI > 儲存函式
  2. 在 Open WebUI 的管理員控制台 > 函式 > 點函式的齒輪設定函式
    • Perplexity Api Base Url: https://api.perplexity.ai
    • Perplexity Api Key:[你的 perplexity api key]
  3. 設定完網頁重新整理,在 model 選單就可以看到 Perplexity 的 Sonar 系列 model 囉~
    menu

環境:NixOS 25.05 + KDE 6 + Wayland

configuration.nix ,設定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{ config, pkgs, ... }:
{
i18n.inputMethod = {
# NixOS 24.11 起的用法
enable = true;
type = "fcitx5";

fcitx5 = {
plasma6Support = true;
waylandFrontend = true;
ignoreUserConfig = true; # 吃下面的 settings,不用 user 的
addons = with pkgs; [
fcitx5-chewing # 新酷音
fcitx5-chinese-addons
fcitx5-mozc # 日文輸入法
];
settings = {
inputMethod = {
"Groups/0" = {
Name = "Default";
"Default Layout" = "us";
DefaultIM = "keyboard-us";
};
"Groups/0/Items/0".Name = "keyboard-us";
"Groups/0/Items/1".Name = "chewing";
"Groups/0/Items/2".Name = "mozc";
};
};
};
};
}

rebuild 跟重開機後就能打中文了!但還是會跳這個訊息:

wayland

暫時找不到 NixOS 對應設定的地方,而且折騰了一段時間也先不搬到 home manager,所以手動照著訊息設定 virtual keyboard。

切換輸入法後出現 Not available

environment.systemPackages 不要設定 fcitx5 相關 package,不然在切換到新酷音時會出現 Not available 之類的字樣,也無法輸入中文。(ref)

env var GTK_IM_MODULE 與 QT_IM_MODULE

在 Wayland 底下即使沒 NixOS 跟 home manager 內設定這兩個 env variable,也還是會被設定成 fcitx,所以會一直跳這個訊息:

env var GTK_IM_MODULE & QT_IM_MODULE

加上 waylandFrontend = true; 可以讓它別跳了。(ref)

Ref

NixOS + KDE 第一次連 wifi 會跳出 KWallet,但一開始沒有 GPG key 所以選 GPG key 的加密方式會出錯,接著就無法連上 wifi。因為 NixOS 預設安裝的 package 很少,安裝又需要網路,連 gpg 指令需要的 pinentry-qt 都無法安裝,所以先選用 Blowfish 模式避開 GPG。

如果一開始選了 Blowfish 還是一直出現 wifi 連線錯誤,先刪掉 KWallet 設定:

1
2
rm -rf ~/.local/share/kwalletd
rm -rf ~/.config/kwalletrc

再重新登入應該能正常連線啦~ 🎉

這個問題在用 Plasma GUI 安裝 NixOS 的時候也會出現,只是既然在 installation media 索性不加密。😛

昨天介紹了 ECS Cluster Auto Scaling,今天來看看 ECS service 的 auto scaling。(本日程式碼

ECS cluster auto scaling 透過 auto scaling group 控制 container instance 的數量來滿足 task 的需求。ECS 會把 CPU 跟 Memory 使用資訊傳給 Cloudwatch,ECS service auto scaling 則是利用這些 loading 資訊自動增減 task 數量,loading 高便增加 task 數量來提供服務,loading 低則減少 task 以節省資源。ECS 是使用 Application Auto Scaling 的功能來做 service 的 auto scaling。

Read more »

昨天幫 ALB 加上 CDN 但還沒開啟 cache,今天要來實驗一下 CDN 的 cache 機制~

cloudfront distribution 的 cache 相關參數是透過 cache policy 設定的,我們會先新增一個 cache policy、設置相關參數,接著在 distribution 多加一個 behavior,開啟某個 path pattern 的 cache 功能。(本日程式碼

Read more »