2011-05-14
■[C++][Boost]boost::progress_display++

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が苛められているのを見るたびに、インタフェースでなく実装の問題だと思っていたので、二つの別実装を紹介しました。
以下、実装周りの解説です。
boost::progress_displayのインタフェースに合わせるためにはメッセージループを別スレッドで回す必要があります。
また、「ウィンドウの生成」、「メッセージループ」、「ウィンドウの破棄」は同じスレッドで行う必要があり、真面目に実装しようとすると意外と面倒だったりします。
progress_displayからメッセージループへの通知はウィンドウメッセージを投げることで行っています。
スレッドに投げるメッセージは
- destroy_msg(ウィンドウ破棄)
- set_expected_msg(最大値設定)
- set_count_msg(現在値設定)
の三つです。
ウィンドウが生きているかどうかは他のスレッドから確認できないので、ウィンドウハンドルではなくスレッドに対してメッセージを投げています。
progress_display一つに対して一つのメッセージループスレッドを使っているからできる手法ですが。
もう一つの実装は、「Progress display - アンサイクロペディア」に載っている例(?)を実装したものです。
AAが「MS Pゴシック」前提なことと、ソースコードにShift JISで書きたかったことから日本語環境(コードページ932)限定です。
ダブルバッファリングは手抜きで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だと上手く動きません。
ついでに、発表に使ったコマンドプロンプトもどきの解説。
color コマンド,背景を白と水色の横縞ストライプにできないんですかこれ? #boostjp
というご要望にお応えして、即興で縞模様のコマンドプロンプトを作りました。
時間がなかったのでコマンドの入力はコマンドラインの引数から、標準入力と標準エラー出力はなしです。
縞模様はGDIでベタ書きして、その上に出力を描画しているだけです。
コマンド実行は、スレッドを起こしてCreateProcess()して、1文字ずつ読んで画面更新してました。(非同期I/O面倒なので)
GetStockObject()で取得できるブラシが白/黒/灰色ぐらいしかなかったので、最初は白と灰色の縞模様だったのですが、色が重要っぽいのでちゃんとブラシを作りました。
あと、よく分かってなくて危うく縦縞にするとこでした。
で、こんな面倒なことしなくてもコンソールの設定変えるだけで出来たらしい、、、。
2010-12-05
■[D]D言語版AATT

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()が左部分木の黒高さ同士を比較していたので全くテストになってなかったという、、、。
2010-12-04
■[Polemy]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
>> いちたすに
>>
2010-10-24
■[Boost]Boost.勉強会#3

Boost.勉強会#3でBoost.Buildについて発表しました。
発表資料
http://www12.ocn.ne.jp/~dante98/BoostBuild-pre.pptx
サンプルコード
http://www12.ocn.ne.jp/~dante98/zip/bbv2.zip
http://www12.ocn.ne.jp/~dante98/zip/bf.zip
初PowerPoint/プレゼンテーション/大阪で緊張しました。
蛇足(蛇足大好きなもので、、、)ばかり話して時間配分も失敗してしまい、Tipsの部分は喋れませんでした。
次やるならラウンドテーブルとかの方がいいかなぁ。
■[Boost][BBv2]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</path/to/dir>
のような出力が得られるはずです。
変数__name__には現在のモジュール名が入っているので、サブプロジェクト毎に上記のような名前のモジュールが使われていることが分かります。
また、
なので、警告メッセージを出力しているモジュール内でECHOを上書きすることで、その呼び出しをフックすることが可能です。
つまり、ECHOを空のルールで上書きすれば警告メッセージが出力されなくなるというわけです。
最近はconfigureというモジュールもメッセージを出力するので、
module configure {
rule ECHO { }
}
も追加するとよいでしょう。
ただし、バージョンアップした際などは一度警告メッセージを見ておくのがよいです。
2010-09-25
■[Dante98]Dante98 for Windowsクラッシュ回避パッチ

ワイド液晶になってからDante98 for Windowsが動いてなかったのですが、ようやく重い腰を上げて調査しました。
640x480x256色のDirectDrawサーフェイスのピッチが640以外の環境で動いていませんでした。
Ver. 2.0.1.10用のパッチです。
0x00016AC3: D4 -> D0
0x00016AC6: D0 -> D4
普通にビルドしたら実行ファイルのサイズが大きくなったので、そのままリリースは怖くてとりあえずパッチだけです。
(12:50 追記)
http://www12.ocn.ne.jp/~dante98/#20100925
に修正プログラムを置きました。
HamigakiC++Libにあるcoroutineの説明(http://hamigaki.sourceforge.jp/doc/html/coroutine/tutorial.html#coroutine.tutorial.coroutines)
で「コルーチンはその性質上、呼び出すまで終了したかどうか分からないので、この例外を捕捉することで終了を検知する」とありますが、
例えば参照型やポインタ型、POD型以外のデストラクタを持てる型のオブジェクトをselfの代わりにコルーチンの引数に与えて、
コルーチンが終了した時にそれのデストラクタが呼ばれる事によって終了を検知できないのでしょうか?
例外検出ではオーバーヘッドが大きい気がします。
関係ない話ですが、ココログ、gooなどのメジャー
なところへブログの引越しも考慮に入れてはどうですか。
チャイムズクエストは持ってないです、、、。
あと、はてなも十分メジャーだと思います。ソースコードも貼りやすいし便利ですよ。
すばらしい作品があります。
はてなについては、名誉毀損的な書き込み(決して貴方のことでは
ありません)を削除されてくれないし、どこが運営しているのか
良く分からないからです。
アフィリエイトを使うのであれば
ココログの便利です。
DanteWinはDARK FORCEを遊びたくて作ったのですが、だんだんダンジョンにはそこまでの思い入れはないです。
動かすだけならPC98自体のエミュレータで動くと思いますし。
「C,C++勉強中」とのことなので勉強がてら作ってみては?
> 名誉毀損
↓ここと照らし合わせて不服があれば弁護士に相談するのがよいと思います。
はてな情報削除ガイドライン
http://hatena.g.hatena.ne.jp/keyword/%e3%81%af%e3%81%a6%e3%81%aa%e6%83%85%e5%a0%b1%e5%89%8a%e9%99%a4%e3%82%ac%e3%82%a4%e3%83%89%e3%83%a9%e3%82%a4%e3%83%b3
勉強しても、エミュレータを作ることはできません。
だんだんダンジョンのソフトはCD-ROM起動のものがあるので
98エミュレータでうまく動かないのです。
逆にチャイクズクエスト作品は、FM音源が
使える(著作権法違反?)エミュレータ
では、動きます。
>はてな情報削除ガイドライン
明らかにここに該当するのに削除されないのです。
弁護士にも相談しましたがだめでした。
質問がありますが、DANTEWINを作るとき
リバースエンジニアリングはされたのですか。
(していなかったら済みません)
昔のアスキーのソフトはリバースエンジニアリング
を認めているかどうか分かりませんが、
サイキュリーなどの実行プログラムを
Windows上で動くようにするのには
必要だと思います。
Cも難しいですが、
(Win95で不正動作させた経験あり)
C++はもっと難しいです。
勉強のコツはありますか。
エディタで値を変えてダンプを比較したり、敵の出現率や魔法の成功率を統計取ったりといった感じです。ヘルプに書いている通り、逆アセンブルなどはしていません。
それでも厳密にいえばリバースエンジニアリングに当たるようなのでアレですが、アスキーを通して発表したこともあって特に苦情は来てません。
> 勉強のコツ
目的を持つことですね。
プログラミング(に限ったことではないですが)の勉強に終わりはないので、やりたいことを決めて、その方法を探りましょう。全てを理解する必要はありません。
自分は大学4年間DanteWinを何度も作り直しながら必要なことを勉強しました。
もちろん今も勉強中です。