saruboの書き溜め

いいこと書けないですけどこんな記事でよければ見ていってね

必要なデータの取得でプロセカがクラッシュする (落ちる) ときの対処

要点

  1. スマートフォンシャットダウンさせる
  2. スマートフォン起動させる
  3. 起動直後にプロセカを立ち上げる

これが上手くいったのは1ヶ月の間くらいだったので、期限が来る前に取りたいスクショを撮ったり、新しいスマホの購入を進めたりしておいた方がいい。

背景

プロセカの起動時に「必要なデータの取得」が挟まれることがあると思います。主にイベント開始日にこの様になります。

私は iPhone SE2 (現時点でiOS 17.7) を使っているのですが、「必要なデータの取得」が挟まれると高確率でアプリがクラッシュします。

4周年までは「必要なデータの取得」で2回アプリがクラッシュしてからなら正常に起動出来ていました。途中まで取得したデータのキャッシュでも残っていて上手く使われていたのでしょう。

しかし、4周年の更新からは「必要なデータの取得」でアプリが何度クラッシュしようが正常に起動出来ません。

あれこれ試したのですが、諦めて iOS 17.6 から iOS 17.7 のアップデートを行った直後、プロセカを起動してみたら「必要なデータの取得」が完了できました。その後起動後ストーリーで大量の Live2D 立ち絵が出て来てアプリがクラッシュしましたが……

ともかく、アップデートに伴って行うアクション (シャットダウン & 起動 & アプリの起動) が怪しそうなので、次に「必要なデータの取得」でアプリがクラッシュする日を待ち、このアクションを行いました。正常な起動が再現できたため記事にしました。ただ、いつ起動できなくなる日が来るのか分からずとても怖いです。

蛇足

私の iPhone SE2 上のプロセカではアプリのクラッシュが頻発しています。

  • 必要なデータの取得時
  • Live2D 立ち絵が大量に出て来たとき
  • ストーリーを複数話読むとき (特に Loading 後)
  • バーチャルライブが長時間かつ登場キャラが多いとき (特にステージなんかの Loading 後)
  • キャラクターアーカイブの多めの閲覧

似たようなものには起動直後の1回目のライブのプレイならカクツキやフリーズはありませんが、2回目以降は1秒から3秒程度のカクツキやフリーズがあります。

これらのことからメモリ関係の不具合なのかなと考えています。踏み込んで言えばアプリのクラッシュは Out Of Memory なんかのメモリ不足の状態かと。iPhone SE2 はメモリ 3 GB しかない (アプリで使えるメモリは1GBもないかも知れません) ですしね。ライブでのカクツキやフリーズは Full GC が裏で動いている気がしています。せめてライプ開始前に Full GC が動いて欲しい。まぁ予想でしかないですけど。

Live2D や 3D モデルのオブジェクトを読み込めば読み込む程、使用メモリが増大していって、アプリがクラッシュしているように見えるので、使用して使っていないオブジェクトはしっかり消し去って欲しいですね。Live2D や 3D モデルのオブジェクトは生存時間が長いだろうと思われるので、もし世代別GCのようなものが動いているならば、オブジェクトが old generation にあって中々消されないということがあってもおかしな話ではない気がします。 それでもアプリがクラッシュに至るのはおかしな話なのですが……

プロセカは今は亡き Craft Egg が絡んでいた関係上バンドリ派生のゲームだと思っているのですが、バンドリは半年ぶりの起動でも正常に起動するので、ソフトウェアの技術で解決できる問題なんだろうなぁと思っています。どうか SEGA とその協力会社の方々には頑張って欲しいです。

あ、あと「必要なデータの取得」、プログレスバーが欲しいですよね。なぜ無いのか。

追記

10/10

電源入れ直してもクラッシュして焦った。もう一度電源入れ直したらパス出来たけど。

11/08

騙し々々やって来たがついにどうにもならなくなった。おしまいです。あーあ。

iwdでIPv4に繋がらず、IPv6にしか繋がらなくなったときにすること

要点

  1. iwctlをshellから起動
  2. [iwd]# known-networks <ssid> forget を実行
  3. iwctlで再びconnect

詳細

環境はArch Linuxです。/etc/iwd/main.confは次のようになっていました。

[General]
EnableNetworkConfiguration=true

[Network]
NameResolvingService=systemd

PCをsleepして解除したら、iwdでIPv4に繋がらず、IPv6にしか繋がらなくなっていました。(そのとき立ち上げていた小っちゃいサーバーアプリが死んでたので気付いた)

https://askubuntu.com/a/1025045 で言われているようなことをiwdでするにはどうすればいいのか、調べていたら見つけたのが known-networks <ssid> forget でした。

また同じようなことが起こっても迷わないためにここに記します。

Scala の ArrayBuffer では init だけでなく dropRightInPlace を使うことも検討してみませんか?

主張

タイトル通り。ScalaArrayBuffer では init だけでなく dropRightInPlace を使うことも検討してみませんか?元の ArrayBuffer のデータを使わないという条件は付きますが dropRightInPlace の方が高速です。

val filled = ArrayBuffer.fill(1000000)(1)
assert(filled.init.length == 999999)
val filled = ArrayBuffer.fill(1000000)(1)
assert(filled.dropRightInPlace(1).length == 999999)

蛇足

Scalaを触っていると、List では ::、他のコレクションでも +:, :+ を使うことが多いです。その影響もあって head に対して tail, init に対して last を意識することも多いと思います。

そんなノリで foldLeft 中で ArrayBuffer から init を使っていたら、動かしてみたときになぜか遅くて頭を抱えてしまいました。

不思議に思っていたところ init がcopyを作成していることに気が付きました。気付いてしまえば当然ですよね。

Rust言語の Vecpop のように最後の要素をmutableに削除すればcopyを作成せずに高速に動作するはずなのですが、pop なんてmethodは見当たりませんでした。

頭を捻っていたところ、それっぽいmethodに trimEnd がありました。打ち込んでみると "use dropRightInPlace instead" と怒られました。 dropRightInPlace の実装を見てみると、こいつだぁ!となったので使用してみたところ、期待通りの速度が出ました。嬉しい。

自分としては pop みたいな、要素を 一つだけ 削除する高速なmethodが、mutableな ArrrayBuffer にはあればもっとサクッと書けたのにと思うばかりです。……実はあったりするんですかね?

Firefox 119 からフォントの設定が反映されないという方へ

要点

どれか一つを選ぶこと

  1. about:configにアクセスして privacy.fingerprintingProtection.overrides-FontVisibilityLangPack を書く
  2. "プライバシーとセキュリティ" の "強化型トラッキング防止機能" を "厳格" から "標準" にする
  3. セキュリティのためと諦める

詳細

firefox 119.0 beta の Release Notes

The visibility of fonts to websites has been restricted to system fonts and language pack fonts in ETP strict mode to mitigate font fingerprinting.

とあります。

言い換えると、フォントによるフィンガープリント軽減のため、強化型トラッキング防止機能を厳格にしていると、Windowsではゴシック体 (sans-serif) がフォントの設定に関わらずメイリオなどに制限されるわけです。

この問題を回避する極端な選択肢としては

  1. "プライバシーとセキュリティ" の "強化型トラッキング防止機能" を "厳格" から "標準" にする
  2. セキュリティのためと諦める

が考えられます。

強化型トラッキング防止機能をある程度厳格に保ちながら、Fontを自由に選べる方法もあり

  • about:configにアクセスして privacy.fingerprintingProtection.overrides-FontVisibilityLangPack を書く

がこれに該当します。

蛇足

最初、私はこの挙動がバグだと思いました。Firefoxをリフレッシュしたり、新規プロファイルを作成したりしたものの、アカウントを同期するとフォントの指定が効かなくなっていて、かなり困惑しました。様々な設定をON/OFFして、ようやく強化型トラッキング防止機能が悪いことが分かったので、思わず bugzilla に報告しました。Release Noteをちゃんと読むことをしないで。本当に良くない。顔から火が出る。

結果、セキュリティ的には正しいこと、問題を回避する特殊な設定を教えて頂きました。本当に助かりました。頭が上がらない。

実はGoogleで "-FontVisibilityLangPack" で調べるとRedditの記事がヒットして、先んじてこの問題の回避について書かれています。日本語では全然ヒットしない。