« 2008年2月 | トップページ | 2008年4月 »

2008年3月

2008年3月30日 (日)

V1.1.6.49リリース

色々細かい修正・調整をしました。

主な変更はデータベース管理ウィンドウのカラムヘッダにポップアップメニューを割り当てました。右クリックで表示されます。

V11649_1_2

「グループ化ボックス」でグループ化ボックスが表示されるので、これによりグルーピングができるようになります。

V11649_2 

基本的にデータベース管理ウィンドウ上のグリッドだけですが、実験的に、「SQL履歴」ウィンドウのグリッドにもポップアップメニューを割り当てておきました。

V11649_3

以上です。他の細かな修正・変更はreadme.txtを・・

2008年3月26日 (水)

V1.1.5.46リリース

V1.1.5.46をリリースしました。

「データベース情報」ウィンドウを追加しました。

V11546_1

V11546_2

とりあえず、初期化パラメータ(V$SYSTEM_PARAMETER)とREDOログ(V$LOG,V$LOGFILE)の情報が表示されます。

これからしばらく、今まで追加したウィンドウの手直し・バグフィックスを主に行っていこうかと思います。

というか燃え尽きたbearing

2008年3月22日 (土)

V1.1.4.40リリース

V1.1.4.40をリリースしました。

「表領域情報」ウィンドウを追加しました。

V11440_1

V11440_2

ウィンドウ上部には「表領域一覧」が使用済み・空き領域・使用率とともに表示されます。DBA_TABLESPACESDBA_EXTENTSDBA_FREE_SPACEビューを参照して求めてます。環境次第ではウィンドウを開くのに時間がかかります。

ウィンドウ下部には「表領域一覧」で選択した表領域の情報が表示されます。「データファイル」には表領域に含まれるデータファイルが表示されます。DBA_DATA_FILESビューの内容です。

V11440_3

左端の展開ボタンを押すと展開されます。

V11440_4 

ファイルのIO統計が表示れます。これはV$FILESTATビューの内容です。

残りの「セグメント」「空き領域」には、表領域に含まれるセグメント、空き領域が表示されます。DBA_SEGMENTSDBA_FREE_SPACEビューの内容です。

V11440_5

エクストテントの情報も見たければ、ツールバーメニューから

V11440_6

「エクステント」にチェックを入れて「更新」ボタンを押します。すると

V11440_7

のように更に展開できるようになります。通常は、エクステントの情報を見る必要はないと思うのでデフォルトでオフになっています。(というより、セグメントと空き領域も必要ないか。)

一時表領域については、専用のビューDBA_TEMP_FILESなど別ビューになっているので現状は一部が全く表示されません。というのも、マニュアルを見るとOracle8にその機能(ビュー)がないのでどどう実装しようかなぁ・・・と悩んでますsad

2008年3月20日 (木)

V1.1.3.35リリース

V1.1.3.35をリリースしました。

「ロール情報」を後回しにすると書きましたが、やっぱ、簡単なウィンドウからと言うことで「ロール情報」ウィンドウを追加しました。

V11335_1

V11335_2

DBA_ROLESビューの内容が表示されます。「ユーザー情報」ウィンドウとウィンドウ下部は同じで上で選択されたロールに付与されているシステム権限、オブジェクト権限が表示されます。ロールには更に別のロールも付与することができるので、更にDBA_ROLE_PRIVSビューの内容が「ロール」タブに表示されます。「ユーザー情報」ウィンドウにも「ロール」タブを追加しておきました。

後、「データベースエクスプローラ」「オブジェクトインスペクタ」「SQL履歴」の各ウィンドウ上で「インクリメンタルサーチ」ができるようになりました。使い方はここを参照。変更内容の詳細はreadme.txtを見て下さい。

2008年3月18日 (火)

V1.1.2.30リリース

V1.1.2.30をリリースしました。

「プロファイル情報」ウィンドウを追加しました。

V11230_1

V11230_2

DBA_PROFILESビューの内容が表示されます。他のウィンドウもそうですがただビューの内容をそのまま表示するだけなら、「SQLエディタ」でビューに対してSELECT文を発行するのと変わらないので、下のグリッドの「説明」欄に日本語での説明を付けておきました。

GUIを変更したのですが、既存のウィンドウのGUIもそれに合わせて変更してあります。

簡単なウィンドウから作ってるのですが、次からは結構大変そうcatface「データベース情報」「SGA情報」「表領域情報」当たりが山場です。はは。

「ロール情報」はパスして、次は「表領域情報」か「UNDO情報」ウィンドウをあたりに取り掛かる予定・・

2008年3月17日 (月)

うむ。

あれから、色々悩んでました。データベース管理ウィンドウの画面構成を変える方向で行こうかなと今思ってます。

前回、「自動更新」機能をこれから追加していくすべての画面に付けると書いたが、これも必要な画面だけにしようかなと。今まで無節操に後先考えずに画面を追加してたけど、色々画面構成などをまとめてました。

  • データベース情報(V1.1.5.46で追加済み)
  • SGA情報
  • 表領域情報(V1.1.4.40で追加済み)
  • UNDO(ロールバック)情報
  • ユーザー情報(V1.1.1.24で追加済み)
  • ロール情報(V1.1.3.35で追加済み)
  • プロファイル情報(V1.1.2.30で追加済み)
  • セッション情報(V1.1.0.13で追加済み)
  • ロック情報(V1.1.0.19で追加済み)

とりあえず、こんな感じかなと。赤色は既に追加した画面です(といっても、内部的には作り直す予定だけど)。参照するビューも洗い出していました。DBXInspectorの作業は今月いっぱいで一区切り付けたいので、後、2週間しかないbearing最低、上記の8割は終わればいいかなと・・・

画面構成で各グリッドがOracleのどのビューを参照してるか知りたい場合もあると思うので、そこらへんの情報をステータスバーを追加してそこに表示しようかなとも考えてます。

2008年3月15日 (土)

V1.1.1.24リリース

V1.1.1.24をリリースしました。あまりバージョン番号の事を考えていなかったのですが、3つ目の番号がリリース番号を表すとのことで、これからリリースする度に、リリース番号を1増やしていこうと思いますbearing

ということで、新たに「ユーザー情報」ウィンドウを追加しました。

V11124_1

V11124_2

DBA_USERSビューの内容が表示されます。ウィンドウの下部には、「ユーザー一覧」グリッドで選択されたユーザーに付与されているシステム権限オブジェクト権限が表示されます。それぞれ、DBA_SYS_PRIVSDBA_TAB_PRIVSDBA_COL_PRIVSビューの内容です。というより、「セッション情報」「ロック情報」ウィンドウと同じような画面で味気ないですがweep

今回はDBA_で始まる静的データディクショナリビューと呼ばれるビューを参照して、「セッション情報」ウィンドウなどが参照しているV$で始まる動的パフォーマンスビューに比べると文字通り「静的」な情報で頻繁に更新する必要がないと思いますが、GUIを合わせるため「自動更新」機能がついてます。

というより、今後もすべてのウィンドウに「自動更新」機能を付けますが、無茶な使い方はしないで下さい。どうなるかマジで想像できません。ははは。wobbly

後、これに付与されているロールの情報とクォータの情報を追加しようかなと思ってます。

2008年3月13日 (木)

V1.1.0.19リリース

3日連続bearingですが、V1.1.0.19をリリースしました。

「ロック情報」ウィンドウを追加しました。

V11019_1_2

V11019_2

V$LOCKビューの内容が表示されます。GUIの方は、「セッション情報」ウィンドウに合わせているので、「自動更新」などもできます。他のロック要求をブロックしているロックはブロッキングロックとして赤色で表示されます。

ということで、試しにロック競合を発生させてみます。SCOTTユーザーで接続し、DEPT表のDEPTNO列が10の行を更新します。トランザクションはコミットしません。

V11019_3

この状態で、更に別のセッションから同じ行の更新を試みます。

V11019_4

NOWAITオプションを指定してないので待たされています。この状態で「ロック情報」ウィンドウを見てみます。

V11019_5

ロック競合が発生してます。ロックタイプTXは行ロックを表しますが、選択反転されたセッションIDが20のセッションがSCOTT.DEPT表に排他行ロックを取得しようとしてますが、既にセッションIDが37のセッションが該当行の排他行ロックを保持しているためロック競合が発生しています。

というより、ロックタイプでトランザクションエンキューとか表示するより、行ロックとかと表示した方がわかりやすいのかも・・

こんな感じです。

後、「セッション情報」ウィンドウに「更新項目」ボタンを追加しておきました。

V11019_6

更新や自動更新時に更新する項目を設定できるようにしておきました。

というかネタが付きてきた。次はどうしよう・・

2008年3月12日 (水)

V1.1.0.16リリース

昨日の今日ですが、V1.1.0.16をリリースしました。

「セッション情報」ウィンドウに「自動更新」機能を追加しました。

V11016_1

これによって、情報の自動更新ができます。「更新間隔」には、更新する間隔を秒単位で1-65536の範囲で指定できます。更新される度に、フォーカスが先頭のレコードに移動するので、特定のレコードを監視するには、フィルタ機能と組み合わせて使うと便利です。

例えば、「統計情報」の「enqueue requests」,「enqueue releases」は要求された表・行ロックの合計数、解放された表・行ロックの合計数を表しますが、適当なフィルタを設定すれば、次のように見やすいように監視できます。

V11016_2  

わかりずらいですが、1秒間隔で自動更新させています。

あと、V$SESSION_WAITビューによる「待機中の待機イベント」も表示されるようになりました。

V11016_3

また、「セッション一覧」グリッドから特定のセッションをALTER SYSTEM KILL SESSION文による切断もできるようになりました。

V11016_4

以上こんな感じです。「セッション情報」ウィンドウはだいたい機能を追加したので、他のデータベース管理ウィンドウを追加しよう?かなと。

2008年3月11日 (火)

V1.1.0.13リリース

ということで、DBXInspector V1.1.0.13をリリースしました。新機能を追加したのでマイナーバージョン番号を1つあげてみました。

今回はデータベース管理機能の「セッション情報」ウィンドウを追加しました。地味な画面ですがこんな感じです。

V11013_1_2  

「セッション情報」ウィンドウは、メニューから「表示」->「データベース管理」でたどれます。実行ファイルを上書きする場合は、MenuLayout.iniを削除して下さい。

上の「セッション一覧」グリッドには、V$SESSIONビューの内容が表示されます。下の「統計情報」「待機イベントの統計」グリッドには、「セッション一覧」グリッドで選択したセッションのV$SESSTATV$SESSION_EVENTビューの内容がそれぞれ表示されます。デフォルトでは、上記のビューのカラムの一部が表示されるようになってますが、

V11013_2

とデフォルトで非表示のカラムも表示できるようになっています。といっても、Oracleのバージョンによって存在しないカラムもあるので、各ビューの全てのカラムを取得してるわけではありません。とりあえず、Oracle8以降に共通のカラムに絞ってあります(ここらへんは変えるかも)。

後、下のグリッドは「インクリメンタルサーチ」ができるようになってます。例えば、下の画像において、

V11013_3

キーボードから「t」を押すと、

V11013_4

と「t」で始まるレコードに飛びます。

以上、こんな感じです。

2008年3月 1日 (土)

V1.0.0.11リリース

久しぶりにV1.0.0.11をリリースしました。

といってもマイナーアップデートでネタがありません。despair

「データベースエクスプローラ」、「オブジェクトインスペクタ」、「SQL履歴」上のグリッドにインジケータを表示するように変更しました。これによって、

V10011_1_2

のように、カラムの表示・非表示を切り替えられるようにしました。そいういえば、去年の12月丸々、DBXInspectorの機能アップのためある作業に取りかかっていたのですが、その続きでもやろうかなと。下調べして、色々実験やコーディングしてたのですが、いつもの如く頑張りすぎて途中で燃え尽きました。はは。

他にも、開発者向けの話ですが、便利なエディタコンポーネントを見つけて色々実験もしてました。一般ユーザーが使うエディタではなく、アプリ開発で開発者が使うエディタのコンポーネントです。今流行り?のリファクタリング機能も備えてます。

V10011_2

上の画像は先月作業していたOpenTypeフォントを解析するプログラムのソースですが、変数SubStreamの名前を変えようとしてる画像です。1箇所変えれば、該当箇所すべての名前が変わるので便利です。

折り畳みもできるし、変更した行もガータ部分を見れば一発で分かります。設定によってカーソルのある行を含むブロックをハイライトしたり、特定部分を編集不可にもできます。

V10011_3_2 

シェアウェアなんですが、1つあると便利そうなので購入してみようかなと。そうすれば、DBXInspectorに組み込める。これを使えば、立派なテキストエディタが簡単に作れますが、難点は、ちょっと扱うテキストが増えると重くなります。色分けや折り返しのルールは正規表現やBNF(バッカス・ナウア・フォーム)で指定でき、プログラミングいらずでカスタマイズできるのですが、そのため、複雑なルールを定義して、巨大なテキストを扱うと重くなります。このソフトの作者天才ですね。このコンポは秘密なので、質問しても答えられませんbearing。マジです。ははは。

OpenTypeフォントの続き(8)・・・glyfテーブル

ということで、glyfテーブル

glyfテーブルはグリフのアウトラインを定義するテーブルである。TrueTypeアウトラインは2つの端点と1つの制御点(control point)で定義する2次Bスプライン曲線と直線でアウトラインを定義するので、WinAPIのPolyBezier関数でアウトラインを描画する場合は、3次ベジェ曲線に変換する必要がある。変換式は、2次Bスプライン曲線の端点の座標をそれぞれ(x0, y0)、(x2, y2)とし、制御点の座標を(x1, y1)とすると、

  • CP0 = (x0, y0)
  • CP1 = (x0 + 2*(x1 - x0)/3, y0 + 2*(y1 - y0)/3)
  • CP2 = (x1 + 1*(x2 - x1)/3, y1 + 1*(y2 - y1)/3)
  • CP3 = (x2, y2)

となる。CP0、CP3は端点、CP1、CP2は制御点。

フォントに含まれる各グリフのグリフデータは前回のlocaテーブルを使ってアクセスするが、各グリフのグリフデータはグリフヘッダーで始まる。グリフヘッダーは次のようになる。

グリフヘッダー
名前 説明
SHORT NumberOfContours 輪郭線(Contour)の数
SHORT xMin x座標の最小値
SHORT yMin y座標の最小値
SHORT xMax x座標の最大値
SHORT yMax y座標の最大値

NumberOfContoursはグリフを構成する輪郭線(Contour)の数を表す。0以上ならシンプルグリフを負なら複数の他のグリフから構成されるコンポジジットグリフを表す。xMinyMinxMaxyMaxはグリフを囲む最小の矩形であるバウンディングボックス(ブラックボックス)を表す。グリフヘッダーの後に、実際のグリフデータが続くが、シンプルグリフかまたは、コンポジットグリフかによってフォーマットが異なる。シンプルグリフの場合、次のようになる。

シンプルグリフ
名前 説明
USHORT EndPtsOfContours[NumberOfContours] 各輪郭線(Contour)の終点番号の配列
USHORT InstructionLength インストラクションの長さ(バイト数)
BYTE Instructions[InstructionLength] インストラクションの配列
Byte Flags[] 各輪郭線のフラグの配列
BYTE or SHORT XCoordinates[] x座標の配列
BYTE or SHORT YCoordinates[] y座標の配列

EndPtsOfContoursは各輪郭線の終点番号の配列である。グリフを構成する各点は0から始まる通し番号が付けられるが、グリフを構成する点の数NumOfPtsは

NumOfPts = EndPtsContours[NumberOfContours] + 1

で求まる。XCoordinatesYCoordinatesは各点の座標を表す配列である。ちなみに、XCoordinates、YCoordinatesは絶対座標ではなく直前の点からのベクトルになっている(最初の点は原点(0, 0)からのベクトル)。また、Flags配列によって、XCoordinates、YCoordniates配列の要素数が変わるので注意が必要である。

コンポジットグリフはややこしいので省略するとして、実際にglyfテーブルを解析してみる。

Opentype9_1

上の画像はTahomaフォント(TAHOMA.TTF)のglyfテーブルを解析した時の実行結果である。また、グリフインデックス42のグリフ(ラテンアルファベットの大文字のGに相当するグリフ)のグリフデータが表示されている。上の画像より輪郭線が1つで、点の数が49個であることが分かる。右下のアウトラインは上が実際のグリフデータから各点の絶対座標を求め単純に各点をオンカーブ点、オフカーブ点を全く考慮せず直線で結んだもの、下がETO_GLYPH_INDEXオプション付きのExtTextOut関数でグリフを表示したものである。ちなみに、輪郭線上の点をオンカーブ点(on-curve point)、輪郭線上にない点をオフカーブ点(off-curve point)と呼ぶ。

MS ゴシックフォントのglyfテーブルを解析した時の実行結果は次のようになる。

Opentype9_2

ところで、グリフの位置がずれるのだが、どうやって正しく配置するんだ??誰か教えて下さい。とりあえず、グリフのバウンディングボックスと水平方向はhmtxテーブルの左サイドベアリングを使って、垂直方向はOS2テーブルのWinAscentを使って配置してるが、垂直方向は結構ずれてる・・インストラクションや存在すればBASEやGPOSテーブルが影響するとは思うが。

とまぁ、OpenTypeフォントの事を始めて1ヶ月になるのだが、キリがいいので、前にも書いたように他の事をやろうかと。作ったプログラムはここから。PostScriptアウトライン、ビットマップ、OpenTypeテキストレイアウト関連のテーブルは一切まだ手をつけていないが、後々気が向いたらやろうかなと。kernテーブルやvheaテーブルなど他のテーブルはだいたい解析できるようになってます。プログラムはメジャーなC言語でなくCodeGear社のDelphiを使っているのだが、ソースコードを見たという人がいれば、ソースもアップロードします。

Opentype9_3

OpenTypeフォントの続き(7)・・・locaテーブル

ということで、hheaやhmtxを飛ばすが、やっとTrueTypeアウトライン関連のテーブルに突入。

今回はlocaテーブル。locaテーブルはグリフインデックスからglyfテーブル内のグリフデータの位置へのマッピングを定義するテーブルである。

locaテーブルの構造はショートフォーマットとロングフォーマットの二つのフォーマットがあり、headテーブルのIndexToLocFormatフィールドによってどちらのフォーマットか決まる。

各フォーマットの構造は次のようになる。

ショートフォーマット
名前 説明
USHORT Offsets[NumGlyphs+1] glyfテーブルの先頭からのオフセット(バイト単位)/2の配列

ロングフォーマット
名前 説明
ULONG Offsets[NumGlyphs+1] glyfテーブルの先頭からのオフセット(バイト単位)の配列

Offsetsフィールドは各グリフのグリフデータのglyfテーブルの先頭からのオフセットの配列で、このOffsetsフィールドを使って、実際のglyfテーブル内のグリフデータにアクセスする。ショートフォーマットの場合、オフセットを2で割った値が格納されているので、実際のオフセットはそれを2倍したものになる。NumGlyphsの値はフォント内のグリフ数を表すが、これはmaxpテーブルのNumGlyphsフィールドから取られる。また、Offsets配列の最後にダミーの要素(+1)が追加されているので、各グリフのグリフデータのサイズは

  • グリフインデックスNのグリフデータのサイズ = Offsets[N + 1] - Offsets[N]

と一様に求まる(上の式は、ロングフォーマットの場合。ショートフォーマットの場合は2倍する必要がある)。

ということで、実際にlocaテーブルを解析した実行結果を示す。

Opentype8_1

上の画像はTahomaフォント(TAHOMA.TTF)を解析した時の画像である。フォーマットはロングフォーマットである。また、上の画像より、グリフインデックス1、2、3のグリフデータのサイズが0になっていることが分かるが、これは、空白文字などのアウトラインも持たないグリフを表す。ちなみに、グリフインデックス0のグリフは、フォントにグリフが存在しないことを表す欠損(文字)グリフでなければならない。

« 2008年2月 | トップページ | 2008年4月 »

自作ソフトウェア

無料ブログはココログ

メモ