透過 CLI 調整藍牙耳機音訊設定

接續著 KDE neon / Ubuntu 啟用 PipeWire 與 LDAC/AAC/AptX 藍芽編碼,每當連線到藍芽耳機時,語音設定檔在使用 LDAC 後,就無法同時使用麥克風,這樣一來在開會時,就需要手動到設定裡面去調整語音設定檔。 身為一個懶惰鬼,可以用鍵盤解決的就不會用滑鼠去點,發現可以通過 pactl(PulseAudio)在 cli 直接設定 audio profile。 首先,我們通過 bluetoothctl 列出藍芽設備的實體位置 $ bluetoothctl > [EAH-A800]# devices > Device 88:C9:E8:B1:5D:AE WF-1000XM4 > Device DC:22:D2:85:85:15 MX Master 3S > Device B8:20:8E:35:CB:D0 EAH-A800 文章內舉例的目標為 EAH-A800,也就是 B8:20:8E:35:CB:D0 接著需要確認目前藍牙裝置支持的音訊設定檔。可以透過 pactl list cards short 來列出目前啟用的設備 $ pactl list cards short 47 alsa_card.usb-Shure_Inc_Shure_MV7-00 alsa 48 alsa_card.pci-0000_00_1f.3-platform-skl_hda_dsp_generic alsa 49 alsa_card.usb-NuPrime_NuPrime_DAC-9H-00 alsa 1002 bluez_card.B8_20_8E_35_CB_D0 module-bluez5-device.c 發現目標為 1002 bluez_card.B8_20_8E_35_CB_D0 再來通過 pactl list cards 來獲取所有音訊設定檔...

2024-01-28 · 2 min · 346 words

Golang 隱式記憶體別名 Implicit Memory Aliasing 與其檢測方法

在使用 Golang 時,我們可能會遇到一種稱為隱式記憶體別名(Implicit Memory Aliasing)的問題。這篇文章將探討這個問題以及如何使用工具和語言特性來解決它。 隱式記憶體別名的問題 隱式記憶體別名主要發生在 range 語句中。當使用 range 對一個切片 slice 或映射 map 進行迭代時,Iterator 在每次迭代中並不是唯一的實例。這可能導致意外的行為,特別是在並發環境或當迭代變量被指針引用時。 slice with Implicit Memory Aliasing 下面示例可能是基本的 golang 面試題,會問你迭代後的 pointers 內的 Name 為何 答案是 Joe Joe Joe package main import "fmt" type Person struct { Name string Gender string } func main() { persons := []Person{ {Name: "John", Gender: "M"}, {Name: "Jane", Gender: "F"}, {Name: "Joe", Gender: "X"}, } pointers := make([]*string, len(persons)) for index, person := range persons { fmt....

2023-11-12 · 2 min · 368 words

使用 Bitwarden 與自架後端 Vaultwarden 來管理密碼

在尋覓有哪些 self-hosted 專案好玩時,偶然發現了 1password、LastPass 的開源替代方案,甚至後端資料庫能自架,決定架來用用看。 使用 Bitwarden 來管理密碼 Bitwarden 是一款流行且功能強大的密碼管理工具,它提供了一個安全的方法來存儲和管理所有密碼。作為一個開源產品,Bitwarden 允許用戶選擇自行托管其服務,這意味著用戶可以在自己的服務器上運行 Bitwarden,從而更好地控制自己的數據安全。 Bitwarden 的特點 安全性: Bitwarden 使用端到端加密,確保只有您可以訪問您的密碼。 跨平台支持: 支持 Windows、macOS、Linux、Android 和 iOS。 易於使用: 提供直觀的用戶界面和簡單的操作流程。 開源: 開源,增加了透明度和安全性。 Bitwarden 同時支援基於時間的一次性密碼,讓 TOTP 也能自動填入。 Bitwarden 開源了 client 與 server,在 server 端的選擇有以下: 使用 Bitwarden 提供的官方服務,又分為免費跟付費,但這個選擇就跟 1p 沒太多區別。 自架 Bitwarden 提供的 open source server,由於是使用 C# 與 mssql,吃的記憶體著實太多。 自架 Bitwarden 相容的後端,我採用的是 rust 實做的 Vaultwarden,搭配 sqlite,記憶體使用量與官方的 C# 不是一個量級的。 使用 Vaultwarden 作為自托管後端 Vaultwarden 是一個 Bitwarden 的非官方後端實現,它使用 Rust 編寫,更輕量且易於部署。使用 Vaultwarden,您可以在自己的服務器上部署 Bitwarden,這樣您就可以完全控制您的密碼數據。...

2023-11-12 · 1 min · 136 words

透過 frp 與 GCP 打通家用 kubernetes cluster 的對外連線

概述 在家裡面架著一台 lab,使用 proxmox ve 作為 vm server 透過 qemu 虛擬化一台 ubuntu server vm 在這個 vm 上使用 k3s,啟動 kubernetes 的服務 在 kubernetes 內跑著眾多 dockerize 的 containers。 雖然我不是資深維運專家,但我知道這可能很搞笑。 會需要這麼麻煩還不是為了省一點點 GKE 的成本(即便可能沒省到),但在自家建一個 lab 環境而不用計算由時間計價的 infra 成本,還是挺省腦袋的。 過去僅是將 service 使用 nodePort 來讓家裡面的其他裝置可以連線,或是使用 wireguard 作為 VPN 來從遠端連線,就是沒有動力處理好 http service 與 TLS,趁這個假日剛好需要把 自架 vaultwarden 後端 給 expose 出來,便誕生了這篇。 在當前的雲端運算時代,許多開發者和 IT 專業人員都面臨著一個共同的挑戰:如何有效地將位於不同網絡環境中的服務整合並暴露給公眾。特別是對於那些希望將家用網絡中的服務有效連接到公共雲端(如 GCP,AWS,Azure,OCI)的用戶來說,這一挑戰尤為突出。文內主要講述通過在 GCP VM 上部署 FRP(Fast Reverse Proxy)服務器,結合家中的 kubernetes cluster 上配置的 FRP 客戶端,來實現一個高效且安全的服務部署流程。 透過此方式,我們不僅可以利用 GCP VM 作為公共 IP 的代理,實現從互聯網到家庭網絡的無縫連接,還能藉助 kubernetes 的強大功能進行快速的服務部署和管理。同時,利用 ingress-nginx 作為 ingress 控制器和 cert-manager 進行 TLS 設定,我們能夠確保服務的安全性和可靠性。...

2023-11-12 · 5 min · 922 words

KDE neon / Ubuntu 啟用 PipeWire 與 LDAC/AAC/AptX 藍芽編碼

Ubuntu 22.10 將 Audio Server 從 PulseAudio 切換成 PipeWire 遇到了什麼問題 明明使用著有 LDAC 或是 AptX 解碼能力的藍芽耳機,卻只能被迫接受 sbc 的低傳輸率音質嗎,身為規格黨怎麼可以忍受這件事(即便大部份時間都只使用 Youtube Music 的 128K bps opus) 解決方法 我們可以在 KDE neon 上啟用 PipeWire,並安裝更多藍芽轉碼器 安裝 WirePlumber(PipeWire Manager) sudo apt install -y pipewire-media-session- wireplumber 透過 systemd 管理 WirePlumber 的開機自啟 daemon systemctl --user --now enable wireplumber.service 安裝 ALSA sudo apt install -y pipewire-audio-client-libraries 安裝藍芽轉碼器 sudo apt install -y \ libfdk-aac2 \ libldacbt-{abr,enc}2 \ libopenaptx0 sudo apt install -y \ libspa-0....

2023-10-01 · 1 min · 112 words

使用 wireguard 與 aws 搭建虛擬內網

先前在「在 AWS 上使用 EC2 建立 FRP 玩玩內網穿透」一文中敘述了如何透過 AWS 實現虛擬穿透,也在內文中提到或許可以使用 wireguard 搭建內網,其原因也很簡單:每更新一個 port 都要重新設定 server side 實在是太麻煩了,拖更了進一年終於要開始寫 wireguard 的使用了。(AWS 免費也快到期了) 遇到了什麼問題 在使用 wireguard 來搭建 VPN 前,我是使用 zerotier 搭配 Mikrotik RB5009 所執行的 RouterOS 7.x 版本,讓外網可以連回家裡的網路環境 但 zerotier 的網路拓樸是存在他們官方伺服氣上,與其相信 zerotier,我想在 vps 上建立虛擬機,並只許特定 ip 登入,可能更加可靠(? 解決方法 於是我在 frp tunnel VM 上建立了 wireguard 節點,作為外網與內網溝通的橋樑。 wireguard 是一個高效的現代化 VPN,目標是比 IPsec 更快。在 2020 年時正式推出 1.0.0 版本。 wireguard 的拓樸實際上是 peer2peer,甚至可以達到 full mesh,但礙於錢錢不夠,單一個節點作為 server side 就足夠了。 server 使用 docker-compose 能快速部署 wireguard 服務,我們使用的是 wg-easy 簡單換掉一些參數: WG_HOST: vps 的公網 IP WG_DEFAULT_ADDRESS: 預設內網 ip 範圍,比如 10....

2023-10-01 · 2 min · 314 words

透過 WakaTime 幫助來紀錄自己做了哪些事,並製作獨特的 GitHub Profile

WakaTime 介紹 WakaTime 是一款紀錄自己生產力的工具,透過客戶端插件、集成工具紀錄「行徑」並發送到官方|非官方伺服器,可以分析花了多久時間在哪個專案、哪個程式語言、會議、code review。 記憶力不佳,過去常常無法想起某段時間做了哪些專案,甚至 daily standup 前忘記昨天做了什麼,發現了 wakatime 可以透過 vscode 插件、terminal 插件來查看自己在哪些時間變更了哪些專案、檔案,甚至可以紀錄下過得指令(僅 binary 的部份,不含參數不會洩漏資料)。 在使用 WakaTime 前,先到 WakaTime 官網上註冊並登入,取得最重要的 API Key(API Token): 安裝相應的客戶端插件。wakatime 支援的插件、編輯器包括但不限於: Visual Studio Code Vim Excel Terminal zsh bash fish iTerm2 舉例來說我們可以安裝 vscode 插件,並跟著 Installation 輸入完 API Key 就可以開始寫點東西了。 查看報告 使用了一段時間後,可以回到官網查看 dashboard 查看自己上週、前兩週、前一個月每天花了(浪費)了多少時間,以前三十天的圖為例: 或是 YoY 的活動圖 以此 blog 的 repo 來作為舉例,可以查看某個 project 的細節 在該專案花了多少時間、什麼語言: 檔案、分支的時間分配: 費用 免費版本的功能已經十分完整了,完整費用方案在此。 透過學生帳號可以申請教育折扣,年度付費 Premium 方案的話一年只要 59 美元,就可以享有完整的 WakaTime 服務。 雖然付費方案的功能幾乎都可以透過免費版本就有的 API 來完成,但仍可以花點小錢支持團隊,或是開啟公司計畫。...

2023-08-03 · 2 min · 298 words

KDE Neon 使用心得與踩雷紀錄

前言 年初為了 arc browser 裝了一台 Hackintosh,因為原因又花了點時間裝了 KDE Neon,這邊紀錄一下使用心得與踩雷紀錄。時間線大概是 快快樂樂使用 wsl2 wsl 中踩了不少坑,想要嘗試 unix liked 的系統 好心人提供 arc browser 的邀請,萌生了裝 Hackintosh 的念頭 在 HP Z2 G4 上裝了 Hackintosh,但是沒有事前做足功課,內顯圖形記憶體(P630)始終是 7mb 買了張 amd WX4100 督上去,大幅提昇圖形性能,卻也沒再花時間繼續深入 嘗試在 windows 主機上雙系統 (windows + linux): 一開始直接選擇熟悉的 ubuntu,安裝了 ubuntu desktop 版本,由於是 nvidia 顯示卡,很快的遇到了硬體解碼問題 開始嘗試 nvidia-vaapi-driver,但是遇到了很多問題,最後放棄 想換到 amd 顯示卡,但是又不想花錢,於是想說看看其他發布版是否能解決 從 Linux Mint, Manjaro, KEO Neon 中選擇了同樣是 ubuntu 底,卻是 KDE 團隊維護團隊的 KDE Neon 不出意外的一樣遇到了 nvidia 驅動問題,雖然 firefox 已經可以順利硬體加速,但是 chromium 等仍然無法硬體加速 這時候已經花了不少時間在這個問題上,於是決定換到 amd 顯示卡(內顯) 在 Minisforum UM560 上安裝了 KDE Neon,一切順利,驅動毫無問題,硬體加速也正常 嘗試裝了 ventura theme,讓他稍微好看一點 持續與 wayland 相處,走一步是一步… ❯ neofetch `....

2023-06-04 · 4 min · 675 words

golang 樂觀鎖、悲觀鎖 學習筆記與實驗

介紹 改變數值的三個步驟 取出 修改 保存 但這三者間的時間差在不同 process、不同 thread、不同 corutine/goroutine 中會造成競爭危害(race condition)。 可以使用多種發法確保並行(concurrency)處理時保持資料的一致性,這裡介紹的是最常使用的悲觀鎖與樂觀鎖。 悲觀鎖: 總可能發生問題 lock (1) 取值 (2) 修改 (3) 保存 unlock 樂觀鎖: 不會總是發生問題 (1) 取值 if *addr == old { (2) 修改 (3) 保存 return true } return false 悲觀鎖 golang 中主要使用 sync.Mutex 作為悲觀鎖,看似會阻塞住其他 goroutines,但其實 sync.Mutex 中也使用到了 CAS。 sync.Mutex 中有一個 int32 的 state 與 uint32 的 sema(semaphore) type Mutex struct { state int32 sema uint32 } const ( mutexLocked = 1 << iota // mutex is locked mutexWoken mutexStarving mutexWaiterShift = iota starvationThresholdNs = 1e6 ) func (m *Mutex) Lock() { if atomic....

2023-05-14 · 3 min · 503 words

讓 BOOX 也使用繁體中文辭典

由於最近讀原文書讀得挺辛苦,邊用電子閱讀器看書,騰不出手用手機查字典,內建的辭典又只有英文翻譯簡體中文,在網上衝浪也找不到繁體中文的 mdx 英漢辭典可以直接使用。 所需依賴 任何英漢辭典 文內以 BOOX 內下載的英漢辭典,參考教學。 python 環境,用以安裝 mdict-utils 經測試後 windows 與 wsl 中均能完成,文內 python 環境以 wsl 為主。 任何繁簡轉換軟體 文內以新發現的 ConvertZZ 最為 GUI 簡轉繁示例。 文末有使用 OpenCC 作為 CLI 示例。 主要流程 將 mdx 拆成 txt 簡轉繁 將 txt 包成 mdx 安裝 安裝 mdict-utils ❯ pip install mdict-utils Defaulting to user installation because normal site-packages is not writeable Collecting mdict-utils Downloading mdict_utils-1.3.12-py3-none-any.whl (36 kB) Collecting xxhash Downloading xxhash-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (212 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 212....

2023-05-04 · 2 min · 250 words