Monday, August 04, 2008

8/2(土)に無事、タイから帰国しました。

しかし、PCのマザーボードが逝ってしまって投稿できない状態が続いていました。

まだ、完全復旧しておりません。

2,3日中にはきちんとした記事を投稿したいと思います。

Monday, August 04, 2008 11:57:42 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, July 24, 2008

実は明日、植林ボランティアへ出発します。

行き先はタイで8/2に帰国します。

その準備もあって最近更新できていなかったのですが、おそらく帰国するまで更新ができません。

楽しみにしていただいている方にはご迷惑おかけしますがご了承願います。

HIRO

Thursday, July 24, 2008 11:40:19 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [1]  |  Trackback
Saturday, July 19, 2008

前回はステップ実行について説明しました。

今回はブレークポイントを設定する方法について紹介します。

ブレークポイントの設定は、以外と簡単で $host.EnterNestedPrompt() をブレークポイントをかけたい場所に記述するだけです。

以前に紹介したスクリプトにブレークポイントを設定して実験してみたいと思います。(5行目に挿入しました。スクリプトはC:\Work\Debug.ps1として保存します)

$a = 2
$b = 3
$c = $a + $b
$host.EnterNestedPrompt()   #ブレークポイントの設定
Write-Debug "Line4: $c"
$a = 4
$b = 5
$c = $a + $b
Write-Debug "Line8: $c"

上記を実行してみます。

PS C:\Work> ./Debug.ps1
デバッグ: Line4: 5
PS C:\Work>>>

上記のように、ブレークポイントを設定した位置までコードが実行されプロンプトが表示されたと思います。

この状態は、前回のステップ実行で説明した「中断処理」と同様で、変数の状態を確認することが可能です。

試しに $a, $b, $c がどうなっているかみてみましょう。

PS C:\Work> ./Debug.ps1
デバッグ: Line4: 5
PS C:\Work>>> $a
2
PS C:\Work>>> $b
3
PS C:\Work>>> $c
5
PS C:\Work>>>

変数の値を確認できました。プロンプトを終了するには exitと入力して[Enter]キーを押します。

PS C:\Work>>> exit
デバッグ: Line8: 9
PS C:\Work>

 

ブレークポイントを設定するのが簡単だということをおわかりいただけたでしょうか?

是非使ってみてください。

Saturday, July 19, 2008 11:31:02 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Friday, July 18, 2008

Set-PSDebug コマンドレットの-Stepパラメータを使用すると、ステップ実行を行うことができます。

以前にも使用したことのある下記スクリプトで実験してみましょう。

下記スクリプトをメモ帳などで入力してC:\Work\Debug.ps1 に保存します。

$a = 2
$b = 3
$c = $a + $b
Write-Debug "Line4: $c"
$a = 4
$b = 5
$c = $a + $b
Write-Debug "Line8: $c"

以下の一文を入力し[Enter]を押すとステップ実行が開始されます。

PS C:\Work> Set-PSDebug -step; ./Debug.ps1

1行実行されるごとにメッセージが表示されます。

PS C:\Work> Set-PSDebug -step; ./Debug.ps1

この操作を続行しますか?
   1+ Set-PSDebug -step; ./Debug.ps1
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "Y"):
デバッグ:    1+ Set-PSDebug -step; ./Debug.ps1

「規定は"Y"」と憑依されている箇所がありますが、これは[Enter]キーを押すと次の行が押される、つまり[Y]キーを押すのと同じ操作を行うこと意味します。

とりあえず[Enter]を押していって、下記のような状態になったらいったん止まってください。

PS C:\Work> Set-PSDebug -step; ./Debug.ps1

この操作を続行しますか?
   1+ Set-PSDebug -step; ./Debug.ps1
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "Y"):
デバッグ:    1+ Set-PSDebug -step; ./Debug.ps1

この操作を続行しますか?
   1+ $a = 2
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "Y"):
デバッグ:    1+ $a = 2

この操作を続行しますか?
   2+ $b = 3
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "Y"):

この状態で下記のように「中断」を意味する[S]キーを入力してみましょう。

この操作を続行しますか?
  2+ $b = 3
Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
既定値は "Y"):S

[S]を入力すると、下記のように PS C:\Work>>> というプロンプトが表示されたと思います。ここで $a[Enter] と入力してみてください。

PS C:\Work>>> $a
2

2という値が表示されたと思います。このように処理を中断して変数の中身を確認することが可能です。

プロンプトを終了するには exit と入力します。

Visual Studio.NETのように現在ステップ実行している行がハイライトされるわけではないので見にくく感じるかもしれませんが、慣れてしまえば非常に有効なデバッグ手段です。

是非ためしてみることをおすすめします。

Friday, July 18, 2008 11:19:28 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Thursday, July 17, 2008

Set-PSDebugコマンドレットによるデバッグ(PowerShell 入門) でSet-PSDebugコマンドレットの使用方法について説明しました。

今回は、このコマンドレットの-Strictパラメータを使用して、未定義の変数をエラーとして扱ってみましょう。

下記スクリプトで実験してみたいと思います。

ファイル名 Strict.ps1 とし C:\Work に保存したものとします。

1 * $a

上記スクリプトの中の$aはどこでも定義されていない状態で、いきなり使用されています。

これをSet-PSDebugコマンドレットで-Strictパラメータを使用して実行してみましょう。

PS C:\Work> Set-PSDebug -Strict; ./Strict.ps1
変数 $a は、設定されていないために取得できません。
発生場所 C:\Work\Strict.ps1:1 文字:7
+ 1 * $a <<<<

このように-Strictパラメータを使用すると、未定義の変数があることがわかります。

では、先ほどのスクリプトを修正して、変数$aを定義された状態で実験してみましょう。

修正したStrict.ps1

$a = 3
1 * $a

修正したスクリプトを再度デバッグしてみます。

PS C:\Work> Set-PSDebug -Strict; ./Strict.ps1
3

未定義の変数がない場合には、エラーにならずに処理が行われることが確認できます。

未定義の変数を見つけたい場合には是非 -Strict パラメータを使用してみてください。

Thursday, July 17, 2008 10:15:25 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

自分が管理している、PowerShell from Japan!! はBlogEngine.NETを使用しています。

この、BlogEngine.NETでは複数のAuthorが1つのブログを書き上げることができます。(これがBlogEngine.NETを採用した一番の理由です)

現在、バージョン1.4を使用していますが、新規で作成したユーザーはログインできないという不具合があるようです。

いろいろ調べた結果、ログイン時のパスワードチェックに問題があるようです。

ユーザー情報はユーザーID,パスワード(暗号化される)などXMLファイルに保存されます。(SQL Serverを使用しない場合)

そして、ログイン時に、このXMLに格納されているパスワードと、入力されたパスワードとを比較するのですが、

XMLから読み込んだHash化されていないパスワードと入力されたパスワードをHash化したもの

とを比較するためにログインできないようです。どちらもHash化されたもので比較すれば問題ないのでしょうけど...

この部分はBlogEngine.Core\Providers\XmlProviders\XmlMembersshipProvider.cs の CheckPasswordメソッドで行われています。

パッチが待てない方は、この辺をいじってみることをおすすめします。

 

Thursday, July 17, 2008 10:36:15 AM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Tuesday, July 15, 2008

私はスタートアップにPowerShellを登録しており、いつでも使えるようにしています。

最近では電卓として使用することが多いです。

四則演算子以外にも下記のような.NET Frameworkの数学関数が使用できるので、重宝します。

定数 eを指定して、自然対数ベースを表します。
PI 定数 PI を指定して、円の直径に対する円周の割合を表します。
Abs オーバーロード。 指定した数値の絶対値を返します。
Acos コサインが指定数となる角度を返します。
Asin サインが指定数となる角度を返します。
Atan タンジェントが指定数となる角度を返します。
Atan2 タンジェントが 2 つの指定された数の商である角度を返します。
BigMul 2 つの 32 ビット数値の完全な積を生成します。
Ceiling 指定された数以上の数のうち、最小の整数を返します。
Cos 指定された角度のコサインを返します。
Cosh 指定された角度のハイパーボリック コサインを返します。
DivRem オーバーロード。 2 つの数値の商を返し、出力パラメータとして剰余を渡します。
Exp 指定した値で e を累乗した値を返します。
Floor 指定された数以下の数のうち、最大の整数を返します。
IEEERemainder 指定した数を別の指定数で除算した結果の剰余を返します。
Log オーバーロード。 指定した数の対数を返します。
Log10 指定した数の底 10 の対数を返します。
Max オーバーロード。 指定された 2 つの数のうち、大きい方を返します。
Min オーバーロード。 2 つの数のうち、小さい方を返します。
Pow 指定の数値を指定した値で累乗した値を返します。
Round オーバーロード。 指定した値に最も近い数値を返します。
Sign オーバーロード。 数値の符号を示す値を返します。
Sin 指定された角度のサインを返します。
Sinh 指定された角度のハイパーボリック サインを返します。
Sqrt 指定された数値の平方根を返します。
Tan 指定された角度のタンジェントを返します。
Tanh 指定された角度のハイパーボリック タンジェントを返します。

PowerShellを電卓として使用するメリットとして、

  • 計算のために入力した式をかくにんできる
  • 履歴機能を使用して、再計算できる & この機能を利用して一部だけを変えて再度計算も可能
  • よく使う計算式はスクリプト化して再利用可能

などがあげられます。

短所は、Windowsに付属の電卓と違ってSinとかも「ボタン一発」ではなく一文字一文字入力しなければ行けないことでしょうか?

Mathクラスの使用方法ですが、

PS C:\Work> [Math]::Sqrt(4)
2
PS C:\Work> [Math]::Pow(2,5)
32

のように [Math]::メソッド と記述します。

ぜひ電卓としても使用してみてください。慣れると重宝すること間違いなしです。

Tuesday, July 15, 2008 11:03:51 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [2]  |  Trackback
Sunday, July 13, 2008

PowerShellには、スクリプトのデバッグを行うために、Set-PSDebugというコマンドレットがあります。

書式は大きく2つに分けることができ

Set-PSDebug [-Trace 数値] [-Step] [-Strict]

Set-PSDebug -Off

です。[]がついている箇所は省略可能です。

-Traceパラメータ

-Traceパラメータに指定できる値には下記の3つがあります。

説明
0 スクリプトのトレースを無効にする
1 実行されるスクリプト行をトレースする
2 スクリプト行、変数の代入、関数呼び出し、およびスクリプトをトレースする

では、前回のスクリプトファイル(Debug.ps1)を使用して実験してみましょう。

$a = 2
$b = 3
$c = $a + $b
Write-Debug "Line4: $c"
$a = 4
$b = 5
$c = $a + $b
Write-Debug "Line8: $c"

-Traceに0を指定した場合

まずはSet-PSDebugコマンドレットによるスクリプトファイルのデバッグ方法ですが

Set-PSDebug -trace 0; ./Debug.ps1

のようにします。

-Traceパラメータに0を指定した場合の実行結果は下記の通りで、値0はトレースが無効となっているために1行だけ表示して終わっています。

デバッグ出力の行には、先頭に「デバッグ:」と表示さ異なる色で表されていることに注意してください。

PS C:\Work> Set-PSDebug -trace 0; ./Debug.ps1
デバッグ:    1+ Set-PSDebug -trace 0; ./Debug.ps1

-Traceに1を指定した場合は行トレースとなりますので、すべての行がデバッグ表示されます。

-Traceに1を指定した場合

PS C:\Work> Set-PSDebug -trace 1; ./Debug.ps1
デバッグ:    1+ Set-PSDebug -trace 1; ./Debug.ps1
デバッグ:    1+ $a = 2
デバッグ:    2+ $b = 3
デバッグ:    3+ $c = $a + $b
デバッグ:    4+ Write-Debug "Line4: $c"
デバッグ:    5+ $a = 4
デバッグ:    6+ $b = 5
デバッグ:    7+ $c = $a + $b
デバッグ:    8+ Write-Debug "Line8: $c"

-Traceに2を指定した場合

-Traceに2を指定した場合は変数の代入、関数呼び出しなど、各行で行われている詳細情報を見ることができます。

PS C:\Work> Set-PSDebug -trace 2; ./Debug.ps1
デバッグ:    1+ Set-PSDebug -trace 2; ./Debug.ps1
デバッグ:     ! CALL script 'Debug.ps1'
デバッグ:    1+ $a = 2
デバッグ:     ! SET $a = '2'.
デバッグ:    2+ $b = 3
デバッグ:     ! SET $b = '3'.
デバッグ:    3+ $c = $a + $b
デバッグ:     ! SET $c = '5'.
デバッグ:    4+ Write-Debug "Line4: $c"
デバッグ:    5+ $a = 4
デバッグ:     ! SET $a = '4'.
デバッグ:    6+ $b = 5
デバッグ:     ! SET $b = '5'.
デバッグ:    7+ $c = $a + $b
デバッグ:     ! SET $c = '9'.
デバッグ:    8+ Write-Debug "Line8: $c"

上記を見るとわかるように、一番最初に関数呼び出しを行っているので

! CALL script 'Debug.ps1'

と表示されています。

また、変数に値がセットされるときは

SET $a = '2'.

のように表示されていることがわかります。

 

上記をまとめると

-Traceは、どの行を通って来たかを確認するだけであれば"1"を、詳細情報(変数にセットされた情報、関数呼び出しなど)を得たい場合には"2"を指定すれば良いことがわかります。

うまく使い分けて、デバッグに活用してみてください。

Sunday, July 13, 2008 10:19:04 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Friday, July 11, 2008

スクリプトを開発し始めると、途中経過を確認しながら開発を進めたいと思うときはありませんか?

このようなときに使用するコマンドレットがWrite-Debugコマンドレットです。

このコマンドレットは、コンソールウィンドウにメッセージを表示するためのコマンドレットです。

コンソールにメッセージを表示するコマンドレットとしてはWrite-Hostコマンドレットがありますが、両者にはどのような違いがあるでしょう?

それは、

  • Write-Hostコマンドレットは、実行すれば必ず表示を行う。
  • Write-Debugコマンドレットは、$DebugPrefeenceによって表示制御が行われる

という違いがあります。

$DebugPreferenceは下記の3つの値を指定することが可能です。

意味
"Continue" Write-Debugに指定されたメッセージを表示
"SilentlyContinue" Write-Debugに指定されたメッセージを表示しない。既定値
"Stop" Write-Debugに指定されたメッセージを表示した後、動作を停止
"Inquire" Write-Debugに指定されたメッセージを表示後、続行するかを確認

 

それでは、下記スクリプト(Debug.ps1とします)を準備して、それぞれについて実験をしてみましょう。

$a = 2
$b = 3
$c = $a + $b
Write-Debug "Line4: $c"
$a = 4
$b = 5
$c = $a + $b
Write-Debug "Line8: $c"

Continue

まずは、下記のようにして $DebugPreferenceの設定を変更します。

PS C:\Work> $DebugPreference = "Continue"

つぎに、作成したスクリプトを実行してみましょう。

PS C:\Work> ./Debug.ps1
デバッグ: Line4: 5
デバッグ: Line8: 9

Write-Debugに指定したメッセージがきちんと表示されていますね。

SilentContinue

まずは、下記のようにして $DebugPreferenceの設定を変更します。

PS C:\Work> $DebugPreference = "SilentlyContinue"

スクリプトを実行します。

PS C:\Work> ./Debug.ps1
PS C:\Work>

Stop

まずは、下記のようにして $DebugPreferenceの設定を変更します。

PS C:\Work> $DebugPreference = "Stop"

スクリプトを実行します。

PS C:\Work> ./Debug.ps1
デバッグ: Line4: 5
Write-Debug : シェル変数 "DebugPreference" が Stop に設定されているため、コマンドの実行が停止されました
発生場所 C:\Work\Debug.ps1:4 文字:12
+ Write-Debug  <<<< "Line4: $c"

1つめのWrite-Debugで指定されたメッセージを表示した後、エラーメッセージを表示して処理を中断したことがわかります。

Inquire

まずは、下記のようにして $DebugPreferenceの設定を変更します。

PS C:\Work> $DebugPreference = "Inquire"

スクリプトを実行します。

PS C:\Work> ./Debug.ps1
デバッグ: Line4: 5

確認
この操作を続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [H] コマンドの中止(H)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

1つめのWrite-Debugで指定されたメッセージを表示したあとに、スクリプトを実行するかを確認してくることがわかります。

ここで[Y]または[A]を押すと、スクリプトが続行されます。

確認
この操作を続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [H] コマンドの中止(H)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):
デバッグ: Line8: 9

確認
この操作を続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [H] コマンドの中止(H)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

 

このように、Write-Debugコマンドレットを使用すれば、デバッグ時のみメッセージを表示すしそれ以外は表示しない、という制御を行うことができますので、是非活用してみてください。

Friday, July 11, 2008 10:49:53 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback

Theme design by Jelle Druyts

Pick a theme: