月別アーカイブ: 2007年9月

em1key Bluetooth keyboard RBK-2000BTII の設定 その2

Bluetooth Keyboard RBK-2000BT2 の日本語キーボード化カスタマイズを
下記エントリで紹介しました。
em1key Bluetooth keyboard RBK-2000BTII の日本語カスタマイズ例
さらにカスタマイズを行い、任意に ON/OFF できる設定ファイルを
作ってみました。

scriptcommand_RBK2K_JP.txt

上記ファイルをダウンロードしたのち、ファイル名を scriptcommand.txt
にリネームして em1key でご利用ください。

ファイルの 290行目 以降にある CSW_~ のシンボルが、各種設定の
有効・無効を切り替えるスイッチになっています。TRUE で有効、
FALSE で無効です。

このファイルは RBK-2000BT2 向けの設定のみ抽出しているので、
それ以外の余計な機能は含まれていません。機種を問わず利用しやすく
なっていると思います。またカスタマイズの参考用にどうぞ。

前回の記事からさらに、下記のカスタマイズが追加されています。
もちろん個別に ON/OFF できます。

● SHIFT+[0] で ‘_’

SHIFT+[0] キーで ‘_’ を打てるようにします。

● [/?] を本来の位置に配置する

[/?] キーが遠くに離れているので、つい ‘/’ を打とうとしてカーソルが
上に移動してしまいます。そこで次のような置き換えも行ってみました。

キーボード右下のキー群

[.>] [↑] [Sft] [/?]
[←] [↓] [→] [Del]

  ↓

[.>] [/?] [Sft] [\|]
[←] [↓] [↑] [→ ]

これで、’/’ や ‘?’ を本来のキー位置で打てるようになります。
その代わりカーソルキーの配列が横一列になってしまいます。
でも実はこれ、vi カーソルと全く同じ並びなので
個人的にはかえって都合が良かったりします。

無くなった [Delete] キーは Ctrl+[BS] で入ります。

作者が実際に使っている設定は、em1key デフォルトの
scriptcommand.txt に RBK2K 用のキー入れ替えを追加したものです。
内蔵キーボード用の設定と外部キーボード用のカスタマイズを共存
させています。こちらもアップロードしておきました。
追加部分はファイルの最後のみで、完全に独立しています。
個別に ON/OFF できるようなスイッチは特に設けていません。
scriptcommand_default_RBK2K_JP.txt

日本語キーボード化の次は 親指シフト 設定も試してみよう、
と思っていたら、すでに遠藤さんが設定を作成しており
こちらのエントリで公開されていました! たいへんありがたいです。

遠藤諭の東京カレー日記 Advanced/W-ZERO3[es]で親指シフト(追加)

Direct3D 10 HLSL のプリプロセッサ機能の限界

DX10/D3D10 では Effect(fx)/HLSL のプリプロセッサが拡張されている
ことを下記のエントリで書きました。
Direct3D 10 HLSL の関数型マクロ定義

その後もう少しだけ調べてみましたが、残念ながらまだ C/C++ と
完全互換というわけにはいかないようです。
もしかしたら BOOST_PP でも動くんじゃないか、と思って試したら
甘かったです。

●引数無しの関数型マクロが定義できない

#define NAME_A() 0x40f

上記のような引数無しの関数型マクロ名がエラーになります。
ダミーでも NAME_A(_r) のように何か引数を与えないとだめでした。

●意味のない # 行が無視されない

例えば単独で出てくる行頭の ‘#’ のみの行がエラーになります。

●#if 等で bit 演算できない

#if BITFLAG & 4

こんな形の bit 判定はエラーになります。| や ^ 等もだめ。
一般的な四則演算や論理演算はもちろん大丈夫です。

Effect(fx)/HLSL 単体でここまで凝った使い方をすることはあまり
無いかもしれません。
ただ、定数シンボルなどを共通化するために C++ ソースとヘッダを
共有する可能性はあるので、この辺の互換性には注意しておきたい
ところです。

内蔵 Preprocessor は動的コンパイルでは必要になります。
でも、もし完全に事前コンパイルしてもいいのならば、普通に C++ の
プリプロセッサを通した方が良いかもしれません。
従来 DirectX8(vsa/psa)~DirectX9 の時はいろいろ機能的に
物足りなかったので、例えば下記のような感じで Makefile を
作っていました。

# Makefile
# nmake 用

PROFILE	= fx_4_0
FXINCLUDE = -I.

.fx.fxo:
	cl /E $< $(FXINCLUDE) > $*.tmp
	fxc /T$(PROFILE) /Fo$@ $*.tmp

.SUFFIXES:	.fx .fxo

sysdef.fx というファイルが存在する状態で sysdef.fxo を作りたければ
コマンドラインから

nmake sysdef.fxo

とキータイプするだけです。Makefile はカレントに必要です。
nmake.exe や cl.exe、fxc.exe 等にパスを通しておく必要があります。

VisualStudio は Common~\IDE と VC\bin の2箇所にパスが通って
いれば OK です。例えば 32bit(x86) + VS2005 でパスを通しておく
フォルダは下記の通り。

%DXSDK_DIR%Utilities\Bin\x86
C:\Program Files\Microsoft Visual Studio 8\Common7\IDE
C:\Program Files\Microsoft Visual Studio 8\VC\bin

VisualStudio にこだわる必要は無く、gcc など他の C/C++
プリプロセッサやコマンドでも全く同じように使えます。
Makefile の書式は make コマンドによって若干異なります。
ちょっと混用して gmake + cl だとこんな感じでしょうか。

# gmake の場合
PROFILE	= fx_4_0
FXINCLUDE = -I.

%.fxo: %.fx
	cl /E $< $(FXINCLUDE) > $*.tmp
	fxc /T$(PROFILE) /Fo$@ $*.tmp

Direct3D 10 HLSL の関数型マクロ定義

SDK マニュアルを見ていて HLSL Grammar の Operators に
‘##’ や ‘#@’ という演算子を発見しました。
これは本来 #define マクロの引数に適用される演算子です。

これまで Effect fx/HLSL のプリプロセッサは非常に制限された
ものだと思っていました。例えば

・#define も基本的に定数や #if 用。
・引数を伴う関数型のマクロ定義は出来ない。

などなど。
もしやと思って実際に試してみたら、なんと関数型の引数を持ったマクロも
普通に定義して使うことが出来ました。

例えば上記演算子を使ってみるとこんな感じです。

#define	VARNAME(_n,_m)     _n##_m
#define	SEMANTIC_TEX(_id)  TEXCOORD##_id

float VARNAME(light,ambient)= 1.0f;

void VS_Main( uint vid : SV_VertexID,
			out float4 opos : SV_POSITION,
			out float2 ouv : SEMANTIC_TEX(0) )
{
  :

この場合 VARNAME(light,ambient) は「lightambient」と
連結された変数名になるし、SEMANTIC_TEX(0) は TEXCOORD0 に
置き換わります。

#@ は文字定数 ‘~’ への変換に相当します。例として次のように
記述してみます。

#define LCHAR(_n)	#@_n
int id= LCHAR(Z);

LCHAR(Z) は ‘Z’ に置き換わりました。つまり

int id= 'Z';

と等価です。

引数の文字列定数化を行う、単一の ‘#’ 演算子はありませんでした。

使えないと思っていたのでかなり驚きました。思い込んでいただけで
しょうか。
SDK Sample fx から “define” を検索しても、やはり引数を持った
関数型の define は全く使われていないようです。

試しに DirectX SDK 2006 October の fxc.exe (DX9向け) で実行したら
エラーになりました。
同じ 2006 October の fxc10.exe ではコンパイルが通ります。
D3D10 で HLSL 用プリプロセッサの機能拡張が行われたことは間違い
なさそうです。

Preprocessor は HLSL コンパイラ DLL 呼び出しとは別なので、/LD
オプションは使えませんでした。
D3D10 core API 側の Preprocessor が呼ばれると拡張タイプになり、
D3DX9 側の Preprocessor だと従来どおりの簡易型になるのではない
かと考えられます。

結論
・Direct3D10 の HLSL/Effect(fx) では、従来使えなかった関数型の
 マクロ定義が使える
・さらにマクロ引数の演算子 ## と #@ も使える

新しい Let’s note と DirectX API

パナソニック、「Let’snote」全モデルでSanta Rosa搭載~Turbo Memory搭載「R7 プレミアムエディション」も

最初はそろっていた番号が徐々にずれ始め、
ばらばらにカウントされていた番号が
7 でまた一斉に揃う。
これを見てすぐ歴代 DirectX API の番号を思い浮かべた人は
たぶん ほとんどいないと思います。

帯域不足

同じ周波数帯を使う Bluetooth と 2.4GHz の無線LAN (11b/g) では
干渉があることは良く知られています。マウスなど他にも同じ周波数
を使う機器もあるし、同じプロトコル同士でも距離とチャンネルに
よっては、同じように干渉することもあるようです。

人間の音声も視聴可能な周波数と発声可能な周波数は限られているため、
狭い場所に同時に多人数が押し込められた状態では、それぞれの
個々が個別にコミュニケーションをとると同様に干渉が発生します。

お互いに周りのノイズに打ち勝つためには信号レベルを上げる必要があり、
徐々に大声になってさらに周囲のノイズが増大する悪循環に陥るようです。

ひとつの区切りの中に大勢の人がいる状態では、
会議のようにどこかで同期をとる、一定の距離をあける、
発言人数を制限する、等の対策が必要となるようです。
音声以外の他のコミュニケーション手段も併用する、等の工夫も
何かできないものかと昨日の夜のイベントでふと思いました。