Javaしかやったこと無い私がXamarinからC#に手を出した話

#初めまして
Colloid(コロイド)と申します。普段は音ゲーやらお絵かきやらしてる大学4年の人です。
ある日Twitterを眺めていたら、QiitaのAdvent Calendarの登録TLで、Xamarinのカレンダーがあるのを知りました。しかも今年はデフォルト(?)と初心者向けの2種類！
私にとって今年はC#デビューの年になったので、参加してみたいなぁでもみんな凄い内容なんだろうなとビビっていたら、作者のくぅさんに是非とも！と勧められ、乱文ですが書いてみることにしました。

そんなQiita初投稿＆[[学生さん・初心者さん大歓迎！]Xamarin Advent Calendar 2016](http://qiita.com/advent-calendar/2016/xamarin-student)の6日目の記事ですが、参考になる点等思う所があれば幸いです。


#そんな私の略歴
プログラミングは大学入ってから講義で学ぶようになりました。言語はJava。
日常では空いた時間で趣味してるので、講義等それ以外ではプログラミングはあまりしません。
大学2年目ではServletとJspでWebアプリケーションを作成
このアプリケーション制作にて担当の先生もわからない原因不明のエラーが出てしまいます(後にどうにかなったのですが）
そんなトラブルがありJavaへの好感度が下がります~~(Javaは悪くない)~~

###4年目､TwitterでXamarinを知る
とあるアルゴリズムを作りAndroidのアプリにするというのが私の卒研です。
今までJavaしか触ったことないし、今回も&AndroidといえばJavaかなーと思っていましたが、前述のこともあってこの1年間私はJavaとうまく付き合えるのだろうかと不安がありました。
そんな開発環境に迷っている矢先、Twitterにてプログラミングをやっている人に相談をしてみたら、友人のミカゼさんがこんなツイートを
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ｱﾝﾖﾖｲﾖアプリは作ったことはないけどXamarinが無償になったらしいのでちょっと手を出してみたい。</p>&mdash; ミカゼ。 (@mik_claire) <a href="https://twitter.com/mik_claire/status/715941421941850112">2016年4月1日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


**Xamarin! そういうのもあるのか**

ググると、なるほどC#でAndroidとiOSついでにUWPもつくれちゃう便利なものが最近無料になったと。
これは試してみたいな…

*こうして私はXamarinとC#の沼へ落ちたのでした*

#実際触れてみての感想
大きく以下3つで述べてみます
**環境構築
ものは試しに作って動かしてみる
C＃で実際に組んでみて**


##環境構築
XamarinはWindows上だとVisual Studioで動くということで、色んなサイトを参考にしつつインストール。
環境構築では苦労したかというと、そこまで苦労した記憶は無いです。やはり買収の効果なのかチュートリアルの解説が豊富なのが良い所だなと。
ただ構築の後のアップデートでXamarinのビューアーが突然利用できなくなったり、今まで出来ていたことができなくなったりして、その症状を治すのが苦労しました。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">開発PCを研究室で作っていたものを自宅でやったら実機デバッグができなくなった件、とりあえず研究室PCで同じ奴をデバックしたら動いた。やはりPCが変わるとできなくなってしまうのか…アプリアンインストールでちゃんと自宅で快適生活とかできるのかな… <a href="https://twitter.com/hashtag/JXUG?src=hash">#JXUG</a> <a href="https://t.co/I5Xn3kegRB">https://t.co/I5Xn3kegRB</a></p>&mdash; Colloid (@ColloidGel) <a href="https://twitter.com/ColloidGel/status/805604679606366209">2016年12月5日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ホイホイ開発している人はこういうトラブル起きないのかなとか思いました。
こういうトラブル起きて悩みをツイートすると、誰かしら反応して解決策を提案してくれるので(上のツイートを見ると前後でトラブルのシューティング方法のやり取りしてます)**困ったらとりあえずツイートするといいと思います。**

##ものは試しに作って動かしてみる
[これ](https://www.xlsoft.com/jp/products/xamarin/android_hello_world.html)を試しに作りました。私はAndroid端末しか持ってないのでAndroidの方を作りました。
作った感想を述べると、**プロジェクトの作り方からコーディング、そしてAndroidの基礎知識を知るのにうってつけ**のチュートリアルと思います。
特に電話をかける下りではパーミッションという概念を知るきっかけになりましたし、なによりAndroidのAPIを理解しないとなーと感じたり。

Android6からパーミッション管理があるので、Android初心者な私は苦戦しました。
コールすると電話アプリが起動するのですが、電話のパーミッションを許可する前にAPIのバージョンを確認したり云々･･･
結果、当時はランタイムパーミッションの実装を諦め、[このサイト](http://www.taosoftware.co.jp/blog/2012/12/call_phone.html)を参考に電話をかけるアクションを実装しました

![Cj7k4FvUUAAmAdL.jpg](https://qiita-image-store.s3.amazonaws.com/0/146347/c7ff6650-075c-f53f-41c4-45e0e9255114.jpeg)

実際の作ったアプリは自分の持つ実機で動かしてみたりしたのですが、動いたときは感動しますね。ものづくりの醍醐味ですね。

##C＃で実際に組んでみて
さて、流石に色々と弄ってて卒研関係何もしないのはまずいので、卒研に向けてC#でアプリケーションを作ります。
でも初っ端にAndroidアプリとして組むと、私の場合絶対になにかしら積むと感じていたので、前段階としてWPFでちゃんと物にしてからAndroidに移ろうと思い、制作しました
はじめはXamarinの事考慮してUWPで作ろうかなとか考えましたが、実行するだけでもとても重いというだけで断念しました。

###Javaしかやったこと無い私が感動した所

####ソースコード
個人的に感動したのはこれでしょうか

```hello.java
public static void main(String[] args)
	{
		System.out.println("Hello world");
	}
```


```hello.cs
  static void Main(string[] args)
        {
            Console.WriteLine("Hello world");    
            Console.ReadKey();
        }
```

JavaとC＃のHello worldを並べただけですが、大学の方針でemacsでひたすら手打ちをしていた身としてはなんという短さ････!
そして何と言ってもMicrosoft公式でクラスとか関数等の解説、チュートリアルがあるので**実家のような安心感**があります。
アプリの記述もXamarin使っていて、これアンドロ上で出来ないかなーとググると大抵C#ではなくJavaでの説明が多くヒットします。(そりゃそうだ)
でも試しにJavaのように書いても、もしかしてこんなの？みたいに誘導されたり、Javaでは大文字なのがC#では小文字だったり等共通点が多いのも強み(?)かなと思ってます。

####IDE
![2016y12m05d_204811870.jpg](https://qiita-image-store.s3.amazonaws.com/0/146347/4cfbca51-14f6-f781-8de6-ef716bc60d01.jpeg)
**見てください！このオシャレなIDE!**
Visual Studio かっこいい。~~寿司も回せる。~~
デバッグする時の画面切り替わりの時、ブレークポイントで止めてるときの変数の格納の確認する時に驚いた。見やすい！
VS使いの方々が実演しているの見るとこんな機能あるの…!と驚くばかり。
個人的にはAndroid Studioより使いやすいかなと思います。日本語もデフォルトであるのも好感度高めです。

####WPF
あのWindows上で動くアプリケーションが自分の手で直感的に作れるのが驚きです。
私の中ではウィンドウ上のボタンとかもゴリゴリ書くんだろうなぁと思えば、パーツを配置していくXAMLデザイナーで作れちゃう。しかもそれがXamarinでも同じようなことが出来るとなると、WPFに手を付けておいて良かったかなと感じております。

####Visual Studio Team Services
大学じゃなくて自宅でもコーディングしたいなーでもUSBに入れて持ち運ぶのだるいなーオンラインでどうにかならないのかなと思っていた時
グーグル先生に聞いてみたらなるほど[Visual Studio Team Services](https://www.microsoft.com/ja-jp/dev/products/visual-studio-online.aspx)というのもあるという。
名前の通りチームで開発する時にうってつけなクラウド管理サービスという。~~今回ぼっちで開発だけど~~どこでもさっきまでコーディングしていた続きをやりたいと思っていたので、それっぽく導入。
わちゃわちゃ弄っていたらこんな機能が

**1. ソースコードのバージョン管理が出来る**
世の中にはGitHubというものがあるのは(存在は)知ってましたが、Team Servicesでも同じようなことが出来ることが最近わかりました。
![2016y12m05d_211432033.jpg](https://qiita-image-store.s3.amazonaws.com/0/146347/6f479909-a1af-b8e3-1e5c-a1bbf972cf8d.jpeg)
この画像のように視覚的にいる誰が何を変更したのかが分かるのです。あと日本語なのも好感度(ry

**2.ソースコードの比較が出来る**
こちらをご覧ください。
![2016y12m05d_211523502.jpg](https://qiita-image-store.s3.amazonaws.com/0/146347/912a4bbe-29d5-e10d-791a-5e2b75e30a7b.jpeg)
これは私がWPFで作っている画像を表示したりするアプリケーションのソースコードです。
IDE上で過去のバージョンと比較がわかりやすく表示されて驚きました。どこがどう消えたり変更したのかを色分けで完全再現しております。
GitHubはコマンドやらで動かすイメージ[^1]ですが、こっちならチェックイン(GitHubだとコミット)ワンボタン追加できるので中々便利です。
[^1]: イメージなのは私自身触れる程度しかやったことが無いからです。なのでもしGitHubならこんなこともできちゃうぞという物があれば私の知識不足です。むしろ教えてください。



#まとめ
Javaしかやったことが無い私がXamarinからC#を手を出した結果


**環境構築､今はチュートリアルが充実していてそこまで苦ではなかった
IDE、カッコイイ。使いやすい。使いこなすと便利
C#､Javaと大して記述が変わらない。むしろ短め。大文字を小文字にするとかそれくらい
Xamarinで困ったらとりあえずハッシュタグ#JXUG[^2]つけてTwitterへツイートしよう。解決策をすごい人達が優しく教えてくれます。
Visual Studio Team Services　色々便利。**
[^2]: [Japan Xamarin User Group](http://jxug.org/)の略｡そして公式ハッシュタグの事。Xamarinを愛する人たちが集うコミュニティ。なのでこの人達に聞けば優しく解決｡

というのが今年4月から現在までわかりました。
日が経つにつれ日本語の情報が出ているし、英語の情報でもがんばって辞書片手なり翻訳サービスなりで調べて、今まで日常的に使っているスマートフォンの事を知るのが楽しいです！

#おわりに
読み返すと後半Xamarinから脱線しましたが、読んで頂きありがとうございます。

私個人としては、WPFでの作成はある程度終わっているので現在Xamarinゴリゴリ使ってAndroidアプリを作成中です。
よく環境系でハマって半日以上その対処で追われてたりしてますが、今後そのようなハマった人向けに何か記事が書けるようになりたい、あるいはXamarinに限らずプログラミングに関しての情報が何かしらで発信してみたいなと思ってます。

('ω' ).oO(XamarinやC#とかで困った時にアドバイス頂いている分、アドバイスできるようになりたいなぁ)
*そう感じつつ今日もゴリゴリC#を書くのであった…。*