SlideShare a Scribd company logo
1 of 36
XamarinとMvvmCrossとF#と
自分について 
宮坂雅彦 
@omanuke 
主に株式会社トレードワークスという会社で金融向け 
のソフトを作成 
F#大好き 
でもモナドとかよくわかってない
アジェンダ 
• 今回やってるものサラッと説明。 
• MvvmCross使ってみてあれこれ。 
• F#のおすすめ。 
• HTML5とのソース共有 
• 独自レイアウトツールについてさらっと。 
• Xamarinについて所感。
今回やってるもの構成 
• サーバーはWebAPI 
• VM以上をF#で作成 
• C#でアプリケーションスタートアップと 
UI周り 
• フレームワークとしてMvvmCross 
• ViewのレイアウトはAutoLayoutが糞っ 
ぽい難しいのでXAMLライクな独自レ 
イアウトツール作成 
サーバーWebAPI 
サービス 
ViewModel 
UIViewController 
レイアウト 
MvvmCross 
AppDelegate 
F# 
C#
Xamarin 
• C#でiOS/Androidなど含めクロスプラットフォーム開発でき 
る環境 
• ベースはMono。元MonoTouch・MonoDroidといわれてい 
たもの。 
• ネイティブアプリを開発できる。iOSはAOTコンパイル。 
AndoirdではJIT。 
• Mac向けもある。まだ成熟してないらしい… 
• MSもがっつり協力してる模様
MvvmCross 
• iOS、Android、WindowsPhone、WindowsStoreApp、WPF 
など様々なプラットフォームに対応したMVVMフレームワーク。 
• バインディングの他、サービスの登録、それをDI的に使うなど 
アプリケーションフレームワーク的な仕組みも。 
• ネイティブな機能を抽象的に扱えるプラグイン機能なども(使っ 
てないのでよくわかりません)。
MvvmCrossを使う上で調べたところ 
• アプリケーション全体の構成 
• バインディングどこまでできるのか 
• サービスの登録や利用、DI機能あるのか 
• ナビゲーション含む画面の単位とVMとの関係 
• それに絡んでタブビューでどう使えるのか 
• Viewの中に子ViewなどVMとバインディングしつつ部品化で 
きるのか 
• コレクションの表示はどうなるのか
アプリケーション全体の構成 
• MvxApplication-PCL側でServiceの 
登録やStartup画面登録など。 
• Setup-NativeUI側でMvxApplication 
の初期化など含むもろもろの初期化。 
それらのカスタマイズフック。 
• AppDelegateなどからSetup.Initialize 
呼び出してIMvxAppStartをResolveし 
てStart。 
MvxApplication 
登録 
Start時に 
生成 
RootVM 
Setup 
AppDelegate 
RootView 
Controller 
Start 
Initialize 
VM元に 
生成
バインディングどこまでできるのか 
• INotifyPropertyChangedでのプロパティバインディングとその 
Converterによる変換。 
• コマンドバインディング。 
• ObservableCollection使ってのコレクションのバインディング。 
• UIButtonのTitleなどプロパティじゃないものにもできる拡張あ 
り。 
• VMの中のVMなどネストしたVMに対してプロパティパス指定 
してバインド(一昨日知りました(-_-;))。
サービスの登録や利用、DI機能あるのか 
• Mvx.RegisterSingleton<IHoge>(()=>new Hoge())などある 
インターフェースに対する具象クラスを登録して、使うときに 
Resolveしてひっぱってこれる。 
• 開発時やテスト時にサーバーにリクエストするものの代わりに 
モックをRegistしとくなど。 
• Mvx.Resolve<IHoge>としてひっぱってきたりコンストラクタイ 
ンジェクションなどでDIすることもできます(ほかのパラメータ 
渡したいときはInitメソッド使う)
ナビゲーション含む画面の単位とVMの関係 
• VMが画面1ページとしか表示出来ないのなら色々めんどくさいと 
思っていたけれど、VMからUIViewController引っ張って何とでも 
なりそう。 
• VMとUIViewControllerを結び付ける手段はネーミングコンベン 
ションやらその型のViewModelプロパティを定義するなど色々。 
• Mvx.Resolve<IMvxTouchViewCreator>.CreateView(viewMode 
l) as MvxViewControllerでVMより該当のUIViewControllerを 
ひっぱる。 
• 普通のUIViewControllerとMvxViewControllerの混在とか問題な 
い(はず)。
タブビューでどう使うのか 
• タブのサンプルあるのでそれもとに解決。さっきのVMから 
ViewControllerを引っ張る方法はそれからソース追っかけて 
探したはず… 
• ざっくりいうとタブとして表示したい画面のもととなるVMをどっ 
かから引っ張ってきてそれ元にViewController作って 
UITabBarControllerのViewControllersにセットするなど。 
• これ含めハンバーガーメニューなどのやり方のサンプルなど 
もググれば出てくるはず。
Viewの中に子ViewなどVMとバインディングしつつ 
部品化できるのか 
• さっきも言ってたようにできる。VMの中にVMネストもできるので部 
品化も可。 
• UI側は各VMに対応したViewControllerを定義して小分けするも 
よし、親のViewControllerだけ定義して子のVMにバインドするも 
よし。プロパティパスだけ合えばおけー。 
• 各VMに対応したViewController作るなら各々のViewController 
の中でBindingSetを定義して使用。 
• 今回諸事情でネストした各VMに対応するViewをUIViewとする必 
要があったため、ルートのBindingSetをUIViewに渡してプロパ 
ティパス合わせて使用してる。VMの階層構造とUIの階層構造は 
関係ない。
コレクションの表示はどうなるのか 
MvxTableViewCell 
• MvxViewModel継承したものがはいってるObservableCollection 
をMvxTableViewSourceおよびその派生クラスを介して 
MvxTableViewCell継承したものに結び付けてバインドできる。 
• GetCellあたりでVMに応じたCellの作成を振り分けることで 
DataTemplate的なことができる(はず)。 
• VMに応じて高さが可変なCellはDelayでBindされるのとHeightを 
返すタイミングが合わず自前でVMのないように応じた高さを計算 
してかえさないといけなかったような気がします…(結局試してな 
いかも)
MvvmCrossのよいところ 
• 一通り、アプリケーションのコードを共有する仕組みはある。 
• 一番使われてる? 
• ドキュメント・サンプルが充実してる。動画もあるんですが、だ 
るくて見てません… 
• カメラや地図などネイティブの機能を抽象的に使えるプラグイ 
ン機能もあるのでプラットフォーム展開したい人は便利そう 
(使ってないのでよくわかりません)
MvvmCrossの悪いところ 
• ビヘイビアとかない?のでXAMLer的には不満? 
• iOSではバインディングとかC#で書かないと。 
• バインディングの記法がやたらありませんかね…Tibetとか 
Swissとか。歴史的な経緯? 
• XamarinFormsとかまともになってくるといらない子になる? 
• まだUnifiedAPIに対応してない?ので来年2月のアプリ登録が 
64bit必須になるのに対応できるのか不安・・・
F#についてざっくり 
• MS製の.NET向け関数型言語 
• OCamlライクな文法 
• 静的型付け 
• 関数型とオブジェクト指向のハイブリッド 
• デフォルトイミュータブルだが副作用を許容 
• Actorや非同期処理など組み込み 
• モナド的な仕組みもある(ComputationExpressions)
F#の良いところ 
• モデルの定義や業務ロジックを書きやすい。 
• コード量少なく、バグも少ない。 
• 非同期処理や入力待ちなどが混在する状態遷移をそのまま 
記述可。 
• javascript化してスマホやWebもワンソース化。 
• Xamarinの中の人も推してくれてる。
モデルの定義や業務ロジックを書きやすい 
• 代数データ型(Discriminated Union)、レコード型、タプルなど 
を使ってモデルの定義をクラスだけで表すよりもわかりやすく 
記述できる。 
• それに対する処理もパターンマッチを分かりやすく書ける。 
• 処理も型推論使ってコンパクトに書ける。C#だとタプル使おう 
とすると泣ける。 
• 数値に単位をつけてより厳密に扱える仕組みもある。 
• F#はとても良い業務記述言語です。
コード量少なく、バグも少ない 
• 先ほどのコンパクトなモデル記述や型推論、関数の合成など 
を使うことで、無駄な記述のない密度の高いコードが書ける。 
• 同じロジックを書いた場合、C#の30%ぐらいの量になるかと。 
• ヌルリを起こさない仕組みなどが最初からあり、デフォルト状 
態変更ができないので、バグの原因となる副作用があるコー 
ドの箇所が特定される->副作用あることに意識的になる。 
• C#でも副作用のないコードはかけるけどやはり書きにくい。 
C#はデフォルト副作用あり。F#はなし。
非同期処理や入力待ちなどが混在する状態 
遷移をそのまま記述可 
• asynchronous workflowsという仕組みを利用。await/async 
みたいなもの。 
• Aからあるイベントが起きたらBという状態に遷移して、そこで 
あるイベント起きたらCに遷移したりAに戻るなどの状態遷移 
をA,B,Cを対応したコードブロックとしてそのままかける。C#だ 
と末尾再帰ができないのでスタックオーバーフロー起こす。 
• UIのイベント待ちやサービスに対する非同期なリクエストなど 
もシームレスに書ける。
非同期処理や入力待ちなどが混在する状態 
遷移をそのまま記述可2
非同期処理や入力待ちなどが混在する状態 
遷移をそのまま記述可3 
• 遷移する際に値を引き渡せるので状態の更新間違いなどが 
入りこむ余地がない。 
• try-catch(with)の中でも使えます。 
• 詳しくはこちらでC# とF# のAsync: C# の非同期の落とし穴 
• asynchronous workflowはasync/awaitと違い.NET2.0ター 
ゲットでも使えます。
javascript化してスマホやWebもワンソース化 
• WebSharper 
F#で使える、AltJS。オプソにもなってるけど商用利用は有料。 
ほんとはAltJSというよりもWebサーバーとのやり取りも一緒に書け 
る開発環境らしい。 
気持ち開発者少ないような…日本人でまともに使ってる人他にいる 
のか不安(;´∀`)
javascript化してスマホやWebもワンソース化2 
• 今回株式・FXなどのリアルタイムチャートをワンソース化した。 
• F#といえども数千行あったのでjavascriptで書きなおすとかだ 
るい->WebSharperでコードの共有かにチャレンジ。 
• ロジックなどはほぼそのままで描画する部分などプラット 
フォームで違うところを抽象化して使用->95%をコード共有し 
た(気がする) 
• 出力されるコードも追いやすいのでデバッグなどで困ることも 
ほとんどなかった。
javascript化してスマホやWebもワンソース化3 
• とはいえ、それなりにめんどくさいですよ 
と。 
• 色々なものが使えない。string.Format的 
なのも使えないので泣ける。 
• javascript化するところは属性をつけない 
といけなかったり#if#elseなどで記述分け 
しないといけなかったりでコードが汚く… 
• けどものによっては十分にやる価値あり。 
使える範囲 
フル.NET 
PCL 
WebSharper
Xamarinの中の人も推してくれてる 
• F#だけでiOSアプリ作れるな 
ど一級市民扱い。 
• Sketchesも使えるようになっ 
たらしい(beta?)リンク。 
• いまだにWinRT用のライブラ 
リすら作らせてくれないMS 
の中の人よりもF#好きなん 
じゃないか疑惑。
F#の悪いところ 
• いうてもF#使える人が少ない… 
• PCLとして満足に使えるようになったのも去年。それまでは 
MSのコンパイラ自体PCLコードをうまく吐けなかったとかどう 
とか。色々プロファイルに対応してないなど。 
• PCL側がF#だとVSでないとデバッグしにくい。XSだとF#側に 
入ってくれない(最近試してません) 
• この間までF#のPCLプロジェクト、XSでビルドできず。最近で 
きるようになったけど、実行すると全く動かず。バイトコードが 
違うのかしら…
独自レイアウトツール 
• AutoLayout、説明を見てもどうみても糞っぽ難しい。 
• 前に作ったレイアウトライブラリがあったのでそれを使って独 
自レイアウトライブラリ作成。 
• XAMLライクな記述。 
– Grid 
– StackPanel(的なもの) 
– Margin,HorizontalAlignment,VerticalAignment 
– コントロールの作成、プロパティの設定。 
– Style
独自レイアウトツール2
独自レイアウトツール3 
• ファイル更新検知してレイアウトを反映するようにした。 
– シミュレータで実アプリを動かしながら編集して即反映できるので結 
構便利。 
• 実行時に値によって別のレイアウトに差し替えるなどもできる。 
ViewState的な?UIView.Animationの中でやればいい感じに 
アニメしてくれる。 
• XamarinFormsがよくなったらこれもいらなくなるかと思いつつ、 
動かしながらいじれるのは便利かとも思ってます。
Xamarin所感 
• まだツールなど怪しいところもある。 
– 去年の今頃はひどかった・・・ベータのある特定のバージョンじゃな 
いとVSと連携できないなど。うかつにあげると環境が壊れる。 
– 今も自分の環境ではVS->XS怪しい 
• VSからだと実機デプロイができない。XSからでしのぐ。 
• DebugSessionの開始時、一回は必ず失敗する。続けるとデバッグできる。 
– 細かいがエディタも怪しい動きをすることが…特にXMLをコピペする 
と前後の行が表示上ずれる。 
– でも最近は大分安定してきた感…
Xamarin所感2 
• けど実行自体は安定している。 
– いままで怪しい動きしてたのは実機デプロイ時にリフレクションだけ 
で使ってたコードが削られてすっ飛んでたときぐらい。 
• って書いてるそばから実機ではデザインが反映されない事象発生(;´∀`)こ 
れから調べる。 
– それも実機上でデバッグしてとかで追えた気がする(古いことなので 
忘れました…) 
– プロファイラとかもあるのでいろいろ調べられるかも(まだ使ってませ 
ん)リンク 
– スピードも特に問題ないような。ネイティブだともっと早いのかもです 
が比較してません。
Xamarin所感3 
• とりあえずクロスプラットフォーム開発ツールとしてとても実用 
的なので、iOS,Androidに席巻されてもF#,C#の人もこれから 
しばらく困らなそう。 
• AndroidWearとかAppleWatchとかWearableにも対応してく 
れる模様。 
• 関係ないですが、サーバー側も.NETオプソ化されたのでます 
ますF#,C#の人生きていくのに困らなくなりそうですね。

More Related Content

What's hot

Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Yoshito Tabuchi
 
Xamarin概要と活用方法
Xamarin概要と活用方法Xamarin概要と活用方法
Xamarin概要と活用方法Yoshito Tabuchi
 
Xamarin Native vs Xamarin Forms
Xamarin Native vs Xamarin FormsXamarin Native vs Xamarin Forms
Xamarin Native vs Xamarin FormsTomohiro Suzuki
 
2016.10.15アプリ発表会
2016.10.15アプリ発表会2016.10.15アプリ発表会
2016.10.15アプリ発表会b a
 
10分でわかる無料になったXamarin
10分でわかる無料になったXamarin10分でわかる無料になったXamarin
10分でわかる無料になったXamarinYoshito Tabuchi
 
Xamarin 概要 2017/01/15
Xamarin 概要 2017/01/15Xamarin 概要 2017/01/15
Xamarin 概要 2017/01/15Yoshito Tabuchi
 
Xamarin開発環境の選択
Xamarin開発環境の選択Xamarin開発環境の選択
Xamarin開発環境の選択Miho Kurosawa
 
Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Yoshito Tabuchi
 
Xamarin を使うとどんなことができるの?
Xamarin を使うとどんなことができるの?Xamarin を使うとどんなことができるの?
Xamarin を使うとどんなことができるの?Yoshito Tabuchi
 
BlueMonkeyプロジェクトのご紹介
BlueMonkeyプロジェクトのご紹介BlueMonkeyプロジェクトのご紹介
BlueMonkeyプロジェクトのご紹介Yoshito Tabuchi
 
20分でできる!Xamarin.Forms入門
20分でできる!Xamarin.Forms入門20分でできる!Xamarin.Forms入門
20分でできる!Xamarin.Forms入門Shinichi Hirauchi
 
#VSUG LT #JXUG の紹介
#VSUG LT #JXUG の紹介#VSUG LT #JXUG の紹介
#VSUG LT #JXUG の紹介Yoshito Tabuchi
 
Xamarin.forms実践投入してみて
Xamarin.forms実践投入してみてXamarin.forms実践投入してみて
Xamarin.forms実践投入してみてMasahiko Miyasaka
 
Xamarin.formsとカスタムコントロールの話
Xamarin.formsとカスタムコントロールの話Xamarin.formsとカスタムコントロールの話
Xamarin.formsとカスタムコントロールの話Masuda Tomoaki
 
Xamarin概要と活用方法
Xamarin概要と活用方法Xamarin概要と活用方法
Xamarin概要と活用方法Yoshito Tabuchi
 
Developers.io.札幌 xamarinってどうよ
Developers.io.札幌 xamarinってどうよDevelopers.io.札幌 xamarinってどうよ
Developers.io.札幌 xamarinってどうよShinichi Hirauchi
 
Xamarin 20141212 モバイルカフェスペシャル 「C#で作るiOS/Androidのクロスプラットフォームスマホアプリ開発」
Xamarin 20141212 モバイルカフェスペシャル 「C#で作るiOS/Androidのクロスプラットフォームスマホアプリ開発」Xamarin 20141212 モバイルカフェスペシャル 「C#で作るiOS/Androidのクロスプラットフォームスマホアプリ開発」
Xamarin 20141212 モバイルカフェスペシャル 「C#で作るiOS/Androidのクロスプラットフォームスマホアプリ開発」Yoshito Tabuchi
 
Xamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれXamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれTomohiro Suzuki
 
Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Yoshito Tabuchi
 
Prism.Formsについて
Prism.FormsについてPrism.Formsについて
Prism.Formsについて一希 大田
 

What's hot (20)

Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成
 
Xamarin概要と活用方法
Xamarin概要と活用方法Xamarin概要と活用方法
Xamarin概要と活用方法
 
Xamarin Native vs Xamarin Forms
Xamarin Native vs Xamarin FormsXamarin Native vs Xamarin Forms
Xamarin Native vs Xamarin Forms
 
2016.10.15アプリ発表会
2016.10.15アプリ発表会2016.10.15アプリ発表会
2016.10.15アプリ発表会
 
10分でわかる無料になったXamarin
10分でわかる無料になったXamarin10分でわかる無料になったXamarin
10分でわかる無料になったXamarin
 
Xamarin 概要 2017/01/15
Xamarin 概要 2017/01/15Xamarin 概要 2017/01/15
Xamarin 概要 2017/01/15
 
Xamarin開発環境の選択
Xamarin開発環境の選択Xamarin開発環境の選択
Xamarin開発環境の選択
 
Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成Xamarin を使用したC# によるモバイルアプリ作成
Xamarin を使用したC# によるモバイルアプリ作成
 
Xamarin を使うとどんなことができるの?
Xamarin を使うとどんなことができるの?Xamarin を使うとどんなことができるの?
Xamarin を使うとどんなことができるの?
 
BlueMonkeyプロジェクトのご紹介
BlueMonkeyプロジェクトのご紹介BlueMonkeyプロジェクトのご紹介
BlueMonkeyプロジェクトのご紹介
 
20分でできる!Xamarin.Forms入門
20分でできる!Xamarin.Forms入門20分でできる!Xamarin.Forms入門
20分でできる!Xamarin.Forms入門
 
#VSUG LT #JXUG の紹介
#VSUG LT #JXUG の紹介#VSUG LT #JXUG の紹介
#VSUG LT #JXUG の紹介
 
Xamarin.forms実践投入してみて
Xamarin.forms実践投入してみてXamarin.forms実践投入してみて
Xamarin.forms実践投入してみて
 
Xamarin.formsとカスタムコントロールの話
Xamarin.formsとカスタムコントロールの話Xamarin.formsとカスタムコントロールの話
Xamarin.formsとカスタムコントロールの話
 
Xamarin概要と活用方法
Xamarin概要と活用方法Xamarin概要と活用方法
Xamarin概要と活用方法
 
Developers.io.札幌 xamarinってどうよ
Developers.io.札幌 xamarinってどうよDevelopers.io.札幌 xamarinってどうよ
Developers.io.札幌 xamarinってどうよ
 
Xamarin 20141212 モバイルカフェスペシャル 「C#で作るiOS/Androidのクロスプラットフォームスマホアプリ開発」
Xamarin 20141212 モバイルカフェスペシャル 「C#で作るiOS/Androidのクロスプラットフォームスマホアプリ開発」Xamarin 20141212 モバイルカフェスペシャル 「C#で作るiOS/Androidのクロスプラットフォームスマホアプリ開発」
Xamarin 20141212 モバイルカフェスペシャル 「C#で作るiOS/Androidのクロスプラットフォームスマホアプリ開発」
 
Xamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれXamarin 実戦投入時に気をつけたいことあれこれ
Xamarin 実戦投入時に気をつけたいことあれこれ
 
Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015
 
Prism.Formsについて
Prism.FormsについてPrism.Formsについて
Prism.Formsについて
 

Viewers also liked

C#erがF#に這い寄ってみた
C#erがF#に這い寄ってみたC#erがF#に這い寄ってみた
C#erがF#に這い寄ってみたHiroshi Maekawa
 
Oculus 体験・勉強会「VRコンテンツ制作入門」
Oculus 体験・勉強会「VRコンテンツ制作入門」Oculus 体験・勉強会「VRコンテンツ制作入門」
Oculus 体験・勉強会「VRコンテンツ制作入門」Hiromichi Yamada
 
今日から始めるClojure
今日から始めるClojure今日から始めるClojure
今日から始めるClojureKiyotaka Kunihira
 
証券取引アプリとNote app作ってみた
証券取引アプリとNote app作ってみた証券取引アプリとNote app作ってみた
証券取引アプリとNote app作ってみたMasahiko Miyasaka
 
ドメイン駆動設計(DDD)導入判定チェックシート
ドメイン駆動設計(DDD)導入判定チェックシートドメイン駆動設計(DDD)導入判定チェックシート
ドメイン駆動設計(DDD)導入判定チェックシートTakuya Kawabe
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented ProgrammingScott Wlaschin
 
機械学習概論 講義テキスト
機械学習概論 講義テキスト機械学習概論 講義テキスト
機械学習概論 講義テキストEtsuji Nakai
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方Fumihiko Shiroyama
 

Viewers also liked (12)

C#erがF#に這い寄ってみた
C#erがF#に這い寄ってみたC#erがF#に這い寄ってみた
C#erがF#に這い寄ってみた
 
大人のお型付け
大人のお型付け大人のお型付け
大人のお型付け
 
Oculus 体験・勉強会「VRコンテンツ制作入門」
Oculus 体験・勉強会「VRコンテンツ制作入門」Oculus 体験・勉強会「VRコンテンツ制作入門」
Oculus 体験・勉強会「VRコンテンツ制作入門」
 
Swift
SwiftSwift
Swift
 
今日から始めるClojure
今日から始めるClojure今日から始めるClojure
今日から始めるClojure
 
証券取引アプリとNote app作ってみた
証券取引アプリとNote app作ってみた証券取引アプリとNote app作ってみた
証券取引アプリとNote app作ってみた
 
ドメイン駆動設計(DDD)導入判定チェックシート
ドメイン駆動設計(DDD)導入判定チェックシートドメイン駆動設計(DDD)導入判定チェックシート
ドメイン駆動設計(DDD)導入判定チェックシート
 
Swift vs. Language X
Swift vs. Language XSwift vs. Language X
Swift vs. Language X
 
20150414seminar
20150414seminar20150414seminar
20150414seminar
 
Railway Oriented Programming
Railway Oriented ProgrammingRailway Oriented Programming
Railway Oriented Programming
 
機械学習概論 講義テキスト
機械学習概論 講義テキスト機械学習概論 講義テキスト
機械学習概論 講義テキスト
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 

Similar to Xamarinとmvvm crossとf#と

第1回 Japan Xamarin User Group Conference - Xamarin 概要
第1回 Japan Xamarin User Group Conference - Xamarin 概要第1回 Japan Xamarin User Group Conference - Xamarin 概要
第1回 Japan Xamarin User Group Conference - Xamarin 概要Yoshito Tabuchi
 
超高速アプリ開発法
超高速アプリ開発法超高速アプリ開発法
超高速アプリ開発法Keiichi SASAKI
 
CloudFormation Getting Started with YAML
CloudFormation Getting Started with YAMLCloudFormation Getting Started with YAML
CloudFormation Getting Started with YAMLYukitaka Ohmura
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Yoshito Tabuchi
 
About rails 3
About rails 3About rails 3
About rails 3issei126
 
20140322 mvvm crossforwindowsstoreapps-pdf
20140322 mvvm crossforwindowsstoreapps-pdf20140322 mvvm crossforwindowsstoreapps-pdf
20140322 mvvm crossforwindowsstoreapps-pdfTakayoshi Tanaka
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料OCHI Shuji
 
XAMLとC#の関係
XAMLとC#の関係XAMLとC#の関係
XAMLとC#の関係c-mitsuba
 
MVCフレームワークとの付き合い方
MVCフレームワークとの付き合い方MVCフレームワークとの付き合い方
MVCフレームワークとの付き合い方Kazuki Shibata
 
Introduction to Xamarin - JXUG 20171209
Introduction to Xamarin - JXUG 20171209Introduction to Xamarin - JXUG 20171209
Introduction to Xamarin - JXUG 20171209Takeshi Fujimoto
 
軽量フレームワークNancy
軽量フレームワークNancy軽量フレームワークNancy
軽量フレームワークNancyNarami Kiyokura
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話simotin13 Miyazaki
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについてNobukazu Hanada
 
軽量ASP.NETフレームワークNancy
軽量ASP.NETフレームワークNancy軽量ASP.NETフレームワークNancy
軽量ASP.NETフレームワークNancyNarami Kiyokura
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチTomoharu ASAMI
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説Daisuke Nishino
 
MTセミナー2011/2/21 アイデアマンズ株式会社
MTセミナー2011/2/21 アイデアマンズ株式会社MTセミナー2011/2/21 アイデアマンズ株式会社
MTセミナー2011/2/21 アイデアマンズ株式会社Kunihiko Miyanaga
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby CocoaTomoki Maeda
 
なぜ Enterprise は Sencha を選ぶのか?
なぜ Enterprise は Sencha を選ぶのか?なぜ Enterprise は Sencha を選ぶのか?
なぜ Enterprise は Sencha を選ぶのか?久司 中村
 
Tech.G HTML5 プレ講座
Tech.G HTML5 プレ講座Tech.G HTML5 プレ講座
Tech.G HTML5 プレ講座Atsushi Miura
 

Similar to Xamarinとmvvm crossとf#と (20)

第1回 Japan Xamarin User Group Conference - Xamarin 概要
第1回 Japan Xamarin User Group Conference - Xamarin 概要第1回 Japan Xamarin User Group Conference - Xamarin 概要
第1回 Japan Xamarin User Group Conference - Xamarin 概要
 
超高速アプリ開発法
超高速アプリ開発法超高速アプリ開発法
超高速アプリ開発法
 
CloudFormation Getting Started with YAML
CloudFormation Getting Started with YAMLCloudFormation Getting Started with YAML
CloudFormation Getting Started with YAML
 
Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版Xamarin 概要 2014年08月版
Xamarin 概要 2014年08月版
 
About rails 3
About rails 3About rails 3
About rails 3
 
20140322 mvvm crossforwindowsstoreapps-pdf
20140322 mvvm crossforwindowsstoreapps-pdf20140322 mvvm crossforwindowsstoreapps-pdf
20140322 mvvm crossforwindowsstoreapps-pdf
 
2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料
 
XAMLとC#の関係
XAMLとC#の関係XAMLとC#の関係
XAMLとC#の関係
 
MVCフレームワークとの付き合い方
MVCフレームワークとの付き合い方MVCフレームワークとの付き合い方
MVCフレームワークとの付き合い方
 
Introduction to Xamarin - JXUG 20171209
Introduction to Xamarin - JXUG 20171209Introduction to Xamarin - JXUG 20171209
Introduction to Xamarin - JXUG 20171209
 
軽量フレームワークNancy
軽量フレームワークNancy軽量フレームワークNancy
軽量フレームワークNancy
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
 
軽量ASP.NETフレームワークNancy
軽量ASP.NETフレームワークNancy軽量ASP.NETフレームワークNancy
軽量ASP.NETフレームワークNancy
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
 
MTセミナー2011/2/21 アイデアマンズ株式会社
MTセミナー2011/2/21 アイデアマンズ株式会社MTセミナー2011/2/21 アイデアマンズ株式会社
MTセミナー2011/2/21 アイデアマンズ株式会社
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa
 
なぜ Enterprise は Sencha を選ぶのか?
なぜ Enterprise は Sencha を選ぶのか?なぜ Enterprise は Sencha を選ぶのか?
なぜ Enterprise は Sencha を選ぶのか?
 
Tech.G HTML5 プレ講座
Tech.G HTML5 プレ講座Tech.G HTML5 プレ講座
Tech.G HTML5 プレ講座
 

Xamarinとmvvm crossとf#と

  • 2. 自分について 宮坂雅彦 @omanuke 主に株式会社トレードワークスという会社で金融向け のソフトを作成 F#大好き でもモナドとかよくわかってない
  • 3. アジェンダ • 今回やってるものサラッと説明。 • MvvmCross使ってみてあれこれ。 • F#のおすすめ。 • HTML5とのソース共有 • 独自レイアウトツールについてさらっと。 • Xamarinについて所感。
  • 4. 今回やってるもの構成 • サーバーはWebAPI • VM以上をF#で作成 • C#でアプリケーションスタートアップと UI周り • フレームワークとしてMvvmCross • ViewのレイアウトはAutoLayoutが糞っ ぽい難しいのでXAMLライクな独自レ イアウトツール作成 サーバーWebAPI サービス ViewModel UIViewController レイアウト MvvmCross AppDelegate F# C#
  • 5. Xamarin • C#でiOS/Androidなど含めクロスプラットフォーム開発でき る環境 • ベースはMono。元MonoTouch・MonoDroidといわれてい たもの。 • ネイティブアプリを開発できる。iOSはAOTコンパイル。 AndoirdではJIT。 • Mac向けもある。まだ成熟してないらしい… • MSもがっつり協力してる模様
  • 6. MvvmCross • iOS、Android、WindowsPhone、WindowsStoreApp、WPF など様々なプラットフォームに対応したMVVMフレームワーク。 • バインディングの他、サービスの登録、それをDI的に使うなど アプリケーションフレームワーク的な仕組みも。 • ネイティブな機能を抽象的に扱えるプラグイン機能なども(使っ てないのでよくわかりません)。
  • 7. MvvmCrossを使う上で調べたところ • アプリケーション全体の構成 • バインディングどこまでできるのか • サービスの登録や利用、DI機能あるのか • ナビゲーション含む画面の単位とVMとの関係 • それに絡んでタブビューでどう使えるのか • Viewの中に子ViewなどVMとバインディングしつつ部品化で きるのか • コレクションの表示はどうなるのか
  • 8. アプリケーション全体の構成 • MvxApplication-PCL側でServiceの 登録やStartup画面登録など。 • Setup-NativeUI側でMvxApplication の初期化など含むもろもろの初期化。 それらのカスタマイズフック。 • AppDelegateなどからSetup.Initialize 呼び出してIMvxAppStartをResolveし てStart。 MvxApplication 登録 Start時に 生成 RootVM Setup AppDelegate RootView Controller Start Initialize VM元に 生成
  • 9. バインディングどこまでできるのか • INotifyPropertyChangedでのプロパティバインディングとその Converterによる変換。 • コマンドバインディング。 • ObservableCollection使ってのコレクションのバインディング。 • UIButtonのTitleなどプロパティじゃないものにもできる拡張あ り。 • VMの中のVMなどネストしたVMに対してプロパティパス指定 してバインド(一昨日知りました(-_-;))。
  • 10. サービスの登録や利用、DI機能あるのか • Mvx.RegisterSingleton<IHoge>(()=>new Hoge())などある インターフェースに対する具象クラスを登録して、使うときに Resolveしてひっぱってこれる。 • 開発時やテスト時にサーバーにリクエストするものの代わりに モックをRegistしとくなど。 • Mvx.Resolve<IHoge>としてひっぱってきたりコンストラクタイ ンジェクションなどでDIすることもできます(ほかのパラメータ 渡したいときはInitメソッド使う)
  • 11. ナビゲーション含む画面の単位とVMの関係 • VMが画面1ページとしか表示出来ないのなら色々めんどくさいと 思っていたけれど、VMからUIViewController引っ張って何とでも なりそう。 • VMとUIViewControllerを結び付ける手段はネーミングコンベン ションやらその型のViewModelプロパティを定義するなど色々。 • Mvx.Resolve<IMvxTouchViewCreator>.CreateView(viewMode l) as MvxViewControllerでVMより該当のUIViewControllerを ひっぱる。 • 普通のUIViewControllerとMvxViewControllerの混在とか問題な い(はず)。
  • 12. タブビューでどう使うのか • タブのサンプルあるのでそれもとに解決。さっきのVMから ViewControllerを引っ張る方法はそれからソース追っかけて 探したはず… • ざっくりいうとタブとして表示したい画面のもととなるVMをどっ かから引っ張ってきてそれ元にViewController作って UITabBarControllerのViewControllersにセットするなど。 • これ含めハンバーガーメニューなどのやり方のサンプルなど もググれば出てくるはず。
  • 13. Viewの中に子ViewなどVMとバインディングしつつ 部品化できるのか • さっきも言ってたようにできる。VMの中にVMネストもできるので部 品化も可。 • UI側は各VMに対応したViewControllerを定義して小分けするも よし、親のViewControllerだけ定義して子のVMにバインドするも よし。プロパティパスだけ合えばおけー。 • 各VMに対応したViewController作るなら各々のViewController の中でBindingSetを定義して使用。 • 今回諸事情でネストした各VMに対応するViewをUIViewとする必 要があったため、ルートのBindingSetをUIViewに渡してプロパ ティパス合わせて使用してる。VMの階層構造とUIの階層構造は 関係ない。
  • 14. コレクションの表示はどうなるのか MvxTableViewCell • MvxViewModel継承したものがはいってるObservableCollection をMvxTableViewSourceおよびその派生クラスを介して MvxTableViewCell継承したものに結び付けてバインドできる。 • GetCellあたりでVMに応じたCellの作成を振り分けることで DataTemplate的なことができる(はず)。 • VMに応じて高さが可変なCellはDelayでBindされるのとHeightを 返すタイミングが合わず自前でVMのないように応じた高さを計算 してかえさないといけなかったような気がします…(結局試してな いかも)
  • 15. MvvmCrossのよいところ • 一通り、アプリケーションのコードを共有する仕組みはある。 • 一番使われてる? • ドキュメント・サンプルが充実してる。動画もあるんですが、だ るくて見てません… • カメラや地図などネイティブの機能を抽象的に使えるプラグイ ン機能もあるのでプラットフォーム展開したい人は便利そう (使ってないのでよくわかりません)
  • 16. MvvmCrossの悪いところ • ビヘイビアとかない?のでXAMLer的には不満? • iOSではバインディングとかC#で書かないと。 • バインディングの記法がやたらありませんかね…Tibetとか Swissとか。歴史的な経緯? • XamarinFormsとかまともになってくるといらない子になる? • まだUnifiedAPIに対応してない?ので来年2月のアプリ登録が 64bit必須になるのに対応できるのか不安・・・
  • 17. F#についてざっくり • MS製の.NET向け関数型言語 • OCamlライクな文法 • 静的型付け • 関数型とオブジェクト指向のハイブリッド • デフォルトイミュータブルだが副作用を許容 • Actorや非同期処理など組み込み • モナド的な仕組みもある(ComputationExpressions)
  • 18. F#の良いところ • モデルの定義や業務ロジックを書きやすい。 • コード量少なく、バグも少ない。 • 非同期処理や入力待ちなどが混在する状態遷移をそのまま 記述可。 • javascript化してスマホやWebもワンソース化。 • Xamarinの中の人も推してくれてる。
  • 19. モデルの定義や業務ロジックを書きやすい • 代数データ型(Discriminated Union)、レコード型、タプルなど を使ってモデルの定義をクラスだけで表すよりもわかりやすく 記述できる。 • それに対する処理もパターンマッチを分かりやすく書ける。 • 処理も型推論使ってコンパクトに書ける。C#だとタプル使おう とすると泣ける。 • 数値に単位をつけてより厳密に扱える仕組みもある。 • F#はとても良い業務記述言語です。
  • 20. コード量少なく、バグも少ない • 先ほどのコンパクトなモデル記述や型推論、関数の合成など を使うことで、無駄な記述のない密度の高いコードが書ける。 • 同じロジックを書いた場合、C#の30%ぐらいの量になるかと。 • ヌルリを起こさない仕組みなどが最初からあり、デフォルト状 態変更ができないので、バグの原因となる副作用があるコー ドの箇所が特定される->副作用あることに意識的になる。 • C#でも副作用のないコードはかけるけどやはり書きにくい。 C#はデフォルト副作用あり。F#はなし。
  • 21.
  • 22.
  • 23. 非同期処理や入力待ちなどが混在する状態 遷移をそのまま記述可 • asynchronous workflowsという仕組みを利用。await/async みたいなもの。 • Aからあるイベントが起きたらBという状態に遷移して、そこで あるイベント起きたらCに遷移したりAに戻るなどの状態遷移 をA,B,Cを対応したコードブロックとしてそのままかける。C#だ と末尾再帰ができないのでスタックオーバーフロー起こす。 • UIのイベント待ちやサービスに対する非同期なリクエストなど もシームレスに書ける。
  • 25. 非同期処理や入力待ちなどが混在する状態 遷移をそのまま記述可3 • 遷移する際に値を引き渡せるので状態の更新間違いなどが 入りこむ余地がない。 • try-catch(with)の中でも使えます。 • 詳しくはこちらでC# とF# のAsync: C# の非同期の落とし穴 • asynchronous workflowはasync/awaitと違い.NET2.0ター ゲットでも使えます。
  • 26. javascript化してスマホやWebもワンソース化 • WebSharper F#で使える、AltJS。オプソにもなってるけど商用利用は有料。 ほんとはAltJSというよりもWebサーバーとのやり取りも一緒に書け る開発環境らしい。 気持ち開発者少ないような…日本人でまともに使ってる人他にいる のか不安(;´∀`)
  • 27. javascript化してスマホやWebもワンソース化2 • 今回株式・FXなどのリアルタイムチャートをワンソース化した。 • F#といえども数千行あったのでjavascriptで書きなおすとかだ るい->WebSharperでコードの共有かにチャレンジ。 • ロジックなどはほぼそのままで描画する部分などプラット フォームで違うところを抽象化して使用->95%をコード共有し た(気がする) • 出力されるコードも追いやすいのでデバッグなどで困ることも ほとんどなかった。
  • 28. javascript化してスマホやWebもワンソース化3 • とはいえ、それなりにめんどくさいですよ と。 • 色々なものが使えない。string.Format的 なのも使えないので泣ける。 • javascript化するところは属性をつけない といけなかったり#if#elseなどで記述分け しないといけなかったりでコードが汚く… • けどものによっては十分にやる価値あり。 使える範囲 フル.NET PCL WebSharper
  • 29. Xamarinの中の人も推してくれてる • F#だけでiOSアプリ作れるな ど一級市民扱い。 • Sketchesも使えるようになっ たらしい(beta?)リンク。 • いまだにWinRT用のライブラ リすら作らせてくれないMS の中の人よりもF#好きなん じゃないか疑惑。
  • 30. F#の悪いところ • いうてもF#使える人が少ない… • PCLとして満足に使えるようになったのも去年。それまでは MSのコンパイラ自体PCLコードをうまく吐けなかったとかどう とか。色々プロファイルに対応してないなど。 • PCL側がF#だとVSでないとデバッグしにくい。XSだとF#側に 入ってくれない(最近試してません) • この間までF#のPCLプロジェクト、XSでビルドできず。最近で きるようになったけど、実行すると全く動かず。バイトコードが 違うのかしら…
  • 31. 独自レイアウトツール • AutoLayout、説明を見てもどうみても糞っぽ難しい。 • 前に作ったレイアウトライブラリがあったのでそれを使って独 自レイアウトライブラリ作成。 • XAMLライクな記述。 – Grid – StackPanel(的なもの) – Margin,HorizontalAlignment,VerticalAignment – コントロールの作成、プロパティの設定。 – Style
  • 33. 独自レイアウトツール3 • ファイル更新検知してレイアウトを反映するようにした。 – シミュレータで実アプリを動かしながら編集して即反映できるので結 構便利。 • 実行時に値によって別のレイアウトに差し替えるなどもできる。 ViewState的な?UIView.Animationの中でやればいい感じに アニメしてくれる。 • XamarinFormsがよくなったらこれもいらなくなるかと思いつつ、 動かしながらいじれるのは便利かとも思ってます。
  • 34. Xamarin所感 • まだツールなど怪しいところもある。 – 去年の今頃はひどかった・・・ベータのある特定のバージョンじゃな いとVSと連携できないなど。うかつにあげると環境が壊れる。 – 今も自分の環境ではVS->XS怪しい • VSからだと実機デプロイができない。XSからでしのぐ。 • DebugSessionの開始時、一回は必ず失敗する。続けるとデバッグできる。 – 細かいがエディタも怪しい動きをすることが…特にXMLをコピペする と前後の行が表示上ずれる。 – でも最近は大分安定してきた感…
  • 35. Xamarin所感2 • けど実行自体は安定している。 – いままで怪しい動きしてたのは実機デプロイ時にリフレクションだけ で使ってたコードが削られてすっ飛んでたときぐらい。 • って書いてるそばから実機ではデザインが反映されない事象発生(;´∀`)こ れから調べる。 – それも実機上でデバッグしてとかで追えた気がする(古いことなので 忘れました…) – プロファイラとかもあるのでいろいろ調べられるかも(まだ使ってませ ん)リンク – スピードも特に問題ないような。ネイティブだともっと早いのかもです が比較してません。
  • 36. Xamarin所感3 • とりあえずクロスプラットフォーム開発ツールとしてとても実用 的なので、iOS,Androidに席巻されてもF#,C#の人もこれから しばらく困らなそう。 • AndroidWearとかAppleWatchとかWearableにも対応してく れる模様。 • 関係ないですが、サーバー側も.NETオプソ化されたのでます ますF#,C#の人生きていくのに困らなくなりそうですね。