Visual Studio 2008

VisualStudio2008 がリリースされたのでインストールしてみました。
とりあえず Express Edition で。インストールフォルダは 9.0。
とりあえずCコンパイラのバージョン比較

・VisualStudio2008 Express Edition cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86

・VisualStudio2005 Professional cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86

追加されたコンパイルオプションは次の3つでした。

/Qfast_transcendentals  generate inline FP intrinsics even with /fp:except
/Qimprecise_fwaits      generate FWAITs only on "try" boundaries, not inside "try"
/MP[n]                  use up to 'n' processes for compilation

どれくらい効果があるのか、MP オプションがかなり気になります。
Multi Processor 対応で build してくれるそうです。
MP オプションの詳細や使い方は下記のとおり。
/MP (Build with Multiple Processes)

その他増えた機能などはこちら。

What’s New in Visual C++ 2008

Intrinsics も SSE4 に対応したようですね。
intrin.h も更新されています。
新しい SSE 関連の Intrinsics 命令の説明は下記のページです。

Supplemental Streaming SIMD Extensions 3 Instructions
Streaming SIMD Extensions 4 Instructions
SSE4A and Advanced Bit Manipulation Intrinsics

動作環境がないので試せないけど、
かなり面白そうな命令が多数並んでいます。

関連エントリ
SSE についてのメモ(2) SSE4など

WindowsMobile touchkeysip / ctrlswapmini

以前「続 キーボードの作り方 / WindowsMobile (SIP)
で書いたように、指で直接操作できる新しい SIP を作ってみました。

touchkeysip
WindowsMobile5/6 で動作します。

スクリプトにより各キーの機能やレイアウトなどもすべて再構築
できます。
キーボードの画像は文字を並べてるわけではなくて bmp の一枚絵です。
こちらも簡単に作成&入れ替え可能です。

最近は外付けキーボードしか使ってなかったので、
bluetooth か USB ホストがあればこれで十分な気がしてきました。

さまざまな機種での動作報告とか、キーボードのデータ絵とか、
カスタマイズデータとかできましたら、
ぜひご連絡いただけたらなと思っております。

また ctrlswapmini の方ですが、拡張かな時に Advanced W-ZERO3[es]
WS011SH の場合、カーソルキー右でトグル操作を区切れないとの報告が
入っています。

たとえば 「かか」と入力する場合、[2か][→][2か]と操作しても
右カーソルキーが実際に機能してしまうそうです。

W-ZERO3[es] WS007SH ではきちんと動作しているので、機種依存の問題の
可能性があります。実機がないため確認及び調査できませんが、
より詳しい情報をお持ちの方がいましたらご連絡お願いいたします。

Windows Vista x64 のデスクトップアプリケーションヒープ

Vista x64 環境に移行して、以前よりも安定して運用できています。
今のところ自分の使う範囲では、ソフトもハードも特に困ったことはなく
メリットが大きいので気に入っています。
といっても必ずしも RAM 増えたわけでもなく、仕事で使ってる PC は
x86 時代と同じ 2GB のまま。
具体的にどこが違うのかといえば、ウィンドウを大量に開いても動作が
不安定にならなくなりました。

x86 で Console x5、VisualStudio 2005、Maya、IE7 等を起動した
状態でさらに Vim を 14 枚ほど開くと、ウィンドウの UI パーツが
ところどころ表示されなくなっていました。
ツールによっては保存等のダイアログが表示されなくなったり、いろいろ
挙動があやしくなります。

調べてみると、これはデスクトップアプリケーション用ヒープが足りない
状態に相当するようです。デスクトップアプリケーションヒープはこの辺に
多少説明があります。

Microsoft [PRB] User32.dll または Kernel32.dll の初期化に失敗する
MS デスクトップ アプリケーションのヒープを増やす

メインメモリの容量に関係なく、このヒープは一律 3MB 割り当てられて
いるようです。レジストリの設定で増やせますが、大幅な追加は推奨し
ていないようです。目いっぱい RAM を搭載できる現在、これがどの程度
システムに影響を与えるのか、その根拠についてはわかりません。

Vista x64 で同レジストリエントリを調べると、32bit OS のおよそ
6.6倍に相当する 20MB 割り当てられていました。

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows
SharedSection=1024,20480,768 
Windows=On SubSystemType=Windows ServerDll=basesrv,1
ServerDll=winsrv:UserServerDllInitialization,3 
ServerDll=winsrv:ConServerDllInitialization,2
ProfileControl=Off MaxRequestThreads=16

安定の原因は、単にこのデスクトップヒープが増えたおかげでしょうか。
そもそもヒープが足りなくなる原因はメモリリークらしいので、
もしそうだとしたら根本的な解決ではなく、先送りにしているだけ
かもしれません。

原因不明のメモリ不足エラーに対処する方法(デスクトップ・アプリケーション・ヒープ不足エラーに対処する方法)

続 キーボードの作り方 / WindowsMobile (SIP)

DBZ でもペンタッチは可能でしたが、あくまで手書きメモ専用と割り切った
ものでした。PV-F1 はこれを一気にメインの入力手段へと変えてしまいます。

あまりに高価だった PV-F1 を普及帯へ押し上げたのが PI-ZAURUS です。
初代 PI-3000 はまだ電源スイッチが付いていたものの、PI-6000 など
次々登場する後継機種ではついに電源スイッチすら廃止されます。

液晶画面のタップだけで電源が入るので、本体にはタッチパネル兼液晶画面
しかない、ある意味究極の形となりました。

そんな中ハードボタンが注目を浴びるようになった、Palm 等ほかの
PDA の人気によるものです。

・スクロールキー+アプリキーなどハードウエアボタン搭載
・縦型(縦長)のスタイル

どちらも Zaurus が築いてきたスタイルとは正反対であったものの、
MI-P1 以降、代を重ねるごとにその影響は強くなります。

これ以後 PDA の進化の方向は、
ペンオペレーションへ一気に傾倒しすぎた反動か
それとも使いづらく神経を使う操作性からの反動か、
QWERTY キーまで搭載して完全にハードウエアキー全盛となります。
手書き文字認識もほとんど忘れられた存在となってしまいました。

そして手本は Palm から携帯電話へと代わります。

PocketPC は世代ごとに、ハードウエアキー等の標準が変化しています。
・ゲームパッドのような CASSIOPEIA スタイル
・センターカーソルキー+左右にアプリケーションボタンの iPAQ スタイル

そして WindowsMobile では、左右のソフトキーが追加されました。
モードや画面、アプリケーションごとに自由に機能を割り当てられる
ソフトキーの存在は携帯電話と同じものです。

カーソルキー+ソフトキーだけでほぼ全部の操作が可能で、旧 PocketPC
用に作られたアプリ以外はほぼペン操作無しに扱えるようになりました。

PDA の操作が徐々に携帯電話化していく中、突如再びタッチパネルの
時代が訪れました。

その第一段階は DS の登場です。PDA では使い古されたはずのペン
オペレーションが、ゲームでは斬新なものとして大きく脚光を浴びました。

そして iPhone & iPod touch の登場が大きな事件であったことは
いうまでもありません。

WindowsMobile にもソフトウエア入力パネル (SIP) があります。
QWERTY キーボードやら、携帯電話風のテンキーやら備えた端末が多数
出ていてすっかり邪魔者扱いされがちな SIP ですが、
ここであらためて注目してみました。

かつて SIP を作ったときの記録は下記の通りです。
キーボードの作り方(1)
キーボードの作り方(2)
キーボードの作り方(3)

● WindowsMobile の SIP

WindowsMobile でも SIP の基本構造は全く代わっていないようです。
Dvoraksip のサンプルもほとんど同じものでした。
基本的には新しい SDK で Build するだけでよく、修正点はそれほど
多くありません。

唯一違う点があるとすれば、画面解像度のバリエーションが大幅に
増えたことです。
PocketPC2002/2003 の時代は QVGA 240×320 解像度しかなく、
画面の縦横切り替えすらありませんでした。

QVGA 用に作った SIP をそのまま VGA 機種に組み込むと、RealVGA 化
していなくても等倍の解像度で表示されます。
非常に小さく、針の先でつつくようなこじんまりとしたパネルになって
しまいます。

ハイレゾに対応した座標系の補正や、表示するリソースの拡大は SIP 側の
プログラム側で対応しておく必要があるようです。

デバイスの画面解像度は下記の API で取得できます。

int width= GetSystemMetrics( SM_SXSCREEN );
int height= GetSystemMetrics( SM_SYSCREEN );

画面を回転させたときも、きちんと移転後の縦横サイズを受け取る
ことができます。この値から縦横の判断もできるようです。

この画面解像度を元に、表示リソースの拡大縮小変換、ペンタッチ座標の
スケール変換を行えば、きちんと意図した座標で表示可能となります。

● ハイレゾ対応方法

VGA 機種で SIP を表示してもパネルのサイズが 240×80 のまま表示
されます。ウィンドウ領域や描画サイズを拡大しても変わりません。
これはパネルエリアの親ウィンドウのサイズが固定されているからです。

この辺もいろいろ試しましたが、やはり自分でリサイズする必要がある
ようです。パネル選択時に呼ばれる IInputMethod2::Select() には
親ウィンドウが渡されます。

IInputMethod2::Select( HWND hwndSip )

このハンドルを元にパネル領域のサイズ変更が可能です。
例えば VGA に対応した 480x160dot 等に拡大することができます。
また

IInputMethod2::GetInfo( IMINFO* info )

でも正しいパネルサイズを返す必要があります。

IInputMethod2::ReceiveSipInfo( SIPINFO* psi )

こちらの ReceiveSipInfo() は特に変更する必要はありません。

画面回転時は画面の幅が広くなりますが、このときは指定したサイズを
元に勝手にセンタリングされるようです。
縦横に応じてサイズを可変にすれば、横画面でも左右端まで使った
大きなキーボードを作ることができます。

iPod touch のように、本格的に指で使いやすい SIP を作ることも
可能だと思います。

ちなみに WindowsMobile5.0 の SDK で作成しておけば、そのまま
WindowsMobile6.0 でも動作します。

● IME の制御

キーボードの作り方(1) でも書いていますが、日本語入力モードの
切り替えは基本的にキーストロークのシミュレートでできます。
[ALT]+[漢字] や [全/半] など。
より安全に切り替えたり、現在の状態を参照する場合は Imm 系 API
を使います。

下記のコードは em1key 等で使用しているものの抜粋で WindowsCE
専用です。未確定バッファがあるときは IME を CLOSE できないように
なっています。em1key ではフック内では使わずに、一旦 Window に
ポストして代わりに呼び出してもらっています。

enum {
    IMECTRL_OPEN  = (1<<0),
    IMECTRL_CLOSE = (1<<1),
};

// 0= QUERY, 1= OPEN, 2= CLOSE, 3= 切り替え
int ControlEngine::ImeControl( int mode )
{
    HIMC    himc= NULL;
    int     openstat= ImmGetOpenStatus( himc );
    if( openstat ){
        if( mode & IMECTRL_CLOSE ){
            int	size= ImmGetCompositionString( himc, GCS_COMPSTR, NULL, 0 );
            if( !size ){
                ImmSetOpenStatus( himc, FALSE );
            }
        }
    }else{
        if( mode & IMECTRL_OPEN ){
            ImmSetOpenStatus( himc, TRUE );
        }
    }
    return  openstat;
}

参考
歴代ザウルス
歴代ポケットPC
※ DBZ は SHARP の電子手帳 PA-9500 シリーズ

DirectX 10.1 RADEON HD3800 シリーズ

とうとう Direct3D10.1 / ShaderModel 4.1 対応 GPU が出てしまいました。
スペック詳細はこちら

AMD ATI Radeon HD 3800 Series – GPU Specifications

またあわせて、Direct3D 10.1 の詳細も明らかになっています。
こちらは以前コメント欄で情報いただいたものと同じで、おそらくその
最終版と思われます。

AMD the ATI Radeon HD 3800 Series and MicrosoftR DirectX 10.1 whitepaper (PDF)

実際に動く GPU は出てきました。あと必要なのは、WindowsVista SP1 と
10.1 に対応したドライバです。この 2つさえそろえば Direct3D 10.1 対応
アプリも実際に動作するようになります。

HYPERでんち の GPU 年表や GPU リストも更新しました。
年表によると GeForce8800GTX の登場はちょうど一年前、2006年11月だった
ようです。その後実際に WindowsVista が発売されたのは 2007年 1月で、
さらにドライバの完成は 3月までまでかかっています。

10.1 が実際に使えるようになるのも、ちょうど 10.0 から 1年後の時期に
なりそうです。