2012/12/31

DirectShow Source Filter for WPF

そのままずばり。WPF のレンダリング結果を映像ソースとして出力するフィルタを作ってみた。

image

なかなか良い感じでござる。

デザイナ付ければ Flash 不要なアニメーション機能付きインポーズソフトが作れそう。

2012/12/23

動画配信

配信動画にテロップを付けてみたくて ManyCam をインストールしてみたけど、Decklink Video Capture をソースに設定すると画面が真っ黒になって使い物にならなかった。

どうにかしたくて色々試してみたけど原因不明。

image

こんな感じの単純な構成でも正常に表示されるのだけど……。

 

ソースの初期化方法の問題のような気がするので、ラッパフィルタを書いて上手く初期化してやれば、真っ黒画面問題は解決できるかもしれない。気が向いたら書くかも……。

2012/12/21

とびだせカブの森

image

無念でござる

2012/12/18

カブ

image

まだあわてるような時間じゃない・・・

2012/12/16

VS2012 拡張機能

暇つぶしに Visual Studio の使ったことない機能で遊んでたら、拡張機能なるものを発見。色々便利な機能を追加できるらしい。

image

ビルトインの拡張機能ギャラリーから直接インストールすることもできるし、ブラウザからダウンロードしてインストールすることもできるらしい。

image

インデント位置に補助線を引く機能と、コメントをイタリックにする機能を追加してみた図。このくらいは標準機能であってもよさそうなんだけど……。

image

CodeMaid っていう拡張機能プラグインは、コードマップを表示してくれたり、メンバを並べ替えてくれたり、複雑度(保守容易性)を計算して表示してくれたりととても便利。

2012/10/06

改行

アンドロイドアプリから投稿したら改行が無視されてた。 無念。

レリックオンライン

アルテミスを取得したあと、タイラスとスファライをげっとして、現在はゲイボルグを作成中。 あとは星屑を作って現行終了っぽい。 剣と斧はやらなそうだし、作らない予定。新生で安くなってたら買うかもだけど。

2012/10/04

Visual Studio 2012

2010 から 2012 になりました。

インストール画面。

image

7.17 GB 也。

なんか Blend が付属してるらしいけど、Expression Studio 4 Ultimate があるのでいらない気がする……。

image

C++/CLI でも IntelliSense が効くようになってた!

image

目に優しい配色にもできる。

それだけ。

2012/09/11

SSD の寿命

今まで使ってた Crucial C300 (64GB) の寿命はどうなっているんだろうと調べてみたら

image

あと 9 年持つ予測らしい。

User フォルダを D ドライブに移したりしてたのがよかったのか、それともそもそも長寿命だったのか。

Intel の SSD はさらに長寿命らしいので、寿命対策とかはあんまり気にしなくてもいいのかな。するけど。

2012/09/09

SSD 到着

image

とどいた。はやい。

SSD

インテルの SSD を注文しました。「330 Series SSDSC2CT240A3K5」っていうやつ。15000 円なり。

LS のハードに詳しい人に訊いたところ、容量が大きければ大きいほど速度面で有利らしい。スペックシート上でも確かに Random 4KB Read/Write は 240 GB のほうが性能良かった。

これは、使用しているメモリチップの枚数に関係していて、搭載されているメモリチップが多ければ多いほど並列に読み書きすることができて高速化するっていう仕組みらしい。Sequential Read/Write は転送速度がボトルネックになってるのか、変わりはないらしい。

現在使っている PC は i7 が出た当初のモノなので、SATA 3.0 に未対応。来年発売になるという噂の Haswell でシステムを更新しようかなと考え中。

2012/09/05

レリック

久しぶりの更新。

GW2 をやろうと思ってたけど、プレイ動画がいまいちパッっとしなかったのでパス。

今はレリック作成に精を出しております。はやく完成させて未消化の Steam ゲーを消化したい……。

あと、Diablo3 も Inferno の精神修行で心が折れてたけど、レベルキャップが上がったらしいのでちょっと舞い戻ってみたかったり。

 

と、途中まで書いてたら極イフの募集があり……

image

ゲットできました!

パーティーのみなさんありがとうございました!

お金がたまったら次はタイラスに手を出すかも。

2012/05/15

Diablo III

image

かいました。

2012/02/06

Bandicam + Aviutl + x264 = …

音が途中で途切れること多し。

音声が壊れたら mp4box で h264 を抽出して、それに別途 WAV 出力した音声を neroAacEnc でエンコードした音声ファイルをくっつけると直るけど、めんどくさい。

具体的には以下のような感じに……。

neroAacEnc –br 192000 –lc –if audio.wav –of audio.aac
mp4box –raw 1 broken.mp4
mp4box –fps 30 –add broken_track1.h264 –add audio.aac –new fixed.mp4

ちなみに、mp4box –raw 2 broken.mp4 と入力すれば AAC ファイルが抽出できるのだけど、15 分の動画に対して 2 分くらいのファイルになってた。

AviUtl からのソース出力のところで何か問題が起こってそうだ。

2012/02/05

Logicool G300

ロジクールの有線マウス。 2000 円なり。

マイクロソフトの安物ワイヤレスマウスとはポインタの動きの滑らかさが全然違った。

断線してお亡くなりになったマイクロソフトの SideWinder X8 さんよりも好みかもしれない。

ボタン多いし。

2012/02/03

ListView のソート

DisplayMemberBinding を使って表示させる方法なら前回の方法で大丈夫だったけど、CellTemplate の中でバインディングを指定する場合は何を参照して良いやらわからないことになるということが発覚。

まず思い浮かぶのが、俺版の GridViewColumnHeader を作るという方法。

public class SortableGridViewColumnHeader : GridViewColumnHeader
{
    static SortableGridViewColumnHeader()
    {
        DefaultStyleKeyProperty.OverrideMetadata(
            typeof(SortableGridViewColumnHeader),
            new FrameworkPropertyMetadata(typeof(GridViewColumnHeader)));
    }

    public SortableGridViewColumnHeader()
    {
        DefaultStyleKey = typeof(GridViewColumnHeader);
    }

    public static readonly DependencyProperty SortPathProperty =
        DependencyProperty.Register("SortPath", typeof(string), typeof(SortableGridViewColumnHeader));
    public string SortPath
    {
        get
        {
            return GetValue(SortPathProperty) as string;
        }
        set
        {
            SetValue(SortPathProperty, value);
        }
    }
}

これを使えば問題解決!と思ったのだけど、カラムのリサイズ時の(境界付近に持って行ったときの)カーソルが変わらなくなるという、よく分からない現象に遭遇したので没に。スタイル関連の問題なのだろうと思って、上のコードでもちょっといじってあるけど変化なかった。

で、俺版の x:Name みたいなのは作れないのかーと調べてたらそれっぽい機能があったので使ってみた。添付プロパティとかいう機能らしい。正確には DockPanel.Dock みたいなプロパティを実装するための仕組みらしい。

public class Sortable
{
    public static readonly DependencyProperty SortPathProperty =
        DependencyProperty.RegisterAttached("SortPath", typeof(string), typeof(Sortable));
    public static void SetSortPath(GridViewColumnHeader element, string value)
    {
        element.SetValue(SortPathProperty, value);
    }
    public static string GetSortPath(GridViewColumnHeader element)
    {
        return (string)element.GetValue(SortPathProperty);
    }
}

こうやっておいて、XAML には、

<GridViewColumn Width="120" CellTemplate="{StaticResource NameColumnTemplate}">
    <GridViewColumnHeader Content="なまえ" ore:Sortable.SortPath="Name" />
</GridViewColumn>
<GridViewColumn Width="80" CellTemplate="{StaticResource GenderColumnTemplate}">
    <GridViewColumnHeader Content="せいべつ" ore:Sortable.SortPath="Gender" />
</GridViewColumn>
<GridViewColumn Width="80" CellTemplate="{StaticResource RaceColumnTemplate}">
    <GridViewColumnHeader Content="しゅぞく" ore:Sortable.SortPath="Race" />
</GridViewColumn>

こんな感じに記述すれば、あとはクリック時のコードビハインドで、

var path = header.GetValue(Sortable.SortPathProperty) as string;

これで取得完了。動作も正常。

やったね!!!

プロパティ名でソート

バインディングで指定したパスを使ってソートキーを指定したかった。

ListView のカラムをクリックしたときのイベントは ListView.GridViewColumnHeader.Click らしい。

private void listView_Click(object sender, RoutedEventArgs e)
{
    var header = e.OriginalSource as GridViewColumnHeader;
    var binding = header.Column.DisplayMemberBinding as Binding;

    if (currentOrder == SortingOrder.Ascending)
    {
        currentOrder = SortingOrder.Descending;
    }
    else
    {
        currentOrder = SortingOrder.Ascending;
    }

    SortByProperty(binding.Path.Path, currentOrder);
}

コードビハインドに直書きしてるけど、MVVM スタイルでやりたいならビューモデルに binding.Path.Path を送信すればよさそう。

ソート部分はリフレクションを使って、

private void SortByProperty(string name, SortingOrder order)
{
    var sorted = Players.OrderBy(x => x.GetType().GetProperty(name).GetValue(x, null)).ToList();

    if (order == SortingOrder.Descending)
    {
        sorted.Reverse();
    }

    listView.ItemsSource = sorted;
}

みたいな感じでうまくいった。

ListView にある本来のソート機能を使うべきなんだろうけど、魔改造(TreeListView とか)してあると中途半端にソートされて上手くいかないので、データソースを直接ソートするしかないという。

2012/02/01

Dependency Property

はまった。

public class Tesuto : TextBox
{
    static Tesuto()
    {
        TextProperty = DependencyProperty.Register("Text", typeof(object), typeof(Tesuto));
    }

    public new static readonly DependencyProperty TextProperty;
    public new object Text
    {
        get { return GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
}

とやって、デザイナに貼り付けてやると VS2010 がクラッシュして強制終了する。

どうやら Dependency Property は、基底クラスで登録されたものは引き継がれるらしく、デフォルト値は変更できても登録解除とか型の変更とかはできないらしい。

Visual Studio さんも、こういうコードを書く輩がいるとは露とも思わず、Text プロパティが string 型だと思い込みながら新しく定義した object 型の Text プロパティを読み込みに行って失敗してるらしい。

Dependency Property の登録解除に関しては無理矢理やる方法が StackOverflow に載ってたけど、無理矢理過ぎるので流石に使えなさそう。MS さんが何とかしてくれないかなあ。

ちなみに上のコード、デザイナでクラッシュさえ起こさなければ普通にコンパイルが通り、意図通りに動作したりする。余計にもどかしいのであった。

2012/01/26

たからくじ

第614回全国自治宝くじ(年末ジャンボ宝くじ)

くじ代 6000 円
5等 x 1本 10000 円
7等 x 2本 600 円
  +4600 円

第2227回関東・中部・東北自治宝くじ

くじ代 1000 円
6等 x 1本 1000 円
7等 x 1本 100 円
  +100 円

 

おおがねもちへの挑戦は続く

2012/01/10

ちきゅう

Earth

ハードディスクのデータサルベージ作業中に暇だったので Blender 2.61 で作成。

無駄に 1080p でレンダリング。

雲と、背景の星の表現がいまいちかなあ。

2012/01/07

辰年

今年もよろしくお願いします。

image