2026年6月7日日曜日

XR_Animatorで3Dモデルを動かす

以前作ったモデルをモーションキャプチャーで動かしたかった。 

ちょっと調べてみたところXR_Animatorとかいうソフトがあるらしい。electronで作ってあり、windowsでもlinuxでも動くようなのでやってみた。

起動して、vrmファイルをドラッグアンドドロップする。 

 

 一番左のアイコンをダブルクリックする。

できた。簡単。
 

2026年6月3日水曜日

pythonのkeyboardモジュールがroot権限を要求してきて困る

windowsのpythonでkeyboardモジュールを使って作ったプログラムがある。

キー入力「ctr l+g」とかで何かを実行する みたいな処理をするのに使っていたが、最近はほぼlinuxをメインで使ってるのでlinuxで動かしたい。

が、linuxでpythonのkeyboardを使うとroot権限が必要と言われて動かない。それでは困るのだ。

なんでも良いから動けばいいので、とりあえず以下のように回避した。

回避方法

とりあえずvenv環境でpythonを動かしてkeyboardを入れる。 (keyboard version 0.13.5)

python -m venv venv
. venv/bin/activate
pip install keyboard 

このvenvの中のkeyboardをいじって動くようにする。まずは以下の部分でrootを要求しているので、無効にする。

venv/lib/python3.13/site-packages/keyboard/_nixcommon.py

def ensure_root():
    if os.geteuid() != 0:
-        raise ImportError('You must be root to use this library on linux.')
+       pass

次は/dev/input/event*へのアクセスができれば良い。見たところinputグループに入っていればアクセスできる。

usermod -aG input ユーザ名

これでも以下でエラーが出る。

File "/usr/lib/python3.13/subprocess.py", line 577, in run
    raise CalledProcessError(retcode, process.args,
                             output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['dumpkeys', '--keys-only']' returned non-zero exit status 1.

「dumpkeys --keys-only」を使っているようだが、rootじゃないとエラーになる。ディストリによるのかもしれないが、こっちはグループでどうにかなるものじゃなさそう。/dev/consoleをa+rwにしてもいいとは思うが、なんか怖いので以下のようにした。

一旦sudoで動かして結果を取っておく。

sudo dumpkeys --keys-only > keys

そして、dumpkeysで取得すべき出力をcatで代替する。

    synonyms_template = r'^(\S+)\s+for (.+)$'
-    dump = check_output(['dumpkeys', '--keys-only'], universal_newlines=True)
+    dump = check_output(['cat', 'keys'], universal_newlines=True)
    for synonym_str, original_str in re.findall(synonyms_template, dump, re.MULTILINE):

問題なく動いた。 

その後 

ふと公式を見ると、masterブランチでは解決されているっぽい?また車輪の再発明をしてしまったのか?

https://github.com/boppreh/keyboard/commit/7f03a3d567b484ae6c2beebe2fe537be7643f7a9 

よく見ると/dev/consoleがttyグループでアクセスできる前提っぽい。それじゃあ動かねえんだよなあ。一応無駄ではなかったような気がするので良しとする。

2026年5月31日日曜日

godotでandroid向けアプリを作る

godotで遊んでみて、適当に子供向けのプログラムを作った。ただミャクミャクが降ってきて物理演算しているだけだが、4〜5歳児としてはそこそこ暇つぶしにはなるようだ。

外出時にグダグダ言い出したときに与えられるようにandroidで動くようにしたが、godotだと意外と簡単だった。

と言ってもやったのは数ヶ月前なので、すでにかなりの部分を忘れてしまったが思い出した部分を書いておく。

操作

そのままandroidに持っていくと動かせなくて何も面白くない。CanvasLayerを作ってボタンを置いて、Actionを紐付ける。アイコンはgimpで文字書いたpngを作っただけ。これが一番面倒だった。

加速度センサーを使いたかったがうまく行かなくて断念。断念したあとに[プロジェクト設定] ->[入力デバイス]のところに加速度センサーとかを有効にする設定を見つけた。多分これチェックしておけば動いたんじゃなかろうか。まあもう面倒だからまた今度でいいや。 

android-sdk

android-sdkを入れる。javaも必要だった気がするが、自動的に入ったかもしれない。

apt install android-sdk

インストールしたらエディタの設定で指定する。linuxだとaptで入れるだけで便利。

debianでは/usr/lib/android-sdkに入るようだ。javaもdefault-javaのjvmを指定する。(/usr/lib/jvm/default-java)

export-templates

godotのサイトのダウンロードからexport-templatesとやらをダウンロードする。

ダウンロードしたら[エディター] -> [エクスポートテンプレートの管理]からインストールする。

多分これがgodotのメインアプリになって、あとはこの上でgdscriptが動くだけなんだろう。

c#を使っている場合はどうするんだろうと思ったが、export-templatesのc#版がありそうなのでそれで動くんだろうか。

export

[プロジェクト] -> [エクスポート]でエクスポートする。


できたapkファイルをandroidに持っていってインストールする。

実行

動いた。

いくつかandroidに入れてみて大体はなんの問題もなく動いたが、AQUOS sense 10だけ何か動きがおかしかった。弾を撃っても弾が動かない。

FPSの問題っぽい気がしたので、「なめらかハイスピード表示」とやらをgodotのアプリだけOFFにしたら問題が解決した。なめらかハイスピード表示とやらで 120FPSとかになっているのかもしれない。それによって時間の計算がうまく行かず弾が進まない?よくわからないがとりあえずOFFにして解決したので良しとする。

まあそもそもミャクミャクを弾で撃つなと言う話でもある。 

2026年5月29日金曜日

linuxのfirefoxでPasskeyを使いたい

linuxのfirefoxでパスキーを使いたい。現状では何か物理キーを繋げてないと動かなそうな感じ。なんとかしたいと思って調べたところ、keepass-xcがpasskeyに対応しているらしい。  

とりあえずやってみる。

拡張機能を入れる

KeePassXC-Browserをインストール 

拡張機能の設定で「パスキーを有効にする」 をやっておく。

keepass-xcインストール

なんとなくfullで入れておく。

apt install keepassxc-full

入れたらデータベースを作って動かす。

設定で「ブラウザー統合を有効にする」 とし、KeePassXC-Browserと接続する。

テスト

とりあえずパスキーを使っているサイトでパスキーを作ってみると、KeePassXCに登録できたっぽい。中銀証券ではログインもできた。

楽天証券はすでに作成済みと言って作らせてもらえなかったが、一回消したら登録できた。ログインも問題なし。だが、今度はlinuxのfirefoxからしかログインできなくなってしまう。

googleのパスワードマネージャーで登録しておいて、そこからエクスポートできれば良いんだが。まだできない?ようだ。 

とりあえずパスキーは使えるようになったが、本命の楽天証券が一箇所からしかログインできなくて不便だ。なんで一つしか登録できねーんだよアホか。 

と思ったら一旦電話認証で一時的にパスワード認証に変更してログインして パスキー追加できた。解決。アホとか言ってすいませんでした。

他の方法

firefoxでやろうとすると結構大変だが、 他のやり方もありそう。

chromeを使う 

chromeだとlinuxでもパスキーが使える。何も難しいことはない。androidともパスキーの同期が取れる。

が、chromeは使いたくない。スマホで使うときに広告ブロックできないからだ。ブックマークをスマホとPCで同期したいので必然的にPCでもfirefoxを使っている。

物理的なキーを使う

Yubikey?とやらを買えばできそうな気はするが、何か1万円くらいしそう。chrome使えばいいだけのものに1万円は払いたくない。

拡張機能? 

もう少しどうにかならんかと思って探していたら、そういうfirefox拡張機能(linux passkey manager?)がありそう?

が、どう考えてもユーザ数が少ないし、レビュー0件。
これを脳死で使うのはさすがに恐ろしすぎる。


2026年5月23日土曜日

428クリア

428の続編を作るプロジェクトが始まったようだ。楽しみではあるが何か内輪の同窓会みたいにならないか心配でもある。フレッシュな人も居てほしいなあ。金八先生のゲームも面白かったので期待はしたい。 

とりあえず久しぶりに思い出したので、結構前に買ったsteamで428のトロフィーコンプリートした。

昔は428のためだけにwiiを買ったのだが、今はsteamでもできて非常にありがたい。街も出してほしいが何か難しいんだろうか?PS版もあったような気がするんだけど。 


 前に買ったときはwindowsで遊んでいたが、今はlinux上のsteamでも問題なく動く。昔のwineからは考えられないくらい進化しててすごい。下手したら今のwindowsで動かなくなった昔のソフトとかも動かせるんじゃないだろうか。

一つ不具合っぽいものとしては安物bluetoothコントローラーの接続が切れたら一回立ち上げ直さないとジョイスティック操作できないくらい。(元からなのかwineのせいなのかはわからない)

2026年5月21日木曜日

systemdのDynamicUserに引っかかってRead Only Filesystemエラー

 前回、luanti-serverをraspberry-piで動かすようにした。とくに問題なく快適に動いている。ただ、よく考えるとrootファイルシステムはmicroSDなので、頻繁に書き込みが発生しそうなマイクラクローンのデータを置いておくのは良くないような気がしてきた。

USB接続のHDDをつけてるので、そこに移動しようとしてみたが、色々引っかかって難航。

systemdのDynamicUser

[Service]
Restart=on-failure
DynamicUser=yes
ExecStart=/usr/libexec/luanti/luantiserver --config /etc/luanti/default.conf --logfile /var/log/luanti/default/server.log --gameid $LUANTI_GAMEID
Environment=MINETEST_USER_PATH=/var/lib/luanti/default
Environment=MINETEST_MOD_PATH=/usr/share/games/minetest/mods
Environment=LUANTI_GAMEID=minetest_game
EnvironmentFile=-/etc/luanti/default.env
StateDirectory=luanti/default
LogsDirectory=luanti/default

systemdのluanti-serverのサービスは上記のようになっている。MINETEST_USER_PATHを/etc/luanti/default.envで変えればそれだけで変更できそうだと思ったが動かなかった。

2026-05-21 01:00:36: ERROR[Main]: Failed to open "/mnt/disk/luanti/default/worlds/world1/ipban.txt.~mt0": Read-only file system 

何度やってもworldデータに書き込めない(Read Only Filesystem)みたいなエラーが出て起動できない。systemdから動かすとNGでrootで動かすとOK。cp -aでコピーしたから権限は問題ないはず。。。と思ったのが間違い。そもそもchmod -R a+wとしても駄目。なぜなんだ。

psをよく見ると存在しないluanti-serverみたいなユーザで動いていて、データファイルはnobodyユーザの持ち物になっている。

なんでnobodyの持ち物に書き込みできるんだ?と思ったら、どうやら上記DynamicUser=yesとなっている場合に、/var/lib/private以下のStateDirectoryで指定したパスを動的に作られたユーザ権限?で使う仕組みになっているようだった。 

そういう状態なのに別の場所に置いているパスを指定してもそこはDynamicUserでは書き込み権限が無いという仕組みのようだ。 

 DynamicUserをやめるか、なんとかして/var/lib/private/luanti/default以下に見えるようにしなければ動かない。できるだけインストールされているsystemdのファイルはいじりたくなかったので、bindマウントでなんとかした。

とりあえずこれで起動はうまく行った。

USB-HDD遅い

これで安心と思ったのも束の間、実際動かしてみるとかなり遅い。microSDより遅いってのはどういうことだろう。

raspberry-piのUSBドライバの問題という話も見たが、関係なさそうだ。(uasだと遅い?のでusb-storageにすると良いらしい?けど、usb-storageになっている。)

hdparmの値を見る限りではSDよりもHDDのほうが早いのでそんなに遅いってこともなさそう。HDDだとSDに比べてランダムアクセスが遅いのでそこが致命的なんだろうか。SSDにしてみると良いのかもしれない。 

とりあえず今のところこれは未解決。SSD買うのももったいないので、一旦そのへんのUSBメモリを使って試してみたりしてみるか。。 

2026年4月30日木曜日

マインクラフトクローンのluantiを使ってみる

今空前のマイクラブームが来ている(我が家の娘たちの中で)。
といってもただyoutubeのマイクラで作った動画をただ見ているだけである。 

ただyoutubeをダラダラ見るよりは、ゲームをやったほうが多少なりとも能動的に何かをするという点でマシではないかと個人的には思っているが、ゲームはNGという嫁の許可が出なかった。マイクラであれば教育にも使われていて良さそうだという適当な話が嫁の耳に入ってきているようなので、やっても良さそうな雰囲気が出てきた。

luanti - voxelibre

マインクラフトを買い与えようかと一瞬思ったが、どうせすぐ飽きるし、不器用なので操作できないと言って放り出す可能性がかなり高い。そんなものに何千円も払うのはもったいないので、とりあえずマイクラクローンを与えて様子を見てみることにした。 

とりあえずluantiを入れる。

apt install luanti

これはマイクラっぽいものを作るゲームエンジンであって、これだけだとゲームにならない。luantiの上にゲームを入れる必要がある。minecloniaとvoxelibreが有名どころのようだ。  

画面下段の+ボタンからVoxeLibreを入れてワールドを新規作成すれば遊べる。左のホストサーバーにチェックを入れると、他のPCから「ゲームに参加」でマルチプレイができる。

いきなりモンスターに襲われたら怖くてやめそうなので、ダメージ有効のチェックを外しておく。minecloniaだとダメージ無効にしても襲っては来てしまう。voxelibreだと透明人間になったような扱いで怖くなさそうなので、voxelibreを使うことにした。

コントローラー

とりあえず手元に有ったPS4コントローラーを使おうと思ったが、なかなか思うように設定できない。コントローラー入力をキー入力に変換するプログラムAntiMicroXというのが有ったのでそれを使用することにした。

本物のマイクラを触ったことが無いので正しい配置はわからないが、とりあえず以下で設定。中華linuxゲーム機にrocknixを入れるとluantiが実行でき、そのキー設定が以下のようになっていたので真似した形。

左ジョイスティック上下左右 - WSAD
右ジョイスティック上下左右 - マウス(視点変更)
↑ - C (カメラ変更)
←→ - マウススクロール(アイテム選択)
↓- I (インベントリ)
□ - Q (捨てる)
△ - V (ミニマップ表示)
◯ - K (飛行モード)
× - スペース (ジャンプ)
L1 - 左シフト (しゃがむ)
L2 - J (高速モード)
R1 - 左クリック(攻撃等)
R2 - 右クリック(アイテム設置)
OPTION - ESC

luanti-server

とりあえず遊ぶには上記でいいが、マルチプレイで遊ぶには、誰かのPCを動かしておく必要がある。 いちいち子供が遊ぶときにパソコンを動かすのは面倒なので、常時動かしているraspberry-piにサーバーを入れることにした。

apt install luanti-server

これで起動すると、voxelibreではなく、ほんとうに基本的なゲームであるminetestが起動する。voxelibreを使いたいのでやり方を調べた。

VoxeLibreを起動する設定

まずは、先程単体で動かしたときにダウンロードしたvoxelibreが~/.minetest/games/mineclone2に入っているので、これをサーバー上の/usr/share/luanti/games/mineclone2/に置く。 (voxelibreは旧名mineclone2だったようでファイル名等はmineclone2のままになっていたりする)

/usr/lib/systemd/system/luanti-server.serviceを見ると、/etc/luanti/default.envで起動するゲームを選択するようだ。

LUANTI_GAMEID=mineclone2

worldデータ置き場も環境変数で設定できるようだが、デフォルトでは/usr/lib/luanti/default/worldsになっているので、ここに単体で動かしたときにできた~/.minetest/worldsのデータを持ってきて置く

ダメージ無効とかの設定は/etc/luanti/default.confで行う

cat /etc/luanti/default.conf
server_description = Luanti server powered by Debian
server_announce = false
ipv6_server = true
motd = Welcome to Luanti. Enjoy your stay!
enable_pvp = false
enable_damage = false
name = ユーザ名

ユーザ名はluantiに参加するときに登録するIDで、ここで指定したユーザはサーバ管理者権限を持つ模様。banとかができる。

起動

systemctl start luanti-server

自動起動にしておく

systemctl enable luanti-server

ゲームに参加

あとはluantiのクライアントからゲームに参加する。最初はユーザ名を登録する必要がある。

あとは普通に遊べる

 

android用も出ており、スマホからもログインして遊べる。 

raspberry-piでは、samba、immich、pxeブート用のtftp/http、gitea、minidlna、tailscale、radiko録音とSIPサーバーを入れてあって、あとこのluantiサーバーが動いている。 ちょっと負荷が心配だったがサーバーを動かすだけならraspberry-piの負荷も大した事なさそう。