WPP
dock 風ラウンチャ Plank を使う

以前から使っていて、再セットアップ時に名前を思い出せなかったので記事にします。完全に備忘録ですね。

いわゆる MacOS のドック風のしたからせり出してくるラウンチャ

同様のアプリは Cairo-dock のほうがメジャーらしいのですがプラグインがたくさんあるけど、きっと使わないだろうと思い Plank にしました。

$ sudo apt install plank
; 設定するには
$ plank --preferences

設定画面には、ラウンチャーを表示してアプリとアプリの間の起動しない下地の部分で右クリックすれば行けるのですがこれがなかなか難しいのでコマンドもメモ。

Icon Zoom: を設定してやると Mac みたいにビューンとアイコンが大きくなる動作をします。まあ、まんまです。

コマンドの存在を忘れるとそもそも思い出すのも面倒なのでどっちのほうが簡単かは悩ましいところ。

参考

Ubuntuで使用できるMacのドックのようなPlankの使い方 | virtualiment

apt install で ポストインストール時の configure でエラー

さて、先日から ROS2 をいじっているのですが ROS2 用のビルド環境を Podman に構築中に上のエラーに遭遇しました。そのときは libc-bin パッケージのポストインストールで失敗していました。

環境

  • Ubuntu 22.04.5 (arm64)
  • Podman 4.9.3

たまたま、 Podman + arm ubuntu で起きているだけで、現象そのものはどの debian 系 OS でも起きると思います。がこの組み合わせだと必ず起きるのかもしれないです。

対策

どこで失敗しているかはこのコマンドで確認できます。

$ sudo dpkg --audit

通常なら apt install -f で不完全なパッケージのインストールをやり直せるはずですが今回はだめでした。

しかたなく、libc-bin のポストインストール設定を削除することにします。

.postinit、.postrm、.prerm があるはずなのでそれらを削除する。(なければないで良い)

$ cd /var/lib/dpkg/info
$ sudo rm libc-bin.postinit libc-binpostrm libc-bin.prerm
$ sudo dpkg --configure libc-bin

闇雲に削除してしまって、問題が起きそうだが、それはその時で。

Podman に arm(ラズパイ)の ROS2 環境を作っているので、ちゃんと動いたらそれも記事にしよう。

参考

dpkgやapt-get関連でエラーが出た時の対処法 #Linux – Qiita

Ubuntu 22.04 で Unable update “Snap Store”: といわれアップデートできない

先週から ROS2 をラズパイ 4 で動かし始めています、ROS2 の対応 OS が Ubuntu 22.04 なので RaspberryOS を諦めて素直に U22 にしています。

同じ Debian 系とはいえ普段使っている Linux Mint とも RaspberryOS ともビミョーに異なり、困らないもののストレスフルな毎日です。

表題ですが Snap Store (Ubuntu Software) で Snap Store のアップデートがあるので更新しようとしてもエラーメッセージ「Unable update “Snap Store”: snap … 」とでてアップデートできません。試しに再起動を試みましたが現象変わらず。

以下のコマンドで回避できました。

$ killall snap-store
$ sudo snap refresh snap-store

Ubuntu は多分 Gnome でつかっているんだけどやっぱり遅くてあまり好きになれない。ROS2 動かす GUI はいらないのだけど、カメラのデータを扱いたいのでぱっと確認しやすい GUI ありのがいいのよね。

参考

How to close the Snap Store to allow Snapd to update it – Project Discussion / Snap Store – Ubuntu Community Hub

Raspberry Pi4 bookworm で NoMachine を動かす

ROS2 を ラズパイに入れようと思い久しぶりに pi4 を起動した。NoMachine をインストールしたが動かないのでトラブルシューティングした話。Linux の vnc セッテイングがどうも理解できなくてあまり好きじゃないので NoMachine を好んで使っている。NoMachine ならインストールだけで基本OK。

参考のスレッドによると、Wayland だと NoMachine が正常に動作しないらしい。

回避手順

ssh か 一旦 vnc をオンにして cui で sudo raspi-config を実行する。

6. Advanced Options に進む

A6. Wayland に進む

W1 X11 を選択する

参考

NoMachine Forum – Raspberry Pi 5 not working with NoMachine

mac アドレスをローカルで検索するスクリプトを Claude に書いてもらう

時々 mac アドレスから機器のベンダーを調べたいときがあります、例えば DHCP で割り当てられたアドレスがどの機器なのかを知りたいときなんかです。そんなときはいつもベンダールックアップできる Web サイトを使用していたのですが、ターミナルからできたら便利かもしれないと思い Claude に聞いてみました。

先に結果から載せますが、こういう関数を定義すれば OK でした。

mac_lookup() {
    for mac in "$@"; do
        vendor_code=$(echo "$mac" | tr ':' '-' | cut -d'-' -f1,2,3)
        echo "MAC: $mac"
        grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
        echo
    done
}

これを ~/.bashrc に追記するなり、別ファイルにして source xxx としてもいいです。

oui.txt は LM22 (多分 Ubuntu 系も同じパス) なので他の Linux では少し異なるかもしれない。

使い方は、 mac_lookup xx:xx:xx:yy:yy:yy みたいな感じでコマンド叩けばいい。区切り文字は : か – のいずれかで必須です。中で grep しているだけなので全桁なくても動きます。
想定しているのは、上位6桁ですが、それ以外の一部分を検索することはないだろう。

Claude とのセッション

ほぼコードは書いていなくて数分で完成まで至ったのはちょっと感動。

以下は Claude とのセッションの様子。

Q: linux のターミナルで mac アドレスからベンダー情報をルックアップすることができるコマンドはある?

Claude: はい、macchanger というツールを使うことができます:

sudo apt install macchanger
macchanger -l | grep "開始の3バイト"

または、ieee-oui-lookup-list パッケージを使う方法もあります:

sudo apt install ieee-oui-lookup-list
grep "MACアドレスの最初の6文字" /usr/share/ieee-oui/oui.txt

例えば、MACアドレスが 00:11:22:33:44:55 の場合:

grep "00:11:22" /usr/share/ieee-oui/oui.txt

これらのツールはインストールが必要ですが、実際に試してみましょうか?

Q: ubuntu をつかっているのだけど、ieee-oui-lookup-list じゃなくて ieee-data じゃない?

Claude: ご指摘ありがとうございます。その通りです!

Ubuntuでは ieee-data パッケージを使います:

sudo apt install ieee-data
grep "MACアドレスの最初の6文字" /usr/share/ieee-data/oui.txt

例えば:

grep "00:11:22" /usr/share/ieee-data/oui.txt

私の以前の回答は間違っていました。正確な情報を共有できなかったことをお詫びします。

Q: : は – に変えないとだめじゃない?

Claude: はい、その通りです!申し訳ありません。

ieee-dataのデータベースでは、MACアドレスのフォーマットはハイフン(-)を使用します:

grep "00-11-22" /usr/share/ieee-data/oui.txt

コロン(:)からハイフン(-)に変換する必要があります。trコマンドを使って変換することもできます:

echo "00:11:22" | tr ':' '-' | xargs -I{} grep {} /usr/share/ieee-data/oui.txt

ご指摘ありがとうございます。より正確な情報をお伝えできました。

Q: もう少し改良してほしい。改良点は、フルレングスの mac アドレスを入力したらoui.txt をルックアップするようにして欲しい。

  • dc:a6:32:72:ef:e9 のようなマックアドレスを入力する
  • : を除いたベンダー部の上位6桁をルックアップする
  • アルファベットは大文字、小文字の両方を許容する
  • : の替わりに – が入力されることもある。

Claude: そうですね、それら全ての要件を満たすスクリプトを作成しましょう:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスを受け取り、
    # 最初の6文字(ベンダーコード)を抽出して大文字に変換
    vendor_code=$(echo "$1" | tr ':' '-' | tr '[:lower:]' '[:upper:]' | cut -d'-' -f1,2,3 | tr -d ':' | tr -d '-')
    
    # 2文字ずつハイフンで区切って検索
    formatted_code=$(echo $vendor_code | sed 's/./&/2;s/./&/5' | tr ' ' '-')
    
    grep -i "$formatted_code" /usr/share/ieee-data/oui.txt
}

# 使用例
mac_lookup "dc:a6:32:72:ef:e9"
# または
mac_lookup "DC-A6-32-72-EF-E9"

このスクリプトは:

  • コロン(:)またはハイフン(-)で区切られたMACアドレスを受け付け
  • 大文字小文字を問わず
  • 最初の6文字(OUI部分)を抽出
  • 適切なフォーマット(XX-XX-XX)に変換してルックアップ

これを.bashrcや.zshrcに追加して使うことができます。試してみましょうか?

いい感じだけど、不要な処理があるので指摘してみる。

Q: grep -i しているので tr で大文字変換は不要なんじゃない?

Claude: そうですね!ご指摘ありがとうございます。grep -iで大文字小文字を区別しない検索をしているので、tr ‘[:lower:]’ ‘[:upper:]’は不要です。
シンプルになったバージョンを作りましょう:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスから
    # 最初の6文字(ベンダーコード)を抽出
    vendor_code=$(echo "$1" | tr ':' '-' | cut -d'-' -f1,2,3 | tr -d '-')
    
    # 2文字ずつハイフンで区切って検索
    formatted_code=$(echo $vendor_code | sed 's/./&/2;s/./&/5' | tr ' ' '-')
    
    grep -i "$formatted_code" /usr/share/ieee-data/oui.txt
}

より簡潔で効率的になりました。

Q: cut -d の後の tr -d ‘-‘ も不要だと思う

Claude: そうですね!さらにシンプルにできます:

mac_lookup() {
    # コロンまたはハイフンで区切られたMACアドレスから
    # 最初の6文字(ベンダーコード)を抽出
    vendor_code=$(echo "$1" | tr ':' '-' | cut -d'-' -f1,2,3)
    
    grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
}

cut -d’-‘ -f1,2,3で既にXX-XX-XXの形式で取得できているので、フォーマットの変換も不要でした。無駄な処理を省いてよりシンプルになりました。

Q: 更に改良して、複数のマックアドレスを一度に入力できない?

Claude: はい、複数のMACアドレスを処理できるように改良しましょう:

mac_lookup() {
    for mac in "$@"; do
        vendor_code=$(echo "$mac" | tr ':' '-' | cut -d'-' -f1,2,3)
        echo "MAC: $mac"
        grep -i "$vendor_code" /usr/share/ieee-data/oui.txt
        echo
    done
}

使い方:

mac_lookup "dc:a6:32:72:ef:e9" "00:11:22:33:44:55" "aa:bb:cc:dd:ee:ff"

この改良版では:

  • 複数のMACアドレスをスペース区切りで入力可能
  • 各MACアドレスに対して元のアドレスを表示してから結果を表示
  • 見やすいように各結果の間に空行を挿入

いかがでしょうか?

こんなふうに、大雑把な指示でもわりといい感じでスクリプトを完成させられたのは便利だった。

どうでもいいけど、Claude の実行結果をワードプレスにコピペするの結構だるかった。何かいい方法ないだろうか?

LM22 タッチパッドの無効時間を調整

久々のエントリです。

以前も書いたかもしれませんが Thinkpad で Linux Mint 22 を動かしています。概ね快適なのですが 22 にアップグレードしてからどうも文字を入力している最中にカーソルが飛んでしまうことが多い気がしていました。

カーソルが飛んだついでに範囲指定されてしまい上書き入力されることが度々あり地味にイライラさせされています。

そんなのは Touchpad の設定で入力中は無効にすればいいじゃんと思いますが、このように設定済みですが、あまり効果はないみたいです。

System Settings – Mouse and Touchpad

しばらくは我慢していたのですが、耐えられなくなり少し探ってみます。Claude で聞いてみると ~/.config/autostart に設定ファイルがあるかもってことで見てみるとありました。

‘disable touchpad while typing.desktop’ ってファイルがそれっぽいです。中身はこんな感じです。

[Desktop Entry]
   2   │ Type=Application
   3   │ Exec=syndaemon -i .5 -K -t -R -d
   4   │ X-GNOME-Autostart-enabled=true
   5   │ NoDisplay=false
   6   │ Hidden=false
   7   │ Name[en_US]=disable touch while typing
   8   │ Comment[en_US]=must be disable 'Touchpad while input'
   9   │ X-GNOME-Autostart-Delay=0

Exec で syndaemon を起動しています。その引数がパラメータなのですが、インターバル(タイムアウト)を意味する -i の値を GUI では変えられなさそうです。

それぞれのパラーメータの意味は、

-i 無効化する秒数を設定(少数指定できるっぽい)
-K タイピング中は無効にする
-t タップのみ無効にする(カーソル移動は可能)
-R テンキー入力中は除外(無効にしない)
-D デーモンとして実効

っていう感じらしいです。 .5 が短すぎるかもしれないのと、-t が邪魔してそうなので一旦

$ pskill syndaemon
$ syndaemon -i 1.2 -K -R -d

としてみると良さげな感じ。

永続化するために ‘disable touchpad while typing.desktop’ の syndaemon のところを下のように書き換えた。

syndaemon -i 1.2 -K -R -d

autostart を反映させるには、一旦ログオフしてから再度ログインする必要がある。

こういう微調整の方法が残されているのが Linux のいいところではあるが一方でいちいち面倒なのも確か。ともあれこれでいい感じになかもしれない。

LM22 に天気アプレットを追加する

突然ですが、スマホのメイン画面を左にスワイプすると天気予報表示されますが、地味に便利だと思いませんか?
というわけで LM22 というか cinnamon に天気予報を表示する小ネタです。

他のデスクトップ環境でも同じような感じですが、cinnamon ではデスクトップに表示する desklet やメニューパネル(タスクバー ?) に表示する applet を追加できます。

自分はデスクトップに多くのウィンドウを開きっぱなしにするスタイルなので desklet は向かないので applet を追加することにします。

手順

メニューバーで右クリックし、Panel Settings に入ります。

Weather を選んで + をクリックします。

Applet 追加

Data service は OpenWeatherMap か Open-Metro を選びます。他は多分動きません。API Key は無ければ空でも OK です。

Weather タブ設定

自分の場合 Location タブでは、Manual Location を ON にしないと動作しませんでした。
Location に Tokyo, JP のように表示する場所を設定します。市単位でも検索に引っかかることがあるので色々やってみてください。

Location タブ

検索で見つかるようになれば、下のように天気が表示されます。

動作している様子

参考

Cinnamon Spices

LM22 (Ubuntu 24.04) で pyrealsense2 をセットアップするためにしたあれこれ

結論からいうと pyenv で python 3.11 入れれば OK。

LM22 (Ubuntu 24.04相当) には、python 3.12 が入っていて pyrealsense2 を pip でインストールできなかったので、当初仕方なくビルドしました。

ビルドには成功しましたが、自分の知識では pipenv 環境下に配置することができずに結局は pyenv で python3.11 をインストールし pip しました。
pipenv 環境下でビルドすると仮想環境の lib に make インストールすることになるようでインストールした pyrealsense2 を pipenv から認識することができませんでした。

ビルドの方法はこんな感じ、必要に応じて -dev パッケージは追加してください。

$ git clone 
$ sudo apt install libssl-dev
$ sudo apt-get install libglfw3-dev 
$ sudo apt install  libudev-dev
$ sudo apt install libusb-dev- libusb-1.0-0-dev


$ git clone https://github.com/IntelRealSense/librealsense.git realsense
$ cd realsense
$ git checkout v.2.56.2
$ mkdir build
$ cd build
$ cmake ../ -DBUILD_PYTHON_BINDINGS:bool=true -DBUILD_EXAMPLES:bool=true -DBUILD_PYTHON_DOCS=true

$ make -j4

pythonサンプルは [cloneしたフォルダ]/wrappers/python/examples の中に入っている。

冒頭にも書いている通り pyenv で python 3.11 をインストールした。というのも LM22 (多分 Ubuntu 24.04 も) Python 3.12 以下のバージョンのパッケージは用意されていないので apt でインストールできない。
なので、pyenv を使って以下の手順で回避した。(もちろん pyenv でなくてもいい)

$ curl https://pyenv.run | bash
$ pyenv local 3.11
$ pipenv shell
$ pipenv install pyrealsense2

; エラーがでなければインストールに成功している。
$ python 
Python 3.11.10 (main, Oct 24 2024, 17:33:16) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyrealsense2
>>> 

誤って .python-version を消さないようにしなくちゃ。

参考

librealsense/wrappers/python at master · IntelRealSense/librealsense

IME辞書を自動で Synology Drive にバックアップ

最近こっている事の一つにIME辞書にショートカットを登録することがある。そうすると IME 辞書をバックアップしたくなる。

IME 辞書そのものは普通のファイルなので単にコピーするだけで OK ですが、まあ面倒くさい。Win11 で試した限り辞書の保存場所を変える方法はなさそう。

自分の 場合辞書は
C:\Users\ユーザー名\AppData\Roaming\Microsoft\IME\15.0\IMEJP\UserDict
に保存されている。

これをなんとかして Synology Drive のフォルダにコピーできればバックアップができて、それを定期的に実行すれば自動バックアップの完成という訳。

NAS がなくとも、この自動コピーの仕組みでバックアップは実現できます。

手順

  1. 辞書ファイルのコピー

まずは、辞書をコピーするスクリプトを作成する。コピーには個人的な好みで cwRsync を使用する。

こんな感じになる。/cygdrive/c/ からはじめると c:\ の意味になるようだ。

rsync -av /cygdrive/c/Users/172369/AppData/Roaming/Microsoft/IME/15.0/IMEJP/UserDict/* /cygdrive/c/synologydriveのフォルダ/

cwrsync (rsync) は実際に試す前に -n を追加して (-avn) で実行する内容を試した方がいい。特にデリートコマンド系は危険。

もし、Windows標準の Robocopoy を使うならこんな感じ。(恥ずかしながらこのコマンド初めて知りました。)

Robocopy.exe C:\Users\172369\AppData\Roaming\Microsoft\IME\15.0\IMEJP\UserDict\ . C:\synologydriveのフォルダ /XO

Robocopy はかなり複雑なのでちょっと難しい印象。それで避けていたのかもしれない。

スクリプトを書く際に注意しなくてはいけないのは後段のタスクスケジューラで実行する時にカレントディレクトリがシステムディレクトリ(確か system32 だったか)になってしまうので .\ とかするとコピーができずに永遠に終わらなくなったりする。

  1. タスクスケジューラに登録

2つの参考リンクをミックスした感じで

[start] -> tasks と入力してタスクスケジューラを起動する。

新しいタスクの作成にすすみ、名前を適当に入れる。
今回は、コピー元、コピー先ともに自分自身がオーナーのユーザーフォルダなので実行するユーザーを変更する必要はない。

[トリガー]タブは、[毎日]、[繰り返し間隔] [1時間] に設定する。

[操作]タブ、
プログラム: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加: 作成したスクリプトのフルパス
自分の環境では ExecutionPolicy を許可ずみなので -ExecutionPolicy Bypass は不要でした。

ちょっと面倒ですがここまですると、 Synology Drive へ定期コピーし Synology Drive が NAS へ同期

することで自動バックアップする一連の流れを設定とすることができました。

参考

cwRsync – Rsync for Windows | itefix.net

Robocopyの基本動作とコマンドオプション解説

Windows10でPowerShellスクリプトをスケジュール実行する – 3テラバイト

タスクスケジューラでPowerShell スクリプトを実行する | Windows 実践ガイド