SENSE - LESS MANEUVER -30ページ目

ロボット兵器運用 section02

二回目です。今回はロボット兵器の運用上の問題点について、一般的に言えることを話していきましょう。

シリーズ : ロボット兵器運用 第 02

本 論   :   ロボット兵器、その運用上の問題点


§1 : 一般的な問題点:整備性


では早速問題点について話していきましょう。

一般的な、つまり全般的に問題となる点は明白であると思われます。

それは「 メンテナンス 」、保守です。


さて、最新のテクノロジーのかたまりである戦闘機を一機維持するのにどれだけの人と金が必要でしょうか。

自衛隊にもありますF-15戦闘機の場合、1飛行時間あたり35人*時間が必要です。

1飛行時間あたり35人*時間。

1時間作戦を行って帰ってきて1時間後に飛び立つためには35人のグランドクルーが必要です。

例えば、1時間作戦を行って帰ってきて30分後に飛び立つためには、倍の70人が必要です。


これは実働下の話。


お金の方もかかります。燃料費、修理費、そもそも人を使って整備をすれば人件費…。


戦闘機ですらこれです。

であるならば、可動部分はとても多く、リニアアクチュエータをはじめとした高級部品を潤沢に使用したロボット兵器ならばその整備性たるや想像を絶する悪さになることは衆目に明らかであると思われます。


おそらく、高度な電子部品と、多くの可動部分はメンテナンス性を下げます。


結論は簡単です。

ロボットは大変に贅沢な兵器だと言うことです。

置いておくだけで人も金も食う兵器です。

エヴァンゲリオンの冒頭でもあったように

「 零号機に引き続き君らが初陣で壊した初号機の修理代および兵装ビルの補修…国がひとつ傾くよ 」

兵装ビルの補修は別にしても、国がひとつ傾きます。

ロボットアニメでは大量のロボットが出撃して、大量に散っていきますが、とんでもない。

一回出撃させるのだって何千万、何億という代物です。

本体価格も戦闘機が一機100億円。

おそらくこれより高い価格水準となることでしょう。

量産効果がかかってもです。


§2 : 一般的な問題点:本体


巨大ロボなんか無理だ! 物理的に無理だ!

とよく言われますが、おそらくそれは間違いです。

現代のテクノロジを持ってすれば、可能でしょう。

巨大ロボと言っても、ビルぐらいの大きさのものではなくて、ガンダムで言えば全長18メートル。

( これ、実は大きすぎるのです。本当は8~10メートルぐらいがちょうど良い。運用面から見て )

パトレイバーが大体8メートル。これは都内での治安維持活動に使うために大きすぎる機体は適さないと判断されたからです。


さて、軽量アルミやそのほかの新しい合金でおそらく10メートル程度のロボットならば十分に作れるでしょう。

現に3000万円で疑似二足歩行ロボットを制作した会社も存在します。


そこで問題となるのは、やはり、本体重量です。


ロボットは作れます。二足で歩きます。

ですが、ここで考えているのは軍用機です。

軍用ロボットを陸戦兵器として運用する以上、銃や砲、ミサイルと言った武装に対抗する手段が必要です。それはすなわち装甲。


いくら軽量な金属を使用した本体とはいえ、その支えることができる重量には限界が存在します。


そこで機動性と重装甲のトレードオフとなるわけですが( 足回りを丈夫な金属で作れば、重量限界はある程度ですが増すでしょう )、もちろん機動性を取るに決まっています。

重装甲にして機動性を落とすぐらいなら、最初からロボット兵器など必要ありません。


さて、どのくらいの装甲になるか、と言うことですが、ここからは大まかな話になります。


軽量なアルミ装甲。もしくはポリカーボネイトなどの有機樹脂と金属の複合材料装甲( 一般的な複合装甲ではありません )などになるでしょう。

耐弾性は、戦車の主砲、120mm滑空砲に対しては段ボール並。しかし戦車の主砲を食らうとは思えませんが( 機動性が確立している、と言う前提です )。

歩兵の対戦車兵器に対しても無力です。

あるいは、装甲車等に搭載されている機関銃に対しても無力です。

歩兵の小銃やあるいは爆発した榴弾の破片等による損害を防ぐためだけのものでしかありません。

ERA( 爆発反応装甲 )などを用いれば、ある程度重量を抑えて機動性を確保することができるかもしれませんが、ERAは被弾したら一回切りの使い捨てです。

もちろん爆発したらその衝撃が本体をおそうことにもなります。

ちなみにERAは、HEATなどのケミカルエネルギー弾に対しては有効ですが、キネティックエネルギー弾に対しての有効性は期待できるほどではないと言うことです。


結論。

あのとっても都合の良い合金でも使わない限り、装甲は耐弾性を期待できない。


§3 : 一般的な問題点:火力


先ほどの話から、重量に限界があることがおわかりいただけたと思います。

軍用ロボットは装甲を付して逃げ回るだけでは何の役にも立ちません。

武装が必要です。


まだ、ロボット機動兵器の具体的な運用については言及していませんが、その火力はかなり限定的なものにならざるを得ません。

標準装備として、戦車砲などの大口径砲はその重量限界から搭載不可能でしょう。

そうなると、IFVなどに搭載されている40mm機関砲などを搭載することになります。

対戦車火力として、40mmグレネードや歩兵の持つHEAT、HESHなどのケミカルエネルギー兵器に頼ることになります。

戦車を相手にして戦うとなれば、かなり不利な火力です。


機動性を犠牲にする補助装備を使用するならばある程度の火力は得られます。


ガンダムの世界でガンダムが陸戦兵器として第一戦で戦っているのは、ひとえにその特殊な金属から来る莫大なウェイトキャパシティ。

そして、レーザー兵器などの軽量で大火力を有する兵器が存在することによってです

( 余談。一般に誤解されているようですが、レーザー兵器は「溶かす」武器です。銃や砲とはその破壊プロセスが全く異なります )。


これから考えるロボット機動兵器にはあまりに非現実的なので、そういう設定は無視します。


今回はここまで。

次回は局面に応じた運用について考察します。


第02回 おしまい

雑記 : DMCその後 ほか

DMC…。

色々使えそうです。

気軽に使えるのがうれしいかも。

ただ、環境が悪いのか、コンパイラのバグか。

sprintfの挙動がおかしい

どうも、最初に( 例えば )4つの引数を取るとその後のsprintfも4つの引数を取りたがって、足りない( 多すぎる )とエラーを吐くと。

それで、どう考えても不必要( あるいは足りない )な引数を与えて走らせると謎の文字列を吐き出す。

ううん…。非常に不便。

cで文字列を扱おうとするとsprintf無しには難しいです。

とりあえず文字列の連結は

sprintf( buf, "%s%s", array1, array2);

が基本です。が、strcat()とか使う羽目になりました。

文字列のコピーはそのまま

sprintf( buf, "%s", array);

ですが、strcpy()とか使いました。

ちょっと難しいこと野郎とすると文字列をバッファで扱うよりC++にSTLでやったれー! てな感じになるので、この辺りの関数は滅多に使わないです。

ま、ただstrcmp関数を使わないで、わざわざループ回して書くのはアホですけどね。


VC++みたいにうん百メガも取らないし、サクラエディタにもなれてきたのでちょっとしたプログラムならDMCでいけそうです。これは楽しい。

プログラマとか言うならmakeぐらい自分で書けろよ、と言う意味が分かり書けてきた今日この頃でした。


構想はふくらむ。

戦略魔法軍

名前は、戦術空軍からの連想ですが。

魔法軍、と言うことは空軍や海軍、陸軍も別にあるわけです。

魔法は魔法軍でしか使わない。これ基本!


新戦闘国家を久しぶりにやってみる。

やっぱり難しくはないです。友軍がアホすぎ。でも守ってあげたくなる感じです。

馬鹿な子ほどかわいい。こんなこと言われないようなAIも考えないと。


戦略魔法軍の制作目的は主にノウハウ蓄積にあり、その得たいノウハウとは


・大規模なゲームにおける破綻しない開発のためのフレームワーク

・描画エンジン

・ネットワーク対応


この二点に集約されるでしょう。

SLG部分はこれに乗っける部分であって本質ではないのです。

デリゲートを実装させてこうタスク単位で駆動するモデルの実験とか、そういう目的です。


今日のおやつは森永のミルクココアケーキ

おそらく明日はインスタントお汁粉。

甘いものは正義です。

サブプロジェクト:思いつき

下の記事。ええ、なんだか欲深いところが丸見えで本当に申し訳ない。

聖人君子のごとき清廉さと天使のごとき純真さ、汚れを知らぬ乙女のような無垢さを兼ね備えたnVidiaの最新型ビデオキャプチャボードであるところのいるかさんとしては、実に申し訳ないのですよ、ええ。


で、設定思いつき。と言うかパクリだがな。


例えば戦車。さあ、モニタの前のあなたも90式戦車を頭の中にご用意ください。


どこからパクリかと言えば、SMAC( Sid Meier's Alpha Centauri)というシミュレーションゲームからです。

こいつには、技術開発で得た新技術を使ってユニットをアップグレードするシステムがあるのです。

例えば、生体適応共鳴を開発すると共鳴レーザーをユニットに組み込むことができます。

有機超潤滑剤を開発するとフュージョンレーザーを組み込めるようになります。

と言った具合です。

これはデザインワークショップという、ボディタイプ、シャーシ、武装、特殊兵装の組み合わせでユニットをデザインするシステムに基づいています。


で、頭の中に90式戦車はご用意できたでしょうか。

ああ、大丈夫ですよ。T-72でもメルカバでもレオパルトでも好きなものをご用意ください。


このゲームは魔法のゲームなので例えば、


90式MM:武装

120mm滑空砲 機銃 12.7mmミリ波マナ誘導弾

とか


90式MP:武装

120mmマナEM砲 機銃

とかできるわけです。


魔法はマナで発動させるものですから、戦車にはマナを蓄積する装置が積んであるわけです。

さらに、攻撃だけじゃなくて、


90式MD:武装

120mm滑空砲 中マナMAT MCM 魔法陣フィールド展開装置


なんて防御ユニットも詰めるわけです。

MCMはMana Counter Measureで、敵に対してマナ妨害を行う装置だそうです。

魔法陣フィールドは要はバリアですね。

中マナMATって名前がちょっとかわいいかも。


で、地表には所々マナが溢れている場所があります。なんと呼ぶべきかな? オアシス? 泉?

その場所へ行くとユニットはマナを回復できるわけですが、最初から自軍勢力内にあるマナの泉にはある装置が付いていて、その装置が付いているマナの泉の近くではマナのサポートが受けられる。つまり、マナの補給を受けることができるわけです。

もちろん距離の二乗に比例してマナ補給は弱くなります。


とか、


そうなると補給路、背後連絡線という概念がより明確になってきます。

マナの補給路を断たれた方が負けです。


あと、キャラクター的な要素も盛り込めて、この世界では普通の人と魔法使いがいるわけで、お約束通り、魔法使いは何でか美少女ばっかりなんですな。


と言うわけで、そいつがユニットに乗り込むと燃料を使い果たしてもなお動いたりとか、武装以外に直接的に、そいつの能力で攻撃したり、魔法で索敵したりとかなり強いです。

つまり、戦車をつぶせ、ならぬ

魔法使いをつぶせ!

になるわけです。


これでもまだまだ魔法のフィーチャを生かし切れているとは言い難いです。

が、こんなことばかりやっている時間的余裕などどこにもない!

というわけで思いつきでした。

[NEC Direct キャンペーン]予想金額¥311,997

NEC Direct トラックバックでパソコンGET!キャンペーン参加中
http://ameblo.jp/nec/

このぐらいのスペックならCivIVが余裕で動くでしょう。

その前に、CivIIIのColdWarMODを処理落ち無しでやりたいものです。

戦略魔法軍

某戦略シミュレーションをやってみました。

楽しい、すごく楽しかったです。

案外お手軽なSLGも良いのかもしれませんね。

簡単なので取っつきやすくはまりやすい。

SLGとしては結構理想型かもしれません。

というわけで、「 戦略魔法軍 」です。


それは何かと申しますと、COMBAT MANEUVERのサブプロジェクトです。

COMBAT MANEUVERは現在も資料集めを継続しており、もうこれが見通しでは

「 設定マニア 」

と呼ばれそうな勢いで設定してます。

旧ロシアの海軍基地が太平洋挟んで向こう側にあるとか( 何て名前だったか… )

日本の海上交通網とか石油備蓄はどれくらいだとかすごく間違った方向にプロジェクトは順調に進んでいます


で、現在開発自体は中断中。成果物は何も上がりません。


このブランクは埋めがたい。と言うわけで、「 戦略魔法軍 」です。

COMBAT MANEUVERのプログラム部分の試金石になってもらいます。

こいつで戦略SLG用エンジンのノウハウを身につけた後に、満を持してCOMBAT MANEUVERに手をつけようという魂胆です。


…ただ単に

これ、おもしろくねぇ?!( Isn't it exciting ?! …どんな婉曲法だ)」

と思っただけ、というのは秘密です( と言いながらWWWで世界に配信 )。

さて、今日のブログはおしまいです、興味のある方だけ設定マニアの妄想につきあってくださいまし


現代と同じ時を共有する、だけど別の世界のお話( どこかで聞いたような )

その星では地球と同じように、どこかでは戦争があり、どこかでは平和がありました。


その星の中心には人の想念が流れている、と人々は信じていました。

その想念は物理的な形をもって、星の表面に流れ出すことがありました。

人々の中には、その想念のプロトコルを解読し得るものがいました。

彼らは魔法使いと呼ばれ、長く信奉されてきました。

その頃にはすでに、その想念を蓄積して、持ち運ぶ技術があったため、普通の人でもある程度、魔法が使えました。

人々に恵みをもたらす、想いのかたまり。

それが魔法の素、マナ。


ですが、その海の向こう側では、それはエーテルと呼ばれていました。

そしてそこでは、エーテルに対して別の理論が広く信じられていました。

万物を司る、法則の収束。それがエーテルである。


この星には、その二つの" 見方 "が存在しました。

そして、二つの勢力は、その" 見方 "に強く縛り付けられる形となっていました。


レットヴィク共和国率いる環アイレー共同体機構。

総動員兵力3600万人。

タシャウス共和国連邦率いる西ラグランデ条約機構。

総動員兵力4800万人。


それは信奉です。

二つの宗教が、互いに同じものを違う目線で見て…それが人々の生活に大きな影響を与えるとき、そこに諍いが生じます。

では、あるいは…ある経済イデオロギーと、別の経済イデオロギーが存在するとき、そこには争いが生まれます。


それが地球では冷戦だった。

資本主義対共産主義。

地球では、数個の局地戦が起こりました。

では、この星ではどうだろう。

" 魔法 "が使える、奇跡の起こせる星なら、どうだろう。


これがストーリーです。

やりたいのは「 魔法で戦争する話( プリズム何とか、とか、何とかアークとか ) 」から触発されて

「 魔法 」が入ると戦争はどう変わるか、と言う実験です。

おそらく大して変わらない気がします。それはやってみないと分かりません。

でも大して変わらないと言うことは、人間は戦争に魔法みたいな力を投入できるわけです。

…というと誤解を招きますね。


今までの魔法で戦争物というと、魔法使い同士の一騎打ちがメインでしたが、

今度の話は、大勢の魔法使いが徒歩蹂躙で消耗戦を繰り広げたりとか、超強力な魔法を( 上で言うマナみたいなもの )戦略爆撃機に積んで敵の領土に撒いたりとか、そういう風な話です。

実際あんなアニメみたいな清廉潔白な戦争があって堪るか、と思うので。


と言うわけで戦略魔法軍。

お手軽なSLGを目指します( 試金石に手間を掛けるのもあれですし )。

こいつはこいつなりに、魔法というフィーチャを生かしたシステムが組み込まれるとおもしろそうです。何より軍事マニアだけでなくファンタジーファンもとり込めます

( B-1ランサー爆撃機に乗り込んだ7人の魔法使いたち…。超萌える、いや、萌えないか… )。


と言いながら妄想フォルダを探っていたところ魔法もののシナリオ原案が発掘されました。こいつを叩き台に…。

シナリオはそんなに凝りたくないです。COMBAT MANEUVERの資料を生かせば大分少ない手間と妄想でさくさくいけそうですね。

いわゆるありきたりな戦争の悲劇的な話と、ぶっちゃけエースコンバット5みたいにすれば盛り上がるでしょう( 身も蓋もない )。

Digital Mars C++ Compiler 3rd Attraction

dmc02


バグバグバグバグバグバグバグバグバグバグバグバグ…。

ぶくぶくぶくぶくぶくぶくぶくぶくぶくぶくぶくぶくぶくぶく…。


元々マイクロ馬鹿の隠し糞APIなんで、どうにもこうにもならんのですよ、あーーー!!!

何が悪いのかわからんのですよ。

先ほどから64ビットを3で掛けて8で掛けて云々の計算をしてビットフィールドの確かめをしているのですが、ウェブでみっけたNtQuerysystemInformationから得られるデータフィールドを合ってくるはず何ですが、もう意味が分からない数ばっかり帰ってくるのです。

…落ち着いて、もう一度考え直そう。

ああー。


というわけで、Digital Mars C++ Compiler 2nd Contactは封印中。

書きかけで放置なのです。うむむむむ。

Digital Mars C++ Compiler 2nd Contact

// 作りながら書きましたが、途中ですごく詰まりました。しかし! この文章はあくまでも道標。何でもないようにさらさらと書いちゃいますよ? 当然のごとくスムーズに書きますよ? では、どうぞ。


昨日 の続き。

CPUモニタをデスクトップにちょこんと置く時計のコンポーネントとして組み込もうという話。

こいつはコンポーネントを .nsm という拡張子のDLLで同ディレクトリに配置し、iniにその旨を書けば組み込んでくれる。

昨日はテスト用のコンポーネントを Digital Mars C++ Compiler を使いDLLを吐き出して

「Label test」

と表示することに成功した。

ここまでのあらすじでした。


で!


NtQuerySystemInformationという悪名高きWindowsの隠しAPIを使えばプロセスごとのCPU使用率とかそのほか諸々が得られると言うことらしい。

早速調べてみるが、MSDNにはもちろん載っていない…。

色々調べてみるとこんなページを発見。


Undocumented NTInternals( かな? )

http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/System%20Information/NtQuerySystemInformation.html


ここによれば、このAPIはntdll.dllからこう、いけるらしい。

このAPIに四つの引数を渡してやるみたいだ。

つまり


NtQuerySystemInformation is used to check some system informations avaiable only in KernelMode (above 0x80000000). All avaiable (or all known) information classes are described in SYSTEM_INFORMATION_CLASS .

だそうです。

詳しいことがよく分からないので、色々さがしてみる。


まあ、何となく分かりました。と言うわけでコードを書いてみる。書いたコードを解説する方がわかりやすいでしょう。


その前に、CPUの負荷率に関する基礎知識。

NTは、カーネルモードとユーザモードという二つのモードで動作しています。

ユーザモードで走るプロセスはカーネルモードのプロセスに手出しができないようになっています。

これによって、一つのアプリケーションがOSを巻き込んで…と言うことを防いでいます。

いつもタスクマネージャで見ているのはユーザモードの負荷だったのです。

ちなみにタスクマネージャのパフォーマンスタブで「 表示 」メニューから「 カーネル時間を表示する 」を選択するとカーネルモードのCPU時間が今までのCPU時間の緑色のグラフの中に赤色で表示されます。

豆知識でした。


NtQuerySystemInformation(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL );


こういうAPI。

で、第一引数はもらうデータの種類を定数で渡します。


typedef enum _SYSTEM_INFORMATION_CLASS
{
SystemBasicInformation = 0,
SystemPerformanceInformation = 2,
SystemTimeOfDayInformation = 3,
SystemProcessesAndThreadsInformation = 5,
SystemProcessorTimes = 8,
SystemPagefileInformation = 18,
} SYSTEM_INFORMATION_CLASS;


こういう感じです。こうやってenumしておきましょう。


第二引数はデータを受け取るバッファのポインタを渡します。

第三引数はデータを受け取るバッファのサイズを渡します。

第四引数は…分かりませんね。0を渡してください。


これがこのAPIの使い方です。


で、バッファの中身です。バッファは64ビットデータ6つの構造体がCPUの数分連なってます。

構造体一つ分の中身は


__int 64 アイドル時間

__int 64アイドル時間+カーネル時間

__int 64ユーザ時間+そのほか

DWORD[6]( スペーサ )


だそうです( 参考リンク様より。このページがなければ完成しませんでした。 )。


で、コードを貼り付けてみました。


#include <windows.h>
#include <string.h>

#include "nsm_mod.h"
#define CPUNUMBERS (2)

/*
Prottype : NtQuerySystemInformation
*/
typedef int (FAR WINAPI * xSYSINFO) (DWORD n, PDWORD buf, int no, int dummy);

/*
typedef : SYSTEM_BASIC_INFORMATION, SYSTEM INFORMATION_CLASS
*/
typedef struct _SYSTEM_BASIC_INFORMATION
{
ULONG Unknown;
ULONG MaximumIncrement;
ULONG PhysicalPageSize;
ULONG NumberOfPhysicalPages;
ULONG LowestPhysicalPage;
ULONG HighestPhysicalPage;
ULONG AllocationGranularity;
ULONG LowestUserAddress;
ULONG HighestUserAddress;
ULONG ActiveProcessors;
UCHAR NumberProcessors;
} SYSTEM_BASIC_INFORMATION, *PSYSTEM_BASIC_INFORMATION;

typedef struct
{
__int64 li_idle_time;
__int64 li_kernel_idle_time;
__int64 li_user_other_time;
DWORD spare[6];
} SYSTEM_PERFORMANCE_INFORMATION, *PSYSTEM_PERFORMANCE_INFORMATION;

typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION, *PSYSTEM_TIME_INFORMATION;

typedef enum _SYSTEM_INFORMATION_CLASS
{
SystemBasicInformation = 0,
SystemPerformanceInformation = 2,
SystemTimeOfDayInformation = 3,
SystemProcessesAndThreadsInformation = 5,
SystemProcessorTimes = 8,
SystemPagefileInformation = 18,
/* There are a lot more of these... らしい */
} SYSTEM_INFORMATION_CLASS;


/*
Work
*/
static xSYSINFO pNtSys; // System Information
static int nCpu; // Amount of Cpu
static __int64 latest_idle_time, latest_kernel_time, latest_whole_time;
static HMODULE hMod;


char ModuleName[] = "Labels";
char Version[] = "CPUMon ver 0.6 (C) 2005 KODAMA,Bitoku";

int Top, Left;
char Msg[255];
char CPUUsage[255];
char CPUUsage2[255];


int GetCpuTimes(__int64* in_idle_time, __int64* in_kernel_time, __int64* in_whole_time)
{
int ret;

SYSTEM_PERFORMANCE_INFORMATION sys_perf_info[CPUNUMBERS];
SYSTEM_TIME_INFORMATION sys_time_info;

if( pNtSys )
{
ret = ( *pNtSys ) ( SystemProcessorTimes, ( PVOID ) &sys_perf_info, sizeof sys_perf_info, 0);

if( !ret )
{
int i;
__int64 idle_time, kernel_time, whole_time; /* CPUごとにどんどん足し算していく */
/* Initializing valiables... */
idle_time = 0;
kernel_time = 0;
whole_time = 0;

/* CPUごとにるうぷを回して、全体のアイドル時間・カーネル時間・全体時間を累計 */
for( i = 0; i < nCpu; i++)
{
idle_time += sys_perf_info[i].li_idle_time;
kernel_time += sys_perf_info[i].li_kernel_idle_time - sys_perf_info[i].li_idle_time;
whole_time += sys_perf_info[i].li_kernel_idle_time + sys_perf_info[i].li_user_other_time;
}
*in_idle_time = idle_time;
*in_kernel_time = kernel_time;
*in_whole_time = whole_time;

return TRUE;
}
}

return FALSE;
}

int InitSysInfo()
{
int ret;
SYSTEM_BASIC_INFORMATION sbi_buf;
__int64 buf;

/* Init valiables */
nCpu = 0;
pNtSys = NULL;

/* Get module handle for NTDLL.DLL */
hMod = GetModuleHandle ( "NTDLL.DLL" );

if ( hMod )
{
/* Get handler for the function of NtQuerySystemInformation */
pNtSys = ( xSYSINFO ) GetProcAddress( hMod, "NtQuerySystemInformation" );

if( pNtSys )
{
/* sbi_bufにシステムの基本情報をもらう */
ret = ( *pNtSys )( SystemBasicInformation, ( PVOID ) &sbi_buf, sizeof sbi_buf, 0 );

if( !ret )
{
/* Get Numbers of CPU Processors */
nCpu = sbi_buf.ActiveProcessors;
}
GetCpuTimes( &latest_idle_time, &latest_kernel_time, &latest_whole_time );
return TRUE;
}
} else
{
FreeLibrary( hMod );
hMod = NULL;
return FALSE;
}

return FALSE;
}

/* 戻り値 : ユーザモードのCPU使用率 引数にはカーネルモードのCPU使用率を格納する変数のポインタを渡す */
double GetCpuUsageRatio(double* kernelmode_usage)
{
__int64 idle_time, kernel_time, whole_time;
double dIdle, dKernel, dWhole;
if( !GetCpuTimes( &idle_time, &kernel_time, &whole_time ) )
return;
double user, kernel;

/* 前次との差分を計算 */
dIdle = (double)idle_time - (double)latest_idle_time;
dKernel = (double)kernel_time - (double)latest_kernel_time;
dWhole = (double)whole_time - (double)latest_whole_time;
double ratio;
if( dWhole )
{
user = 100 - (( dIdle ) / ( dWhole )) * 100;
kernel = (( dKernel ) / ( dWhole )) * 100;
}

/* latest_の更新 */
latest_idle_time = idle_time;
latest_whole_time = whole_time;
latest_kernel_time = kernel_time;

*kernelmode_usage = kernel;
return user;
}

LPSTR VersionStr (void) {
return (Version);
}

int WINAPI SupportModuleVer (void)
{
return (1);
}

int WINAPI Init (char *IniFileName)
{
Left = GetPrivateProfileInt (ModuleName, "Left", 0, IniFileName);
Top = GetPrivateProfileInt (ModuleName, "Top", 0, IniFileName);
GetPrivateProfileString (ModuleName, "Msg", "Label test", Msg, sizeof (Msg), IniFileName);

/* Initializing for GetSystemStatus */
InitSysInfo();

return (0);
}

int WINAPI Disp (HDC hDC)
{
SetTextColor (hDC, RGB (255, 255, 255));
TextOut (hDC, Left, Top, CPUUsage, strlen (CPUUsage));
TextOut (hDC, Left, Top + 10, CPUUsage2, strlen (CPUUsage2));
return (0);
}

int WINAPI Timer (void)
{
double usr, knl;

usr = GetCpuUsageRatio(&knl);

sprintf(CPUUsage, "Debug:%3.0f", usr);
sprintf(CPUUsage2, "%3.0f", knl);
return (0);
}

int WINAPI UnLoad()
{
/* UnLoad DLL : ntdll.dll */
FreeLibrary( hMod );
}

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}


です。特に難しいことはしていませんね。

デスクトップアクセス側からは

(Load Library)

Init

Timer

Disp

が順に呼ばれます。

終了時には

Unload

です。


Timerは時計の描画更新、つまり1秒ごとに呼ばれます。

ソースは結構気をつけて書きましたが、どっかきたないですね。構造化プログラマの性ってやつですか。

とまあ、こんなに簡単にできてしまいます。


久しぶりにOS寄りの、システム寄りのユーティリティなど書いてみました。

なかなか楽しかったですが、システムに頼らないアルゴリズムとかごりごりする方が楽しいですね、やっぱり。

久しぶり株

購入日 銘柄名 取得単価 取得株数 取得金額 終値 現在の
株数
評価額(円)
05/11/28 9898
サハダイヤモンド (ジャスダック)
38 2,097 79,686 38
2,097 79,686
05/11/1 6460
セガサミーホールディングス (東証1部)
4,170 45 187,650 3,850
45 173,250
05/10/28 9898
サハダイヤモンド (ジャスダック)
42 2,356 98,952 38
2,356 89,528
05/10/27 7832
バンダイナムコホールディングス (東証1部)
1,705 248 422,840 1,815
248 450,120
05/10/18 7011
三菱重工業 (東証1部)
400 247 98,800 505
247 124,735

三菱重工爆上げー!

評価額 : 1,067,355円です。

この日の終値がまだ反映されていませんが、三菱重工、テーブルの505から+ 27 で532まで上がっています。

98800円で買った株が131404円と言うことは差額32604円が利益。爆上げっす。


バンダイナムコもがんばっています。


セガサミーですが一時期すごい値を上げていたのにまた4000円割れ。

何となくこいつは周期的に上下するみたいですので放置。

サハダイアは失敗かなと思い始めている今日この頃でした。

1ヶ月ぐらいかな、始めてから。

大体70000円稼げる、と言うことみたいです。月70000円にしては労力はあまりにも少ない…。

もっとまじめにやらないといつか大損すると思うのでバーチャルでとどめておきますか。

( 逆を言えばまじめにやればリアル取引もあり、かな、かな? )

Digital Mars C++ Compiler 1st Impression

というわけで、Digital Mars C++ Compiler[ DMC ]に手を出してみた。

ダウンロードはこちらから:

www.digitalmars.com : Digitalmars


色々開設サイトを回って見るも、あんまり解説はない。

と言うわけで簡単に解説。


1.インストール

上記のサイトからダウンロードしたコンパイラを適当な場所に解凍。

ちなみにダウンロードサイズはコンパイラのアーカイブが2.7MB程度。STLPortが、1.9MB程度。


今回はx86バイナリを吐いてくれるだけで良いので、特にAddonなどはダウンロードしていない。

STLPortはダウンロードしたが、使わないと思う。

必要であれば適宜ダウンロードするように。

Utilitiesなども同様。必要な人はダウンロードです。


で、解凍したら、PATHを通すと楽。

環境変数に

<解凍したフォルダ>\dm\bin

を追加。PATHはセミコロンで区切る、これ基本。

環境変数はリブートしないと反映されません( リブートしないでいけると思ったのに… )。


2.使ってみる


今回は、nksysmonというデスクトップにちょこんと置く時計用のコンポーネントをDLL形式で吐き出す必要があるのです。

と言うわけでマニュアルと格闘。英語かー英語かー。

とは行ってもプログラミングの資料って言うものは今も昔も英語が主流なので、これ自体は問題ないのです。英語文章、読むのは死ぬほど面倒ですが、文法は簡単ですよ、実は。


と言うわけでさらりと読んでみると


Compiling Win32 DLLs

To compile Win32 DLLs, use these compiler options:

	-mn -WD 

To write a Win32 DLL, you need to specify the entry point DllMain(). When the compiler detects a call to DllMain() in a 32-bit compilation, it generates a reference to the _acrtused_ dll startup function, and links with the appropriate startup code.

Unlike previous versions of C++, this startup code calls static constructors and performs other initialization steps before calling DllMain().

(quote from Digital Mars Win32 Programming Guidelines http://www.digitalmars.com/ctg/win32programming.html )



だそうです。要は、DLLエントリポイントがないとだめだと、あとオプションをつけろと言うわけですね。


オプション一覧はこちら

http://www.digitalmars.com/ctg/sc.html


これによると日本語でのメッセージ表示もできるそうなのですが、指定してもコンパイラは日本語メッセージを吐きません。まあ、下手に日本語になると訳わかんないので英語のままで行くのがよいでしょう。


で、何度やっても通らない。エラーメッセージの嵐の図。

dmc01

色々調べてみると、Win32APIを使用するためにはいちいちインポートライブラリを指定してやる必要があるらしい。面倒だ。

と言うわけで、問題は分かったので


dmc -mn -WD labels.c labels.def labels.dll gdi32.lib shell32.lib kernel32.lib


これで通った。ついでにバッチファイルにしておく。

これでひとまず完成なり。

先のデスクトップアクセサリに読み込んでみると確かに「 Label Test 」の文字が。

と言うわけで、これから早速本題に入ろうと思う。

とはいえ導入まで時間がかかっただけであとはさくさくいけると思うのだが…。


( この記事は書きながら作業してます。とりあえずこの段階で完成してるので、今からCPUの利用率を取得するAPIを探してきますー )


…むむむ。

Win32APIには、CPU利用率を得るAPIは用意されていないらしい。

というか、あるにはあるんです。GetSystemTimesと言うやつが。

ただ、これがWindows Server 2003またはWinXP SP1以降でサポートらしい。

もちろんDMCのインポートライブラリに入っているわけもない。

かといって…用意するのも面倒だし( implibがだめな場合もあるらしい )。


と言うわけで、正攻法で、つまり、世の中あまたあるシステム情報取得ユーティリティと同じ方法でデータを得ることになりましたのであった( 変な日本語。眠いのですよ )。

面倒すぎーーーー!


続く…か

夜明け前より大分瑠璃色っぽい( まじめに書き直してみるバージョン )

えっとですね、前回の「夜明け前より多分瑠璃色っぽい」ですが、読んでみたら馬鹿にされそうな無茶苦茶なスクランブル。しかも瑠璃色ファンにもふざけてやると怒られそうですし自分もいやなのでもう少しまじめに書き直し。

でもまあ、ねたです。のりとかは( 中略 )とか入る感じなので、COMBAT MANEUVERではこんな感じの航空無線が見られるんだなーとQC( クオリティコントロール )用です。もしくは試飲用。


参考リンクに公式リンクを張っておきますが、18歳未満の方はリンク先はご遠慮ください。

この記事の内容は全然18歳未満も大丈夫ですが。


えと、このゲーム。大体こんな感じのストーリーです( 再録 )。


あなたと一緒なら、きっと大丈夫────。

会ったことなんてないはずの人の、どこか懐かしいような声。

生まれてからずっと、それよりもっと前、ずっとずっと前から、空を見上げればそこにあって、

ネオンの街を、雪原を、さざ波が立つ海を、木々が生い茂る山を、

優しく、冷たく、静かに、明るく、朧に、照らしていた月。

歴史の教科書によると、そこに、大昔に渡った人たちが国を作ったらしい。

地球上のどこよりも遠いのに、見上げればそこにある王国。

そんな国から。

お姫さまが、

うちに、

ホームステイしに来るって言ったらどうする?

どこか懐かしいような声で、会ったことなんてないはずの人が言う。

私には、あなたがいるわ────。

( quote from 夜明け前より瑠璃色な オフィシャルHP by オーガスト )

と言う内容だそうです。

ここから、オープニングを改めて妄想してみましょう( 前の文章に加筆修正してるだけになってますね )。


日常の裏には大きな時間の流れがあって、逆を言えば、大きな時間の流れ、人類の集合意識の流れの中に人々の小さな日常の時間があるわけです( 再録 )。


/*------------------ここから


「SIF( 敵味方識別装置 )照合。当該機、所属不明。機体不明、単機。応答ありません。

Heading 040( 方位 040 ). 高度16000。速度720ノット。なお北上中」


「要撃機上がりました。百里204よりPriest 06。

会敵予想時刻、Priest next 19( 次の19分。つまり、これが朝の9時なので 0919が接敵時刻 )」


「This is Priest 06. Now maintain angel 32.

( こちらプリースト06。32000フィートで高度を維持している )」

「緊急時につき日本語で失礼します。こちらバッジ・コントローラー、プロフェット。NW280度、高度12」


「不明機、なお北上中。応答ありません」

「追尾、SS26よりSS29へハンドオーバー。Priest会敵予想時刻修正、next 15」



「…あと、あとどれくらい?」

「もう少しご辛抱ください、陛下」

「姫さま…、大丈夫です」

「ええ…信じてるわ、きっと」


「Priest 06, target position 170, range 90, 高度16

( プリースト06へ、目標は方位170、距離90nm、高度16000ft )



「プリースト、コンタクトはまだか」



「Target 正面 25. Priest 06, 不明機は捕捉できませんか?」


「Negative. Request target altitude

( 捕捉できない。ターゲット高度を教えてくれ )


「約十分後に首都圏上空へ不明機進入」


「入間の高射群に迎撃指示を発令。直ちに迎撃体制に入れ」


「Prophet. Priest 06. Negative contact. Request target position. I say again Req...

Priest 06. Visual Bogey.

( プロフェットへ、こちらプリースト06。接敵はない。ターゲット位置を教えてくれ。繰り返す、ターゲット位置を…。こちらプリースト06。不明機を目視した )


「了解Priest 06。領空侵犯機です。警告を」


「あー。This is Japan Air Self Diffense Force aircraft. You have violated Japanese domain. Get out of Japanese... っ!

( こちら、日本国航空自衛隊機である。貴機は日本の領空を侵犯している。直ちに領空より退去… )


「きゃぁぁぁぁあぁっ!」

「陛下! しっかり捕まって!」

「姫さまっ!」

「右、後ろ、来る!」


「不明機、なおも首都上空へ進行中」


「…長官は?」


「連絡とれません」


「…責任は私が取る。プリースト06に、撃墜を、指示、しろ」


「ですが…」


「人口密集地に入る前にだ!」


「了解!」



「Priest 06, こちらProphet. 250, 3500ft 敵機です。 武器の使用を許可します

( 方位250、高度3500フィート( 1050m ))

「Prophet 確認する。Priest 06.領空侵犯機を撃墜する。間違いはないか」

「Prophet 06. Read back is correct( 復唱は正しい )

「Copy that. Priest 06, Engage.

( プリースト06。了解。交戦する )



「Priest 06 two! Check six!

( プリースト06二番機! 後ろに気をつけろ! )

「くっ!」

どかーん。

「何て機動だ! あれは…ベクタースラストノズル!?」



「Fox !( 発射! )

「Shin! 避( よ )けろ!」

( こ、後方発射ミサイルだと…! 道連れだ! )

「Fox two!( 短対空ミサイル発射! )



「陛下、ご無事で!!!」

「な、何を!」

「姫さま!!」

がちっ!

ぶしゅっー!

座席を緊急射出。

( 大丈夫だ。きっと姫さまは大丈夫だ )

右へ大きく旋回。さらに加速。



「射出だと! …!」

Priest06 one ベイルアウト( 緊急射出 )。



「ふう…助かった」

機体を左と右に細かくロール。

「あーあー。こちら、王立航中軍機。抵抗する意志はない。Request indication( 指示を請う )」



「所属不明機からです。投降するとの…」

「投降、だと?」

「所属不明機からの座席射出を確認しました」

「警報…解除」



その頃…主人公宅

「あー。もうひるかー。ふぁわわわわー」

( 中略 )

ひゅーーーん、

どかーーーん!

「うわぁぁぁぁぁぁっ!」

屋根に突き刺さるなんだか黒くメカメカしい何か。

「な…なんだ?」

ぎし…がたがたがたがしゃーん!

「おうゎぁっ!」

「こ、ここは…」

「大丈夫ですか、姫さま!!」

「な、なんだあ?」

そこに現れたのは、二人の女の子。

一人は…白くまっすぐな長い髪の少女で、

もう一人は、ショートカットの少女。

そして、その少女が、もう一人の少女のことを

「姫さま」

と呼んでいる。

こうして、この物語は始まり、

そして、僕の家に、月のお姫様が( 以下略 )



「…月面はどうなった?」

「もう三ヶ月ですからね。扇動の効果も薄れていますよ。潜入工作員は早いですが撤収させました」

「被害は、半端なもんじゃああるまい」

「ええ、両派ともすでに初期動員兵力の半分以上を失って学生も駆り出しているような有様ですからね」

「月は…そもそも、地球のものだ。月面の獲得は地球で起こっている争いの半分を終わらせる方法でもある」

「そういえば、聞きましたか? …の姫君が亡命をしたと」

「亡命? どこへだ」

「日本です」

「日本…なかなかまた、やりづらい所に逃げ込んでくれたな」

「大丈夫です。UNSOM II (次の国連ソマリアミッション)には日本の自衛隊も参加するそうです。そのために、国内に工作員を送り込める準備があります」

「ああ…気をつけてやりたまえ。月面に気づかれると、非常に厄介だ」

「分かっております…STARTIV( 第4回戦略兵器削減交渉 )も近いことですし」

「奴ら連邦準備債を盾に恫喝も始めた。非常にまずい時期をねらって…。姫君もなかなか切れ者でいらっしゃる。くれぐれもしくじるな」

「かしこまりました。」


そして物語は…


ここまで------------------------*/


決してパトレイバーを見て触発された訳じゃないですよ?

パトレイバー2では全部英語でしたが、どうも日本語の方が普通みたいです。

最初に「緊急時につき日本語で失礼します」と言っているのがそれです。

バッジ・コントローラーにコールサインがあるかどうかは不明。無さそうだ…。


陸の方は普通の言葉ですが、空の方は航空無線という通信状況もあり非常に簡潔にしゃべらなくてはなりません。だから独特の言葉や英語が多用されるわけですが

( 国内線でも日本語と英語が入り交じったおもしろい交信です。「オントップで、クリアスムースコンディションです。行ってきます」だそうです。 )

なかなか聞く機会はないので、実はどう表現しても結構リアリティは追求できるかな、と。


あ、夜明け前より瑠璃色なは上の状況とは全く関係ないどたばたラブコメディだと思いますが、やってないので知りません。



参考リンク

http://august-soft.com/yoake/ : 夜明け前より瑠璃色な オフィシャル ( 18歳未満はご遠慮ください )