C# Intractive をコマンドラインから使う

>csi
Microsoft (R) Visual C# インタラクティブ コンパイラ バージョン 1.2.0.60317
Copyright (C) Microsoft Corporation. All rights reserved.

詳細については、「#help」と入力します。
> #r "System.Windows.Forms"
> using System.Windows.Forms;
> new Form().ShowDialog();

WinFormが表示された。
もちろんコード補完がきかないけど。
GroovyのGrape(http://docs.groovy-lang.org/latest/html/documentation/grape.html)みたいな nuget対応がほしいところだ。

> class Hoge
. {
. public String Id;
. }
(3,15): warning CS0649: フィールド 'Hoge.Id' は割り当てられません。常に既定値 null を使用します。
> var hoge = new Hoge();
> hoge.Id = "hoge";
> hoge
hoge.Id = "hoge";
> var hoge = new Hoge2();
(1,16): error CS0246: 型または名前空間の名前 'Hoge2' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。
> hogehoge = new Hoge();
(1,1): error CS0103: 現在のコンテキストに 'hogehoge' という名前は存在しません。

結構ちゃんとエラーをだしてくれる。

https://github.com/scriptcs/scriptcs を使おうとした(こっちはnuget対応)が結局やめてしまったが今回は使うようになるかな?

C# Intractive をVisual Studioから使う

Introducing the Visual Studio 'C# REPL'
https://channel9.msdn.com/Events/Visual-Studio/Connect-event-2015/103
https://www.visualstudio.com/news/vs2015-update1-vsVisual Studio 2015 Update 1 に C# Intractive がはいった。
まだnugetに対応していなし、プロジェクファイルと連携していにけどすぐによくなるだろう(Update2 でもあまり変わってない感じ。。。)。

表示 -> その他のWindow -> C# インタラクティブ で起動して貼り付ける(一応ここでもコード補完が効く)。

Microsoft (R) Roslyn C# コンパイラ バージョン 1.2.0.60425
'CSharpInteractive.rsp' からコンテキストを読み込んでいます。
詳細については、「#help」と入力します。
> #r "C:\Users\udagawa\development\csharp\csharp6-test\csharp6-test-unit\bin\Debug\csharp6-test-unit.dll"
> using csharp6_test;
.
> var sample = new Sample{ id = 1 };
> sample
Sample { id=1, name=null }
> var sql = $"select {nameof(Sample.name)} from {nameof(Sample)} where {nameof(Sample.id)} = {sample.id}";
> sql
"select name from Sample where id = 1"
>

外だしSQLが少し書きやすくなる C# 6.0

nameof(xxx) と $"" の組み合わせが便利だ。
https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#string-interpolation
https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#nameof-expressions

外出しSQLが書きやすくなる。

    // Table名、コラム名と名前を合わせること
    public class Sample
    {
        public int id;
        public string name;
    }

    public class Param
    {
        public int Id;
    }

    [TestClass]
    public class TwoWaySqlTest
    {
        [TestMethod]
        public void TestCSharp6StringAndNameOf()
        {
            var sample = new Sample { id = 1 };

            var sql = $"select {nameof(Sample.name)} from {nameof(Sample)} where {nameof(Sample.id)} = {sample.id}";
            Assert.AreEqual("select name from Sample where id = 1", sql);

            var twoWqySql = $"select {nameof(Sample.name)} from {nameof(Sample)} /*IF pmb.{nameof(Param.Id)} != null*/where {nameof(Sample.id)} = {sample.id}/*END*/";
            Assert.AreEqual("select name from Sample /*IF pmb.Id != null*/where id = 1/*END*/", twoWqySql);

            var twoWayMulti = $@"
select {nameof(Sample.name)}
from {nameof(Sample)} 
/*IF pmb.{nameof(Param.Id)} != null*/where {nameof(Sample.id)} = {sample.id}/*END*/
";
            Console.WriteLine(twoWayMulti);
        }
    }

nameOfの渡す値はリファクタ可能だ(クラス名、プロパティ名の変更に対応)!!!
ない名前だときちんとコンパイルエラーになってくれる。
しかもきちんと文字列の中でコード補完(たとえばSample.とうてばプロパティ一覧がでてくる)も効くのだ。

いままで頑張ってGenして型セーフにしている部分がごそっと要らなくなる可能性ある。
クラスさえつくってしまえばNonSQL的な文字列指定なものでもこまることは減るかもしれない。

上記だとそのままSQLをそのまま流せないが、C# Intrative(VS 2015 Update1から)である程度解決するようになるかも。

Xamarin で作ったアプリを Fire HD 10 に入れる

Xamarinが動くかためしてみたがちゃんと動いた(Macからできるかは確認していないが)。


実際にはVisualStudioでXamarinをインストール時に
JDKAndroid SDK,Android NDK、Android がインストールされるので自分でいれる必要はないが別途入れなおした。


Xamarin.AndroidJDKAndroid SDK(http://developer.android.com/intl/ja/sdk/index.html から android-sdk_r24.4.1-windows.zip)をダウンロードしてきてVisaul Studio の Xamarin の設定にJDKAndroid SDK のインストール場所を設定。
Android SDK Manager で SDK等をインストール。
Android のバージョンは https://developer.xamarin.com/guides/cross-platform/getting_started/requirements/#windows
にある通り Android 6 API-23 を入れた。
ちなみに Fire HD 10 は Android 5.1 API-22。


Blank App(Android) でプロジェクト作って実行ボタンで
Fire HD に転送される(アプリ(8MB)と 初回のみMono Shared Runtime(38MB)。初回のみXamarin.Android API-23 Support(33MB))。
無事実行できた。


Xamarin.Forms は Blank App(Xamarin.Forms Portable) でプロジェクト作ったがビルドエラー。

Xamarin.Android for Visual Studio requires Android NDK, which is used to embed .NET assemblies into native libraries. While the NDK is generally not used for developing an Android application, we suggest you to install it. Please set Android NDK path on Tools->Options->Xamarin->Android Settings menu.

http://developer.android.com/intl/ja/ndk/downloads/index.html から
android-ndk-r11c-windows-x86_64.zip をダウンロードして NDK の場所を設定。
プロジェクト作りなおして実行ボタンで Fire HD に転送(アプリ(15MB))して実行できた。
Mono Shared RuntimeとXamarin.Android API-23 Support)が必要なのはXamarin.Android版と同じ。

Fire HD 10 のセッティング

iPad2が死亡したので急遽 Fire HD 10 をかう。


Amazon Prime にもはいったので当日きた。
Wi-Fiの設定したら直ぐに使えるようになった。
とりあえず機能制限でパスワードの設定。
思ったよりも縦長、でもAmazonプライムビデオ見ている限りあまり気にならない。
パフォーマンスは特に問題ない。
縦横固定のハードウェアボタンがないのはちょっと面倒。


iOSとちがってKindleアプリで完結できるので便利。
実際本の月一冊の無料はKindle端末からじゃないと選べないみたいだし。


Google Playを使えるようにする。
http://rootjunkysdl.com/files/?dir=Amazon%20Fire%205th%20gen
から Amazon-Fire-5th-Gen-Install-Play-Store.zip をおとしてきて
1-Install-Play-Store.bat を実行でインストールできた(シリアルナンバー7回クリックで開発者モードを有効にするのは他のAndroid端末と同じ)。
Amazonストアにない Chrome、ChromeCast、Dropbox などをいれた。問題なく動いている。


iOSとくらべて KindleDropboxが使いやすい。Huluは微妙かな。
iOSAndroidの動作の違いはそのうちなれるだろう。

CentOS に ansible 2.0 をインストールする

http://docs.ansible.com/ansible/intro_installation.html#latest-release-via-yum
にあるように
yum install ansible
だとまだ 1.9系のようだ

CentOS 6.7

> grep centos VagrantFile
  config.vm.box = "bento/centos-6.7"
> vagrant up
> vagrant ssh
$ cat /etc/redhat-release
CentOS release 6.7 (Final)
$ sudo yum install epel-release -y
$ sudo yum install gcc python-devel python-pip -y
$ sudo pip install pip --upgrade
$ sudo pip install ansible
$ ansible --version | grep ^a
ansible 2.0.1.0
$ python --version
Python 2.6.6

ansible 実行時に HAVE_DECL_MPZ_POWM_SEC となったら
https://github.com/ansible/ansible/issues/276 にあるように
sudo yum reinstall python-crypto
すればエラーがでなくなる。

CentOS 7.1

> grep centos VagrantFile
  config.vm.box = "bento/centos-7.1"
> vagrant up
> vagrant ssh
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
$ sudo yum install epel-release -y
$ sudo yum install gcc python-devel python-pip -y
$ sudo pip install pip --upgrade
$ sudo pip install ansible
$ ansible --version | grep ^a
ansible 2.0.1.0
$ python --version
Python 2.7.5

実際には sudo yum update -y したほうがいいだろうけど。。。

振り返り

  • あまりちゃんと仕事した感じがしない一年だったな(育休2ヶ月とったってのもあるが)。
  • iOSからのAndroidポーティングで久しぶりにAndroidさわる。RxJava+retrofit, ButterKnife など進化していたが、UITableViewController+UINavigationController を Activity, Fragment でどう画面を構成してデータのやり取りするか悩み中。
  • C# 6.0 素敵。.NET Core、ASP.NET 5、EF 7.0 すげー楽しみだ。
  • Seasar2の代わりをどうしようかな、とも思うがJava系でなんとかしようとするからダメな気が。Docker上で.NET Coreを動かすのがいいような。来年の課題だな。
  • Rubyを2ヶ月ほどさわったけど型がないのでやっぱり好きになれない。CrystalがWindowsでもうごいてマルチスレッドの扱いがよさげなるなら Go じゃなくてCrystalがいいかなーと思う。
  • ブレイキング・バッド はシーズン4、5は抜群におもしろかった。シーズンの最後のほうが面白い作品って珍しかな。
  • Withings Activite 買った。時計するのって何十年ぶりだろう。充電いらずなのが気に入っている(実際半年以上変換いらず)
  • 今年は作るアプリやツールがどれも中途半端で放置しているのが多い。来年はなんとかしたいな。