あんパン

こしあん派

突撃! 自宅のデスクトップ(物理)

記事を書いた。

developer.hatenastaff.com

ので、こちらでは自宅のデスクトップ(物理)の話でも。突撃要素は無。

こういう環境で仕事しています

至って普通のディスプレイ2枚構成。キーボードはHHKB HYBRID Type-S、トラックボールはKensington ExpertMouse。早くSlimBlade Proきて欲しい。ペンはシュナイダーのベースボールで、メモは縦長ロディア or ニーモシネのA5 5mm方眼が常時控えている状態。ペン立ては無印の歯ブラシ立て。

とまあそんな話がしたいわけではなくて、実はこの机の下にデスクトップPCが3台控えているのでそのあたりの話をしたい。

デスクトップPCたち。配線はそのうちなんとかしたい……

ダイソーのラックにDeskMiniで組んだLinux、Windows、その横にMac mini、あとは上段にHPのThunderbolt 3 Dockを置いている。Dockはこれ。

jp.ext.hp.com

MacBookだとめちゃくちゃ相性よくないのであんまりオススメはしない…… 詳しくはググってください。

DockからThunderbolt 3 ケーブル(アクティブケーブルの長いやつ)を机の上に出していて、ラップトップはこれに繋いで電源も受けるしディスプレイ2枚にも出力できるしキーボードもマウスも繋がるという状態。

これらをなんやかんやでいい感じに切り替えられるようにしている(後述)。裏側に有孔ボードをくくりつけていて、ここにYAMAHAの安い8ポートのL2スイッチとか弱電のケーブルを這わせている。燃えないように・ノイズでめちゃくちゃにならないようにある程度は注意している。電源系は全て下の段に置いて12ポート用意している。このラックの概要はそんなところ。

で、どうやってこれらをディスプレイ・キーボード等と協調させているか。

まずディスプレイだけど、入力が3ポートあるHDMIセレクタを2つ買って、ひとつのセレクタに対してひとつのディスプレイを割り当てている。ラックのデスクトップPCはセレクタに繋いで、Dockだけはディスプレイ2枚に対して直接DisplayPortで繋いでいる。当初は4in2outのHDMIマルチプレクサを買ってなんとかするつもりだったのだけど、どうにも食い合わせが悪いので諦めた。具体的にはマルチプレクサ自身がEDIDを吐いてしまう、つまりディスプレイとして振る舞ってしまうのだった。何が困るかというとディスプレイがWQHDにもかかわらずHDMIマルチプレクサが4Kディスプレイとして振る舞うせいでPCがディプレイサイズを誤認してしまいうまく表示されない。これは困るので、EDIDを吐かないような安いHDMIセレクタを2枚買って協調動作させることでなんとかしている。協調動作といっても赤外線リモコンを向けて操作するだけ。

↑これなんだけど、もはや売ってなくてやや困る。

リモコンがまさにこれと同型なので、おそらくどこかのOEMなのだろう、そしてこれを買えばきっとなんとかなるだろう、という気はしている。

そしてキーボードやマウスのような入力系統はUSB切替器をつかうことでなんとかしている。これと同型をAliExpressで購入した。リモートスイッチもあるけれど使っておらず、机の下に潜って切り替えている。

USBキーボードやUSBマウスを使っているのであればこれで完成なのだけれど、極力机からケーブルを排除できる方が望ましい。しかしBluetoothキーボードやBluetoothマウスを利用しているとPCの切替時にいちいちペアリングしなおす必要があり面倒。最近だとペアリング先を登録しておいて切り替えられるようになっている機器もあるけど(というかHHKB HYBRID Type-Sがそれ)、3台までしか登録できなかったりとやや要件に合わないよく見たら4台だった! けどトラックボールと切り替えが連動してほしいとかBIOS画面でも入力できたいなどの要求はある。

そこで、BluetoothキーボードとBluetoothトラックボールをUSB入力に変換するグッズをRaspberry Pi Zeroに入れて使っている。なにを言っているんだという感じだけど2年前に作ったこれのこと。

github.com

このときのことは記事にも書いた。

masawada.hatenablog.jp

このころからずっと安定して使えていて便利。

キーボードとマウスをBluetoothでRaspberry Pi Zeroに繋いで、microUSBポートをUSB切替器に接続している。Raspberry Pi Zeroはあんまりネットワークに繋ぎたくないなと思ってスタンドアロンで動作させていて、最近はメンテするときはシリアル接続している。USBシリアル変換ケーブルを机の上に出しているのでいつでもメンテ可能。このあたりの話は最近書いた。

masawada.hatenablog.jp

切り替え機能はラックの上段にまとめていて、このような感じ。

Dock、HDMIセレクタ、USBセレクタ、Raspberry Piが載っている

というわけで、まとめると以下のような状態で複数のPCを切り替えられるようにしている。

清書する力は尽きました

なんだかんだLinuxもWindowsもMac miniもラップトップも使っているのであんまりこの構成を変える気持ちはなくて、もうすこし切替器まわりをシュッとさせたいな〜、KVMスイッチっぽいのを導入したいな〜と思うのだけど、なかなか要求にあったKVMスイッチはないor高い。ので一旦これで落ち着いている。自作KVMスイッチとか面白いだろうな〜などと思いつつまだ手を動かすまでには至れていない。

Wi-Fi資格情報の共有方法

週末に妻の友人が家に遊びにくることになった。我が家ではタグVLANでゲストネットワークを作り、それに繋げられる専用のSSID/パスワードを用意している。せっかくならこれを使ってもらいたい。自動生成したパスワードを手打ちするのは面倒なので、簡単に利用してもらえる方法をいくつか試してみた。

QRコードで設定する

ZXingというライブラリの仕様が広く一般に利用されているようで(要出典)、これに沿ってQRコードを作っておけばiOS/AndroidデフォルトのQRコードリーダーでWi-Fiの設定をすることができる。

具体的には以下のようなテキストをQRコード化しておけば良い。

WIFI:T:WPA;S:${SSID};P:${PASSWORD};;

ポストカードに印刷するのもよさそう。

NFCで設定する (主にAndroid向け)

NFCに資格情報を書き込み、端末でタッチすることでWi-Fiの設定をすることもできる。先日偶然NFCのシールを購入していたのでこれに書き込んでみる。書き込みはNFC Toolsというアプリが一般に使われていそう? なのでこれを利用する。

NFC Tools

NFC Tools

  • wakdev
  • ユーティリティ
  • 無料
apps.apple.com

play.google.com

Wi-Fiの設定を作って書き込み / 読み込み / Androidで読み込んだスクリーンショット

Androidは標準でNFCからWi-Fiを設定する機能が組み込まれているけれど、iOSには存在しない。なので、わざわざアプリを入れないと設定できないのが難しいポイント。

構成プロファイルを用意する (iOSとmacOSのみ)

まあこれは無いかな〜と思うんだけど一応。

macOSのApp StoreでApple Configuratorをダウンロードして、構成プロファイルを作ることができる。

Apple Configurator

Apple Configurator

  • Apple
  • ユーティリティ
  • 無料
apps.apple.com

これをAirDropでiOSやmacOSに転送してあげると、Wi-Fiの設定をすることができる。

Apple Configuratorで構成プロファイルを作る

1Passwordで共有する

最近は1Passwordが結構よくなっていて、1Passwordのアカウントを持っていない相手にも共有できるようになっている。ただし、相手のメールアドレスを知っていることが前提となる。メールアドレスを入力してリンクを生成し、これを共有する。

共有された側はメールアドレスを入力すると認証コードが届くので、これを入力する。

共有する側、される側

これでWebブラウザ上でパスワードを確認できる。

表示されたSSIDとパスワード

相手のメールアドレスを知っていて、かつこういう操作に苦がないならこれが一番良いのではないか。


いろいろ試してみたけど、スマートフォンに関してはQRコードが一番簡単であろうから、これを用意することにした。Switchとかゲーム機を繋ぎたいということになったら、自分の1Passwordに入れておいた資格情報を見せて直接手入力してもらうことになるかなー。

保存していないファイルでvim-quickrunを実行する

めちゃくちゃ小ネタだけど便利に使っているので。

vim-quickrunはこれ。vim-plugなりなんなりで入れましょう。

github.com

普通は保存してるファイルを開いて実行するとかそういう感じだと思うんだけど、保存せずにその場でシュッと実行したいことがある。保存していない状態だとquickrunが何を実行すればいいのか認識してくれないので :set ft=sh とかして拡張子を指定してあげればその場で実行できる。

特定の文字列を一気に編集してその場で実行したい、とかのときに便利。具体的には

hello,world,hoge,fuga

みたいな文字列があったとして :%s/,/\n/ で行を分割して

hello
world
hoge
fuga

vim-surroundで文字列として包んで

"hello"
"world"
"hoge"
"fuga"

visual blockで一気に編集して

open "https://google.com/search?q=hello"
open "https://google.com/search?q=world"
open "https://google.com/search?q=hoge"
open "https://google.com/search?q=fuga"

これでquickrunすると一気に検索結果を開ける、みたいな……

xargsとか駆使すれば同様のことはできるけど、手札として持っておけると結構便利。

iPhoneとRaspberry PiでWOLのパケットを送ってWindows端末を起動する

最近iPhone 14 Pro Maxを購入した。写真を撮るためだとかマンガを読むためだとかいろいろ理由をつけて買ったが実のところRemote DesktopでWindowsに繋いで適度なサイズの画面でノベルゲームをしたかったのだった。

Remote Desktopで接続することはできたが、しばらく放置しているとスリープ状態になってしまい、わざわざ机の下にあるWindows端末の電源ボタンを押さないといけない。布団でぬくぬくゲームをしようというときにわざわざ出るのは面倒なのでiPhoneから起動できるようにした。いまも昔もこういう操作をシュッとやるならWake-on-LANと相場が決まっている。この記事はWake-on-LANをiPhoneからやろうという話。

iOS向けのアプリとしてWOLのマジックパケットを送出できるものはあるけれど、得体の知れないものを入れるのはやや抵抗がある。最近のiOSには純正のショートカットアプリがあり、SSHで任意のコマンドを発行できるので、これを利用してRaspberry Pi上からマジックパケットを送出するのがよかろうと考えた。いまやRaspberry Piはどこにも在庫がないけど、手元にいくつか余っているのでこれを利用した。Raspberry PiでなくてもNano PiやOrange Piとかでもだいたい同じことができるはず。

WOLの設定

Windows上で、まずはIPをDHCPではなく固定にしておく。続いてデバイスマネージャから利用している有線LANのインターフェースのプロパティを開き、WOLを有効にしておく。加えて、UEFIの設定でもWOLを有効にする。このあたりはマザーボードによって違いそう。最後にインターフェースのMACアドレスを控えておく。マジックパケットはこのMACアドレス宛に送ることになる。

この状態で動くかどうかを確認しておくと良い。Arch Linuxであれば wol コマンドでマジックパケットを送出できる。

$ wol MAC_ADDR

スリープや休止状態であれば復帰できたが、完全に止めた状態から起動することはできなかった。そういうものだった気がする。

Raspberry Piの初期設定

masawada.hatenablog.jp

以前書いた通りRaspberry Pi用のSDカードはRaspberry Pi Imagerで作ることができる。最近はSSH用のパスワードの設定などもできて便利。できあがったSDカードの / 直下に touch ssh などでsshという名前の空ファイルを作っておけば立ち上げ時にsshdも起動する。

Raspberry Piは起動するとDHCPでIPを取得しにいくので、 arp-scan でこれを確認してsshする。

$ sudo arp-scan -l
Interface: eno1, type: EN10MB, MAC: **:**:**:**:**:**, IPv4: 192.168.0.101
Starting arp-scan 1.9.8 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.0.1     **:**:**:**:**:**       YAMAHA CORPORATION
192.168.0.10    **:**:**:**:**:**       ASRock Incorporation
192.168.0.102   **:**:**:**:**:**       Raspberry Pi Foundation

こういう調子。このIPにSSHで接続して、さらにIPを固定にする。 /etc/dhcpcd.conf を編集しつつ再起動すればOK。最後にWOLのマジックパケットを送出するアプリケーションを入れておく。

$ sudo apt install wakeonlan

iOSの設定

ショートカットアプリを開いて新規ショートカットを作成し、以下のように設定を行う。

MACアドレスやホストなどは環境に応じた値を入れる

SSH用の鍵はiOS側が生成してくれるので、公開鍵をコピーしてRaspberry Pi側に登録しておく。

あとはこのショートカットを実行すれば、Windowsが起動する。

SSHで任意のコマンドを実行できるので応用の幅が広くて便利そう。

スペース区切りの文字列を2つずつ取って表示

usbhid-dumpでdumpしたUSBのreport descriptorを見るとき、2byteで1セットになることが多い(当然例外はめっちゃあるが…)ので一旦2項目ずつに整理して見てみたい。つまり

003:007:000:DESCRIPTOR         1668742987.009398
 05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01
 75 01 95 08 81 02 75 08 95 01 81 01 05 08 19 01
 29 05 75 01 95 05 91 02 75 03 95 01 91 01 05 07
 19 00 2A FF 00 15 00 26 FF 00 75 08 95 06 81 00
 C0

これを

05 01
09 06
A1 01
05 07
...
75 08
95 06
81 00
C0

こうしたい。間違ってるところはあとで修正する前提。Rubyだと近いことを Enumerable#each_slice でできる。

シュッとワンライナー書けないかな〜と思っていたところ、xargsでそれっぽいことができそうだった。05 01 09 ... をクリップボードに入れておいて

$ xsel -ob | sed 's/ /\n/g' | grep -v '^$' | xargs -L2 echo
05 01
09 06
A1 01
05 07
...
75 08
95 06
81 00
C0

という調子。xargsの -L オプションを指定すると一回で複数の引数を取って展開してくれるので、単純にこれをechoする。普段便利に使ってるコマンドでも意外と知らないオプションがある。


そしてこの記事を書き終えた後に

$ sudo usbhid-dump -e descriptor -a ***:*** | grep -v : | xxd -r -p | hidrd-convert -o code
0x05, 0x01,         /*  Usage Page (Desktop),               */
0x09, 0x02,         /*  Usage (Mouse),                      */
0xA1, 0x01,         /*  Collection (Application),           */
0x09, 0x01,         /*      Usage (Pointer),                */

で一番やりたかったことができるのを知るのであった……