第19回 みんなWindowsにだまされていないか?(民衆は眠っている!!)
いい加減、Windowsから脱却したいと思う今日このごろ。一番、嫌なのがMS−IME98は変換中によく落ちるということである。これに気づいてから、ATOKを使うことにした。ATOKも余り好きではないが、変換中に落ちないだけマシである。
あと、幼稚園児のホームページよりデザイン的に劣っていたという素晴らしい実績のあるこのホームページは、FrontPageというWindowsに添付されていたソフトをテキストエディタのごとく操り、作成している。(ダメじゃん...)
しかし、そのFrontPageも、あまりに頻繁に落ちるので、マイクロソフト製というのは、どうも信用ならない。ちなみに、やねうらおは、マイクロソフトをまったく信用していない。きっと、マイクロソフトで開発している人間も、「どーせ使うん、俺ちゃうわ..」とか何とか言いながら作っていることが容易に想像がつく。
そもそも、マイクロソフトのVisual C++自体が、Visual C++で書かれていない。きっと、開発陣も、自社製品がどれだけひどいシロモノなのかを身に染みて感じているからである。コンパイラすら書けないコンパイラは、サイテーである。そんなものが使えようはずもない。
これだけひどい環境にありながら、誰も糞だの何だの言わないのがおかしい。みんな、集団催眠から目覚めろよ!とか思ってしまう。
世間の人にありがちなのは「ウイルスバスター97を入れてから調子が悪い。ウイルスバスター97は、よくない」という考え方である。確かに、論理的な判断に思えるが、ソフトウェアの世界というのは、そういう単純なものではない。もともと、Windowsには星の数ほどバグがあって、そこにたまたま何らかの形で抵触するようなソフトだと<不都合>として表面化するに過ぎない。
しょっちゅう止まる。メモリ足りんのかなー?と言いながら、なにげに、SDRAM128MBを購入した僕の友達だが、しょっちゅう止まるのは、メモリなんかではなくOSのせいだ。
そもそも、OSが止まるとはどういうことだ。OSゆうたら、オペレーティングシステムの略ではないのか?何をオペレーティングするかわかってんのか?このOSで潜水艦の制御とか、電車の監視とか、人工呼吸器のモニターとか、原子力発電所の制御とかやるかも知れんゆうことちゃうんかいな?それが、メモリー不足してたから止まって放射能漏れたとか、200日ぐらい電源付けっぱなしにしてたから、タイマーのバグで落ちて心臓とまったとか、不正なメモリアクセスしたとかで潜水艦動かんようなって、そのまま深海奥深くまで沈んでしもたとか、IE4.0入れたから電車動かんよーなったとか、そんなんが許されるとでも思ってんのか?お前、こんな糞OSで、そんなミッションクリティカルなとこを、ほんまにオペレーティングできんのけ?
だいたい、OSが止まるだなんて、おかしいっちゅーねん。ハラワタ、よじれるっちゅーねん!ソフト入れたら立ち上がらんよーなったとか、これ押したらフリーズするようなったとか、Versionファイルがありませんって出るようなったとか、そんなOS、おかしいっちゅーねん!!
MS−IME98のバグについて知り合い連中10人ぐらいに聞いてみたら、全員が全員同じ症状のことを知ってたぞ〜。どういうこっちゃねーん!!そんなもん公然と売って、なんで誰も文句言わへんのや〜。なんでみんな並んでこ〜てんのや〜。うわ〜。なんかマスメディアに操作されとんで〜!!「だってOSってWindowsしかないんでしょ?」んなアホな〜!!LinuxもBSDもありまんがな。そこでかて、wineとかゆーて、Windowsエミュレータが動いてまんがな。あっちのほーがよっぽど安定してたりしてな...(かくいうやねうらおは、Windows98の発売の次の日にインストールしてたから、まったく人のことは言えない。一番踊らされてのかも知れない)
いや、何の話だかわからんよーなってきたが、他のソフトハウスの成長を阻害するために、わざと粗悪な開発ツールと、嘘ばかりのドキュメントを高い金をとって販売しているんではないかと勘ぐってしまうのは、やねうらおだけではないはずだ。
第1A回 メチャ遅いCGIをぶち壊す(いけてる掲示板の作り方)
始めて書き込みをして、あまりの更新の遅さに再投稿ボタンを連打し、3つも4つも書き込みしてしまった経験は、誰にでもあるはずだ。いまさら指摘するまでもなく、アホなプログラムで書かれた掲示板は、2,30人が来ただけで、速度が劇的に遅くなる。リソースを食い合って、結局は、誰もおまんまにありつけない状態が続いたりする。こういうのをstarvation(飢餓状態)という。
めちゃ速い掲示板を作る方法を伝授しよう。ただし、半分冗談として聞いてほしい。
画像を大量に貼ったりしなければhtmlファイルが表示されるのにそれほど時間がかかるという状況はあまり考えにくい。そこで、掲示板は、htmlファイルにする。書き込みをしたときのみ、cgiが裏で動いて新しいhtmlファイルを(別名で)作る。完成後、そのファイルを、掲示板ファイルに上書き(コピー)することで、更新終了である。これなら、書き込みをしている一人分しかcgiは動いていない。過去の記事も、htmlファイルを複数作って対応する。
どうだろう?実験したいのだが、あいにく、このsun internetはCGIが使えないのだ。誰かやってみてはどうだろう? とりあえず、あまりに遅い掲示板を持つK2と坂田さんあたりどうだろう?(なんで名指しやねん...)
第1B回 やねうらお氏の作品のなかでもっとも有名なものは?(ただし、BM98ではない)
驚かれるかも知れないが、僕が作った作品のなかで一番有名なものは、BM98ではない。実は、やねうらおは、BM98と桁違いに有名なソフトの原案者だったりする。
いまだから言えるが、それは...ぷよぷよである。
えー!!ウソ〜!!
と言われるかも知れないが、たぶん、事実である。時の流れを遡って、そのへんの経緯を簡単に書こう。
その昔、ゲーセンでテトリスが流行したころ、やねうらおもご多分に漏れず、猿のようになった。半年後には、片手だけでカンスト(カウンターストップ=999900点)までやるという、相当の阿呆ぶりであった。そのときに練習用として、それをX1用に移植した。マルチタスクで2P同時も出来るという、いまから考えると、あのマシンはタイマーインターバルなんてもんはないから、小さいユニット単位のクロック数を算出して、ウエイトを計算するという変態というか、馬鹿というか、そういう類のプログラムをオールアセンブラで組んだ。(Z80で、あんな阿呆なプログラム書けたんは、たぶん、日本でも、僕と、知人のT君、そして、あの吉村氏ぐらいのもんでないかな...いまなら、やる気すら起こらんけど...)
このとき、副産物的に、4つの色がテトリスのブロック状になったら消えたらどうか?などと考えて、それをあのコンパイルと仲良しの某大手ゲームサークルの会長に持ちかけた覚えがある。んで、半年か1年後にでたー!!のである。(おお!なんとわかりやすい:笑)
いや、それだけなんよ...そもそも、誰でも思いつくようなアイデアだからして、本当にやねうらおのアイデアが採用されて、という訳ではないかも知れないし、あのゲームが売れたのは、キャラクター、そして、連鎖やおじゃまぷよ、そして何よりブロックが2つというそのへんのゲームバランスの良さ、そして販売戦略と、さまざまなファクターに起因するわけだから、別にいまさらロイヤリティがどうとか、言う気は毛頭ないのだが...。
第1C回 他人のプログラムは危険だ(えっ〜!頭悪くなるってカンジ〜!)
なんか、最近、超有名プログラマのプログラムを見る機会があった。それも一度や二度ならず、複数である。これまた名前はこんなところでは明かせないような人たちばかりなのだが...実は、それらのプログラムを見る3秒前までは、すんげーわくわくしていたのだ。どんなテクが使われているのかな〜だとか、保守のしやすいソースになってんのかな〜とか。
そのソースを眺めて10分後、やねうらおは、吐き気がした。うおー。こいつ、同じ機能を実現するのに、コピー&ペースト多用しとんで〜!(ひょっとすると、ステップ数に比例して給料がもらえるのかも知れない。だとしたら、無駄の少ない、洗練されたプログラムしか書けないやねうらおは、餓死してしまうぞ...) こんなことしてしもたら、保守するん大変や〜。そら、誰が見てもわかるプログラムかも知れんけど〜...それはないんちゃう?同じ機能はひとつにまとめよ〜とかいう考えはあらへんわけ?Visual C++のclass wizardで同じようなクラスをぽこぽこぽこぽこ作りよってからに〜。ほやから、頭の悪い奴が作ったプログラムって嫌なんよ〜。なんか見てるだけで頭悪くなりそう。なんか無駄が多すぎ。などとぼやきながらも、せっかくだから、いじくり回す...いろいろいじって気づいたこと。
何も考えてない分、作るのは早かったりして? ある規模以下なら、こういう頭の悪いプログラマでも条件反射的にプログラムする奴のほうが、早く完成するかも知れない。そういや、プログラマを名乗る定年間際のおっちゃん、英語の単語カードの表と裏に「ループ」と言ったら?「for〜next」とか書いて覚えたとか言ってたな〜。(なんだか気の毒な人やと思う。哀愁が漂ってるよ〜) でも、意外と、ああゆうおっちゃんのほーが、単純なプログラムは早いかも知れない...。
まあ、ソフトウェアの生産性には、汎用性のあるコードを書こうと思うと、その分、余力を必要として、再生産性は高いものの、結局、開発時間が増大する可能性がある、という問題がある。再生産性が高まるゆうても、二度とそんなプログラム書かへん者にとっては余計なお世話だ。僕は、高校に入りたてのころ、(ちょっとC++のOOPがさかんに言われ始めたころ)、ベクトルの和を計算したいだけだったのに、わざわざベクトルクラスを定義して、和だけでなく内積・外積のオペレータから、多次元ベクトルのサポート、行列、逆行列の計算、ベクトルとの演算子、それから勢い余って、集合、集合の直積の定義までしたという、阿呆な経験がある。世界中探しても、こんな阿呆は他にいないだろう。(もちろん、そんなクラスは、その後、一度も使用したことなどない。似たものが必要になっても、また一から書き直す。そのほうが、なんだか使いやすい) それ以来、再生産性とはクラスなどの利便性や再利用可能性などではなく、いかに拡張性をもたせてあるかであるという考えに変わった。あのとき学んだ一番大きなことは、OOPに踊らされるな!ということである。世界で一番踊らされていた、やねうらおが言うんだから間違い。
第1D回 DirectXプログラミング最大の罠その1(「糞馬鹿Windows死ね死ね団」発足)
なんか役に立つことは、書く気はなかったのだが、DirectXについて2,3、どうしても書き残しておきたいことがある。証拠文章である。仮に、やねうらおが人を殺して裁判になったとき、被告人やねうらおは、DirectX Programingによって尋常ならぬ精神的被害を被り、ひどく傷つき、精神的に不安定となり、自己管理能力がきわめて欠如した状態であったという弁護をしてもらうための文章ではない。(なんのこっちゃ。やばいんちゃうか、こいつ...)
僕は、DirectX最大の欠陥だと思っているのだが、それは、flipの動作についてである。
どのDirectXの解説本を見ても、この部分について何も述べられていないのだが、チラツキを無くすためにVSYNCを待つのは、もはや常識だろうから、VSYNCを待つオプションをつけてfilpさせるわけだ。しかし、まず、VSYNCというのは、どのビデオカードでも固定60Hzではないのである。それ以上のリフレッシュレートを持つものもあれば、VSYNC信号そのものがアテにならないものまで様々である。そんな状況下で、出力段階でVSYNCを待つことでタイミングをとろうというのは、あまりにも無謀なので、通例、timeGetTimeとかゆーマルチメディア関数によって1ms単位の大麻を得て(なんちゅー変換するんじゃ!この馬鹿ATOK!!>タイマ。俺はヤク中か!)、そいつを見ながらゲーム上の動きを決定すべきなのである。Windowsでは、あまりおすすめできないが、どうしても60fpsに固定したいのであれば、その残り時間を算出して、つぶすしかない。なぜお勧めできないかというと、仮に80Hzのレートでリフレッシュを行なうビデオカードだとしたら、80回のうち60回だから、20回は、同じコマが存在することになる。具体的には、1,2,3,3,4,5,6,6,7,8,9,9,...というように、3コマに1コマずつ同じフレームが存在することになる。ゲームのキャラの動きがカクカクになることは言うまでもない。まあ、そういうヘロヘロなソフトは世のなかに山のようにあるので、別に構わないような気もするが...
ともかく。
そんなわけで、ともかく、VSYNCは待つとする。flipに、そーゆーオプションをつける。すると...何と、Windowsが落ちるのである!!
なんじゃそりゃーーー!!!
BM98公開当時、落ちるだの何だの言われ続けたバグの正体は実は、これなのである。いまでも、これをバグだとは思っていない。断じてバグなどではない。これは、間違いなく、Windows側の欠陥である。そんな事情など知らん人らが、バグだバグだと騒ぐもんだから...
お前らイテまうどーーー!!!
となったのは、言うまでもない。(うそよ、うそ。やねうらおって、本当は、雨の日に、道ばたで犬がどろんこで倒れていたら近寄って行って抱きしめてあげるぐらい心の優しい青年なんよ。なんや、誰も信じてへんがな〜(笑))
もう少し詳しく言おう。このオプションを付けてflipを行なうと、CPU時間を完全に独占してしまうのである!(この手のプログラムを実行してCPU負荷率を調べれば100%になっていることがわかるだろう) 別に100%になってもどうということはない気もするのだが、Windowsは、プロセス管理とメモリ管理がまともに出来ていないので、長時間CPUパワーを独占すると、システム自体が不安定になって落ちるのである。プロセス君なんか、いつまでも待たせときゃーいいようなものなのに、もー我慢ならんわ!先帰らせてもらうわ!などと言いながら落ちるのである。(ほんまかいな...) この一連の事実に気がついたときから、やねうらおは、もうこんな糞馬鹿OSではプログラムをする気がなくなった。CPU負荷率が100%になることも、アホちゃうか?とか思うのだが、それより何より、それで落ちるとはどうゆうこっちゃねん?もっとも、これは、Windowsプログラマの常識だったりするらしく、ゲーム開発に従事してるプログラマからは「そんなことも知らんのでっか〜」みたいに言われたこともある。知らんのでっか〜って、知らんっちゅーねん!!こんな糞馬鹿OSとは、もう友達でも何でもないっちゅーねん!(自分、いままで友達やったん?なあ?Windowsが友達?人間の友達おらへんの??とかゆー、ツッコミは却下)
なんか話がそれたが、この、ゲームを作る上で一番重要かつ基本的な事項をまともに記したDirectXの解説本は僕の知るところ、存在しない。しかし、DirectXプログラマの間では、flipは、VSYNCを待つのではなく、タイマでタイミングを見計らって(遊び時間は、適度にsleepさせておきながら)flipステータスを見に行き、OKなら強制的にblt(あるいはflip)してしまうのが常識と化しつつある。
いまになって思うのだが、Visual Basicでデータベース等の速度の要求されないものならともかく、ハードに密接したプログラムやら、シビアなタイミングの要求されるようなゲームプログラムをWindowsで書いてて楽しいって人は何人いるんだろう?やってて楽しいと思ってる人は、ほとんど皆無でなかろうか。最近では、ソフトベンダーもLinuxに乗り出す気配があるので、僕はAlphaチップでLinuxマシンでも組み立てて、いい加減、この馬鹿な世界から移住したいと考えている。
第1E回 2000年問題(末永くプログラミングの巻)
2000年問題で小遣い稼ぎをしているCOBOLプログラマ(ちゅーか、COBOL onlyな人)がまわりに何人かいてたりする。あんたらなー!2000年過ぎたら、もーやることあらへんねんで〜わかってっか〜。とか思わないでもない。
そんなわけで、今回は、2000年以降も廃れない、勉強しといて損のないテクノロジーとは何かについて考える。(誰や?1999年に地球は滅びるからそんなん無駄やとかゆうてんのは...)
まず、Perlあたりどうだろう。CGIを記述するの標準的になりつつあるし、C言語のような嫌らしい制限がないので、勉強しといて損はなさそうである。ミニマリスト(※1)なやねうらおもPerlだけは許す。
※1 ミニマリスト:プログラムが徹底的に洗練されていなければいけないと考えている人。無駄を徹底的に嫌う人。
C++とJavaは?と言えば、C++は動的型変換を採用したあたりから、「ダメじゃん」な言語となりつつあるので、将来性は、Javaに軍配があがる。MicrosoftもSunに訴訟で負けたこともあって、Pure Javaな、ひとたび書けば〜の風潮も加速されるに違いない。しかし、残念なことに、Javaはまだランタイムが腐っているから、速度面でゲームを書くのには向かない気がする。せめて、まともなゲームが書けるようなライブラリを完備して欲しいと思う。(3〜5年はかかりそう...) ちゅーことは、当分、Cは健在ということだろう。
Windowsは、腐ってるから、NT5.0が出るころには、Linuxのプレインストールマシンも出始めるだろうし、Win系のAPIなどは、勉強してもまったくの無駄になる可能性もある。そもそも、洗練されていないから、テクノロジーを勉強する価値があまりない。よって、あまりおすすめできない。やめじゃ。やめじゃ。
では、人類、総Linuxになるのかというと、(たぶん、そうかも知れないけど)ちょっと違うんでないかなー、とか思うわけで、その根拠は?というと、バイナリレベルでの互換性の問題なのだ。まー、いままで散々、書いてきてるんで、深くは追求しないのだが、人類、総Linuxになりかけたころに、問題になるかも知れない。
しかし、そのころなら、インテリジェントなCPU(オペランドをユーザー定義できるものが理想やね)がちまたに出回ってるだろうから、そのへんも問題ではなくなるのかも知れない。(どないやねん)
そんなわけで、Windowsは捨てろ捨てろと友達連中に言いまくっているわりには、いまだにExcelやらAccessのマクロ本やら、Visual C++の入門書を捨てられずにいる。いや、これは、あと10年たったときに、Microsoftの阿呆さ加減を笑うためのネタなのだ。ちゅーか、こんな本を高い金出して買っていたことを笑われたりしてな...。
第1F回 C++言語講座その1(なんでいまさら?)
どうも、ゲームプログラマってC++をあまりよー知らんかったりする。そもそも、そんなもん知らんでもゲームは作れたりするし、素人が下手にクラス化して遊んでいると、かえって生産性が落ちたりする。
とりあえず、C++のおいしいところは、コメントが//で書けるところだ。(笑) たまに、ATOKがカナONのままにしやがって、半角でメメとかなってたりする。メメクラゲかっちゅーに!(誰も知らん?海遊館に行けば会えるんよ...)
もうひとつC++のお手軽機能は、classを作ることだ。いま、仮にAというclassを作る。
class A {
public:
func_xxx();
func_yyy();
};
このあと、func_xxx()を呼び出そうと思えば、
A cA;
cA.func_xxx();
そのインスタンスを用意して、それを介してアクセスするか、
pA* = new A;
pA->func_xxx();
Aを動的に確保して、そのポインタを介してアクセスするかが考えられる。
しかし、staticな関数に対しては、このようなインスタンシエートは不要なのである。具体的には、
class A {
public:
static func_xxx();
static func_yyy();
};
という定義なら、A::func_xxx();と直接呼び出せる。また、class内のstaticメンバに対しては、
class A {
public:
static func_xxx();
static func_yyy();
static int bbb;
};
A::bbb = 123;
などとして、これまたインスタンシエートなしにアクセスできる。DirectXのライブラリelの紹介を以前にしたが、そのelでも使われているテクなので、興味のある人は、いちど覗いてみて欲しい。
このメリットは、とりあえずグループ化できることである。いちおうクラスなので、外部からは見えないから、うっかり
bbb = 123;
などとやっても大丈夫である。とりあえず、その2つだけでも十分便利な気がする。とりあえず、今回は、そんだけ。