PowerShellのスクリプトをPowerGUIで編集していたらコピペができない事態が生じたので、秀丸で編集しようと思ったら強調表示定義ファイルがない・・・ということで作ってみました。キーワードが文字列内で強調されないようにしたかったけど、正規表現がちょっとめんどかったのでそのままにしてしまいました。

ファイルはここからダウンロードできます。

一応秀丸サイトにも投稿しておきます。


Posted in: PowerShell  Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Team Foundation Serverを使うようになってからもうかれこれ2年ぐらいが経つ。その間にだんだんソリューションファイルが多くなってきたり、一つの製品の開発環境を作るのにあっちをいじったりこっちをいじったりしなきゃいけなくなってきたので、自動化を試みている。その一環としてPowerShellを使ってTeam Foundation Serverから最新バージョンのコードをダウンロードするコードを書いてみた。

param
(
    $tfsServerName = $(Throw "TFSのサーバ名を入力してください。"),
    $localFolderPath = $(Throw "ローカルのフォルダパスを入力してください。"),
    $Domain = "",
    $Username = "",
    $Password = "",
    [String[]] $getPaths = $(Throw "サーバ側から最新コードをダウンロードするパスを配列として渡してください。")
)
 
[void] [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
[void] [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client")
 
$credential = $null
 
if (($Username -eq "") -or ($Password -eq ""))
{
    $credential = Get-Credential
}
else
{
    $credential = New-Object System.Net.NetworkCredential($Username, $Password, $Domain)
}
 
#TeamFoundationServerオブジェクトを作成。
$tfs = New-Object Microsoft.TeamFoundation.Client.TeamFoundationServer($tfsServerName, $credential)
$tfs.Authenticate()
 
# VersionControlServerを使ってWorkspaceオブジェクトを取得。
$vcs = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
$ws = $vcs.GetWorkspace($localFolderPath)
 
$ws.Get($getPaths, [Microsoft.TeamFoundation.VersionControl.Client.VersionSpec]::Latest, "Full", "GetAll")
 

Posted in: PowerShell  Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted in: PowerShell  Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
HIRO posted on 11月 12, 2008 15:35

本日の業務にて、あるディレクトリ以下にあるファイルをすべてURLエンコードしたかったので、PowerShellで下記関数を作成しました。

UrlEncodeメソッドを使用するだけなんですが、毎回 [reflection.assembly]::LoadWith~ なんて記述するのは面倒なので関数化しました。

おまけでデコードする関数も付けておきます。

[void][reflection.assembly]::LoadWithPartialName("System.Web")
#===============================================================================
# Get-UrlEncode: 指定した文字列をURLエンコードして返す
#
# パラメータ:
#       $EncodeString: エンコードする文字列
#
# 使用例
#       PS > Get-UrlEncode マイクロソフト
#       PS > %e3%83%9e%e3%82%a4%e3%82%af%e3%83%ad%e3%82%bd%e3%83%95%e3%83%88
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#===============================================================================
function global:Get-UrlEncode([string]$EncodeString)
{
    return [System.Web.HttpUtility]::UrlEncode($EncodeString)
}
#===============================================================================
# Get-UrlEncode: 指定した文字列をURLデコードして返す
#
# パラメータ:
#       $EncodeString: デコードする文字列
#
# 使用例
#       PS > Get-UrlDecode %e3%83%9e%e3%82%a4%e3%82%af%e3%83%ad%e3%82%bd%e3%83%95%e3%83%88
#       PS > マイクロソフト
#
# copyright HIRO's.NET(http://hiros-dot.net/)
#===============================================================================
function global:Get-UrlDecode([string]$DecodeString)
{
    return [System.Web.HttpUtility]::UrlDecode($DecodeString)
}

 

たとえばC:\WorkにあるすべてのファイルをURLエンコードする場合は、

PS > dir c:\work | %{Get-UrlEncode $_.Name}

とします


Posted in: PowerShell  Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Admin posted on 11月 2, 2008 00:02

10月末に株式会社オライリージャパン様より、PowerShell from Japan!! メンバーへ「Windows PowerShell クックブック」を献本していただきました。

メンバーを代表しましてお礼を申し上げます。本当にありがとうございました。

本書は630ページというボリュームのため、すべてを読み切ってはいないのですが、感想を書きたいと思います。

なんといっても、この本の特徴は使用例の豊富さとわかりやすい解説にあるといえるでしょう 。

どのようなプログラミング言語でもはじめて学ぶには、何かしらのドキュメントを読むことになるかと思います。

そのようなとき、文章だけでだらだらと説明されてもどのように使用して良いのかは読み取ることができないものです。

本書は、その豊富な例題により、どのように使用すべきかをわかりやすい文章とともに掲載してあります。

また、使用例の中には実務ですぐに使えそうなサンプルコード、効果的なテクニックなど惜しむことなく掲載されています。

使用例もすばらしいのですが、個人的には巻末の付録もすごく好きです。

付録では、変数の使い方等の基本的な事項から、.NET Framework、ComObjectの使用方法、正規表現に至るまで、「かゆいところに手が届く」という言葉がふさわしい本となっております。

PowerShellをこれから学ぼうとしている方も、体得してしまった方も、是非バイブルとして手元に置いていただきたい1冊です。

書籍情報

タイトル:Windows PowerShell クックブック

著者:Lee Holmes(リー・ホームズ)

監訳者:マイクロソフト株式会社 ITプロエバンジェリストチーム

翻訳:菅野良二(かんのりょうじ)

ISBN:978-4-87311-382-1

本体価格:4,000円

判形:B5版

ページ数:630

発行:2008年10月発行

Web: http://www.oreilly.co.jp/books/9784873113821/

 


Posted in:   Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Admin posted on 11月 1, 2008 23:08

10月度人気記事

今月もっとも人気のあった記事は、けろ-みおさんによる

SQLServer 2008 でPowerShellを使おう~DB&テーブル作成編~ 

でした。

最新のSQL Server 2008は Windows PowerShell を標準搭載しています。

この記事ではPowerShellからSQL Serverへのデータベースやテーブルの作成方法について、わかりやすく解説されています。

まだ読まれていない方は、この機会に是非ご覧ください。

次に人気のあったのが 山口さんによる

カスタムプロバイダーを作ってみよう その1

でした。この記事は連載となっており

  全5本からなっています。

 日本語で解説されているものは、山口さんのProgrammable LifePowerShell from Japan!! でしかありません。

 こちらも、まだ読まれていない方は是非どうぞ!!

10月度ページビュー

徐々にユニークユーザー、ページ数ともに上昇してきております。

訪問いただいた皆様ありがとうございました。

11月度もよろしくお願いいたします。

 

  ユニークユーザー ページ
2008/10/1 160 1368
2008/10/2 171 1352
2008/10/3 135 1282
2008/10/4 71 369
2008/10/5 110 635
2008/10/6 158 1363
2008/10/7 153 1091
2008/10/8 163 672
2008/10/9 166 1363
2008/10/10 163 718
2008/10/11 96 419
2008/10/12 83 376
2008/10/13 101 628
2008/10/14 175 1648
2008/10/15 163 1385
2008/10/16 178 1399
2008/10/17 139 1241
2008/10/18 101 433
2008/10/19 121 936
2008/10/20 186 1703
2008/10/21 197 1276
2008/10/22 203 1404
2008/10/23 221 1501
2008/10/24 170 1257
2008/10/25 111 413
2008/10/26 120 493
2008/10/27 138 1083
2008/10/28 174 1105
2008/10/29 179 1159
2008/10/30 163 654
2008/10/31 138 1087
平均 148.61 1026.23
合計 4607 31813

Posted in:   Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

前回の続きです。

今回はSet-Contentコマンドレットへの対応からはじめます。

 

Set-Contentコマンドレットへの対応

Set-Contentコマンドレットに対応するには、IContentCmdletProviderインターフェースの以下のメソッドを実装します。

  • void ClearContent
  • IContentWriter GetContentWriter(string path)
  • object GetContentWriterDynamicParameters(string path)

Set-Contentコマンドレットはファイルの内容を置き換える為、GetContentWriterメソッドが呼び出される前にClearContentメソッドが呼び出されて、コンテントの内容をクリアするようになっています。 なのでClearContentメソッドを実装する必要があります。

まずはIContentWriterインターフェースを実装したクラスを定義します。

IContentWriterインターフェースには以下のメソッドが定義されています。

  • void Close()
  • void Seek(long offset, SeekOrigin origin) 
  • IList Write(IList content)

まずは、このインターフェースを実装したクラスを定義します。

using System;
using System.IO;
using System.Text;
using System.Management.Automation.Provider;
using System.Collections;

namespace PSHoge {
     public class HogeFileContentWriter : IContentWriter {
         private StreamWriter sw;

         public HogeFileContentWriter(string path, Encoding encoding) {
             sw = new StreamWriter(path, true, encoding);
         }
         ~HogeFileContentWriter() {
             Dispose();
         }

         public void Close() {
             if(sw != null) {
                 sw.Close();
                 sw = null;
             }
         }
         public void Seek(long offset, SeekOriginorigin) {
             throw new NotImplementedException();
         }
         public IList Write(IList content) {
             foreach(var c in content) {
                 sw.WriteLine(c.ToString());
             }
             return null;
         }

         public void Dispose() {
             Close();

             GC.SuppressFinalize(this);
         }
     }
}

コンストラクタでファイル名とエンコードを指定し、ファイルを追記モードで開いています。

Writeメソッドではリストで渡された要素の数だけファイルに内容を出力しています。 あとはお馴染みですね。

今回は始めから動的パラメータも定義しておきます。

[Serializable]
[DebuggerStepThrough]
public class SetContentParameters : FileSystemContentWriterDynamicParameters {
}

FileSystemContentWriterDynamicParametersクラスから派生しておくと楽ができます。

ClearContent、GetContentWriterメソッドを実装します。

public void ClearContent(string path) {
     if(File.Exists(path)) File.Delete(path);
}

public IContentWriter GetContentWriter(string path) {
     var scParams = base.DynamicParameters as SetContentParameters;
     var encoding = scParams != null ? scParams.EncodingType : Encoding.UTF8;

     return new HogeFileContentWriter(path, encoding);
}

public object GetContentWriterDynamicParameters(string path) {
     return new SetContentParameters();
}

ClearContentメソッドではファイルを削除しています。

GetContentWriterメソッドではHogeFileContentWriterクラスをインスタンス化して返しておきます。

デバッグ実行して、以下のように動作を確認できます。

PS Hoge:\> Set-Content 400.txt hoge

これでSet-Contentコマンドレットに対応できました。

 

まとめ

ここまでカスタムプロバイダーの作り方について説明してきましたが、いかかでしょうか?だいたいイメージは掴めたのではないでしょうか。

カスタムプロバイダーを作るための手順をまとめておきます。

  1. NavigationCmdletProviderクラスから派生して、プロバイダークラスを作る。
    1. IsValidPathメソッドをオーバーライドする。
    2. Set-LocationできるようにItemExistsIsItemContainerメソッドをオーバーライドする。
    3. 各コマンドレットに対応したメソッドをオーバーライドする。
      Get-ChildItem
      コマンドレットならGetChildItemsメソッド
      New-ItemコマンドレットならNewItemメソッドという具合
  2. PSSnapInクラスから派生してインストーラクラスを作る。
  3. InstallUtil.exeを使ってアセンブリをPowerShellにインストールする。
  4. Add-PSSnapinコマンドレットを使ってスナップインを追加する。
  5. New-PSDriveコマンドレットでカスタムプロバイダーのPSDriveを追加する。

といった感じです。

今回説明した以外にもNew-PSDriveに対応するNewDriveメソッドをオーバーライドして、PSDriveを追加する時の条件を変更できたりもします。

他にもパスの区切り記号の変更などもできたりもします(デフォルトでは円記号)。

カスタムプロバイダーを作る上で最も難しい事はどのようなデータソースをプロバイダーで抽象化するかということでしょう。

例えば、SQL Serverであったり、FTPサイトであったり、WebDAV、Amazon S3など色々と考える事ができます。結局のところはアイデア勝負ということです。

何か抽象化できそうなデータソースがあれば、試しにカスタムプロバイダーを作ってみることをお勧めします。

それでは楽しいPowerShellライフを!!

 

ソース


目次


Posted in:   Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

前回の続きです。

今回はタブ補完から実装します。

 

タブ補完への対応

タブ補完に対応させるには、以下のメソッドをオーバーライドします。

  • void GetChildNames(string path, ReturnContainers returnContainers)

実装する前にタブ補完とはどのような機能なのかということを説明しておきます。

PowerShellでcdやremなどのコマンドを実行する時に、その引数としてファイル名などのパスを渡す必要がありますが、その時パスを全て入力するのではなく、例えば「100.txt 」を入力する時に「1」だけ入力してTabキーを押すと自動的に補完してくれます。再度Tabキーを押すと次の候補を表示してくれる、という機能がタブ補完です。

PS c:\> cd W

Tabキーを押すと、

PS c:\> cd WINDOWS

補完される。

では、さっそく実装してみましょう。

protected override void GetChildNames(string path, ReturnContainers returnContainers) {
     foreach(var f in Directory.GetFiles(path)) {
         base.WriteItemObject(Path.GetFileName(f), f, false);
     }
}

やる事は単純です。渡されたパスに存在するファイルの一覧を列挙して、ファイル名だけをパイプラインに出力します。これだけです。

こうすることで、タブ補完の候補がPowerShellに渡される事になります。後はPowerShell側が勝手にやってくれます。

デバッグ実行して、動作を試してみて下さい。何故かこのメソッドは二回呼び出されますが気にしないでおきましょう。

 

まだ実装していない機能で、

  • Set-Item
  • Get-Item
  • Rename-Item 
  • Copy-Item

などがありますが、これらはほとんど今までと同じ方法で実装できるのでこれ以上の説明はしません。

なので、他とは少し変わった機能であるGet-ContentSet-Contentコマンドレットを実装してみます。

 

Get-Contentコマンドレットへの対応

Get-Contentコマンドレットに対応するにはプロバイダーはIContentCmdletProviderインターフェースを実装する必要があります。

IContentCmdletProviderインターフェースには以下のメソッドが定義されています。

  • void ClearContent(string path) 
  • object ClearContentDynamicParameters(string path)
  • IContentReader GetContentReader(string path)
  • object GetContentReaderDynamicParameters(string path)
  • IContentWriter GetContentWriter(string path)
  • object GetContentWriterDynamicParameters(string path)

動的パラメータのありなしをペアとして三つのメソッドがあります。

この中でGet-Contentの為に必要なのはGetContentReaderメソッドとそれの動的パラメータ版です。

GetContentReaderメソッドはIContentReaderインターフェースを実装したオブジェクトを返す必要があります。

IContentReaderインターフェースには以下のメソッドが定義されています。

  • void Close() 
  • IList Read(long readCount)
  • void Seek(long offsert, SeekOrigin origin)
  • void Dispose()

なんとなくストリームっぽい感じですね。それぞれの役割はだいたいわかるでしょう。

とりあえずこのインターフェースを実装したクラスを作ってみます。

public class HogeFileContentReader : IContentReader {

     private StreamReader sr;
     
     public HogeFileContentReader(string path) {
         sr = File.OpenText(path);
     }
     ~HogeFileContentReader() {
         Dispose();
     }

     public void Close() {
         if(sr != null) {
             sr.Close();
             sr = null;
         }
     }
     public IList Read(long readCount) {
         var lines = new List<string>();

         for(var i = 0; i < readCount; i++) {
             var line = sr.ReadLine();

             if(line == null) break;

             lines.Add(line);
         }
         return lines;
     }
     public void Seek(long offset, SeekOrigin origin) {
         throw new NotImplementedException();
     }

     public void Dispose() {
         Close();

         GC.SuppressFinalize(this);
     }
}

コンストラクタで引数にパスを指定してファイルを読み込み、ReadメソッドでreadCountの分だけファイルを読み込んで、その結果をリストで返しています。後はお馴染みの処理ですね。

あとはこのクラスをGetContentReaderメソッドでインスタンス化して返すだけです。

public IContentReader GetContentReader(string path) {
     return new HogeFileContentReader(path);
}

public object GetContentReaderDynamicParameters(string path) {
     return null;
}

動的パラメータはいらないのでnullを返しておきます。

これでデバッグ実行して、以下のコマンドを実行してみて下さい。

PS Hoge:\> Get-Content 300.txt

これでファイルの中身が出力されるはずです。

ちなみにこのままではUTF8のファイルしか正常に表示できないので、動的パラメータでエンコードを指定できるようにしておきましょう。

まずはパラメータクラスを定義します。

[Serializable]
[DebuggerStepThrough]
public class GetContentParameters : FileSystemContentReaderDynamicParameters {
}

Get-Contentの動的パラメータクラスはFileSystemContentReaderDynamicParametersクラスから派生すると便利です。Encodingプロパティも既に定義されています。

このクラスのインスタンスを返すようにGetContentReaderDynamicParametersメソッドを変更しておきます。

public object GetContentReaderDynamicParameters(string path) {
     return new GetContentParameters();
}

HogeFileContentReaderのコンストラクタもエンコードを指定できるように変更しておきます。

public HogeFileContentReader(string path, Encoding encoding) {
     sr = new StreamReader(path, encoding);
}

GetContentReaderメソッドも動的パラメータを取得するように変更しておきます。

public IContentReader GetContentReader(string path) {
     var gcParams = base.DynamicParameters as GetContentParameters;
     var encoding = gcParams != null ? gcParams.EncodingType : Encoding.UTF8;

     return new HogeFileContentReader(path, encoding);
}

これでGet-Contentコマンドレットでエンコードを指定できるようになりました。

PS Hoge:\> Get-Content -Encoding UTF8 300.txt 

Get-Contentの説明が長くなってしまったので、Set-Contentは次回にします。

 

目次


Posted in:   Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
HIRO posted on 10月 20, 2008 22:09

Windows PowerShell を使用してローカル グループにドメイン ユーザーを追加する方法はありますか」が公開されています。

Active Directory ユーザー アカウントへのオブジェクト参照を作成する方法、実際にユーザーを追加する方法などが説明されています。

興味のある方はぜひどうぞ。


Posted in: PowerShell  Tags:

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

 

はじめまして、私、けろ-みお と申します。

元々、管理人のHIROさんとは長い付き合いでして、

techbank.jp / techbank.jp コミュニティ! というところでも一緒にコミュニティ運営しております。

この度、SQL Server 2008 で標準搭載されたPowerShellを実践でも活用して頂きたく思い、初投稿することにしました。

元々、私の専門がASP/ASP.NET、SQLServerなもので、まだまだPowerShellは不慣れですが、どうぞ皆様宜しくお願いします。 

 

◆PowerShellを使ってSQL Server 2008上にDB(データベース)を作成する

###################################################################
# 新しいDBを作成する
###################################################################

$NewDb = New-Object [Microsoft.SqlServer.Management.SMO.Database]
$NewDb.Parent = (Get-Item SQLSERVER:\SQL\[サーバー名]\[SQLServerサービスインスタンス名])
$NewDb.Name = "[新しく作成したいDB名]"
$NewDb.Create()

###################################################################
# []内は環境に応じて変えて下さい。(その際、[]の文字部分も不要)
# [サーバー名]は、localhostなどのSQLServerがインストールされているマシン名かIPアドレス
# [SQLServerサービスインスタンス名]は、「MSSQLSERVER」等の名前
# [新しく作成したいDB名]は、新規作成したいDB名を任意で入れてください。
###################################################################

 

実行結果:

 

◆PowerShellを使って、SQL Server 上に簡単なテーブルを作成してみよう!

###################################################################
# 新しいテーブルを作成する
###################################################################

$table = New-Object Microsoft.SqlServer.Management.Smo.Table
$table.Parent = (Get-Item SQLSERVER:\SQL\[サーバー名]\[SQLServerサービスインスタンス名]\Databases\[DB名])
$table.Name = "NewTableName"

###################################################################
# 作成するテーブル列を作成する
# (必ずNameプロパティで列名を定義してから、DataTypeプロパティで列の型を定義すること!
# そうしないと
# 「"DataType" の設定中に例外が発生しました: "列 '' のDataType の設定に失敗しました。"」
# とエラーになる)
###################################################################

# int型の列を作成する
$column1 = New-Object Microsoft.SqlServer.Management.Smo.Column
$column1.Parent = $table
$column1.Name = "column1"
$column1.DataType = ([Microsoft.SqlServer.Management.Smo.DataType]::Int)

# 作成した列をテーブルに追加
$table.Columns.Add($column1)

# nvarchar型の列を作成する
$column2 = New-Object Microsoft.SqlServer.Management.Smo.Column
$column2.Parent = $table
$column2.Name = "column2"
$column2.DataType = ([Microsoft.SqlServer.Management.Smo.DataType]::NVarChar(100))

# 作成した列をテーブルに追加
$table.Columns.Add($column2)

# テーブル作成実行
$table.Create()

 

実行結果:

 

◆PowerShellを使って、主キーや項目のNULL制御されているきちんとしたテーブルをSQLServer上に作成してみよう!

###################################################################
# 主キーやNOT NULL項目ありのテーブルを作成する
###################################################################

$table = New-Object Microsoft.SqlServer.Management.Smo.Table
$table.Parent = (Get-Item SQLSERVER:\SQL\[サーバー名]\[SQLServerサービスインスタンス名]\Databases\[DB名])
$table.Name = "NewTableName2"

# まずはテーブルに追加する列を作成する
$column1 = New-Object Microsoft.SqlServer.Management.Smo.Column
$column1.Parent = $table
$column1.Name = "column1"
$column1.DataType = ([Microsoft.SqlServer.Management.Smo.DataType]::Int)

# 列はNULLを許可しないよう設定
$column1.Nullable = ([System.Boolean]::false)

# IDENTITYに対応させる(1から自動採番されるよう列を設定する)
$column1.IdentitySeed = 1
$column1.IdentityIncrement = 1

# 作成した列をテーブルに追加
$table.Columns.Add($column1)

# 主キーを作成する
$index = New-Object Microsoft.SqlServer.Management.Smo.Index
$index.Parent = $table
$index.Name = "PK_NewTable2"

# 主キーとして認識させるためにClustered Indexを作成する
$indexedColumn = New-Object Microsoft.SqlServer.Management.Smo.IndexedColumn
$indexedColumn.Parent = $index
$indexedColumn.Name = "column1"

# Clustered Indexを適用する
$index.IndexedColumns.Add($indexedColumn)
$index.IndexKeyType = ([Microsoft.SqlServer.Management.Smo.IndexKeyType]::DriPrimaryKey)

# 作成したClustered Indexをテーブルに追加
$table.Indexes.Add($index)

# テーブルを作成する
$table.Create()

 

実行結果:

 

◆まとめ

Microsoft.SqlServer.Management.Smoアセンブリ&名前空間の使い方がわかれば、

PowerShellじゃなくても活用はできると思いますが、 バッチ処理でDBやテーブルを作成しなきゃいけないとか、

ちょっとしたツールとしてDBを作らなきゃいけないとかそういった場合、

PowerShellコマンドレットで処理させると、 実務での活用どころも期待できると思っています。

どうぞお役立て頂きたく存じます。

 

◆その他

同様の記事を自身のBlog

http://techbank.jp/Community/blogs/mymio/default.aspx

にもクロスポストしています。予めご了承ください。

 


Posted in: PowerShell , その他  Tags:

現在のレート 5.0 (2人)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Calendar

«  11月 2008  »
月曜火曜水曜木曜金曜土曜日曜
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567
View posts in large calendar

Recent Posts

Recent Comments

Banners

Theme Grabber
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2008 PowerShell from Japan!!