2023年1月16日月曜日

続続 Linux Mint で python3-kivy + buildozer 環境を作ってみた

 書く度に自分の無知を晒す事になるのでやめときゃいいのに又書く訳で…
※というか、グーグルで検索して当ページが上位に引っかかるのがコワイですね…ハイ。

先日、 Linux Mint21.1 環境になった事に伴い、開発環境も移したのですが、微妙にひっかかったので備忘録をば。

  • vs Kivy
普通に geany と kivy を Mint のソフトウェアマネージャーからインストールして起動すると…動きません。

私の場合は

AttributeError: module 'collections' has no attribute 'Callable'

というエラーが出ました。
これは Python のバージョンが上がった為に出るエラーで、3.10 未満では許されていた記述がアウト判定になった為に起こる物だそうです。
Mint 標準でインストールされる Kivy は Kivy1 系ですので、一旦アンインストールして、手動で Kivy2 系をインストールすれば治ります…
Linux Mint は安定板のソフトのみを採用するディストリビューションなのですが、動かない安定板とは一体…。

あと Python ってバージョンが上がる度に動かなくなるソースがでますね…なんというか、もうちょっと未来の事を考えてから実装して欲しいと言うか…
とりあえず実装しとけ、ダメだったら変えれば良いだろ
ってノリで言語を作られると、保守する側は大変なんですが…いや、保守屋さん的には良い飯のタネなんですかね?趣味人的には勘弁願いたいのですが。

  • vs Buildozer
直リンして良いのか判らないので書かないのですが、Buildozer 公式の Installation ページに書いてある通りのスクリプトを上からターミナルに流すだけでインストールはできるハズです。
ちなみに前々回間違えていましたが、今回私は

export PATH=$PATH:~/.local/bin/

の記述を

/etc/profile

末端に追記しました。

又、以前 openjdk-17 が入らないけど、 openjdk-11 でも動いた~と書いたのですが、公式に17がなければ11までのバージョンは許容すると書かれていますね。
私が見落としていたのか、その後に追記されたのか。
…ちなみにコレは当時フランス語(?)で記述されたサイトで観た内容なので…フランスニキだかネキだかがツッコんだのかもしれませんね。

2023年1月12日木曜日

地味に初カンスト

まさか10年かかるとは。
今後は溢れないように使ってプレーする方向ですかねえ…いや、イベントがあれば一気に放出するのですが、他の基礎資材の不足っぷりから考えると次も低難易度なのでバケツは減らないでしょうね。

次なる目標はケッコン200隻でしょうかね、ちなみに現在178隻です。
他では家具を全て買い占めるというのが有ったのですが、一回だけ達成した事があります。
12月は3群ランカーだったようですが、今後もランカーを取るかは不透明…人口減っているので、普通にプレーできていれば3か月毎にランカーを取る事自体は難しくないのですが…

2023年1月10日火曜日

SurfaceBook 初代で dGPU を使ってみた

悲願達成…なのですが。
はい、ごらんの通り LMDE5 の文字がありません。
昨年の8月に Nvidia がドライバーソースをオープンにして初の Ubuntu である 22.04.1 が11月に出まして、その後12月20日に Ubuntu ベースの Linux Mint 21.1 が出た訳です。
で、LMDE5 もろともアップデートが来たわけですが…。

…なんとアップデートした所、LMDE5 であれだけ苦労してインストールした Nvidia ドライバーが吹っ飛びました。(どうもカーネルアップデートで飛ぶらしい)
入れ直す為、最新の NVIDIA-Linux-x86_64-525.78.01.run をインストールしようと試みましたが、どうしてもエラーが出る為インストールは無理でした…。

が、しかし、Nvidia は Ubuntu 相手には手厚いサポートをしています…という事は…。

そんな訳で、Linux Mint 21.1 Mate にインストールしていきます。
…素直に Ubuntu にしろとか言うのは禁止です。

この後に書いていく内容はよそ様に書かれていた内容のほぼベタコピーです。本来必要があるのか…という話ですが個人用の備忘録なのでご容赦を。

  • 1.linux-surface 導入
linux-surface の GitHub に linux-image-6.1.3-surface_6.1.3-surface-1_amd64.deb 等のファイルが有りますが、コレを使ってインストールするとスクリーンタッチセンサのドライバ等が入らなかったのでコマンドラインでインストールして行きます。

$ sudo wget -qO - https://raw.githubusercontent.com/linux-surface/linux-surface/master/pkg/keys/surface.asc | gpg --dearmor | sudo dd of=/etc/apt/trusted.gpg.d/linux-surface.gpg
$ echo "deb [arch=amd64] https://pkg.surfacelinux.com/debian release main" | sudo tee /etc/apt/sources.list.d/linux-surface.list
$ sudo apt update
$ sudo apt install linux-image-surface linux-headers-surface iptsd libwacom-surface
$ sudo systemctl enable iptsd
$ sudo update-grub

正味の話、私も良く解っていないのですが、要するに専用ドライバの入ったカーネルをインストールした上で grub を設定し直したようです。
この時点で再起動して

1.スクリーンをタッチしてカーソルが動く
2.uname -a コマンドでカーネルが変わっている

以上が確認できれば第一関門突破


  • 2.MX940 を認識させる
/usr/local/bin/dgpu.sh 作成

内容は以下の通り

#!/bin/sh

echo 1 | tee /sys/bus/platform/devices/MSHW0041:00/dgpu_power
echo 1 > /sys/bus/pci/rescan
setpci -H1 -s 01:00.0 6a.b=81
setpci -H1 -s 01:00.0 4.w=0407
echo 1 > /sys/bus/pci/rescan
setpci -s 01:00.0 4.w
setpci -s 01:00.0 6a.b

作ったら実行可能属性にしておく


/etc/systemd/system/dgpu.service 作成

内容は以下の通り

[Unit]
Description=Nvidia GPU initialization
Before=display-manager.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/dgpu.sh
ExecStartPre=/bin/sleep 10

[Install]
WantedBy=multi-user.target


起動時に認識用スクリプトを読み込ませるサービスを作ったので、サービスの登録を行う

$ systemctl daemon-reload
$ systemctl start dgpu.service
$ systemctl enable dgpu.service

再起動後 lspci で MX940 が認識されているかを確認


  • 3.grub の起動設定を追加
/etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT 項目を

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nouveau.modeset=0 pci=realloc nvidia-drm.modeset=1 pcie_port_pm=off pcie_aspm=off"

へ変更


  • 4.カーネルに nouveau 等が混入しないように塞ぐ
実は見た限り Linux Mint 21.1 には nouveau が入っていなかったようなのですが念のため…

/etc/modprobe.d/blacklist.conf
ファイルの末尾に

blacklist nouveau
blacklist nvidiafb

と追記

$ sudo update-initramfs -u

で反映


  • 5.ドライバー導入
ドライバーマネージャーを起動する
…今までの苦労はなんだったのかと。
Ubuntu 系にプレインストールされているアプリなのですが…なんというか、コレは…。
インストール後、再起動して

$ nvidia-smi

が起動するかを確認。

  • 6.起動実験をしてみる
以前、盛大に勘違いしていたのですが、GPU を使用して起動したいソフト xxxx があった場合、コマンドラインで

$ __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia xxxx

と呼び出すのが正解なようです。
で、さっそく Blender を呼び出してみた結果がこちら
相変わらず Persistence-M が OFF と表示されていますが…
Processes 欄に Blender が入り、432MB の VRAM を使っています。又、GPU 温度も51度と表示されているので駆動はしているようです。

  • 7.解像度を下げる
まあ、このままでも良いのですが、Blender を起動しただけで 1GB しかない VRAM の4割強を持っていかれては直ぐに作業ができなくなるのは明白です。
なぜこんなにVRAMをドカ食いするのかと言えば解像度が高すぎるからなんですね…
なんと3000x2000もあるのですよ。私のメインのデスクトップ1920x1080なんですが…。
という訳で、1/4の解像度である1500x1000にしてみます。

/etc/profile
末端に

xrandr --newmode "1504x1000_60.00"  124.25  1504 1600 1752 2000  1000 1003 1013 1038 -hsync +vsyn
xrandr --addmode eDP-1 1504x1000_60.00
xrandr --output eDP-1 --mode 1504x1000_60.00

を追加

…なんだか1504x1000という謎の4ドットが付いた解像度になっていますが…
これは解像度を追加する際に調査するコマンドの cvt で

$ cvt 1500 1000

と打った返り値がこうだったので仕方が無いデス。
ちなみにデフォルトでは cvt はインストールされていないので xcvt をインストールする必要がありますし、上記の値は私個人の環境なのでコレを参考にする方は自分でも cvt コマンドを打って正確な値を求めてください。

さて、改めて1504x1000の解像度で実行してみると…
はい、VRAMの使用量が減っていますね。
若干画面がぼんやりしてしまうのが難ですがひとまずコレで使っていける環境が整いました。


  • で、実際使ってみてどうよ?
正直に言えば、GPUの有無で実感できるほどの差は今の所無いです。むしろ、一瞬画面が灰色になったりと dGPU を使った時の方が動作は不安定です。
まあ、それでもフルパワーには違いが無いのでひとまずこれにて一区切りとしたいと思います。

2022年12月31日土曜日

今年の総括

  • 早いもので今年の総括なのですが…
総じて言える事は
なんの成果も得られませんでした
ですかねえ
いや、21年がなんのかんの凄かったのですよ、いきなりMOのスケルトンプログラム作ったり、Linux を使って Android アプリ(.apk)作れるようになったりしていますからね。

22年は人体モデリングのやり直しから始まりました。良書の「ソッカの美術解剖学ノート」を得られた事もあって伸びていったのですが…

4月に天啓パラドクスを始めたあたりで鈍り始めます。
天啓~自体は7月に辞めていますが、モデリングが鈍った事と微妙に関係があります…。

モデリングは2015年辺りから始めていますが、当時「艦娘で軽いアクション物の動画を作ろう」が目標でした。が、ゲームの方が2期(2018)以降低調になっていき、コロナ以降が致命的になっていきます。

19年のアシュア、20年のデスチャ、そして今年の天啓等を平行してプレーしてみると、どうしても比較して見てしまうもので、艦これという物に対するモチベーションが保てなくなりつつあるんですよね。結局平行プレーする時間が無いので他を辞めていったのですが、どちらが優れていたという話でも無い訳です。苦労してモデリングしてまで表現したい物が無いと言う状況では手が進まないんですよね。

さて、そんな中でも多少は進展があったのは、5月にドイツのマイナー版LMDE5を見つけた事。これを発見できたおかげで、一気にジャンクPC関係のソフトウェア更新が進みました。本来は Ubuntu22.04 ベースの Linux Mint を待つつもりでしたのでコレは良い発見でした。…ただ、これにて Yoga260 は主に電源管理周りに不具合がある事が確定してしまいましたが。

あとは11月に購入した未完の大器 SurfaceBook ですかね。未だに整備中ですが。
このじゃじゃ馬がいなければカーネルの作り直しだの、サービスの停止/組み込みだのといった技術は身に付かなかった気がします。

  • 来年気になる事もやっぱり艦これですかね
現在やってるんだかやっていないんだかなアニメですが…ユーザー数が回復するどころか、往時の見る影もないという印象を決定付けています。
ニコニコでの再生数は6万そこいらですが、ブラウザ版のアクティブユーザーが10万人強(正確な所は正月に判りますが)と言われる中ではこれでも健闘した方です。
10周年までは持つと思いますが、12年目を迎えられるかは「かなりヤバイ」という印象。

本来どうでも良い話なのですが、前述の通りモデリングのモチベでもあります。
そして、これまで 2in1 パソコンを買い漁って苦悩を続けているのも「モデリングが出来てテクスチャ編集もできるパソコンを探す」という目標をもって行ってきた事です。
又、Python の勉強を行っているのも Blender のアドオン作成をするため、という動機が半分以上を占めます。
つまり、ロスった場合、次にモデリングしたくなる題材を探さないと全てが崩壊しかねません。ただ、年齢的な事もあってか、もうゲームをしようという気も起きないのですよね…

来年は最悪、ただの無気力中年になっている可能性もあって(今年も気力があったとは言えませんが)なかなかに怖いです。

2022年12月18日日曜日

小ネタ

先日ジャンバールとケッコンしまして…
君じゃないです。

2022年12月7日水曜日

サンマは73+瑞雲分(22+22+8)=125尾

 結構掘ったなあと。6−5の下ルートを周回したため、大和、武蔵はカンスト。資材は自然回復へ。

  • 新規に7−4が堀場になっていましたが…。
7−4は最後に設置された通常マップですが、正直不人気マップです。
ただ、通常マップでは珍しく海防艦が掘れるため我慢して周回する人も居るでしょうが…。
ココが不人気になる最大の理由は理不尽に強い相手潜水艦にあります。
T不利を引いたら撃沈は絶望的ですし、大破した状態からでもこちらを大破させるだけの火力を持っています。
そんな理不尽潜水艦が1マスを除き全てに配備されたマップに対して、爆雷禁止の秋刀魚ルールで周回しろとはどういう了見だったのか?
数回は回ってみましたが、6-5や3-5といったEO海域の方が遥かにマシでしたね。

さて、ふだんやらないハローウィン、サンマと続けて本来なら次は年末年始イベントですが、アニメと足並みを揃えるにしても放送は休止中。

…アニメでギミックのヒントを流そうとして足並みが崩れて共倒れしたのではないかと邪推しますが、いい加減低難度イベントを流さなくて大丈夫ですかね?
現在クオータリークエのいくつかと 5-5 を残した状態で100位以内に入っています。
逆に言えばそこまでしてプレーしている人間はパラオサーバーに100人居ません。
鳳翔さんは「共に参ります、最後まで」と言っていましたが、最後くらいは綺麗に〆てもらえないものでしょうかね?

2022年12月6日火曜日

Blender で選択されたキーフレームのデータを読んで見る

 半年ぶりの Blender なのですが…はい。今回はだいぶ苦戦していまして、機能ができていません。まずキーフレームのデータを取得するという行為そのものが相当面倒だったのですよ。

キーフレームがどこにあるのかと言えば、ココ。ドープシートの中です。

そこで、当初はドープシートのクラスを探す→所属するグループを検索→所属するキーフレームを取得…という手順を踏むと思っていたのですよねえ。

ところが、実際の手順はシーンからオブジェクトを取得→オブジェクトのアクションデータからFカーブ情報を取得する→所属するキーフレームを取得するという手順を取ります。

尚、主にアニメーションで使うアーマチュアオブジェクトには、所属するボーンがあり、実際には各ボーンに対して動きをつけていますが、オブジェクト→ボーン→Fカーブという取得の順にはならないようです。

これは、そもそもオブジェクト単体に対してキーを打って動作ができる点や、ライトやカメラ等の他のオブジェクトと足並みを揃えた為のようですね。

コード

import bpy
import re

if bpy.context.mode == 'POSE':

    for obj in bpy.context.scene.objects:
        #print(obj.name)
        if obj.type != 'ARMATURE':
            continue

        bSelectd = False
        frameStart = 0.0
        frameEnd = 0.0
        
        for fc in obj.animation_data.action.fcurves:
            for ky in fc.keyframe_points:
                if ky.type != 'KEYFRAME':
                    continue
                if ky.select_control_point != True:
                    continue
                
                if bSelectd == False:
                    frameStart = ky.co[0]
                    frameEnd =ky.co[0]
                    bSelectd = True
                else:
                    if ky.co[0] < frameStart:
                        frameStart = ky.co[0]
                    if ky.co[0] > frameEnd:
                        frameEnd = ky.co[0]
                                
                bonename = fc.data_path

                # bonename only
                #if fc.data_path.count('"') == 2:
                #    bonename = re.search(r'"(.+)"',bonename).group(1)

                print(bonename+"/idx:"+str(fc.array_index)+"/frame:"+str(ky.co[0]).rjust(6,' ')+"/pram:"+str(ky.co[1]))

        if bSelectd == False:
            print("No Selected")
        else:
            print("SelectStart:"+str(frameStart).rjust(6,' ')+"/SelectEnd:"+str(frameEnd).rjust(6,' '))

※インデントが崩れた為、字を小さくしています。コピペして読んでください。
コメントアウトした bonename only の部分は外すとボーン名のみになります。

結果はなんの変哲も無い出力ですね。

…こんなものを作るのに数ヶ月かかってしまった…。そもそもパイソンを忘れかけていたという恐怖…歳は取りたくない物ですねえ。