chromeだとlinuxでもパスキーが使えるらしいが、chromeは使いたくない。
どうにかならんかと思って探していたら、そういう拡張機能がありそう?
が、どう考えてもユーザ数が少ないし、レビュー0件。
これを脳死で使うのはさすがに恐ろしすぎる。保留。
chromeだとlinuxでもパスキーが使えるらしいが、chromeは使いたくない。
どうにかならんかと思って探していたら、そういう拡張機能がありそう?
が、どう考えてもユーザ数が少ないし、レビュー0件。
これを脳死で使うのはさすがに恐ろしすぎる。保留。
428の続編を作るプロジェクトが始まったようだ。楽しみではあるが何か内輪の同窓会みたいにならないか心配でもある。フレッシュな人も居てほしいなあ。金八先生のゲームも面白かったので期待はしたい。
とりあえず久しぶりに思い出したので、結構前に買ったsteamで428のトロフィーコンプリートした。
昔は428のためだけにwiiを買ったのだが、今はsteamでもできて非常にありがたい。街も出してほしいが何か難しいんだろうか?PS版もあったような気がするんだけど。
一つ不具合っぽいものとしては安物bluetoothコントローラーの接続が切れたら一回立ち上げ直さないとジョイスティック操作できないくらい。(元からなのかwineのせいなのかはわからない)
前回、luanti-serverをraspberry-piで動かすようにした。とくに問題なく快適に動いている。ただ、よく考えるとrootファイルシステムはmicroSDなので、頻繁に書き込みが発生しそうなマイクラクローンのデータを置いておくのは良くないような気がしてきた。
USB接続のHDDをつけてるので、そこに移動しようとしてみたが、色々引っかかって難航。
[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マウントでなんとかした。
とりあえずこれで起動はうまく行った。
これで安心と思ったのも束の間、実際動かしてみるとかなり遅い。microSDより遅いってのはどういうことだろう。
raspberry-piのUSBドライバの問題という話も見たが、関係なさそうだ。(uasだと遅い?のでusb-storageにすると良いらしい?けど、usb-storageになっている。)
hdparmの値を見る限りではSDよりもHDDのほうが早いのでそんなに遅いってこともなさそう。HDDだとSDに比べてランダムアクセスが遅いのでそこが致命的なんだろうか。SSDにしてみると良いのかもしれない。
とりあえず今のところこれは未解決。SSD買うのももったいないので、一旦そのへんのUSBメモリを使って試してみたりしてみるか。。
今空前のマイクラブームが来ている(我が家の娘たちの中で)。
といってもただyoutubeのマイクラで作った動画をただ見ているだけである。
ただyoutubeをダラダラ見るよりは、ゲームをやったほうが多少なりとも能動的に何かをするという点でマシではないかと個人的には思っているが、ゲームはNGという嫁の許可が出なかった。マイクラであれば教育にも使われていて良さそうだという適当な話が嫁の耳に入ってきているようなので、やっても良さそうな雰囲気が出てきた。
マインクラフトを買い与えようかと一瞬思ったが、どうせすぐ飽きるし、不器用なので操作できないと言って放り出す可能性がかなり高い。そんなものに何千円も払うのはもったいないので、とりあえずマイクラクローンを与えて様子を見てみることにした。
とりあえず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
とりあえず遊ぶには上記でいいが、マルチプレイで遊ぶには、誰かのPCを動かしておく必要がある。 いちいち子供が遊ぶときにパソコンを動かすのは面倒なので、常時動かしているraspberry-piにサーバーを入れることにした。
apt install luanti-server
これで起動すると、voxelibreではなく、ほんとうに基本的なゲームであるminetestが起動する。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の負荷も大した事なさそう。
pxeboot完全に理解した(チュートリアル的設定が出来た)ので設定メモっておこうと思っていたがついつい時間が経って大半を忘れてしまった。
再確認する気力は起きないので、覚えている範囲で書いて終わりにしておく。覚えている範囲では書いたつもりだが、ちょっと自信がない。
いざというときのためにSystemRescueCDをpxebootで実行できるようにしておきたかったのがきっかけで設定した。
たぶんこの辺を参考にして設定したような気がする。 他にも色々見て回ったが忘れてしまった。
dnsmasqを使う。/etc/dnsmasq.d/pxeboot.conf を編集。いろいろやって最終的には以下のようになった(詳細は後述)。サーバのIPは仮に192.168.11.50とする。
interface=lo,eth0
# dhcpはルータがやる。dhcp-proxyでpxeのところだけraspberry-piのdnsmasqがやる設定?
dhcp-range=192.168.11.0,proxy
# iPXE check: iPXEだと175が設定されるので、175が設定されてたらiPXEタグをセット
dhcp-match=set:iPXE,175
# キーで選択できるようにする(タイムアウト5秒)、F8は変えられないっぽい?
pxe-prompt="press F8 to select menu",5
# after iPXE
# tag:iPXEで、iPXEが設定されている場合のメニュー
pxe-service=tag:iPXE,x86PC,"BIOS autoexec.ipxe",ipxe/bios/autoexec.ipxe,192.168.11.50
pxe-service=tag:iPXE,x86-64_EFI,"EFI autoexec.ipxe",ipxe/efi/autoexec.ipxe,192.168.11.50
# 旧BIOS起動用
pxe-service=x86PC,"BIOS System Rescue CD",lpxelinux.0,192.168.11.50
pxe-service=x86PC,"BIOS iPXE",ipxe/bios/undionly.kpxe,192.168.11.50
pxe-service=x86PC,"BIOS netboot.xyz",netboot.xyz/pxelinux.0,192.168.11.50
# UEFI用
pxe-service=x86-64_EFI,"EFI System Rescue CD",syslinux.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE",ipxe/efi/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-legacy",ipxe/efi/ipxe-legacy.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-snponly",ipxe/efi/snponly.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb",ipxe/efi-sb/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb-snponly",ipxe/efi-sb/snponly.efi,192.168.11.50
pxe-service=x86-64_EFI,"EFI netboot",ipxe/netboot.xyz-snp.efi,192.168.11.50
openmediavaultを入れているので、tftpを設定するだけだった。/mnt/disk/tftpを作成してそこを指定した。
cdイメージを全部tftpから持ってくるとかなり遅いらしく、イメージはhttpから取ってくるものがある模様。よってhttpサーバーを立てる必要があるものがある。
いちいちhttpサーバー立てるのが面倒なので、openmediavaultのWebDAVを設定した。httpで取ってこれるので大丈夫そう。 tftpと同じところを指すようにした。openmediavaultの設定ではhttp://192.168..11.50/webdav/*でアクセスできる。
イメージはCDから持ってきて、ブートのところはsyslinux/pxelinuxをつかったはず。
apt install syslinux-efi pxelinux
インストールした以下のファイルをtftpのところに持ってくる。lpxelinuxとpxelinuxはどっちかでいいはず。なんかlpxelinuxのほうが良さそうなので、lpxelinuxを選んだ。
/usr/lib/PXELINUX/lpxelinux.0
/usr/lib/PXELINUX/pxelinux.0
/usr/lib/SYSLINUX.EFI/efi64/syslinux.efi
/usr/lib/syslinux/modules/bios/ldlinux.c32
/usr/lib/syslinux/modules/efi32/ldlinux.e32
/usr/lib/syslinux/modules/efi64/ldlinux.e64
syslinux/modulesの中には他にも色々ファイルがある。syslinuxの全機能を使いたいなら全部持ってきて置いておいたほうがいいのかもしれない。
dnsmasqの設定としては以下の部分となる。とりあえずこれでsyslinuxブートする。
# 旧BIOS起動用
pxe-service=x86PC,"BIOS System Rescue CD",lpxelinux.0,192.168.11.50
# UEFI用
pxe-service=x86-64_EFI,"EFI System Rescue CD",syslinux.efi,192.168.11.50
ディスクイメージの中のsysresccdをtftpとhttpサーバーに置く。
mount -o loop image.iso /tmp/disk
cp -a /tmp/disk/sysresccd /mnt/disk/tftp
syslinuxがブートしたらtftpのpxelinux.cfg/defaultが読まれるので、そこにブート設定を書く。どうやって読まれるファイルを調べたかというとvirtualboxでpxeブートしているところをwiresharkで調べた。マニュアルは読んでないので他にいいやり方があるかもしれないが知らない。
設定の内容はhttps://www.system-rescue.org/manual/PXE_network_booting/に書いてあるのを参考にjp106だけ追加設定した。
DEFAULT sysresccd
LABEL sysresccd
LINUX sysresccd/boot/x86_64/vmlinuz
INITRD sysresccd/boot/intel_ucode.img,sysresccd/boot/amd_ucode.img,sysresccd/boot/x86_64/sysresccd.img
APPEND archisobasedir=sysresccd ip=dhcp archiso_http_srv=http://192.168.11.50/webdav/ checksum setkmap=jp106
SYSAPPEND 3
LINUX,INITRDまではtftpで取ってきて、それ以降はinitrd上で動いたlinuxでhttpで取ってくると思われる。
SystemRescueCDは確かこれでうまく行ったような気がする。
pxebootについて調べているうちにnetboot.xyzとやらを見つけた。pxebootで色々なdistributionのCDブートイメージでブートできるようになるらしい。これも動かせるようになっておくと、なんか便利そうだったので入れてみた。
netboot.xyzはただのPXEではなく、iPXEが必要らしい。おそらくhttpアクセスとかが必要だからだろう。当然うちの激古パソコンにはそんなものはないので、一旦PXEブートでiPXEになってからnetboot.xyzをブートしなくてはいけないようだった。
まずはiPXEにならなければならない。netboot.xyz(https://netboot.xyz/downloads)とか、iPXE本家(https://ipxe.org/download) からiPXEブートするバイナリを取ってきてtftpに置く。
それをブートする設定が以下のあたり。 やってみたところ、UEFIはどうしてもその後のnetboot.xyzからの起動ができなかった。パソコンが古いせいかもしれない。色々コメントしてあるのはその試行錯誤の残骸である。
BIOSはうまく行った(はず)。iPXEになりさえすれば、iPXEのバイナリでもnetboot.xyzのバイナリでもどっちでもいいはず。
# 旧BIOS起動用
pxe-service=x86PC,"BIOS iPXE",ipxe/bios/undionly.kpxe,192.168.11.50
pxe-service=x86PC,"BIOS netboot.xyz",netboot.xyz/pxelinux.0,192.168.11.50
# UEFI用
#pxe-service=x86-64_EFI,"EFI iPXE",ipxe/efi/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-legacy",ipxe/efi/ipxe-legacy.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-snponly",ipxe/efi/snponly.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb",ipxe/efi-sb/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb-snponly",ipxe/efi-sb/snponly.efi,192.168.11.50
pxe-service=x86-64_EFI,"EFI netboot",ipxe/netboot.xyz-snp.efi,192.168.11.50
iPXEブート後は、tftpからiPXE用のスクリプトを取ってきて動く。dnsmasqの設定だと以下の部分。iPXEブート後、iPXEタグが設定されてないとメニューに出てこない設定。
# after iPXE
# tag:iPXEで、iPXEが設定されている場合のメニュー
pxe-service=tag:iPXE,x86PC,"BIOS autoexec.ipxe",ipxe/bios/autoexec.ipxe,192.168.11.50
pxe-service=tag:iPXE,x86-64_EFI,"EFI autoexec.ipxe",ipxe/efi/autoexec.ipxe,192.168.11.50
tftpのipxe/*/autoexec.ipxeにスクリプトを置いておく。中身は以下のような感じ。biosとUEFIで違うので、ディレクトリ分けて置いておく。netboot.xyzのQuickStartに書いてあるやつ。
#!ipxe
dhcp
chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.lkrn
これでなんとかBIOSでは起動したが、結構な確率でブートが失敗する。メニューが読み込めなかったり、ブートイメージを選択できてもブートイメージを取ってくる途中で止まったり。
iPXEのバイナリと古いPCのLANドライバ?的なものの相性が悪いのかもしれないし、全世界からアクセスされていてサーバが重いのかもしれない。よくわからないが結構不安定だ。
SytemRescueCDもnetboot.xyzに入ってるので、個別に入れる必要はなかったかと思ったが、netboot.xyzはかなり起動が不安定だったので、個別に入れて正解だった。
そして気づいたのは、これを使おうとする場合、いちいちLANケーブルをささないと使えないということだ。新しいパソコンならwifiからpxeブートできたりするのかなあ。
自宅サーバーを立てているが、家の中だと192.168.*、外出先だとtailscaleを使ってtailscaleのIPになる。immichのアプリだとssidで判定して切り替えてくれるが、ssidは一つしか登録できないので、2.5GHzと5GHzでssid変わると機能しない。他にもsshとかブラウザのブックマークは全部2通り登録して切り替えないといけないのでめんどくさい。なんとかならないかと思って試行錯誤。
とりあえず家の中のwifiに繋がっている間は自宅サーバーのDNSを見に行って、その他はtailscale dnsを見に行ってくれればいい(tailscaleが繋がってない間はアクセスできなくていい)ので、ルーターが配信するDNSを自宅サーバーで動かすDNSに切り替えてみることにした。
自宅サーバーであるraspberrypiにdnsmasqを入れる
apt install dnsmasq
systemctl start dnsmasq
systemd/resolvdとやらがdnsを使っているのでエラーになる。いらないのでdns機能を停止。
vi /etc/systemd/resolvd.conf.d/98-disabledns.conf
[Resolve]
DNSStubListener=no
dnsmasqにホスト名とIPを設定
vi /etc/dnsmasq.d/dns.conf
no-resolv
# サーバのホスト名とローカルIPを設定
address=/tailscaleと同じホスト名/192.168.11.50
# ルータのIP (親DNSになる)
server=192.168.11.1
# 念の為のgoogledns
server=8.8.8.8
動かしてみる
systemctl start dnsmasq
systemctl enable dnsmasq
digとかnslookupで確認し、ルータのDHCP設定のDNSをこのサーバのIPにする
PCではこれでうまく行った。自宅内ならtailscaleに繋いでても繋いでなくても192.168.11.50に行く。
スマホで5Gにしてtailscaleに繋げばtailscale dnsでつながる。
ただし、PCではうまく行くのにスマホ(android)の場合だけ自宅内のdnsがうまく行かなかった。どうやらプライベートDNSとやらのせいのようだ。
androidの場合、wifiに繋いでdnsを使う際にプライベートDNSを有効にしてあるとルータから指定されたDNSではなく勝手に独自のDNSを見に行くようになっているようだ。このせいでせっかく立てたDNSサーバーが意味をなさなくなる。
プライベートDNSとして DNS over TLSが使えなかったら普通のDNSになるという話を見てtcp853をブロックしたりしてみたが、どうも思った動きをしていない。アプリによってはやっぱり自宅内DNSを見に行かないようだ。プライベートDNSを無効にすると思った通りの動作となる。
ブロックされたらOS?としてのプライベートDNSは無効になるけど、webviewとかはプライベートDNS有効の設定が生きていて DNS over SSLとかで引いてきてしまうとかかもしれないが、SSLは流石にブロックできない。
結局どうにもこうにもうまく行かないので諦めた。PCだけはOKになったのでまあ良しとする。プライベートDNSを無効にすれば思った通り動作するが、偽サイトに誘導されそうでやっぱりちょっと怖い。全部2通りのアドレスをブックマークするかしかないのか。
というか特定のwifiではプライベートDNS無効にするとかできてもいいと思うんだけど、ネットを漁った感じでは5年以上進歩してないようなので期待薄な感じ。
PCでもfirefoxはブラウザ独自にプライベートDNSっぽいことはやってそうだけど、これは思った通り動いている。なんかいい感じのアルゴリズムで適切に処理してくれてるんだろう。firefoxさまさまである。
よって、androidがなんか変なことやってる気がする。試しにDNS調べるサイト見てみたらgoogleのDNSっぽいのがずらずら(20個くらい)出てきた。googleだしなんか信用できないな。やっぱりプライベートDNS無効にしようかな?
ちょっとした3Dを表示したりするのにゲームエンジンがよさそうかなと思って調べていた。有名どころではUnityとかUnrealEngineとかがある。
UnrealEngineはなんか多機能すぎてわけがわからない。Unityは会社で使おうとすると有料になりそう。会社でも使えそうなGodotを使ってみようとした。
何度起動してもフリーズする。なんかwindowsごと固まっている感じだけど、すでに動いているほかのアプリ(firefoxとか)は無事っぽい。タスクマネージャーも固まってプロセスを殺すこともできない。シャットダウンもできなくなるので電源ぶち切りするしかなくなる。
githubのissue見てみたけどv4.6からダメだとか(v.4.4.1まで戻してもNG)、エディタをsingle windowモードにしないとダメだとか(やっても変わらず)、何ともならない。
使ってるPCではIntel HD GraphicsとNVIDIA GeForceが認識されている。ふと思い立ってIntel HD Graphicsのドライバを無効にしてみたところ、フリーズしなくなった。どうやら2つのGPUがあったときにどっちを使うかみたいな感じで止まってしまっているのだと思う。おそらくwindows 11のせいだろう。linuxでやってたら問題なかったんじゃないだろうか。
その後いろいろやってみたところ、ドライバを無効にしなくてもGPUを固定しておけばよさそうだということが分かった。windowsの設定→システム→ディスプレイ→グラフィックでgodotのexeを指定してGPUを固定する。
どういう仕組みでどうGPUが使われているのかさっぱり分からないが、これで普通に使えるようになった。
とりあえずhttps://www.godot-tutorial.net/というサイトの3Dチュートリアルをやってみる。
書いてる通りそのままだと結構引っかかるところがあった。置いてある完成版と見比べながら修正していく。
Meshはいったん左下のファイルシステムのところにドラッグアンドドロップで入れて、そこからMeshInstance3Dにドラッグアンドドロップすると適用された。以前blenderで作ったモデルをfbxに変換して入れてみたりできそう。
player.gdの最初に以下が必要(emitするsignalを宣言する)
signal collected
Mainからsignalへのつなげ方も変わっているようだ。(ついでにサイトのコピペのままだと何も生成されなかったのでcreate_objectを呼ぶようにする。)
func _ready():
$Player.collected.connect(_on_item_collected)
create_object()
PlayerのArea3Dでほかの物体に当たった時のシグナルbody_enteredをCharacterBody3Dの関数に接続する。ただコードを書くだけじゃなくて以下のような操作が必要。
見た目(MeshInstance3D)と当たり判定(CollisionShape3D)は別物になっていて、scaleで小さくしたときに当たり判定が小さくなりすぎると、地面をすり抜けて落ちて行ってしまう。適度な大きさを設定しておく必要がある。
とりあえず闇雲にチュートリアルをこなしてみた。blenderで作ったモデルも読み込めるようだったので、適当にミャクミャクと未来のたまごとサーキュラーを読んでみた。(以前作ったやつ)
ただ、当たったら消えるだけなのでつまらない。どうやら物理演算されているっぽいので、なんかやってみたいんだけど、やり方がわからない。
とりあえず動いたので、今日はここまででヨシとする。