2014年8月25日月曜日

ASP.NET開発を始めるにあたって参考にした記事3つ

ASP.NETアプリケーション開発に取り組んで1ヶ月になりました。
開発も終盤にさしかかってきたので、忘れないうちに開発スタート時に参考にした記事を3つ紹介します。

@IT プログラミングASP.NET
ASP.NETについて、基本から解説してあります。(連載なので、正確には1記事ではないかも)
全体を把握するのにおすすめです。特に重要だと感じたキーワードを挙げておきます。
  • ポストバック
  • ビューステート
  • データバインド

ASP.NET Page Life Cycle Overview
ASP.NETプログラミングの特徴のひとつに、イベントドリブン方式で実装することがあります。この特徴を活用するには、イベントの順番を把握しなければなりません。この記事ではそれが紹介されています。
今回のプロジェクトで主に使用したイベントと、用途を紹介します。
  • Page_Init…ページやコントロールのフィールドを初期化する。オブジェクトをセッションから取得するなど。
  • Page_Load…コントロールの初期化をする。ドロップダウンリストの項目をセットするなど。
  • Button_Click…ユーザーの入力値を受け取る。入力値をもとに業務ロジックを呼び出して結果を受け取る。
  • Page_PreRender…業務ロジックの結果をコントロールへ反映する。

ASP.NET Application Life Cycle Overview for IIS 7.0
上で紹介したライフサイクルよりも、大きなサイクルについての記事です。アプリケーションやセッションの初期処理を組み込もうとするときに参考になります。

これまで食わず嫌いでASP.NETには手をつけてこなかったのですが、実際に開発をしてみるとすんなり進められました。今後は、ASP.NET案件にも積極的に取り組んでいこうと思います。

2014年8月18日月曜日

Javaでクラス図を書いてみた

Javaでクラス図(1クラスだけ!)を書いてみたの続きになります。
クラス同士の関連を出力できるようにしました。

 
上の図が出力に使用したプログラムを出力したものです。
ざっくりとしたイメージを把握する程度の要求は満たせるかな、という感じです。

2014年8月11日月曜日

ASP.NETでJavaScriptからポストバックを発生させる方法

ASP.NETアプリケーションをコーディングしていて、JavaScriptからポストバックしたいというケースがあります。例えば、検索結果の一覧をテーブルで表示しており、任意のセルをクリックした時に詳細を表示する画面へ遷移するケースなどです。

こういう状況に対応できるのが、次のクラスとインターフェイスです。
まず、JavaScriptのイベントハンドラに対して、ClientScriptManager.GetPostBackEventReferenceで取得した文字列を呼び出すように実装します。このとき、引数として渡した文字列が、次で実装するポストバックイベントハンドラの引数になります。ClientScriptManagerオブジェクトは、Page.ClientScriptから取得できます。
class MyPage : Page {

     protected void Page_PreRender(object sender, EventArgs e) {
         var args = "xxx"; // 例えば、詳細情報を表示するためのプライマリキー
         var js = ClientScript.GetPostBackEventReference(this, args);
         Table1.Rows[0].Cells[0].Attributes.Add("onclick", js);
     }

}

次に、ポストバックを受けるクラスが、IPostBackEventHandler.RaisePostBackEventを実装します。
// 上のクラスへIPostBackEventHandlerを実装
class MyPage : Page, IPostBackEventHandler { 
    ...
    public void RaisePostBackEvent(string eventArgs) {
        // 例えばセッションへeventArgsをセットして詳細ページへ遷移する
        Session.Add("key", eventArgs);
        var detail = ResolveUrl("~/MyDetailPage.aspx");
        Server.Transfer(detail);
    }
}
以上でJavaScriptからのポストバックが機能します。私が最初に思いついたのは、CSSで非表示にしたボタンをJavaScriptからクリックするという方法でした。しかし、こちらのほうが何倍もスマートだと思います。
ClientScriptManagerには、他にも様々なメソッドがあります。まだまだ便利な機能がありそうです。

参考:
ClientScriptManager
IPostBackEventHandler

2014年8月4日月曜日

ASP.NETアプリケーションの起動時にWeb.configファイルを読み込むには

ASP.NETアプリケーションの起動時に設定ファイルを読み込み、システムの初期設定をしたいというケースがあると重います。

設定ファイルを読み込むための、WebConfigurationManager.OpenWebConfigurationメソッドには、引数として設定ファイルの仮想パスが必要です。仮想パスの取得方法として、ASP.NET Web プロジェクトの仮想パスに手順が記載されていますが、アプリケーションの起動時には適用できません。なぜなら、紹介されている方法ではHttpRequestクラスを使用するのですが、アプリケーション起動時には、HttpRequestオブジェクトが使える状態にないからです。

そこで、代わりに使用するのが、HttpRuntimeクラスです。このクラスの、AppDomainVirtualPathプロパティから、アプリケーションの仮想パスを取得できるので、あとはファイル名を結合するだけです。結合には、VirtualPathUtilityクラスを使うとベターでしょう。
var path = VirtualPathUtility.Combine(HttpRuntime.AppDomainVirtualPath,
                                      "Web.config");
var conf = WebConfigurationManager.OpenWebConfiguration(path);

仮想パスをいい加減に扱うと、サーバーへインストールしたら動かなくなることがあります。HttpRuntimeクラスを使い、環境の変化に強いコードを書きましょう。

2014年7月28日月曜日

Javaでクラス図(1クラスだけ!)を書いてみた

グラフを書くためのライブラリの一つに、Graphvizというものがあります。
調べてみたところ、クラス図を書くこともできるようなので、Javaのリフレクションを使ってクラス図を書いてみました。

まだ単体のクラスを出力できるだけですが、関連を出力できるようになるとなかなかおもしろそうです。

参照
Graphviz
UML Diagrams Using Graphviz DOT

2014年7月21日月曜日

C#でアプリケーション設定ファイルを拡張する方法

.NETには標準で設定ファイルを読み込むためのAPIが公開されています。
そのままでも単純なキー=値形式の定義できます。
カスタマイズするには、主に次の3つのクラスを使用します。
  • ConfigurationSectionクラス
  • ConfigurationElementクラス
  • ConfigurationElementCollectionクラス
ConfigurationSectionクラス
カスタマイズした設定項目のルートになるクラスです。
    class NetworkConfigurationSection : ConfigurationSection
    {
        [ConfigurationProperty("LocalHost")]
        public NetworkConfigElement LocalHost
        {
            get { return base["LocalHost"] as NetworkConfigElement; }
            set { base["LocalHost"] = value; }
        }

        [ConfigurationProperty("Networks")]
        public NetworkConfigElementCollection Networks
        {
            get { return base["Networks"] as NetworkConfigElementCollection; }
        }
    }


ConfigurationElementクラス
設定値をもつXMLエレメントに対応するクラスです。
    class NetworkConfigElement : ConfigurationElement
    {
        [ConfigurationProperty("IPAddress")]
        public string IPAddress
        {
            get { return base["IPAddress"] as string; }
            set { base["IPAddress"] = value; }
        }
    }


ConfigurationElementCollectionクラス
複数のConfigurationElementをまとめるクラスです。
    class NetworkConfigElementCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new NetworkConfigElement();
        }

        protected override object GetElementKey(ConfigurationElement element)
        {
            NetworkConfigElement elm = element as NetworkConfigElement;
            if (null == elm) return null;
            return elm.IPAddress;
        }
    }



2014年7月14日月曜日

ちょっとしたツールを作るのに便利なPythonのcmdモジュールを使うための3ステップ

シンプルなコマンドラインツールが必要なとき、Pythonのcmdモジュールが有力な選択肢になります。ツールを実装するために必要な3ステップを紹介します。
  1. cmd.Cmdクラスを継承したクラスを作る
  2. do_XXXメソッドを定義する
  3. cmdloopメソッドを呼ぶ
cmd.Cmdクラスを継承したクラスを作る
特に言うべきことはありません。普通に継承するだけです。
class HelloCmd(cmd.Cmd):
...

do_XXXメソッドを定義する
メソッド名の"XXX"がコマンドになります。
パラメータを受け取るためのargパラメータがポイントです。
    def do_hello(self, arg):
        print 'hello, ' + str(arg)

cmdloopメソッドを呼ぶ
クラスをインスタンス化し、cmdloopを呼ぶとREPLがスタートします。
終了するにはCtrl-Cで落とします。
>>> HelloCmd().cmdloop()
(Cmd) hello Taro
Hello, Taro
(Cmd) Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/lib/python2.7/cmd.py", line 130, in cmdloop
    line = raw_input(self.prompt)
KeyboardInterrupt

以下Tips。必須ではありませんが、知っておくと便利です。