Archive : 2009-04

M-V-VMパターンとアニメーションをどのようにして組み合わせるのかは、MVVMパターンを使う上で常に頭を悩ませる問題です。この問題に対して、Josh SmithさんがOrchestrating Animated Transitions between View and ViewModel >> Josh Smith on WPFというエントリでひとつの方法を示していたので、今回はこれを訳してみました。

Introduction

Model-View-ViewModel(MVVM)パターンを使う場合、Viewに表示されるデータはほぼ常にデータバインディングを通じてやり取りされます。ViewModelオブジェクトのプロパティに対する変更はすぐにViewのバインディングターゲットに対して伝達されます。これは普通は良いことです。しかしながら、時によっては、伝達が即時に行われることが問題になることがあります。

When working with the Model-View-ViewModel (MVVM) pattern, the data shown in a View is almost always transferred to it via data binding.  Changes made to properties on a ViewModel object immediately propagate to the binding targets in the View.  This is normally a good thing.  Sometimes, however, the immediacy of the propagation can be a problem.

なぜ新しいプロパティの値がUIに即座には現われて欲しくないと思うのでしょうか?では、古い値と新しい値との間でのアニメーション化された遷移を表示したい場合を考えてみてください。新しい値が即座にViewに表示された場合、新しい値を”アニメートイン”する前に古い値を”アニメートアウト”するチャンスがありません。例えば、プロパティの値がリストとして表示される1ページのデータ項目だと考えてみてください。新しい項目のページをフェードする前に最初のページのアイテムをフェードアウトしたい場合、新しい項目のページが表示される前に、フェードアウトアニメーションを始める必要があります。

Why would you want a new property value to not immediately show up in the UI?  Well, suppose you want to display an animated transition between the old value and the new value.  If the new value immediately shows up in the View, you won’t have a chance to animate “out” the old value before animating “in” the new value.   For example, suppose the property’s value is a page of data items to show in a list.  If we want to fade away the first page of items before fading in the new page of items, we need to start the fade-away animations before the new page of items is displayed.

これは、Visual State Manager(VSM)が解決する種類の問題です。VSMは未だ正式なWPFの一部になっておらず(.NET 4.0まではなりません)、我々は未だそれをアプリケーション作成に役立てることはできません。また、VSMはカスタムコントロールの中で使われるために設計されているので、私達がこれから探そうというものとは完全に同じという訳ではありません。

This is the type of problem that the Visual State Manager (VSM) solves.  Since the VSM is not yet part of WPF proper (it won’t be until .NET 4.0), we cannot make use of it yet in production applications.  Also, the VSM is designed to be used inside of custom controls, so it is not exactly equivalent to what we are going to explore below.

The AnimatedTransition Class

私はWPFやSilverlightのアプリケーションに取り組んでいる際に、まさにこの問題に何回も直面しました。プロパティの変化をアニメーション化された遷移と協調させるための様々なアプローチを試したあと、私は核となる問題を、より鮮明に理解し始めました。昨日私はScherzo from Mendelssohn’s “A Midsummer’s Night Dream”のこのとてつもなく素晴らしい演奏を聴き、そしてパッと閃きました。私は二つのプロパティ値間でのアニメーション化された遷移を作成するための、ViewModelとViewをして協調させるシンプルで、タイプセーフで、再利用可能な方法を悟りました。AnimatedTransitionクラスが生まれたのです!

I faced this exact problem many times while working on WPF and Silverlight applications.  After experimenting with several approaches to coordinating property changes with animated transitions, I started to understand the core problem more clearly.   Yesterday I listened to this incredible rendition of the Scherzo from Mendelssohn’s “A Midsummer’s Night Dream” and was hit by a flash of inspiration.  I realized a way to create a simple, type-safe, reusable way of having a ViewModel and View work together to create animated transitions between two property values.  The AnimatedTransition class was born!

image

AnimatedTransitionのインスタンスはどのViewModelクラスにでも埋め込むことが出来ます。遷移を行う必要のあるViewは、遷移を何時始めるべきかを知るために、AnimatedTransitionオブジェクトにアクセスし、そのイベントの一つ以上をフックする必要があります。

An instance of AnimatedTransition can be embedded in any ViewModel class.  The View(s) that need to perform transitions must access the AnimatedTransition object and hook one or more of its events in order to know when transitions should start.

The Demo App

このエントリの最後に載せたデモアプリでは、以下のように「ページ」毎に四つのハローキティを表示するItemsControlがあります。

In the demo app, which is available at the bottom of this post, there is an ItemsControl that displays four Hello Kitty images per “page,” as seen below…

image

ユーザ―が下の四角を通じて別のページに遷移する際に、古いキティがフェードアウトし、新しいのがフェードインします。

When the user navigates to a different page, via the circles below, the old kitties fade away and then the new ones fade in.

この小さいアプリを動かすのに関係している全てのクラスを精査していくことはしません。ViewModelクラスについてしっかりと理解したい場合は、このクラスダイアグラムをクリックしてフルサイズのを見てください。

We are not going to examine all of the classes involved in making this little app work.  If you want to get a high-level understanding of the ViewModel classes, click on this class diagram to view it at full size:

image

ItemsControlに表示されるキティの現在のページはKittyKatTerraceViewModelのSelectedPageプロパティに含まれます。あのプロパティの二つの値の間での遷移を必要とする場合、我々はAnimatedTransitionを埋め込んで使います。KittyKatTerraceViewModelがAnimatedTransitionを使用し、公開する方法はこのようになっています:

The current page of kitties to show in the ItemsControl is contained in SelectedPage property of KittyKatTerraceViewModel.  Since we need to have a transition between the two values of that property, we use an AnimatedTransition to enable that.  Here is how KittyKatTerraceViewModel uses and exposes an AnimatedTransition:

public AnimatedTransition<PageOfKittyKatsViewModel> GetSelectedPageTransition()
{
    if (_selectedPageTransition == null)
        _selectedPageTransition =
            new AnimatedTransition<PageOfKittyKatsViewModel>(page => this.SelectedPage = page);

    return _selectedPageTransition;
}
public PageOfKittyKatsViewModel SelectedPage
{
    get { return _selectedPage; }
    private set
    {
        if (value == _selectedPage)
            return;

        _selectedPage = value;

        foreach (var page in this.Pages)
            page.RefreshSelectionState();

        this.OnPropertyChanged("SelectedPage");
    }
}

ユーザーがページを選択するためにItemsControlの真下の小さい四角をクリックしたとき、PageOfKittyKatsViewModelクラスのこのメソッドが実行されます:

When the user clicks on a little circle beneath the ItemsControl to select a page, this method in the PageOfKittyKatsViewModel class executes:

void Select()
{
	// Tell the KittyKatTerraceViewModel to begin
	// a transition of the SelectedPage property
	// so that it references this page.
    _owner.GetSelectedPageTransition().Start(this);
}

KittyKatTerraceViewコントロールのコードビハインドにある全ての関連するロジックを以下にリストアップします。これはViewがどうやってAnimatedTransitionオブジェクトを使用し、相互作用しているかを示しています。

All of the relevant logic in the KittyKatTerraceView control’s code-behind is listed below.  This shows how a View can consume and interact with an AnimatedTransition object.

void OnItemsHostPanelLoaded(object sender, RoutedEventArgs e)
{
    _itemsHost = sender as Panel;
}

void OnLoaded(object sender, RoutedEventArgs e)
{
    var viewModel = base.DataContext as KittyKatTerraceViewModel;

    viewModel.SetKittyLocations(new List<Point>
    {
        new Point(255, 65),
        new Point(115, 145),
        new Point(280, 225),
        new Point(135, 340)
    });

    _transition = viewModel.GetSelectedPageTransition();
    _transition.BeforeApplyNewValue += this.OnBeforeNewSelectedPage;
    _transition.AfterApplyNewValue += this.OnAfterNewSelectedPage;
}

void OnBeforeNewSelectedPage(object sender, EventArgs e)
{
    Storyboard sb = this.CreateStoryboard("FadeOutAnim");
    sb.Completed += delegate { _transition.Finish(); };
    sb.Begin();
}

void OnAfterNewSelectedPage(object sender, EventArgs e)
{
    // Wait until the panel has new children before animating.
    _itemsHost.LayoutUpdated += this.OnItemsHostLayoutUpdated;
}

void OnItemsHostLayoutUpdated(object sender, EventArgs e)
{
    _itemsHost.LayoutUpdated -= this.OnItemsHostLayoutUpdated;
    this.CreateStoryboard("FadeInAnim").Begin();
}

古いアイテムをフェードアウトさせるStoryboardのCompletedイベントにハンドラをアタッチする必要があることによく気を付けて下さい。そのイベントが発生したとき、新しい値への遷移を終わらせるために、AnimatedTransitionは発生を伝えられる必要があり、それをうけて実際にその値を設定します。それはFinish()メソッドを呼ぶことによって実現されます。一度新しい値が設定されたならば、AfterApplyNewValueイベントが発生し、その際あなたは新しいアイテムにフェードインすることが出来ます。

It’s important to note that you must attach a handler to the Completed event of the Storyboard that fades away the old items.  When the event is raised, the AnimatedTransition must be told to finish transitioning to the new value, and actually apply the value.  That is accomplished by calling the Finish() method.  Once the new value has been applied, the AfterApplyNewValue event is raised, at which time you can fade in the new items.

ソースコードはここからダウンロードすることが出来ます。注意:ファイルの拡張子を.DOCから.ZIPに変更して解凍して下さい。

You can download the source code here.  Note: Be sure to change the file extension from .DOC to .ZIP and then decompress it.

APR
29

最近気になっている本

Published:2009-04-29 02:17:37 UTC

「シンプル」でメンテナンス性に優れたアプリケーション開発のために。
本書では.NET Frameworkアプリケーションのチューニング・リリース・セキュリティ等、業務アプリケーションの開発に必要となる実践テクニックについて解説します。
C#言語仕様の特性と開発現場での経験・知識等を交え、これらを理解しやすいよう体系的にまとめています。

という切り口が面白い。薄い本なんだけど、C#の入門書では決してなくて、ためになりそうなトピックが揃っているっぽい。マイコミのこのシリーズは、もともとはWebデザイナ向けの本が揃っていたのだけど、だんだんセグメントを広げてきたのかな。

wankuma勉強会の時にMSの大西さんが持っているのを見て存在を知った本なのだけど、これもかなり濃そうな本。出版社がボーンデジタルだし。

本書で学ぶこと
・衝突判定や反発を使ったオブジェクト間の相互作用の追加
・生物のような動きを生成するためのフォーワードおよびインバース キネマティクスの実装
・パーティクル システムの構築と、噴水や爆発を生成するためのパーティクルへの重力の適用
・3Dオブジェクトをシミュレートするための仮想現実オブジェクトの実装

となっているけど、果たして読んだところでついていけるだろうか…。

自分はバイトでPHPを書いているのだけど、しっかりした開発環境を整えて生産性を上げたいなぁということで興味を持っている本。

 

ちなみに今日買った本。

IronRuby…(´;ω;`)ブワ

APR
27

null結合演算子

Published:2009-04-27 10:54:10 UTC

先日のわんくま勉強会でtakeshikさんが使われているのをみて思い出したのですが、null結合演算子なんてものもありましたね。

private RelayCommand _startSearchCommand;

public ICommand StartSearchCommand {
    get {
        if (_startSearchCommand == null) {
            _startSearchCommand = new RelayCommand(param => Model.SearchItemAsync(Keyword, null, 15, 0), null);
        }
        return _startSearchCommand;
    }
}

今までM-V-VMのViewModelでのCommandの定義で、上のように書いていたのを、

public ICommand StartSearchCommand {
    get {
        return _startSearchCommand = _startSearchCommand ?? new RelayCommand(param => Model.SearchItemAsync(Keyword, null, 15, 0), null);
    }
}

こう書き換えられると。便利便利。

(※Reinさんの指摘を受けて修正。有難うございました。)

APR
24

※今回のエントリはWPFでの話ですが、Silverlightでも参考になると思います。

Expression Blend 3で追加されたBehavior、元はと言えば、Attached Behavior(添付ビヘイビア)という名前でWPF/Silverlight開発者の間で親しまれていたパターンが、Expression Blend 3でデザイナのサポートを受けれるようになったものです。

添付ビヘイビアとは、内部的には添付プロパティを利用し、添付された要素への参照を得ることでそのイベントを購読し、そのイベントハンドラにおいて、オブジェクトに対する様々な操作を実現する便利なテクニックです。

BehaviorがExpression Blendでサポートされたことにより、要素に対する添付ビヘイビアの追加、削除を、コードを書かずにGUI操作だけでできるようになりました。また、Microsoft.Expression.Interactivity.dll内の抽象クラスを利用することで、実装もより容易になっています。

image

Preview版では現在のところBehaviorはExpression Blendに付属しておらず、別途ダウンロードしてきて参照に加えることが必要ですが(Sample Silverlight 3 Behaviors(Silverlight)やMicrosoft Expression Community Gallery)、自分で書いたBehaviorを使うことももちろん可能です。 今回は試しにBehaviorを自分で書いてみました。お題は以前書いた添付ビヘイビアでTextBoxにCommandを実装してみた – SharpLab.の再実装。

まずは<Expression Blend3 Previewのインストールディレクトリ>\Libraries\WPF以下に存在するMicrosoft.Expression.Interactivity.dllを参照を加えます。このアセンブリに含まれているBehavior<T>や、TriggerAction<T>などが、Behaviorを作る上での基本クラスとなるようです(他にもあるようですが、まだ追えていません)。さて、今回はTextBoxに添付するBehaviorなので、Behavior<TextBox>を継承したクラスを作ります。

using System.Windows;
using System.Windows.Input;
using Microsoft.Expression.Interactivity;
using System.Windows.Controls;

namespace SharpLab.IKnow.ItemBankPane {
	public class ExecuteCommandOnEnterKeyDownBehavior : Behavior<TextBox> {
	}
}

続いて、アタッチ/デタッチされる時に実行されるOnAttach/OnDetachingメソッドを作成します。AssociatedObjectプロパティに添付対象の要素が入っているので、ここからイベントの購読/購読解消を行います。

using System.Windows;
using System.Windows.Input;
using Microsoft.Expression.Interactivity;
using System.Windows.Controls;

namespace SharpLab.IKnow.ItemBankPane {
	public class ExecuteCommandOnEnterKeyDownBehavior : Behavior<TextBox> {

		protected override void OnAttached() {
			base.OnAttached();

			this.AssociatedObject.KeyDown += OnKeyDown;
		}

		protected override void OnDetaching() {
			base.OnDetaching();

			this.AssociatedObject.KeyDown -= OnKeyDown;
		}

		void OnKeyDown(object sender, KeyEventArgs e) {
		
		}
	}
}

さて、今回はCommandをEnterキーが押された時に実行するのが目的なので、まずはCommandを受け取れるように依存関係プロパティを実装します。

using System.Windows;
using System.Windows.Input;
using Microsoft.Expression.Interactivity;
using System.Windows.Controls;

namespace SharpLab.IKnow.ItemBankPane {
	public class ExecuteCommandOnEnterKeyDownBehavior : Behavior<TextBox> {

		public string Command {
			get {
				return (string)GetValue(CommandProperty);
			}
			set {
				SetValue(CommandProperty, value);
			}
		}

		public static readonly DependencyProperty CommandProperty =	
									DependencyProperty.Register("Command",
										typeof(string),
										typeof(ExecuteCommandOnEnterKeyDownBehavior));

		protected override void OnAttached() {
			base.OnAttached();

			this.AssociatedObject.KeyDown += OnKeyDown;
		}

		protected override void OnDetaching() {
			base.OnDetaching();

			this.AssociatedObject.KeyDown -= OnKeyDown;
		}

		void OnKeyDown(object sender, KeyEventArgs e) {
		}
	}
}

Enterキーが押された時に、Commandが実行されるようにします。

using System.Windows;
using System.Windows.Input;
using Microsoft.Expression.Interactivity;
using System.Windows.Controls;

namespace SharpLab.IKnow.ItemBankPane {
	public class ExecuteCommandOnEnterKeyDownBehavior : Behavior<TextBox> {

		public string Command {
			get {
				return (string)GetValue(CommandProperty);
			}
			set {
				SetValue(CommandProperty, value);
			}
		}

		public static readonly DependencyProperty CommandProperty =	
									DependencyProperty.Register("Command",
										typeof(string),
										typeof(ExecuteCommandOnEnterKeyDownBehavior));

		protected override void OnAttached() {
			base.OnAttached();

			this.AssociatedObject.KeyDown += OnKeyDown;
		}

		protected override void OnDetaching() {
			base.OnDetaching();

			this.AssociatedObject.KeyDown -= OnKeyDown;
		}

		void OnKeyDown(object sender, KeyEventArgs e) {
			if (e.Key == Key.Enter) {
				string path = Command;
				object dataContext = AssociatedObject.DataContext;
				ICommand command = dataContext.GetType().GetProperty(path).GetValue(dataContext, null) as ICommand;

				if (command != null && command.CanExecute(AssociatedObject)) {
					command.Execute(AssociatedObject);
				}
			}			
		}
	}
}

これで完成しました!…と言いたいところですが、どうもMicrosoft.Expression.Interactivity.dllのバグか、これだけではコンパイルが通りません。どうもアセンブリ内にMicrosoft.Expression.Interactivity.Layout名前空間がないとコンパイルが通らないようで、適当にdummy.csというファイルを作っておき、

namespace Microsoft.Expression.Interactivity.Layout {}

と一行書いておきましょう。

image

これで、作成したBehaviorを参照に加えれば、AssetLibraryのBehaviorsタブに作ったBehaviorが追加されるようになります。

image

あとは要素にD&Dで添付した上で、プロパティペインから、諸々のプロパティを設定すれば使えるようになります。

APR
23

IronPython触れてみた。

Published:2009-04-23 01:43:57 UTC

IronPythonの世界 (Windows Script Programming): 荒井 省三は読んだことがあるものの、IronPython自体は一行も書いたことが無かったので試しに書いてみた。

‘Hello World’メッセージをWordPressのBlogに投稿するコード。

# coding=utf8
import System
import clr
import sys

clr.AddReferenceToFile('SharpLab.XML-RPCLib2.dll')
clr.AddReferenceToFile('SharpLab.WP-XML-RPCLib2.dll')

from SharpLab.XMLRPCLib2 import *
from SharpLab.WPXMLRPCLib2 import *

endPointUri = raw_input(u'WordPressのエンドポイントURL:');
username = raw_input(u'WordPressのユーザー名:');
passoword = raw_input(u'WordPressのパスワード:');
client = WordPressClient(endPointUri,'IpyPostMessage');
authInfo = AuthenticationInfo(username, passoword)

postContent = PostContent()
postContent.Title = 'Hello World, from IronPython. [EOM]'
postContent.Description = ''
postContent.TextMore = ''
postContent.Excerpt = ''

client.NewPost(authInfo, 0, postContent, True)

print 'Published!'

最新の記事100件のタイトルとタグを一覧表示するコード。

# coding=utf8
import System
import clr
import sys

clr.AddReferenceToFile('SharpLab.XML-RPCLib2.dll')
clr.AddReferenceToFile('SharpLab.WP-XML-RPCLib2.dll')

from SharpLab.XMLRPCLib2 import *
from SharpLab.WPXMLRPCLib2 import *

endPointUri = raw_input(u'WordPressのエンドポイントURL:');
username = raw_input(u'WordPressのユーザー名:');
passoword = raw_input(u'WordPressのパスワード:');
client = WordPressClient(endPointUri, 'IpyPostMessage');
authInfo = AuthenticationInfo(username, passoword)

result = client.GetRecentPosts(authInfo, 0, 100)

for item in result.Response :
	print item['title'].Value + '(' +item['mt_keywords'].Value + ')'

DLR楽しい。.Netのアセンブリが簡単に扱えるのは嬉しいですね。TabのないコードなんてPythonを書いているとは言えない!というツッコミは無しで。

APR
21

Expression Blend 3のBehaviorサポート

Published:2009-04-21 16:38:44 UTC
WPF

昨日はMicrosoft新宿本社で開かれたCodeseek勉強会に参加させて頂きました。今回はMicrosoftのエバンジェリストである大西さんによるSilverlight3とExpression Blend 3についての話でした。大変興味深い話ばかりが凝縮された二時間で、大いに勉強になりました。皆様どうも有難うございました。

全体を通して感じたのは、Expression Blendのツールとしての有用性。正直、今まで自分はExpression BlendをVisualStudioよりちょっとデザイナが使いやすいXAMLエディタとしてしか使えておらず、タグは手書きすることが多くて有効活用できているとは言い難かったのですが、これからはBlendの支援機能も使いこなせるようになったほうが得だなと感じました。

さて、紹介された中で、特に自分が気になったのはExpression Blend 3によるBehaviorのサポート。Expression Blend3ではBehaviorがサポートされ、それはどうも添付ビヘイビアのことらしい…、というのはネットでちらちら聞いていたのですが、実際にBehaviorを使った開発のデモを見せて頂いて、動いているのを見ると非常に便利そうな印象を受けたので、早速自分でも試してみました。

実際のExpression Blendの操作については大西さんによるAkira Onishi’s weblog : Expression Blend 3: Behaviorを使ったコーディングレスでのSilverlight 3アプリのインタラクションデザインというエントリに詳しいのですが、一点補足しますと、Expression Blend 3 PreviewでBehaviorを使うに当たっては、Behaviorを定義したアセンブリを自分で参照に加える必要があります。kirupaBlog – If it isn’t broken, take it apart and fix it! » Blog Archive » Using Behaviors : A Quick Walkthroughというエントリにある通り、Sample Silverlight 3 Behaviors辺りから適切なのを探してMicrosoft.Expression.Interactivity.dllと、ビヘイビアのdllを参照に加えて下さい。そうしないと、[Asset Library]の[Behaviors]の項には何も表示されません。製品版ではMSお手製ビヘイビアのアセンブリもFCLに同梱されるか、Silverlight Extentionに同梱されてほしいですね。

この例ではBehaviorである必要ありませんが、一応、テストしてみたときのXAMLソースを載せておきます。もちろんコードビハインドはありません。
ボタンがY軸を中心に回転する例:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:i="clr-namespace:Microsoft.Expression.Interactivity;assembly=Microsoft.Expression.Interactivity" xmlns:SLPreviewBehaviorsLibrary="clr-namespace:SLPreviewBehaviorsLibrary;assembly=SLPreviewBehaviorsLibrary" x:Class="Silverlight3Testbed.MainPage" 
    Width="400" Height="300" mc:Ignorable="d">
	<UserControl.Resources>
		<Storyboard x:Name="Storyboard1" AutoReverse="True" RepeatBehavior="Forever">
			<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="button" Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationX)">
				<EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
				<EasingDoubleKeyFrame KeyTime="00:00:03" Value="180"/>
			</DoubleAnimationUsingKeyFrames>
			<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="button" Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Duration="00:00:00.0010000">
				<EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
			</DoubleAnimationUsingKeyFrames>
			<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="button" Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationZ)" Duration="00:00:00.0010000">
				<EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
			</DoubleAnimationUsingKeyFrames>
		</Storyboard>
	</UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
    	<Button x:Name="button" Height="57" Margin="84,86,196,0" VerticalAlignment="Top" Content="Button">
    		<Button.Projection>
    			<PlaneProjection RotationX="0" RotationY="0" RotationZ="0"/>
    		</Button.Projection>
    		<i:Interaction.Triggers>
    			<i:EventTrigger EventName="Click">
    				<SLPreviewBehaviorsLibrary:PlayStoryboardAction StoryboardName="Storyboard1"/>
    			</i:EventTrigger>
    		</i:Interaction.Triggers>
    	</Button>

    </Grid>
</UserControl>

Behaviorについては、もう少し追ってみようと思います。

APR
20

ItemsControlのItemTemplate

Published:2009-04-20 15:16:28 UTC
WPF

ここ数日System.Windows.Controls.Primitives.Selectorを継承したコントロールを作ろうとしてもがいていたのですが、

ItemTemplateのデータテンプレートはItemsSourceを使ったときだけ有効だと思っていましたが、WPFのListBoxコントロールやComboBoxコントロールはコンテンツに対しても有効なようです。なお、なぜかItemsControlを使うと無効になります。
WPFではコンテンツに対してもデータテンプレートを利用できる – Yuya Yamaki’s blog

で大いに悩まされました。SelectorとかItemsControlではItemTemplateをコンテンツに対して適用できないんですね・・・。不便。

APR
17

WPCustomFieldsEditor更新

Published:2009-04-17 17:13:29 UTC

動かなくなったまま放置していたWPCustomFieldsEditor、修正したものと差し替えました。WPCustomFieldsEditorは、その名の通り、WordPressのカスタムフィールドを修正するためのWindows Live Writerのプラグインです。

Windows Live Writerがアップデートしたら動かなくなっていたのは、横着してWLWの内部的なアセンブリを直接参照した時点でまぁ予見出来た話ではあるのですが・・・。今回はちゃんとリフレクションで書き直しております。また、WordPressとのやり取りも、WP-XML-RPCLib2で行うように変更しました。

WPCustomFieldsEditor.zip

ソースコード:WPCustomFieldsEditor.sln.zip

APR
16

今後の予定(2009-04-16版)

Published:2009-04-16 01:05:59 UTC

アップデート。

  • C#関係
    • iKnow ItemBankPane
      いまやsmart.fmですが。M-V-VMでの書き直しはM-V-VMパターンでsmart.fmの辞書アプリを書きなおしてみた – SharpLab.という記事以来進んでいません。設計上で詰まっているわけではないのですが、あまり時間がとれなくて…。そのうち仕上げます。
    • M-V-VM
      幾つか気になる英語の記事が出ていて、部分的にでも訳したいと思っています。

    C#の勉強はちょっとペンディングでもいいかな、と思っていたり。でもSL3弄りたいんですよねー。それにLive FrameworkでMeshアプリケーションも作ってみたいし。 Windows 7 .NET Interop Sample Librariesも試してみたいしなー。

  • PHP関係
    • WordPress
      • Tagベースの管理への移行、未だ果たせず。さっさと済まさないと。
      • デザインの変更
        • ヘッダに小変更を入れようと思っているのだけど、元画像が完全に紛失してしまったみたい。弱りました。ヘッダだけ1から作り直すかも。
    • CakePHP
      • だんだん使えるようになってきました。MVCいいですね、ソースコードが凄いメンテしやすい。これまで全く読んだことのないアプリのソースでも、何か変更を加えたいと思ったときに弄るべきロジックの位置がファイル名とメソッド名でほぼ特定できるというのは凄い有り難いです。Active Recordパターンも素敵。SQL文という異物をソースコードから取り除いてくれるのは有り難いことこの上ないですね。
  • Ruby関係
    思ったより速いペースで勉強しなきゃならなくなりました。とりあえずプログラミング言語 Rubyを買ってみました。通学途中に一通り読んでみてから環境構築→Railsの勉強、のつもりです。
    • もちろんIronRubyもやりますよ。
  • C++関係
    • 今期は関わらずに済みそう。食わず嫌いというか、どうもC++には忌避感があるのですが、そのうちやらんとなー。夏休み位が適当ですかね。まずはC++/CLIかな、と思っています。言語を習得する上での壁は言語仕様そのものもそうだけど、ライブラリをおぼえる手間も結構なウェイトを占めると自分は思っていて、その意味で.Net FCLを利用できるC++/CLIは適当かなぁと考えています。
  • Java関係
    • やりたくないやりたくない…(笑)。少なくとも今は。でもFosstrakとはもう一度ちゃんと向き合わないといけない。早めにもう一度Fosstrakを動かしてみなければー。
  • その他
    • Linuxでサーバーを運用してみたい
      • Samba
        • とりあえずはブロードバンドルータの下でファイルサーバーとか動かしてみたい。その後はぼちぼちと。まだまだUNIXの文化が全然解っていないからこれも勉強していかないと。
APR
15

一昨日のWordCampでもMatt直々に紹介があったP2、自分も早速設置してみました。

P2 – SharpLab.

image

おお~。素敵素敵。でも、Twitterの魅力である、TLを通じた他人とのインタラクションは一人でP2を使っているのでは得られないので(多分。P2にはFollowとかいう仕組みはないですよね?)、自分はこのP2を適用したBlogをTwitterの自分のTweetのログを収集するために使うことにしました。

利用したのはTwitter Toolsというプラグイン。自分のTwitterでのTweetを収集してサイドバーとかに表示したり、一日のTweetのサマリ記事をBlogに自動で投稿したりする機能を持った、TwitterとWordPressをつなぐ働きを持った多機能プラグインです。で、今回はこのプラグインの「Tweet毎にエントリを自動投稿する」機能を利用しています。

但し、Twitter ToolsとP2をあわせて使う上で注意点が一つ。Twitter ToolsもP2も、Services_JSONというPEARのクラスを利用するのですが、それぞれがServices_JSONを定義しようとするために衝突が起こってしまうという問題があります。そこでP2のテーマの中にある、inc/JSON.phpファイルを少し修正してやる必要があります。Services_JSONの定義を丸ごと、以下のif文で括ってやればOKです。(いかにもPHPな話ですね…。)

if (!class_exists('Services_JSON')) {

//Services_JSONの定義

}

あとはTwitter Toolsの設定で"Create a blog post from each of your tweets?"という項目をYesに設定したり必要な設定を済ませるだけです!素敵ですね。