昔の最近の出来事(2012.11)

2012/11/30

気持ち早めに帰着。

もそもそとコーディング。
ボタンに画像を貼るのにオーナードローボタンを使うとビジュアルスタイルを 合わせるのが大変な感じになります。昔のフラットなボタンだとがんばれば どうにか見た目を合わせられるものの、XPスタイルの艶があったり角が丸かったり するのは合わせるのは無理があります。そこで知ったのが OpenThemeData()やDrawThemeBackground()。これを使ってボタンをレンダリングした 後に画像をアルファ付で自力合成してみました。ひとまず見た目は合わせられるように なったのですが、マウスカーソルがフォーカスした時にジワジワ色が変わるのとかは 面倒臭過ぎてやっぱり合わせられず(^^;

そんな訳でuxtheme.hとvsstyle.hのD言語バインディングが成果物になってみたり。

2012/11/29

早くも無く遅くも無く。

「7+ Taskbar Tweaker」というソフトの存在を知ったり。 タスクバーを色々カスタマイズできるというものです。 WindowsXPのときはTaskbar++というソフトで、タスクアイコンを タブのように移動できてて幸せだったのですが、Windows7では タスクアイコンを動かせるようになったものの、グループ毎の 移動しかできないのが不満でした。7+ Taskbar Tweakerでは グループをバラせるようになった為、実質WindowsXPでTaskbar++を 使うのと変わらない操作ができるようになり幸せが戻ってきました(^^)。

そういや以前、東京MXの物理チャンネルが 20chから16chに変更されるということを知ったのですが、何気に 16chに合わせてみたら受信できるようになってました。現在は20chと16chの 両方の電波が出ているようです。我が家では16chはアンテナレベル41、20chは アンテナレベル37と、16chの方が若干アンテナレベルが高いみたい。まぁ、 他の局は60以上出ているので、それから言うと誤差みたいなもんですが。

2012/11/28

早くも無く遅くも無く。

もそもそとコーディング。

2012/11/27

気持ち早めに帰着。

もそもそとコーディング。

2012/11/26

早くも無く遅くも無く。

ちょろり調べごと。もそもそと実験コーディング。ふーむ。

2012/11/25

AM中に起床。

Web巡回したりコードをリファインしたり。

新世紀エヴァンゲリオン(13)。おおよそ旧劇場版通りに進んでいるような気も。 次はまた2〜3年後でしょうか。

2012/11/24

AM中に起床。

64bit化で一つうまくいっていないのにタブレットコントロールがあります。 Webを検索するもいまひとつこれってのが見つけられなかったのですが、 wacom Software Developer Support のサンプルコードを試してみたり。結果からいうとひとまず64bit gccでは使えそう。
マウスとタブレット入力を統一的に扱う目的でマウスモードでデータを取得していたのですが、 WT_PACKETメッセージで扱う方に変えた方が良いみたいです。 以前どうすりゃいいのか判らなかった のですが、どう変えるのが良いかまた考える必要がありそう。

アパートの契約更新で不動産屋に。来週もう一回行く必要があったり。

ちょろり本屋に。色々散在。

そういや、DMD2.060対応版のMinGW-gdc実行バイナリが bitbucketの方に アップロードされているみたいです。

64bitのタブレット対応の件。ひとまず解決。 PACKETDATAフラグにPK_CONTEXTを立てて、PACKET構造体メンバー変数に「HCTX pkContext;」 を含めていました。このメンバー変数はポインタ型の為、32bitと64bitとでサイズが 変わってしまう訳なのですが、ここがうまくなかったため後ろに続くメンバー変数が 壊れてしまっていたようです。PACKET構造体内のpkContextは使用していなかった事 から、PACKETDATAフラグからPK_CONTEXTを外し、PACKET構造体からpkContextも外して みたところ、正しく座標を取ることができました。 そんな訳で、ひとまずマウスモードでデータ取得する方法のままで対応完了という感じ。

これで手持ちコードで64bit化できてないものは無くなったという感じ。

2012/11/23

昼ごろ起床。寝すぎ。

カイジ2。冒頭 10分ほど見てなかったらあっという間に地下から出てた。

調べごと。

2012/11/22

気持ち早めに帰着。

あまりに眠さに急速停止。

2012/11/21

早くもなく遅くもなく。

手持ちD言語コードをもそもそと64bit化したり。

あまりの眠さに急速停止。

2012/11/20

早くもなく遅くもなく。

gdc。64bit版で メソッド呼び出しがうまく行われない事がある件、原因判明。 メソッド呼び出しがうまく行われないのではなく、RegisterClassEx()に 失敗しているのが原因でした。正確にはWNDCLASSEX.lpszClassNameに string型の変数を wchar* でキャストして代入するのではダメでUTF16変換する必要が あったという、以前気づいていた 件でした。古いコードを64bit対応させた時に変更を忘れていました(^^; 面倒臭いのは動いたり動かなかったりする点。オプティマイズレベルや writef()を挟むか否かで動きが変わる気があまりしないのですが変わります。

2012/11/19

遅めに帰着。

gdc。64bit版で メソッド呼び出しがうまく行われない事がある件を少し調べたり。 原因まで到達できず。

2012/11/18

AM中に起床。

MinGW gdc。覚書き。 使用したのはvenix1(==DanielGreen)氏のforkバージョン (f35ec0f857)で、 ベースgccは4.6.3を使用。


対処方法が全て正しい訳ではありませんが手放しでビルド成功する感じではまだなさそうなので 御参考まで。そういや-mwindowsを指定するとWinMain()から始まる(Dmainから始まらない)ような パッチが入っていた (以前の話)のですが、このバージョンでは元に戻っているようです。

因みにDMD2.058→DMD2.060の変更に起因するコードの修正というのは今回は特に無し。

それにしても、libphobosのビルドが全然できそうにない感じだったところから、 使えるレベルまで直してくれてありがたいことです。

過去日記を見返していたら、std.string.format()が変になっていた件は 以前に気づいていたり。このときもstd.string.format() ではなくstd.format()が変と思っていたけど、2.058の追加修正がされた程度のバージョンだったので 古いのでも良いかという事でちゃんと調べていませんでした(^^;

2012/11/17

起きたら午後もいい時間。

DMD2.060対応のgdc64bitビルド。ファイルダイアログが開かなくなった件は、 以前構造体のメンバー変数のアライメントが 32bitのそれと違っていた為、align()キーワードを使ってサイズを無理やり 合わせていました。それが新しいコンパイラではアライメントが変わった為か、 構造体のサイズもまた変わってしまっていたのが原因でした。align()キーワード を削除してOKになったのですが、そうすると前のコンパイラではダメに なるので新しいコンパイラが問題無い状態でなくては困った事に。

format()が変な値を返している件。std.formatではなくstd.string.formatの方が変っぽい。 自前のあるモジュールに限定して変になっているのですが、ここって大分前から何か 変な感じだったりしてました。何か間違っているのかも。

そういや、core.simdでdouble2型などを使用した時に乗算がバグってて 使えなかったは直っているようです。

$ cat simd_test.d
import std.stdio;
import std.string ;
import core.simd ;

int main()
{
  version( GNU     ) writef("I am GNU\n"    ) ;
  version( Unix    ) writef("I am Unix\n"   ) ;
  version( Windows ) writef("I am Windows\n") ;
  version( MinGW   ) writef("I am MinGW\n"  ) ;
  version( cygwin  ) writef("I am cygwin\n" ) ;
  version( Win32   ) writef("I am Win32\n"  ) ;
  version( Win64   ) writef("I am Win64\n"  ) ;
  version( Posix   ) writef("I am Posix\n"  ) ;
  version( X86     ) writef("I am X86\n"    ) ;
  version( X86_64  ) writef("I am X86_64\n" ) ;

  double2 a,b,c,d,s ;

  a = 6 ;
  b = 5 ;
  c = 4 ;
  d = 3 ;
  for( int i=0 ; i<2000000000; i++ ){
    s = a / b + c * d ;
    a = s - 7.2 ;
    c = s - 9.2 ;
  }
  writef("a = %s\n",a.array) ;
  writef("b = %s\n",b.array) ;
  writef("c = %s\n",c.array) ;
  writef("d = %s\n",d.array) ;
  writef("s = %s\n",s.array) ;

  return(0) ;
}

32bitコンパイルの結果は以下。

$ gdc -m32 -O2 simd_test.d

$ time a.exe
I am GNU
I am Windows
I am MinGW
I am Win32
I am X86
a = [6, 6]
b = [5, 5]
c = [4, 4]
d = [3, 3]
s = [13.2, 13.2]

real    1m13.518s
user    0m0.000s
sys     0m0.031s

64bitコンパイルの結果は以下。

$ gdc -m64 -O2 simd_test.d

$ time ./a.exe
I am GNU
I am Windows
I am MinGW
I am Win64
I am X86_64
a = [6, 6]
b = [5, 5]
c = [4, 4]
d = [3, 3]
s = [13.2, 13.2]

real    0m20.506s
user    0m0.000s
sys     0m0.030s

いい感じ。

std.string.format()の結果が変な件。どうやら %fを指定したときの表示がダメみたい。 正確に言うと、値が全て0として解釈されて表示されています。例えば %fなら 0.000000、%0.3fなら0.000てな感じ。%dや%xならうまく表示されます。
std/string.dのソースを見ていたら、xformat()なる実装が存在していたり。 これは2.058のにはありませんでした。どうやら置き換えが予定されている ようです。このxformat()を使用してみたところこちらは大丈夫そうでした。

$ cat strformat_bug.d
import std.stdio ;
import std.string ;
import std.conv;

void main(string[] args)
{
  if( args.length==2 ){
    double fval=to!(double)(args[1]) ;
    writef("%f %s\n", fval, format("%f",fval)) ;
    writef("%f %s\n", fval, xformat("%f",fval)) ;
  }
}

$ gdc -O2 strformat_bug.d

$ ./a.exe 1.23
1.230000 0.000000
1.230000 1.230000

さて、どうしたものか。

結局、std/string.dの方を改造。そのうち置き換えられるという事なので、 formatとxformat、sformatとxsformatを交換してビルド。 手持ちソースはstd.stfing.format()のままという感じで。

2012/11/16

大幅に日付け越え。

gdc。64bitビルド。32bitと同じソースで対処も同じ感じでビルド完了したり。 概ねOKそうな感じなのですが、std.formatが何やら変なのに加えて、 ファイルダイアログを開けなかったり。うーむ。

2012/11/15

日付け越え。

gdc。32bitターゲットのビルドでは概ね手持ちコードのビルドはOK なのですが、std.formatが何やら変な値を返していて、そこだけがまだダメな感じ。 基本的にはwritefと同じなのだと思っていたのですが、どうもそうではないらしい。

2012/11/14

日付け越え。

昨日のpow式のバグ。std.regexだけならバグを踏まないワークアラウンドを 入れれば良いかな?と思ったのですが、他でも結構使われていた為、 コンパイラを直すのがよさげな感じだったり。
因みに昨日のコードのアセンブラコードを出してみて、正しく動く2.058対応 のgdcのと比べてみたり。

__Dmain:                                                        __Dmain:
        pushl   %ebp                                                    pushl   %ebp
        movl    %esp, %ebp                                              movl    %esp, %ebp
        subl    $24, %esp                                               subl    $24, %esp
        movl    $3, %eax                                                movl    $3, %eax
        movl    $LC0, %edx                                              movl    $LC0, %edx
        movl    $262144, 8(%esp)                              |         movl    $0, 8(%esp)
        movl    %eax, (%esp)                                            movl    %eax, (%esp)
        movl    %edx, 4(%esp)                                           movl    %edx, 4(%esp)
        call    __D3std5stdio17__T6writefTAyaTiZ6writefFAyaiZ           call    __D3std5stdio17__T6writefTAyaTiZ6writefFAyaiZ
        movl    $0, %eax                                                movl    $0, %eax
        leave                                                           leave
        ret                                                             ret

左が正しく動く方、右が0が返るダメな2.060版対応gdc。差分のところが問題の箇所。 ダメな方は即値で0を入れている感じになってます。

定数の計算がバグっていそうということから、勘でd/dfrontend/constfold.cを以下 のように変更してみたり。

$ diff -c constfold.c.org  constfold.c
*** constfold.c.org     2012-11-11 03:34:56.000000000 +0900
--- constfold.c 2012-11-15 01:52:23.612038100 +0900
***************
*** 581,592 ****
          if (e1->type->isfloating())
          {
              r = new RealExp(loc, e1->toReal(), e1->type);
!             v = new RealExp(loc, ldouble(1.0), e1->type);
          }
          else
          {
              r = new RealExp(loc, e1->toReal(), Type::tfloat64);
!             v = new RealExp(loc, ldouble(1.0), Type::tfloat64);
          }

          while (n != 0)
--- 581,592 ----
          if (e1->type->isfloating())
          {
              r = new RealExp(loc, e1->toReal(), e1->type);
!             v = new RealExp(loc, 1, e1->type);
          }
          else
          {
              r = new RealExp(loc, e1->toReal(), Type::tfloat64);
!             v = new RealExp(loc, 1, Type::tfloat64);
          }

          while (n != 0)
***************
*** 598,604 ****
          }

          if (neg)
!             v = Div(v->type, new RealExp(loc, ldouble(1.0), v->type), v);

          if (type->isintegral())
              e = new IntegerExp(loc, v->toInteger(), type);
--- 598,604 ----
          }

          if (neg)
!             v = Div(v->type, new RealExp(loc, 1, v->type), v);

          if (type->isintegral())
              e = new IntegerExp(loc, v->toInteger(), type);

Pow()関数の一部を2.058に戻してみたという感じ。
で、結果は良好(^^)v 少し使ってみる事にします。x86_64ビルドの方はまた後日。

2012/11/13

遅めに帰着。

先日のstd.regexの実行でエラーする件。コード内のエラーチェックで エラー検出して例外が飛んでいるので、デバッガで追っかければ原因が判るだろう と思ったのですが、gdbで実行すると何故かSegfaultして実行できず。 因みにエラーは次のような感じ。

GameLoopError: maximum compiled pattern length is exceeded
Pattern with error: `^` <--HERE-- `mtllib\s+(\S+)`

std.regex.dのソースを見てみると、バイトコードの上限を maxCompiledLengthとして、バイトコードを格納している配列のサイズが この値より大きいとエラーするという流れ。maxCompiledLength は「enum maxCompiledLength = 2^^18;」てな感じになっていて、 特に変な事はしていなさそう。

どうやらpow式がバグっているみたい。

$ cat beki.d
import std.stdio;
import std.string ;

void main()
{
  writef("%x\n",2^^18) ;
}
$ gdc  beki.d
$ ./a.exe
0

累乗の結果が0なので、エラーを誤検出しているという感じ。 regexを使わないコードは取り合えず実行できそうなので、ここを 直せば問題無く使えそうなのですが......

2012/11/12

遅めに帰着。

MinGW向けgdcのアップデートが来ないなぁと思っていたら何やら 色々コミットされてたり。何故ジャストタイミングなのかは謎(^^;
ひとまずx86でビルド。cc1d.exeのリンクにg++ではなくてgccを使っている せいでリンクに失敗するのを手で解決、libphobosの std/__fileinit.oが ソースが無くてビルド失敗するのを手で外してひとまずlibphobosのビルド にも成功しました(^^)v。
手持ちのコードをコンパイルしてみたところ、libgdruntime内の core/sys/windows/mingwex.oに含まれる関数とlibmingw内に含まれる関数が 衝突していてリンクエラー。core/sys/windows/mingwex.oをlibgdruntime.a から外したり。

で、リンクにも成功したのですが、std.regexの正規表現のコンパイルでエラー している模様。よく判らないのですが、行頭を示す「^」やただの「.(ピリオド)」 がダメになってたり。なにこれ?

2012/11/11

昼前起床。

壊れたビニール傘を捨てられるように解体したり、不要になった古い風呂の蓋を 細かく切ったり。ノコギリ(弓ノコですが)なんて久しぶりに使いましたよ。

2012/11/10

昼頃起床。

WiiUのTVCMが流れ始めていたり。

そういやgdc。MinGW向けにビルドを試しているのかなぁ?と思っていたのですが、 その後パッタリと更新が止まってたり。やはりlibphobosのビルド対応が 難しい感じになっているのでしょうか.....

2012/11/09

早めに帰着。

ヱヴァンゲリヲン序を見ていたらあまりの眠さに急速停止。

2012/11/08

日付け越え前に帰着。

チャンネルザッピングをしていたら水森亜土氏(いわゆるあどちゃん)が 出ていたり。オーディション時にでまかせで両手で絵が描けると言ったとは 驚きです。 Wikipedia を見ていたらPS2用「塊魂」の挿入歌「真っ赤なバラとジントニック」のボーカルを 務めていたのを初めて知ったり。TANEの塊デビューはPS3のトリビュートからなので YMCK版しか知りませんでした。

2012/11/07

遅めに帰着。

ちょろり調べごと。

2012/11/06

遅めに帰着。

ちょろりモデリング。んー、なんかイマイチ。

2012/11/05

遅めに帰着。

ちょろりモデリング。

2012/11/04

昼過ぎ起床。

過去の日記をたまたま見たら 以前レンダリングした シーンファイルのレンダリング時間の記録があった ので、現PCで試してみたり。これまでの分も含めて以下のような感じ。

CPU レンダリング時間 POV-RayVersion 日記タグ
PentiumIII(550MHz) 約11d16h 3.1 2000/10/28
Pentium4(3.06GHz;1thread) 2d07h06m40s 3.6.x 2006/12/06
i7-377K(3.5GHz;7thread) 7h11m30s 3.7 RC6 2012/11/04

12年前は11日かかっていたのが、寝ている間に終わる感じになってます(^^; 因みに、Pentium4の時に1threadなのはPOV-Rayの3.7betaではレンダリング結果が 怪しかった為、マルチスレッド対応ではない3.6を使用したから。 Pentium4→Core-i7の差で一番効いているのはマルチスレッド化だと思われます。 それにしても、約12年でこんだけ性能が上がっているってスゴいよね。

2012/11/03

昼過ぎ起床。

ちょろり本屋に。「ONEPIECE(68)」。色々盛りだくさん。次巻くらいから 色々片付いていく感じか。

2012/11/02

早めに帰着。

いつの間にか寝てたり。

2012/11/01

日付け越え。

眠くて死亡。


TOP PREV