初PC自作

初PC自作

諸事情でAMDの環境が必要になったので初めて自作してみました。(BTOにAMDが少ない、、、)
要件はCPUが「Ryzen 5」以上、GPUが「RDNA 3」であることだけです。

CPU: AMD Ryzen 5 8500G with Wraith Stealth Cooler
ビデオカード: ASUS Dual Radeon RX 7600 EVO OC
マザーボード: ASUS TUF GAMING B650-E WIFI
メモリ: Crucial 64GB Kit (32GBx2) DDR5-4800 UDIMM
SSD: Crucial P310 1TB
ケース: MSI MAG FORGE 110R
電源: CORSAIR CX650

失敗してもいいように、Amazonで主要メーカーのほぼ一番安いやつを選んだのですが、SSDは700円で速度が1.5倍ぐらい違ったので新しい方にしました。
CPUはもっと古くてもよかったのですが、なぜか安かったのでこれに。
マザーボードは一応WiFiありのもの。ネットワークは有線ですが、大体Bluetoothもセットでついてくるので。
メモリは知人からの貰いもので少し古くて遅めです。
ケースは初心者向きと書いてあったので選択。
商品説明を見るため、「MSI 初心者」で検索したところ、「初心者のためのPC組み立て完全ガイド」というページを見つけたので、ここを見ながら組み立てました。
https://jp.msi.com/Landing/how-to-build-a-pc
電源は余裕をもって650W。「モジュラー式」と書かれていましたが違いました。写真を見れば明らかですが、値段しか見てなかった、、、。
トータル13万ぐらい。(メモリ抜き、OS込み)

ネジ

初心者向けケースと言いつつ、ネジの簡潔な用途しか書かれてません。

Securing drive tray 2個
Motherboard Stud 4個
Motherboard / SSD 20個
PSU / PCIe Card 6個
3.5" HDD 10個

どのステップでどれを使うか書いてあれば分かりやすいのですが、、、。
ATXマザーボードの固定にネジを9本使いますが、右側3か所が空回りして固定されません。よく見ると右側だけスペーサー(Stud)が付いていません。
ケースがATX/M-ATX/ITXのマザーボードに対応しているので、6か所だけ初めから付いていて、サイズに応じて取り付けるということなのでしょう。
3個でなく、4個付属しているので分かりにくい。1個は予備、偶数個にしたかっただけかもしれません。

SSD

NVMeのSSD用に安いヒートシンクを買っておいたのですが、マザーボードに付いていました。

PCIスロット

これまで使ったPCのPCIスロットカバーは横にスライドするタイプのものでした。
今回のものは引っ張っても取れず、反対側にネジでもあるのかと、固定したばかりのマザーボードをはずして確認することに。
結局ネジは存在せず、パキッと折るタイプでした。

電源ケーブル

CPUの補助電源はマザーボード側が8ピン+4ピン、電源側が8ピン+8ピンでした。
ネットで調べると8ピンだけ挿せばいいという意見も多いですが、それだと電力が足りないですよね。
CORSAIRのFAQを見ると、全て4ピンに分離できると書かれていて、確かに片方のピンは真ん中に線が入っていました。(全てと書かれていますが、もう片方は分離しなそうに見えました。)
PCIe補助電源のものと違ってがっつりくっついているので、どうやって外せばいいか分からず、解説している画像や動画を探しましたが見つからず。結局、少し力を入れるとあっけなく分離しました。
ただし、8ピンと8ピンを繋いでいるケーブルが太くて短いので挿しづらかったです。

フロントパネル

フロントパネルのケーブルは難関でした。
ケースとマザーボードの説明書を見比べながら、どこに挿すか確認するわけですが、+/-がくっついているケーブルと分離しているケーブルがあること、ケース側は横並びのケーブルがマザーボード側では二段になっていることが問題です。
調べたところ、▲ついてる方が+なのだそうです。

起動

一発では起動できませんでした。
全く電気が通っていないようだったので、電源ボタンのケーブル、ATX電源コネクタの順に確認していきました。
ATXのコネクタが奥まで刺さってませんでした。
最初グラボのHDMIにディスプレイを繋いでいましたが、何も映らなかったのでひとまずマザーボード側のものに繋ぎました。

OSインストール

Windows 11 Home のUSB版を使いました。
プロダクトIDの入力までは進むものの、インストールの要件を満たしていないというエラーになりました。プロダクトIDの入力後なのでリトライする度に入力する羽目に。
何が足りないのか説明がないのが困りものです。
Windows11をサポートするプロセッサの一覧を見ると確かに載ってないのですが、AMDのサイトではサポートOSに記載があり、単にリストが更新されていないだけのようです。
となるとセキュアブートかTPM2.0でしょう。
ASUSのマザーボードの場合、

Boot > Secure Boot > OS Type を「Windows UEFI mode」に変更
Advanced > AMD fTPM configuration > Firmware TPM switch を「Enable Firmware TPM」に変更

でした。
また、再起動時にTPMをリセットするか聞かれるのでYでリセットする必要がありました。ASUS+AMDの場合の仕様のようです。
https://www.asus.com/jp/support/faq/1051544/

要件をクリアした後は、「oobe\BypassNRO.cmd」でネットワーク接続をスキップして、ローカルアカウントにしました。(ホームディレクトリを日本語にしたくないので、インストール後にMSアカウントに切り替え)
使用したインストーラーは22H2で、最新のものだとダメかもです。

ドライバー更新

インストールそのものはすんなり終わり、起動したものの画面がかなり粗い状態。
解像度が720pになっていて変更もできないので、デバイスマネージャで確認するとディスプレイアダプタが二つ警告表示されていました。
二つということはiGPUとdGPUで、グラボはちゃんと刺さっているようです。
AMD Software を入れてドライバが更新されると直りました。
この時点でまだマザボ側から出力していて、グラボ側に挿しても映らない状態。
これは一度電源を切って、グラボ側に挿し直して起動したら直りました。
いつの間にかBIOS画面も映るようになってました。
Bluetoothも警告表示が出ていたので、マザボのサポートページにあるドライバーは一通り入れました。
これでインストールも完了です。
モンハンベンチは4K/プリセット=中/フレーム生成ありで62.51 FPS、スコアは10699でした。

感想

ケーブル等付属のもので事足りるので、意外と購入するパーツは少なく、今はドライブベイを使わなかったりで接続するものも多くはないです。
なので、思ったよりも難しくはない、、、のですが、やはりネジやケーブルの説明が足りてないなと感じました。
一度組めば次は簡単だと言っていいかな。
今は事前にパーツを選んで試算や互換性チェックできるサイトもあるので、気楽に挑戦できます。(なお、PC Building Simulator 2も試したけど、目的のパーツがなかった)
せっかくの自作なので、Linuxも入れてみたいところです。

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

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