++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Archive for 5月 2011

Windows Phone Mango アップデート

leave a comment »

Windows Phone Mango アップデートがらみのライブイベントがあったわけですが。

 

その他

広告

Written by ufcpp

2011年5月24日 at 15:13

カテゴリー: .NET

常識を覆すソート アルゴリズムに大人げなく食いついてみる!

with one comment

うわさのスリープ ソートを Rx で実装してみたり。

要するに、値に比例して Sleep → 値を enqueue すればソートできるよねというアルゴリズム。値の最大値に比例してソートに時間がかかるというネタ ソート。

追記: MVP for LINQ (ほんとは C#。LINQ カテゴリーないので)な neuecc さんがちゃんと Rx らしい書き方で作ってれました。

http://ideone.com/GjeOU

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 できるんだ。ちょっとすごい。

Written by ufcpp

2011年5月20日 at 02:36

カテゴリー: C#

Tagged with

ソースコードの言語選択

leave a comment »

C# によるプログラミング入門をちょこっと改修中。説明用のソースコード、C# 以外にも、VB, F#, C++/CLI とか足せるようにしてみたり。試しに、C#のプログラムの基本構造だけコード追加。

C++ と C# と VB 足せば Java 超えるじゃん。的な。特に、日本は VB 率高いって言いますしねぇ。それが VB.NET であるかどうかは怪しいわけですが・・・

正直、ページが多すぎて、全ページ書き換えていくのは相当時間かかりそう。

内部的な話

いまさらながら jQuery を導入してみたわけです。言語選択のとこだけでなく、Expander 的な部分とかも、目次のセクションごとの伸縮とかも jQuery。ソースコードの言語選択は UI Tabs です。

Written by ufcpp

2011年5月18日 at 09:25

カテゴリー: 未分類

Tech·Ed 2011、Visual Studio vNext、等々

leave a comment »

北米でTech·Ed開催中なわけですが。

Visual Studio vNext 関連は、「開発者⇔運用」と「開発者⇔ステークホルダー」の間のギャップを埋めるというのがテーマで、主にALM(Application Lifecycle Management)がらみの新機能が色々搭載されるっぽい。System Management Centerとの連携とか、Agile(Scrum)支援機能とか。

その他:

Written by ufcpp

2011年5月16日 at 23:21

カテゴリー: .NET

6 ÷2(1+2)

with one comment

昨日辺り(?)、以下のようなものがhatenaのホッテントリーに入っていたわけですが。

l 「6÷2(1+2)=?」という小学生レベルの問題? 大勢の人が「1」と答え半分以上が不正解

l 6÷2(1+2)=9と発表しているバカガジェット通信

どっちが正しい?

まあ、なんとでも解釈できますけどもねぇ。定義がないもの。数学者の脳内には無限の可能性が!

  1. clip_image002clip_image004 の省略形である。演算子の優先順位は×に準ずる
  2. clip_image002[1] は隣接演算子という目に見えない新しい演算子の導入と考える
    1. 優先順位は×演算子に準ずる
    2. 隣接演算子の優先順位は乗除算よりも高い
  3. clip_image002[2] は関数適用 clip_image006 の省略形である。関数 clip_image008 と定義する。

clip_image010 の結果は、

  • 1.と2-1.なら9
  • 2-2.と3.なら1

かな。

上記匿名ダイアリーの「省略は多項式である」説は初めて見た。それって結局、積の省略に帰着するような。項は結局、「項または(式)の積」で定義されることが多いので。

目に見えない演算子

一般に、目に見えない演算子(invisible operator)って呼ばれるものには4種類あります。

で、Unicode なんかだと、この見えない演算子のためにコードが割りあたってたりします。

見えない乗算

まあ、一番使われるのはこれですが、clip_image002[3]clip_image004[1] とみなすもの。

Unicode だと U+2062(INVISIBLE TIMES)。

見えないコンマ

隣接する文字の間には暗黙的コンマが挟まれて、リストとみなされるもの。

例えば、clip_image012 と書く場合、clip_image014clip_image016 ではなく、clip_image018 とみなされます。

Unicode だと U+2063(INVISIBLE SEPARATOR)。

見えない加算

いわゆる帯分数(mixed number)。小学生で習うあれと、中学以降で clip_image020 扱いするのとでみんな混乱する嫌な奴。

clip_image022 って書いたら「1と3分の2」と読んで、clip_image024 とみなすという。

Unicode だと U+2064(INVISIBLE PLUS)

見えない関数適用

数学だと、clip_image026 を単に clip_image028 と書いたりするわけですよ。

例えば、線形代数だと「線形写像の適用」と「行列の乗算」がほぼ同じ意味なので、関数適用と乗算を区別する意味もなく。「どっちが正しい?」のところで書いた「clip_image030 は関数 clip_image032 の適用である」という解釈も、これ(線形写像の適用=行列の乗算)に由来します。

この場合、厄介なのは、clip_image034clip_image036 の意味になったりすること。これも、線形代数だと、写像の線形性から「満たされるべき性質」なので問題にならないわけですが。

で、こういう clip_image028[1]clip_image038clip_image040 の間には、関数適用演算子が省略されているものとみなします。

Unicode だと U+2061(FUNCTION APPLICATION)。

×÷の優先度

clip_image010[1] とあった場合、「×と÷は同列」「同列のものが並んでいたら左から」というのは割と皆様同じ認識な気がしますが。

ただし、clip_image042 の「+と−は同列」というのと比べると、多少迷いが出そうな。この違いの方がむしろ興味深く思ったりも。加減算と乗除算で受ける印象の違いはどこから来るのか。

普段÷記号を使わないから?

÷とか書かないし

何のために clip_image044 って書き方すると思っているんだ!

数式に限らないんですけども、曖昧性なく意図を伝えるって大事ですからね。一瞬でも「どっちだ?」って迷うなら、それは書いてはいけない。

あと、個人的には、交換法則を満たさない演算子を並べるとかすごく抵抗感が。clip_image046 とか書くくらいなら clip_image048 の方がまだ好まれそうな。

上記の「加減算と乗除算の差」も、「clip_image050 を略して clip_image052 と書く」(括弧を取った程度)と「clip_image054 を略して clip_image056 と書く」(ずいぶん様変わり)の差ですかねぇ。

動くパーサー持ってこい

仕様書も何もないものに対して「これはこういう優先順位なんですよニコッ」とか言われたら怖くね?

仕様書だけあっても怖いんですけどもねぇ。UMLなんかが分かりやすい例かと思いますが、10人いたら最低でも10個は方言が出てくるでしょう。

結局、何らかの形で“実装”がないと、認識がぶれます。(逆もまたしかり。UMLも、「astahで書いて」とか言えばぶれがなくなるもので。)

Written by ufcpp

2011年5月7日 at 23:41

カテゴリー: 数学

ICustomTypeProvider、MVVM、F# Tools Update、etc.

leave a comment »

ちょっと普段の「一言だけの紹介」と違って、少々説明つけておきたいのがあったんで、別建てに↓。

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 辺りでやるべき?」などと言っていたら、えむナウさんがやってくれました。

何気に、ugaya40 さんの Livet にも対応しているらしい。

Written by ufcpp

2011年5月6日 at 23:31

カテゴリー: .NET