技術者派遣の技術日誌ブログ

November 29, 2008

Adapterパターン (継承版) -機能の階層と実装の階層を分ける-

Filed under: .NET Framework, Asp.Net — Tags: , , — Sayuri @ 7:23 pm

現状のアプリケーションのアーキテクチャをアプリケーションの形態毎にまとめた資料(でいいのかな?)がcodeplexで公開されています。
Pocket Guideといいつつ150ページぐらいのものが多いですが。。。

アプリケーションを構築する上で、どういう技術要素を選択するか、といった時点で参考になることも多そうです。
ざっとでも見ておきたいとこですが、、、分量がなぁ(w

Builderパターン -複雑なインスタンスを組み立てる

Filed under: .NET Framework, C# — Tags: , , — Sayuri @ 7:19 pm

なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。


Builder

using System;
namespace Gushwell.DesignPatterns {
public abstract class Builder {
public abstract void MakeTitle(string title);
public abstract void MakeString(string str);
public abstract void MakeItems(string[] items);
public abstract void Close();
}
}

TextBuilder

using System;
using System.Text;
namespace Gushwell.DesignPatterns {
public class TextBuilder : Builder {
// このフィールドに文書を構築していく
private StringBuilder buffer = new StringBuilder();
// 完成した文書
virtual public string Result {
get { return buffer.ToString(); }
}
// プレーンテキストでのタイトル
public override void MakeTitle(string title) {
buffer.Append("==============================\n"); // 飾り線
buffer.Append("『" + title + "』\n");           // 『』つきのタイトル
buffer.Append("\n");                            // 空行
}
// プレーンテキストでの文字列
public override void MakeString(string str) {
buffer.Append('■' + str + "\n");               // ■つきの文字列
buffer.Append("\n");                            // 空行
}
// プレーンテキストでの箇条書き
public override void MakeItems(string[] items) {
for (int i = 0; i < items.Length; i++) {
buffer.Append(" ・" + items[i] + "\n");    // ・つきの項目
}
buffer.Append("\n");                            // 空行
}
// 文書の完成
public override void Close() {
buffer.Append("==============================\n"); // 飾り線
}
}
}

HTMLBuilder

using System;
using System.IO;
namespace Gushwell.DesignPatterns {
public class HTMLBuilder : Builder {
private string filename;        // 作成するファイル名
private StreamWriter writer;    // ファイルに書き込む
// 完成した文書
public virtual string Result {
get { return filename; }    // ファイル名を返す
}
// HTMLファイルでのタイトル
public override void MakeTitle(string title) {
filename = title + ".html"; // タイトルを元にファイル名決定
try {
writer = new StreamWriter(filename, false);
} catch (System.IO.IOException e) {
Console.WriteLine(e.StackTrace);
}
// タイトルを出力
writer.WriteLine("");
writer.WriteLine("");
writer.WriteLine("

" + title + "

"); } // HTMLファイルでの文字列 public override void MakeString(string str) { writer.WriteLine(" " + str + " "); // タグで出力 } // HTMLファイルでの箇条書き public override void MakeItems(string[] items) { writer.WriteLine("
    "); //
    • で出力 for (int i = 0; i < items.Length; i++) { writer.WriteLine("
    • " + items[i] + "
    • "); } writer.WriteLine("
    "); } // 文書の完成 public override void Close() { writer.WriteLine(""); // タグを閉じる writer.Close(); // ファイルをクローズ } } }

Director

using System;
namespace Gushwell.DesignPatterns {
public class Director {
private Builder builder;
public Director(Builder builder) {
// Builderのサブクラスのインスタンスが与えられるので、
// builderフィールドに保持しておく。
this.builder = builder;
}
public virtual void Construct() {
// 文書構築
builder.MakeTitle("Greeting");              // タイトル
builder.MakeString("朝から昼にかけて");     // 文字列
builder.MakeItems(new string[]
{ "おはようございます。", "こんにちは。" });
builder.MakeString("夜に");                 // 別の文字列
builder.MakeItems(new string[]
{ "こんばんは。", "おやすみなさい。", "さようなら。" });
builder.Close();                            // 文書を完成させる
}
}
}

Program

using System;
namespace Gushwell.DesignPatterns {
public class Program {
public static void Main(string[] args) {
if (args.Length != 1) {
Usage();
return;
}
if (args[0].Equals("plain")) {
TextBuilder textbuilder = new TextBuilder();
Director director = new Director(textbuilder);
director.Construct();
string result = textbuilder.Result;
Console.WriteLine(result);
} else if (args[0].Equals("html")) {
HTMLBuilder htmlbuilder = new HTMLBuilder();
Director director = new Director(htmlbuilder);
director.Construct();
string filename = htmlbuilder.Result;
Console.WriteLine(filename + "が作成されました。");
} else {
Usage();
return;
}
}
public static void Usage() {
Console.WriteLine("Usage: BuilderSample plain プレーンテキストで文書作成");
Console.WriteLine("Usage: BuilderSample html  HTMLファイルで文書作成");
}
}
}

Windows Server 2008 に SharePoint Server 2007 をインストールする際の注意点

Filed under: .NET Framework, ALL, IIS — Tags: , — citiszo @ 7:10 pm

デモ環境を作っていて確認したことですが、

WIndows Server 2008 の環境に SharePoint Server 2007 をそのまま、インストールしてもエラーが出てインストールできません。

これは、初期版の SharePoint Server 2007 が Windows Server 2008 に対応していないためです。

なので、インストールメディアの Updates フォルダ(更新プログラムを放り込むフォルダですね。)に SP1 を適用してから、インストールする必要があるとのことです。

また、テスト環境での確認であれば、MSDN サブスクリプションから、SP1 適用済みのメディアがダウンロードできますので、それを利用してもインストールすることはできます。

情報が公開されていても分かりづらいようなので、この場でご紹介させていただきました。

正式な情報は以下です。

Windows Server 2008 で Office SharePoint Server 2007 のスタンドアロン インストールを実行する

http://technet.microsoft.com/ja-jp/library/cc262177.aspx

November 25, 2008

Azure上でMembershipを利用する

Filed under: .NET Framework, ADO.NET, Asp.Net, MS SQL Server — Tags: , — citiszo @ 8:37 am

Cloudship: Membership Provider for the Cloud

ASP.NETに組み込まれているMembershipの各コントロールは、標準だとMembershipProviderを通してSQL Server上のデータベースに格納されているユーザ情報を利用するようになっています。
Azureではデータはクラウド上の専用のストレージに格納することになりますが、そこにユーザ情報を格納して利用できるようなMembershipProviderを作成する方法が例示されています。

この手のプロバイダは標準で提供されるようになるような気もしますが、知っておいて損はないかと。

#あれ、SDKに含まれるサンプルにMembership使ってるものなかったかな。。。

November 21, 2008

FactoryMethod ― インスタンス作成をサブクラスにまかせる

Filed under: .NET Framework, ADO.NET, ALL, C# — Tags: , , , , , — Sayuri @ 11:14 am

なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。

Productクラス

using System;namespace Gushwell.DesignPatterns.Framework
{
public abstract class Product {
public abstract void Use();}
}

Factoryクラス

using System;namespace Gushwell.DesignPatterns.Framework
 {
public abstract class Factory {public Product Create(string owner)
{
Product p = CreateProduct(owner);RegisterProduct(p);return p;}
protected abstract Product CreateProduct(string owner);
protected abstract void RegisterProduct(Product product);
}
}

IDCardクラス

using System;
using Gushwell.DesignPatterns.Framework;
namespace Gushwell.DesignPatterns.IDCard {
public class IDCard : Product {
private string owner;public IDCard(string owner) {
Console.WriteLine(owner + "のカードを作ります。");
this.owner = owner;}
public override void Use() {
Console.WriteLine(owner + "のカードを使います。");
}public virtual string Owner {
get {
return owner; }
}
}
}

IDCardFactoryクラス

using System;
using System.Collections.Generic;
using Gushwell.DesignPatterns.Framework;
namespace Gushwell.DesignPatterns.IDCard {
public class IDCardFactory : Factory {
private List owners = new List();
protected override Product CreateProduct(string owner) {
return new IDCard(owner);}
protected override void RegisterProduct(Product product) {
owners.Add(((IDCard)product).Owner);}public virtual List Owners {
get {
return owners; }
}
}
}

Programクラス

using System;
using Gushwell.DesignPatterns.Framework;
using Gushwell.DesignPatterns.IDCard;
namespace Gushwell.DesignPatterns {
public class Program {
[STAThread]public static void Main(string[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.Create("結城浩");
Product card2 = factory.Create("とむら");
Product card3 = factory.Create("佐藤花子");
card1.Use();card2.Use();card3.Use();}
}
}

November 16, 2008

AbstractFactoryパターン -関連する部品を組み合わせて製品を作る

Filed under: C# — Tags: , , — Sayuri @ 7:19 pm

なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。

Factoryクラス

using System;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Factory {
public static Factory GetFactory(string classname) {
Factory factory = null;
try {
factory = (Factory)Activator.CreateInstance(Type.GetType(classname));
} catch (System.TypeLoadException) {
Console.Error.WriteLine("クラス " + classname + " が見つかりません。");
} catch (System.Exception e) {
Console.Error.WriteLine(e.StackTrace);
}
return factory;
}
public abstract Link CreateLink(string caption, string url);
public abstract Tray CreateTray(string caption);
public abstract Page CreatePage(string title, string author);
}
}

Pageクラス

using System;
using System.Text;
using System.Collections.Generic;
using System.IO;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Page {
protected string title;
protected string author;
protected List content = new List();
public Page(string title, string author) {
this.title = title;
this.author = author;
}
public virtual void Add(Item item) {
content.Add(item);
}
public virtual void Output() {
try {
string filename = title + ".html";
StreamWriter writer = new StreamWriter(filename, false, Encoding.Default);
writer.Write(this.MakeHTML());
writer.Close();
Console.WriteLine(filename + " を作成しました。");
} catch (System.IO.IOException e) {
Console.Error.WriteLine(e.StackTrace);
}
}
public abstract string MakeHTML();
}
}

Trayクラス

using System;
using System.Collections.Generic;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Tray : Item {
protected List tray = new List();
public Tray(string caption)
: base(caption) {
}
public virtual void Add(Item item) {
tray.Add(item);
}
}
}

Itemクラス

using System;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Item {
protected string caption;
public Item(string caption) {
this.caption = caption;
}
public abstract string MakeHTML();
}
}

Linkクラス

using System;
namespace Gushwell.DesignPatterns.BaseFactory {
public abstract class Link : Item {
protected string url;
public Link(string caption, string url)
: base(caption) {
this.url = url;
}
}
}

Singletonパターン -たった1つのインスタンス

Filed under: .NET Framework — Tags: , , , , , — Sayuri @ 10:16 am

なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。

Singletonクラス

using System;
namespace Gushwell.DesignPatterns {
public sealed class Singleton {
public static Singleton Instance {
get { return singleton; }
}
private static readonly Singleton singleton = new Singleton();
private Singleton() {
Console.WriteLine("インスタンスを生成しました。");
}
}
}

Programクラス

using System;
namespace Gushwell.DesignPatterns {
public class Program {
[STAThread]
public static void Main(System.String[] args) {
Console.WriteLine("Start.");
Singleton obj1 = Singleton.Instance;
Singleton obj2 = Singleton.Instance;
if (obj1 == obj2) {
Console.WriteLine("obj1とobj2は同じインスタンスです。");
} else {
Console.WriteLine("obj1とobj2は同じインスタンスではありません。");
}
Console.WriteLine("End.");
Console.ReadLine();
}
}
}

November 6, 2008

Prototype ― コピーしてインスタンスを作る

Filed under: Javascript/Xhtml/Css — Tags: , , , , , — Sayuri @ 9:17 am

なお、当ソースは、Visual C# 2005 Express Editionで動作を確認しています。 IProductインターフェース

using System;
namespace Gushwell.DesignPatterns.Prototype.Framework {
public interface IProduct : System.ICloneable {
void Use(string s);
}
}

Managerクラス

using System;
using System.Collections;
namespace Gushwell.DesignPatterns.Prototype.Framework {
public class Manager {
private Hashtable showcase = new Hashtable();
public virtual void Register(string name, IProduct proto) {
showcase[name] = proto;
}
public virtual IProduct Create(string protoname) {
IProduct p = (IProduct)showcase[protoname];
return (IProduct)p.Clone();
}
}
}

UnderlinePenクラス

using System;
using System.Text;
using Gushwell.DesignPatterns.Prototype.Framework;
namespace Gushwell.DesignPatterns.Prototype {
public class UnderlinePen : IProduct {
private char ulchar;
public UnderlinePen(char ulchar) {
this.ulchar = ulchar;
}
public virtual void Use(string s) {
int length = Encoding.GetEncoding("shift-jis").GetByteCount(s);
Console.WriteLine("\"" + s + "\"");
Console.Write(" ");
for (int i = 0; i < length; i++) {
Console.Write(ulchar);
}
Console.WriteLine("");
}
public virtual object Clone() {
return (IProduct)MemberwiseClone();
}
}
}

MessageBoxクラス

using System;
using System.Text;
using Gushwell.DesignPatterns.Prototype.Framework;
namespace Gushwell.DesignPatterns.Prototype {
public class MessageBox : IProduct {
private char decochar;
public MessageBox(char decochar) {
this.decochar = decochar;
}
public virtual void Use(string s) {
int length = Encoding.GetEncoding("shift-jis").GetByteCount(s);
for (int i = 0; i < length + 4; i++) {
Console.Write(decochar);
}
Console.WriteLine("");
Console.WriteLine(decochar + " " + s + " " + decochar);
for (int i = 0; i < length + 4; i++) {
Console.Write(decochar);
}
Console.WriteLine("");
}
public virtual object Clone() {
return (IProduct)MemberwiseClone();
}
}
}

Programクラス

using System;
using Gushwell.DesignPatterns.Prototype.Framework;
namespace Gushwell.DesignPatterns.Prototype {
public class Program {
[STAThread]
public static void Main(string[] args) {
// 準備
Manager manager = new Manager();
UnderlinePen upen = new UnderlinePen('~');
MessageBox mbox = new MessageBox('*');
MessageBox sbox = new MessageBox('/');
manager.Register("strong message", upen);
manager.Register("warning box", mbox);
manager.Register("slash box", sbox);
// 生成
IProduct p1 = manager.Create("strong message");
p1.Use("Hello, world.");
IProduct p2 = manager.Create("warning box");
p2.Use("Hello, world.");
IProduct p3 = manager.Create("slash box");
p3.Use("Hello, world.");
}
}
}


November 2, 2008

IIS7でURLリライトモジュールを利用したときのPostback先の指定

Filed under: Ajax, Asp.Net, IIS — Tags: , , , — Sayuri @ 9:52 pm

IIS7ではURLリライトモジュールが提供されていて、URLの書き換えが容易に行えるようになっています。
ただし書き換えを行った後でPostbackが起きると、書き換えられた後のURLになってしまいます。
このような不具合に対応する方法がまとめられています。
といっても、Page_LoadでActionを書き換える、という原始的な方法ですが。
まあ、そのような用途のために元のURLがServerVariablesに格納されている、ということが重要な情報ですね。

ASP.NET postbacks and URL rewriting

November 1, 2008

[ .NET ] .NET Framework ] JIT 最適化にも負けずに呼び出し元のメソッドを取得する方法

Filed under: .NET Framework — Tags: , , — Sayuri @ 10:50 am

StackFrame クラス (System.Diagnostics) を使用すると、呼び出し元メソッドを取得することができる。しかし、Release ビルドされたアセンブリでは JIT 最適化により呼び出し元メソッドがインライン化されている可能性がある。
例えば、次のコードの実行結果を Debug ビルドと Release ビルド (非デバッグ実行) とで比較すると一目瞭然だ。

using

Powered by WordPress