2008年7月29日火曜日

[.NET]Controlのstatic変数

以前、GDD Blog: [.NET]キーボードステータスの取得(その2)でControlのstatic変数からキー押下情報を取得できるという記事を書きましたが。このControlのstatic変数、ほかにも以外に使えそうなプロパティがあるので紹介します。


  • DefaultFont コントロールの既定のフォント
  • ModifierKeys 押下されている修飾子キー(以前紹介)
  • MouseButtons 押下されているマウスボタン
  • MousePosition 押下されたマウス座標
  • IsKeyLocked(メソッド) CapsLock、NumLock、ScrollLock が押下ON状態か判定

いやー以外と使えそうなのがそろっていますねぇ。

2008年7月28日月曜日

[.NET]キーボードステータスの取得(その2)

GDD Blog: [.NET]キーボードステータスの取得では「p/invokeでないと無理」と記載しましたが、アレが誤りであることがわかりました。で、実装はこのようなかんじ。
    if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
    {
        //シフトキー押下の処理
        MessageBox.Show("緊急停止!!");
    }

2008年7月25日金曜日

[.NET]enumの不思議

ふと、以下のような定義の場合、enm1.data1 == enm1.data3の式が成り立つかどうか気になりました。で実行してみました。答えはTrue。いやー意外な結果でした。

enum enm1
{
    data1 = 100,
    data2200,
    data3 = data1,
}

System.Diagnostics.Debug.WriteLine("enm1.data1 = enm1.data3 = " + (enm1.data1 == enm1.data3));


ついでにほかのバリエーションもいろいろ試してみました。
enum enm1
{
    data1 = 100,
    data2200,
    data3 = data1,
}

enum enm2
{
    data1 = 100,
}

System.Diagnostics.Debug.WriteLine("1. enm1.data1.Equals(enm1.data1) = " + enm1.data1.Equals(enm1.data1));
System.Diagnostics.Debug.WriteLine("2. enm1.data1.Equals(enm1.data3) = " + enm1.data1.Equals(enm1.data3));
System.Diagnostics.Debug.WriteLine("3. enm1.data1.Equals(enm2.data1) = " + enm1.data1.Equals(enm2.data1));
System.Diagnostics.Debug.WriteLine("4. enm1.data1.Equals(100) = " + enm1.data1.Equals(100));
System.Diagnostics.Debug.WriteLine("5. enm1.data1.Equals((enm1)100) = " + enm1.data1.Equals((enm1)100));

System.Diagnostics.Debug.WriteLine("6. " + ((enm1)100).ToString() );
System.Diagnostics.Debug.WriteLine("7. enm1.data1 = enm1.data3 = " + (enm1.data1 == enm1.data3));


結果は以下のとおり。

1. enm1.data1.Equals(enm1.data1) = True
2. enm1.data1.Equals(enm1.data3) = True
3. enm1.data1.Equals(enm2.data1) = False
4. enm1.data1.Equals(100) = False
5. enm1.data1.Equals((enm1)100) = True
6. data1
7. enm1.data1 = enm1.data3 = True


実験の結果、値が同じでかつ型が同じであれば等価。という意味に取れますね。

2008年7月23日水曜日

[.NET]ホスト名にアンダースコア ("_")が含まれると...(ASP.NET)

@itの掲示板を眺めていると、localhostだと大丈夫なのに、ホスト名で動作させるとログインできない。との問題が発生している人がいました。
で、結果として、ホスト名に("_")が含まれるためその現象が起こっていたとの事らしい。備忘録としてメモ。

情報もとのソース「[PRB] Internet Explorer セキュリティ修正プログラム MS01-055 のインストール後、セッション変数が要求間で保持されない


で対処方法がちょっと悲しい。
  • ドメインとサーバーの名前変更する
  • ドメイン名やサーバー名ではなく、IPアドレスでアクセスする

後からではどうしようもない場合も。。。

2008年7月12日土曜日

[他]VBScriptのデバッグ

最近、レガシーASP(ASP.NETどではない)の仕事をやっていた経緯があり、とある調査を依頼されました。
依頼されたものの、ぜんぜん関係ないところから、振って沸いた話であったため、社内に動作させる環境がありませんでした。IISの環境はありましたがDBやその他もろもろの環境を構築するのに手間がかかりそうだったので、とりあえずコードから追っかけてみると、とあるメソッドの障害っぽことがわかりました。そのためASPの動作環境を作る前に、ソースの一部を抜粋して、vbsとして動作するようにしてみました。vbsであれば、

 CScript [scriptname.vbs] //X

でデバッガを起動することができます。予想したとおり、障害の原因らしきものにあたりがつきました。その旨を依頼元に回答しました。あとは本番系の環境で試してもらうしかないですね。

とりあえずノルマは達成できましたが、その後うまく行ったのだろうか。。。

2008年7月10日木曜日

[.NET]C#の演算子

基本的にC/C++と同じようなシンタックスのC#の演算子ですが、ときどき「あれ?アノ演算子ってどうかくんだっけ?」とど忘れ(老衰)してしまうことがあります。
今日は、xorの演算子が思い出せませんでした。で調べると「C# の演算子」に一覧でまとめられていました。便利なので備忘録としてメモ。

ちなみにxorは[^]ですが、必要だったのはキー押下のCTRL/SHIFT/ALTのビットを落とすのが目的だったので、ANDとビット反転ということに後で気がつきました。

2008年7月7日月曜日

[他]ASP(.NETではない)のUTF-8化

とある仕事で、過去のASPを使いそれをUTF-8化しつつ改修すると言う案件がありました。
しかし、直していくとなぜか文字化けするページとそうでもないページといろいろばらつきがあり、困った状態になりました。で、基本に立ち返りgoogleで検索すると、大西彰さんのblogにたどり着くことができました。

ここではポイントが2点紹介されています。
  1. コードページの明示(<%@ Language="VBScript" CodePage=65001 %>)
  2. <head>タグにcharasetを指定(<meta equiv="Content-Type" content="text/html; charset=utf-8">)

私は1の情報を知らずに、Session.CodePage=65001というやり方でUTF-8を実現していました。書いてあるとおりにコードを修正してみると、あっさり文字化けが解消されてしまいました。

2008年7月4日金曜日

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

ちょっと前に、レガシーASP(ASP.NETではない)を調査していました。それらしく動作させる環境ができたので、どうしてもわからない箇所や難解なロジックを確認するため、デバッグ実行でブレークポイントをはって。。。といった調査を実施しました。
で、レガシーASPのデバッグのやり方について、簡単に紹介します。
フリーではスクリプトデバッガなどありますが、VSを使う場合に限定すると、私の知る限り2種類あります。

  1. プロセスにアタッチして、ステップ実行する
  2. ASP.NETプロジェクトを作成する。プロジェクトタブのデバッグオプション?のASPをチェックする

(1)の方法は、VS.NET2003,VS2005の両方で実施することができます。しかし(2)の方法はVS.NET2003でしか実施できません。
(2)の方法の場合、IISのデバッグ実行するのチェックをチェックしなくてもよいため、実施が楽なのです。(1)の方法ではIISのデバッグ実行するのチェックにチェックしなければいけないのですが、これをやるとなぜかlocalhostに対してのPOSTがタイムアウトしてしまうことがあるのです。。。

もう、VS.NET2003はイラネーと思っていたのですが、レガシーASPを調査する場合はこの(2)の方法が使いたくなっちゃいます。私だけかもしれませんが。。。

2008年7月2日水曜日

[.NET]ASP.NETの予約フォルダ

システム開発をしていると、作成しているアプリケーション動作設定用のxmlなどが必要な場合があり、それをどこか適当な場所に置きたい場合があります。
Webアプリの場合、アプリケーションフォルダを基準に配備すると、メンテナンスが楽で便利です。
反面、Webシステムであるため、ファイル名さえわかればそのxmlを見られてしまうという危険性があります(逆に見えて便利。という意見もあ。。。)。

で、調べてみると、App_Dataなるフォルダがその目的にマッチします。その他にも予約のフォルダがあります。詳しくはASP.NET Web サイトのレイアウトが参考になります。

で、早速App_Dataにxmlファイルを置いて念のため、ブラウザでアクセス確認。すると、もろみえ。
よくよく調べてみると、ASP.NET2.0以降のようで。。。
仕方がないので、いろいろ試してみると、ASP.NET1.1系で、ファイルまたはフォルダ名に「.config」を含むとWEBからアクセスできなくなるようなのです。
しかし、そういうものだというソースはありません。微妙といえば微妙。困った場合こんな逃げ手を思い出そう。