ざつだん。
(00/06/01〜00/06/30)
・ログを分離しました。
・「CCB ver0.30」
リリース。ソースを結構改造。選択矩形の枠(点線)がカラー矩形の色で描画されてしまうバグを修正した他、OnChangeイベントの発生条件の見直し、Delphi2,3,4/C++Builder1,3への対応を行なってある。ごく簡単なサンプル(Delphi2以降)も付けておいた。Delphi1への対応も考えたが、{$IFDEF}コンパイラ指令でソースを対応させると長くなってしまうのでやめた。修正はそんなに難しくはないと思うし...。
・「TEADCUST ver1.03」
リリース。上の「CCB ver0.30」対応の他、OpenDialogでエディタ環境を一括インポートできないバグを修正したり、エディタ環境やユーザーメニュー環境のポップアップメニューを変更したりと、今回はちょっとした変更となっている。
・熊本市のエスパーおばさんの件
現場はこんどうくんのアパートの近くだったらしい。
・しあわせ家族計画
こんな題名だったかな?和田さんと古館さんがやってる番組は。今週のラストに出てきた杉本さん(ソバの出前持ちに挑戦したヒト)は私の親戚です。去年亡くなった私のばーちゃんと、あそこのばーちゃん(生卵でお手玉してたヒト)が兄弟なのです。まー、あそこのばーちゃんてば、ウチのばーちゃんそっくり(^^;
・言い忘れていたけど
昨日と一昨日は出張でした。ふぅ...。
・出張に行っている間に...
参衆議院は解散するし、TwoTop(Freeway)は...
・「TEAD ver1.14/Blue-Version」
リリース。あまり大した変更点はないのだが。強調構文の色の設定を「TEADCUST」ライクに変更。「TEADCUST」の存在意義が薄れてしまうので、「あのまま」にしておく予定だったが、「CCB」を使った方がソースコード量が減る(実行ファイルサイズも)ので実装した。
・「SHG Editor ver1.58/[English]」
アップ。今回は日本語版/英語版共にアップされている。これで英語版とバージョン番号を合わせる事ができた。「>」や「@」を含む「マクロ扱いのコンテキスト文字列」の不具合は直っていると思うが、もしかすると他の場合、例えば「マクロ-可視」とかで不具合が出るかも知れない。この処理は非常に危ういもので、過去に何度も仕様変更となっている。今回も何らかの不具合を孕んでいる可能性は拭えない。
・「SHG Editor」の色設定も「CCB」に変えました。
・おや。
「SHG Editor」は半年振りに更新したのね(英語版除く)。
・SHGファイルの難しいトコロ
「読む」のは結構簡単なんだよねぇ、今考えると。それなりにコツはあるけど、各Hotspotの情報なんかはNullで区切っていけば取得できる。問題は書く方だ。複雑な「可変構造体」に加え、後で書かなくてはならない可変項目(Null終端文字列等)を含む構造体へのオフセットを前で書かなくてはならない。素直に先頭から順に処理して書き込む事ができないのだな。「読むのは簡単」と書いたように、読み込みの処理を簡略化すれば殆どの場面で「オフセットを無視して読む」事が可能なのだが、WinHelpはクソ真面目にオフセットからデータを読み込んでいる。加えてハッシュでチェックしている項目もある。確かに、それ故WinHelpはMicrosoft製品としてはかなり堅牢なアプリケーションになっているのだが...。
・明日
「COMPUTEX TAIPEI
2000」にてAthlon(ThunderBird/SocketA)/Duronが発表されるのか?
・昨日
熊本は入梅したらしい。梅雨と聞いて思い出すのは雨上がりに「アスファルトの上で干乾びてるミミズ」とか「アスファルトの上で干乾びてるイモリ」とか「アスファルトの上で干乾びてるカエル」とか...(^^;
・梅雨
キライではないよ。シトシト降るのはイヤだけど、スコールみたいにザーザー降るのは好き。農家のヒトには申し訳ないけれど...。
・誰が悪い?教えて。I don't know. ワカラナイ。
さて、Delphi使いのみなさん。ちょっとヘンテコな現象を発見したので、試せるヒトは試してみて下さい。以下に再現するフォームの作成方法を記述します。
1.プロジェクトを新規作成し、StringGridを貼る。
2.DefaultRowHeightを17にする。
3.Heightを165にする。
4.FixedColsを0にする。
5.Optionsの[goEditing]と[goAlwaysShowEditor]をTrueにする。
6.RowCountを15にする。
7.ScrollBarsをssVerticalに設定する。
実行し、下から2つ目か3つ目の行を選択して、ホイールマウスのホイールで微妙にスクロールさせると...。
この現象はWindows2000+Delphi5で100%再現します(少なくとも僕の所では)。対策としてはHeightを166にすればOKです(^^;
・ホイールマウスのスクロールカウントは「1行設定」です。
・「COMPUTEX TAIPEI
2000」
Athlon(ThunderBird/SocketA)/Duronは発表されたみたいだ。
・「TEAD」
開発中の画面(?)です。さて何が変わったのでしょうね?
私の所では既にちゃんと動作しています。
・...ってバレバレやん。
隠してもしょうがないので、この件についてちょっと語ってみたいと思います。
・正規表現
この機能を実装するにあたり、bmonkey氏の「(仮)AWK言語
正規表現関数群」を使用しています。この正規表現は「AWK」準拠との事で、日本語にも対応しています。以前、正規表現の実装を悩んでいた時に「C
MAGAZINE '93-3」の特集を何度も読んだ事がありますが、どうやらbmonkey氏もこの記事を読んでらっしゃるらしく、私の要望にかなり近いものになっています。
・正規表現オプションの制限
正規表現の実装をためらった理由の一つがこれです。このオプションを使うと、「単語単位で探す(W)」、「全角・半角を区別しない(Z)」、「改行・スペースを無視(L)」オプションが使えなくなります。正規表現自体が強力なパターンマッチングを行なうのであまり必要はないでしょう。一方、「大/小文字の区別(C)」は実装されていますが、これは結構重要だったりします。Cの関数も検索するのに検索文字列として「[a-zA-Z_][a-zA-Z0-9_]*\(」なんてやりますが、これが「[A-Z_][A-Z0-9_]*\(」で済みますしね。Pascalは元々大小文字を区別しない(例外としてDLL等のライブラリがありますが)ので、Delphi使いには他の場面でも有効でしょう。...さて。
・後方検索はできない!
これには理由があります。この「(仮)AWK言語
正規表現関数群」では「最左最長マッチングアルゴリズム」が用いられています。...つーか、正規表現自体が逆順マッチングに向いていないのです。理由は色々ありますが...
・いじわるな検索
Delphiで適当なソースから文字列を検索してみましょう。正規表現オプションを有効にして「a*b」で検索します。この正規表現文字列にマッチングするのは「b」や「ab」や「aab」です。次に逆順で検索してみましょう。...おわかりいただけましたか?「正順と逆順の検索結果が違う」事に。これが「置換」だったならばどういった結果をもたらすでしょうか...?
・さらにいじわるな検索
「a*」なんてのはどうでしょう?空の場合か連続した「a」にマッチングしますが、逆順で検索すると...?
・ひょっとすると
「単語単位で探す(W)」は将来サポートするかもしれません。
・結論
上記の制限によるデメリットを差し引いても実装すべきだと判断しました。次回のバージョンで実装します。
・「TEAD ver1.15/Blue-Version」
リリース。正規表現での検索/置換が可能になっています。
・「TEADCUST ver1.04」
リリース。「TEAD」準拠にしました。
・正規表現
M&I氏から、「とある指摘」を受けたのですが、とりあえずそのままリリースしました。
・明日、明後日
例によって出張です。
・「TEAD ver1.15/Blue-Version」
JISコードで記述されたファイルのエスケープシーケンスに失敗する事のあるバグを修正。同名でアップしてあります。
・「TEAD ver1.16/Blue-Version」
リリース。正規表現を使わない人にはあまりメリットのない改変内容となっています。
1.エスケープシーケンスの定義に誤りがあったのを修正。
2.置換文字列やReplaceコマンド等で使えるエスケープシーケンスに16進値と8進値を追加。
3.正規表現を用いた検索/置換時のカーソル移動(選択)ロジックを変更。
4.正規表現を用いた検索/置換時にワード単位検索を行えるようにした。
5.正規表現のエラーメッセージを日本語に変更。
6.検索/置換でワード単位検索時のデリミタから「_(アンダーライン)」を削除した。
ちょっと補足しないといけませんね。
1.CRとLFのエスケープシーケンスが逆になっていました。
2.正規表現文字列(検索文字列)は最初から対応していましたが、置換文字列等では対応していませんでした。
3.後述します。
4.できるようにしました。
5.そのままですね。
6.これでDelphiとほぼ同等の検索結果が得られるようになりました。
・カーソル移動
通常の検索のルーチンでは、検索してマッチした文字列を選択状態にします。この時に(本当はその前に)マッチした文字列へのインデックスと長さが取得できます。次検索では、検索開始位置を「インデックス+長さ」にしてやれば検索できます。...が、それは通常の検索の場合です。正規表現では「空文字にマッチする」という事があるのです。つまり、次検索で検索開始位置を「インデックス+長さ」にしてもポインタは進まないのです(長さが0ですから...)。「だったら長さが0の時には+1すればいいじゃないか」と思われるでしょうが、それはマズイのです。何故なら、マウスでカーソルを移動して非選択状態だと「長さ=0」なのでカーソル位置にマッチする文字列があっても検索してくれないからです。「TEAD」では、少々泥臭い事をやってこの問題を回避しています。
・ワード単位検索
実は、このオプションがなくてもワード単位検索はできるのです。
[^a-zA-Z0-9\x81-\x9f\xa6-\xdf\xe0-\xfc_]正規表現文字列[^a-zA-Z0-9\x81-\x9f\xa6-\xdf\xe0-\xfc_]
さらに、
^正規表現文字列[^a-zA-Z0-9\x81-\x9f\xa6-\xdf\xe0-\xfc_]
[^a-zA-Z0-9\x81-\x9f\xa6-\xdf\xe0-\xfc_]正規表現文字列$
を条件によりORで加えてやればいいのですが、いかんせん、選択領域が前後に1Byteくっついてしまう場合があります。まぁ、当然ですが。「TEAD」ではこの理屈を応用してワード単位検索を実装しました。
・アースシェィカー
一昨日は熊本ですんごい地震があったらしい(震度5)けど、出張中だったので遭遇しなかった。その後も余震が続き、昨日の夜(今日の朝?)も地震があった。
・こまちゃん
引っ越すらしい。大家に「出て行けぇ!!」と言われたらしいが、どんな悪さをしたのやら...(嘘)
再来週は引越しのお手伝いでもするか。そーいや彼のMR2は白だった。
・過去ログ
何気に過去ログ(雑談)を読み返してみた。「俺って、オモロイ人なのかも...」と実感。なんかくっだらねー事も色々書いてあるけど、一応、マトモな事も書いてあったり...。このHPにリンクされてる方のコメントに「面白い雑談」とあったりするのをよく目にするのは、そういった訳かななんて思ってしまいました。「オモロイ=ためになる」って訳ではないのがツライ所ですがね。
・毎度毎度、独り言みたいな雑談で申し訳ない。
備忘録も兼ねていますから...。
・出張
2ヶ月程延びそうだ。はぁ、梅雨と暑い時期に出張続きとは...ねぇ、なかのさん。
・なかのさんで思い出した。
「TEAD」の正規表現実装のトリガーを引いたのは氏の一言だった気がする。
「正規表現あったらなぁ...」
ってボソリと言われた日にゃ、やるしかないでしょ。やっぱり上司の命令はちゃんと聞かないと...(^^;
・お買い上げ
最近買ったもの「ホットボンド」。熱で溶かしたグルーを「うにー」って出す、コーキングガンみたいなアレ。今すぐどうという事ではないのだけれど、あったら便利かなと思い、予備のグルーも一緒に購入。
・「コーキングガン」の方がマニアックなのか?
・昨日
やなちゃんの子供を初めてみた。「こたろー(仮)」はどこか「遠い目」をしていた...(^^;
・昨日
社内で「柿ピー」をブチ撒ける。掃除が大変だった。
・GRADIUS
コンテンツを作っておきながら、最近更新していない。PS2も持っていないし、ゲーセンに行く気もない。アーケード版の攻略を書かないのは、1周したら高次周にはチャレンジしないからだ(私のやる気の問題だが)。高次周と1周目では殆どの場合で攻略方法が異なる事位は知っているので、あえて書かないでいる。アーケード版の攻略記事は結構多いしね。
・「TEAD」でDelphiプロジェクトをコンパイル
以前、雑談で紹介した「TEAD」からDelphiプロジェクトをコンパイルする方法を設定ファイルにしてジャンクボックスにアップしておいた。前の奴に比べて、より実用的になっている。BC++5.5やC++Builder5用の奴も作ろうかと思ったが、よく考えてみればC/C++にはMakeがあるんだった...(^_^);
・いやーまいった、まいった。
掲示板の件で「TEAD ver1.16+」をリリースしたものの、うまくいかない事が多いのに気付いた。いくら「TEAD」内部でクォーテーション処理を行なおうとも、バッチファイルなんかがロングファイルに対応していないのではどうしようもない。「$EDNAME」等は当初クォーテーション付きで展開するようにしたのだが、ユーザーが意図しない結果になる事が多いと判断して、処理を廃止する事にした。故に明示的に「"$EDNAME"」としなくてはならなくなったが、「$S」系の8.3形式変数を用意したので、困る事はないと思う。
・なんだかんだやってたら
昼休みが終わってしまったではないか...はぁ。
・2日更新しなかった
私とて社会人であるからして、人並みに忙しかったりもするさ...(^^;
・「TEAD ver1.18/Blue-Version/TEAD-CUST ver1.05」
アップ。基本的にバグFix。まだまだバグはあるなぁ...。
・体調
最近なんだか異常に眠い。睡眠時間は充分に取っていても眠い理由はなんだか解っている。これは結構前から気付いていた事なのだけれど...。
・理由その1
「眼」だ。DEKOは近視で、両眼とも0.1以下である。そのせいかちょっとした事でも眼が疲れるが、その度に眠くなってしまう。だからといって横になっても本当に眠る訳ではなく、眼の疲れから逃げているだけだったりする。
・理由その2
「冷房」だ。DEKOは元来田舎育ちなので、「人工的な暑さ/寒さ」にめっぽう弱い。社内は冬より真夏の方がよっぽど寒かったりする(そんな気がする...夏でもホットコーヒー飲む位だし)。その都度会社のクーラーの片方を停めたりもするのだが、他の人からの苦情により、結局は寒さに耐えなければいけなくなってしまう。だから、真夏でもスーツの上着を着て仕事したりする。場所によって温度差が激しいのが...>会社のクーラー。あんまり寒いと気分が悪くなってしまうのだな、これが。夏はたまに外に行って暑い陽射しを浴びたりする、タバコでも吸いながらね。
・あー10日も更新しなかったよ。
ま、たまにはいいか。
・MS-Word98
今更ではあるが、コイツが必要である事に気付く。とはいえ本当に必要なのはごく一部のさらにごく一部である(謎)。はー、わずか3KBの為に苦労しなくてはならないとはねぇ...(意味不明)
・そのうちわかります...(^^;
・郵便番号データ
先週から今週にかけてのガンはこいつだった。
・事の始まり
某所の業務を私が組んだ(全部ではないが...)のだが、これの住所マスタに郵政省のデータを使用している。通常のデータには「都道府県コード+市区町村コード+郵便番号+枝番1+枝番2」で格納されている。文字列で持たずにコードで持っているのには意味がある。当時、このアプリを動作させるための最低環境が「Pentium-120
500MB-HDD 800x600」というノートパソコンだったため、少しでもHDD容量を節約する必要があった。
・後になって
住所マスタを郵政省データから更新したいという話が出た。「いいっスよ」とふたつ返事で受けたまではよかった。出張で忙しい間をぬってコンバータを作ることもできた。...だが、そうなのだが。
・郵政省のデータ
このアプリには「一番最初に公開された郵便番号データ」を用いていた。郵政省のHPには差分が用意してあったので何も問題はないかに見えた。...が、実際にはとんでもない落とし穴が待っていた。
・全データ
差分データとは別に一括ですべてを収録してあるデータも存在するが、実際問題としてこのデータは使えないのだ。何故なら、このデータを適用してしまうと、既に入力されている物件の「どれが更新された対象だったか判断できない」からだ。
・落とし穴
久々にを郵政省のデータ覗きに行って愕然とする。確かに差分はある。確かにあるのだけれど、「一番最初に公開された郵便番号データ」は'98に公開されており、それから'99-4までの差分データが「存在しない」のだ。おいおい...
・とりあえず
熊本の大きな郵便局に問い合わせる。もちろんこの「失われた差分データが存在するか?」を確認するためだった。「わかる者を探して回答させる」という有難い言葉を聞き、電話を待った。すると「九州郵政局」から返事があった。「とりあえず、探してみる」という対応だった。恐らく「中央」に確認して頂いたのだろう。「ちょっと時間を下さい」という事だったので、私は不安材料を抱えたまま出張に赴く事になった。
・回答は
結論から言えば「ない」という事だった。苦情じゃなく、意見を言わせてもらうと、「差分データ」というのは「最初のデータ」があってそれからのすべての差分がなければ意味を持たないので、'99-4の一括データ(差分がそこからしかないと言うのであれば)を置いて、それ以降の差分データを置くのが妥当ではないのだろうか?
・回避策
そりゃ、自分で差分データを作るしかない。「一番最初に公開された郵便番号データ」はそのまま残っていたので、これと「最新の一括データ」を一旦データベースに落とす。SQLで一致クエリーを書き、一致するデータ(最大公約数)を抽出する。このデータと「一番最初に公開された郵便番号データ」を比較し、不一致レコードだけ抽出する。同様に「最新の一括データ」も不一致レコードを抽出すれば、「現状から削除すべき差分データ」と「追加すべき差分データ」が生成される。
・一致、不一致
郵便番号だけでは判断できない。これは「同一の郵便番号に複数の地区が割り当てられている事がある」ためだ。ではどうするか?そう、住所の文字列で比較するしかないのだ。
・まだまだ
苦難は続く...
・なんだかんだで
忙しかったので引越しのお手伝いができなかった。すまぬ>こまちゃん。
・昨日。
私とこまちゃんとまりんちゃん(仮)でゴハンを食べに行く。んで、こまちゃんの新居を見てきた。広いなぁ...今は(^^;
・「TEAD ver1.19/Blue-Version/TEAD-CUST ver1.06」
アップ。機能追加がメインだが、それ程変化はない。
1.「GUID生成」を追加(デフォルトでShift+Ctrl+G)
以前、M&I氏に言われてた奴。Delphiと挙動が違うのは言語系で書式が異なる為。安易に['']で括ってたりはしないので、ご安心を。
2.MS-IME再変換に対応(MS-IME98以降)
隠れた目玉。NOTEPAD.EXE(メモ帳)や通常のテキストコントロールで出来て、TEADで出来ないのが癪だったので実装してみた。先日、「IME-98がどーのこーの」言ってたのはコレの事。もちろんMS-IME2000でも動作しますよ。
3.[エディタ環境設定ウインドウ]-[一般]でクォーテーションを2つまで指定できるように変更。
最近C/C++使ってないのがバレバレだが、Char型への代入等には「"」ではなく「'」を使うのをすっかり忘れていた。これを実現するためにクォーテーションを2個指定できるようにした。
4.大きめのファイルを読み込んだ状態でスクロールバーを変更すると、ファイルスワップを引き起こす現象を回避。
これは本田氏のHPの掲示板にあった奴です。
・HLS2CSV
これの開発経緯についてはKoji27氏の掲示板を参照の事。
・さて...
実は今日も徹夜状態なのだ。アプリを急遽アップしたのはいつリリースできるか解らなかったのと、今週の木金はまたまた出張があるためでした。
・明日は
雑談書く余裕がないかもしれないや...(^^;
・対極
ある意味、「TEAD」と「SHG
Editor」は対極にあるソフトだと思うようになってきた。共にWindowsのGUIソフトではあるが、「SHG
Editor」はよりGUIを意識した作りになっており、過去の互換性やEXEサイズは無視しているきらいがある。「TEAD」はというと、どちらかといえば、互換性重視で、EXEサイズも考慮に入れ(とはいえ最近は若干重いが...)、およそGUIベースとは思えない作りになっている。ジャンルが違うのはさておき、プログラムの質(どちらがいいという訳ではない)すら異なる2つのアプリを製作していると非常に感慨深いものがある。「SHG
Editor」では最新の機能(API)を、「TEAD」ではアルゴリズムを...。仕事柄業務アプリばかり作っている身にとってはこういったソフト製作による恩恵が大きいのも確かである。
・なんとか山は乗り切ったが...
まだあるのね。
・WinX68K(仮称)
ver0.40がリリースされている模様。
・Anex86
も、リリースされてるみたいだけど。
・密かな野望
実は「あるコンポーネント」を作ろうとしている。これは「TEAD」にも搭載予定なのだが、結構画期的だと思っている。某所で「(意味深)」と記述していたのはこれの事なのだが、いかんせん現物(叩き台)がないとお話にならないので、まだ詳細は未定だ。頭の中に入っている奴は何度も言うけどかなり画期的。フリーウェア/シェアウェア作者には重宝するだろう。ただ、私一人では如何ともし難い問題もあるので、M&I氏やKoji27氏を巻き込んで(^^;なんとかしたいと思うが、賛同して頂けるかは不明。「叩き台」が完成したら相談してみるか...。ちょっと大きめのアプリ(ツール)を作っている人に福音をもたらすか...?
・帰ってきました。
更新してるのは日付が変わった後だけど許してくれぃ(^^;
・P3A
さらにステップを進める。参考文献をあえて「読まないで」やってみて一通りコードを書いてから後で読み返してみたが、理屈は正しいことが判明。だいぶん理解してきたようだ。いざとなりゃ、大学の時のH谷川先生や藤井氏/藤木氏に連絡を取ってでも、なんとかやってみるつもりだ。もうしばらく、勉強させて下さい。
・...DEKOは文系だったが、よかったのやら、悪かったのやら。
・Koji27氏へ
「HelpDesigner」は「P3A-Ready」ですか? MLに「ニヤリ」とする要望が挙がっていたので、笑ってしまいました(^^;
・やなちゃんも
P3Aに興味を抱いたようですが、業務アプリにゃ使えめぇ...(^^;