Windows PowerShell V2 CTP3出てた

会社ではなんの障害もなかったんだけど、家の環境では、実行ポリシーが"AllSigned"になってる上に、今まで通り、"Set-ExecutionPolicy RemoteSigned"を叩いても、"Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope."とかエラーが出て設定出来ねーーー、となったので焦りました。
よくメッセージを読み考えた結果、"Set-ExecutionPolicy RemoteSigned -Scope CurrentUser"とスコープを設定してあげることで解決できました。

Silverlight 2を触ってみた

これを参考にして。しかし、ちょっと以前の記事だし、ベータを使っているので、WatermarkedTextBoxがなくなっている、とかわかりやすいところを抜きにしても、うまく動かなくって大雑把というか@IT掲示板とか、だと叱られそうな書き方ですが、サンプルのソースコンパイルしても動かなかった。Diggのcrossdomain.xmlが変わったのかなー、とか、思ったんだけどよくわからない。
それはそれとして、随分以前に話題になってた、crossdomain.xmlにかかわる脆弱性の話がやっと理解できた。当時話題だったtwitterもいまは完全に閉じられちゃってて、twitter自身のドメインからのリクエストしか受け付けないようになってた。
しかたないので、自分で設定を変えられるサーバにcrossdomain.xmlを置いて、asmxのWebサービスで配列を返してDataGridにバインドしたら、おお、これは……、という感じで結構おもしろかった。けど、ASP.NETでも細かいことしようとすると、結局Repeaterでかりかりかいてー、みたいな感じで、ListBox使うようになったりするのかなー、とか、ScottGuさんのパート5でDataGridからListBoxに置き換えてるんだけども。
あと、crossdomain.xmlを置いてあっても、ローカルのhtmlにホスティング? されたSilverligtからはWebサービスの呼び出しがうまくいかなくって嵌った。ローカルのIIS上に置いてあると大丈夫なんだけど。

PowerShellでエクセル操作していろいろとか

最近久しぶりにエクセルで書かれた仕様書を印刷しようとしたらページ設定がめちゃくちゃになっていて、一つ一つ手で直していたら心が腱鞘炎になりかかったので、PowerShellで一気に直してみました。家にエクセルがないので、正確には何をやっているスクリプトなのか忘れましたが、印刷設定で、横1ページに収まるよう変更します。


$dir = '\\server\shiyousyo\'
$e = New-Object -ComObject Excel.Application
$e.Visible = $true

ls $dir | % {
[void]$e.Workbooks.Open($_.FullName)
Write-Host "file - $($_.Name)"
for($i = 1; $i -le $e.Workbooks.Item(1).Sheets.Count; $i++){
$s = $e.Workbooks.Item(1).Sheets.Item($i)
Write-Host " sheet $($i) - $($s.Name)"
$s.PageSetup.Zoom = $false
$s.PageSetup.FitToPagesWide = 1
$s.PageSetup.FitToPagesTall = 999
}
[void]$e.Workbooks.Item(1).Save()
[void]$e.Workbooks.Close()
}

他にも色々できるんですが、PowerShell Excelとかで検索しても細かい情報はわからないので、他の言語でwin32oleを扱ってるチュートリアルとか読むのがいいのかなー、僕は大体やりたい作業をエクセルマクロで記録して、あとは勘で同じ動作になるようPowerShellをいじってく感じです。Rubyだけど、この記事とか。

Scripting GuyのExcel記事。

ASP.NET開発サーバでWindows認証

開発環境のSQL Serverが混合モード認証からWindows認証に変わってしまったので、ローカルでASP.NET開発サーバ使ったデバッグができなくなるのでは、と思ったけど、Visual Studio起動するときに右クリックから「別のユーザーとして実行」でWindows認証に使うユーザを指定してあげれば、ASP.NET開発サーバで使われるユーザもそれになるのでWindows認証に出来た。違うユーザとして動かしてることになるので、Visaul Studioの設定とか全部やりなおしだけど。
っていうか今思い出したけど、普通にWeb.configでidentity impersonateつかって偽装してあげればいいのかなー。

Tech Fielders セミナー 東京 [アプリケーション開発環境の進化]にいってきた

もう一週間前のことなので記憶もおぼろ。参加者は40人くらいかな? 僕は午後半休取っていったのですが、ライトニングトークや懇親会のタイミングで集団で帰る人なんかは、業務で来てたっぽかった。同じ会社の人もたまたま一人みつけて、彼は業務で来ていたけど平気でビールを飲んでいた……。
メインの「アプリケーション開発環境の進化」はPart 1がVisual Studioの進化についてで、細かいところだと、プロジェクトのテンプレート、コードスニペットの話とか。どちらも作った、使ったことあるんだけど、試しにやってみた、というレベルでチームとして共有できてないんで、勉強になった。コードスニペットは共有ディレクトリに置いとくとか、VSSなんかにいれちゃうとか。GAT/GAXはなんだかよくわからなかった……。
Part 2は「統合開発環境からチーム開発基盤への進化」で、テストの記録が動画やスクリプトとして記録されてたりとか、まぁ他のソフトであるんだけどVisual Studioに統合されてたらたしかに便利だよねー、あと他のもいろいろすごそうだし、と思うんだけど、現状でTeam Systemも使ってないからプロジェクトで購入できるかどうかが個人的にはまず問題だよなーとかいうあたり。2010までにえらくなればいいのか。あといろいろ。
後半ライトニングトークで四人。投票あり。一番手がzioさんで、内容はリンク先にあります。メインのセッションでVisual Studioのアドオンとか作れるんだよ、という話が出てきても実際そんなもん作らんじゃろ、と思っていたところへ実際便利そうなものを作ったという発表で、テーマが一致してたのは偶然らしいですが、興味深かった。その時は自分でもアドオン作ってみたいな、と思った(今は思ってません)。
二人目の方は、マイクロソフトの営業?の方で、商品としてのVisual Studio Team System 2008 Database Editionについてで、DB管理者と開発者でこんなことありますよねーみたいな話。
三人目の方は、フランスだっけか? の方で、リソースファイルの翻訳なんかをVisual Studio Team System使って管理したら便利だったぜ!! というテーマで、確かに業務で使って便利だったんだろうなー、というのが分かるトークだった。司会の方も、 一番最初に、私がコメントすると評価に影響するのでコメントはしません、と言っていたのに、この方の発表が終わった後に、素晴らしい、と言っていた……。
四人目の方はメモリリークが起こってるっぽいときにパフォーマンスモニタで調べられるよ、という話で、小芝居が入っていたりしてプレゼン的に気合が入っていた。結局、原因はWinFormsで親フォームを消したときに子フォームが生きたままになってたとかそんな話だったのかな。
ライトニングトークは出てみたいけどどうなのかね、なんも話すことがないので話せるようなことをするのが先だな。
最後に、ちょっとお菓子とかビールとか出てきていろいろ話を聞いたり。興味深い話が多いんだけど、自分みたいなどこにでもある系の仕事をしている、一番人口的には多いはずカテゴリの人になかなか会わないのが謎だけど自分もいきなりそんな話しないんでその辺のスキルだなー。あとプレゼントでApp Arch Guide 2.0の手書き風ポスターもらった。かっこいい。また行きたい。

[void]をいつも忘れる

最近、結合テストエビデンスをとる必要があり、久しぶりにPowerShellを使っています。テストのエビデンス作成は本当に辛く、コーディングの五倍くらい職務への意気が阻喪される作業なので出来るだけ手早く、間違いのないように遂行したい。あと、他の人も同じ作業が出来るようにしたい。ということで、たとえば、DBのテーブルの内容を取得するために、こんなスクリプトを使っています。大体のイメージとお考えください。


function Get-DataTableByAbcNO($table_name, $abc_no, $con){
$q = "SELECT * FROM $table_name WHERE AbcNO = '$abc_no'"
$dt = New-Object "System.Data.DataTable"
$da = New-Object "System.Data.SqlClient.SqlDataAdapter" ($q, $con)
$da.Fill($dt)
return $dt
}

こんな短いスクリプトなのに、二つも罠に嵌っている! 一つ目は、$da.Fill($dt)です。DataAdapter.Fillはintを返すメソッドで、PowerShellは関数内の関数からの戻り値はすべて出力パイプラインに流すので、このままだと、検索された数がまずGet-DataTableByAbcNOの戻り値となり、その後に検索された行が返ることになります。具体的にいうと、戻り値を変数$retに格納した場合、$ret[0]に検索結果の数が、$ret[1]以降にDataRowが格納されます。これは、$da.Fill($dt)の前に、[void]をおき、[void]$da.Fill($dt)とすることで防げます。
次に、最後のreturn $dtですが、僕の意図としては、DataTableを返したいわけです。しかし、そうはなりません。ここの動きは正直よく理解できていませんが、関数戻り値をGetTypeした結果だけ表にするとこうなります(手元の環境2.0CTPでの結果です)。

戻し方 検索結果の数
return $dt 一件 DataRow
複数件 Object[](実際はDataRowの配列)
return ,$dt 一件 DataTable
複数件 DataTable

つまり、結果が複数件ある場合と、一件しかない場合で型が変わってしまいます。これでは扱いにくいので、配列演算子の,を使って配列の要素にしてしまうことでそれを防いでいます。もしくは、関数を呼び出した側で結果を@()にいれてあげてもいいです。長さが1の配列だとその唯一の要素を返し、2つ以上あれば配列として返すのは知っていたのですが、DataTableは別に配列ではないので、なんでこのような挙動になるのかはよくわかりません……。インデクサがあると配列のように扱われるのかな。こっちが修正版。


function Get-DataTableByAbcNO($table_name, $abc_no, $con){
$q = "SELECT * FROM $table_name WHERE AbcNO = '$abc_no'"
$dt = New-Object "System.Data.DataTable"
$da = New-Object "System.Data.SqlClient.SqlDataAdapter" ($q, $con)
[void]$da.Fill($dt)
return ,$dt
}
上記二つに加えて、関数の呼び出しに()はいらない、むしろ、付けると違う挙動になる、というのがPowerShell十大落とし穴へ確実にランクインするところだと思います。関数宣言を関数呼び出しと見た感じ同じになるようにしたのは間違いだった、みたいなことが確かプログラミング言語Cにも書いてあったし、別におかしくない。
あ、そういえば、僕は『Windows PowerShellクックブック』を持っていたな、と思い「レシピ 15.7 プログラム:SQLデータソースに問い合わせる」参照してみると、[void]に関してはほぼ同じ、returnに関してはこんな感じのスクリプトとなっていました。

# クエリからすべてを返す
$dataSet.Tables | Select-Object -Expand Rows
なるほど。『Windows PowerShellクックブック』はこのレシピでもExcelからでもAccessからでもSQLサーバーからでもデータ取れるように作られたスクリプトが丸々載っていたり、あととにかく異常に扱っている範囲が広い、コマンドレット、スナップインの作り方からいろいろ幅広く扱ってる感じです。特に他の本に比べて、ということだと、III部の管理者タスクがすごく充実してるのでいいのではないかなぁ、と思います。僕は管理者ではないので、付録AのPowerShell 言語と環境など、付録群も簡潔・明瞭にまとまってていいな、と思いました。

App Arch Guide 2.0 Beta 2がでてた

章組みが変わってるけど、自分が読んだ部分に関しては特に変わってないっぽかった。
前のエントリで、「Logging and Instrumentation」のInstrumentationがなんだかわからない、ということを書きましたが、「Logging and Instrumentation」ってpatterns & practices Enterprise LibraryのBlockの一つでした。Enterprise Libraryもぜんぜん触ったことないんだけど、同じpatterns & practicesなんで用語が似ている、用語が似ているというか、自分が一般名詞だと思って読んでいたものは実はEnterprise Libraryの一部を指した固有名詞だったのでは? ということに気付きました。
Enterprise Libraryって結構使われてるのかな? Java界隈もネット上だけで見てるとみんなフレームワーク使ってDIやで、という風に見えるけど実はそうでもないらしい、というのをあてはめて考えると、Enterprise Libraryを使ってるプロジェクトって日本にはないのでは? とか思ってしまうけど、そんなことはなくてみんな使っているのでしょうか。いや、みんなが使っているかどうかということは関係ありませんでした。いいかげんlog4netやめて、Logging and Instrumentationで、Unityやで、よくわからない……、というかんじにしたい。
あとTech Fielders セミナーに凄い行きたかったけど仕事が(雰囲気的に)忙しいので行けそうにない。しかしどう考えても僕が半日いないくらいで致命的なことになったり、逆に半日いたので超生産性が高まった、などということはありえず、行った方がいい気もする。