続・Steam Deckで日本語ロケール(非root)

前回の処理の後に以下を追加して、

mkdir -p ${MYLOCALE}/usr/share/
cp -r ${MYI18N} ${MYLOCALE}/usr/share/

起動オプションを以下に変更

I18NPATH=/home/deck/.locale/usr/share/i18n LOCPATH=/home/deck/.locale/usr/lib/locale LANG=ja_JP.UTF-8 %command%

で日本語出ました!

Steamクライアントからexeを起動すると、pressure-vesselという軽量版Flatpakを通して実行されます。
pressure-vesselは内部でpressure-vessel-locale-genを呼び出し、自前でロケールDBを生成します。
ここで生成したロケールDBのパスが環境変数LOCPATHに設定されます。
一見すると、上書きされてしまうLOCPATHを自分で指定する必要はなさそうですが、
pressure-vessel-locale-genが有効なロケールをチェックする際に呼び出すtry-setlocaleコマンドが成功する必要があるのです。
環境変数I18NPATHは、pressure-vessel-locale-genがロケールDBを生成する際にデフォルトの/usr/share/i18nの代わりに日本語ロケールを含むディレクトリを指定する必要があります。
これでpressure-vessel-locale-genに日本語ロケールを生成させることができます。
オプションが長いのでもっと短いディレクトリに置くか、シンボリックリンク作った方がよさげです。

Steam Deckで日本語ロケール(非root)

Protonで日本語が化けるソフトがあったので日本語ロケールを入れてみました。
Steam Deckには2022/12/25現在、デフォルトでは日本語ロケールは入っていませんし、ロケールデータベースがないだけでなく、そのソースファイル(/usr/share/i18n/locales/ja_JP)も入っていません。

https://gist.github.com/XargonWan/cc660daf92c224b7241cbf5a2bf12c47
ここにあるようにglibcを入れてしまうのが手っ取り早いのですが、Steam Deckはシステム更新のたびにシステムファイルが上書きされるらしく、毎回書き換えるのは面倒です。なによりシステムはそのままに一般ユーザーの権限だけでなんとかしたいところ。
パッケージ管理ツールpacmanの設定

を見ると、
https://steamdeck-packages.steamos.cloud/archlinux-mirror/core-main/os/x86_64/
glibcのバイナリパッケージがあるっぽいので手動でダウンロード。
https://blog.katio.net/page/79adac8c3d1701a40a15
を参考にこんな感じで。(バージョンは適宜読み替え)

#!/bin/sh
MYLOCALE=${HOME}/.locale
MYDOWNLOADS=/home/deck/Downloads
MYPKGNAME=glibc-2.36-6-x86_64
MYGLIBC=${MYDOWNLOADS}/${MYPKGNAME}
MYI18N=${MYGLIBC}/usr/share/i18n
wget -P ${MYDOWNLOADS} https://steamdeck-packages.steamos.cloud/archlinux-mirror/core-main/os/x86_64/${MYPKGNAME}.pkg.tar.zst
mkdir -p ${MYGLIBC}
tar xf ${MYGLIBC}.pkg.tar.zst -C ${MYGLIBC}
mkdir -p ${MYLOCALE}/usr/lib/locale
I18NPATH=${MYI18N} localedef -i ${MYI18N}/locales/ja_JP -c -f UTF-8 -A ${MYGLIBC}/usr/share/locale/locale.alias ${MYLOCALE}/usr/lib/locale/ja_JP.UTF-8
I18NPATH=${MYI18N} localedef -i ${MYI18N}/locales/ja_JP -c -f UTF-8 -A ${MYGLIBC}/usr/share/locale/locale.alias --add-to-archive --prefix ${MYLOCALE}

これで/home/deck/.locale/usr/lib/localeに日本語ロケールのDBが生成できます。

LOCPATH=/home/deck/.locale/usr/lib/locale LANG=ja_JP.UTF-8 %command%

これを非Steamゲームのプロパティでショートカットの起動オプションに設定すれば反映される、、、はずですが効いてないようです。
コマンドで、

LOCPATH=/home/deck/.locale/usr/lib/locale LANG=ja_JP.UTF-8 STEAM_COMPAT_CLIENT_INSTALL_PATH=/home/deck/.steam/steam STEAM_COMPAT_DATA_PATH=/home/deck/.steam/steam/steamapps/compatdata /home/deck/.steam/steam/steamapps/common/Proton\ 7.0/proton run /path/to/game.exe

を実行すれば日本語になるので、Steam上から実行するラッパーコマンドの中で上書きされているかもしれないです。
前述のgistによると起動オプションの欄は機能しているはずですが、バージョンアップで挙動が変わったのかも。

Visual Studio 2017 on Boost 1.63.0

Visual Studio 2017がリリースされたのでビルド試してみました。
フォルダ構成が変わったり、インストール先がレジストリに書き込まれなくなったり、いろいろ変わっていてBBv2のコンパイラ自動検出が上手く動きません。
とりあえず、user-config.jamで

local vc15dir = C:\\Program\ Files\ (x86)\\Microsoft\ Visual\ Studio\\2017\\Professional\\VC ;
using msvc
    :
    15.0
    :
    <setup-amd64>$(vc15dir)\\Auxiliary\\Build\\vcvars64.bat
    <setup-i386>$(vc15dir)\\Auxiliary\\Build\\vcvarsamd64_x86.bat
    <setup-arm>$(vc15dir)\\Auxiliary\\Build\\vcvarsamd64_arm.bat
    ;
using msvc ;

ならいけそうです。既定のインストール先でもエディションでパスが変わるので注意。

あとオートリンクのバージョンが合わないので、BOOST_ALL_NO_LIB=1でビルドしないと駄目です。
cl.exeの製品バージョンはプロパティ見るかぎり14.1っぽいんだけど、15.0でいいのかなぁ。
Boostの最新コードでも15.0で対応が進んでいる模様。


(03/21 追記)
その後「14.10」になって、接尾辞も「vc1410」になった挙句、結局「14.1」と「vc141」に落ち着きそうな感じ。


(04/20 追記)
Boost 1.64.0 で「14.1」で使えるようになりました。
「primary test compiler」でなく、「additional test compiler」ということでまだ試験的サポートのようです。
user-config.jamも

using msvc ;

だけでOK。

%TEMP%\b2_msvc_15.0_vcvarsall_amd64.cmd
%TEMP%\b2_msvc_15.0_vcvarsall_x86.cmd
%TEMP%\b2_msvc_15.0_vcvarsall_x86_arm.cmd

は将来のリリースでトラブらないように消しておいた方が安全。

Windows Kitのバージョンアップとrewrite-setup-scripts

超久しぶりですが、備蓄録として書いておこうかと。
Direct3D12のサンプル見て書いたコードのビルドが通らなくて、おかしいなと思ったらWindows Kitが一つ古かったのです。
で、VS2015 Update3のセットアッププログラムから最新のWindows Kitをインストール。
VS2015コマンドプロンプトでは確かに更新されているのに、素のコマンドプロンプトからb2でビルドすると相変わらず古いパスを見にいってる。
確かVSのコマンドラインツールを呼ぶ度にvcvars32.batとかを呼んでたはずと思い、b2に-nオプション付けてみたら、

%TEMP%\b2_msvc_14.0_vcvarsall_amd64.cmd
%TEMP%\b2_msvc_14.0_vcvarsall_x86.cmd
%TEMP%\b2_msvc_14.0_vcvarsall_x86_arm.cmd

なんてファイルが呼ばれてた。
どうも毎回バッチファイル実行すると遅いので、必要な環境変数の設定だけ抜き出してキャッシュしている模様。
ここに古いインクルードパスが残っていたのが原因で、このファイルを消してからビルドしたら直りました。

あるいは、user-config.jamで

using msvc : : <rewrite-setup-scripts>always ;

とすれば毎回再生成されますが、毎回やる必要もないので、終わったら既定値の <rewrite-setup-scripts>on (もしくは無指定)に戻しておいた方がよいでしょう。

ドラゴンクエストXのスキル考察支援「DQX スキルシミュレータ」v1.0が公開

「DQX スキルシミュレータ」v1.0

 「DQX スキルシミュレータ」は人気RPGドラゴンクエスト最新作ドラゴンクエストX(DQX)のスキル振り分けを試せるソフト。Windows XP/Vista/7および同64bit版に対応するフリーソフトで、作者のWebサイトからダウンロードできる。


 前作では全職業で獲得したスキルポイントを任意の職業のスキルに振り分ける事ができたが、本作では職業毎の管理となり他の職のスキルへ割り振ることができない。このため、スキルポイントが余っているにも関わらず欲しいスキルを獲得できなかったり、振り分けるスキルがないといったことも発生しうる。ゲーム中では基本的に一度割り振ったスキルポイントを取り消すことはできないが、本ソフトを利用することで事前に様々な振り分け方をシミュレートすることが可能だ。また、各職業でどのスキルに何ポイントを割り振ったか確認できるのも便利。


 なお、初期状態では前作(ドラゴンクエストIX)のスキル設定になっているので注意。設定を変更するには、付属のINIファイルを編集する必要がある。


著作権者】郵便はみがき 氏
【対応OS】Windows XP/Vista/7/XP x64/Vista x64/7 x64
【ソフト種別】フリーソフト
【バージョン】1.0(12/07/21)



□URL
DQX スキルシミュレータ
http://www12.ocn.ne.jp/~dante98/zip/DQXSkillSim.zip

boost::progress_display++

Boost.懇親会 #5 名古屋
http://partake.in/events/e9131e9c-0662-4179-bbd4-b0648909f921
でboost::progress_displayの発表をしてきました。


発表資料
http://www12.ocn.ne.jp/~dante98/progress_display.pptx
ソースコード
http://www12.ocn.ne.jp/~dante98/zip/progress_display.zip


前々からboost::progress_displayが苛められているのを見るたびに、インタフェースでなく実装の問題だと思っていたので、二つの別実装を紹介しました。
以下、実装周りの解説です。


一つ目は、単純なWin32 GUI版です。
boost::progress_displayのインタフェースに合わせるためにはメッセージループを別スレッドで回す必要があります。
また、「ウィンドウの生成」、「メッセージループ」、「ウィンドウの破棄」は同じスレッドで行う必要があり、真面目に実装しようとすると意外と面倒だったりします。

progress_displayからメッセージループへの通知はウィンドウメッセージを投げることで行っています。
スレッドに投げるメッセージは

  • destroy_msg(ウィンドウ破棄)
  • set_expected_msg(最大値設定)
  • set_count_msg(現在値設定)

の三つです。
ウィンドウが生きているかどうかは他のスレッドから確認できないので、ウィンドウハンドルではなくスレッドに対してメッセージを投げています。
progress_display一つに対して一つのメッセージループスレッドを使っているからできる手法ですが。


もう一つの実装は、「Progress display - アンサイクロペディア」に載っている例(?)を実装したものです。
AAが「MS Pゴシック」前提なことと、ソースコードにShift JISで書きたかったことから日本語環境(コードページ932)限定です。
普通に論理フォントを作成してGDIで描いています。
ダブルバッファリングは手抜きでWS_EX_COMPOSITEDスタイルを使っていますが、もうXP以降前提でよいでしょう。

引数は、

boost::progress_display progress(count, std::cout,
    "クソスレ\n"
    "普通\n"
    "優良スレ",
    "スレ評価嬢",
"     88彡ミ8。   /)\r\n"
"     8ノ/ノ^^ヾ8。( i )))\r\n"
"     |(| ∩ ∩|| / /   <ココ!\r\n"
"    从ゝ__▽_.从 /\r\n"
"     /||_、_|| /\r\n"
"     / (___)\r\n"
"    \(ミl_,_(\r\n"
"      /.  _ \\r\n"
"     /_ /  \ _.〉\r\n"
"   / /   / /\r\n"
"   (二/     (二)\r\n"
);

こんな感じで設定します。後ろ三つが「凡例」、「タイトル」、「カーソル」になっています。
カーソルのホットスポットは最上部の右端に決め打ちで、かつ最後の文字は省いて計算しています。(つまり「     88彡ミ8。   /」の幅)
なので、アンサイクロペディアの例以外のAAだと上手く動きません。


ついでに、発表に使ったコマンドプロンプトもどきの解説。

というご要望にお応えして、即興で縞模様のコマンドプロンプトを作りました。
時間がなかったのでコマンドの入力はコマンドラインの引数から、標準入力と標準エラー出力はなしです。
縞模様はGDIでベタ書きして、その上に出力を描画しているだけです。
コマンド実行は、スレッドを起こしてCreateProcess()して、1文字ずつ読んで画面更新してました。(非同期I/O面倒なので)

GetStockObject()で取得できるブラシが白/黒/灰色ぐらいしかなかったので、最初は白と灰色の縞模様だったのですが、色が重要っぽいのでちゃんとブラシを作りました。
あと、よく分かってなくて危うく縦縞にするとこでした。

で、こんな面倒なことしなくてもコンソールの設定変えるだけで出来たらしい、、、。

D言語版AATT

メタプログラミングの会
http://atnd.org/events/9072
http://d.hatena.ne.jp/kmizushima/20101204/1291479701
以前作成したAATTを発表してきました。


発表資料
http://www12.ocn.ne.jp/~dante98/aatt.pptx
ソース
http://www12.ocn.ne.jp/~dante98/zip/aattd.zip


赤黒木の説明→実装アルゴリズム→Dへの移植話という流れです。
読み返してみるとC++版(.aattを食わせるとC++用のヘッダを出力)の話がなくて、いきなりDへの移植になってたり説明が足りないところがチラホラ。


今回はC++版をDへ単純移植したものでしたが、ソース中にAATTのパターン列を並べると長くて読みにくく、
一つの変換毎にインスタンス化して、パターンマッチの順次評価や再帰D言語側の処理に任せた方が分かりやすそうでした。
質問タイムにも「もっと汎用的に使えないのか?」といった意見をもらいましたし、コードに埋めること前提で再設計してみると面白いかもしれません。


あと、D版動かしていてバグを見つけたのでC++版も修正してあります。
http://www12.ocn.ne.jp/~dante98/zip/aattc.zip (CR/LF改行)
http://www12.ocn.ne.jp/~dante98/zip/aattc.tar.bz2 (LF改行)
count_black()が左部分木の黒高さ同士を比較していたので全くテストになってなかったという、、、。