mieki256's diary



2021/03/01(月) [n年前の日記]

#1 [nitijyou] 一日中寝てた

どうも目が痛くて、起きていられなくて。一日中横になってた。

2021/03/02(火) [n年前の日記]

#1 [hsp][raspberrypi][linux] キーボードとマウスに割り当てられたevent番号を得る

HSP3.6beta を Raspberry Pi Zero W + Raspberry Pi OS buster 上で動かした際に、キーボードやマウスが無反応になる件について。

/proc/bus/input/devices の情報から、キーボードやマウスに割り当てられた event* を取得する方法について調べているところ。

キーボードの判別について。 :

キーボードについては、/proc/bus/input/devices の中から、EV=1200.. を探すことで、おそらくメインで使われているのであろうキーボードの event* を取得できそうだなと分かってきた。

以下のやりとりが参考になった。

_c - Determine Linux keyboard events device - Stack Overflow

上記のやり取りの中では、EV=120013 という値を決め打ちで探しているけれど、手持ちのタッチパッド付キーボード Logicool K400r は EV=12001f を返してきたりするので、まあ、EV=1200.. を探せば、キーボードを見つけることができるのではないかと…。

ちなみに、EV=1200.. の 12 の部分は、EV_REP と EV_LED のフラグが立ってることを示している。
  • EV_REP は、キーリピートが発生する入力機器であることを示す。
  • EV_LED は、LEDの制御ができる機器であることを示す。

手持ちのキーボード、Logicool K400r や Lenovo KU-1255 にはLEDがついてないのだけど、どちらも EV_LED を返してくる。おそらくだけど、キーボードの類は、実際にはLEDを持っていなくてもLEDを持っているものとして情報を返すことになってたりするのではないか、と…。いや、分からんけど。でも、少なくとも、手持ちの各機器を調べた範囲では、そう見えてる。もしかすると例外な機器ががある可能性も否定できないけど。

あるいは、EV=1200.. ではなく、Handlers= に kbd と leds が存在するものをキーボードとして扱う、という手もありそうだなと。
  • EV=120013 を返してくる機器は、「H: Handlers=sysrq kbd leds event0」を返す。
  • EV=12001f を返してくる機器は、「H: Handlers=sysrq kbd leds mouse0 event0」を返す。
上記のどちらも、kbd と leds が存在するので、それを頼りにキーボードを見つけることだって可能なのかもしれない。

event*を取り出す方法。 :

さておき。/proc/bus/input/devices の内容から、キーボードの event* を得る方法だけど。

前述のやり取りの中で、grep を何度も呼び出して求めてしまう方法が紹介されてた。
grep -E 'Handlers|EV=' /proc/bus/input/devices | grep -B1 'EV=1200..' | grep -Eo 'event[0-9]+' | grep -Eo '[0-9]+' | tr -d '\n'
  • grep -E 'Handlers|EV=' /proc/bus/input/devices で、/proc/bus/input/devices の中から、Handlers または EV= が含まれた行を取り出す。
  • grep -B1 'EV=1200..' で、EV=1200.. と書かれた行と、その1行前の行(Handlers が書かれた行)を取り出す。
  • grep -Eo 'event[0-9]+' で、「event*」と書かれた部分だけを取り出す。
  • grep -Eo '[0-9]+' で、「event*」の数字部分だけを取り出す。
  • この状態では改行が含まれてることがあるので、tr -d '\n' で、改行を消去する。

結果がどう変わっていくか、一応以下に示しておく。
$ grep -E 'Handlers=|EV=' buffalo_bskbw03wh_and_logicool_vx_nano.txt
H: Handlers=sysrq kbd leds event0
B: EV=120013
H: Handlers=mouse0 event1
B: EV=17
H: Handlers=kbd event2
B: EV=1f
H: Handlers=kbd event3
B: EV=13
H: Handlers=mouse1 event4
B: EV=17
H: Handlers=kbd event5
B: EV=1f

$ grep -E 'Handlers=|EV=' buffalo_bskbw03wh_and_logicool_vx_nano.txt | grep -B1 'EV=1200..'
H: Handlers=sysrq kbd leds event0
B: EV=120013

$ grep -E 'Handlers=|EV=' buffalo_bskbw03wh_and_logicool_vx_nano.txt | grep -B1 'EV=1200..' | grep -Eo 'event[0-9]+'
event0

$ grep -E 'Handlers=|EV=' buffalo_bskbw03wh_and_logicool_vx_nano.txt | grep -B1 'EV=1200..' | grep -Eo 'event[0-9]+' | grep -Eo '[0-9]+'
0
最終的に、event* の数字の部分だけを取得できている。

自分、プログラム内でこの手の処理をみっちり書かねばならないものと思い込んでいたので、既存のコマンドを数回呼んで目的を達成してしまうやり方に、なんだかちょっと目から鱗が落ちたというか…。単機能のコマンドを繋げて目的を果たすのが、*NIXの文化なのね、みたいな。

前述のやり取りの中で紹介されてるのは、おそらくC++?を使った記述だろうけど、C言語で同じことをしている事例も見かけた。

_c - Reading events from the keyboard device and storing it in a file skips some input - Stack Overflow

FILE* fpp = popen() と fgets() を使えば、C言語のソース内で grep を呼んで使うことができるらしいなと…。まだ実際に試してないので、本当にそんなことができるのか分かってないけど。

マウスの判別について。 :

キーボードの判別・event*の取得は、上記のやり方でなんとかなりそうだなと思えてきたけど。マウスの判別が、ちょっと難しい…。

一応、Handlers= の中に、mouse* という記述があるものが対象としてリストアップできそう、とは分かったけれど。
$ grep -E 'Handlers=.*mouse*' buffalo_bskbw03wh_and_logicool_vx_nano.txt
H: Handlers=mouse0 event1
H: Handlers=mouse1 event4

$ grep -E 'Handlers=.*mouse*' logicool_k400r.txt
H: Handlers=sysrq kbd leds mouse0 event0

$ grep -E 'Handlers=.*mouse*' lenovo_ku-1255.txt
H: Handlers=mouse0 event1

対象が1行しか出てこない場合は、 ソイツがルパンだ! ソイツがマウスだ、と考えていいのだろうけど。問題は、2行以上出てきた場合。Handlers= の情報だけでは、どっちが真のマウスなのか、分からない…。

もしかすると、Phys= の情報が頼りになるのだろうか?
$ grep -E 'Handlers=|Phys=' buffalo_bskbw03wh_and_logicool_vx_nano.txt
P: Phys=usb-20980000.usb-1.1/input0
H: Handlers=sysrq kbd leds event0
P: Phys=usb-20980000.usb-1.1/input1
H: Handlers=mouse0 event1
P: Phys=usb-20980000.usb-1.1/input2
H: Handlers=kbd event2
P: Phys=usb-20980000.usb-1.1/input2
H: Handlers=kbd event3
P: Phys=usb-20980000.usb-1.2/input0
H: Handlers=mouse1 event4
P: Phys=usb-20980000.usb-1.2/input1
H: Handlers=kbd event5

$ grep -E 'Handlers=|Phys=' buffalo_bskbw03wh_and_logicool_vx_nano.txt | grep -B1 'mouse'
P: Phys=usb-20980000.usb-1.1/input1
H: Handlers=mouse0 event1
--
P: Phys=usb-20980000.usb-1.2/input0
H: Handlers=mouse1 event4
何故か「--」という行が含まれているのが気になるけど、それはさておき。Phys= に input* が含まれていたとして、数字が小さいほうが真のマウスだ、みたいな。

ただ、この input* は、必ずしも input0 や input1 になるとは限らなくて。例えば、Logicool K400r は、以下のような値になってしまう。
$ grep -E 'Handlers=|Phys=' logicool_k400r.txt | grep -B1 'mouse'
P: Phys=usb-20980000.usb-1.1/input2:1
H: Handlers=sysrq kbd leds mouse0 event0
「input2:1」ってなんやねん。

まあ、K400r の場合、それだけを接続している状態なら、mouse が含まれる行が1行しか出てこないので、それがマウスだと決めつけてしまっていいのかもしれないけれど。ただ、複数の入力機器を接続している場合は、ちょっと困ったことになるよなと…。

何にせよ…。/proc/bus/input/devices の中に、
  • Handlers=.*mouse.* が1行しか出てこないなら、それがマウス。
  • Handlers=.*mouse.* が2行以上出てくるなら、Phys=.*input.* の数値が小さいほうが、実際に使っているマウス。
そんな判別方法で、ある程度は対処できるのかもしれない。

ただ、その判別方法を、C言語でどう書けばいいのか。そこがちょっと悩むところで…。

コマンドを活用してどうにかできないか。 :

行数を数えるなら、wc というコマンドが使えるらしい。

_テキストファイルの行数や単語数を調べるには
_【 wc 】コマンド――テキストファイルの文字数や行数を数える:Linux基本コマンドTips(62) - @IT

wcコマンドは、文字数や行数を数えられるけど、-l を付ければ行数だけを数えるそうで。
$ grep -E 'Handlers=.*mouse.*' logicool_k400r.txt | wc -l
1

$ grep -E 'Handlers=.*mouse.*' buffalo_bskbw03wh_and_logicool_vx_nano.txt | wc -l
2
これで、マウスらしきものが1つだけ接続されているのか、2つ以上接続されているのか、その程度の判別ならできそうな予感。

一つだけなら、キーボードの event* を調べた時と同様に、grep を数回呼ぶことでなんとかなるかなと…。
$ grep -E 'Handlers=.*mouse.*' logicool_k400r.txt | grep -Eo 'event[0-9]+'
event0

$ grep -E 'Handlers=.*mouse.*' logicool_k400r.txt | grep -Eo 'event[0-9]+' | grep -Eo '[0-9]+'
0

つまり、以下のようになるのかな…。
grep -E 'Handlers=.*mouse.*' /proc/bus/input/devices | grep -Eo 'event[0-9]+' | grep -Eo '[0-9]+' | tr -d '\n'
これで、マウスに割り当てられた event* の数字部分は得られそう。

だけど問題は、マウスらしきものが2つ以上ある場合。さて、どういう手法で、どれが真のマウスなのかを判別すればいいのか…。

再度書くけど、以下の状態まではコマンドを駆使して絞り込める。
$ grep -E 'Handlers=|Phys=' buffalo_bskbw03wh_and_logicool_vx_nano.txt | grep -B1 'mouse'
P: Phys=usb-20980000.usb-1.1/input1
H: Handlers=mouse0 event1
--
P: Phys=usb-20980000.usb-1.2/input0
H: Handlers=mouse1 event4
ここからどうする…。コマンドでどうにかなるのか…? 頓智が求められるなあ…。

いっそ、キーボードやマウスに割り当てられたevent*を調べて返すPythonスクリプトでも書いて、それを呼んじゃうという手は…。

input*で判別するのは怪しいかもしれない。 :

ふと、他のLinux環境ではどうなるのかと気になって、VMware Workstation 16 Player 16.1.0 build-17198959 + Ubuntu Linux 20.04 LTS で確認してみたのだけど。

mouse* が3つほど出てきて、Phys=.*:input0 ではなく Phys=.*:input1 のほうが反応することに気づいた。

$ cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
U: Uniq=
H: Handlers=kbd event0 
B: PROP=0
B: EV=3
B: KEY=10000000000000 0

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input1
U: Uniq=
H: Handlers=sysrq kbd event1 leds 
B: PROP=0
B: EV=120013
B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7

I: Bus=0011 Vendor=0002 Product=0013 Version=0006
N: Name="VirtualPS/2 VMware VMMouse"
P: Phys=isa0060/serio1/input1
S: Sysfs=/devices/platform/i8042/serio1/input/input4
U: Uniq=
H: Handlers=mouse0 event2 
B: PROP=0
B: EV=b
B: KEY=70000 0 0 0 0
B: ABS=3

I: Bus=0011 Vendor=0002 Product=0013 Version=0006
N: Name="VirtualPS/2 VMware VMMouse"
P: Phys=isa0060/serio1/input0
S: Sysfs=/devices/platform/i8042/serio1/input/input3
U: Uniq=
H: Handlers=mouse1 event3 
B: PROP=1
B: EV=7
B: KEY=30000 0 0 0 0
B: REL=103

I: Bus=0003 Vendor=0e0f Product=0003 Version=0110
N: Name="VMware VMware Virtual USB Mouse"
P: Phys=usb-0000:02:00.0-1/input0
S: Sysfs=/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-1/2-1:1.0/0003:0E0F:0003.0001/input/input5
U: Uniq=
H: Handlers=mouse2 event4 
B: PROP=0
B: EV=17
B: KEY=ff0000 0 0 0 0
B: REL=903
B: MSC=10


ということは、必ずしも input* の数字の小さいほうが真のマウスとは言えない感じだなと…。

その後も試してたら、event2 はマウスを動かすと反応して、event3 はマウスホイールを回すと反応することに気づいた。event4 は謎。sudo evtest /dev/input/event4 と打ってみると、マウスの拡張ボタンを返すようにも見えるけど、実際押してみても反応してるようには見えず。
$ sudo evtest /dev/input/event4
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0xe0f product 0x3 version 0x110
Input device name: "VMware VMware Virtual USB Mouse"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 272 (BTN_LEFT)
    Event code 273 (BTN_RIGHT)
    Event code 274 (BTN_MIDDLE)
    Event code 275 (BTN_SIDE)
    Event code 276 (BTN_EXTRA)
    Event code 277 (BTN_FORWARD)
    Event code 278 (BTN_BACK)
    Event code 279 (BTN_TASK)
  Event type 2 (EV_REL)
    Event code 0 (REL_X)
    Event code 1 (REL_Y)
    Event code 8 (REL_WHEEL)
    Event code 11 (REL_WHEEL_HI_RES)
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)

マウス座標を返してくる event と、ホイール回転を返してくる event が別になってるということは、もしかして mouse* を返してくるそれぞれに対して全部情報を取得しないといかんのだろうか…?

2021/03/03(水) [n年前の日記]

#1 [hsp][raspberrypi][linux] Raspberry Pi用HSPとキーボードとマウスについて少しまとめておく

ここ数日、Raspberry Pi用HSPと、利用できるキーボードやマウスについて色々調べていたけれど、自分が把握できた範囲・状況について一旦メモしておこうかなと…。

_onitama/OpenHSP: Hot Soup Processor

念のために書いておくけど、Raspberry Pi用のHSPの話です。Windows版HSPとか、Linux版HSPの話ではないです。

最初にまとめ。 :

2021/03/03時点の Raspberry Pi用HSPは、使えるキーボードとマウスに制限がある。

端末上で ls -alF /dev/input/by-id と打ってみれば、そのキーボードとマウスが、HSPで使えるかどうかが分かる。
  • event-kbd を含む名前と、event-mouse を含む名前が、一つずつ並んでいるなら、そのキーボードとマウスの組み合わせで HSP は動かせる。
  • event-kbd、または event-mouse が見当たらないなら HSP は動かせない。動かしても、真っ当に終了させる方法が無い。
  • event-kbd が2つ以上、または event-mouse が2つ以上ある場合、機器を接続する順番によって動くかもしれないし動かないかもしれない。HSPが最後に検出した機器がキーボード・マウスとして扱われるが、HSPがどんな順番で検出していくかは不明。

少し解説。 :

まず、前提として、現時点の Raspberry Pi用HSPは、キーボードとマウスの、両方が接続されてないと使えない。両方が接続されてないと使えない。大事なことなので2回言いました。

キーボードだけが接続されてる状態、あるいはマウスだけが接続されてる状態では、HSP(hsp3dish)はキー入力とマウス入力の両方とも無視する作りになっている。これは、 _OpenHSP/src/hsp3dish/raspbian/hsp3dish.cpp の updateKeyboard() の先頭で、キーボードかマウスのどちらかが見つからない時は、何もせずに return するようになっているから。

Raspberry Pi OS の端末上で、ls -alF /dev/input/by-id と打つと入力機器の名称一覧が出てくるが、HSPは…
  • event-kbd を含む名前の機器がキーボードで、
  • event-mouse を含む名前の機器がマウスのはず、
と決め打ちして作られている。よって、event-kbd が1つ、event-mouse が1つの状態なら HSP は問題無く動く。

しかし、入力機器一覧の中に event-kbd (or event-mouse) が見つからないと、HSPからは、キーボード(or マウス)が接続されてないものとして扱われてしまう。実際にはちゃんとキーボードやマウスが接続されていても、HSP側ではキー入力やマウス入力を一切取得してくれない。(前述のとおり、キーボードかマウスのどちらかが見つからない時は、キー入力とマウス入力を一切無視する作りになっている。)

そうなると、HSPスクリプトを動かしてから、キー入力やマウス入力でスクリプトを終了させることができなくなる。その場合、OSが壊れることを覚悟しつつ Raspberry Pi 本体の電源をいきなり切って終わらせるか、別PCからssh等でログインして、killall hsp3dish と打って終了させるしかない。

キーボードやマウスが機器名称として event-kbd や event-mouse を返してくるかどうかは製品による。
  • キーボードの中には、event-kbd を返さない製品がある。(Logicool K400r)
  • または、event-kbd と一緒に event-mouse まで返すキーボードもある。(BUFFALO BSKBW03WH)
  • マウスも、製品によっては event-kbd を返すものがある。(A4Tech XL-755BK)

故に、Raspberry Pi にキーボードとマウスを接続して、デスクトップ画面が使えているからと言って、Raspberry Pi用HSPも動かせるとは限らない。

Raspberry Pi用HSPが動かせるかどうか ―― HSPがキー入力とマウス入力を正しく取得できるかどうかは、/dev/input/by-id 以下にどんな機器名が並んでいるかが絡んでくる。

ちなみに、これはあくまで Raspberry Pi用HSPの話で、 _Linux版HSP では状況が異なる。Linux版HSPは、キー入力やマウス入力をSDLを通して取得しているようで、Raspberry Pi用HSPとは処理内容が異なっている。

今日調べていた内容。 :

今日調べていた内容についてメモ。

USB接続ワイヤレスキーボード(タッチパッド付) Logicool K400r や、USB接続ワイヤレスマウス ELECOM M-BL21DBSV を、Raspberry Pi Zero W + Raspberry Pi OS buster に接続した際、/dev/input/by-id 以下で event-mouse を含んだ文字列を返しているので、HSPを動かした際に、キーボードはともかく、マウスだけでも反応するはず、なのに無反応なのはおかしいなーおかしいなー、と悩んでいたのだけど。

_raspbian/hsp3dish.cpp を眺めてみて謎が解けた。updateKeyboard() の先頭で、
if((keyboardFd == -1) || (mouseFd == -1)) return;
と書いてあるじゃないですか。つまり、キーボードが見つからない、もしくはマウスが見つからない時は、キー入力やマウス入力をチェックする処理を一切しないわけで…。

つまり、数日前に、マウスだけを接続して HSP の動作確認をしていたのは完全に無意味だった…。キーボード (event_kbd) が検出されないことが分かってる状態で、マウスが反応するか調べても意味が無い。キーボードが見つからなかったら、その時点でマウス入力も無視されるわけだから…。

本当に、raspbian/hsp3dish.cpp が使われているのか不安になってきたので、該当ファイル内でコメントアウトされていた printf() を有効にしてビルドし直してみた。(OpenHSPディレクトリ直下で、make -f makefile.raspbian を実行。) ビルドが走って、該当ファイルがコンパイルされたので、たしかに使われているっぽい。HSPがどの入力機器を見つけたのかも出力されるようになった。

余談だけど、raspbian/hsp3dish.cpp の initKeyboard() 内では、マウスが見つかった時も「match for the kbd」と printf() してしまう。「match for the mouse」等に書き換えてから試さないと、キーボードが見つかったのかマウスが見つかったのか分からないので注意。

さておき。普段メインPC(Windows10機)で使っている、USB有線接続キーボード Cherry G230 (G85-23100JAAESF?) も接続して動作確認してみた。 *1 マウスは、ELECOM M-BL21DBSV を接続。念のために、マウスを接続した後からキーボードを接続。

調べた結果は以下。
$ ls -alF /dev/input/by-id/
合計 0
drwxr-xr-x 2 root root 140  3月  3 07:47 ./
drwxr-xr-x 4 root root 240  3月  3 07:47 ../
lrwxrwxrwx 1 root root   9  3月  3 07:47 usb-046a_0023-event-if01 -> ../event5
lrwxrwxrwx 1 root root   9  3月  3 07:47 usb-046a_0023-event-kbd -> ../event4
lrwxrwxrwx 1 root root   9  3月  3 06:18 usb-ELECOM_ELECOM_BlueLED_Mouse-event-if00 -> ../event2
lrwxrwxrwx 1 root root   9  3月  3 06:18 usb-ELECOM_ELECOM_BlueLED_Mouse-event-mouse -> ../event0
lrwxrwxrwx 1 root root   9  3月  3 06:18 usb-ELECOM_ELECOM_BlueLED_Mouse-mouse -> ../mouse0

$ cat /proc/bus/input/devices
I: Bus=0003 Vendor=056e Product=00cb Version=0111
N: Name="ELECOM ELECOM BlueLED Mouse"
P: Phys=usb-20980000.usb-1.1/input0
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.0/0003:056E:00CB.0001/input/input0
U: Uniq=
H: Handlers=mouse0 event0
B: PROP=0
B: EV=17
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=1943
B: MSC=10

I: Bus=0003 Vendor=056e Product=00cb Version=0111
N: Name="ELECOM ELECOM BlueLED Mouse"
P: Phys=usb-20980000.usb-1.1/input0
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.0/0003:056E:00CB.0001/input/input1
U: Uniq=
H: Handlers=event1
B: PROP=0
B: EV=100001

I: Bus=0003 Vendor=056e Product=00cb Version=0111
N: Name="ELECOM ELECOM BlueLED Mouse Consumer Control"
P: Phys=usb-20980000.usb-1.1/input0
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.0/0003:056E:00CB.0001/input/input2
U: Uniq=
H: Handlers=kbd event2
B: PROP=0
B: EV=1f
B: KEY=300ff 0 0 0 0 483ffff 17aff32d bfd44446 0 0 1 130c73 b17c000 267bfa d9415fed 9e1680 4400 0 10000002
B: REL=1040
B: ABS=1 0
B: MSC=10

I: Bus=0003 Vendor=056e Product=00cb Version=0111
N: Name="ELECOM ELECOM BlueLED Mouse System Control"
P: Phys=usb-20980000.usb-1.1/input0
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.0/0003:056E:00CB.0001/input/input3
U: Uniq=
H: Handlers=kbd event3
B: PROP=0
B: EV=13
B: KEY=c000 100000 0 0 0
B: MSC=10

I: Bus=0003 Vendor=046a Product=0023 Version=0111
N: Name="HID 046a:0023"
P: Phys=usb-20980000.usb-1.2/input0
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/0003:046A:0023.0007/input/input18
U: Uniq=
H: Handlers=sysrq kbd leds event4
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7

I: Bus=0003 Vendor=046a Product=0023 Version=0111
N: Name="HID 046a:0023"
P: Phys=usb-20980000.usb-1.2/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.2/1-1.2:1.1/0003:046A:0023.0008/input/input19
U: Uniq=
H: Handlers=kbd event5
B: PROP=0
B: EV=1f
B: KEY=3f 301ff 0 0 0 0 483ffff 17aff32d bfd44446 0 0 1 130ff3 8b17c400 677bfa d971dfed 19ed680 4400 0 10000002
B: REL=1040
B: ABS=1 0
B: MSC=10


hsp3dishの接続結果(pritnfデバッグの結果)。
$ ./hsp3dish sample/block3.ax
Init:hgio_setmainarg(.,sample/block3.ax)
Init:HGIOScreen(1280,720)
readdir (.)
readdir (..)
readdir (usb-046a_0023-event-if01)
readdir (usb-046a_0023-event-kbd)
match for the kbd = usb-046a_0023-event-kbd
/dev/input/by-id/usb-046a_0023-event-kbd keyboardFd = 6
readdir (usb-ELECOM_ELECOM_BlueLED_Mouse-event-if00)
readdir (usb-ELECOM_ELECOM_BlueLED_Mouse-event-mouse)
match for the mouse = usb-ELECOM_ELECOM_BlueLED_Mouse-event-mouse
/dev/input/by-id/usb-ELECOM_ELECOM_BlueLED_Mouse-event-mouse mouseFd = 7
Getting exclusive access: SUCCESS
readdir (usb-ELECOM_ELECOM_BlueLED_Mouse-mouse)

このキーボードとマウスの組み合わせなら、event-kbd が1つ, event-mouse が1つなので、HSPは問題無くキーボードとマウスを検出できている。

今回試した Cherry G230 (G85-23100JAAESF?) は、USB有線接続で、音量調整等のマルチメディアキーを少々持っているものの、それ以外は何の変哲もないフツーのキーボードのせいか、event-kbd 以外に、event-mouse を返してきたりはしなかった。

となると…。
  • どこにでも売っていて、比較的値段が安くて、余計な機能がほとんどついてない、最低限の素直な作りのUSB有線接続キーボード。
  • どこにでも売っていて、比較的値段が安くて、余計な機能がほとんどついてない、最低限の素直な作りのUSB接続マウス。
そういう組み合わせなら、HSPを動かしても、すんなり使えてしまう可能性が高い気がするなと…。

何か変わった機能を持っているキーボードやマウスになると、キーボードなのに「僕、マウス(event-mouse)だよ」と言い出したり、マウスなのに「僕、キーボード(event-kbd)だよ」と言い出したりするのでハマるのだろうなと…。

そして自分の場合、キーボードやマウスを購入する時は機能面でこだわって選ぶので、そんな製品ばかり部屋に転がっているものだから、こうしてトラップに引っ掛かったという。

雑感。 :

個人的には、/dev/input/by-id 以下だけを見て、これがキーボードでこれがマウスのはず、と判別するのはどうなんだろうと。/proc/bus/input/devices も参考にしながら判別したほうが良くないか…。

もっとも、/proc/bus/input/devices を見ることで、キーボードについては取得できても、やっぱりマウスはどれがどれやら分からないので結局悩むのだけど。複数のマウス候補の中から絞り込むためのヒントが見当たらないのだよな…。コレって解決策あるのかな…。

このへん、なんだか「おま環」扱いされそうな話だなとも思うけど、それもちょっと釈然としない。手持ちの製品の極一部が動かないならともかく、半数が動かないのだから、それはプログラムの作りがおかしいでしょ、「おま環」呼ばわりで済ませられる範囲を超えてませんか、という気もするわけで。 *2

キーボードだけ、あるいはマウスだけ繋いだ状態でも一応動く、という作りのほうがいいのかもしれない。それなら、ESCキーかマウス右クリックのどちらかで終了できるだろうし。どちらかが見つからなければ全入力をチェックしない、スクリプトの終了すらできない、という現状の作りはちょっと。

もしくは、キーボードやマウスが見つからない時は、「Not found keyboard」「Not found mouse」と出力して終了するだけでも違うだろうなと。何が原因で動かないのか、伝えてくれるだけでも助かるはず。

てなことを思ってしまったので、自分も改善策を提示できないかと hsp3dish.cpp を眺めているけれど…。 *3

ただ、公式キーボード+公式マウスならすんなり動くかもしれんので、「公式キーボード・マウス以外は非サポート」とか「○○以外では動作確認してません」みたいなことを書いて終わらせるのも全然アリなのだよな…。

まあ、グダグダ言ってないでとにかくソース書け>自分。…まずはC++のコンパイル方法から調べてみないと。<そこからかよ…。

*1: 設置場所の問題で、繋げるのに苦労した…。USB延長ケーブルを部屋の中から発掘して作業する羽目に。
*2: というか、例えば子供さんが試しに HSP を動かした際に、終了すらできなくなるのってフツーに考えてマズイよなと。そこで生じる絶望感を想像すると…。あるいは、せっかく作ったHSPスクリプトを友達に見せびらかそうとしたら、その子の使ってるキーボードかマウスがアウトで、てな場面で子供さんが受けるショックを想像したら…。その時の子供さんの気持ちを想像したら、現状はマズイよなあ…。一応、Raspberry Pi は、本来は教育用とされてる製品なのだし。
*3: そもそも Raspberry Pi上でHSPを動かしてみた事例をほとんど見かけないし、子供さんがわざわざHSPを触ったりするものかねえ、という疑問もあるし、大体にして日本国内で子供さんに Raspberry Pi を与えて使わせてる事例なんてあるのだろうか、という疑問も。もしかして需要が無いんじゃないの、需要が無いなら改良しても意味無いよな…。いやまあ、現状、キーボードやマウスが無反応になるのでは怖くて誰も触れないだろ、そこさえマシになれば誰かしらが触り始めるよ、たぶん、という期待もあるのだけれど。

#2 [prog] C++のコンパイルを試したり

C++ソースのコンパイル方法をググったら、以下が分かりやすかった。ありがたや。

_[C++] 基本的なコンパイル方法 [C++初心者] - Qiita

Windows10 x64 20H2 + MSYS2 MinGW 64bit 上で試したり。g++ を使うのか…。

VMware Player + Ubuntu Linux 20.04 LTS上でも試してみた。コンパイルできた。なんとかなりそう。

2021/03/04(木) [n年前の日記]

#1 [hsp][raspberrypi][linux] キーボードに割り当てられたeventを取得できるか実験

Raspberry Pi用HSPが、キーボードやマウスを検出できない件について。とりあえず、/proc/bus/input/devices の内容から、キーボードに割り当てられた event* を取得できそうかどうか試してみたり。

以下のやり取りの中で、/proc/bus/input/devices を参照することでキーボードの event番号?を取得する方法が紹介されていて、2つほど、サンプルソースが提示されてる。

_c - Determine Linux keyboard events device - Stack Overflow
それぞれ、手元の環境でも動くように書き直してみたり。いやまあ、前述のサンプルをほとんどコピペしたようなものだけど…。

動作確認した環境は以下。
_getkbdpath.cpp
#include <string>
#include <cstdio>

static const std::string CMD_GET_KBD_DEV_NUM = "grep -E 'Handlers|EV=' /proc/bus/input/devices | grep -B1 'EV=1200..' | grep -Eo 'event[0-9]+' | grep -Eo '[0-9]+' | tr -d '\n'";

static const std::string CMD_COUNT_KBD_DEV = "grep -E 'Handlers|EV=' /proc/bus/input/devices | grep -B1 'EV=1200..' | grep -Eo 'event[0-9]+' | wc -l";

std::string execCmd(const char *cmd)
{
  FILE *pipe = popen(cmd, "r");
  char buf[2048];
  std::string r = "";
  while (!feof(pipe))
    if (fgets(buf, 2048, pipe) != NULL)
      r += buf;
  pclose(pipe);
  return r;
}

std::string getKbdDevPath()
{
  std::string kbdCnt = "";
  std::string devNum = "";
  kbdCnt += execCmd(CMD_COUNT_KBD_DEV.c_str());
  if (kbdCnt[0] == '0')
  {
    // Not found keyboard
    return "";
  }
  else if (kbdCnt[0] == '1')
  {
    devNum += execCmd(CMD_GET_KBD_DEV_NUM.c_str());
    if (devNum[0] == '\0')
    {
      // Not found keyboard
      return "";
    }
    // found keyboard
    return "/dev/input/event" + devNum;
  }
  printf("Multiple keyboards exist\n");
  return "";
}

int main()
{
  std::string devPath = getKbdDevPath();
  if (devPath[0] == '\0')
  {
    printf("Not found keyboard\n");
  }
  else
  {
    printf("keyboard: %s\n", devPath.c_str());
  }
}

_getkbdpath2.cpp
#include <stdio.h>
#include <string.h>
#include <string>

std::string getInputDevPath()
{
    const char *pdevsName = "/proc/bus/input/devices";
    std::string devPath = "";
    char buf[8196];
    FILE *fp;

    if ((fp = fopen(pdevsName, "r")) == NULL)
    {
        printf("[ERR] Cannot open '%s'\n", pdevsName);
        return "";
    }

    int rd = fread(buf, sizeof(*buf), sizeof(buf) / sizeof(*buf), fp);

    fclose(fp);

    if (rd < 6)
    {
        printf("[ERR] Wrong size was read from devs file\n");
        return "";
    }
    buf[rd] = 0;

    char *pHandlers, *pEV = buf;
    do
    {
        pHandlers = strstr(pEV, "Handlers=");
        pEV = strstr(pHandlers, "EV=");
    } while (pHandlers && pEV && 0 != strncmp(pEV + 3, "1200", 4));

    if (pHandlers && pEV)
    {
        char *pevent = strstr(pHandlers, "event");
        if (pevent)
        {
            devPath += "/dev/input/event";
            devPath.push_back(pevent[5]);
        }
        else
        {
            printf("[ERR] Abnormal keyboard event device\n");
        }
    }
    else
    {
        printf("[ERR] Keyboard event device not found\n");
    }

    return devPath;
}

int main()
{
    std::string r = "keyboard: " + getInputDevPath();
    printf("%s\n", r.c_str());
}

g++ を使ってコンパイル。
g++ -o getkbdpath getkbdpath.cpp
g++ -o getkbdpath2 getkbdpath2.cpp
getkbdpath と getkbdpath2 という実行ファイルができる。

Raspberry Pi Zero W 上で実行。キーボードは Logicool K400r を接続。
$ ./getkbdpath
keyboard: /dev/input/event0

$ ./getkbdpath2
keyboard: /dev/input/event0
タッチパッド付キーボードでありながら、/dev/input/by-id 以下で event-kbd を返してくれない Logicool K400r でも、割り当てられた event番号を取得することができた。こういう方法でも判別できるのだな…。

問題点。 :

/proc/bus/input/devices の中に、EV=1200.. が1つだけ出現する場合は、これでなんとかなるけれど。2つ以上出現する場合は、ちょっと困ったことになるなと…。

例えば、手持ちの機器の中には、以下のような製品があるのだけど。
  • USB接続ワイヤレスキーボード BUFFALO BSKBW03WH。/dev/input/by-id 以下で、event-kbd の他に event-mouse も返してくる。
  • USB有線接続マウス A4Tech XL-755BK。/dev/input/by-id 以下で、event-mouse の他に event-kbd も返してくる。しかも、/proc/bus/input/devices の中で、EV=1200.. まで返してくる。

この2つを組み合わせると最悪の状態が発生する。キーボードを1つ、マウスを1つしか接続してないのに、/proc/bus/input/devices 内ではキーボードが2つ存在することになってしまう。

一応、この組み合わせの場合の情報もアップしておくけど…。

_buffalo_bskbw03wh_and_a4tech_xl755bk.md

この場合…。
  • grep を駆使して探す方法では、正しいevent番号が得られない。
  • C/C++の関数を駆使する方法では、最初に見つかったevent番号しか得られない。

つまり…。
  • /proc/bus/input/devices の内容を解析して、キーボードに割り当てられたevent*を取得するやり方は、/dev/input/by-id 以下に event-kbd が出現しないキーボード製品についても対応できるメリットがある。
  • しかし、キーボード(event-kbd)なのにマウス(event-mouse)でもあると言い出したり、マウス(event-mouse)なのにキーボード(event-kbd)でもあると言い出す製品群には結局対応できない。どれが本当に使えるキーボードなのか、判別する方法がない。

後者の解決策が思いつかない…。手詰まりかなあ…。

他の案。 :

このあたりの問題を緩和する他の方法は無いのかなと考えてみたり。

例えば、HSP対応(?)のキーボードとマウスなのか確認できるスクリプトを別途用意しておいて…。そのスクリプトを動かしてみて、「Keyboard, Mouse : Good」と言ってくるならHSPは使えますよ、でも「Keyboard, Moues : Bad」と言ってくるなら使えないので別のキーボードやマウスを探して繋いでみてね、てなことにしておく。とか。

あるいは、keyboard.ini だの mouse.ini というファイルがもし存在していて、/dev/input/event0 だの /dev/input/event4 だのが書いてあるなら、それをキーボードやマウスとして使うことにする、てな仕様にしておくとか。どうしても自動検出できない場面に遭遇したら、それらファイルを新規作成して環境に合わせたファイルパスを記述すれば一応動くよ、と。

まあ、何にせよ、 _現状のRaspberry Pi用HSPはキーボードやマウスとの相性があるよ、 ということで…。プログラム側での解決策は、自分の知識状態では思いつかんです…。手詰まりです。

それにしても、他のプログラム類は、このへんどうやって解決してるのだろう…。

#2 [zatta] LEDシーリングライトを入手したけど問題発生

しばらく前から部屋の蛍光灯が怪しくて。2つついてる丸型蛍光灯の1つが切れかかってるようで、点いたり消えたりを繰り返すのと、もう1つの蛍光灯をつけていても「ジーッ」という音が鳴る。音が鳴るのは安定器とやらがもう寿命だそうで、本来は器具そのものを交換しなければいけないらしい。しかし、今時、どこの店頭でも蛍光灯用の器具なんて、もはや売ってないわけで…。

この際、せっかくだからLEDライトに交換しようという話になって、親父さんがケイヨーD2で値段を調べてくる、という話をしていたのだけど。

値段を調べてくるだけ、だったはずが、親父さんは、いきなり製品を購入してきてしまった…。アイリスオーヤマ CL12D-EH。7,680円ほど。事前に親父さん自身がヨドバシのサイトで、ポイント還元後で6,500円ぐらいの製品があると調べていたのに…。店員さんに「新製品ですよ」と言われてその気になってしまったらしい。

この、CL12D-EH。ググってみても謎の製品で。DCMオンラインという通販サイトでしか、型番を見かけない。アイリスオーヤマのサイトでも一切情報が無い。ケイヨーD2はDCMグループなので、故に店頭にも置いてあったのだろうけど。おそらく、DCMグループでのみ扱う型番の製品なのではあるまいか、それでググっても情報が出てこないのではないか。にしても、発売時期すら不明なのはちょっとアレ。本当に新製品なんだろうか。実は結構古い製品だったりしないか。親父さんはまんまと騙されたのでは。でも、古い製品なら誰かしらが購入して、どこかしらに感想等を書いてるよな…。ということは、本当に新製品なのか…?

さておき。取り付けようとして、今まで使ってた蛍光灯器具を外してみたところ、天井についている角形引掛けシーリング?の形状を見て目が点に。取扱説明書に書いてある、取り付けられないタイプ ―― 端子が表面に露出してあるタイプにしか見えない…。大きさもちょっと小さいし、高さも足りないようで、LEDシーリングライトについてきた丸いアダプタがスカスカと動いてしまって固定できない。階下の2部屋にはLEDシーリングライトを取り付けているのだから、部屋のソレもOKだろうと安易に思い込んでいた。失敗した。面倒でも事前に確認しておくべきだった…。

ググってみたけど、たぶん以下のタイプだろう…。

_引掛けシーリング : 火星電気商会

さて、どうしよう…。電気工事をしてくれる業者さんにお願いして、シーリングを交換してもらうしかないのだろうか。

ただ、ググったところ、増改アダプタなるものをつけてどうにかできる場面もあるようで…。

_引っ掛けシーリングの取付け方法
_古い引掛けシーリングにLEDシーリングライトが付かない!?でも増改アダプタで解決した話 | ミズタマブログ

しかし、端子が露出しているタイプは、何かをぶら下げて使うことを全く考慮してない時代に設計製造されているので、実際にぶら下げてしまうと強度的に危ない、という話が前述のページで出ているわけで…。増改アダプタをつけても、そのあたりの強度が改善されるはずもなく。さて、どうしたもんか。

2021/03/05(金) [n年前の日記]

#1 [nitijyou] 自宅サーバ止めてました

12:50-14:35の間、屋内の電気工事をするために自宅サーバを止めてました。申し訳ないです。

サーバ機の電源を入れても起動してくれなかったり、起動してもしばらくしたら無反応になったりして、ちょっと焦った。ハードウェア的に、もう色々と寿命なのかもしれない…。

#2 [hsp][raspberrypi][linux] キーボードとマウスの取得をまだ実験中

HSP を Raspberry Pi Zero W + Raspberry Pi OS buster 上で動かした際にキーボードとマウスの入力を取得できない件についてまだ実験中。

src/hsp3dish/raspbian/hsp3dish.cpp を修正して、 _昨日試した処理 を入れてみた。元々は、/dev/input/by-id 以下に event-kbd が出現したらそれがキーボードのはず、として処理するところを、/proc/bus/input/devices の内容を見て、キーボードに割り当てられた event番号を取得して、それをキーボードとして扱うように変えてみた。

_hsp3dish.cpp.diff

この変更で、Logicool K400r に ―― /dev/input/by-id 以下で event-kbd を返してこないキーボードにも対応できるのでは、と予想したのだけど…当ては外れた。 キーボードもマウスも両方反応しない状態より、ちょっとだけ改善できた。しかし、キーボードが無反応では、やっぱり話にならないわけで…。

おそらくだけど、Logicool K400r は、キーボードもマウスも同じevent番号に割り当てられてしまうので、そのせいで片方しか反応しないのだろうなと。

hsp3dish.cpp の中では、まずマウスの入力情報を解析・取得して、その後、キーボードの入力情報を解析・取得しているけれど。K400r は、おそらくマウスとキーボードの入力情報が混ざってしまっているので…。hsp3dish.cpp が、マウス情報を解析する際に、キーボード情報は謎データ・要らない情報として捨ててしまうのだろう…。そして、一旦空になってしまった情報を使ってキーボードの入力情報を探してみても、もう何も残ってないので、それでキーボードが無反応になるのだろう…。

であれば、キーボードとマウスの入力情報を混ぜた状態で返してくる製品用の解析処理を用意すればいいのだろうか。 *1
*1: でも、そんな入力機器は、どう考えてもマイナーな機器だろうな…。フツーは、キーボードとマウスが別々の機器で、それぞれ違うevent番号が割り当てられているはず、と考えるものだろう…。この件は、これこれこういう情報を返してくる変わった入力機器には対応しません、と、どこかに明記して済ませてしまってもいいような気がしてくる…。

#3 [zatta] 部屋にLEDシーリングライトを取り付けた

昨日、LEDシーリングライト アイリスオーヤマ CL12D-EH を入手したものの、部屋の角形引掛けシーリングが古いタイプで取り付けることができなくて。

今朝、親父さんが知り合いの電器屋さんに相談したところ、工事をしてくれるという話に。昼頃来訪して、数分程度で角形引掛けシーリングを今時(?)のタイプに交換してくれた。作業する様子を眺めていたけど、世間話をする暇もないぐらい、あっという間に作業終了。さすがプロ…。素晴らしい。ありがたや。

おかげで、LEDシーリングライトもすんなり取り付けることができた。これで、今後、照明器具を交換する羽目になっても安心だなと…。

今までくたびれた蛍光灯を使っていたせいか、交換後、全灯状態ではかなり明るく感じた。ちなみに、10畳の部屋に、12畳用のLEDシーリングライトをつけている状態。

+2畳がイイ感じ説。 :

ググっていて見かけた話によると…。LED照明器具のメーカーは、少しでもスペックが高い製品に見せたくて、明るさが足りてないのにx畳用の照明器具と嘯いて売っていたりするから、実際に選びたい畳数の+2畳で製品を選べばちょうど良い、という話があるようで。

もっとも、自分が思うに…。そのあたり、LEDの照明器具が出始めた頃の傾向だったりしないか、今は明るさその他を業界内でそこそこ決めてるだろうから、当時と違って実態とかけ離れたスペックというわけでもないのではと想像したりもするし、あるいは、少しでも高い製品を買わせたくて、家電店あたりがまことしやかに言い出した話かもしれないと邪推したりもするしで、まあ、どこまで本当なのか怪しい話、かもしれないなあ、とも…。

とは言え、せっかくLED照明を購入したのに、今まで使ってた蛍光灯照明より暗かったらションボリしてしまうわけで。新品を買ったら、「わあ、明るい」と言いたいよな…。そう考えると、+2畳の製品を買って、これはスゴイな明るいなと喜んでおけば、買ったほうも、売ったほうも、皆で幸せになれるのかもしれない、などと思ったりもして。なので、ホントかどうかは分からんけれど、+2畳で選んでおくのも悪くないような気もするなと…。

2021/03/06() [n年前の日記]

#1 [prog] Borland C/C++ Compilerを試用

C/C++における配列の書き方を忘れてしまったので、復習しようとしたのだけど。せっかくだから、この際 Borland C/C++ Compiler (embarcadero C++ Compiler, bcc32c) を試用してみるか、と。

_無料版 - エンバカデロ・テクノロジーズ
_C++Compiler - エンバカデロ・テクノロジーズ

以下のページを参考にして導入。環境は Windows10 x64 20H2。

_C/C++ 開発環境のインストール

昔は、無料版と言えば 5.5 が有名だったけど、今は 7.3 が配布されているらしい。メールアドレスその他を入力して、BCC102.zip を入手。解凍して任意のフォルダに置いて bin/ にPATHを通した。

Helloworld を試してみる。

_testbcc.c

以下を打てばコンパイルできる模様。
bcc32c testbcc.c
testbcc.exe が生成された。

ウインドウアプリケーションのビルドでハマった。 :

コンソールアプリケーションなら前述の指定で済むけれど、HDD内に残ってた、ウインドウアプリケーションのサンプルがビルドできなくて…。

以下のページを参考にして、.obj を生成してからリンクする Makefile を書いてみたらビルドができた。

_サンプルプログラム2-1(Windows)

ちなみに、make.exe は Borland C/C++ Compiler の bin/ 以下に同梱されていた。

ビルドした .c は以下。

_testbcc_w.c
_makefile

Makefile内の -L で指定してるパスは、各環境に合わせて修正する必要がある。

MSYS2に戻った。 :

一応、HDD内に残ってた helloworldサンプルを、コンパイル・ビルドできたけど。考えてみたら、今時は Microsoft製のコンパイラも無料で使わせてもらえるし、MSYS2を導入して gcc/g++ を使ってもいいのだよな…。あえて Borland C/C++ を使わねばならない場面って、ほとんど無いよな…。

そんなわけで、C/C++ の復習は、MSYS2 + gcc/g++ を使って行うことにした。MSYS2 は導入済みだったので、MSYS2 MinGW 64bit を起動して作業。

#2 [hsp][raspberrypi][linux] キーボードとマウスの取得についてまだまだ実験中

Raspberry Pi用HSPで、使っているキーボードやマウスによっては無反応になってしまう件について、hsp3dish.cpp を修正して動作を改善できないか、 _昨日の作業 を踏まえつつ実験中。

環境は、Raspberry Pi Zero W + Raspberry Pi OS buster。

修正対象ファイルは、 _OpenHSP/src/hsp3dish/raspbian/hsp3dish.cpp

HSPは、/dev/input/by-id 以下に、event-kbd(キーボード), event-mouse(マウス)が1つずつ出現するはず、という前提で処理が書かれているけれど。利用するキーボードやマウス製品によっては、そういう情報を返してくるとは限らなくて。

例えば以下の3製品は、想定していない情報を返してくる…。
なので、試しに、/dev/input/by-id以下に出現した event-kbd, event-mouse を全て対象にして ―― キーボードが1つ、マウスが1つ接続されてるはずと決めつけないで、相手が event-kbd か event-mouse と言ってきたらとにかくそれら全てを何個でも監視対象にして、かつ、各機器がキー入力とマウス入力を混ぜてきても取得できるように変更して動作確認してみた。

ちなみに、昨日試した、/proc/bus/input/devices の内容を見てキーボードを見つける処理は削除した。その処理では、EV=1200.. を返す機器が複数出てきた際に、どのみち対処できないので…。

修正部分は、initKeyboard(), updateKeyboard(), doneKeyboard() の3つ。かつ、グローバル変数をいくつか追加。

_hsp3dish.cpp
_hsp3dish.cpp.diff

動作確認には、sample/block3.hsp を利用。マウスを移動するとバーが左右に動いて、ESCキーを押すか、マウスの右ボタンクリックでスクリプトが終了する。

動作結果。 :

この修正をしたことで、Logicool K400r も、ESCキーを押すとスクリプトが終了するし、マウス(タッチパッド)を動かすとバーが左右に動くようになった。

また、ワーストケース(?)、BUFFALO BSKBW03WH + A4Tech XL-755BK の組み合わせでも、ESCキーを押すとスクリプトが終了するし、マウスを動かすとバーが左右に動いてくれた。

ということで、もしかすると書き方次第では、変わった識別情報を返してくるキーボードやマウスにも対応できそうだなと…。

ただ、キー入力やマウス入力を解析する部分が、こういう書き方でも問題無いのかどうかは分からず…。一応動いてるように見えるけど…。キー入力で evp->code == 0 or 1 が来た時におかしなことにならないか…。

ログ内容。 :

hsp3dish.cpp に printf() を入れてキーボードやマウスの認識状態を確認した結果もメモ。

BUFFALO BSKBW03WH + A4Tech XL-755BK の場合は以下。
Runtime[hsp3dish].
hsed: Runtime [hsp3dish].
Init:hgio_setmainarg(/home/mieki256/OpenHSP/.,__hsptmp.ax)
Init:HGIOScreen(1280,720)
readdir (.)
readdir (..)
readdir (usb-A4TECH_USB_Device-event-if00)
readdir (usb-A4TECH_USB_Device-if01-event-mouse)
match mouse : /dev/input/by-id/usb-A4TECH_USB_Device-if01-event-mouse , devFd : 6
Getting exclusive access: SUCCESS
readdir (usb-A4TECH_USB_Device-event-kbd)
match kbd : /dev/input/by-id/usb-A4TECH_USB_Device-event-kbd , devFd : 7
readdir (usb-A4TECH_USB_Device-if01-mouse)
readdir (usb-JME_RF_Receiver-event-if02)
readdir (usb-JME_RF_Receiver-event-kbd)
match kbd : /dev/input/by-id/usb-JME_RF_Receiver-event-kbd , devFd : 8
readdir (usb-JME_RF_Receiver-if01-event-mouse)
match mouse : /dev/input/by-id/usb-JME_RF_Receiver-if01-event-mouse , devFd : 9
Getting exclusive access: SUCCESS
readdir (usb-JME_RF_Receiver-if01-mouse)
readdir (usb-Logitech_USB_Receiver-event-if01)
Execute from __hsptmp.ax runtime[hsp3dish](1).
hsed: Process end 0.

実態としては、キーボード1つ、マウス1つを接続している状態だけど、BUFFALO BSKBW03WH は、キーボードなのに event-kbd と event-mouse を返すし、A4Tech XL-755BK は、マウスなのに event-mouse と event-kbd を返すので、計4つの機器が認識されていることになっている。が、4つの event を全部チェックするようにしたので、 ESCキー押しも、マウスの移動も反応するようになった。

Logiccol K400r を接続した場合は以下。
Runtime[hsp3dish].
hsed: Runtime [hsp3dish].
Init:hgio_setmainarg(/home/mieki256/OpenHSP/.,__hsptmp.ax)
Init:HGIOScreen(1280,720)
readdir (.)
readdir (..)
readdir (usb-Logitech_USB_Receiver-if02-event-mouse)
match mouse : /dev/input/by-id/usb-Logitech_USB_Receiver-if02-event-mouse , devFd : 6
Getting exclusive access: SUCCESS
readdir (usb-Logitech_USB_Receiver-if02-mouse)
readdir (usb-Logitech_USB_Receiver-event-if01)
Execute from __hsptmp.ax runtime[hsp3dish](1).
hsed: Process end 0.

Logicool K400r はタッチパッド付キーボードで、event-mouse しか返さない。また、キーボード入力もマウス入力も1つのeventに割り当てられてしまう。なので、HSPからはマウス1つ分だけが検出される。が、キーボードかマウスかで入力の解析処理を分けずに、キー入力もマウス入力もどちらも1つのeventに入ってくる可能性があることを前提にして入力をチェックするようにしたので、ESCキー押しも、マウス操作(タッチパッド操作)も反応するようになった。

#3 [movie] 「ハン・ソロ/スター・ウォーズ・ストーリー」を視聴

昨日TV放映されてたので視聴。STAR WARSシリーズに登場するハン・ソロの若い頃を映画化、という企画らしい。

フツーに面白かった。相棒との出会いや、愛機を入手した流れ等々、EP4〜6で提示されたアレコレを補完する内容で、なるほどそういう話にしてみたのか、みたいな。VFXもやっぱりゴイスで、空戦シーンはスピード感や迫力に溢れていた印象。

最後のあたりのアレは、 _「ハンが先に撃った」 問題を取り込んだソレなのだろうな…。当時のマニアの人達なら、「この(監督|脚本家)、(分かってる|分かってない)な…」と思えるシーン、だったのではあるまいか。

ググってみたら、評価は高かったけど興行収入は予想を大幅に下回ったらしい。それでも黒字になってるあたりはさすが、なのだろうか。

2021/03/07() [n年前の日記]

#1 [anime] 「ルパン三世 princess of the breeze 〜隠された空中都市〜」を視聴

BS12で放送されてたので視聴。TVSPの中の一つ。「このすば(この素晴らしい世界に祝福を!)」の 金崎貴臣監督作品。

本放送当時も視聴した記憶があったけど、改めて見てみたら、背景美術が奇麗で細かいなと…。ここまで描いてたのかと感心してしまったり。

不二子の尻への拘りを感じる…。何故そこまで尻を…。

コンテの名前に金崎監督の名前だけが出てきたので、一人でコンテを描き上げた、ということだろうかと。たしか「このすば」2期でも、かなりの話数のコンテを担当してた記憶があるので、コンテでクオリティを維持していくタイプの監督さんなのだろうなと想像。宮崎駿監督タイプというか。 *1

眼の中のハイライトがちょっと増えたことで、常に目がキラキラしてるルパンになっていて、当時は結構叩かれたような記憶があるけれど。考えてみたら、ハイライトが増えてしまうと、目が潤む的な変化を見せづらくなるわけで、もしかするとアニメキャラは、通常時はそれほどハイライトを入れないほうが表現の幅が相対的に増えるのではと思えてきたりもして。でも、その絵だけを止め絵で見せられた時に、ハイライトがあるほうが今風になるというか…。もしかするとこのあたり、本編映像を優先するか、宣伝素材?を優先するか、みたいな話になっていくのだろうか…。
*1: アニメの監督さんと言うと、コンテを描かなきゃいけないもの、と思われてしまっている節もあるし、実際そういうタイプも多いのだけど。全話の脚本を監督自身が担当するタイプとか、現場の作業にほとんど手を出さない監督さんとか、色々なタイプが居るわけで…。どこを担当するかでクオリティコントロールがしやすくなるか、そのあたりは人によるだろうから、必ずコンテを描かなきゃいけない、と思い込むのは危ないよなと…。

#2 [anime] 「機界戦隊ゼンカイジャー」1話を視聴

戦隊シリーズの新作。第1話を視聴。

今回は、人間メンバーは1人で、他の戦隊メンバーはロボットらしい。マジか。やられた。そんなチーム編成もアリだったのか。欠片も思いつかなかった…。企画を考えた人、凄いな…。頭が柔らかいなあ…。脱帽ですわ…。

戦隊メンバーのほとんどが着ぐるみということで、撮影時のコロナ対策もバッチリなのだ、という話もどこかで見かけた。いやはや、やるなあ…。ピンチをチャンスに変えたのではあるまいか…。素晴らしい。発想がGJ。

1話では赤いロボットが登場したけど、どことなく漂うおじさん臭がイイ感じだなと。個人的に、若い人達だけがずらりと並ぶ図より、若者とおじさんが並んでるほうが安心するというか…。仮面ライダー1号 本郷猛の横におやっさんが居るとなんとなく安心する、みたいな。登場人物の年齢は幅があったほうがいいよなと思ったり。でも、ああ見えて、あのロボットはめちゃくちゃ若かったりして…?

戦隊メンバーの面倒を見る(?)お婆さん役として榊原郁恵さんが出てくるのもイイ感じ。おばさん役じゃなくてお婆さん役なのかという微妙なショックはあるけれど、明るいキャラを演じてもらうならピッタリだろうなと…。

何にせよ、今後が楽しみな番組が始まったなと。

2021/03/08(月) [n年前の日記]

#1 [hsp][raspberrypi][linux] hsp3dish.cppをもう少し修正して動作確認

Raspberry Pi版HSPがキーボードやマウスを検出できない件についてもう少し追試。

_先日修正した内容 では、入力機器が type == 1 and (code == 0 or code == 1) を返してきた時にマウス入力がおかしくなりそうな気配がするわけで。本当は、もうちょっと、入力値をちゃんと解析しないといかんよなと。

ちゃんと対応させるためには、手持ちの各入力機器がどういう値を返してくるのか、調べないといけない。

幸い、Linux には evtest というツールがあって、それを使うと、各機器がどんな値を返してくるのか一覧表示してくれる。また、実際にキーを叩いたりマウスを動かしたりすると、その時の値を出力してくれるので、それらを眺めて動作確認できる。

ということで、調べてみた結果は以下。タッチパッドを操作したり、キーを叩いたり、マウスを動かしたりして、どんな値が返ってくるのか記録してみた。

_Logicool K400r (event-mouse)
_BUFFALO BSKBW03WH (event-kbd)
_BUFFALO BSKBW03WH (event-mouse)
_A4TECH XL-755BK (event-kbd)
_A4TECH XL-755BK (event-mouse)
_Lenovo KU-1255 (event-kbd)
_Lenovo KU-1255 (event-mouse)

それぞれ、Linux Input Subsystem という仕組みで値を返してくるわけだけど、そのあたりは以下のページの説明が分かりやすかった。ありがたや。

_Linux Input Subsystemの使い方

返してくる値は、linux/input.h というファイルで定義されているらしい。

_linux/input.h at master - spotify/linux

さておき。手持ちの機器を調べた範囲では…。 そういう値を返してくるのは間違いなさそうだなと…。妙な値を返してくるヤツが居たりしないかと不安だったけど、そんな機器は居なかった。

であれば、OpenHSP/src/hsp3dish/raspbian/hsp3dish.cpp の updateKeyboard() 内は、以下のように書けそうかなと…。

_hsp3dish.cpp
_hsp3dish.cpp.diff
static void updateKeyboard( void )
{
    int rd;
    int sx,sy;
    if (devIdx <= 0) return;

    sx = (int)mem_engine.width;
    sy = (int)mem_engine.height;

    // Read events from keyboard or mouse
    for (int idx = 0; idx < devIdx; idx ++) {
        if (devFd[idx] == -1) continue;

        rd = read(devFd[idx], ev, sizeof(ev));
        if (rd <= 0) continue;

        int count, n;
        struct input_event *evp;

        count = rd / sizeof(struct input_event);
        n = 0;
        while(count--) {
            evp = &ev[n++];

            switch(evp->type) {
                case EV_SYN:
                    break;

                case EV_KEY:
                    // check keyboard
                    if (( evp->code >= 0 )&&( evp->code < KEY_MAX )) {
                        key_map[evp->code] = evp->value;
                    }

                    if((evp->code == KEY_ESC) && (evp->value == 1)) {
                        quit_flag = 1;
                    }
                
                    // check mouse button
                    if(evp->code == BTN_LEFT)  {
                        //printf("Left button(%d)\n",evp->value);
                        mouse_btn1 = evp->value;
                    }
        
                    if(evp->code == BTN_RIGHT)  {
                        //printf("Right button(%d)\n",evp->value);
                        mouse_btn2 = evp->value;
                    }
                    break;

                case EV_REL:
                    if(evp->code == REL_X) {
                        // Mouse move Left/Right
                        //printf("Mouse moved left/right %d\n",evp->value);
                        mouse_x += evp->value;
                        if ( mouse_x < 0 ) mouse_x = 0;
                        if ( mouse_x >= sx ) mouse_x = sx-1;
                    }
        
                    if(evp->code == REL_Y) {
                        // Mouse move Up/Down
                        //printf("Mouse moved up/down %d\n",evp->value);
                        mouse_y += evp->value;
                        if ( mouse_y < 0 ) mouse_y = 0;
                        if ( mouse_y >= sy ) mouse_y = sy-1;
                    }
                    break;

                default:
                    break;
            }
        }
    }
}

switch - case を使って、evp->type の種類によって処理を分けるように書いてしまっても問題無いだろう…。また、hsp3dish.cpp の最初のあたりで、linux/input.h を include しているようなので、EV_KEY, EV_REL, REL_X, REL_Y 等のシンボルを使って記述してもいいのではないか。そのほうが可読性はちょっとだけ良くなるはず。

この状態でビルドして動作確認してみたけれど、手持ちのキーボードやマウスに関しては、どれも動作してくれたので、こういう書き方・処理内容で、おそらく問題無いのだろう…。

ただ、タッチパネルを使っている環境で HSP を動かしたときは困りそうだなと…。おそらく、タッチパネルの場合は、type == EV_ABS を返してきそうな気がする…。EV_ABS が来た場合については処理を記述してないので、無反応になるのではないか…。自分、タッチパネルは持っていないので、そのあたりの実験・動作確認はできないのだよな…。

余談。 :

キーボードなのに event-mouse を返してきたり、マウスなのに event-kbd を返してきたりする製品があるのは何故だろう。

これは根拠がない勝手な想像だけど、もしかすると、それら製品のコントローラ部分が、複合キーボード・マウスにも対応できる機能を持っているから、ではないのかなと…。

ひょっとすると、それらキーボードにポインティングデバイスも追加してみたり、あるいはマウスにキー入力用のボタンを追加してみたら、複合キーボード・複合マウスとしてもあっさり使えてしまうのかもしれない。分解してみたら、基板上に、それら付加機能にも対応させる回路パターンまで存在するのかもしれないよなと。ただ、自分が入手した各製品については、コスト的な問題や、商品展開の関係で、キーボード単体、マウス単体としてのハードウェアしか用意してなかっただけ、ではあるまいか…。

考えてみたら、キーボードにしか使えないコントローラや、マウスにしか使えないコントローラを設計製造するよりも、キーボードにもマウスにも使えるコントローラを作ってしまって、それをどの製品にも組み込んで設計製造したほうがコスト削減できるよなと…。いや、分からんけど。でも、たぶん、そういうことなんじゃないかと。

となると、安い製品だから変な情報は返してこないはずだ、と思い込んで実装するのは危ないかもしれない。安い製品だからこそ、実際には載ってないハードウェアの情報まで何故か返してくるかもよ、と若干疑いながらソースを書いておいたほうが安全だったりするのだろうなと思えてきたりもして。

一応issueを投稿しておいた。 :

_onitama/OpenHSP に、一応このあたりの内容を _投稿しておいた。 とメモ。

もっとも、「そんな変態キーボード・変態マウスにまで対応させる気はありません」とか「どれも今では入手できない製品ですよね? 無視します」と書かれて放置されてもおかしくない話かもしれんなあ、とも…。 *1

*1: ただ…。 _2017年頃 に自分が HSP を触ってみて、「アレ? ESCキーもCtrl+Cも受け付けないぞ? キー入力すらまともに動かないなんて、これは鋭意開発中ってことだな…」と思って放置して、そこから数年間そのまま、という流れを思い返すと…。修正対応できるなら、したほうがいいよな…。自分以外にも、「HSP使えねー。キーボードすら反応しねー」と思ってしまってHSPを窓から投げ捨てていた人が居てもおかしくないわけで。

#2 [pc][nitijyou] 白いノートPCを少しだけメンテナンス

階下・茶の間に置いてある、お袋さん用の白いノートPC、FUJITSU LIFEBOOK AH33/J (FMVA33JW1) を、親父さんが久々に起動してみたらしいのだけど。「いつまで経っても起動しない」と苦情が。

確認してみたら、一応起動はするようだけど、ログイン画面・サインイン画面が出てくるまで、たしかに数分かかる…。しかも、親父さんの Microsoftアカウントでサインインしようとすると、3〜5分ぐらいかかる…。

ローカルアカウントに切り替えてみたら、1分ぐらいでサインインできるようになった。しかし、それでも遅い。

HDDが壊れかけているのだろうか…。と思っていたけれど、シャットダウンしようとしたら「更新して再起動」の文字が。ああ、なるほど。久々に電源を入れたから、Windows Update で大量にファイルをDLしていて遅くなってたのかもしれんなと…。もっとも、Celeron B820 1.7GHz という遅いCPUが載ってるPCだし、SSDじゃなくてHDDだから、通常時からしてサクサク動くわけもないのだけど。

このノートPC、バッテリーが完全に死んでいるので交換すべきかどうか悩むけど、もはやどこにも売ってないであろう予感もあるし、交換したところでこのスペックではなあ、という気もするし。

でも、当時の日本製ノートPCなだけあって、Microsoft Office がプリインストールされてるし、年賀状ソフトやらDVD再生ソフトやら、色々プリインストールされているのだよな…。捨てるとしても、そこだけは、なんだかもったいない…。どうしたもんか…。

バッテリーの型番が分からない。 :

バッテリーの型番について調べてみたけど、これがなんだかよく分からない…。

本体についているのは、 Product No. : FPCBP342、P/N : FMVNBP212、10.8V 24Wh(2200mAh) とあるけれど、富士通 WEB MARTで、の _バッテリー商品一覧 上で、型番: FMVA33JW1 で検索してみると FMVNBP189 と出てくる。そして FMVNBP189 の対応機種の中に AH33/J なんて無い。

_[富士通WEB MART] アクセサリー・周辺機器(オプション) : 富士通 を眺めても、AH33/J という型番は無いし…。というか多過ぎ。型番多過ぎ。

#3 [nitijyou] 歯が痛い

昨日、一昨日から、左上の奥歯の前あたりがなんだかしくしくと痛い。虫歯の進行が進んだのか、それとも歯茎が弱ってるのか分からんけれど…。

数日後に、メンテナンスとして歯医者の予約は入れているけれど、そこではメンテナンスの時間しか確保してないだろうから、虫歯だった場合の治療は別途予約を入れないといかんわけで。とは言え、現状では、何が原因で痛んでいるのか分からんし…。

コロナウイルスが流行しているこんな時期に、通院回数を増やしたくはないのだけど、しかし放置していても虫歯が治るはずもなく。どうしたもんか。

2021/03/09(火) [n年前の日記]

#1 [pc] Adobe Bracketsをインストールしてみた

HTMLエディタ、Adobe Brackets 1.14 を Windows10 x64 20H2上でインストールしておいた。

ただ、この Adobe Brackets、開発停止? サポート終了? だそうで…。

_Adobe、Windows/Mac/Linux対応の無償コードエディター「Brackets」のサポートを9月1日に終了 - 窓の杜

HTML や CSS を書くことに特化してあって、結構便利だったのだけどな…。

拡張をインストール。 :

一応、拡張もインストールしておいた。

  • Add HTML template ... HTMLのテンプレートを挿入
  • Beautify ... HTMLソース、Javascript、CSSを整形
  • Brackets CSS Class Code hint ... CSS関係の入力候補を表示
  • Brackets Css Color Preview ... CSSの色指定を表示
  • Brackets Icons ... ファイルの種類別でアイコンを表示
  • Brackets Key Remapper ... ショートカットキー割り当てを設定ファイルに列挙
  • Brackets Markdown Preview ... Markdownファイルをプレビュー
  • Brackets Tools ... 大文字小文字変換その他の各種変換機能
  • colorHints ... 色指定を表示
  • Display Shortcuts ... ショートカットキー割り当てを表示
  • Documents Toolbar ... タブバーを表示
  • Emmet ... HTMLやCSSの省エネ入力を追加
  • HTML Block Selector ... タグ単位で選択
  • Indent Guides ... インデントガイドを表示
  • Markdown Preview ... Markdownファイルをプレビュー
  • Minimap ... ミニマップを表示
  • Paste and Indent ... 貼り付け時にインデントを自動付加
  • SVG Preview ... SVGをプレビュー
  • ファイル参照し太郎 ... ファイルパスの挿入時に候補を表示

_GitHub - brackets-beautify/brackets-beautify
_GitHub - cmgddd/Brackets-css-color-preview
_GitHub - ivogabe/Brackets-Icons
_begue / brackets-markdown-preview - Bitbucket
_GitHub - yasinkuyu/brackets-tools
_GitHub - konstantinkobs/brackets-colorHints
_GitHub - redmunds/brackets-display-shortcuts
_GitHub - dnbard/brackets-documents-toolbar
_Emmet - the essential toolkit for web-developers
_GitHub - sathyamoorthi/html-block-selector
_GitHub - lkcampbell/brackets-indent-guides
_GitHub - gruehle/MarkdownPreview
_GitHub - zorgzerg/brackets-minimap
_GitHub - ahuth/brackets-paste-and-indent
_GitHub - peterflynn/svg-preview
_GitHub - jzmstrjp/brackets-drop-includer

ただ、こんなに入れると、かなりの数のショートカットが衝突してしまう。ステータスバーに「エラー: 61」と表示されていて、クリックして確認すると、定義済みのショートカットキーに別の機能を割り当てようとしてバッテンがついてるところが多々あるようで。

拡張のバックアップを取りたい。 :

拡張をインストールした状態で、Adobe Brackets に追加したファイル群のバックアップを取りたい。ググってみたら以下のページに遭遇。

_Bracketsエディタの設定を複数PC環境で同期させる方法
_「Brackets」の設定を共有する | ゆんつてっく

Windowsの場合、C:\Users\(USERNAME)\AppData\Roaming\Brackets\ に、設定ファイルも拡張関係ファイルも入ってるらしい。

一応、zip にしてバックアップを取っておいた。これで、Brackets の再インストール時も、これらのファイルを書き戻せば、しばらくは使える…といいのだけど、さて、そう上手く行くのだろうか。

VSCodeも試用したけど問題発生。 :

代替エディタとして Microsoft Visual Studio Code (VSCode) が挙げられてるので、そちらにも代替拡張をインストールしてみた。

_Microsoft、拡張機能で「Visual Studio Code」への移行を支援 〜「Brackets」のサポート終了により - 窓の杜

Windows10 x64 20H2 + VSCode 1.54.1上で、以下をインストール。
  • Live Server 5.6.1
  • CSS Peek 4.1.0
  • IntelliSense for CSS class names in HTML 1.20.0

しかし、Shift_JIS で書いたHTMLを Live Server 経由で Google Chrome 上に表示すると文字化けしてしまう。HTML内で <meta charset="Shift_JIS"> を指定してあるのだけど、変だな…。何が何でも UTF-8 で書け、それ以外は認めん、ということだろうか…。Brackets なら表示されるのだけどなあ…。

Google Chrome に、テキストエンコーディングという拡張をインストールしてみたけれど。

_テキストエンコーディング - Chrome ウェブストア

Shift_JIS に変更してみても相変わらず文字化けする。変だなあ…。Live Server を経由する際に、おかしなことになってないか…。

ググってみたら以下のページが。

_VSCode の Live Server で文字コード Shift_JIS が文字化けしてしまう - Qiita
_文字コードがShift_JISの時の簡易開発環境(VSCode) │ JWS BLOG

なるほど。VScode + Live Server ではダメなんだな…。

issues を眺めてみたけど…。

_Issues - ritwickdey/vscode-live-server ・ GitHub
_language encoding is not preserved while serving - Issue #459 - ritwickdey/vscode-live-server - GitHub

2019年に報告されてるけど放置っぽい。というか、この拡張、2019/04から更新されてない…。

Preview on Web Server という拡張や、Live Server Preview という拡張も試してみたけど、これも Shift_JIS が文字化けする。

_Preview on Web Server - Visual Studio Marketplace
_Live Server Preview - Visual Studio Marketplace

どうもこの手の動作の基本となるパッケージ?が、色々な文字エンコーディングに対応してないのではと思えてきた。

「Brackets の代替は VScode でいいよね?」と言うけれど、ソレって現状では英語圏でのみ通用する話だったりしないか、という気分に…。 *1

*1: まあ、多言語対応は UTF-8 だけサポートしてれば問題無いやろ、ってノリなんだろうけど…。今まで書かれた非UTF-8のHTMLは全部捨てろと仰るか…。

2021/03/10(水) [n年前の日記]

#1 [hsp] HSP3.6beta5を試用

2021/03/04頃に、HSP3.6beta5が公開されていたらしい。

_HSP3.6β5を公開しました - おにたま(オニオンソフト)のおぼえがき

Windows10 x64 20H2 上で試用してみたり。

一部のサンプルが動かない。 :

色々なサンプルを実行して眺めていたのだけど、以下の2つがエラーを出して動かなかった。
  • hsp36beta\sample\hsp3dish\tamane_s_dish.hsp
  • hsp36beta\sample\hsp3dish\tamane_s2_dish.hsp

少し弄って試してみたら、どうやら screen命令を一番最初に移動すると、スクリプトが動く模様。

    tamas=ginfo_newid
    celload "tamane_s1.png",tamas       ; 素材フォルダから読み込みます

    ;   標準のサイズで表示
    screen 0,800,600
    ;   標準のサイズで表示
    screen 0,800,600

    tamas=ginfo_newid
    celload "tamane_s1.png",tamas       ; 素材フォルダから読み込みます

たしか、hsp3dish において、screen命令等、ウインドウサイズを変更する命令を使うと、VRAMに保持してあった画像データ・バッファ等は全部初期化・クリアされる、という話があったような気がする…。

_HSP3Dish プログラミングマニュアル・基本仕様ガイド
また、スクリーンサイズ変更時は、通常ランタイムとは異なり、それまでに読み込んだすべての画像バッファは失われますので注意してください。

HSP3Dish プログラミングマニュアル・基本仕様ガイド より


つまり、
  1. celload を使って、画像を、VRAM上のバッファに読み込み。
  2. screen命令を呼んでウインドウサイズを変更。ここでバッファが全部初期化されてしまう。
  3. 初期化されたバッファを元画像扱いにして描画しようとするからエラーが出る。
ということではないのかなあ、と。

2021/03/11(木) [n年前の日記]

#1 [nitijyou] 歯医者に行ってきた

電動自転車でS歯科まで。14:00-14:20まで治療。今回はメンテナンス。

数日前から左上の歯のあたりが痛んでることを伝えたら、虫歯の穴が広がってしまったのだろう、との話で。一応、今回は、どの歯が虫歯なのかと尋ねてみたら、場所を教えてもらえた。 *1 鏡で見て、この歯かなあ、と思っていたところがソレなので、やっぱりあそこなのか、みたいな。

2ヶ月おきのメンテナンスは今回で終了で、次回は半年後と言われたけれど、どういう基準で期間が決まるのか分からんなと…。コイツ面倒臭いヤツだからもう相手したくねえなあ、みたいなソレなんだろうか…。予約は頻繁にキャンセルするし、治療中はやたらと怖がってウーウー言うし…。自分自身もこんな患者は絶対面倒臭いだろうと思ってるから、そういう扱いをされてもまあ妥当だろうなと思えてしまうのがアレなんだけど。

新型コロナウイルスが流行してるこんな時期に通院回数を増やしてしまうのもどうなんだろう、それはそれで危機感が薄い行動なのでは、と思って、虫歯については様子見を、と伝えてしまったものの、コロナが収束するまで放置してたら大変なことになりそうな気もするし。というか、コロナなんて何時頃収束するのか全然分からない気配だし。でも、治療するとなると、5,6回以上は通うことになるだろうし。などと悩んでる余裕なんて無いのではないか、明日には激痛が襲ってくるかもしれん、と思えてきたりもするし。グダグダ言ってないで予約入れろ、という気持ちと、えっ、こんな時期にわざわざ? という気持ちが…。どうしたもんか…。
*1: 聞かないと教えてもらえないのも、ちょっとどうなのと思うのだけど…。

2021/03/12(金) [n年前の日記]

#1 [nitijyou] 歯が痛い

歯なのか歯茎なのか分からんけど、なんだかそのあたりがどうもしくしくと痛い。昨日、歯医者さんでメンテナンスをしてもらったわけだけど、たぶんその時の刺激で炎症が起きかけているのかなと勝手に想像してるけど。であれば、数日経てば落ち着いてくれたりするのだろうか。まあ、様子見するしかないわな…。

歯の痛みがあるせいか、睡眠時間も普段より長い感じで。これは根拠が無いオレオレ仮説だけど、その手の痛みがある状態が続くと、それだけで脳が疲れて、あるいは、痛みというストレスでソレ系の脳内物質が増してしまって、睡眠という形で休息をより多く欲したりするのではないかと…。思い返してみると、自分がその手の病気になってしまった時期と、虫歯になって苦しんだ時期って、完全に一致してるのだよな…。誰かそのあたりのデータを集めて検証してる人は居ないのだろうか。

2021/03/13() [n年前の日記]

#1 [anime][cg_tools] 写真をアニメの背景画に加工する技術が気になる

とあるアニメに関して、数ヶ月前に話題になっていたらしい話を今頃知った。

_人気アニメ「ゆるキャン△」でGoogleストリートビューを加工し背景として不正使用 映像差し替えに | Japan-Railway.com

なんでも、背景画の一部にGoogleストリートビューのロゴがうっすら残ってたそうで、さてはGoogleストリートビューの画像を無断利用・加工して作ったのでは、という話らしいのだけど。

アニメ制作において、Webから各種画像を無断利用云々は、たまに見かける話題なので、そこらへんは「またか」程度の印象なのだけど。個人的には全然違う部分が気になった。

おそらくは加工前の画像と、加工後の画像を目にして、かなり驚いたというか。加工前は春か夏の風景なのに、加工後は冬の風景、路面がツルツルに凍結しちゃってる画。パッと見では完全に別モンになってるやん…。一体どんな作業をしたら、ここまで激変させることができるのか…。

写真画像を比較的そのままアニメ風にする加工であれば、作業手順を解説してるページも見かけるし、個人的にその手のフィルタを色々探して試用したこともあるので、おおよその作業内容、利用したフィルタ種類などもうっすらと想像できるのだけど。ここまで違うものに加工する作例なんて目にした記憶が無いわけで。

クリック一発で自動で加工できると思い込んでる人もチラホラ見かけたけど、そんなことできるわけないやろ…。でも、何かしら加工をして最終的にこういう画を作ったのは間違いないのだろうし。

凍結した路面は別の写真画像を持ってきて当てはめてるのかなあ…。でも周辺の木にも雪が積もってるし…。

元画像を下絵にしながら、ひたすらブラシでべたべた塗っていった、とかなのかなあ…。もしそうであれば、結局は絵が描ける人じゃないとここまで加工できませんよ? という話になりそう。

何をどうしたらここまで変えられるのだろう。そこが気になるなあ、と。

Googleと契約できないものだろうか。 :

加工技術云々とはまたちょっと違う話だけど。

昨今のTV番組をチラ見していると、たまに、日本地図から現地の航空写真にズームしていく映像があって、大体は右下にGoogleのロゴが表示されていたりするわけで。アレ、たぶんGoogleと何かしらの契約を結んで流しているのかなと想像しているのですが。

アニメ制作でも、そういう契約を結ぶことはできないのかなと…。ED映像のスタッフロールで「協力 Google」とか「画像素材提供 Google」等を表示する感じの契約を…。そういう契約を結べたら、色々と安心だよなと…。

でも、その場合、どういう契約内容になるのだろう。1カット単位で幾らか払うのか、それとも1作品あたりでドンと払うのか。

_Permissions - Google

「ストリートビュー画像の使用」という項目があったので眺めてみたけど、商用目的でのトレース禁止、と書いてあるように見える。その手の加工も可能になる契約は用意されてないのだろうか…?

アレほど大量の写真画像を収集しておきながら、活用範囲が制限されてるって、なんだかもったいないなと…。しかるべき契約をすればちゃんと利用できますよ、てな状況のほうが、皆で幸せになれるよなと…。

色んなアニメのスタッフロールでGoogleの名前がさらりと表示される、そんな未来が来たらいいのになと。やれ無断利用だ不正利用だ、みたいな話ばかりが出てくる未来じゃなくて。

2021/03/14() [n年前の日記]

#1 [anime][neta] スキップの動きに正解はないのかもしれない

ふと、なんとなく。アニメにおけるスキップの動きが気になった。

随分前の話だけど。「MAJOR」という、NHK教育を通じて全国放送されていたアニメのED映像で、ヒロインが珍妙なスキップの動きを見せていたことがあって。「昨今のアニメーターは、スキップの動きも満足に描けないのか…。しかも、こんな作画を日本全国に向けて堂々と放送して…。じわじわと業界全体のレベルが落ちているということかなあ…」と、その時は安易に思ってしまったのだけど。

昨日、「22/7検算中」というアイドル番組をぼんやり眺めていたら、ちょっと気になるシーンがあって。

アイドルが体力測定?をする回だったらしいのだけど、「スキップができるか」というお題で、珍妙なスキップを披露してる娘さんが居て。当人はしっかりスキップしているつもりらしいのだけど、傍から見ると「なんだその動きは…」と思えるスキップで。

そこでふと、「MAJOR」のED映像のスキップの動きを思い出してしまったわけで。あの動き、実は正しかったのかもしれないなあ、と…。

思い返してみれば、あのヒロインキャラは、根性だけは誰も負けないけど、かなり酷い運動音痴というキャラ設定だった…。であれば、華麗なスキップを見せてしまうほうがむしろ異常なのだよな…。本人は楽しそうに笑いながら、「わたし、スキップできてるもん」と自慢気に跳ねているのだけど、傍から見たら「なんだその動きは…」と思える動きのほうがリアルなわけで。

「アニメーターのレベルが落ちてる」なんて、とんでもない誤解だったのかもしれない。アレは、「運動音痴の娘さんなら、えてしてこういうスキップを披露するはずだよね?」と、あえて意図して、しっかりと、リアルに再現してみせた、極めて秀逸な動きだったのかもしれない…。

そんなわけで、極端な話、アニメにおけるスキップの動きに正解なんてものは無いのだ! と思っておいたほうがいいのかもしれないなと。現実世界にも珍妙スキップをしてしまう人がちょこちょこ居るのだから、アニメも同じであろうと。

「なんだその動きは…」と思うスキップでも、そのキャラはそういうスキップをしてしまうキャラなのだと。そういう動きをわざと描いてる場合だってあるのかもしれないのだよなあ、と。

運動音痴の記号の発明が求められている。 :

「アニメにおけるスキップの動きに正解なんてものは無い」と書いてはみたものの。しかし、何も知らない人が、珍妙スキップのカットだけを目にしたら、「アニメーターのレベルが落ちてるな」と勘違いしてしまうわけで、それはそれでマズイ。

つまり、「このキャラはスキップもできないほどの運動音痴なのです」と、一瞬で伝わる記号を発明せねばならない、そんな気もしてきたり。

例えば、美少女キャラが眼鏡をかけていると、このキャラは頭がいいキャラなのかな、とか、理知的なキャラなのかな、みたいなお約束属性がうっすら出てくるわけだけど。同様に、何かアイテムをつけているだけで、「このキャラは運動音痴なのかな」と思えてくる、そんな記号があったら便利だろうなと。

とは言え、そんな便利アイテム・便利な記号は、なかなか思いつかないわけで…。

誰か発明してくれないものか。そういう発明がされたら、たぶん、美少女キャラをバンバン描かなきゃいけないイラストレーターさんあたりは結構助かると思うのだよな…。一目で「ああ、運動音痴系のキャラなのね」と伝わるなんて、コレは絶対に便利なはず…。

2021/03/15(月) [n年前の日記]

#1 [godot] VehicleBodyノードを眺めてる

Godot Engine を使って車が走る感じの何かを作れないものかなと調べていて、VehicleBodyノードというものがあることを知った。

_VehicleBody - Godot Engine (stable)の日本語のドキュメント
_VehicleWheel - Godot Engine (stable)の日本語のドキュメント

車っぽい動きを実装する際に使えるノードらしい。

ただ、使い方が分からない…。一応、その手の動画やサンプルプロジェクトを眺めてみているけど、よく分からん…。

_Godot Vehicle Tutorial part 1 - import and setup a car - YouTube
_BastiaanOlij/vehicle-demo at Part-1
_BastiaanOlij/vehicle-demo: Godot VehicleBody demo project

パス機能が何だかスゴイ。 :

話はちょっと違うけど、その手の動画を見ていたら、Godot Engine のパス機能を使って、3Dのコースを作ることも可能らしいと知った。

_Godot Vehicle Tutorial Part 2 - Building a track - YouTube
_Godot vehicle tutorial part 3 - Improving the track - YouTube
_Godot vehicle tutorial part 4 - finishing the track - YouTube
_Vehicle demo 5 - Going VR - YouTube

使い方をマスターすれば、こんなこともできてしまうのか…。Godot Engine、スゴイな…。

#2 [linux] Linux Mint機をアップグレードしてる

手持ちのサブPCにインストールしてあった Linux Mint 19.3 を 20.0 にアップグレード中。

サブPCのスペックは以下。一応メモ。 手元のメモには、メモリ: 2GB x 2 と書いてあったけど、free -h と打ち込むと8GB載ってるように見える…。どういうことだろう…。弟から貰ったパーツだけど、もしかしてパッケージとは違うメモリを載せてたのかな。

さておき。以下のページの手順に従って作業。ありがたや。

_Linux Mint その150 - Linux Mint 20へアップグレードするには - kledgeb
_Linux Mint : 新しいバージョンの Linux Mint にアップグレードする方法 | 221B Baker Street

外部パッケージを一旦ダウングレードしないと mintupgrade check がエラーを出すのだな…。

無線LAN子機、BUFFALO WLI-UC-GNM (IEEE802.11b/g/n対応)でルータに接続しているせいか、全パッケージのダウンロードに3時間ぐらいかかった。もしかすると、無線LAN子機が熱を持ち過ぎて速度が遅くなってたかもしれんなと…。一時的に有線LAN接続したほうが良かっただろうか。でも、サブPCの背面を弄れるような設置状態ではないし。USB接続の有線LANアダプタがあれば違うのかな。と思ったけど、USB2.0接続だと100Mbpsまでの対応か…。それでも無線LAN子機より速そうではあるけれど。

2021/03/16追記。 :

Linux Mint 20.0 にアップグレードした後、20.1 までアップグレードした。

スペックがそれほど高いPCではないせいか、半日ぐらいかかった気がする…。

2021/03/16(火) [n年前の日記]

#1 [zatta] 人間を動物と結びつける発言はとにかく注意

思考メモ。

ちょっと気になるニュースを見かけた。

_「アイヌの人々傷つける不適切な表現」日本テレビに厳重抗議 | NHKニュース

「不適切な表現」と言うけれど、具体的にはどういうことをやらかしたのだろう。そこが分からないと判断のしようがないなと。

そんな疑問が湧いてググってみたけど、大半のニュース記事は「不適切な表現」としか書いてなくて。何をしたのかがそもそも分からなければ、また同じことを誰かが何度もやらかすのでは…? これはこれでマズいんじゃないか?

しつこくググってたら、発言内容が分かった。

_日テレは「スッキリ」でのアイヌ差別発言を検証し、説明責任を果たせ - 田中駿介|論座 - 朝日新聞社の言論サイト

正直、一瞬、「え。只の駄洒落じゃん」と思ってしまったのだけど、以下の解説記事を読んで、「ああ…そういう歴史があったのか…。それはいかん。ピンポイントで最悪なことをやっちゃったんだな」という認識に。

_和人はアイヌをどう差別した?大和朝廷の頃から振り返る1,000年以上の歴史 - BUSHOO!JAPAN(武将ジャパン)

誰でも思いつく安易な駄洒落だからこそ、当時は広まって使われてしまったという経緯があるのだろう…。簡単で、シンプルで、くだらないネタだからこそ、それこそ子供ですら使えてしまって、被害を拡大させるのだな…。たぶん。

個人的には、漫画「ゴールデンカムイ」の中で、わざわざ説明していた差別表現だったということに、結構ショックを受けてしまった。そのあたり、自分も一応漫画原作を読んでいたはずなのに、全く記憶に無い…。アニメ版はそのあたりを映像化していただろうか。それも記憶が無い…。コレはマズイ…。

これはつまり、やられた側はずっと覚えてるけど、やった側は全く覚えてない・気にも留めてないという ―― よくあることではあるけれど、結構最悪な状態ではないのかと…。

自分達の先祖が今まで一体どんなことをやっちゃってきたのか、そのあたり、経験としては持ってなくても、せめて知識としてはそこそこ持ってないと…。そのあたりを知らないというのは、それはもはや、日本人を名乗る資格が無いとすら言える。他国の人なら知らなくても仕方ないけど、自分達は一応(?)日本人なのだから、御先祖様がしてきたことを知ってて当たり前だよなと。無知であったことに恥ずかしさを感じねばいけない話だろうと。自分が日本人であるならば、だけど。

ということで、自分も、自分を恥じた次第。こういう無知は許されない。「差別意識はなかった」なんてのは、言い訳にはならない。日本で生まれて、日本で育った日本人なら、知識として持ってないと。まあ、日本人じゃないなら話は別だけど…。

考えてみたら、相手を人間扱いせず、動物と結びつけた発言をするのは、差別表現と言うか、侮辱をする際の常套手段なのだよな…。目の前で発言してる人を見たわけではなく、漫画や映画等で見かけたソレではあるけれど、例えば…。 日本人も含む黄色人種が、白人から 「黄色い猿(イエローモンキー)」呼ばわりされたり。 ある種の状態になっている(男性|女性)を 「盛りのついた(犬|豚)」と呼んでみたり。 リーダーのポジションにある人物を 「猿山の大将」と喩えてみたり。 そんな感じで、色々なパターンを思い出してしまう…。

つまり、「人間を動物に喩えるネタ」を思いついた時は、「それ、大丈夫か? 発信してもいいネタか? ホントに?」と常に疑わないといかんのだろうなと。特に、公共の電波を使える立場であれば…。いや、Webも同じか。気を付けないと…。

とは言え、そのあたりを極度に不安視してしまって、人間を動物に喩えるのは全部ダメだ、許されないのだ、という主張にまでなってしまうと、当然弊害も出てくるだろうなと…。例えば、宮崎駿監督が関わっている、犬の「名探偵ホームズ」や、「紅の豚」等々、あるいは、俳優の香川照之さんが演じるカマキリ先生だって、TV放送できないことになってしまう。さすがにそこまで行くと、それはそれで何かがおかしい。

このあたり、セーフとアウトの境界線はどこにあるのだろうか…?

ネガティブな方向だけとは限らないのだよな。 :

人間を動物に喩えると言っても、必ずしも侮辱表現になるとは限らないのだよな…。
  • 「獅子奮迅の活躍ぶり」とか。
  • 「眠れる獅子」とか。
  • 「龍虎対決」とか。
  • 「彼は一匹狼」とか。
  • 「ボクの可愛い子猫ちゃん」とか。
他にも色々あるだろうけど。

良い印象を与える動物と、悪い印象を与える動物があって、前者に喩える場合は問題は起きないのだよな…。なんだかちょっと難しいなあ…。

まあ、どうしても何かの動物に喩えてみたくなった時は、「なにそれ、カッケー!」と思わせる方向で喩えるよう意識しましょうや、ってことで…。

2021/03/17(水) [n年前の日記]

#1 [godot] Godot EngineのVehicleBodyノードについてまだ調べてる

Godot Engine上で車の動きを作れるらしい VehicleBody ノードと VehicleWheel ノードについて調べているところ。

Godot Engine のデモプロジェクトの中に、3D Truck Town Demo というものがあって、これが VehicleBody等を使って動いているらしくて。

_3D Truck Town Demo - Godot Asset Library

インストールして、ノード構成やノードのプロパティ値(?)について眺めていたり。

車体モデルも用意する。 :

実験するにあたって、車体に相当する3Dモデルも必要なので、blender 2.83.13 LTS を使ってモデルを用意していたり。以下のCC0モデルを利用させてもらって作業中。ありがたや。

_Vehicles Assets pt1 | OpenGameArt.org

VehicleBody等で利用する車体モデルは、車体と、各タイヤ(ホイール?)を別オブジェクトにしておかないといけないのだけど。上記のモデルは、車体もタイヤも一体化しているので、blender で開いて以下の作業をした。
  • タイヤ部分を選択して、Pキーを押して、別オブジェクトに分割(分離)。
  • タイヤオブジェクトの原点を、3Dカーソル等を利用して、タイヤの中心に設定し直す。原点にしたい頂点を選択 → Shift + S → カーソルを選択物に → オブジェクトモードに変更 → オブジェクト → 原点を設定 → 原点を3Dカーソルに移動。
これで、1つの車体 Meshと、4つのタイヤ(ホイール) Mesh、計5つのオブジェクトにした。

_Blender 2.8 でメッシュを分割する - しっぽを追いかけて
_【Blender】Blender2.8 3Dカーソル - 3DCGニャ-Blender、ZbrushなどCGソフトの役立つ情報-
_【Blender】原点を移動させる|yugaki|note

タイヤ部分(ホイール部分)のオブジェクト名は、最後に「_wheel」をつけておくと、Godot Engine にインポートした際に、自動で VehicleWheel ノードに変換してくれるっぽい。たぶん。自信は無いけど、おそらくは。なので…。
  • 前タイヤは、「fornt_left_wheel」「front_right_wheel」
  • 後ろタイヤは、「rear_left_wheel」「rear_right_wheel」
こういったオブジェクト名に変更しておけば、後の作業が楽になりそう。

#2 [python] Python IDE Thoony と Mu を試用

VMware Player上で Raspberry Pi Desktop bustor を動かして少し触っていたのだけど。スタートメニューのプログラミングの項に、Thonny Python IDE と、Mu という項目があることに気が付いた。コレは一体何だろう。

Thonny は、Python の学習用IDEで、Mu は Python の学習用エディタらしい。

せっかくだから、それぞれちょっとだけ試用してみたり。

Thonnyを試用。 :

そのまま Raspberry PiDesktop上で試用してもいいのだけど、Thonny はWindows用のバイナリもあるらしいので、一応試しにインストールしてそちらを使ってみた。環境は Windows10 x64 20H2。

_Thonny, Python IDE for beginners

公式サイトの上のほうに、「Download version 3.3.6 for Windows Mac Linux」とあるので、「Windows」をクリック。thonny-3.3.6.exe をダウンロード後、実行してインストール。

公式サイトには、「Microsoft Edge や IE でダウンロードすると Windows Defender からウイルスと誤判定される。Firefox でダウンロードすればそうはならない」みたいなことが書いてあった。自分は Firefox を使ってるせいか、今回はウイルスと誤判定されなかった。

バイナリには Python 一式も同梱されているらしい。Thonny のインストールフォルダ以下に、Python.exe その他が入っている。別途 Python のインストールをしなくても、すぐに学習が始められる点はイイ感じ。

Thonny を起動すると、上のほうにはエディタ画面が、下のほうにIDLEっぽいウインドウが表示される。Python の言語仕様・動作に関して何か試したいときは、下のウインドウで打ち込んでやれば、その場で確認できるのは便利かもしれない。いやまあ、たしか PyScripter もそんな感じの画面構成だったので、IDEと称するアプリでは一般的な仕様かもしれないけれど。

TABキー、もしくは、Ctrl + Space で補完機能が働く。これはありがたい。

たしかに、学習用の環境としては、なかなかイイ感じかもしれない。

Muを試用。 :

これも Windows版をダウンロードしてインストールしてみた。環境は Windows10 x64 20H2。

_Code With Mu
_Download Mu

Windows Installer 64bit版、Mu-Editor-Win64-1.1.0b2.msi をダウンロードして実行。バージョンは 1.1.0b2、らしい。

インストール場所を尋ねてこないまま、いきなりどこかにインストールされる…。一体どこにインストールされたんだか…。

どうやら、C:\Users\(アカウント名)\AppData\Local\Programs\Mu Editor\ あたりにインストールされた模様。また、このアプリも、Python 一式がインストールされるように見えた。学習用IDEやエディタは、そういう仕様が多いのだろうか。

Windwos のスタートメニューに Mu Editor という項目が増えているので、クリックして実行。初回起動時は virtualenv を使って、独自のPython環境を用意してから、エディタ画面が起動する模様。

ツールバーのアイコンが巨大、かつ、テキスト付なので、「簡単だよ」感が強くアピールされている。初心者の、Python学習への心理的ハードルを下げてくれる効果が期待できそう。

printと打ち込もうとしたら、「pr」と打った途端に、候補と引数のヘルプが表示された。この補完感覚は Microsoft の Small Basic にちょっと近い感じがする。これまた、初心者にとっては助かる仕様かもしれない。まあ、import と打っても反応しなかったところは気になるけれど…。Python関係の全単語(?)に対応してるわけではなさそう。

エディタ画面のフォントが選べないかもしれない…。フォントサイズは変えられるけれど…。

ファイルを新規作成して保存しようとすると、C:\Users\(アカウント名)\mu_code\ 以下に保存しようとしてくる。

どうも色々と不自由さを感じる。もっとも、その分、Pythonの学習に専念しやすくなるのかもしれないなと。

以下のページで、開発方針が書かれている。

_About Mu

「重要な機能以外はあえて実装しない」「複雑さはとにかく排除」等々、とにかく初心者が悩みそうな要素は無くしてある、と謳っている。たしかに、Pythonの学習用エディタとしてはイイ感じかもしれない。

さておき。C:\Users\(アカウント名)\AppData\Local\python\mu\settings.json を変更すれば設定を変更できるのかもしれない…?

_Advanced Configuration

とりあえず作成して、以下を記述してみたところ、C:\Users\(アカウント名)\mu_code\ 以外のフォルダにファイルを保存するような動作になってくれた。

{
  "workspace": "D:\\home\\USERNAME\\mu_code"
}

このファイルに記述して、フォント変更できないかな…。

Source Code Proフォントがハードコーディングされてる、てな話があるな…。変更できないということだろうか。

_#83: Use Source Code Pro font for editors and REPL by stestagg - Pull Request #89 - mu-editor/mu - GitHub

あらゆる環境で見た目を統一したいから、という発言も目に入った。そういう理由でフォントを変更できないようにしてある、ということかもしれない。

初心者の学習用としては実にヨサゲなエディタのように思えたけれど、自分が使うかというとビミョーなのでアンインストールしておいた。Pythonスクリプトを書くなら、VSCode (Visual Studio Code) で環境を整えたほうが良さそうだし…。

#3 [web][neta] 中国からの攻撃が鬱陶しい

ここ数日、中国のIPアドレスから、自宅サーバに、ひっきりなしにログインを試みようとするアクセスが…。数分おきに違うIPアドレスでアクセスしてくる…。おそらくはWindowsサーバで一般的に使われるアカウント名で試してくるっぽいので、ログ監視ツール swatch を使って、その手のアクセスが来たら /etc/hosts.deny に登録する仕組みにはしているけれど。その処理が行われるたびにメールで知らせるようにしてあるので、1日に数十通の報告メールが…。

中国は、さすがにどうにかしないといかんのではないか…。いやまあ、ロシアもだけど…。ロシアのリファラーSPAMも鬱陶しいし…。アイツラにネットを使わせたらダメだ。ろくなことをしねえ。と思ったりもしたけど、犯罪者に国籍なんて関係ないか…。どこの国にもそういう輩は居るわな…。

2021/03/18(木) [n年前の日記]

#1 [godot] Godot EngineのVehicleBodyノードについてまだまだ調べてる

_昨日 に引き続き、以下の動画を参考にしつつ、Godot Engine 3.2.3 x64 上で VehicleBody について使い方を調べているところ。

_Godot Vehicle Tutorial part 1 - import and setup a car - YouTube
_BastiaanOlij/vehicle-demo at Part-1

指定の branch を git clone したい。 :

github から git clone して、プロジェクトをローカルにダウンロードしてみようとしたのだけど、最新版(Part6)の実装状態しか落ちてこない…。ググってみたら、github から clone すると最新版しか落ちてこないそうで。

branch を指定して clone する時は、「-b ブランチ名」を追加すれば良いらしい。
git clone -b Part-1 https://github.com/BastiaanOlij/vehicle-demo.git

_リモートから特定のブランチを指定してcloneする - Qiita
_リモートのブランチをcloneする - Qiita

これで、Part-1 の状態で git clone できた。

VehicleBodyノードの構成。 :

VehicleBody ノードを使う時は、おおよそ以下のような構成になるらしい。
Car : VehicleBody
│
├─ Body : MeshInstance (車体のメッシュ)
│
├─ front_left : VehicleWheel (左前タイヤ)
│   │
│   └─ MeshInstance (タイヤホイールのメッシュ)
│
├─ front_right : VehicleWheel (右前タイヤ)
│   │
│   └─ MeshInstance (タイヤホイールのメッシュ)
│
├─ rear_left : VehicleWheel (左後ろタイヤ)
│   │
│   └─ MeshInstance (タイヤホイールのメッシュ)
│
├─ rear_left : VehicleWheel (右後ろタイヤ)
│   │
│   └─ MeshInstance (タイヤホイールのメッシュ)
│
└─ CollisionShape (車体のアタリ範囲)

  • VehicleBody ノードの下には、車体の3Dモデルメッシュ (MeshInstance)、タイヤホイールを担当する VehicleWheel x タイヤ個数、車体のアタリ範囲 (CollisionShape) がぶら下がる。
  • VehicleWheel ノードの下には、タイヤホイールの3Dモデルメッシュ (MeshInstance) がぶら下がる。

2021/03/19(金) [n年前の日記]

#1 [godot] Godot EngineのVehicleBodyノードについて分かった範囲でメモ

_昨日に引き続き、 VehicleBodyノード関連について調べているところ。

VehicleBodyノードのプロパティについて、分かった範囲をメモ。

3d_vehiclebody_ss16.png

変更できそうなのは、Weight ぐらい、らしい。おそらく車体の重量を指定するのだろうなと。デフォルト値は392。

VehicleBody の原点は、車体の重心に相当するそうで。地面より少し高い場所にしておくものらしい。

3d_vehiclebody_ss17.png

ただし、あまり高い位置にすると横転しやすくなるのだとか。

VehicleWheelノードについて。 :

VehicleBody ノードは、タイヤホイールに相当する VehicleWheel ノードを複数持つ。

_VehicleWheel - Godot Engine (stable)

この VehicleWheelノードのプロパティは、結構設定する箇所が多いようで…。

3d_vehiclebody_ss18.png

3d_vehiclebody_ss19.png

3d_vehiclebody_ss20.png

  • Vehicle Body Motion : Use As Traction ... 駆動するタイヤはONにする。後ろのタイヤだけONなら後輪駆動、4つのタイヤ全部がONなら四輪駆動になるのだろう。たぶん。
  • Vehicle Body Motion : Use As Steering ... 方向を変えるタイヤはONにする。普通の車なら前輪だけONにするのだろう。
  • Wheel : Roll Influence ... 車体が傾く度合い。値が大きくなると横転しやすくなる。
  • Wheel : Radius ... タイヤの半径。単位はメートル。
  • Wheel : Rest Length ... ホイールが原点からどれだけ下にあるか。単位はメートル。
  • Wheel : Friction Slip ... 地面との摩擦具合。0.0でグリップ無し。1.0で通常のグリップらしい。
  • Suspension : Travel ... サスペンションが動く範囲の長さ。単位はメートル。Rest Length より小さい値を指定すべきという説明を見かけたけど、公式ドキュメントにはそういう説明はなく…。
  • Suspension : Stiffness ... サスペンションの剛性。オフロードカーは50未満、レース車は50-100、F1カーは200前後を指定。
  • Suspension : Max Force ... サスペンションの抵抗力。
  • Damping : Compression ... ばねが圧縮されてる時の減衰量。普通の車は 0.3前後、レース車は 0.5前後を指定。
  • Damping : Relaxation ... Compression より少し大きい値を指定。Compression が 0.3 なら 0.5 を指定する感じらしい。

とりあえず、手元の実験プロジェクトでは、以下の値にしてみた。
  • Wheel : Roll Influence ... 0.3
  • Wheel : Radius ... 0.18 (タイヤホイールモデルの大きさに合わせる)
  • Wheel : Rest Length ... 0.07
  • Wheel : Friction Slip ... 10.5
  • Suspension : Travel ... 0.05
  • Suspension : Stiffness ... 70
  • Suspension : Max Force ... 6000
  • Damping : Compression ... 0.3
  • Damping : Relaxation ... 0.5

ちなみに、 _3D Truck Town Demo の場合は、以下の値が設定されていた。
  • Vehicle Body Motion : Use As Traction ... 4つともON
  • Vehicle Body Motion : Use As Steering ... 前輪2つだけON
  • Wheel : Roll Influence ... 0.4
  • Wheel : Radius ... 0.25
  • Wheel : Rest Length ... 0.15
  • Wheel : Friction Slip ... 1.0
  • Suspension : Travel ... 2
  • Suspension : Stiffness ... 40
  • Suspension : Max Force ... 6000
  • Damping : Compression ... 0.88
  • Damping : Relaxation ... 0.88

アタリ範囲。 :

アタリ範囲は、車体の部分を覆う感じで設定。

3d_vehiclebody_ss21.png

#2 [nitijyou] 歯医者に行ってきた

近所のS歯科まで電動自転車で。PM02:50-03:20まで治療。左上、奥から3番目(親知らずは含まず)の歯を治療。レントゲンを撮って、虫歯が深いので根の治療(根管治療)をすることになって、麻酔を打って、歯を削った。

麻酔は、電子制御で打つタイプ ―― 電子音でメロディーが鳴る機器を使っていた。昔から使われている、注射針+手動タイプは、麻酔を打つ時間は早いけど患者側の痛みが大きくて。対して、電子制御(?)で麻酔を打つタイプは、痛みはほぼないけれど麻酔を打つ際の時間がかかる。次々に患者を捌いて稼ぎたい歯医者さんは患者側の痛みを無視して従来の注射針で麻酔をかけるという話も…。電子制御タイプで麻酔をかけてもらえたのは助かった。

麻酔は3時間後ぐらいから切れるそうで。今までの経験上、たぶん痛みが来るだろうと、帰りにカワチに寄ってロキソニンSを買ってきた。

2021/03/20() [n年前の日記]

#1 [godot] Godot EngineのVehicleBodyノードを動作確認中

_昨日に引き続き、 VehicleBodyノードについて実験中。

VehicleBodyノードにスクリプトを追加して、キー入力で車を走らせることができるようになった。どんなスクリプトを書けばいいのかまだよく分かってないので、ひとまず、以下のスクリプトをそのまま使わせてもらった。

_vehicle-demo/Car.gd at Part-1 - BastiaanOlij/vehicle-demo

Cameraノードにも、以下のスクリプトを追加して、カメラが車をそれらしく追従するようになった。

_vehicle-demo/Camera.gd at Part-1 - BastiaanOlij/vehicle-demo

車を走らせるためには地面等が必要なわけで…。そのあたりは明日メモする。

#2 [nitijyou] 大きな地震がまた来た

夕方、比較的大きな地震があった。宮城県沖が震源地。

今回はPC等が倒れずに済んだ。でも、メインPCが稼働中に揺れたので、HDDがおかしくなってないか心配…。

2021/03/21() [n年前の日記]

#1 [godot] Godot EngineのVehicleBodyノードを動作確認中

_昨日に引き続き、 VehicleBodyノードについて実験中。環境は、Windows10 x64 20H2 + Godot Engine 3.2.3 x64。

とりあえず、ブラウザで動かせるようにエクスポートしてみた。以下のページを開けば動くはず。たぶん。

_vehiclebody_sample1.html 画面をマウスでクリックしてからじゃないと、キー入力が反応してくれないっぽい。

地面を作る。 :

VehicleBodyノードを使えば、車っぽい挙動をするオブジェクトを作れるけれど、車を走らせるためには地面が必要。ということで、地面に相当するノードを作る。

以下のようなノード構成にした。

ground_ss01.png

Main : Spatial
│
├─ Ground : Spatial
│   │
│   └─ StaticBody
│        │
│        ├─ MeshInstance (Plane)
│        │
│        └─ CollisionShape (BoxShape)
│
├─ DirectionLight
│
├─ CarBody2 : VehicleBody
│
└─ Camera
  • StaticBody は、アタリ範囲を持っていて、静止している物体に使うノード。
  • MeshInstance は、ポリゴンモデル(ポリゴンメッシュ)。今回は Plane (平面)を新規作成して割り当て。
  • CollisionShape は、アタリ範囲を持つノード。今回は BoxShape (箱)を新規作成して割り当て。
  • DirectionLight は、平行光源。
  • CarBody2 は、VehicleBody を使ってる車のシーン。
  • Camera が無いとシーンを実行してもウインドウに何も表示されないので注意。

MeshInstance で形状を新規作成するには、インスペクタタブ → Mesh → 新規xxxx、を選択。ここでは PlaneMesh (平面)を作成してる。

ground_ss03.png


MeshInstance の Plane は、以下のサイズ(150 x 150)にしてみた。

ground_ss02.png


MeshInstance の Material は以下のような感じに。Albedo → Texture。任意のテクスチャ画像を指定。

ground_ss04.png

テクスチャ画像は、以下のサイトで公開されている、1K画像(1024 x 1024)を利用させてもらった。CC0ライセンスで公開されているらしい。ありがたや。

_Free PBR Textures | CC0 Textures | Share Textures
_About / Contact | Share Textures
_Dirty Ground 10 | Ground Textures

アタリ範囲は、CollisionShapeノードで設定する。インスペクタタブ → Shape → 新規 BoxShape を選択。以前は PlaneShape を選んでも目的を果たせたけど、PlaneShape は将来的に削除されるから利用は非推奨だそうで、BoxShape を選んでみた。

ground_ss05.png

アタリ範囲のサイズは以下(75, 0.05, 75)を指定した。

ground_ss06.png

車体モデル。 :

車体モデルは以下。zipを解凍すると car1_edit1.glb が得られるはず。

_car1_edit1.zip

オリジナルのモデルデータは以下のCC0モデルデータ。ありがたや。

_Vehicles Assets pt1 | OpenGameArt.org

blender 2.83.13 x64 LTS を使って修正した際の作業内容は、 _2021/03/17の日記 でメモしてある。

CarBody2シーンは、VehicleBody や VehicleWheel で作ってあるけど、構成や各プロパティ値は _2021/03/18のメモ_2021/03/19のメモ を参考に。

スクリプトについて。 :

_昨日のメモ にも書いたけど、以下のスクリプトをそのまま使わせてもらって動作確認してみた。

_vehicle-demo/Car.gd at Part-1 - BastiaanOlij/vehicle-demo
_vehicle-demo/Camera.gd at Part-1 - BastiaanOlij/vehicle-demo

Car.gd は CarBody2 に、Camera.gd は Camera に割り当て。

Car.gd を眺めてみて、なんとなく分かった範囲についてメモ。
  • VehicleBody は、engine_force, brake, steering という3つの変数が用意されてる。
  • この3つの変数に何かしらの値を入れてやれば、VehicleBody で作った車を走らせることができる。
  • engine_force は、エンジンの力。プラス値なら前進。マイナス値なら後進する。
  • brake は、ブレーキの力。
  • steering は、進む方向。プラス値なら左に曲がり、マイナス値なら右に曲がるらしい?
  • VehicleBody を動かしたいときは、_physics_process(delta) 内に処理を書く。
  • Input.get_joy_axis() は、ゲームコントローラのアナログ入力を取得する。
  • JOY_ANALOG_LX ... ゲームコントローラの左(アナログ)スティックのX方向入力。
  • JOY_ANALOG_R2 ... ゲームコントローラの右(アナログ)トリガーボタン。
  • JOY_ANALOG_L2 ... ゲームコントローラの左(アナログ)トリガーボタン。
  • Input.is_action_pressed() で、キーの押し下げ状態を調べられる。
  • ui_up, ui_down, ui_left, ui_right は、カーソルキーに割り当てられている。

PathとCSGPolygonでコースを作る。 :

以下の動画によると、Godot Engine の PathノードとCSGPolygonノードを組み合わせて道路っぽいものを作れるらしいので試してみたり。

_Godot Vehicle Tutorial Part 2 - Building a track - YouTube

シーンを新規作成して、ルートノードを追加。「3Dシーン」を選ぶと Spatialノードが追加される。

path_csgpolygon_ss01.png


シーンタブの左上のプラスアイコンをクリックしてノードを追加していく。

path_csgpolygon_ss02.png


path と打ち込んで検索。Pathノードを選んで作成。

path_csgpolygon_ss03.png


作業しやすくするために表示を変える。ウインドウ左上のメニューをクリックして、平行投影を選んだり、上面図を選んだり。あるいは、テンキーの5キーを押せば透視投影と平行投影を切り替えられる。テンキーの7キーで上面図に切り替えられる。そのあたりは blender のショートカットキー割り当てとほぼ同じ。

path_csgpolygon_ss04.png


Pathノードを選択している状態なら、ツールバー上にアイコンが増えている。左から、点を選択。

path_csgpolygon_ss05.png


点を追加。

path_csgpolygon_ss06.png


点を削除。

path_csgpolygon_ss07.png


曲線を閉じる。

path_csgpolygon_ss08.png


「点を追加」を選んでから、Pathの制御点を追加していく。

path_csgpolygon_ss09.png


「点を選択」を選んで、Shiftキーを押しながら制御点をドラッグすると、制御ハンドルが伸ばせる。Pathが曲線になるように調整。

path_csgpolygon_ss10.png


CSGPolygonノードを追加する。このノードを使うと、ポリゴンの形状をPathに沿って押し出して形を作ることができる。

path_csgpolygon_ss11.png


CSGPolygon は、Path と同階層に配置。

path_csgpolygon_ss12.png


CSGPolygon のデフォルト設定では妙な形になってしまうので、プロパティを変更。

path_csgpolygon_ss13.png
  • Mode : Path に変更。
  • Path Node : Path を選択。
  • Path Rotation : PathFollow に変更。
  • Invert Faces : ONにする。
  • Use Collision : ONにする。これで、生成されたポリゴンがアタリ判定を持つようになる。


押し出すポリゴンの形は、Polygon で設定する。Polygon の右の欄をクリックすると、ポリゴンの形を指定できる入力欄が展開されるので、頂点数や座標値を入力してポリゴンの形を指定していく。

path_csgpolygon_ss14.png


以下のような値を指定して、道路っぽい形状にしてみた。

path_csgpolygon_ss15.png


断面は以下のような感じ。この各点の座標を、Polygon の欄に入力していく。

path_csgpolygon_ss20.png


出来た形状に、テクスチャを指定。新規SpatialMaterial を作成して、Texture に任意のテクスチャ画像を指定。

path_csgpolygon_ss16.png

テクスチャ画像は以下を使わせてもらった。ありがたや。

_Asphalt Bad | Road Textures


以下のような形をした、道路っぽいシーンを作れた。

path_csgpolygon_ss17.png


このシーンを、VehicleBody の動作確認をしていたシーンに追加。

path_csgpolygon_ss18.png


ついでに、MeshInstance を追加して、アーチ?っぽいものも置いてみた。

path_csgpolygon_ss19.jpg


また、実際にコースを走らせてみたら、車のステアリングが効き過ぎた感じがしたので、Car.gd の MAX_STEER_ANGLE と steer_speed を減らしてゆっくり曲がるようにしてみたり。

出来上がったバイナリは以下。

_vehiclebody_sample1.html

時々、地面と妙な当たり方をして車が思わぬところに吹っ飛んでいくけれど、でもまあ、なんとなくそれっぽい感じになってきた気がする。

#2 [anime] 「空の青さを知る人よ」を視聴

BS12で放送されていたので視聴してみたり。初見。「あの花」トリオが手掛けた劇場アニメ。

個人的には結構好きなジャンルだなと…。ずっと抑制した演出が続くなと思っていたけれど、最後のあたりを見てなるほどと。こう繋げるためのソレなのかな、みたいな。

学生時代に夢見ていた未来の光景と、大人になってからの現実とのギャップ云々のあたりは、おじさんおばさんのほうが共感するのでは、と思ったけれど、それでは若者向け作品にならない気もする…。まあ、若者向けは新海誠監督あたりが抑えてくれてるはずだから、違うところを狙っても問題無いよな…。

例えば細田守監督作品などはアニメじゃなきゃできないことを意識して作ってる感じがするのだけど、このトリオの作品は、逆に、実写化できそうな範囲の設定でずっと作ってきている感じがして。そのことで、誰にでも見せられるアニメになっているところもありそうな。制限を加えることで幅広さを得ることができている面もあるというか。

ただ…。誰かが言ってたけど、もっと音楽要素を活用したほうが良かったのではという意見になんだか同意というか。ここでベースを選んだことがそう関係してくるかー、とか、このタイミングであの曲流すかー、みたいなソレが見たかった気もしたり。と言っても、どう絡めたららしくなるか、自分も思いつかないのだけど。でも、そういうのが最後にくると、作品としてめっちゃ奇麗にまとまるよなと…。まあ、思いつかんけど。

#3 [nitijyou] 日記をアップロード

2021/03/08を最後にアップロードしてなかったのでアップロード。

#4 [nitijyou] 自宅サーバ止まってました

12:00 - 18:00頃まで、自宅サーバが止まってました。申し訳ないです。

止まる原因はたぶんコレだろうとうっすら分かり始めてるけど、対策が…。もうちょっと調べないと…。

以上、21 日分です。

過去ログ表示

Prev - 2021/03 -
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project