(06/10/01〜)

06/10/02

・ログを分離しました。

・Vista
 徐々にWin32アプリは作れなくなるようだ。そこまでして.Netにこだわりたいのだろうか?

・Helpの憂鬱
 最初に困るのはHelpだ。Vistaと、それ以前の95迄遡って一貫して動作するヘルプシステムは、なんと「WinHelp(16bit)版」だけだ。WinHelp32は動作しない...これはなんとなく理解できる。何故なら"かなり"危ない構造なのだ(詳しくはWinHelp4.0 活用研究参照)。しかし、HTML Help(*.chm)も動かないのには閉口した。これらのHelpをVistaで動作させるにはヘルプシステムを別途DLしてインストールしなくてはならない。

  では、VistaのHelpシステムはというと、HTML Help2(*.HxS)と呼ばれる奴で、これをVista以外のOSで開くためには「HTML Help2 Runtime」が必要となる。このランタイムは単体で公開されておらず、.NET SDK等に含まれているようだ。しかし、該当するSDKをインストールしても、未だに私のPCのXPではHxSを開く事ができていない。問題は山積なよう だ。

 Vista以前のHelp用にWinHelp32/HTML Help、Vista用にはHTML Help2と別々に用意しなくてはならない...ってアホですか?わざわざヘルプシステムのランタイムをインストールする物好きなんていないでしょうに。 しかも、ヘルプシステムのランタイムを同梱したソフトウェアの配布は禁じられているし...。

 しかも、このHTML Help2のヘルプを作るには.Netが必須で、アプリと連携したものを作るにはVisualStudioを使うしかなさそうだ。ヘルプコンパイラは単独 で用意されているものの、ヘルプのソースはxmlで、それをVisualStudioが自動的に吐き出す仕組みになっている。つまり、自分でドキュメント を"書く"というイメージはなく、ドキュメント生成ツールに近い。確かにHelpは作成に時間を要するが、HTML Help2で作られた、"やっつけみたいなヘルプ"や"仕様書のようなヘルプ"を見て納得するヒトがどれだけ居るのだろうか?ヘルプシステムとドキュメン ト生成ツールは分けて考えるべきだと思うのだが?

 確かに、旧来のヘルプシステムには問題があった。ページ数にして数百頁しか作れなかっ たり、ページ数が増えるとやたらと重くなったり...しかし、家電等を考えてみよう。マニュアルが数百ページもある家電なんてのは情報機器関連のものだけ のハズだ。冷蔵庫のマニュアルで300頁を越えるものなど見たことがない。これは冷蔵庫の機能として「そこまで書く必要がないから」だ。ソフトウェアも同 じで、「そこまで書く事がない」ものであれば、旧来のヘルプシステムで充分なのだ。

 危険な箇所があったのなら、そこを潰してリリースす ればいいだけの話。EmbeddedウィンドウやRegisterRoutine等は潰してもらっても構わない。メンテナが(退社して)居ないのであれば 「互換性のある、危険性の少ない、ブラッシュアップしたもの」をまた作ればいい。何故使えるものを捨てる必要があるのだろう?Windowsの歴史はMS -DOSから連なる互換性の歴史ではなかったのか?

・セッション0
 サラっと人事のように書いてあるのだが、「Windows Vista でのサービスとドライバの Session 0 分離の影響」 という問題がある...これもキツイ。OSとドライバを分離する...これは解る。が、サービスを分離するとマズイ事が増えてくるだろう。サービスアプリ ケーションは通常、何かしらのアプリケーションと連携して動作する。場合によってはこれができなくなる、というものだ。事実、VistaではFirebirdがローカルで接続できない。

 これは、簡単に言えば「サービスとドライバには特権がある」という事に起因する。2chのBartPEスレに長らく居たヒトなら記憶していると思うが、過去にサービスを使って「他のOS(BartPE等)で起動してターゲットOSのAdministratorパスワードを自由に変更できるツール」を作った事がある。このような"特権階級による犯罪"をなくしてしまおうという事だ。

・〆
 GUIといい、「簡単に使えるように複雑にしていく」 という方向性は間違っているとしかいいようがない。悪意のある人間しかいないと決め付けているのなら、Windowsの開発をやめてブラウザベースのシン クライアント用OSを開発すればいいんじゃないか?ユーザはMicrosoftが思ってる程バカじゃないと思うのだが?

06/10/03

Vector
 この書き方はちょっとなぁ...。まるで、ソフトの作者がウィルスに感染していたかのような書き方でズルいと思うが。「ソフトが感染していた」のではなく、「ソフトに感染させてしまった」のだろう?自分トコの社内で感染させてしまったんなら、非は非でちゃんと認めなよ。この文章をナナメ読みすると「作者がウィルスが混入したソフトを公開したのか、けしからん!!」となってしまう。ひいては作品の評価を落としかねない問題なのだが。「利用者のみなさまに多大なご迷惑をおかけしたことを心よりお詫び申し上げます。」って、実のところ一番の被害に遭ってるのは作者だろうに。あの感染リストに名を連ねたソフトの作者への謝罪は一切なしですか、そうですか。

===================================
弊社サイトのウィルス感染に関するお詫びとご説明

9月27日のウイルス感染事故により、ソフトウェア作者様ならびにソフトメーカ
ー様にご迷惑をおかけしたことを心よりお詫び申し上げます。
事故の詳細については、以下ページにございますのでご覧ください。
http://www.vector.co.jp/info/060927_system_maint_auth.html
==================================

 ...って書いてたらこんなメールが。これトップページからは辿れないんだけど...このやり方だと、確かに利用者はVectorのせいだとは思わないよなぁ。

Firebird関連
 Delphi +IBXで開発をしているのであればテストには「IBConsole」を使うべきだ。何故なら、他の管理ツールはIBObjectやFIBplusを使っ ているからだ。これではテストにならない。「Delphi+IBX」で作った過去の資産があり、DBサーバにFirebirdを使うという状況下にあるのであれば、IBConsole以外の管理ツールやIBX以外のミドルウェアを推すべきではない。

 「IBXは将来的にFirebirdで使えないかもしれない」という不確かな情報を流すのもどうかとは思う。間違ってはいないが、少なくともIBXはIB6.xとの互換性を保っており、FirebirdがFB1.xとの互換性を捨てない限りは普通に使える。「将来的に」なんて言い出したら、IBObjectだってFIBplusだって「MBCSのサポートを打ち切られるかも知れない」とも言えるのだから...。

 但し、BDEはダメだ。BDEの「SQL Linkドライバ」が既にメンテナンスされておらず、FBのみならずIBにおいてもパフォーマンスの低下を招く可能性がある。

 Firebirdだ とIBXで使えない機能というのはIB7.xで拡張された部分であって、普通にSQLを実行する分には全く問題がない。逆に聞きたいが、IB7とFBで "SQL実行以外で互換性のない部分"がどれだけあるというのか?SQL文には確かに互換性がない所もあるが、IBXはSQL文をIB/FBに丸投げして いるだけである。よって、動作に問題はない。「Delphi+IBX」はFB1.0x/1.5x/2.xのいずれでも正しく動作している。Delphiは 5/6/7/2005/BDS2006/Kylix3で普通に使えている。

 僕がIBConsoleをメンテしている理由が「なんとなく」想像できたかもしれない。

・パスワード
 IB/FBのユーザ名/パスワードで思い出されるのは「SYSDBA/masterkey」なのだろうが、現在のIBはパスワードに9文字以上使う事ができる。逆にFBは8文字以内となっている。だから、実際には「masterke」でログインできてしまう。FB2.0ではブルートフォース対 策が強化されてはいるのだが、何もパスワードを8文字以内に限定しなくてもいいだろうに。それから、ユーザ名は大文字/小文字を区別しない...いや、し なくてもいいのだが「IBConsole等で勝手に大文字入力になってしまうのは余計なお世話じゃないのか?」と思ってしまう。

・閉口
 某MLでの出来事に...MLでの事をここに書くべきではないので詳細は差し控えます。

IBConsole 日本語版+α
 先月末に更新。

[更新履歴]

rel.19〜rel.26(Windows)
rel.16〜rel.23(Linux)

rel.26 2006/09/30
・ユーザ名に小文字が通るように修正。
・ユーザ名が大文字である事が前提のコードを排除。
・「サーバのプロパティ」が有効/無効になる条件がおかしくなっていたのを修正。
・ツールボタンやメニューがチラつく原因となるコードを排除。
・「インタラクティブSQL」の「次へ」ボタンの有効/無効の挙動を変更。
・「テキストビューア」のキャプションを日本語化。
・曖昧な「データベース」メニュー/ポップアップメニューの有効/無効表示を明確にした。
 (Linux版の被害が大きく、場合によってはXを巻き込んで死んでいた。)
・ツールボタンやメニューがチラつくのを軽減(Windows版では発生しにくい)。
・空文字を入力するとエラーが表示される入力項目を持った設定画面のほぼすべてで「空文字と半角SP1個はエラーになるが半角SP2個以上だとエラーにならない」というバグを修正。
・メインメニューのツリービューでユーザを選択時、右ペインでユーザを選択していなくてもポップアップメニューでユーザの追加ができるように修正。
・「インタラクティブSQL」の構文エディタにFirebird1.5の予約語を追加した。
・ テーブルのプロパティで「オブジェクトウィンドウ」の[プロパティ]タブにある[インデックス]タブの表示内容をBuild339と同等にした(具体的に は"フィールド名/位置/参照(外部キー)"が追加されている。但しBuild339と違いメイン画面のツリービューにはインデックスは表示されない)。
・IBXを7.04(+日本語化IBXConst.pas)に差し替えた(Windows)。
・IBXのIBXConst.pasを日本語化に差し替えた(Linux)。
・「rel.15」で行った「ユーザの追加/編集」のロジック変更を撤回。
・メイン画面の右ペインを"詳細表示"で固定した。
・「データベースのプロパティ」の[一般]タブの「オプション」に「ページバッファ」の設定を追加。
 (gfixの"-b[uffers]"に相当)
・「ISQLオプション」を開いたとき「文字コードセット」が空なら値を"None"にするようにした。
・オブジェクトインスペクタみたいな表形式の設定項目が暴走する事がある問題を修正。

 バグに関する詳細は「IBConsoleのバグ一覧」でどうぞ。

06/10/04

・IRQ8Priority
 Windowsの高速化でよく出てくるこの項目。Google先生で調べると 出るわ出るわ...。サイトの中には「IRQ8Priority」の意味を説明せずに盲目的に「HKEY_LOCAL_MACHINE\System\ CurrentControlSet\Control\PriorityControl」にある「IRQ8Priority」を"2"や"1"に設定し ろって書いてあったりする。また、Win高速化 PC+のver1.xxは「優先的にCPUを別の処理に割り当てて、体感速度を速くする」にチェックを入れると実際のIRQ8が何かを調べないまま「IRQ8Priority」に値を設定する。

 "IRQ8Priority" の優先度を上げるという行為は"IRQ8=リアルタイムクロック"という前提で成り立つ。当たり前だが、"IRQ8≠リアルタイムクロック"なPCや "IRQ8イベント無効"なPCでは設定すべきではない。ちなみに"IRQ8≠リアルタイムクロック"なPCでこの設定を行うと、
  • 起動画面で止まる(マウスカーソルだけ残った状態)。
  • リソースエラーが出る。
  • やったら遅くなる。
  • セーフモードでも起動できなくなる。
  • セーフモード+コマンドプロンプトすら起動できない事がある。
 といった現象になり、復元すらままならない状況に陥る。知識のないヒトは再セットアップするしかなくなる。

 こういった状況になってしまったPCを復旧するには
  • NT系のOSがデュアルブートできるPCである。
  • HDDを抜いて他のNT系のOSが動作するマシンに接続できる環境がある。
  • BartPEを持っている。
 の環境があれば比較的簡単に復旧できる。
  1. BartPE等の他のOSで起動
  2. レジストリエディタを起動
  3. HKEY_LOCAL_MACHINEを選択
  4. [ファイル(F)]-[ハイブの読み込み(L)]で該当ハードディスクの「%systemroot%\system32\config\」にある「system」を選択。
  5. キー名に「maint」等と入力。
  6. [HKEY_LOCAL_MACHINE\maint\ControlSet001\Control\PriorityControl]にある「IRQ8Priority」キーを削除。
  7. [HKEY_LOCAL_MACHINE\maint\CurrentControlSet\Control\PriorityControl]にある「IRQ8Priority」キーを削除。
  8. 「maint」を選択
  9. [ファイル(F)]-[ハイブのアンロード(U)]を行う。
  10. PCを元通りにして起動。
 回復コンソールでreg.exeって使えたっけ?もし使えるなら
  1. 2000/XPのCDで起動。
  2. 回復コンソールに入る。
  3. 「REG DELETE HKLM\System\ControlSet001\Control\PriorityControl /v IRQ8Priority」を実行。
  4. 「REG DELETE HKLM\System\CurrentControlSet\Control\PriorityControl /v IRQ8Priority」を実行。
  5. PCを再起動。
 でも可。 追記: 2006/10/20 使えないそうです。コマンドプロンプトやセーフモードが起動するのであれば、コマンドプロンプトから3.と4.を行ってPCを再起動すればいいです。

 ここに書いた情報はWin高速化PC+の掲示板に書いてあった事の受け売り...じゃなくて、本人だよ!! どうでもいいけど、むやみやたらに「再セットアップしろ」って書くヒトってかなり無責任だよね。再セットアップしなくちゃならないのって、HDDが物理的に壊れた時以外は滅多にあるもんじゃないんだけど。マイドキュメント内のExcelやWordのデータ程度しか必要でないヒトならそれでもいいんだろうがねぇ...。

・国保連
 バカじゃねーのか、POP3/SMTPで通信すんなよ(PDF)。ウィルス対策ソフトのメールチェッカに引っ掛かってデータ受信できねーじゃねーか。

[WD2000]Word2002とWord2000の共存環境でWord2000終了時にエラー
 ...二時間程悩んだよ。

06/10/05

IBConsole 日本語版+α
 更新。

[更新履歴]

rel.27〜rel.30
(Windows)
rel.23〜rel.27(Linux)

・ヒントで日本語化されていない箇所があったのを修正。
・「インタラクティブSQL」でSQLエラーが発生した場合、エラー行をハイライト表示するようにした。
・「インタラクティブSQL」でSQLエラーが発生した場合、サーバが返したエラー位置へカーソルを移動するようにした。
・メイン画面に表示されるツールバーのボタンを一部変更。
・「データベースのプロパティ(DBアクティブ時)」に「詳細」タブを表示するようにした。
・NetBEUI/SPX関連のコードをすべて排除。(Linux)
・「ネットワークプロトコル」をすべて「TCP/IP」に固定。(Linux)
・「接続診断」ダイアログの[DB接続タブ]にある「ネットワークプロトコル」を「TCP/IP」に固定。(Linux)
・「接続診断」ダイアログ[DB接続タブ]から「NetBEUI/SPX」を削除。(Linux)
・「接続診断」ダイアログ[DB接続タブ]の「サービス」に「gds_db」が抜けていたのを修正。(Linux)
・ユーザ名に小文字が通るように修正。
・ユーザ名が大文字である事が前提のコードを排除。


 今回、Linux版が一度だけ多くアップデートされています。NetBEUI/SPX関連の削除に伴うものです。それから、幾つかの微妙な機能が付いてます。

 「詳細」タブは名前のとおりDBの詳細を表示するものです。特に重要な情報はないかもしれませんが、何かの役に立つかもしれません。

 「ツールバーのボタン」から「サーバの登録解除」が消え、「データベースの新規作成」と「ユーザを指定してデータベースに接続」のボタンが追加されています。危険なボタンを外して、使いそうなものだけを置いてみました。

  「カーソル移動」...本当はエラー箇所をハイライト表示させたかったのですが、サーバが返すエラー位置は問題箇所の前だったり後ろだったりする(SQL パーサの仕様なんでしょうね)ので、ハイライト表示させるためにはSQLエラーコードを取得して分岐処理させなくてはなりません。そんなエラーコード依存 のコードを書きたくなかったので、ハイライトは諦めて、サーバが返したエラー位置に素直にジャンプするだけとなりました...のですが、ちょっとだけシャ クだったのでエラー行をDelphiみたいにハイライト表示するようにしました。

06/10/11

IBConsole 日本語版+α
 更新。

[更新履歴]

rel.31〜rel.33
(Windows)
rel.28〜rel.30(Linux)

"オブジェクトインスペクタみたいな表形式の設定項目"で上下カーソルによる移動を可能とした。
・「オブジェクトウィンドウ」に[テンプレート]タブを追加。
・「インタラクティブSQL」でパラメータ入力を可能にした。
・すべてのコンボボックスの「AutoComplete」プロパティをFalseにした。
・エラー行のハイライト表示が残ったままになる事があるのを修正。
・独自のメッセージダイアログを「Enter/Escape/Space」いずれでも消せるようにした。

 時系列でいきましょう。

・ 「独自のメッセージダイアログ」
 わざわざマウスでOKを押すかEscでしか消えませんでした。「OK」ボタンしかないのだからEnterやSpaceで消えるべきです。

・ 「すべてのコンボボックス」
 Delphi6 以降、コンボボックスの「AutoComplete」プロパティはデフォルトでTrueになっています。一見よさげに見えますが、DBCSに対応していま せん。具体的には全角文字を入力してバックスペースで消すと1Char単位で消えます(1文字ではありません)。余談になりますが、全角文字を考慮した オートコンプリートを実現するにはこちらを参照してください。

・ 「テンプレート」
 Select/Insert/Update/Delete 用のSQL文を吐きます。ちゃんとプライマリキーが考慮されており、Where句(Select/Update/Delete)にプライマリキーフィール ドが設定されます。UpdateのSet句からはプライマリキーフィールドが除去されています。テンプレート機能を使うと、Delphi等で使いやすいよ うにパラメータが設定されます。

 パラメータの命名規則には賛否あるでしょうが、Insert文やUpdate文のSet句のパラメータ は「:フィールド名」、Select/Update/Delete文のWhere句のパラメータは「:_フィールド名」で出力されます。フィールド名で出 力されるのがキモです。

 これまた賛否両論あるでしょうが、SQL文に一見無駄と思える空白が存在する事があります。これはフィールド名の最大長を考慮してあるからです。空白がないとDelphi等でブロック(矩形)コピーを行う時に面倒な事になりますので...。

 なお、Insert/Update/Deleteが出力できるのはオブジェクトがテーブルの場合だけです。ビューの場合にはSelectのみ可能となります。

・「パラメータ入力」
  パラメータ付きのSQLを実行しようとするとパラメータ設定ダイアログが表示されます。ここでパラメータの型(デフォルトでバリアント)と値を設定する事 ができます。一度実行されるとパラメータはパラメータ名を元に型と値を保持しています。つまり、同じSQLを実行すると、以前設定/入力したパラメータの 型/値がデフォルト表示されます。違うSQLであってもパラメータの名前が一致していれば、最後に入力したパラメータの型/値がセットされます。「テンプレート」でパラメータにフィールド名を使っているのはこのためです。

 パラメー タを使う利点は、型を明示的に指定できる事にあります。また、型と値はCtrl+←→で移動できます。上下でパラメータ間の移動です。もちろんマウスでの 指定移動も可能です。

・「上下カーソル」
  上の修正による副産物です。すべての項目にロジックを移植しました。オブジェクトインスペクタと違って上下カーソルで移動しないんですよねぇ...できそ うで、できないのでかなりイライラします。この実装に慣れてから他のIBConsoleを触るとイライラ倍増です(^^;

・更新
  小出しに更新しているように思えるでしょうが、空き時間でやってるのと、日本語版Delphi/Kylixの場合、ソースを共有できない(文字コードの関 係)のでWindows/Linuxを同時に更新する必要があるので仕方ないです。まとめて一気に更新すると、どちらかに転記するのが大変になってしまう のです...ご了承下さい。

06/10/18

・Windowsと開発言語
  行き詰ってしまった感がありますな。MSが開発環境をフリーで提供するのはサードパーティ泣かせでしかありません。Borlandも末期状態だし。で、こ の開発環境が優れているかと言われるとそうでもなく、バグだらけだったりドキュメントが未整備だったりで、「やっつけ仕事」って感じがします。

 開発環境がバージョンアップしてコーディング量が減ったかと言われればそうではなく、単純に新機能の分だけコーディング量が増えてる気もします。

 . Net開発環境はMS社以外のは駄目駄目です。使い物になりません。この先Vistaが普及するような事があればDelphiを諦めてC#に移行せざるを 得ないでしょう(業務アプリでは)。これは言語製品の開発を行ってる会社のせいではありません。勝手に.Net作って、勝手に「今後は.Net以外マトモ に対応しないから」ってのはあまりといえばあまりな仕打ちです。

 以前、「Vistaはターニングポイント」と書きましたが、この考え方 は今でも変わっていませんし、ますます確信も強くなってきています。XPで動作するアプリケーションに不満があるヒトはもはや少数でしょう。スピードも充 分満足できるものですし、CPUを最新のものに乗せ変えても劇的に高速化される事がなくなってきました。最近ではCPUよりも大容量のメモリと高速な HDDを選んだ方が快適な位です。

 ハードが高速化してもOSが複雑化し、ソフトウェアの実行速度は低下する...こんな事であればOSも開発言語も古いバージョンに戻した方が遥かに幸せになれます。ブレークスルーを望むなら他のOSに移行するしかないかもしれません。

  そういった背景も踏まえてKylixをいじっているのであり、Linuxを触っていたりするのでした。ドライバが増えればBeOS(またはそのクローン) やMacOSが化ける可能性があります。Linuxは無駄にマンパワーが分散されているので、Windowsの代わりとしてのデスクトップの位置は望めな いでしょうね(使えない訳ではなく、抜本的な改善が望むべくもない、という理由からです)。本気でLinuxを推し進めたいのであればディストリビュー ションの統廃合が絶対条件でしょう。

IBConsole 日本語版+α
 更新。

[更新履歴]

rel.34〜rel.36
(Windows)
rel.31〜rel.33(Linux)

・「ツールの設定」ダイアログの「プログラム/作業フォルダ」をExplorer/KonquerorからのD&Dに対応。
・「ツールの設定」ダイアログの参照ボタンを変更、作業フォルダを参照できるようにした。
・「データベースバックアップ」ダイアログの「ファイル名」をExplorer
/KonquerorからのD&Dに対応。
・「データベースの作成」ダイアログの「ファイル名」をExplorer
/KonquerorからのD&Dに対応。
・「データベースのプロパティ」ダイアログの「ファイル名」をExplorer
/KonquerorからのD&Dに対応。
・「データベースのプロパティ」ダイアログでサーバがリモートであっても、
 ホストがループバックアドレス(または'localhost')の時にはファイル名の参照ボタンが有効になるようにした。
・「データベースの登録と接続」ダイアログの「ファイル名」をExplorer
/KonquerorからのD&Dに対応。
・「データベースの登録と接続」ダイアログでサーバがリモートであっても、
 ホストがループバックアドレス(または'localhost')の時にはファイル名の参照ボタンが有効になるようにした。
・「データベースのリストア」ダイアログの「ファイル名」をExplorer
/KonquerorからのD&Dに対応。
・「インタラクティブSQL」でSQLファイルをExplorer
/KonquerorからD&Dできるようにした。
・「オブジェクトウィンドウ」の[プロパティ]タブのコンテキストメニューに「すべての情報をコピー」を追加。
・メインウィンドウの右ペインがオブジェクトの場合のコンテキストメニューに「すべてのオブジェクト名をコピー」を追加。
・「オブジェクトウィンドウ」の[データ]タブにフィルタ機能を追加。
 (フィルタ式はSQLのWhere句と同等のものが使えます)

 最初から脱線しますが、私が作ったソフトに「GT32」というものがあります。BDEがメンテナンスされていない昨今、公開終了に片足を突っ込んでいるソフトですが、これはBDE接続されたデータベースのテーブル構造をクリップボードにコピーしたり、印刷するものでした。「Get Table Structure」で、最初は「gts.exe」だったのですが、テーブル操作機能とSQL発行機能を加えて16bit版の「GT16.EXE」をリリース、BDEが32bit化されたのに伴って「GT32.EXE」がリリースされました。余談ですが、Accessのテーブル一覧/構造をクリップボードにコピーするだけの「GT_AXS」というものも手元にあります。

 独自ビルド版IBConsoleでは、そのGT32の機能に近いものが実装されています。rel.32(rel.29)のパラメータ入力や、rel.34(rel.31)のフィルタ機能、rel.35(rel.32)のクリップボード一括コピー機能等はGT32にあったものです。反面、GT32のウリの一つであった「テーブル情報一括印刷」が実装されていませんが、Linux版との兼ね合いもあって実装が見送られています。クリップボード一括コピー機能を使うとタブ区切りでクリップボードに格納されますのでExcelやOOoのCalcへ直接貼り付ける事ができます...あちらで整形して印刷した方が遥かに見映えがすると思いますし。

 さて、機能紹介。

・フィルタ式
 テーブル/ビューのオブジェクトにおいてSQLのWhere句と同等のフィルタ式が使えるようになりました。式は構文表示されます。実はわざわざ右の実行ボタンを押さなくてもEnterキーでフィルタを適用できます。テーブルはフィルタ適用後も編集可能です。

・クリップボードへのコピー
 テーブル一覧やフィールド一覧を簡単に作れます。既出ですが、ExcelやOOoのCalcへ直接貼り付けられます。

・ドラッグ&ドロップ
  ファイル名に関連する所はすべてExplorer/Konquerorからのドラッグ&ドロップが可能です([...]ボタンのある所等)。「インタラク ティブSQL」のSQLウィンドウへのドロップも可能です。QtでKonquerorからドラッグ&ドロップするコードはこちらにあります。

・サーバがリモートであっても、ホストがループバックアドレス(または'localhost')の時にはファイル名の参照ボタンが有効になるようにした。
 Vista対策。「Windows Vista でのサービスとドライバの Session 0 分離の影響」の絡みで、Vista環境でFirebirdを 使うとローカル接続できなくなってしまいます(IBConsoleではなく、Firebirdそのものが接続できなくなる)。 ローカルで使うにはリモートにしてホストを「ループバックアドレス(またはlocalhost)」にするしかなさそうですす。この際、IBConsole の以前のバージョンでは"ローカルで使っているにも関わらず接続種別はリモート"なので問答無用で参照ボタンが押せなく なってしまいます。当たり前と言えば当たり前の事なのですが、あまりにも面倒なのでループバックアドレス(またはlocalhost)の場合には参照ボタ ンを有効にするようにしました。

・Linux版
 今回から"UnOfficial VisualCLX Patch for Kylix3" を適用しています。パッチをそのまま適用したらTImageList(QImageList.pas)で問題が発生しましたので、 QImageList.pasのパッチの採用は見合わせています。それから、Linuxには存在しないハズのSHBrowseFolder(?)が実現さ れています>「ツールの設定」ダイアログの作業フォルダ参照ボタン。

・持論
 ソフトウェアというものは「ちょっとした不満を解 消」するだけで、その評価がガラリと変わるものなのですよね。「ちょっとの不便さ」の積み重ねが「使い勝手」という評価に直結してしまう訳です。 IBConsoleは持っている機能に過不足はないと思っています。そこに本来の機能を損なわない程度の改良を行っているつもりです。

06/10/20


 メール来ました。

CPUクーラーが過労死一歩向こうなので鎌倉後継機を求めて大須の大佐の店を訪れる途中の名鉄線大同駅ホームであるが、既にメモリトラブルきちがいブログを閉鎖した筈の我輩に対して未だに面白可笑しい他人の不幸を渇望して止まぬ貴様等下衆共の邪悪な祈りによって只今古今未曾有の腹痛祭り開催中であり、我が括約筋の静かなる大立ち回りによって名鉄線金山行普通車輌内の秩序と安寧が守られておるというのに、隣のクソボケヤンキーの白痴的頭髪から発するチープ・スメルによって今や我が大腸は絶え間ない律動を余儀なくされているのであり/

 なんだーブログ閉鎖しちゃったのかー。

ビニから帰って日課のマビノギでルンダ巡り中にパソ死んだ。電源ボタン押しまくってもクスッとも言いやがらねえ。今度こそダメな感じ。
こうなったのも、級長が毎回出張時にホテルの電話でコールガールとベルボーイを間違ってオーダーするからだと思う。

 どっちが来たとしても「チェンジ」と言えばどうにかなるらしいぞ。

OK、なんとなく自己解決したw
マザボと電源スイッチプラグの接触不良だったっぽい。

 ヒトに健忘症疑惑をかけといて自己解決したとは恐れ入る。接点復活剤とシリコングリスでも塗っておけばいいのに。

ある時、イエスが弟子たちを連れて街中を闊歩していると一人の女性が民衆から石を投げつけられていた。
なぜこんなことをしているのかと、弟子が民衆の一人に問うと、「この女は罪人だからだ」と答えた。
それを聞いたイエスは民衆にこう言った。「ならばしかたがない。続けなさい」
そしてこう続けた。「ただし、一度も罪を犯したことのない正しき者だけこの女性に石をぶつけなさい」
民衆は、とまどい、やがて一人また一人とその場を離れ、そして



石をぶつけているのはイエスただ一人だけとなった。

  これ掲載したら「ものみの塔」の小冊子が山程送られてきそうで怖いんですけど。「キリストは一度も罪を犯していない」という事を理解していないと 「???」な文章にしか見えないよな、コレ(そもそも石を投げた時点で罪が発生するような気がする)。キリスト教はこれを逆手にとって「罪を犯してもキリ ストを崇めれば許される」という曲解もはなはだしい喧伝をしているような気がするのだが。あ、イカンイカン、「ものみの塔」が山のように...。

SynEdit(Kylix Port)
 CLX版はMBCSに対応していない。独自ビルド版IBConsoleでも当然対応していなかった。日本語表示は可能だが、日本語入力が全くできない。他のエディタからコピー&ペーストは可能なので特に問題にはならないと思う。SQL文に日本語書く事なんて殆どないし。

 ...でも。不便は不便である。キャレット移動が1バイト単位でも、Backspaceで1バイトづつしか消せなくても入力だけでもできれば随分違う。

 KylixでSynEditを使っている場合、日本語を「とりあえず」入力可能にするには「TCustomSynEdit」の「KeyDown」イベントを書き換えるといい。

//if Key <= 255 then              // MOD DEKO
  
if Char(Keyin ['a'..'z'then // MOD DEKO

 一行書き換えればとりあえず日本語入力は可能になる。キャレット移動や文字削除は相変わらずおかしいままだが。SynEditのMBCS対応はWindowsのAPIに密接な関係があるので、Linux(Kylix)でMBCSにマトモに対応させるのは至難の業かもしれない。独自ビルド版IBConsoleのrel.34(Linux版)で日本語入力を「とりあえず可能」にしておいたが、この先はIBConsoleではなくSynEditの領分なので、これ以上の対応はしない。LazarusSynEditを使用しているアプリケーションの日本語化をやっている方もいらっしゃるようなので、車輪の再発明はやらない事にする。SynEditのMBCS用コンパイル条件を「Windows/Linux」で分離してもらいたいものだが...。

 気が向いたらSynEdit(Kylix Port)のMBCS対応をやるかもしれない。

SynEdit(Kylix port)のMBCS対応
 あっさりできた。以下に変更箇所を示す(ソースは2.0.3)。

 [SynEdit.pas]

uses
 
...
{$IFDEF SYN_MBCSSUPPORT}
  
// MOD DEKO
  
{$IFDEF MSWINDOWS}
  
Imm,
  
{$ENDIF}
  
{$IFDEF LINUX} // ADD DEKO
  
ImmDmy, // ADD DEKO
  {$ENDIF} // ADD DEKO
{$ENDIF}

  TCustomSynEdit class(TCustomControl)
  
private
   
...
  
{$IFDEF SYN_MBCSSUPPORT}
    
{$IFDEF MSWINDOWS} // ADD DEKO
    
procedure WMImeComposition(var MsgTMessage)message WM_IME_COMPOSITION;
    
procedure WMImeNotify(var MsgTMessage)message WM_IME_NOTIFY;
    
{$ENDIF}
  
{$ENDIF}

procedure TCustomSynEdit.UpdateCaret;
var
  
CXCYInteger;
{$IFDEF SYN_MBCSSUPPORT}
{$IFDEF MSWINDOWS} // ADD DEKO
  
cfTCompositionForm;
{$ENDIF} // ADD DEKO
{$ENDIF}
 
...
{$IFDEF SYN_MBCSSUPPORT}
  
{$IFDEF MSWINDOWS} // ADD DEKO
    
cf.dwStyle :CFS_POINT;
    
cf.ptCurrentPos :Point(CXCY);
    
ImmSetCompositionWindow(ImmGetContext(Handle)@cf);
  
{$ENDIF}           // ADD DEKO
{$ENDIF}

procedure TCustomSynEdit.KeyDown(var KeyWordShiftTShiftState);
 ...
{$IFDEF SYN_LINUX}
  
// uniform Keycode: key has the same value wether Shift is pressed or not
//if Key <= 255 then // MOD DEKO
  
if Char(Keyin ['a'..'z'then // MOD DEKO
  
begin
    
Code :XKeysymToKeycode(Xlib.PDisplay(QtDisplay)Key);
    
Key :XKeycodeToKeysym(Xlib.PDisplay(QtDisplay)Code0);
    
if Char(Keyin ['a'..'z'then Key :Ord(UpCase(Char(Key)));
  
end;
  
{$ENDIF}
...

{$IFDEF SYN_MBCSSUPPORT}
{$IFDEF MSWINDOWS}  // ADD DEKO
procedure TCustomSynEdit.WMImeComposition(var MsgTMessage);
...
procedure TCustomSynEdit.WMImeNotify(var MsgTMessage);
...
{$ENDIF}            // ADD DEKO
{$ENDIF}

 [SynEdit.Inc]
{------------------------------------------------------------------------------}
{ Please change this to suit your needs }
{------------------------------------------------------------------------------}
 
...
//{$IFNDEF SYN_CLX} // DEL DEKO
{$DEFINE SYN_MBCSSUPPORT}
//{$ENDIF} // DEL DEKO

 [SynEditMiscProcs.pas]

uses
{$IFDEF SYN_CLX}
 
...
  
ImmDmy,  // ADD DEKO
{$ELSE}

 要はimm.pasに依存する部分を削除しているだけだ。そして、MBCSキャレットのキモである「GetStringTypeEx」をどうにかするために、「ImmDmy.pas」を新規に追加する。

 [ImmDmy.pas]

unit ImmDmy;

interface

uses
  
ClassesSysUtils;

const
{ CType 3 Flag Bits. }

  
{$EXTERNALSYM C3_NONSPACING}
  
C3_NONSPACING 1{ nonspacing character }
  
{$EXTERNALSYM C3_DIACRITIC}
  
C3_DIACRITIC 2{ diacritic mark }
  
{$EXTERNALSYM C3_VOWELMARK}
  
C3_VOWELMARK 4{ vowel mark }
  
{$EXTERNALSYM C3_SYMBOL}
  
C3_SYMBOL 8{ symbols }
  
{$EXTERNALSYM C3_KATAKANA}
  
C3_KATAKANA $0010{ katakana character }
  
{$EXTERNALSYM C3_HIRAGANA}
  
C3_HIRAGANA $0020{ hiragana character }
  
{$EXTERNALSYM C3_HALFWIDTH}
  
C3_HALFWIDTH $0040{ half width character }
  
{$EXTERNALSYM C3_FULLWIDTH}
  
C3_FULLWIDTH $0080{ full width character }
  
{$EXTERNALSYM C3_IDEOGRAPH}
  
C3_IDEOGRAPH $0100{ ideographic character }
  
{$EXTERNALSYM C3_KASHIDA}
  
C3_KASHIDA $0200{ Arabic kashida character }
  
{$EXTERNALSYM C3_LEXICAL}
  
C3_LEXICAL $0400{ lexical character }
  
{$EXTERNALSYM C3_ALPHA}
  
C3_ALPHA $8000{ any linguistic char (C1_ALPHA) }
  
{$EXTERNALSYM C3_NOTAPPLICABLE}
  
C3_NOTAPPLICABLE 0{ ctype 3 is not applicable }

{ Primary language IDs. }

  
LANG_NEUTRAL                         $00;
  
{$EXTERNALSYM LANG_NEUTRAL}

  
LANG_AFRIKAANS                       $36;
  
{$EXTERNALSYM LANG_AFRIKAANS}
  
LANG_ALBANIAN                        $1c;
  
{$EXTERNALSYM LANG_ALBANIAN}
  
LANG_ARABIC                          $01;
  
{$EXTERNALSYM LANG_ARABIC}
  
LANG_BASQUE                          $2d;
  
{$EXTERNALSYM LANG_BASQUE}
  
LANG_BELARUSIAN                      $23;
  
{$EXTERNALSYM LANG_BELARUSIAN}
  
LANG_BULGARIAN                       $02;
  
{$EXTERNALSYM LANG_BULGARIAN}
  
LANG_CATALAN                         $03;
  
{$EXTERNALSYM LANG_CATALAN}
  
LANG_CHINESE                         $04;
  
{$EXTERNALSYM LANG_CHINESE}
  
LANG_CROATIAN                        $1a;
  
{$EXTERNALSYM LANG_CROATIAN}
  
LANG_CZECH                           $05;
  
{$EXTERNALSYM LANG_CZECH}
  
LANG_DANISH                          $06;
  
{$EXTERNALSYM LANG_DANISH}
  
LANG_DUTCH                           $13;
  
{$EXTERNALSYM LANG_DUTCH}
  
LANG_ENGLISH                         $09;
  
{$EXTERNALSYM LANG_ENGLISH}
  
LANG_ESTONIAN                        $25;
  
{$EXTERNALSYM LANG_ESTONIAN}
  
LANG_FAEROESE                        $38;
  
{$EXTERNALSYM LANG_FAEROESE}
  
LANG_FARSI                           $29;
  
{$EXTERNALSYM LANG_FARSI}
  
LANG_FINNISH                         $0b;
  
{$EXTERNALSYM LANG_FINNISH}
  
LANG_FRENCH                          $0c;
  
{$EXTERNALSYM LANG_FRENCH}
  
LANG_GERMAN                          $07;
  
{$EXTERNALSYM LANG_GERMAN}
  
LANG_GREEK                           $08;
  
{$EXTERNALSYM LANG_GREEK}
  
LANG_HEBREW                          $0d;
  
{$EXTERNALSYM LANG_HEBREW}
  
LANG_HUNGARIAN                       $0e;
  
{$EXTERNALSYM LANG_HUNGARIAN}
  
LANG_ICELANDIC                       $0f;
  
{$EXTERNALSYM LANG_ICELANDIC}
  
LANG_INDONESIAN                      $21;
  
{$EXTERNALSYM LANG_INDONESIAN}
  
LANG_ITALIAN                         $10;
  
{$EXTERNALSYM LANG_ITALIAN}
  
LANG_JAPANESE                        $11;
  
{$EXTERNALSYM LANG_JAPANESE}
  
LANG_KOREAN                          $12;
  
{$EXTERNALSYM LANG_KOREAN}
  
LANG_LATVIAN                         $26;
  
{$EXTERNALSYM LANG_LATVIAN}
  
LANG_LITHUANIAN                      $27;
  
{$EXTERNALSYM LANG_LITHUANIAN}
  
LANG_NORWEGIAN                       $14;
  
{$EXTERNALSYM LANG_NORWEGIAN}
  
LANG_POLISH                          $15;
  
{$EXTERNALSYM LANG_POLISH}
  
LANG_PORTUGUESE                      $16;
  
{$EXTERNALSYM LANG_PORTUGUESE}
  
LANG_ROMANIAN                        $18;
  
{$EXTERNALSYM LANG_ROMANIAN}
  
LANG_RUSSIAN                         $19;
  
{$EXTERNALSYM LANG_RUSSIAN}
  
LANG_SERBIAN                         $1a;
  
{$EXTERNALSYM LANG_SERBIAN}
  
LANG_SLOVAK                          $1b;
  
{$EXTERNALSYM LANG_SLOVAK}
  
LANG_SLOVENIAN                       $24;
  
{$EXTERNALSYM LANG_SLOVENIAN}
  
LANG_SPANISH                         $0a;
  
{$EXTERNALSYM LANG_SPANISH}
  
LANG_SWEDISH                         $1d;
  
{$EXTERNALSYM LANG_SWEDISH}
  
LANG_THAI                            $1e;
  
{$EXTERNALSYM LANG_THAI}
  
LANG_TURKISH                         $1f;
  
{$EXTERNALSYM LANG_TURKISH}
  
LANG_UKRAINIAN                       $22;
  
{$EXTERNALSYM LANG_UKRAINIAN}
  
LANG_VIETNAMESE                      $2a;
  
{$EXTERNALSYM LANG_VIETNAMESE}


{ Sublanguage IDs. }

  
{ The name immediately following SUBLANG_ dictates which primary
    
language ID that sublanguage ID can be combined with to form a
    
valid language ID. }

  
SUBLANG_NEUTRAL                      $00;    { language neutral }
  
{$EXTERNALSYM SUBLANG_NEUTRAL}
  
SUBLANG_DEFAULT                      $01;    { user default }
  
{$EXTERNALSYM SUBLANG_DEFAULT}
  
SUBLANG_SYS_DEFAULT                  $02;    { system default }
  
{$EXTERNALSYM SUBLANG_SYS_DEFAULT}

  
SUBLANG_ARABIC_SAUDI_ARABIA          $01;    { Arabic (Saudi Arabia) }
  
{$EXTERNALSYM SUBLANG_ARABIC_SAUDI_ARABIA}
  
SUBLANG_ARABIC_IRAQ                  $02;    { Arabic (Iraq) }
  
{$EXTERNALSYM SUBLANG_ARABIC_IRAQ}
  
SUBLANG_ARABIC_EGYPT                 $03;    { Arabic (Egypt) }
  
{$EXTERNALSYM SUBLANG_ARABIC_EGYPT}
  
SUBLANG_ARABIC_LIBYA                 $04;    { Arabic (Libya) }
  
{$EXTERNALSYM SUBLANG_ARABIC_LIBYA}
  
SUBLANG_ARABIC_ALGERIA               $05;    { Arabic (Algeria) }
  
{$EXTERNALSYM SUBLANG_ARABIC_ALGERIA}
  
SUBLANG_ARABIC_MOROCCO               $06;    { Arabic (Morocco) }
  
{$EXTERNALSYM SUBLANG_ARABIC_MOROCCO}
  
SUBLANG_ARABIC_TUNISIA               $07;    { Arabic (Tunisia) }
  
{$EXTERNALSYM SUBLANG_ARABIC_TUNISIA}
  
SUBLANG_ARABIC_OMAN                  $08;    { Arabic (Oman) }
  
{$EXTERNALSYM SUBLANG_ARABIC_OMAN}
  
SUBLANG_ARABIC_YEMEN                 $09;    { Arabic (Yemen) }
  
{$EXTERNALSYM SUBLANG_ARABIC_YEMEN}
  
SUBLANG_ARABIC_SYRIA                 $0a;    { Arabic (Syria) }
  
{$EXTERNALSYM SUBLANG_ARABIC_SYRIA}
  
SUBLANG_ARABIC_JORDAN                $0b;    { Arabic (Jordan) }
  
{$EXTERNALSYM SUBLANG_ARABIC_JORDAN}
  
SUBLANG_ARABIC_LEBANON               $0c;    { Arabic (Lebanon) }
  
{$EXTERNALSYM SUBLANG_ARABIC_LEBANON}
  
SUBLANG_ARABIC_KUWAIT                $0d;    { Arabic (Kuwait) }
  
{$EXTERNALSYM SUBLANG_ARABIC_KUWAIT}
  
SUBLANG_ARABIC_UAE                   $0e;    { Arabic (U.A.E) }
  
{$EXTERNALSYM SUBLANG_ARABIC_UAE}
  
SUBLANG_ARABIC_BAHRAIN               $0f;    { Arabic (Bahrain) }
  
{$EXTERNALSYM SUBLANG_ARABIC_BAHRAIN}
  
SUBLANG_ARABIC_QATAR                 $10;    { Arabic (Qatar) }
  
{$EXTERNALSYM SUBLANG_ARABIC_QATAR}
  
SUBLANG_CHINESE_TRADITIONAL          $01;    { Chinese (Taiwan) }
  
{$EXTERNALSYM SUBLANG_CHINESE_TRADITIONAL}
  
SUBLANG_CHINESE_SIMPLIFIED           $02;    { Chinese (PR China) }
  
{$EXTERNALSYM SUBLANG_CHINESE_SIMPLIFIED}
  
SUBLANG_CHINESE_HONGKONG             $03;    { Chinese (Hong Kong) }
  
{$EXTERNALSYM SUBLANG_CHINESE_HONGKONG}
  
SUBLANG_CHINESE_SINGAPORE            $04;    { Chinese (Singapore) }
  
{$EXTERNALSYM SUBLANG_CHINESE_SINGAPORE}
  
SUBLANG_DUTCH                        $01;    { Dutch }
  
{$EXTERNALSYM SUBLANG_DUTCH}
  
SUBLANG_DUTCH_BELGIAN                $02;    { Dutch (Belgian) }
  
{$EXTERNALSYM SUBLANG_DUTCH_BELGIAN}
  
SUBLANG_ENGLISH_US                   $01;    { English (USA) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_US}
  
SUBLANG_ENGLISH_UK                   $02;    { English (UK) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_UK}
  
SUBLANG_ENGLISH_AUS                  $03;    { English (Australian) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_AUS}
  
SUBLANG_ENGLISH_CAN                  $04;    { English (Canadian) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_CAN}
  
SUBLANG_ENGLISH_NZ                   $05;    { English (New Zealand) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_NZ}
  
SUBLANG_ENGLISH_EIRE                 $06;    { English (Irish) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_EIRE}
  
SUBLANG_ENGLISH_SOUTH_AFRICA         $07;    { English (South Africa) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_SOUTH_AFRICA}
  
SUBLANG_ENGLISH_JAMAICA              $08;    { English (Jamaica) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_JAMAICA}
  
SUBLANG_ENGLISH_CARIBBEAN            $09;    { English (Caribbean) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_CARIBBEAN}
  
SUBLANG_ENGLISH_BELIZE               $0a;    { English (Belize) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_BELIZE}
  
SUBLANG_ENGLISH_TRINIDAD             $0b;    { English (Trinidad) }
  
{$EXTERNALSYM SUBLANG_ENGLISH_TRINIDAD}
  
SUBLANG_FRENCH                       $01;    { French }
  
{$EXTERNALSYM SUBLANG_FRENCH}
  
SUBLANG_FRENCH_BELGIAN               $02;    { French (Belgian) }
  
{$EXTERNALSYM SUBLANG_FRENCH_BELGIAN}
  
SUBLANG_FRENCH_CANADIAN              $03;    { French (Canadian) }
  
{$EXTERNALSYM SUBLANG_FRENCH_CANADIAN}
  
SUBLANG_FRENCH_SWISS                 $04;    { French (Swiss) }
  
{$EXTERNALSYM SUBLANG_FRENCH_SWISS}
  
SUBLANG_FRENCH_LUXEMBOURG            $05;    { French (Luxembourg) }
  
{$EXTERNALSYM SUBLANG_FRENCH_LUXEMBOURG}
  
SUBLANG_GERMAN                       $01;    { German }
  
{$EXTERNALSYM SUBLANG_GERMAN}
  
SUBLANG_GERMAN_SWISS                 $02;    { German (Swiss) }
  
{$EXTERNALSYM SUBLANG_GERMAN_SWISS}
  
SUBLANG_GERMAN_AUSTRIAN              $03;    { German (Austrian) }
  
{$EXTERNALSYM SUBLANG_GERMAN_AUSTRIAN}
  
SUBLANG_GERMAN_LUXEMBOURG            $04;    { German (Luxembourg) }
  
{$EXTERNALSYM SUBLANG_GERMAN_LUXEMBOURG}
  
SUBLANG_GERMAN_LIECHTENSTEIN         $05;    { German (Liechtenstein) }
  
{$EXTERNALSYM SUBLANG_GERMAN_LIECHTENSTEIN}
  
SUBLANG_ITALIAN                      $01;    { Italian }
  
{$EXTERNALSYM SUBLANG_ITALIAN}
  
SUBLANG_ITALIAN_SWISS                $02;    { Italian (Swiss) }
  
{$EXTERNALSYM SUBLANG_ITALIAN_SWISS}
  
SUBLANG_KOREAN                       $01;    { Korean (Extended Wansung) }
  
{$EXTERNALSYM SUBLANG_KOREAN}
  
SUBLANG_KOREAN_JOHAB                 $02;    { Korean (Johab) }
  
{$EXTERNALSYM SUBLANG_KOREAN_JOHAB}
  
SUBLANG_NORWEGIAN_BOKMAL             $01;    { Norwegian (Bokmal) }
  
{$EXTERNALSYM SUBLANG_NORWEGIAN_BOKMAL}
  
SUBLANG_NORWEGIAN_NYNORSK            $02;    { Norwegian (Nynorsk) }
  
{$EXTERNALSYM SUBLANG_NORWEGIAN_NYNORSK}
  
SUBLANG_PORTUGUESE                   $02;    { Portuguese }
  
{$EXTERNALSYM SUBLANG_PORTUGUESE}
  
SUBLANG_PORTUGUESE_BRAZILIAN         $01;    { Portuguese (Brazilian) }
  
{$EXTERNALSYM SUBLANG_PORTUGUESE_BRAZILIAN}
  
SUBLANG_SERBIAN_LATIN                $02;    { Serbian (Latin) }
  
{$EXTERNALSYM SUBLANG_SERBIAN_LATIN}
  
SUBLANG_SERBIAN_CYRILLIC             $03;    { Serbian (Cyrillic) }
  
{$EXTERNALSYM SUBLANG_SERBIAN_CYRILLIC}
  
SUBLANG_SPANISH                      $01;    { Spanish (Castilian) }
  
{$EXTERNALSYM SUBLANG_SPANISH}
  
SUBLANG_SPANISH_MEXICAN              $02;    { Spanish (Mexican) }
  
{$EXTERNALSYM SUBLANG_SPANISH_MEXICAN}
  
SUBLANG_SPANISH_MODERN               $03;    { Spanish (Modern) }
  
{$EXTERNALSYM SUBLANG_SPANISH_MODERN}
  
SUBLANG_SPANISH_GUATEMALA            $04;    { Spanish (Guatemala) }
  
{$EXTERNALSYM SUBLANG_SPANISH_GUATEMALA}
  
SUBLANG_SPANISH_COSTA_RICA           $05;    { Spanish (Costa Rica) }
  
{$EXTERNALSYM SUBLANG_SPANISH_COSTA_RICA}
  
SUBLANG_SPANISH_PANAMA               $06;    { Spanish (Panama) }
  
{$EXTERNALSYM SUBLANG_SPANISH_PANAMA}
  
SUBLANG_SPANISH_DOMINICAN_REPUBLIC     $07;  { Spanish (Dominican Republic) }
  
{$EXTERNALSYM SUBLANG_SPANISH_DOMINICAN_REPUBLIC}
  
SUBLANG_SPANISH_VENEZUELA            $08;    { Spanish (Venezuela) }
  
{$EXTERNALSYM SUBLANG_SPANISH_VENEZUELA}
  
SUBLANG_SPANISH_COLOMBIA             $09;    { Spanish (Colombia) }
  
{$EXTERNALSYM SUBLANG_SPANISH_COLOMBIA}
  
SUBLANG_SPANISH_PERU                 $0a;    { Spanish (Peru) }
  
{$EXTERNALSYM SUBLANG_SPANISH_PERU}
  
SUBLANG_SPANISH_ARGENTINA            $0b;    { Spanish (Argentina) }
  
{$EXTERNALSYM SUBLANG_SPANISH_ARGENTINA}
  
SUBLANG_SPANISH_ECUADOR              $0c;    { Spanish (Ecuador) }
  
{$EXTERNALSYM SUBLANG_SPANISH_ECUADOR}
  
SUBLANG_SPANISH_CHILE                $0d;    { Spanish (Chile) }
  
{$EXTERNALSYM SUBLANG_SPANISH_CHILE}
  
SUBLANG_SPANISH_URUGUAY              $0e;    { Spanish (Uruguay) }
  
{$EXTERNALSYM SUBLANG_SPANISH_URUGUAY}
  
SUBLANG_SPANISH_PARAGUAY             $0f;    { Spanish (Paraguay) }
  
{$EXTERNALSYM SUBLANG_SPANISH_PARAGUAY}
  
SUBLANG_SPANISH_BOLIVIA              $10;    { Spanish (Bolivia) }
  
{$EXTERNALSYM SUBLANG_SPANISH_BOLIVIA}
  
SUBLANG_SPANISH_EL_SALVADOR          $11;    { Spanish (El Salvador) }
  
{$EXTERNALSYM SUBLANG_SPANISH_EL_SALVADOR}
  
SUBLANG_SPANISH_HONDURAS             $12;    { Spanish (Honduras) }
  
{$EXTERNALSYM SUBLANG_SPANISH_HONDURAS}
  
SUBLANG_SPANISH_NICARAGUA            $13;    { Spanish (Nicaragua) }
  
{$EXTERNALSYM SUBLANG_SPANISH_NICARAGUA}
  
SUBLANG_SPANISH_PUERTO_RICO          $14;    { Spanish (Puerto Rico) }
  
{$EXTERNALSYM SUBLANG_SPANISH_PUERTO_RICO}
  
SUBLANG_SWEDISH                      $01;    { Swedish }
  
{$EXTERNALSYM SUBLANG_SWEDISH}
  
SUBLANG_SWEDISH_FINLAND              $02;    { Swedish (Finland) }
  
{$EXTERNALSYM SUBLANG_SWEDISH_FINLAND}

{ Sorting IDs. }

  
SORT_DEFAULT                         $0;     { sorting default }
  
{$EXTERNALSYM SORT_DEFAULT}

  
SORT_JAPANESE_XJIS                   $0;     { Japanese XJIS order }
  
{$EXTERNALSYM SORT_JAPANESE_XJIS}
  
SORT_JAPANESE_UNICODE                $1;     { Japanese Unicode order }
  
{$EXTERNALSYM SORT_JAPANESE_UNICODE}

  
SORT_CHINESE_BIG5                    $0;     { Chinese BIG5 order }
  
{$EXTERNALSYM SORT_CHINESE_BIG5}
  
SORT_CHINESE_PRCP                    $0;     { PRC Chinese Phonetic order }
  
{$EXTERNALSYM SORT_CHINESE_PRCP}
  
SORT_CHINESE_UNICODE                 $1;     { Chinese Unicode order }
  
{$EXTERNALSYM SORT_CHINESE_UNICODE}
  
SORT_CHINESE_PRC                     $2;     { PRC Chinese Stroke Count order }
  
{$EXTERNALSYM SORT_CHINESE_PRC}

  
SORT_KOREAN_KSC                      $0;     { Korean KSC order }
  
{$EXTERNALSYM SORT_KOREAN_KSC}
  
SORT_KOREAN_UNICODE                  $1;     { Korean Unicode order }
  
{$EXTERNALSYM SORT_KOREAN_UNICODE}

  
SORT_GERMAN_PHONE_BOOK               $1;     { German Phone Book order }
  
{$EXTERNALSYM SORT_GERMAN_PHONE_BOOK}

{ Default System and User IDs for language and locale. }

  
LANG_SYSTEM_DEFAULT   (SUBLANG_SYS_DEFAULT shl 10or LANG_NEUTRAL;
  
{$EXTERNALSYM LANG_SYSTEM_DEFAULT}
  
LANG_USER_DEFAULT     (SUBLANG_DEFAULT shl 10or LANG_NEUTRAL;
  
{$EXTERNALSYM LANG_USER_DEFAULT}

  
LOCALE_SYSTEM_DEFAULT (SORT_DEFAULT shl 16or LANG_SYSTEM_DEFAULT;
  
{$EXTERNALSYM LOCALE_SYSTEM_DEFAULT}
  
LOCALE_USER_DEFAULT   (SORT_DEFAULT shl 16or LANG_USER_DEFAULT;
  
{$EXTERNALSYM LOCALE_USER_DEFAULT}

{ Character Type Flags. }

  
{$EXTERNALSYM CT_CTYPE1}
  
CT_CTYPE1 1{ ctype 1 information }
  
{$EXTERNALSYM CT_CTYPE2}
  
CT_CTYPE2 2{ ctype 2 information }
  
{$EXTERNALSYM CT_CTYPE3}
  
CT_CTYPE3 4{ ctype 3 information }

  
LeadBytes [#$A1..#$FE];    // EUC-JP

  
function GetStringTypeEx(LocaleCardinaldwInfoTypeCardinallpSrcStrPAnsiChar;
cchSrc
Integervar pCharTypearray of word)LongBool;

implementation

function GetStringTypeEx(LocaleCardinaldwInfoTypeCardinallpSrcStrPAnsiChar;
 
cchSrcIntegervar pCharTypearray of word)LongBool;
// http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_getstringtypeex.asp
var
  
i:Integer;
  
s:String;
  
w:WideString;
begin
  
// ロケール(Locale)を元に
  
// テキスト処理情報を取得(CT_CTYPE3)する。 -> 完全無視(^^;
  
// Ansi文字列(lpSrcStr)を
  
// Unicodeの配列(pCharType)へ格納。
  
:StrPas(lpSrcStr);
  
for i:=to Length(w)-1 do
    
pCharType[i:Word(w[i+1]);
  
result :True;
end;

end.

 EUC完全依存だがGetStringTypeEx()が呼び出される事は まずない(では何故実装したかと言うと、主にエラー回避^^;)し、最悪ここだけどうにかすればいい訳で...。日本語のみを対象、しかも IBConsole専用ならこの実装で充分だろう。テキスト中に2バイト文字が含まれていても文字単位で削除、移動が可能だ。選択時のキャレットが若干おかしい事があるが、 これはSynEditが文字幅の取得を間違っているのだろう...あまり気にならないとは思うが。

IBConsole 日本語版+α
 て、事で更新。

[更新履歴]

rel.34〜rel.35(Linux)

・「インタラクティブSQL」で日本語入力を可能にした。
 (ほぼ違和感なし)
・"UnOfficial VisualCLX Patch for Kylix3 (v3.11pre)"を導入。
・「インタラクティブSQL」で暫定的に日本語入力を可能にした。
・TListViewのレイアウトを変更した。

 今回の更新はLinux版のみとなります。

やわらか戦車
 「6」で感じていた違和感がなんだったのか、やっと解った。空港から飛行機が飛び立つときに、

松崎しげるのココロは一つ、"日焼けしたい!!"・"日焼けしたい!!"

  と、3兄弟がハシャいで歌っているが、この部分だ。このフレーズは、「松崎しげる、松崎しげる、松崎しげるの〜」と始まるのだが、最初の2回の「松崎しげ る」の音階は「やわらか戦車」の曲には存在しない。「まーつざっき・しっげるー、まーつざっき・しっげるー」の部分...これって、

「くぅーわがった・つまみぃー、くぅーわがった・つまみぃー」

 じゃないか。どうりで違和感を覚えた訳だ。

06/10/23

・ばってん荒川
 亡くなられたようだ。"彼"の芸風のせいか熊本弁でお悔やみコメントを付けているヒトが多いが、

まうごつ悲しか

  は駄目だろう。「まうごつ」は「舞うように/小躍りしたい位」という意味だ。だから、まうごつは"嬉しい時限定"なんだよ。似たようなのに「はうごつ」と いうのがあるが、こちらは「這うごつ」...つまり「這うように/立ってはいられない程に」という意味だ。悲しいのならこちらが適している。「〜ごつ」は 比喩表現で、「〜のように(とても)」という意味だ。「まうごつ美味か(とても美味しい)」とか「はうごつキツか(とてもきつい)」が正しい使い方だ。

 "比喩の元なっているもの"を無視して「とても」という意味で「まうごつ」を使いたがるバカが多いから始末に終えない。

 ちなみに「なばんごつ」というのがあるが、これは「ナバのように」という意味。 「ナバ」はキノコの事(狭義ではシイタケの事)。キノコは生え出すとワラワラと大量に生えるので「なばんごつ」という言葉がある。意訳すると「キノコが群 生しているようにとても(大量に)」という意味だ。こちらは数が多い時に使う。「なばんごつ叩いた」は「タコ殴りにした」と同義だ。

 熊本弁を愛し、芸風にしていたばってん荒川さんに対して、間違った熊本弁でお悔やみ申し上げるとは何事だ。

06/10/25

やわらか戦車8
 放映中。退却アクセも買いました。シークレットだった「ベイベ(ピンク-クリーナ)」も所持していますが、「8」にも出てましたね。あのベイベ(黄色)は一体...?

Firefox2.0
 リリースされましたが、RC3がそのまま昇格したようですね。

NTT西日本
 当社もひかり電話です。今日で障害発生3日目。お客さんからの電話が全くないのは

静かでいいけどさ。

 ...そういう問題じゃないだろうが。メールが遅延するのもコレの影響か?

AVG Anti-Virus 7.5
 リリースされています。7.5へのアップデートでは再起動が必要です。7.1から7.5へ自動でアップデートされる事はありません。

06/10/31

履修漏れ
 残るは熊本のみ...ですか。熊本は以前、私立高校で履修漏れ(逃れ)が発覚したために早期に修正されてるだけですが、それでも"この時期"に比べれば遥かにマシですな(発覚は確か今年の5月でしたね)。

IE7
 日本語版は明日辺りですか。「IE5.5(6)以降でご覧下さい」なページのどれだけが「IE5.5(6)でご覧下さい」に修正が必要なのだろうか。

Windows Media Player 11 正式版
 英語版がリリースされました。日本語版は"来年1月のコンシューマ向けVista発売と同時"だそうで。

 ...IE7もそうだけど、英語版と同時リリースできないのって

単なるサボりじゃないの?

 β やRCは何ヶ月も前からある訳で。日本語への翻訳をイチからやり始める訳じゃなし、何でそんなにタイムラグがあるのか理解不能。MSDNの翻訳具合といい (XP出てから何年経ったと思ってるの?)、こと"日本語リソースの提供"という面では最悪。いっそWikiかなんかで日本語へのトランスレートをボラン ティアに依頼すればいいのに。

 もし、Windows Media Player 11の遅れが、関連サービスの立ち上げ時期に関係するものであったとしても、そんなもん後でどうにでもできるだろうに。Windows Media Player 11が早期に提供されるとVistaの売り上げに影響するとでも思ってるのだろうか?それとも、面倒なのでVista用のWindows Media Player 11と同時に作業してるのだろうか?

 ...まるで、8月末になって慌てて夏休みの宿題をやっている小学生のようだ。


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