ページ

2009年6月25日木曜日

[IE][C#][COM] IE のセキュリティゾーンをプログラムから操作する

Adding and removing websites to/from security zones programmatically (C#) より。
なんとなく気になったので覚え書き。

IE のセキュリティゾーンへ / から WebSite を追加したり削除したりするのはどうやんの?という話。
IInternetSecurityManager を使えばできるよ、と。
そのために UrlMon.idl を midl でコンパイル。
できたタイプライブラリ UrlMon.tlb を tlbimp でマネージドへ。
これで CLSID_InternetSecurityManager とか必要なものが手に入った。
後は、いつもどおり CLSID_InternetSecurityManager を CreateInstance してごにょごにょすれば OK。

というわけで、C# とありますが内容は全部 COM ですw

あと重要な注意。
記事で紹介されているコードでは Marshal.ReleaseComObject してません。
try . . . finally で括って、使い終わったら確実に Marshal.ReleaseComObject するようにしておいた方がいいです。
(7/2 追記 Dennis "D.C." Dietrich さんからコメントをもらい、やみくもに Marshal.ReleaseComObject すればいいというものでもないとわかったのでこの一文は取り消します。詳しくは 「[.NET][COM] Marshal.ReleaseComObject の危険性について」 をご覧ください)


[Silverlight] Siverlight が Xbox 360 で動くようになる?

Silverlight Ads on Xbox LIVE Announced at Cannes より。
6/22 (火) の the Cannes Lions International Advertising Festival 2009 にて、来年内に Xbox LIVE で Silverlight を使うことによってリッチメディアテクノロジーな Interactive Advertising Bereau (IAB) をできるようにするってなアナウンスがあったようです。
Interactive Advertising Bereau (IAB) って何のことなのかわかってなかったりしますが、先を読んでいくと、どうやら Silverlight を使えば静止画だけではなく動画も使えるし、インタラクティブにもできるし、インターコネクトにもできる、それに PC やモバイルにも同じものが使える、とかなんとかあります。
Xbox 360 で Silverlight が動くようになれば、マーケットプレースなどいろんなところでいろんなことができるようになるってことでしょうか?
ちなみに日本の Xbox LIVE のマーケットプレースはゲームくらいしか無いみたいですが、欧米などでは映画や音楽などいろいろと充実してるとかって聞いたことがあります。

実は、昨日、スコット・ガスリー氏が Twitter で

It was actually an XBOX 360 that was demoed using Silverlight. We have a Silverlight port that supports PowerPC (including .NET)

3:40 AM Jun 24th webで

なんてつぶやいてたんですよね。
「確かに Silverlight を使った Xbox 360 のデモをやったよ。PowerPC 版の Silverlight 持ってるからね。(.NET 込みで)」 なんて感じでしょうか?
これがたぶん上記の発表のことなんでしょうね。

ちょっと検索してみたら
Microsoft introduce la tecnologia Smooth Streaming 1080p su Xbox 360
こんなニュースが。
これ何語?
全然読めませんし、読んでませんがw タイトルだけでも Xbox 360 で 1080p の Smooth Streaming ができるようになるっていうような内容なんだろうとわかりますね。画像もありますし。
ちなみに、画像はオープンソースの 3DCG ソフトである Blender で作られている Big Bug Bunny の一コマですね。
記事の中にはちゃんと Silverlight っていう単語も出てきています。

ということで、まだもうしばらく先にはなりそうですが、Xbox 360 でも Silverlight が動くようになるみたいです。
マーケットプレースってことなので Silverlight でゲームを作れるってわけじゃ無いでしょうが。


2009年6月24日水曜日

[Silverlight] Silverlight 3 の 3D Projection を使って影をつける

Shadow effect using 3D projection in Silverlight 3 より。
これ、すごいなぁ。
Silverlight 3 beta 1 が入っていれば上記ページにアクセスすると実際に動いているところを見れます。
球のあたりのマウスを持っていくと、球の表面にライトの反射が、球の後ろに影が描画されます。

Silverlight 3 で追加される 3D Projection は、言ってしまえば形を変形して奥行きがあるかのように見せかけるっていうだけのもので、ライトやら影やらの計算ができるってわけではないです。
(だから 3D Projection = 3D 投影 っていう名前なんでしょう)

では、どうやっているのか。

ライトの反射は、実は単なる円形のグラデーションだそうです。
グラデーションの原点 (GradientOrigin) をマウスにあわせて動かしているだけです。
他には何もしていません。

影の方ですが、こちらも単なる灰色のグラデーションで、それを 3D Projection でそれらしく変形しているだけです。
具体的には PlaneProjection を使っていますが、それの LocalOffsetX、LocalOffsetY をマウスにあわせて動かしているだけです。
他には何もしていません。

ソースを見ると本当にこれだけのことしかしていません。
うーん、なんと言うか、、、センスいいなぁ。


2009年6月19日金曜日

[Silverlight] DataGrid のセルの見た目にアクセスする

前 2つの記事
  「[WPF] ListBox や ComboBox の各行の見た目にアクセスする
  「[Silverlight] ListBox や ComboBox の各行の見た目にアクセスする
に関連しますが、Silverlight の DataGrid では ItemContainerGenerator のようなアプローチが使えません。
というのも、Silverlight の DataGrid は Control の子になっていて ItemContainerGenerator に必要なメソッドがないからです。
しかし、ちょっとした工夫で同じようなことができますので、それを紹介してみます。

さっそくですが必要となるコードを載せちゃいます。
そんなに難しい話では無くて、必要なのは以下のコードだけです。

public partial class MainPage : UserControl
{
private Dictionary<int, DataGridRow> rowContainer = new Dictionary<int, DataGridRow>();

public MainPage() { InitializeComponent();
this.dataGrid1.LoadingRow += dataGrid1_LoadingRow; }
void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) { this.rowContainer[e.Row.GetIndex()] = e.Row; }
private FrameworkElement GetDataGridCell(int columnIndex, int rowIndex) { var e = this.dataGrid1.Columns[columnIndex].GetCellContent(this.rowContainer[rowIndex]); while (true) { if (e == null) { return null; } if (e is DataGridCell) { return e; } e = e.Parent as FrameworkElement; } }
private void button1_Click(object sender, RoutedEventArgs e) { var cell = GetDataGridCell(1, 2); var v = VisualTreeHelper.GetChild(cell, 0); if (v is Grid) { ((Grid)v).Background = new SolidColorBrush(Colors.Red); } } }

上記は MainPage に dataGrid1 という名前の DataGrid が置いてある場合のコードです。
まず、DataGrid の LoadingRow イベントを受けるようにします。
このイベントは DataGridRow が作られるたびに呼び出されます。
LoadingRow イベントでは作られた DataGridRow を Dictionary に保存しておきます。(キーは行のインデックス、値は DataGridRow)

GetDataGridCell() メソッドがこのコードのキモです。(キモって言うほどたいしたことしてるわけじゃないですが)
DataGridColumn.GetCellContent() メソッドを使うとセルの中のコンテントを取得することができます。
DataGridColumn はカラム位置のインデックスで簡単に取得できます。
行の指定は DataGridRow を渡すことによって行います。
これに必要なので LoadingRow イベントで DataGridRow を取っておいたわけです。
さて、この DataGridColumn.GetCellContent() メソッドですが、これで返ってくるのはセルの中のコンテントそのもの、たとえば、TextBlock などです。
これだとちょっと使いにくいので親をさかのぼって DataGridCell を探し、それを返します。

DataGridCell ってのが ListBox の項目コンテナ (ListBoxItem) に相当すると思ってもらえばいいかと思います。
ListBox では、ItemContainerGenerator が無かったとはいえ PrepareContainerForItemOverride() メソッドなど項目コンテナを取得するすべは用意されていました。
DataGrid にはそういったものが無いためコンテントを取得し、そっから親をたどることによって項目コンテナに相当するものを取得しているわけです。

DataGridCell が取得できたら後は ListBox と同じようにビジュアルにアクセスできます。
上記のボタンクリックイベントでは (桁インデックス:1、行インデックス:2) のセルを取得し、その子ビジュアルを取得して背景色を変更しています。

ここでちょっと注意。
Silverlight の DataGrid は必要となったときに初めて DataGridRow が作られるようになっています。
初期化時にすべての行が作られるわけではありません。
隠れていて表示されていない行の DataGridRow はスクロールして表示されたときに初めて作られたりします。
ですので、データはあっても DataGridRow はまだ無いという状況がありえます。
上記のコードはそういったチェックをしていないため、まだ作られていない行にアクセスすると死にます。
本当ならちゃんと DataGridRow が生成済みかどうかをチェックしてやるようにしてください。

ちょっと調子に乗って DataGrid のセルの中に DataGrid が入っているというのを試してみましたw
XAML はこんな感じ。

<data:DataGrid x:Name="dataGrid1" AutoGenerateColumns="False">
<data:DataGrid.Columns>
<data:DataGridTemplateColumn Header="Grid">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Padding="4,4,4,4" Text="グリッド"/>
<data:DataGrid AutoGenerateColumns="True"/>
</StackPanel>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
</data:DataGrid>

ボタンが押された時のコードはこんな感じ。

private DataGrid FindInnerDataGrid(DependencyObject o)
{
if (o is DataGrid)
{
return o as DataGrid;
}
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); ++i)
{
var x = FindInnerDataGrid(VisualTreeHelper.GetChild(o, i));
if (x != null)
{
return x;
}
}
return null;
}

private void button2_Click(object sender, RoutedEventArgs e) { var cell = GetDataGridCell(3, 2); var grid = FindInnerDataGrid(cell); grid.ItemsSource = new[] { "あああ", "いいい", "ううう" }; }

GetDataGridCell() メソッドを使って DataGridCell を取得するのは先のコードと同じです。
DataGridCell を取得したら、そこからビジュアルツリーをたどって最初に見つけた DataGrid を目的のものとしています。
セルの中に DataGrid が入っているなんて変態的な状況は普通おこらないはずなのでとりあえずこれで動きます。
もうちょっとまともにやるなら、DataGridCell から最初に ContentPresenter を探して、さらにその子供から DataGrid を取得するようにした方がいいかもしれません。
まぁ、こうやって DataGrid が取得できれば後はどうとでもできます。
試しに ItemsSource を設定してみたらちゃんとデータバインドされて表示が更新されました。

上記に上げたコードほとんどそのまんまですが、Visual Studio 2008 のソリューションを上げておきました。
Silverlight 3 beta 1 のプロジェクトですがソースコード自体は Silverlight 2 でも問題無いはずです。
SilverlightDataGridSample.ZIP-download


[Silverlight] ListBox や ComboBox の各行の見た目にアクセスする

たとえば、ボタンをクリックされたら ListBox の 2行目の背景色を変えたい、なんてことがあったとします。
ListBox のそれぞれの行はたぶん Border とか Rectangle とか TextBlock とかを組み合わせて描かれてるんだと思いますが、そいつらにアクセスして背景色を変えたいというわけです。

WPF 編はこちら → 「[WPF] ListBox や ComboBox の各行の見た目にアクセスする

■ Silverlight 2、3 の場合
WPF と同じように VisualTreeHelper を使って ListBox の頭からビジュアルツリーをたどっていけば各行のビジュアルにもたどり着くことができます。
具体的には、ビジュアルツリーをたどっていくと行数分だけ ListBoxItem が出てきます。
この ListBoxItem の下がそれぞれの行のビジュアルです。

Silverlight でも WPF と同じように ItemContainerGenerator が使えると便利なんですが Silverlight には ItemContainerGenerator がありません。
(ItemContainerGenerator が何か知らないって人は WPF 編 を見てください)
けど、実は Silverlight Toolkit に ItemContainerGenerator クラスがそのままの名前で含まれています。
なので、こいつを使えば、、、って、実は Silverlight Toolkit に含まれている ItemContainerGenerator クラスはコンストラクタが internal になっていて外部から使えません orz
いけずぅ

というわけで、以下、自分で実装する方法です。
Silverlight Toolkit に含まれているものを参考にして必要最小限のところだけ実装すると以下のようになります。

public class ItemContainerGenerator
{
private List<KeyValuePair<DependencyObject, object>> container = new List<KeyValuePair<DependencyObject, object>>();

public ItemContainerGenerator() { }
public void PrepareContainerForItemOverride(DependencyObject element, object item) { this.container.Add(new KeyValuePair<DependencyObject, object>(element, item)); }
public void ClearContainerForItemOverride(DependencyObject element, object item) { foreach (var x in this.container) { if (x.Key == element) { this.container.Remove(x); return; } } }
public DependencyObject ContainerFromIndex(int index) { return this.container[index].Key; }
public DependencyObject ContainerFromItem(object item) { foreach (var x in this.container) { if (x.Value == item) { return x.Key; } } return null; } }

次に ListBox を継承して ItemContainerGenerator 対応版にしてやります。
ここでは MyListBox という名前にしました。

public class MyListBox : ListBox
{
private ItemContainerGenerator itemContainerGenerator = new ItemContainerGenerator();

public ItemContainerGenerator ItemContainerGenerator { get { return this.itemContainerGenerator; } }
public MyListBox() { }
protected override void PrepareContainerForItemOverride(DependencyObject element, object item) { this.itemContainerGenerator.PrepareContainerForItemOverride(element, item); base.PrepareContainerForItemOverride(element, item); }
protected override void ClearContainerForItemOverride(DependencyObject element, object item) { this.itemContainerGenerator.ClearContainerForItemOverride(element, item); base.ClearContainerForItemOverride(element, item); } }

XAML を書き変えて ListBox の代わりに自分の MyListBox を使うようにしてやります。

<UserControl x:Class="ItemContainerSample.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:ItemContainerSample"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel>
<my:MyListBox x:Name="listBox1">
<ListBoxItem Content="Item 1" />
<ListBoxItem Content="Item 2" />
<ListBoxItem Content="Item 3" />
<ListBoxItem Content="Item 4" />
<ListBoxItem Content="Item 5" />
</my:MyListBox>
<Button x:Name="button1" Click="button1_Click" Content="Button" />
</StackPanel>
</Grid>
</UserControl>

これで WPF と同じように ItemContainerGenerator を使って項目コンテナを取得することができるようになりました。

private void button1_Click(object sender, RoutedEventArgs e)
{
var item = this.listBox1.ItemContainerGenerator.ContainerFromIndex(2);
var v = VisualTreeHelper.GetChild(item, 0);
if (v is Grid)
{
((Grid)v).Background = new SolidColorBrush(Colors.Red);
}
}

ListBox の項目コンテナが ListBoxItem だというのは WPF と同じです。
ただ、この ListBoxItem の最初の子ビジュアルは WPF と違い Grid になっていました。
また、いくつかビジュアルツリーをたどっていくと ContentPresenter が出てきて、データテンプレートを使っている場合はそいつの子がデータテンプレートの内容になっているというのは WPF と同じです。

上記のコードから明らかなように、ItemContainerGenerator 対応版にするためにはそのコントロールが PrepareContainerForItemOverride() メソッド、ClearContainerForItemOverride() メソッドをサポートしている必要があります。
これらのメソッドは ItemsControl クラスのものです。
ですから、WPF と同じように ItemsControl から継承している ComboBox なども ItemContainerGenerator 対応版にすることができると思います。
また、Silverlight Toolkit に含まれている TreeView などは始めから ItemContainerGenerator に対応していたりします。

内容的には上に書いたものと同じですが、VisualStudio 2008 のソリューションを↓に置いときました。
Silverlight 3 beta 1 のプロジェクトですが、ソースコード自体は Silverlight 2 でも問題無いはずです。
ItemContainerSample.ZIP-download

ところで、Silverlight には DataGrid がありますが、あれは ItemsControl の子じゃないし、このアプローチは無理なんですね。
というわけで、DataGrid についてはこちら → 「[Silverlight] DataGrid のセルの見た目にアクセスする


[WPF] ListBox や ComboBox の各行の見た目にアクセスする

たとえば、ボタンをクリックされたら ListBox の 2行目の背景色を変えたい、なんてことがあったとします。
ListBox のそれぞれの行はたぶん Border とか Rectangle とか TextBlock とかを組み合わせて描かれてるんだと思いますが、そいつらにアクセスして背景色を変えたいというわけです。

Silverlight 編はこちら → 「[Silverlight] ListBox や ComboBox の各行の見た目にアクセスする

■ WPF の場合
VisualTreeHelper を使って ListBox の頭からビジュアルツリーをたどっていけば各行のビジュアルにもたどり着くことができます。
具体的には、ビジュアルツリーをたどっていくと行数分だけ ListBoxItem が出てきます。
この ListBoxItem の下がそれぞれの行のビジュアルです。

ただ、WPF には直接各行の ListBoxItem を取得する方法が用意されています。

private void Button_Click(object sender, RoutedEventArgs e)
{
var item = this.listBox1.ItemContainerGenerator.ContainerFromIndex(2);
var v = VisualTreeHelper.GetChild(item, 0);
if (v is Border)
{
((Border)v).Background = Brushes.Red;
}
}

ItemContainerGenerator を使えば各行で使われている項目コンテナを取得することができます。
項目コンテナっていうのは ListBox の場合 ListBoxItem のことです。
ComboBox の場合は ComboBoxItem になりますし、TreeView の場合は、、、と、ものによって実際のクラスは違うものになりますので、これらを一般化して項目コンテナと呼ばれています。(英語だと item container。そのまんまアイテムコンテナでもいいように思いますが、MSDN Library では項目コンテナと訳されてました)
ContainerFromIndex() メソッドを使えばインデックスに対応する項目コンテナを取得できますし、ContainerFromItem() を使えば項目 (たとえば ListBox.Items[2] といったもの) に対応する項目コンテナを取得することができます。
ListBox の頭からビジュアルツリーをたどるよりはずっと使いやすいです。
これらのメソッドの戻り値は DependencyObject ですが、もちろん、実際の型は ListBoxItem となっています。

項目コンテナの子ビジュアルを取り出してやれば、それが実際に表示されている要素です。
WPF の ListBox の場合 Border になってるのでそれの Background を変えてやれば 「2行目の背景色を変える」 ということができます。
また、もう少しビジュアルツリーをたどると ContentPresenter があります。
データテンプレートを使っている場合などは、この ContentPresenter の下がその内容になっています。

ItemContainerGenerator プロパティが使えるのは ItemsControl クラス、および、その子孫クラスです。
なので、ListBox、ComboBox、TreeView などなどで同じような方法で項目コンテナを取得できるはずです。
ちなみに、WPF Toolkit に含まれる DataGrid も ItemsControl の子孫になってるようです。試してないのでわかりませんが、同じように ItemContainerGenerator を使えるのかもしれません。


2009年6月18日木曜日

[VB10] VB2010 の暗黙的な行継続

昨日書いた 「[VB10] Visual Basic 2010 の新機能」 に関連してちょっとおもしろそうだったので。

Implicit Line Continuation in VB 10 (Tyler Whitney) より
(と言ってもまだよく読んでないんですが)

暗黙的な行継続を認めたとき

Return 1
+foo()

これは Return 1 なんでしょうか?それとも Return 1+foo() なんでしょうか?
2行目は foo() メソッドの呼び出しに単項+演算子が付いたものとも解釈できるわけですね。
C# だとステートメント末に “;” が付くのでこのような曖昧性はおこりませんが、ステートメント末を指定しない VB ではこういったことがおこってしまうわけです。
(C# で +foo(); と書くと 「メソッドの戻り値に単項+演算子を適用した値が何にも使われていない」 ってことで error か warning になったように思いますが、まぁ、それは別の話ってことで)

さらにこんなのも例示されています。

With y
    A=x
    .xfield
End With

さて、これは

暗黙の行継続されてて、こう?
    With y
       A=x.xfield
    End With

それとも書かれてる通り、こう?
    With y
        A=x
        .xfield
    End With

これまたどちらとも解釈可能になってしまいます。

また、VB には Do . . . Loop ステートメントWhile . . . End While ステートメント なんてものもあります。
そのため

Do
    While x = 0
        . . .
    End While
Loop

なんてのも Do . . . Loop なのか、それとも Do と While を繋げて Do While . . . なのかがすぐには判断できません。
この場合は、先読みしていって End While が出てくるか Loop が出てくるかといった具合に探していけば曖昧性無しに解釈可能かもしれませんが、いろいろとややこしいことになりそうですし、場合によっては曖昧性が発生するようにも思えます。

上記記事には他の事例も載っていますが、こんな風に VB では 「どこでも改行できる」 なんてことは不可能なわけです。
C/C++/C#/Java と言った言語は 「改行は空白文字の一種」 とみなされて、空白を書けるところであればどこでも改行できます。(もちろん、プリプロセッサや文字列定数の中などは改行は別扱いされたりしますが)
VB の文法をこのように変更することはどう考えても不可能なので、文法的に曖昧性が発生せず、みんなが改行したいだろうと思われるところを抽出し、そして 「ここでの改行は認めよう」 というのをルール化したのが暗黙の行継続という機能なわけですね。


2009年6月17日水曜日

[Silverlight] スプラッシュ・スクリーンを自前のものに差し替える

Splash screens and Loaders in Silverlight より。
xap ファイルのサイズが大きいときなどロードに時間がかかってるときは Silverlight プラグインが自動的にロード中のくるくる回るやつを表示してくれます。
あれって差し替えることができるんですね。

まず、適当な XAML を用意する。
そして、Silverlight プラグインを読み込んでいる <object> タグに

<param name="splashscreensource" value="XAML のファイル名"/>
<param name="onSourceDownloadProgressChanged" value="onSourceDownloadProgressChanged" />

と書きくわえます。
splashscreensource については こちら
もちろん、onSourceDownloadProgressChanged ファンクションを JavaScript で書いておく必要があります。
xap を読み込んでいる間に表示するためのものですから、Managed で書くことはできないんですね。
onSourceDownloadProgressChanged ファンクションはロード中に適当な間隔で呼ばれるので、XAML を操作してプログレスバーを進めるなり、パーセント表示を進めるなり好きなようにすればいいと。


[VB10] Visual Basic 2010 の新機能

VB10 (VB2010 って言った方がいいんだろうか?) を追っかけてる人には何を今さらっていう話題なんでしょうが、ついさっき知って軽くショックを受けたのでw

VB10 の新機能が What's New in Visual Basic 2010 にあります。

最初の自動実装プロパティは C# に以前からある機能に似てますね。
ただ、C# と違うのは

Public Property Name As String

とすると自動的に _Name という Private なフィールドが作られるそうです。
もちろんコード内で _Name にアクセスすることもできるし、デバッガでウォッチするようなこともできるそうです。ただし、インテリセンスには出ないようになってるとのこと。
C# では予測できない長い名前が生成されるのに比べると考え方がずいぶん違いますね。

続いて コレクション・イニシャライザ

Dim winterMonths = {"December", "January", "February"}

こんな風に書けると。
C# とほとんど同じですね。というか、VB で { } を使うのってどうなの?という気がしちゃうんですがw
それよりも、Dim が C# の var とほとんど同じ意味だってことがいまだになじまないなぁ。
(上記は As Object() ではなく、きちんと型推論されて As String() になります)

そして暗黙的な行継続。ここ の中ほどの “Implicit Line Continuation”。
ついに VB でも “_” 無しで改行できるようになるんですね。
が、細かいルールがあるようで表になってます。
”_” 無しで改行できるのは

  • カンマ “,” の後。
  • “(“ の後、”)” の前。
  • “{“ の後、”}” の前。
  • XML リテラルの中の “<%=“ の後、”%>” の前。
  • 文字列結合演算子の “&” の後。
  • 代入演算子 (=, &=, +=, <<= など) の後。
  • 二項演算子 (+, ?, Mod, <, <=, And, AndAlso など) の後。
  • “Is” と “IsNot” の後。
  • メンバ名の “.” の後、メンバ名の前。ただし、With ステートメントや初期化リストの中では “_” が必要とかなんとか。
  • XML リテラルの中の “.”、”.@”、”…” の後。ただし、With キーワードの中では “_” が必要とかなんとか。
  • 属性を示す “<” の後、”>” の前。ただし、アセンブリレベルとモジュールレベルの属性のときは “_” が必要。
  • LINQ の “From”、”Order By”、”Select” などの前後。ただし、”Order By” などを途中で改行してはダメ。
  • For Each ステートメントの In の後。
  • コレクション・イニシャライザの From キーワードの後。

だそうです。
うーん、なんと言うか、努力賞ものですね。
まぁ、「ここなら改行して良さそう」 と思えるようなところでは改行して大丈夫みたいなので使う分には混乱は少なそうではありますが。

それと 複数行のラムダ式

Dim increment1 = Function(x) x + 1
Dim increment2 = Function(x)
Return x + 2
End Function
Console.WriteLine((Function(num As Integer) num + 1)(5))

(複数行なのは 2つ目の increment2 だけですが)
この複数行のラムダ式のときの Function . . . End Function は普通の Function . . . End Function と同じように扱われるから行末に “_” は要らないのかな?
いや、実はラムダ式は式だから行末に “_” が必要だけど、上記の暗黙的な行継続によって “_” を省略できてるだけってことなのかな?

他にも新機能はあるようですが省略。


[.NET] System.Data.OracleClient 終了のお知らせ

ADO.NET team blog : System.Data.OracleClient Update より
えーと、これって 「カスタマーやパートナー、MVP たちと話をし、慎重に検討した結果、ADO.NET に含まれる System.Data.OracleClient は deprecate にすることに決まった」 と書いてありますよね?
ほぉ~、まじっすか。

どうやら
「System.Data.OracleClient は .NET Framework 4.0 にも含まれる。けれども deprecated とマークされる。なので、コンパイル時には warning が出る。ただ、実行する分にはまったく問題無い。Microsoft としては、アプリケーションを新規開発するときには Microsoft の OracleClient ではなく、他のパートナーが提供している ADO.NET プロバイダ for Oracle を使うことを強く勧める」
ということだそうです。

ちなみに、
「.NET Framework 4.0 のサポートポリシーに基づいてクリティカルな問題があった場合はホットフィックスの提供は続ける。.NET Framework 4.0 のサービスパックとしてクリティカルなバグフィックスの提供も続ける」
とあるので、新機能が追加されることはもう無いかもしれませんが、最低限のサポートは継続されるようです。


2009年6月11日木曜日

[WPF][Silverlight] WPF と Silverlight の違いをまとめた文書 (ただし英語)

まだ、中身は見てないんですが。。。

Guidance on Differences Between WPF and Silverlight
CodePrex にこんな文書が公開されていました。
これを書かれたのは Wintellect 社のシニア・コンサルタントの Sergio Loscialo さんみたいです。


2009年6月10日水曜日

[Silverlight] 例外とデータバインディングエラーを見るツール

まだ、ちゃんと読んでないしダウンロードもしてないんですが、覚え書きとして。
Glimpse for Silverlight ? Viewing Exceptions and Binding Errors
ほんのわずか、Application_Startup を書き変えて上げると、

  • 未処理の例外
  • データバインディングの際に出る例外
  • データバインディングのソースを書き間違って該当するソースが見つからないもの

を表示してくれるツールです。(ツールというか、ソースコード)

ダウンロードのファイルの拡張子が .doc になってるけど .zip にリネームして解凍してくれとのこと。


2009年6月9日火曜日

[Silverlight] Silverlight 3 は BinaryHttpBinding もサポート

Improving the performance of web services in SL3 Beta より。

というか、その元になってる 「What's new with web services in Silverlight 3 Beta」 より。
Silverlight 2 の Web サービス呼び出しは BasicHttpBinding だけでしたが、Silverlight 3 では BinaryHttpBinding もサポートされるそうです。
って、BinaryHttpBinding がどういうものなのか良くわかってないんですが、通常の XML 形式の SOAP ではなく、バイナリでやり取りしてしまおうってもんなんでしょう。
おそらく、W3C で規格化されているわけじゃないんでしょうから WCF の独自形式なんだと思います。
なので、相互運用性とかは無くなってしまうんだと思いますが、そんなものは必要くて通信のパフォーマンスをちょっとでもでも上げたいときはなかなか有効な方法だと思います。

あと、Silverlight 2 では Visual Studio の 「Add Service Reference」 で Web サービスのプロキシクラスを生成していましたが、Silverlight 3 では slsvcutil.exe というツールも提供されるそうです。


[.NET] Parallel ループ本体が小さいときの速度アップ法

Achieving Speedups with Small Parallel Loop Bodies より。
イテレーションが小さいときにうかつに Parallel にするとかえってパフォーマンスが悪くなる可能性があります。
例としてこんなコードが載っています。

int[] array = new int[100000000];
Parallel.For(0, array.Length, i =>
{
array[i] = i * i * i;
});

これだと 「array[i] = i*i*i;」 というだけのコードをパラレルにものすごい回数実行するため、パラレルのオーバーヘッドがしゃれにならないくらい大きくなってしまうわけですね。
普通の for ループにしてしまえばパラレルにするオーバーヘッドは無くなりますが、それではスレッド一つしか使わないためもったいないです。

上記の記事では、こういった場合に使える ForRange というちょっとしたメソッドが紹介されています。
ForRange はこんな風に使います。

int[] array = new int[100000000];
ForRange(0, array.Length, (from, to) =>
{
for (int i = from; i < to; ++i)
{
array[i] = i * i * i;
}
});

上記記事に載っているソースコードを見れば明らかですが、ForRange は Environment.ProcessorCount (搭載されているプロセッサ・コア数) 分に分割して Parallel.For を呼ぶようになっています。
仮にプロセッサ・コア数が 4 つの場合は、上記のコードは 0~25000000、25000000~50000000、50000000~75000000、75000000~100000000 の 4 の for ループが Parallel.For されることになります。

なるほどなぁ。


2009年6月8日月曜日

[.NET] Win 7 時代の Windows Automaion API 3.0(?)

Windows Automation API SDK Tools より
スクリーンリーダ (読み上げソフト) に対応したりとかするための Automation ですが、どうやら Windows 7 時代は 「Windows Automation API 3.0」 という名前になるようです。
冒頭部分には以下のようなことが書いてあるように思います。(自信ないんですが)

もう MSAA や UI Automation そのものとは言えなくなってきたから 「Windows Automation API 3.0」 と呼ぶことにした。(MSAA っていうのは Microsoft Active Accessibility 2.0 のことなのかな?)
もはや IAccessible は MSAA 専用ではなく、UI Automation のプロパティなんかもサポートするようになってるし、IAccessibleEx は MSAA と UI Automation の世界の橋渡しをするようにもなってる。
IUIAutomationLegacyIAccessiblePattern は MSAA のアクセシブル・オブジェクト・ツリーと UI Automation のエレメント・ツリーの間を行き来できるようにする。
MSAA のバージョンナンバーへのリスペクトとして 「Windows Automation API “3.0”」 とした。
それぞれの技術に関して言うときは “MSAA” や “UI Automation” という呼び方を今後もするけど、総称的、もしくは、フレームワークとして言うときは “Windows Automation API” という呼び方をすることになる。

というようなことが書いてあるようです。
MSAA ってのが何なのか、MSAA と UI Automation はどういう関係なのか、なんていう基本的な部分がよくわかってないので、あってるのかどうかイマイチ自信はありません。

記事では、Windows SDK などに含まれているツールについて紹介されています。
また、それぞれのツールが MSAA 用なのか UI Automation 用なのかが表でまとめられています。


[VS2010] 痛 Visual Studio

Visual Studio 2010 が WPF ベースなので痛IDEに出来るのではないかという話
この発想は無かったw
すばらしいwww


2009年6月6日土曜日

[VS2010] Visual Studio 2010 Beta 1 日本語ドキュメント(機械翻訳)

Visual Studio 2010 Beta1 製品ドキュメント公開のお知らせ」 より
Visual Studio 2010 Beta 1 の日本語ドキュメントが公開されたそうです。
ただし、機械翻訳です。
機械翻訳なんですが、英文と訳文がならんで表示されて、訳文にカーソルを乗せると対応する英文がハイライト表示されます。サイドバイサイドビュー (SxS View) っていうそうです。
これいい!
正規版では人力翻訳になるそうですが、そのときにも SxS View が使えるようにしてほしいです。

VS2010 Beta1 はこちらのURL: http://msdn.microsoft.com/ja-jp/library/fx6bk1f4(VS.100).aspx
.NET Framework 4 はこちらのURL: http://msdn.microsoft.com/ja-jp/library/w0x726c2(VS.100).aspx

ほんのちょっと見ただけですが、なぜか SxS View が無くなっちゃうところもあるみたいですね。ここ とか。
あと、.NET 4 の方は左のツリーと同期が取れてないような。。。

ところで、低帯域幅表示をオンにするとかなり軽くなるので低帯域幅じゃないときも便利だったりしますが、さすがに SxS View は無くなっちゃうんですね。
SxS View のために低帯域幅表示が重くなっては本末転倒なので必要無いとは思いますが、「ベータ版用に機械翻訳されたものです」 という注釈もなくなっちゃうのでそれくらいは入れておいた方がいいような気がします。


2009年6月4日木曜日

[Xbox360] Project Natal の中の人の話

Hands ? and Body ? on with Project Natal より
このブログは Xbox Live Community Team の方のブログで、Project Natal について書かれてました。

どうやら Kudo Tsunoda 氏が作った Project Natal の技術デモを初めて見たときのことのようです。
one-on-one とあるので一対一で見せてもらったみたいです。
やっぱり最初は 「幼い子が部屋の中をかけ回ったら? 猫が足元を横切ったら? 足がテーブルの陰になったら?」 といった疑問があった模様。
で、Kudo 氏が全身を使ったゲームのデモをやったあとに実際に自分もやらせてもらったと。
それは ”It was an amazing experience.” だったとあります。
そして、以下のようなことが書かれてます。

  • コントロールはすごく良く反応したし正確。体を速く動かしても問題無いし、ゲームのアバターもちゃんと付いてくる。ジッター (ブルブル震えるようなことだと思います) やラグもまったく無い。これはまだプロトタイプだということだったけれど、ちゃんと動く、ほんとによく動く。「ファイナルプロダクトに向けて直さなくちゃいけないこと」 なんてゼロだった。
  • Project Natal は赤外線スペクトラムを使っている。普通のカメラを使った技術と違って照明を配置したりといった必要はない。部屋の明かりを全部消して、照明がディスプレイのものだけだったとしても、ゲームをプレーすることができる。
  • The skeleton tracking keeps other objects, people, and creatures from interfering with your onscreen character. (「スケルトントラッキングは画面上のキャラが干渉を受ける他の物体や人、クリーチャーを keep する」 ということだろうけど、keep が良くわからない。続く文章からすると 「他の物体、人、クリーチャーがあってもちゃんと認識してるからスケルトントラッキングし続けることができる」 という意味のように思えるけどそれでいいのかな?)
    部屋にいる誰かが私の前に来て腕を振ったとしても、ノープロブレムだ。だから小さい妹が飛び跳ねたり走り回ったりしても心配する必要はない。
  • センサーは複数のプレーヤーをトラックできる。なので、全身を使って協力しあうようなアクションも OK。
  • This controller allows for some serious, full-body exercise. You’ll get a workout in more than just your right arm. (イマイチわからないけど、「このコントローラは全身運動にも使える。右手だけ動かしてるよりもよっぽとトレーニングになるよ」 みたいなことかな?)

そうか、そんなに反応もいいのか。
しかも、どうやらすでにかなり完成度は高いと。
どんなものが出てくるのか楽しみだなぁ。

ところで、普通のカメラの画像解析と赤外線の奥行き情報とを併用してるのかと思ってましたが、どうやら赤外線のみなんですね。
確かにその方が照明とか気にしなくていいから扱いは楽そうだな。


2009年6月2日火曜日

[Xbox360] Project Natal が楽しそうすぎる

あちこちで取り上げられてますが、
engadget 日本版: 「動画:Xbox 360のモーション操作アクセサリ「Project Natal」発表
これすごいなぁ。

動画はプロモーションムービーみたいなもんでしょうから、ここまで完璧な認識ができるのかどうかはわかりませんが、それでもかなりできるんでしょうね。
ZCam の解説へのリンクもありますが、なるほど、赤外線パルスで Z 軸の奥行きをピクセル単位で認識してるのか。
そんなことができるんだ。
確かに奥行きの情報があればかなりいろいろなことができるようになりそう。

ところで、これって簡易モーションキャプチャとして使えるようにしてくれないんだろうか?
データを .bvh あたりで吐き出してくれればそれでいいんだけど。
カメラから見て陰になってるところはどうしようもないとか、いろいろと制限はあるとは思うけど、それでもこれでモーションキャプチャできたらかなりおもしろいことになりそう。

Project Natal = Awesome! Could you build your own for Windows 7?
なんかこんな記事が。
本文中には 「(Project Natal を Windows 7 で使うには) モーションをキャプチャしたり 3D 空間のジェスチャを解析したりするドライバを書く必要がある。これは簡単なことではない」 みたいな感じのことが書いてあるんですが。。。
文末の UPDATES のところに 「Project Natal は SDK もあることがわかった。これについはまたわかったときに書く」 みたいなことが書き足してありますね。
この SDK ってのは Windows 用の SDK ってことなんでしょうか?
Windows 上でも誰でも使えるなんてことになったらおもしろいだろうなぁ。