(99/02/01〜99/02/28)


99/02/01

・ログを分離しました。

GT32.EXE
 「Delphian World」での過去のDL実績。

Date Ranking DownLoad 備 考
1998/07 2 213 ver4.70更新
1998/08 25 88  
1998/09 - (69.5) DL数は月割り
1998/10 - (69.5) DL数は月割り
1998/11 - (69.5) DL数は月割り
1998/12 - (69.5) DL数は月割り
1999/01 38 109 ver4.71更新
TOTAL - 689  

 今の所こうなっています。さて2月度はどうなんでしょうか?

GT32.EXE ver5.00
 昨日「スケルトンができた」と書いたが、証拠の画像をお見せしよう。まぁ、殆どのヒトは感心のない事だろうが。

GT32.EXE ver5.00のスケルトン画像

 メインウインドウは左右のペインに分かれ、エリアスウインドウが廃止されている。操作系はWindowsのExplorerライクになっている。

・電子レンジ
 TVでなにやら電子レンジの事を特集していたが(「発掘あるある大辞典」だが)、DEKOも技を一つ持っているので伝授しよう。

 コンビニでパフェ系のアイスを買ったら迷わず店員のお兄ちゃん(おねえちゃんかもしれない)に、「15秒位(季節と商品による)あっためて」と言いましょう。これでふんわりしたパフェができます(あまりの固さに木製スプーンが折れることがなくなります)。もちろん、すぐ食べる場合に限りますが。すぐに食べないのであれば当然家でレンジにかけて下さい。

 普通のコンビニのお兄ちゃん(おねえちゃん)は多分「はい?」と疑問形の形容し難い言葉を発する事でしょう。おちょくるにはこれが一番です。

・電子レンジ2
 コンビニで牛丼と生卵を買って、牛丼に卵を割って入れ、割り箸でかき混ぜた後に「レンジであっためて!!」ってのもなかなかイカします。

・電子レンジ3
 コンビニのおでんの容器に「チキンラーメン」を入れ、「水入れてレンジにかけて!!」ってのもいいかな。

・上2つ...。
 確かに「バイト」の時はやってましたが、客にされると店員としてはムカつくこと必至なのでやるときは店員(orバイト)のガタイを確認してからやるように...つーか、するな(^^; アイスの件は別に客の好みなんで、やってもいいと思います。


99/02/02

・いやはや。
 なんとか仕事の方も落ち着きつつある。

ガチャピン2
 Desertコース(SS1)のFastestLap(53"437)はDEKOが出したが、3LAPはTERA氏が2'46"545を出している。今後どういったタイムが出るやら...。ちなみに二人ともセリカの4速(AT/MT、ギア5設定)を使用している。

・最近X68Kの話題をしていない
 ここんとこ忙しかったからWindows機は触ってもX68Kは触れない状態だったからなぁ。おりを見てまたなんかやりたいな。

・訃報
 Dr.パソコン、ジャイアント馬場さんと相次いで亡くなられてしまった。

・FAQ
 素朴な疑問。何と読むのか?「フェイキュー」が正解だったと記憶している。「ファック」なんて読んだら「Fuck!!」だし、「ファッキュー」なんて読んだら「Fuck You!!」だもんな(週刊少年マガジン連載の某漫画の「ファッ休さん」みたいだし)。ここで「A」は「エイ」と発音するのが正しいんだよなぁ?こんなん外国の方の前ではよう話さんよなぁ。


99/02/03

Shuffle Lines
 「MP3-E500」の「ランダムリスト生成」のロジックは「Shuffle Lines」と違って極端に速い。「Shuffle Lines」がクソ真面目にシャッフルしているのに対し、「MP3-E500」では「そんなんアリか?」というような幼稚な、でも高速なランダムソートロジックを使っているからだ。昨今の事情により、このロジックを「Shuffle Lines」に反映させるのをすっかり忘れていた。よって今更ながらVer2.00をアップロードしてみた。

[169LineあるMP3の曲リストをシャッフルした結果]

  ver1.00 ver2.00
時間 1分14秒 2秒弱

 ウソみたいな結果ですが、本当です。もっとLine数の多いファイルだとその差はますます広がるでしょう。

GT32.EXE
 先日、ver5.00のスケルトンの画像を掲載したが、MOの中からver3.22が見つかったのでこっちも掲載してみよう。

GT32.EXEの若かりし頃(^^;

 そう、この頃はまだ「テーブル参照ユーティリティ」だった。機能も貧弱で(Paradox/dBASE/ODBCテーブルのみ対象、テーブル情報/インデックス情報の参照/印刷機能のみ)、このバージョン頃からやっとTableを編集できるようになってくる。それからMDIアプリになりSQLウインドウが付き...と発展していくのだ。5年の月日はダテじゃないってのをしみじみ感じた。

・ジュースを買いに外へ出たら(AM3:00)...

「雪まみれじゃねーか!!」

BM98 K3.29
 TIX氏がBM98(やねうらお氏) ver3.18を独自に改良したバージョン。正式リリースのK330のβバージョンとなる。02/02にリリースされたようだ。ちょっとやってみたが、キーのタイミングなどはBM68等に近い。外観が全くといっていいほど変化してしまっているのでちょっと最初は戸惑うかもしれないが、キー操作等はBM98と一緒なのでご安心を。


99/02/04

Shuffle Linesのロジック
 勿体つけてもなんですがソースを公開しても恥ずかしいのでヒントだけ。以前の「Shuffle Lines」は有効な結果が得られる迄、ランダムで選んだ2つのラインを交換していた。これを高速化するには...。

 表示用のMemoと内部バッファ用のTStringList型の変数があったとする。

 1.一旦ファイルをTStringList型の変数に格納する。そしてMemoを空にし、TStringsListからランダムな行(0 <= n <= TStringList.Count-1)をMemoにコピーし、TStringListのその行を削除する。これをTStringListのCountが0になるまで繰り返す。

 2.Memoに読み込んだファイルから先頭にランダムなn桁の数字(ダブっても構わない。n=LineのMax桁数+2程度)を付けてTStringList型の変数に格納する。そしてTStringListのSortメソッドを呼び出しソートする。この結果をMemoに書き戻す(もちろん先頭n桁の数字は取り除いて)。これを繰り返す。

 どちらでも「まともにシャッフルする」より遥かに高速になります。しかも結果はまともにシャッフルするのと変わらない。「なぁーんだ」と思われたかもしれませんが、DEKOの浅知恵なんて得てしてこんなものです。でも、コード量は少なく、効果的なシャッフルができるのですから...。


99/02/05

・Segmented Hyper Graphic
 01/27にもこの話題を書いたが、今日はその続きを...。

 「Windows Undocumented ファイルフォーマット(ISBN:4-7561-2014-8/3,980円)」を手に入れたので、ちょっと眺めてみた。01/26に、「なんでHelpに関してはこんなに投げやりな訳?」と書いたが、なんとなく理由が解った。ま、それは置いといて、「SHED」以外のホットスポットエディタが存在しないのはSHGのファイルフォーマットがあまりにも「ヘン」だからだ。構造体の「あるフィールド」は通常Byte型なのだが、ある条件でWord型になったりする。

...こんなん構造体で宣言できんやん。

 普通ファイルに対してヘッダ情報を構造体で定義しといて一気に読み書きするのがセオリーだが、その構造体のサイズが一定ではないのだ。


99/02/06

・Segmented Hyper Graphic
 さて、とりあえず以下の事ができるようになった。

 1.DIB(デバイス独立ビットマップ)の抽出、および.BMPファイルへの書き出し。
 2.MRB(マルチ解像度ビットマップ)への対応。
 3.RLE圧縮画像の展開。
 4.LZ77圧縮への対応。
 5.SHGファイルヘッダーの取得
 6.SHGイメージヘッダーの取得
 7.SHGビットマップヘッダーの取得
 8.ホットスポットヘッダーの取得
 9.ホットスポットレコードの取得

 まだ残ってるのが、

 1.メタファイル関連。
 2.コンテキストIDの取得。
 3.コンテキスト文字列の取得。

 残りをどうにかすればSHGの全容をなんとか把握できる。この後に何をやるかは未定。うまくやりゃ「ホットスポットエディタ」位は作れそうではある。DelphiのCD-ROMの中(Info\extras\ZLIB)にあるZLIBはそのままLZ77圧縮ルーチンなのだが、結局こちらは使わなかった。

・LZ77圧縮
 Abraham LempelとJacob Zivが1977年に発表したアルゴリズム(LZ78もある)。ZIPで使われている(基となった)と言った方がわかりやすいか。

「Windows Undocumented ファイルフォーマット」
 ちょっと補足がある。

 [P.35 2.1.5 ビットマップ]
 「SHGBITMAPHEADERの次には、RGBQUADSの一覧がある。」と記載されているが、実際にはSHGBITMAPHEADERRGBQUADSの間には1ワード(0x0000)存在する。また、RGBQUADSの後にはBITMAPINFOHEADERは存在しないので注意。

 [P.38 2.2 .MRB圧縮]
 ここで示されている「doRLE」関数の戻り値は「展開された後のデータサイズ」を正しく返さない。

 [P.40 2.2 .MRB圧縮]
 ここで示されている「doLZ77V3」関数で使用されている「BytesToRead」関数は何ら意味を持たない。またこの関数部分のソースリストが欠落している(P.131に掲載されてはいる。こちらの使用例では戻りがvoidになっている為、おそらくデバッグ段階で削られた仕様の名残だろうと思われる)。

・そろそろ...
 「DirectX 6.1」日本語版がリリースされるハズ。英語版は既にリリースされている。どうやら今度はWin98にも正式対応しているらしい(未確認)。

・不注意
 不注意(タバコの火の不始末)でマウスを焦がしてしまった。とろけたのでダブルクリックできなくなってしまったが、ヤスリで削って事無きを得た(???)。


99/02/07

・Segmented Hyper Graphic
 ホットスポットの矩形領域を指すのに適当なものが見つからなかったのでアレをこさえる。とはいえフェイクなのだが。まぁ、アレと組み合わせればソレっぽく見えるかな、動作も。しかしTGraphicControlってウインドウハンドルを持たないのな。アレできないやん。


99/02/08

GT32.EXE
 野々村氏よりMailを頂いた。

 >以前はVer.4.69を使用していたのですが、4.71になると、
 >「インターフェースが一致しません。エンジンのバージョンが違います」 というエラーが出ます。
 >ウィンドウ自体は開くのですが、エイリアスは参照できません。
 >メッセージから察するに、BDEのバージョンが合わないのだろうと思いますが、 添付ドキュメント、
 >ヘルプをざっと見た所では、BDEのバージョンに関する制限には触れられていないようですが……

 そういえば、BDEエンジンのバージョンは明記してなかった。言い訳がましいが、D4+D3の環境で使っているものだからてっきりそのまま動くものと信じて疑わなかった。

GT32.EXE
 ...という事で、GT32.EXE ver4.71 BDE4.xバージョンをアップロード。

・移植???
 ソースはとりあえず条件コンパイル(コンパイラバージョン)に対応していたので、フォームをすべて開き直して(D3にはないプロパティがある為)、再構築で一丁あがりである。まぁ、本当は色々あったのだが。しかしD3は軽くていい。EXEサイズも100K程小さいし。

GT32.EXE
 『DOS/V USER』4月号(3月18日発売)に掲載(収録)されるかもしれない。


99/02/09

・SHG Viewer
 暫定版だが、とりあえずスナップショットを...。

 本来、SHGファイルはMRB(マルチレゾリューションビットマップ)に対応しているので、MDIアプリにすべきだと思うが、OLEを使用する事を考慮するとSDIアプリが妥当かと思う。現在はSHGからBITMAPへの書き出しをサポートする以外、目新しい所はない。新規でSHGファイルを作成することもできないし(だから「SHG Viewer」なのだけれども)。反応があればこのままSHGエディタへ進化させたいと思っている。

GT32.EXE ver4.71 for BDE4.x
 それなりに需要はあるらしい。「Delphian World」で確認してみたのだが。そうなるとD4が定着するまでVer5.00は見送った方がいいのかもしれない。


99/02/10

・マウス
 マウスを購入した。Logitechの「WheelMouse(PS/2)」。KeyBoardに合わせて黒い奴を...(^^; このMouseを選択した理由は、MicrosoftのIntelli Mouise(Point)と互換性があるからだ。つまりIntelli Mouise(Point)のドライバでちゃんと動作する(Win98なら特にソフトを入れなくてもそれなりに動作する)。細身で握りやすいしね。

・Intelli Mouse(Point)のドライバ
 12/18に「SP4を入れた後にドライバ(Ver2.2)をインストールするとNT起動時に'Tips.EXE'がコケる」と書いたが、修正版のドライバが12/24付けでアップロードされているようだ。バージョンは2.2d。しかしMicrosoftのダウンロードページには

「Microsoft(R) IntelliPoint Version 2.2 アップデートプログラム 」

としか書かれていなかった(現在もだが)ために、発見が遅れてしまった。ちきしょ。

DirectX 6.1(日本語版)
 ダウンロードできるようだ。ここから落とすと日本語版を選択できる。


99/02/13

・GrabHandle
 02/07に「アレ」って言ってたのは「GrabHandle」というそうな。よくグラフィック系のツールで矩形を選択すると四隅と各辺の中央に表示される四角のグリップのついた領域が表示されると思いますが、アレです。Nifty-ServeのFDELPHIにコンポーネントが転がってた(伊藤義弘氏作)んで、これをいじってみました(改悪ともいう)。そしたら、ほぼ期待通りの動作をしたので、これを「SHG Viewer」に組み込んでみたいと思います。

・SHED.EXEでのGrabHandle
 領域を選択した後でドラッグしたりサイズ変更をしたりするとGrabHandleの領域がチラつくので、なにをやっているかは想像に難くない。多分、GrabHandle領域を待避した後、GrabHandleを描画し、移動(またはサイズ変更)したら待避した領域を書き戻すといった処理をやっているのだろう。

・「SHED.EXE」と「SHG Viewer」のホットスポット領域
 なんか合わないなーと思っていたら、単にダブルクリックしてズレただけだった。

・つー事で。
 「SHG Viewer」をアップロード。将来は「SHG Editor」になることでしょう。ちょっとDelphiをやったヒトなら「なんであんな動きになる訳?」と思う事でしょうが、所詮はDEKOのやる事。大した事はやっていません。「SHG Editor」への布石もやってあります。

・DreamCast
 RGB出力でパソコンのディスプレイに出力すると、まぁ綺麗な事、綺麗な事。TV出力とは(当然ながら)比較にならない。DreamCastが「パソコン」である事を改めて思い知らされた。

・あ!!
 ばあちゃんの誕生日過ぎちゃった。今度またお土産持って実家に帰ろう。


99/02/14

・バレンタインデー
 ブ男の私には縁のない日。今年も日曜日と重なってしまったため、チョコの売り上げは非常に悪いらしい。あちこちで国生さゆりのアノ曲が流れたであろう日でもある。

・「SHG Viewer
 需要はそれなりにあるようなので、「SHG Editor」へのバージョンアップは行う事にする。とりあえずの目標は非圧縮BitmapのSHGファイルを吐けるようにする事。RLE(ランレングス)圧縮やLZ77(Lempel-Ziv '77)圧縮は二の次。ヘルプコンパイラのオプションで圧縮はやってくれるので。

・SPA
 温泉行って、焼肉食って、酒飲んで寝た。うーぃ、こんなにゆっくりしたのは久しぶり。


99/02/15

・「SHG Viewer
 ヨッパライつつもVer0.2を仕上げる。次からは「SHG Editor(Creator)」だ。


99/02/19

・仕事
 やっと片付いた。しばらく更新できなかったのは、本当に忙しかったため。これでしばらくはゆっくりできるかな?

C++Builder4
 03/26に出荷開始されるらしい。何故か「Client/Server」版はなく、「Enterprise」になっている。単に名称の変更なのだろうか?

DelphiX
 02/10にバージョンアップされている。

MMXasm
 こちらもバージョンアップされている。

・堀さんのソフト
 「Mpeg Encoder」だけ紹介していないのは、一時期のバージョンアップが凄かったから(毎日のように更新されてましたもの)。

・Next Jobs
 なにやらVBになるらしい。いやーん、VBはいやーん。

・「SHG Editor(or Creator or Generator)」
 さて、本気で制作にとっかかるか。うまくいけば来週中頃にはアップできるハズ。

・久しぶりのX68Kネタ
 いりや氏の「Neptune-Evolution II」はSIMMソケット調達の遅れにより発送時期が5〜6月迄延びるらしい。まぁDIMM全盛の御時世なのでSIMMソケットが入手できないのは至極当然の事かもしれない。


99/02/20

・「宇宙戦艦ヤマト 〜遥かなる星イスカンダル〜」(PS)
 DISK1枚ですべてのエピソードを網羅してるのだろうか?「真田さんバラバラ事件」とか「相原君ホームシック事件」とか「(999みたいな)昆虫惑星の話」とか...。Movieを控えめにしてポリゴンで処理してるのはそういう事なのかも知れないなぁ。ちょっとタルいけど&白兵戦は蛇足かな。

・「宇宙戦艦ヤマト」
 キ○ガイのように観てたからね小さい頃。結構細かい所まで覚えてるんだけど、社内の人間に聞くと「なんでそんなの知ってる訳?」と言われてしまう。「真田さんの姉さんは遊園地の事故で死んだ」とか「次元潜航艇」とか「波動カートリッジ砲」とか「二連三段空母」とか「徳川機関長の息子」とか「安直な名前の加藤三郎の弟」とか「ガルマン・ガミラス」とか「古代守と斎藤と1のエンディング歌ってるのは同一人物」とか「デスラー総統は今は役者やってる(矢吹丈は'助さん'やってるが)」とか...。まぁ「古代君は'初代'ちびまる子のじいちゃん(友蔵)」ってのはよく知られてるけど。とりあえず映画や特別編を含めてすべて観た(TOKIOが主題歌歌ってた奴は除く^^;)。

・「ヤマト」の音楽
 「アンドロメダのテーマ」とかいいね。沢田研二の奴もシブくてよかったけれど。

・「ヤマト」の登場人物
 新選組から名前を付けてあるのはご存知の通り。だから艦長は死んでしまうのだ(後で「脳死に至ってなかった」と判明したが)。

・車の任意保険
 ある方法で下がった等級を元のレベルに戻す事ができる。今回それでお世話になった。「自分で事故を起こしていない」のに等級が下がって掛け金が高くなってしまったのには納得いかなかったから。


99/02/21

・BIOHAZARD2(Win)
 なかなかGood。高スペックなマシンならばPSよりも美麗に、しかも快適にPlayできるハズ。オプションも結構あり、クリスが使えるゲームもある。「4th」も「豆腐」も最初から遊べるし。CAPCONも「スト2」系ばっかりやってないで、こういった良質なゲームを量産して欲しい。

・The C
 久しぶりにCを触った。DOSの(Human68Kのではない)Cだが、ちょっと特殊なCである。コンパイラは日立(モトローラ)の奴で、POT(そうそう、湯沸かす奴^^;)用の物(PC-98用クロスコンパイラ)である。元々はファイル分割されていたが、たまにしかメンテナンスしないという事もあって、以前DEKOの手でCソース1本とヘッダ1本のシンプルな構成に変更してあり、コンパイル、リンク、コンバート、アップロードはファイラ(FDね)から操作できるようにしてある。
 でも久しく触らないと、難儀するんだよね。最初の30分位は文法思い出すので精一杯ですもの。


99/02/22

・BIN DUMP
 「SHG Editor(or Creator or Generator)」を作ってる時に、どうしても吐き出す内容がヘンだったのでバイナリエディタとして「RED(-sオプション付)」を使っていたが、どうもしっくりこない。既存のWindowsのバイナリエディタ&ダンプもイマイチだし...。

「つくっちまうか」

 ...てー事でバイナリダンププログラムを書いた。コードは50行も書いただろうか?ってとこ。

Delphi4の「新規作成」の「プロジェクト」タブから、「MDIアプリケーション」を選択し、TMainForm.CreateMDIChildを下記のように変更する。

procedure TMainForm.CreateMDIChild(const Name: string);
var
 Child :TMDIChild;
 f1 :File;
 Buf ,
 Counter :Byte;
 i ,
 Sum ,
 NumRead :Integer;
 Text :String;
begin
 { MDI 子ウィンドウを作成する }
 Child := TMDIChild.Create(Application);
 Child.Caption := Name;
 if FileExists(Name) then
  begin
   AssignFile(f1,Name);
   ReSet(f1,1);
   Counter := 0;
   while not Eof(f1) do
    begin
     if Counter = $00 then
      begin
       Child.CBG1.Cells[0,Child.CBG1.RowCount - 1] := Format('%.6x',[FilePos(f1)]);
       Sum := 0;
       Text := '';
      end;
     Blockread(f1,Buf,SizeOf(Buf),NumRead);
     Child.CBG1.Cells[Counter + 1,Child.CBG1.RowCount - 1] := Format('%.2x',[Buf]);
     Sum := Sum + Buf;
     if ((Buf >= $00) and(Buf <= $1f)) or ((Buf >= $e0) and(Buf <= $ff)) then
      Text := Text + ' '
     else
      Text := Text + Chr(Buf);
     if Counter = $0f then
      begin
       Child.CBG1.Cells[17,Child.CBG1.RowCount - 1] := Format('%.2x',[Sum mod $10]);
       Child.CBG1.Cells[18,Child.CBG1.RowCount - 1] := Text;
       Child.CBG1.RowCount := Child.CBG1.RowCount + 1;
      end;
     Inc(Counter);
     Counter := Counter mod $10;
    end;
   if Counter <> 0 then
    begin
     for i:=Counter to $0f do
      begin
       Child.CBG1.Cells[i + 1,Child.CBG1.RowCount - 1] := '・・';
       Text := Text + ' ';
      end;
     Child.CBG1.Cells[17,Child.CBG1.RowCount - 1] := Format('%.2x',[Sum mod $10]);
     Child.CBG1.Cells[18,Child.CBG1.RowCount - 1] := Text;
    end;
   CloseFile(f1);
  end;
end;

そして、「ChildWin」に貼り付いている「Memo1」を削除し、代わりに「ComboGrid」を貼りつける(コンポーネントを持っていない場合には「StringGrid」で代用できる)。名前は「CBG1」にし、「ColCount=19」、「RowCount=2」で、固定カラムには適当な文字列を入れておく。

・ちょっとコードを書き足せば簡単にバイナリエディタができる。
 分割ロードなんかできればなおGood。

・「ComboGrid」
 セル単位のAlignが設定できたり、セルをComboBoxにしたりできるのでとっても重宝している。「Delphi2.0J コンポーネントセット(ISBN4-7561-1057-6)」って本に掲載されている。アップデート版は確かNiftyのFDELPHIにあった。

・「SHG Editor(or Creator or Generator)」
 「BIN DUMP」のおかげで16×16でHotSpotが一つだけの簡単な奴は読み書きできるようになったが、ちょっと大きい.SHGファイルはきちんと吐き出せない。恐らくRGBQUADS構造体の設定が間違ってるんだろうとは思うが...。


99/02/23

・「BIN DUMP」
 何故ADDRESSが6桁(16進で)なのかは聞かないように(^^;

・「BIN DUMP」
 普通「0000:0000」とか書くよね、Intel系の石触ってたヒトなら。

・「SHG Editor(or Creator or Generator)」
 非圧縮とRLE圧縮だと、吐かれたファイルをロクにコンペアできないのでRLE圧縮ルーチンを書いている(つまり出来上がりはRLE圧縮対応な訳)。しっかし単純なロジックに思えるのにコーディングするとなると意外とやっかいだっだりする。解凍ルーチンはあるんだけど...。

・ドラえもん
 長編シリーズ(映画版)のコミック1〜5巻を買った。「泣ける」。ピー助が、ジャイアンが、バギーくんが...。

・「One Peace」
 何も女性物の服ではない。「週刊少年ジャンプ」に連載されているアレ。作者の尾田栄一郎氏は熊本の出身らしい(しかも出水南中出身らしい)。

・高橋陽一氏のサッカー漫画
 今週から新連載だが、主人公が小学生だという所をみると「Jr.ユース編」とかやるんだろうか?


99/02/24

「Windows Undocumented ファイルフォーマット」
 補足その2。

 [P.34 2.1.3 SHGBITMAPHEADER]

 sbunk1  DWORD  未知

 ...となっているが、ここは恐らく「(ImageHeader + BitmapHeader) * 2」だと思う。つまり、

 sbunk1  WORDまたはDWORD  (ImageHeader + BitmapHeader) * 2

 が、正解のような気がする。これが正しいのであれば[P.35 2.1.4 SHGMETAFILEHEADER]も同様だろう。

・RLE圧縮ルーチン
 こさえてはみたものの実装するのは非常にやっかい。このルーチンを通してできたデータサイズは既に書き込んだBitmapデータの前に書かなくてはならないからだ。しかも「WORDまたはDWORD」なんて事になると面倒臭いったらありゃしない。


99/02/25

「Windows Undocumented ファイルフォーマット」
 バグ多すぎ。ちゃんとソースは実行してみたのか?と怒りつつも、補足その3。

[P.32,33 2.1.2 SHGIMAGEHEADER]

 SHGのファイルフォーマットで「BYTEまたはWORD」とか「WORDまたはDWORD」と記述してあるものは、つまりは以下のような意味である。ただし前提として、ここに格納されるデータは必ず2倍されている。

−読み込み手順−
 1.まず1Byte(1Word)読んでみる。
 2.これが奇数ならばもう1Byte読む(1Word)。
 3.1Byteしか読んでいないのならこれが値となる。2Bytes読んだのであればこれをくっつけてWord(DWord)にし、値とする。
 4.値を2で割る(余りは無視)。


−Delphiでのコーディング(原書はCでコーディングしてある)
function
ReadWordVal(var f:File):Word;
var
 a ,
 b :Byte;
 NumRead:Integer;
begin
 b := 0;
 BlockRead(f,a,SizeOf(a),NumRead);
 if (a mod 2) = 1 then
  BlockRead(f,b,SizeOf(b),NumRead);
 result := Word((Word(b) * $100 + a) div 2);
end;

function ReadDWordVal(var f:File):DWord;
var
 a ,
 b :Word;
 NumRead:Integer;
begin
 b := 0;
 BlockRead(f,a,SizeOf(a),NumRead);
 if (a mod 2) = 1 then
  BlockRead(f,b,SizeOf(b),NumRead);
 result := DWord((DWord(b) * $10000 + a) div 2);
end;

 ここまではいい。Byte(Word)2個をくっつけてWord(DWord)にするのに掛け算を使ってあるのは原書がそうなっているから。「普通Cだったらシフト演算子使う」とか「Delphiでも'SHL'や'SHR'あるやんけ」なんて野暮な事はいいっこなし。

 で、書き込みルーチンはこんな具合になっている。

−Delphiでのコーディング(原書はCでコーディングしてある)
procedure
WriteWordVal(var f:File;val:Word);
var
 a :Byte;
 b :Word;
 NumWritten:Integer;
begin
 b := val * 2;
 if (b > $ff) then
  begin
   BlockWrite(f,b,SizeOf(b),NumWritten);
  end
 else
  begin
   a := Byte(b);
   BlockWrite(f,a,SizeOf(a),NumWritten);
 end;
end;

procedure WriteDWordVal(var f:File;val:DWord);
var
 a :Word;
 b :DWord;
 NumWritten:Integer;
begin
 b := val * 2;
 if (b > $ffff) then
  begin
   BlockWrite(f,b,SizeOf(b),NumWritten);
  end
 else
  begin
   a := Word(b);
   BlockWrite(f,a,SizeOf(a),NumWritten);
  end;
end;

 さて、このままだと意味が通らない。これだと値がByte(Word)の範囲を超えていればWord(DWord)になってしまう。この状態で書き込まれたデータは必ず偶数になってしまうため、読み取り時にはByte(Word)でしか読まれない。

 ...多分、こういう事だと思うのだ。

−書き込み手順−
 1.値を2倍する。
 2.値がByte(Word)の範囲を超えていればWord(DWord)で書き込む。
 3.そうでなければByte(Word)で書き込む。

 確かにこうすれば原書に書いてある通り「風変わりではあるがサイズを小さくする試み」にはなるだろう。しかし、そうであるのならばByte(Word)のデータの場合は値は偶数、Word(DWord)のデータの場合には奇数でなくてはならない事になる。つまり...

 if (b > $ff) then
  begin
   Inc(b);
   BlockWrite(f,b,SizeOf(b),NumWritten);
  end

 if (b > $ffff) then
  begin
   Inc(b);
   BlockWrite(f,b,SizeOf(b),NumWritten);
  end

 下線のようにインクリメントして値を奇数にしてやらなければならない(Cなら「b++;」という訳)。

・結論
 「書籍(特に和訳モノ)の情報は一度疑ってみよう」

・「能書きはいいから'SHG Editor'はできたのか?」
 できました。ちゃんと読み書きできますが、書き込み時にRLE圧縮はされません。その上新規作成したSHGファイルは、

「SHED.EXEで認識されません」

 フォーマットの条件は満たしているのですが、何故か駄目です。これじゃ全く意味がないので、リリースはもうちょっと後です。


99/02/26

・多分、今日は免許更新に行きます。
 髪切って行かないと「5年間写真が同じ」なので大変だ。

・昨日の続き
 あの「サイズ節約法」は0x0000〜0x007f(0x00000000〜0x00007fff)の範囲しかByte(Word)で書き込まれないから大した節約にはならないよなぁ。データが均等にバラけてたとすると節約できる比率は1/512なんで、極端に偏ったデータでしか効率よくないもんな。「Windows Undocumented ファイルフォーマット」にも書いてあったけど「それが実際に持つ価値よりも問題が多い」。構造体宣言して一括読み書きできないし(くどいか?)、読み書き時のオーバーヘッドが大きくなりがちだし。

・うーはー
 「味覚糖」ではない。「こんどうくん」が買った。設置したら最初付けていたスピーカーが音負けするのでスピーカーも買っちゃった。そしたら誰かの歌の曲名じゃないけど「ドカドカうるさい」。ありゃ、勤務時間帯と自宅じゃ使えないな。


99/02/28

「Windows Undocumented ファイルフォーマット」
 まだバグあり。

 [P.34 2.1.3 SHGBITMAPHEADER]

 sbCDateSize  WORDまたはDWORD  ビットマップデータのサイズ×2

 ...となっているが、実際にはDWORD固定でデータは2倍されていないようだ。

・RLE圧縮
 Encode部を作った。Decode部は既にちゃんと動いていた訳だが、かなり不思議な現象が起きる。

 1.RLE圧縮されているデータはきちんと表示(Decode)できる。
 2.EncodeしてDecodeするときちんと正しいデータを復元できる。
 3.ところがEncodeしたデータとSHEDでRLE圧縮されたデータは一致しない。

 どないせーっちゅうんじゃ。


[BACK] 古いのを読む 新しいのを読む