OmniAICreator/Qiita-1.07M huggingface dataset:
Go言語で見るインタフェース分離による恩恵

# インタフェース分離の原則とは
> クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない

以前投稿した以下の内容で問題なさそうなので、こちらを参照してください。
[【ボブおじさんのClean Architectureまとめ】オブジェクト指向](https://qiita.com/yoshinori_hisakawa/items/25576a62123607a696f6#%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87-lspliskov-substitution-principle)

# Go言語で見るインタフェース分離による恩恵
具体的に分離することでどういった**恩恵**が得られるのかを見ていきます。

実装例として文章をファイルに保存する方法を以下の3つのパターンで見ていきます。
・シンプルな方法
・インタフェースを用いた方法
・適切なインタフェースを用いた方法

## 方法1 シンプルな方法

```golang
func Save(f *os.File, doc *Document) error
```

第一引数に保存先のファイル、第二引数に文章を受け取るようにしています。
あとは内部で保存する処理を書けば良さそうです。

しかし保存先をファイルでなくクラウドストレージやDBに保存したいと要件が変わった場合どうしますか？
新しくクラウドストレージ用、DB用のSaveメソッドを増やして行くのが最善の策でしょうか？

また、保存出来ることのテストはどのようにすれば良いでしょうか？
実際にファイルを作成し、ファイルに文章が書き込まれていることを確認すればできます。
文字のチェックなど確認事項が多くなってしまいそうです。

### シンプルな方法での問題
一度シンプルな方法を使った場合の2つの問題点をまとめておきます。
・保存先を変える際の呼び出し側に影響がでる
・テストを実施することが難しい

## 方法2 インタフェースを用いた方法

```golang
func Save(rwc io.ReadWriteCloser, doc *Document) error
```

```golang:io.ReadWriteCloser
// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.
type ReadWriteCloser interface {
	Reader
	Writer
	Closer
}
```

保存先をファイルからインタフェースに変更しました。
ReadWriteCloserインタフェースを実装している構造体（ファイルでもDBでも...）ならば第一引数で受け入れられますので、使う側に変更による影響がなくなりました。
また、テストの際にReadWriteCloserインタフェースを実装したモックを作れば、テストも簡単に実施することができます。

よってシンプルな方法で挙がっていた以下の問題を解決できました。
・保存先を変える際の呼び出し側に影響がでる
・テストを実施することが難しい

しかし、 ここで1つ質問です。
保存するだけなのに、保存先の情報をReadしたり、保存後にCloseをする必要があるでしょうか？
**Saveメソッドの利用者は保存（Write）したいだけです。**

ここでインタフェース分離の原則を思い出してみましょう。
> クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない
つまり分離の原則に従うならばCloserとReaderに依存を強制しないようにすべきです。

### インタフェースを用いた方法での問題
・CloserとReaderが不要
・利用しないメソッドへの依存を強制

## 方法3 適切なインタフェースを用いた方法
```golang
func Save(w io.Writer, doc *Document) error
```

```golang:io.Writer
type Writer interface {
	Write(p []byte) (n int, err error)
}
```

Writerインタフェースは保存先に保存（Write）することだけを提供します。
よってインタフェースを用いた方法で挙がっていた以下の問題を解決できました。
・CloserとReaderが不要
・利用しないメソッドへの依存を強制

# 最後に
インタフェース分離の原則による恩恵についてまとめました。
重要な以下のことを学びました。
・適切なインタフェースを用いること
・目的に応じてインタフェースを分離すること

他にもSOLIDの原則をまとめています。
Git関連設定

# GitおよびGitHub関連
# GitHubへの登録

# ローカルマシンでの設定
```
git config --global user.name ○○○○
git config --global user.email □□□□
```
まず最初に何をするべきか、色々webで調べたのですが、今ひとつピンときませんでした。
おおよそ、以下の2パターンがあると理解しました。それぞれの場合で、ローカルマシンで実施する内容が異なる。
1.GitHub上でレポジトリを作成(ファイル作成なし)
2.GitHub上でレポジトリを作成(README.mdも作成)
abc 092

B
ある合宿におやつとしてチョコレートが何個か準備されました。 合宿は N 人が参加して D 日間行われました。 i 人目の参加者 (1≤i≤N) は合宿の 1,Ai+1,2Ai+1,… 日目にチョコレートを 1 個ずつ食べました。 その結果、合宿終了後に残っていたチョコレートは X 個となりました。また、合宿の参加者以外がチョコレートを食べることはありませんでした。
合宿開始前に準備されていたチョコレートの個数を求めてください。

```
#include<iostream>
using namespace std;
int main() {
	int N, D, X;
	int A;
	cin >> N;
	cin >> D >> X;
	int sum = 0;
	for (int i = 0; i < N; ++i) {
		cin >> A;
		for (int j = 1; j <= D; j += A) {
			sum++;
		}
	}
	cout << sum + X;
	return 0;
}
```

C
x 軸上に N 個の観光スポットがあり、1,2,…,N の番号がついています。 観光スポット i は座標 Ai の点にあります。 また、x 軸上を座標 a の点から座標 b の点まで移動するには |a−b| 円かかります。
あなたは x 軸上を旅行する計画を立てました。 計画では、最初に座標 0 の点を出発し、N 個の観光スポットを番号順に訪れ、最後に座標 0 の点に戻ってくることになっています。
ところが、旅行の直前に急用が入り、N 個すべての観光スポットを訪れる時間的余裕がなくなってしまいました。 そこで、ある i を選び、観光スポット i を訪れるのを取りやめることにしました。 それ以外の観光スポットは予定通り番号順に訪れます。 また、最初に座標 0 の点を出発し、最後に座標 0 の点に戻ってくることについても、予定に変更はありません。
i=1,2,…,N それぞれについて、観光スポット i を訪れるのを取りやめたときの、旅行中の移動にかかる金額の総和を求めてください。
制約
2≤N≤105
−5000≤Ai≤5000 (1≤i≤N)
入力値はすべて整数である。

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
int main() {
	int N;
	cin >> N;
	vector<int>V;
	V.push_back(0);
	for (int i = 0; i < N; ++i) {
		int a;
		cin >> a;
		V.push_back(a);
	}
	V.push_back(0);
	int S = 0;
	for (int i = 0; i < V.size()-1; ++i) {
		S += abs(V[i] - V[i + 1]);
	}
	for (int i = 1; i < V.size() - 1; ++i) {
		cout << S - abs(V[i - 1]-V[i]) - abs(V[i + 1]-V[i]) + abs(V[i + 1] - V[i - 1]) << endl;
	}
	return 0;
}
```
できるだけfor文は重ねないほうがいいねってやつ
JuliaのPlotsでフォントが小さすぎる

　Juliaをjupyter notebookで使い、Plotsで作図するとフォントが小さすぎる現象に陥りました。これはPlotsでGRを使う時にのみ起こるようです。しかもブラウザがChromeだと起こりません。私はWindows10のデフォルトブラウザをEdgeからChromeに変えることでこの問題を回避しました。まだ日本語が表示できない問題を抱えていますが、当面はこれで行こうと思います。

Tiny fonts when using GR (Plots or not) in Jupyter
https://discourse.julialang.org/t/tiny-fonts-when-using-gr-plots-or-not-in-jupyter/16085



```
using Plots
gr()
x=[1,2,3,4,5]
y=[5,8,3,1,3]

plot(x,y, 
    seriestype=:scatter,
    title="My Scatter Plot", 
    lab = "test",
    xlabel = "X", 
    xlims = (0,6), 
    xticks = 0:1:6, 
    xscale = :identity,
    ylabel = "Y", 
    ylims = (0,10), 
    yticks = 0:1:10, 
    xtickfont = font(20, "Courier"))
```

##Edge

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/fc855102-1da5-8f49-b6c9-87e377b5b388.png)


##Chrome
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/760672a4-0abd-aed3-0361-39d5c2486e2e.png)
FlutterとFirebaseでFacebook認証やってみた (iOS)

# 環境
- 開発IDE: Android Studio, Xcode
- テスト実機: iPhone 7 (シミュレータだとネットに接続できなかったため)

# 前提
- 実機でアプリを実行できること(Appleの開発者としてSigingできること)

---
今話題のFlutterとFirebaseを使って、Facebook認証可能なiOSアプリを作成した。
色々とつまづいた部分があるのでそれらの備忘録的なまとめ。

以下の手順で実施。


# Facebook アプリ作成
[Facebook for Developers](https://developers.facebook.com/apps)に行き、手順に従ってアプリを作成する。

作成すると以下のような画面ができるはず。

<img width="1359" alt="Screen Shot 2018-10-27 at 16.16.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/307367/c0a5f565-eeb8-8836-5735-ac9f46e10342.png">

# FirebaseでFacebook認証を有効化
Firebaseのコンソールで、 `Authentication > ログイン方法`　からFacebookを有効にする。

こんな画面↓

<img width="819" alt="Screen Shot 2018-10-27 at 16.28.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/307367/b0505da3-b64c-a291-4119-725229cb1b47.png">

- アプリケーションID
- アプリシークレット

を記載する必要があるがこれは、Facebook for Developersの　`設定 > ベーシック` に記載されているものをコピペする。


<img width="1251" alt="Screen Shot 2018-10-27 at 15.47.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/307367/05556df6-03be-3441-4b2b-a46fa96c4566.png">

アプリケーションID、アプリシークレットをコピペしたら、今度は逆にリダイレクトURIをfacebook側にコピペする。

`プロダクト > Facebookログイン > 設定`

<img width="895" alt="Screen Shot 2018-10-27 at 15.46.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/307367/00fdd559-c557-21c5-50ac-80cad9cddd52.png">

`変更を保存`　をクリック。

# FirebaseにFlutterアプリを登録 ＆ FlutterにFirebaseの情報を登録
[ここ](https://firebase.google.com/docs/flutter/setup?hl=ja)の手順に従ってFirebaseにFlutterアプリを登録する (「Androidの構成」は無視してOK)。
同時にFlutterへFirebaseの情報も登録する。


# iOSアプリのFacebookログインを有効にする
[こちらのサイト](https://medium.com/flutter-community/flutter-facebook-login-77fcd187242)の、

> That’s it! Our login works perfectly on Android. Now, let’s try iOS:

この文言以下の手順に従い、[ここ](https://developers.facebook.com/docs/facebook-login/ios)からiOSアプリのFacebookログインについて設定する(1〜4まででOK)。

# Flutterプロジェクトディレクトリの `pubspec.yaml` の編集
`# Firebase`の部分をdependenciesに追記

```
dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2

  # Firebase
  firebase_auth: ^0.6.2
  firebase_analytics: ^0.3.3
  flutter_facebook_login: ^1.1.1
```

ターミナルで` flutter packages get`　を実行してこれらのパッケージをインストールする。

これで実機にアプリをインストールして実行すれば、以下のようにアプリからFBの情報を取得することができた。

<img width="375" alt="IMG_4808.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/307367/d0e8fc94-ef48-3c11-cc67-c71ffe3bd565.png">

![IMG_4809.PNG](https://qiita-image-store.s3.amazonaws.com/0/307367/b40ba4e5-d343-7a71-e945-3b6f0dc3fb53.png)

![IMG_4811.PNG](https://qiita-image-store.s3.amazonaws.com/0/307367/1c267d90-d6d5-c3c9-3c7e-db81f153f384.png)

ちゃんとFirebaseでもfacebookでログインしていることが確認できた。
![IMG_4813.JPG](https://qiita-image-store.s3.amazonaws.com/0/307367/f8f33204-b9f2-a956-c1d0-f5748b68e6da.jpeg)


# その他つまづいたところ
- FacebookでSignInしても詳細画面に遷移しなかった
  - 過去Firebaseに別の方法でログインしていた(Googleログイン)
    - デフォルトだと一つのアカウントには一つの方法でしかログインできないようになっているため、このGoogleログインしたアカウントを削除することで対応した
[Ruby on Rails] マイグレーション中にモデルを使ってデータ移行をしたい

Rails でカラムの構成や意味を変えたいときとかに、Modelを使って移行したくなりませんか？
そんなときのための、2つの怪しい方法を公開します。
(どのスキーマバージョンでも完全に動くものを作るのは不可能です。ちゃんと理解したうえで使ってくださいね）

## インチキモデルクラスを作る
テーブルを旧テーブルから新テーブルに移行したいときとかに使えるやつです。

* 旧モデルのテーブルをリネーム
* モデルの旧コードをコピペ
* 新モデルのテーブルを作成
* コピーはモデルを使って行う

という発想です。
リレーションが複雑だったり、STIとかで、複数個のモデルを一つに統合する場合なんかに、使えます。


```ruby
class CreteNewUsers < ActiveRecord::Migration[5.2]

  # 旧テーブル用のモデル
  class OldUser < ActiveRecord::Base
    self.table_name = 'old_users'
    # 修正前のモデルをコピペ
  end

  def change
     rename_table :users, :old_users
     create_table :users do |t|
        # 新しいフィールド
     end

     OldUser.all.each do |ou|
       User.create! name: ou.name, password: ou.password ...
     end

     # 自信があれば、コメントを外すｗ
     # remove_table :old_users
  end
end
```

## スキーマをロードし直す

複数のモデルにまたがらないマイグレーションなら、スキーマをロードし直すのが手っ取り早いです。
ステータスの構成を変えたいとか、フィールドをカンマ区切りにしてたけど複数に分けたいとか、
そんな場合に使えます。

```ruby
class ModifyUserTable < ActiveRecord::Migration[5.2]
  def change
    change_table :users do |t|
      # 変更
    end

    User.connection.schema_cache.clear!
    User.reset_column_information

    User.all.each do |u|
      u.status = User::INITIAL
    end
  end
end
```
pandas.to_jsonの挙動

#概要
pandas.to_jsonの挙動を調べてみた。


#サンプルコード

```
import pandas as pd

df = pd.DataFrame([['a0', 'b0', 'c0'], ['a1', 'b1', 'c1']], index = ['taro', 'jiro'], columns = ['sono1', 'sono2', 'sono3'])
print (df.to_json(orient = 'split'))
print (df.to_json(orient = 'records'))
print (df.to_json(orient = 'index'))
print (df.to_json(orient = 'columns'))
print (df.to_json(orient = 'values'))
```

#結果


```
{"columns":["sono1","sono2","sono3"],"index":["taro","jiro"],"data":[["a0","b0","c0"],["a1","b1","c1"]]}
[{"sono1":"a0","sono2":"b0","sono3":"c0"},{"sono1":"a1","sono2":"b1","sono3":"c1"}]
{"taro":{"sono1":"a0","sono2":"b0","sono3":"c0"},"jiro":{"sono1":"a1","sono2":"b1","sono3":"c1"}}
{"sono1":{"taro":"a0","jiro":"a1"},"sono2":{"taro":"b0","jiro":"b1"},"sono3":{"taro":"c0","jiro":"c1"}}
[["a0","b0","c0"],["a1","b1","c1"]]
```

#成果物

https://paiza.io/projects/6RRfClAyzC4wKnrlXO14LA

以上。
UnityでPS4コントローラ(DuelShock4)を使う

コントローラの接続方法はUSBでもBluetoothでも良いようですが、今のところUSBのみで確認済みとなります。

##Unityでのコントローラ設定方法
まずUnityでコントローラやキーボードなどの操作割り当ては **Edit>ProjectSettings>Input** から設定します。
開いたインスペクタには初期状態で同名の設定が2つずつあり、それぞれ上がPCキーボード、下がゲームパッド用の設定になっています。同名の設定はどちらの操作が使われた場合も同じ名前で値が取得出来るので、異なった操作機器に対応させる際にはその機器の数だけ同名の設定を作る事になるようです。

PS4の右アナログスティックのようにUnityのデフォルト設定にないコントロールをアサインする場合は **既存の類似設定を右クリック>Duplicate Array Element** で設定を複製した後**Name**を変更する事で設定を追加します。
##PS4コントローラ(DuelShock4)の設定
以下をまるまる参考にさせて頂きました。
**[DualShock4 PC接続時のボタン割り当て](https://qiita.com/nanmo/items/559a58f76dda82323283)**

| 操作 |指定名|値|
|:---:|:-----:|:---:|
|Lスティック左右|X axis|OFF:0 / 左:-1～右:+1|
|Lスティック上下|Y axis|OFF:0 / 上:-1～下:+1|
|Lスティック押込み(L3)|joystick button 10|OFF:0 / ON:+1|
|Rスティック左右|3rd axis|OFF:0 / 左:-1～右:+1|
|Rスティック上下|6th axis|OFF:0 / 左:-1～右:+1|
|Rスティック押込み(R3)|joystick button 11|OFF:0 / ON:+1|
|十字キー左右|7th axis|OFF:0 / 左:-1 / 右:+1|
|十字キー上下|8th axis|OFF:0 / 上:+1 / 下:-1|
|□ボタン|joystick button 0|OFF:0 / ON:+1|
|×ボタン|joystick button 1|OFF:0 / ON:+1|
|〇ボタン|joystick button 2|OFF:0 / ON:+1|
|△ボタン|joystick button 3|OFF:0 / ON:+1|
|L1ボタン|joystick button 4|OFF:0 / ON:+1|
|L2(アナログ)|4th axis|OFF:-1～ON:+1|
|L2(デジタル)|joystick button 6|OFF:0 / ON:+1|
|R1ボタン|joystick button 5|OFF:0 / ON:+1|
|R2(アナログ)|5th axis|OFF:-1～ON:+1|
|R2(デジタル)|joystick button 7|OFF:0 / ON:+1|
|Shareボタン|joystick button 8|OFF:0 / ON:+1|
|Optionボタン|joystick button 9|OFF:0 / ON:+1|
|PSボタン|joystick button 12|OFF:0 / ON:+1|
|トラックパッド押込み|joystick button 13|OFF:0 / ON:+1|
**【気をつけるポイント】**
・方向設定はアナログとデジタルで、上下の値が逆になる
・L2,R2をアナログボタンとして使う場合、初期値(押していない状態)が-1
・RスティックのAxisの順番がややこしい。左右が3thで上下が6th
OpenCV 環境構築  Anaconda上にインストール

#目的
Anaconda上でOpenCV インストール、動作確認(python/OpenCVで画像表示)

環境：
 * Windows10 Home 64bit
 * Anaconda3-5.2.0-Windows-x86_64 / Python 3.6 version

## 【準備】Anacondaインストール
["anaconda.com" ](https://www.anaconda.com/download/)からダウンロード・インストール
★以下にチェックを入れて、コマンドプロンプト操作を可能にしておく
[Advanced Options] -> [Add Anaconda to my PATH environment variable]

## 【1】OpenCVインストール 

1. Anaconda Promptを起動

2. OpenCVインストール
Anaconda Prompt上で下記を順に実行

```
conda create -n opencv python=3.5 anaconda
```

★参考文献[1]の時点では、python version 3.6は対応していないため

```
activate opencv
```

→(opencv) プロンプトになる

```
(opencv) conda install -c menpo opencv3
```
★(opencv)環境を抜け出すにはdeactivate


## 【2】OpenCV動作確認(画像の表示)


1. 表示したいjpgファイルを作業フォルダに置く。

2. 画像表示スプクリプトファイル test_openCV.py を作成。"oinu-poppo.jpg"部は1.のファイル名にする

```
import cv2
import os

img = cv2.imread("oinu-poppo.jpg")
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
【MEMO】"cv2"で紛らわしいがopenCV3らしい(文献[1]より)

## 【3】実行
```
(opencv) python test_openCV.py
```
★ 画像を表示する。何かキー入力で表示ウィンドウを消す

## 【参考文献】
【1】【Pythonで学ぶ】OpenCVでの画像処理入門 (Tetsuya) , Udemy
HTTPメソッド　GETとPOSTの違い

##HTTPとは
ブラウザとサーバー間で
データをやり取りするための取り決め（プロトコル）。交通ルール的な。


##このやり取りをする際に利用されるのがHTTPメッセージ

***HTTPリクエスト***と***HTTPレスポンス***の２種類がある。

###HTTPリクエスト
・リクエスト行： Webサーバーに対してどのような処理を依頼するのかを伝える情報が含まれている
・メッセージヘッダー：　Webブラウザとかの種類とか色々情報を伝える
・メセージボディ: Webサーバーにデータを送るために使われる。空の場合もある。

###HTTPレスポンス
・ステータス行： WebブラウザにWebサーバー内での処理の結果を伝える
・メッセージヘッダー：　Webサーバーの情報色々
・メッセージボディ：　HTMLや画像などのデータを格納する場所。


##HTTPメソッド
目的別に複数定義されているが、
例えばHTMLファイルなどコンテンツを取得したい場合は***GETメソッド***
データをWebサーバーに対して送信するときは***POSTメソッド***
Webサイトを閲覧するときに利用されるのは主にこの２つです。
（PUTやDELETEもあるけど、Webサイトの改ざんができてしまうのでWebサーバー側で使用できなくしている場合がほとんどです）


#やっと本題
###GETとPOSTのちがい

GETメソッドを使ってデータを送信する場合は、***URLの後ろに送りたいデータを付与して送ります。***
(「URL?パラメータ名=値」という形式)
「?」パラメータのはじまり
「&」パラメータの切れ目
「=」挟んだ左側がGETの変数名、右側が渡される値

データを取得したい時に使用
データベースの書き換えが必要ない場合。

POSTメソッドを利用してデータを送信する場合は、***HTTPリクエスト内のメッセージボディにデータを含めて送ります。***
リクエストとして送信されるデータはメッセージボディ部に含まれる
メッセージボディは、HTTPリクエストのパラメータ内容を渡す場所。

データを変更したい時に使用
データのソート、更新、削除、新規登録などで使用する場合。
パスワードのような秘匿情報をURLに表示したくない場合。
データ量が多い場合。
バイナリデータを送信したい場合。
POST送信の場合は、URLなどの見た目では送信データはわかりません。GET送信の場合は送信できるデータ量が制限されます。URLの後ろに付与するため、ブラウザによってURLに使用できる文字数が決まっているからです。そのため、大量のデータを送信したい場合はPOST送信を利用することになります。


GETメソッドを利用してデータを送る場合、URLにデータが組み込まれるため、送ったデータがWebブラウザの閲覧履歴に残ってしまう。
POSTメソッドを利用した場合はメッセージボディ内にデータが組み込まれるため、閲覧履歴には残らない。
そのためECサイトにおいてログインする際には、機密性を考慮しPOSTメソッドが利用されます。


###ステータスコード
Webブラウザから要求されたHTMLファイルや画像といったデータを、WebサーバーはHTTPレスポンスとして応答しますが、
HTTPレスポンス内にはHTTPリクエストに対するWebサーバー内での***処理結果***が含まれています。それが***ステータスコード***。

200番台は成功。正常に処理した場合に通知。
400番台はWebサーバーに存在する場合。「４０４ Not Found」はよく見るステータスコード。
500番台はWebサーバー側のエラー。高負荷で一時的に利用できないとか。

参考
https://qiita.com/qiita_taro/items/66f2930c5d1cc10722e7
https://liginc.co.jp/272916
QuantXに入門してみる

PyCon2018の企業ブースでQuantXを知り、興味を持ったので入門してみました。（ちなみに投資はど素人です笑）
今回はサンプルコードを動かすところまでで詳しい解説などはしていませんのであらかじめご了承ください。

## QuantX（クオンテックス）とは
> QuantXは株式や仮想通貨などの売買ルール(アルゴリズムと呼んでいます)の作成、販売ができるシステムトレードプラットフォームです。
Python Codingを利用した自由度の高い方法と、Visual Codingを利用したプログラミングの知識がなくてもアルゴリズムを作成できる環境をご用意しています。（※Visual Codingは今後提供予定）
作成されたアルゴリズムは実際の過去のデータでシミュレーションして成績を確認できます。開発したアルゴリズムはご自身のトレードに、またはQuantX Storeで販売できます。
*[QuantX Q&A](https://quantx.io/qa)より引用*

自分で作ったアルゴリズムを販売できるのはとても魅力的ですね！
またPythonや、Numpyなどの便利なライブラリを使用できるためデータ分析の学習にも良さそうです。

## 早速使ってみる
### ログイン
まずはログインします。アカウントを持っていない場合は作っておきましょう。
https://factory.quantx.io/

<img src="https://qiita-image-store.s3.amazonaws.com/0/237938/001e65c2-5b9e-7bcd-fed1-60190519b131.png" width="800">

### プロジェクトの作成
ログイン後、「アルゴリズム一覧」から「新規プロジェクトを作成」を選択。
適当なアルゴリズム名を入力してプロジェクトを作成します。
テンプレートは標準を選択しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/237938/00633252-607f-e3e8-aaf7-e2df9934f918.png" width="800">

### サンプルを動かしてみる
<img src="https://qiita-image-store.s3.amazonaws.com/0/237938/a7f53381-7a22-22e1-6611-4fc0b3b74322.png" width="800">

プロジェクト作成を押すとこのような画面が表示されました。
画面左側にサンプルコードが見えますね。
では早速サンプルコードを動かそうと思います！

エディタ上部の「テスト」をクリックするとバックテストを実行できます。
※バックテストとは過去の相場において自分の売買ルールが通用するか検証を行うことです。

↓実行結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/237938/30dcbbbd-5808-5ccf-1d89-f00caac30bce.png" width="800">
<img src="https://qiita-image-store.s3.amazonaws.com/0/237938/bfe7d273-947f-68b1-6c00-5fd588799b82.png" width="800">

おお、いろいろ表示されましたね。
jp.stock.xxxxが銘柄を表していて、個別銘柄詳細で株価を確認できるようです。
columnsは個別銘柄詳細で表示するグラフを追加することができます。
たとえば"volume_adj"のコメントアウトを外せば出来高グラフを個別銘柄詳細に追加することが可能です。

今回はここまで！！

##まとめ
QuantXはスクレイピングなどをしなくても用意されたデータセットを使用して開発できるので、アルゴリズム開発に専念できる環境だと感じました。
次回は簡単な移動平均のアルゴリズムを作ってみようと思います！

そういえば開発元のSmart Tradeさんが[QuantX Cup 2018](https://factory.quantx.io/quantx-cup2018/)という自動売買アルゴリズムのコンテストを開いているようなので興味のある方は応募してみてはいかがでしょうか✨

## おまけ
- [QuantXで使用できるライブラリ](https://determined-feynman-fb5a05.netlify.com/ja/libs.html)
- [データセット(日本株・中国株・仮想通貨)](https://determined-feynman-fb5a05.netlify.com/ja/dataset.jp.stock.html)
MySQL覚え書き

macでMySQLを使う事になった。

入れたはずだけど、あれ、入れたよな。

確かめよう。

# コマンド： MySQLのバージョンを確認

```
mysql --version
```
こんな感じでバージョンを教えてくれる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188636/09ffb38d-6919-c3e4-3197-7f64ceea616a.png)
という事で、インストール済みだと確認できた。

もしインストールが必要なら、以下をご参考に。
>参考リンク：
>[MacにMySQLをインストールする](https://qiita.com/griffin3104/items/c7908359a3e3e18cd269)
telnetを使ってコマンドラインからメール送信を行う

# はじめに
メール送信のテストを行う場合、メーラーの設定などなのでコマンドラインから行うと便利です。
またその際にはメール送信テストやプログラムからのメール送信を受け止めて確認することができる`mailcatcher`が便利です。

Bash（Zsh）環境下だとこうするとワンライナーで送ることができました。

```bash
{
    sleep 0.3;
    echo 'ehlo';
    sleep 0.3;
    echo 'MAIL FROM:<from@example.com>';
    sleep 0.3;
    echo 'RCPT TO: <rcpt@example.com>';
    sleep 0.3;
    echo 'DATA';
    sleep 0.3;
    echo -e 'To:yousan@example.com\n\n'
    echo -e 'From:fromheader@example.com\n\n'
    echo -e 'this is body\n'
    echo '.';
} | telnet localhost 1025
```

`\n`による改行が重要で、これが無いと動きませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/8c656198-8bd1-9277-dfa0-84146ba4c610.png)

ちゃんと送れていますね。

<img width="1179" alt="Screen Shot 2018-10-27 at 16.46.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/32f7d376-f481-2e76-7d1c-4a38d4840958.png">


# Dockerでの建て方

mailcatcherをDockerで立てる方法です。

```bash
$ docker run -it schickling/mailcatche
```

デフォルトで1025と1080を使ってくれるようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/4aef5a6e-7659-8028-e62c-5d91368f20a1.png)

# その他
`{}`によるコマンド展開便利ですね！
あとsleepって小数点行けることに気が付きました。

# 参考
https://qiita.com/sheepland/items/973198fa80f0213fe5a1
WSL kali linux のデスクトップ環境の構築

kali linux のインストール
https://www.microsoft.com/ja-jp/p/kali-linux/9pkr34tncv07?activetab=pivot:overviewtab

Windows→アプリ→kali linux から起動
GUIのインストール

```
sudo apt update;
sudo apt -y dist-upgrade;
wget https://kali.sh/xfce4.sh;
sudo sh xfce4.sh;
```
x410を導入
https://www.microsoft.com/ja-jp/p/x410/9nlp712zmn9q?activetab=pivot:overviewtab

GUIで起動するバッチファイルの作成

```start_kali_gui.bat
start /B x410.exe /desktop
kali.exe run "if [ -z \"$(pidof xfce4-session)\" ]; then export DISPLAY=127.0.0.1:0.0; xfce4-session; pkill '(gpg|ssh)-agent'; fi;"
```

ツールのインストール

```
sudo apt install kali-linux-all;
```
（書きかけの記事）Androidでマルチスレッド プログラミング

#Androidでマルチスレッド プログラミングする方法のまとめ（自分用メモ）

##ワーカースレッドの実装方法
ワーカースレッドの実装方法には以下の３種類がある。

- AsyncTask
- Handler
- ExecutorService

Serviceもワーカースレッドを生成してくれそうな気がしてしまうが、これは明示的にワーカースレッドで実行しなければメインスレッドでの実行となる。

### AsyncTask

画面更新処理が伴う短時間のバックグラウンド処理に用いられる。

#### できること

- バックグラウンドスレッドの生成
- バックグランドスレッドからメインスレッドへの通知
 - バックグラウンド処理実行中の定期的なメインスレッドへの通知（進捗率表示に利用）
 - バックグラウンド処理完了後のメインスレッドへの通知（処理完了後の画面更新に利用）

#### できないこと


#### 想定利用場面

- 短時間のバックグラウンド処理
- バックグラウンド処理と連動して画面更新が必要な場面
数学の定数を使う

AOJの問題を解いていて数学の定数を使う必要が出てきて、設定周りで少し困ったのでメモ。

 >\#define _USE_MATH_DEFINES 
 #include \<iostream> 
 #include \<cmath> 

こうするとM_PIとかすると定数が使えるようになる。
define構文がよくわかってないので勉強したい
Pyinstaller でリソースを含めたexeを作成する

Pythonで作成したツール等をexe化したい場合、Pyinstallerを使うと

```
> pyinstaller --onefile --icon=icon.ico -n appname app.py
```

のような感じで簡単にexe化することができて便利です。

ただこのままだと、例えばexe起動時にスプラッシュ画面を表示したい場合、
exeのあるフォルダ等に別途スプラッシュ画像を用意する必要があります。

Pyinstallerで出力したexeにリソースを含めたい場合は、

・リソースフォルダを作る
・リソースフォルダにアクセスする関数を作る
・pyinstallerでリソースを含めたexeを作る

を行う必要があります。

- リソースフォルダを作る
-
resources等の名前でリソースを置くフォルダを作成します

- リソースフォルダにアクセスする関数を作る
-
```python:
import sys
import os

def resourcePath(filename):
  if hasattr(sys, "_MEIPASS"):
      return os.path.join(sys._MEIPASS, filename)
  return os.path.join(filename)
```

のようなリソースパスを取得する関数を作成しておき、

```python:
    tmpimg = cv2.imread(resourcePath("resources/img.png"))
```

のような形で使用することができます。

- pyinstallerでリソースを含めたexeを作る
-
```
> pyinstaller --onefile --icon=icon.ico -n appname app.py
```
のように一度exeを作成すると、*appname.spec* というファイルが作成されるのでこれをテキストエディタで開きます。

```text:
exe = EXE(pyz,
          a.scripts,
          a.binaries,
```

という部分があるので、ここに

```text:
exe = EXE(pyz,
          Tree('resources',prefix='resources'), #<-
          a.scripts,
          a.binaries,
```

 のように定義を追加し、

```
> pyinstaller appname.spec
```

を実行し、再度exeを作成するとリソースフォルダを含んだexeが作成されます。
Qiita画像挿入(大きさ変更と外部リンク送付)

Qiitaの画像挿入時に大きさを変えてかつ外部リンクを送付する書き方を備忘録としてここに残す。

```markdown:
[<img width = 30 src = "https://qiita-image-store~~~.png">](https://www.google.com/)
```
GR-LycheeでESP-32が起動しなくなった場合

GR-LycheeでESP-32が見えなくなった場合の対処法です。
https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-lychee/4832/lychee-rev-c-esp32

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371 
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0008,len:8
load:0x3fff0010,len:4408
load:0x40078000,len:11020
ho 0 tail 12 room 4
load:0x40080000,len:252
entry 0x40080034
ÿB

こうなります・・・
最後の行が文字化けしていますね。
本来はreadyと出るはずです。
まずは、下記URLより初期ファームをダウンロード
https://japan.renesasrulz.com/gr_user_forum_japanese/f/gr-lychee/4661/esp32-ble

ESP-32の現行ファームを入れましたが、残念ながら起動しませんでした・・・(やり方が悪いと思いますｗ）

最初に、GR-LYCHEE_ESP32_Serial_Bridge.binをダウンロードし、Lycheeに書き込む必要があります。
詳しくは、Githubを見てください。

*私のLycheeでは、USER_BUTTON0を押しながらUSBケーブルを挿すことでDownLoadModeになります。
https://github.com/d-kato/GR-LYCHEE_ESP32_Serial_Bridge

最初に、Eraseして、USBケーブルを抜き、再度USER_BUTTON0を押しながらUSBケーブルを挿すことで
ファームウェアを書き込むことが可能になります。（消去しないでも問題ない可能性がありますが、消去するほうが良いようです）

DownLoadToolは以下の設定を入れる必要があります。
＊引用：（C)https://github.com/d-kato/GR-LYCHEE_ESP32_Serial_Bridge
bootloader.bin (0x1000)
partitions_at.bin (0x8000)
phy_init_data.bin (0xF000)
esp-at.bin (0x100000)
at_customize.bin (0x20000)
GattServiceExample.bin (0x21000)

以上を設定して、Startすることで問題が無ければファームウェアを元に戻せると思います。
久しぶりのフレームワーク

最近2年間フレームワークを使わない現場で仕事をしています。
来月から現場が変わるので、フレームワークに関して簡単に振り返っておこうと思います。
特定フレームワークの使い方などに触れるものではなく、フレームワークってどういうもんだっけ？
という浅い内容になります。

## フレームワークとは
さて、勉強の始まりは概念を理解すること。
ググってみると先生がいっぱい出てきますが、読んでみると大体
「システムにおいて汎用的に必要な機能群を提供するもの」
みたいな感じだと思います。
そもそも「フレームワークとは？」を求める人にはあまりイメージがピンと来ないのでは。。。

大雑把ではありますが、例えるとしたらQiitaも似てるようなものではと思いました。
Qiitaも記事を簡単に書くために必要な機能を提供してくれますからね。
タイトルはここに書いて、タグはここに、本文はここにマークダウンで書いてね！みたいな。

システムを作るにも必ず必要な色んな機能があって、
「このパッケージを使って説明通りに作れば簡単にシステムが出来上がり～！」
みたいな物がフレームワークです。

## メリット
一般的に言われるメリット＆デメリットに対して、個人的な考えを書いてみました。

+ システムを簡単に作れる

提供される様々な機能を使うことで、少ないソースで簡単にシステムが作れます。
フレームワークを使わない今の現場で初めて感じたのは、ソース量がとても多いということでした。
当然それは開発コストの向上に繋がります。

+ ソースがわかりやすい

ソースの統一性が取れて保守性が上がります。
今の現場は作った人によってソースのスタイルや利用ライブラリ、システムの構成などが全部バラバラで、ソースが読み辛かった思いがあります。
また改修する際にも色々と気を使うところが多くなる印象がありました。

+ バグが少ない

既に作られている機能を使うのでバグが減ります。
プログラマが機能を一から全て作っていると人的ミスや考慮漏れは必ず起こるものです。
フレームワークを使うことでテストのコストも減らせますし、よりバグの少ないシステムを作ることができます。
今の現場はテストにかなり工数をかけてガッツリ試験する傾向があります。
(フレームワークを使わないからだけとは言えないでしょうが)

## デメリット
+ プログラマの実力が高まらない

フレームワークを使ってると「よく分かってないけどなんとなく動いた」的なことがよくあります。
そのためシステムは簡単に作れるものの、ちゃんとした理解は不足しがちです。
逆にフレームワークを使わないと難易度は上がりますが力量は身に付くと思います。
今の現場で働きながら一番良かったと思う所でもあります。

+ フレームワークの脆弱性に引きずられる

数年前の話ですが、JAVAのフレームワークであるApache Strutsで脆弱性が発覚した話をよく聞きました。
そのためStrutsからSpringに切り替える案件も見た覚えがあります。
脆弱性診断でも、お前らこのフレームワーク使ってるか！みたいな指摘を目にすることが多いです。

+ 学習コストがかかる

フレームワークを学ぶための教材が書かれるようなものですので、当然学習コストがかかります。
JAVAで良く使われるSpringは学習コストが高いとよく言われています。
知り合いの方もSpringの案件で、仕事よりSpringを勉強することがしんどかったと言っていました。

## まとめ
フレームワークに関して簡単に調べながら振り返ってみました。
使う、使わないは色んな検証を経て決めるものでしょう。
個人的にはまだ経験や知識が浅い時期はフレームワークを使わずプログラミングの実力を磨くのが望ましいと思います。
どのぐらいスキルが身についてからフレームワークを積極的に使って生産性を高めるべきかと。
まー自分がやりたい仕事だけやる訳にはいきませんが。。。

次は使ってみたいと思っている[Spring](https://spring.io/)（JAVA）と[React](https://reactjs.org/)（Javascript）に関して調べてみようと思います。
roundが「マイナス0」を返すとは何事か

# これは何
ドキュメントをよく読まなかったところから始まった、浮動小数点数のお話である。だからちゃんとドキュメント読めと何回言ったら(ry

# 発端

[OpenWeatherMap](https://openweathermap.org/)のAPIを使用して、実装中のサービスに天気予報を表示することを考えていた。  
[OWMのAPI](https://openweathermap.org/api)はかなり多くの情報を返してくるのだが、全部は必要ないし、使用しているフレームワークの関係上、必要な情報だけを配列にする処理を書く必要があった。

情報の取得に使用したのは、[OpenWeatherMap-PHP-API](https://github.com/cmfcmf/OpenWeatherMap-PHP-Api)である。PHP用に作られたAPI集だ。返ってきたデータを元に、天気予報なら`\Iterable`の形で返してくれる。

今回の問題を引き起こしたのが、API自体が返してきた値である。以下は、実際にOWMのAPIが返してくる天気予報データ(JSON)の一部である。

```JSON

"temp":{
    "day":15.2,
    "min":10.11,
    "max":15.2,
    "night":10.11,
    "eve":15.04,
    "morn":15.2
},
```

今回興味があるのは`max`および`min`だ。それぞれ最高気温と最低気温を示す。そしてこの数値をPHPは`float`として解釈する。  
ところが今回スペースの関係上整数で表示したいと考えた。そこで、気温を*四捨五入*した上で*整数*表示することにした。

四捨五入できる関数はPHPにすでにある。   
round関数([`float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )`](http://php.net/manual/ja/function.round.php))だ。  
Optionalな引数を全部無視すれば、四捨五入で「整数」にしてくれる(...と思っていた)。

# 現象

さて、この`round`関数を使って先ほどのデータの`max`, `min`を四捨五入するとどうなるか。データは$dataという配列の中に入っているとしよう。

```php
round($data['temp']['max']) // => 15
round($data['temp']['min']) // => 10
```
当然である。

---

ところが、これが**北国に対して秋から冬**、もしくは**冬から春にかけて**実行されるとこんなデータが取得される。
次のデータを考えよう(関係ないデータは省いた)。

```json
"temp":{
    "min":-0.44,
    "max":4.15,
},
```
これをroundするとどうなるか？

```php
round($data['temp']['max']) // => 4
round($data['temp']['min']) // => -0 <- WTF?
```

# What the 🤬 PHP?

...と思ったのだが、これはPHPに限った話ではなく、[浮動小数点数の仕様](https://ja.wikipedia.org/wiki/IEEE_754における負のゼロ)である[^1]。`-0`が存在するべきパターンがあるということで実装されたわけだ。  

[^1]: とはいえなんで整数に見える形で返ってきたのかが非常に疑問なのだが。

ここでPHPの`round`の定義を振り返ると 

```php
float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )
```

となっている。どこをどう見たってfloatで返ってくると書いてあるではないか。

## ちなみに

四捨五入の結果を`-0`と記述するべきパターンの一つが、まさに今回ハマった「四捨五入された温度が氷点下であることを表す」というパターンである。

> Informally, one may use the notation “−0” for a negative value that was rounded to zero.

[Signed Zero - Wikipedia(英語版), Scientific Uses](https://en.wikipedia.org/wiki/Signed_zero#Scientific_uses)



# どうしたか

今回のユースケースにおいては、氷点下であることが重要であるわけでもないので、想定される数値範囲的にも`int`へのキャストで十分だった。

```php
(int)round($data['temp']['min']) // => 0
```
react-native-router-flux の画面遷移4パターン@GIF画像

`Actions`で提供されているアニメーションから4パターンをGIF画像でまとめました。

# Actions.pop
`Actions.popTo`も同様です。
![20181027_155107.GIF](https://qiita-image-store.s3.amazonaws.com/0/96286/1007fa70-96d5-0057-dd94-3e20b24b62ef.gif)

現在のページは右手に退きつつ、新しいページが現在のページの左側から登場します。

# Actions.push
key名をメソッドに指定した場合もこれ。
![20181027_155558.GIF](https://qiita-image-store.s3.amazonaws.com/0/96286/ce7c2311-61d0-937f-d009-9d15f23c6bf6.gif)
`Actions.jump`と同様ですね。  
現在のページが左手に退きつつ、新しいページが右から重なってきます。

# Actions.replace
![20181027_155634.GIF](https://qiita-image-store.s3.amazonaws.com/0/96286/c50ebfaa-940b-40df-b8e5-45c191358a84.gif)
アニメーションなしでいきなりページが切り替わります。

# Actions.reset
![20181027_155700.GIF](https://qiita-image-store.s3.amazonaws.com/0/96286/a6a3e04f-46d9-47db-7585-42158a2a5830.gif)
`Actions.replace`とアニメーションは変わりません。違いはルーティングスタックに対する処理だけなので、画面を見ている人からすると変わらないです。


以上、お役に立てば幸いです。
php-master-changes 2018-10-26

今日は opcache のヒープ利用の修正、share interned strings の ZTS での改善、ドキュメントの修正、シャットダウン時のバグ修正、is_iterable の opcache 最適化の用関数情報への追加があった！

# 2018-10-26
## dstogov: Don't use request heap at shutdown
- https://github.com/php/php-src/commit/f33da6f3387d4d4a2b820986aec11c8e37141c6c
- ext/opcache で [MSHUTDOWN](https://wiki.php.net/internals/extensions#php_shutdown) 時の処理では emalloc() によるリクエストヒープを利用しないよう修正

## dstogov: Improved shared interned strings handling. The previous implementation worked incorrectly in ZTS build. It changed strings only in function/class tables of one thread. Now all threads gets the same shared interned strings. Also, on shutdown, we don't try to replace SHM interned strings back to process strings, but delay dettachment of SHM instead.
- https://github.com/php/php-src/commit/33e777acbfb9bbd2a7efabc7365104780db4c6b0
- shared interned strings の扱いを改善
- ZTS 版で正常に動いていなかったのを修正

## LawnGnome: [ci skip] Fix indentation in UPGRADING.
- https://github.com/php/php-src/commit/bca0a7e2850e50c965ac2e6cb9065e978ac5a9e2
- [7.3~]
- UPGRADING のインデントを修正

## dstogov: Don't wrap php_module_shutdown() with zend_try. executor_globals are released in ZTS build, and this leads to crash.
- https://github.com/php/php-src/commit/10abc1f010b775d9f21060c5041d34c25f14a2a1
- [zend_try](https://github.com/php/php-src/blob/10abc1f010b775d9f21060c5041d34c25f14a2a1/Zend/zend.h#L218-L231) で php_module_shutdown() をラップしないよう修正
- bailout 用のジャンプバッファの保存先が EG で、ZTS 版だと解放されてたりする

## carusogabriel: Add is_iterable to opcache Optimizer
- https://github.com/php/php-src/commit/388c21e7646d5336ca734d1a98cc1d64736a327f
- ext/opcache で、is_iterable を 最適化用の関数情報へ追加
Chrome 拡張を使って今開いているタブの DOM を操作する

Content Scripts を使う。

ボタン押下とかショートカットキーとかそういうイベントで操作したいなら、
Background から content script のイベントハンドラを呼ぶことになる。

以下、 選択したテキストを`<samp>`要素でラップする例。


```content.js
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
    if (request.text == "code-block") {
        const selection = window.getSelection().toString().replace(/\n/g, "<br/>");
        const insertContent = `<samp>${selection}</samp>`;
        document.execCommand("insertHTML", false, insertContent);
        sendResponse({ "text": insertContent });
    }
});
```

```background.js
chrome.commands.onCommand.addListener(function (command) {
    if (command === 'code-block') {
        chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
            chrome.tabs.sendMessage(tabs[0].id, { text: "code-block" }, function (response) {
                console.log(response);
            });
        });
    }
});
```

```manifest.json
{
  "name": "Encode",
  "version": "0.0.2",
  "description": "Make a string to a code block.",
  "manifest_version": 2,
  "permissions": [
    "activeTab"
  ],
  "background": {
    "scripts": [
      "background.js"
    ],
    "persistent": false
  },
  "content_scripts": [
    {
      "matches": [
        "http://*/*",
        "https://*/*"
      ],
      "js": [
        "content.js"
      ]
    }
  ],
  "commands": {
    "code-block": {
      "suggested_key": {
        "default": "Ctrl+Shift+Y",
        "mac": "Command+Shift+Y"
      },
      "description": "Make selected text to a code block."
    }
  }
}
```


### 関連記事

- [Content Scripts \- Google Chrome](https://developer.chrome.com/extensions/content_scripts)
- https://github.com/dulltz/encode
Python3のインストールから開発環境の準備まで

Python環境を構築する流れを記載しています。
使用OS：Windows10

#Pythonのインストール

下記のリンクからPythonをダウンロードします。
https://www.python.org/downloads/windows/

自分のOSが32bitか64bitか分からない場合は、
「コントロール パネル > システムとセキュリティ > システム」と進めば書いてあるはずです。

ダウンロードする種類は「executable installer」を選択します。

インストールの一番最初の画面にある「Add Python x.x(version) to PATH」にチェックを入れて「Install now」ボタンを押したらインストールできます。

#Pythonが正常にインストールされたか確認

コマンドプロンプトを開きます。

【確認項目①】Pythonインタプリタの起動確認
確認コマンド：「python -V」
→Pythonのインストールしたバージョンが表示されていればOK

【確認項目②】pipの起動確認
確認コマンド：「pip -V」
→pipのバージョンが表示されていればOK

#確認項目でうまくいかなかったときのトラブルシューティング

・pythonコマンドやpipコマンドが見つからないとき
→一度コマンドプロンプトを再起動してみる。それでもだめならPCを再起動してみる。

・「python -V」で異なるバージョンが表示される
→以前Pythonをインストールしたことがあるかもしれません。競合している可能性があるため、環境変数のPATHから他のバージョンがあるか確認する。あれば削除するか優先順位の変更を行う。

・「pip -V」で違う結果、違うプログラムが起動する
→Perlのpipコマンドと競合しているかもしれません。コマンドプロンプトで「where pip」と入力して、表示されたパスを環境変数のPATHから削除するか、優先順位の変更を行ってください。

#Anacondaのインストール

下記のリンクからAnacondaをインストールします。
https://www.anaconda.com/download/

AnacondaはPythonの統合開発環境です。これがインストールされていないとプログラムの開発がすごくめんどくさいです。

#Anacondaに含まれる主なツール

・Ipython（Pythonのインタープリター。TAB補完がきくためコードの記載が楽になります）
・Spyder（PythonのためのオープンソースIDE。Pythonを科学計算用途で使用する場合有用です）
・Anaconda Cloud（パッケージ管理のリポジトリ。開発したリソースをクラウド上に置いたり、コードを共有したりできる）
・Anaconda Navigator（アプリケーションランチャー。いろいろなアプリケーションの起動やソフトウェアの更新ができるようになります）


これでPythonでの開発環境ができました。
kivyのドロップダウンリストはDrop-Down ListではなくSpinnerで作る

# はじめに

あなたが本当に欲しいドロップダウンリストは、こちらではないですか？
[Spinner — Kivy 1.10.1 documentation](https://kivy.org/doc/stable/api-kivy.uix.spinner.html?highlight=spinner)



# 確認した環境

- Windows 10 Pro 64bit
- Python 3.6.6
- pip 18.0
- kivy 1.10.1



# kvファイルを使ったサンプルコード

###### main.py

```py:main.py
# -*- coding: utf-8 -*
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.spinner import Spinner

class CustomSpinner(Spinner):
    pass

class MainRoot(BoxLayout):

    def on_spinner_change(self, text):
        print('The spinner', self, 'have text', text)

class MainApp(App):
    def build(self):
        self.title = 'Spinner Test'

if __name__ == "__main__":
    MainApp().run()
```

###### main.kv

```yml:main.kv
MainRoot:

<MainRoot>:
    CustomSpinner:
        text: 'Home'
        values: 'Home', 'Work', 'Other', 'Custom'
        size_hint: None, None
        size: 100, 44
        pos_hint: {'center_x': .5, 'center_y': .5}
        on_text: root.on_spinner_change(self.text)
```



# あとがき

[Drop-Down List — Kivy 1.10.1 documentation](https://kivy.org/doc/stable/api-kivy.uix.dropdown.html?highlight=dropdown)
状況証拠からの推測でしかないのですが、こちらのDrop-Down ListはSpinnerやその他のウィジェトを作るための部品であって、気軽に直接使うものではないのではと感じています。
kintone環境の取得方法 (開発者ライセンス)

# はじめに

kintoneを使いたい/試してみたい場合、[kintone公式HP](https://kintone.cybozu.co.jp/jp/) より**お試し**を申し込むことができます。
このお試しの特徴は、

* 30日間無償
* 契約することでデータそのまま運用環境にすることができる

などがあります。

が、それ以外にも **開発用** として <font color="red">**開発者ライセンス**</font> というものがあります。

開発者ライセンスを取ったあとはAPIを使ってデータを操作しましょう！

> **▼ 連載記事一覧**

> ||タイトル|
> |---|---|
> |0|[kintone環境の取得方法 (開発者ライセンス)](https://qiita.com/RyBB/items/73c50f1751ad137ba410) ← 本記事| 
> |1|[kintoneの使い方 (データベース編)](https://qiita.com/RyBB/items/daabb9b60d804ee2242f)| 
> |2|[kintone REST API について (共通事項編)](https://qiita.com/RyBB/items/8f6ca0a0e13d5fc42759)| 
> |3|[kintone REST API について (GET編)](https://qiita.com/RyBB/items/08cf511f1dbce6cf76bf)|
> |4|[kintone REST API について (POST編)](https://qiita.com/RyBB/items/94c13ca56887558bb227)|

# 開発者ライセンスとは

「kintoneの開発をしたい！けど、運用環境でいきなりやるのは難しい！」

というニーズにも答えるために用意している開発用の環境です。
1年間無償で、1年後に更新することで実質ずっと利用することができます。

しかし、この開発者ライセンスには制限がいくつかあり、

* 開発目的なので運用には使用しない
* ユーザー数はMAXで5名まで
* 運用環境へは移行できない

などがあります。詳しくはこちらをご覧ください!
https://www.slideshare.net/kintone-papers/kintone-66244855

# 開発者ライセンスの取得方法

開発者ライセンスを取得するためには、

1. cybozu developer networkのユーザー登録をする
2. 開発者ライセンスの申し込みをする
3. ライセンス発行を待つ(15〜20分ほどかかります)
4. 登録メールアドレス宛に届くkintone環境のURLからログイン

といった手順で進める必要があります。

## cybozu developer networkのユーザー登録

まず [cybozu developer network (devnet)](https://developer.cybozu.io/hc/ja) のユーザー登録をする必要があります。
こちらの devnet は **API情報** や **kintoneのカスタマイズTips** などがある開発者向けの技術サイトとなります。
これから使うことも多くなると思うのでぜひ存在は覚えてください！！笑

右上のログインからユーザー登録ができます。
<img width="1425" alt="スクリーンショット 2018-10-27 15.18.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/153051/e14c2bbc-f458-31aa-edbf-e7f5e87478de.png">

## 開発者ライセンスを申し込む

devnetのユーザー登録ができたら、次は開発者ライセンスを申し込みます。
[**こちらのページ**](https://developer.cybozu.io/hc/ja/articles/200720464#step4) から申し込むことができます。

## ライセンス発行を待つ

粘り強く待ってください。その間に次の記事 [kintoneの使い方 (データベース編)](https://qiita.com/RyBB/items/daabb9b60d804ee2242f) を読むと良いですよ！

## メールのURLからログイン

粘り強く待つと、以下のようなメールが届きます！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153051/96e123e3-abb4-d5f2-155e-4a4eb399275f.png)

**アクセスURL** がkintone開発者ライセンスのURLになります！

# おわりに

ハッカソンやハンズオンイベントではこの開発者ライセンスを使うと良いですよ！
この開発者ライセンスでJSカスタマイズやRESTAPIをいろいろ試して、kintoneの可能性を感じてください！

それでは！≧(+･` ཀ･´)≦
Vue-CLIのインストール方法（Mac版）

## Vue-CLIをインストールする前に

1. Vue-CLIをインストールする前に__Node.js__をインストールする必要がある。<br>
Node.jsのダウンロード画面は___[こちら](https://nodejs.org/ja/)___<br>
___左側の推奨版をダウンロード___
<img width="875" alt="スクリーンショット 2018-10-27 午後3.10.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/252675/15b61799-340c-41f0-af5f-06150b6f3e70.png">
2. ダウンロード後は、__Finder__の__/Downloads/~__内の<br>
<img width="150" alt="スクリーンショット 2018-10-27 午後3.17.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/252675/a36c15db-189b-6e39-1146-bdae05f21755.png">
を開いて、<br>インストールを行う。

### Node.jsとnpm

以上の方法で、Node.jsとnpmがインストールされたと思う。
確認としてterminalにて、versionの確認をすると良い。

```terminal
$ node -v
$ npm -v
```
versionが表記されれば、インストール済みである。

*__npm__(Node Package Manager)とは
Node.jsに付属しているjsのパッケージ管理ツールのこと。
パッケージのインストールやアプデをCUI(コマンドライン)で行うことが出来る。
npmの詳しい使い方は__[こちら](https://docs.npmjs.com/)__

## Vue-CLIのインストール

Node.jsとnpmが使用可能な環境になれば、Vue-CLIのインストールが次のコマンドで行える。

```terminal
$ npm install -g vue-cli
```
インストール途中で、<br>__$\color{red}{\rm ERR!}$__が表記される場合は、以下のコマンドを試してみてください。

```terminal
$ sudo npm install -g vue-cli
```
*sudo => スーパーユーザーの権限でコマンドを実行する。

```terminal
$ vue --version
```
バージョンが表記されればインストール済み。
アノテーションについて調べてみる

アノテーションに関連した記事を調べてみた。

その記事やスライドの中から特に目についた部分を引用する。
興味を覚えたら、その記事じたいを読んでみることをおすすめする。


## [アノテーションこそが本質](https://www.slideshare.net/youheiyamaguchi/annotation-meetup-20180705)
![](https://image.slidesharecdn.com/annotationmeetup20180705web-180705132648/95/annotation-meetup-20180705-11-638.jpg?cb=1530797432)


## [画像認識モデルを作るための鉄板レシピ](https://www.slideshare.net/takahirokubo7792/ss-71453093)

![](https://image.slidesharecdn.com/tutorialforcnn-170127102346/95/-14-638.jpg?cb=1493348543)


## [SSII2018TS: 大規模深層学習 ](https://www.slideshare.net/SSII_Slides/ss-101275110)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/83761/4588718a-c808-ebc9-604e-124fff7848b4.png)


## [背景合成データ生成](http://wazalabo.com/dl-create-learning-data.html)

![](http://wazalabo.com/wp-content/uploads/2016/04/DL_pic3.gif)


## [より良い機械学習のためのアノテーションの機械学習](https://tech-blog.abeja.asia/entry/ml-annotation)

> 小まとめ: 少量のアノテーションでの学習は可能か
半教師あり学習により精度向上可能
ただし、多量の教師ありデータでの学習には及ばないこともある
アノテーションできる場合はおとなしくアノテーションしてしまったほうが良いかも

> 顔認識で精度改善が起きた理由は、大規模でクリーンなデータセットが公開されたこと

また、VGGFace2 については次のように書かれています。

> 現在はVGGFace2でふつうに学習したモデルが一番精度が良いようですが、実はVGGFace2は、大規模な上に綿密にクリーニングがなされたデータセットです。 このデータセットについて説明した論文[10]には、VGGFace2を作るにあたって、
クリーニング前のデータで顔認識モデルを学習し、このモデルで異常画像をフィルタリングして除去
ほぼ同一な顔画像を除去
人の顔でないデータ、顔が写っていなかったり複数の顔が写っているデータを除去（人力+自動）
というクリーニングをしていると明記されています。結果的にできあがったデータセットは、約9,000人分の330万枚の画像からなるかなりの大規模なデータですので、相当な労力をつかってクリーニングされたことが窺えます。
このように、顔認識の文脈では、大量のクリーンな教師ありデータセットが精度改善にとってはクリティカルであると認識されていましたが、十分量のクリーンなデータセットを用意するのが重要というのは、顔認識に限った話ではないと思われます。


https://arxiv.org/abs/1710.08092

http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/



## [[参考] アノテーション仕様作成におけるポイント](https://annofab.com/docs/tutorial/tutorial-ex-designing-annotation-specs.html)

>タスク数個～数十個のテストプロジェクトを作成する
テストプロジェクトを完成させる
テストプロジェクトの教師データで学習を行ってみる
問題の洗い出し、仕様の修正
本番プロジェクトの作成
といった手順で進めることをお勧めします。

## [Annotationツール比較](https://qiita.com/shu-yusa/items/d19ea57e3cf9c4dbdce2)




----

アノテーションルールは
その時代その時代の機械学習技術の想定と関係があります。

顔検出でもそうです。

古い顔検出ライブラリでは、BoundingBoxが正方形であることが多かった。
目位置による正規化を前提したboundingBoxの定義になっていることも多かった。

そのため、正面の顔ならば目位置による正規化が考えやすいものです。そのため、横顔の検出については、どのように大きさを正規化して学習させるべきなのかについて、HaarCascade検出器の時代には、なかなか決め手に欠ける状況だった。
　横顔では、顔の輪郭の外の背景をも正規化後の学習画像に含めなければならないことも、正面顔の検出器と違って
学習の難易度を高めていた。

深層学習の顔検出のライブラリでは、大概の場合、長方形になります。



最近にアノテーションでは、
セマンティックセグメンテーションのアノテーションになってきています。


[セマンティックセグメンテーションのアノテーションツールlabelme](https://qiita.com/kouki_outstand/items/7b7597f271beca0051e5)

---

アノテーションのBoundingBoxの定義のしかたは、機械学習の実装の性能につながる。

例えば、歩行者検出の検出枠を、歩行者の上下左右にマージンをつけて検出するタイプのものがある。
自分たちの開発しようとする検出器はどのような検出器なのかによってアノテーションのしかたを再考する価値はある。また、既存のアノテーションデータを、自分の学習のためのデータへの換算方法を構築することだ。


![LBP_HOG.png](https://qiita-image-store.s3.amazonaws.com/0/83761/9b689daf-50af-4a5b-67d7-e237e0a87c29.png)

この図２は[[サーベイ論文]統計的学習手法による人検出](http://www.vision.cs.chubu.ac.jp/MPRG/F_group/F124_yamauchi2012.pdf)から引用


---
ここに書いてきた記事は独立させました。

qiita [アノテーションツール(正解入力ツール)が進化している。 2](https://qiita.com/nonbiri15/items/819efb0d42b1541c29c0)


関連記事
qiita [アノテーションツール(正解入力ツール)が進化している。](https://qiita.com/nonbiri15/items/fdb1d2a54f8d670993bb)
Graphviz で Subgraph の囲い線を表示する

囲い線を表示するには対象の `subgraph` を `cluster` にする必要がある。

`subgraph` を `cluster` にしたいときは `subgraph` の名前に `"cluster"` というプレフィックスをつける。

```dot
subgraph cluster_0 {
...
};
```


https://graphviz.gitlab.io/_pages/Gallery/directed/cluster.html
CLIからGmailが送りたかった(未解決) [WIP]


muttを使い始めたので、どうせならGmailをCLIから送りたくて試していました。
初めの設定は[Archのwiki](https://wiki.archlinux.jp/index.php/Mutt)に従って行いました。
が、単純に何も設定しないと以下のように弾かれてしまいます

[!rejected-picture]()

これは、Gmailの設定でOAuth2認証がされていないアクセスを拒否するようになったからだとかなんとか読みました。
(ちなみに、それでも受信はできます)
いくつか解決方法として述べられていたものをあげておきます。

# 解決策1. Gmail側でOAuth2認証されていなくても受け入れるように設定する(非推奨) (現状可能な唯一の方法)

[Googleの「安全性の低いアプリのアクセス」の設定](https://myaccount.google.com/lesssecureapps)から、安全性の低いアプリのアクセスを許可すれば使えるようになるようですが、勿論セキュリティは下がります。
[その場合の参考記事](https://7me.oji.0j0.jp/2017/mutt-send-mail.html)

# 解決策2. `git send-email`を使用する

どうやら、元々はパッチのやりとり用途で用意されているらしいのですが、gitにはデフォルトで`git send-email`なんてコマンドがあります。
これを使えば、OAuth2認証を使用することができるらしいです。

> あなたが求めているものを明確に把握できてないかもしれないですが、理解があっていればgitをGoole Oauth2を使ってのメール送信に使うことができます
> $ git send-email --smtp-pass your-Oauth2-app-pwd 
>                  --smtp-user your.email@gmail.com 
>                  --smtp-server smtp.gmail.com 
>                  --smtp-encryption tls 
>                  --smtp-server-port 587 
>                  --to your-friend@gmail.com
>                  mail-content.txt
> 私はこの方法で、Googleアカウントのメールを使ってパッチを送っています。
> >I just came by your thread and might not understand your requirement correctly. But if I understood correctly, I think you can use git to send emails with Google Oauth2.
> > 
> > $ git send-email --smtp-pass your-Oauth2-app-pwd 
> >                  --smtp-user your.email@gmail.com 
> >                  --smtp-server smtp.gmail.com 
> >                  --smtp-encryption tls 
> >                  --smtp-server-port 587 
> >                  --to your-friend@gmail.com
> >                  mail-content.txt
> > This is how I am sending patches using my Google account email.
> 出典: [stack-exchange Looking for a CLI e-mail sender that supports OAUTH 2.0](https://softwarerecs.stackexchange.com/questions/30189/looking-for-a-cli-e-mail-sender-that-supports-oauth-2-0)

自分の環境で試したところ、うまく行ってないです...

> 自分の環境
> OS: macOS High Sierra 10.13.6
> git version: 2.19.1

[!screenshot]()
TypeScriptを用いて、DAZ Scriptでクラスを利用する

※本記事は、Blogの方にも投稿しています。
http://lowpolysnow.com/wp/20181203/70/

---

[以前の記事](https://qiita.com/lowpolysnow/items/1cb0ab1315a95fae5d6d)でTypeScriptでDAZ Scriptを書ける環境を整えたので、せっかくなのでクラスを利用してみたいと思います。

```TypeScript
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello," + this.greeting;
    }
}

(function () {
    let greeter = new Greeter("world");
    MessageBox.information(greeter.greet(), "doit()", "OK");
})();

```

トランスパイルすることで、次のようなJavaScriptがjsファイルで出力されます。
このjsファイルの拡張子をdsaに書き換えることで、DAZ Scriptとして利用できるようにします。
（以前の記事のように環境をつくておくと、自動で書き換えてくれます）

```javascript
var Greeter = /** @class */ (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello," + this.greeting;
    };
    return Greeter;
}());
(function () {
    var greeter = new Greeter("world");
    MessageBox.information(greeter.greet(), "doit()", "OK");
})();
```

実行結果は次のようになります。
![5C1540574019060.png](https://qiita-image-store.s3.amazonaws.com/0/267708/cbe8134a-a38a-bcfb-70c4-1443d213f8da.png)

TypeScriptのコードなど下記のサイトを参考にさせていただきました。
他のクラスの機能のサンプルも揃っているので、時間があるときにどこまでDAZ Scriptで使えるか試してみようと思います。
> TypeScriptのClassについて – 公式ドキュメント日本語訳
> [https://mae.chab.in/archives/59843#post59843-1](https://mae.chab.in/archives/59843#post59843-1)
DAZ Scriptでメッセージボックスを表示する（Global オブジェクトについて）

※本記事は、Blogの方にも投稿しています。
http://lowpolysnow.com/wp/20181203/56/

---
DAZ Scriptではメッセージボックスの表示やSceneパネルのノードの取得などの機能を、Globalオブジェクトとして提供しています。

詳しくは、以下にリファレンスがあります。

> Global [Documentation Center]
> http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/object_index/global

Global「オブジェクト」と呼んでいますが、実際には「Global」をシンタックスとして指定する必要はなく、例えばメッセージボックスを表示したいときは、MessageBoxプロパティを直接指定します。

```javascript
(function () {
    MessageBox.information("do it ! ジャスト　ドゥ　イット！", "doit()", "OK");
})();
```

実行結果は次のようになります。
![1540478954508.png](https://qiita-image-store.s3.amazonaws.com/0/267708/459e4ca5-d639-d7b7-498c-7fbe985d81c2.png)

リファレンスのMessageBoxプロパティの項を参照するとわかりますが、Globalシンタックスが省略されているものの、実際にはGlobalオブジェクトのMessageBoxプロパティを指定しており、[DzMessageBoxオブジェクト](http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/object_index/messagebox_dz#detailed_description)を取得しています。上記の例では、そのDzMessageBoxオブジェクトのinformationメソッドを実行しています。

リファレンスのページにGlobalオブジェクトの詳しい説明があります。

> The global object is never used directly, and cannot be created using the [new](http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/language_reference/operators/start#new) operator. It is automatically created when the scripting engine is initialized, and its functions and properties are available immediately. The global object has no syntax. Its functions and properties are accessed directly. 

> Globalオブジェクトは直接使用されず、またnew演算子でインスタンスを作成するもできません。DAZ Scriptエンジンが初期化されると自動的に作成され、そのメソッドとプロパティはすぐに利用することができます。Globalオブジェクトにはシンタックスがありません。メソッドとプロパティは直接アクセスします。

要は、次の様には利用できません。

```JavaScript
//このコードはエラーになります。
(function () {
    Global.MessageBox.information("do it ! ジャスト　ドゥ　イット！", "doit()", "OK");
})();
```



他にも、次のようなプロパティを使用することができます。（詳しくはリファレンス参照）

##### ECMA Script由来

- Math：数学関数のライブラリです。

  など

##### DAZ Script由来

- MessageBox：画面上にメッセージボックスを表示します。
- Scene：Sceneパネルの情報にアクセスします。

  など
move コンストラクタの使用例

move コンストラクタの簡単な使用例と効果を記しておく。

# 使用例

下記の使用例は `calloc` や `malloc` で資源確保し、`free` で開放をしているので C++ としては現実的な例ではないんだけど、わかり易い例とはしばしば現実的ではないものなので仕方がないのである。

```c++:c++11
//clang++ -std=c++11 -O2 movector.cpp
#include <vector>
#include <cstdio>
#include <time.h>
#include <utility> 
#include <cstdlib>
#include <iostream>

int const MEM_SIZE=1024;

struct no_move_ctor
{
  void * m;
  no_move_ctor() : m(std::calloc(MEM_SIZE,1)){}
  ~no_move_ctor(){
    free(m);
  }
  no_move_ctor( no_move_ctor const & that ) : m(std::malloc(MEM_SIZE)){
    std::memcpy(m, that.m, MEM_SIZE);
  }
  // 代入演算子もあるけど省略
};

struct with_move_ctor
{
  void * m;
  with_move_ctor() : m(std::calloc(MEM_SIZE,1)){}
  ~with_move_ctor(){
    free(m);
  }
  with_move_ctor( with_move_ctor const & that ) : m(std::malloc(MEM_SIZE)){
    std::memcpy(m, that.m, MEM_SIZE);
  }
  with_move_ctor( with_move_ctor && that ) noexcept
  : m(that.m)
  {
    that.m=nullptr;
  }
  // 代入演算子もあるけど省略
};

double getTick()
{
  timespec t;
  clock_gettime(CLOCK_REALTIME, &t);
  return t.tv_sec + t.tv_nsec*1e-9;
}

template< typename T >
void test( char const * title )
{
  std::vector<T> a;
  double tick = -getTick();
  for( size_t i=0 ; i<2000 ; ++i ){
    a.resize(i);
    a.shrink_to_fit();
  }
  tick += getTick();
  std::cout << title << ": " << tick << std::endl;
}

int main()
{
  test<no_move_ctor>( "no move ctor");
  test<with_move_ctor>( "with move ctor");
}
```

※ `malloc` や `calloc` の失敗を無視していますすいません。

# 効果

手元のマシンでの実行結果は下記の通り：

```text
no move ctor: 0.761662
with move ctor: 0.0152781
```

この例の場合、moveコンストラクタがあると、50倍ぐらい速くなる。

# 解説

`no_move_ctor` 型は、C++03 以前のクラスとしては割と普通な感じ。
`std::vector` に入れて `resize` すると否応なくコピーが発生する。
上記の例では `malloc` と `memcpy` を使って複製している。

無駄なコピーだけど仕方ないなぁという気分だった。

`with_move_ctor` 型には、C++11 以降でサポートされる moveコンストラクタがある。そして重要なのは `noexcept` 修飾されている点。`noexcept` なので、`std::vector` 内の `resize` では moveコンストラクタが使われる。

moveコンストラクタがあれば、無駄なコピーは発生しない。素晴らしい。

moveコンストラクタは

* コンストラクタの引数に手を加えて良い
* コンストラクタの引数を実質的に destruct するような処理を書いても良い
* コピーコンストラクタとの違いは引数の型（右辺値参照と呼ばれ、`&&` でそれを示す）
* `noexcept` にしておくと `std::vector` などの中で使ってくれる

というようなもの。

実装内容としては上記の例のように、コンストラクタ引数のポインタを奪ってくる感じが多いと思う。
コピーするだけだとそのうち二重開放で死ぬので、コピー元のポインタに `nullptr` を入れておく。実質的に destruct しているようなものである。

## いつ moveコンストラクタを書くか

しかし。
moveコンストラクタを陽に書く必要がある簡単な場面があまり思いつかない。

コピー・代入・破壊(デストラクタ)を書く必要があるクラスなら move も書く必要があるんだけど、そういう簡単な例が思いつかなかった。

上記の例では無理に `malloc`〜`free` しているけど、普通に `std::vector` や `std::unique_ptr` でメモリを管理していれば（そして不用意にコピーコンストラクタやデストラクタを定義しなければ）コンパイラが自動的に moveコンストラクタを生成してくれる。

「ウィンドウハンドル」や「ファイルハンドル」のような複製不能な資源を管理するクラスであれば陽に moveコンストラクタが必要になる。
でも、例としてわかりにくくなるかと思ってやめておいた。

そうそう。C++11 からは、複製不能なオブジェクトも `std::vector` のようなコンテナに入れられるようになっている。すばらしい。これも moveコンストラクタのおかげ。

# 蛇足

MSDN は**移動**コンストラクタ
Effective Modern C++ は ムー**ブ**コンストラクタ
[rvalue reference 完全解説]( https://cpplover.blogspot.com/2009/11/rvalue-reference_23.html ) では**move**コンストラクタ。
ムー**ヴ**コンストラクタ は少数派らしい。

なんとなくこの記事では **move**コンストラクタを採用した。