スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
拍手コメントを見る

Visual Studio で Load イベントを持つ Form を継承するとデザイナでエラー

プチ悩んだので、解決方法をサクッと。

C# での話です。

FormA を継承して FormB を作ってみたのですが、デザイナで開くと次のようなエラーがでました。
デザイナの読み込み時に1つ以上のエラーが発生しました。エラーは以下に一覧表示されます。コードの変更が必要なエラーもありますが、プロジェクトを再度ビルドすると解決できるエラーもあります。
----
オブジェクト参照がオブジェクトインスタンスに設定されていません。

場所 Hoge.Hoge_Load(Object sender, EventArgs e) 場所 ・・・ Hoge.cs : 行 xxx
   :


■原因
独立したFormである Hoge の Hoge_Load() は、実際のアプリケーション実行時に呼び出されるので問題はありませんが、Hoge を継承した Form である Fuga をデザイナで開くと、Hoge の Load イベントが実行されてしまうようです。
Hoge_Load() 内部に、実行時に生成されるインスタンスの初期化などがある場合、間違いなくこのエラーが発生します。

■処方箋
継承元である Hoge Form の Hoge_Load() の最初に次の1行(?)を追加します。

if (this.DesignMode) return;

これで、Fuga Form をデザイナで開いたときに、Hoge_Load() が呼ばれますが、
「デザインモードで動いているから、後の処理はしない」状態でデザイナに処理が戻ってきます。

めでたしめでたし。 拍手コメントを見る

MS SQL の SqlException

SQL で次のエラーがでた。

「numeric をデータ型 numeric に変換中に、算術オーバーフローエラーが発生しました。」

エラーがでた SQL 文のサンプルは次の通り。

SELECT ISNULL( decVal1, decVal2 * 5 ) FROM Table_Hoge

decVal1 および、decVal2 のデータ型は、どちらも DECIMAL(5,2)。
エラーが起こった行の decVal1 は NULL で、devVal2 は 200.00 だった。

devVal2 * 5 は、1000.00 になる。

ちなみに次の式ではエラーにならない。

SELECT decVal2 * 5 FROM Table_Hoge.

エラーの意味がわからなくて、ややパニック。何でエラーになるの?
ここで、SQL関数の ISNULL( arg1, arg2 ) の仕様を考える必要があった。

ISNULL( arg1, arg2 ) は、arg1 が NULL の場合、arg2 の値を、arg1 の「型」に代入するというもの。

つまり先の実例では、1000.00 を decVal1 に代入している事になる。
decVal1 のデータ型は繰り返しになるが、DECIMAL(5,2)。全部で5桁のうち、3桁が整数部分で、2桁が小数点以下という宣言。

そう、1000.00 は、整数部分が4桁になるのである。だからオーバーフローエラーが発生するのだ。

解決策として取った方法は、次のとおり。

SELECT ISNULL( CAST( decVal1 AS DECIMAL(7,2) ), decVal2 * 5 ) FROM Table_Hoge

要するに、代入先の型を CAST して DECIMAL(7,2) として拡張したのである。

整数部を2桁分増やしただけなので、もちろん、decVal2 の値が 20000.00 以上になった場合、同じオーバーフローエラーがでることになる。

そもそも、decVal2 には、200なんて数字が入る事を想定していなかったが、この値をテーブルに登録する側は、そんなことは考えて作られていなかった。

本来ならば、利用する側ではなく、登録する側でエラーチェックを行い、イリーガルなデータを登録させないようにするべきだとは思うのだけれど、異常系を考慮すると、利用する側にも防衛線を張っておく必要がある、というのが双方の着地点というか妥協点になる。 拍手コメントを見る

Apache2.2.9 と Subversion 1.5.2

Apache 2.2.9 と Subversion 1.5.2 を Windows 2003 Server にインストールしました。

ざっくりとした手順としては、次の通りです。

  1. Apache 2.2.9 のインストール
  2. Subversion 1.5.2 のインストール
  3. Apache 2.2.9 の httpd.conf の修正

それでは、純を追って・・・って吾郎さんじゃないっての。
えーゴホン、「順を追って」ですね。

Apache 2.2.9 のインストール
至って簡単です。www.apache.jp を開いて、右側の「ダウンロード」をクリックします。
今回は、"Apache HTTP Server 2.2.9 is the best available version" パラグラフにある、Win32 Binary including OpenSSL 0.9.8h(MSI Installer) を選択しました。
ダウンロードの後は、ただただインストーラーを起動するだけです。手間は掛かりません。
ただし、インストール先のデフォルト指定は階層がやたらと深いため、単純に "C:\Apache2" に手動変更しました。

Subversion 1.5.2 のインストール
Subversion 1.5.2 ですが総本家にはインストーラーが(まだ?)無かったので展開後のイメージを持ってきました。
http://subversion.tigris.org/"Get Subversion" カテゴリの "Subversion" 配下にある Windows binaries をクリックすると、「Tigris.org : Apache 2.0 or Apache 2.2」というエントリ部分が表示されるので、Apache 2.2 の方をクリックします。リンク先のリストの最後にある svn-win32-1.5.2.zip が目的のファイルです。
ダウンロードした zip ファイルの中身は、"C:\Program Files\Subversion" というフォルダに展開しました。
※ SlikSVN のリンク先には msi 形式のインストーラーがあるにはあるのですが、実行してみると "Program Files\SlikSVN" なんてフォルダをデフォルトで作成しようとするし、インストールオプションの用語が似たり寄ったりで嫌悪感を憶えたので手動で設定することにしました。

Windows の Path 環境変数に "C:\Program Files\Subversion\bin" を追加します。「マイコンピュータ」を右クリックしてプロパティを選択するか、コントロールパネルから「システム」を選択してシステムプロパティのダイアログを表示させます。
詳細設定タブページの下のほうにある"[環境変数]"ボタンをクリックして、システム環境変数側にあるPath を修正します。
既存の値に対して、セミコロンに続けて、"C:\Program Files\Subversion\bin" を追加して終了です。

■Apache 2.2.9 の httpd.conf の修正
基本は、"C:\Program Files\Subversion\README.txt" に書いてある事をします。

"C:\Program Files\Subversion\bin" にある、mod_dav_svn.so および mod_authz_svn.so を "C:\Apache2\modules" にコピーします。
"C:\Apache2\conf" にある、httpd.conf を notepad などのテキストエディタで開きます。

次の行を探してコメントアウトを意味する行頭の # を削除します。
【修正前】
    #LoadModule dav_fs_module modules/mod_dav_fs.so
    #LoadModule dv_module modules/mod_dav.so
【修正後】
    LoadModule dav_fs_module modules/mod_dav_fs.so
    LoadModule dv_module modules/mod_dav.so

次の2行を追加します。
    LoadModule dav_svn_module modules/mod_dav_svn.so
    LoadModule dav_svn_module modules/mod_authz_svn.so

最後に <Location /hoge>...</Location> の中身を環境に応じて設定します。
以下は一例です。
#
# for SVN setting
#
<Location /svnRoot>
    DAV svn
    SVNParentPath c:/data/svn/repos

    AuthzSVNAccessFile c:/data/svn/conf/svnAccess.txt

    Require valid-user

    AuthType Basic
    AuthName "Subversion repository"
    AuthUserField c:/data/svn/conf/svnAccount.txt
</Location>


以上。 拍手コメントを見る

tag : Apache Subversion

TortoiseSVN with Notes/Domino でバグトラック

会社では、ソフトウェア開発の障害管理に IBM Lotus Notes/Domino を利用しています。
当然ながら Domino Application は昔取った杵柄って事で、一から作ったのですが、ソースコード管理に利用している Subversion/TortoiseSVN との相性が良くない、、、という事ではなく、事例が見つからないので後回しにしてました。

で、いつの間にか2年の月日が経ってしまっていたのです。

今日、ふと思い立ち、なんとかならんものかと調査をしてみました。
じゃじゃじゃーん!

Notes Document を呼び出すにあたり、"notes://" という拡張した URL スキーマがサポートされていることを知りました。

notes://<Server>/<Database file>/<View>/<Document Key>?OpenDocument

という URL フォーマットを利用することで、別アプリケーションからでも Notes Client が立ち上がり、且つ、指定のドキュメントまで開いてくれるらしいのです。

こっこれはっ!!

ということで、TortoiseSVN の属性(Properties)に、bugtraq:url と bugtraq:logregx を追加してみたのですが、あえなく撃沈。

Notes/Domino のバグなのか、notes://... で始まるURLの場合、"<Document Key>?OpenDocument"というオプションが使えないようなのです。実行すると「リンクに指定された文書はリンク先のデータベースにはありません。」というツレないエラーメッセージが表示されるのです。
http://... で始まるURLの場合は大丈夫なんですけどね。

<Document Key> の代わりに、<DocumentID>を使えばこの問題は解決するらしいのですが、、<DocumentID>は可読できないくらい長ったらしい記号の羅列なので、運用上その値を利用する事はUIとしてはありえないのです。
一方、<Document Key>は、Domino の @関数である @Unique を使っていて、XXXX-YYYYYY という 4+6の脳みその許容範囲内の長さの文字列になり、<DocumentID>と比較するまでもなく、使いやすいのです。

結論からいいますと、TortoiseSVN のログメッセージに 障害文書作成時に @unique で発生した文書IDを<Document Key>部分に置き換えると自動リンクを貼り、連携を取ることはできました。

1クッションおく利用法なのですが、詳細はまた後日に書きます。

--------------------------
【追記 2008/08/25】
--------------------------
処方箋です。
TortoiseSVN のログ上のURLアンカーから、Web Browser 経由で Notes Document を表示して、その Notes Document 上に、原本への NotesURLアンカーを置く方法で対応しました。


  1. 対象となる Notes DataBase をブラウザから参照可能なように設定する必要があります。
  2. フォームに、"RefURL"(任意名称)などのテキスト(表示上の計算結果)フィールドを追加します。
  3. 内容は、"notes://<Domino serverName>/<Database Path>/0/"+@Text(@DocumentUniqID) にします。
  4. 検索専用のビューを作成します。名称は、"($ByDocID)"(任意名称)、別名 "ByDocID" にします。
  5. 検索キーとして利用するフィールドがソートされた状態で第1列表示されるように ByDocID をデザインします。1列だけのビューでOKです。

Notes/Domino 側の準備は以上です。

次に、TortoiseSVN の属性の追加です。

  1. bugtraq:url を追加します。内容は、次の通りです。
    "http://<Domino server Name>/<Database Path>/ByDocID/%BUGID%" (* 訂正 2008/09/02)
  2. bugtraq:logregex を追加します。ここには正規表現を記述します。使用する環境によって内容は変わるので次の情報は参考程度としてください。

    • 1行目:[A-Z]{4}-[A-Z0-9]{6} (* 訂正 2008/08/28)
    • 2行目:([A-Z]{4}-[A-Z0-9]{6}) (* 訂正 2008/08/28)

     上記の正規表現で、XXXX-YYYYYY という @uniq が生成するIDを網羅しています。[XXXX] にはアルファベットのみが入り、[YYYYYY] にはアルファベットと数字が混在するという前提で記述しています。
拍手コメントを見る

テーマ : ソフトウェア
ジャンル : コンピュータ

tag : Notes/Domino TortoiseSVN bugtraq

再々:TortoiseSVN 1.5.1 で TortoiseBlame が修正されました

TortoiseSVN 1.5.0 のリリースから一月後、メンテナンスリリースとして version 1.5.1 がリリースされました。

ChangeLog を拝見しますと、TortoiseBlame の設定ダイアログで変更したものが反映されないバグが修正済みとあったので、早速試してみました。

その結果、バッチリOKです。今後はもうフォントに悩まされる事がなくなります。
よかったよかった。

【過去ブログ】
再び:TortoiseSVN v1.5. の TortoiseBlame」 on 2008/07/02
拍手コメントを見る

テーマ : ソフトウェア
ジャンル : コンピュータ

ブログ内検索
プロフィール

雷ぶ

Author:雷ぶ

最近の記事
最近のコメント
最近のトラックバック
カテゴリー
月間アーカイブ
ブロとも申請フォーム

この人とブロともになる

RSSフィード
リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。