【速報】F# + Xamarin.iOS + Xamarin Studio で iPhoneアプリを作れるよ

Visual Studio 2013 上で iOS デザイナが動作しているのは Build 2014 でチラ見せしていたので、いずれは…と思っていたのですが、アルファ版がでました。

【速報】iOS Designer for Visual Studio リリース! – Xamarin 日本語情報
http://ytabuchi.hatenablog.com/entry/2014/05/07/182031

既に Xamarin Studio for Mac のほうでは Xcode Interface Builder を使わずに Xamarin Studio 内蔵の iOS Designer が動いています。アルファ版のほうは

  • Xamarin Studio 5.0
  • Xamarin.iOS 2.0

となるので同時にメジャーバージョンアップです。Xamarin Studio の UI も少し変わってきています。新しい Xamarin の目玉としては、iOS デザイナが Xamarin Studio あるいは Visual Studio 内で動くので、ビューを操作するたびに Interface Builder を動かさなくていいということと、storyboard に本格的に対応したらしく、storyboard を使わないプロジェクトテンプレートがなくなっていることです。多分、iOS デザイナを内蔵したためと思われます。旧来の Visual Studio のほうには残っているので、これが新しくインストールしたときに消えるのかどうかは不明ですが。

デザイナ自体は、田淵さんのブログにもある通り、Mac 側に Xamarin.iOS Build Host を動作させないといけないので Mac は必須です。まあ、Xamarin Studio for Mac で動かせばいいんですがね。

と、普通な? Xamarin Studio 速報はそれぐらいにして、注目したいのは F# の iOS/Android のプロジェクトテンプレートが追加されたことです。いままで、Xamarin Studio で F# が使えていたのですが、ASP.NET と NUnit だけだったのですが、今回は Android/iOS が追加されています。よっぽど物好きな(失礼)エンジニアの方が、Xamarin 社にいらっしゃるのか…NYC の F#er の有志が係っているのかは不明なのですが。いやいや fsharp.org を見ると Xamarin との結束は意外と昔からある模様です。

Visual Studio 上では、Android のプロジェクトテンプレートしかありませんが、Xamarin Studio for Mac には iOS のプロジェクトテンプレートもあります。

image

image

Mac 上で作った F# プロジェクトを Visual Studio に持ってきたら開けるかと思ったけどダメみたいですね。4925A630-B079-445D-BCD4-3A9C94FE9307 が異なるらしいので、調べると

MonoTouch and F# part I –
http://7sharpnine.com/posts/monotouch-and-fsharp-part-i/

なところで色々やっています。って、これ 2013年2月だから結構前からやってますね。

Mac 上で作ると、こんな感じで F# on iPhone シミュレータが動きます。

image

ちなみに Android F# は Visual Studio 上で作れます。

もうひとつすごいのは、New York で mobile と F# の勉強会があってそこで F# + Xamarin.iOS の発表があります。1時間半ありますが、Xamarin に入るのは 30分以降です。

[nyc-fsharp] Cross-platform mobile with F# & Xamarin with Rachel Reese on Vimeo
http://vimeo.com/94300454

デモをやっているのが、Visual Studio 2013 上なので、たぶん F# の Xamarin.iOS 拡張が動いていると思われます。F# でマインスイパーを作って iOS シミュレータ上で動かしています。この手のゲームロジックは F# のような関数言語が得意とするところで F# でがりがり組むよりも、コアなところは F# でって感じです。F# はコアってことでPCL(Portable Class Library)にして、UIをC#で書くってことを考えていたのですが、これだとUIもF#で書くと楽かも。

カテゴリー: F#, Xamarin, iOS | 1件のコメント

Xamarin.iOS+MvvmCrossでstoryboardを使う方法

MvvmCrossでプロジェクトテンプレートを作ると、丁寧な設定があって便利なのですが、Xamarin.iOSで作るときに Xcode5 に対応した storyboard のほうは出してくれません。やり方がよくわからないので、できるのかできないのかすら分からないので、必要があってきちんと調べてみました。

MVVMCross support for Xamarin.iOS Storyboards – Stack Overflow
http://stackoverflow.com/questions/22126929/mvvmcross-support-for-xamarin-ios-storyboards
slodge/eh ・ GitHub
https://github.com/slodge/eh
Databinding ・ MvvmCross/MvvmCross Wiki ・ GitHub
https://github.com/MvvmCross/MvvmCross/wiki/Databinding

なところにサンプルコードがあります。

slodge/eh にあるのは、PCL を使わない方法なので、PCL を使う方法示しておきます。やってることは一緒ですね。

■XamarinMvx.Coreの作成

XamarinMvx.CoreをPCLで作成する。MvxViewModel を継承した ViewModel で、バインディングする View の名前と揃えて置く。実は揃えない方法があるのだけど(iOSの場合は、揃えない方法でバインドする)、Androidと共有することを考えるとそろえておくのが無難。「MainView」にバインドするのであれば「MainViewModel」にしておく。

public class MainViewModel : MvxViewModel
{
    public int _X = 0;
    public int X
    {
        get { return _X; }
        set { _X = value; RaisePropertyChanged(() => X); }
    }
    public int _Y = 0;
    public int Y
    {
        get { return _Y; }
        set { _Y = value; RaisePropertyChanged(() => Y); }
    }
    public int _Ans = 0;
    public int Ans
    {
        get { return _Ans; }
        set { _Ans = value; RaisePropertyChanged(() => Ans); }
    }
}

App.cs はあってもなくてもいい気がするのだが、Android と共有するために以下のままにしておく。

public class App : Cirrious.MvvmCross.ViewModels.MvxApplication
{
    public override void Initialize()
    {
        CreatableTypes()
            .EndingWith("Service")
            .AsInterfaces()
            .RegisterAsLazySingleton();

		// TODO: MainViewModelをMainViewに結び付ける
        RegisterAppStart();
    }
}

RegisterAppStartを使うと、ひとつのViewModelがひとつのViewにしかバインドできないし、じゃあ複数のViewにバインドするときはどうするの?という疑問が残るけど、ここではそのままで。slodge/eh 自体が、複数の画面遷移を使っているので参考になると思う。

■XamarinMvx.iOSの作成

Androidの場合には、*.axmlに

local:MvxBind="Text Hello"

のようにバインドしていくのだが、iOSのstoryboardの場合は、Xcodeが *.storyboard を書き換えてしまうので直接編集すると上書きされて戻ってしまう。なので、コードを使ってバインドをする。
iOS用のプロジェクト(storyboardを使う方)を作った後に、NuGetでMvvmCrossを導入する。

AppDelegate.cs を開いて、AppDelegate の継承を MvxApplicationDelegate に直す。

public partial class AppDelegate : MvxApplicationDelegate

FinishedLaunching メソッドをオーバーライドして、アプリの起動時に setup.Initialize を呼び出すようにする。base.FinishedLaunching を呼び出してはいけない。

public override void FinishedLaunching(UIApplication application)
{
    var setup = new Setup(this, this.Window);
    setup.Initialize();
}

XamarinMvx.iOSViewController.cs(ViewControllerのファイル)を開いて、MvxViewController から継承するように変更する。

public partial class XamarinMvx_iOSViewController : MvxViewController

ViewDidLoad メソッドの最初におまじないの一行(MvxViewModelRequestの呼び出し)を書いた後にバインドする。

public override void ViewDidLoad ()
{
    this.Request = new MvxViewModelRequest(null, null, new MvxRequestedBy());
    base.ViewDidLoad();

	// Perform any additional setup after loading the view, typically from a nib.
    // TODO: こうすると、View, ViewModel の名前の制約を回避できる
    var set = this.CreateBindingSet<XamarinMvx_iOSViewController, MainViewModel>();
    // TODO: コードでバインドする
    set.Bind(this.editX).To(vm => vm.X);
    set.Bind(this.editY).To(vm => vm.Y);
    set.Bind(this.textAns).To(vm => vm.Ans);
    set.Apply();
}

MvxViewModelRequestのテンプレートに渡すのは ViewModel のクラス名。これを Request に設定しておく。この行がないと、base.ViewDidLoad で例外が発生する。
CreateBindingSet では、Viewクラス、ViewModelクラスを設定する。この場合は、Viewクラスが「XamarinMvx_iOSViewController」でViewModelクラスが「MainViewModel」になる。こんな風に、名前をそろえなくて良い。
これを変数で受けて、Bind していく。Apply で複数のバインドを適用する。まあ、大抵は複数のバインドをするのでこれでOK。

ちなみに、Android の場合も同じようにできる。

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);

    // Set our view from the &quot;main&quot; layout resource
    SetContentView(Resource.Layout.Main);

    // axml に local:MvxBind=&quot;Text X&quot; を書かずにコードでバインドする方法
    // iOSの場合も同じ
    // この方式にすると、ViewとViewModelの名前を統一しなくてよい。
    var set = this.CreateBindingSet<MainView, MainViewModel>();
    set.Bind(FindViewById<EditText>(Resource.Id.editText1)).To(m => m.X);
    set.Bind(FindViewById<EditText>(Resource.Id.editText2)).To(m => m.Y);
    set.Bind(FindViewById<TextView>(Resource.Id.textView1)).To(m => m.Ans);
    set.Apply();
    // TODO: 説明を簡単にするため、テキストだけバインド
    MainViewModel vm = this.ViewModel as MainViewModel;
    Button button = FindViewById<button>(Resource.Id.button1);
    button.Click += (s, e) =>
    {
        vm.Ans = vm.X + vm.Y;
    };
}

*.axmlに書かないので、XAMLとは異なるけどバインド部分は統一できそう。ちなみに、FindViewById<EditText> のところは型指定しないと例外が発生する。

ボタンのクリックイベントは、IBActionを使ったほうが楽なので、こっちで。ICommandのほうはまた後で。

partial void clickCalc(MonoTouch.Foundation.NSObject sender)
{
    var vm = this.ViewModel as MainViewModel;
    vm.Ans = vm.X + vm.Y;
}

■実行

実行するとこんな感じ。

■サンプル

サンプルはこちら。
https://github.com/moonmile/XamarinMvx

ついでに、Android と Windows ストアプリも含めています。

■日本語の参考文献

Xamarin – マルチプラットフォーム MVVMフレームワーク「MvvmCross」を使う – Qiita
http://qiita.com/amay077/items/c4227663b5a5e540dc13
MvvmCross と Xamarin for Visual Studio で iOS, Android, Windows アプリを作る流れ – Yuta Watanabe’s Blog
http://yutawatanabe.hatenablog.com/entry/mvvmcross-xamarin-visual-studio
MvvmCross について – Xamarin 日本語情報
http://ytabuchi.hatenablog.com/entry/2014/03/03/121833

カテゴリー: Android, C#, WinRT, Xamarin, iOS | Xamarin.iOS+MvvmCrossでstoryboardを使う方法 はコメントを受け付けていません

昭和の日なので「ああっ女神さまっ」を振り返ってみる

たまたま先日立ち読みしたアフタヌーンで「ああっ女神さまっ」が最終回だったので記録的に書いておこう。

連載が始まった頃にちょうど大学生で、なんかちょうどリアルタイムな時期でした。その前の「逮捕しちゃうぞ」のあたりと、その後の「サクラ大戦」があって、江川達也の「Be Free」からの系列で、アシスタントということで、理系ということもあって初回から単行本は買っていたわけですが、同時期にあった「月下の棋士」とか「無限の住人」に比べるとコメディの具合となかなか進展しない恋の具合は「宮本君から君へ」という漫画もあったりして、まあ、江川達也風でどう行くのだろうか?という感じでした。もちろん、前作の「逮捕しちゃうぞ」の頃からバイク・車とメカニカルな描写が得意なわけで、そっち方面は猫実工大にも表れているし、変な先輩あたりは当時の大学の雰囲気もあって、そういう変な感じを許容する昭和な時代だったかなと。いやいや、後から振り返れば、バブルな時代であって、ちょうどそのまま就職すれば会社入るまえにハワイ旅行で拘束なんて時代でしたから、最初の頃はそんな雰囲気も漂っていますよね。

絵柄がミュシャ風になったのは「女神」だったからなのか、そういう路線に変更にしたのかは不思議なところですが、士郎正宗の「攻殻機動隊」が細いラインで細かく描かれていた(その前の「アップルシード」とは異なる)メカニカルなものが、車やバイクのエンジンの描写ではなく、そのままベルダンディの衣装の描写になったのかな、と推測しています。一方で江川達也は細い線で「東京大学物語」を書いていたわけで(その前は「タルるーとくん」あたりだったけ?)、考えててみれば「ジョジョの奇妙な冒険」も似た時期ですよね。そんな中でごった煮な月刊アフタヌーンがあったわけでして。

と実は40巻ぐらいまでだらだらと買っていたのですが、ちょっと追わなくなったんですよね。年齢的にもそういう漫画を読む歳ではなくなった…つーか、いや、そういう感じ読んでいる訳ではなけど、さすがにあれや、正直「いつまで続くんだろー」ぐらいな感じになっておりました。連載途中からアフタヌーン一押しになってしまって(最初からそうだったのか覚えていないのですが、あの「江川達也」のアシスタント、「逮捕~」の次の作品、ってことで期待は大きかったハズです)、そのミュシャ風のグッズに寄った時点からついていけなくなった感じ?いや、なんだろう、10次元の話あたりは覚えているし、その後のエピソードのそこそこ覚えているのですが、んー、うる星やつらの「ビューティフル・ドリーマー」を何度も見せられる既視感というか、先に進まなさというか、いや先に進まないのはうる星やつらあたりで経験済みなので、そういう楽しみ方もありなんですが、なんだろう、メカニカルなところと無理矢理つなげている趣味的なところがあったのが、いつの間にかなくなってしまったところですかね。嘘くさい理系的な薀蓄をあきらめてしまったあたりからかな。

んがしかし、25年も連載を続けられるのは、体力的にも営業的にもアレなので、それはそれ。Kindle版も売っているようなので、買い直してみるかな。

カテゴリー: 雑談 | 昭和の日なので「ああっ女神さまっ」を振り返ってみる はコメントを受け付けていません

F#でWPFアプリを作る方法

F#でGUIを扱うのはなかなか大変なのですが、できないことはありません…と思っていましたが、WPFアプリならばプロジェクトテンプレートがあるよ、ってのを最近知りました。

Visual Studio 2013 で「オンラインテープレートの検索」で「F# WPF」で検索してみます。すると、いつか F# で Windows アプリを作るテンプレートがあるんですね。

image

が…、WPF アプリと、WPF+MVVM アプリのプロジェクトをダウンロードしたものの、いまいちよく分からなくて途方に暮れます。WPF アプリのほうは中身が空っぽ(Emptyなのでそりゃそうなんですが)で先がわからなく、WPF+MVVMは、グリッドへの DataBind の例なんですが、ふつうの DataBind がどうするのかわかりません。

そんなわけで、上をベースにして簡単なサンプルを作りました。
moonmile/SampleFSharpUI
https://github.com/moonmile/SampleFSharpUI

これも簡単すぎて実務には足りないんですが、取っ掛かりぐらいにはなるかと。WPF + F# の組み合わせはふつうに XAML デザイナを使ってアプリを作れるので、C# と同じように作れます。ただし、コードビハインドの仕組みがないので、ボタンのクリックイベントは自前で用意する必要がありますね。以下、ざっと説明を。

■SampleFSharpUI.WPF

先の F# empty windows app をベースにして XAML にテキストボックスを並べます。テンプレートの XAML では Grid タグをつけ忘れているので、それを追加するところから。

image

MainWindow.xaml.fs のようなコードビハインドはなくて、App.fs にある

type MainWindow = XAML<&quot;MainWindow.xaml&quot;>

が、その役割を果たします。TypeProvider.XAML でコーディング時に MainWindow.xaml を解析して、クラス(type)に割り付けます。こうしておくと、

let window = MainWindow()
...
let x = Convert.ToInt32( window.text1.Text )

な感じで x:Name=”text1” で指定した名前を、window.text1 のようにプロパティとして参照できるようになります。TypeProvider 自体がよくわからないのですが、なんかファイルか文字列を読み込んで型にして返してくれるものみたい。

ボタンのクリックイベントは

   window.button1.Click.Add( fun _ -> 
    let x = Convert.ToInt32( window.text1.Text )
    let y = Convert.ToInt32( window.text2.Text )
    let ans = x + y
    window.text3.Text <- ans.ToString()
   )

と書いていますが、window.button1.Click |> Event.add を使って

   window.button1.Click 
    |> Event.add( fun _ -> 
    let x = Convert.ToInt32( window.text1.Text )
    let y = Convert.ToInt32( window.text2.Text )
    let ans = x + y
    window.text3.Text <- ans.ToString()
    )

のように書くこともできます。まあ、普通にメソッドにしたほうがいい気も。

アプリの起動自体は

 [<STAThread>]
(new Application()).Run(loadWindow()) |> ignore

となって、最初の loadWindow を呼び出すわけですが、この書き方だとすべてグローバル変数扱いになってしまうので、実務的には適度にクラスかモジュール分けが必要ですよね。

■SampleFSharpUI.MVVM

MVVM では、INotifyPropertyChanged を継承した ViewModelBase クラスを作っておいて、DataModel クラスを作ってます。MVVM の ViewModel にあたるクラスなんですが、Model クラスがないのは気持ち悪いのでこんな名前にしています。

type DataModel() =
    inherit ViewModelBase()
    let mutable _X : int = 10
    let mutable _Y : int = 20
    let mutable _ANS : int = 30

    member this.X 
        with get() = _X
        and set(value) = 
            _X <- value
            base.OnPropertyChanged &quot;X&quot; 

    member this.Y
        with get() = _Y
        and set(value) = 
            _Y <- value
            base.OnPropertyChanged &quot;Y&quot; 

    member this.ANS
        with get() = _ANS
        and set(value) = 
            _ANS <- value
            base.OnPropertyChanged &quot;ANS&quot; 

プロパティの get/set の並べ方はこんな感じで。クラスの最初に mutable を置かなければいけないのと(これでよかったっけ?)、OnPropertyChanged メソッドに「メソッド名」を渡さないといけないのがいまいちですね。CallerMemberName 属性を使って、コンパイル時にチェックしたいところです。

XAML へのバインドは C# と同じで Text=”{Binding X, Mode=TwoWay}” のように書けます。この方法で C# とビューが共有できます。

type MainWindow = XAML<&quot;MainWindow.xaml&quot;>

let _model = new DataModel()

let loadWindow() =
    let window = MainWindow()
   
    // Your awesome code goes here and you have strongly typed access to the XAML via &quot;window&quot;

    // 初期値
    _model.X <- 0
    _model.Y <- 0   
    _model.ANS <- 0
    window.button1.Click.Add( fun _ -> 
        // データバインドで設定
        _model.ANS <- _model.X + _model.Y 
    )
    window.Root.DataContext <- _model
    window.Root

あとは、_model オブジェクトを作って DataContext にバインドすれば OK です。XAML のデザイン時に Binding でインテリセンスを効かせたいときは、C# のときと同じようにデザイン時のバインドを使えば OK です。

d:DataContext="{d:DesignInstance {x:Type local:DataModel}, IsDesignTimeCreatable=True}"

実行結果はこんな感じ

image

■Window Store App ではどうするのか?

タイププロバイダで XAML が読めるんだから、ストアアプリの XAML も読めるはず…なんですが、F# でストアアプリを作ろうとすると XAML デザイナがうまく認識しません。さらに言うと、そのままでは、参照設定がうまく WinRT にほうにできません。どうやらコンパイル時の *.targets をうまく設定しないといけないんですよね。現時点ではうまくできてません。

XAML 用のデザイナは C:/Program Files (x86)/MSBuild/Microsoft/WindowsXaml/v12.0/ あたりを見ているので、ここに FSharp 版をつくらないとダメな模様

あとプロジェクトテンプレートのGUIDが BC8A1FFA-BEE3-4634-8014-F334798102B3 で、C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/CommonExtensions/Microsoft/WindowsXamlFlavor/Microsoft.VisualStudio.Windows.UI.Xaml.Project.pkgdef になるので、これを参考にしながら F# 版を作らないとダメかも。

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

C#によるiOS、Android、Windows対応のアプリ開発 — 予約中

C#によるiOS、Android、Windows対応のアプリ開発
http://www.amazon.co.jp/dp/4822298345/

表紙がまだできていませんが、Amazon で予約開始です。そのうち日経BPさんのサイトにも載ると思います。サブタイトルがないけど「Xamarin + Visual Studio で作成する~」みたいな感じですね。Xmarin + Visual Studio で iOS アプリ、Android アプリ、Windows ストアアプリを同時並行で作っていきます。

image

概要はAmazon に書いてある「内容紹介」の通りです、もっと具体的に言えば、MVP Community Camp 2014 で発表しました。 | Moonmile Solutions Blog で作ったサンプルが元です…と言いますから、執筆途中の原稿のちらみせがスライド資料の発表になります。

更に具体的に言うと http://www.moonmile.net/blog/archives/category/dev/xamarin のカテゴリにある内容が 280 ページ(まだ、途中なので確定ではありませんが)に詰まっていると思ってください。ブログのほうでは調査も含めてぱらぱらと書き散らかしていきましたが、モバイル機器(iPhone/iPad、Android、Windowsタブレット)でどうやったら共有して開発できるだろうか?という指針あるいは方向性になります。途中で Build 2014、Windows 8.1 Update、Visual Studio Update 2 RC、すまべん@関東 が挟まっているので、それも込み。榎本さんの記事 を参考にしつつ重ならないように注意しながら内容を絞り込んでいます。 Windows Phone 8.1 のほうは時期的に間に合わなかったのでさわりの部分だけ、将来的に Xamarin Studio で共有プロジェクトができると Xamarin.iOS/Android も含めたユニバーサルアプリができる可能性があります(ユニバーサルアプリで使っているSharedプロジェクトをXamarin.iOSで使う で手作業でプロジェクトファイルを書き変えると代替はいけるかと。Xamarin Studio for Mac の対応待ちになるのですが)。

そんな訳では、発売日は 5/29 だそうです。ええ、de:code の日ですね。ってことは、de:code 行かねばならぬのかーと、営業的に捻出中です。ええ、word の稟議書を眺めながら(自営だし)。

カテゴリー: Xamarin | C#によるiOS、Android、Windows対応のアプリ開発 — 予約中 はコメントを受け付けていません

Windows Phone 8.1 と Xamarin.iOS/Android で PCL を使う方法

moonmile/XamarinXmlSerialize なところの説明を少し。手元のシリアライザ練習用に作ったものですが、ついでにユニバーサルアプリにを追加して Xamarin.iOS/Android から PCL を参照させてみました。

image

こんな風な、ソリューションの構成になっているところで

image

こんな風な PCL を作ります。普通に作ると Windows Phone 8.1 と Xamarin.iOS/Android の両方はチェックできないのですが、いずれ「できる」だろうってことで先取りします。

方法は簡単です。以前やってみた PCL のターゲットフレームワークに Xamarin をインストールせずに Xamarin.Android を追加する | Moonmile Solutions Blog の方法を使います。PCL の参照設定の「.NET」を選択してプロパティウィンドウを見ると、パスが出てきます。

image

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile111

このパスをエクスプローラーで開いて、SupportedFrameworks フォルダに Xamarin.iOS.xml と Xamarin.Android.xml をコピーするだけです。この2つのファイルは Profile7 あたりにあります。Profile111 は、今回の VS2013 Update 2 RC でできたフォルダで、まだ Xamarin.iOS/Android が対応していないだけ(と思われる)です。将来的には対応されるでしょう。

image

そうすると、Xamarin.iOS/Android から PCL を参照できるようになるので、Windows Phone 8.1 とも共有が可能です。

先のサンプルでは、もう少し手を入れていて、Shared フォルダに BasicMain.xaml のコードビハインドを分離させています。

image

こんな風に、partial にしておいて、ボタンイベントだけをこっちの共有プロジェクトに書き出します。Windows ストアと Windows Phone の xaml には、「Click=”ClickLoad”」のようにイベントを設定するので、複数のビューとコードビハイドがうまく分離できますね、という方法です。考えてみたら、ファイルのリンクの追加でもできた話なのですが、まあ共有プロジェクトのほうが効果的かと。

image

で、共有プロジェクトは現在、Windows ストアと Windows Phone にしか出てきませんが、ユニバーサルアプリで使っているSharedプロジェクトをXamarin.iOSで使う | Moonmile Solutions Blog な方法を使うと、Xamarin.iOS/Android からも使えます。これも先行きは Xamarin で対応されるでしょう。となると、メソッド名と引数の並びが同じであればいいわけで、うまくやると、iOS の Storyboard と Android の axml と共有できるかもしれません(MvvmCross でもうまくいくかも)。

Android の場合は、「void ClickLoad(object sender, EventArgs e)」となるので引数の型が EventArgs の型だけ異なります。iOS の場合は IBAction の関係から「partial void clickCalc(MonoTouch.Foundation.NSObject sender)」となるので、引数の型が全く違います。まあ、#if ディレクティブで区切ればいいのですが、いちいち #if で分岐させるのも面倒ですよね。C/C++ ならば #define マクロで逃れるところですが、C# だとそれもできない。VB6 の頃のようにボタンクリックイベントから、別のクラスあるいはCOMを逐一呼び出すよう名な形にはしたくない。このあたりはちょっと考えどころ。

カテゴリー: WinRT, Xamarin | Windows Phone 8.1 と Xamarin.iOS/Android で PCL を使う方法 はコメントを受け付けていません

Azure Mobile Service は Nuget版とXamarin Components版があるので注意

半日ほど嵌ったのでメモ書き。

Azure Mobile Services を扱うときにはライブラリを使うのが常なのですが、Microsoft.WindowsAzure.MobileServices は Nuget版と Xamarin Componets 版の2種類があります。

Azure ポータルの「Xamarin」でダウンロードするサンプルは Xamarin Componets 版

image

Windows ストアサンプルは Nuget版

image

Nugetでダウンロードできるのは当然 Nuget 版。

image

ソリューションエクスプローラーで「Componets」→「Edit Components」で拾えるのが Xamarin Components 版

image

image

こんな感じでその他のコンポーネントもダウンロードできる。

image

で、普段はどちらかしかダウンロードしないので、はまることはあまりないのですが、こんな風に Mobile Services を PCL 化して、iOS/Android/Windowsストアで共有しようとしたときに、PCL では Nuget版しかダウンロードできない。けれども、iOS/Android のほうで、Xamarin Componets 版をインストールすると、実行時にエラーがでます。変だなー、ってことに。

image

Xamarin Componets 版では、こんな感じに。

image

サンプルコードもどちらを使っているのか判別しづらいのですが、「CurrentPlatform.Init();」を使っている場合が Xamarin Componets版、使っていないのが Nuget版です。Nuget版には CurrentPlatform というクラスがありません。そのほか実装されているクラスは同じなのか?

追記 2014/04/17
いや、どちらも同じく CurrentPlatform.Init() はある。なので、区別がつかないかも。

Xamarin で Windows Azure モバイルサービスを使う(その1) – Qiita
http://qiita.com/amay077/items/40bd5918284fd40d0edc

MobileServiceClient がメインクラスですが、これを使う前に CurrentPlatform.Init() が必要です(DI だか IoC だかですかね)。

かも。

追記 2014/04/17 どちらもソースコードは https://github.com/Azure/azure-mobile-services になってる。

Nuget 版で作ったものは、こちら。

moonmile/XamarinAzureMobile · GitHub
https://github.com/moonmile/XamarinAzureMobile

ところで、アプリケーションキーって、サンプルをダウンロードしてみるしかないんですかね? Azure ポータルに見当たらない…と思ったけど、「モバイルサービス」→「キーの管理」で見れる。

カテゴリー: Xamarin | Azure Mobile Service は Nuget版とXamarin Components版があるので注意 はコメントを受け付けていません

Windows 8.1 Update でプルダウメニューが左開きになった時の対処

と、Windows 8.1 Update のせいか定かではないのですが、4/9 の Windows Update でなった現象として、こんな風にプルダウンメニューが左開きになることがあります。

20140410_03

メニューって、右へ右へと開いていたはずなのに、突如として左へ左へと開き始めます。突然、Microsoft 社が方針を変えたのか?と思って色々調べて、英語版Windows 8.1でもUpdateをかけて調べていたのですが、原因が分からず。バグかな?と思っていたのですが、

 

とのアドバイスがッ!!! コントロールパネルで「タブレットPC」で検索するとありました。どうしてなのか謎なのですが、デスクトップPCがタブレットPCに誤認識されて(タッチタイプじゃないディスプレイなんですけど)、利き手の設定が「右きき」になっています。このために、左側にメニューが表示されていたんですね。

image

そんな訳で、ここの設定を「左きき」に直すと、無事いつも通りにメニューが右開きに戻りました。どの Windows Update でこうなってしまったのか分からないのですが、誤認識されない場合はコントロールパネルで「タブレットPC」を検索しても出てきません。この場合は、いつも Windows Update をしても右開きのままです。

コントロールパネルでみつからないけど、メニューは左開きという変な状態になっている場合は、レジストリを直接書き換えます。「MenuDropAlignment」で検索して、「0」(左きき)にします。PC を再起動して反映すればOK。

image

調べてみると、結構よくある誤認識らしいですね。再起動したときに、↓のように「タッチキーボード」が出ていると誤認識しているようです。確か起動時にキーボードを認識でないときに出るので、日本語キーボード全般で出てるのかも。

image

ついに Microsoft は Windows 8.1 Update で普通の PC をタブレット PC にする技術を発明したッ!!! のかもしれませんね。あの Windows 8 の発売の感動をもう一度…なのか?

カテゴリー: 開発 | Windows 8.1 Update でプルダウメニューが左開きになった時の対処 はコメントを受け付けていません

Splashtopを使ってWindows PCからMacへリモート接続する

Visual Studio で Xamarin.iOS を使っていると、デザイナとiOSシミュレータは Mac 上で動くために Mac の操作が必須になってきます。2台並べて作業をすればよいのですが、マウスとキーボードを置くスペースは無駄だし、いちいちマウスを持ち替えるのも面倒です。他には、Xamarin Studio for Mac で完結させてしまう。Mac に Fusion などの仮想環境を入れて、Windows + Visual Studio を仮想環境で動かす。という方法もあるのですが、まあ、高機能な Windows デスクトップを使いたいわけで(慣れとか、PC のほうが安いってのもあるけど)、普段使いは Windows なので、Mac へリモートデスクトップで操作をしたい訳です。

で、いままでは VNC を使って Mac の画面を操作していたのですが、VNC の描画が遅くて結構もたついてしまうのと、mac mini の場合は PC 側の jis 109 キーボードの認識が変で「@」マーク等のキーコードが Mac に伝えられないという不都合があります(Mac book Air などでは、そういうことはありません)。そんな訳で、最近 splashstop を使い始めました。

トップリモートデスクトップアプリ | iPad からコンピューターにアクセス | Splashtop Personal | Splashtop って、以前 iPad から PC へリモート接続ができる、ってんで話題になってたもので、Apple Store では「splashtop 2」が 500円になってます。iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 Splashtop 2 – Remote Desktop 以前のバージョンは 85円だった気もするのですが、それはさておき。ちなみに、iPad から艦これができるっていう話題もありますね。SplashtopのIP直打ち設定で艦これリモートプレイが簡単にできてしまった | はげあたま.org どうせならば、PC 側に WPF で iPad のサイズで艦これビューアを作って接続するといいかも、とか。まあ、WiFi が必須なんですが。

で、私の場合は、Mac をホスト/サーバー(Splashtopでは「Streamer」)にして、Windows PC をクライアントにします。この環境は無料で構築できます。ただし、条件があって「インターネットに接続していて、splashtop へログインできる環境が必要」です。接続するときにログインIDを求められるので、外部接続が必須ですね。なので、ローカルに閉鎖された状態のプライベートネットワークではダメかも。まあ、そういう場合は VNC とか他のリモート接続の環境を用意するとして。

■インストール方法

http://www2.splashtop.com/ja/personal からパーソナル版をダウンロードします。

image

クライアント(リモート接続するPC)のアプリをダウンロードしてインストール

image

Streamer(リモート接続されるほうのPC/Mac)のアプリをダウンロードしてインストール

image

■Streamer(サーバー)側の設定

単純に起動しておけばOKです。接続されるとこんな感じになります。

image

Mac Book Air の場合、カバーを閉じて作業をすることが多いので(画面を見る必要がないので立てかけてしまってもいいし)カバーを閉じてもスリープしないようにしておきます。たぶん、Splashtopを入れたときに初期化されているのかもしれません。以下で「スリープ設定の変更」をクリックして、

image

環境設定で省エネルギーを設定しなおします。省電力を考えて「3時間」にしていますが、使っている限りは動くのでこれでよいかと。

image

■クライアントの設定

Windows PC のほうでは、最初にログイン画面が出た後に、こんな風に接続先が出てきます。ポートを探って、なんでも出てしまうので社内ネットワークとかで PC が多い場合は混乱するかも。そのあたりは、Business 版を買うんでしょうか?いや、アカウントでわかれるから大丈夫かな。

image

接続するときの解像度を選択できます。相手の解像度を判別しているのかは分かりません。ちなみに「ローカルコンピューターのネイティブ解像度」を選択しても、画面一杯に広がる訳ではありませんでした。Mac Book Air だからなのかな。

image

うまく接続ができると、こんな風に表示されます。ウィンドウを小さくすると、そのまま画面が小さくなるので、隅において監視したいときは便利です。タイトルの↓に「v」がにはメニューがあります。「100%」表示に戻すときに便利ですね。「切り替え画面」というのがあるので、マルチディスプレイに対応しているのかもしれません。

image

Windows 8.1 から Mac に接続していると、途中でクライアントのウィンドウが固まります。何故かよくわからないのですが、設定で「ネットワークに最適化」を OFF にすると直りました。通常は有線LANを使うからこれでいいと思います。クライアントには「Windows ストアアプリ版」があるのですが、どうなんだろう…デスクトップ版で十分な気がするんですが。

image

iPad から Mac/Windows への [D] 爆速リモートデスクトップSplashtop 2でMacとの付き合い方が変った! あたりが詳しいです。

そうそう、splashtop と Windows 標準のリモートデスクトップの違いは、リモートデスクトップが PC を占有してしまうけど、splashtop の場合は占有しないことです。VNC接続でもそうなのですが、どちらの PC/Mac でもマウスとキーボードの操作が可能なので、隣においてちょっとだけ Mac のキーボードで操作するってのも可能です。

カテゴリー: 開発 | 2件のコメント

C#とVBでXAMLを共有プロジェクトで使える…かと思ったけどできなかったの巻

C#とVBで共有プロジェクトを使おうと思ったけど、コードのプラグマは #if と #if … Then の違いがあって微妙に違って共有できないので、XAMLファイルを共有しようかと思ってやってみました。そう、*.xaml ファイルだけ共有します。コードビハイドは、それぞれの *.cs, *.vb を参照させます。

image

以下、作成手順

  1. ユニバーサルアプリから、shared プロジェクトを引っこ抜く。
  2. *.shproj に、MainPage.xaml だけ追加する。
  3. MainPage.xaml のクラス名を「XamlShare.MainPage」のように共通で使えるように変更
  4. *.csproj をエディタで開いて、MainPage.xaml.cs から MainPage.xaml を連結させている箇所を消す。
  5. *.csproj をエディタで開いて、XamlShare.Shared.projitems への Import を追加する。
  6. 同様に *.vbproj から MainPage.xaml.cs から MainPage.xaml を連結させている箇所を消す
  7. *.vbproj をエディタで開いて、XamlShare.Shared.projitems への Import を追加する。
  8. C# と VB の namespace を揃える。

とやると、上記の形になります。これで C# のプロジェクトは無事コンパイルができるのですが、VB の場合は、

エラー    1    ファイル “obj\Debug\D:\work\blog\src\XamlShare\XamlShare.Shared\MainPage.xbf” を “bin\Debug\D:\work\blog\src\XamlShare\XamlShare.Shared\MainPage.xbf” にコピーできません。指定されたパスのフォーマットはサポートされていません。    XamlShare.VB

のような謎なエラーを残してビルドができません。obj\Debug\D:\work\… のように変な形でドライブがついてしまっているのでビルド型式がおかしくなっているんでしょうね。共有プロジェクトのために、Update 2 で C# のビルド型式に修正を入れたのだと思います。残念。

よく見ると、VB のほうにはユニバーサルアプリがないという結果に。

image

で、ユニバーサルアプリのある C++ ならば、と思ってやってみるとビルドが通りました。うまくいかなかったと思ったけど、どこか手順をミスしたみたい。

サンプルは XamlShare-v0.2-src.zip から。

これは「空のアプリ」になっているので、後で中身を追加してみましょう。

カテゴリー: 開発 | C#とVBでXAMLを共有プロジェクトで使える…かと思ったけどできなかったの巻 はコメントを受け付けていません