2025年12月21日日曜日

immichのupgrade

immichのバージョンが上がったようなので、upgradeしてみる。

サーバupgrade

https://docs.immich.app/install/upgrading

を参考に

docker compose pull && docker compose up -d

とりあえずこれで何事もなくupgradeされる。

一応docker-compose.ymlも更新してもう一度やってみる(参考: https://docs.immich.app/overview/quick-start

newにダウンロードしなおして差を見てみる 

mkdir new && cd new
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
diff -uNr ../immich-app ./

何かわからないがdocker-compose.ymlの方でredisとやらも変わっていたのでdocker-compose.ymlを置き換えてもう一度upgradeした。問題なかった。

アプリのupgrade

サーバを上げたら更新ボタンになり、google playから更新できた 

2025年12月19日金曜日

raspberry-pi 4b miuzeiのケースのねじ

raspberry-piで写真サーバを立てた際、あまりにも簡単で最も苦労したのはケースの組み立てだった。

その苦労した点の写真が以下。

 

ねじがはみ出している。ゴム足も妙にでかいが、それでも微妙に足りていない。このままでは床がやられてしまう。

ほかの人のブログを見たけど、ねじの長さは丁度よさそうに見える。はずれを引いたようだ。 

力技で何とかしようとして無理やりペンチでねじ切り、ねじ山をつぶしてナットが回らなくなった。

しかたないのでホームセンターに行き、うろ覚えでねじを購入するも全く同じサイズのねじを買ってしまう。(測っとけよ)

こんなこともあろうかと、ねじとナットがセットのやつを買っておいたので、上にもナットをつけて何とか以下のように解決していた。

 

そして今日正解が見つかった。上下逆にすればよかったのだ。

これしきの事が思いつかないとは。。

説明書を鵜吞みにして考えることを放棄していたようだ。老化とは恐ろしい。

2025年12月7日日曜日

windowsとlinuxのデュアルブートでbluetoothを共用したい

windowsでbluetoothマウスをペアリングして、デュアルブートのlinuxに切り替えるとペアリングしなおさないと使えない。なんとなく、ハードウェア的にはペアリング状態が記録されてそうだが、OS側の情報がlinuxとwindowsで別々になっていて使えないっぽい感じがある。

デュアルブートでOSを切り替えるたびにペアリングしなおす必要があり、地味にめんどくさい。OSの情報だけの問題なら何とかなりそうなので検索した。 

見つかったサイトは以下。 

https://blanktar.jp/blog/2020/10/dual-boot-bluetooth 

windowsのレジストリにある情報で、linuxの/var/lib/bluetoothにおいてある情報を更新するというやり方のようだ。

後半にはchntpwというwindowsのレジストリをいじるコマンドで情報をとってくるやり方が書いてある。

なんかここまでくると、スクリプト書いて自動化できそうな感じがする。書いてみようか?と思ったが、こんな需要がありそうなものは既に誰かが作っているんじゃないか? 

と思って調べてみたらあった。

https://github.com/x2es/bt-dualboot

上記chntpwとやらを使ってwindows側のレジストリをいじるという中々に危険なプログラムっぽい。 githubページの後半には似たようなソフトの一覧もあって、このプログラムが優れている点を挙げている。自信があるんだろう。

まあ、バックアップもとるみたいだし、ありがたく使わせていただくことにした。

インストール

pipで入れるらしいが、aptで入れたpipだとsystem-wideにプログラムを入れられないっぽい。(なぜか?sudoで入れる必要があるからか?)

一応apt search bt-dualbootとやってみたがさすがに公式には入ってなさそうだ。

仕方ないので、エラーメッセージで表示された通りvenvを入れてみる。python3-fullが必要らしい。chntpwも要るだろう。

sudo apt install chntpw
sudo apt install python3-full

ユーザでvenvを作る。なんとなく.venvに入れてみる。

python3 -m venv .venv

sudo su -でrootになってbt-dualbootを入れる。
(root権限が要るのは/var/lib/bluetoothが一般ユーザで読めないからだろう)

. .venv/bin/activate
pip install bt-dualboot 

使ってみる

とりあえず.venvのbinを直接sudoで実行すればいいようだ。

windows側のレジストリをいじるだけあって、前準備としてwindowsファイルシステムをマウントしている必要がある。ubuntuなら、クリックするだけでマウントはされる。 

windowsのファイルシステムを認識しているか?コマンドを打ってみる。 

sudo .venv/bin/bt-dualboot --list-win-mounts

Windows locations:
==================
 /media/user/Windows 

大丈夫そうだ。

次に、プログラムが認識しているbluetoothの一覧を表示してみる。
1つ目のELECOM TK-FBP102は一度コマンドを実行して同期したもの。2つ目のELECOM IR Optical Mouseはlinuxでペアリングしなおしたもの。2個目のマウスはNeeds syncとなっている。

sudo .venv/bin/bt-dualboot -l

Works both in Linux and Windows
===============================
 [DC:2C:26:19:86:45] ELECOM TK-FBP102

Needs sync
==========

Following devices available for sync with `--sync-all` or `--sync MAC` options.

 [DC:2C:26:A7:D9:F0] ELECOM IR Optical Mouse

コマンドを実行してみる。-b(backup)か-n(no-backup)をつけないと実行できないらしい。一応-bにしておく。

sudo .venv/bin/bt-dualboot --sync-all -b
> BACKUP /media/user/Windows/Windows/System32/config/SYSTEM to /var/backup/bt-dualboot/SYSTEM-2025-12-07--12-44-28

Syncing...
==========
 [DC:2C:26:A7:D9:F0] ELECOM IR Optical Mouse
...done

できたようだ。もう一度見てみる。 

sudo .venv/bin/bt-dualboot -l

Works both in Linux and Windows
===============================
 [DC:2C:26:19:86:45] ELECOM TK-FBP102
 [DC:2C:26:A7:D9:F0] ELECOM IR Optical Mouse

Needs sync
==========

No device found ready to sync.
Try pair devices first.

sync必要なしとなっている。
再起動してwindowsにしてもマウスとキーボードが使えた。
Tested with Windows 10と書いてあったので心配だったが、Windows 11でも大丈夫だったようだ。

これで一つ快適になった。 

おまけ(時刻同期) 

以下ついでに、windowsとlinuxで時間が数時間ずれるやつ。linuxはUTC、windowsはローカルタイムでrtcを使うのでずれる。linuxをローカルタイムにすればいい。 

https://qiita.com/Juice/items/63279e93f818ba74312d

sudo timedatectl set-local-rtc 1

しかし、PCを海外に持っていくとき、windowsはいちいちrtcいじるのか。サマータイムでも余計なことをして1時間ずらしたりするんだよな。マイクロソフト馬鹿なんじゃねーの?

2025年11月29日土曜日

immichで画像の読み込みエラーになるとき

アップロードしてエラーになる。なぜか?

 

ログを見るとエラーが出ている。

Error loading image: Exception: Invalid image data
#0      _futurize (dart:ui/painting.dart:7991)
#1      ImageDescriptor.encoded (dart:ui/painting.dart:7785)
#2      instantiateImageCodecWithSize (dart:ui/painting.dart:2558)
#3      PaintingBinding.instantiateImageCodecWithSize (package:flutter/src/painting/binding.dart:147)
#4      RemoteImageRequest._decodeBuffer (package:immich_mobile/infrastructure/loaders/remote_image_request.dart:164)
#5      RemoteImageRequest.load (package:immich_mobile/infrastructure/loaders/remote_image_request.dart:32)
<asynchronous suspension>
#6      CancellableImageProviderMixin.loadRequest (package:immich_mobile/presentation/widgets/images/image_provider.dart:61)
<asynchronous suspension>
#7      ImageStreamCompleter.setImage (package:flutter/src/painting/image_stream.dart:724)
<asynchronous suspension>

めんどくさい問題が発生したのかと思ったが、サムネイル作成中のようだ。データがまだないのに読もうとしてエラーになっているだけだと思われる。

 

特定のカメラで撮ったやつがダメなのかと思って焦った。 気長に待てばよさそう。

raspberry-pi 4bで写真サーバーを立てる

ずいぶん前にgoogle photoが容量無制限でなくなり、Amazon photoに移行していた。

Amazon photoはprime会員なので容量無制限で使えるのだが、家族との共有が死ぬほどめんどくさい。とくにアルバムが共有できないというのが致命的に使いにくい。 

いい加減我慢の限界に来たので自宅サーバーを立てることにした。

とりあえず市販のNASを検討

synologyとかqnapとかが有名どころのようだ。最低限でも25000円くらい+ハードディスク代がかかる。

それだけならまあ何とか許容するとしても、数年周期で壊れたとして、また同じ費用が掛かるし、代替製品が出てちゃんとデータが移行できるのか不安が残る。また、やはり25000円+ハードディスク代で4~5万はかかるのももったいない。

おそらく製品なので簡単に使えるようになっているのだろうが、ついでに何か別のサーバも入れようとすると逆に面倒くさそうな感じもある。 

そして4~5万かかるのが気になる。やめた。 

自前で立てることにする

とりあえずalternativestoで調べてみて、見た目的にimmichというのがよさそうに見えた。raspberry-piでも動きそうなので、とりあえずraspberry-piにする。 ほかにもいろんなSBCが出てるが、有名どころのraspberry-piを使っておくのが面倒がないだろう。

現在最新はraspberry-pi 5のようだが、消費電力がちょっと高いようだった。電気代は安いに越したことはないので、4Bにしておく。immichをざっと検索した感じメモリは4G程度は必要そう。念のため8GB版を買っておく。 

インストール 

raspberry-piのOSを選ぶ。余計な機能はいらないので多分Liteでいいだろう。sshの設定までしてくれる。さすがだなあ。

書き込みして起動、wifiルータの機能でIPを固定化し、sshでログインしてみる。
何のトラブルもなく動いた。

次にquick-startに従いimmichを入れる。 

https://docs.immich.app/overview/quick-start/

dockerが必要そうなのでとりあえずdockerを入れる。一般ユーザでも使えるように自分をdockerグループに入れておく。

sudo apt install docker-compose
sudo apt install docker.io
sudo usermod -aG docker $USER 

quick-startに従いdocker-compose.ymlと.envをとってきて編集。とりあえず動かしてみるだけなので.envのタイムゾーンだけ変更して動かす。

# TZ=Etc/UTC
TZ=Asia/Tokyo

カレントのlibraryとpostgresにデータが格納されるようだ。

docker-compose up -dで普通に動いた。簡単すぎる。raspberry-piのケースを組み立てるのが一番大変だったかもしれない。

ハードディスク追加

動いたのはいいがこのままだと16GBしかないmicroSDにデータが入ってしまう。(ある程度容量のあるmicroSDを買ったつもりだったが、間違えてSDカード(でかい)を買ってしまったため、何に使ってたか分からない使い古しの16GBのmicroSDを使った。 )

ふるさと納税で1TBのUSBハードディスク(IO DATA 【HDPH-UT1KR】)を購入し使うことにする。

とりあえずつなげると大抵は/dev/sdaとして認識する。大抵はNTFSでフォーマットされているのでext4にフォーマットしなおして使う。最近のトレンドでは以下のようにやるらしい。

sudo parted /dev/sda mklabel gpt
sudo parted /dev/sda mkpart primary ext4 1MiB 100%
sudo mkfs.ext4 /dev/sda1 

できたらblkidでPARTUUIDなるものを調べる。伏せる必要があるかどうかよくわからないがXXXXの部分。

$ blkid
/dev/sda1: UUID="略" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"

fstabに追加する。

PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /mnt/disk ext4 defaults 0 1

ディレクトリを作ってmount -aしてみる。

mkdir /mnt/disk
mount -a

これでおそらく再起動してもマウントされるはず。

データ移動

一度immichを動かして設定してしまったので、もう一度やり直すのはめんどくさい。/mnt/disk/immichにデータを移動することにする。

sudo mkdir -p /mnt/disk/immich
sudo chmod 777 /mnt/disk/immich (なんとなく)

dockerを止めてデータをコピー

docker-compose down
sudo cp -a library /mnt/disk/immich/
sudo cp -a postgres /mnt/disk/immich/

.envのパスを変更して再起動。

UPLOAD_LOCATION=/mnt/disk/immich/library
DB_DATA_LOCATION=/mnt/disk/immich/postgres
docker-compose up -d

特に何事もなく動いた。再起動しても大丈夫そう。 

インストール後

一応メモリ使用率を見てみる。150GBくらい写真を入れた後。

               total        used        free      shared  buff/cache   available
Mem: 7.6Gi 2.5Gi 99Mi 148Mi 5.3Gi 5.1Gi
Swap: 2.0Gi 461Mi 1.5Gi

freeが少ないように見えるけど、availableは十分あるから大丈夫そうかな。
freeコマンドの見方は以下。詳しい人のyoutube(https://www.youtube.com/watch?v=jiHipQ2XUHc)から抜粋したので怒られたら消す。

 

microsd使用量は9GBくらい使っている。ちょっと16GBだと心もとない。 

/dev/mmcblk0p2   14G  9.1G  4.0G  70% / 

USB-Cの電力計で電力も計ってみる。写真をある程度の数アップロードした後は顔認識やら何やらでわりとCPU動きっぱなしになるので、そのあたりの電力を計った。 

見づらいがmax 9.16W、1.68Aとなっている。USBハードディスクはバスパワーなのでハードディスク込みの消費電力だ。バスパワーのタイプだったが、今のところraspberry-piからの電力で問題なく動いてそう。

とりあえず約10W x 24時間 x 30日くらい動かすとして7200Wh、電気代はだいたい1kWh30~40円として288円。毎日常にCPUフルで動くわけでもないはずだが、多く見積もって月額300円くらいのサービスということになる。

使用感

使ってみた感じはgoogle photoにかなり近い感じ。少なくともamazon photoより格段に使いやすい。amazon photoは即アンインストールしようかと思ったくらいだ。(一応念のためのバックアップ用に残してあるが) 

アップロード後サムネイルづくりや顔認識でCPUが使われ、 しばらく待たないと反映されないのが多少気になる。CPUはgoogleには及ばないので、大量にアップロードした後だと、ジョブが永遠に終わらない気がしてくる。まあ気長に待つしかないだろう。

あと、だれがアップロードした写真なのか見えるといいんだけど、まあ無くてもそこまで困らない。

ほかはおおむね満足、15000円+ふるさと納税+ケース、電源代+電気代を払う価値はあったと思う。

2025年11月25日火曜日

windows 11にした

保険料控除の証明書を電子にしているので、年末調整で提出するときにQRコード付地震保険料控除証明書とやらが必要なようだった。 

で、やろうとしたら推奨環境じゃないと表示される。

仕方ないのでwindows 11にしなければならないが、今使っているPCは10年前の代物でTPM2.0は当然ついてないし、CPUも非対応(Core i7-6700HQ)らしく、アップグレードNGとなる。 

仕方ないので無理やりアップグレードすることにした。 

https://easy-pc.hatenablog.com/entry/2025/03/02/165145

を参考に以下のコマンドでインストール。

setup.exe /product server

思いのほか問題なく動いている。windows updateも問題なさそう。

 

さてQRコード付地震保険料控除証明書とやらを作るか、と思ったらNG変わらず。

firefoxだからダメなのか。。。と思ってedgeにしても同じ。

詰んだ。税金を多めに払うしかないのか。。

と思ったら閉じるを押してそのまま進められるようだった。 
紛らわしい表示はやめてほしい。無駄にアップグレードしてしまったぞ。 

2025年11月23日日曜日

SteamでSpace Channel 5: Part 2が買えなくなるらしい

12/6で買えなくなるようだ。

https://support.sega.com/hc/ja/articles/29776767664145-SEGA-CLASSICS#h_01JBWBC4E7NJ9WH4TKAZXJK27N

元々おま国で買えないんだけど、おま国を何とかして買うのもラストチャンスか。。。
とりあえず調べた限りでは、g2aとかいうキーを売ってるサイトで買えば何とかなるかもしれないようだ。
検索してみる。

https://www.g2a.com/space-channel-5-part-2-steam-key-global-i10000049438002

161USDって何円だっけ?
高けぇ。足元見てんのか?
さすがに厳しい。だいたい本当にやりたいの1(無印)だし。(2もやりたいけども)


1(無印)は持っていてドリームキャスト本体も押し入れに眠っているが引っ張り出すのがめんどい。
吸いだしたデータをエミュレータでやろうにも、どうにも進めなくて詰んでいる。
どう考えてもエミュの遅延のせいに決まっている。決して反射神経が鈍ったせいではない。

何とかして普通に売ってくれないかなー。
マイケル出てるから難しいのかもしれないけど。
続編もVRじゃなくて普通のやつをお願いしたい。 

2025年11月10日月曜日

google検索の傾向

以前にも書いたが、このブログはgoogle検索でほとんど引っかからない。

一時期休眠していて、最近ちょこちょこブログを書き足しているが、休眠期間中にクロールの価値無しと判断されたのだと思われる。 

半年くらいは経ったので、そろそろ状況変わってるかなと思って確認してみた。

とりあえず最近アクセス数がある記事で見ると以下。

  • skyseaとfirefoxの記事(検索ワード: skysea firefox)
    • bing: 検索5位
    • duckduckgo: 検索5位
    • google: 圏外
  • 株主優待の記事 (検索ワード: トリドール 株主優待 残高確認)
    • bing: 検索60位くらい
    • duckduckgo: 検索50位くらい
    • google: 圏外

だめだな。変わってねえ。

依然として表示する価値無しと判断しているようだ。こういうしょうもないブログを枝刈りすることで検索の品質を上げているのであろう。

株主優待のgoogle検索だとublockにブロックされるような詐欺る気マンマンのサイトが大量に出てくるけど大丈夫なんだろうか?詐欺られてる人もいそうな気がするけど。bingやduckduckgoはちゃんと残高確認について書いたページを検索してくれるんだけど。

まあ俺には関係のないことだからどうでもいいか。 

2025年10月22日水曜日

bloggerでコードハイライト

ブログを見ると我ながらコード見づらいと思った。これはどう考えてもコードハイライトされないBloggerひいてはgoogleのせいでありコードには一切の問題はない(責任転嫁)。 

とりあえず以下を参考にコードハイライトを入れてみる。

https://rfs.jp/sb/javascript/js-lab/code-prettify.html

準備

管理画面の「テーマ」でテーマをカスタマイズ(HTMLを編集)する。

</head>の直前ぐらいに以下を入れた。よさそうな奴を探して入れたらいいようだ。

<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sunburst'/>

やりかた

編集画面でHTMLビューに変えて 

<pre class="prettyprint"> </pre>

で囲むだけ。。。

めちゃくちゃめんどくさい。Bloggerでコード書いてる人みんなこれやってんのか?うそだろ?

追記

スマホから見るとハイライトされないようだった。モバイル用のテーマも変更しないといけない。(管理画面の「テーマ」でテーマのカスタムの▽→モバイルの設定→モバイルテーマの選択→カスタムを選ぶ)

参考: https://1studying.blogspot.com/2017/04/blogger_93.html 

2025年9月29日月曜日

skyseaとfirefox

ここ最近会社のfirefoxで全くwebが見れなくなる現象が起こる。

原因は多分skyseaとか言う糞システムのfirefox用拡張機能だと思う。

firefoxの更新とか、何かのタイミングでskysea拡張機能の同意ボタンを押さないと何も表示出来ない作りになってるようだが、これにバグがある。

バグって同意ボタンが表示されない時はfirefoxが永久に使えなくなる。この拡張機能は勝手に入れられて尚且つ無効に出来ないので質が悪い。

拡張機能の設定(プライベートブラウジングで無効にするとか)を変えたり、他の拡張機能の有効無効を切り替えたり、デバッグモードにしたりしてると、何かのタイミングで再読み込みされるのか、同意ボタンが表示されて使えるようになる。

すぐに何とかしたい場合は新しいプロファイルを作るしかない。

これが発生すると他の拡張機能の設定を消し去ってくれる。

これ作った奴を殴り倒したい。 

↓再読み込みされる気がする行動(確実に改善されるわけではない)

  • ublock originの拡張機能をON/OFFする
  • skysea client viewの拡張機能を管理 →このアドオンの自動更新を許可しない→今すぐ確認
  • skysea client viewの拡張機能を管理 → プライベートウィンドウの実行を切り替える
  •  メニュー→その他のツール→リモートデバッグ→このfirefox→調査 


 

2025年8月4日月曜日

3Dモデリングをやってみる

ミャクミャクの3Dモデル 

子供がずいぶん気に入っているので、ミャクミャクをVtuberみたいに動かせたらいいなと思って探してみたが、今一つ簡単に使えそうなのがなかった。

仕方ないのでちょっとyoutubeの初心者講座を見ながらblenderで作ってみた。我ながらなかなかいい感じの形になった。

 

使った機能はだいたい以下くらい。 

  • gで移動
  • sで拡縮
  • iで面を入れる
  • eで押し出し
  • ctrl+rで分割
  • ctrl+dで複製
  • サブディビジョンサーフィス
  • ミラー

ミラーは分割したあたりに点が二重にあったりすると変な感じになって結構悩んだ。以下で解決。

  • 点が重なってたら重なってる点を消して一つにする。
  • ミラーの境目に線が入ったりする場合は、ミラーで二重になってるので、マージで一つにする。

ボーンとやらも入れてみた。ちょっと胴長?

 

カメラでモーションキャプチャーして動かしたかったが、ここまで丸一日かかったのでまた今度。 

単色でテクスチャもいらないし、丸いところはコピペでいいし、初心者向けにいい題材な気がする。  

でも肘のしずくみたいなところとか、赤いところがめり込んだりとか、変なところは多い。ちゃんとやろうとすると無限に時間が溶けていきそうだ。3Dモデリングって大変なんだなあ。 

参考にした動画

https://www.youtube.com/watch?v=uMeXuB82uZc&t=2026s 

https://www.youtube.com/watch?v=Mp_8XHBUTpg

https://www.youtube.com/watch?v=mFJNdIKApPc&t=167s

参考にしたページ

https://styly.cc/ja/tips/blender-modeling-start5-2

 

2025年7月8日火曜日

年末調整を計算(検算)してみる

年末調整ってどういう計算? 

いまだに何が何やら分からない年末調整について、確認してみた。会社とか人によって違うと思うが、自分用のメモとして残す。

以下の順に計算する。

1. 支払金額 = 年収
2. 給与所得控除後の金額
3. 課税される所得金額
4. 所得税
4-1. 所得税(ローン控除)
4-2. 所得税(+復興特別所得税) = 源泉徴収税額
5. 所得税還付金

以下、仮に年収900万(あくまで仮に)だとした場合

1. 支払金額 = 年収

給与明細の「課税支給合計額」を1~12月まで足したもの。

これはさすがにメモする必要はないだろう。
と思ったが、通勤費は非課税で、食費補助手当は課税のようだということはメモしておく。

2. 給与所得控除後の金額

支払金額から控除を引く。税金を安くするためには所得が低ければ低いほどいいのだ。
表は左が入力、右が出力のイメージ。黄色と緑で示したところは源泉徴収票に載っていたので検算できる。

支払金額 9000000

給与所得控除額 1950000 給与所得控除後の給与等 7050000


所得金額調整控除額 50000


給与所得控除後の金額 7000000

給与所得控除額は年収により決まっていて、これを引くことができる。900万->705万。 
年末調整で書く給与所得はこの部分。 

扶養親族が居たりすると、所得金額調整控除額を引くことができる。

所得金額調整控除額 = (支払金額-850万)x10% = 50000円

差し引き700万が所得税がかかる金額のベースになる。
ここからさらに控除を引くことができる。

3. 課税される所得金額

給与所得控除後の金額から、さらに各種控除を引く。

給与所得控除後の金額 7000000

基礎控除額 480000

社会保険料等の金額 1273500

生命保険料の控除額 120000

地震保険料の控除額 5000 所得控除の額の合計額 1878500


課税される所得金額 5121000

基礎控除は年収によって決まるが、よっぽど高給取りでなければ48万だろう。

社会保険料「等」の金額とあるが、自分の場合は以下だった。

社会保険料等の金額 = 健康保険料+厚生年金保険料+介護保険料+雇用保険料

厚生年金保険料が年収の18.3%、その他健康保険料等は合わせて10%くらい(自治体による?)。計28.3%が社会保険料等として奪われる。が、半分は会社が持つので、年収の14.15%くらいが社会保険料等の金額になるだろう。

仮に900万だと上記127万くらいになる。
実際には会社が(自分が働いたことによる利益から)払っているので、本来の年収は1027万くらいで、254万くらい国に取られているとも考えられる。一見して払っている額が少ないように見せるトリックが使われているようだ。

生命保険料、地震保険料の控除額は、毎年年末調整で提出するアレ。

これらの控除の合計が「所得控除の額の合計額」となる。
給与所得控除後の金額から差し引くと、儲けとなる「課税される所得金額」が512万くらいとなった。(1000円未満切り捨て)

4. 所得税

「課税される所得金額」によって決まる税率/控除額から所得税額を出す。

課税される所得金額 5121000

所得税率 0.2

控除額 427500



所得税 596700

税率/控除額は以下の表で決まる。

所得金額が500万くらいなら20%で控除額427500円。これで所得税が決まる。

所得税 =  課税される所得金額 x 20% - 427500円

これで所得税596700円と出る。

4-1. 所得税(住宅ローン控除)

ローンがあると所得税から控除できる。

所得税 596700

住宅取得等特別控除額 150000

源泉徴収時所得税減税控除済額 90000



所得税-ローン控除 356700

所得から引くのではなく、直接税金が減るのでなかなか大きい。

4-2. 所得税(+復興特別所得税) = 源泉徴収税額

ここまで計算してなかなか数字が合わなかったが、復興特別所得税2.1%を追加することで源泉徴収票の「源泉徴収税額」と一致した。(100円未満切り捨て)

所得税-ローン控除 356700

復興特別所得税率 0.021

源泉徴収税額 364100 所得税(+復興特別) 364100

(人によってはほかにも何かあるかもしれないが)これが国に取られる所得税になる。

5. 所得税還付金

と見せかけて、実際には1~12月にかけて、だいたいの雰囲気で所得税は取られていて、給与明細にも載っている。

毎月取られているが、当然年末にちゃんと計算した結果と合うわけがないので、払い過ぎた分が12月か1月に帰ってくる。

所得税還付金 = 1~12月に払った所得税の合計 - 源泉徴収税額

これが給与明細に載っている額と一致した。
なんか源泉徴収票の計算が間違っているような気がして計算してみたが、合っていたようだ。

2025年6月24日火曜日

トリドールの株主優待の残高確認がめんどいので何とかする

トリドール(丸亀製麺)の優待が金券じゃなくて優待カードになって久しい。

残高はwebで確認できるが、こんな感じでログインが必要。

 

ブラウザは最後の4桁しか自動入力してくれなくてめちゃくちゃめんどくさい。

「これで」とか言ってカードを出して残高がなかったら恥ずかしいので残高は確認したいが、めんどくさいのは嫌だ。 

ワンクリックで確認したいので何とかしてみる。

GETでやってみる 

開発者ツールで見てみる。

 

POSTしているようだが、たぶんGETでもいけるんじゃないのか?

https://www.vcsys.com/s/toridoll/p/login?cardId1=xxxx&cardId2=xxxx&cardId3=xxxx&cardId4=xxxx&cardPin=xxxxxx&kind=%83%8D%83O%83C%83%93 

cardId1~4のxxxxを4桁ずつのカード番号、cardPinのxxxxxxのところをpin番号に置き換えてブックマークしておく。%83%8D%83O%83C%83%93はcopilotに聞いたところsjisで「ログイン」らしい。

firefoxで開いたら残高表示された。多分ほかのブラウザでも行けると思う。

知らんうちに6000円くらい溜まっていたようだ。 

POSTでやってみる 

GETだとさすがにセキュリティ的によくなさそう。(別に残高知られても困ることはないが) 

javascriptでPOSTするコードをブックマークレットにしておけばいいかもしれない。

javascript:(function(){
    var form = document.createElement('form');
    form.action = 'https://www.vcsys.com/s/toridoll/p/login';
    form.method = 'post';

    var ids=['cardId1','cardId2','cardId3','cardId4','cardPin','kind'];
    var vals=['xxxx','xxxx','xxxx','xxxx','xxxxxx','%83%8D%83O%83C%83%93'];

    for(var i=0;i<ids.length;i++){
        var q = document.createElement('input');
        q.name = ids[i];
        q.value = vals[i];
        form.appendChild(q);
    }

    document.body.appendChild(form);

    form.submit();
})();

valsのxxxx,xxxx,xxxx,xxxxにカード番号、xxxxxxにpinを入れてブックマークのURLにセットする。

 

androidのfirefoxでも行けた。他のブラウザは未確認。

ただしfirefoxのブックマークにpin等が記録される事は気にしないものとする。 

2025年4月30日水曜日

C言語のforとマクロで簡単な時間計測

前回、処理時間計測の必要に駆られた。いちいち時間計測のコードを入れて回るのが面倒なので、forとマクロで簡単に計測した。

enum{
        SW_SH2,
        SW_HBIN,
        SW_HBOUT,
        SW_VBIN,
        SW_VBOUT,
        SW_SCSP,
        SW_SCU,
        SW_68K,
        SW_SMPC,
        SW_CDB,
        SW_SYNC,
        SW_MAX
};
static const char* swname[]={
        "SW_SH2",
        "SW_HBIN",
        "SW_HBOUT",
        "SW_VBIN",
        "SW_VBOUT",
        "SW_SCSP",
        "SW_SCU",
        "SW_68K",
        "SW_SMPC",
        "SW_CDB",
        "SW_SYNC",
        "SW_MAX"
};
static u64 swbuff_[SW_MAX];
static u64 start_time_ = 0;
static int sw_flag = 0;
#define SW(n) for(tick_start();sw_flag;tick_end(n)) 
static void tick_start()
{
        sw_flag=1;
        start_time_ = YabauseGetTicks();
}
static void tick_end(int n)
{
        u64 diff = YabauseGetTicks() - start_time_;
        swbuff_[n] += diff;
        sw_flag=0;
}
static void tick_clear()
{
        for(int i=0;i<SW_MAX;i++){
                swbuff_[i] = 0;
        }
}
static void tick_show()
{
        for(int i=0;i<SW_MAX;i++){
                printf("%d:%s: %llu\n", i, swname[i], swbuff_[i]);
        }
}
for文は最初と最後で文を実行できるので、これを利用して、tick_start()とtick_end()を呼び、sw_buff_に時間を足していく。tick_startでループ条件ON、tick_endでループ条件OFFとすれば、ループにならない。

こうしておけば以下のようにSW(番号){}で囲むと時間を計って加算してくれる。

SW(SW_SH2){ 
  計測したい処理(SH2)
}
SW(SW_SCU){
  計測したい処理(SCU)
}

新しいCならforの中で変数宣言できるので、工夫すれば入れ子で計測できたりしそうだが、そこまではやってない。

YabauseGetTicks()は現在時刻を取得するようなyabauseの関数で以下のようになっている。

u64 YabauseGetTicks(void) {
#ifdef WIN32
   u64 ticks;
   QueryPerformanceCounter((LARGE_INTEGER *)&ticks);
   return ticks;
#elif defined(_arch_dreamcast)
   return (u64) timer_ms_gettime64();
#elif defined(GEKKO)
   return gettime();
#elif defined(PSP)
   return sceKernelGetSystemTimeWide();
#elif defined(ANDROID)
        struct timespec clock_time;
        clock_gettime(CLOCK_REALTIME , &clock_time);
        return (u64)clock_time.tv_sec * 1000000 + clock_time.tv_nsec/1000;
#elif defined(HAVE_GETTIMEOFDAY)
   struct timeval tv;
   gettimeofday(&tv, NULL);
   return (u64)tv.tv_sec * 1000000 + tv.tv_usec;
#elif defined(HAVE_LIBSDL)
   return (u64)SDL_GetTicks();
#endif
}

という事でやってみた結果、遅い処理はどうやらSH2とSCUのエミュレーション部分のようだった。

SH2部分はダイナミックリコンパイル(JITコンパイル?)されていて、もうこれ以上は早くならなそう。

SCUも同じような感じでコンパイルしなおせば早くなるのかもしれないが、かなり特殊な命令形態っぽいので、簡単にアセンブラに変換はできないような気がする。これ以上はもう無理か。。あと2倍くらい早いか倍のコア数がある端末ならば、何とかなりそうな気がするが。。

2025年4月19日土曜日

続5:中華linuxゲーム端末Anbernic 353PSでセガサターン

今度こそyabasanshiro-saでGRANDIAのムービーが遅い原因を調査する

とりあえず忘れないうちに覚書をメモ

ここまでの調査でFBCRへの書き込みで画面をマニュアル更新していることは分かっている。要はこの画面更新のタイミングがなぜ遅いのかが問題となる。単にタイマーのエミュレーションにバグがあるとかだったら直せそうなので調べてみる。(そうであってくれ)

 FBCR(25D00002)への書き込みを行っているのがどこなのか探してみる。いろいろやったがよくわからず、SSFのデバッグ機能で、25D00002を検索した。(ような気がする。うろ覚え)

そしてprintf結果と突き合わせて、どうやら060129baでFBCRに書いているようだとわかった(と思う)

そしてその近辺でpcをprintfした。普通こういうタイミングが重要な処理は割り込みのタイミングでやるはず。急にアドレスが飛んで戻っているので、おそらく割り込みだろうと決めつけて調べる。

pc 06039f94
pc 06037b10
pc 06013a1c <= なんとなくここで割り込みっぽい気がする
pc 06012952
pc 06012988
pc 0601298e
pc 06012996
pc 060129a8
pc 060129ba
mw 25D00002 @060129ba
pc 06013a34
pc 06015144
pc 06015160
pc 060151c8
pc 060151f4
pc 06015210
pc 06015222
pc 06039ae4

再びSSFで06013a1cを検索、06000a04が見つかる。なんか割り込みベクタっぽいアドレスだ。ただ、SSFの画面を見る限りはVBRは06000000と060000400で、微妙に遠い。ただ、限りなく割り込みっぽいので、Interruptで検索してprintfを入れまくる。そしてここで06013a1cを登録しているっぽいことが分かる。

static void FASTCALL BiosSetScuInterrupt(SH2_struct * sh)
{
   SH2GetRegisters(sh, &sh->regs);

   LOG("BiosSetScuInterrupt. vector = %02X, func = %08X\n", sh->regs.R[4], sh->regs.R[5]);
これで、どうやらベクタ番号41番と分かり、先日見つけたサターンの仕様を見ると

SCU Interrupt
bit 1    V-blank-OUT    VDP2    vector 41    Level E

となっている。1画面書き終わったら発生するV-blank-OUTの割り込みのようだ。という事は単に1画面60フレームごとに割り込みでマニュアル更新しているということになる。

単に画面の描画が60fpsに間に合ってなくて遅くなっているという事だろう。エミュレーションバグとかではなかった。簡単に治せそうにない。当てが外れたようだ。

フレームスキップが有効になっているが、無効にしても同じ速度で動いている。自動フレームスキップが何の役にも立ってなさそうだ。 何か違うところが遅いのかもしれない。

実機でしか動かせないからどこが遅いのかしらべるの大変そう。。

2025年4月13日日曜日

MOONLIGHT & SUNSHINE

 ROCKNIXでMoonlightとやらの設定があった。どうやらNvidiaのGameStreamとやらでPC上のゲームをlinuxゲーム端末で遊べるというものらしい。

ただ、いくら探してもnvidiaのアプリ上にgamestreamらしきものはなかった。どうやら非対応になった模様。

それに代わるものとしてMoonlightの開発チームがsunshineというものを作っているようだ。PC上にsunshineをインストールし、PCのIPをlinuxゲーム端末に設定すると、遠隔でPC上のゲームを遊べる。

PCは電源を入れてsunshineを動かしておかなければならない。wakeonlanとか設定して自動ログインとかにしておけばいつでも遊べる感じになりそうだが、めんどくさいのでそこまではしない。

steamのbig pictureが多分最初から設定されていて(インストールされてあったら自動的に登録されてたりする?) 、まあまあそれなりに遊べそう。

マウス入力はできなそうなので、ゲームパッドで遊べるやつ専用かな。とりあえず428は遊べそうだが、画面サイズが640x480でなんか縦長に圧縮されたような画面になってちょっと気になる。

終わらせ方はSELECT+RUN+L1+R2同時押しで終わる。

2025年4月10日木曜日

自民党がまた金配るみたいだな

現役世代から金をとって老人に配りたいんだろう。それで票を買いたいわけだ。そもそも配るくらいなら最初から取るなと言いたいところだが、一度作った仕組みは変えたくない、一度取り始めた税金は意地でも減税したくないという事だろう。

プログラム的に言うと継ぎ足し継ぎ足しで無駄コードがわんさか入っているスパゲッティコードだけど、動かなくなるから削るなみたいな感じだろうか?

放送法とか。当初は電波塔とかの整備で予算が必要だったのかもしれないが、もう要らんはずだし。 ガソリン税も二重課税になって、一般財源にされて何に使ってるかよくわからなくなってる。流用流用で何に使ってるか分からないまま税金だけどんどん増えている。

プログラムだったら、コードを見直して、何がどうなっているか把握できる状態を保っておかないと管理できなくなるんだが。都度見直しして根本原因を直す。コードは常にきれいに無駄なく保つってことができない奴は優秀とはいえない。

口先だけの文系に任せてるからこうなってるんじゃないのか?もっと理論立てて仕組みを考えられるやつにやらせたほうがマシになるんじゃないのか?

と思ったりしていたが、アメリカではイーロンマスクが容赦なくリファクタリングしまくっているようだ。将来的には無駄を排除したすっきりしたシステムになるのかもしれないが、どうなるんだろう。結構な痛みは伴っているようだが。

しかしアメリカはすごいな。日本だと一人二人変わったところで、何も変わらずスパゲッティを肥大化させていくだけだろう。

2025年4月5日土曜日

続4:中華linuxゲーム端末Anbernic 353PSでセガサターン (更新)

yabasanshiro-saでGRANDIAのムービーの音がおかしい原因の調査の覚書のメモ(更新)

GRANDIAを動かすとムービーが遅い気がする。そして雑音だらけで何を言っているか分からない。遅いせいで雑音だらけなのか?音だけでも何とかしたい。と思って調べた。

ソースコードvdp2.cpp:882くらい

swap_frame_bufferがmanual changeされていて、VDP1 offset 0x02にval=3が書かれたとき更新される。

 FBCR
 Frame buffer switching mode

どうやら遅いわけではなく、もともとそういうスピードにしてそう??

音が雑音だらけで遅くなっているのかと勘違いしていた。どうやら雑音だけの問題の模様。

セガサターンの音を再生する機能(SCSP)にはSLOTというものがあり、オープニングムービーでは、SLOT04とSLOT08を使っている模様(SSFのデバッグモードを使うとわかる)

08だけ生かすとほぼ無音(あっているのか?)
04だけ生かすとノイズまみれ。ただ、ノイズにまみれた中で、ところどころ正常な音が鳴る。部分的に問題なさそう。

とりあえずSLOT04が悪いようだ。

データを見てみると、サウンドバッファにあるデータをM68kに投げて、データを戻してから再生するようだ。おそらく、M68kとやらを使って圧縮された音を展開しているんじゃないだろうか。

原因を調べようとprintfを入れると音がマシになる。

またタイミング問題かよ。。。

タイミングの問題を調べようとする

なんかyabause.cのあたりで、CPUシミュレーションとSCSPシミュレーションの同期が取れてないような気がしてきた。

とりあえずyabause.cの中を見てみる

deciline = 1/10ライン
SCSP 44100 * 512 clock?
M68k 44100 * 256 clock?

decilineの9と10でHBlankINとHBlankOUTになり、ScspExecされる

PAL 50フレーム x 313ライン
NTSC? 60フレーム x 263ライン

1/10ライン当たり 143.0874... clockということ
この端数が良くないとか?

scsp_cycles_per_deciline =

VLBlankで

  • setM68kCounter((u64)(44100*256/60)<<SCSP_FRACTIONAL_BITS)
  • SmpcINTBACKEnd()
  • Vdp2VBlankIN()
  • SyncCPUtoSCSP() 

と見ていった中で、SyncCPUtoSCSPが実質何もやっていないように見える。

CPUから書いたデータをSCSPで受けて、M68kに渡して展開、戻ってきたデータを(ここで壊れている感じ?)SCSPで鳴らす。 CPUとSCSPでタイミングを合わせないとうまくデータがやり取りできないのでは?

とりあえずの解決策

よく見ると、SCSPのコードには2通り実行コードがあった。

void ScspExec(){
  if (thread_running == 0){
    thread_running = 1;
    if (g_scsp_main_mode == 0) {
      YabThreadStart(YAB_THREAD_SCSP, (void * (*)(void *))ScspAsynMainCpuTime, NULL);
    }
    else {
      YabThreadStart(YAB_THREAD_SCSP, (void * (*)(void *))ScspAsynMainRealtime, NULL);
    }
    YabThreadUSleep(100000);
  }
}

何も変えない場合、ScspAsynMainRealtimeで動く。試しにg_scsp_main_modeを0にして、ScspAsynMainCpuTimeに変えてみると、雑音がなくなった。ただ、やっぱりスロー再生みたいになっているようだ。なんか遅い気がした感覚は気のせいではなかったようだ。

見たところRealtimeの方は時計の時間に同期して動くように見える。それに対してCpuTimeはおそらくシミュレーション時間に同期して動くものだと思われる。ここで雑音になった原因を考えてみると、端末のCPUが貧弱なためにCPUエミュレートが遅くなり、ムービーがスロー再生気味になるのに対し、SCSPだけ現実時間で動いて同期が取れなくなり、音声データがおかしくなり雑音だらけになったという事だろう。当初推測した原因(遅いせいで雑音になる)は一応当たっていたという事になる。

 なんにせよグランディアの音が正常に鳴るようになった。やったー。と言いたいところだが、今度はスロー再生になるのが気になってしまう。CPUの処理能力が足りないんだろうが、うーん。。

FBCRで毎回書いてるみたいだから、なぜそれが遅くなっているかだなあ。

 


2025年3月25日火曜日

続3:中華linuxゲーム端末Anbernic 353PSでセガサターン

前回に引き続き、yabasanshiroがメモリを消費しまくる原因を探している。

 _ZNSt10_HashtableIjSt4pairIKjiESaIS2_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb0ELb1EEEEC4Ev
toolchain/aarch64-rocknix-linux-gnueabi/include/c++/14.2.0/bits/hashtable.h:539 (discriminator 2)
_ZN10DynarecSh210SetContextEP10SH2_struct
yabause/src/sh2_dynarec_devmiyax/DynarecSh2.h:320
SH2Reset
yabause/src/sh2core.c:180 (discriminator 1)
YabauseStopSlave
yabause/src/yabause.c:966
_Z11yabauseinitv
yabause/src/retro_arena/main.cpp:272
main
yabause/src/retro_arena/main.cpp:440 (discriminator 1) 

このあたりでメモリ消費が大きいという事で、ファイル名からしてダイナミックリコンパイルの処理の模様。

試しにインタプリタ方式で実行してみると嘘のようにメモリ消費量が下がった。変更するところは以下。src/retro_arena/main.cppのyabause_init()内、

 yinit.sh2coretype = 0;

とすると、上の方で定義しているSH2Interpreterが選ばれる模様。ただ、これだとインタプリタなので遅い。 早く動かしたくてstandalone版を何とかしようとしているので、本末転倒になる。

次はこのダイナミックリコンパイルの処理を何とかしないといけないという事だ。

メモリリークの場所

探すのにだいぶ苦労したが、 DynarecSH2.cppのInit部分

void CompileBlocks::Init()
{
  dCode = (Block*)ALLOCATE(sizeof(Block)*NUMOFBLOCKS);
  memset((void*)dCode, 0, sizeof(Block)*NUMOFBLOCKS);

この関数は最初だけじゃなく、結構何回でも呼ばれる。そのたびにdCodeが新しく確保されていく。とりあえずNULLじゃなかったら確保しないようにすればメモリリークはなくなる。

最初はdCodeのサイズ自体が大きすぎるのかと思って削減用のコードを書いてしまった。半分くらいに減らしたところで、よく見たら16MB程度であり、何かのきっかけで20MB程度増えるという現象に合致する数字であることに気づくという失態。

本家のソースを見るとすでに対処済みのようだった。見当がついた時点でそっちを見ればよかった。

root        2897  227 26.1 1060784 262320 pts/0  Rl+  01:46  22:07  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd
root        2897  227 26.1 1060784 262360 pts/0  Rl+  01:46  22:09  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd
root        2897  227 27.1 1060784 271604 pts/0  Sl+  01:46  22:11  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd
root        2897  226 25.2 1050692 252664 pts/0  Sl+  01:46  22:12  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd
root        2897  226 25.0 1049160 251088 pts/0  Sl+  01:46  22:12  |           \_ /tmp/yabasanshiro -r 2 -i /storage/roms/saturn/AdvancedWorldWar.chd

 何回か戦闘してもメモリ250MBくらいに収まっている。仮想メモリは1GBくらい行っているので最悪それくらいまでは消費し得るのかもしれないが、今のところ大丈夫そう。おそらくは前回確認したcurrentQuadの部分だと思われるが、際限なく増えるわけではないのでとりあえず良し。

あとはGRANDIAのムービーが激重でコマ送りになっているのが何とかなればいいんだけど、これはちょっと見当つかないな。

 

2025年3月20日木曜日

続2:中華linuxゲーム端末Anbernic 353PSでセガサターン

前回、とりあえずメモリリークっぽいというところまでは分かった。ただ、どこでメモリリークしているのかは分からない。

jemallocではプロファイルが取れるようなので取ってみようとした。

jemalloc prof

./configure --host=aarch64-rocknix-linux-gnueabi --enable-prof

でビルドして、

MALLOC_CONF=prof:true

としてみたが、ファイルが取れなかった。リンクしてmalloc_stats_printは動いてそうだが、なぜかファイル出力されない。 

どうやらatexitで登録されている処理が動いてないようだ。YabDeInitとやらの処理の途中でおそらくabortしており、exitされていないという可能性がある。

とりあえず無理やりmenuから何かの操作をしたらexit(-1)するようにしたところファイルは出力された。

このファイルをみるためjeprofを動かさなければならないが、perlは入ってない。PCで動かそうにもarmのものなのでシンボルが読めなそう。textファイルなので直接読んでみる。

heap_v2/524288
  t*: 370: 661091 [0: 0]
  t0: 95: 43814 [0: 0]
  t1: 0: 0 [0: 0]
  t3: 255: 21950857 [0: 0]
  t4: 0: 0 [0: 0]
  t5: 0: 0 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x56712c 0x567620 0x4eef9c 0x4e1f64 0x513014 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 4194308 [0: 0]
  t0: 1: 4194308 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x4e1e54 0x5130b0 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 516101 [0: 0]
  t0: 1: 516101 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x7fadca9364 0x7fadc25e0c 0x7fadc9bf98 0x7fadc30c10 0x7fadc9bffc 0x7fadc90560 0x7fb5afd208 0x7fb59f37d0 0x7fb59ee404 0x476364 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 5121 [0: 0]
  t0: 1: 5121 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x512f78 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 516101 [0: 0]
  t0: 1: 516101 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x56d584 0x562eac 0x563e20 0x4f43e8 0x4e2540 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 1: 41128 [0: 0]
  t3: 1: 41128 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x56d584 0x562eac 0x56473c 0x4f74d8 0x4f7c0c 0x4fc844 0x4fd020 0x4e4b74 0x7fb54e0d34 0x7fb554c18c
  t*: 1: 448 [0: 0]
  t3: 1: 448 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x512f8c 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 1057519 [0: 0]
  t0: 1: 1057519 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x512fa4 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 1057519 [0: 0]
  t0: 1: 1057519 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x7faedbc9b0
  t*: 1: 661636 [0: 0]
  t0: 1: 661636 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x5598c0 0x5130a8 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 516101 [0: 0]
  t0: 1: 516101 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c97644 0x5792e4 0x512fec 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 4194308 [0: 0]
  t0: 1: 4194308 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fb5a70714 0x7fb5a71194 0x7fb59f05c8 0x7fb5a17e50 0x7fb59ee33c 0x7fb59ee550 0x476364 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 32 [0: 0]
  t0: 1: 32 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fb5a70714 0x7fb5a71194 0x7fb59f05c8 0x7fb5a1c894 0x7fb5ae796c 0x7fb59ee3b8 0x476364 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 32 [0: 0]
  t0: 1: 32 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fafdb0418
  t*: 1: 80 [0: 0]
  t0: 1: 80 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7faed40544
  t*: 1: 396057 [0: 0]
  t0: 1: 396057 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fafdb205c
  t*: 1: 265483 [0: 0]
  t0: 1: 265483 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fafd32870
  t*: 5: 15364 [0: 0]
  t0: 5: 15364 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fafd1ab74
  t*: 1: 512 [0: 0]
  t0: 1: 512 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7faecac574
  t*: 1: 661636 [0: 0]
  t0: 1: 661636 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7faedd277c
  t*: 1: 8 [0: 0]
  t0: 1: 8 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7faed41198
  t*: 2: 164677 [0: 0]
  t0: 2: 164677 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7faed42da4
  t*: 1: 330638 [0: 0]
  t0: 1: 330638 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fafd33ca8
  t*: 2: 11954 [0: 0]
  t0: 2: 11954 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x5673bc 0x4eef9c 0x4e1f64 0x513014 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 97907 [0: 0]
  t0: 1: 97907 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x53b5c4 0x55f0b0 0x4ca080 0x47b178 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 8192 [0: 0]
  t0: 1: 8192 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fb596d0cc 0x7fb5c37d4c 0x7fb5988620 0x7fb59891f8 0x7fb598bde8 0x7fb5985dfc 0x7fb59860f0 0x47b688 0x4769e0 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 65611 [0: 0]
  t0: 1: 65611 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fb596d0cc 0x7fb5c37d64 0x7fb5988620 0x7fb59891f8 0x7fb598bde8 0x7fb5985dfc 0x7fb59860f0 0x47b688 0x4769e0 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 65611 [0: 0]
  t0: 1: 65611 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7fb596d0cc 0x7fb5c37da0 0x7fb5988620 0x7fb59891f8 0x7fb598bde8 0x7fb5985dfc 0x7fb59860f0 0x47b688 0x4769e0 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 65611 [0: 0]
  t0: 1: 65611 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x5673d0 0x4eef9c 0x4e1f64 0x513014 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 2: 388000 [0: 0]
  t0: 2: 388000 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x51a5e0 0x52b1e4 0x5309fc 0x53d42c 0x627dc0 0x4add8c 0x4764fc 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 4194308 [0: 0]
  t0: 1: 4194308 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x5673e4 0x4eef9c 0x4e1f64 0x513014 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 2: 388000 [0: 0]
  t0: 2: 388000 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5c95628 0x7faedbd3e4
  t*: 1: 225995 [0: 0]
  t0: 1: 225995 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5d09f54 0x7fb5d0a0c8 0x7faed3b6c4
  t*: 2: 164677 [0: 0]
  t0: 1: 82338 [0: 0]
  t3: 1: 82338 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c93b80 0x7fb5d09f54 0x7fb5d0a0c8 0x54bde8 0x54a7c8 0x4d53fc 0x513180 0x47b148 0x47652c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 12582912 [0: 0]
  t0: 1: 12582912 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c9418c 0x7fb5c95628 0x7fb57a4944 0x7fb5f699b4 0x7fb5f80f78
  t*: 1: 82338 [0: 0]
  t0: 1: 82338 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c9ec90 0x617e38 0x542768 0x4afa34 0x618ce8 0x476b7c 0x7fb5481fcc 0x7fb54820a8 0x47ab70
  t*: 1: 65611 [0: 0]
  t0: 1: 65611 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x563e20 0x4f5414 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 5: 1039333 [0: 0]
  t3: 5: 1039333 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x563e20 0x4f55a0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 4: 531792 [0: 0]
  t3: 4: 531792 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x563e20 0x4f16b4 0x4e2508 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 2: 227959 [0: 0]
  t3: 2: 227959 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x563e20 0x4f50e0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 6: 683878 [0: 0]
  t3: 6: 683878 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x563e20 0x4f43e8 0x4e2540 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 3: 341939 [0: 0]
  t3: 3: 341939 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x563e20 0x4f45f4 0x4e2524 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 1: 113980 [0: 0]
  t3: 1: 113980 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x564b64 0x565260 0x4fc4d0 0x4fd020 0x4e4b74 0x7fb54e0d34 0x7fb554c18c
  t*: 1: 113980 [0: 0]
  t3: 1: 113980 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x5633a8 0x4f5414 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 19: 4814936 [0: 0]
  t3: 19: 4814936 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fa8 0x5633a8 0x4f50e0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 2: 451990 [0: 0]
  t3: 2: 451990 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x563e20 0x4f5414 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 5: 1970845 [0: 0]
  t3: 5: 1970845 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x563e20 0x4f55a0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 4: 1076334 [0: 0]
  t3: 4: 1076334 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x563e20 0x4f16b4 0x4e2508 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 2: 451990 [0: 0]
  t3: 2: 451990 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x563e20 0x4f50e0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 15: 3389928 [0: 0]
  t3: 15: 3389928 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x563e20 0x4f43e8 0x4e2540 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 3: 677986 [0: 0]
  t3: 3: 677986 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x563e20 0x4f45f4 0x4e2524 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 3: 677986 [0: 0]
  t3: 3: 677986 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x5633a8 0x4f5414 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 36: 19556783 [0: 0]
  t3: 36: 19556783 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x5633a8 0x4f16b4 0x4e2508 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 1: 225995 [0: 0]
  t3: 1: 225995 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x5633a8 0x4f50e0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 4: 1811755 [0: 0]
  t3: 4: 1811755 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x563e20 0x4f5414 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 5: 2454642 [0: 0]
  t3: 5: 2454642 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x563e20 0x4f55a0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 4: 1076334 [0: 0]
  t3: 4: 1076334 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x563e20 0x4f16b4 0x4e2508 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 6: 1355971 [0: 0]
  t3: 6: 1355971 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x563e20 0x4f50e0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 21: 4745899 [0: 0]
  t3: 21: 4745899 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x563e20 0x4f43e8 0x4e2540 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 2: 451990 [0: 0]
  t3: 2: 451990 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x563e20 0x4f45f4 0x4e2524 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 3: 677986 [0: 0]
  t3: 3: 677986 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x56473c 0x4f74d8 0x4f7c0c 0x4fc844 0x4fd020 0x4e4b74 0x7fb54e0d34 0x7fb554c18c
  t*: 2: 451990 [0: 0]
  t3: 2: 451990 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x5633a8 0x4f5414 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 34: 17685727 [0: 0]
  t3: 34: 17685727 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x5633a8 0x4f50e0 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 4: 1522884 [0: 0]
  t3: 4: 1522884 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x5652f4 0x4f5748 0x4fbe98 0x4fd020 0x4e4b74 0x7fb54e0d34 0x7fb554c18c
  t*: 1: 225995 [0: 0]
  t3: 1: 225995 [0: 0]

 t何とかで出ているのはおそらくメモリサイズだろう。とりあえず多そうなのは、以下。

@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fc0 0x5633a8 0x4f5414 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 36: 19556783 [0: 0]
  t3: 36: 19556783 [0: 0]
@ 0x7fb5cfaa70 0x7fb5cfb2f8 0x7fb5cedcf4 0x7fb5c90ee4 0x7fb5c9e820 0x562fd8 0x5633a8 0x4f5414 0x4e24d0 0x4e4b50 0x7fb54e0d34 0x7fb554c18c
  t*: 34: 17685727 [0: 0]
  t3: 34: 17685727 [0: 0]

16進数はおそらくプログラムの位置だろう。addr2lineで見てみる。

aarch64-rocknix-linux-gnueabi-addr2line -e src/retro_arena/yabasanshiroYglGetProgram -f
yabause/src/ygles.c:2170
YglTriangleGrowShading_in
yabause/src/ygles.c:2290
VIDOGLVdp1DistortedSpriteDraw
yabause/src/vidogl.c:5384
Vdp1DrawCommands
yabause/src/vdp1.cpp:547
VdpProc
yabause/src/vdp2.cpp:1204

YglGetProgram
yabause/src/ygles.c:2171 (discriminator 1)
YglTriangleGrowShading_in
yabause/src/ygles.c:2290
VIDOGLVdp1DistortedSpriteDraw
yabause/src/vidogl.c:5384
Vdp1DrawCommands
yabause/src/vdp1.cpp:547
vdp2VBlankOUT
yabause/src/vdp2.cpp:1204

ygles.c:2170は以下のあたり

   if ((program->currentQuad + YGL_MAX_NEED_BUFFER) >= program->maxQuad) {
     program->maxQuad += YGL_MAX_NEED_BUFFER*32;
    program->quads = (float *)realloc(program->quads, program->maxQuad * sizeof(float));
      program->textcoords = (float *) realloc(program->textcoords, program->maxQuad * sizeof(float) * 2);
      program->vertexAttribute = (float *) realloc(program->vertexAttribute, program->maxQuad * sizeof(float)*2);
    YglCacheReset(_Ygl->texture_manager);
   }

currentQuadが増えたらメモリを取り直している。なにかで増えたら増えていく模様。

なんとなく原因は分かったが、どうやって直せばいいのか?どういう作りなのか理解しないと直せなそう。 

とりあえずここまで。 

追記:

上記を無理やり開放するようにして動かしてもメモリが増える現象は変わらなかった。currentQuadは毎回0にされており、無限に増えていくわけではなさそう。どうやらテクスチャの最大必要なところまで拡大する処理のように見える。

ピークを引きずっているわけなので、いつまでもそれだけ確保し続けるのもちょっと困りものだが、とりあえず今回の原因ではなさそう。ここ以外でメモリ消費で大きいものを探すと以下だった。

@ 0x7f9b7faa70 0x7f9b7fb2f8 0x7f9b7edcf4 0x7f9b793b80 0x7f9b809f54 0x7f9b80a0c8 0x54be08 0x54a7e8 0x4d53fc 0x5131a0 0x47b148 0x47652c 0x7f9af81fcc 0x7f9af820a8 0x47ab70
  t*: 1: 12582912 [0: 0]
  t0: 1: 12582912 [0: 0] 

で、以下

_ZNSt10_HashtableIjSt4pairIKjiESaIS2_ENSt8__detail10_Select1stESt8equal_toIjESt4hashIjENS4_18_Mod_range_hashingENS4_20_Default_ranged_hashENS4_20_Prime_rehash_policyENS4_17_Hashtable_traitsILb0ELb0ELb1EEEEC4Ev
toolchain/aarch64-rocknix-linux-gnueabi/include/c++/14.2.0/bits/hashtable.h:539 (discriminator 2)
_ZN10DynarecSh210SetContextEP10SH2_struct
yabause/src/sh2_dynarec_devmiyax/DynarecSh2.h:320
SH2Reset
yabause/src/sh2core.c:180 (discriminator 1)
YabauseStopSlave
yabause/src/yabause.c:966
_Z11yabauseinitv
yabause/src/retro_arena/main.cpp:272
main
yabause/src/retro_arena/main.cpp:440 (discriminator 1)

ダイナミックリコンパイルのあたり?っぽい。OpenGL関係でリークしているのかと思って探し回っていたが予想外。

うーん。 確保されてても解放されてて問題ないのだろうか。t0とかの意味が分からない。

解決→

続:中華linuxゲーム端末Anbernic 353PSでセガサターン

前回何とかAdvancedWorldWarを許容範囲で動かすことができるようになったが、しばらく動かしていると死ぬ問題が発生した。

カーネルログを見るとOOM-killerで殺されているように見える。

ps をwhileで回しながら動かしてみると、画面が切り替わるたびにメモリが増えていき減ることがない模様。そして限界を超えると殺される。 

メモリリークの可能性がある。が、どうやって調べるか。

valgrindは動かなかった。ld.soにデバッグ情報がないため。イメージ丸ごとビルドはできそうだが、現状途中で止まる。 

あとはmallocをフックするやつを作るか、探してくるか。それで調べたところによるとglibc mallocはいけてないらしい。もしかしたらjemallocを使えば解決するのかも。

うーん。めんどくさい。

jemallocクロスコンパイル

また何度かこけるかと思ったが、驚くほどすんなりとクロスコンパイルできた。

https://github.com/jemalloc/jemalloc/tree/master

からとってくる。

yabasanshiroのビルドのログから、 ツールチェーンの場所が分かるので、パスを通し

./configure --host=aarch64-rocknix-linux-gnueabi
make

 で完了。libにできたライブラリをコピーする。

RG353PS上で

LD_PRELOAD=/tmp/libjemalloc.so.2 ldd /tmp/yabasanshiro

で見ると、jemallocが使われそうな感じに見える。

とりあえずこれで実行してみたが、メモリリークっぽい現象は変わらなかった。残念。

起動してタイトル画面あたり。メモリ300MB?(メモリ使用率30%くらい)

root        3363  201 29.9 625348 299948 pts/0   Rl+  00:52   1:07
root        3363  202 30.0 629148 300548 pts/0   Rl+  00:52   1:10
root        3363  202 29.9 629148 300280 pts/0   Rl+  00:52   1:12
root        3363  203 29.9 629180 300376 pts/0   Rl+  00:52   1:14
root        3363  204 29.9 629180 300416 pts/0   Rl+  00:52   1:17

戦闘を何回か行ったとき。メモリ700MB?(メモリ使用率70%くらい)戦闘するごとに20Mくらい増えてそう。800MB超えるといつ殺されてもおかしくない感じになる。

OpenGLの何かを作りっぱなしなのではと思ったが、一応フリーはされてそう。

root        3363  222 66.0 1080976 662092 pts/0  Rl+  00:52   7:15
root        3363  222 66.1 1081588 662728 pts/0  Rl+  00:52   7:17
root        3363  222 67.7 1098036 678596 pts/0  Rl+  00:52   7:20
root        3363  222 68.4 1114484 685876 pts/0  Rl+  00:52   7:22
root        3363  222 69.3 1114612 694828 pts/0  Rl+  00:52   7:24
root        3363  222 69.3 1114996 694768 pts/0  Rl+  00:52   7:27
root        3363  222 69.3 1114996 694856 pts/0  Rl+  00:52   7:29
root        3363  222 69.3 1114996 694920 pts/0  Rl+  00:52   7:31
root        3363  222 69.3 1114996 695044 pts/0  Rl+  00:52   7:34
root        3363  222 69.3 1114996 694704 pts/0  Sl+  00:52   7:36
root        3363  222 69.3 1114996 694776 pts/0  Rl+  00:52   7:39
root        3363  222 69.6 1115252 697852 pts/0  Sl+  00:52   7:41

さて、どうするか。。。 →次回