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()が左部分木の黒高さ同士を比較していたので全くテストになってなかったという、、、。

nihongo.pmy

(12/05 追記、コードも少し加筆)
メタプログラミングの会でk.inabaさんが発表されたプログラミング言語Polemyで、資料中の例にあったnihongoレイヤを作ってみました。
http://www.kmonos.net/repos/polemy/


とりえあず動いた。

@@nihongo = fun(x)
{
  if @value(x) == 1 then
    "いち"
  else if @value(x) == 2 then
    "に"
  else
    "まちがい"
}
@nihongo + = fun(x, y)
{
  @value(@value(@nihongo(x) ~ "たす") ~ @nihongo(y))
}
@value( 1 + 2 )
@nihongo( 1 + 2 )
exit

実行結果

Welcome to Polemy 0.1.0
>> >> >> >> >> >> >> (function:12bffe0:12b4cc0)
>> >> >> >> (function:12c5e80:12b4cc0)
>> 3
>> いちたすに
>>

BBv2の警告メッセージ抑制

Boost.勉強会で時間がなくて話せなかった「警告メッセージ抑制」について説明しておきます。

import path ;
local broot =
	[ modules.peek : BOOST_ROOT ] ;
local bdir = [ path.make $(broot) ] ;
for local lib in graph mpi python regex {
	module Jamfile<$(bdir)/libs/$(lib)/build> {
		rule ECHO { }
	}
}

これをuser-config.jam等に書いておくと、「ICUがない」等の警告メッセージを抑止できます。

仕組みが分からずとも使えますが、理解するにはJamfileが個別のモジュール内で動作していることを知る必要があります。

ECHO $(__name__) ;

のようなJamfileを用意して実行してみると、

Jamfile

のような出力が得られるはずです。
変数__name__には現在のモジュール名が入っているので、サブプロジェクト毎に上記のような名前のモジュールが使われていることが分かります。

また、

  • モジュールはオープンである(モジュールにルールや変数を追加できる)
  • 警告メッセージはECHOルールで出力されている
  • ルールは「現在のモジュール」→「グローバルモジュール」の順で検索される

なので、警告メッセージを出力しているモジュール内でECHOを上書きすることで、その呼び出しをフックすることが可能です。
つまり、ECHOを空のルールで上書きすれば警告メッセージが出力されなくなるというわけです。

最近はconfigureというモジュールもメッセージを出力するので、

module configure {
    rule ECHO { }
}

も追加するとよいでしょう。
ただし、バージョンアップした際などは一度警告メッセージを見ておくのがよいです。