ページ

ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

2015年3月17日火曜日

[C#] Xamarin 始めました(始めてます)

始めましたと言っても最初に始めたのは「[勉強会] 第2回 Japan Xamarin User Group Conference 西日本編に参加しました」この記事を書いたちょっと前のことなので、すでに3ヶ月以上が経過しているんですけど。
個人的には Xamarin かなり気に入ってます。まぁ、Visual Studio が使えて C# で書けるって時点で気に入らないわけがないんですが(笑)

ところで、たまに「Xamarin を使うと C# で作ったものが iPhone でも Android でも動くようになるらしい」と誤解している人がいますので一応書いておくと、、、
Xamarin は『プログラミング言語として C# が使えるようになるだけ』です。
たとえば、iOS の加速度センサーからデータを取得するコードを Objective-C で書くとこんな感じです。

// iOS(Objective-C)でのコード
CMMotionManager *manager = [[CMMotionManager alloc] init];
if (manager.accelerometerAvailable) {
    manager.accelerometerUpdateInterval = 0.1;
    [manager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *data, NSError *error) {
        // data.acceleration に加速度の値が入っている
    }];
}

これを Xamarin を使って C# で書くとこうなります。

// iOS(C#)でのコード
var manager = new CMMotionManager();
if (manager.DeviceMotionAvailable)
{
    manager.DeviceMotionUpdateInterval = 0.1;
    manager.StartDeviceMotionUpdates(NSOperationQueue.CurrentQueue, (data, error) =>
    {
        // data.Acceleration に加速度の値が入っている
    });
}

見比べればわかるように使っている言語が Objective-C から C# に変わっただけで、使っている API とかはほぼ同じです。
今度は Android で同じく加速度センサーからデータを取得するコードを Java で書くとこんな感じになります。

// Android(Java)でのコード
private SensorManager sensorManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    List<sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_UI);
}

@Override
public void onSensorChanged(SensorEvent event) {
    // event.values に加速度の値が入っている
}

これを Xamarin を使って C# で書くとこうなります。

// Android(C#)でのコード
private SensorManager sensorManager;

protected override void OnCreate(Bundle savedInstanceState) {
    this.sensorManager = (SensorManager)ApplicationContext.GetSystemService(Context.SensorService);
    var sensors = this.sensorManager.GetSensorList(Android.Hardware.SensorType.Accelerometer);
    this.sensorManager.RegisterListener(this, sensors[0], SensorDelay.Ui);
}

public void OnSensorChanged(SensorEvent event) {
    // event.values に加速度の値が入っている
}

こちらも見比べればわかるように使っている言語が Java から C# に変わっただけで、使っている API とかはほぼ同じです。

こんな風に、Xamarin は抽象化レイヤーを持ってるわけでもなくでも無く、プラットフォームが持つ固有の機能をほぼそのままラップして C# で使えるようにしている、と思えばいいんじゃないかと思います。API 自体は iOS や Android のものをそのままクラスライブラリにしてあるだけという感じです。(メソッドの一文字目が大文字になっているとか、CMMotionManager.StartDeviceMotionUpdates メソッドのように引数の型によって判断がつく場合はオーバーロードで済ませるようになっているとか、C# で使って不自然にならないように変更されている部分はあります)
また、Xamarin.iOS と Xamarin.Android はクラスライブラリも含めて基本的に別物です。CMMotionManager クラスは Xamarin.iOS にしかありませんし、SensorManager クラスは Xamarin.Android にしかありません。ですから CMMotionManager クラスを使ったコードは Android では動かないどころかそもそも Xamarin.Android でコンパイルすることができません。こういったプラットフォームによって異なる部分はそもそもソースコードを兼用したりといったことはできないわけですね。もちろん、ラットフォームに依存しない部分、たとえばデータを処理する部分とかは共通化できます。Portable Class Library(PCL)や Shared Project といったそれを支援する機能もあります。MVC や MVVM などでビューとコントローラー、ビューとビューモデルをデータバインディングやメッセージングを使ってきちんと疎結合にしてあげればプラットフォームに依存するビュー部分は iOS や Android ごとに作り、依存しない部分は PCL で共通に、といった感じにできるわけです。(WPF や Windows ストアーアプリと共通化するってことだってできます)

※ Xamarin.Forms というビュー部分を抽象化して iOS、Android、Windows Phone の各プラットフォームのビューを「一度書けばすべてで動く」ようにしてくれる機能もあります。Xamarin.Forms はまだまだ進化の途中という感じですが、これはこれでちょっとしたものを作るときには便利なので応援してます。

今やっているプロジェクトでは iOS、Android の両方に対応する必要があるんですが、ビュー部分だけプラットフォームごとに作ってそれ以外は PCL でまとめています(MVVMCross を使っています)。さらにスマホに閉じたアプリではなくサーバーと通信しあうタイプのアプリなんですが、サーバー側は ASP.NET Web API や SignalR なんかを使ってます。もちろん C# です。さらにサーバーにあるデータを表示したりする Windows アプリも必要なんですがこれは WPF + C# です。とすべて C# で統一できてとても楽になりました。もしこれがスマホが Objective-C と Java で、サーバーが PHP で、Windows アプリが WPF C# で、なんてことになっていたら開発効率的に大変なことになっていたと思います。あと、このアプリはデータを処理・解析する必要があって、それがスマホやサーバー、Windows クライアントのいずれでも動かす必要があるんですが、これももちろん PCL でまとめてあります。なので、同じデータ処理 DLL が iOS、Android、ASP.NET、WPF の中で動いています。最初の頃は mono を使って CentOS 上でも動いてました(諸事情で今は CentOS は使ってませんが)。もしこれがプラットフォームごとに別々に実装しなくてはいけなくなったりしたら気が遠くなります。C/C++ なんかを使えばある程度共用はできると思いますが今ほど簡単にはいかないでしょうし。

と、こんなプロジェクトをやっているんですが正直ちょっと(いや、だいぶ)人手不足です。そのためリアルに求人してるんですが、興味があるっていう人どっかにいないかなぁ(Xamarin 知らなくても C# 好きなら OK)

2014年12月8日月曜日

[.NET] VB って If a = a Then が成り立たないことがあるのか!

先日、VB のコードを書いていて初めて知って衝撃を受けました。

Dim i As Integer? = Nothing
If i <> 1 Then
    i = 1
End If

なんのためらいもなくこういうコードを書いてました。当然 i は 1 ではないので If 文の中に入って 1 が代入されるもんだと思ってました。もちろん C# ではそうなります。けど、VB は違うんですね。コンパイラがどういうことやってるのかとりあえず IL を見てみました。IL の内容をそのまま VB で書くと

Dim result As Boolean?
If Not i.HasValue Then
    result = False
Else
    Dim compare As Boolean? = Not i.Value = 1
    result = compare
End If
If result Then
    i = 1
End If

こんな感じでした。(最適化無しのデバッグビルドです。最適化すればもっと効率いい IL になるんじゃないかと思います)
まず i が Nothing でないかを HasValue でチェックして、Nothing でない場合だけ 1 と比較しています。判定結果をいったん Boolean?(Nullable<bool>)に代入してる理由はよくわかりません。普通に Boolean で事足りると思うんですがなんでわざわざ Boolean? なんでしょうね?

というわけで、VB では比較する二項のいずれかの型が Nullable であり、その値が Nothing のときは常に条件は成り立ちません。たとえ等値演算子の両項が Nothing であっても成り立ちません。実際に以下のコードを試してみると「i0 と i1 は違う」と表示されます。

Dim i0 As Integer? = Nothing
Dim i1 As Integer? = Nothing
If i0 = i1 Then
    Console.WriteLine("i0 と i1 は同じ")
Else
    Console.WriteLine("i0 と i1 は違う")
End If

さらに同じ変数どうしでもダメです。

Dim a As Integer? = Nothing
If a = a Then
    Console.WriteLine("a と a は同じ")
Else
    Console.WriteLine("a と a は違う")
End If

これでも「a と a は違う」と表示されます。

もちろん、このことはリファレンスに載っています。
null 許容値型 (Visual Basic)
ここの「Null 許容型の比較」にあるように Nullable を比較した結果は True、False、Nothing のいずれかになり、そして Nothing は True でも False でもありません。さらに、Nothing は = や <> で比較することはできません(結果は常に Nothing になるので)。Nothing を比較できるのは Is か IsNot 演算子だけです。

いやぁ、びっくりした。
参照型の場合は、If obj Is Nothing Then のように Is、IsNot 演算子を使う癖がついてます。Nullable は値型だけど「なるべく参照型っぽく振る舞うようになっている」と思えば Is、IsNot を使わないとダメっていう発想になるかもしれませんが、なんとなく「値型だから」という気がしてなんの疑問も持たずに =、<> を使っちゃってました。そうか、ダメなのか。まぁ、気づいてしまえば確かに参照型っぽくしようと思うとこういう仕様になるっていうのは納得できますが。けど、上の例のように同じ変数の比較でも Nothing だと成り立たないっていうのはちょっとどうなのかなぁ。
それにしても、今までたまたま VB で Nullable を使うコードを書くことがほとんど無かったのもあって、ほんとにまったく気づいてませんでした(C# では Nullable 使いまくってますが)。

ちなみに、このことに気づいたのは INotifyPropertyChanged を実装していた時です。C# でオーソドックスに書いた時と同じように

Public Property MyValue As Integer?
    Get
        Return Me._MyValue
    End Get
    Set(value As Integer?)
        If Me._MyValue &lt;&gt; value Then
            Me._MyValue = value
            RaisePropertyChanged("MyValue")
        End If
    End Set
End Property

こんな風に書いて意図したように動かなくて気づいたわけです。(Me._MyValue か value が Nothing だとうまく動かない)
ではどういう風に書けばいいんだろう?と考えてみましたが、どうやら、

Public Property MyValue As Integer?
    Get
        Return Me._MyValue
    End Get
    Set(value As Integer?)
        If Not Me._MyValue.Equals(value) Then
            Me._MyValue = value
            RaisePropertyChanged("MyValue")
        End If
    End Set
End Property

と書けばいいようです。
Nullable の場合、一見 null になっていても HasValue、GetValueOrDefault() といったプロパティ/メソッドは呼び出せます。HasValue 呼び出せなかったら値が null かどうかチェックできなくなってしまうのでそりゃそうですよね。そもそも、あくまで Nullable<T> の中身が null であることを表しているだけであって Nullable<T> 自体のインスタンスはあるわけですから呼び出せて当然です。そして同様に Equals() も呼び出せます。Equals() は C# での == と同じ結果を返してくれるのでこれでうまくいきます。
もちろん、参照型の場合に値が  null なのに Equals() とか呼び出すと NullReferenceException なので注意。

と、今さらのように知って衝撃を受けたので長々と書いてみました。(VB にはまだまだ気づいてないことがありそう)

2013年11月1日金曜日

[勉強会] LINQ 勉強会と C# の素晴らしさを語る会

ずいぶん時間が立ってしまいましたが、今まで書いてなかった勉強会 「LINQ 勉強会」「第2回 LINQ 勉強会」「C# の素晴らしさを語る会」 のことを書いておきます。

■ LINQ 勉強会
2013/6/29 グリーさんの大阪オフィスの部屋をお借りして開催された「LINQ 勉強会」

米田さんのハンズオン形式のセッションがメイン。LINQ を使ってみるというハンズオンではなく、LINQ を作ってみる(IEnumerable なコレクション生成部とか Where とか Select とか)という内容。しかも「LINQ を作りましょう」ではなく、「こういう風に分割した方が柔軟性高くなるよね?」とやっていったらいつのまにか LINQ そのものになってた、という進め方。おもしろかったです。このセッションでは、私は質問があったら答えて上げる役として部屋の中をうろうろしてました。まぁ、あまり役には立ってなかったように思いますが。
米田さんの資料はこちら 「超LINQ入門」

続いて、私もセッションをやらせてもらいました。「LINQ の概要とかもろもろ」ということで、LINQ のことを一通り、LINQ to Objects、LINQ to XML、LINQ to SQL といったところを浅く広く紹介するという感じのセッションです。米田さんのハンズオンのあとだったのでちょうどいい感じにまとまったかも。
以下にセッション資料を貼り付けておきます。

終了後は梅田の居酒屋で懇親会。楽しかった。

■ 第2回 LINQ 勉強会
2013/8/24 靭公園テニスセンター会議室にて開催された「第2回 LINQ 勉強会」
テニス用の競技場の中にある会議室というおもしろい場所でした。以前にシアトル・マリナーズの本拠地のセイフィコフィールドの中を見学したことがあるんですが、そのときみた野球選手用のロッカールームとかミーティングする部屋とか記者会見場とかそういった雰囲気とおんなじような感じでした。

上に書いた「LINQ 勉強会」の第2回という位置づけですが、前回の続きというわけでなく純粋にもっともっと LINQ のこと話したいよね、という感じです(だと自分では勝手に思ってます(笑))

今回もセッションをさせて頂きました。「LINQ 概要」ということで前回と同じように LINQ のことを広く浅くという感じで紹介しました。前回とまったく同じだとつまらないので細々と変えてはいますが、まぁ、だいたい同じです。
けど、一応、セッション資料を貼り付けておきます。

続いて米田さんのハンズオン。生徒の成績データのコレクションを LINQ を使って抽出したり、ソートしたり、グループ分けしたりといった内容。元となるソースはあらかじめ米田さんが作ってきてくれました。WPF を使ってて、ちゃんとデータバインドして、という結構ちゃんとしたもの(笑)で、データ処理部分だけ書き換えればそれに応じて表示がかわるというもの。このソースを皆に配布して、いろいろ書き換えなが LINQ のいろんな機能の実習。わかりやすかったです。
米田さんの資料はこちら 「第2回 LINQ勉強会」

続いては @Posaune さんのセッション。LeapMotion からの入力を Rx を使って受け取るという内容。まさか、LeapMotion が出てくるとは。みんな好きだなぁ。まぁ、私もこの日 LeapMotion を持っていってたんですが(笑)
認識した指の本数からグー、チョキ、パーを判断しようというもの。LINQ や Rx をうまく使うとほんとにすっきりとコードが書けますね。おもしろかったです。

終了後は近所の居酒屋で懇親会。
持って行った EnchantMOON をみんなに見せびらかしました(笑)

■ C#の素晴らしさを語る会
2013/10/12 マイクロソフト関西支店のセミナールームをお借りして開催された「C#の素晴らしさを語る会」

15~30分のショートセッションで 15人もの方が C# や .NET の素晴らしさを語るというおもしろい内容。
セッションスライドは
http://www.vshtc.net/vshtcstudyosaka3
こちらにまとめられています。
私も C# や .NET の基礎的なことを紹介しつつ、気に入っているところを語るという内容でセッションをしました。私のセッション資料も上記のサイトにあります。

初心者向けといいながら後半になるにつれどんどんディープな世界に入っていくという初心者置いてきぼり状態でしたが(笑)いろいろなお話が聞けてとてもおもしろかったです。
そういや、あんまり async/await な非同期系の話がなかったな。私は大好きですが、なかなか仕事用のコードでは使う機会がないんですよねぇ。使うべきところで使わないのであれば「こんなの絶対おかしいよ」と言えるんですが、そもそも非同期を使う機会自体がなかなか無いと言うか。あったとしても、うかつに使うと「わけがわからないよ」と言われそうなんですよねぇ。けど、ASP.NET MVC でごにょごにょするようなことをやってるのでそこでは思いっきり使えるかな?まぁ、これは半分趣味みたいな開発ですが。

終了後は近くの中華料理屋で懇親会。
その後、ミスド(だったかな?)に場所を変えて二次会。

■ そして
そして、12/14 に「第3回 LINQ 勉強会」が開催されます。現在、参加者募集中です。
またまた、私もスピーカーさせて頂く予定です。

って、今見たら、なんか私の紹介文が偉くかっこいいんですけど(笑)

2012年6月1日金曜日

[VS2012] async/await のパフォーマンスの注意点

前の記事 で紹介した 「What’s New for Parallelism in Visual Studio 2012 RC」 の補足記事が来てました。

「Performance consideration for Async/Await and MarshalByRefObject」
これ、個人的にはものすごく重要なことのような気ガス

前の記事にあった StreamReader.ReadLineAsync メソッドが 3倍速くなったとかはどういうことなのか?
詳しくは上の記事を読んでもらった方がいいと思いますが、ざっくりと説明します。
上記の記事からコードの重要な部分をコピペします。

class MyObj 
{ 
    const int ITERS = 100000000; 
    private int m_data; 

    public async Task Foo1() 
    { 
        for (int i = 0; i < ITERS; i++) m_data++; 
    } 

    public async Task Foo2() 
    { 
        int localData = m_data; 
        for (int i = 0; i < ITERS; i++) localData++; 
        m_data = localData; 
    } 
}

この Foo1 メソッドと Foo2 メソッドの実行速度を調べると Foo1 の方が 3倍くらい遅いそうです。
なぜか?
async なメソッドはコンパイラによって中身がゴニョゴニョされて await が使用できるようなコードに変換されます。(メソッドの中身が IAsyncStateMachine を継承した別クラスに切りだされて、await ごとに状態遷移するようなステートマシンなコードになる) コード上では単なるフィールドへのアクセス(m_data へのアクセス)に見えますが、コンパイル結果は単なるアクセスじゃなくなっているわけです。そのため、その分遅くなってしまうということだそうです。

さらに

class MyObj

を

class MyObj : MarshalByRefObject

とすると差が大きくなります。
実に Foo1 は Foo2 の 72倍くらい遅くなってしまいます。Foo2 の方は MarshalByRefObject であっても無くてもほとんど速度は変わりません。
これは、どうやら以下の理由だそうです。
MarshalByRefObject を継承したクラスはリモートアクセスが可能になります。リモートアクセスする場合はプロキシーが生成され引数などがマーシャリングされて渡されるわけですが、これはかなり重い処理です。なので無駄にプロキシー経由にならないようになっています。プロキシーが必要かどうかは 「別 AppDomain かどうか」 で判断します。しかし、この判断自体もオーバーヘッドになってしまいます。なので、JIT は自分自身(すなわち “this”)にアクセスする場合は絶対に同じ AppDomain だとしてチェックを省略し、普通にローカルなフィールドにアクセスするのと同じ速度になるようにしています。
ところが、async なメソッドになると上に書いたようにメソッドの中身が別クラスに切り出されるため m_data へのアクセスは this へのアクセスではなくなります。そのため m_data にアクセスするたびに 「同じ AppDomain かどうかのチェック」 をしなくちゃいけなくなります。これがオーバーヘッドになって 72倍という速度差になります。(ちなみに、もし別 AppDomain になって、プロキシー経由のアクセスになると数百倍くらいの速度差にはなるんじゃないかと思います。COM のころはそんな感じでした)
ちなみに、Stream や TextReader、TextWriter といったクラスは MarshalByRefObject から派生しています。

これはプロパティにするとちょっとましになるそうです。

private int Data { get { return m_data; } set { m_data = value; } } 

public async Task Foo3() 
{ 
    for (int i = 0; i < ITERS; i++) Data++; 
}

意味的には Foo1 とまったく同じですが、JIT が最適化するヒントになって Foo3 は Foo2 に比べて 10倍くらい遅い(Foo1 に比べて6倍ちょっと速い)となるそうです。

まぁ、こうしても遅くなるのは確かなので結局のところ 「async なメソッドでは極力フィールドやプロパティにアクセスせず、可能な限りローカル変数アクセスになるようにする」 ということになりそうです。
別の意味でもなるべくローカル変数になるようにした方が安全です。
async なメソッドで await を使うと非同期で動くようになるわけですからそこからフィールドやプロパティにアクセスするときは排他を考えてやらなくちゃいけません。async/await を使うとあまりにお手軽に非同期できちゃうので忘れがちになってしまいますが、非同期で動いている以上、外部のリソースにアクセスする場合は常に 「別の非同期メソッドとの読み書きがバッティングして内容が破壊されるようなことは無いか」 を考えてやらなくちゃいけません。ローカル変数は外部ではありませんので、そういったややこしいことを考える必要が無くなります。(注意: 別のクラスのインスタンスをローカル変数に持っていて、そのインスタンスが別の非同期メソッドからアクセスされるような場合は当然ちゃんと考えてやらなくちゃいけません。ローカル変数ならなんでも大丈夫ってわけじゃありませんのでご注意を)

2012年4月20日金曜日

[.NET] async、await の発音は?

昨日参加した勉強会 MetroStyleDeveloper #02 での一コマ。
私はずっと 「async」「await」 を 「エイシンク」「エイウエイト」 と発音してました。
そしたら、さおさんから 「async って アシンク じゃなくて エイシンク だったんですかぁ」 と。で、私は 「非同期の asynchronous って エイシンクロナス ですよね?なので エイ でいいと思ってたんですが。。。どうなんでしょ?」 と。その場で 「どなたか英語に詳しい人、わかる人います?」 と聞いてみましたがどなたも返事なし。

ということで、あらためて調べてみた。
asynchronous は辞書の発音記号では eɪsíŋkrənəs。カタカナで書くとしたら 「エイシンクロナス」 ってところでしょうか。
await は辞書の発音記号は əwéɪt。カタカナで書くと 「アウエイト」 でしょうね。おぅ、こっちは エイ じゃなかったんだ。知らんかった。

さらに、あらためて Future directions for C# and Visual Basic を聞いてみた。
これは、C# の言語設計者であり、C# 世界の首領と言っていいであろう Anders Hejlsberg 氏の BUILD でのセッションです。
やっぱり、asynchronous は 「エイシンクロナス」、async は 「エイシンク」、await は 「アウエイト」 と言ってるように聞こえます。
(あと、async は async modifier で await は await operator なのか)

というわけで、これからは 「エイシンク」「アウエイト」 と言っておこう。
(ほんとはどう発音するのがいいのかご存じの方がいたら教えて下さい)

[C#] foreach の仕様が C# 5.0 で変更される

(Twitter 経由で知った 2ch のスレ経由で知った)
C# 5.0 の新機能 (C# によるプログラミング入門): 「foreach の仕様変更」 より。

おぅ、そうなんですか。知らんかった。
なんか、まったく同じ話を昔書いた覚えがあるなぁ、と思ったら 「Anonymous Method はクロージャではない その2」 これですね。
このときに 「それは仕様書の方が間違ってる」 と言ってた内容が C# 5.0 では正しいことになるというわけですね。
まぁ、確かに影響を受けるコードはそんなに多くないだろうとは思いますが、影響を受けるかどうかがパッと見でわかりにくいのがちょっとイヤンな感じ。(影響を受けるのは foreach のカウンタ変数をラムダ式や匿名メソッドでキャプチャしているときってことになるのかな?)

2012年1月6日金曜日

[IE][JavaScript][WP7] JavaScript と Script# と PhoneGap

「進化する ECMAScript」
これは、Internet Explorer チームのブログ(英文記事を日本語訳してくれたもの)ですが、Microsoft が JavaScript に対して結構本気だっていうことがよく分かる感じです。Math、String、Number やグローバリゼーションの強化案ってことでプロトタイプを作ってすでに公開しているとのこと。
そういや、以前に jQuery でもグローバリゼーション・プラグインを公開していましたね。(@IT: 「Microsoft発のjQueryグローバリゼーション・プラグイン」)

と、まあ、こういった JavaScrpt の強化についても気になるところではありますが、個人的にこの記事で一番気になったのは 「数十万行の JavaScript コードから成る Office Web アプリケーション は、主に Script# をベースに記述されており」という部分。
そういや、Script# が使われていると聞いたことがあるような気がしないでもない。
Script# っていうのは、C# で JavaScript のコードを書けるようにするっていうシロモノです。(C# をコンパイルすると JavaScript が生成される。記事にも出てくる Google Web Toolkit は Java をコンパイルすると JavaScript が生成されるヤツですね)
私もプログに取り上げたことあったなぁと検索してみたら

といったあたり。2006年のころですか。WPF/E なんて単語も出てきてて、なつかしい。(ちなみに、WPF/E は Silverlight のコードネーム)

で、先日の PhoneGap と Script# を組み合わせて使うなんてことができるとおもしろいかも、なんて思いました。
これができるなら、Windows Phone、Android、iOS すべてで動くアプリを C# で書けるってことになりそうですね。
理屈の上では PhoneGap の API をマネージドであるかのように見せかけるアセンブリ ( ここ の “Referenced Assemblies” にあたるアセンブリ) があればいいのかな?

Mono for Android や MonoTouch を使えばプログラミング言語としては C# を使えるけど、これらは API 自体はプラットフォームごとに異なるから UI 部分なんかはそれぞれごとに作らなくちゃいけないですよね?それに対して、PhoneGap は HTML+α がベースだから UI 部分も含めて大部分が使い回し可能ってことになりそう。
時間があったら Script# について久しぶりに調べてみたいな。

# ところで、Office Web アプリケーションを作るのに使った Script# って公開されてるのと同じものなんだろうか?ひょっとして、Microsoft 社内用のバージョンがあったりするのかな?

2007年5月1日火曜日

Silverlight 1.0 beta と 1.1 alpha

4/30~5/2 の日程で MIX07 がラスベガスで開催されていますが、そこで Silverlight (コードネーム "WPF/E") のいろいろが発表されたようです。

まず、Silverlight の新しいサイトが公開されています。
http://silverlight.net/

また、MSDN Silverlight Dev Center もあります。
http://msdn2.microsoft.com/en-us/silverlight/

これらを見るとわかるように同時に 1.0 beta と 1.1 alpha が公開されました。

Silverlight 1.0 beta
今まで Silverlight の最新版は Feb 2007 CTP でした (Feb 2007 CTP の公開されたときはまだ "WPF/E" という名前でしたが)。これの beta 版が今回リリースされた 1.0 beta です。CTP→1.0 beta の変更点は What's New in Silverlight (1.0 Beta and 1.1 Alpha)? にまとめられているようです。ざっと見たところ 「細かいところはいろいろと変わっている」 という感じでしょうか。

また、1.0 beta は "Go-Live" ライセンスとなったそうです。
あと、ダウンロードするときに 「以下のライセンスを読んで "I Accept" をクリックしろ」 と出てきます(今のところ英文です)。このライセンスに 「2007年 8月 1日まで有効」 とあります。ライセンス的に日付を切っているだけなのか、実際に時限装置が内蔵されているのかはわかりませんが、意外と短いです。少なくともそれまでには次の beta、もしくは、正式版がリリースされるってことなんだと思います。

Silverlight 1.1 alpha
発表的にはこちらの方がインパクトは大きいですが、Managed Code の実行をサポートした Silverlight の alpha 版です。
Silverlight 1.0 ではプログラムの部分は JavaScript で記述します。これが JavaScript だけではなく C#、Visual Basic などでも記述できるようになります。また、IronPython、IronRuby などでも記述できるようです。

私自身まだよくわかってませんが、フルバージョンの .NET Framework とはまったく異なったランタイムによって実行されるようです。"mini-CLR" といった書き方がされていることもあるようです。
さらに Dynamic Language Runtime (DLR) というダイナミックな言語 (Python とか Ruby とか) のためのランタイムもあわせて発表されました。DLR は CLR の上に乗っかるという位置づけになるようです。この DLR が Silverlight の "mini-CLR" にも含まれているので C#、Visual Basic だけでなく Python や Ruby も使えるようになるということみたいです。
Silverlight の "mini-CLR" の BCL (ベースクラスライブラリ) ですが、どの程度のクラスが用意されているのかよくわかりません。1.1 alpha SDK もダウンロードしてみたんですが、クラスリファレンスが見当たりません。Quick Start なんかを見てるみると XmlReader なんかを使ってたりもするんで、Web 上で使いそうなものはある程度は用意されているみたいなんですが。

2007年3月22日木曜日

C# 3.0 の partial methods

C# 3.0 (Visual Studio "Orcas" / .NET Framework 3.5) には partial methods が追加されるそうなんですが、情報があまりないのでググってみました。(Orcas CTP のドキュメントに記載されているそうですけどね)

Anders Hejlsberg on the future of C#: Partial methods
C# 3.0 Partial Method Definitions

上記の内容からすると、、、

// 定義
partial void onNameChanged();

// 実装
partial void onNameChanged()
{
??? // 内容
}

そして、partial method の制約は

  • partial class の中だけで使用可。
  • partial method は partial キーワードをつける必要があり、戻り値は void でないといけない。
  • partial method は ref パラメータは使えるが out パラメータは使えない。
  • partial method は暗黙に private で、 それゆえ virtual にはできない。
  • partial method は extern にはできない。
  • partial method は static と unsafe はつけられる。
  • partial method は generic にできる。
  • partial method の delegate は作れない。

といったものがあるそうです。

で、partial method っていうのが何をするものかというと、「実装があったらその実装を呼び出すようにするし、なかったら何もしない」 と言う風にコンパイラが解釈してくれるものだそうです。

たとえば、Hoge.designer.cs に

??? partial class Hoge
??? {
??????? partial void onNameChanged();

??????? private void Func()
??????? {
??????????? onNameChanged();
??????? }
??? }

とあった場合に、Hoge.cs で

??? partial class Hoge
??? {
??????? partial void onNameChanged()
??????? {
??????????? // 何かする
??????? }
??? }

と書けば Func() が呼び出されたときに Hoge.cs の onNameChanged() が呼び出されるようになります。Hoge.cs に partial void onNameChanged() の実装がなければ Func() は何もしないメソッドになるわけです (Func() にある onNameChanged() の呼び出しが削除される)。
もちろんこれはコンパイル時に解釈されます。virtual のように実行時に解釈されるわけではありません。ですので、IL などにはなんら変更はなく、C# コンパイラが拡張されただけです。(だと理解してます)

上の例でも .designer.cs と書いたように、自動生成されるコードで便利なように追加された機能といっていいと思います。

2006年12月5日火曜日

Anders Hejlsberg 氏と Chris McConnell 氏の対話ビデオ

Anders Hejlsberg and Chris McConnell: Reflections on LINQ, Desktop Search, WinFS, Functional and Intentional Programming より

Anders Hejlsberg 氏と Chris McConnell 氏の対話ビデオです。
Anders Hejlsberg 氏は、まぁ、ここを見ている人には説明不要でしょうw
Chris McConnell 氏は Desktop Search チームのアーキテクトだそうです。Channel9 の人が McConnell 氏に会ったときに 「Anders とはまだ会ったことがないんだよな。Desktop Search がらみで LINQ のこととかについて話してみたいな。あと、彼が Intentional Programing についてどう思ってるのかとか」 なんて話があって、「そこに Anders がいるから話そうよ。撮影するね」 となったみたいです。(軽いなw) TechEd のスピーカーラウンジで撮影されたものだそうです。

んが、聞き取れないなぁ。翻訳とは言わないから transcript が欲しいなぁ。