Archive for 5月 2011
Windows Phone Mango アップデート
Windows Phone Mango アップデートがらみのライブイベントがあったわけですが。
- 文字での情報: Microsoft Previews Next Release of Windows Phone
- 開発系のイベントを追ってる人からするとそう真新しい情報はないものの
- 新たに加わったパートナー企業の名前にFujitsuが
- 東芝とかSHARPじゃないのねぇ
- 開発者ブログ: Developer News: Beta Mango Tools Available Today
- 間もなく開発ツールのダウンロードできるみたい
- Silverlight for WP7 の新機能一覧: Features Supported in Silverlight for Windows Phone
その他
- Introducing LINQ to HPC: Processing Big Data on Windows
- Dryad LINQ っていつの間にか LINQ to HPC って言う名前になってたのね
- まあ、いつまでもコードネームでいるわけにもいかず
常識を覆すソート アルゴリズムに大人げなく食いついてみる!
うわさのスリープ ソートを Rx で実装してみたり。
要するに、値に比例して Sleep → 値を enqueue すればソートできるよねというアルゴリズム。値の最大値に比例してソートに時間がかかるというネタ ソート。
追記: MVP for LINQ (ほんとは C#。LINQ カテゴリーないので)な neuecc さんがちゃんと Rx らしい書き方で作ってれました。
IEnumerable と Observable.Delay を連携される方法が分からなくて上記のコードみたいな書き方にしたんですよねぇ。SelectMany 使って Return 挟めばよかったのか。ちなみにこのコードは、スレッドの挙動的には僕のと同じくスレッド プール利用になるはずだそうです。
以下、ネタにマジレス的説明w
書いたコード
以下のようなコードになりました。Reactive Extensions を利用しています。
/// <summary>
/// うわさのスリープ ソート。
/// </summary>
/// <typeparam name="T">ソート対象の要素の型。</typeparam>
/// <param name="data">ソート対象。</param>
/// <param name="toOrder">T 型から順序を表す整数に変換。</param>
/// <returns>結果受け取り用の Observable</returns>
static IObservable<T> Sort<T>(IEnumerable<T> data, Func<T, int> toOrder)
{
const int Weight = 50;
var results = new Subject<T>();
var maxTime = int.MinValue;
foreach (var x in data)
{
var local = x;
var time = toOrder(x) * Weight;
maxTime = Math.Max(maxTime, time);
TaskEx.Delay(time).ContinueWith(t => { results.OnNext(local); });
}
TaskEx.Delay(maxTime + Weight).ContinueWith(t => results.OnCompleted());
return results;
}
ポイントとしては、
- マニュアル スレッドじゃなくてスレッド プールを使う
- ソート結果の受け取りに IEnumerable じゃなくて IObservable を使う
.NET でスレッドを直接立てたら負けかなと思っている
元ネタの 4chan では C# 実装している人もいるわけですが、Thread クラス直接使ってる・・・
このアルゴリズムで、Thread クラスを直接使ってしまうと、ソート対象の要素の数だけスレッドが立ってしまうわけで・・・ 何千個も何万個もスレッド立てるの?
何それ怖い。
TaskEx.Delay(今回は自作しています。将来的には、標準ライブラリに同様のメソッドが入るようです)を使えば、スレッド プールを使ってくれて、スレッド リソースは浪費しません。
※スレッド プールはスレッドよりも実行順序が緩めなんで、ひょっとしたらときどき結果狂うかもなぁ。何回か試しに実行した結果はうまくいっているものの。
全要素のソートが完了するまで Wait したら負けかなと思っている
非同期に結果が返ってくるものを、全要素待つのももったいないというか。1要素ずつ、push 型で受け取るべきじゃないかと。
実行してみればわかりますが、全要素のソートが完了してから一気に表示されるのではなく、1要素ずつ、ソートが終わった部分から表示されるようになっています。
雑感、というか脱線
しかし、このネタで始めて 4chan の実物を見たんですけども、ほんとに 2ch の英語版なんですねぇ、見た目からして。
あと、4chan って、コードの syntax highlight できるんだ。ちょっとすごい。
ソースコードの言語選択
C# によるプログラミング入門をちょこっと改修中。説明用のソースコード、C# 以外にも、VB, F#, C++/CLI とか足せるようにしてみたり。試しに、C#のプログラムの基本構造だけコード追加。
C++ と C# と VB 足せば Java 超えるじゃん。的な。特に、日本は VB 率高いって言いますしねぇ。それが VB.NET であるかどうかは怪しいわけですが・・・
正直、ページが多すぎて、全ページ書き換えていくのは相当時間かかりそう。
内部的な話
いまさらながら jQuery を導入してみたわけです。言語選択のとこだけでなく、Expander 的な部分とかも、目次のセクションごとの伸縮とかも jQuery。ソースコードの言語選択は UI Tabs です。
Tech·Ed 2011、Visual Studio vNext、等々
北米でTech·Ed開催中なわけですが。
- Tech・Ed NA 2011 Day1 KeyNote
- 早速日本語でまとめ。相変わらずの仕事の速さ・・・
- Visual Studio vNext関連
- Visual Studio Roadmap
- Announcing ALM Roadmap in Visual Studio vNext at Teched
- Next Version of Visual Studio ALM Announced at Tech•Ed
- WP7関連
Visual Studio vNext 関連は、「開発者⇔運用」と「開発者⇔ステークホルダー」の間のギャップを埋めるというのがテーマで、主にALM(Application Lifecycle Management)がらみの新機能が色々搭載されるっぽい。System Management Centerとの連携とか、Agile(Scrum)支援機能とか。
その他:
- Using A GUI (Package Explorer) to build packages
- XML手書きしなくてもよくなったらしい。
- Visual Studio拡張じゃなくて、とりあえず別GUIなんだ。
- Silverlight Integration Pack for Microsoft Enterprise Library 5.0 released!
6 ÷2(1+2)
昨日辺り(?)、以下のようなものがhatenaのホッテントリーに入っていたわけですが。
l 「6÷2(1+2)=?」という小学生レベルの問題? 大勢の人が「1」と答え半分以上が不正解
どっちが正しい?
まあ、なんとでも解釈できますけどもねぇ。定義がないもの。数学者の脳内には無限の可能性が!
- は の省略形である。演算子の優先順位は×に準ずる
- は隣接演算子という目に見えない新しい演算子の導入と考える
- 優先順位は×演算子に準ずる
- 隣接演算子の優先順位は乗除算よりも高い
- は関数適用 の省略形である。関数 と定義する。
- 1.と2-1.なら9
- 2-2.と3.なら1
かな。
上記匿名ダイアリーの「省略は多項式である」説は初めて見た。それって結局、積の省略に帰着するような。項は結局、「項または(式)の積」で定義されることが多いので。
目に見えない演算子
一般に、目に見えない演算子(invisible operator)って呼ばれるものには4種類あります。
で、Unicode なんかだと、この見えない演算子のためにコードが割りあたってたりします。
見えない乗算
Unicode だと U+2062(INVISIBLE TIMES)。
見えないコンマ
隣接する文字の間には暗黙的コンマが挟まれて、リストとみなされるもの。
Unicode だと U+2063(INVISIBLE SEPARATOR)。
見えない加算
いわゆる帯分数(mixed number)。小学生で習うあれと、中学以降で 扱いするのとでみんな混乱する嫌な奴。
Unicode だと U+2064(INVISIBLE PLUS)
見えない関数適用
例えば、線形代数だと「線形写像の適用」と「行列の乗算」がほぼ同じ意味なので、関数適用と乗算を区別する意味もなく。「どっちが正しい?」のところで書いた「 は関数 の適用である」という解釈も、これ(線形写像の適用=行列の乗算)に由来します。
この場合、厄介なのは、 は の意味になったりすること。これも、線形代数だと、写像の線形性から「満たされるべき性質」なので問題にならないわけですが。
で、こういう の と の間には、関数適用演算子が省略されているものとみなします。
Unicode だと U+2061(FUNCTION APPLICATION)。
×÷の優先度
とあった場合、「×と÷は同列」「同列のものが並んでいたら左から」というのは割と皆様同じ認識な気がしますが。
ただし、 の「+と−は同列」というのと比べると、多少迷いが出そうな。この違いの方がむしろ興味深く思ったりも。加減算と乗除算で受ける印象の違いはどこから来るのか。
普段÷記号を使わないから?
÷とか書かないし
数式に限らないんですけども、曖昧性なく意図を伝えるって大事ですからね。一瞬でも「どっちだ?」って迷うなら、それは書いてはいけない。
あと、個人的には、交換法則を満たさない演算子を並べるとかすごく抵抗感が。 とか書くくらいなら の方がまだ好まれそうな。
上記の「加減算と乗除算の差」も、「 を略して と書く」(括弧を取った程度)と「 を略して と書く」(ずいぶん様変わり)の差ですかねぇ。
動くパーサー持ってこい
仕様書も何もないものに対して「これはこういう優先順位なんですよニコッ」とか言われたら怖くね?
仕様書だけあっても怖いんですけどもねぇ。UMLなんかが分かりやすい例かと思いますが、10人いたら最低でも10個は方言が出てくるでしょう。
結局、何らかの形で“実装”がないと、認識がぶれます。(逆もまたしかり。UMLも、「astahで書いて」とか言えばぶれがなくなるもので。)
ICustomTypeProvider、MVVM、F# Tools Update、etc.
- Update to the F# 2.0 Free Tools Release, Corresponding to Visual Studio 2010 SP1 (April 2011 CTP)
- F# も「Siverlight 4、5 に対応」だそうで
- Kinect for Windows SDK ページ
- おお、Kinect ってマイクロフォン配列使った音源位置特定までできるの?!
- PowerShell 2.0の文法ドキュメントが公開&Community Promise適用
- というか、むしろなぜ今。
- コミュニティ プロマイズの方はともかく、このレベルのドキュメントが今までなかったってのもすごい話で
ちょっと普段の「一言だけの紹介」と違って、少々説明つけておきたいのがあったんで、別建てに↓。
ICustomTypeProvider
Silverlight 5 には、ICustomTypeProvider っていうインターフェイスが新たに入るらしい。
ICustomTypeDescriptor ではなく
あれ?なんかそんなの、WPF(というか、デスクトップの方の .NET)には最初から入ってなかったっけ?って思ったら、それは ICustomTypeDescriptor インターフェイスだった。
新しく「Provider」を作った理由は、「Descriptor」が返す PropertyDescriptor とかが、リフレクションの PropertyInfo とかと duplicated (無駄に重複)だから。
「WPF の方にも将来的に追加するつもりだけども、Silverlight 5 の方がリリース時期的に前にあるだけ」とのこと。
DLR (だけ)ではダメなの?
明確な型情報を動的に追加できるというのが重要。
データバインディングの場合、TextBox とかへのバインディングを行うことで、string からの型変換がバックで動いているわけですが、ExpandoObject とかだと string のまま値が渡ってくる。
ICustomTypeProvider を使って型情報自体を書き換えることで、ちゃんと型変換が動いてくれる。
MVVMがらみ
2件ほど、MVVMがらみで。
1個目
ViewModel INotifyPropertyChanged Code Generation
ViewModelを、
- partial class にしておく
- プロパティ名とかを属性として付けておく
としておくと、
- T4 テンプレートで INotifyPropertyChanged による更新通知に対応したプロパティを自動生成してくれる
という代物。
こういう T4 の使い方もあるんだなぁ。
2個目
ViewModelDiagram インストーラ版 1.1.0.0 改修しました。
かねてから、「ViewModel の実装は面倒だけども、AOP 的アプローチは個人的にいまいちだし、動的プロキシはパフォーマンスとか型安全性で難ありだし・・・ 理想は DSL、現状だと DSL Tools 辺りでやるべき?」などと言っていたら、えむナウさんがやってくれました。