2008年11月28日金曜日

[.NET]デフォルトコンストラクタは自動で呼び出される

普段あまり意識していなかったのですが、デフォルトコンストラクタは勝手に呼ばれるらしい。ということで実験してみました。

■コード
public class Kihon
{
    public Kihon()
    {
        System.Diagnostics.Debug.WriteLine(" kihon()");
    }

    public Kihon(string text)
    {
        System.Diagnostics.Debug.WriteLine(" kihon(string text)");
    }
}

public class Hasei : Kihon
{
    public Hasei()
    {
        System.Diagnostics.Debug.WriteLine(" hasei()");
    }

    public Hasei(string text)
    {
        System.Diagnostics.Debug.WriteLine(" hasei(string text)");
    }
}

public class HaseiHasei : Hasei
{

    public HaseiHasei()
        : this("x")
    {
        System.Diagnostics.Debug.WriteLine(" HaseiHasei()");
    }

    public HaseiHasei(string text)
//            : base(text)
    {
        System.Diagnostics.Debug.WriteLine(" HaseiHasei(string text)");
    }
}


■実行例
System.Diagnostics.Debug.WriteLine(@"1.new Hasei(""text"")-----------------------------");
Hasei a = new Hasei("text");

System.Diagnostics.Debug.WriteLine(@"2.new HaseiHasei(""text"")------------------------");
HaseiHasei b = new HaseiHasei("text");

System.Diagnostics.Debug.WriteLine(@"3.new HaseiHasei()--------------------------------");
HaseiHasei c = new HaseiHasei();


■実行結果
1.new Hasei("text")-----------------------------
 kihon()
 hasei(string text)
2.new HaseiHasei("text")------------------------
 kihon()
 hasei()
 HaseiHasei(string text)
3.new HaseiHasei()--------------------------------
 kihon()
 hasei()
 HaseiHasei(string text)
 HaseiHasei()

2008年11月27日木曜日

[.NET]場合によりRadioButtonの変更を拒否する

先日、WindowsFormの仕事をしていました。画面にRadioButtonがあるのですが、とある状態のときチェックを変更させたくない。という要件がありました。納品ギリギリだったので、調べるまもなくClickChangedの中で処理しました。後日、本来あるべきか手法を調べようと思っており、今日思い立ちましたので調査してみました。

すると、Validatingというイベントがあり、このイベント引数を操作することによりキャンセルできることがわかりました。コードはこんな感じ(現在秒が2で割り切れない場合キャンセルします)。

private void radioButton1_Validating(object sender, CancelEventArgs e)
{
    e.Cancel = DateTime.Now.Second % 2 == 0;
}



・・・こんな簡単なら調査に時間割けばよかった。とほほ。

2008年11月26日水曜日

[他]大規模データ処理の極意?

先日CodeZineに、はてな流大規模データ処理の極意という記事が載っていました。じっくり読んでしまいました。その中で私自身の考えも及んでいなかったこと・知らなかったこと(Linuxちょっと弱い)がいくつか書かれていることがありました。抜粋すると以下のような感じ。
  • メモリ(キャッシュ)で処理ができなくなりディスクI/Oが発生した時点で負け
  • Linuxではメモリが空いていれば秋メモリはすべてキャッシュにまわる(キャッシュの制限はない)
  • OSが起動したら、データベースのファイルを全部catして「/dev/null」に投げる→メモリにキャッシュが構築される
  • SQL文でJOINを使わない(複数のSQLに分離して実行→テーブル単位でDBサーバを分けたりできる)

できればこのセミナーに参加したかったです。しかし、CodeZineに限らず、このような記事をタダで読めるとは。いい時代になりました。

2008年11月25日火曜日

[.NET]ASP.NETで特定のパスの未認証で利用する

先日@itの掲示板を眺めていると、IISフォーム認証で、外部サイトからrequest→responseする方法という話題が挙がりました。
システム連携かなにかで、特定のパスのみ、未認証で利用したいということらしい。

私自身ASP.NETをあまりやっていないので、どのように解決するのかわかりませんでしたが、特定のASPXでも特定のパスでも、Web.configのみで背低可能なようです。

いやー勉強になりますねぇ。

2008年11月18日火曜日

[.NET]Exception.StackTraceプロパティ

ちょっとしたコードの書き方の違い何ですが、以下のTest1とTest2メソッドでは、Exception.StackTraceの結果が変わってしまうのです。
Test1ではコールスタックが更新されず、Test2ではコールスタックが初期化されます。

private void Form1_Load(object senderEventArgs e)
{
    try
    {
        Test1();
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("-----------Test1");
        System.Diagnostics.Debug.WriteLine(ex.StackTrace);
    }
    try
    {
        Test2();
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("-----------Test2");
        System.Diagnostics.Debug.WriteLine(ex.StackTrace);
    }
}

private void Test1()
{
    try
    {
        ExceptionThrow();
    }
    catch (Exception e)
    {
        throw;
    }
}

private void Test2()
{
    try
    {
        ExceptionThrow();
    }
    catch (Exception e)
    {
        throw e;
    }
}
private void ExceptionThrow()
{
    throw new NotImplementedException();
}


実行結果はこんな感じ。

-----------Test1
   場所 WindowsFormsApplication1.Form1.ExceptionThrow() 場所 C:\Users\hoge\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs: 66
   場所 WindowsFormsApplication1.Form1.Test1() 場所 C:\Users\hoge\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs: 49
   場所 WindowsFormsApplication1.Form1.Form1_Load(Object senderEventArgs e場所 C:\Users\hoge\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs: 23

-----------Test2
   場所 WindowsFormsApplication1.Form1.Test2() 場所 C:\Users\hoge\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs: 61
   場所 WindowsFormsApplication1.Form1.Form1_Load(Object senderEventArgs e場所 C:\Users\hoge\AppData\Local\Temporary Projects\WindowsFormsApplication1\Form1.cs: 32

2008年11月16日日曜日

[.NET]URLを組み立てる

ASP.NETなどで、画面遷移をするURLを組み立てるとき、現在のGET引数を元にパラメータを変更したURLを組み立てたい。といったときに.NET FrameworkではUriBuilderというクラスがあります。

このクラスにQueryというプロパティがあります。名前のとおりQueryを操作するのですが、名前ではなく、インデックスでしかアクセスができないうえ、URLエンコードもしてくれないという、かゆいところに手はが届かないアレなクラスですが、何も無いよりはいいかも。

文字コードの問題はありますが、この辺まとめて日本向けにユーティリティ的なクラスを作ると意外と便利かも。

2008年11月11日火曜日

[.NET]プロセス間の排他制御

以前Log4netにて、複数のプロセスから同じファイルに出力すると言う処理を実装したことがあります。
プロトタイプだったので、良しとしましたが、本来ファイル出力時に他のプロセスが書いていないことを確認してから出力するという処理が必要でしたが、時間もあまり無くそのままにしていました。

その後、正式にプロジェクトはスタートしたのですが、私はプロジェクトを離れたため、その後どうなったのかは不明です。正式版ではなんらか排他制御していると思いますが、当初Mutexを使う予定でした。

以下の例では、同じプログラムを複数実行しても、ロックボタンを押せるのは1つという条件をMutexを使って実装してみました。すごく簡単なので、プロトタイプ作るときにも入れ込んでおけばよかった。。。

public partial class DustCS25Form : Form
{
    private Mutex mutex = null;

    public DustCS25Form()
    {
        InitializeComponent();
    }

    /// <summary>
    /// 初期化
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void DustCS25Form_Load(object senderEventArgs e)
    {
        btnLock.Enabled = true;
        btnRelease.Enabled = !btnLock.Enabled;
        textBox1.Text = "初期状態";
    }

    /// <summary>
    /// ロックボタン押下
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnLock_Click(object senderEventArgs e)
    {
        //2つ目の引数をOS上でユニークにする。
        mutex = new Mutex(falsetextID.Text);

        textBox1.Text = "ロック取得開始";
        //ロックする
        mutex.WaitOne();
        textBox1.Text = "ロック中";

        btnLock.Enabled = false;
        btnRelease.Enabled = !btnLock.Enabled;
    }

    /// <summary>
    /// 解除ボタン押下
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnRelease_Click(object senderEventArgs e)
    {

        //ロックを解除する
        mutex.ReleaseMutex();
        textBox1.Text = "初期状態";

        btnLock.Enabled = true;
        btnRelease.Enabled = !btnLock.Enabled;
    }

}

2008年11月8日土曜日

[.NET]WebBrowserのShift+リンク押下

System.Windows.Forms.WebBrowserを使うとそのままHTMLをコントロール上に表示可能です。さらに、ボタンやリンクなども動作します。内部的にはIEのコンポーネントということらしいです。
ソレが理由かはわかりませんが、操作系のがIEに依存してしまします。たとえば、Shift+リンク押下。
コレをやると、ブラウザが起動するのです。これを抑止する方法があったので紹介します。

これは、NewWindowイベントをインプリメントする必要があります。コードはこんな感じ。

private void webBrowser1_NewWindow(object senderCancelEventArgs e)
{
    e.Cancel = true;
    webBrowser1.DocumentText = "こらー!!";
}

2008年11月5日水曜日

[.NET]テキストファイルを読み込みstringにセットする

テキストファイルを読み込み、string型にセットする処理を実装しようと思い、StreamReaderのReadLineで読み込み、StringBuilderにセットすると言うループを組んでいました。
その直後くらいに、たまたまMSDNのStreamReaderを見ると、ReadToEndなるメソッドがあることを知りました。
コレ使うとループ不要の一発で。。。コードはこんな感じ。

string result;
using (StreamReader rd = new StreamReader(new StreamReader("TestFile.txt")))
{
    result = rd.ReadToEnd();
}

2008年11月1日土曜日

[他]VS2008ショートカット集

以前から無いかなぁと思っていたのですが、Visual Studio 2008 ショートカット キー というのがありました。
備忘録としてメモ。