Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
JXUGのLTだけれども 
Unity+iOS+LINQ 
の話をしようと思う! 
室星亮太 
2014/11/22(土)(第2回(Japan(Xamarin(User(Group(Conference(東日本編
すいません
Xamarin.iOSとXamarin.Androidの話
ほとんどしません!
お前だれよ? 
• 名前":"室星亮太 
• 仕事":"Unityでゲーム開発 
• Twi+er":"@RyotaMurohoshi 
• 投稿先":"h+p://qiita.com/RyotaMurohoshi
Unityクラスタから来ました!
Unityって何? 
• ゲームエンジン(今日は) 
• DI&コンテナじゃないよ 
• C#で開発(他はBooとUnityScript) 
• Xamarin社の製品の中核であるmonoを利用 
• ただし古いmono
Xamarinの製品の中核であるmono。 
このmono使っているUnityの話を 
JXUGでしても、いいですよね?
ねっ!? 
「そんな話、聞きたくないよ」って方、すいません。
突然ですが
LINQ最高ですよね!
LINQご存知な方? 
LINQ使っている方?
XLso%様のXamarinのページでも、 
LINQで書けることを推している! 
昔はXamarin本家にも「C#で書けて、LINQ使えていいよね!」ってあった気がする! 
h"p://www.xlso,.com/jp/products/xa...
想像してください! 
LINQが使えなくなることを! 
LINQが突然エラーはくことを!
実は...
Unity+iOSだと 
LINQ、死ねるんです!!!
Xamarin.iOSもいくつか制限があるようですが 
そういうレベルではないです。 
h"p://developer.xamarin.com/guides/ios/advanced_topics/limita8ons/
今日お話しするのは、LINQ%to%Objectsです。
「LINQ、死ねる」とは、iOS実機でいくつかのLINQメッソッドが、 
条件次第で実行時エラーになることを言っています。 
ちなみに、ゲーム自体は強制終了はされません。
何がエラーになるかといいますと
Unity+iOSで、エラーになる可能性があるLINQメソッド 
Average Max Min Sum 
FirstOrDefault Last LastOrDefault Single SingleOrDefault 
ToDic9onar...
結構エラーになる! 
しかも条件が結構複雑!例えばあるオーバーロードでかつ値型とか
詳しくは、こちら! 
Unity+iOSでエラーになるLINQのまとめ 
h"p://qiita.com/RyotaMurohoshi/items/6602e50d9e08b487f47
つらい!
Unity+iOSでもLINQが使いたい! 
LINQ禁止とかつらすぎます... 
C#で書くのに、LINQ使わないのはもったいない
作っちゃいましょう!
Unity+iOSでもOKな、 
LINQ互換ライブラリを!
Xamarinでは(最新のmono/monoのリポジトリの方)、 
修正されていてLINQ落ちないらしい!
monoのクラスライブラリは 
MITライセンス
では最新monoのEnumerableとか関連クラス 
コピペしてちょっと修正すればいいのでは!?
さっそくやってみました!
コピペしたコードで、まずSumを試します 
[Test] 
public void TestAverage () 
{ 
string[] strings = new []{"Java", "Groovy", "C#", "F#"}; 
Ass...
落ちずに成功!やった!
この調子で次はToDic&nary 
[Test] 
public void TestToDictionay () 
{ 
int[] nums = new []{0, 1, 2, 3, 4}; 
Dictionary<int, int> di...
あれ、落ちた...
つらい
最新mono何が変更されているのか? 
下記コミットでガッツり変わったようです! 
h"ps://github.com/mono/mono/commit/071f495d6a4ce4951e2b2c9069586bd5bcde5>b 
参考:h...
904$addi(ons$and$201$dele(ons. 
githubに飛んでみてください、真緑!びっくりするほど緑! 
SumとかAverageとかが修正されています 
h"ps://github.com/mono/mono/commi...
コードの重複、重複!重複!!! 
デリゲートを利用しコードの共通化していた部分を、がっつりコード重複させていた!
DRY?%大切ですよね! 
けど、API提供側はコードの奇麗さも大事だけれど、 
API利用側が正しく奇麗に使えることが大切!
下記のコミットメッセージを見ると、 
AOTコンパイル環境下でラムダ式の推論が 
うまくいなかいことがあるみたい 
h"ps://github.com/mono/mono/commit/071f495d6a4ce4951e2b2c9069586...
ランタイム側やコンパイラ側でも 
ジェネリクス+ラムダ式+値型関連が修正されているっぽい? 
最新Xamarin.iOSでは正しく推論できるジェネリクス+ラムダ式が 
Unityの方ではできない?
最新monoそのままコピペじゃだめで、要修正! 
ジェネリクス+デリゲートな箇所を徹底的に削除!
原因になっているFunc%on.Iden%tyとかPredicateOf.Alwaysとか 
static class Function<T> { 
public static readonly Func<T, T> Identity = (t...
LINQのメソッドには、複数オーバーロードがあるものがいくつか 
nums.FirstOrDefault (); 
nums.FirstOrDefault (predicate: it => it > 3); 
nums.ToDictionar...
デリゲートを引数にとるオーバーロード 
デリゲートを引数に取らないオーバーロード 
これらをFunc%on.Iden%tyやPredicateOf.Alwaysで、 
いい感じにコードを共通化しているメソッドがある 
最新monoはifディレク...
ジェネリクス+デリゲートで 
いい感じにコードを共通化している箇所を 
徹底的に重複、重複!、重複!!!
DRY?%大切ですよね! 
けど、API提供側はコードの奇麗さも大事だけれど、 
API利用側が正しく奇麗に使えることが大切!
こんな感じで頑張って作ります! 
ジェネリクス+ラムダ式な部分を無くします 
そして確認します!
テストするのも一苦労! 
• Unityの開発環境だと落ちない、シミュレータでも落ちない 
• テストはiOSの実機でやらないといけない 
• NUnitをiOSの実機で走らせたら、NUnitがAOT関連のエラー
AOT関連のエラーがおきないか調べるために 
テストしようとしているのに、 
テストフレームワーク自体がAOT関連エラーって!
つらい!!!
NUnitLiteを使って、 
iOS実機でテストをしている例を発見! 
成功! 
(Xamarin.iOSもNUnitLiteベースらしい)
OrderBy系、ThenBy系も対処! 
これらの対処は別アプローチ
作っているLINQ互換ライブラリについて 
• ライセンスとか、READMEとか、いろいろ整えています 
• Unity+iOS+LINQ、このメソッド落ちたとか情報下さい! 
• その内githubで公開します! 
• どうやって修正したかも...
まとめ(1) 
• JXUGでUnityの話して、すいませんでした! 
• LINQ、みなさん使いますよね? 
• Unity+iOSだとこんな感じで、LINQ落ちます 
• 最新monoはいろいろ修正されている 
• Unity+iOSでも落...
まとめ(2) 
• 昔のmono/monoのLINQの方には問題があった 
• けど今は修正されている 
• さすがXamarin社様 
• さすがmonoコミュニティの方々
One$more$thing
Unityで使っている古いmonoのLINQ、 
実装にいくつかミスがあるみたいです 
例えばExceptメソッド 
new []{1, 1, 2}.Except(new []{2});
やっぱりC#で書く以上 
LINQを使いたい、Unityでも!
だから頑張って作って、 
布教したいと思います!
ありがとうございました 
@RyotaMurohoshi
Upcoming SlideShare
Loading in …5
×

JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!

1,381 views

Published on

2014/11/22(土)に開かれた
第2回 Japan Xamarin User Group Conference 東日本編
(https://atnd.org/events/57246)

のLTで発表した資料です。

Published in: Technology
  • Be the first to comment

JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!

  1. 1. JXUGのLTだけれども Unity+iOS+LINQ の話をしようと思う! 室星亮太 2014/11/22(土)(第2回(Japan(Xamarin(User(Group(Conference(東日本編
  2. 2. すいません
  3. 3. Xamarin.iOSとXamarin.Androidの話
  4. 4. ほとんどしません!
  5. 5. お前だれよ? • 名前":"室星亮太 • 仕事":"Unityでゲーム開発 • Twi+er":"@RyotaMurohoshi • 投稿先":"h+p://qiita.com/RyotaMurohoshi
  6. 6. Unityクラスタから来ました!
  7. 7. Unityって何? • ゲームエンジン(今日は) • DI&コンテナじゃないよ • C#で開発(他はBooとUnityScript) • Xamarin社の製品の中核であるmonoを利用 • ただし古いmono
  8. 8. Xamarinの製品の中核であるmono。 このmono使っているUnityの話を JXUGでしても、いいですよね?
  9. 9. ねっ!? 「そんな話、聞きたくないよ」って方、すいません。
  10. 10. 突然ですが
  11. 11. LINQ最高ですよね!
  12. 12. LINQご存知な方? LINQ使っている方?
  13. 13. XLso%様のXamarinのページでも、 LINQで書けることを推している! 昔はXamarin本家にも「C#で書けて、LINQ使えていいよね!」ってあった気がする! h"p://www.xlso,.com/jp/products/xamarin/android.html7とか
  14. 14. 想像してください! LINQが使えなくなることを! LINQが突然エラーはくことを!
  15. 15. 実は...
  16. 16. Unity+iOSだと LINQ、死ねるんです!!!
  17. 17. Xamarin.iOSもいくつか制限があるようですが そういうレベルではないです。 h"p://developer.xamarin.com/guides/ios/advanced_topics/limita8ons/
  18. 18. 今日お話しするのは、LINQ%to%Objectsです。
  19. 19. 「LINQ、死ねる」とは、iOS実機でいくつかのLINQメッソッドが、 条件次第で実行時エラーになることを言っています。 ちなみに、ゲーム自体は強制終了はされません。
  20. 20. 何がエラーになるかといいますと
  21. 21. Unity+iOSで、エラーになる可能性があるLINQメソッド Average Max Min Sum FirstOrDefault Last LastOrDefault Single SingleOrDefault ToDic9onary ToLookup Join GroupJoin OrderBy OrderByDescending ThenBy ThenByDescending ※!これらのメソッド使ったら必ず落ちるわけではなくて条件次第で落ちることもある
  22. 22. 結構エラーになる! しかも条件が結構複雑!例えばあるオーバーロードでかつ値型とか
  23. 23. 詳しくは、こちら! Unity+iOSでエラーになるLINQのまとめ h"p://qiita.com/RyotaMurohoshi/items/6602e50d9e08b487f47
  24. 24. つらい!
  25. 25. Unity+iOSでもLINQが使いたい! LINQ禁止とかつらすぎます... C#で書くのに、LINQ使わないのはもったいない
  26. 26. 作っちゃいましょう!
  27. 27. Unity+iOSでもOKな、 LINQ互換ライブラリを!
  28. 28. Xamarinでは(最新のmono/monoのリポジトリの方)、 修正されていてLINQ落ちないらしい!
  29. 29. monoのクラスライブラリは MITライセンス
  30. 30. では最新monoのEnumerableとか関連クラス コピペしてちょっと修正すればいいのでは!?
  31. 31. さっそくやってみました!
  32. 32. コピペしたコードで、まずSumを試します [Test] public void TestAverage () { string[] strings = new []{"Java", "Groovy", "C#", "F#"}; Assert.That (strings.Sum (it => it.Length), Is.EqualTo (14)); }
  33. 33. 落ちずに成功!やった!
  34. 34. この調子で次はToDic&nary [Test] public void TestToDictionay () { int[] nums = new []{0, 1, 2, 3, 4}; Dictionary<int, int> dict = nums.ToDictionary (it => it); }
  35. 35. あれ、落ちた...
  36. 36. つらい
  37. 37. 最新mono何が変更されているのか? 下記コミットでガッツり変わったようです! h"ps://github.com/mono/mono/commit/071f495d6a4ce4951e2b2c9069586bd5bcde5>b 参考:h#p://neue.cc/2014/07/01_474.html
  38. 38. 904$addi(ons$and$201$dele(ons. githubに飛んでみてください、真緑!びっくりするほど緑! SumとかAverageとかが修正されています h"ps://github.com/mono/mono/commit/071f495d6a4ce4951e2b2c9069586bd5bcde5>b
  39. 39. コードの重複、重複!重複!!! デリゲートを利用しコードの共通化していた部分を、がっつりコード重複させていた!
  40. 40. DRY?%大切ですよね! けど、API提供側はコードの奇麗さも大事だけれど、 API利用側が正しく奇麗に使えることが大切!
  41. 41. 下記のコミットメッセージを見ると、 AOTコンパイル環境下でラムダ式の推論が うまくいなかいことがあるみたい h"ps://github.com/mono/mono/commit/071f495d6a4ce4951e2b2c9069586bd5bcde5>b
  42. 42. ランタイム側やコンパイラ側でも ジェネリクス+ラムダ式+値型関連が修正されているっぽい? 最新Xamarin.iOSでは正しく推論できるジェネリクス+ラムダ式が Unityの方ではできない?
  43. 43. 最新monoそのままコピペじゃだめで、要修正! ジェネリクス+デリゲートな箇所を徹底的に削除!
  44. 44. 原因になっているFunc%on.Iden%tyとかPredicateOf.Alwaysとか static class Function<T> { public static readonly Func<T, T> Identity = (t) => t; } static class PredicateOf<T> { public static readonly Func<T, bool> Always = (t) => true; } h"ps://github.com/Unity3Technologies/mono/blob/unity34.5/mcs/class/System.Core/System.Linq/ Enumerable.cs より
  45. 45. LINQのメソッドには、複数オーバーロードがあるものがいくつか nums.FirstOrDefault (); nums.FirstOrDefault (predicate: it => it > 3); nums.ToDictionary (keySelector: it => it); nums.ToDictionary (keySelector: it => it, elementSelector: it => it.toString ()); デリゲートが引数に追加されているものが多い
  46. 46. デリゲートを引数にとるオーバーロード デリゲートを引数に取らないオーバーロード これらをFunc%on.Iden%tyやPredicateOf.Alwaysで、 いい感じにコードを共通化しているメソッドがある 最新monoはifディレクティブでPredicateOf.Always使わないようにしている けれどコピペしただけではifディレクティブが効いていない
  47. 47. ジェネリクス+デリゲートで いい感じにコードを共通化している箇所を 徹底的に重複、重複!、重複!!!
  48. 48. DRY?%大切ですよね! けど、API提供側はコードの奇麗さも大事だけれど、 API利用側が正しく奇麗に使えることが大切!
  49. 49. こんな感じで頑張って作ります! ジェネリクス+ラムダ式な部分を無くします そして確認します!
  50. 50. テストするのも一苦労! • Unityの開発環境だと落ちない、シミュレータでも落ちない • テストはiOSの実機でやらないといけない • NUnitをiOSの実機で走らせたら、NUnitがAOT関連のエラー
  51. 51. AOT関連のエラーがおきないか調べるために テストしようとしているのに、 テストフレームワーク自体がAOT関連エラーって!
  52. 52. つらい!!!
  53. 53. NUnitLiteを使って、 iOS実機でテストをしている例を発見! 成功! (Xamarin.iOSもNUnitLiteベースらしい)
  54. 54. OrderBy系、ThenBy系も対処! これらの対処は別アプローチ
  55. 55. 作っているLINQ互換ライブラリについて • ライセンスとか、READMEとか、いろいろ整えています • Unity+iOS+LINQ、このメソッド落ちたとか情報下さい! • その内githubで公開します! • どうやって修正したかもREADMEに書いときます。(Qiitaにも) • あとでアドバイスください!
  56. 56. まとめ(1) • JXUGでUnityの話して、すいませんでした! • LINQ、みなさん使いますよね? • Unity+iOSだとこんな感じで、LINQ落ちます • 最新monoはいろいろ修正されている • Unity+iOSでも落ちないLINQ互換ライブラリ作成中
  57. 57. まとめ(2) • 昔のmono/monoのLINQの方には問題があった • けど今は修正されている • さすがXamarin社様 • さすがmonoコミュニティの方々
  58. 58. One$more$thing
  59. 59. Unityで使っている古いmonoのLINQ、 実装にいくつかミスがあるみたいです 例えばExceptメソッド new []{1, 1, 2}.Except(new []{2});
  60. 60. やっぱりC#で書く以上 LINQを使いたい、Unityでも!
  61. 61. だから頑張って作って、 布教したいと思います!
  62. 62. ありがとうございました @RyotaMurohoshi

×