外だし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 買った。時計するのって何十年ぶりだろう。充電いらずなのが気に入っている(実際半年以上変換いらず)
  • 今年は作るアプリやツールがどれも中途半端で放置しているのが多い。来年はなんとかしたいな。

散歩のお供にaudible(オーディオブック)をためしてみたが。。。

  • 1ヶ月無料体験あり:契約日から1ヶ月。退会しても退会日まではサービスは使える
  • 古いものか(著作権が切れたもの)か要約版が多い。揃えが少ない。
  • iOSのアプリの出来もいまいち。内部のナビゲーションの仕組みが貧弱だと思う。
  • 銀河英雄伝説はアニメ版の声優のやつじゃなくて(しょうがないけど)違和感がありむりぽ。。。
  • 結局解約した。

Eclipse 4.5 で JUnit4.4がエラーになる

JUnitはバージョン 4.4をずっとつかいつづけていたが(Hamcrestを使いたくないので)
Eclipse4.5がバグっていて 4.6以上に上げる必要があるようだ。
Cannot run individual JUnit tests when importing Maven projects which uses JUnit < 4.6
https://bugs.eclipse.org/bugs/show_bug.cgi?id=479730


うーん、、、今回はEclipse 4.5の評価のためなのでしょうがないのでバージョンをあげた。
pomからhamcrestのexclusionを削除する。
JUnit 4.5以上にするときには、org.hamcrest がないとEclipseJUnit実行時にエラーになるので。
Type Filterに org.hamcrest.* を足した。
いつも使うecliseのtemplateを久しぶりに修正。

org.eclipse.jdt.ui.typefilter.enabled=com.ibm.*;com.sun.*;sun.*;sunw.*;java.applet.*;java.awt.*;javax.swing.*;org.omg.*;java.sql.Date;org.hamcrest.*;

assrtThat, Matcher、Spec系は覚えることが多すぎて嫌い。
ちょっとさわらなくなったら全くコードが読めなくなる。
基本assertEqualsだけで頑張る。テストコードのテスト書くはめになったら意味がない。
Groovy の PowerAsset をどの言語も見習ってほしい。やはりJavaのテストは全部Groovyで書くべきなのかなー


Eclipseはcode tempalteに以下を足していて基本これで事足りている。

<template autoinsert="false" context="java-statements" deleted="false" description="assertEquals。equalsメソッドで比較" enabled="true" id="org.eclipse.jdt.ui.templates.ae_tag" name="ae">${staticImport:importStatic('org.junit.Assert.*')}assertEquals(${cursor}, );</template>
<template autoinsert="false" context="java-statements" deleted="false" description="assertTrue" enabled="true" id="org.eclipse.jdt.ui.templates.at_tag" name="at">${staticImport:importStatic('org.junit.Assert.*')}assertEquals(true, ${cursor});</template>
<template autoinsert="false" context="java-statements" deleted="false" description="assertFalse" enabled="true" id="org.eclipse.jdt.ui.templates.af_tag" name="af">${staticImport:importStatic('org.junit.Assert.*')}assertEquals(false, ${cursor});</template>
<template autoinsert="false" context="java-statements" deleted="false" description="assertNull。assertEqualsだとnullの比較はできない。" enabled="true" id="org.eclipse.jdt.ui.templates.an_tag" name="an">${staticImport:importStatic('org.junit.Assert.*')}assertNull(${cursor});</template>
<template autoinsert="false" context="java-statements" deleted="false" description="assertNotNull。assertEqualsだとnullの比較はできない。" enabled="true" id="org.eclipse.jdt.ui.templates.ann_tag" name="ann">${staticImport:importStatic('org.junit.Assert.*')}assertNotNull(${cursor});</template>

# assertSame, assertNotSame もたしているが基本ほとんど使わない。


なんてことをかんがえていたらJUnit5が心を入れ替えるようだ。。。。
https://github.com/junit-team/junit-lambda/wiki/Core-Principles#minimize-dependencies-especially-third-party


Goのテストみたいにassertすらないってのはやり過ぎだが、
必要なのはJUnit3+TestCaseを継承しないでよい+Annotaionでメタを表現+assertのLambda対応なんだと思う。