2009年12月30日水曜日

[他]イミディエイトウインドの強力な使い方

VisualStudioのデバッグ時に各変数の値を見る場合、

  1. マウスポインタを当てて、内容を見る
  2. ウォッチウィンドウで内容を見る
  3. ローカルウィンドウで内容を見る
  4. イミディエイトウィンドウで、?を入力した後、変数名を入力する
  5. クイックウォッチを使う

のいづれかを使用すると思います。これらはプライベート変数を見ることもできます。

しかし、メソッドを実行したい場合は、おそらくイミディエイトウィンドウを使うことになります。
で、今日気づいたのですが、このイミディエイトウィンドウはなんとプライベートメソッドを呼び出すことができるのです!!。知りませんでした。

イミディエイトウィンドウでは、インテリセンスの機能があるので、普段は入力しないのですが、たまたまインテリセンスがうまく動かなくなって、偶然コピペしたら動作したので、びっくりしちゃいました。

2009年12月28日月曜日

[.NET]メソッド名をメソッド内で得る

デバッグやトレース目的で、メソッドのIn/Outの情報をログに出したり。というのはよくある話ですが、ログに出力するロジックをコピペで作ったりしていると、よくメソッド名を間違えてしまいます。
で、先日偶然に、メソッド名を得るメソッドを発見しましたので紹介します。使用例はこんな感じ。

private void button1_Click(object sender, EventArgs e)
{
    //using System.Reflection;
    System.Diagnostics.Debug.WriteLine("メソッド = " + MethodBase.GetCurrentMethod());
    //「Void button1_Click(System.Object, System.EventArgs)」と表示される
}


でもなぜかvoidがVoidとなってしまいます。が、「わかりゃーいいんだよぉ」と考えれば十分実用的ですね。

2009年12月26日土曜日

[.NET]C#でconst配列?

C#では、定数にconstという構文があり、固定の値を定義することができます。
しかし、配列で固定の値を定義しようとすると、静的コンストラクタを実装する必要があります。
他の方法は?と思って調べると、Array.AsReadOnlyというメソッドを使うとそれらしく実現できることがわかりました。コードはこんな感じ。

public class Class1
{
    // ↓コンパイルエラー
    //const string[] arrayData = { "111", "222" };
    // 
    ReadOnlyCollection<string> arrayData = Array.AsReadOnly<string>(new string[] { "111""222" });

    public void Test()
    {

        foreach (string str in arrayData)
        {
            System.Diagnostics.Debug.WriteLine("data=" + str);
        }

        for (int i = 0; i < arrayData.Count;i++ )
        {
            string str = arrayData[i];
            System.Diagnostics.Debug.WriteLine("data=" + str);
        }

        //↓コンパイルエラー
        //arrayData[1] = "1";
    }
}

2009年12月24日木曜日

[.NET]アセンブリの差し替え

過去のシステムで何かを暗号化しているActiveXのライブラリがありました。
で、そのライブラリを.NETでInteropして使用する別のアセンブリがあり、そのアセンブリを使うために、ActiveXをregsvr32して疎通確認してみたところ、想定外のエラーが出ており、困った状態になってしまいました。

幸い、暗号化のアルゴリズムはシンプルだったので、とりあえず開発を進めるために、ActiveXのライブラリに変わる処理を.NETで組んでダミーのアセンブリを生成し、Interopアセンブリを削除し、同フォルダにダミーのを置いてみましたが、うまくいきませんでした。

そこで、以下の2つを実施すると、なんと!!動いてしまいました。


  1. AssemblyInfo.csの[assembly: Guid("xxxxxx")]をInteropのものとあわせる(Reflector for .NET で確認)
  2. アセンブリファイル名をInteropのものとあわせる


もちろん、内部のクラスのインタフェースもReflectorで確認したとおりのクラスを実装する必要があります。


何かしらの処理を一時的に差し替えたりしたい場合、便利ですねぇ。

2009年12月21日月曜日

[SQL]SQLServerのLikeは正規表現が使える!

先日、とあるシステムの調査のためSQLServerのプロファイラで発行しているSQLをトレースしていると、Like検索の対象に「ABC[0-9][0-9][0-9]」のような表現を見つけました。
はぁ?と思い、調査してみると、SQLServerのLike検索は正規表現が利用できることがわかりました。チョーびっくり。「検索条件のパターン照合」が参考になります。

このページにも書いてありますが、正規表現を使うと、インデックスが使われません。ので、データ量の多いテーブルには使わないことをお勧めします(ってオイ。これじゃあまり意味が。。。)。

2009年12月17日木曜日

[他]レガシーASP(ASP.NETではない)のデバッグテクニック(ローテク)

レガシーAPS(ASP.NETではない)のデバッグは結構面倒です。でもVisualStudioなどのツールを使うと比較的楽になります。
しかし、ツールを起動してブレークポイントをはって待っているのが困難な場合、STOPというステートメントをお勧めします。デバッグの環境つくりも含め「ASP スクリプトをデバッグする」が参考になります。

余談ですが、このSTOPステートメントはVBSなどでも利用できるようです。

2009年12月14日月曜日

[他]レガシーASP(ASP.NETではない)をデバッグする(ほぼフリー)

先日、ASPのデバッグのため環境を作っていたのですが、ライセンスの都合上VisualStudioを入れることができず、意気消沈としながらデバッグ用のログを埋め込み作業をしていました。
とはいえ、Script Debuggerを使う気にはなれず、どうしたものかと調べてみると、Microsoft Office 2003などにスクリプトデバッグするツールが同梱されていることがわかりました(Officeのインストールでオプション指定が必要。Officeツール/HTMLソース編集/Web スクリプト編集)。

設定の仕方は以下のとおり(■:チェックボックス オン □:チェックボックス オフ)。

1.IEの設定 インターネットオプション[詳細設定]
  □HTTP エラー メッセージを簡易表示する
  □スクリプトのデバッグを使用しない(Internet Explorer)
  □スクリプトのデバッグを使用しない(その他)

2.IISのサイトのプロパティ設定
 ホームディレクトリの[構成]ボタン→アプリケーションの構成の[デバッグ]タブ
 (1)デバッグのフラグ
  ■ASPのサーバー側のスクリプトのデバッグを有効にする
  □ASPのクライアント側のスクリプトのデバッグを有効にする
 (2)スクリプトのエラーメッセージ
  ●クライアントに詳細なメッセージを送る
  ○クライアントにテキストのメッセージを送る

3.デバッグ
  (1)Script Edito起動(Office XPの場合)
    C:\Program Files\Microsoft Office\Office10\MSE7.EXE
  (2)プロセスにアタッチする
    →タイトルが「Microsoft Active Server Pages・・・」
  (3)スクリプトエディタの「デバッグ」→「ウインドウ」→「実行中のドキュメント」
    ソースが表示され、ブレークポイントが設定できる

VisualStudioほど良くはありませんが、Script Debuggerに比べれば格段に使いやすいです。
ライセンスに困っている人は試してみる価値はあると思います。よ。

※:一度ブラウザでリクエストしないと、IISにキャッシュされないので、デバッグする場合は一度実行してからScript Editorを開いてください。

2009年12月8日火曜日

[他]IISのデバッグモードはシングルスレッド

先日レガシーASP(ASP.NETではない)をメンテする必要があり、調査のためデバッグ実行するためにIISの設定を変更してステップ実行していました。

しかし、特定の箇所でタイムアウトが発生していまい、どうしたものが困ってしまいました。
で、特定の箇所というのが、同じサイトのAPSからASPにMSXMLにHTTP通信している箇所でした。

いろいろ調べると、「IIS 6.0 F1: [アプリケーションの構成] - [デバッグ] タブ」にたどり着きました。そうなんです。シングルスレッドになっちゃうんです。

幸い、異なるディレクトリに配備されたASP同士でHTTP通信していたため、アプリケーションを分けて個別にデバッグ設定を行いばよい事に気づき実施してみると、うまくいきました。
片一方を非デバッグモードにすることによって、マルチスレッド動作する。という事になります。

2009年12月7日月曜日

[他]Microsoft Security Essentials

MSがフリーのアンチウイルスソフトを出しているのに今気がつきました。
Microsoft Security Essentialsというツールです。

今までAvasta!を使っていましたが、乗り換えてみることにしました。