2025-05-02

keyd default.conf 嚐試二

 先前的設定在使用上有時會出現未預期的情況,應該就是按鍵時間的問題。後來在網路上看到這一位作者的設定方式 https://github.com/argenkiwi/kenkyo/blob/main/keyd/components/main.conf 

於是修改了Home Row幾個modifier鍵的設定,從單用overloadt改成overloadi+timeout+overloadt2
其中的overloadi是為了避免在快速打字時誤擊,timeout是在連續打字時確保功能,overloadt2是在確保搭配的鍵壓下再放開後Modifier的功能。

經過這些修改,使用上感覺更加穩定,特別是在使用線性軸打字速度很快時,經過這樣修改,不論快速打英文或中文都沒問題。(如果在打中文時出現問題,可以比對中文輸入法的按鍵設定與keyd的設定是否有衝突?)

另外是把";"改為"/",以避開被[navig]定義鎖住後無法用同一個";"鍵自我解除。

以及加了幾個「不需modifier」的組合方式,以複合鍵(同時按下)做為單一鍵使用,這些一樣是為了讓手指不必移動大距離去找按鍵,一直維持在home row附近。

2+3 = esc
w+e = A-left <--這是切換terminator的tabs
x+c = A-tab
c+v = middlemouse
8+9 = backspace
i+o = A-right <--這是切換terminator的tabs
h+u = pageup
b+h = pagedown <--這是因為Alice鍵盤多了一個右手B鍵,如果不是Alice鍵盤就改一下別的組合。
comma+dot = S-C-n <--這是切換terminator分割區
以上的複合鍵在使用線性軸鍵盤時,感覺還蠻順暢,如果是用筆記型電腦本身的鍵盤,反應有點不是很順,可以依據你的鍵盤實際使用習慣,改成更適合手勢的組合。

當然使用keyd這些新規則的按鍵方式,是需要一點時間來記憶跟適應,我相信熟悉這種佈局的按鍵排列之後,會比以往使用傳統式按鍵佈局更順手。

順便一提,keyd是透過kernel層來管理鍵盤,所以可能無法port到別的OS(?),另一個跟keyd類似的是 https://github.com/jtroo/kanata 它可以在Windows或macOS(功能受限)使用,不過它的設定檔不如keyd這麼簡單明瞭、好上手。

以下是 /etc/keyd/default.conf

[ids]
*

[main]
capslock = overload(caps, C-space)
leftshift = overload(shift, M-a)
rightshift = overload(shift, M-f)
rightcontrol = overload(candm, C-f12)
rightalt = layer(rightalt)
leftalt = layer(navig)
2+3 = esc
w+e = A-left
x+c = A-tab
c+v = middlemouse
8+9 = backspace
i+o = A-right
h+u = pageup
b+h = pagedown
comma+dot = S-C-n
a = overloadi(a, timeout(overloadt2(navig, a, 200), 500, a), 125)
s = overloadi(s, timeout(overloadt2(shift, s, 200), 500, s), 125)
d = overloadi(d, timeout(overloadt2(control, d, 200), 500, d), 125)
f = overloadi(f, timeout(overloadt2(meta, f, 200), 500, f), 125)
j = overloadi(j, timeout(overloadt2(meta, j, 200), 500, j), 125)
k = overloadi(k, timeout(overloadt2(control, k, 200), 500, k), 125)
l = overloadi(l, timeout(overloadt2(shift, l, 200), 500, l), 125)
/ = overloadi(/, timeout(overloadt2(rightalt, /, 200), 500, /), 125)

[caps:C]
f = esc
g = `
j = leftmouse
k = middlemouse
l = rightmouse
t = S-C-f

[candm:M]

[navig:A]
layer_indicator = 1
i = up
j = left
k = down
l = right
h = home
' = pagedown
y = backspace
p = pageup
u = delete
; = end
m = mute
, = volumedown
. = volumeup
space = space
[ = A-left
] = A-right

[rightalt:A]
j = toggle(navig)

2025-04-27

keyd default.conf 新嚐試

 主要修改是把幾個modifier加到home row,也就是ASDFGHJKL基本位這一行,讓手指不需移動到更遠的地方,能方便操作。以及加了timeout給幾個modifier,因為發現在不同鍵盤可能反應時間不同,如果不加timeout會出現非預期的結果。像是在terminal要打sudo時,會出現大寫U,打"cd空一格" 時會變成Ctrl+space呼叫中文輸入,在browser裡打字要打at時會變成Alt+T,要打do會變成Ctrl+O要Open file,要打dp會變成Ctrl+P列印頁面。

 所謂timeout指的是按鍵在按下後,在多少範圍時間內又放掉而且不搭配其他鍵,單位是millisecond。不加timeout的話,只要鍵被下去下後沒再同時按了別的鍵,放開後,就是做為單鍵用,不管這期間的時間長短。加timeout的話就限制要在這樣的時間內完成同時按別的鍵,才有效,否則做為單鍵用。

 至於該用多少的時隙值,目前以200為較符合我的鍵盤,這幾個timeout是從錯誤嚐試中評估出來的,用在別的鍵盤不一定適用,該用多長的timeout需要慢慢試,會因鍵盤或是個人的操作習慣而不同。

另外就是把「右Ctrl」改成當Meta用。(註:Meta在其他OS或軟體有叫做WindowsKey、或Super、或Command)

左手:
字母A鍵可以作為Alt功能
字母S鍵可以作為Shift功能
字母D鍵可以作為Ctrl功能
字母F鍵可以作為Meta功能
右手:
字母;鍵可以作為Alt功能
字母L鍵可以作為Shift功能
字母K鍵可以作為Ctrl功能
字母J鍵可以作為Meta功能

註: 如果有出現跟中文輸入衝突的情況,可以找一下中文輸入介面的設定,看有什麼按鍵可以改設定以避開衝突,我是用hime輸入介面,其中有一項是單按Shift可以輸入片語,我把它取消。

"overload"跟"overloadt"差別在尾巴那個"t",是用來指定該鍵單用的timeout,在這個時間範圍內做為單用,否則為組合用。

"caps" layer加了":C"來繼承Ctrl layer,讓CapsLock在指定那幾個字母組合裡有特殊用途,其餘便按照Ctrl一般使用,這裡還加了三個mouse作用,用來模擬成老鼠左、中、右三個按鈕,在操作瀏覽器或GUI軟體時可以用。

"navig" layer加了":A"繼承Alt layer,就是在指定的鍵之外,通通跟Alt鍵的使用一樣。

[ids]
*

[main]
capslock = overload(caps, C-space)
leftshift = overload(shift, M-a) 
rightshift = overload(shift, M-f)
rightalt = layer(rightalt)
leftalt = layer(navig)
rightcontrol = overload(candm, C-f12)
# 把「右Ctrl」指向自訂的 candm
# 以下的timeout都用200
a = overloadt(navig, a, 200)
s = overloadt(shift, s, 200)
d = overloadt(control, d, 200)
f = overloadt(meta, f, 200)
j = overloadt(meta, j, 200)
k = overloadt(control, k, 200)
l = overloadt(shift, l, 200)
; = overloadt(altgr, ;, 200)

[caps:C]
# 繼承Ctrl
f = esc
g = `
j = leftmouse
k = middlemouse
l = rightmouse
t = S-C-f

[candm:M]
# 不做任何指定,直接繼承Meta

[navig:A]
# 繼承Alt
i = up
j = left
k = down
l = right
h = home
' = end
y = backspace
p = pageup
u = delete
; = pagedown
m = mute
, = volumedown
. = volumeup
space = space
[ = A-left
] = A-right

[rightalt:A]
j = toggle(navig)

2025-04-18

在Linux使用非QMK鍵盤

 對於不是使用QMK firmware的鍵盤,我們還是可以用其他軟體來設定,之前用過xmodmap, setxkbmap, xcape來設定鍵盤,讓它更能快速、方便操作不同組合疊層(layer),但都需要交互搭配,使用起來有點麻煩。後來試用keyd之後發現前幾個都不必,只要一支keyd全部搞定!

 keyd的開發者還在繼續研發中,像device.c, config.c 最後更新時間是兩個禮拜前。keyd的config是純文字檔,位置在/etc/keyd/default.conf,相對的簡單明瞭,不像有些鍵盤設定軟體的config檔不太好維護。

 keyd是用C寫的,體積很小,執行檔不到兩百多KB,它是從kernel level來改變鍵盤行為與佈局,跟前面那幾支僅限在X11環境不同,所以keyd不論在X11/Wayland/tty console都能使用,反應速度快而且是透過systemctl來啟動、停止,簡單好用。

 如果請大家來投票鍵盤上哪個鍵最沒用?我想CapsLock應該會是第一名!它最沒用卻佔住最有用的位置之一,所以把它改成常用的功能吧!只要以下內容放在default.conf裡

[ids]
*
[main]
capslock = C-space 

這四行就足夠了,這樣按一下CapsLock就等同按Ctrl-space切換中文輸入程式

 不過這太簡單了,我們的需求應該不止這樣。鍵盤上另一個沒什麼用的按鍵就是右手下方的Ctrl,我把一個簡單的功能加給它,用來彈出或收回類比時鐘oclock,已經把它定義在fluxbox的「Control加F12」。當「右Ctrl」只按一下,而不跟任何鍵搭配時,就會執行「Ctrl-F12」呼叫出oclock。

 左或右的Shift僅按一下的話,便是用來切換左側或右側的桌面,fluxbox稱為NextWorkspace, PrevWorkspace,把它定義在fluxbox的「Super_L(左Win)-a」及「Super_L-f」。「左Alt」按住不放的同時再按[navig]所定義的某個鍵,可以「僅執行一次[navig]」的功能,「右Alt」跟「j」同時按住,可以鎖定[navig]功能,再一次按「右Alt」跟「j」解除已鎖定的[navig]功能。以下是我目前使用的設定例子:

[ids]
*
# *號的意思是宣告不限制特定輸入來源,凡接在這台電腦上的都受這個設定管控
[main]
capslock = overload(caps, C-space)
leftshift = overload(shift, M-a)
rightshift = overload(shift, M-f)
rightalt = layer(rightalt)
alt = overload(navig, leftalt)
rightcontrol = overload(control, C-f12)

# 以下自訂三個疊層 caps, navig, rightalt:A
[caps]
f = esc
g = `

[navig]
i = up
j = left
k = down
l = right
h = home
' = end
y = backspace
p = pageup
u = delete
; = pagedown
m = mute
, = volumedown
. = volumeup
n = M-n
space = space
[ = A-left
] = A-right
left = A-left
right = A-right

[rightalt:A]
j = toggle(navig)
# 這裡加了 :A 的意思是這個疊層除了按j用來固定(或解除)navig疊層之外,其餘都遵行原始的Alt搭配鍵。

CapsLock定義成 overload(caps, C-space) 意思是「按一下CapsLock」便執行Ctrl-space,如果搭配其他鍵,就執行「caps」這個自定疊層,當按住CapsLock以及f時,等同按了Esc,當按住CapsLock以及g時,等同按了「`」讓中文輸入列出同音字(例如在倉頡輸入時)。 A-left及A-right是定義成在terminator裡切換next_tab或prev_tab用。以上只是簡單的例子,大家可以根據自己的喜好任意修改,搭疊出更多好用的功能。
keyd可以找linux distribution本身repository裡的來用,或是抓github的source來安裝,keyd放在
https://github.com/rvaiya/keyd

2025-04-10

川普救地球

川普說要讓美國再次偉大,用的套路是關稅打遍全世界,不管遠親近鄰通通照打無誤。今天更是大打中國一巴掌,原本說好一巴掌只打104%關稅,現在狠狠的一巴掌力道提高到125%,中國開始滿地找牙。

川普關稅大棒開打,也打到全世界股民,人人哀哀叫,不過這其實蠻好的。

過去幾十年,中國利用取之不盡的低端人礦,藉著全球化,拼命生產低價商品,透過阿里巴巴、淘寶、蝦皮……讓全世界人類瘋狂消費。生產各種商品的同時當然也製造了二氧化碳,這是地球暖化的最佳推手之一。「世界工廠」到處賣廉價產品,也讓人們把還沒用壞的舊東西丟掉,因而製造更多垃圾。

這樣一直生產、一直消費的現象,更是一個無解的惡性循環,而且是一開動就停不下來,地球已經受夠了。現在神的使者川普幾個巴掌打下來,全世界生產的二氧化碳應該會少一點、地表上的垃圾也會少一點,總算可以給地球一個喘息的機會,從這個角度來看,川普真的在救地球。

2025-03-26

Linux Live的記憶體(RAM)使用

 二十幾年前開始玩KNOPPIX這個很不同的Linux distribution後,就再也沒回去用正常安裝方式,KNOPPIX當時的壓縮法是用cloop,幾年之後各大distribution也開始採用Live system的方式來製作自家的CD/DVD ISO,絕大多數都是採用squashfs壓縮演算法,之後差不多squashfs主導了Live system。

 不過各家Live system用在initrd裡的系統導引法各有不同,Debian用「live」, Ubuntu用「casper」,已經走入歷史的CentOS用的也叫「live」但和Debian不同,Siduction用fll。各種live system有一個相同的開機參數「toram」, 它會把整個Live系統cp到RAM裡面,在開機完成後,我們可以把用來開機的USB隨身碟或光碟整個拿掉,因為系統已經不再依賴它了。

 但是Ubuntu用的casper在遇到「toram」參數後,會cp整支USB隨身碟全部進入RAM裡面, 這樣是有問題的,如果你的USB是64GB,而裡面裝了其他不是Live system的檔案,它會全部cp到RAM裡,萬一你的RAM只有16GB或更少,這樣就無法完成開機,因為RAM被塞滿了,而系統還沒完全cp進入RAM。

 使用Ubuntu而不要讓它cp所有USB裡的檔案進入RAM,必需自行手動拆解initrd好把casper裡面cp「整支USB」的那一段程式改成只cp「某個目錄」之下的檔案,再做成initrd,這樣才不會把RAM灌爆掉。其他Live system有的會有不同的參數(例如image_name)來指定只cp目錄下的特定檔案(squashfs壓縮的主系統檔)到RAM裡,像siduction用的fll會自行計算該檔案的大小,以便切割出為存放那個檔案大小的區域,也避免會浪費RAM。

 Live system有一項重要的參數"overlay", 在絕大多數initrd裡的規化都是採用50%, 極少數可以讓user自行指定,在我實際使用上發現50%其實不太符合需求,特別是在RAM少的電腦,例如RAM只有4G的系統下,overlay 50%的話就是只有2G能拿來當儲存體,存放開機完成後諸如 /etc, /home, /usr, /var等等,會相當不足!

 如果把"overlay"加大到90%的話,既使只有4G RAM的電腦也還算堪用,但這時就不宜使用"toram"的方式,而是保持系統放在儲存設備如USB隨身碟或電腦本身的硬碟。

至於開機有哪些參數可用,好像沒有共通的說明文件,只能自行拆解「initrd」看它裡面有什麼相關的參數可用,沒有的話就只能自行修改。

關於RAM少的電腦還有一個可以補救的方法就是使用zram, 而zram大概用50%就好,因為RAM已經很少,然而這50%可以存放大約三倍容量的資料,也就是說一台只有4G RAM的電腦,使用zram後的記憶體相當等於(4-2)+(2*3)=8G RAM,邏輯上多出來一倍,不過它要依賴CPU運算進行「壓縮/解壓縮」,或許會稍微延遲軟體的執行,但對於無法在物理上增加RAM的環境,還是相當有益處。

2025-02-27

MacBook與Linux kernel

 之前在一台退休的Intel MacBook跑Linux Live系統都只是用USB隨身碟開機進入使用,完全沒動到它的SSD,因為老機器RAM很少,不能用"toram"來載入,因此全程都要掛一支USB碟在機器上,其實有些不方便也不好看。

 後來這台MacBook的macOS已經無法再升級(其實硬要升級還是有辦法,只是已經對使用macOS沒什麼興趣)。個人在各種機器上使用Linux Live system已經二十幾年了,想到這台老MacBook的touchpad觸感不錯,重量相對的輕,電池續航力也有三個多小時,偶而帶它外出也蠻好用,現在把它的SSD割了10GB一小塊,打算用來塞入Live system(只是單純從USB copy到SSD, 不是執行正常的Linux install)。

 之前做的USB開機碟可以支援MacBook本身的Wifi以及Camera,更新到最後是Ubuntu 20.04.4,可以看到MacBook的SSD無誤,但有一陣子沒再用它,加上20.04有點年紀了,某些軟體無法換用新版本,於是這次改用Debian Trixie來開機,並且做好Wifi以及Camera(Mac叫做FacetimeHD)的支援,MacBook的硬體都能用到。

只是用它開機完成後,發現完全看不到MacBook已經割好的SSD!就是說用cat /proc/partitions時除了USB隨身碟之外完全看不到MacBook的SSD partition。變成使用的全程要一直依賴插一支支USB隨身碟。

 這時再降回去用Ubuntu 20.04.4開機,卻是可以在/proc/partitions看得到SSD,先懷疑Trixie包的initrd方式不同,於是拆除initrd裡的early,early2,再試還是一樣!看來不是initrd裡面的問題。

 搜尋網路上的相關Linux以及MacBook的資訊,但看到一堆都是講怎麼用apfs-fuse來mount,而我遇到的問題是完全看不到SSD,跟mount的問題無關。

 接著分別找了Arch,Debian,Ubuntu相關或衍生的distribuion的kernel/initrd (4.x或5.x以及6.x)來開機比對,發現只有5.x能看到SSD,而4.x跟6.x都看不到,真的是很奇怪的問題?

 又在網路上陸續找一些相關MacBook問題,最後找到一篇小小的文裡提到解決方法是在boot option加上intel_iommu=off

 加了這個option的Trixie 6.x kernel開機後果然能看到MacBook的SSD。

 那麼隨機找幾個不同kernel版本來看看它是怎麼定義"intel_iommu"的?

  • 4.9.0
    CONFIG_INTEL_IOMMU_DEFAULT_ON=y
  • 4.15.0-20
    CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
  • 5.10.188
    CONFIG_INTEL_IOMMU_DEFAULT_OFF=y
  • 5.19.0-32
    CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
  • 6.1.0-29
    CONFIG_INTEL_IOMMU_DEFAULT_OFF is not set
  • 6.11.5
    CONFIG_INTEL_IOMMU_DEFAULT_OFF is not set
  • 6.12.6-1
    CONFIG_INTEL_IOMMU_DEFAULT_ON=y
  • 6.13.2
    CONFIG_INTEL_IOMMU_DEFAULT_ON=y

 以上各版本kernel在不加任何boot option的情況下,只有5.10.188可以看得到MacBook SSD, 因為只有它是CONFIG_INTEL_IOMMU_DEFAULT_OFF=y 也就相當於在開機時加上 intel_iommu=off

 其它版本有幾個都是相當於
intel_iommu=on
或可以說,沒定義成off 就看不到SSD了。

 根據kernel文件提到「The Intel IOMMU driver allocates a virtual address per domain. Each PCIE device has its own domain.」
如果想進一步研究,可以參考以下文件:
http://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/vt-directed-io-spec.pdf

低效款電腦執行AI distilled model

 前一篇提到被媒體大力炒作的Deepseek R1,因為手上電腦比較薄弱,所以拿它的distilled 8b model來跑,之後陸續再試的也都挑能力差不多的distilled model,像是tulu3:8b model, 感覺它明顯比deepseek R1:8b model來得聰明,如果說deepseek R1:8b是小學生,那tulu3 8b幾乎是高中生,因為問tulu3有關宗教的問題它也能清楚對答,不像前者常常胡說八道不知所云。

 接著又試了gemma2:9b model, 不曉得是不是多了1b ? 發現它比前兩種更聰明,對這三個能力差不多的distilled AI model 用同樣的「台灣台北市木柵以出產什麼聞名?」來提問,得到的回答是:

  1.  deepseek R1:8b -> 高品质木材(它聲稱自己會用正體中文,但所有回答都是簡體字)
  2.  tulu3:8b -> 優質竹炭
  3.  gemma2:9b -> 文山包種茶

看來多了1b的model確實有比較聰明一些!

2025-01-31

Deepseek R1與π小數點

 農歷新年這幾天,Deepseek成為新聞談話的主題,因為它把NVDA股價嚇了一大跳,原本只是到Youtube找找看有什麼評論資訊,其中看到包括微軟退休工程師David Plummer的看法,他提到如果Deepseek所宣稱的都是真的,那就像你在家裡就可以自製一台法拉利跑車,而且功能完全跟公司貨真品法拉利一模一樣,這當會嚇掉法拉利公司的股價。

 David又提到從它的model來看,它是從大model來training出小model,這個小model不必依賴強大的硬體就能在一般人家裡的電腦執行AI。

就像幾十年前個人電腦發展史一樣,PC出來的時候讓一般人不必購買像大公司大機構裡的大電腦,而可以擁有自己的個人電腦來執行各種軟體。但這樣的問題是,當大model裡有什麼bug,由它train出來的小model便繼承了先前的bug。

 另外也看了Jeff Geerling以及Aleksandar Haber的Youtube video,發現只要用Raspberry Pi也可以安裝小model的Deepseek在家裡玩,於是動手用一台比Pi的性能還高一些的舊Macmini(16GB RAM)裝來玩玩看。從https://www.ollama.com可以找到六個distill的版本,當然也有原本的R1(671b)。我的舊Macmini完全沒有NVidia GPU,所以不可能快,不過我想正確性應該相同。

先裝一個最低階1.5b來玩,發現它幾乎答非所問,於是再裝一個8b的,問它列出π小數點後面100位,結果它開始跟我聊天,說什麼一般人不會用到小數點後面100位,接著東扯西扯。我想這跟我的電腦沒有NVidia GPU應該無關吧?但它還是繼續東扯西扯就是不肯列出小數點後面100位,後來終於列了小數點後40位,不過我一看,從第21位數開始就是錯的!因為我記得小數點後面50位,可以百分之百確認從第21位之後就是錯的。

 我再孤狗一下「怎麼用python程式列出π小數點後面100位」,得出來的結果是只用了三行python code就能做到要列幾位數就列幾位數,但是為什麼8b model 的deepseek一直列不出來?

 另外在一篇網路文章https://www.kelacyber.com/blog/deepseek-r1-security-flaws/ 裡看到說他利用兩年前早就公開的技術,可以jailbreak Deepseek來得到想要的資料,也就是說別的AI裡早已補起來的漏洞,在Deepseek卻仍存在!而且能從Deepseek得到一些違法的知識,像是製造爆裂物等等。

 目前OpenAI也質疑Deepseek偷了他們的東西來用,這也讓人難免不想到中國各行各業過去幾十年來總是盜用、抄襲別人的智慧財,OpenAI指責Deepseek利用OpenAI的model來train Deepseek的model,也就像盜印圖書館的書來自己成立一間圖書館,這樣當然不必花大錢買書。但目前對於版權的法律還沒進步到AI這一塊,因此就算OpenAI能舉出Deepseek抄襲、盜用,這個問題目前仍是無解。