OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleColaboratory で使う画像をGoogleドライブからコピー

# 対象者
- GoogleColaboratoryをこれから使う人
- Googleドライブにある大量の画像をGoogleColaboratoryを使い深層学習させてい人

# 背景
- GoogleColaboratoryで写真の分類をしたい。大量の画像はGoogleドライブ経由だといけるらしい
- Googleドライブにある機械学習用の画像約１万枚をGoogleColaboratoryから直接参照すると、学習が進まない現象が起きた
- GoogleドライブへのIOが極端に遅いことにあたりをつけGoogleColaboratoryのローカルへコピーすると問題なく学習が進んだ


# Googleドライブマウント

 ```
# libray ダウンロード
!pip install -U -q PyDrive

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials

# Google Drive API
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}


### Googleドライブをマウント ###

!mkdir -p drive
!google-drive-ocamlfuse drive
```

# ローカルへコピー
```
!mkdir -p /image/train
!mkdir -p /image/test
!rsync -av  --delete --progress drive/deep/train/ /image/train
!rsync -av  --delete --progress drive/deep/test/ /image/test
```
C#でツクールMV用の自作のエディタを作ってみた


Qiitaに一番不要で半分ぐらいスパムとか言われる「○○使ってみた系記事」です。

今回はツクールMV本体のエディタで機能不足を感じたのでC#のFormを使いエディタを自作しました、
初めての部分が多かったので苦戦しましたが、ツクールのWindowとあまり変わらなかったです。
まあ、MVCな雰囲気であるとどこも似たような内容なんでしょうね。
2週間近くかかりました。

##ツクールのデータは簡単に読み込める
ツクールのdataフォルダにあるjsonはそのまま読み込めました。
必要なクラスを書いて読み込めば一発です。
変数やコモンイベントの名前も読み込めたのは意外でした。

##継承はほどほどに使う
Formにある様々なControlはObject型に対する操作になっているので、自分で使う場合はほどほどに具象型に変化させる必要があります。
継承した後で、自分が使うメンバー変数を追加してうまく動かしましょう。
アイテムや変数を選択する機能は思ったよりも使いやすかったので、今後も再利用すると思います。

##データ設定はLoadで行うべし
FormにControlを割り当てて組み立てるのはコンストラクタでやってもOKみたいですが、ハンドラに呼び出しが飛ぶような部分はLoadイベントに設定するのがよさそうです。
コンストラクで初期化した後、該当するControlのLoadにイベントを追加しましょう。

##BindingSorceは便利
ListBoxにデータを入れる場合、BindingSorceを挟んであげると、変更通知がうまく行きます。
よくわかりませんが、*ResetCurrentItem()*は変な動きが多かったので微妙でした。

##ShowDialog()をうまく使おう
ツクールMVのエディタではアイテムの選択などの際に新しいウィンドウが開き、入力が終了すると閉じます。
こういったFormはShor()ではなくShowDialog()で開きましょう。

##適度なタイミングでファイルを分けよう
最初は1つのソースコードに全部のクラスを書く勢いで書きましょう。
何割か書いたあたりで処理を分割できる場所が見えてきます。

##1データ1クラスを徹底する
今回のクエストエディタにおいて、クエストに含まれるデータは名前・受注可能条件・報酬・メッセージなどでした。
名前以外の３つはクラスとして作成し、編集用のControlもそれぞれ〇〇Editorといった形で全てクラス化しています。
どこで何を編集しているかわかりやすいのは大切なことです。

##困ったらVisual Studioのデザインツールで組み、コードを調べる
書き方がわからなくなったら、それっぽいパーツをデザインツールで組み込みソースコードを見ましょう。
勝手に書き換えるなとありますが、その中身はいたって普通のコードです。
参考にして自分で書きましょう。

##DLLを埋め込む設定をちゃんと入れる
ILmergeというツールがあるので、これを使いましょう。
埋め込む際のスクリプトが載っていたサイトは失念。
環境によって違うかもしれないので、ググりましょう。

#おわりに
C#でエディタを作るのは悪い話ではないですが、未経験で書くと非常につらいです。
プラグインを作るよりもよっぽど大変でした。
また、データの整合性などをチェックする手間があるので、次に作るとしたらJavaScriptで作ります。
しかし、プロトタイプ作成としてはC#はとても役に立ちました。
今後も拡張エディタは研究を続けていきます。
Pythonについて vol02.配列、辞書

扱い方が似ているので、一緒にやります。(が、結果長くなりました。）

配列はリストとも呼ばれるもので、複数の値やオブジェクトを格納することができます。
辞書はディレクトリとかハッシュとも呼ばれるもので、keyとvalueの組み合わせを複数格納することができます。

基本形はそれぞれ以下の通りです。

配列

    array = [ 'a', 'b', 'c' ]
    dict = {
        'key1': 'value1',
        'key2': 'value2',
        'key3': 'value3'
    }
 
呼び出す時は

    array[0] →'a'
    dict['key3'] → 'value3'
    ※辞書も[]でkeyを指定するので気を付けてください。自分はよくdict{'key3'}とか書いちゃいます。

という感じです。

また配列と辞書は組み合わせることができます。

    data = {
        'key1': [
            'a',
            'b',
            'c'
        ],
        'key2': 'value2',
        'key3': 'value3'
    }

とか。まぁいわゆるJSON形式っぽいやつですね。（JSONライブラリについてはまた後日。）
引き出す時は

    data['key1'][2] →'c'
    data['key1'] →[ 'a', 'b', 'c' ]
という感じです。

あと配列や辞書でよく使う関数(method)です。上記のarray, dictを使って説明します。
要素数：

    len(array) →3
    len(dict) →3

追加：

    array.append('d') → 最後(array[3])に'd'を追加。array[3]='d'と同義。
    dict.update({'key4':'value4'}) →dict['key4']='value4'と同義。

変更：

    array[2]='C'
    dict['key3']='Value3'
と直接入れます。

削除：
配列

    array.pop() → 最後の要素を削除（'d'を取り出し）
    array.pop(1) → 'b'を取り出して、配列からは削除。arrayは['a', 'c', 'd']となる。
    array.remove('d') → 値が'd'のものを削除。arrayは['a', 'c']

辞書

    dict.pop('key1') → 'value1'を取り出して、辞書からは削除。dictのkeyはkey2,key3,key4となる。
    dict.popitem() → dictからランダムにkey:valueを取り出して、削除。
    ※ランダムと言っているのはdictの順序は保証されていないためかと思われます。
 
ちょっと面倒になってきたので、後は以下のページを参照。
https://docs.python.jp/3/tutorial/datastructures.html
5.1. リスト型についてもう少し
sort/reverseとかは時々使います。
 
配列については、前回の文字列と同じようなことができます。

    array = [ 'a', 'b', 'c', 'd']
    array[1:3] → [ 'b', 'c' ]
    array[-1:] → [ 'd' ]
 
辞書について、keyだけ取り出したり、valueだけ取り出したりできます。

    dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', 'key4': 'value4'}
    dict.keys()→[ 'key1', 'key2', 'key3', 'key4' ]
    dict.values()→[ 'value1', 'value2', 'value3', 'value4' ]

他にもタプルとかsetとかあるんですが、自分は使わないので省略します。
docker 記事一覧

見つけた記事を書いておくだけ

# Dockerと連携記事
http://thinkit.co.jp/story/2015/04/10/5855

# Kubernetes 等
http://open.mesosphere.com/tutorials/kubernetes-mesos-gcp/

# tools
■ virtualbox
https://blogs.msdn.microsoft.com/powershell/2017/12/15/using-the-openssh-beta-in-windows-10-fall-creators-update-and-windows-server-1709/


https://github.com/kubernetes/minikube/issues/1548

■ OpenSSHのインストール
http://ascii.jp/elem/000/001/567/1567986/
Pythonについて vol01.変数

# 変数
Pythonで変数を設定するとき、データ型（数字とか文字とかオブジェクトとか）を指定する必要はありません。
おもむろに変数に値を入れちゃって大丈夫です。内部で適当に設定されます。

    var1 = 'abc' →これは文字
    var2 = 5 →これは数字
    var3 = '5' →これは文字

また結合は+で行いますが、データ型を揃える必要があります。

    var4 = var1 + var3 →'abc5'(文字列)になります。
    var5 = var2 + var3 →これはエラーになります。
    var6 = str(var2) + var3 →'55'(文字列)になります。
    var7 = var2 + int(var3) →10(数字)になります。

また文字型の場合はその中の一部を取り出すことが簡単にできます。
これに慣れると、文字編集がかなり楽になります。

    var8 = 'abcdefg'の時、
    var8[2] →'c'が返ります。(始めの文字は0文字目とするので、2文字目はcになります。）
    var8[3:5] →'de'が返ります。（3文字目から5文字目の前まで）
    var8[:3] →'abc'が返ります。（3文字目の前まで）
    var8[-2:] →'fg'が返ります。（後ろから2文字目から最後まで）
    var8[:-2] →'abcde'が返ります。（初めから後ろから2文字目の前まで）

[n:m]のmはm文字目の前、というのがミソです。
（これは配列の挙動に通じるものがあるんですが、詳細は次回）
Pythonについて vol00.はじめに

社内共有したPythonについてのメルマガを、多少加筆してQiitaにも投稿です。

今回はVol.00としてPythonについてさらっと紹介です。

Pythonはスクリプト言語なので、bash/tcshが得意な自分にとってはとっつきやすかったです。
（スクリプト言語≒インタープリタ言語　対義語はコンパイラ型言語）
たぶんPythonが流行った理由はライブラリの多さだと思われます。

ちなみに自分は機械学習からPythonに入りました。
PandasとかTensorFlowとか。全然使えないけど。他にも機械学習系のライブラリは多いです。

もう一つは可読性の高さとか、書きやすさかなと。
例えばfor文はこんな感じです。

    for <条件文>:
        <繰り返す処理内容>

他の言語だとこんな感じ

    for <条件文>{
        <繰り返す処理内容>
    }

Pythonはインデントでネストを判断するので括弧書きが要りません。
このレベルでは大差ないですが、ネストにネストを重ねるとその差は歴然です。

あと開発環境はATOMを使っています。
が、Eclipseでもメモ帳でも構わないと思います。

こういう感じでさらっとPythonの使い方をちょっとずつ紹介して行こうと思います。
Pythonに使い慣れてる方は、自分が間違っていることを言ってれば厳しいご指摘をお願いします。
または、自分が知ってることを、自分に乗っかって共有して頂けると幸いです。
今後とも極力頑張ります。

以下がコンテンツです。ページを増やしたらリンクを貼ります。
[0. はじめに](https://qiita.com/sachioksg/items/0bc6a44ce6a362b24162) ※このページです。
[1. 変数](https://qiita.com/sachioksg/items/bfe335e2f049c34e222d)
[2. 配列、辞書](https://qiita.com/sachioksg/items/5fd757743ede3bceee89)
[3. if文](https://qiita.com/sachioksg/items/8bbf3ae1f319d0b75a2b)
[4. for文](https://qiita.com/sachioksg/items/135dac50499d8040192b)
[5. while文](https://qiita.com/sachioksg/items/b3ebe6994afa6f148678)
[6. ファイル読み書き](https://qiita.com/sachioksg/items/dc40f3e0e6695594bd94)
[7. JSON/CSV(TSV)読み書き](https://qiita.com/sachioksg/items/135cc9f2fc89632a25fb)
[8. Boto3](https://qiita.com/sachioksg/items/91cc589e7e00913abfbd)
[9. try/exception](https://qiita.com/sachioksg/items/3d55fa158ac711d5dc97)
[10. 関数](https://qiita.com/sachioksg/items/1ae39b65066f6b2cb031)
[11. class](https://qiita.com/sachioksg/items/26844319892d8ad74491)
【Swift】NotificationCenterの使い方

今回、あるViewControllerから別のViewControllerに処理を伝搬したいものがあり、
調べたところ、**NotificationCenter**を使えば実現できると知り実装しました。

今回はその実装方法について説明してみようと思います。

## NotificationCenterって？？
NotificationCenterは、異なるViewController間のイベント通知を実現できるもので、
発信側と受信側が存在します。

それぞれ、この通知が来たらこの処理をする！
この処理を実行したらあのViewControllerに処理をお願いする！
みたいなことが可能になります。

## 使い方
### 通知名前空間の拡張
まず、下記をどこかのファイルに記載してください。
拡張のため、どのファイルに書かないといけないみたいなことはありませんが、
あとから見返してわかる場所に書くことがベストだと思います。

```extensions.swift
extension Notification.Name {
    static let notifyName = Notification.Name("notifyName")
}
```

### 通知を送りたい側
```SendViewController.swift
// 通知を送りたい箇所でこのように記述
NotificationCenter.default.post(name: .notifyName, object: nil)
```

### 通知を受け取りたい側

まずはじめに、受け取りたい側のVCでNotificationCenterを登録します。
こうすることで、notifyName通知が発行されたタイミングで、doSomething()が実行されるようになります。

```catchViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    /// NotificationCenterを登録
    NotificationCenter.default.addObserver(self, selector: #selector(doSomething(notification:)), name: .notifyName, object: nil)
}
```

### 注意点
~~NotificationCenterを登録しっぱなしでは、再度同じ画面を開いた場合、
登録が重複していってしまうため、画面から離れるタイミングでremoveObserverを実行することが重要です。~~
iOS9.0以降はremoveObserverが不要のようです。
コメントにてご指摘いただきました！
ありがとうございます。
参考サイト　[Apple公式ドキュメント](https://developer.apple.com/documentation/foundation/notificationcenter/1415360-addobserver)

```catchViewController.swift
NotificationCenter.default.removeObserver(self)
```


## さいごに
これはオブザーバーパターンといわれるもので、
MVVMを使用する場合、使用する頻度が高いんじゃないかなと思います。
値の受け渡しもできるので、私ももう少し勉強を進めていきたいと思います。

では！！
vue-routerでqueryのみを変更したページに遷移

locationで記述する際にオブジェクトの指定がわからなかったためメモ

```example.js
this.$router.push({ query: { page } });
```

[Vue Router \| プログラムによるナビゲーション](https://router.vuejs.org/ja/guide/essentials/navigation.html)
[Swift4] SegmentControllとTableViewを使ってみる

#SegmentControllを使ってみた
備忘録です。内容はそんなにない
iPhoneアプリでよく見るあの画面切り替えてるボタンなんぞやって思って探して昨日を使ってみました。
item名としましては**Segmented Control**
説明にはDisplays multiple segments,each of which functions as a discrete buttonと書かれている。
選択肢の中からひとつだけを選択できるボタン、ようするにradio buttonですね。

##一度つまずいたところ
StoryboradにSegmentControlを接続するときsnder: Anyにするのではなく**UISegmentedControl**にしないと**sender.selectedSegmentIndex**を使用できないことに注意すること。

```Swift:UISegmentedControl
@IBAction func segmentButton(_ sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:viewTable = fruit
        case 1:viewTable = fish
        default:break
        }
        tableView.reloadData()
    }
```
###全体のソースコード

```Swift:ViewController全体のソースコード
class ViewController: UIViewController, UITableViewDelegate,UITableViewDataSource {
    
    var fruit = ["りんご","ばなな","いちご","なし","もも"]
    var fish = ["サンマ","アジ","サバ","マグロ","カツオ","タイ"]
    var viewTable: [String] = []

    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //tableView.delegate = self
        viewTable = fruit
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewTable.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let newCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        newCell.textLabel?.text = viewTable[indexPath.row]
        return newCell
    }

    @IBAction func segmentButton(_ sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:viewTable = fruit
        case 1:viewTable = fish
        default:break
        }
        tableView.reloadData()
    }
}
```
主成分分析とは何か

本記事では、多変量解析の代表的な手法の一つである**主成分分析(Principal Component Analysis; PCA)**について紹介します。
機械学習の文脈では、しばしば次元削減のために用いられますが、その他にもノイズの除去や多変量データの可視化などに用いられます。

本記事は大いに、以下の論文を参考にしています。詳細が知りたい方はそちらへ。

Hervé Abdi, Lynne J.Williams, "Principal Component Analysis", Available at [https://www.researchgate.net/profile/Lynne_Williams/publication/227644862_Principal_Component_Analysis/links/00b7d51657d5ad0d15000000/Principal-Component-Analysis.pdf], 2010.

# 概念

主成分分析の目的は、高次元のデータから分散が最大となる方向を求め、それをもとの次元と同じかそれ以下に射影することとなります。

イメージを掴むため、2次元のデータを1次元へ次元削減する非常に簡単な例を挙げます。  
今、二つの点
$$
(x,y)=(-1, 1), (1,1)
$$
があるとき、これをもとの点の情報を保ったまま1次元へ次元を減らすことを考えます。
図中での横方向の実線をx軸、縦方向の実線をy軸としたとき、まずy軸への射影を考えてみます。

![graph_1.png](https://qiita-image-store.s3.amazonaws.com/0/221139/eb09dedf-369f-c9ea-5021-9c580c73d885.png)

上図のように$(-1, 1)\mapsto (1)$, $(1, 1)\mapsto (1)$と二つの点が重なりもとの情報が失われてしまいます。
一方、x軸への射影を考えると、

![graph_2.png](https://qiita-image-store.s3.amazonaws.com/0/221139/cdd49b3e-d24e-d932-e972-bcf13428f5dc.png)

上図より、$(-1, 1)\mapsto (-1)$, $(1, 1)\mapsto (1)$となり、もとのデータの情報を保ったまま、次元を削減することができます。このように高次元データから(例では2次元ですが)、分散が最大となる方向へ射影することにより次元を削減することができます。
実際には、例えば100次元から2次元へ次元削減を行ったとき、一般にもとのデータの情報を100%保持することはできません。しかし、どの程度それを保持できているか(寄与率)は求めることができます。

# 数学的解釈
以下では、主成分分析の数式的な解釈を与えます。

まず、$(n\times m)-$行列$X$において、${\rm rank}(X)=k$とします。
このとき、$X$は特異値分解を用いて、次のようにあらわされます。
$$X = P\\Delta Q\^T$$
ただし、$P$は$(n\times k)$の左特異値ベクトルを並べた行列、$Q$は$(m\times k)-$の右特異値ベクトルを並べた行列となります。また、$\\Delta$は対角に特異値をもつ行列となります。ここで、$X\^T X, XX\^T$の非ゼロな(これらは半正定値行列なので正の)固有値を対角に並べた行列を$\\Lambda$とすると、$\\Delta ^2=\\Lambda $となります。($\\because XX\^T = P \\Delta Q\^T Q \\Delta P\^T = P \\Delta \^2 P\^T $)

ここでは、特異値分解については詳しく触れないので、このような分解が存在するということを知っていただければ大丈夫です。

上式において、$F=P \\Delta$(得点行列と呼ばれます)とあらわすと、以下の式が成り立ちます。
$$
F= P \\Delta = P \\Delta Q Q\^T = XQ
$$
上式より、$Q$は 射影行列とみなすことができます。幾何的な解釈に関しては、先の論文内に例とともに挙げられています。

ここで、$F$は$(n\times k)$の得点行列でしたが、$l<k$を満たす$l$に対して、$(n\times l)$に次元削減された得点行列$F\_l$を考えます。対応する射影行列を$Q\_l$とすると、以下が成り立ちます。
$$
F\_l = XQ\_l
$$
このとき、射影行列$Q\_l$、得点行列$F\_l$を用いて求められる行列を$X\_l$とすると
$$
\\| X - X_l \\| = \\| FQ\^T - F\_l Q\_l\^T \\|
$$
を最小化するような、階数$l$の行列を選ぶと良いことがわかります。ただし、行列$A$に対して、$\\| A \\|$はフロベニウスノルムをあらわします。
これを求めると、寄与の大きい$l$個の特異値に対応する特異ベクトルが射影行列として残ります。(よく見る寄与が大きい順=固有値が大きい順にベクトルを選択するという結果との関連もわかると思います)

最後に、射影後の寄与率について少し触れます。
上記の括弧書きで書いたように、特徴量の分散共分散行列の固有値が大きいものから寄与が大きいという情報を目にしたことがあるかもしれません。
分散共分散行列を$\\sum$とすると、その固有値$\\lambda$、固有ベクトル$v$は以下の式を満たします。
$$
\\sum v= \\lambda v
$$
ここで、データに含まれる多くの情報(分散)を含む固有ベクトルを選びますが、固有値は固有ベクトルの大きさをあらわすため、固有値が大きい順にそれに対応する軸を選びます。
ここで、固有値$\\lambda_i$の寄与率は、以下の式であらわされます。
$$
\frac{\\lambda\_i}{\\sum\_{i} \\lambda\_i}
$$
例として、固有値が$\\lambda = 3,2,1$のとき、3次元から2次元への次元削減は
$$
\frac{3+2}{3+2+1} = 0.83333...
$$
より、83%程度の情報を保持します。

# おわりに
本記事では、特異値分解を用いて主成分分析と紐づけてきました。
最後に少しだけ書きましたが、分散共分散行列との関係性も非常に興味深いものなのでぜひ調べて見てください。

何かあればコメントや[ツイッター](https://twitter.com/hiyoko9t)でお気軽にお声がけください。
[Mac] peco で複数選択ができないときの対処法

# peco で複数選択する方法
[peco の Wiki](https://github.com/peco/peco/wiki/Keyboard-Shortcuts#selection-shortcuts) によると、**CTRL+space** で「行を選択してカーソルを下に移動する」と書かれています。

ところが、Mac で **CTRL+space** を押すと、入力ソースの切り替えが出てきてしまいます。

![input_source.png](https://qiita-image-store.s3.amazonaws.com/0/113895/ecececc7-97b4-1e53-44cb-b5ed002a9a50.png)

# 解決策
設定で入力ソースの切り替えを無効にします。

`システム環境設定 > キーボード > ショートカット > 入力ソース` と進み「**前の入力ソースを選択**」のチェックボックスをオフにします。

![setting_keyboard.png](https://qiita-image-store.s3.amazonaws.com/0/113895/a75901f9-b787-be11-f6bd-9c7cbea8c563.png)

![スクリーンショット 2018-06-17 22.00.55.png](https://qiita-image-store.s3.amazonaws.com/0/113895/e3ef3d79-ba0e-26d4-0b60-9a5f97f0d8ef.png)

これで設定は終了です。peco のインターフェースで **CTRL+space** を押すと複数選択ができるようになります。

![peco_multi_select.png](https://qiita-image-store.s3.amazonaws.com/0/113895/282ed271-5092-ca45-b305-bd2cbcf8613a.png)
【Swift】UIRefreshControlの使い方

今回は、よく使いそうな機能の実装方法を載せていこうと思います。

## UIRefreshControlとは

よくある、"引っ張って更新"を実装できる要素です。

スクロールが可能な要素(スクロールビュー)に設定することができます。

## 実装方法

今回はTableViewにRefreshControlを実装してみたいと思います。

```Swift:TableViewController.swift
class TableViewController: UIViewController {
 
    @IBOutlet weak var tableView: UITableView!
 
    fileprivate let refreshCtl = UIRefreshControl()
 
    override func viewDidLoad() {
        tableView.refreshControl = refreshCtl
        refreshCtl.addTarget(self, action: #selector(ViewController.refresh(sender:)), for: .valueChanged)
    }
 
    func refresh(sender: UIRefreshControl) {
        // ここが引っ張られるたびに呼び出される
        // 通信終了後、endRefreshingを実行することでロードインジケーター（くるくる）が終了
        UIRefreshControl.endRefreshing()
    }
}
```

では解説です。

まずStoryBoardでUITableViewを配置し、TableViewControllerを作成します。

次に、TableViewをアウトレット接続し、UIRefreshControlのインスタンスも作成します。

その作成したインスタンスをViewDidLoad()でTableViewのrefreshControlプロパティに設定します。

次は引っ張られた時にどの処理を実行させるかを、
UIRefreshControlのインスタンスにaddTargetで指定しています。

これで引っ張って更新の機能は実装完了です。

注意点としては、コメントにも書いていますがendRefreshing()を忘れずに。ぐらいかと思います。


## さいごに
案外簡単に実装が可能で、よく使うUIだと思いますので、
何かの機会に実装してみてはいかがでしょうか！

ではでは。
最新のRuby alpine版Dockerイメージでも、RMagickを使いたい！

## 困ったこと…

- Ruby2.5(alpine3.7) の公式DockerイメージをベースにDockerfileを書いて、RailsでCarrierWaveを使いたい
- CarrierWaveが依存しているRMagickは、現状ImageMagick6しか対応していないが、alpine3.7ではImageMagickを`apt add`するとバージョン7が入る
- `apt add` するとき、 ImageMagick6にバージョン指定してみても、ないよって怒られる
- alpine自体のバージョンを落とせばImageMagick6を入れることはできるが、公式イメージではRubyのバージョンも下がってしまう。

## 解決!

とりあえず ImageMagick6 のパッケージをググって探してみたら…
http://dl-4.alpinelinux.org/alpine/edge/community/x86_64/
あった！

この子たちを落としてくれば、いけるかもっ！
ということで、Dockerfile内で `bundle install` する前に

```
WORKDIR /tmp
RUN apk add --update --no-cache curl && \
    curl -O "http://dl-4.alpinelinux.org/alpine/edge/community/x86_64/imagemagick6-{6.9.9.47-r0,c%2B%2B-6.9.9.47-r0,dev-6.9.9.47-r0,doc-6.9.9.47-r0,libs-6.9.9.47-r0}.apk" && \
    apk add --no-cache \
    imagemagick6-c%2B%2B-6.9.9.47-r0.apk \
    imagemagick6-dev-6.9.9.47-r0.apk \
    imagemagick6-libs-6.9.9.47-r0.apk \
    imagemagick6-6.9.9.47-r0.apk
```

…いけた！RMagickもCarrierWaveも使えた！
やっていることは、curlで必要そうなものを落としてきて、 `apk add` でファイルからインストールしているだけです。

## 感想

最新のRubyを軽量なイメージで動かすのって、やっぱり気持ちいい。
あと、RMagickこんなPRも見つけました… マージされないかな…
https://github.com/RMagick/RMagick/pull/299

## さいごに
* この記事は自分用メモです。
* 詳しいみなさま、間違いやもっと良い方法がございましたら、やさしく教えて下さい。
* 初Qiita記事！
MacからRaspberry Pi3に、Thunderbolt to Ethernetアダプタを使って、インターネット共有で接続

自分用メモ。
Raspberry Pi3とMacを直接つなぐ必要が生じたので調べました。

Raspberry Pi3はセットアップ済みで、赤外線センサーと繋いで監視スクリプトを書いてあります。
セットアップ時はHDMIでモニタにつなぎ、マウスとキーボードも繋いで設定したのですが、モニタもマウスもキーボードもWi-FIもない四重苦の環境に設置してする必要が生じました。



# 下調べ


[Raspberry Piにシリアル通信(UART)でログインする方法（Mac版）](https://karaage.hatenadiary.jp/entry/2016/04/28/073000)
→大変萌えるのだが、GPIOピンを他の用途でつかってるため見送り。

[MacとRaspberry piをインターネット共有でつないでみる](https://qiita.com/fumishitan/items/88bb832cb08fe8016f66)
→最初こちらで進めていた。しかし「システム環境設定」>[「RaspiのIPアドレスを調べよう」でコンソールからOFFERと入力してもでてこず。自分の環境が古いのかも。

[How to SSH into your Raspberry Pi with a Mac and Ethernet Cable](https://medium.com/@tzhenghao/how-to-ssh-into-your-raspberry-pi-with-a-mac-and-ethernet-cable-636a197d055)
→この通りやったらできた。

# 自分がやった方法まとめ

## 環境

- Raspberry Pi3
 - OS: NOOBSv2.8.1
- MacBook Air (11-inch, Mid 2013)
 - OS: macOS High Sierra (バージョン10.11.3)
- [Thunderbolt Ethernet cable](https://www.apple.com/jp/shop/product/MD463ZM/A/apple-thunderbolt%E3%82%AE%E3%82%AC%E3%83%93%E3%83%83%E3%83%88ethernet%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF)
- LANケーブル




## 手順

### ケーブル接続
RaspBerry Pi3の電源を切って、
MacとRaspberry Pi3とをThunderbolt Ethernet cableとLANケーブルでつなぐ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/173392/e4b71be3-8223-eb71-576f-e06cd1c77113.jpeg" width=500>

その後、RaspBerry Pi3の電源を入れる

### Macの「システム環境設定」＞「共有」を開いて設定
共有する接続回路＝「Wi-Fi」にチェック
相手のコンピュータでのポート＝「Thunderbolt Ethernet」にチェック
「インターネット共有」にチェック

<img src="https://qiita-image-store.s3.amazonaws.com/0/173392/328fbddc-9fbc-f3f9-1b00-3fc5ed9c6694.png" width=500>

※最初「Thunderbolt Ethernet」がの選択肢がでてこなかったが、ケーブルを抜いてRaspiを再起動したらでてきた。

### Macの「システム環境設定」＞「ネットワーク」を開いて確認

「Thunde..thernet」が選択されて黄色いマークがついており、
ステータス＝「接続済み」、
IPV4の設定＝「DHCPサーバーを使用」
になっていればOK。
もし他の方法で接続していたら、上記に切り替える。

### ターミナルを開いてRaspberry Pi3に接続

```
$ ifconfig
```
すると

```
bridge100: （略）
　　　inet 192.168.2.1 netmask 255.255.255.0
```
という表示がでてくる。
他にもずらっとでてくるが、今回使っているのが「bridge100」なので、ここのinetを使う。
(IPアドレスは環境によって異なると思います）

ここからが手探りだが、
 192.168.2.1というのは自分のMacのIPアドレスで、直接繋いでいるものは1台だけで、なので、Raspiの末尾は2になると思われる。そこで、

```
ssh pi@192.168.2.2
```

とやると接続できた。

※末尾が2ではない場合、本格的に調べるなら、nmapでポートスキャンするのが良い。[参考サイト様](https://medium.com/@tzhenghao/how-to-ssh-into-your-raspberry-pi-with-a-mac-and-ethernet-cable-636a197d055)

### 感想

渋谷までアダプタ買いにいったところがハイライトでした。
なんで渋谷ってあんな人おおいんですかね。
Nullの扱いについて


開発言語を触っていると、null チェックをうざく感じることがある人は多いだろうなと思う
null objectの存在を見ても、普通のことだと思うが、ラップするってのはC++/stlのauto_ptrやjavaのOptional等を見ても、正直かっちょ悪いと思う
そんな中で、kotlinのように言語レベルでnullを排除しようとしているのは、とてもうれしく思う

なので、どうすれば、null に出会わないコードを書けるかを検討してみたいので、とりあえず気になることを書きなぐってみる

# **なぜnullが嫌なのか？**
nullの一番嫌がられるところは、
```if (null === ```
という文脈が、ビジネスロジックと関係ない文脈として記載されるところだと思う
よって、いろいろな方がどこまで綺麗にビジネスロジックのみにまとめられるかを考えている

# **一般的な null 回避の方法としてのラップするケース**
まずは、一般的な null 回避の方法を気になる範囲で集めてみる

## ***Collectionを戻り値***
***if文のようにnullチェックを行う必要は無いので、ビジネスロジックでの違和感が無くなる***
[List/Array/Map](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collection.html)
SQL等で、結果を取得するときにデータが存在しないときは、null が返ってくる時がある
それを、ListやArray等を戻り値とすることで、nullチェックが無くなるというか、アイテムの数チェックを行うことが出来る

## ***Optional***や***std::auto_ptr***
***nullチェックの代わりに、代替え処理を入れるが1ステートメントで代理値を入れることも可能なのでビジネスロジック上の違和感も薄れる***
[std::auto_ptr](https://msdn.microsoft.com/ja-jp/library/ew3fk483.aspx)
C/C++ の時は、operator演算子がつかえるので用途次第で違和感なく使えるが、
```C/C++
 int* pint = ptr.get();
```等は、所有権の問題等があり実装方法を気にする必要があります

[Optional](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html)
利用したいのはオブジェクトにも関わらず、ラップしている為にメソッドを呼び出すことに違和感があります
常に、戻り値のみとして利用するという話も聞いたことはありますが、戻り値として受け取って新たに代入というのもダサいかなと思います

## ***ReactiveのMono/Flux***
***if文のようにnullチェックを行う必要は無いので、ビジネスロジックでの違和感が無くなるかもしれない***
### [mono](http://projectreactor.io/docs/core/release/reference/#mono)
「最大で1つのアイテムを発行し」とあるが、意図して 0 .. 1 のみでラップしている
### [flux](http://projectreactor.io/docs/core/release/reference/#flux)
「0からN個のアイテムを」とあり、意図して 0 .. Nを表している

# **NullObject等のようにnull条件を記載しないケース**
## ***exceptionとtry/catchの存在***
最近は、exceptionとtry/catchを利用することで、ヌルポに起因するsegmentation fault等が発生しなくなっているので、null objectは気にしないでも良いともいえるかもしれない

## ***exceptionが無い場合***
null チェックが行われないときには、メモリーリークが頻発することになり意図しない動きをすることがある
よって、null チェック後に適切なエラーハンドリングを行う必要がある

## ***null object***
objectを戻す際に、object以外の型(null)を返すことで意図しない分岐が生まれることになるが、単一objectが返る場合は、スムーズにロジックを進めることが出来る
但し、すべてのメソッドでそれなりの振る舞い又は、exceptionを返す必要があるので try/catchが前提の昨今では、普通にNullPointerExceptionを投げさせる方が素直かもしれないと思うときもある。
【css】buttonのスタイルをなくす方法

# 概要
buttonのスタイルをなくす方法について述べよう、と思っていたのだが丸かぶり記事があったのでそのリンクを貼り、私はbuttonのスタイルをなぜ無くしたかったかのモチベーションを述べる。
結果的なコードは[この記事](https://qiita.com/nabettu/items/1593af04e48444c45c53)に書かれている。

# なぜbuttonのスタイルをなくしたかったか

イマドキっぽくかっこいいアイコンがクリックされたらアクションさせたい、みたいなことをしたかった。
私の経験してきた現場は多くの場合、アイコンが**クリックされたら**を検出するためにdiv要素を用意してonClick()でキャッチしていた。

しかしながら、本当にそのやり方がベストなのであろうか。
使う人が限られているしちゃんとクリックできればいいんですよ、というのであれば良いと思うが、もう少し利用者のために**クリックする**ということについて考えてみるのもいいと思う。

私はマウスを使うのが少々面倒だ、と感じる時がある。例えばメニューアイコンをクリックして、びろーんと出てくるメニューリストの中からメニューを選ぶ場面など。初めてアクセスするサイトであれば全然良いのだが、頻繁に使う業務システムのようなアプリケーションの場合はいちいちクリックするのが鬱陶しいのでTabキーとEnterキーでメニューアイコンを押せるようになったら良いのにな、という場面がある。そういうことを考えると、いくらかっこよかったり洒落たボタンでもdiv要素で作られていてTabキーで操作できないものよりは、ダサくてもbutton要素みたいなものでTabキーで操作できる方がよっぽど嬉しい。

そのため、button要素を使いつつかっこいいボタンにしたいため、button要素のスタイルを外して、新たに自分でスタイルやアイコンを入れたい、というのがbuttonのスタイルを外したかった理由である。

また、toCのアプリケーションでは利用者の中には障害を持つ方もいることが考えられる。その際には自助用具を利用した(口で棒を咥えて等)操作が行われ、マウス操作が困難な場合もある。そうした際にTabキーでメニューアイコンが操作できればどうだろうか。

と述べたが、結局誰向けかどうかに限らずメニューアイコンへのアクセスの仕方がマウス操作以外にも、キー操作で行うという選択肢が1つ増えるだけでも便利だと思う。

ここまで論述してきたユーザのアクセスの仕方やし易さに焦点をあてたあたりのことを**アクセシビリティ**と言われており、[CodeGridのWAI-ARIAを活用したフロントエンド実装](https://app.codegrid.net/entry/wai-aria-1)で説明されているので、ぜひそちらを参考にしてほしい。

buttonのスタイルをなくす方法の記事であるが、これを機にユーザのアクセシビリティについて考えるもの良いと思う。

# 参考

https://qiita.com/nabettu/items/1593af04e48444c45c53
https://app.codegrid.net/entry/wai-aria-1
【UMLでプリキュア】分析モデル

#プリキュアシリーズ
以前から気になってはいたのですが、
[プリキュアの各言語での実装まとめ](https://qiita.com/sue445/items/b41a4f5bdca46f1736c3)
を見て、【UMLでプリキュア】を書くことを決意しました。

仕様は、前出のプリキュア記事からざっくりと拾いました。

#クラス図
以下を静的構造分析します。

- プリキュアシリーズとは、複数のプリキュア作品を含みます。
- プリキュア作品には、タイトルがあります。
- プリキュア作品には、それぞれプリキュアが登場します。
- プリキュアには、本名のほかにプリキュアとしての名前があります。
- プリキュアには、それぞれのカラー・変身のセリフ・攻撃のセリフがあります。
- プリキュアは、変身時に他のプリキュアが同じ場所にいる必要がある場合があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/8e3d876b-24ec-6f83-d26c-6d6eaa0ae441.png)
ほとんど、解説の必要のないクラス図だと思います。
いくつか、ここから説明しやすい解説を入れてみます。

##同じプリキュア型の属性表記について
属性の「変身時に同時にいる必要のある相手」は、次のように表記することもできます。
型が「プリキュア」なためです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/420d8926-8169-a990-087a-075ca2040025.png)
※より厳密には、両方の関連端が属性に入らないと、等価にはなりません。

##継承について
あと、変身前と変身後のプリキュアを
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/cbc6c1a4-8f6b-f9f9-587a-86c5ca4671a1.png)
変身前＝「人」クラス
変身後＝「プリキュア」クラス
とするのは、NGです。

継承は、オブジェクトの状態変化を示しません。
プログラミング言語で考えると分かりやすいと思います。

ベースクラスをインスタンス化して、
それとは別に、継承後のクラスをインスタンス化すると、
それらは、同じオブジェクト（＝インスタンス）ではないですよね。

変身前と変身後を継承にしてしまうと、
プリキュアは変身する時に、一度死んで、またプリキュアとして生まれることになります。
変身を解くときも同様になってしまいます。

注意してください。

#ステートマシン図
次に、ふるまい分析をします。
状態を持つ主要なオブジェクトは「プリキュア」と判断し、ステートマシン図により分析！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/b1f96aec-e90a-bff9-2782-2709a9d14b35.png)

覚醒するトリガって何だろう？　と考え、
ひとまず、「覚醒」というものが外から訪れるという理解にしましたので、
クラス図に手を入れて、「プリキュア」クラスの「操作」に「覚醒」を追加しました。

#修正後のクラス図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/cd67b02c-940b-d385-cb17-c6aa2c439a64.png)

以上。
いいねが多かったら、続けてみようかな。
コード変換とか、設計編とか。
なんて、いいねを誘ってみる...(^^。
WPで10分でブログサイトを作ってみた

#やったこと
勉強がてら、自分でサイト運用をしてみようと思ったので、ブログサイトを立ち上げてみた。

#完成品
http://noneed-media.com/

- コンセプト
    - 思いついたけど人前ではだだ滑りするネタを、Evernoteでなく一応世界様に共有する
    - goodIdeaもここにメモがてら共有できたらいいな

#立ち上げまでやったこと
- dockerでWPの開発環境を構築
    - 参考URL
- 適当なテーマを外部から取得
- 適当にカスタマイズ
- Xdomainにて、ドメインとレンタルサーバー取得
- レンタルサーバー上で、WordPressをインストール
- localで作ったWPをALL IN ONE WP MIGRATIONにてエクスポート
- レンタルサーバーで立ち上がっているWPにログイン
- プラグインにALL IN ONE WP MIGRATIONをインストールして、先ほどエクスポートしたファイルをインポート
- 終了

#最後に
エンジニアからしたら毛嫌いされているWPですが、サイトを手っ取り早く立ち上げられるのは、ベンチャー企業やブロガーにとってはともていいサービスだ。
もちろんこれからがっつりカスタマイズをしていく予定。
貿易統計（国連、日本）で２国を比較する（１）

# kaggle で、貿易統計２国間比較をはじめたので、そのメモです。

# 国連のデータから、[ドイツ、日本の比較](https://www.kaggle.com/zanjibar/comparison-deutschland-japan)

国連のデータなので、2014年と古いのですが、多国間の貿易データの比較が可能です。日本の貿易統計では、２国間の取引しかわかりません。まずは国連のデータで概況をつかみ、最新のデータは日本の貿易統計のデータをつかって調べます。

### 輸出入の比較

![__results___4_1.png](https://qiita-image-store.s3.amazonaws.com/0/48387/8776eae2-5f53-bed8-34aa-b0c0bd842082.png)

日本より、ドイツが、輸出、輸入額とも上回っています。
数字は、全体の額を１００とした割合にしてあります。


### ドイツの輸出の内訳
上2桁87は、自動車関連です。300490 は、医薬品です。
![__results___6_1.png](https://qiita-image-store.s3.amazonaws.com/0/48387/805eed02-fea2-9ca8-e1f3-be35da190c36.png)

### 日本の輸出の内訳
自動車、機械関連です。日本もドイツも、一番多いのは、870323 自動車です。
![__results___8_1.png](https://qiita-image-store.s3.amazonaws.com/0/48387/b91e3cbf-cf16-5b9e-e72a-dab0703926d0.png)
Expressにおけるejsの使い方

# ejs（テンプレートエンジン）
- 特徴
    - 高速なコンパイルとレンダリング
    - テンプレートの静的キャッシュが可能
- 表記
    - **表記方法はHTMLとほぼ同じ**
    - 出力する値は<%= value %>で表現

## 基本構文
- 開始タグ
    - スクリプトタグ : <%
    - 出力タグ : <%=
    - 出力タグ（アンエスケープ） : <%-
    - コメント : <%#
- 終了タグ
    - 終端タグ : %>
    - 終端タグ（改行削除） : -%>
- その他
    - エスケープ : <%%

## 利用方法
- `npm install ejs`する
- **setメソッド**で"view engine"というconfigに対し、テンプレートエンジンを指定
- **renderメソッド**でレンダリングを行う
    - デフォルトだと**viewsディレクトリからの相対パス**になることに注意

```app.js
var express = require("express");
var app = express();

// テンプレートエンジンの指定
app.set("view engine", "ejs");

app.get("/", function (req, res) {
    var data = {
        items: [
            {name: "<h1>リンゴ</h1>"},
            {name: "<h2>バナナ</h2>"},
            {name: "<h3>スイカ</h3>"}
        ]
    };
    // レンダリングを行う
    res.render("./index.ejs", data);
});

app.listen(3000);
```

```index.ejs
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <%- include("./item.ejs", items) %>
    </body>
</html>
```

```item.ejs
<ul>
<% for (let item of items) { %>
    <li><%- item.name %></li>
<% } %>
</ul>
```

# 静的ファイルを読み込んだ利用例
- **staticメソッド**を利用する

```/app.js
var express = require("express");
var app = express();

// staticメソッドを利用し、指定ディレクトリ以下の静的ファイルを読み込む
app.use("/public", express.static(__dirname + "/public"));

// routeの設定
app.use("/", require("./routes/index.js"));

app.listen(3000);
```

```/routes/index.js
var router = require("express").Router();

router.get("/", (req, res) => {
    // index.ejsをレンダリング
    res.render("./index.ejs");
});

module.exports = router;
```

```index.ejs
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="/public/bootstrap/css/bootstrap.min.css" />
    </head>
    <body>
        <div class="container">
            <h1>Hello World</h1>
        </div>
    </body>
</html>
```
google test まだ始められていない(macOS編)。

Google Test の始め方
https://qiita.com/kuchida1981/items/9bb8fa4cc04635e7e909

Mac OS X への Google Test + Mock 導入手順
https://qiita.com/cuminseed/items/ba6d44f6c3aac77b15d0

Google TestによるC++のテスト環境構築
https://qiita.com/progrhyme/items/04dbb62f70c691473006

Google Test を Mac OS X El Capitan にインストールしてC言語のテストに使う
https://qiita.com/katryo/items/f37bc19779af8937b5f4

みて、試行錯誤

https://researchmap.jp/jo4lwbonx-1797580/#_1797580

https://github.com/google/googletest
からダウンロード。
うまくいったところを抜き出すと。

```
$ mkdir build
$ cd build
$ cmake ..
$ cd ..
$ make
[ 50%] Built target gtest
[100%] Built target gtest_main
$ ls -al lightest*
-rw-r--r--     1 ogawakiyoshi  staff  1024624  5  7 05:55 libgtest.a
-rw-r--r--     1 ogawakiyoshi  staff     1368  5  7 05:55 libgtest_main.a
$ find . -name gtest.h
./googletest/include/gtest/internal/custom/gtest.h
./googletest/include/gtest/gtest.h
```

やりたいのは、
https://github.com/PacktPublishing/Cpp-High-Performance

```
$ make
Scanning dependencies of target Chapter01-A_Brief_Introduction_to_C++
[ 10%] Building CXX object CMakeFiles/Chapter01-A_Brief_Introduction_to_C++.dir/abstractions.cpp.o
/Users/ogawakiyoshi/Downloads/Cpp-High-Performance-master/Chapter01/abstractions.cpp:5:10: fatal error: 'gtest/gtest.h' file not
      found
#include <gtest/gtest.h>
         ^~~~~~~~~~~~~~~
1 error generated.
```

と言うエラーで止まっている。

２つの作業をどう結びつけるか思案中。

1どっちをどっちに持っていくか。

2 環境変数の設定でしのぐか

3 コマンドの指定でしのぐか

4 それ以外の方法を探すか。

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 　20180617
ver. 0.02 ありがとう追記　20230513
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
SymPyで極限値を求める

　SymPyを使って高校数学でおなじみの三角関数の極限値を求めます。
$$
\begin{equation*}
\lim_{x \to 0} \frac{\sin x}{x} = 1
\end{equation*}
$$
# 関数のプロット
はじめに関数をプロットしてみます。複数の`Symbol`を宣言する場合は`symbols`が便利です。


```python
%matplotlib inline
from sympy import sin
from sympy import pi
from sympy import symbols
from sympy.plotting import plot
```


```python
x, y1, y2, y3  = symbols('x y1 y2 y3')
y1 = x
y2 = sin(x)
y3 = y2/y1

plot(y1, y2, y3, (x, -pi/2, pi/2))
```
![output_5_0.png](https://qiita-image-store.s3.amazonaws.com/0/190127/dae48e56-83d6-f0ad-ab92-7b80ca8ea7bc.png)

このままだとグラフと関数`y1 y2 y3`の対応がわかりません。
`y1 y2 y3`を個別にプロットして、一つのグラフにまとめる形にします。


```python
p1 = plot(y1,(x, -pi/2, pi/2),line_color='#ff0000', legend=True)
p2 = plot(y2,(x, -pi/2, pi/2),line_color='#00ff00', legend=True)
p3 = plot(y3,(x, -pi/2, pi/2),line_color='#0000ff', legend=True)
p1.extend(p2)
p1.extend(p3)
p1.legend = True
p1.show()
```

![output_7_0.png](https://qiita-image-store.s3.amazonaws.com/0/190127/86b35ace-1f4a-2cfb-fe9d-1a856966baaf.png)

![output_7_1.png](https://qiita-image-store.s3.amazonaws.com/0/190127/cee08ef1-85f0-447c-925a-5a914efa1983.png)

![output_7_2.png](https://qiita-image-store.s3.amazonaws.com/0/190127/76753d00-9b8e-77e6-8e32-e6582d689650.png)
![output_7_3.png](https://qiita-image-store.s3.amazonaws.com/0/190127/34595493-8c62-04ea-13eb-394ce4ffe8ea.png)




原点付近で`x`と`sin(x)`の傾きが等しいように見えます。

# 極限値の計算
$\lim_{x \to 0} \frac{\sin x}{x}$の極限値を求めます。
`sympy`から`limit`を読み込みます。


```python
from sympy import limit
limit(sin(x)/x, x, 0)
```

$$1$$


当然ながら$\lim_{x \to 0} \frac{\sin x}{x}=1$となることがわかります。
引数が無限大における極限値$\lim_{x \to \infty} f(x)$を求める場合は`sympy`から`oo`を読み込む必要があります。


```python
from sympy import oo
limit(sin(x)/x, x, oo)
```
$$0$$
$y = \sin x$が振動するのに対して$y = x$は単調増加するため極限値は0になります。
mount.cifsに付けるオプション

# 背景
WindowsやNASの共有ドライブをLinuxからmountするために使う`/usr/sbin/mount.cifs`にどういうオプションを与えると自分が設定している環境でベターなのかよくわからない。その理由は

* NASなどで対応しているCIFSプロトコルバージョンが異なる
* Linux側で対応しているプロトコルバージョンやデフォルトで使われるバージョンが異なる。[Linux カーネル 4.12まではプロトコル1.0で接続しようとしているがそれ以降は違うなど](https://wiki.samba.org/index.php/LinuxCIFSKernel)

`mount` コマンドの `-o` オプションに与えるオプションの決め方について良いと思われるものを以下で書く。`/etc/fstab` に与えるオプションにも当てはまる。Linuxカーネルのプロトコル対応状況は[ここ](https://wiki.samba.org/index.php/SMB3_kernel_status)に詳しい

# プロトコルバージョンの決め方
古いプロトコルバージョンは安全性に問題がある上に遅いので、なるべく新しいプロトコルバージョンで接続することが望ましい。したがって `mount.cifs` が理解するバージョンを大きい順に`mount.cifs -o vers=番号` という形式で試して一番高いバージョンを用いる。

<dl>
<dt>3.1.1</dt>
<dd>このプロトコルバージョンは<a href="https://wiki.samba.org/index.php/LinuxCIFSKernel">Linux 4.17以降でしか対応していない</a></dd>
<dt>3.02</dt>
<dt>3.0</dt>
<dd>3.0以上のプロトコルバージョンとLinuxカーネルバージョン4.4以上ならより信頼性が高い`persistenthandles` (`mount.cifs` のオプション)に対応している。またより高速なアクセスが出来る<a href="https://internet.watch.impress.co.jp/docs/column/nettech/1090436.html">SMB Direct (RDMA)</a>にプロトコルが対応しているから`rdma`を`mount.cifs`に与えて動作するか試してみる。
<dt>2.1</dt>
<dd>このバージョンを使える場合および前述の`persistenthandles`が使えない場合、信頼性を高めるため `resilienthandles` を`mount.cifs` に与えてみる。
<dt>2.0</dt>
<dd>プロトコルバージョン2.0以上で動かないと遅い
<dt>1.0</dt>
<dd>プロトコルバージョン1.0しか使えないならこれを使うしかない</dd>
</dl>

# その他のCIFSオプション
<dl>
<dt>guest</dt>
<dd>パスワードを聞かれなくなる（ゲストログインする）</dd>
<dt>credentials=ファイル名</dt>
<dd>起動時に自動マウントする場合などにコマンドオプションにパスワードを書くことも対話的にパスワードを与えることも出来ないので「ファイル名」にmanページに指定された形式でパスワードなどを書いておく</dd>
<dt>iocharset=utf8</dt>
<dd>手元のLinuxの漢字ファイルネームを保存している漢字コードを指定する</dd>
<dt>sfu,mfsymlinks</dt>
<dd>シンボリックリンクの扱いがよくなる</dd>
<dt>cifsacl,idsfromsid</dt>
<dd><a href="https://www.kernel.org/doc/readme/Documentation-filesystems-cifs-README"</a>これらのオプションを指定すると動作がよりunixっぽくなる</a></dd>
</dl>

# NFSなどとも共通のmountオプション

<dl>
<dt>hardまたはsoft</dt>
<dd>hardなら操作がタイムアウトしたときに成功するまで再試行するのでアプリケーションがハングアップすることがあるが、softならエラーをアプリケーションプログラムに返す</dd>
<dt>intrまたはnointr</dt>
<dd>intrだとシグナルによるシステムコールの中断を認めるがnointrなら認めない</dd>
<dt>noexec, nosuid, nodev</dt>
<dd>リモートファイルシステム上のファイルの実行を認めるか、SUIDビットを認識するか、デバイス特殊ファイルを元認めるかのオプション。よくわからなければセキュリティ上は全部指定しておくほうがよい</dd>
</dl>

# `/etc/fstab` にだけ指定するオプション（CIFS以外と共通）と注意事項
<dl>
<dt>x-systemd.automount</dt>
<dd>そのディレクトリをアクセスしたときにsystemdが自動的にマウントしてくれる</dt>
<dt>x-systemd.idle-timeout=10m</dt>
<dd>そのディレクトリを10分間アクセスしなかったときにsystemdが自動的にアンマウントしてくれる</dt>
<dt>_netdev</dt>
<dd>起動時にネットワークの設定が終わったあとにマウントされるべきことを示すオプション。CIFSやNFSなどに必ず指定するべき</dd>
<dt>user</dt>
<dd>これをfstabに書いておけば一般ユーザーがマウント出来る</dd>
<dt>noauto</dt>
<dd>起動時にはマウントしない</dd>
<dt>nofail</dt>
<dd>systemdが理解するオプションでマウント失敗しても起動を続ける</dd>
<dt>x-systemd.mount-timeout=何秒</dt>
<dd>起動時のmountコマンド終了まで待つ秒数</dd>
</dl>
Elixirのリストの仕様をまとめてみた

（この記事は、「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」の1日目です）

#はじめに
この度，[fukuoka.ex](https://fukuokaex.connpass.com/)キャストとして, 「fukuoka.ex x ザキ研 Advent Calendar 2017」に参加させていただきました，@hisawayと申します．よろしくお願いします．
私が目指すのは， Python でいうところのNumPy相当の機能を作ることです． 私自身はオブジェクト指向言語しか扱ったことがありませんので，私と同じようにオブジェクト指向言語に慣れ親しんだ人が関数型言語を始める参考記事になればいいかなと思っています．

#動作環境
Mac OS 10.13.4
Elixir 1.6.4 (compiled with OTP 20)

# 配列：リスト
## 基本知識
Elixirでは，配列に相当するものとして，「**リスト**」もしくは「**タプル**」
があります．要素には数値以外も含めることができます．詳細な仕様については[本家のサイト](http://elixir-ja.sena-net.works/getting_started/2.html#2.8-%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AB%E3%81%99%E3%82%8B%E3%81%8B%E3%82%BF%E3%83%97%E3%83%AB%E3%81%AB%E3%81%99%E3%82%8B%E3%81%8B---lists-or-tuples?)を確認しましょう. 

```elixir:iex
# リスト
[0, 1, 2]
# タプル
{0, 1, 2}
```

リストの特徴をざっくり挙げると

- 先頭への操作を行うと高速
- ランダムアクセスは**遅い**  

行列演算をする際にランダムアクセスして計算を行うのはパッと思いつくもので外積があります．しかし，四則演算や内積計算などは行列の先頭から計算を行なって行くため，リストを配列として用いてライブラリを書いていきます．
  
### head,tail
リストに `hd` とつけると，先頭の要素を**値として**取得することができます． 
また，リストに`tl`とつけると，先頭以外の要素を**リストとして**取得できます．

```elixir:head_tail    
iex(1)> a = [0, 1, 2]  
[0, 1, 2]  
iex(2)> hd a  
0
iex(3)> tl a
[1,2]  
```  
## パターンマッチング
[リストのパターンマッチング](http://elixir-ja.sena-net.works/getting_started/4.html#4.2-%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0---pattern-matching)は以下のような構文です．この構文は関数を設計する際に必要です．

```elixir:pattern_matching
iex(1)> [head | tail] = [1, 2, 3]
[1, 2, 3]
iex(2)> head
1
iex(3)> tail
[2, 3]

```

## リスト同士の計算
リストでは，要素に数値以外も含めることができるので，リストが数値だけで構成されていたとしても加算を行うことはできません．(`++`はリストの連結を行う演算子なので間違えないようにしましょう)

```elixir:add_list
iex(1)> a = [0]
[0]
iex(2)> b = [1]
[1]
iex(3)> a + b
** (ArithmeticError) bad argument in arithmetic expression
    :erlang.+([0], [1])

```

なので先頭の要素を取得して，加算します．  

```elixir:add_hd_list
iex(1)> a = [1]
[1]
iex(2)> b = [2]
[2]
iex(3)> [(hd a) + (hd b)]
[3]
```
()をつけないとはじかれてしまいます．  
上記が今後コードを書く上で基礎となります．

# [非推奨] ループは再帰呼び出しで
　リストの仕様上から`for`文を使うより，先頭から処理をさせた方がパフォーマンスがよさそうだということがわかったかと思います．`for`を使わずにどのようにループをさせるかというと**関数の再帰呼び出し**をします．
参考:[9 再帰 - Reccursion](http://elixir-ja.sena-net.works/getting_started/9.html) 
　再帰呼び出しを行うためには，ガード句や前述のパターンマッチングの知識が必要となります．なので，再帰呼び出しについては次回で触れつつ，実際に関数の設計を行なっていきます．

# まとめ
Elixirのリストの仕様についてまとめました．

- リストは先頭から操作すると速い
- リストのループは再帰呼び出しでする

私のようなC系に慣れた人にとっては変な(?)仕様に見えてしまうかもですが，少しずつ慣れていきましょう．

- 次回　「[Elixirで再帰呼び出しを使ってリストの加算関数をつくる](https://qiita.com/hisaway/items/647f33fbdcff21dae5a4)」

明日は @Takeshi-Kogu さんの[「ElixirでExcelのデータの処理をしてみた」](https://qiita.com/Takeshi-Kogu/items/b615bc807a02eee19d7a) です。お楽しみに！

# 追記　2019/02/24
fukuoka.exではリストの操作(ループ)は再帰ではなく，Enum.map/reduceを推奨しています．

## map/reduceメリット

- 可読性がよくなる
- パイプライン演算子が使いやすい
    - 副次的な効果としてパイプライン演算子を使うために関数の設計規則が自然と統一される
- 並列プログラミング処理系「Hastega」の恩恵を受けられる(予定)
    - [ZEAM開発ログ: Elixir マクロ + LLVM で超並列プログラミング処理系を研究開発中](https://qiita.com/zacky1972/items/cc88260a3c93c9f71317)

パフォーマンスにこだわりがなければ一旦思考の外に追い出しましょう．
もしこだわりたい方がいましたら，こちらをご覧ください．言語処理系レベルからの最適化に挑戦中です．

- @zacky1972「 [ZEAM開発ログ 目次](https://qiita.com/zacky1972/items/70593ab2b70d192813df)」

(追記終わり)
【rails】updated_atを日本時間で表示する

#updated_atが日本時間で表示されない！

<img width="552" alt="スクリーンショット 2018-06-17 19.43.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/ad8c87f7-c1fe-7e76-5c1f-878c434d5732.png">

##解決策

１. configフォルダ内のapplication.rbファイルに、以下を記述する。

```ruby
config.time_zone = 'Tokyo'
```

<img width="656" alt="スクリーンショット 2018-06-17 19.48.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/ab727de4-2ecd-08c5-8221-7797fdcd5efc.png">

２. rais serverを再起動する。

３. ページを再読み込みする。

日本時間で表示されるが、表示がぐちゃぐちゃしている。。。

<img width="538" alt="スクリーンショット 2018-06-17 19.51.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/2227ae64-28cd-b8eb-bd3a-34dbc3efce36.png">

４. strftimeを使って、表示の調整をする。

```ruby
updated_at.strftime("%Y-%m-%d %H:%M")
```
<img width="624" alt="スクリーンショット 2018-06-17 19.53.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/5442f5d8-d3a4-f67d-e263-3822a1b8399c.png">


５. ページを再読み込みする。

綺麗に表示される( T_T)＼(^-^ )♡

<img width="584" alt="スクリーンショット 2018-06-17 19.41.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/174494/b4420465-fb22-d4c0-d148-5fc7dd46713f.png">

　
以上！！！
Faust : 単純な発振器(ただしVSTエフェクト)を作ってみた。

未だにAbleton Live 8.4.2(しかも32bit)を使っています。自分の用途では必要十分なので。

必要があって、ある出力からサイン波を出し続けるようにしたいのですが、さる処から供給されたプラグインは64bit。

今どきあたりまえか、と思い、Live8.4.2(64bit)をインストールし、Audio Trackに挿入するも音沙汰なし。
Live9 Trial だと、正常にサイン波を出力します。

8.4.2だとジェネレーターっぽいもの(0in/2outとか)を認識できてないんじゃない?と勝手にあたりをつけ、普通のVSTエフェクト同様に2in/2outの発振器をFaustで作ってみました。

```cpp:myOsc.dsp
declare name "myOsc";
import("stdfaust.lib");

process = *( 0), *( 0) : +( osc), +( osc)   ;
osc = os.osc(freq) * vol;

myOscGrp(x) = vgroup("[0]myOsc", x);
vol = myOscGrp(hslider("[1]volume [unit:dB]", -20, -96, 0, 0.1) : ba.db2linear : si.smoo );
freq = myOscGrp(hslider("[0]freq [unit:Hz]", 440, 20, 1000, 1));
```

入力を使ってはいますが、0をかけてoscを加える、という手口です。
<img width="451" alt="スクリーンショット 2018-06-17 19.48.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/61597/e420f54b-1d0f-c146-8897-dace14bbe2bc.png">

これでVSTを作り、使ってみました。

<img width="206" alt="スクリーンショット 2018-06-17 16.35.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/61597/9d6b8a58-c4c5-cb71-8342-3694236fcaf1.png">

ちゃんと発振してます。使える。
元々使っていた8.4.2(32bit)でも使える。
Chrome拡張でポップアップとコンテンツのスクリプト間でデータのやり取りをするサンプル

# manifest.json
```json
{
  "manifest_version": 2,
  "name": "Test",
  "version": "1.0.2",
  "description": "Test",
  "browser_action": {
    "default_icon": "icon_128.png",
    "default_popup": "uis/popup.html"
  },
  "background": {
    "scripts": [
      "scripts/background.js"
    ],
    "persistent": false
  },
  "permissions": [],
  "icons": {
    "128": "icon_128.png"
  },
  "content_scripts": [
    {
      "matches": [
        "file:///*"
      ],
      "js": [
        "scripts/contents.js"
      ]
    }
  ]
}
```

# uis/popup.html
```html
<html>
<head>
    <title>Test</title>
</head>
<body>
    <button id="send">send</button>
    <button id="log">log</button>
</body>
<script src="../scripts/popup.js"></script>
</html>
```

# scripts/popup.js
```javascript
// backgroundで受け取った値をコンソールに表示
function logBackgroundValue () {
    var test = chrome.extension.getBackgroundPage().test_value;
    console.log(test);
    return;
}

// 現在アクティブなタブにデータを送信
function sendToContents(){
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        chrome.tabs.sendMessage(tabs[0].id, 
            JSON.stringify({ contents: "test value from popup" }),
            function (response) {
            });
    });    
}

document.getElementById('log').addEventListener('click', logBackgroundValue);
document.getElementById('send').addEventListener('click', sendToContents);
```

# scripts/background.js
```javascript
var test_value;

// contents.jsで送信した値を受信
chrome.runtime.onMessage.addListener(
    function (request, sender, sendResponse) {
        test_value = request.value;
    }
);
```

# scripts/contents.js
```javascript
// 送信側 contents -> background
chrome.runtime.sendMessage(
    { value: { contents: "test value from contents" } }
);

// 受信側 other tab -> contents(popup/option -> contents)
chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
    console.log(message);
    return;
});
```

# Chrome拡張を実行させるページそのもの
```html
<html>
<head>
    <title>Test</title>
</head>
<body>
    <button id="contents_button">Test</button>
</body>
</html>
```
Nuxt.jsとthree.js(+loader)のsetup

Nuxt環境にてthree.jsを利用する際、loaderやcontrolesも利用することが圧倒的に多いと思います。
自分の中で利用方法が固まってきたのでメモ。
こうした方がいいよーなどあればよろしくお願いします。

## before

`threeComp.vue`

```vue
...
<script>
import * as THREE from 'three'
import 'imports-loader?THREE=three!three/examples/js/loaders/OBJLoader.js'
import 'imports-loader?THREE=three!three/examples/js/loaders/MTLLoader.js'
import 'imports-loader?THREE=three!three/examples/js/loaders/PLYLoader.js'
import 'imports-loader?THREE=three!three/examples/js/loaders/GLTFLoader.js'
import 'imports-loader?THREE=three!three/examples/js/controls/OrbitControls.js'

export default {
  name: 'threeComp',
  methods: {
    init () {
      const scene = new THREE.Scene()
      ..
```

`error log`

```

..
100:26-41 "export 'OBJLoader' (imported as 'THREE') was not found in 'three'
..
101:26-41 "export 'MTLLoader' (imported as 'THREE') was not found in 'three'
..
```

動くのですがエラー吐いてます。まずいですね。

## after

new! `/plugins/three.js`

```js 

import Vue from 'vue'
import * as THREE from 'three'
import 'imports-loader?THREE=three!three/examples/js/loaders/OBJLoader.js'
import 'imports-loader?THREE=three!three/examples/js/loaders/MTLLoader.js'
import 'imports-loader?THREE=three!three/examples/js/loaders/PLYLoader.js' 
import 'imports-loader?THREE=three!three/examples/js/loaders/GLTFLoader.js'  
import 'imports-loader?THREE=three!three/examples/js/controls/OrbitControls.js'
Vue.use({
  install (Vue, options) {
    Vue.prototype.$THREE = THREE
  }
})
```

add `nuxt.config.js`

```js

module.exports = {
  plugins: [
..
    { src: '~plugins/three', ssr: false }, |
..
  ],
}
```

mod `threeComp.vue`

```vue
...
<script>
// import * as THREE from 'three'
// import 'imports-loader?THREE=three!three/examples/js/loaders/OBJLoader.js'
// import 'imports-loader?THREE=three!three/examples/js/loaders/MTLLoader.js'
// import 'imports-loader?THREE=three!three/examples/js/loaders/PLYLoader.js'
// import 'imports-loader?THREE=three!three/examples/js/loaders/GLTFLoader.js'
// import 'imports-loader?THREE=three!three/examples/js/controls/OrbitControls.js'

export default {
  name: 'threeComp',
  methods: {
    init () {
      // const scene = new THREE.Scene()
      const scene = new this.$THREE.Scene()
      ..
```

でうまくいきます。three(+α)をvueに配置しているので、ごく一部でthreeを利用している場合は読み方変えた方がいいと思います。
Docker入門_DockerコンテナをCygwin代わりに使える！？

#すること
Windows10pro環境にて
- Docker install
- Cygwinの代わりにDockerからPython実行する
- Dockerの基本操作

#Dockerってなに？（雰囲気）
ハードウェアをエミュレートする完全な仮想マシンよりも軽い感じの仮想マシン。（私が受けている印象）
WindowsにおけるDockerとはLinuxのVM(仮想マシン)を1つ動かし、これを基盤としてこの上でDockerImageに基づき「コンテナ」を生成し動かすもの。らしい。

#モチベーション
- 仮想環境を使えばホスト環境を汚さずに環境構築、環境の使い分け（！）、およびやり直し（！！）などができるらしいので是が非でも導入したい。

#install
Dockerの利用にはお金がかかりませんが、ユーザ登録が必要です。以下から素直に登録。
[Docker公式](https://www.docker.com/)

DockerHubからDLしろと案内されますので以下よりinstall。
[DockerCommunityEditionforWin](https://store.docker.com/editions/community/docker-ce-desktop-windows)

インストールすると、"docker"が環境変数に登録されるらしく、PowerShellやコマンドラインから呼び出せます。

インストールし、Dockerが正常に起動していればPowershellなどにおいて以下コマンドでいろいろな情報が出てくるはず。

```shell
docker info
```

# CentOSをDockerで動かす
OSが動けばなんでもできそうなのでCentOSを動かすことにした。

具体的コマンドはこの記事に教わりました。
[Dockerを導入する（CentOS版）](https://qiita.com/zwirky/items/991f61a231f4e198a320)
[Dockerコンテナからのディレクトリアクセスやボリューム共有](https://thinkit.co.jp/story/2015/09/15/6384)

```docker
docker login
...ユーザー名とパスワードを聞かれるので入力しないとpullできない...

docker pull centos
...Image取得にしばらくかかります1GB程度だったと思う...

docker run -v [共有する場所:コンテナ内でのマウント先] -it centos /bin/bash
例)
docker run -v s:share_docker:/root/share -it centos /bin/bash
...起動し、コンテナにアタッチされます。
```

Docker上のCentOSコンテナで共有ファイルにアクセスしてpython実行

```Python:s\share_docker\hello.py(ホストOS上)
#coding:utf-8
print("HelloPython on Docker!")
```

```docker:dockerのコンテナから実行
ls ...共有ファイル内が見える
python hello.py ...pythonが実行される
```

# 成果
Cygwinの代わりというには、共有指定した部分のみの共有になるなど足りない部分もあるかもしれない。、しかし、Linuxコマンドを使用でき、各種プログラム実行できる環境を手に入れることができたのでよしとする。
Android KTXで嵌ってた（Android resource linking failed）

Google I/Oで発表されたNavigationを触ろうとしてなんだか嵌ってしまったこと。

Android Studio のプロジェクト自動生成で作って、
Android KTXを入れようとしてたんですが、以下のエラーがでて全くビルドできず。。。

```
Android resource linking failed
Output:  C:\Users\nitak\projects\SampleNavigation\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:355: error: resource android:attr/fontVariationSettings not found.
C:\Users\nitak\projects\SampleNavigation\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:355: error: resource android:attr/ttcIndex not found.
error: failed linking references.
```

# 結論
* SDKバージョンは28にする
* グループはandroidxを使う
* まだpreview

# 調べたこと
`Android resource linking failed` で検索してもどうも違う情報がヒットする。
3か月前とかの情報だったり。。。

Android KTXのissuesみてたら、以下の内容があったので参考にしてみる。

> JakeWharton commented on 19 May
> core-ktx 1.0.0-alpha1 depends on core 1.0.0-alpha1 which requires compilation against Android P.

[AndroidX installation error](https://github.com/android/android-ktx/issues/548)

SDKバージョンあげてなかった・・・


しょうもないけど解決しました。

あとはこれ。
[Manifest merger failed #576](https://github.com/android/android-ktx/issues/576)

できたのが以下のbuild.gradle

``` build.gradle
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    buildToolsVersion "27.0.3"
    defaultConfig {
        applicationId "net.nitakan.samplenavigation"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0-alpha3'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
    testImplementation 'junit:junit:4.12'
    implementation 'androidx.core:core-ktx:1.0.0-alpha3'

    androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0-alpha3', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

```