fc2ブログ

青柳 臣一 ブログ(趣味系)

[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 でゲームを作れるってわけじゃ無いでしょうが。

[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 をマウスにあわせて動かしているだけです。
他には何もしていません。

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

[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 を使えるのかもしれません。

[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 の文法をこのように変更することはどう考えても不可能なので、文法的に曖昧性が発生せず、みんなが改行したいだろうと思われるところを抽出し、そして 「ここでの改行は認めよう」 というのをルール化したのが暗黙の行継続という機能なわけですね。

[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 のサービスパックとしてクリティカルなバグフィックスの提供も続ける」
とあるので、新機能が追加されることはもう無いかもしれませんが、最低限のサポートは継続されるようです。

[芸能] メイド服の似合うアイドルは?

メイド服の似合うアイドルは?
ζ*'ヮ')ζ<うっうー!応援ありがとうございますぅ

がんばれ、やよい!

ところで、これって 1日 1回投票できるっていうようなシステム?
投票結果(重複除く) でみるとやよいが圧倒的なんだけどw
なるほど、それでコメントもやよいがずば抜けて多いのか。
(私は春香に投票しましたが何か?w)

[Blender] BlenRig 3 ってほんとにすごいな

BlenderNation でも紹介されてた BlenRig 3 です。
http://www.jpbouza.com.ar/ESP2/descargas/blenrig-3/id/en

BlenRig 3.0 Alpha 2 from Juan Pablo Bouza on Vimeo.

Blender 2.49 が必要ってことだったので今まで見てなかったんですが、ようやく 2.49 を入れたので見てみました。
いやぁ、これはほんとにすごいわ。
見てみるまでは 「Mascle Simulation」 ってのはボーンで筋肉っぽい動きを何とかして再現してるのかな?くらいに思ってたんですが、ほんとに筋肉をシミュレートしてるんですね。
筋肉の一つ一つがオブジェクトとして作られていて、それらがボーンの回りに配置されてる。
ほとんどの筋肉には ShapeKey (いわゆるモーフ) が仕込んであってボーンの動きでドライブされるようになってる。
たとえば、手首を曲げると前腕の筋肉が縮む、かつ、膨らむといった具合。
なので、ボーンを動かすと多数の筋肉がそれにあわせて変形する。
皮膚は普通のメッシュで、まずボーンにあわせて動く別のメッシュ + MeshDeform Modifier によって大雑把に変形し、それがさらに Shrinkwrap Modifier で筋肉にシュリンクラップされる。
ちなみに、Shrinkwrap Modifier は一つの筋肉に一つ必要なのでものすごい数の Modifier が並んでる。
本物の人間が筋肉によって骨を動かすのと違って、ボーンによって筋肉が動かされるわけだから、厳密には人体の動きをシミュレーションしてるのとは違うのかもしれないけど、十分すぎるくらいリアルな感じ。
さすがにちょっと重いけど。

と、データをダウンロードして何がどうなってるのか見てたんだけど、あとになって作者さんが簡単な解説動画を上げてくれているのに気づいたw

BlenRig 3.0 Overview from Juan Pablo Bouza on Vimeo.

ん?最後の方に出てくるストレッチ・システムってなんぞ?
って、体のサイズを変えられるようになってるのか。
なんか、これだけでもすごいんですけど。

[Blender] フリーソフトの Blender を ‘3DMagix’ という名前で販売?

BlenderNation 「3DMagix: re-branding and selling the free software Blender」 より。
「‘3DMagix’ という名前で Blender を $47 で販売しているところがあるとたくさんの報告をもらった」 そうです。
そして、赤文字で 「3DMagix を検索してやってきた皆さんへ。Blender はフリーでオープンソースなソフトウエアです。だから、お金を払わなくても自由にダウンロードすることができます。もちろん、これは完全に合法です!」 とあります。

また、「このように Blender を再販することは合法なの?」 という補足説明が書かれています。
イエスでもありノーでもあるそうです。
どうやら GNU GPL ライセンスのソフトウエアをリブランドすることは合法だそうです。(リブランドってだいたい意味はわかると思いますが、名前などを変えて自分のブランドとする、というような感じだと思います。日本語だとどう表記したらいいだろう?)
ただクレジットやコピーライトなどは変えてはいけないなど何でもできるわけではないそうです。
詳細は Luxuriousity, scam or open source leech? にあるそうです。

そして、今回の件への対応として、’3DMagix’ で検索したら 「3DMagix っていうのは Blender のことで、Blender はフリーでオープンなソフトだよ」 というのが出てくるようにしたい。なので、ブログを持ってる人に記事を書いてほしい。その際は ‘3DMagix’ ‘Blender’ をタイトルに含め、記事内にこの BlenderNation の記事へのリンクを置いといて欲しい。というようなことが書かれています。

と、それなりに騒ぎになったんだと思いますが、Ton 氏のコメント によると一応解決したようです。
すぐさまコンタクトを取ったところ、「ちょうど 1時間前に 3DMagix の管理者から 『この商品はもう続けない』 とメールが来た」 そうです。
すでにサイトも見えなくなっています。

サイトも見てないのでどういう風な商売にしようとしてたのかわからないですが、内容からすると、ほんとに名前を変えただけで金を取ろうとしてたのかな?
一番最初のコメントに 「たくさんのアーティストの作品を許可なしで使ってる!」 なんてあるし、これがほんとなら確かにひどい。

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

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

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

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

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

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

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

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

[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 されることになります。

なるほどなぁ。

[.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

[MMD] MikuMikuDance が物理演算サポート?

MikuMikuDance の作者さんが上げた動画だそうです。
Bullet を MMD に搭載したみたいですね。
Bullet はオープンソースの物理演算エンジンです。
って、私もどんなものかはまったく知らないんですがw
1. Introduction によると、C++ で書かれていて PS3、Xbox 360、Wii、PC、Linux、Mac OSX、iPhone をサポートしているそうです。すごいな。
なんとなくフォーラム眺めてみたら 「3ヶ所変更するだけで PSP でも動いたよ」 なんてのまであるし。
OpenCL や CUDA のサポートも進んでるみたいだし、結構おもしろそう。
ちなみに、Blender も Rigid Body の物理演算にはこの Bullet を使っていたと思います。

興味が沸いたのでそのまま User Manual をちょこっと眺めてみたら、
World に RigidBody や CollisionObject を配置する。
それらは質量を持ち (正の数だと動くオブジェクト、ゼロだと動かない)、箱・球・コーン・凸多面体・三角ポリのメッシュなどで、摩擦係数や反発係数などのプロパティもある。
あとはフレームごとにシミュレーションをステップ実行。(デフォで 60fps)
オブジェクトの繋ぎ方を定義する constraint などもある。
といった感じなんですね。

MMD の動画を見ると Bullet に与えていると思われるオブジェクトのワイヤーフレームが表示されてます。
黄色いのはボーンによって動かされる被衝突判定用のオブジェクトで、赤いのが物理演算で動かされるオブジェクトかな?で、赤いやつの動きがボーンにフィードバックされるという感じ?
そういや、こういったオブジェクトや質量といったプロパティも必要になるので PMD ファイルの形式も変わるんでしょうし、PMDEditor がそれに対応しないとユーザモデルが作れませんね。

[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 のために低帯域幅表示が重くなっては本末転倒なので必要無いとは思いますが、「ベータ版用に機械翻訳されたものです」 という注釈もなくなっちゃうのでそれくらいは入れておいた方がいいような気がします。

[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. (イマイチわからないけど、「このコントローラは全身運動にも使える。右手だけ動かしてるよりもよっぽとトレーニングになるよ」 みたいなことかな?)

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

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

[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 上でも誰でも使えるなんてことになったらおもしろいだろうなぁ。

[えりりん] まいこ感謝祭、おもしろかった

本日20時から生中継!
予定通り開催されました。
いやぁ、おもしろかった。
ほんとに激しく第2弾希望です!

3つのカメラで同時に 3つの生放送っていうのはなんかちょっと新しかったなw
いや、おもしろいし複数カメラにするななんて言う気はありませんけどね。
けど、他のアングルが気になっちゃうんですよww
で、結局 3窓開いて全部見ることにwww
もっとも、そうするとどれを見ていいか迷っちゃってちょっと落ち着かなかったりするんですがww

ところで、これってアーカイブは公開してもらえるんだろうか?
チャットや 2ch なんかでも 「見たかったけど都合で見れなかった」 という声が複数。
やっぱりその場にいないと他に見るすべがないっていうのはきついよなぁ。
テレビ放送なら録画なんて簡単なことなのに。
というわけで、アーカイブの公開希望ですw

番組が終わった後は Stickam でずっとチャット。
もちろん映像も音声も無い状態だけどオーナーがログオフしなかったからかチャットだけ使える状態だった。
んで、チャットに PreStar で何度も名前を見たことがある人とかが何人かいて、そのころの話を聞いたりして盛り上がってた。
いやぁ、まさか PreStar でチャットをしていた人たちとチャットができる日がやってくるとはww
番組もおもしろかったけど、このチャットもおもしろかったなぁ。

ところで、まいこのウィンクが再配布されてるそうです。
http://messenger.live.jp/maiko/present/index.htm
ここかな?
(というか、配布が終わってること自体気付いてませんでしたが)
って、ありゃ、なにこれ?

Windows Live 公式サイトでも中村さんをご紹介しています。
使ってみましたWindows Live vol.2 中村繪里子さん

ってあるのに、「使ってみましたWindows Live vol.2 中村繪里子さん」 のページが無いじゃん。
あのインタビューってブログとか Windows Live Writer とかの話してたりなのになんで消しちゃったんだろ?
というか、契約とかで公開期限が決められてるとかなら仕方ないけど、そうでないなら古いものも残しておいてほしいんだけどなぁ。
というわけで、「使ってみましたWindows Live vol.2 中村繪里子さん」 のページの復活希望です。