2006年11月30日

ログオフ・シャットダウンが速くなった!

ログオフが異常なまでに遅くて困っていました。
ログオフに15分以上かかってしまい、
机を片付けて、コートを着て、トイレに行っても、まだ終わらない状態でした。
早く帰りたいのに。(--;

常駐メモリを削っても、ハードディスクを空けても、改善されず・・

そんな私を救ってくれたのが、これ。


User Profile Hive Cleanup Service

サポートOS: Windows 2000; Windows Server 2003; Windows XP

感動しました。本当に感動です。数秒でログオフが完了するではありませんか。
上記のソフトウェアをインストールすれば良いだけです。

ログオフ時にレジストリ接続したままになっているアプリケーションがあると、
OSはプロファイルを完全にアンロードできず、処理が固まってしまっていたわけです。

このソフトウエアはレジストリに接続しっぱしのユーザーを監視しており、
ログオフ時にはレジストリに接続したアプリケーションを特定して
強制的に接続を解放してくれます。

ログオフが遅い原因はいろいろ考えらるので、上記をインストールしても劇的な効果が
望めない場合もありますが、一度試してみる価値はありますね。

2006年11月29日

SqlParameter

SqlServerのVarBinary(max)型にnull(Visual BasicだとNothing)を登録するのに苦労しました。

【ケース1】
sqlCommand.Parameters.AddWithValue("@paramName", null);

上記のコードは実行時に@paramNameに値がセットされていません。といった内容の
エラーが発生してしまいます。
パラメータに直接nullをセットすることはできません。

【ケース2】
sqlCommand.Parameters.AddWithValue("@paramName", System.DBNull.Value);

そんなわけでnullをSystem.DBNull.Valueに書き換えたのですが、
VarBinary型に登録しようとすると実行時にエラーが発生します。

「nvarchar データ型から varbinary(max) データ型への暗黙の変換は許可されません。CONVERT 関数を使用して、クエリを実行してください。」

ただ、上記のようなコードがどんな場合でも実行時エラーになる訳ではないのです。

2-1: VarChar型に登録
[成功] sqlCommand.Parameters.AddWithValue("@paramName", "登録したい文字列");
[成功] sqlCommand.Parameters.AddWithValue("@paramName", System.DBNull.Value);

2-2:VarBinary(max)型に登録
// byteArrayValueはSystem.Byte[]の変数。
[成功] sqlCommand.Parameters.AddWithValue("@paramName", byteArrayValue);
[失敗] sqlCommand.Parameters.AddWithValue("@paramName", System.DBNull.Value);

【ケース3】
SqlParameter param = sqlCommand.Parameters.Add("@paramName", SqlType.VarBinary);
param.Value = System.DBNull.Value;

上記のコードでようやくVarBinary型にnullを登録することができました。
わかってしまえば何のことはない、パラメータの型指定をしてしなかっただけです。
(型指定しなかった場合にSystem.DBNull.Valueはnvarchar型と判断されてしまうのでしょうか。)

しかし、【ケース2】のエラーがたまに発生するから修正してと言われ、
膨大な量のプログラムから原因を探し当てるのは一苦労でした。

しかも、最初に書いた人のプログラムを真似したのか、
パラメータに名前と値しかセットしていないコードがあちこちに増殖していて
結局全部直す羽目になってしまいました。

パラメータの型指定はちゃんとしておきましょう・・。

DebugView

DebugView: http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx

DebugViewはVisuai Studioの出力ウィンドウと同様に、
デバッグ出力の内容を表示してくれるフリーのツールです。

DebugViewのほうが便利な点としては・・

・Visual Studioなどの開発環境がなくてもデバッグ情報を参照できる。

・どんなプロセスが出力したデバッグ情報でも全て表示してくれる。

・フィルター機能を使えば特定の文字列に合致するデバッグ情報を色分けでき見やすくなる。

開発者の間では割と有名なツールのようです。ちなみに、私は知りませんでした(-"-;


VSのステップ実行でソースコードを追えれば良いのですが、
非同期処理や、DLLしかなくソースコードが入手できない、
プログラムが大規模&複雑でクラス構造を理解するのが大変な時など、
デバッグ情報を追っていくほうが良い場合もあります。
(もちろん、クラス内で適切なデバッグ出力コードが記述されているのが前提ですが。)

レイヤーごとや業務ごとなど、ある単位でデバッグ出力の切り替えができるようしてやれば、さらに使いやすくなるのではないかと思います。
単にON, OFFの切り替えだけだと物凄い量のデバッグ情報が出力されてしまいますので。

2006年11月22日

静的コード分析

Visual Studio 2005の標準機能として静的コード分析が用意されています。

ソースコードを解析し、あらかじめ定められたルールに則っていない場合には、バグが潜んでいる可能性があるとして警告を出します。

この機能はデフォルトではオフになっています。
以下の設定をすることにより、静的コード分析が有効になります。

1. プロジェクトを選択し、右クリックから[プロパティ]を選択
2. 「コード分析」タブをクリック
3. 「コード分析の有効化」のチェックボックスをオンにする。

プロジェクトで静的コード分析を活用する場合には、
開発の初期段階で周知したほうが良いです。

たとえ良くない書き方だったとしても、開発者が良くない書き方だということを認識していなければ、システム中に良くないコードがどんどん増殖していきます。
そして、開発が終わったころにいざ静的コード分析をすると、同じ警告が何百個と発生してしまう 事態になりかねません。

それを1つ1つ潰すのは1日がかりの作業だったりします。
開発者の数が増えれば増えるほど、バカにできない工数がかかってしまいます。

静的コード分析のチェック項目は自由にオン/オフできますので、
チェックしない項目はプロジェクトごとに決めていけば良いでしょう。

2006年11月21日

.NETエンタープライズWebアプリケーション開発技術大全〈Vol.2〉ASP.NET基礎編

良書だと思います。

主に、ASP.NETの仕組み、データセットなどのADO.NETの技術の解説、データバインドの方法、セキュアなWebアプリケーション構築のポイントが書かれています。

ASP.NETやADO.NETの本はそれなりにありますが、だいたいどの本もVisual Studioの操作方法やコーディングの書き方に終始しているものがほとんどです。

本書はそれらの本とは一線を画しており、各機能が内部でどのように動作しているのか、なぜその機能が必要だったかなど、一段掘り下げて書いています。

基礎編ということもあり、普段.NETアプリケーションを構築している方にとっては、本書の内容の大半はどこかで見たことのある、または使ったことのある内容だとは思います

Visual Studioや.NETフレームワークは、確かに大幅に開発効率を高めてくれる便利なツールなのですが、と同時に正しい使い方を知らないままなんとなく書いたプログラムがそれなりに動いてしまうという怖さもあります。

まだ読んでいない方はもう一度基礎に立ち返り、本書を読んでみてはいかがでしょうか。きっと新しい発見があるはずです。

バインド時のアイコン

.NETでDataGridViewにDataSetをバインドすると
デザイナの画面の下のほうが区切られてアイコンが表示される。

あの区切られた空間は何?って思っていたわけだが、
あれは、コードビハインド上に定義された変数らしい。へえ。

型付データセット

DataSetには大きく分けて、型なしデータセットと型付データセットがあります。

【型なしデータセット】
テーブル構造に依存せずに汎用的に使えるDataSet

【型付きデータセット】
あるテーブル構造を取り込んだDataSet

型なしデータセットは汎用的であるがゆえ、
テーブル名、カラム名を文字列で指定しなければなりません。
また、戻り値もObjectなのでキャストしなければなりません。
つまり、実行時エラーが発生しやすいプログラムになってしまいます。

型付データセットの場合には、テーブル構造が取り込まれていますので、
テーブル、カラムはクラスのフィールドのように扱うことができます。
私はほとんど型付データセットしか使ってませんね。

なお、型付データセットはソリューションエクスプローラー上では
.xsdファイルとして作成されます。
上のほうのアイコン「すべてのファイルを表示」を押せば、
xxx.Desiner.csファイルが現れます。
テーブル情報や対応するテーブルアダプタはここに記述されています。

2006年11月20日

レイヤ間のデータの受け渡し

.NETアプリケーションを構築する場合は、
3階層の論理レイヤーにする場合が多いかと思います。

【Webアプリケーションの場合】

ブラウザ→プレゼンテーション層→ビジネスロジック層→データアクセス層→データベース

【スマートクライアントの場合】

クライアントアプリケーション→WebサービスIF→ビジネスロジック層→データアクセス層→データベース

.NETの場合、各レイヤー間のデータの受け渡しにはDataSetを流用したほうが良さそうです。

DataSetにはデータバインドなど便利な機能もたくさんあり、
自力でエンティティオブジェクトを作るより生産性が高いだろうと思います。

ビジネスロジック⇔プレゼンテーション間で受け渡すDataSetに
対応するTableAdapterを持たせたくない場合には、
DatSetのMergeメソッドを利用し、データを詰め替えることもできます。

プロセス間であっても、DataSetをそのまま受け渡すことができます。
例えば、データベースで取得した値をWebサービス経由で
そのままWindowsアプリケーションに引き渡すことができます。
(もちろんクライアントが.NET Frameworkベースのアプリケーションで
あることが前提ですが。)
その場合には、データのコピーがクライアントに渡されます。

コネクションプーリング

ADO.NETを利用すれば、ほぼすべての接続ドライバについて
コネクションプーリングをデフォルトで利用できます。

Javaではコネクションプーリング機能を使うために
特別な設定が必要だったりしたものだが、ADO.NETでは必要ありません。

ADO.NETのコネクションオブジェクトをオープン/クローズすれば
裏で勝手にコネクションプーリングしてくれます。便利ですねえ。

2006年11月19日

ASP.NETでエラーチェックを行う際の注意点

ASP.NETでは入力データに対するエラーチェック専用の
コントロールがサポートされている。

エラーチェック用のコントロールを画面に貼り付け、
適切なプロパティを入力してあげればよいのだが、
以下の点に注意して設計/実装する必要がある。

1. エラーチェックがNGだった場合でも、
各イベントハンドラは実行されてしまう。

エラーチェックがNGだった場合に、
イベントハンドラを実行しないようにするためには
イベントハンドラの最初に以下のような1行を入れる。

if (!Page.IsValid) return;

2. エラーチェックはChange系イベントハンドラと
Action系イベントハンドラの間に行われる。

ゆえに、Change系イベントハンドラで

if (!Page.IsValid) return;

を呼ぶとエラーが発生する。
Change系イベントハンドラでエラーチェックの成功/失敗を判断したい場合には
明示的にPage.Validate()を呼ぶ必要がある。

コードビハインド

Visual Studioではコードビハインドがサポートされています。

コードビハインドにより、デザインとロジックを
物理的に別々のファイルに分けています。

ただ、実行時には上記のファイルは同一であるとみなされます。
これは、.aspxから変換されたクラスが
ロジックが記述されたクラスを継承するためです。

※ASP.NETの場合の継承関係

System.Web.UI.Pageクラス

WebForm1.aspx.cs (ロジックが記述されたクラス)

WebForm1.aspxの変換クラス (デザインが記述された.aspxファイルがクラスに変換されたもの)

ASP.NET画面遷移の仕組み

ASP.NETではポストバックと呼ばれる仕組みが導入されています。

ユーザーがある画面でボタンを押下した際のシナリオをもとに、
ASP.NETの内部でどのような処理を行っているのかを簡単にまとめました。

1. ユーザーが画面を表示するために、.aspxにアクセスする。

2. ASP.NETランタイムは表示内容をViewStateに格納し、HTMLを出力する。

<input type="hidden" name="VIEWSTATE" value="(エンコードされた表示内容)">

3. ユーザーがデータを入力し、ボタンを押す。
ポストバックにより、自動的に上記1と同一の.aspxを呼び出される。
この際、変更前のデータ(ViewState)と変更後のデータがサーバーに送信される。

4. ASP.NETランタイムは変更前のデータ(ViewState)と
変更後のデータを比較し、適切なイベントハンドラを呼び出す。

イベントハンドラは
Change系イベントハンドラ(テキストの内容変更、チェックボックス変更など)
→Action系イベントハンドラ(ボタン押下など)の順に呼び出される。

5. ASP.NETランタイムは、処理完了後、HTMLを生成しクライアントに返す。

※.aspxは上記1の初回リクエスト時と、
表示された画面でアクションを起こした場合の2回呼び出されることになる。
Page_Load()メソッドはそのたびに呼び出されることに注意する。
(IsPostBackプロパティで初回リクエストとポストバックを区別することができる。)

※別のASPに遷移したい場合には、Actionイベントの最後に
Response.Redirect("after.aspx")を記述する。
そうすると、システムはHTMLを返すのではなく、
after.aspxへのアクセスをするようクライアントに指示することで画面遷移が行われる。
以降は上記1と同様である。


※ASP.NETではフォームへの入力データは同一ページにしか送信できない!!JSPに慣れていると、これを忘れて設計してしまうので、要注意ですね。

ASP.NET実行時の仕組み

ユーザーからリクエストを受け取ったASP.NETのシステムが
内部でどのような動作を行っているのかをまとめました。

1. ユーザーがIIS上の.aspxにアクセスする。

2. aspxファイルに記述したタグが初回時のみクラスファイルに変換される。
.aspxを元にしてWeb UIコントロールツリーが作成される。

<asp:XXX runat="server">はWebコントロール(System.Web.UI.WebControl)に、
<XXX runat="server">はHTMLコントロール(System.Web.UI.HtmlControl)に
それ以外はリテラルコントロールに変換され、Web UIコントロールに追加される。

適切なWeb/HTMLコントロールが存在しない場合は実行時エラーとなる。

3. リクエストごとに2で作成したクラスのインスタンスが生成される。
インスタンスは複数のリクエストで共有されない。

5. Page_Load()などのイベントが呼び出され、処理が行われる。

6. 最終的にはWeb UIコントロールツリーから
HTMLが出力されユーザーに返される。

.NETエンタープライズWebアプリケーション開発技術大全〈Vol.1〉.NET Framework導入編

.NETとはどんな展望を持って提唱された概念なのかを知りたい人向けです。現在の開発の現状、競合技術との比較、将来の展望などの概略が書かれています。

C/Sシステム、Webベースシステム、スマートクライアント型システムなどのシステム形態の概要とそれぞれのメリット、デメリットについても丁寧に説明されています。

とにかく動くプログラムを作りながら理解したい人は別の本を探したほうが良いでしょう。

Microsoft製品を暗に押している箇所にはちょっと抵抗感を感じますが、マイクロソフトから出している本なのだから仕方がないか。

内容が多少古い箇所もありますが、本書の概念を知っておいて損はないでしょう。

2006年11月18日

【Visual Studio】全画面表示ショートカット

Visual Studioで全画面表示するショートカット

Shift + Alt + Enter

ソースコードを書くビューだけを大きくしたい場合に役立ちます。
全画面表示の状態からもう一回入力すれば元に戻ります。

Eclipseだと Ctrl + M。

Javaの世界に戻ると、混乱しそうです。


GAC

GAC (Global Assembly Cache)
ギャックと読めばいいのでしょうか。

「ファイル名+バージョン番号+カルチャ情報+公開鍵によるデジタル署名」
でDLLを管理する手法。

複数のアプリケーションで共有するDLLをバージョンアップした際に
他のアプリケーションが動作しなくなる問題(DLL地獄)を解決する。

今まではバージョンが異なるDLLであっても、同一の名前で管理していたため、
上記のような問題が起きたため、GACのようにバージョンなどを付けて
DLLを厳密に管理するようになった。

※ GAC登録済のアセンブリをweb.configから参照する場合の例
<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>

【参考資料】
なぜ.NETが必要なのか?
http://www.atmarkit.co.jp/fwin2k/dnitpro/whatisdt01/whatisdt01_04.html

【その他技術】Windows DNA

Windows DNAとは、Microsoftが提供する
Webアプリケーションの開発を容易するための枠組み。

ASP (Active Server Pages), COM, ADOなどの
インターネット技術をWindowsに統合した。

1999年頃、Microsoftによって提唱されたが、
今ではMicrosoft.NETに置き換わっている。

2006年11月17日

【その他技術】COM

【COMって何?】
Component Object Modelの略。

開発を用意にするため、プログラムを部品化し再利用するための基盤となる技術仕様をMicrosoftが提供した。

これにより、任意の 2 つのコンポーネントが、実行するマシン (マシン同士が接続されている限り)、マシンのオペレーティング システム (COM がサポートされている限り)、コンポーネントが作成された言語に関係なく、互いに通信できるようになる。

既存のCOMコンポーネントを再利用するだけでなく、自分でCOMコンポーネントを作成することもできる。

【他の再利用方法よりCOMが優れている点は何?】
DLLではコンポーネントを修正するたびに全体の再ビルドが必要。
JavaBeansでは複数の言語に対応することが困難。

【COMを使うと何がうれしいの?】
ほとんどすべての言語で作成でき、ほとんどすべての言語から使用でき、どのマシンにでも(Windowsが主流だが)置くことができる。

インプロセス(DLL)、ローカル(同じマシン上の別プロセス中のEXE)、リモート(DCOMを通じてアクセスする別マシン上のDLLまたはEXE)の3種類のコンポーネントを使用するのに同じソースコードを記述すれば済む。どの種類のオブジェクトを使用することになるかを開発者は知る必要がない。

【参考資料】
COMテクノロジ:関連技術情報
http://www.microsoft.com/japan/com/compapers.asp#techdocs

COMとは:IT用語辞典
http://e-words.jp/w/COM.html

2006年11月15日

【Visual Studio 2005】コメントアウトのショートカット

コメントアウトしたい範囲を選択し、以下のショートカットを入力する。

コメントアウト:Ctrl + K + C
コメントアウトを解除:Ctrl + K + U