0%

忘れそうなのでメモ。

実作業

  1. wave125i のピストン オーバーサイズ 0.25 が売っている。

  2. スーパーカブ C125 2019 の資料 を見ると、1 は実は C125(JA48) のピストンと同じ型番。

  3. JUN にシリンダーとピストンを送って、ピストンに合わせてボーリングしてもらう。

  4. 以下の書類を作成

    • 改造概要等説明書
    • 作業工程画像
    • 仕様変更に係る誓約書
    • 車両種別変更申請書
  5. 運輸支局へ行って提出し、軽二輪ナンバーを取得

排気量計算方法

ja48ノーマル:

1
2
π ÷ 4 × 52.4^2 × 57.9 ÷ 1000
= 124.86 cc

+0.25mm オーバーサイズピストン & シリンダーボーリング:

1
2
π ÷ 4 × 52.65^2 × 57.9 ÷ 1000
= 126.06 cc

思い出

武川 143cc ボアアップキット組み込み時の画像

武川 143cc ボアアップキット組み込み時の画像(後で 126cc にする方法が見つかり、126cc にした)

当時乗ってたリトルカブとスーパーカブ125

当時乗ってたリトルカブとスーパーカブ125。

Codex の左ペインに出るチャット履歴が、Azure OpenAI を使っている時と OpenAI / ChatGPT Plus を使っている時で分かれて見えることがあった。

最初は CODEX_HOME を分けているせいだと思っていたけど、実際には同じ C:\Users\noma3\.codex の中でも、左ペイン用の状態ファイルやセッションメタ情報の持ち方によって見え方が変わっていた。

この記事は、今回実際に確認して直した内容のメモ。

注意点として、ここで触っているファイルは Codex の内部状態なので、普通の設定変更として推奨されるものではない。やる場合は必ずバックアップを取ってから触る。

見ていたファイル

主に見ていたのはこのあたり。

1
2
3
4
C:\Users\noma3\.codex\session_index.jsonl
C:\Users\noma3\.codex\.codex-global-state.json
C:\Users\noma3\.codex\state_5.sqlite
C:\Users\noma3\.codex\sessions\...\*.jsonl

それぞれの役割は、おおむね次のように見えた。

  • session_index.jsonl: チャット一覧用の簡易インデックス
  • .codex-global-state.json: 左ペインのプロジェクトや projectless なスレッドの状態
  • state_5.sqlite: アプリ側が使うスレッド一覧の SQLite
  • sessions\...\*.jsonl: 実際の会話ログ本体。先頭に session_meta がある

最初に起きていたこと

左ペインの「チャット」に、直前に作業したはずのスレッドが出てこなかった。

対象のスレッドは例えばこれ。

1
2
019e14dd-dac9-78d3-84f4-60931e9ed497
切替時ログ差分を修正

session_index.jsonlstate_5.sqlite を見ると存在はしていた。

しかし実際の UI には出ていなかった。

原因1: session_index.jsonl が JSONL ではなくなっていた

session_index.jsonl は JSON Lines 形式なので、本来は1レコードごとに実際の改行が入る必要がある。

ところがファイルを見ると、実改行ではなく文字としての \n でつながった1行になっていた。

確認した時はこんな状態だった。

1
2
real LF count 1
literal backslash-n count 165

これだと、左ペイン側が正しくパースできず、最近の履歴が落ちる可能性がある。

ただし単純に全部の \n を本物の改行に置換してはいけない。

thread_name の中にも正当な \n が入っているため、壊してしまう。

今回直した時は、レコード区切りになっている }\n{ だけを本物の改行にした。

結果として、48件のレコードを持つ普通の JSONL に戻した。

1
2
real LF count 48
literal separator count 0

原因2: projectless-thread-ids に入っていなかった

Codex の左ペインには「プロジェクト」と「チャット」がある。

プロジェクトに属さないチャットとして表示されるには、.codex-global-state.jsonprojectless-thread-ids が関係しているようだった。

今回出したかったスレッドはここに入っていなかった。

そのため、まず対象スレッドを projectless-thread-ids に追加した。

1
2
3
4
"projectless-thread-ids": [
"019e14f3-41ec-72e0-9664-d9628a1d28dd",
"019e14dd-dac9-78d3-84f4-60931e9ed497"
]

ただし、これだけではまだ表示されなかった。

原因3: cwd が消したプロジェクトを指していた

決定打は cwd だった。

切替時ログ差分を修正 のスレッドは、state_5.sqlitesessions\...\*.jsonl の先頭 session_meta の両方で、まだこのパスを指していた。

1
D:\OneDrive\03_tools\03_obs\obs-studio

このプロジェクトを UI 上で手動削除したため、そのスレッドは「プロジェクトにも出ないし、チャットにも出ない」状態になっていたように見えた。

そこで、現在表示されている projectless なチャットと同じ作業ディレクトリへ寄せた。

1
C:\Users\noma3\Documents\Codex\2026-05-11\codex-codex

具体的には、state_5.sqlitethreads.cwd と、セッションファイル先頭の session_meta.payload.cwd を両方変更した。

state_5.sqlite 側はこのような状態になった。

1
2
3
4
5
id: 019e14dd-dac9-78d3-84f4-60931e9ed497
title: 切替時ログ差分を修正
cwd: \\?\C:\Users\noma3\Documents\Codex\2026-05-11\codex-codex
model_provider: openai
archived: 0

sessions 側の session_meta も同じように寄せた。

1
2
session cwd: C:\Users\noma3\Documents\Codex\2026-05-11\codex-codex
session provider: openai

さらに、thread-workspace-root-hints に古いプロジェクト紐付けが残らないよう、対象スレッドの hint は削除した。

バックアップ

触る前にバックアップを残した。

今回の作業中に作ったバックアップ名はだいたいこのような形。

1
2
*.before-fix-hidden-recent-thread-20260511-115709.bak
*.before-show-hidden-thread-20260511-120040.bak

内部状態を直接編集するなら、最低でも以下はバックアップしておいたほうがよさそう。

1
2
3
4
C:\Users\noma3\.codex\session_index.jsonl
C:\Users\noma3\.codex\.codex-global-state.json
C:\Users\noma3\.codex\state_5.sqlite
対象の C:\Users\noma3\.codex\sessions\...\*.jsonl

結果

修正後、Codex の左ペインに以下のように表示されるようになった。

1
2
codexの.codex変更を再確認
切替時ログ差分を修正

今回のポイントは、session_index.jsonl だけを直しても足りなかったこと。

Codex は複数のファイルを見て左ペインを作っているようで、少なくとも次の整合性が必要だった。

  • session_index.jsonl が正しい JSONL である
  • .codex-global-state.jsonprojectless-thread-ids に対象スレッドが入っている
  • .codex-global-state.jsonthread-workspace-root-hints に古いプロジェクト紐付けが残っていない
  • state_5.sqlitethreads.cwd が消したプロジェクトを指していない
  • sessions\...\*.jsonlsession_meta.payload.cwd も同じ方向に直っている

デプロイについて

このブログは古い Hexo 環境で動かしているので、生成や deploy はいつもの WSL 側の Node 8 環境でやる。

過去メモにもある通り、Node 14 などに上げると hexo deploy が失敗することがあったので、ここでは Markdown を追加するところまでにしておく。

背景

ラズパイ5、動作は非常にいいんですが実際に温度を見たらファンレス運用はちょっと厳しそうな気がしたのでファンを購入しました。
過去のラズパイでは熱なんか気にならなかったんですけどね。。。
普段から PC の温度は見る様にしてますが、個人的には厳しめには見てないです。
PC組み上げ後、明らかに異常な温度になってる事もあり、それは回避しようという発想になります。

温度を見るときの基準

  1. スロットリングが発生する温度に到達していないかどうか
  2. 他のユーザーと比べてアイドルの温度が高くないか

1 はマストです。
2 以降は情報が見つからない場合もあるので優先度低

例えば Ryzen 3950X はアイドル時の周波数と温度が高くなりすぎるため、コアブーストを切って 3400 Mhz で運用したりとかしてます。
(Ryzen 5950X ではこの問題が解決されている様なので、5950X がうらやましい)

各ラズパイで観測した温度

OS : Raspberry Pi OS (bookworm)

複数回コマンド実行して、外れ値ではなさそうだな、という事だけ見てます。。

Raspberry Pi Zero W/H (ヒートシンクのみ)

ケースについてきたヒートシンクをつけています

Homebridge 起動中

1
2
$ vcgencmd measure_temp
temp=45.5'C

Raspberry Pi 2

何もつけてません。

特になにもさせてない時

1
2
$ vcgencmd measure_temp
temp=45.5'C

tailscale の exit node にして速度測定中

1
2
$ vcgencmd measure_temp
temp=53.0'C

Raspberry Pi 3 (ヒートシンクつき)

ヒートシンクはプラスチックケースについてきた黒いやつ

何もさせてない時

1
2
$ vcgencmd measure_temp
temp=53.7'C

tailscale の exit node にして速度測定中

1
2
$ vcgencmd measure_temp
temp=64.5'C

Raspberry Pi 4 (ケースファンつき)

たまたま買ったこのケースについてきたファンで、アクティブクーラーではないです。かなり静かで作業用のデスクにおいといても気にならない
アクティブクーラーだと OS や ファームからコントロールできない特殊な環境では爆音になるので、
コントロールのしようがないこういうファンの方がいいかも。

何もさせてない時

1
2
$ vcgencmd measure_temp
temp=38.9'C

tailscale の exit node にして速度測定中

1
2
$ vcgencmd measure_temp
temp=48.7'C

Raspberry Pi 5 (ヒートシンクのみ)

このケースとこれについてきたヒートシンク(銅)を使用
一応電源も書いておきます。ラズパイ5を全力で動作させられる 5V 5A 電源です。5V 5A PD なんて他の用途で使わないので家にはありませんでした。
ただ Raspberry Pi OS を起動するだけでアッツいので今までのとは違う事がすぐにわかります。
ギリギリ手で持てるかな、くらいの熱さ

何もしてない時

ファン装着後に付け替えが面倒でしていません。75’Cくらいだったかと。

Minecraft Server 起動中

ファン装着後に付け替えが面倒でしていません。83-90’Cくらいでした。
90’C 到達時はサーマルスロットリングが発生してるのでは?と思い、パフォーマンスに不満はありませんでしたがファン購入に至りました。

Raspberry Pi 5 (ファンつき)

このアクティブ クーラー を追加しました。

アクティブクーラーだとファンの回転速度が温度によって自動変速します。
ケースと同時についてきた NVMe HAT とも同時に使えていて満足
ただ、ドライバ対応が微妙な Windows を起動した時は最高速度で回転しつづけていて、非常にうるさい。
自作PC経験上の推測・・・ファン自体が小さい事、最大回転数が高い事、このファンと一体化してるヒートシンクの距離がファンと近い事全てがうるさくなる原因だと思う。
ただし、NVMe ハットがケース内のスペースをとっているので、他の選択肢が見当たるわけでもない

何もしてない時

ファンの回転数に関係する pwm1 の値は 75

1
2
$ cat /sys/devices/platform/cooling_fan/hwmon/hwmon3/pwm1
75
1
2
$ vcgencmd measure_temp
temp=56.0'C

Miecraft Server 起動中

ファンの回転数に関係する pwm1 の値は 125

1
2
$ cat /sys/devices/platform/cooling_fan/hwmon/hwmon3/pwm1
125
1
2
$ vcgencmd measure_temp
temp=63.1'C

Orange Pi 5 (ファンつき)

ケースとヒートシンクはこれにしました。安いしアクティブクーラーじゃないの助かる

os は ubuntu 22 jammy、以下コマンドで温度を確認しました。

1
watch -n 2 sensors

何もしてない時

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
32
33
Every 2.0s: sensors                                                                                                                                                                               orangepi5plus-ssd: Mon May 27 23:05:13 2024
npu_thermal-virtual-0
Adapter: Virtual device
temp1: +32.4°C (crit = +115.0°C)

center_thermal-virtual-0
Adapter: Virtual device
temp1: +32.4°C (crit = +115.0°C)

bigcore1_thermal-virtual-0
Adapter: Virtual device
temp1: +32.4°C (crit = +115.0°C)

soc_thermal-virtual-0
Adapter: Virtual device
temp1: +32.4°C (crit = +115.0°C)

tcpm_source_psy_6_0022-i2c-6-22
Adapter: rk3x-i2c
in0: 0.00 V (min = +0.00 V, max = +0.00 V)
curr1: 0.00 A (max = +0.00 A)

gpu_thermal-virtual-0
Adapter: Virtual device
temp1: +32.4°C (crit = +115.0°C)

littlecore_thermal-virtual-0
Adapter: Virtual device
temp1: +32.4°C (crit = +115.0°C)

bigcore0_thermal-virtual-0
Adapter: Virtual device
temp1: +32.4°C (crit = +115.0°C)

気づき

ラズパイ5のアクティブクーラーの回転速度は 50ずつ増加・減少される様です。75, 125, 175 等
これは pwm1 の内容であって実際の回転速度ではない事に注意
pwm1 は 255 まで指定できる様で、これが購入したファンの回転数 8000 だと思います。

アクティブクーラーの騒音対策

ラズパイ5 のアクティブクーラーの騒音について、温度が高くなるとかなりの速度でファンが回転し、結果うるさくなります。
↓の様なパワー系の対処をして回避しています。
/etc/crontab に以下を記載して、1秒に1回ファンの回転数を指定し、静かな速度(110以下)で動作させています。
1秒毎なので自身の環境では 一瞬 125や175になるタイミングがありました。

1
@reboot root while true;do sleep 1;echo 75 | tee /sys/devices/platform/cooling_fan/hwmon/hwmon3/pwm1;done

しっかりやろうとすると、冷却マップの再構築と設定外出しために再コンパイルが必要になる様子、ここまではやらなくていいかな。

ラズパイで nvme を gen3 で認識させるかそうでないかで速度がどれくらい変わるのか確認のために使いました

コマンド

1
dd if=/dev/zero of=./test bs=1M count=10240 status=progress;rm test

10 GB 分のファイルをカレントディレクトリに書き込んで測定します。なので測定されるのはカレントディレクトリのディスクになります。

Windows の CrystalDiskMark で測定した時の SEQ1M の項目と大体同じ事をしてるのだろう、と思ってます。

ラズパイでの実行結果例

ラズパイでは /boot/firmware/config.txt の dtparam を nvme にするか、pciex1_gen=3 にするかで gen3 で認識するかどうかが変わるみたいです。

dtparam=nvme

1
2
3
4
5
$ dd if=/dev/zero of=./test bs=1M count=10240 status=progress;rm test
10480517120 bytes (10 GB, 9.8 GiB) copied, 23 s, 456 MB/s
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 23.484 s, 457 MB/s

dtparam=pciex1_gen=3

1
2
3
4
5
$ dd if=/dev/zero of=./test bs=1M count=10240 status=progress;rm test
10410262528 bytes (10 GB, 9.7 GiB) copied, 13 s, 801 MB/s
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 13.3776 s, 803 MB/s

ちゃんと早くなってる事が確認できました。

きっかけ

こんな方法で宅内のサーバーを公開していたんですが、
ふとポート開放可能な実家や別のところにラズパイでもおいて同じ事すれば VPS すら不要な事に気づきました。
ただその時に面倒になるのがブラウザ経由で行うルーター側のポートマッピング(ポートフォワーディング)設定、これを自宅内からアクセスできる様にする機能(Subnet routes)が tailscale にあったので試しました。

手順

OS: Raspbian 12 bookworm

  1. tailscale をインストール
1
2
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --accept-routes "x.x.x.x/24"
  1. tailscale の管理コンソールからも許可

tailscale に追加マシンの 3点リーダー > Edit route settings… > Subnet routes から↑で入力した IP レンジが選択できるので、選択

image

ルーターにアクセスできるか確認

実家にいるかの様に実家のルーターのIPを指定してアクセスしてみると、表示されました。

image

最近何かとサーバーを立てる事が多く、今まで購入するだけして眠ってたラズパイ達が活躍し始めてるので用途を紹介

用途

メモリが 1GB 以下の Raspberry Pi

zero 1.1 や 2 や 3 が該当

  • tailscale exit node や subnet routes 用 こんな用途
  • Home Bridge 用
    デスクトップ版 OS を使うとそれだけでメモリがカツカツになるので、可能であればサーバー版 OS を使う事をおすすめ

1GB モデルの場合
デスクトップ版の空きメモリ 200MB 程度
サーバー版の空きメモリ 700MB 程度

raspberry pi zero 購入リンク - amazon

raspberry pi zero 2 購入リンク - amazon

Raspberry Pi 4 Model B 4GB

  1. Discord bot (音楽・ラジオ再生) の常時稼働用、これは 3 でやってる時期もあった
  2. Minecraft Server も起動できるものの MOD 無しでも最初から少しモッサリする
  3. やったことないけど身近にやってる人がいた 地上波録画サーバ、Mirakurun や EPGStation を使う
  4. Nintendo Switch のコントローラ自作、4 で USB Gadget API が使える様になって可能になった。スプラトゥーン3をマウスでプレイ ジャイロコンバーター [NXIC] ただちょっとラグかったかな

Raspberry Pi 5 8GB

Minecraft Server + 工業系MOD 3-4人で結構快適

スペック的に難しかった事が色々試せそう

raspberry pi 5 購入リンク - amazon

強みと弱み

強み

消費電力が少ない

大きい PC をずっと起動しておくと電気代が気になるので、何か常時稼働したい時はラズパイでできないかどうか考える様になりました。

安い

まえはもっと安かった気がするけれども・・・
ナンバリングが上がる毎にスペックは大幅に上がってるので、基本的に値段以外の理由で古いのを買う理由はないと思う。

弱み

arm プロセッサに対応してないツールは使えない

例えば立てたいサーバーやアプリケーションに入れたライブラリが arm に対応していない場合、起動すらできないか、起動してもうまく動かない。
ただ arm に対応しているツールやライブラリは増えてきてるし、今後に期待。
また、box86 の様な x86 向けのツールを arm で動作させる エミュレータはある様子。

大容量なメモリのモデルがない

2024/5/12 時点だとラズパイ5が最新で最大メモリは 8GB みたい。
他の SBC の Rock5 だと 32GB モデルまであるみたいで、他のに目移り中。

電プチするとデータが破損する事がある

電源ケーブルぶっこぬきで電源をきるとデータが破損する事があります。
データの破損の仕方にもよりますが、何度か起動しなくなった経験があります。
すぐ壊れてしまうイメージを持ちそうですが、実際に↓の様な記事も多数あり、経験上も読み取り専用で運用していればその様な問題はおきませんでした。

Raspberry Piは本当に壊れやすいのか
Raspberry Pi OSのrootfs ROM 化 ― RAMディスク化しつつ、好きなパッケージを後から追加する方法
Raspberry PiのrootFSをROM化してSD Cardの破損を防ぐメモ

電源ケーブルを抜いて電源を落とす様な運用がしたい場合、最低でも boot パーティションの読み取り専用は必要そうです。

きっかけ

今の自宅の回線がマンション共用の物なので、ルーターがいじれません。
ルーターがいじれないという事はインターネットからのアクセスのポートマッピング(ポート開放)ができないという事です。
ただ、回線の速度や安定感はあるので追加で回線を契約するほどのコストをかけたくないですし、
今までは宅内サーバーをインターネットに公開するために ngrok (HTTPやTCP) や localtonet (UDP) を利用して公開していましたが、
localtonet は 日本サーバーが無いために ping 値が高くなる等、歯がゆい状況でした。

そこで他に方法ないかなと探していたら見つけました。
インターネットからのアクセスを受けた マシン(VPS) から tailscale ネットワーク内のマシンにポートフォワーディングして、
VPS のマシンが実質ルーター代わりになるという方法

例えば yayoi_8128 さんのこんな方法

ポートフォワーディングについては、uredir を使わずに nginx や iptables でフォワーディングの設定をする、でもよかったんですが、以下の理由で uredir を採用してます。

  • uredir のコマンドが覚えやすかった (uredir :8211 フォワーディング先IP:8211)、redir と同じ
  • iptables のコマンドを覚えるのがむずかしかった
  • nginx を使用してフォワーディングさせて比較しても体感できる差がなかった
1
2
2025/05/27 追記
uredir が arm 非対応なため、ラズパイ等の SBC を活用し始めた段階でまた結局 iptables を使う必要が出てきました。

各 VPSで パルワールドサーバーの UDP フォワーディング を試した結果、安定性や速度が異なったので感想とともに記録を残します。

VPS マシン側の構築

OS: ubuntu 22.04 server

  1. tailscale をインストール
1
2
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
  1. VPS 管理コンソールにて ポート 8211 (palworld server) の inbound を許可

  2. uredir や redir 等で、tailscale 内のマシンにフォワーディングする様設定

UDP

1
uredir :8211 サーバーマシンのtailscale内IP:8211

TCP

1
redir :25565 サーバーマシンのtailscale内IP:25565

2024/05/12 追記
 VPS マシンの exitnode の有効化とその直後の IP フォワーディング許可設定は不要だったので削除しました。

サーバーマシン側の構築

  1. tailscale をインストール
1
2
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
  1. サーバーを起動

注意点

その時たまたま VPS プロバイダ側で障害があったとか、一時的な問題が起きていた可能性もあるのであくまで参考程度にしてください。

条件もきっちり揃えられていません。

各 VPS で試してみた

Azure VM

テストに利用したスペック

  • コア数とメモリ: 1コア1GB
  • ネットワーク: 100Mbps
  • 金額: 1271円/月 以上

image

速度

速度は出ているけど、レイテンシの値が高い。
何故かコロンビアやインドのサーバーを利用してました。

image

念のため別のサイトでも試してみる。

image

Ping も Jitter も良好

パルワールドを遊んでみる

ロードがなかなか終わらない・・・

image

10分程度待てば接続はされた。
とはいえ建築物の表示にもかなりの時間がかかるため遊ぶのはきびしそう

image

image

その他気になった事

tailscale up したときに見覚えのないログが出た、何か改善の余地あり?

Warning: UDP GRO forwarding is suboptimally configured on eth0, UDP forwarding throughput capability will increase with a configuration change.

この方法で最適化されるらしいですが、残念ながら体感できず。。。

1
2
NETDEV=$(ip route show 0/0 | cut -f5 -d' ')
sudo ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list off

サーバーがマインクラフトだとしてもサーバーに繋がるまでに時間がかかりました。なんでだろう

Sakura VPS

テストに利用したスペック

  • コア数とメモリ: 2コア1GB
  • ネットワーク: 100Mbps
  • 金額: 990円/月

image

速度

image

パルワールドを遊んでみる

tailscale ネットワークだけで接続するのと体感は変わらず快適

image

WebArena Indigo

テストに利用したスペック

  • コア数とメモリ: 1コア1GB
  • ネットワーク: 100Mbps
  • 金額: 449円/月

image

安くてよさそう

速度

ちょっと遅いかな

image

パルワールドを遊んでみる

なんだかパケロスが激しい

接続してから数十秒の間、建築物のオブジェクトが読み込まれず、これで遊ぶのは厳しそう、と感じました。

image

Conoha VPS

テストに利用したスペック

  • コア数とメモリ: 2コア1GB
  • ネットワーク: 100Mbps(インターネット)
  • 金額: 1064円/月(時間課金)

image

速度

image

パルワールドを遊んでみる

ロード時間がそこそこ長くかかった

建築物等がなかなか読み込まれず、表示されるまでに5分くらいかかった

Azure VM を少しマシにした様なレベルで、これで遊ぶのは厳しい

image

AWS Lightsail

テストに利用したスペック

  • コア数とメモリ: 2コア1GB
  • ネットワーク: 1Gbps?
  • 金額: $5/月

image

速度

シアトル経由になってしまった
image

別のサイトで測るとジッターもpingも良好
image

パルワールドを遊んでみる

体感は Sakura と変わらない
image

その他

採用されたのは・・・

さくら VPS でした。安定感がどエライです。
LIghtsail も快適だったので、こっちへの乗り換えもアリ

なんで安定感に差がでるのか

わからないです。知ってる人いたら教えてほしいです。

他の VPS について

他に試したい VPS もいくつかあるので試したら追記していきます。

きっかけ

サーバーにある Palworld のデータはローカルプレイで使える様に移動できるのか疑問だったので調べてわかった事をメモ。

ikuma0366 さんの記事を見て、この情報をベースにセーブデータを覗いてみました。

セーブデータの場所

専用サーバーで遊んだ場合

専用サーバー全体のセーブデータとプレイヤー毎のセーブデータがわかれている。
どちらもサーバー側で保存されているので、プレイヤー側でセーブデータを探しても見つからない。

専用サーバーのセーブデータ

1
PalServer/Pal/Saved/SaveGames/0/<サーバーID>/Level.sav

内容例

情報量が多く json 化すると 数GBの容量になる、中身を覗いてみて、わかった事だけメモ。

  • 接続した事のあるプレイヤー情報
  • 捕獲された後のパル情報
  • 各プレイヤーの最後にいた位置
  • 他にも沢山ありすぎてワロタ
  • その他、プレイヤー毎のセーブデータ以外の情報全て

プレイヤー毎のセーブデータ

1
PalServer/Pal/Saved/SaveGames/0/<サーバーID>/Players/<プレイヤーID※先頭8文字>以降は0.sav
  • ファイル名の例
    1
    813399F0000000000000000000000000.sav

813399F0 という8文字目までを見れば ok

内容例

こっちは情報量が比較的少なく、json 化しても 数KBの容量、中身を覗いてみて、わかった事だけメモ

  • キャラメイクの設定値
  • レシピ アンロック情報(アンロックした事があるレシピのみ記載)
  • ボスの討伐状況(倒した事があるパルのみ記載)
  • パルを捕まえた数(捕まえた事があるパルのみ記載なので全て1以上)
  • 手記の入手状況(入手した事がある手記のみ記載)

このファイル内にプレイヤー名の記載はないため Level.sav から確認するのが確実

コンプリートしたデータを一つ用意できればコンプリートしたデータを他のプレイヤーにコピーする事はできそう

ソロで遊んだ場合

以下のパスにセーブデータが保存されている様ですが、この記事では、この中のセーブデータについては触れてないです。

1
C:\Users\noma3\AppData\Local\Pal\Saved\SaveGames\<ワールドのID>

.sav の中身の見方

.sav は Unreal Engine のゲームで使われるセーブデータではあるものの、Unreal Engine 経由でないと直接中身を見る事が出来ないので、

有志が作成したツール(convert.py)を使って、json 化する必要がある

また、Unreal Engine のゲームは .json をセーブデータとして扱わないので、もしセーブデータを書き換えて使いたいなら .sav に戻してやる必要がある。

このツールの動作には python 3.9 以上が必要との事、一応 3.12 でも動作した。

json 化の方法

1
convert.py "savファイルのパス" --to-json

.sav 化の方法

1
convert.py ".jsonファイルのパス" --from-json

おまけ

Level.sav.json からプレイヤーを探す正規表現

vim で使った正規表現なので サクラエディタ だと少し変わるかも。

1
IsPlayer": {\n.*\": true

これで接続したことのあるプレイヤー名を確認した。

筆者が管理してるサーバーのプレイヤーID.sav 対応表

ファイル名 ユーザー名
813399f0*.sav noma
65332aeb*.sav KOB
06d842d5*.sav sakura
e74926a0*.sav yocha-424
120f57b4*.sav pia24mo
e7574940*.sav にゃんごろげ
98e4c6ac*.sav せつこ
d3a7451e*.sav mavu33

必要になった経緯

ゲームサーバーを自宅で立てるとなると、外からでもそのサーバーにアクセスできる様にポート開放する必要がありますが、
引っ越しをしてからマンション共有の回線を使っているためにルーターの設定ができず、ポート開放できない環境なため別の方法を探しました。
ただ、回線の品質は特に悪くないので自分で回線を契約するのはちょっともったいない・・・と思い別の方法をとりました。
localtonet への課金もしてみましたが、複数のフォワーディングをしない限り無料枠で事足りそうな雰囲気

localtonet の使い方

localtonet に登録

とりあえず登録します。

token をコピー

ダッシュボードに表示される AuthToken をコピーしておく

image

tunnel を作成し起動しておく

My Tunnels > TCP - UDP から作成する

image

Protocol Type と Server, ローカルのポートを指定して Create
作成されたら Start もクリックしておく
image

サーバー側でやる事

localtonet をインストールして次のコマンドを実行

1
localtonet authtoken <token>

すると以下の様に tunnel が表示されれば OK
image

IP/Url に表示されたアドレスに接続できる様になっているはず。

ngrok じゃだめ?

ポートフォワーディングしてくれる有名なツールに ngrok がありますが、そちらは UDP のフォワーディングはできません。

その他所感

リージョンに日本がない・・・

どこのサーバーを経由するか選べますが、日本がありません。ngrok では勝手に日本サーバー使ってくれるけど・・・
中国を選んで使っていて以外とラグも感じないですが、日本サーバーが使えたらよかったな

2024/05/27 追記
日本が選べる様になってました!!
image

外部から見たポートの固定は有料でも無料でもできない

localtonet を起動する度に外部から見たポート番号が変わります。
なのでサーバーを複数人で利用している場合、 localtonet を再起動したあとは新しいポート番号の接続先を共有する必要が出てきます。
これは ngrok の有料プランだとできたとおもうので、ちょっとおしい

Arm 対応

最近ラズパイを活躍させようとしてるのでこれは非常にありがたい