Silverlight Archive

MAY
5

厳しいかも。

Silverlight 4で追加されたTrusted mode、とりあえず試してみているのだけど、結構制限が厳しくてつらい感じ。。Cookieは使えないし、GETメソッド使っているときに、headerを追加することもできない。これは、SilverlightがHTTP通信のスタックに、OSのTCP/IPスタックを直接たたいているのではなく、ブラウザのPlugin APIを叩いているためだとか。

Silverlight only supports setting headers using the POST method not the GET method. This is due to a limitation in how the TCP/IP stack is implemented in Silverlight. It uses the browser extension APIs instead of going directly against the host OS’s APIs.
http://stackoverflow.com/questions/622897/how-can-i-set-headers-with-silverlight-get-httpwebrequest

この問題を回避する方法としては、@jz5さん曰く、Socketを自分で叩いてHTTP通信すればいい、ということらしい。なんだかなぁ。。Silverlight 4でTrusted Modeをどれぐらい使う需要があるかは知らないけど(自分ならWPF+ClickOnceでいいや)、Windows PhoneアプリをSilverlightで書こうか、という場合に結構辛い気が。。WindowsPhoneは微妙に普通のSilverlightとビルディングブロックが違ってるから、案外動くのかもしれないけど(希望的観測)。

(追記) 試しにWindows Phoneでやってみたらheader追加できたw 嬉しいんだけど、HttpWebRequestみたいな非常に一般的なクラスでこのように挙動が違うというのは、困るので、正直複雑。何とかならんのか。

CardSafe/EはMVVMパターンに則って作るように心掛けたのですが、WPFと同じ感覚でSilverlightにMVVMパターンを適用しようとすると、色々と不都合が出てきて苦労させられました。Silverlightではオミットされている機能が結構あるので、そこに引っかかるとしばしば手戻りが発生します。このエントリではCardSafe/Eを書いていて気付いた点をとりあえず二点ほど。

SilverlightにはDataTemplate.Datatypeが存在しない

地味に痛いですこの仕様。ItemsControlから派生したコントロール(ListBoxなど)のItemをItemsSourceにセットしたINotifyPoropertyChangedを実装したコレクションから生成する際に、コレクションが列挙するインスタンスの型によってDataTemplateを切り替える場合、WPFではDataTemplate.Datatypeがあるので重宝するのですが、Silverlightでは3 RTWでもサポートされていません。DataTemplateSelectorもサポートされていないので、インスタンスの型や状態によってDataTemplateを切り替えることはできないようです。とりあえず逃げ道として自分はDataContextにセットされたインスタンスをみてContentを書き換えるロジックを書いたUserControlを用意しているのですが、面倒ですね。XAMLで宣言的に書きたいのでDataTemplate.Datatypeは是非サポートしてもらいたいものです。

TabcotrolのItemsSourceはTabItemのコレクションしか受け付けない

なんでー!?これまたあんまりな仕様。WPFではItemsControlから派生したコントロールのItemsSourceにINotifyPoropertyChangedを実装したコレクションをセットすると、その列挙する内容をListBoxItemやTabItemなど適当なコンテナに包んで表示してくれるので、あとはDataTemplateで表示内容を好きなようにカスタマイズしてやればよかったのですが、SilverlightのTabControlのItemsSourceはTabItemのコレクションしか受けてつけてくれないという。。これではTabItemに対応するViewModelのインスタンスをセットし、DataTemplateでViewを設定して表示内容をカスタマイズするというM-V-VMでよく知られたパターンが使えません。SilverlightでもListBoxではListBoxItem以外も受け付けてくれたのですけどねぇ。。ではどうするか。自分の場合はViewModelのコレクションをラップしてTabItemのコレクションとして公開するラッパークラスとConverterを用意することで凌ぎました。

ラッパークラスはこんな感じです。ViewModelのコレクションとViewModelからTabItemへの変換を行うFuncをコンストラクタの引数として取ります。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows.Controls;

namespace SharpLab.CredentialsLockerSilverlight.ViewModels {
	public class ReadOnlyObservableTabItemCollection<TViewModel, TViewModelCollection> : ICollection<TabItem>, INotifyCollectionChanged where TViewModelCollection : ICollection<TViewModel>, INotifyCollectionChanged {

		private TViewModelCollection _viewModels;
		private ObservableCollection<TabItem> _tabItems;
		private Func<TViewModel, TabItem> _converter;

		public ReadOnlyObservableTabItemCollection(TViewModelCollection viewModels, Func<TViewModel, TabItem> converter) {
			_converter = converter;
			_viewModels = viewModels;
			_tabItems = new ObservableCollection<TabItem>();

			foreach (var item in _viewModels) {
				_tabItems.Add(_converter(item));
			}

			_viewModels.CollectionChanged += new NotifyCollectionChangedEventHandler(_viewModels_CollectionChanged);

			_tabItems.CollectionChanged += new NotifyCollectionChangedEventHandler(_tabItems_CollectionChanged);
		}

		void _viewModels_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
			switch (e.Action) {
				case NotifyCollectionChangedAction.Add:
					_tabItems.Insert(e.NewStartingIndex, _converter((TViewModel)e.NewItems[0]));
					break;
				case NotifyCollectionChangedAction.Remove:
					_tabItems.RemoveAt(e.OldStartingIndex);
					break;
				case NotifyCollectionChangedAction.Replace:
					_tabItems.RemoveAt(e.OldStartingIndex);
					_tabItems.Insert(e.NewStartingIndex, _converter((TViewModel)e.NewItems[0]));
					break;
				case NotifyCollectionChangedAction.Reset:
					_tabItems.Clear();
					foreach (var item in _viewModels) {
						_tabItems.Add(_converter(item));
					}
					break;
			}
		}

		void _tabItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
			if (CollectionChanged != null) {
				CollectionChanged(this, e);
			}
		}


		public event NotifyCollectionChangedEventHandler CollectionChanged;

		#region ICollection<TabItem> メンバ

		public void Add(TabItem item) {
			throw new NotSupportedException();
		}

		public void Clear() {
			throw new NotSupportedException();
		}

		public bool Contains(TabItem item) {
			throw new NotImplementedException();
		}

		public void CopyTo(TabItem[] array, int arrayIndex) {
			throw new NotSupportedException();
		}

		public int Count {
			get {
				throw new NotImplementedException();
			}
		}

		public bool IsReadOnly {
			get {
				return true;
			}
		}

		public bool Remove(TabItem item) {
			throw new NotSupportedException();
		}

		#endregion

		#region IEnumerable<TabItem> メンバ

		public IEnumerator<TabItem> GetEnumerator() {
			foreach (var item in _tabItems) {
				yield return item;
			}
		}

		#endregion

		#region IEnumerable メンバ

		System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
			return GetEnumerator();
		}

		#endregion
	}
}

これを以下のようなConverterから利用します。

using System;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Windows.Data;
using SharpLab.CredentialsLockerSilverlight.ViewModels;

namespace SharpLab.CredentialsLockerSilverlight.Views.Converter {
	public class CardVMCol2TabItemColConverter : IValueConverter{
		#region IValueConverter メンバ

		public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
			return new ReadOnlyObservableTabItemCollection<CardViewModel, ObservableCollection<CardViewModel>>((ObservableCollection<CardViewModel>)value,
				(each) => {
					var newTabItem = new TabItem() {
						DataContext = each,
						Header = new CardTabHeaderView(),
						Content = new SharpLab.CredentialsLockerSilverlight.Views.CardView()
					};
					return newTabItem;

				});
		}

		public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
			throw new NotImplementedException();
		}

		#endregion
	}
}

こうしてやることでTabControlのItemsSourceにViewModelのコレクションをバインドできるようになります。Converterは無理を通すのに便利な機能ですね。。

 ItemsSource="{Binding Path=CardViewModels, Converter={StaticResource CardVMCol2TabItemColConverter}}"
JUL
13

Silverlight 3のRTWがリリースされましたね。Silverlight Tools for Visual Studio 2008やExpression BlendのRCもリリースされています。version3から本気出すというMSの本領発揮とばかりに、結構便利になってきました。このエントリでは、自分が弄ってみて気づいたSilverlight 3 Betaからの変更点を書いてみたいと思います。

Silverlight 3 SDK Betaに含まれていたコントロールの一部がSilverlight Toolkitに移動

DataForm, DockPanel, WrapPanel, Expander, HeaderedContentControl, ViewboxがToolkitに移動したようです。それに伴って所属する名前空間が変わっているので注意が必要です。

Interactivity.dllの名前空間の変更

Expressionでは、3 MixPreviewからBehaviorというパターンがサポートされました。3 MixPreviewではプロジェクトでMicrosoft.Expression.Interactivity.dllというアセンブリを参照した上で、Behavior<T>クラスなどを継承して自分でBehaviorを作成するか、Microsoft Expression Community Galleryなどからダウンロードして使うという流れでした。今回リリースされたExpression 3RCでは、Microsoft.Expression.Interactivity.dllがSystem.Windows.Interactivity.dllと改名され、名前空間も変更されているので注意が必要です。この改名はBlend SDKの絡みでしょうか。また、BehaviorやTriggerActionの組み込み実装として、StoryBoardActionなどがMicrosoft.Expression.Interactions.dll内で提供されていますので、Microsoft Expression Community Galleryと共に活用していくよいでしょう。

DataGridのItemsSourceへのBindingが上手くいかない問題が修正

Silverlight 3 Betaの頃はDataGridのItemsSourceへのBindingが上手く動かないという問題がありました(DataGrid — binding to ItemsSource is broken : The Official Microsoft Silverlight Site)。今は修正されています。(これはむしろSilverlight Toolkitの話?)

Silverlight Tools for VS2008のSilverlightデザイナ削除

Silverlight 3 Tools for VS2008ではSilverlightデザイナが削除されています。まぁプレビューが上手く出来ない場合も多かったので、VS2010に期待ですね。今のうちにBlend 3に習熟しておきたいものです。

が二件ほど公開されました。

Silverlight for Mobile : The Official Microsoft Silverlight Site

Every Developer, Now a Mobile Developer! : Let’s review the PDC Silverlight 2 for mobile demos

特にPDCより掘り下げた情報はなさそうですが、PDCのストリーミングを観る暇のない方には手っ取り早くセッションの大まかな内容を掴む手段となるのではないでしょうか。

Windows MobileとSilverlight 2絡みの話題について訂正・追補と落穂拾い – SharpLab.で書いたSilverlight2 for MobileにおけるDLRのサポートの話題に対して、KKIさんからフォローのエントリ:っき雑記: Silverlight 2 for MobileはDLRをサポートしない?がアップされています。DLRがサポートされない理由と今後の展望が語られています。Blogってこういったフォローが入るのが有り難いですね。

ところで、

Silverlight 2のCoreCLRは .NET FrameworkのCLRとは独立しているので、Silverlight 2の実行環境は .NET Frameworkのインストールを必要としないが、Silverlight 2 for Mobileは .NET Compact Frameworkのインストールを必要とするのか?

という疑問をKKIさんがはさまれていましたが、

Amit said that the Silverlight runtime for Windows Mobile may be smaller because it may omit certain codecs and it also shares the Compact Framework Clr. He went on to say that the Compact Framework would be a prerequisite to installing the Silverlight runtime.

Estranged Siblings – Silverlight Mobile and the Compact Framework CLR « An Original Idea

ということで、Silverlight 2 for Mobileは .NET Compact Frameworkのインストールが必須要件のようです。以上参考まで。

一つ前のエントリの訂正・追補と落穂拾いです。

デスクトップ版Silverlight2との互換性

先のエントリでは、完全に互換性があるらしいと書きましたが、見落としていた質疑応答の部分で、Silverlight2 for Mobileで実装されないSilverlight2の機能もあるという話があったので紹介します。

Silverlight for mobile: what’s in, what’s out • The Register

  • DLR
    Silverlight2 for MobileではIronPythonやIronRubyを動かすための基盤であるDLRがサポートされないとのこと。MSはSilverlight2がバラバラになるのを避けたいと考えているから、と説明されていますが、よくわかりません。
  • Deep Zoom
    Deep Zoomを使ったときに必要になるデータサイズがもたらす読み込みの遅延が、ユーザーエクスペリエンスを損なう懸念から、DeepZoomを載せないかもしれないとのこと。
  • Big Control
    カレンダーのようなサイズの大きなコントロールも載らなくなりそうだそうです。

ほかにも色々質疑応答がありましたので、是非視聴されるのをお勧めします。

Silverlight2のスタンドアロンアプリとしての展開

ほとんど情報を見つけられなかったのですが、Mike Ormond’s Blog : Offline Silverlight Applicationsというエントリがこの話題についてふれていました。Silverlight2をローカルで動かすとなると、ファイルアクセスなどがどのようになるかが気になりますが(現行のSilverlight2では分離ストレージへのアクセス及び[ファイルを開く] ダイアログを通じたファイルアクセスのみ可)、Live Meshを通じてファイルアクセスを行うようになるとのことです。完全信頼を得たアセンブリから.NET FCLを利用するのと同じようにはいかないようですね。

WindowsMobile6.5

WindowsMobile6.1の次はWindowsMobile7ではなく、WindowsMobile6.5だとか何とか。
the::unwired – UNVEILED: Microsoft to release Windows Mobile 6.5 prior to Windows Mobile 7
個人的にはWindows7にあわせてWindowsMobile7にした方が自然だと思うんですけどね。まぁ話半分に聞きましょう。

Live MeshのWindowsMobileからの利用

Windows Mobile Team Blog : Live Mesh and Windows Mobile
Live Mesh DevicesではまだComing soonとなっていますが、可能になったみたいです。大学のPDAで近いうちに試してみたいと思います。

PDC二日目に行われたMicrosoft Silverlight 2 for Mobile: Developing for Mobile Devicesというセッションにおいて、Silverlight2のWindowsMobile対応について色々な情報が明らかになったようです。このエントリでは、セッション後公開されたストリーミング映像と、Google Blog Searchで引っかかった受講者のBlogを読んで得られた情報をメモとして紹介したいと思います。

このエントリは何分不自由な英語力に基づいた二次、三次情報なので、なるべく一次情報にあたって確認されることをお勧めします。

デスクトップ版Silverlight2との互換性

デスクトップ版Silverlight2と互換性があり、コードの書き換えも必要無く、mobile向けにコンパイルし直す必要もないそうです。デスクトップ版Silverlight2とほぼ互換性があり、大半のコードは書き換え・再コンパイルの必要がないそうですが、一部DLRなど実装されない機能もあるそうです。(08-11-02 16:45修正、追補エントリ参照)

但し、デスクトップとモバイルでは画面のサイズが全く違うので、UAなどで処理を振り分けることももちろん出来る、ということだそうです(デモあり)。

実行形態

Silverlight2 for Mobileでは、ブラウザの中でプラグイン形式で実行する形式のほかに、ブラウザの外でスタンドアロンアプリケーション形式で実行する方式も用意されるようです。デスクトップ版Silverlightのほうにもスタンドアロンアプリケーションとして動くようにしようという話がPDCで出てきているようで(以前貼ったDay2 Keynoteのストリーミングの1時間49分05秒付近で言及されていました)、最早Silverlightのカバーするドメインはブラウザプラグインだけではなくなっているようです。(しかしWPFが既にあるのにSilverlightをスタンドアロンアプリケーションとして動かせるようにする理由って何なんでしょうね?マルチプラットフォーム展開するんでしょうか?Adobe AIRのようなもの?Moonlight deskletsみたいな。)

ちなみにScott GuthrieはSilverlight2のスタンドアロンアプリとしての展開について、動画中で以下のように言ってい(たように聞こえ)ました。

In a few minutes, You can learn about how you can actually run both inside the browser, and outside the browser.

モバイル特有のデバイスへの対応

カメラ入力や加速度センサーなどのサポートも考えているとのこと。モバイルデバイスの加速度センサーを使ったデモが最後にありましたが(後述)、加速度センサーが使えるようになれば面白そうですね。

公開時期

Public CTPの公開時期は2009年度第一四半期とのことです。MIX08での話よりちょっとずれたようです。MIX09で発表されるのではないかという観測をされている方もいました。

デモの内容

Microsoft VisualStudio PDC Demo Edition

VisualStudioがWindowsMobileで動く!?
これはクオリティの高いギャグ。是非観るべきだと思います。まったく、よく仕込むよな…。

Hello Button

特別な操作をせずとも、Silverlight2アプリケーションがWM上で動くことのデモ。クリックでContentの切り替わるボタンのデモアプリをVisualStudioでその場で作ってエミュレータ上で実行という流れ。Azureって色の名前でもあるんですね。

Hello Duck

こちらはExpression Blendを使ってアヒルのキーフレームアニメーションを表示するSilverlight2アプリをその場で作り、Sumsumg OMNIA上で表示するというデモ。

Baby Smash

WPFで作成されたものをSilverlight2に簡単に移植できることを示すデモ。

Slot Machine

MobileでSilverlight2アプリケーションをそのままリビルドせずに表示できるとはいえ、WindowsMobile向け、Nokia向け、デスクトップ向けに処理を振り分けたいこともあるでしょう。そういった場合にはどのような対処ができるのか―を示すためのデモ。

Connect4

四目ならべ。

Guitar

ギターのデモ。

Television

ビデオをSilverlight2の中で表示させるデモ。ビデオの内容はPDCのプレゼンター控室でAmit Chopraがちょっと残念な感じで踊っているというもの。

Dance Amit! :)

ユーザーによるジェスチャーを認識し、それに基づいてキーフレームアニメーションを動かすデモ。下手なAmitにこれでダンスを教えてあげる、というストーリーの仕立て。

Painter

インクを使ったペイントのデモ。

Picture Browser

ウェブ上のアルバムから非同期で画像を取ってきて表示するデモ。

Interactive Scenario

モバイルデバイスの加速度センサーを入力インターフェイスにし、Cloudを通じてモバイルデバイスから、ノートPC上のWPFで作成された3D空間を操作、移動するというシナリオのデモ。

質疑応答

iPhone対応は

During the questions section at the end, one gentleman asked if they will support iPhones. The answer was very quick. No. :-(

Berndt’s Weblog: Silverlight on mobiles

まぁそうでしょうね…。Flashも載せる気がないようですし。iPhoneはクイズなどでよくネタにされていました。

 

他にも質疑応答があったのですが、質問者の話すスピードが速く、聞き取ろうとして心が折れました…。今回のエントリではここまでとしたいと思います。質の高い質疑応答が行われていたようですので、Silverlight2 for Mobileについて興味のある方は、是非セッションの動画を視聴されることをお勧めします。

私見

セッションの中でAmit Chopraも述べていましたが、モバイル(WM、Nokia、そしておそらくAndoroidも)からデスクトップ向けまで、統一した技術で開発できるようになるというのは素晴らしいことだと感じます。デスクトップ向けSilverlightを弄りながら、期待して待ちたいですね。

リンク

最後に、Silverlight2 for Mobile関係について調べる上で参考になるサイトのリンクをまとめておきます。

Microsoft Silverlight 2 for Mobile: Developing for Mobile Devices | pdc2008 | Channel 9
Channel 9内のこのセッションについてのエントリ。セッションの動画のストリーミング配信あり。

Greg’s Cool [Insert Clever Name] of the Day: PDC2008 Quick Video Link List (Updated: Now with link verification)
PDCのセッションの動画とスライドのDL先まとめ。

Every Developer, Now a Mobile Developer!
WindowsMobile開発チームによるBlog。

Giorgio Sardo Blog
このセッションのプレゼンターの一人、Giorgio SardoのBlog。

.NET, Silverlight, and other ramblings (from the UK): Silverlight 2 for Mobiles
このセッション受講者によるまとめエントリ。

OCT
26

C++はじめました。他も色々。

Published:2008-10-26 18:00:08 UTC

最近いろいろと勉強する分野を広げています。

C/C++

まぁ、そろそろ年貢の納め時かなぁということで、勉強してみようかと思いまして。C#に慣れてしまった自分のようなゆとりにはきついです…。だらだらやってます。

TCP/IP

大学で輪講をしながら勉強中。使っているのは詳解TCP/IP〈Vol.1〉なのですが、これが非常に分厚くて、だいぶ大変。まぁネットワークの勉強も、そのうち役立つ日が来るでしょう…。多分。

WindowsMobile開発

今度WM搭載スマートフォンを買おうと思っている関係で、.Net Compact Frameworkでのプログラミングについて調べたり、試しに小さなライブラリを書いてみたりしています。本当だったら今頃はEMobileから出ているHTC Touch Diamondを手に入れて、バリバリ弄っているはずだったのですが、大学生協で申し込んだクレジットカードがまだ届かない関係で、延び延びになっています。もうすぐSoftBankやDocomoが秋冬モデルの発表を行うので、そこで出るかもしれないTouch Diamond/Proを待って、そのライフサイクルコストを比較した上で買っても良いかなぁ、と思わないでもない状態です。しかしこのTouch Diamond、史上初の国内キャリア3社から発売される端末であるため潜在顧客も多く、ターゲットプラットフォームとしては結構良い端末なんじゃないかと思います。

Silverlight2

PDCのセッション資料が公開されたら本気出す。

なんでかっていうと、やっぱりこれもWindowsMobile関係です。今年のPDCでは、10/28に「Microsoft Silverlight 2 for Mobile: Developing for Mobile Devices」というセッションが予定されており(ソース)、そのストリーミングがセッション後に公開されるらしいからです。既にWM上ではSilverlight2ベースのものが動いているらしい?のですが、Silverlight for Mobileについては、これまでほとんど情報がありませんでした(特に日本語情報。流行りのiPhone開発より面白いと思うんですけどね…。)。CLR,DLRを積んでいて、強力なプレゼンテーション能力を持ち、カメラやGPSにもアクセスできるというSilverlight2 for Mobile。.Net CFアプリではどうしてもプレゼンテーション能力が貧弱だと言わざるを得ませんでしたが、それが改善されたことで、可能になるシナリオは非常に多いと思います。時間を作って追っていきたいと考えています。

英語

英語もやらないと…。最近iKnowさぼっているからなぁ…。iKnow! API KICK OFF! Developer Challenge – iKnow!に数週間気づかなかった自分は死んだほうがいいと思います。だれか一緒にiKnowやりましょうよー。

おろそかになっていること

  • Linux関係
    Ubuntu絶賛放置中だったり。bashとかviとか使いこなせるようになれたら、カッコいいなと思うのですが、なかなか弄る時間がありません。大学の授業でxyzzyを使わされたりしているのですが、キーボードショートカットが訳のわからない単なる使いにくいエディタにしか思えない自分はゆとりですごめんなさい。
  • C#3.0の勉強
    実は自分の頭の中はC#2.0のままで進化してなかったりします。「ラムダ式って何~?」「拡張メソッドって何?インテリセンスが埋まってウザいんだけど?」という状態です。勉強しないと…。こんな状態でSilverlight2弄りたいというのはちゃんちゃらおかしいわ!と怒られそうですし。

 

image

本気でやるならクロスプラットフォームは避けてMozillaアプリを作るべき-hogehoge

うーん、そうかな。自分もクロスブラウザスクリプティングの労に嫌気が差して、Firefoxの拡張制作に逃げ込んだ経験がある。でも逃げ込んだ先のMDCのドキュメント漁ってたら仕様変更・方針転換の痕跡がゴロゴロあって、サンプルコードとか読んでも、バージョン毎に処理分けしてたりと、クロスブラウザスクリプティングと大差ない面倒を抱え込まなきゃいけないことに気づいて萎えてしまった。

何で後方互換性という基本的なことさえ担保されないのか。

色々事情は有るのかもしれないけど、ブラウザがバージョンアップするたびに動作しなくなった拡張が死屍累々・・・、という状況を許容しているMozillaとは、とてもじゃないが付き合いきれないと自分は思った。やたらと乱発される仕様変更によって、非生産的な対応作業を、ユーザーと、拡張作者に強いるMozillaのやり方は賢いとは思えない

対照的なエピソードがMSにはある。Windowsリリース時の話だ。

スポルスキー氏は2004年にマイクロソフトの基本的な戦略について興味深いことを書いている。DOSからWindowsへ移行する時期に、バギーなアプリケーションをWindows上で走らせるためにアドホックな機能追加を行っていたと証言しているのだ(参考リンク

その具体例に驚かされる。往年のヒットゲーム「SimCity」はメモリの扱いで致命的なバグがあった。開放したメモリを、開放した直後に再び使ってしまうというバグだ。これは1度に1つのアプリケーションしか動かないシングルタスクのDOSでは問題がないが、マルチタスク環境のWindowsでは重大な問題を引き起こす。開放したメモリは、すぐに別のアプリケーションによって利用されるからだ。このためSimCityはWindows上でクラッシュを繰り返したという。SimCityのバグの原因をディスアセンブルして突き止めたマイクロソフトは、SimCityの稼働を検知したらメモリアロケータを特殊なモードで走らせるという機能追加を行った。

これは特殊な話ではなく、Windowsを新バージョンにアップデートしたときに、あらゆるアプリーションが稼働するよう同社のテストチームは非常に多くの“回避策”をWindows上に仕込んでいったという。たとえアプリーション側に問題があったとしても、それはWindowsユーザーには関係ない。ユーザーは、Windowsをアップデートしたら自分のアプリケーションが動かなくなったと考える。問題のあるアプリケーション開発者全員に修正させることができない以上、Windows側で回避策を打つ、というアプローチだ。

Webブラウザ戦争でAcidレースの局地戦が白熱 - @IT

どうだろう?今でもこのカルチャーがMSに受け継がれているかは知らない。IE8では原則に反してドラスティックな変更が入るかもしれないことがこの記事でも言われている。だから、IEを勧めたいのではない。だが、自分の知る限り、.netの世界ではライブラリの後方互換性が大きく破壊されることはこれまで起きていない。設計が良いのだろう。というわけで、Silverlightはどうだろう?Silverlightなら、プレーヤーのバージョンアップが入っても、まず間違いなく後方互換性は担保される。レンタリングするのはMS製のエンジンでしか有り得ないのでクロスエンジン互換性を気にすることもない。Silverlightなら、色々な人を悩ませてきた、色々な問題を解決してくれる…筈。

何アホ言ってたんだ自分・・・。猛省。

MAY
13

GOA WinForms

Published:2008-05-13 16:54:41 UTC

NETiKA TECH の Silverlight と Flash のコンポーネントが凄い-ナオキにASP.NET(仮)という記事で紹介されていたのだが、NETiKA TECHがGOA WinFormsという素晴らしいFlashとSilverlightのコントロールライブラリを公開している。

自分はAjaxに対してはGUIにHTMLを用いることからくる表現力の制約の面から否定的である。しかしFlashやSilverlightなどのRIA技術が発展してきたことによって、ソフトウェアをサービスとして配布するというSaaSのスタイル自体はいよいよ本格化する環境が整ってきたなと感じる。