2014年アドベントメモ

何に参加しているかわからなくならないためのメモ

Xamarin Advent Calendar 2014 – Qiita
http://qiita.com/advent-calendar/2014/xamarin

  • 12/8 – Xamarin と F# で
  • 12/22 – Xamarin と AllJoyn で

F# Advent Calendar 2014 – connpass
http://connpass.com/event/9758/?utm_campaign=recent_events&utm_medium=atom&utm_source=feed

  • 12/14 – F# と Fortran で

XAML Advent Calendar 2014 – Qiita
http://qiita.com/advent-calendar/2014/xaml

  • 12/18 – XAML 動的ロードあたり

プロ生ちゃん Advent Calendar 2014 – Qiita
http://qiita.com/advent-calendar/2014/pronama-chan

  • 12/8 – プロ生ちゃん Hidden Object Game あたり

適当に入れたので、12/8 がダブっている…というか、F# のほうは大丈夫だけどプロ生は今週中に何か作らないと。

振り返り

担当分は書き終わったので追記しておきます。文章を書くのが仕事なので、文自体を書くのは苦ではないのですが、さすがにサンプルを作らないと駄目ですよねー、ってのが反省点。あと、何かと数を多めにしてしまったのは敗因です。どっちつかずなのが二つ出来てしまいました。

Xamarin + F# の話をいくつか | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6729

具体的に F# で PCL を作って、というのが良かったのですが、ざざっと指針を付けておくだけで断念。実は、次世代 One.NET になると PCL の地位が落ちることが分かっている(NuGet からプロジェクト的にライブラリをダウンロード)するので、PCL の制限は撤廃される感じなんですよ。それぞれのネイティブ環境に即したライブラリを NuGet からダウンロードして組み込む、という感じ。なので、F# の各種バージョンの差異と PCL 絡みでタイププロバイダでややこし話は少しは解消されるはずです。PCL の制限を外してしまえば、F# から UI を触るのも苦でなくなるはず。

Xamarin と AllJoyn の将来を考える | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6778

グローバルサミットで知った AllJoyn ですが、もう少し突っ込んでみたかったものの突っ込むほどライブラリを調べていない状態です。まだまだ日本での認がされてない(企業単位の参画があるので、それなりに認識はされているとは思うのですが)ので、ネットワークで連携をしておくときに既知となるべき情報だと思っています。「既知となるべき」というのは、ある意味で、AllJoyn を使わないという方法も含めるわけで、未知のものではあるけれど知っておいて、やっぱり他の手段(従来の手段)を取るってのもありです。Web API とか Push 通知をするときに手段として知っておくと良いかなと。とはいえ、モバイル機器からリモコン操作したりピアツーピア的に使うときに有効だと思っています。

F# から Fortarn の関数を呼び出そう | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6759
Let’s call Fortran DLL from F# language. | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6773

誰が使うんじゃ? F# から Fortran を…ってことを連呼していますが、実は英語圏の F#er な人に(一部)ウケが良くて、リクエストに応じて英文も書きました(ほぼ google 翻訳そのままだったりしますが)。仕事で構造計算を Fortran で書いて、F# で検算する、なんてことをやっている手前、DLL 経由で呼び出せるのだろうか?ってのが去年からの疑問です。と言いますが、このジョークネタは去年思いついてあえなく挫折したものです。ただし、いまだに科学計算の分野(ちょっと前までは OpenCV に Fotran のモジュールが入っていました)では、Fortran が強いので旧来の手続き型を関数型言語から呼び出せるメリットは結構大きいです。あと Intel Fortran はGPU の利用とかパラレル動作とかを有効にしているので、そのあたりも使えると F# には強みになるかも、と思ったり。

XAML は Microsoft だけのモノじゃないので、動的にロードできるよという話 | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6770

先月、Xamarin.Forms 絡みで XAML を調べていたときにわかったネタです。XAML とは何ぞや?というか、XAML の本質みたいなところですね。UI との組み合わせやデータ記述としての麺が強調されていますが(実用的にはそうなので)、実は、XML とオブジェクト自体のマッピング、プロパティへのバインディングが XAML の主な機能です。とはいえ、マッピング自体が実装依存のなってしまうために、WPF、ストアアプリ、Xamarin.Forms と実装がばらばらになってしまうのが難点です。ここんところ、System.Xaml で共通に扱えればよかったのですが、そこまで抽象化されてなかったのと、WinRT や PCL、Sliverlight あたりの OS 制限により、ばらばらになってしまったのが残念なところです。とはいえ、オブジェクトマッピングとプロパティバインディングだけの実装 XAML を作ってみたいところです。これは後で思考実験をしようかなと。

プロ生ちゃん Hidden Object ゲームを作ろう…の途中 | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6741

実は、内心一番力を入れたかったところなのですが、大風邪をひいて一番手が抜けてしまいました。いやいや、マスコットアプリもできなかったし、途中で RealSense の到着が挟まっていたりと、あれこれあったのですが、もっと先に作っておくべき代物でした。ただし、私の収穫としては、特徴量って同じ画像でも計算すると抽出結果が異なるんだ、ってことです。静止画だったらまったく同じ結果を得られるのだろう、と思い込んでいたんですよね。このランダム?さは特徴量の計算の手法に依存するのか(内部でランダム値を取り込んでいる)、特徴量抽出自体がランダム値に依存するのか、は後で調べないといけないところです。動画から物体抽出(オブジェクトトラッキング)のために特徴量を使うので毎フレーム異なるのは普通(WEB カメラ自体がノイズを含むので)なので、確率的にオブジェクトを捕えるのですが、静止画の場合はそれが非最適ではあっても一意になっているほうが都合が良いってのはありますよね。もちろん、JPEG圧縮等で含まれるノイズにマッチングする場合もあるのですが、圧縮によるノイズ自体は確定的なわけですから(たぶん、確定的だと思う)。ここを含めて、特徴量を以って、オブジェクト自体を機械の目から隠す、ってのをやってみたいのです。

そんなわけで、あれこれと中途半端になっていますが、ひとまず振り返りということで追記(2014/12/24)。

カテゴリー: 雑談 | 2014年アドベントメモ はコメントを受け付けていません

Xamarin.iOS+MvvmCross を VB で作る

これに「VB でも作れますよ」の返答をしたいだけに、Xamarin.iOS で VB を使ってみました。まあ、正確には、

  • ViewModel を VB の PCL で作る
  • フロントを Xamarin.iOS の C# で作る

訳で、アプリ全体を VB では作ってはいませんが。F# の場合、アプリ全体も作れるので、なんとか工夫すれば VB でも作れると思うのですが、View 部分をコードで書かないといけないし、結構面倒なことになるので、VB+C# のハイブリッド型ということです。Xamarin + Microsoft が C# 押しをしている(ように見えるのは)単一言語で同一の .NET Framework(One.NET)で使えるよ~、という意味で、入り口の取り方としては Java と似ているかなと。多様性という点では、C#/VB/F# と揃っていたほうがいいし、Visual Basic には C# の後追いじゃなくて初心の「初心者にも使える」を押してほしいなと思ったり。この話は別途書くつもり。

フロントエンドは C# のまま

Xamarin.iOS+MvvmCrossでstoryboardを使う方法(MvvmCross v3.2.2 対応) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6685

で作ったものを流用します。できれば、プロジェクトの参照設定だけを VB の PCL に変えればいいのですが、最初から作ったのでいくつか嵌りました(汗)。

storyboard ファイルを、C# のプロジェクトからコピーしたものの、Main Interface に設定するのを忘れていて、画面が真っ黒になってあれ?と悩んだり、

Xamarin.iOS が 64bit 化の過渡期なので、MvvmCross が monotouch を要求するので Xamarin.iOS と差し換えたりと。

さっくり 30 分で作って返答するつもりが、夜中に2時間ほどかかっていましたよ。

バックエンドを VB で作る

ViewModel を VB の PCL で作ります。Xamarin Studio では完結しないので、ここでは Visual Studio を使います。まあ、もともと Windows 版の Xamarin Studio では Xamarin.iOS の開発ができないので、Mac 上のものを使うのですが、このあたりは、適当に使い慣れたほうをベースにするのが良いかと。

Namespace ViewModels
    Public Interface ICaluculation
        Function TipAmount(subTotal As Double, generosity As Integer) As Double
    End Interface

    Public Class Calculation
        Implements ICaluculation

        Public Function TipAmount(subTotal As Double, generosity As Integer) As Double Implements ICaluculation.TipAmount
            Return subTotal * CType(generosity, Double) / 100.0
        End Function
    End Class

    Public Class TipViewModel
        Inherits MvxViewModel

        Private _calculation As ICaluculation
        Public Sub New()
            _calculation = New Calculation()
            Start()
        End Sub

        Public Overloads Sub Start()
            _subTotal = 100.0
            _generosity = 10
            Me.Recalcuate()
            MyBase.Start()
        End Sub

        Private _subTotal As Double
        Private _generosity As Integer
        Private _tip As Double

        Public Property SubTotal As Double
            Get
                Return _subTotal
            End Get
            Set(value As Double)
                _subTotal = value
                RaisePropertyChanged(Function() SubTotal)
                Recalcuate()
            End Set
        End Property

        Public Property Generosity As Integer
            Get
                Return _generosity
            End Get
            Set(value As Integer)
                _generosity = value
                RaisePropertyChanged(Function() Generosity)
                Recalcuate()
            End Set
        End Property

        Public Property Tip As Double
            Get
                Return _tip
            End Get
            Set(value As Double)
                _tip = value
                RaisePropertyChanged(Function() Tip)
            End Set
        End Property

        Private Sub Recalcuate()
            Tip = _calculation.TipAmount(SubTotal, Generosity)
        End Sub
    End Class
End Namespace

RaisePropertyChanged メソッドに引き渡すラムダ式の書き方をちょっと悩みますが、Function() SubTotal な感じ書きます。式木になるので、Function() … End Fuction ではダメなのですね。素直にプロパティ名を文字列で書いてもいいかもしれません。

例によって、App クラスの中身は空っぽです。

Public Class App
    Inherits MvxApplication
    Public Sub New()

    End Sub
End Class

実行する

iOS はこんな感じ

Android はこんな感じ

サンプルコード

MxSingleApp 内の MvxVB.* の類がそれです
https://github.com/moonmile/MxSingleApp

カテゴリー: VB, Xamarin | Xamarin.iOS+MvvmCross を VB で作る はコメントを受け付けていません

Xamarin.iOS(storybaord)+MvvmCross+Xamarin.Forms を混在させたアプリを作る

ちょうど Xamarin.iOS のアップデートがあって、Xamarin.iOS10 と monotouch が混乱している状態で苦労したのですが、一応動くところまでできたので記事を書いておきます。

目標

Xamarin.iOS(storyboard) と MvvmCross と Xamarin.Froms を混在させたアプリを作ります。単純に混在させるというよりも、アプリの歴史的な経緯から、

  1. Xamarin.iOS で storyboard で作っているアプリがあって、
  2. 去年あたりに MvvmCross を使って、MVVM 対応したアプリになって、
  3. 今年ぐらいから、Xamarin.Forms に対応したいけどどうしようか?

のようなストーリーを考えています。まあ、MVVM 対応するのは MvvmCross でもよいし、MvvmLight でも Prism でも良いわけですが、そこに Xamarin.Froms の XAML をどうねじ込むか、ってのが問題になりますよね。最初から、Xamarin.Forms で作り直してしまう方法もあるけど労力的に大変だし、そもそも Xamarin.Forms のコントロールは非力なので、そのまま移植できないパターンも多い。DepnencyService とか作ればいいけど、面倒だったら、もともと storyboard と Xamarin.iOS の組み合わせで数ページだけ作るのが簡単ではないか?というパターンです。

アプリの想定

こんな風に、Master-Detail で作っていたアプリに対して、MvvvmCross や Xamarin.Forms のページを追加していきます。

これによって、既存のページはそのままにして、新しいページを MvvmCross や Xamarin.Forms で作れればよいかなと。

プロジェクト構成

storyboard を含むのが、MvxXForms.UI.Touch プロジェクトで Detail ページ用にそれぞれのクラスを設定しています。Mater-Detail の Master がリストの場合は詳細ページは同じページを使うことが多いのですが、Mater が固定ページ(メニューページの代わり)に使っている場合には、項目をクリックしたときにそれぞれの詳細ページが表示されるので、こういう構成にしてあります。Master ページにボタンを並べて画面遷移する場合も似た感じになります。

Xamarin.iOS+storybardのみ場合

最初は、MvxXForms.UI.Touch プロジェクト のようなプロジェクトがあって、まだ MVVM 化されていない状態を考えます。

storyboard は、

– Navigation Controller
– Master ページ
– オレンジ色の Detail ページ

だけの状態になります。Master から Detail へ遷移させる場合は、

Creating an Unwind Segue | Xamarin
http://developer.xamarin.com/recipes/ios/general/storyboard/unwind_segue/

な感じで Ctrl キーを押しながらマウスのドラッグで線が引けます。
サンプルコードでは、RowSelected 内でデータを引き渡すために小細工をしていますが、storyboard segue を使えば画面遷移だけならばノンコーディングでいけます。

MvvmCross のページを追加する

MVVM 化するために、MvxXForms.Core プロジェクトを追加します。ViewModel 自体は、先の MvxXForms.UI.Touch に追加してしまってもよいのですが、先行き Android と共有させることを考えて PCL プロジェクトで作っておきます。

int と string を持つ TipViewModel クラスを定義して、

public class TipViewModel : MvxViewModel
{
	public TipViewModel()
	{
	}

	int _pageNum;
	public int PageNum
	{
		get { return _pageNum; }
		set { _pageNum = value; RaisePropertyChanged(() => PageNum); }
	}
	string _Name;
	public string Name
	{
		get { return _Name; }
		set { _Name = value; RaisePropertyChanged(() => Name); }
	}
}

中身が空っぽな App クラスを作っておきます。App クラスを MvxXForms.UI.Touch プロジェクトから参照しなければよいのですが、まあ、これは初期化のためのお約束コードということで。

public class App : MvxApplication
{
	public App()
	{
	}
}

MvxXForms.UI.Touch プロジェクトに戻って、UIApplicationDelegate を MvxApplicationDelegate に変更。
FinishedLaunching メソッドをオーバーライドして、MvvmCross の初期化を行います。

public partial class AppDelegate : MvxApplicationDelegate
{
	// class-level declarations

	public override UIWindow Window
	{
		get;
		set;
	}

	public override bool FinishedLaunching(UIApplication app, NSDictionary options)
	{
		var presenter = new MvxTouchViewPresenter(this, Window);
		var setup = new Setup(this, presenter);
		setup.Initialize();
		return true;
	}
}

あとは、Detail ページに対応する ViewController を MvxViewController から継承させて、set.Bind 等でバインドを行えば ok です。

public partial class Detail2ViewController : MvxViewController
{
	public Detail2ViewController(IntPtr handle)
		: base(handle)
	{
	}

	public new TipViewModel ViewModel
	{
		get { return (TipViewModel)base.ViewModel; }
		set { base.ViewModel = value; }
	}

	public override void DidReceiveMemoryWarning()
	{
		// Releases the view if it doesn't have a superview.
		base.DidReceiveMemoryWarning();

		// Release any cached data, images, etc that aren't in use.
	}

	public override void ViewDidLoad()
	{
		this.Request = new MvxViewModelRequest(typeof(TipViewModel), null, null, new MvxRequestedBy());
		base.ViewDidLoad();
		// Perform any additional setup after loading the view, typically from a nib.
		var set = this.CreateBindingSet<Detail2ViewController, TipViewModel>();
		set.Bind(labelPageNum).To(vm => vm.PageNum);
		set.Bind(labelName).To(vm => vm.Name);
		set.Apply();

		// マスターからのデータ引き渡し
		this.ViewModel = MasterViewController._datavm;
	}
}

storyboard の Detail ページと Detail2ViewController の結び付けは、プロパティウィンドウで Class を変更します。このあたりは Xcode と同じですね。

MasterViewController._datavm なところは、storyboard segue を使うと、内部的に一気に ViewController が作られてまうので、ViewModel プロパティを設定するタイミングがないため、こうやっています。Master ページで Cell をクリックしたときに、下記な方法でグローバル変数で渡します。ちょっとダサいんですが、仕方がありません。

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
	var data = new MyData();
	switch ( indexPath.Row )
	{
...
		case 1:
			/// MvvmCross を使って vm 経由でデータを渡す
			/// 本来は data 経由のほうがいいけど、これはサンプルで
			/// あらかじめ storyboard segue でつなげておく
			_datavm = new TipViewModel()
			{
				PageNum = 2,
				Name = "use MvvmCross"
			};
			break;
...
}

storyboard segue を使わずに画面遷移をする

じゃあ、明示的に遷移先の ViewController を作って ViewModel を設定する方法でもよいだろう、というのが次の方法です。
目的の ViewController の「storyboard id」に、あらかじめ「Detail3ViewController」という名前を付けておいて(これはクラス名と異なっていても構いません)、Storyboard.InstantiateViewController メソッドで作成します。これを、NavigationController.ShowViewController メソッドで表示すれば ok です。

/// <summary>
/// 行をクリックしたとき
/// </summary>
/// <param name=&quot;tableView&quot;></param>
/// <param name=&quot;indexPath&quot;></param>
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
	var data = new MyData();
	switch ( indexPath.Row )
	{
...
		case 2:
            /// storyboard のページを直接開く
			/// Storyboard ID を ViewController に設定しておく
			/// storyboard segue を使わないパターン
			var vc = (Detail3ViewController)Storyboard.InstantiateViewController(&quot;Detail3ViewController&quot;);
			this.NavigationController.ShowViewController(vc, this);
			_datavm2 = new TipViewModel2()
			{
				PageNum = 3,
				Name = &quot;Mvx + direct storyboard&quot;
			};
			break;

遷移先の ViewController を MvxViewController を継承するようにして、ViewModel に対応させてもそのまま使えます。
ちょっと注意しなければいけないのは、MvvmCross では ViewModel と ViewController が 1対1 じゃないと駄目なようです。実行時に TipViewModel が二つ以上の ViewController に設定されている、とエラーがでます。なので、仕方がないので TipViewModel2 という同じ中身のクラス(継承しているだけ)を使っているのですが。同じ ViewModel を複数の View に対応しても良いと思うのですが、ちょっとこの動きはよくわかりません。

Xamrin.Forms のページを呼び出す

Xamarin.Forms の XAML ページを Master ページから呼び出せるようにします。
MvxXForms.Form プロジェクトを別に作っていますが、たぶん、MvxXForms.UI.Touch に含ませてしまっても大丈夫だと思います。

DetailXFPage.xaml の中身を手書きします(Xamarin Studio を使うと、少しだけコード補完が効いて楽です)。

<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?>
<ContentPage xmlns=&quot;http://xamarin.com/schemas/2014/forms&quot;
					   xmlns:x=&quot;http://schemas.microsoft.com/winfx/2009/xaml&quot;
					   x:Class=&quot;MvxXForms.Form.DetailXFPage&quot;
					   Title=&quot;xamarin.forms page&quot;
					   BackgroundColor=&quot;Yellow&quot;
					   >
  <StackLayout Padding=&quot;10,80,10,10&quot;>
    <Label x:Name=&quot;label1&quot; Text=&quot;Xamarin.Forms page&quot;  />
    <Label Text=&quot;PageNum&quot; />
    <Label Text=&quot;{Binding PageNum, StringFormat='{0}'}&quot; BackgroundColor=&quot;Lime&quot; />
    <Label Text=&quot;Name&quot; />
    <Label Text=&quot;{Binding Name}&quot;  BackgroundColor=&quot;Lime&quot;/>
  </StackLayout>
</ContentPage>

Binding が XAML の中に記述できます。

Xamarin.Forms のプロジェクトでも App クラスがあるのですが、これは GetMainPage メソッドのように PCL プロジェクト内で作成した Page オブジェクトを返すための static メソッドです。なので、同じように、DetailXFPage を new して返すだけのメソッドを作っておきます。

public class App
{
	public static Page GetDetailPage()
	{
		return new DetailXFPage();
	}
}

Xamarin.Forms のページを呼び出すときは、先の storyboard segue を使わない方法と同じように、NavigationController.ShowViewController メソッドを使います。

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
	var data = new MyData();
	switch ( indexPath.Row )
	{
...
		case 3:
			// Xamarin.Forms ページを開く
			var page = MvxXForms.Form.App.GetDetailPage();
			var vc2 = page.CreateViewController();
			var vm = new TipViewModel()
			{
				PageNum = 4,
				Name = "xamarin froms page"
			};
			page.BindingContext = vm;
			this.NavigationController.ShowViewController(vc2, this);
			break;

ContentPage の BindingContext プロパティに ViewModel のデータを設定すればバインドが完了します。

Xamarin.Forms の初期化のために、AppDelegate クラスに Forms.Init() を追加しておきます。
これで、Xamarin.Forms と MvvmCross が混在できます。

public partial class AppDelegate : MvxApplicationDelegate
{
	// class-level declarations

	public override UIWindow Window
	{
		get;
		set;
	}

	public override bool FinishedLaunching(UIApplication app, NSDictionary options)
	{
		Forms.Init();
		var presenter = new MvxTouchViewPresenter(this, Window);
		var setup = new Setup(this, presenter);
		setup.Initialize();
		return true;
	}
}

実行してみる

こんな風に、Master のページから各種のページに遷移ができます。

サンプルコード

MxSingleApp の中の MixMvxForms
https://github.com/moonmile/MxSingleApp

参考先

Xamarin.iOS ナビゲーションコントローラ – SIN@SAPPOROWORKSの覚書
http://furuya02.hatenablog.com/entry/2014/07/03/035352
Xamarin.iOSでStoryboardとXamarin.Formsを併用するには? – Build Insider
http://www.buildinsider.net/mobile/xamarintips/0006

カテゴリー: C#, Xamarin, iOS | Xamarin.iOS(storybaord)+MvvmCross+Xamarin.Forms を混在させたアプリを作る はコメントを受け付けていません

C# の Dictionary と F# の map

ちょっと気になったのでメモ書き

C# の Dictonary は referencesource/mscorlib/system/collections/generic/dictionary.cs にあって、buckets[hashCode % buckets.Length] な形でハッシュ値で計算。

F# の map は fsharp/src/fsharp/FSharp.Core/map.fs にあって、comparer を使って二分木

ちなみに C# の SortedDictionary は referencesource/System/compmod/system/collections/generic/sorteddictionary.cs にあって、TreeSet<KeyValuePair<TKey, TValue>> な二分木で計算。

ReadOnlyDictonary ってのもある。 ここ にソースがあるので見ると、dictonary を渡しているだけなので、中身は一緒。追加用のメソッドがないだけ。同じように ReadOnlyCollection があるけど、内部的には IList と同じ。なので、非同期に特化しているとか、分散されているとか、という訳ではないらしい。逆に言えば、初期化するときに分散に特化させたリストを渡せば、表面上は ReadOnlyCollection として扱える。Add メソッドなどを呼び出すと、実行時にエラーが発生する(メソッド自体をなくしてしまって、コンパイル時にエラーにする、ってのでもいいかもしれない)。

 

 

カテゴリー: 開発 | C# の Dictionary と F# の map はコメントを受け付けていません

Xamarin.iOS+MvvmCrossでstoryboardを使う方法(MvvmCross v3.2.2 対応)

Xamarin.iOS+MvvmCrossでstoryboardを使う方法 | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5814

以前、書いたのですが、バージョンが上がって微妙に動きが異なっているので、メモ書きしておきます。
サンプルコードは http://1drv.ms/1CeHWYp からダウンロードができます。

MvvmCross のサンプルコードを storyboard 対応にする

Tip Calc The Core Project
https://github.com/MvvmCross/MvvmCross/wiki/Tip-Calc—The-Core-Project
Tip Calc A Xamarin.iOS UI project ・ MvvmCross/MvvmCross Wiki
https://github.com/MvvmCross/MvvmCross/wiki/Tip-Calc-A-Xamarin.iOS-UI-project

TipCalc.Core の中身

ViewModel は MvxViewModel クラスを継承して作ります。ここのバインドは、INotiryPropertyChanged を実装していればよいので、何で作っても良いはずです。
プロパティの変更時に、RaisePropertyChanged で変更通知をします。

public class TipViewModel : MvxViewModel
{
	private readonly ICalculation _calculation;
	public TipViewModel(ICalculation calculation)
	{
		_calculation = calculation;
	}

	public override void Start()
	{
		_subTotal = 100;
		_generosity = 10;
		Recalcuate();
		base.Start();
	}

	private double _subTotal;

	public double SubTotal
	{
		get { return _subTotal; }
		set { _subTotal = value; RaisePropertyChanged(() => SubTotal); Recalcuate(); }
	}

App.cs の中身は、空っぽでも動きます…と思ったけど、Calculation のインスタンスだけ作らないとダメです。この部分は、Calc 部分を ICalc で作っているので、こうなっているので、特に作らなければ App() の中身は空でも大丈夫です。

public App()
{
	Mvx.RegisterType<ICalculation, Calculation>();
	// Mvx.RegisterSingleton<IMvxAppStart>(new MvxAppStart<TipViewModel>());
}

RegisterSingleton を使うとシングルトンで作られてしまい、都合が悪いことが多いので、UI プロジェクトのほうで作ります。

TipCalc.UI.Touch の中身

Setup.cs の中身はほとんど空っぽです。

public class Setup : MvxTouchSetup
{
	public Setup(MvxApplicationDelegate appDelegate, IMvxTouchViewPresenter presenter)
		: base(appDelegate, presenter)
	{
	}

	protected override Cirrious.MvvmCross.ViewModels.IMvxApplication CreateApp()
	{
		return new App();
	}
}

AppDelegate.cs の中身は、Window プロパティを残して、FinishedLaunching だけオーバーライドします。
内部で window を作っているサンプルコードもあるのですが、別のところから Window プロパティを参照することができるので、元の状態で残したほうがベターです。
以前と違って、Setup の引数が変わっているので、MvxTouchViewPresenter オブジェクトを作って引き渡します。
まあ、Setup 自体を変えてしまってもいいのですが。

 [Register("AppDelegate")]
public partial class AppDelegate : MvxApplicationDelegate
{
	// class-level declarations
	public override UIWindow Window
	{
		get;
		set;
	}

	public override bool FinishedLaunching(UIApplication app, NSDictionary options)
	{
		var presenter = new MvxTouchViewPresenter(this, Window);
		var setup = new Setup(this, presenter);
		setup.Initialize();
		return true;
	}
}

TipCalc.UI.TouchViewController.cs の ViewModel は、MvxViewController を継承するように変更して、ViewDidLoad メソッドの中身だけ変更します。
base.ViewDidLoad で元のメソッドを呼び出す前に、MvxViewModelRequest オブジェクトを作らないといけません。この引数が変更になっていて、ViewModel のクラス名(ここでは TipViewModel )を渡します。

CreateBindingSet は拡張メソッドなので、
using Cirrious.MvvmCross.Binding.BindingContext;
することを忘れずに…いつもあれ?ってなるので。

public partial class TipCalcUITouchViewController : MvxViewController
{
	public TipCalcUITouchViewController(IntPtr handle)
		: base(handle)
	{
	}

	public new TipViewModel ViewModel
	{
		get { return (TipViewModel)base.ViewModel; }
		set { base.ViewModel = value; }
	}

	public override void ViewDidLoad()
	{
		this.Request = new MvxViewModelRequest(typeof(TipViewModel), null, null, new MvxRequestedBy());
		base.ViewDidLoad();
		// Perform any additional setup after loading the view, typically from a nib.
		var set = this.CreateBindingSet<TipCalcUITouchViewController, TipViewModel>();
		set.Bind(labelTip).To(vm => vm.Tip);
		set.Bind(textSubTotal).To(vm => vm.SubTotal);
		set.Bind(sliderGene).To(vm => vm.Generosity);
		set.Apply();
	}
}

Bind でコントロールを指定して、To で ViewModel のプロパティと結びつけます。いわゆる Binding の Path は .For( c => c.Text) で明示的に指定もできますが省略可能です(デフォルトプロパティを内部で持っていると思われる)。

実行結果

こんな風にスライダーを動かすと、ラベルの数値が変化します。

20141126_02

サンプルコード

サンプルはこちら
http://1drv.ms/1CeHWYp

カテゴリー: Xamarin, iOS | Xamarin.iOS+MvvmCrossでstoryboardを使う方法(MvvmCross v3.2.2 対応) はコメントを受け付けていません

Xamarin.Forms の話ともうちょっと突っ込んだ話…のメモ書き

第2回 Japan Xamarin User Group Conference 東日本編 : ATND
https://atnd.org/events/57246/

で 50分ほど頂いたので、Xamarin.Forms の概要ともうちょっと突っ込んだ話をします。

当日、聴衆の様子を見てから判断しますが、Xamarin.Forms の概要は、概要は Xamarin のホームページにあるし、日本語の情報もちらちらと揃っているので「概要」だけ聞かされても面白くない、って方が多い(私もその一人)と思われるので、

  • Xamarin.Forms のざっと概要を 15 分程度
  • カスタムコントロールを作る話を残りの時間で

ってことを考えます。カスタムコントロールは、いくつか方法があって、その中で 3 つの方法を紹介します。

  • 既存のコントロールを継承して、Xamarin.Forms 内で完結する方法
  • ネイティブ環境(iOS/Android)を使うために DependencyService を使う方法
  • カスタムレンダラーを使って、ネイティブ環境(iOS/Android)で描画させる方法

これも、それぞれについては Xamarin サイトや日本語の解説ページがあるのですが、ひとまとめに書いているものが無いのと、それぞれのサンプルが実用的すぎて難しい(!)ので、簡単なサンプルで比較します。

それぞれの解説自体は、本家 Xamarin のドキュメント(英語だけど)に載っている。

日本語のサンプルもある。

この他に考えられるカスタムコントロールとしては、

  • Xamarin.Forms.Labs を使う(ライブラリを買うとパターン)
  • リフレクションを使う(DependencyService と同じだが、インターフェースを定義しない)

ぐらいでしょうか。Xamarin.Forms 用のコントロールもいくつかあるので、それを購入するという方法もある。

話の流れ

  • Xamarin.iOS, Xamarin.Android で、ネイティブな環境のアプリを C#(.NET)で作れる。
  • UIが別(storyboard, axml)だったので、共通で使える Xamarin.Forms が現れる。
  • Xamarin.Forms のベースは XAML になる。
    • XAML の規格は Microsoft が公開していて、自由に作れる。
    • x:Class, x:Name などが決められている。
    • Microsoft の WPF/Sliverlight などの XAML と互換ではないが…いくつか互換がある。
    • iOS, Android, Windows Phone(Silverlight) の共通のコントロールが用意されている。
    • データバインドが使える。MS-XAML に規定されている {Binding …}
    • ドット付の名前 Grid.Row などが使える。これも MS-XAML に規定されている。
    • PLC あるは Shared プロジェクトとして作り、UI を共有する。
  • ベースコンテナで ContentPage などがある。
    • Grid、StackLayout のように MS-XAML と互換がある。
  • Xa-XAML は、XAML を解釈したのちに、それぞれの環境のコントロールにレンダリングする。
    • MS-XAML は、直接オブジェクトに変換される、という違いがある。
    • これは WPF, Silverlight, WinStore-XAML, WP-Xaml とそれぞれ違う
  • が、表面上は一緒なので、Xamarin.Forms も MS-XAML と同様に扱える。
  • 大抵は StackLayout と Grid を使いこなすと良い。
  • それぞれのプラットフォームの最大公約数なので、プラットフォーム特有の機能がない。
    • タップイベントやドラッグがないのが辛いところ。
  • 独自のコントロールや、機種ごとの機能を使うことができる。
    • 独自コントロールは、MS-XAML のユーザコントロールと似たように、既存のコントロールを組み合わせられる
      • ContentPage を継承した例が多いが、View を継承しても作ることができる。
      • xmlns:local=”clr-namespace=…” を使って、独自アセンブリをロードする
      • <local:CustomButton…> のように書く。
        • が、StackLayout の最後に計算されるという Bug ? がある。
    • DependencyService を使って、プラットフォーム毎の機能を使う。
      • 要するに intarface を利用した委譲パターン(Listenパターン?)
      • インターフェースを PCL 側に定義する
      • 内部動作を iOS/Android 側で実装する。
        • [assembly: Dependency … ] を定義する
      • DependencyService.Get<…> で呼び出す。
        • 実装がないときは null になる(コードを変えなくて良い利点がある)。
      • このテクニックは、共通処理を PCL で書き、それぞれの動作をプラットフォーム毎に書くパターンと同じなので、UI だけでなく普通の処理にも使える(機種番号を拾うとか、独自のフォルダアクセスとか)
    • カスタムレンダラを使う
      • 独自コントロールの内部動作だけ、プラットフォームに依存させる。
      • PCL に既存コントロールを継承したクラスを作る。
      • 実行時のレンダリングを、iOS/Android で OnElementChanged として書く。
        • たとえば Entry コントロールの場合は、レンダリング用の  EntryRenderer が定義されている。
        • ASP.NET のユーザコントロールの作り方に似ている。
        • ネイティブコントロール(iOS/Android)を自由に扱える。
  • 使い分ける
    • 共通画面や共通部品は、Xamarin.Forms の基本コントロールをまとめて扱う。
      • 独自のプロパティを作って、データバインディングすると再利用性が高まる。
      • XAML, コードのコピペではなく、ライブラリとして提供できる。
    • DependencyService は、ピンポイントで機種依存の機能を使う。
      • 共通のインターフェースを必要とするが、自分で定義できる。
      • PLC 内では Device で分岐させることも可能
        • ただし、iOS, Android, WP Silverlight 限定になるが… Device クラスを独自に作ることも可能。
    • UI がある場合は、カスタムレンダラを使う。
      • 応用範囲が広い
      • 必ず、Xamarin.Forms のコントロールを継承する必要あり? Renderer なので。
      • OnElementChanged 内で、マウスイベントを取ることも可能?
        • グラフィック表示
        • マウスイベントの取得
        • アニメーション処理
      • 機種ごとに、Xamarin.iOS/Android が使える。

これに図を加える。

カテゴリー: Xamarin | Xamarin.Forms の話ともうちょっと突っ込んだ話…のメモ書き はコメントを受け付けていません

Visual Studio 2013 + Hyper-V で Xamarin.Android を動かそう

Visual Studio 2015 preview を使って Hyper-V で Xamarin.Android を動かそう | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/6648

では、Visual Studio 2015 preview で Hyper-V の Android エミュレータを動かす方法を紹介しましたが、もう少し頑張ると現状の Visual Stuido 2013 からも Android エミュレータを動かすことができます。

注)動かせるのは動かせるのですが、Visual Studio からデバッグモードで動かすことはできなくて、何故か Release モードでデプロイした後に、エミュレータ上でアプリを起動できる、ってところまでです。デバッグ時に「Couldn’t connect to logcat, GetProcessId returned: 0」が出てデバッグ用のコネクションが接続しないのですが、アプリのデプロイは成功している状態になりました。

Visual Studio 2015 Preview をインストールする

Preview 版自体をインストールしない方法を模索してはいるのですが、ちょっと無理そう。ただし、Preview 版であっても 2013 と同居ができるので、この方法を使います(たぶん、2010 や 2012 が入っている状態でも同じだと思います)。

Visual Studio 2015 Downloads
http://www.visualstudio.com/downloads/visual-studio-2015-downloads-vs

  1. 実機 PC に Visual Studio 2015 preview をインストールする。
  2. 実機 PC の Hyper-V を有効にする。
  3. 最初の Xamarin Android プロジェクトを作って、リンク先から XamarinInstaller-VS2015 をダウンロード&インストールする。
  4. Visual Studio 2013 の拡張機能を 2015 へコピーする
    C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Xamarin\ を
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common\IDE\Extensions\ にコピーする。インストーラが Visual Studio 2013 のほうにしか拡張機能をコピーしないためです)
  5. C:\Program Files (x86)\NuGet\Visual Studio 2015\NuGet.Tools.vsix を実行して拡張機能を有効にする。
  6. Bussiness アカウントでログインをして、Xamarin Update で Statble に戻す。
  7. Statable に戻すときに、何故か元に戻しすぎてログインができない状態までになるが、慌てずに xamarin.com から XamarinInstaller をダウンロードして、再インストールすれば回復します。
  8. 2015 あるいは 2013 で Xamarin.Forms のプロジェクト( Mobile Apps )を作成する。
  9. Debug 実行をして、一旦、Hyper-V に VS Emulator Android – Phone を作成する。
  10. Debug 実行のままだと、Connect エラーが出るので、一度だけ Release モードで実行する。そうすると、デバッグ用のコネクション( GetProcessId が取れるようになる)が確立されて、以後は Debug モードでも実行できるようになる。

ここまでやると、Visual Studio 2013/2015 で Xamarin.Forms を使ってアプリを作ることができます。

お次は Xamarin.Android でもビルドできるように C:Program Files (x86)MSBuildXamarinAndroidXamarin.Android.Common.targets を修正します。

<Target Name=&quot;_ConvertDebuggingFiles&quot;
	Inputs=&quot;$(OutDir)$(TargetFileName);$(_IntermediatePdbFile)&quot;
	Outputs=&quot;$(OutDir)$(TargetFileName).mdb&quot; 
	DependsOnTargets=&quot;_ValidateAndroidPackageProperties&quot;>
	<ConvertDebuggingFiles InputFiles=&quot;$(OutDir)$(TargetFileName)&quot; />
<!--	<Touch Files=&quot;$(OutDir)$(TargetFileName).mdb&quot; />  -->
</Target>

デバッグ用の *.mdb ファイルを探してエラーになっているので、これをコメントアウトします。ファイルはメモ帳などを管理者モードで起動して編集してください(Visual Studio 自体を管理者モードで起動しても ok です)

この状態で、VS 2015 からエミュレータを起動して、VS 2013 を開くと、Target Android Deveice のに Hyper-V のエミュレータが現れます。

image

Debug モードでビルドをすると、デプロイ&デバッグコネクションのエラーになりますが、Release モードにすると正常にデプロイが完了します。ただし、残念なことにデバッグ状態では起動できないので、便利なブレークポイントなどの機能が使えません。まあ、そういう場合は Xamarin Android Player を使うということでよいでしょう。

あと、Hyper-V の Android Emulator は v4.4 が入っているので Xamarin.Android プロジェクトの設定を合わせておきます。

image

それと、Android Options > Advanced を開いてサポートする CPU に x86 を含めてください。Java のサイズとかはいつも通りに設定します(設定しなくても普通は動きます)。

image

単独で VS Emulator Android – Phone を起動する

これで Visual Studio 2013 から Hyper-V の Android Emulator を起動することはできたのですが、最初の起動を 2015 から行わなければいけないというのも変です。なので、単独で Emulator が起動できるようにしましょう。

image

WP8 のエミュレーターを単体起動するためのショートカット – 高橋 忍のブログ – Site Home – MSDN Blogs
http://blogs.msdn.com/b/shintak/archive/2012/11/06/10366015.aspx

実は、Windows Phone のエミュレータを起動する方法と同じです。VS Emulator Android は、

C:\Program Files (x86)\Microsoft Visual Studio Emulator for Android\1.0\XDE.exe

にあるので、実行ファイルを差し換えればよいでしょう。ヘルプ自体は xed.exe /? にすると表示ができます。

[Window Title]
Visual Studio Emulator for Android

[Content]
Emulator version 1.0.41108.1

Usage:
xde [/name vmname] [/vhd vhdpath] [/memsize sizeMB] [/com[1|2] pipeName] [/createDiffDisk diffVhd] [/language lcid] [/video widthXheight] [/diagonalSize screenSize] [/showName] [/noStart] [/snapshot] [/displayName text] [/fastShutdown] [/noALS] [/noFFC] [/noGyro] [/noMag] [/noNFC] [/softButtons] [/camera capability] [/?]

/name vmname: The name of the virtual machine. If you do not provide a name, the default ‘Default Emulator’ is used.

/vhd vhdpath: The path to the VHD for the virtual machine (required if the virtual machine does not exist).

/memsize sizeMB: The amount of RAM in MB that the virtual machine should use. Default: 512

/com[1|2] pipeName: The named pipe that the host uses to communicate with serial ports on the virtual machine.

/createDiffDisk diffVhd: Creates a differencing disk, using the path specified by /vhd as the base. The virtual machine uses diffVhd for its VHD.

/language lcid: The hex language ID to use for the emulator. This ID applies only to the host-side emulator application and not to the guest. Example: /language 040c

/bootlanguage lcid: The hex language ID to use for the emulator. This ID applies only to the guest-side OS and not to the host-side emulator application. Example: /bootlanguage 040c

/video widthXHeight: The initial screen resolution of the emulator application. Example: /video 640×800. Default: 480×800

/diagonalSize screenSize: Specifies the diagonal screen size for the emulator (in inches).

/showName: Displays the name of the virtual machine on the emulator chrome.

/noStart: Exits the program without showing the emulator (after creating or modifying the virtual machine).

/snapshot: Tries to boot to the default snapshot, or create a new snapshot if no snapshots are found.

/displayName text: The text to use for the application window and task bar icon.

/fastShutdown: Turns off the virtual machine without waiting for the OS to gracefully shutdown.

/noALS: Disables the Ambient light sensor.

/noFFC: Disables the Front facing camera.

/noGyro: Disables the Gyroscope.

/noMag: Disables the Magnetometer.

/noNFC: Disables the NFC sensor.

/softButtons: Enables the software buttons. (Not valid for all resolutions.)

/camera capability: Switches the camera to the specified capability mode. Valid capabilities: WP8

/?: Displays this help dialog.

私の環境では、/vhd と /video だけ指定すると動くので、/createDiffDisk しなくても良いかもしれません。

“C:\Program Files (x86)\Microsoft Visual Studio Emulator for Android\1.0\
XDE.exe” /vhd “D:vmVS Emulator Android – PhoneVirtual Hard Disksvsemulator.
phone.android.vhd” /video 480×800

な感じのバッチファイルを動かして起動させます。

image

/video の指定値は C:\Program Files (x86)\Microsoft Visual Studio Emulator for Android\1.0\skins にあるスキンのサイズに合わせれば大丈夫なはずです。それ以外は対応してないと思います。いくつか適当な値を入れてもエラーになってしまうので。

後は、Visual Studio 2013 からデプロイ先を指定すれば ok です。

カテゴリー: Xamarin | Visual Studio 2013 + Hyper-V で Xamarin.Android を動かそう はコメントを受け付けていません

Visual Studio 2015 preview を使って Hyper-V で Xamarin.Android を動かそう

現時点(2014/11/14)で Visual Studio 2015 はプレビュー版だし、Xamarin.Android はアルファ版を入れないとうまく行きそうにないので、うまくいかなくても仕方がないのですが…色々地雷があるので、回避方法(回復方法)をいくつか記録しておきます。

Visual Studio 2015 Preview の発表と共に Android のエミュレーターが Hyper-V 上で動くことが Connect(); で発表された(実演されている)のですが、結構限られた環境でないと動かなさそうな感じです。結論から言えば、私の環境では動いておりません…でしたが、Xamarin.Forms ならば動くことができました。

Visual Studio 2015 Preview をダウンロードする

Visual Studio 2015 Downloads
http://www.visualstudio.com/downloads/visual-studio-2015-downloads-vs

上記からダウンロードができます。まだプレビュー版なので、Hyper-V なり VMWare なりの仮想環境で試したほうがいいのですが、Android エミュレータ自体が Hyper-V で動作しているために、Hyper-V の中で Hyper-V を動かすことはできない/できなかった、ので実機 PC にインストールします。手元の環境では Visual Studio 2013 が入っている上に上書きをしたのですが、これはこれで嵌ります。ちなみに Visual Studio 14 TP が入っていると 2015 をインストールできないので、14 のほうはアンインストールします。

Xamarin.Android を入れる

Hyper-V で動く Android は Visual Studio からしか起動できません。Xamarin Studio からは従来通りの Andorid エミュレータか、Xamarin Android Player を使います。動かしてみるとわかるのですが、Hyper-V 版も Xamarin Android Player 版も速度はあまり変わりません。ただし、Windows Phone のエミュレート環境が Hyper-V であることと、Xamarin Android Player はリモートデスクトップ先では使えない(OpenGLが対応していない)ことが、Hyper-V 版を使ったほうが良い理由になります。

下記は、すでに Xamarin.Android をインストール済みなので、いくつかのテンプレートが表示されていますが、最初はひとつのテンプレートしかありません。

image

そのテンプレートを開くと Xamarin のページに誘導されます。田淵さんのブログにもありますが、Visual Studio で Xamarin.Android 開発を行うときは Bussiness ライセンス以上が必要になります。なので、プレビュー版であっても相当のお金を払っていないと試せないので、結構制限がきついかと。

こんなページが Visual Studio に出てくるので、Download Xamarin をクリックして指定ページに飛びます。

image

左の「Tell us a bit about yourself」に、名前やメールアドレス等を入れて XamarinInstaller-VS2015 をダウンロードします。ちなみに、ライセンスを持っている場合でも(Sign Inしている場合でも)、ここのリンクからダウンロードしなければいけません。

image

Xamarin.Android Update のアルファ版から入れられそうな気もするのですが、うまくいきませんでした。

ビルド時に MergeApkRecipelists なエラーが出る

これで 2013 と同じようにビルドができて Android アプリが作れるかと思い気や、いきなりビルドができなくてこけます。ブランクアプリを作ってもエラーが出るので、はっきり言って設定ミスです。

image

回避策としては、 下記にあるように、C++ のプロジェクトを作って参照設定させるとビルドが通るのですが、実はその後のデプロイに失敗するので意味がありません。

c# 6.0 – Getting Build Error Creating Android Application using Xamarin Extension for Visual Studio 2015 Preview – Stack Overflow
http://stackoverflow.com/questions/26902711/getting-build-error-creating-android-application-using-xamarin-extension-for-vis

どうやら、C++ ネイティブライブラリを必ず読み込むような設定にしてしまっているようです。これは早急に修正されるでしょう。ビルドしたものをデプロイしようとすると JNI のロードでエラーになります。そもそも、C# ライブラリだけを入れたいので、C++ は余計なだけだし、何故か思い余って Visual Studio 2013 に入っている Xamarin.Android にも影響を与えてしまうという悲惨な状態です。

image

解決策としては、Stable に設定し直してください、ってのが正解です。2013 のほうの Hyper-V でのエミュレータは使えなくなりますが、2015 preview のほうかは使えます(使えるといっても、エミュレータを起動できる、という状態なのですが)。

Stable に戻しても、2015 では Android アプリがビルドできない

実は Stable に戻した状態でも、2015 preview では Android アプリがビルドできません。

image

やっぱり、App5.dll.mdb とあるように、C++ のデバッグ情報を書き込もうとして失敗しています。なんだかなーという感じですが、native android はビルドできませんでした。

じゃあ、2015 preview では絶望的なのかといえば、そうではありません。Xamarin.Forms を使うアプリだとビルドができるんですよ。内部的にどうなっているのかわかりませんが(おそらく *.targets を直せばいいんですが)、Xamarin.Forms 用のプロジェクトを作るとビルドが通ります。

VS Emulator Android Phone にデプロイができない

ビルドが正常にできて、いざ Hyper-V 上で動かそうと思うと、一見うまく行きそうに見えますが…ダメです。

image

Hyper-V にインストールされた Android が起動はされるのですが、次のように Connect エラーになります。おそらく adb が Hyper-V 上の Android に接続しようとして失敗していると思うのですが、解決法がわかりません。以前、Android エミュレーターを動かしたときに、何度か遭遇しているネットワークエラーっぽいものなのですがね。

image

ちなみに、従来の Android エミュレータや Xamarin Android Player だと正常に動きます。なので、Hyper-V を使わない、かつ Xamarin.Forms に限定する、のであれば 2015 preview の状態で使えるのですが…いや、素直に 2013 に戻って開発したほうがよさそうです。

Visual Studio 2013 と共存していると拡張機能が 2015 preview に入らない

ここまで、さっくりと 2015 preview に Xamarin.Android がインストールできたように書いていますが、実は、2013 が入っている PC に 2015 Preview を入れると、拡張機能が 2015 のほうに入りません。

こんな感じに Xamarin Account のメニューが出るハズなのですが、最初はでなくて苦労しました。

image

以前、2010, 2012, 2013 が同居している環境でも同じことが起こっていましたが、

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Xamarin\

のフォルダにある拡張機能を Microsoft Visual Studio 14.0 にコピーします。3.9.41.0 のフォルダが、Hyper-V 込みなのですが、すべてコピーしてしまって大丈夫です。

コピーした後は念のために
C:\Program Files (x86)\NuGet\Visual Studio 2015\NuGet.Tools.vsix

を実行しておいてください。拡張機能の状態が更新されて、Xamarin Account の表示が出てきます。

2015 preview + android + Hyper-V は地雷が多い

そんな訳で現時点では、この組み合わせは地雷満載です。地雷を踏み抜く勇者だけが通れる道…つーか、デモでは通った訳なので、素な環境で素なプロジェクトを作れば意外とスムースに進むかなと。

Hyper-V で Xamarin.Forms を動かす手順

先に書いた通り native な Xamarin.Android はビルドエラーになってしまうのですが、Xamarin.Forms の場合は Hyper-V で動作が確認できています。通常の場合は、既に Visual Studio 2013 が入っている状態で、追加で Visual Studio 2015 を入れるでしょうから、ちょっと手順がややこしくなっています。
実機 PC は Hyper-V を動かす都合上、x64 版を使ってください。

  1. 実機 PC に Visual Studio 2015 preview をインストールする。
  2. 実機 PC の Hyper-V を有効にする(Visual Stuido をインストールした時点で Hyper-V が有効になっているはず)
  3. 最初の Xamarin Android プロジェクトを作って、リンク先から XamarinInstaller-VS2015  をダウンロード&インストールする。
  4. Visual Studio 2013 が入っている場合は、
    C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Xamarin\  を
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common\IDE\Extensions\ にコピーする。インストーラが Visual Studio 2013 のほうにしか拡張機能をコピーしないためです(これはいずれ直るでしょう)
  5. Bussiness アカウントでログインをして、Xamarin Update で Statble に戻す。
    2015 だけ使っている場合は不要ですが、2013 のほうの Xamarin.Android が動かなくなるのを回避します。
  6. 2015 あるいは 2013 で Xamarin.Forms のプロジェクト( Mobile Apps )を作成する。
  7. Debug 実行をして、一旦、Hyper-V に VS Emulator Android – Phone を作成する。
  8. Debug 実行のままだと、Connect エラーが出るので、一度だけ Release モードで実行する。そうすると、デバッグ用のコネクション( GetProcessId が取れるようになる)が確立されて、以後は Debug モードでも実行できるようになる。

image

この状態で無事、Xamarin.Forms のアプリが立ち上がります。

【速報】 Visual Studio 2015 Preview で Xamarin.Forms 開発が快適に! – Xamarin 日本語情報
http://ytabuchi.hatenablog.com/entry/2014/11/14/214918

田淵さんに先を越されましたが(苦笑)、二番槍ということで。

おまけ

Visual C++ で Android アプリが作れるようになりましたが、内実は Android Open Source Project です。Google の Android とは違うスタイルのオープンソースな Android ってことです。

image

Visual Studio のテンプレートを開くと OpenGL に特化しているらしく、おそらくゲームか画像関係のアプリを作るときに使うもののようですね。なので、C++/CX などのように C# と同じように Android アプリを作れるわけではありません。また、Xamarin.Forms を使うこともできないでしょう。Microsoft が C++ で Android 環境を提供するなんて…と思った方もおられるでしょうが、そういう訳で、もともと Android Open Source としてあるものを組み入れているし、得意分野も異なるので Xamarin 自体とは競合しません。むしろ、Delphi/C++ のほうとぶつけてきたという感じです。Delphi/C++ のほうでは、C++ で Android/iOS アプリが作れることを売りとしているので、そこが魅力的なところなのですが、Visual C++ でも作れるとなると開発環境を移す必要はなく、Visual Studio で統一できる、という結論に至ります。

これもデプロイ時にエラーがでるので、Hyper-V との接続がクリアできればいけそうです(つまりは、私の手元では動いていないのです…)

image

どうやら、一度 VS Emulator Android – Phone との接続を確立してしまうと、他の Debug モードも動くようです。上記の Android + C++ アプリも無事動きました。背景の緑の色が変化するサンプルのようです。

image

カテゴリー: Xamarin | 1件のコメント

Roslyn の活用しどころ

グロサミの最終日に Roslyn のハッカソンがあったので、午前中にちょっとだけ参加してきました。午前中だけなので、何をやるという訳でもなく、ざっくりと Roslyn Syntax Visualizer の解説を受けて、その後なにがしかの演習っぽいものをやるわけですが、いやいや、その前で抜けているので、ピザ食べて午後あたりになったときにどうなっているのかは分かりません。MS Store 行ってキーボードを買ってきて、お昼を食べて帰ってきて覗いてみたら、なんかまったりと Roslyn をインストールする感じだったので、駄弁るって感じだったんですかね?ハッカソンというものに出たことがないので、雰囲気だけ。

そんな中で、今岡さん(@imaoca)に力説した「Roslynは組み込みにも役に立つかもしれへんでー」という根拠をちらちらと書き散らしていきます。多少、希望的観測も入っているので実現が難しいところがあるかもしれませんが。

そもそも Roslyn ってどうやって使うの?

.NET コンパイラ プラットフォーム (“Roslyn”)
http://msdn.microsoft.com/ja-jp/vstudio/roslyn.aspx
Visual Studio “14”の新機能“Roslyn”とは – Build Insider
http://www.buildinsider.net/enterprise/roslyn/01
.NET Compiler Platform (“Roslyn”) – Home
https://roslyn.codeplex.com/

Roslyn が何か?ってのは、いくつかのブログで読めるので飛ばしてしまって、まずはインストールして使える状態にします。最後の https://roslyn.codeplex.com/ なところから、 Build tools that understand C# and Visual Basic な手順を順々に入れていけば OK です。

  1. Set up a box with Visual Studio “14” CTP 4. Either…
  2. Install the Visual Studio “14” SDK. You’ll need to do this even if you’re using the Azure VM image.
  3. Install the SDK Templates VSIX package to get the Visual Studio project templates.
  4. Install the Syntax Visualizer VSIX package to get a Syntax Visualizer tool window to help explore the syntax trees you’ll be analyzing.

Azure 上には Visual Studio 14 導入済みのものがあるので、それに 3,4 の VSIX をインストールします。そうすると、ファイルオープンなところに「Roslyn」カテゴリが増えるのと、

image

View → Other Windows → Roslyn Syntax Visualiser なメニューを選択すると、

image

CodeDOM が見れるようになります。

image

これをもとに、既存の言語に機能追加をしたり、解釈を変えたりするわけです。C# 自体の新機能も含まれているのですが、C#、VB のような特定言語よりも「コンパイラ」自体に興味がある人は、この機能が公開されて利用できる、ってところに注目します。つーか、私から見た目玉機能はこれですね。

構文木を作る lex/yacc

Roslyn の詳細な API はともかくとして、オープンソースなコンパイラであれば、gcc でもよいし、ruby でも python でも良いわけで F# だってソースが公開されています。gcc のコンパイラそのものを弄ることは少ないけど吐き出される as コードを見て C 言語レベルで最適化をかけたり(部分的にアセンブラを使うとか)するわけで、コンパイラがオープンソースになったところで、あまりインパクトは大きくありません。

IL に落とすという意味でも、そこまで突っ込むことは少ないし、そもそも C# や VB の文法をローカルに変えてまでやるぐらいであれば、別の言語を読み込ませるたり、F# のコンピテーション式のように DSL を埋め込んだりしても良いのです。また、C/C++ で適当なマクロを作れば、大抵のアセンブラ的なコード(行単位の命令コードの羅列)は書けます。別言語になってしまうという難点はありますが、ライブラリとして独立さればよい話で、混乱するような形になるならば、汎用的に作らずとも、R言語のように統計に特化させても良いのです。

そんなプログラム言語単体の話よりも(リファクタリング等の機能もあるのでしょうが)、Visual Studio という IDE の機能を Roslyn により使えるというところに私は注目したいのです。構文木(Syntax Tree)を扱う時に、内部的には CodeDOM のようなスタイルになっているのでしょう。なので、このスタイルに則ってコンパイラを書けば、そのまま Visual Studio の機能が使える…と思います。おそらく、F# は対応されるだろうから、そのあたりで Roslyn の実力を見てっところなんでしょうが。

懸念点と言えば、現在 C#/VB しか対応していないところから、C#/VB に似た言語スタイルでないと Roslyn の API は使えないのか?という点です。たとえば、LISP を Roslyn で通して、Visual Studio で編集できるようになるだろうか?とか、PHP や Perl のようなスクリプト言語の場合はどうなるのだろうかとか。Ruby や Python のほうは、オブジェクト指向言語だし過去に IronRuby な形で編集できるようにもなっているので、導入は比較的楽かもしれませんが。

また、既存の複雑な言語でなくても、ちょっとした DSL を自前で作っておいて、Roslyn に対応させておけば、Visual Studio で編集ができる(補完機能とかサジェッションみないな機能とか)可能せがあります。そうなると、自前でちまちまと専用エディタを作る必要もなくなるし、読み込ませ方によっては結構面倒な JSON や XML 形式で書きつけなくてもよい、ってことになりますよね(まあ、適当なスキーマを作れば JSON のほうが便利ってのもありますが)。

そういう訳で、 Roslyn が扱う CodeDOM(かな?)に直しさえすれば、Syntax Tree から派生する機能が使えるのではないか?と想像できます。

組み込み言語と Roslyn の関係

.NET Micro Framework の場合、C# が使えるから、そのまま Roslyn の機能が使えます。IL に落とす段階や、プラットフォーム毎の .NET のバージョンの違いなどは、Windows 10 で改良されるので(Microsoft.NET とか One.NET とかいうスタイルで)、C# で書いておけば組み込み機器でも動作する、というパターンにはできそうです。

現在、.NET MF は x86 と ARM しか対応していないわけですが、将来的に(過去的にも)マイコン系の CPU に対応させたり、あるいは各種の C言語コンパイラを Roslyn スタイルに直すことで、Visual Studio 上でビルドをすることも可能では?と思っています。あるいは C# でコンパイルしたものを IL に直し、IL 自体を独自の C ライブラリに直すとか、あるいは C# で書いた後に、独自 CPU に対応した IL(内部的には C言語コール)に直してしまうとか。これもローカルな言語を Visual Studio で動かせるようになれば、組み込み言語自体のコーディング速度も変わってくるはずです。まあ、最初のターゲットとしては Arduino 用の C 言語を Visual Studio 上でビルドできる、ってのが理想的ですよね。今でも専用エディタが付いているし、.NET MF を使えば C# で書けるのですが、うまくエディタと IDE が独立に動作して、かつ、コード分析レベルでは同期することができれば、そういうことも可能でしょう。かつて CodeWarrior が、多言語の開発環境を担っていましたが、あれと同じスタイルになると良いです。まあ、それでも Visual Studio で、ひとつのソリューションに複数の言語を入れて開発することができるので、かなり実現されているわけですが。

そんな訳で、ちらちらと Roslyn の中身を眺めなければ。

カテゴリー: 開発 | Roslyn の活用しどころ はコメントを受け付けていません

AllJoyn とは何だろうか?

いままで知らなかったのですが、AllJoyn という通信フレームワークがあります。IoT の中で中核を成す…というか、どうやってモノ同士で通信させるんだろうか?ってのは、C/S でも問題だし、P2P でも問題になるわけですが。

MS、IoTを推進するAllSeen Allianceに加入–クアルコムが主導 – CNET Japan
http://japan.cnet.com/news/business/35050321/
Open Source IoT to advance the Internet of Everything – AllSeen Alliance
https://allseenalliance.org/

実は AllJoyn というオープンソースな規格があって、Qualcomm が推進していることを先日のグロサミで知りました。PC から Raspberry Pi への通信とか、Raspberry Pi から BrickPi を通じて Logo のモータを動かしている訳ですが、自前の BrickPiNet では、REST で通信するようにしています。Raspberry pi の場合は、Linux が動いているので REST を Apache 上に作るか、HttpListener で作ってしまいます。動的にアセンブリをロードするわけではないので、HttpListener のほうでも楽に作れます。モーターを動かすとかセンサーを起動させるとか、そういう REST を送る訳ですが、このぐらいのものであれば、何か規格があっても不思議ではないよな…とは思っていたのですが。

それが、AllJoyn という規格です。規格自体は 2008年頃?で、SDK 自体は 2011年ぐらいです。現在は ver.14 で https://allseenalliance.org/source-code にアクセスすると各種環境の SDK がダウンロードできます。Qualcommが発起人で、現在は Linux 財団がオープンソースとして管理、ってな感じなんですかね。

何ができるのか?

各種 OS 間でデータ通信を行います。データ通信自体ならば TCP/IP をそのまま使ったり(特には IP だけ使ったり)、最近の機器では組み込み系の Linux が入っているから Apache を入れて応答を返すってのが普通に行われますが、Android や Phone やら、TV やオーディオ、冷蔵庫などまで範囲を広げます。相互に通信をできるようにする訳ですから、なんらかの規格を決めないといけません。

  • データ自体は、XML で送受信
  • データ内容は Get/Set などシンプルなメソッドを使う

途中に AllJoyn のルータなどが挟まるのでネットワーク的には複雑なのですが、EndToEnd 視点ならば非常に単純です。Pull と Push の両方の機能を備えるので、端末機器からの Event 通知を受けることができます。このあたり、SNMP の MIB に近いのかなと思ったりするのですが、どうでしょう? MIB 自体はバイナリと IP を扱わなくて結構大変なのですが、現在の端末機器の CPU とメモリを考えれば XML データを流してエンコード/デコードしてもパワー的に十分ですよね。

https://allseenalliance.org/developer-resources/alljoyn-open-source-project にあるメニューリストを見ると、Unity や Windows 7 が入っています。ゲームの双方向通信にも使われているらしく、Unity + AllJoyn で作っておけば、WiFi/Bluetooth 環境にあるゲーム機器が、機種に関係なく相互通信ができるのでは?と思ったりするのですがどうなんでしょう。

また、先に書いた通り、シンプルな XML をデコードする機能さえあればいいので、.Net Micro Framework のような非力な機器でも使えそうです。データの内容を見ると SOAP のように名前空間を使っていません。

プログラム言語は、Java, Objective-C, C++, C#, C で扱えます。https://allseenalliance.org/alljoyn-framework-tutorial C# で扱えるんだから、F# とか VB でも扱えるでしょう。

具体的にどうやるのかは、これからチュートリアルなどを読んでいくわけですが、クラス名もこんな感じでそう多くありません。

image

BusLitener と SessionListener が肝な感じがします。

ひとまず、自分用のメモまで。

カテゴリー: 開発, AllJoyn | AllJoyn とは何だろうか? はコメントを受け付けていません