キーボード, マウスのLinux, Mac間共有

キーボード, マウスをLinux, Mac間で共有したく、[debauchee/barrier](https://github.com/debauchee/barrier)というツールを導入しました。いつもどおりArchWikiを探しましたがfork元のSynergyの記事しかなく内容も薄いものだったので、日本語の薄い記事を投稿するモチベになりました。

ArchWikiの代わりにこちらの記事が参考になりそのままパクりました。
https://zenn.dev/sunaemon/articles/81471b9431ff2c
コンテンツ力のある方でtwitter上でFFのFFでした。赤の他人です。

## 導入
barirerではキーボードを触る方をサーバ, その信号を受け取る方をクライアントと呼びます。それぞれbarriers, barriercコマンドが仕事をし、それらのGUIとしてbarrierコマンドがあります。

この記事では参考文献と逆にmanjaro linuxをサーバ, macをクライアントとします。

### 暗号化
LANにキー入力流すのは危険ですし、--enable-cryptoがデフォルトでONなので秘密鍵とそのfingerprintをつくり交換してあげます。今回はサーバ側でsshdを動かしssh上でfingerprintを交換しました。
サーバ側 linux
```bash
mkdir -p ~/.local/share/barrier/SSL/Fingerprints
cd ~/.local/share/barrier
openssl req -x509 -nodes -days 365 -subj /CN=Barrier -newkey rsa:4096 -keyout ./SSL/Barrier.pem -out ./SSL/Barrier.pem
echo "v2:sha256:$(openssl x509 -fingerprint -sha256 -noout -in ./SSL/Barrier.pem|cut -d= -f2)" > ./SSL/Fingerprints/Local.txt
```
クライアント側 mac
```bash
mkdir -p ~/Library/Application\ Support/barrier/SSL/Fingerprints
cd ~/Library/Application\ Support/barrier
openssl req -x509 -nodes -days 365 -subj /CN=Barrier -newkey rsa:4096 -keyout ./SSL/Barrier.pem -out ./SSL/Barrier.pem
echo "v2:sha256:$(openssl x509 -fingerprint -sha256 -noout -in ./SSL/Barrier.pem|cut -d= -f2)" > ./SSL/Fingerprints/Local.txt
scp ./SSL/Fingerprints/Local.txt octaltree@coorie.local:~/.local/share/barrier/SSL/Fingerprints/TrustedClients.txt
scp octaltree@coorie.local:~/.local/share/barrier/SSL/Fingerprints/Local.txt ./SSL/Fingerprints/TrustedServers.txt
```
サーバ側のホスト名coorie.localをavahiで名前解決していますがip指定で十分です。

### サーバ
まずインストールします。`sudo pacman -S barrier-headless barrier`
次に設定ファイルをつくります。/usr/share/doc/barrier-headless に設定の雛形があるのでそれをベースに書いてもいいですし、GUIから設定して吐き出す形でもいいです。GUIはconfig作るのに使ったら役割は終えたので消して大丈夫です。`sudo pacman -Rsn barrier`
barriersのサービス化とあわせて私はこうなりました。
<details><summary>~/.local/share/barrier/.barrier.conf</summary><div>

今回manjaroのホスト名がcoorieでmacがElectricalSpeedwagon.localです。localまで正確にホスト名にあわせる必要がありました。
```
section: screens
	coorie:
		halfDuplexCapsLock = false
		halfDuplexNumLock = false
		halfDuplexScrollLock = false
		xtestIsXineramaUnaware = false
		preserveFocus = false
		switchCorners = none 
		switchCornerSize = 0
	ElectricalSpeedwagon.local:
		halfDuplexCapsLock = false
		halfDuplexNumLock = false
		halfDuplexScrollLock = false
		xtestIsXineramaUnaware = false
		preserveFocus = false
		switchCorners = none 
		switchCornerSize = 0
end

section: aliases
end

section: links
	coorie:
		right = ElectricalSpeedwagon.local
	ElectricalSpeedwagon.local:
		left = coorie
end

section: options
	relativeMouseMoves = false
	screenSaverSync = true
	win32KeepForeground = false
	clipboardSharing = true
	switchCorners = none 
	switchCornerSize = 0
end
```
</div></details>
<details><summary>何故XDG_CONFIG_HOMEじゃないのか</summary><div>

歴史的経緯のようです。この未解決issueでバグとして扱われています。暗号化用ファイルにXDG_DATA_DIR使うのでついでという見方もあります。
https://github.com/debauchee/barrier/issues/230

コードはこの辺り
https://github.com/debauchee/barrier/blob/fc045fc79326cef966405b1cc578e8f062ae5294/src/lib/common/unix/DataDirectories.cpp#L61
</div></details>
<details><summary>~/.config/systemd/user/barriers.service</summary><div>

```
[Unit]
Description=Barrier keyboard & mouse sharing software
After=network.target

[Service]
PassEnvironment=DISPLAY
ExecStart=/usr/bin/barriers --no-restart --no-daemon
Type=simple
ProtectHome=read-only
ProtectSystem=true
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
```
</div></details>


サーバ実行
```bash
systemctl --user daemon-reload
systemctl --user enable barriers
systemctl --user start barriers
```


### クライアント
インストール`brew install barrier`すると/Applicationsや/opt/homebrewにインストールされるようです。

ホスト名あっていればクライアント側の設定は必要ないようでクライアントを実行すれば繋がるはずです。
```bash
local ipv4=`traceroute coorie.local 2>/dev/null| awk '{print $2}'`
/Applications/Barrier.app/Contents/MacOS/barrierc --no-daemon --no-restart $ipv4
```
サーバ側でavahiが動いていたのでLAN内で名前解決しています。


## macディス・感想
私はThinkPadにlinuxを入れることが常でAppleは食わず嫌いだったため、社用という機会にはじめてMacを選択しました。結果として、windowsとlinuxの悪いとこ取りという偏見をエアプでなく体感することが出来ました。そもそも今回のキーボード共有導入の動機がusb端子を持たないからでした。

まず、ソフト面でlinuxと同等の環境を構築するのに苦労しました。
* dotfiles管理している設定項目を一つずつ検索してシステム設定GUIから設定した
* キーリピートレートだけGUIから見つからずdefaultsコマンドから設定した
  - 170ms 60Hzを常用しているのでMacの設定項目だとこれを15msで割った数値を小数で設定した
* swapcapsがシステム設定にあるがaltが無いのが致命的
* brewでターミナルいれてterminfoがついてこない
* ディレクトリや権限の制約
* Docker対応M1対応
* ウィンドウマネージャなど不慣れな環境でマウスへの依存度が高い
* 右クリックにcontrolが必要

数日使うとソフトに加えてハード面でも不便さを痛感しました。
* トラックパッドで指の腹が擦れて痛い　3000番のやすりかなにか?
* グレア液晶　px単位の芸術家ではないので文字が認識できれば十分
* 重い
* USB type-A端子がなくキーボードを刺せない

キーボードは浅いものの感触は嫌いではありませんでした。キーボードが不満でDellのXPS13を返品させてもらったことがあり、それよりは我慢すれば慣れるキーボードでした。

導入した感想ですが継続して使っていけるかわかりません。というのもsshで良い気がしたりネイティブほどの操作感がないためです。例えば操作対象切り替えがマウスであったりalt対応であったりです。私にとってmacに対する銀の弾丸ではありませんでした。

ディスから入りましたが、ネット経由でマルチプラットフォーム上で仮想デバイスとして振る舞うソフトウェアという点で面白いツールなので試してみることをオススメします。