C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2006/11/29 10:21
CLI ( 共通言語基盤 ) のJIS規格詳細情報が、PDFファイルまたは冊子にて購入できます。
JSA Web Store-規格詳細情報(JIS)


[ 関連記事 ]
CLIがJIS規格に

[ 情報元 ]
Hiroyasu Kitagawa's Blog : CLIのJIS規格化のキーマンインタビュー
タグ: .NET C# CLI
2006/11/28 01:19
【 0. 流れ 】
コマンドレットを作成するにはいくつかの手順を踏む必要がある。大まかな流れは以下のようになる。

1. 準備
2 .NET Fx 2.0 のクラスライブラリとしてコマンドレットを作成する。
3 作成したクラスライブラリをインストールする。
4 PowerShellコンソールにスナップインとして登録する。


【 1. 準備 】
コマンドレットを作成するには、System.Management.Automation.dllというPowerShellのDLLを使用する。
PowerShell をインストールすると、このDLLもインストールされるのだが、このDLLはGACにインストールされる。GACにインストールされているDLLをVisual Studioで参照設定することはできない。また、GACから別のフォルダにアセンブリを移動したりコピーすることも通常はできない。
ではどうやってこのDLLを入手するかというと、Windows SDKをインストールすれば手に入る。Windows SDKをインストールすると、以下のフォルダにPowerShell用の各DLLが配置される。

C:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0

また、Windows SDKをインストールせずとも、手っ取り早く取得する方法もある。PowerShellを使ってGACにインストールされているアセンブリをコピーするという方法である。

[void] (New-Item -path $PSHome -itemType "directory" -name "SDK");
[System.AppDomain]::CurrentDomain.GetAssemblies() | Where {$_.FullName -like "*Version=1.0.0.0*";} | Copy-Item -path {$_.Location;} -destination ($PSHome + "\SDK");


このコマンドを実行すると、PowerShellのインストールフォルダ ( 通常はC:\Windows\system32\windowspowershell。 ) に、SDKというフォルダが作成され、そこにPowerShell用のアセンブリが配置される。 ( 配置先のパスは全く別の場所でも構わない。 )
この方法なら、わざわざWindows SDKをダウンロード&インストールする必要がない。特に理由がなければこの方法で充分である。



【 2 コマンドレットの作成 】

[ 2.1 プロジェクトの作成 ]
Visual Studio 2005にて、クラスライブラリプロジェクトを新規作成し、以下の2つのDLLを参照設定に追加する。

System.Management.Automation.dll
System.Configuration.Install.dll


[ 2.2 スナップインクラスの作成 ]
スナップインクラスによって、インストールスナップイン登録が可能となる。スナップインクラスは、一つのコマンドレットクラスライブラリに一つだけ用意する。

2.2.1 スナップインクラス
スナップインクラスは、PSSnapIn クラス (System.Management.Automation)の派生クラスとして作成する。  ( PSSnapInクラスは、Installer クラス (System.Configuration.Install)を継承している。 )
また、スナップインクラスにはRunInstallerAttribute クラス (System.ComponentModel)を属性として付加する。その際、属性の引数にはTrueを指定する。

PSSnapInクラスには以下の3つの抽象プロパティが用意されているので、これを実装する必要がある。

Nameプロパティ ( public abstract string Name { get; } )
スナップインの名称。
Venderプロパティ  ( public abstract string Vender { get; } )
スナップイン製作者の名称。
Descriptionプロパティ ( public abstract string Description { get; } )
スナップインの説明文。


2.2.2 実装例using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Management.Automation;

namespace YokoKen.PowerShell.Test
{
    [RunInstaller(true)]
    public class TestPSSnapIn : PSSnapIn
    {
        public override string Name
        {
            get
            {
                return "YokoKen.PowerShell.Test";
            }
        }

        public override string Vendor
        {
            get
            {
                return "YokoKen";
            }
        }

        public override string Description
        {
            get
            {
                return "この Windows PowerShell スナップインには、コマンドレット開発テスト用のコマンドレットが含まれています。";
            }
        }

        public TestPSSnapIn() : base()
        {
        }
    }
}


[ 2.3 コマンドレットクラスの作成 ]
コマンドレットはクラスとして実装する。一つのコマンドレットクラスで、一つのコマンドレットとなる。コマンドレットクラスは一つのクラスライブラリに複数作成することができる。

2.3.1 コマンドレットクラス
コマンドレットクラスは、Cmdlet クラス (System.Management.Automation)の派生クラスとして作成する。
また、コマンドレットクラスにはCmdletAttribute クラス (System.Management.Automation)を属性として付加する。その際、属性の引数には以下の2つを指定する必要がある。

verbName ( String型 )
コマンドレットの名称の動詞部分。
nounName ( String型 )
コマンドレットの名称の名詞部分。


2.3.2 コマンドレットのパラメータ
コマンドレットのパラメータは、コマンドレットクラスのプロパティとして実装する。パラメータとするプロパティには、setterを用意し、ParameterAttribute クラス (System.Management.Automation)を属性として付加する。属性にはいくつかの名前付き引数が用意されているが、以下の3つは特に重要である。

Mandatory ( Boolean型 )
コマンドレットを実行する際の必須パラメータかどうかを示す値。
Position ( Int32型 )
コマンドレットを実行する際のパラメータの ( 0から始まる ) 順番。
ValueFromPipeline ( Boolean型 )
パラメータの値をパイプラインから受け取ることができるかどうかを示す値。


2.3.3 コマンドレットの処理を実装
Cmdletクラスにはいくつかの仮想メソッドが用意されている。コマンドレットの処理は、この仮想メソッドをオーバーライドして実装する。主な仮想メソッドは以下の4つ。

BeginProcessingメソッド
事前処理を行うためのメソッド。「パイプラインで配列が渡されたためにコマンドレットが一度に複数回実行される」といった場合でも、このメソッドは最初に一度だけしか実行されない。
ProcessRecordメソッド
処理を行うためのメソッド。
EndProcessingメソッド
事後処理を行うためのメソッド。「パイプラインで配列が渡されたためにコマンドレットが一度に複数回実行される」といった場合でも、このメソッドは最後に一度だけしか実行されない。
StopProcessingメソッド
コマンドレットの実行中にCtrl+Cが押下された場合に実行されるメソッド。

なお、コマンドレットの実行中にCtrl+Cの押下によって処理が中断された場合、CmdletクラスのStoppingプロパティがTrueに設定される。中断されても、そのとき実行されていたメソッドは最後まで処理が行われる。ただし、Ctrl+Cによる中断が行われると、一時的にコンソールへの出力が無効となる。(よって、StopProcessingメソッド内でのコンソール出力処理は無意味。)


2.3.4 実装例using System;
using System.Collections.Generic;
using System.Text;
using System.Management.Automation;

namespace YokoKen.PowerShell.Test.Commands
{
    [Cmdlet("Out", "Hoge")]
    public class OutHogeCommand : Cmdlet
    {
        private int count;

        [Parameter(Mandatory = true, Position = 0)]
        public int Count
        {
            get
            {
                return this.count;
            }
            set
            {
                if (value < 0)
                {
                    throw new ArgumentOutOfRangeException("Count", "Countに負の値を設定することはできません。");
                }
                this.count = value;
            }
        }

        public OutHogeCommand() : base()
        {
            this.count = 0;
        }

        protected override void ProcessRecord()
        {
            StringBuilder outputBuilder = new StringBuilder();
            for (int i = 0; i < this.count; i++)
            {
                outputBuilder.Append("Hoge");
            }
            this.WriteObject(outputBuilder.ToString());
        }
    }
}


【 3. インストール 】
作成したクラスライブラリは、インストーラ ツール (Installutil.exe)を使って、インストールする必要がある。

PowerShellのインストールフォルダ内にSnapInというフォルダを作成し、そこに配置した"YokoKen.PowerShell.Test.dll"というアセンブリをインストールする場合、以下のようなコマンドになる。

&"$env:windir/Microsoft.NET/Framework/v2.0.50727/InstallUtil.exe" ($PSHome + "\SnapIn\YokoKen.PowerShell.Test.dll");


インストール後にクラスライブラリを別の場所に移動したり削除してはいけないことに注意。なお、クラスライブラリの配置場所は上記の例とは全く別の場所でも構わない。


【 4. スナップイン登録 】
インストールまで完了したら、あとはコンソールへのスナップイン登録のみである。
スナップイン登録は、Add-PSSnapinコマンドレットのnameパラメータにスナップインの名前を指定して実行するだけでできる。スナップインの名前とは、スナップインクラスに実装したNameプロパティが返す値である。
2.2.2 実装例のコードでは、Nameプロパティが"YokoKen.PowerShell.Test"という値を返すように実装した。この場合は以下のように"YokoKen.PowerShell.Test"を指定する。

Add-PSSnapin "YokoKen.PowerShell.Test";


これでコマンドレットが使用できるようになった。
なお、スナップイン登録は、PowerShellの起動のたびに行う必要がある。これが面倒な場合は、profile.ps1 を利用するという手がある。スナップイン登録のためのコマンドを profile.ps1 に記述しておくことにより、起動時に自動で実行される。 ( profile.ps1 については PowerShell 付属の「Windows PowerShell™ ファースト ステップ ガイド」を参照。 )


【 5. 実行 】
Out-Hoge 5; ってコマンドを実行すれば"HogeHogeHogeHogeHoge"って出力される。


【 6. 参考 】
Windows PowerShell SDK
System.Management.Automation Namespace
Web ChangeLog: MSH: Using MshSnapIn
Writing an useful cmdlet for Windows PowerShell - The Code Project - Vista / .NET 3.0
getting started with SDK in microsoft.public.windows.powershell
タグ: .NET PowerShell
2006/11/26 22:12
【 $Host 】
PowerShellでは、$Host変数によって、ホストアプリケーションへの参照を取得できる。
取得したホストアプリケーションは、System.Management.Automation.Internal.Host.InternalHost という型のインスタンスである。


【 配色 】
コンソールウィンドウの配色を変更するには、以下のプロパティを設定する。

通常の背景色
$Host.UI.RawUI.BackgroundColor
通常の文字色
$Host.UI.RawUI.ForegroundColor
エラーメッセージの背景色
$Host.PrivateData.ErrorBackgroundColor
エラーメッセージの文字色
$Host.PrivateData.ErrorForegroundColor
警告メッセージの背景色
$Host.PrivateData.WarningBackgroundColor
警告メッセージの文字色
$Host.PrivateData.WarningForegroundColor
詳細メッセージの背景色
$Host.PrivateData.VerboseBackgroundColor
詳細メッセージの文字色
$Host.PrivateData.VerboseForegroundColor
デバッグメッセージの背景色
$Host.PrivateData.DebugBackgroundColor
デバッグメッセージの文字色
$Host.PrivateData.DebugForegroundColor
進行状況メッセージの背景色
$Host.PrivateData.ProgressBackgroundColor
進行状況メッセージの文字色
$Host.PrivateData.ProgressForegroundColor

これらのプロパティの型はSystem.ConsoleColor列挙体である。


【 戯れ 】
こんなことができる。

function Hoge
{
    $originalColor = $Host.UI.RawUI.BackgroundColor;
    for ($index = 0; $index -lt $Args[0].Length; $index++)
    {
        if ($index % 2 -eq 0)
        {
            $Host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::Red;
        }
        else
        {
            $Host.UI.RawUI.BackgroundColor = [System.ConsoleColor]::Black;
        }
        $Host.UI.Write($Args[0][$index]);
    }
    $Host.UI.RawUI.BackgroundColor = $originalColor;
    $Host.UI.WriteLine([string]::Empty);
}

Hoge "この文字列だけ背景色が交互に赤と黒になります。";
Hoge "こうすると", "文節単位で", "背景色が", "交互に", "赤と黒に", "なります。";


これの実用性は不明^^;
タグ: .NET PowerShell
2006/11/22 13:10
MSDN バーチャルラボ

Web上のバーチャルサーバー環境へとアクセスして、マイクロソフトの最新の開発ツールやサーバー製品を、無償で評価できるらしい。
コンテンツごとのアクセス時間は最長90分とのこと。
ブラウザからのバーチャルサーバー環境へのアクセスなので、 クライアントに何かをインストールする必要は一切ない。 Microsoft Virtual Server VRMC Advanced Control というActiveXコントロールのみインストールする必要があるが、評価する製品はクライアント上にインストールする必要がない(というよりできない)。

[ 記事の元ネタ ]
Hiroyasu Kitagawa's Blog : MSDNバーチャル ラボ開始
タグ: .NET MSDN
2006/11/21 10:51
なったそうです。

Microsoft(R) .NET Frameworkの基本仕様である共通言語基盤(CLI)が日本工業規格(JIS) X3016として公示
http://www.microsoft.com/japan/presspass/detail.aspx?newsid=2885

C#に続き.NETの言語基盤もJIS標準に:ITpro
http://itpro.nikkeibp.co.jp/article/NEWS/20061117/254056/

.NETの中核仕様がJIS規格に、「情報家電や携帯端末への普及を期待」:ITpro
http://itpro.nikkeibp.co.jp/article/NEWS/20061120/254280/


[ 関連記事 ]
CLIの規格詳細情報
タグ: .NET CLI
2006/11/20 18:38
タグ: .NET Windows PowerShell
2006/11/19 22:04
ソースコードの装飾を行うためのJavaScriptクラスライブラリを作ってみました。

概要
動作環境
試してみる
使い方
DecorationContextについて
Download


【 概要 】
ソースコードの装飾を行います。
ソースコードの装飾が動的に行われるため、Webサイトにソースコードを掲載する際に、わざわざ手作業で装飾する必要がなくなります。
現在の所、C#コードの装飾、JavaScriptコードの装飾、XMLの装飾をサポートしています。
また、自分で装飾の規則を作成することもできます。 ( 指定した正規表現にマッチする箇所に対して、文字色・背景色の着色,太字指定,下線指定,フォントサイズ指定,フォントファミリ指定ができます。 )


【 動作環境 】
動作確認済みのブラウザは以下のブラウザになります。その他のブラウザでの動作は未確認です。
  • Internet Explorer 6.0
  • Internet Explorer 7.0
  • FireFox 1.5


【 試してみる 】
テストページを用意しました。
入力エリアにソースコードを入力し、装飾タイプを設定後、実行ボタンをクリックしてみてください。
TextDecoration.js テストページ


【 使い方 】
[ HtmlDecoratorのインスタンス化 ]
まず、YokoKen.TextDecoration.HtmlDecoratorクラスを引数なしでインスタンス化します。

var decorator = new YokoKen.TextDecoration.HtmlDecorator();

[ DecorationContextの生成 ]
DecorationContextについてを参照してください。


[ HtmlDecoratorオブジェクトにDecorationContextオブジェクトを設定 ]
HtmlDecoratorオブジェクトのsetDecorationContextメソッドを使って、DecorationContextオブジェクトを設定してやります。

decorator.setDecorationContext(context);

[ 装飾 ]
装飾したい文字列を引数に指定してdecorateメソッドを使うと、装飾されて戻ってきます。

var textbox1 = document.getElementById("textbox1");
var text = textbox1.value;
var decorationText = decorator.decorate(text);


decorateメソッドに渡す文字列は、HTML化された文字列ではなく、純粋な文字列を渡してください。(ようするに、実体参照とか改行タグとかダメです。)
YokoKen.TextDecoration.HtmlDecorator クラスのparseHtmlToTextという静的メソッドを使えば、実体参照や改行タグを含んだ文字列を純粋な文字列に変換してくれます。(改行タグ以外のタグは含めないで下さい。改行タグ以外は無視します。)

var div1 = document.getElementById("div1");
var text = YokoKen.TextDecoration.HtmlDecorator.parseHtmlToText(div1.innerHTML);
var decorationText = decorator.decorate(text);


【 DecorationContextについて 】
DecorationContextクラスは、装飾規則を表すクラスです。
現在の所、このDecorationContextの生成方法には、以下の方法があります。

[ 予め用意されている着色規則を利用する ]
YokoKen.TextDecoration.Specialized.DecorationContextFactoryオブジェクトのメソッドを使用して、予め用意されているDecorationContextオブジェクトを生成することができます。
現状、このオブジェクトには、以下の3つのメソッドが用意されています。
  • createCSharpDecorationContextメソッド ( C#コード装飾用のDecorationContextオブジェクトを生成 )
  • createJavaScriptDecorationContextメソッド ( JavaScriptコード装飾用のDecorationContextオブジェクトを生成 )
  • createXMLDecorationContextメソッド ( XML装飾用のDecorationContextオブジェクトを生成 )
var context = YkoKen.TextDecoration.Specialized.DecorationContextFactory.createCSharpDecorationContext();

[ XMLファイルに記述する ]
独自の装飾規則を、XMLファイルに記述して利用することができます。
XMLファイルには、装飾する箇所を示す正規表現の指定、文字色・背景色の着色,太字指定,下線指定,フォントサイズ指定,フォントファミリ指定ができます。 (  もう少し詳しい解説が欲しいという方は、この記事にコメントしてください。 )
XMLファイルに記述する際は、 DecorationContext XMLスキーマ に従う必要があります。( アップローダの都合でファイル名の末尾に".txt"が付加されています。ローカルに保存後、ファイル名末尾の".txt"を削除してください。 )

以下、参考までに。( ローカルに保存後、ファイル名末尾の".txt"を削除してください。 )
C#コードの装飾規則 XMLファイル
JavaScriptコードの装飾規則 XMLファイル
XMLコードの装飾規則XMLファイル

作成したXMLファイルを利用するには、YkoKen.TextDecoration.DecorationContext.createInstanceFromXmlメソッドを使用します。

var context = YkoKen.TextDecoration.DecorationContext.createInstanceFromXml("CSharp.xml");
decorator.setDecorationContext(context);


【 DownLoad 】
TextDecoration.js

※ 使用する際は、直リンクせず、自分のWebサイトにTextDecoration.jsを配置して使用してください。
2006/11/19 17:16
前回の記事に続き、JavaScriptでのOOPについて。


前回の記事でほんの少し書いたが、プライベートメソッド内に記述されたthisキーワードは、通常はwindowオブジェクトを参照してしまう。

< そもそもthisキーワードって? >

thisキーワードは、コンテキストオブジェクト を参照するためのキーワードである。
thisキーワードがwindowオブジェクトを参照するということは、その関数のコンテキストオブジェクトがwindowオブジェクトであるということになる。


< なぜコンテキストオブジェクトがwindowオブジェクトになってしまうのか? >

これは、プライベートメソッドの 呼び出し方 に原因がある。
プライベートメソッドは、プライベートフィールドに対して関数を設定することで定義できると、前回説明した。そうすると、プライベートメソッドの呼び出し方は

this.privateMethod1():
や、

obj.privateMethod1();
といった、インスタンス経由での呼び出し方はできないので、

privateMethod1();
という、直接的な呼び出し方になる。

この呼び出し方をすると、その関数のコンテキストオブジェクトがwindowオブジェクトになってしまうのである。 ( むしろ、コンテキストオブジェクトがwindowオブジェクトなのが普通であり、インスタンス経由で呼び出した時が特殊な動作をしている。これについてはこの記事の最後で。 )


< プライベートメソッドのコンテキストオブジェクトを、期待通りにするには? >

これには、Functionオブジェクトの applyメソッド 、または callメソッド を利用する。
applyメソッドとcallメソッドは、コンテキストオブジェクトを指定して関数を実行することができる。

function Hoge()
{
    var privateMethod1 =
        function()
        {
            return this;
        };

    this.privilegedMethod1=
        function()
        {
            var obj1 = privateMethod1(); // windowオブジェクトが返される。
            var obj2 = privateMethod1.apply(this); // Hogeオブジェクトが返される。
        };
}


applyメソッドとcallメソッドの違いは、関数に渡す引数の指定方法のみである。
applyメソッドは、第一引数でコンテキストオブジェクトを受け取り、第二引数で関数に渡す引数の配列を受け取る。
callメソッドは、第一引数でコンテキストオブジェクトを受け取り、第二引数以降で関数に渡す引数を受け取る。

function fuga(arg1, arg2)
{
}

var context = new Object();
var arg1 = 1;
var arg2 = 2;
var args = [arg1, arg2];

fuga.apply(context, args); // applyは第二引数に配列で指定する。
fuga.call(context, arg1, arg2); // callは第二引数以降に指定していく。


< 呼び出し方が原因ということは・・・ >

実は、パブリックメソッドやプレビレッジドメソッドも、同じ呼び出し方をすれば、コンテキストオブジェクトがwindowオブジェクトになる。

function Hoge()
{
}

Hoge.prototype.publicMethod1 =
    function()
    {
        return this;
    };

var hogeObj = new Hoge();
var obj1 = hogeObj.publicMethod1()) // 当然、hogeObjを返してくる。

var func = hogeObj.publicMethod1; // publicMethod1自体をfuncに入れる。
var obj2 =  func() // func()という風に呼び出すと、windowオブジェクトを返してくる。


< インスタンス経由での呼び出しは暗黙的に・・・ >

this.メソッド名()  や、 インスタンス名.メソッド名() といった、インスタンス経由での呼び出し方をすると、そのインスタンスがコンテキストオブジェクトとなる。しかし、applyやcallも使わず、普通に関数を呼び出した場合、コンテキストオブジェクトはwindowオブジェクトとなる。

つまり、インスタンス経由での関数呼び出しは、暗黙的にコンテキストオブジェクトを指定して実行されるのである。 ( 内部でapplyやcallを呼び出しているのか、applyやcallに実装されている処理を直接行っているのかどうかは知らないけど。。。 )
タグ: JavaScript
2006/11/14 00:11
JavaScriptはオブジェクト指向言語である。
ただし、”クラスベース”のオブジェクト指向言語 ( C#やJavaなど ) ではなく、”プロトタイプベース”のオブジェクト指向言語である。

以下、JavaScriptでのOOPについての簡単な解説。


【 コンストラクタ 】
オブジェクトの雛形は " コンストラクタ " と呼ばれる関数として定義する。これは、クラスベース オブジェクト指向言語の " クラス " に相当する。コンストラクタは関数なので、普通の関数と同じように呼び出すこともできる。 ( 普通、そんな使い方はしないけど。 )
コンストラクタからオブジェクトを生成するには、new 演算子を用いる。
// Hogeコンストラクタ
function Hoge()
{
}

// Hogeオブジェクト生成
var hogeObj = new Hoge();


[ thisキーワード ]
コンストラクタ内 ( と、後述するインスタンスメソッド内 ) では、thisキーワードによって、コンストラクタのインスタンスを参照することができる。
ただし、プライベートメソッド内では、通常は、コンストラクタのインスタンスではなくwindowオブジェクトを参照してしまうので注意。( 詳細はこちらの記事


【 インスタンスフィールド 】
インスタンスフィールドは2種類に大別できる。

[ パブリックフィールド ]
パブリックフィールドには、インスタンスの外部からアクセスすることができる。
定義するには、コンストラクタ内で、そのコンストラクタのインスタンスに対して動的にフィールドを追加する。
function Hoge()
{
    this.publicField1 = 0;
}


[ プライベートフィールド ]
プライベートフィールドには、インスタンスの外部からアクセスすることができない。また、パブリックメソッド ( 後述 ) からもアクセスすることができない。
定義するには、コンストラクタ内で、varキーワードによる変数宣言を行う。また、コンストラクタの引数リストも、プライベートフィールドとなる。
function Hoge(arg1, arg2)    // arg1とarg2もプライベートフィールド
{
    var privateField1 = 0;
}

なお、プライベートフィールドは、 this.[ プライベートフィールド名 ] といった参照の仕方ができないので注意。参照するには直接プライベートフィールド名を記述する。


【 インスタンスメソッド 】
インスタンスメソッドは3種類に大別できる。

[ パブリックメソッド ]
パブリックメソッドには、インスタンスの外部からアクセスすることができる。また、パブリックメソッド内から、プライベートなメンバにアクセスすることはできない。
定義するには、コンストラクタのprototypeプロパティ ( 詳細はそのうち... ) に格納されているオブジェクトに、メソッドを追加する。
function Hoge()
{
}

Hoge.prototype.publicMethod1 =
    function()
    {
    };

prototypeプロパティに格納されているオブジェクトに対してメソッドを追加するため、パブリックメソッドとなる関数オブジェクトは、ソースコードのロード時に一度だけ生成される。


[ プレビレッジドメソッド ]
プレビレッジドメソッドには、インスタンスの外部からアクセスすることができる。また、プレビレッジドメソッド内から、プライベートなメンバにアクセスすることができる。
定義するには、コンストラクタ内でインスタンスフィールドに関数オブジェクトを設定する。
function Hoge()
{
    this.privilegedMethod1 =
        function()
        {
        };
}

コンストラクタ内で自分自身のパブリックフィールドにメソッドを追加するので、プレビレッジドメソッドとなる関数オブジェクトは、コンストラクタ実行 ( インスタンス化 ) のたびに生成される。


[ プライベートメソッド ]
プライベートメソッドには、インスタンスの外部からアクセスすることはできない。また、プライベートメソッド内から、プライベートなメンバにアクセスすることができる。
定義するには、コンストラクタ内でプライベートフィールドに関数オブジェクトを設定する。
function Hoge()
{
    var privateMethod1 =
        function()
        {
        };
}

コンストラクタ内で自分自身のプライベートフィールドにメソッドを追加するので、プライベートメソッドとなる関数オブジェクトは、コンストラクタ実行 ( インスタンス化 ) のたびに生成される。


【 静的メソッド 】
静的メソッドは必ずパブリックになる。インスタンスフィールドやインスタンスメソッドにはアクセスすることができない。
定義するには、コンストラクタ関数自体のインスタンスフィールドに関数オブジェクトを設定する。前述したように、コンストラクタは、それ自体が ( 関数 ) オブジェクトである。
function Hoge()
{
}

Hoge.staticMethod1 =
    function()
    {
    };


【 オブジェクトを直接表記 】
以前書いた記事を参照


【 参考 】
Collection & Copy - JavaScriptにおけるプライベートメンバ
タグ: JavaScript
2006/11/08 10:50
[ 実行環境 ]
ダウンロードの詳細 : Microsoft .NET Framework 3.0 再頒布可能パッケージ
.NET Framework 3.0 の実行環境 ( 日本語版 ) 。

Download details: Microsoft .NET Framework 3.0 Redistributable Package
.NET Framework 3.0 の実行環境 ( 英語版 ) 。

ダウンロードの詳細 : Microsoft .NET Framework 3.0 Language Packs
.NET Framework 3.0 の実行環境 ( 英語版 ) の言語パック。


[ 開発環境 ]
Download details: Microsoft Windows SDK for Windows Vista
.NET Framework 3.0 の開発環境 ( +諸々 ) 。
// 追記 ( 2007/03/24 )
Windows SDK をインストールする前に、こっちの記事も参照
C#と諸々 Windows SDK Update for Windows Vista リリース
// 追記ここまで

Download details: Visual Studio 2005 extensions for .NET Framework 3.0 (Windows Workflow Foundation)
Visual Studio 2005上でWFを利用した開発を行うためのアドイン。

Download details: The Visual Studio 2005 extensions for.NET Framework 3.0 (WCF & WPF), November 2006 CTP
Visual Studio 2005上でWCFとWPFを利用した開発を行うためのアドイン。(CTP版。正式版リリースの予定はない。)


[ 解説サイト ]
.NET Framework 3.0 環境構築
.NET Framework 3.0 の実行環境 / 開発環境 の構築に関する解説。


[ 関連ニュース ]
スラッシュドット ジャパン | Microsoft .NET Framework 3.0 正式版リリース
タグ: .NET
2006/11/02 14:08
innerHTMLって、特定の実体参照以外は、勝手に解釈して実体(文字)に置換するみたい。
特定の実体参照ってのは、以下の4つ。

&nbsp; [ 実体:" " ]
&lt; [ 実体:"<" ]
&gt; [ 実体:">" ]
&amp; [ 実体:"&" ]

この4つを除く実体参照がinnerHTMLに設定されても、実体に置換されてしまう。
JavaScriptからではなく、HTMLに直接記述した場合も同様。

この4つの実体参照をinnerHTMLに設定した場合は、実体参照のまま設定されるのだが、
&nbsp;を除く3つの実体参照は、その実体をinnerHTMLやinnerTextに設定した場合も、
実体参照に置換されて設定される。 ( ただし、"&"に関しては、実体としてinnerHTMLに設定することはできない。 )
なお、数値文字参照 ( 例えば、&#x3c; [ 実体:"<" ] ) を指定しても、文字実体参照 ( この場合、&lt; ) に置換される。

検証コードvar div1 = document.getElementById("div1");
var div2 = document.getElementById("div2");
var div3 = document.getElementById("div3");
var div4 = document.getElementById("div4");

div1.innerHTML = "&quot;&omega;"; // これらは実体に置換される。
div2.innerHTML = "\"ω"; // そのまま。
div3.innerHTML = "&lt;&gt;&amp;"; // そのまま。
// ↓だと&を設定できない。
// div4.innerHTML = "<>&";
div4.innerText = "<>&"; // これらは実体参照に置換される。

alert(div1.innerHTML);
alert(div2.innerHTML);
alert(div3.innerHTML);
alert(div4.innerHTML);


ちなみに、HTMLに直接記述した場合にも、同様の処理が適用される。

[ 参考 ]
実体参照 - Wikipedia
Wikipedia:特殊記号 - Wikipedia
タグ: JavaScript
2006/11/01 19:55
ヾ(o゚ω゚o)ノ゙ プニプニ!

using System;
using System.Collections.Generic;
using System.Text;

namespace YokoKen.Test
{
    /// <summary>
    /// ほげを表すクラス。
    /// </summary>
    public sealed class Hoge
    {
        #region フィールド

        #region private readonly string name

        /// <summary>
        /// ほげ名。
        /// </summary>
        private readonly string name;

        #endregion

        #region private readonly List<Hoge> childHogeList

        /// <summary>
        /// 子ほげのコレクション。
        /// </summary>
        private readonly List<Hoge> childHogeList;

        #endregion

        #endregion

        #region プロパティ

        #region public string Name

        /// <summary>
        /// ほげ名を取得する。
        /// </summary>
        public string Name
        {
            get
            {
                return this.name;
            }
        }

        #endregion

        #region public List<Hoge> ChildHogeList

        /// <summary>
        /// 子ほげのコレクションを取得する。
        /// </summary>
        public List<Hoge> ChildHogeList
        {
            get
            {
                return this.childHogeList;
            }
        }

        #endregion

        #endregion

        #region コンストラクタ

        #region public Hoge(string name)

        /// <summary>
        /// ほげ名を指定して、Hoge クラスの新しいインスタンスを初期化する。
        /// </summary>
        /// <param name="name">ほげ名。</param>
        public Hoge(string name) : this(name, new List<Hoge>())
        {
        }

        #endregion

        #region public Hoge(string name, List<Hoge> childHogeList)

        /// <summary>
        /// ほげ名と子ほげを指定して、Hoge クラスの新しいインスタンスを初期化する。
        /// </summary>
        /// <param name="name">ほげ名。</param>
        /// <param name="childHogeList">子ほげ。</param>
        public Hoge(string name, List<Hoge> childHogeList)
        {
            this.name = name;
            this.childHogeList = childHogeList;
        }

        #endregion

        #endregion

        #region メソッド

        #region public void Piyo()

        /// <summary>
        /// ぴよ。
        /// </summary>
        /// <returns>ぴよぴよ</returns>
        public string Piyo()
        {
            // ぴよぴよを返す。
            return "ぴよぴよ";
        }

        #endregion

        #endregion
    }
}
タグ: