第2章の1

  • Pstat.exe

現在ロードされているカーネルモードコンポーネントがリスト表示される。(cmd)
(WindowsXPサポートツール、PlatformSDK に付属)

WindowsのNative API 関連

  • sysinternals.com の Inside the Native API のarchive

Sysinternals Freeware - Inside the Native API

  • Native API 関連のリンク集

Develop/Native API - SyncHack

  • Native API を表示してみる

自分のPCのWindows\system32\フォルダ内にある、ntoskrnl.exeや、ntdll.dllを、dependency walkerで開くと、関数名が見えます。
また、本の P.85 にプレフィックス命名規則が記載されているので、手掛かりになるでしょう。

Debugging Tools for Windows

インサイド Microsoft Windows 第4版 を読み始めたので、
メモ代わりに書いていきます。

Debugging Tools for Windowsとは?
- Windowsの様々な動作情報や、デバッグを可能にします。

ダウンロードはコチラから
http://www.microsoft.com/japan/whdc/DevTools/Debugging/default.mspx

※Debugging Tools for Windowsに含まれるもの
・tlist /t 現在動作中のプロセスを表示するコマンドラインツール

※個別に提供されるもの
・Process Explorer 高機能版、タスクマネージャーという感じ。ここからデバッグも行える?
前に、777townのバグを解決した時も、これを使用した。
・QuickSlice
ダウンロードはコチラ
http://www.microsoft.com/downloads/details.aspx?FamilyID=6247bb76-13c5-4e0e-b800-53dc1b84a94c&displaylang=en&Hash=xaahzAi%2fGrgH1hXLByxgCn5II0cSD4wS6rmbtRSmA%2fpuLD9nRXGeLRgk8Z5fq9dkZHL1ChiL9g0n%2bfjuvbNNyg%3d%3d

Globalization と Lcalization

★Globalization

グローバリゼーションは、複数のカルチャで機能するアプリケーションをデザインおよび開発するプロセスです。
MSDNASP.NETのページより

★Localozation

ローカリゼーションは、アプリケーションを指定したカルチャおよびロケール用にカスタマイズするプロセスです。
MSDNASP.NETのページより

正直、良く分かっていないので違うかもしれませんが、
 Globalization -> アプリケーションを多地域・多言語対応とする枠組みを作る作業
 Localization -> アプリケーションの個々の地域・言語に関する部分を作る作業

という気がします。

※ちなみに、C# で実際にフォームを作ってみた場合、
同一のフォームで、コントロールのtextプロパティなどを分ける事ができました。
そして、各言語用のresxファイルが自動で作成されていました。
また、言語別に(位置等の)デザインも変更することができました。

★Culture
  ・カルチャー情報は、.NETが勝手にシステム情報を元に読み込むので、通常(Glibalization非対応の場合は)変更する必用はない
  ・カルチャーを変更する方法
    ※フォームが表示される前に
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("fr-CA");

    CultureInfoクラスには、カレンダー、日付のフォーマット、通貨のフォーマットなどの情報が含まれている。
    それらは、Culture code によって特定される。("fr-CA"等の文字列)

ドラッグアンドドロップ

★ドラッグ元コントロールでやる事

・MouseDown(TreeViewではItemDrag)等のイベントをハンドルし、DoDragDrop(データ、DragDropEffect) を呼び出す。

★ドロップされるコントロールでやる事

・AllowDrop プロパティを true に設定する。(これがないと、データを受け付けない)

・DragEnter イベント
  e.DragDropEffect を設定する。
  ※ここで設定しない or 呼び出し元の DoDragDrop()で設定していない値を設定すると
   次の DragDropイベントが発生しない。

・DragDrop イベント
  データを受け取ったり、実際の処理する。
  データを受け取る場合は、適切な型にキャストする事。
  (キャスト)e.Data.GetData(データ型を表す文字列)

サミー777タウンのPortal.exeが落ちる件

サミー777タウンのPortal.exe起動中に、ログイン画面まで行かずに無言で終了してしまうという問題に悩んでいましたが、
本日解決しましたので、載せておきます。

[症状]
ゲーム起動のショートカットから起動する。
777boot.exeが起動
update.exeが起動
(アップデートが存在すれば)アップデートが開始し、正常に終了する
Portal.exeが起動する
"ポータルプログラムを起動します"と表示され、消える。
このまま何も起こらない。

ここで、タスクマネージャーで確認すると、Portal.exeが終了している(消えている)
当然ログイン画面が表示されない。


[不具合が起こった経緯]
ある日までは、正常にゲームが出来ていたが、
ある日(おそらく、777タウンのアップデータ)を境に、急に起動しなくなった。


[前提]
動作環境は満たしている
起動した前後に、特に何かのソフトをインストール/アンインストールなどはしていない


[私の解決策]
YAMAHAのUSB-MIDIドライバをアンインストールした
http://www.yamaha.co.jp/download/usb_midi/index.html

上記よりファイルをダウンロードし、中に入っている uninstall.exe でアンインストールした。


[情報]
Process Explorer を使用して、777boot.exeの起動から追っかけてみました。
777boot.exe→update.exe→portal.exe と進んでいく中で、いくつか赤太字のエラーが出ていましたが。
portal.exeが落ちる直前のエラーが XGUSB.CPL というものに関するエラーでした。
そのエラーの直後に、Exception が多発した後に、Portal.exeが終了していました。

"XGUSB.CPL"でググって見たところ、yamaha usb-midi driverに関するものだったので、
削除してみたら、起動した(☆)

※ちなみに、YAMAHAのUSB-MIDIドライバは、私が所有するUX16というMIDIインターフェースについていたドライバで、
この現象が起こる前からインストールされており、777townもmidiも、どちらも正常に使用出来ていました。

私がインストールしていたUSB-MIDIドライバは、1.5?1.6?(最新は2.2.2?)だったので、
もしかすると、アンインストールせずに最新版にアップデートするだけでも、
本現象は解決するかもしれません。

[サポートの対応]
FAQに書いてあること以外のサポートは受けれませんでした。
・グラボ・Directのドライバを最新に
・ウィルスソフトも切ってみる
・ディスクチェック&デフラグ&777タウンの再インストール

それでもだめなら、OSの再インストールしか無理だそうです。
#まぁ、そうなるでしょうね。

DCT6回目 考えてみましたが、まぁ、結果はあんまりです。

時間が出来たので、前回の続きを考えてみました。

結論を先に言ってしまうと、
・DCTとは、与えられた値を波に分解して、各々の波がどの程度含まれているか?を表す値に変換する
・逆DCTとは、各々の波がどの程度含まれているのか?という値から、元の値を復元する

という、至極当たり前の事しか分かりませんでした。
その中の過程が、具体的に見えた感じでしょうか。

ただ、DCTの理論(なぜ波に分解出来て、元に戻せるのか?)という所は、
"これなら、なんとなく元に戻せそう"という感覚以外はありません。
それを理解しようと思ったら、私がやっているようなアプローチの仕方ではなく、
DCTの公式の証明を理解しないとダメそうです。


以下に、私が理解した事を、書いておきます。


DCT〜逆DCTの流れ

前程:
入力値は、8個の1次元配列とみなす。(例:5,8,-1,5,4,2,8,-1)

〜DCT〜
1.与えられた値を、波とみなす。
2.公式が示す波と照らし合わせ、以下を8回行う。
3.波が、どの程度含まれているかを計算する。

〜逆DCT〜
4.以下を8回行う
5.DCTの時に使用した波と、DCTの結果(どの程度含まれているか?という値)から、元の値を計算する。


----------------------------
もう少し詳しく。

ここでは、例として、入力値を
"5, 8, -1, 5, 4, 2, 8, -1" とします。

DCTした結果の、どの程度含まれるか?という値は、
"10, 2, 0, 3, -1, 1, -7, -1" となります。(小数点以下切捨て)

元に戻すと
"4, 7, 0, 4, 4 , 1, 6, 0" となります。(小数点以下切捨て)

※小数点以下切捨てを2回やっている為、値が完全には戻っていませんが、それはご愛嬌


図1 入力値のグラフ

図2 波に分解するイメージ
青線:DCTの公式で使用する波
緑線:入力値を、青線の波の要素に分解した波


1.与えられた値を、波とみなす。

入力値を波とみなしてグラフにしてみます。
"5 , 8, -1, 5, 4 , 2, 8, -1"

図1を参照


2.公式が示す波と照らし合わせ、以下を8回行う。

ここで、波について考えます。

波といっても、所詮、関数です。
関数といのは、2つの値のペアの間に存在する関係を示したものです。

2つの値のペアとは、(5 ,6) (10, 11) (100, 101) のようなもので、
2つの値のペアの間に存在する関係とは、この場合、"右の値は、左の値+1" という事です。

波も同様で、DCTで使用する波も、
x=0,1,2,・・・・ と進むにつれて、 y の値が増えたり減ったりというのを繰り返すというだけのものです。

図2の青線を見てもらえれば、DCTで使用する波は、規則的に、ウネウネします

3.波が、どの程度含まれているかを計算する。

ここでやっているのは、
入力値の波と、公式の波を見比べる事です。
(図1と、図2の青線を見比べて下さい)

入力値の波の x=0 の値と、 公式の波の x=0 の値、 2つの値の間の関係を調べます。
それを、x=1,2,・・・・,7 と続けてやっていくと、
個別の値ではなく、波と波との関係性が出てくるみたいです。

一つの波に対する関係性で表せるのは、大雑把な関係性でしかありません。

これを、8個の公式の波それぞれに対して行う事で。
おそらく、全てのパターンに対応する事が出来るのでしょう。
(最後に1/2するのは謎)


ここで、波がどの程度含まれるのか?という値が意味する事について。

値が0の時、 その波は含まれていない(よって、常に 0 の直線)

緑線:値が0以上1未満の時、公式の波と比べて、波が上下する間隔は同じだが、上下に起伏する高さが穏やかな波を表す。
青線:値が1の時、公式の波と同じ波
赤線:値が1以上の時、公式の波と比べて、波が上下する間隔は同じだが、上下に起伏する高さが激しい波を表す。
ピンク線:値が負の数の時、公式の波を反転した波を表す


4.以下を8回行う
これは説明不要ですね

5.DCTの時に使用した波と、DCTの結果(どの程度含まれているか?という値)から、元の値を計算する。

公式で使った波と、どの程度含まれるか?という値で、8つの波が出来ますね。
(図2の緑線を見てください)

で、入力値(5, 8, -1, 5, 4, 2, 8, -1)を求めるわけですが、
入力値の1番目の値(5) は、
1番目の波の x=0の値と、 2番目の波のx=0の値、・・・・、8番目の波のx=0の値 を合成すれば良いのです。
(図2の緑線のグラフから"目分量"で計算すると、7 + 2 + 0 + 2.5 + -1 + 1 + -2.5 + 0 = 9 (1/2したら 4.5 ≒ 5))
(最後に1/2するのは謎)

同様に、2番目の値も(8)、それぞれの波のx=1の時の値を合成すれば良いのです。

こうして、元の値が取り出されるわけです。


どうでしょうか?
何となくイメージが伝わると良いのですが・・・・

感想お待ちしております

DCT5回目 逆変換

公式

=====逆変換========================================
             7
Sx(x) = 1/2 * Σ  * C(u) * Su(u) * cos( (2x+1)uπ/16)
            u=0
但し、C(u)は、
    u=0  の時、1/√2
    u≠0 の時、1
===================================================

では、x=0 の時の、逆変換の様子を見ていきます。
式は、以下になります。

             7
Sx(0) = 1/2 * Σ  * C(u) * Su(u) * cos( uπ/16 )
            u=0
    u=0  の時、1/√2
    u≠0 の時、1

Σの中を展開すると、

Sx(0) = 1/2 * ( 1/√2*Su(0)*cos(0) + Su(1)*cos(π/16) + Su(2)*cos(2π/16) + ・・・・ + Su(6)*cos(6π/16) + Su(7)*cos(7π/16) );
となります。
x=1、2、・・・・の時も、cos()の中の値が変わるだけです。

下記に、それぞれの時の値を表にします。

【コサイン内の角度(逆変換時)】

u=0 u=1 u=2 u=3 u=4 u=5 u=6 u=7
X=0 0.00° 11.25° 22.50° 33.75° 45.00° 56.25° 67.50° 78.75°
X=1 0.00° 33.75° 67.50° 101.25° 135.00° 168.75° 202.50° 236.25°
X=2 0.00° 56.25° 112.50° 168.75° 225.00° 281.25° 337.50° 33.75°
X=3 0.00° 78.75° 157.50° 236.25° 315.00° 33.75° 112.50° 191.25°
X=4 0.00° 101.25° 202.50° 303.75° 45.00° 146.25° 247.50° 348.75°
X=5 0.00° 123.75° 247.50° 11.25° 135.00° 258.75° 22.50° 146.25°
X=6 0.00° 146.25° 292.50° 78.75° 225.00° 11.25° 157.50° 303.75°
X=7 0.00° 168.75° 337.50° 146.25° 315.00° 123.75° 292.50° 101.25°

【コサインの実数値(逆変換時)】

u=0 u=1 u=2 u=3 u=4 u=5 u=6 u=7
X=0 1.0000 0.9808 0.9239 0.8315 0.7071 0.5556 0.3827 0.1951
X=1 1.0000 0.8315 0.3827 -0.1951 -0.7071 -0.9808 -0.9239 -0.5556
X=2 1.0000 0.5556 -0.3827 -0.9808 -0.7071 0.1951 0.9239 0.8315
X=3 1.0000 0.1951 -0.9239 -0.5556 0.7071 0.8315 -0.3827 -0.9808
X=4 1.0000 -0.1951 -0.9239 0.5556 0.7071 -0.8315 -0.3827 0.9808
X=5 1.0000 -0.5556 -0.3827 0.9808 -0.7071 -0.1951 0.9239 -0.8315
X=6 1.0000 -0.8315 0.3827 0.1951 -0.7071 0.9808 -0.9239 0.5556
X=7 1.0000 -0.9808 0.9239 -0.8315 0.7071 -0.5556 0.3827 -0.1951


あれ??
この表は、前回の記事で書いた、変換時の表と(表の組み方が入れ替わっただけで)同じですね。。。