2001年7月の日記。

counter

一覧。


2001年07月31日

そういえばFIVAは一応ノートパソコンなのである程度の省電力機能がある。

というわけでクロックを100MHzまで落としてDiskWalkerと勝負。

どちらも一瞬で起動するのでよくわからないけど、ほんのちょびっつだけDFの方が速いような気が。

もっともDFを起動するときには祈りながら起動しているのであてにならない。


「【謎】と書いてあるんだから……」と言っている人は見たことがありません。

しかし、【謎】とはどういう意味か問い合わせたときには回答を拒否された上に、読み飛ばしてくれということを言われました。

結局、解説するつもりが無いものと判断しました。


C言語のstaticの話。ローカル変数でもコンパイル時に初期化だったっけ?と思ってstatic int s=i;って感じで確かめてみたら、C言語ではコンパイル時に決定(コンパイルエラー)で、C++では実行時に、ということだった。

C++ 2ndの2.1.3寿命の解説では static c = a; // 一度だけ初期設定されるとあります。3rdで変わってはいないハズなので初期化はコンパイル時、もしくはリンク時の一度だけのハズ。

つい、コンパイルとリンクのフェイズを区別しないで書いてしまった。ここしばらくはコンパイルとリンクと別々にやることが少ないからだろうなあ。

実験コード


#include<iostream.h>

int z=3;

int foo(){
  int a = 5;
  static int b = 8;

  return b++;
}


int bar(){
  static int c = z;
  return c++;
}

int main(){
  cout << "foo" << foo() << endl;
  cout << "foo" << foo() << endl;
  cout << "bar" << bar() << endl;
  cout << "bar" << bar() << endl;
  return 0;
}

実験結果

foo8
foo9
bar3
bar4


DF。起動高速化の手を思いつく。

描画高速化の手を思いつく。

描画時に属性を判定して色を決定しているのだけど、ディレクトリ検索時に判定してその判定結果を保持しておけば、描画時の処理が減る。1ファイルあたり4バイト増える。

このタイミングで判定しておけば、拡張子ごとの色を変えるときでも負荷は増えない。ハズだ。


PHSを買い替える。

32KbpsのNTTパーソナル Paldio 312SからNTTドコモの641S。生意気にもiモード端末だ。

いや、しばらくは312Sで頑張るつもりだったのだけど、64Kデータカードもおまけに付くというので買うことにした。

今使っている312Sはドコモ中央での契約になっているので機種交換ができないのだ。

オマケの(どっちかというとコレメイン?)データカードを取り出した時に型番をチェック。DC-6S。64K対応でPじゃない。安心。

帰宅してから袋から出してみると for Doccimo。こらッ!

意味ねー。

2001年07月30日

「好きな子に告白しようと思うのだが…」読了。面白すぎ。なんでコメントが850くらいになってスレッドがお終いになりそうなところで事態が急変しますか。もう続きが気になりまくってしかたがないというか。引きが強すぎ。主人公クラス二人の発言でも、で終わらせて引っ張ってしばらく沈黙するという引きの強さを感じさせるものが多いというか、福島の人ってみんなああも思わせぶりなのか?

関係ないところで。

語尾をローマ字にして目立とうとする、目立たせようとするのは構わないのだけど、YO!だけは勘弁していただきたい。笑ってしまってしかたがない。


(´Д`)この顔文字ってどういう意味? なんかげんなりした感じがただよっているのだけど。

>>146

DF(´Д`)イイ!!

ってどういう意味か図りかねるというか。げんなりした顔から、この「イイ!」はもういいから勘弁してくれみたいな感じなのか。

>>229で紹介されているDiskWalker。起動が速い。さすがだ。DFもいい勝負をすると思うけど、DFより速いんじゃないか。FIVAではすでに誤差の範囲というかよくわからない。もっと遅いマシンで試さないと計測不能。

メモリ消費。

DiskWalker
2,023,424
DF
1,445,888

勝った。でもその差は600KB。うっかりしていると使ってしまいそうだ。

HeapWatchで見てみると

DFが15,132+26,416バイトで41,548バイト。DiskWalkerは137,564+26,416で163,980バイト。26,416バイトのブロックは仮名漢字変換のWXG3が使っているヒープ。一見勝っているようだが、使っているうちに仮名漢字変換(WXG3)のヒープが大きくなる。DiskWalkerでは増えない。なぜた。

ところで、このDiskWalkerの使い方がさっぱり解りません。キーを押しても押しても何の反応も無いような気が。マウスで操作するっぽいんだけどファイルをコピーするにはどうしたらいいかすら解らない。バイナリビューアとかテキストビューア、ビットマップビューアなんかも付いているのだけど。

誰か、使い方教えてぷりーづ。


今の順位を使ってソートするためには、今の順位をどこかに記録しなきゃいけないわけで、そのために1ファイルあたり4バイト使うのはどうかというところで悩んでいたりする。1024個のファイルがあったら1ページになるわけで。


ところで今回の選挙、方式がよくわかっていなかったのだけど全員が大仁田厚に投票していた場合、議席はどうなったのだろう。まさか分身しろという訳にもいかないし。


知り合いの福島県人は皆あっさりとしてますけど…

そこで引っ張らないでYO!

ちなみに、あだ名がYOというヤツがいたりするのでYO!だけは笑えて仕方がない。

2001年07月29日

さらにmelmel☆Light。試しにWATCOM C/C++11.0Jでコンパイルしてみると2048バイトになりました。んがー。512バイト単位でしか実行ファイルを作れないんだよなあ。どこかの設定をいじれば可能なのかも。

コンパイル、リンクしただけで動かしてませんけど。

さて、さらに小さくするにはどうしたらいいか。内部的にはもうどうしようもないような気がするので小手先の技を一つ。

初期化の必要なローカル変数をstaticにする。

melmel.cppの場合なら


static const char* DLLList[]=
{ "UNLHA32","UNZIP32","UNRAR32","CAB32","YZ1","UNARJ32J","TAR32","AISH32",NULL };
static const char* CMDTbl=
"x -a\0x -y\0-x\0"
"\x55\xa6\xa3\x99\x99\x99\xa6\x99\xc7\xa1\x99\x00\x99"  // a-m
"\x99\x99\x99\x99\xa2\x99\xa6\xc7\x99\x99\x99\xa4\xa1"; // n-z

ここかな。

初期化の必要なローカル変数は、スコープに突入した時点で初期化されます。ということはその時点で初期化するためのコードが入っているわけ。staticなら初期化はコンパイル時に行い、その後は初期化動作を行わないのでその分のコードが節約できます。constだから変化しないじゃん、というのは油断しすぎ。たとえばCMDTblだとCMDTblのポイント先はconstでもCMDTbl自体はconstではないのでCMDTblは毎回初期化する必要がある。

オリジナルのソースをコンパイルしてみる。

元のソース抜粋。

void EntryPoint(void)
{
  char *d, *p, *t, c, str[1000];
  HMODULE dll;

//-- 拡張子-DLL-コマンド対応表
#define MAGIC_LEN (13)
  const char* DLLList[]=
    { "UNLHA32","UNZIP32","UNRAR32","CAB32","YZ1","UNARJ32J","TAR32","AISH32",NULL };
  const char *CMDTbl=
    "x -a\0x -y\0-x\0"
    "\x55\xa6\xa3\x99\x99\x99\xa6\x99\xc7\xa1\x99\x00\x99"  // a-m
    "\x99\x99\x99\x99\xa2\x99\xa6\xc7\x99\x99\x99\xa4\xa1"; // n-z

EntryPoint_:
    push      ebx
    push      ecx
    push      edx
    push      esi
    push      edi
    enter     00000414H,00000000H
    mov       ecx,00000009H
    lea       edi,-2cH[ebp]
    mov       esi,offset FLAT:L$1
    mov       dword ptr -8H[ebp],offset FLAT:L$22
    repe movsd
    call      dword ptr cs:`__imp__GetCommandLineA@0`

最初の p = GetCommandLine(); の前になんだか処理が入っている。

これを

void EntryPoint(void)
{
  char *d, *p, *t, c, str[1000];
  HMODULE dll;

//-- 拡張子-DLL-コマンド対応表
#define MAGIC_LEN (13)
  static const char* DLLList[]=
    { "UNLHA32","UNZIP32","UNRAR32","CAB32","YZ1","UNARJ32J","TAR32","AISH32",NULL };
  static const char *CMDTbl=
    "x -a\0x -y\0-x\0"
    "\x55\xa6\xa3\x99\x99\x99\xa6\x99\xc7\xa1\x99\x00\x99"  // a-m
    "\x99\x99\x99\x99\xa2\x99\xa6\xc7\x99\x99\x99\xa4\xa1"; // n-z

に変える。


EntryPoint_:
    push      ebx
    push      ecx
    push      edx
    push      esi
    push      edi
    enter     000003ecH,00000000H
    call      dword ptr cs:`__imp__GetCommandLineA@0`

GetCommandLine()の前の処理がなくなった。

この程度なら困るものでもないだろうけど、C++でローカルにconstオブジェクトを作っていたりすると、毎回初期化、つまりコンストラクタが起動されたりするのでもしかすると意図した動作とは異なる動作をするかもしれない。

CMDTblの定義はconst char * const CMDTblのほうがいいかもしれない。ややこしさの面から行けばconst char CMDTbl[]の方が判りやすい。CMDTblは書換えないでしょ? まあ、Visual C++6.0なら最適化してくれる範囲だとは思う。

WATCOM C/C++11.0Jでコンパイルした結果、最初の357バイトのコードが308バイトに。

まあ、それでもWATCOM C/C++だと512バイトの壁を超えないとサイズに変化はないので意味がない。Win32的に512バイトアラインという制限があるのだと思っていたけど、Visual C++6.0なら関係ないんだねえ。うーん。


サイズとは関係ないところで一つ。


  while( *p!=c && *p!=EOT )
    if( *(p++)==BS )
      t = p;
  t[3] = EOT;

//-- コマンドライン:書庫名( p )
  if( c==DQ )
    p++;

//-- 拡張子で形式を判定
  for( t=p; *t!=EOT; t++ )
    if( *t==DOT )
      c = CMDTbl[MAGIC_LEN+(((t[1]-1)&0x1f)%26)];

このコード、私的にはバグです。


  while( *p!=c && *p!=EOT ){
    p=CharNext(p);
    if( *p==BS )
      t = p;
  }
  t[3] = EOT;

//-- コマンドライン:書庫名( p )
  if( c==DQ )
    p++;

//-- 拡張子で形式を判定
  for( t=p; *t!=EOT; t=CharNext(t) )
    if( *t==DOT )
      c = CMDTbl[MAGIC_LEN+(((t[1]-1)&0x1f)%26)];

こうすべき。


投票。せっかくだから大仁田厚に一票。

選挙区の方の候補。ちょー面白いのが。維新政党・新風公認の千代信人候補。

面白すぎるので頑張っていただきたい。私のいないところで。

個人的には元号表記はまぎらわしすぎてたまらないのでなんとかしていただきたい。昭和70年の誕生日まで有効とか書いてあっても昭和70年っていつだよとか思うわけで。

なんで皇紀じゃなくて元号なんだろう。

無所属、横山充洋候補。中国と再び戦争しますか!!という見出しで目を引く。

日米安保条約を破棄しなければ台湾有事のとき、日本はアメリカと共に中国と戦争を始めることになります。

そうか? そんなことしたら大変なことになりそうだけど。っていうかなんで台湾有事で中国?


スクワットしてDDR。うわ、1プレイ5曲。死ぬ。久しぶりにB2Uで回る。いい感じで回れたと思う。

ついでにGM。ドムともなんとか戦えるようになった。ズゴッグが強敵。ザク相手なら負ける気がしないんだけどなあ。


ああ、誤動作する可能性を見越しつつわざとやってましたか。失礼しました。

一つめは納得ですが、二つめって2バイト目に'.'がある文字コードだと残念な思いをするような気がしてなりません。そういう文字コードってないのか。

実質サイズ以降を私が勝手に削除してるだけ。

おお、なるほど。その手がありましたか。

目から鱗が落ちる思いです。

っていうか、「好きな子に告白しようと思うのだが…」面白すぎます。今晩眠れなかったらどうしますかかかかか。どうもしませんが。現在5まで読了。

2001年07月28日

melmel☆Light。ExitProcess()は必要です。無くてもおおむね動いたのですが、Windows 95では別スレッドを作ったときにゾンビになってたりしました。OSがスレッドを終わらせてくれなかったのかも。

というわけでExitProcess() 等を呼ばなくても大丈夫なことが保証されてればもう少し縮むんですがExitProcess()を呼ばないとマズいことが起こったのでとりあえず呼んでおいたほうが。

Cランタイムをリンクしていないなら変わらないと思いますが、C++だとコンストラクタが動いたり例外テーブルがあったりするのでCとしてコンパイルしてみるとか。


Pyxisの二個読み飛ばす、という話は@niftyのFGALTLA/MES/14/03227で作者の〜Tom〜さんが

子ディレクトリのとき、「.」 と 「..」を読み飛ばす処理を入れておいたのが、ルートディレクトリでも有効になってしまっていて、ソートの若い順の2個がスキップされてしまっていました。

と紹介しているので知っていたというだけの話。正直、この発想には目から鱗が落ちる思いだった。確かにDOSやWindowsでFileFindFirst()を使うと最初にヒットするのはこいつらだ。だからこいつらが来ることを前提に、読み飛ばしてしまうというのもありかもしれない。


int IsDot(const char *file){
  if(*file++=='.'){
    if(*file=='\0' || (*file=='.' && file[1]=='\0')){
      return 1;
    }
  }
  return 0;

//  return (!lstrcmp(file, "..") || !lstrcmp(file, "."));
}

わざわざこんなコード書いて確認している私の立場は一体…とか思ってしまった。


JR中央線で自殺はかる。うつぶせになっていたために電車に当たらなかったらしい。何しに行ったのやら。やると決めたらやれ。まあ、やれと決めた後にやらないと決めても構わないが。

自殺だろうがなんだろうが、かなりの時間を費やして悩んで考えて決定したのだろう。それを実行できなくて後悔しないのだろうか。あっさりくつがえしてしまうと、最初に決定するまでの時間が無駄になってしまう。もっとも死んでしまえば後悔もできないので単純に比較できないような気はする。

死んでしまえ、というのではなくて、何にしろ決めるならちゃんと考えてから決めてほしいし、できないことをやろうとするな、という話。

たまたま、こう考えたきっかけが自殺未遂というだけの話で自殺を肯定するつもりも否定するつもりもないけど。

だから実現できないスケジュールを立てるなって。


SirCamの症例を見ていてちょっと実験。実行ファイルA.EXEをA.PIFにしても起動できるのか。

起動した。

.PIFならプログラムインフォメーションファイルとして解析してリンク先のプログラムを動かすものだと思っていたのでびっくり。ショートカットの.LNKは解析するのになあ。これは手抜きだろ。


ベースって打楽器だったのか。ずっと弦楽器だと思っていた。

2001年07月27日

xyzzyはFIVAでは実用的じゃない。というか今時のノートだと実用的じゃないような気がする。右Ctrlと右Altがないと快適に使えない。というか、右Ctrlと右Altがあるキーボードで使うとかなり快適。Lispが解らないのでカスタマイズできないという不都合はあるけど。

という訳でデフォルトのキーアサインで使うことはあきらめてまずはキーアサインを変えることから始めよう。C-xとC-cはCtrlが左にしかないから左Ctrlと右のキーにしたい。さてどれにしよう。


素直にプライマリソートキー、セカンダリソートキーを用意したほうがいいんだろうか。悩。


K.INABAさんの日記で紹介されていたVisual C++の小技。ここにあるテクニックを使うと実行ファイルを小さくできるらしい。WATCOM C/C++でも似たようなことはできるはず。

セクションの4KBバウンダリ

wlinkのalignmentオプションとobjalignオプション。objalignは0x1000(4KB)以上じゃないとWindows 98で実行できない。alignmentは自動で最小値が設定されるので現状まま。

.rdataを.textに入れる

コレはいい手だ。と思って調べてみたら

この例では、16ビットCコンパイラと16ビットおよび32ビットC++コンパイラでは、定数変数cvarが"CONST2"セグメントに入ります(32ビットCコンパイラは、この変数を"_TEXT"セグメントに置きます)。

ってことでCで書くぶんにはあまり意味がないことが判明。

C++ではどうしたら?

CONSTセグメントにあるデータを_TEXTセグメントとマージする方法は…無いのか?

データセグメントクラスを変えることはできないらしいが、名前くらいは変えられそうな気がする。

うーん、やっぱりVisual C++が欲しい。

同一ソースでVisual C++6.0でコンパイルしたら82,944バイト。WATCOM C/C++だと88,576バイト。

あ、いい手がある。逆アセンブルしてからセグメント定義を書換えてアセンブルしなおせばリンカの制限なんて乗り越えられるのではないか。ものすごく面倒そうだ。やめとこう。


特訓DXを書換えて解像度を640x480にする。

敵の移動量も半分になってしまうので計算しなおすのだけど、この値に決めた根拠はなんだっけ。Excelでいろいろ計算していた記憶があるのだけど、あのワークシートはバックアップしていなかったような気がする。

2001年07月26日

DFのソートを安定したソートに変えようと思ってクイックソートからマージソートに書換える。単純なマージソートだとバッファが必要だげどそんなメモリは無いのでやりくりしてみる。8要素以下のブロックはインサートソートにして速度を稼ぐ。

結果、クイックソートの倍近く遅くなった。んがー。

メモリをやりくりするところが遅いようだ。

memmov()を高速化してみる。ダメ。遅い。クイックソートに戻す。

安定ソートにしておけば、名前でソートした後に更新日付でソートすると、更新日付順で、同じ日付ならば名前順に並ぶので。今までは勝手に上下関係の区別がつかないときには勝手に名前順にしていたという。このため拡張子順でソートするときには拡張子で比較したうえでファイル名でも比較するという感じでかなり無駄だった。

何がしたいって、属性によるソートも実装しようかと思って。まあ、今まで通り属性手比較して判断できなかったら名前順、というのでもいいんだけど。


この日記、ReadMe!の登録情報を見ていると休みの日はカウンタが激減する。時間までは解らないのでアレだけど、もしかして職場から見ている?


うわー、こんなことならハドソンに行っとくんだった。そーか、そーくるか。しくじったなあ。


Pentiumつーか、x86のアラインメントによるペナルティ。読み出しの方がでかいのか、それとも書き込みの方がでかいのか。4日の疑問を晴らすため計測する。

計測手順はmalloc()で4MBのメモリを2セット分捕り、片方から片方に4バイト単位(long int)でコピーしていく。これを512回繰り返し、かかった時間を計測する。

時間の計測にはtimeGetTime()を用いた。

アラインメントPC98-NX VA70HFIVA 101
転送先転送元Celeron 700MHzMediaGX 200MHz
00 20,32252,532
+10 17,55881,684
0+1 19,87559,693
+30 17,56781,695
0+3 19,87750,228

単位はms。テストするたびに数値は変化するけどおおむねの傾向は変わらない。

おもしろい事にCeleronとMediaGXでは逆の結果が出ている。Intel製だと読み出しのペナルティの方が大きいようだ。何となく書き込みの方が遅いかと思っていただけに驚き。

ペナルティが無いはずの0:0が一番遅いというのも不思議。何度繰り返しても大抵遅いという。何にしろ書き込み先のアドレスが4の倍数でないほうが速い、というのは不思議でならない。

それに比べてMediaGXの結果はすごくまともで想像通り。というか、書き込みのペナルティがこんなにでかいというのは想像をこえていたけど。

IntelのCPUなら、アラインメントがあったほうが速いので、気にしなくてOk、という結論でいいのだろうか。どっちかというと読み出し側のアラインを揃えていたほうがよさそうだけど。15%程速くなる。

目の前の結果を見てもいまいち納得できないので、解説してください。x86の偉い人。


Pyxisが、ネットワークドライブの接続で異常終了する。

FGALTLA/MES/14/03417によるとタイミングの問題らしい。

  1. WNetAddConnect3 関数で、ネットワークリソースをローカルドライブへ割り当て
  2. 割り当てたローカルドライブへ Pyxis のカレントを移す
  3. ローカルドライブのファイル一覧を取得

流れ的には、問題ない筈です。しかし、どうやら、(1)と(2) の間に、メッセージループ(PeekMessage等)を入れないと、いけないらしい・・・

うーん、そうか?

試しにDFをネットワークドライブの割り当てを行った直後にカレントディレクトリもそちらに移すように書換えてテスト。

そのような問題は発生しなかった。

ワトソン博士によると単なるNULLポインタ参照なので割と単純なバグなのではないかと思える。

SPYで見ていると、Pyxisは頻繁にタイマーが動いている。メッセージループを入れることでタイマーが処理されてその時点で変数が初期化されるということではないか推測するが何がなんだか。

まあ、ディレクトリの.と..を省くためにディレクトリ検索時には最初の二回を読み飛ばすという荒技を編み出す人だから何かスゴイことでもしているのかもしれない。

2001年07月25日

タスクトレイを黒くしたらFIVAPMのアイコンが認識不能になる。

もうちょっと真剣に考えないと。コンセントにみえる、というのもアレだし。


昨日と同じような感じで発車時刻まであと3分。走る。

昨日と同じく乗車口付近に30人程度の学生がたむろっている。押しのけて掻き分けてバスに乗る。セーフ。


先日の7月11日、FileVisor5 v5.00が公開された。

どうやらファイルの一覧を取得する方法として、DFで使っているFileFindFirst()からExplorerのようなシェルネームスペースを使う方法に変えたらしい。そのため親ディレクトリに移動するためのアイコンが無くなってしまった。

たったこれだけのことでFWINALで軽くバトルが発生。

規模が大きくなると、ちょっとした変更でも影響範囲が大きくなるなあ。

ユーザが増えるのはうれしいけど無条件には喜べない、ということか。

DFは作りがアレなおかげでアレな人しか使えないというか、判らない人には使えない状態なので自動的にセーフガードが発動している。おかげで特にトラブルもなく平和。


闇黒日記 7/3

顏文字や「(謎)」や「(謎無)」と云つた表現は、誤解されないやうなちやんとした文章を書かずに濟ませようと云ふ横着な精神が生んだものであり、先人の殘した負債であると私は解釋します。

というか、「(謎)」や「(謎無)」といった表現は、誤解されたときの逃げ道として用意したものだと思います。顔文字もそういう用途に使えますが、最初の目的は単に顔っぽく作れるという遊び心だったと。

とりあえず「(謎)」と書いておけば、解らない人には謎でしかないその文について解説する気がないことを明示できますし、誤解されても謎だから解らなくても仕方がない、とで言い訳するつもりなんでしょう。

誤解されることを防ぐためのものというよりは誤解されても気にしないと明示しているのではないかと思います。

読者を共通の文化、知識、経験をもつ人に限定し、それ以外の読者は切り捨てるための構文なのではないかと。


ブラウザをOSとセット販売すると非難され、JVMをOSセットから除外すると非難され、Microsoftも大変だ。結局は「オレの望みどおりに動け」と周りが騒いでいるだけ?

7年間はJVMを配布することが許されているとはいえ、結局7年後には配布できなくなるのだから、今のうちから対策を立てておくのは不思議なことでもナンでもないと思うのだけど、なんでSunMicrosystemsはあんなに文句を言うのだろう。


うなぎ食う。

スーパーで蒲焼きになっていたもの。思ったより柔らかくておいしく頂きました。ちょっちタレが濃かったかも。


久しぶりに PSY・Sのアルバムをきく。

頂いたBOSEのスピーカー、設置場所を変えたのでものすごくいい感じで再生してくれる。低音用のスピーカーが欲しくなってきた。ちゃんと鳴るもんだから欲が。

2001年07月24日

朝からむかつく。

バスの発車時刻まであと2分、というところでエスカレーターに乗る。前のオッサンが両腕を広げて左右の手すりにおつかまりになり、通行止。私を含めて後続8人は不満たらたら。

手すりを離すように頼もうとしたが、目つきが尋常ではなく薬物依存症かなんかそんな雰囲気だったので恐くてやめた。

エスカレーターを降りてから走る。まだバスがいる。間に合った。

と思ったら乗車口付近に30人程度の学生がたむろっている。乗るのか? と思って躊躇しているうちにバスが発車。乗らないなら道を塞ぐな。

朝にバスに乗るだけでずいぶんとイライラさせられる。

結果、2分遅刻。んがー。


某様の伝説をちゃんと記録に残しておこうと思い、日記に追記する。まだネタが余っている。


ちょっと追加。

バージョンがあがればダウンロードしたくなるのがユーザーの心情だが、

不具合を修正したらアップロードしたくなるのが心情。

私だけだろうか。


明石市民夏まつりでの将棋倒し事故。

歩道橋の上に四千人以上いたそうだが、行くほうもどうかしているような気がする。アレだけ混んでいたら常識的には空くまで待つとか別の駅や交通手段を使うといった対応を取りそうなものだし。10分歩けば山陽電鉄大蔵谷駅があるらしいのでちょっとは歩けというか。

警備や行政の責任を問う声も高いけど、将棋倒しにした人の責任はどうなっているのだ。警備員などの制止をきかずに歩道橋に上がって事故を起こしたのだから歩道橋に上がった人が傷害・過失致死に問われるべきなのでは。

警備員の制止を振り切ってまで歩道橋に上がり、四千人がかりで10人殺した、という自覚は無いのだろうか。

それとも何か、警備員が力ずくでオレを止めないからオレは歩道橋に上がって他人を押しつぶしたんだ、とでも言うつもりなのか。小学生を8人刺し殺したのは力ずくで止めなかった教師達の責任というわけではないだろう。

警備やJR、大会運営側にもミスはあっただろうけど、個人がそれぞれ歩道橋を使うという選択をしたわけで、その結果他人を押しつぶすという事故につながった。個人の行動まで行政など第三者が責任なんて持てない。個人は好き勝手にやって責任は他に押しつける、というのはあまりにも無責任だ。また、行政や警備がしっかりとした指示を出さなかったからいけない、という考え方は個人の判断、思考をないがしろにするものだからキライだし危険だと思う。個人は何もしない、上が善きに計らってくれ、というのでは独裁者が現れる兆候だ。もっと自分で考えて自分で判断してほしい。って私みたいな無職の人間に言われるようじゃどうかと思うが。

しかし、蒸し暑い最中にあんな人が密集しているところに好んで入ろうとするのはなぜなのだろう。よほど人ごみが好きなのか。

あんなに密集していると痴漢とかスリに間違われたりしそうだ。間違われたときに反論できるだろうか。あの混みっぷりだと触りたくなくても触ってるぞ、きっと。

暑苦しいのはイヤだし、犯罪者に間違われるのもイヤだから私ならあんな混みに混んだ歩道橋は使わないと思う。

暑苦しいの大好きとか見知らぬ他人とスキンシップをはかりたいとかいうのなら話は別だが。


Litestepをカスタマイズ。

Wharfを外す。要らん。

systrayを最善面表示にしてHotkeyでトグルするようにする。これで要らないときに消せるし。

ちょっとしたメモ。

Windowsの終了ダイアログでCtrlとAlt、Shiftを押しながらキャンセルするとExplorerが終了する。

この状態からLitestepを起動させると、とりあえずはシェルをExplorerから変更しなくてもLitestepのカスタマイズを確認することができる。

気がすんだらシェルをLitestepに変更。


パソコン大魔神質問コーナー。面白すぎる。オススメ。量が尋常じゃないうえにどれもコレもネタにあふれているのですぐにお腹いっぱいになる。

2001年07月23日

さて寝るか、というところで水分を補給してからにしようと思い立ちQoo160gを飲む。

手持ちぶさたなのでDFのソースを眺めていたのだが、どうもバグっぽいのが。


if(OnCommand(LOWORD(wParam), lParam, pList)){
  /*  更新発生  */
  if(!pList->hChange){
    if(WaitForSingleObject(pList->hChange, 0)==WAIT_OBJECT_0){

      log_put("処理により変更あり更新");

      GetFiles(pList, FALSE);
    }
  }else{
    pList->dwOpt &= ~OPT_UPDATE;/*  更新ウェイトフラグを解除  */
    pList->dwTime = GetTickCount();
  }
}else{
  /*  操作があったので更新待機時間を設定  */
  pList->dwTime = GetTickCount()+WAIT_TIMER;
}

OnCommand()はWM_COMMANDのハンドラ。削除した時とか、ディレクトリ表示に変更がありそうな処理をした時にはOnCommand()が1を返す。

そこでGetFiles()でディレクトリ一覧を更新する。GetFiles()というネーミングはN66SR-BASICのファイル一覧を表示させるコマンド、FILESのパロディ。N88-BASICでも同じコマンド。

ディレクトリ更新通知ハンドルが取れていないときにはGetFiles()を呼び出していないような気がする。別のタイミングで呼んでいたっけ。

とにかく寝なきゃいけないのでこのままにして寝る。


起動。

要はGetFiles()を呼びそこねる場合があるので、呼ぶようにすればOk。

呼び出す条件というのが

ってことは


if(OnCommand(LOWORD(wParam), lParam, pList)){
  /*  更新発生  */
  if(!pList->hChange || WaitForSingleObject(pList->hChange, 0)==WAIT_OBJECT_0){
    log_put("処理により変更あり更新");
    GetFiles(pList, FALSE);
  }
}else{
  /*  操作があったので更新待機時間を設定  */
  pList->dwTime = GetTickCount()+WAIT_TIMER;
}

でいいのか。フラグの制御はGetFiles()でやってるし。

おっと、これだと検索モードのときに誤動作する。21日に検索モードのフラグを見ないで更新ハンドルだけを見るように変えたのだった。やっぱり検索モードのフラグを見ないとダメか。

ついでに更新を遅延させているところも確認する。この間、プログラムを起動するところを修正してエラーチェックのほうを修正し忘れたというミスをしたので、今度はちゃんと関連するところも見落とさないようにしないと。

タイマーが発動したら無条件で画面の更新を行っている。更新があったかどうか確認してからのほうが良さそうだ。

あ、この時点ではすでに更新通知がリセットされているからダメか。コレはこのままでよしと。

おおむね修正完了。

OPT_UPDATEよりOPT_DELAYの方が名前としてはいいような気がする。折りを見て変えよう。


地下鉄駅で煙草を吸うオッサン地下鉄駅で煙草を吸うオッサン。地下鉄駅構内は禁煙。向かいのホームから撮影した上、フラッシュも使えない(使っても意味がない)状態だったのでシャッタースピードが1/2秒程度になっていた。感度をISO400相当にあげるか、補正を-にしてから撮影するべきだったかも。手ブレて仕方がない。


というわけで窓の杜 - 【連載】ひぐちたかしのオンラインソフトよもやま話 第19回:バージョン表記のフシギ 〜こめられたさまざまな思いと理由〜

バージョンという概念はオンラインソフトにとって、なくてはならない重要なものとあるけど、これはオンラインソフトに限らない。っていうかソフトウェアに限らない。車にも年式という形のバージョン表記がある。

そんなに重要なバージョン表記でも、その付け方は十人十色で全然統制がとれていない。なぜか。坊やだからさ。

いや、バージョン表記のやり方というのは決まっていないからだ。もしもJISか何かで標準となるべきものが勧告されていたら従う人もいるのではないかと思う。その規格に従うことでのメリットがあれば。無ければ誰も従わない。

それがユーザーには混乱のもとになっていることもあるらしいのだけど、どういう時に混乱するのだろうか。できれば事例もあげていただきたい。

基本的にバージョン番号は後になれば増えていくもので、そこに混乱する余地はない。バージョン1とバージョン2のどちらが新しいかどうか悩む余地は見つからない。どうやったら混乱できるのは教えてほしい。

秀丸3.0とWZ Editor3.0のどちらが新しいか、という問題だと悩むことができる。しかしそれはバージョン表記の問題ではない。ソフトウェアのバージョン表記は同一のソフトウェアでのみ比較できるのであって、異なるソフトウェアに対しては意味がない。

Windowsのバージョン。この話題は全然関係ない。

マイナーバージョンアップとしてSecond Editionなどというものが発売され、これが“SE”と呼ばれるようになりってSEって呼び出したのは誰だ。インプレスをはじめとするマスメディア各社じゃないのか。

MSDNで[98SE]と略されていたりするけど、あれは技術者むけの略称。それを技術者ではないユーザーに押しつけたのは誰だ。

英語圏の人ならSecond Editionで充分判る。日本人でも英単語の意味さえ知っていれば判る。それをSEなんて略すから解らなくなる。Windows 98 2ndとかWindows 98第二版とでもしておけば混乱は少ない。

なんで各社マスメディアは解りにくいSEなんて略称を用いたのか。MSDNの記述は根拠にするべきではない。アレはあくまでも技術者むけの情報であり、表記方法だ。

それは置いといて、SE、Me、XPという表記が解りにくいというのは御意。

じゃあ“NT Technology”の“NT”って何なんだよ?ってWindows 2000βが出た頃からギャグのネタになっているような気がする。ネタが古すぎる。

SE、Me、XPの話はWindowsのバージョンということでバージョンネタにつながるけど、このネタは全然関係ない。古いし。

基本ソフトであるOSがそんな調子だから?、その上で動くオンラインソフトのバージョン番号だって、混乱しやすい付けられ方をしていても、おかしくないと言えばおかしくないのかもしれない。

いや、おかしいものはおかしい。ソフトウェアのバージョン表記をOSのバージョン表記に合わせなければならないという決まりはない。というか、ソフトウェアのバージョン表記に対する規定があれば混沌とした表記は生まれなかったはずだ。もちろん、OSのバージョン評価に従ってはならないという決まりも無い。

バージョン番号が乱数で毎回予想もできない数値になる、という場合はさすがに変だ。

初めての公開なのに、いきなり2.0とか5.0といったバージョン番号が付いているソフトを見たことがある。

それのどこが問題になるのだろう。ソコに混乱する余地は見つけられない。

初期値がナンであろうと、その後のバージョンと区別が出来てどちらが新しいか判断できるのなら意味は明確になる。

ユーザーにとっては正直なところ意味不明でしかないということにはならないのだ。

それに、公開したときがソフトウェアの始まりではなく、作ったときが始まり。作ったけど公開していないプログラムなんて山のようにある。ちょーローカルで配布していて、気が向いたから@niftyに公開してみた、というものもある。

BKEYはC言語フォーラムで公開したのが0.03で、プログラマーズフォーラムで公開したのが0.04。その後Windowsアクセサリフォーラムに登録したのが0.05くらい。ベクターから収録許可依頼がきたのが0.06だったハズ。

ベクターにはイキナリ0.06から登録されているわけだけど、ベクターでの公開を機にバージョンを0.01に戻したりしたら余計に混乱する。

いきなり2.0とか5.0といったバージョン番号が付いているのもそれなりの理由がある。外部の人から見たら最初の公開かもしれなくても、仲間内では長年使われてきたものかもしれない。そのバージョン番号を戻してしまう訳にはいかない。

最初から公開する義務はないし、バージョン番号を1.0から始める必要も無い。

また、バージョン1.0というバージョン番号には特別な意味がある。1.0ということは完成品ということを示す。

しかし、今作っているものをそう簡単に「コレで完成」と言い切れるかというとそうでもない。改版はするけど、コレで完成とは認めたくない。だから1.0という番号は付けられない、付けたくない。安易に完成としたくない理想の高さがバージョン表記の細かさに現れているのだと思う。

私も多分にその口で、0.99まで使ってしまって、次の改版作業をしようものならかなり悩むと思う。コレで完成といえるのか。完成と言い切ってしまっていいのか。

認めたくなければ0.991とか訳のわからない番号を付けるかもしれない。0.99AとかNECのMS-DOSのようバージョン表記にしてしまうかもしれない。

私の場合、それが恐くて0.01から始めているわけだけど。

バージョン表記に数字ではなく「いろはにほへと」を使っているものこれは日本人らしくて非常に良いと思う。

バージョン表記にアルファベットを付けて3.11Dとか5.0Aといった表記があるように、日本のアルファベットであるひらがなやカタカナを付けるのも日本人にとっては判りやすいのではないか。もっとも数字と違ってひらがな、カタカナは数え方が二種類あるのでそういう意味では混乱の元になりそうだけど。

それに他のソフトウェアと比較すると解りにくいのかもしれない。けど、そもそも他のソフトとは比較できる表記ではないので比較すること自体が誤り。

たとえば DFの0.02とBKEYの0.09、どっちが新しいかというと0.02と数値が小さいDFのほうだし。

バージョン番号が日付になっていると、バージョン番号を見ただけでは機能がどれだけ変わったのかという程度がわからないという短所もあるだろう。

まったくナンセンスな主張だ。

日付による表記ではなく、1.0とか2.0といったよくある表記だと機能がどれだけ変わったのか判るのだろうか。

WZ Editor、1.00から2.00になって機能がどれだけ変わったのか、バージョン番号から推測できるだろうか。私にはできない。

細かいバージョンアップの是非。

ひぐちたかし氏はいちユーザーであるぼくから見れば、あまり細かくバージョン分けしてその都度公開するくらいなら、公開をしばらく待って、修正箇所をある程度まとめてから公開してくれるほうがいい。とおっしゃっている。しかし、作っている我々の立場からすると、一刻も早く不具合は修正したいし、修正したらそれをお届けしたいのだ。

ひぐちたかし氏にとってはどうでもいいような不具合かもしれないが、別のユーザにとっては重大な不具合かもしれない。そのあたりを判断するのは個々のユーザであって作者でもないし別のユーザでもない。

だからこそちょっとした修正であっても公開し、そこから先の判断はここのユーザにゆだねるのが最適解だと思う。作者にとってもユーザにとってもバージョンアップは義務ではない。ユーザの方が面倒だと思うならバージョンアップしなければいい。作者が勝手に結論して公開しなかった場合、ユーザにはバージョンアップするかどうかの選択肢すら奪われることになる。

バージョンがあがればダウンロードしたくなるのがユーザーの心情だが、

その気持ちは判る。

あんまり頻繁にダウンロードしなければならないのも面倒くさいと思ってしまう。

しかし、ダウンロードは義務ではないのだから、しなければならないということはない。勝手に面倒だというのも失礼な言い草ではないか。

作者とユーザーのお互いの手間暇を考えれば、せいぜい1週間に1回程度のバージョンアップ公開が適切ではないか

それは他人が勝手に決めることではない。

作者側、少なくとも私は好き勝手にやっているので手間だとは思っちゃいない。もちろん、暇なときになっているので全く問題ない。というか、暇は作るものだ。

もちろん、ユーザも暇なときにダウンロードすればそれで充分。

私が午前2時に更新したところで、ユーザが丑三つ時に起き出して一斉にダウンロードする姿は想像するとかなりイヤだ。サーバが死ぬほどユーザがいるとは思えないのでサーバの負荷についてはあまり心配していないけど。

だから他人の手間暇まで考慮する必要はない。まさに余計なお世話というヤツだ。

また、ソフトウェアに不具合が2箇所あったとする。私のように一人で開発している場合は分身でもしない限り不具合を一つずつ直していくことになる。そうなると、どちらかというと重要な問題を引き起こすほうから修正に取り掛かるわけで、そのような重要な不具合を修正したら暫定版としてでもすぐに公開したい。

しかし、世の中にある数多くのオンラインソフトの中には、β版で公開されてから何度も何度もバージョンアップを繰り返しているにもかかわらず、いつまでたってもβ版のままだったり、1年以上も正式版にならないソフトなどもある。こうしたものはβ版という扱い方をちょっと考え直した方がいいんじゃないかと思ったりする。

まさにDFやBKEY(忘れたわけじゃないんだ、一応)がその状態だったりする。

何をもってβ版、リリース版と区別するかという基準が作者ごとにあるはず。β版なのは単にその基準に達していないからだ。

BKEYの方はグラフ表示とデータの暗号強化、Ver0.08とのデータ互換性、カスタマイザの統合が目標。コレが出来るまではβのまま。

DFの方は最適化とチューニングが終われば、という状態。他の機能追加については次に回すことに決めている。

ただ、こういう作業というのはある程度まとまった時間が必要なので盆暮れ正月ゴールデンウィークくらいにまとめて作業しないと間に合わない。つまり一年にこのくらいしかチャンスが無いので、このチャンスで終わらないと次のチャンスまで流れる。

一年以上ほったらかし、というのも空いた時間を使う都合上どうしようもない場合もあるだろう。

Linuxも、2.2から2.4に上がるまでどのくらい時間がかかったものか。アレだけの人数がかかわっていても時間がかかるものはかかる。規模もでかいけど。

どんなソフトであってもバグや不具合はつきものだ。特に個人ベースで開発しているオンラインソフトであれば、十分な環境で動作チェックができないというのも、ある程度は致し方ない。

だからといってバグがあってもいいというものではない。

スケジュールが無いからこそ、品質を向上させてもいいじゃないか。品質よりスケジュールを優先させたソフトウェアがどうなったか、最近の市販ソフトウェアを見ていれば解りそうなものだ。

β版だから、オンラインソフトだから、フリーウェアだから、といって不具合があってもいいというような作者はいないはずだ。

むしろユーザのかたにもβ版だから、オンラインソフトだから、フリーウェアだから、といって不具合があってもいいとは考えずに、不具合があったら作者のほうに連絡を差し上げて頂きたい。

すでに作者が把握している不具合でも、修正に取り掛かる優先順位を決める際の手がかりにもなる。一人からあげられている不具合よりも先に30人から報告されている不具合を優先したくなったりするだろうし、その不具合が極めて重大なものであれば一人からしか報告が無くても他の不具合より優先するかもしれない。

そうした判断材料としてもユーザの反響というのは極めて重要でありがたいものだから。

2001年07月22日

某様、来襲。

部屋に横たわっている体重計を見て体重を測りだす。体重計に乗るものの、数値が安定しない。いつまでも数値がふらふらしている。

思わず「落ち着きがない」と口を滑らせると粛正されてしまった。口は災いの元である。

私の倍の体重があることが発覚。

体脂肪を計測するまでじっとしていることが出来ず、体脂肪は計測できないまま。

謎の珍品銃、JIEKE P-198を見せる。グリップから手がはみ出るという事態。うーむ。そういえば私が握ってちょうどいいのだから普通だとそんなものかも。もっとも某様はSIG P220でも小さいと言い放つくらいだから比較対象としてはアレかもしれない。


食事のために街へ。車の運転が荒くれてて酔いそうな感じだったけどちょっとふらふらする程度でなんとか。

何でもいいということでナンを食べに行ったタージ・マハールに行こうとするものの見つからない。マジックスパイスは場所が判らないということで断念。

仕方がないので近場のびっくりドンキーに。

最近行ったびっくりドンキーのコーヒーはやたらと器がでかくて薄いコーヒーが出てきたのだけどココのはまともだった。らっきー。


食事中の会話。

そのi-mode端末どこの?
某様
ドコモ
(i-modeはドコモしかやってないし)
いやいや、キャリアじゃなくてメーカー
某様
Dだから…三菱か?
…だからか。
某様
何がだッ!

という感じでシメられた。

じゃあ、なんでDにしたんだと訊いてみるとDのすばらしさを延々と語ってくれた。


くま宅でブツの受渡。

くま
今日、暑いなあ
某様
向こうも暑かったぞ
あー。
某様
何か言いたげだな!

粛正される。

なんでコレで殴られなきゃいけないのだ?

体重計のときは一言多いというか、まあアレだけど今回は三言は少ないと思うぞ。

某様、侍魂のヒットマン事件簿を読む。今まで読んだことがなかったらしい。というか先行者しか見ていないとのこと。

やはり、侍魂の存在価値は悠さん作の先行者GIFアニメくらいしか無いのかもしれない。個人的にはガチャピンに一票。

やはりYahoo!の判定は正しかったのか?

ビバ国家権力という表現がツボに入ったらしいが、某様は日々実践していることだからそこで笑う資格が無いと指摘すると他人の力などあてにしないと誠に逞しい宣言がなされた。

オレのはオレの権力だとか言い放つ始末。つまり言い換えるとビバ 俺様!ということらしい。

くまからPentium 100MHzを頂く。今デスクトップで使っているCPUはPentium 90MHzなので少しだけパワーアップ。133MHzで動けばタブレットが少しは快適に使えるかもしれない。今はPentium 90MHzを100MHzで動かしているので。5年以上この状態。


で、某様の今回の任務はデジカメを調達することだったらしい。60K程度で長く使える手のひらサイズの物、という指定。

手のひらサイズ、というのが難点かも。この時点でFinePixくらいかなあという感じ。あればCOOLPIX 990なんだけど手のひらサイズじゃないし。

Kikon信者? そうかも。私でもCOOLPIX 950は買わないけど。

予算的にはノートで使うしUSBも付いているというから接続キットは不要と判断。多少の予算オーバーは許可、ということなので60Kをそのまま本体につぎ込む。

途中、信号無視をかます。右折信号がでるのを待ちきれなかったらしい。

とりあえず指摘しておくと「オレだからな」で済まされてしまった。

19時55分。ヨドバシ到着。いざ駐車場…ってしまってるやんけ。なんで? 21時閉店じゃないのか?

あら、今日は20時閉店か。某所で時間をつぶしすぎた。21時閉店のつもりだったからなあ。

というわけで時間がない。

とりあえずCOOLPIX 990を探すがやはり無い。COOLPIX 995は実は某様的には手のひらサイズだということが発覚。まあ、予算オーバーなので除外。

カシオの300万画素機を手に取るがとりあえずやめさせる。

目についたFinePix4900を手にとってコレに決定。ってそんないいかげんでいいのか? こだわらない。

メディア(16MBのスマートメディア)とUSB接続ケーブルが付属しているセット価格で59,800。予算内だしこれでOk。


一日中HDDを回していたけど、それほど熱くならない。割といいぞIBM DJSA-220。この間落としたけど全く問題なしだ。

それよりもCPU側が熱い。CPUの熱なのかLANカードの熱なのか判らないけど。


「CGだったらハリウッドに切り込める」

まあ、奇抜な手を使えば先手は取れるけど。その後どうするのかは考えているのだろうか。まあ、考えているだろうし、今から手の内を明かすことはしないだろう。次の手が楽しみ。


シューティングゲームを作りたい! >>727より。

敵キャラの処理に関数へのポインタ使うと
カタストロフィー(アーマゲドンになったこともあった)の確率がアップ

特訓DXではバリバリポインタ。vtableもどきを使って多態しているのでどーしてもポインタを使うハメに。

っていうか、コーディングすればバグる可能性はアップするので、ポインタを使うか使わないかとはまったく関係ない。

ポインタを使ったときに飛躍的に可能性がアップするというのなら単にポインタの使い方が下手なだけ。


いつものことだけど、バージョン表記のフシギ 〜こめられたさまざまな思いと理由〜を読んでむかつく。

書きたいことがいろいろあるのだけど、書いているうちに日付が変わりそうなので明日にする。

つーか、まず一言だけ。

背景色を指定するなら文字色も指定しろ。

ひぐたちかしのよもやまばなし19回のスナップショットこんな感じで読めやしない。

2001年07月21日

どうにもこうにもリソース減少が止まらないのでWindowsのインストールを敢行する。

コントロールパネルのデバイスマネージャでPnPで認識されているデバイスを削除して再認識させたところ、多少は改善したものの減ったUSERリソースが元に戻らない。IEを複数立ち上げたときに現象が発生しているようなのでIEも再インストールしたが変化は見られず。

もう打つ手がないのでOSごと再インストール。

再インストールして、WXG(仮名漢字変換)をいれたとき。WXGにパッチを当てていなかったことを思い出す。もしかしたらコレだったかも。んがー。

すげー無駄なことで悩んでいたかも。


で、再インストール後。CraftLaunchが動かなくなる。何かDLLが足りないのだろうか。普通なら欠陥エクスポートがなんちゃらとか言ってくるのだけど何も表示しない。デバッガにかけて見るが普通に終了しているようだ。例外出して死んでいるならデバッガに引っかかるはずだが…。

試しに1.99βを突っ込んでみるとMFC42.DLLに対して欠陥エクスポートがあるらしい。しかし1.98では何も言わず終了するのはなぜだ。

とりあえずベクターでMFC42.DLLを公開している人がいるので、そちらからダウンロードして突っ込むと動いた。ふう。

以前は何を入れたときにMFC42.DLLが上書きされたんだろう。

MFC42.DLLを入れ換えるのはいいんだけど、シンボルファイルが無いとデバッガにかけるときに困るような気がする。

それはそれで、その時に困ることにして困る前に先回りして困るのはやめる。

2001年07月20日

ソニーシーピーラボラトリーズが1万人の顧客リストをうっかり公開。それはそれで問題だけど、この記事。

顧客リストは本来公開されないページに書き込まれていたが、何らかの理由で外部から閲覧できる状態になっていたうえ、このURLがネット上の掲示板で公表されていたという。

まるでURLを公表したのが悪いことのような報道だ。もっともどうやってURLを見つけたのかは不思議ではある。

同じ事故の記事をインプレスも掲載している。

こうした個人情報流出はおきてはならないことだが、被害にあった企業側の対応も気になるところだ。

ところで何処の企業が被害にあったのだろう。

私の感覚だと個人情報が流出した顧客が被害者で、流出させた企業(ソニーシーピーラボラトリーズ、サクセス)が加害者なんだけど。


襲撃に脅える日々。


私のページにはアクセス解析というかrefererをログに取ったりとかはしてません。見る暇ないし。

このページがあるサーバにはCGI置けないので、やるとしたらCGI用のサーバに日記を書くことになりますがCGI用のサーバって重そうな感じが。

変なことして他にサーバ使っている人の迷惑になってもアレだし。

2001年07月19日

MacOSが使いやすいと言われる理由の一つに、一つのものは一つに見える、というのがあったと思う。

Windowsだと、同じものを見るときでもどんどん覗き窓を作って見かけ上たくさんあるようにみえたりする。

Explorerを複数立ち上げればマイコンピュータが同じ数だけ出てくる。MacOSというか、Appleのデザインガイドでは基本的にはこのようなデザインを許さない。

しかし、牛乳はどこから見ても牛乳かもしれないけど、ファイルとか情報というのは見方を変えれば姿も変わってしまうので、このようなデザインはコンピュータにはそぐわないのではないかと思う。

たとえば2422というものを見て、二千四百二十二と読む人もいれば0x2422、九千二百五十と読む人もいるかもしれない。シフトJISだと思えば「$"」と読めるし、7ビットJISだと「あ」に見える。

まあ、見えるものだけがすべてじゃないということで。


つーか、物事を一面的に捉えようとしたり、他の解釈があることに気付かなかったり、他の解釈を認めようともしない人の割合がMacOSを使っている人に多いような気がする。特に初めて使い込んだパソコンがMacOSだったという人に多い印象がある。

コレがなぜなのか不思議でならなかったのだけど、日記を書きながらMacOSの思想「一つのものは一つに見える」が原因ではないかという推測を立てたりして見る。

まさに思考が道具に規定されてしまう典型。


物事を考える際に、言語で考える人とイメージで考える人がいる。らしい。

私の場合、思いつきは大抵の場合イメージというか直感で、それを検証するのが言語による思考。

ただ、言語による思考というのにはものすごい欠点がある。喋る速さでしか思考できないのだ。要は言葉として出てこないと次の段階に進めない。その代わり、段階を一つずつ確認しながら思考を進めることができる。

あと、思考の対象が複雑になってくると言語で表現できる範囲を超えてしまうのでそこから先はイメージによる思考になってしまう。

言語による思考を進めているときでも勝手にイメージによる思考は展開されていくので日記なんかを書いている時には書きたいことと書いていることが違うことがよくある。

実際に音声で喋る時は思考の速度が言語に置き換える速度を追い越してしまって噛んでしまう。


世界はひろい。こういう面白い発想が出来る人というのはなかなかいない。

2001年07月18日

続き。IEつーか、Windows Updateと格闘中。

ソースを見てみるか…メモ帳では大きすぎて開けない。んがー。

telnetでアクセスしてソースを読む。

んがっVBScript必須かっ。謎は解けたっ。

再インストールしてからVBScriptサポートは外してましたよ。「ページにエラーが発生しました」という感じで単なる文法エラーっぽかったのでJavaScriptのエラーだとばかり。VBScriptをJavaScriptと解釈しようとしてエラーになってたのね。

コレってNOSCRIPT要素で注意書とかできないのでしょうか。VBScriptを使ってるページにUAがJavaScriptを使えるとNOSCRIPT要素は無視? まあ、UAの問題という感じも。

少なくとも、VBScriptで記述されているということが解っていれば2日も悩まなかったので。


Windowsを良く知ってる人が読むともどかしいでしょうねっていうか、以前にあったCD-Rのフォーマットに関する話題のときもそうでしたがTOM nekoさんは自分の解釈に対して固執しすぎる感じがします。それはそれで信念が強そうでいいかもしれませんが。

MacOSではこうだったから他の機械でも同じだろう、という勝手な前提条件が成立していないだけの話。

私のような世代だと、MSXだとこうだったけどX1ではあーだし、MZはちょっちアレだしPC-88だとナニでFM-7は…んがーっという感じで機械が違えば文化も違うということが刷り込まれてしまっているのでそれはそれでアレですが。

Windowsの場合、コントロールパネルフォルダの「ネットワーク」は本物のファイルじゃありませんが(「Netcpl」が本物?)、Macでは、コントロールパネルフォルダの「TCP/IP」という名前のファイルは本物です。

「本物のファイル」という概念がよく解りません。解説希望。

Windowsのコントロールパネルに出てくるアイコン(ファイルではない)は単なるユーザーーインターフェイスでしかないので、それがファイルかどうかということは全然意識しなくていいのです。スタートボタンが「本物のファイル」である必要が無いように、コントロールパネルのアイコンも本物である必要がありません。

っていうか、「本物のファイル」という概念が解っていないのでこのたとえが妥当なものかも解りません。

また、コントロールパネルは、*.CPLといったファイルからアイコンを取りだして表示します。なのでアイコンとユーザーインターフェイスを担当しているのは*.CPLというファイル名のプログラムです。

ExplorerなりプロンプトからDIRとかするとかでファイル名を見ることはできます。

コントロールパネルを使ってそのファイルを見るとアイコンと日本語の名前が表示されます。

要は、ブラウザに何を使うかで見え方が変わってくる、というだけの話です。

私からすると、コントロールパネルのアイコンも*.CPLファイルのもう一つの姿に過ぎません。

コントロールパネルに「ネットワーク」という一つのアイコンがあるからといって、ネットワークの機能が一つのファイルで提供されているわけではありません。多分、MacOSも同じではないでしょうか。MacOSのコントロールパネルにある「TCP/IP」というファイルを追加すると、一緒にいろんなものもコピーされたりしないのかなと。MacSockって聞きませんけど、TCP/IPをサポートするなら当然socket関係もサポートするでしょうしDNS周りとかDHCPとかいろいろくっついてきそうです。

もちろん、全部まとめて一つのファイルにしてしまうという手もありますし、コントロールパネルの中にそれぞれ「TCP/IP」「DNS」「socket」「DHCP」という感じで細々としたファイルが並んでいてもいいのですが。

どういう単位でファイルを分けているのかわからないのでアレですが、関連するものは一つにまとめた方が判りやすいので全部引っくるめて一つのファイルになっていたりするのでしょうか。それはそれで豪快な気もします。

Windowsの場合はそれぞれファイルも分かれていたりするので、まとめて操作できるようにユーザーインターフェイスは独立しています。それがコントロールパネルのアイコンです。こいつを介して操作するとWINSOCK.DLLとかDHCP.386といったそれぞれの機能を担当するモジュールがシステムにコピーされるという仕組み。

MacOSだと、コントロールパネルや拡張機能のフォルダにファイルを追加するだけでその機能が有効になるのかもしれませんが、WindowsだとさらにWindowsに登録しないと動かないものもあるので別途登録作業が必要です。コントロールパネルを介して操作した場合にはこの手順も自動的に行います。

個人的には、登録しないと動かないようにしてくれた方が安心なんですが。やばいファイルを送り込まれたら大変なことになりそうです。

MacOS XはBSDベースなので当然一つのファイルになんでも詰め込むということはしないで、機能ごとにファイルを分けているはず。そうなると今までみたいなファイルを入れ換えるだけでOk、という世界は作れなくなるのでそれなりのユーザーインターフェイスを作って、ソレ経由でファイル群を操作するという形になるのではないかと。


先にWindows98SEにしたときにもTrue Colorでもグラデじゃなかったのは、その辺の問題でしょうか。

グラデになるように設定していないからです。

画面のプロパティ(Windows 98)

この右側にある色2が右側の色です。私は同じ色に設定していますが。


ええと、保存してない作成中のデータの保存とかじゃなくて、たとえば、Macだと終了時に、その時のデスクトップ状況とかをマウントしているすべてのディスクに対して(書き込めるなら)書込みますが、そういう終了処理のようなことで、必要なデータが保存されないのではないかということが言いたかったわけです。その他にはディスクのキャッシュとか。

それってファイル?

先程の「本物のファイル」の件もありますが、私とTOM nekoさんがいうファイルというものが全くの別物のような気がしてきました。

MacOS的にファイルというのは一体なんなのでしょう。

一応、OSが持っているディスクキャッシュやファイルアロケーションテーブル系の内容はCtrl+Alt+Delを押されたところでディスクに書き込みます。

一部のメーカー製PCやノートパソコンだとこの辺がうまく動いていないものがありますがWindowsとしては一応記録する方向で動作しています。

なので私は固まったときにはとりあえずCtrl+Alt+Delを試しますが、本当にダメなときはそれすらも効かないので残念な思いをすることに。

2001年07月17日

ウィーバースタイルの左手。

握り締めた手を正面から描く場合、私はおおむねこんな感じで描く。

コブシの曲線 1.手の甲をなぞるような感じの線を引く。
指のつけ根 2.指の骨の位置を決める。
コブシのライン 3.とりあえずなぞっておいてコブシのラインを決める。
握った手 ソコから指を生やして手ということにしてしまう。

後は場合によって親指も付ける。このやり方で右手は描ける。親指は隠れるし。左手だと何が難しいってここから手の甲も描かなきゃいけない。

で、手の甲が出てくると3で描いたようなラインが見えない。だからといって描かないと指が曲がっていないように見える(手の甲が極端に短く見える)。

さらに親指が正面に向かって伸びてくるはず。正面だからといって○とか描くわけにもいかずぢっと手を見る。

グローブとか付けていれば折り目付けてごまかすという手も。

言い訳しておくと、FIVAのタッチパッドじゃ絵は描けませんです、はい。


どうもIEを使っているとみるみるUSERリソースが減るようだ。

そういえばWindows 98に対してパッチのたぐいを当てていない。再インストールしてそのままだ。

頂いた雑誌の付録CD-ROMからWindows 98 ServicePackをインストール。

次にWindows Updateを…動かない。なぜか真っ白な画面のままだ。

スクリプトの実行は許可しているし何が問題なのだろう。

何にしろIEがおかしいのは解っているのでIEの再インストール。

ダウンロード、完了っ!

それでは気を取り直してWindows Updateを…動かない。なぜか真っ白な画面のままだ。

2001年07月16日

ウィーバースタイルで構えた図を正面から描こうとする。ボークスのNEOをぐりぐりしてポーズを作る。あー、頭くらい付けておけばよかった。まあいいや。手足が長いのでポーズを付けるのも難しい。描くのも難しい。何が難しいって手だな。左手。これ、正面からみるとどういうふうに見えるの?


FIVAPMの改造版を送りつける。

他にも

といった修正が入っている。


ひまつぶし日記。TOM nekoさんは、Windowsをネタにするときにはもう少し調べてから書いたほうがいいのではないだろうかと思った。

たとえば7月15日Win98SEのTCP/IPのIPアドレスが手動で設定できない件

この二者って何がどう違うのでしょう。機能拡張とかコントロールパネル書類ってファイルですよね。

たまたまMacOSの設定方法をご存じだった、というだけでWindowsが格別に難しいわけではないのでは。多分、私だとMacOSの機能拡張とかコントロールパネル書類を追加するというような発想には至らないと思います。関連するファイルを入れ換えれば解決するだろうことは推測できますが、それが一体なんなのか解りませんから。

今度のインストールでウインドウの横棒の青がグラデーションになるのは発色数の問題。16色とかだとグラデにするのもアレなので。この辺はコントロールパネルで設定可能。

知っていればどうということはありませんが、知らないだけで謎になってしまいます。もっともマニュアル読めば済む話ではあります。

7月12日。Win98SEも付属のユーティリティーでデフラグです。Win98には付いてませんでしたねってWindows 98にも付いてますって。Windows 95にも。っていうか、MS-DOSの頃からありました。Windows 3.1には付いてませんでしたが、デフラグするときにはMS-DOSでやれ、ということだったので問題なし。

ちなみに、ネットワーク上で大きいファイルのやり取りがうまくいかない場合はNICを変えてみるのが吉。安いNICはすぐコケるので。ドライバがタコっていることもありますが、安いカードはドライバも手抜きだったりするので結局それなりのメーカー品を買った方が吉。

個人的にはメルコのNICは買わないことに決めている。30円なら試しに買うかも。100円以上は出したくない。まともに使えるようになったら考え直しますが。

7月11日。それって、強制終了ですね。ファイルを保存とかしないで。Windows U S Enterでもファイルの保存はできないのでは。「編集内容を破棄しますか? (Y/N)」とか言われてそのまま待ち状態になるかもしれません。


地下鉄の中でDFの表示のちらつきを押さえつつコードが小さくなるような方法を模索。

いくつかコードを書いて、コンパイルしてコードのサイズを比較する。

で、28バイト小さくなる。

それはともかくとして、乗り換え駅についてしまったのであわてて地下鉄から降りるときにFIVAをケースに入れる。んで、傘を持とうとした時。

うっかりしてFIVAを落としてしまった。ガゴッという感じのナイスな音が。コンパイル中。HDDは大回転だ。

あわてて拾い上げて、ケースを開くと電源が切れてる。衝撃を受けると電源を落とすような仕組みがあるのだろうか。

気を取り直して歩きながら電源を入れる。そのまま歩きながらコンパイル。なんかバッテリーがぐらつく。大容量にしてからは歩きながら使ったことがなかったのでこんなもんかもしれない。

そのまま地下鉄を乗り換える。座ってコーディング。

ぷちっ。

電源が切れる。うーん、落としたショックで電源まわりがいかれたか? 仕方がない、あきらめて片づけるか。…。あれ、バッテリーが外れてる。なんだ、道理で電源が切れてたわけだ。

あー、バッテリーを押さえるツメが折れてるし。コレじゃダメだ。折れたツメはいったい何処に行ってしまったのだろう。もう解らない。あれば瞬間接着剤でくっついたかもしれないのに。瞬間接着剤なら引っ張り強度はあるから充分だったろうに。

2001年07月15日

夜中だというのに、猫がうるさい。

撃つぞ、このやろうッ! って撃つと小動物愛護法違反ですか。

先日、飼犬の射殺を依頼して撃ち殺した猟師がいましたが。

まあ、撃つのはマズくても追い払う程度ならいいのだろうか。うーん。しかしうるさい。どの程度から小動物愛護法違反になるのだろう。っていうか私も愛護してくれ。


ギターフリークスのきゅーてぃーぱいってルイ・ルイに似てない?


昔の原稿を発掘してげんにょり。


なんだか解らないけど、どんどんUSERリソースが減る。


あっちの世界に旅立っていたお(以下略)がこっちに戻ってきた。これでいいネタひまつぶし話し相手が。まあ、今月頭から戻ってはいていたもののまだゴタゴタしている模様。


雨。洗濯物が乾かないのでコインランドリーで強制乾燥。暑い。待ち時間でアイスを買って食べる。ついついゆき印製品を避けて購入してしまう私。

2001年07月14日

お(略)からデンパ。「遅れる」いや、すでに遅れてるんだけど。

っていうか腹減った。

「22キロオーバーで捕まった」あー、過積載はマズイよー。あんなの載せたら重いに決まってるし。


お(略)からデンパ。「近くのコンビニまで来た」そうか。待ってよう。


来ない。

せっかくだから外に出て待つ。


来た。

そのまま4時までススキノで遊び回る。いいのか、こんなダメップリで。

山頭火でラーメンくう。閉店まぎわ。こだわらない。


あ、おごってもらうの忘れた。


例によって箇条書き


しかし、12時間も寝ることないだろう。


あー、Visual C++6.0がほしいっす。Visual C++6.0でDFをコンパイルしたら83KB程度になるし。さすがにコンパイラから作る根性は無いし。

2001年07月13日

筏…。

ジェットスキー…。

なんであっちは大和とかイージス艦といった軍艦でこっちは…。


勤務先のリーダー。項目Aについて質問すると項目Bについて答える。話にならない。


お(以下略)が遊びに来るというので早めに撤退。食事をおごってくれるらしいので迎撃することにする。

予定到着時間まで1時間。

しまった、早く撤退しすぎた。一度家に戻るか? いや、てきとーにぶらぶらしてよう。


到着予定時間。

来ない。腹減った。ここで食うともったいない(?)のでガマン。

前の勤務先から電話。プログラムがおかしいらしい。使い方が間違っている。マニュアル読め。終了。


一時間経過。歩き疲れた。

お(略)からデンパ。「今から出る」…をひ。今何処よ。

とりあえず一度自宅に戻ることにする。

次の到着予定時刻まで2時間。

2001年07月12日

朝から地下鉄が人身事故で停止していてぐんにょり。


xyzzyのインデント。そっかー、c-indent-tabs-modeかあ。これでコーディングもxyzzyに乗り換えられそう。

</>と入力したら自動的に直前のタグに対する閉じタグを出力するようなlispってどうやってのだろう。

そういうinteractiveなコマンドを作ってキーを割り当てた方が楽かな。

とはいえ、書き方がさっぱり解らない。lispの壁は高い。


養育費を払わない父親に対して、5年間子作り禁止の判決。

判決は「父親としての責任感が少しもない。何とか職を見つけて父親らしく生活費を支払う態度を示させないと、子供たちの心にもゆがみを与える」と指摘。

それも一理あるけど、4人の女性との間に9人の子供をもうける時点でアメリカ的には子供たちの心がゆがみませんか。

被告は「子づくりは憲法で保障された基本的人権。貧乏人は子供をつくるなというのはあんまりだ」と訴えた。

とのことだが、裕福か貧乏かという問題ではなくて、育てるつもりもないのに生むな、という話だろう。

それはともかく、5年後にまた同じことを繰り返しそうな気がする。こういうのを夫として選択した女性のほうに非はないのだろうか。今までに三回離婚してて(そもそも結婚してないかも)子供がたくさんいて、養育費を払っていない(==負債を抱えている)無職の男を選択した理由を知りたい。

コレが解れば今この人生に希望を持てる男性が増えるかもしれない。減るかもしれないけどな。


AppleがG4 Cubeの販売を中止。その後値上がりしたようだ。後がなくなったところで買いに走っているらしい。

AppleではこれからG4 Cubeのようなナイスな製品は作れないという読みか。


ダブルブリッド 6巻発見、購入。

7月20日、「吠えろペン」の購入者にサイン会が催される模様。ゆかねばならぬ。

とりあえずお(以下略)にもデンパを飛ばして伝えておく。


CZ75の調子が悪い。弾が出ないということはない。動作はすこぶる快調。着弾がまとまらない。当たらない。というか当たる気がしない。

2001年07月11日

っつーわけで、ヒラテ技研 ソフトウェアライブラリ 実行速度の比較テストのソースをVisual C++4.2でコンパイル。コンパイルが通らない部分は適宜修正。ってなんでIEのコントロールを使うためのヘッダまでincludeするんだよぉ(/_;)。こんなのVisual C++4.2には付いてないぞ。

それはともかくとして、私のノートでTriangle()を描画なしで動かすと65秒ほどかかる。

コピペしてTriangle2()を作る。ちょっとだけチューニング。


void CVC602Dlg::Triangle2(const int X, const int Y, const int N)
// フォームの X,Y 座標を中心に一辺の長さ n ピクセルの正三角形を処理する
{
	double	dist;
	struct GeoPoint	pt1,pt2,pt3,pt4;
	int	ni, nj, nMax;
	long cc;
	int bChecked;

	CPen* hOldPen;                 // ペンの元色を保持するオブジェクト
	CClientDC hCDC(this);          // クライアントのDCオブジェクト
	CPen hCPen;

	dist = N * sqrt(3.0) / 3.0;        // 正三角形の中心から、1頂点までの距離
	pt1.X = X;                     // フォームの中心の座標
	pt1.Y = Y;                     //
	cc = 0;
  // 繰り返し回数の選択
	bChecked = m_Check.GetCheck();
	if (bChecked != 0) nMax = 400; else nMax = 400;
  // 座標値演算とフォーム描画処理
	for (nj = 0; nj <= nMax; nj++) {
		for (ni = 0; ni <= 360; ni++) {          // 正三角形を1回転する
      // 三角形の頂点の座標を求める
			pt2 = GetPolar(pt1,dist, ( 90+ni) * dPI / 180);
			pt3 = GetPolar(pt1,dist, (210+ni) * dPI / 180);
			pt4 = GetPolar(pt1,dist, (330+ni) * dPI / 180);
			if (bChecked == 0) {         // 三角形の辺を描画する
				hCPen.CreatePen(PS_SOLID, 0, cc);
				hOldPen = hCDC.SelectObject(&hCPen); // DCのペンを変更
				hCDC.MoveTo(int(pt2.X), int(pt2.Y));
				hCDC.LineTo(int(pt3.X), int(pt3.Y));
				hCDC.LineTo(int(pt4.X), int(pt4.Y));
				hCDC.LineTo(int(pt2.X), int(pt2.Y));
				hCDC.SelectObject(hOldPen);          // DCのペンを元に戻す
				hCPen.DeleteObject();                // ペンのオブジェクトを解放
				cc = cc + 2;
			}
		}
	}
}

13.8秒。イキナリ4.7倍も速くなった。

描画ありで67.67秒だったのが53.6秒。1.26倍。私のノートは描画が遅いので(ってノートはたいてい遅いのだけど)そっちに時間がかかっているのだろう。

さらにチューニングするならGetPolar()の引数を構造体ではなくて構造体のポインタにするとか、sin()・cos()をテーブルにしてしまうという手も。

描画はしないけど、Penの生成と選択、破棄を行うようにしたものだと45.69秒から30.54秒。これはCPenの生成、破棄のオーバーヘッドによるものだろう。この部分はDelphiのVCLではうまく隠されるハズなのでDelphiとの比較だとVisual C++に不利。

描画しながらのテストだと、コンパイラのテストではなくてコンパイラ+ビデオカードのテストになってしまうのでコンパイラの性能テストとしては不適切なのだろう。

ってなんか脱線したような気がするけど、

は区別したいなと。

で、コンパイラが吐くコードの良い・悪いっていうのは見ためがきれいかどうかじゃなくて実行性能とサイズ。人間が読まなくてもいいようにしたいからコンパイラを使うわけで、人間が読むことを前提とするならコンパイラではなくてアセンブラで読みやすく書くべき。

なのでライブラリを使った描画のテストとかではなくて、適度に複雑なコードをコンパイルしてそのコードの速度・サイズによるベンチマークとか、どのような最適化を行っていて、それがどのくらい効果があるのかという記事が読みたい。

そろそろコンパイラを買い替えたいので。


DFの描画速度も目処がついたので特訓DXを眺める。

2ちゃんねるに「シューティングゲームを作りたい」というスレッドがあったので読む。参考になるかもしれないので。

87より。

卑怯なことにキャラのデザインセンスはTricksterに投げたので解決。

連結リストは特に必要ない。知識だけならDFのビューアでも使っているので問題ないだろう。

WAVEの知識っていうか、正弦波をいじくって音を鳴らすFM音源の知識なら…。なんでSoundBlaster16互換の音源が標準装備されててPCMしか使わないのだだだた。OPLでもOPLLでもちゃんと使えばいい音鳴るのに。

後は時間と根気の問題。これが最大の悩みか。

キャラクタを配列で管理するのはともかくとして、空き要素を毎回リニアサーチするのは変。だからといってリストにするのも変。

特訓だとキャラクタの管理は配列だけど、空き要素はサーチしなくてもOk。

リニアサーチを使った場合Athlon 700MHzで1msかかるそうだが、それならFIVAだと5msかかかりそう。16ms以内で処理しないといけないゲームで5ms取られるとかなりキビシイ。

ちなみに特訓の場合は、配列の前半に使用中要素を固めておくだけ。こうしておくと空き要素は配列[使用している数]で参照できる。リストも要らなければ検索する必要もない。

で、なぜかバトルゴリラは名作という結論が出ているようだが…。

確かにバトルゴリラは名作なのでPC-88買ってプレイするべし。

…あれ、結局得られるものが無かったような。バトルゴリラは名作という事実を再確認しただけ?


右にスクロールする時の高速化に成功。左は…描画してみないとどのくらいスクロールするのかわからないのでBitBlt()できない。うーん。


とりあえずアップロードしようとしたら

>>938

DF更新。

早っ。まだアップロードしてないのに。

2001年07月10日

うをっ、あのK.INABAさんから反応がががががッ!

確かにM_CHECK_ALL_PATHではうまくいかなかったのですが、もしかするとM_INQUIRE_DIRECTORYと組み合わせるとOk?

っていうか、M_INQUIRE_DIRECTORYってドキュメントから見つからないのですが…。

待て次号ッ!


M_INQUIRE_DIRECTORYとM_CHECK_ALL_PATHを組み合わせてみた図玉砕しました。しゅーりょー。

っていうか、機能を追加するより先に今ある機能をどうにかするほうが…。

特に描画の高速化は個人的にものすごく優先したい。FIVAの描画、遅いので。


Borlad、Delphi6をPersonal版に限り無償提供。

個人的にはコンパイラの出来具合の方が気になる。手ごろな価格でいいコード吐くなら買うし。Delphi3の頃ってあまりいいコード吐かなかった記憶が。もしかして、物によってはいいコードを吐いたのかもしれないけど、お仕事で使った限りでは大した最適化もしていないコードだった。もっともDelphiだけじゃなくてBorland C++もあまりいいコードでは無かったけど。

このまま、コンパイラならMicrosoftというような流れになってしまうのはイヤだけど、現状だとVisual C++6.0よりいいコードを吐くコンパイラってなかなか無い。Intelのコンパイラも試してみたいし高々5万円なので油断すると買ってしまいそうだけど誰かレポートしてないものか。

Inside Windowsなんかだと、コンパイラの比較記事とかあったのにね。

gcc3.0もリリースされたことだし、Cマガあたりでコンパイラのベンチマーク記事を書いてほしい。

jpegとかpnglibのようなライブラリをターゲットとなるコンパイラでコンパイルして出来上がったバイナリの速度を比較してみるとか。

そういえばOpenWatcomはどうなったんだろう。先月、ちょっとだけ動きがあったようだけど。


昨日の、CraftLaunchじゃなくてCraftDropだよ。今朝になってCraftLaunchでドロップするにはどうしたらいいか悩んでしまった。


某所で最年少と思われたらしい。これは喜ばしいことなのだろうか。


先日から勤務先(バイト先)でNECのノート、VersaProを使っているのだけどものすごくキーボードが使いにくい。ミスタイプを連発する。理由がさっぱり判らない。

見た感じ、それほど違和感のあるキー配列ではないのだけどBackSpaceが押せなかったりうっかり半角/全角キーを押してIMEが日本語モードになってしまったり右シフトを押そうとして行きすぎてPageDownを押してしまう。Enterを押そうとしてPageUpとかHomeを押してしまう。BackSpaceを押そうとしてHomeを押してしまう。左CtrlのつもりでFnを押して何がなんだか解らなくなる。左シフトを押すと勢いでCaps Lockまで押してしまうのでイライラする。

マウスのプロパティタッチパッドはアルプスのが使われているっぽい。ドライバ側でキー入力時にカーソルOFFとか出来たりして感激。

何がすばらしいって、キー入力後の一定期間はタップを無効化する機能。タイピング中にカーソルをふっ飛ばされてかなりイライラしたところでドライバを入れたところキー入力時タップ・ポインタ移動しないという項目が出来た時の喜びったらもうあなた。

ただ、これONになったままdisableなのが気になる。


でかいビットマップ使って初めて知ったのだけど、imgのalign属性ってCSSのfloatと同じ効果じゃないのか。それともIE5.5のレンダリングのご都合?

ブロック要素にfloat指定かけちゃうとCSS無効だとアレだし。align属性付けた上でCSS指定するのが現状では最善?

align指定しないのが最善、という話も。


今さらながらCOOLPIX 990が欲しくなってきた。995でもいいんだけど、電池が…。


眠気覚ましにノートに落書き。裏から見たらものすごくへっぽこ。

DF。カーソルの移動を高速化。スクロールするときの動作はさらに改善できそう。もうちょっと試行錯誤。


おおっ、部員弐号さんがベンチマークの記事を紹介してくれている。

で、紹介記事を見てみたんだけど主な開発ツールの数値計算速度の比較の場合だとVisual C++が遅かったのはテスト1-aの12.1秒、Delphi10.0秒のケースだけッぽい。

さいわいソースもあるので見てみたら


void CBisectionDlg::OnButton1()
{
  double fx(double x);
  double a, b, c, n, limit, fa, fc;
  int i, j, NI;
  double StartTime;
  NI = m_Edit1;
  StartTime = timeGetTime();
  for (j = 1; j <= NI ; j++){
    a = -1;          //start(minimum) value of x
    b = 0;           //maximum value of x
    limit = 0.00001; //acceptable limit of error
    n = floor(log((b - a) / limit) / log(2));
    fa = fx(a);
    //fa = a + 1.0 / 3.0;
    for (i = 1; i <= n; i++)
    {
      c = (a + b) / 2;
      fc = fx(c);
      //fc = pow(c,2) - exp(c);
      //fc = c + 1.0 / 3.0;
      if (fa * fc < 0)
        b = c;
      else
      {
        a = c;
        fa = fc;
      }
    }
  }
  m_Edit2 = (timeGetTime() - StartTime) / 1000.0;
  m_Edit3 = c;
  UpdateData(FALSE);
}

double fx(double x)
{
	double s;
	s = pow(x,2) - exp(x);
	//s = x + 1.0 / 3.0;
	return (s);
}

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b, c, limit, fa , fc: Double;
  StartTime: Double;
  i, j, n, NI: Integer;
begin
  StartTime := timeGetTime(); //GetMilliTime;
  NI := StrToInt(Edit1.Text);
  limit := 0.00001;
  c := 0;
  for i := 1 To NI do
  begin
    a := -1;
    b := 0;
    fa := fx(a);
    //fa := a + 1 / 3; // for 1-b(nf)
    n := Ceil(ln((b - a)/limit) / ln(2));
    for j := 1 to n do
    begin
      c := (a + b) / 2;
      fc := fx(c);
      //fc := c + 1 / 3; // for 1-b(nf)
      if fa * fc < 0 then
        b := c
      else
      begin
        a := c;
        fa := fc;
      end;
    end;
  end;
  Label1.Caption := 'x = ' + FloatToStr(c);
  Label2.Caption := 'CPU time = ' + FloatToStr((timeGetTime() - StartTime) / 1000) + 'sec' ;
end;

function TForm1.fx(x: double): Double;
begin
  fx := Power(x,2) - Exp(x);
  //  fx := x + 1 / 3
end;

処理のポイントはここですね。

プロファイラにかけてないので自信無いけど、この程度で16%の速度差がでるということは関数fxがボトルネックなのだと思う。関数の呼出し形式をDelphiと同じく__fastcallにしてみるとか、pow(x,2)x * xにしてみるといった小細工で速度が変わってくるかもしれない。

コンパイラの性能というよりは、ライブラリの出来の問題ともいえそうだ。

現に、数値演算ライブラリを使っていないテスト1-bではVisual C++1.5秒に対しDelphi2.1秒と40%の性能差になっている。

あと、Visual C++のほうだと、ループの中に代入文limit = 0.00001;があるのに対して、Delphiのほうだとループの外に追いだされている。これだけでも繰返し回数が多ければロスになりそう。Visual C++のオプティマイザが外に追いだしていればいいのだけど、ちょっと不注意だったかもしれない。

Delphiの方ではループ終了後にLabel1を書換えてから終了時刻を取得している。これも誤差になりそう。先にtimeGetTime()を呼び出してから文字列を編集した方がいいと思う。

もう一つのヒラテ技研 ソフトウェアライブラリ 実行速度の比較テストでは計測にclock()を使っているのでちょっち信頼性に不安が。Visual C++のclock()って中で何呼んでましたっけ。

対するDelphiではNow。clock()とNowでは示す時間が違うので比較できない。さっきの主な開発ツールの数値計算速度の比較のようにtimeGetTime()で計測してほしかった。

また、このテストもどちらかというとライブラリの性能テストになってしまっている。DelphiのVCLはGDIオブジェクトをTCanvas内にキャッシュするような作りになっているのでペンの生成なんかはかなり高速になる。Visual C++のMFCはそういう凝った作りをしていないのでオーバーヘッドが無いが、ペンの生成や削除は遅くなる傾向がある。

このテスト、Visual C++版だとループ中にCPenを生成するような作りになっているので、TCanvas内に先にPenを作ってそれを使いまわすDelphiに比べると圧倒的に不利。

また、デストラクタで開放されるにもかかわらず、わざわざCPen::DeleteObjectを呼んでいるので二度手間。さらに時間がかかる作りになっている。

SaveDC()、RestoreDC()を使ってオブジェクトの退避のオーバーヘッドをTCanvas並に減らしたりしてから計測するべきだと思った。

2001年07月09日

DFの書庫機能実験せっかくだから実験途中の画面。UnlhaOpenArchive()にサブディレクトリを検索しないようなオプションが見つからないので挫折中。

現状、こんな実験をするよりも他にやることがあるので凍結中。


PHSのバッテリーが切れる。

昨日の夜から充電器に接続しっぱなしだったうえ、その時に残量を確認したらフルゲージだったにもかかわらず、空。


GPLは反アメリカ的だとするMicrosoftの主張に対してIBMなどが反論。

さて、反アメリカ的とは一体なんだろう。とりあえず、否定演算子が絡むと解りにくいのでアメリカ的な知的財産権を考えてみる。

アメリカにおける知的財産権関連で有名なのといえば、サブマリン特許。この業界だとRambusのDDRなんかが有名。

日本だと、特許を申請すると特許広報に掲載され、広く告知される。大概の国では同様のことが行われる。日本じゃないので広報とは呼ばないだろうけど。

アメリカ的だと、特許を秘密にする権利も認められているため、特許を申請した時点では告知されない。成立してから告知される。

このため、新技術を採用しようとして、それがすでに権利化されている、またはされる予定があるかどうか確認したくても、アメリカで特許申請されている場合には判らない。

諸外国や日本の特許は、発明を広く告知し、他人に使わせるための物であるのに対してアメリカ的特許は発明を占有し、他人に使わせないための物に近い。もちろん、自由の国アメリカのことだから、他人に使わせることも自由だ。使わせないことも教えないことも自由なのだ。

GPLはどうか。これはプログラムをオープンにして、誰にでも使わせるライセンス。使わせない、教えないという自由はGPLに従う限り無い。

サブマリン特許のように、秘密にする自由があるのがアメリカ的知的財産権ならば、秘密にする自由が無いGPLはアメリカ的知的財産権とは思えない。

もしIBMの言う通り、Microsoftの主張が流れに逆っているものであるなら、アメリカの知的財産権自体が大幅に変わりそうな気がする。というか、大幅に変えてしまいかねないような流れというか。

2001年07月08日

攻殻機動隊2。士朗さん、コンピュータに頼りすぎのような…。こういうのか描きたかったんだろうか。私としては、ペンで描いてアクリルで塗った絵が見たかった。


ごめんよ、もちろん書庫の直視、仮想フォルダのことね。
Explorerでも実現してるし、最近のファイラでは出来ない方が珍しい。

ardryさんとかK.INABAさんとかに戦争ふっかけろってことですか?


うが、荒れてる(^^;)。

やめてー、あたしのためにケンカしないでー(大違)。

書庫の中のtxtファイルやhelpファイルなどはのぞいてみたい気がする。

御意。手元の版ではそういう、動作が出来たりしてますが…。

これは以前に要望があった時、「書庫かどうかを拡張子で判断するのはイヤ」というコメントをしたところ、モード切り替えコマンドを用意する方法でも構わない、という返答を頂いたので取り合えず実験しているものですが。

ただ、/tmpに展開して開くのはいいんだけど、コレを削除するタイミングがないんだよなあ。

あと、この試験バージョン、やたら不安定だったりしてとてもじゃないけど常用できないという。おおよその原因はスレッドの同期がうまくいっていないあたりだと思うのだけど、コレがなかなか。unlha32.dllがスレッドセーフならなあ。

あと、コードがでかくてでかくて。

それと確かにキーボードでのドロップはうまく使えないアプリがあるらしい。
作者の方自身はその点を原因も含めて承知していた。

もしかして私、勘違いしているかも。

OLE32式のドロップはできない(というか、やってない)ので、OLE32式ドロップしか受け付けないアプリだとダメです。

しかし、Windows 3.1式のドロップだとうまくいくはず。CraftLaunchとかPyxisなどでドロップ出来てDFでできない、という場合はこちらのミスです。実際、Moonlightにドロップ出来ない、という現象がありました。

そういう場合は教えていただけると修正できると思います。

2001年07月07日

攻殻機動隊2 ゲット。


とりあえずDFにディレクトリ構成を無視して同じディレクトリにコピーする動作をしこむ。

もともとは各所に分散している.objとかを消せればいい、開ければいい、ディレクトリ構成ごとコピーできれば…という感じだったのだけど。

これでfoo/foo.c、bar/bar.c、baz/baz.cを*.cで検索してまとめてsrc/にコピーすることができる。今まではsrc/foo/foo.cというコピーしかできなかった。


やはり、弱点は書庫操作か。Melticeが目標70KB以内、というノリなのでまともに使える書庫操作ルーチンを実装するのは大変そうだ。

DFは去年の3月で72,192バイトあったから、70KBのコードを書くとしたら2年くらいかかるのか?

2001年07月06日

第13条(著作権をはじめとする知的財産権)

  1. 本サービスを構成する全てのプログラム、ソフトウェア、商標、商号又はそれらに付随する技術全般に対する知的財産権及びその他の権利(使用権、管理権限等を含む)は、特段の表示なき限り、弊社に帰属するものとします。
  2. ユーザーは、本サービス上にアップロードした情報について、それらを複製し、頒布する権利及び削除する権利を弊社又はその別途指定する管理者に与えるものとします。
  3. ユーザーは、本サービス上にアップロードした情報から弊社及び第三者に生じた全ての責任を負うものとします。

Diary Diary Revolution 2001/7/4(Wed)でネタになってたのだけど、別段なんとも思わなかったのでこちらではネタにしませんでした。

ところがお笑いパソコン日誌さんでネタになっててびっくり。なんかとんでもない規約になってましたっけ。

特に2項、3項がポイントらしいのですが。

複製する権利。これがないとユーザのデータをバックアップできません。ホスティングサービス会社が、契約の中に複製する権利を含めていなかったため、障害発生時にバックアップ取れないという事例もありました。

頒布する権利。イサオ・ネットの所有するサーバから接続してきたクライアントに頒布するのですから、データを頒布する権利が無いと著作権上マズイことになるかもしれません。このあたりの法律は何とでも解釈できかねないので念には念を、というところでしょうか。

削除する権利。マズいものは消せないとマズイ。

というわけで、私としては2項は全く問題ない規約だと思いました。

次、3項。ユーザが勝手にアップロードしてきたものまで責任持てない。責任の所在を明確にする、当然の規約。

何か見落としがあるのでしょうか。


DFのコピーを改造しようとして悩む。DOS形式のファイル名がネックだ。

ソースを読んで、どう修正するか悩んでいるうちにマズいところを見つけてしまい悩む。検索状態からLFNに対応していないNetWareサーバなどにコピーしようとするとハマる可能性がっ。

検索モードに入ったとき、8.3形式のサブディレクトリ名までは保持していない(情報ウィンドウにもファイル名しか表示していない)ため、コピー先を生成するときにディレクトリまで作れない。

コピー元は、8.3形式だろうがLFNだろうがとにかくその名前でアクセスできるので問題ない。

やりたいことは、サブディレクトリに分散しているファイルを、同じディレクトリにコピーしたいというだけの話。

今のDFだと、Ctrl+Wで検索して、コピーするとディレクトリ構成ごとコピーしてしまうので良くない。コレはコレで使い勝手がいいのだけど。


古本屋を物色していたら孔雀王発見。うっかりしてダチョウ→孔雀→孔雀王という連想をしてしまい苦しい思いをしてしまう。

あまりの苦しさにお(以下略)にデンパを飛ばす。

2001年07月05日

xyzzyのc-modeと格闘。現在敗北中。

インデントはtabで取りたいので c-indent-lineを書換える。tabコードが入るようになったものの、入る数が何ともいえず挫折。smart-indentationってのがそれらしいのだけど、こいつの中で何が起こっているのかさっぱり判らない。

whenってCでいうwhileみたいなループ構文、という解釈でよい?

そもそもcalc-c-indentって何処で定義されてるの?

という感じでお話にならないので、とりあえずいわゆるオートインデントだけ使えるようにしてこのc-modeのc-indent-lineを切り離したい。インデントがtabにならないと困るので現状だと何も書けん。だからといってオートインデントもないと面倒でたまらない。

lispが解らんと手も足も出ない。

フレームって何?


ファイラーのマークファイル。DOSの時には単純に展開してやればよかったし、コマンドラインの長さも制限されていたから楽だった。

それがLFNが採用されてから空白は入ってくるは"でくくったりくくらなかったりするは、8.3形式も出てくるわ、まるで手に負えない。

いろいろなパターンに対応しようと思うとものすごく面倒というか、マクロコマンドが増えて書きにくい。


今日のP C T N TCaldix や Noahと書かれています。先日、誤リンクや誤検索を防ぐためソフトウェア名称を頭文字だけにしていたのに、他人のソフトウェアの誤検索や誤リンクについては考慮されないのでしょうか。

関連して(?)K.INABA氏のページより孫引用(?)。ardryさんがMelticeの目標としてあげられていた項目。

Win32SDKベースで開発。よって、ファイルサイズは100KB以下を課題に、70KB以下を目標にする

んがー。DFはすでに失格ですぅ。70KBかぁ。いつの話だろう。

2001年07月04日

DFは何事もなくWindows Meでも動作するようだ。

ACPIマシンは起動が早くていいねえ。


ここの人達は食事をとらないのか? いいかげんお腹空いてきたんだけど。っていうか、いつから昼休みなんだ?


DFの関連付け起動で残念な思いをする度合を減らしてみるテスト。

おおむねうまくいくようだが、ここで公開してしまうと先々月の二の舞になりかねないのでじっと我慢、ガマンの子。


xyzzyのc-modeをカスタマイズする方法が判らない(/_;)。


しっかし、ITEMIDLISTを取るのって面倒だなあ。


む、もしかしたらWindows Meだと何もしなくても関連付け起動で残念な思いをしないのではないだろうか。SHELL32.DLLのバージョンで動作が変わったか。

ということは、ここに手を入れてもWindows 95とか98だと残念な思いをするのは変わらない?

Windows Meで変わっているということはWindows 2000でも変わっていそうだ。


いまいち解っていないのだけど、Pentiumのアラインメントのペナルティって、読み出しの方がでかいのか、それとも書き込みの方がでかいのか。

特訓用にmemcpy()とかmemmov()を最適化するにも、どっちが速いのよくわからん。

DFはコードが小さくなるようにアラインメント調整なんかしてない。x86ならペナルティはくらっても動かないことはないから。

2001年07月03日

「(日本は)一国家、一言語、一民族」バカか。

他民族の存在を認めることができない、ということは他人の存在をも認めることができないのではないだろうか。そんなのが代表として議員を務めるというのは何か間違っているような気がする。他人の存在を認めることができないのなら、国民の代表として活動できない可能性が高い。


昼からアルバイトに出かける。イキナリ地下鉄が人身事故で停止。予定より1時間遅刻する。


動かない地下鉄を見ていてもしかたがないのでガンダム。いつも通りGM。ザク使いに乱入したつもりがなぜかガンダム使いに変化していたため共同プレイに。

このガンダム、ものすごく突撃するというか単機で乗り込んで撃破されて帰ってくる。勘弁してくれ。

それなりにパイロットが強いのか、ガンダムが強いのか判らないがザクとかドムとかグフとかと一緒に私のGMまで巻き込んで撃ったり斬ったりするのは勘弁してほしい。危なくて近寄れないので援護できない。

援護しないと撃破されて帰ってくる。耐久度、コスト的にはGMが捨て駒となるべきなのだが…。

結局、GMが二回撃破されたところで終了。ガンダムはすでに二回撃破されていた。ってちょっとまて。撃破されすぎだって。

その後シャアズゴックと対戦。ぼろ負け。射撃も格闘もそつ無くこなす機体なのでなかなか攻め込めない。っていうか強すぎ。

2001年07月02日

コメントが多ければいいコードなのか?

良くないコードだからコメントが必要なんだ。

コメントなんて飾りです。偉い人にはそれがわからんのです。


CZ75のトリガーを軽くするにはどうしたらいいのだろう。今でも充分に軽いのだけど、STI TITANを撃っちゃうと物足りない。シングルアクショントリガーとダブルアクショントリガーの違いなんだろうか。

シアとハンマーをアルミかスチールの物に交換して、少し削ればいいのか?

ガバメント系はキライなので使いたくないのだけど、性能的には敵わないような気が。

CZ75にもレースメカバージョンを作ってもらって、バレルを固定し、トリガープルを調整すればなんとか…。夢か。

2001年07月01日

P C T N T 2001/07/01とある圧縮解凍ソフトがリリースされましたってなんだかものすごく他人事のような。リリースされたんじゃなくて、リリースしたんだし。

MelticeならMelticeって書けばいいのに。ちなみに、公開されたのは Meltice V2.00(正式版)。

文中ではMelticeがM、ArcwayがAというように略されています。それはソフト名を頭文字だけにしているのは、誤リンクや誤検索を防ぐためだそうです。これは逆効果になりそうな気がしてなりません。

だって、Melticeの公開秘話みたいなものを検索しようとしてもこれでは検索できないわけですし。

逆にソフトウェアをダウンロードしたくて検索する場合には、検索キーワードとして「ダウンロード」を追加してみるとか、ベクターで検索してみるとか(登録されていれば、ですけど)いろいろ手はあるわけで。


勢いに乗ったバカはおそろしい。


トップを狙う

Copyrigiht © 2001 びい