Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Porting Windows Forms App to Xamarin.Mac
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ailen0ada
May 07, 2016
Programming
3.7k
1
Share
Porting Windows Forms App to Xamarin.Mac
2016/5/7 JXUGC #13 の発表資料です。
ailen0ada
May 07, 2016
More Decks by ailen0ada
See All by ailen0ada
How we create our app using Xamarin;
ailen0ada
3
2.3k
.NET Conf 2017 Tokyo, Japan
ailen0ada
1
220
Say hello to Cocoa development with Xamarin.Mac
ailen0ada
1
200
Other Decks in Programming
See All in Programming
GitHub Copilot CLIのいいところ
htkym
2
1.2k
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
380
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
310
Hive Metastoreを通して学ぶIceberg REST Catalog ― 仕様から実装まで
okumin
0
300
iOS26時代の新規アプリ開発
yuukiw00w
0
210
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
2.9k
LLM Plugin for Node-REDの利用方法と開発について
404background
0
130
Transactional Change Stream Processing With Debezium and Apache Flink
gunnarmorling
1
140
分析エージェント精度向上における データアナリストの役割
oura_shoya
0
130
関係性から理解する"同一性"の型用語たち
pvcresin
2
600
さぁV100、メモリをお食べ・・・
nilpe
0
110
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.1k
Featured
See All Featured
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
210
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
370
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
Optimizing for Happiness
mojombo
378
71k
Deep Space Network (abreviated)
tonyrice
0
150
How to Think Like a Performance Engineer
csswizardry
28
2.6k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Building Applications with DynamoDB
mza
96
7.1k
Site-Speed That Sticks
csswizardry
13
1.2k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Transcript
Porting Windows Forms App to Xamarin.Mac Cuminas Corporation Tsubasa HIRANO
@ailen0ada 2016/5/7 JXUGC#13
About me 平野 翼 a.k.a. Xamarin.Macの人 ◦ クミナス株式会社 と 五反田の会社
◦ Xamarin 3年生 ◦ Blog: http://aile.hatenablog.com/ ◦ Facebook: ailen0ada ◦ Twitter: @ailen0ada 2016/5/7 JXUGC #13 TOKYO 2
Agenda 1. Did you know Xamarin.Mac? 2. Remember Windows Forms
3. Introducing Gochiusearch 4. Develop strategy of porting App 5. Summary 2016/5/7 JXUGC #13 TOKYO 3
Xamarin.Mac nowadays 2016/5/7 JXUGC #13 TOKYO 4
Xamarin.Mac is... C# という共通言語でMac プラットフォームとお話しできる =ほとんどフルの.NET Framework + OSX API
Binding Mac向けアプリケーション開発環境 ◦ Xamarin.Forms 非対応 ◦ VisualStudio 非対応 ◦ Xamarin University クラスなし 2016/5/7 JXUGC #13 TOKYO 5
Windows Forms 意外と強力なクロスプラットフォームフレームワーク ◦ Mono の互換実装 WinForms により Linux, Mac
でも動作可能 ◦ Windows でビルドした exe ファイルを Mono 経由で叩くだけ ◦ Wine との相性も◎ 標準コントロールだけの業務アプリなら別にこれでよし? 2016/5/7 JXUGC #13 TOKYO 6
Gochiusearch アニメご注文はうさぎですか?全画像約100万枚を対象とした 検索エンジン 2016/5/7 JXUGC #13 TOKYO 7
Gochiusearch 選定の理由 Mac といえば Cocoa ◦ ココアさん推しです Windows Forms で作られている
◦ 3 プラットフォームで共通のUIで動作する 大きすぎず,適度な難易度 ◦ グラフィックス周り ◦ ドラッグ&ドロップ(ファイル&ブラウザ) とにかく堂々と発表できる事例が作りたかった 2016/5/7 JXUGC #13 TOKYO 8
Demo MONO,MONOMAC,APPSTORE 2016/5/7 JXUGC #13 TOKYO 9
そりゃまあ動くけど Macでのユーザーインタフェースは問題だらけ ◦ メニューバーがクリックできない ◦ アプリケーション名がmono, アイコンも変更できない ◦ フォントレンダリングがちょっと… ◦
ブラウザからのドラッグ&ドロップに対応できない 動作するのと,快適に使うことができるかは別問題 2016/5/7 JXUGC #13 TOKYO 10
試作: MonoMac で薄くラップする バンドル化の機能を使う ◦ mkbundle でもできるはず,うまくいかなかった ◦ MainForm.cs のドラッグ&ドロップ周りだけオーバーライドする
ユーザーインタフェースの問題は解決しない ◦ WinForms には変わりない ◦ ただ Mac アプリっぽく振る舞うことはできるようになる コレジャナイ 2016/5/7 JXUGC #13 TOKYO 11
Xamarin! Xamarin! Xamarin! 1. Windows プラットフォーム依存コードを洗い出す ◦ System.Drawing, System.Windows 名前空間への依存
2. ユーザーインタフェースを xib で実装 ◦ Storyboard を使うと 10.9 で起動できなくなる 3. ImageSearch はそのままに,まず Full Mono で実装 4. ImageSearch を PCL 化,Xamarin.Mac Mobile に移行 5. AppStore 提出 2016/5/7 JXUGC #13 TOKYO 12
Xamarin.Mac Mobile Framework 可能な限りこのフレームワークを使う ◦ ランタイムがiOS向けチューンされたものと同等になる ◦ ライブラリのリンクが可能,バイナリサイズの削減=起動時間の短縮 ◦ .NETアセンブリはPCL限定,Cocoa
側はフルに利用可能 ImageSearch ライブラリのPCL化 System.Drawing.Graphics の排除 2016/5/7 JXUGC #13 TOKYO 13
ImageSearch を移植可能に 2016/5/7 JXUGC #13 TOKYO 14 ImageSearchEngine DB読み込み 画像
読み込み 画像の縮小 ビット ベクトル 算出 ハミング 距離 算出 DBの検索 入 力 出 力 System.IO.FileStream System.Drawing.Bitmap System.Drawing.Rectangle プラットフォーム依存なし System.Drawing.Graphics
ImageSearch を移植可能に 2016/5/7 JXUGC #13 TOKYO 15 ImageSearchEngine.Portable DB読み込み 画像の縮小
ビット ベクトル 算出 ハミング 距離 算出 DBの検索 入 力 出 力 PCLStorage XMSearch 画像 読み込み CGImage 経由で画像の読み込み 32bppARGB のバイト列に展開
Sandboxing セキュリティの向上,AppStore 提出基準への適合 ◦ ユーザーが指定したファイル・フォルダのみ読み書き可能 ◦ ネットワークアクセスなども制限 ◦ アプリケーションの生成したファイルはすべてコンテナフォルダへ ◦
~/Library/Containers/{app bundle name}/Data ◦ Environment.SpecialFolderも影響を受ける SecurityException は送出されない ◦ 行おうとした操作によって例外は異なる コンソールで特定 ◦ ex) Outgoing connectionを許可していなかった場合はWebException – 名前解決エラー ◦ mDNSResponderへのアクセスが拒否されるため 2016/5/7 JXUGC #13 TOKYO 16
Cocoaの使いどころ 画像かどうかの判定 ◦ 元ソースでは拡張子による判定 ◦ Macではシステムがある程度判別してくれる=Uniform Type Identifier ◦ UTI
が画像だったら CGImage も大体作れる パスの分解・結合をNSString/NSUrl にやらせる ◦ PathComponents を使って部分パスの取得や追加ができる CGImageによる画像読み込み,ローカライゼーション 無理に共通化にこだわらない ◦ プラットフォームAPIを使った方が高速,便利な場面を見極める 2016/5/7 JXUGC #13 TOKYO 17
Practice まず Full Mono で動くところまで持って行く ◦ ユーザーインタフェースをXcodeで作って,元ソースを切り貼りする ◦ MessageBoxなどコモンダイアログ系はこの段階で移行 Mobile
Frameworkに変更してみる ◦ 動けばよし,動かない点をピックアップする ◦ データアクセス部分をPCLにしていけばほぼ終わり どうにもならないときだけ Xamarin.Mac 4.5 Framework ◦ PCL として配布されてないNuGet パッケージに依存している場合で, 代替もないときに限られるはず 2016/5/7 JXUGC #13 TOKYO 18
Unleash the power of Xamarin.Mac .NET と Cocoa のいいとこ取りができる ◦
すべてを .NET Framework 内で完結する必要はない ◦ Mac には Mac の流儀がある! ◦ もちろん共通項は PCL にまとめておける フル機能の Mono を使うこともできる ◦ System.Drawing とか System.Configuration に依存していても大丈夫 ◦ 期待通りに動作しない部分だけ Cocoa を使えばいい デバッグが高速,シミュレータなんて不要!すぐ試せます 2016/5/7 JXUGC #13 TOKYO 19
Now available on the App Store 2016/5/7 JXUGC #13 TOKYO
20
Thank you. より詳細なステップバイステップはブログで http://aile.hatenablog.com/ 2016/5/7 JXUGC #13 TOKYO 21