2007年5月31日木曜日

devkitDC構築メモ(その2)

devkitDC構築メモ(その1)の続きです。
今回はSH4環境のビルドスクリプトについてです。
とはいっても、ARMはこれの縮小版になりますが。

#!/bin/sh
ARCH=sh

SRC_BINUTILS=binutils-2.17
BUILD_BINUTILS=$ARCH-binutils

SRC_GCC=gcc-4.1.2
BUILD_GCC=$ARCH-gcc

SRC_NEWLIB=newlib-1.15.0
BUILD_NEWLIB=$ARCH-newlib

TARGET=$ARCH-elf
PREFIX=/devkitPro/devkitDC/$TARGET
binaries=$PREFIX/bin

export PATH=$PATH:$binaries


GO_BINUTILS=0
GO_BASEGCC=0
GO_NEWLIB=1
GO_FINALGCC=0


if [ $GO_BINUTILS -eq 1 ]
then
  date
  echo "Go binutils:"

  if [ ! -d $BUILD_BINUTILS ]
  then
    mkdir $BUILD_BINUTILS
  fi
  cd $BUILD_BINUTILS

  ../$SRC_BINUTILS/configure --target=$TARGET --prefix=$PREFIX

  make all install MAKEINFO=makeinfo

  cd ..

  echo "Finished binutils:"
  date
fi

if [ $GO_BASEGCC -eq 1 ]
then
  date
  echo "Go gcc(Base):"

  if [ ! -d $BUILD_GCC ]
  then
    mkdir $BUILD_GCC
  fi
  cd $BUILD_GCC

  ln -s ../$SRC_NEWLIB/newlib .
  mkdir -p ./gcc/config
  cp -R ../$SRC_GCC/gcc/config ./gcc
  cp -R ../$SRC_GCC/gcc/coretypes.h ./gcc
  cp -R ../$SRC_GCC/gcc/defaults.h ./gcc
  ../$SRC_GCC/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --disable-libssp --with-newlib

  make all
  make install

  cd ..

  echo "Finished gcc(Base):"
  date
fi

if [ $GO_NEWLIB -eq 1 ]
then
  date
  echo "Go newlib:"

  if [ ! -d $BUILD_NEWLIB ]
  then
    mkdir $BUILD_NEWLIB
  fi
  cd $BUILD_NEWLIB
  make clean
  CFLAGS=-D__USE_MINGW_ACCESS ../$SRC_NEWLIB/configure --target=$TARGET --prefix=$PREFIX

  make all install \
    MAKEINFO=makeinfo \
    CC_FOR_TARGET=$binaries/${TARGET}-gcc \
    AS_FOR_TARGET=$binaries/${TARGET}-as \
    LD_FOR_TARGET=$binaries/${TARGET}-ld \
    AR_FOR_TARGET=$binaries/${TARGET}-ar \
    RANLIB_FOR_TARGET=$binaries/${TARGET}-ranlib

  cd ..

  echo "Finished newlib:"
  date
fi

if [ $GO_FINALGCC -eq 1 ]
then
  date
  echo "Go gcc(Final):"

  cd $BUILD_GCC
  make clean
  ../$SRC_GCC/configure --target=$TARGET --prefix=$PREFIX \
    --enable-languages=c,c++ \
    --disable-debug --disable-libmudflap --disable-libssp \
    --with-newlib --without-headers
#--disable-libstdc++-v3

  make all
  make install

  cd ..

  echo "Finished gcc(Final):"
  date
fi

各種GO_*変数の値に応じて処理を{する/しない}を切り替えています。
configureやmake時のオプションを試行錯誤する際に、このカタチにしました。
シェルスクリプトはトレースが難しいのでサブルーチンなどにする手法は避けました(という言い訳)。
MinGWでは、
- xgccがヘッダファイルを見つけてくれない
- 'ln -s'でリンクは出来ずファイルコピーが発生する
という現象が起きました。
当方の環境(CPU:PenM1.5GHz/Mem:512M/OS:WinXP-SP2)フルビルドは6時間程度かかりました。
特に、newlibとfinalgccは長いです。
finalgccは、libstdc++にかけている時間が長いようです。
# 標準出力、エラー出力を記録しないとか考えましたけど、さすがに怖い

2007年5月30日水曜日

フォントファイルをリソースに埋め込む(プライベートフォント)

アプリケーションのフォントをガチガチに固定したい場合ってないですか?
実行ファイルと同じフォルダに特定の名前にしておく。
それすらも禁止したい場合、無いですか?
ずいぶんむかしに、そんなケースがありました。んでもって、実現する方法がありました。


/*
 *
 *  ハンドルは、RemoveFontMemResourceEx で開放
 */
HANDLE LoadResourceFont( HINSTANCE hInst, UINT uID )
{
  HANDLE  hResFont;
  HGLOBAL  hGlobal;
  HRSRC  hRSrc;
  DWORD  dwSize, dwInst;
  LPVOID  lpLock = NULL;

  hResFont = NULL;
  hRSrc = FindResource( hInst, MAKEINTRESOURCE(uID), RT_FONT );
  if( hRSrc != NULL ){
    hGlobal = LoadResource( hInst, hRSrc );
    if( hGlobal != NULL ){
      dwSize = SizeofResource( hInst, hRSrc );

      lpLock = LockResource( hGlobal );
      if( lpLock != NULL ){
        hResFont = AddFontMemResourceEx( lpLock, dwSize, NULL, &dwInst );
      }
      FreeResource( hGlobal );
    }
  }
  return hResFont;
}

まず、フォントファイルはリソースに登録できます。
そのリソースは、FindResourceでハンドルを取得できます。
LoadResource、SizeofResource、LockResourceとリソースからグローバルハンドル(メモリブロック)へデータの型を切り替えていきます。
メモリ上のフォントリソースをAddFontMemResourceExで登録することで、リソースのフォントを使用することができます。
登録されたフォントは、CreateFont系APIで書体を指定できます。
AddFontMemResourceExで登録したフォントリソースはRemoveFontMemResourceExで開放することができます。

ただ、フォントの多くは、ファイルサイズが大きいです。10メガ越えも珍しくありません。
# ビットマップフォントは比較的軽いですが
ファイルサイズの大きすぎる実行ファイルは「なにがあるんだ?」と思われてしまいます。
圧縮でもできればいいんですけどね。

2007年5月29日火曜日

devkitDC構築メモ(その1)

春先から手を付けていたDreamCast(SH4とARM)向けのgccをMinGWでビルドして、devkitProにビルトインする作業がなんとか完了しました。
今月初旬の時点でビルドは出来ていたのですが、dc-tool-ipで実機に転送→実行すると動かないという現象に遭っていました。
これは、gccの最適化でKOSカーネルに定義されているテーブルが一部無くなるという不具合のせいでした。
# KOSはすべてのソースが公開されていますので、リビルドできます。というかしないといけません
KOSに間違いは無い、自分のビルドがおかしいとばかり思い込んでいて、つい最近まで2ちゃんねるのスレッドでアドバイスをいただくまで気づきませんでした。
そんなわけで、devkitDCの構築メモを何度かに分けて公開します。
まずは、環境構築について説明します。

msysは、公式サイトのものを使用しました。
devkitProのインストール時に入れるものはコマンドが一部足りません。testとか。
作業は、MinGW内の/buildディレクトリで行いました。
前準備のスクリプトです。
#!/bin/sh

EXTRACTS=0
PATCHES=1

if [ $EXTRACTS -eq 1 ]
then
  tar zxvf binutils-2.17.tar.gz
  tar jxvf gcc-core-4.1.2.tar.bz2
  tar jxvf gcc-g++-4.1.2.tar.bz2
  tar zxvf newlib-1.15.0.tar.gz
fi

if [ $EXTRACTS -eq 1 ]
then
  cd ./binutils-2.17
  patch -p1 < ../patches/binutils-2.17.patch
  cd ../

  cd ./gcc-4.1.2
  patch -p1 < ../patches/gcc-4.1.2.patch
  cd ../

#  cd ./newlib-1.15.0
#  patch -p1 < ../patches/newlib-1.15.0.patch
#  cd ../
fi

gccとbinutilsには、本家devkitProのVista対応を銘打ったパッチを適用しています。
newlibにもパッチがありますが、これは適用してはいけません。

2007年5月28日月曜日

転校続きGraphEdit(DirectShow)

Download details: Microsoft Windows SDK for Windows Vista
部屋を掃除していたらUSB接続のカメラが出てきた。

Vistaでも使えるのかな? と思い、DirectShowのツールであるGraphEditを探したのだけどDirectXのSDKに入っていない。
いつの間にやら標準のSDKに引っ越した模様。
にしてもこのSDKはなんだ?
でかいうえにそれと同じぐらいのアップデータがある。
インストールしてみた結果、カメラのドライバを探さないといけないらしい。

2007年5月27日日曜日

続きを読む、の実装

I saw seashells.: Blogger で「続きを読む」機能を。-- 3.5
cssとかjavascriptとか構文はまぁなんとかなるんですが、機能としてどんなものがあるのかわからないとコピペソースを探しますね。
諸先輩の皆様には当分お世話になるかと思います。

針小棒大

タグまで付けて、こう書いてしまうとずいぶん偉そうなのですが、自分よりキャリアの浅いメンバと接することがあります。
良いところ、悪いところあってジェネレーションギャップすら感じることもあります。
まぁ、感じたことに感心したり困ってるだけではもったいないので、メモに残したいと思います。
# 自戒の意味も含めて振り返られるようにすることも含めて



さて、本題。
針小棒大(しんしょうぼうだい):四字熟語データバンク
いまの仕事場に、なんでも誇張する人がいます。
「~(コンビニ)のおにぎりがすごくうまい」
「友達のマシンがCore 2 Duoなんですけど、とんでもなく激早ですよ!!(体感で)」
「携帯電話は自分が持ってる機種が一番かっこよくて、自分が契約しているサービスが一番いい。他のはダメだね」
「(マイナーなOSを触って)なんでこんなメチャ使いにくいOS使ってるんですかね? ダメOSじゃないですか」
休み時間の話題から、仕事をしていての意見まで。
モノによっては、顧客の批判にさえなりそうな過激な批判もあります。
# 一般的かわかりませんが、客先の製品を批判しないという誓約書があります
自分も物事を批判するときに文章が硬いので、強張って読めてしまうという意見をよく聞きます。この文章もきっとそうでしょう。
なので、彼をなんとかしようとは思いません。
実際に指摘してみたのですが、聞き入れてもらえませんでしたし。

ここまで書いて思ったのですが、彼の針小棒大という特性には「誇張」以外に「他の否定」がついてきます。
不必要な誇張で報告がぼやけることはもとより、物事を否定されると否定された側にダメージを与えます。
彼的にいえば「大ダメージ」です。
ちょっとした雑談で.NETの話しをしたら、「自分のところに仕事で回ってくる確立ゼロなんでまったく興味ないです」と答えられてしまいました。
実際に「・・・じゃあ今後この話題はしないことにするか」と思ってしまいましたし。
発言というのは自分以外のモチベーションにも影響を与えているんですね。気づいて欲しいなー・・・。

2007年5月24日木曜日

MDIアプリでアクセラレータが受けられない

コードを張るテストを兼ねて、最近ハマったネタを。

HWND hWndMain, hWndClient; // メインウィンドウとMDIクライアント
MSG msg;
HACCEL hAccelTable;

/* snip */

while( GetMessage(&msg, NULL, 0, 0) ){
  if( TranslateMDISysAccel( hWndClient, &msg ) != FALSE ){
    continue;
  }
  if( TranslateAccelerator( hWndMain, hAccelTable, &msg) == FALSE ){
    TranslateMessage( &msg );
    DispatchMessage( &msg );
  }
}

上述は動くことを確認したコードなんですが、ウィザードが吐くTranslateAcceleratorの第一引数はmsg.hwndです。
msgの内容はGetMessageによって変わるので、msg.hwndがhWndMainである保障はありません。
通常、アクセラレータを受け取るのはメニューを持った親ウィンドウだけなので、つまづかないんですが・・・ハマってしまいましたorz

2007年5月23日水曜日

iGoogleのテーマ機能

STUDIO dejavu:「iGoogle」のテーマを設定する
GoogleのパーソナライズがiGoogleの名称変更してから、ページのテーマが選べるようになりました。
なにも考えずにスイートドリームを設定していたのですが、なんだか見る時間によって絵が違う。
これに気づいたとき、あるLifeHack系サイトの記事を思い出しました。
シゴタノ! - 時間の経過を壁紙で知る
iGoogleのテーマは、更新しないと変わらなかったり、日が出てるか沈んでるかぐらいのアバウトさなんですが個人的にはよくブラウザを開くので便利・・・かも。

ごあいさつ

thoughtarchivesなんてたいそうなタイトルですが、いろいろ残すところとして作ってみました。
その時々にハマっているものを中心に書いていきます。