OmniAICreator/Qiita-1.07M huggingface dataset:
Dartメモ：標準入力の処理


自分用のメモです。


## ごく単純な標準入力の受け付け

Pythonだと

```python:Pythonでこういうの
import sys

print "START!"
for line iter(sys.stdin.readline, ""):
	print line
print "DONE!"
```

こんな感じでサラッと書けるやつをDartだとこんなかんじ。

```dart:標準入力をprintするだけ
import 'dart:io';
import 'dart:convert';

void main() async {
    print("START!");
    await stdin
        .transform(UTF8.decoder)
        .transform(const LineSplitter())
        .forEach((line) {
            print(line);
        });
    print("DONE!");
}
```

あるいは、普通にfor文(iterator)を使うなら

```dart:標準入力をprintするだけ(2)
import 'dart:io';
import 'dart:convert';
import 'dart:async';

void main() async {
    print("START! ---->");
    Stream lines = stdin
        .transform(UTF8.decoder)
        .transform(const LineSplitter());

    await for (val line in lines) {
        print(line);
    }
    print("DONE!");
}
```

いずれにせよ、stdinがバイト列のStreamであるがゆえに、Pythonよりは若干一手間多い感じになる。

## stdinまわりを少ーしだけ理解する

Stdinは、 `Stream<List<Int>>` を継承していて、
それをUTF8.decoderで文字列変換して、LineSplitterで1行ずつ切り出してやることで、
イメージ通りの `Stream<String>` になる。

DartのStreamは dart:async に含まれてることからもわかるように、基本的には非同期。

```dart:標準入力を受け付ける
import 'dart:io';
import 'dart:convert';

void main() {
    stdin
        .transform(UTF8.decoder)
        .transform(const LineSplitter());
        .forEach((line) {
            print(line);
        })
        .then((_) {
            print("DONE!");
        });

    print("START!");
}
```

非同期なのがわかりやすいようにあえて変な書き方をするとこんなかんじ。


### forEachかlistenか

Streamの `forEach` は `listen` (subscriptionを返す) をイイ感じにFutureでラップしたものらしい。

```dart:/sdk/lib/async/stream.dart
  /**
   * Executes [action] on each element of the stream.
   *
   * Completes the returned [Future] when all elements of the stream
   * have been processed.
   *
   * If the stream contains an error, or if the call to [action] throws,
   * the returned future completes with that error, and processing stops.
   */
  Future forEach(void action(T element)) {
    _Future future = new _Future();
    StreamSubscription subscription;
    subscription = this.listen(
        (T element) {
          // TODO(floitsch): the type should be 'void' and inferred.
          _runUserCode<dynamic>(() => action(element), (_) {},
              _cancelAndErrorClosure(subscription, future));
        },
        onError: future._completeError,
        onDone: () {
          future._complete(null);
        },
        cancelOnError: true);
    return future;
  }
```

サンプルコードだと割とlisten使っているけど、
doneとかcancelとかにそんなに興味がないとき（＝大抵の場合）には `forEach` の方を使っておいたほうがFuture（＝[async/await](https://qiita.com/lacolaco/items/cd6685ab3cd115613d37#future--stream--async-await)が使える）で扱いやすいんじゃないかな？
Vue.jsのプロジェクトにJestを導入する

## vue-cliによるプロジェクトの作成
[公式](https://jp.vuejs.org/v2/guide/installation.html#CLI)を参考に、vue-cliを使ってUnitTest検証用のプロジェクトを作ります。

`vue init webpack utest`
- webpackボイラープレートを使用した新しいプロジェクト
- utestプロジェクトの名前

サンプルなので、インタラクティブな質問項目については適当にエンターキーを押していき進みます。途中、`Pick a test runner`という項目が出てきます。ここでどれにするか。。
Mochaはサードパーティのアサーション、モック、スパイツールを組み合わせてテストを実行するフレームワークです。一方、Jestはそれらがひとまとまりになったフルスタックのテストフレームワークと言えます。今回は簡単に始められそうな[Jest](http://facebook.github.io/jest/ja/)にしてみます。公式の日本語ドキュメントもあります。
本記事では言及しませんが、e2eテストは`Nightwatch`にしておきました。

![スクリーンショット 2017-11-24 11.18.39.png](https://qiita-image-store.s3.amazonaws.com/0/29971/8d308a11-4812-8085-5c9c-362c13be3bfe.png "スクリーンショット 2017-11-24 11.18.39.png")


## ディレクトリ構成
Jestのディレクトリ構成はこんな感じになっていました。
![スクリーンショット 2017-11-24 11.58.27.png](https://qiita-image-store.s3.amazonaws.com/0/29971/20cd274b-0e1b-b8fd-6814-1d573d21dcd3.png "スクリーンショット 2017-11-24 11.58.27.png")

## テストの実行
インストール直後の状態でテストを実行する前に、画面を確認してみましょう。
![スクリーンショット 2017-11-24 12.27.22.png](https://qiita-image-store.s3.amazonaws.com/0/29971/5c748c38-368c-a45b-4a22-70b33e893d60.png "スクリーンショット 2017-11-24 12.27.22.png")

```
   vue-cli · Generated "utest".

   To get started:

     cd utest
     npm install
     npm run dev
```
vue-cli実行後に表示される内容に従ってコマンドを実行します。
`npm run dev`をするとおなじみの画面が出ます。

### テスト内容の確認
初期状態で、次のテストコードが入っています。

```javascript:HelloWorld.spec.js
import Vue from 'vue';
import HelloWorld from '@/components/HelloWorld';

describe('HelloWorld.vue', () => {
  it('should render correct contents', () => {
    const Constructor = Vue.extend(HelloWorld);
    const vm = new Constructor().$mount();
    expect(vm.$el.querySelector('.hello h1').textContent)
    .toEqual('Welcome to Your Vue.js App');
  });
});

```
日本語で要約するとこんな感じになります。
- HelloWorldコンポーネントに対してユニットテストを実行
- 「正しいコンテンツを描画する」という振る舞いを検証
- `vm`にコンポーネントをマウントした状態のオブジェクトを格納
- `.hello h1`要素に対して、テキストコンテンツが`Welcome to Your Vue.js App`と等しいか検証

### テストの実行
`npm run unit`でJestによる単体テストを実行すると、結果が出力されます。
![スクリーンショット 2017-11-24 12.13.24.png](https://qiita-image-store.s3.amazonaws.com/0/29971/fbe75f9a-1830-ffb4-bd32-de55d62db2f6.png "スクリーンショット 2017-11-24 12.13.24.png")
先程のテストケースをパスしているのがわかります。
また、テストカバレッジのサマリも表示されています。

### テストを失敗させてみる
テストコードのアサーションを少し書き換えて、テストを失敗させてみます。

```javascript:HelloWorld.spec.js
import Vue from 'vue';
import HelloWorld from '@/components/HelloWorld';

describe('HelloWorld.vue', () => {
  it('should render correct contents', () => {
    const Constructor = Vue.extend(HelloWorld);
    const vm = new Constructor().$mount();
    expect(vm.$el.querySelector('.hello h1').textContent)
    .toEqual('Welcome to Your Vue.js Appp');  // change the expected result.
  });
});
```
![スクリーンショット 2017-11-24 12.24.30.png](https://qiita-image-store.s3.amazonaws.com/0/29971/7c6bb992-16da-c361-a666-a2ca66e14c08.png "スクリーンショット 2017-11-24 12.24.30.png")

想定通り失敗しました。
見やすい！

今回はとりあえず使い始められるところまで確認しました。
詳しくは次回以降に。
【今更聞けない】純正 Lightning ライトニング ケーブルの見分け方

#概要
今更聞けない純正ケーブルの見分け方。
あとはなぜ必要になったかの小話。

#小話
開発現場には魑魅魍魎のごとく純正ケーブル以外がたくさん蔓延っている。
開発陣が身銭を削って調達した成れの果てであろう。
（正確には申請すればお金はもらえる。申請がめんどくさい。）
それもこれも、純正ケーブルが高いからしょうがないといえばしょうがない涙。

##ある日
Xcodeでケーブルを繋いでデバッグしたいのにMacをiPhoneに繋いでも
繋がったり繋がらなくなったりするようになって来た。( *｀ω´) ﾑｷｰ

##ケーブルを疑ってみた
「純正ケーブルじゃないと繋がりにくいかも？」
ケーブルがその辺(オフィス)に転がってるものを使用してた。
(〃￣ω￣)σ…ぁゃιぃ

##ケーブル純正かどうかの見分け方
https://support.apple.com/ja-jp/HT204566
なんとアップル公式サポートページ！！w

##実際見てみた
###まずは・・・、印字内容。
![IMG_1414.JPG](https://qiita-image-store.s3.amazonaws.com/0/215997/17fa6b56-0eee-1c21-2985-4e9332e5be0c.jpeg)

「Designed by California Assembled in China」

あれ？　Apple inがないw

###コネクタ
これも合致w
![image.png](https://qiita-image-store.s3.amazonaws.com/0/215997/61c19fcb-0bc2-f361-0c19-24903099707d.png)

###結論
偽物！！！

偽物でも開発できるけど無駄に困るくらいなら
純正ケーブルに切り替えて快適デバッグライフだー！！
（それでもできなかったらどうしよう・・・w）

###おまけ
( ^o^) ＜XCodeやろーっと
|デバッグ| ┗(☋｀ )┓三
( ◠‿◠ )☛ お前のケーブルは偽物だ
▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂ うわあああああ


#まとめ
開発でケーブルに困ったらケーブルを疑ってみよう。
ケーブル見分け方
https://support.apple.com/ja-jp/HT204566
LocalStorageを試してみた

[LocalStorage | CreateJS](http://labo.project-nya.jp/createjs/local_storage/)
ひよこちゃんの位置を記録するよ。
もう一度アクセスし直すと、そのことが確認できるはず。

```js
var piyo = new lib.Piyo();
stage.addChild(piyo);
var position = getPosition();
piyo.x = position.x;
piyo.y = position.y;

function getPosition() {
	var position = {x: canvas.width/2, y: 210};
	if (localStorage.position) {
		position = JSON.parse(localStorage.position);
	}
	return position;
}
function setPosition(px, py) {
	var position = JSON.stringify({x: px, y: py});
	localStorage.position = position;
}
```
tslint 実行時に node_modules 内の *.d.ts のエラーまで検出されてしまう

あるプロジェクト内で TSLint を実行すると以下のようなエラーが出力された。

```
Error at node_modules/@types/node/index.d.ts:118:13: Duplicate identifier 'require'.
Error at node_modules/@types/react-native/index.d.ts:9253:14: Duplicate identifier 'require'.
```

これらのファイルは確かに存在するが、npm でインストールしたものなので修正はできない。
調べたところ、これらのエラーは TSLint 自体のルールではなく、TypeScript コンパイラが出力しているものだった。

`tsconfig.json` に以下の設定を追加するとエラーは出力されなくなった。

```json:tsconfig.json
{
  "compilerOptions:": {
    "skipLibCheck": false
  }
}
```

https://www.typescriptlang.org/docs/handbook/compiler-options.html

>Skip type checking of all declaration files (*.d.ts).
pandasでアンダーサンプリング

実際に利用した例を使ってまとめます。

#状況
競馬データで、単勝予測の機械学習システムを構築しようと思いました。しかし、最低でも５頭、最大で２０頭近くで行われることもある競馬のレースデータでは、単純に(一位orその他)で分けただけのデータを使うと、ラベルに大きな偏りが生まれて学習がうまくいきません。なので、(一位orその他)のデータの比率を1:1にアンダーサンプリングしました。

#サンプルコード
```python:undersampling.py
def under_sampling(data: pd.DataFrame):
    
    #order_of_finish = 着順
    low_frequency_data_sample = data[data["order_of_finish"] == 1]
    low_frequency_data_size = len(low_frequency_data_sample)
    # 高頻度データの行ラベル
    high_frequency_data = data[data["order_of_finish"] == 0].index

    # 高頻度データの行ラベルから、低頻度のデータと同じ数をランダムで抽出
    random_indices = np.random.choice(high_frequency_data, low_frequency_data_size, replace=False)

    # 抽出した行ラベルを使って、該当するデータを取得
    high_frequency_data_sample = data.loc[random_indices]
    pd.DataFrame(high_frequency_data_sample)

    # データをマージする。 concatは結合API
    merged_data = pd.concat([high_frequency_data_sample, low_frequency_data_sample], ignore_index=True)
    balanced_data = pd.DataFrame(merged_data)

    return balanced_data

```
LSTMの流れをざっくり理解した

[RNN, LSTM and GRU tutorial](https://jhui.github.io/2017/03/15/RNN-LSTM-GRU/)
を読んで理解したLSTM、GRUのアイデアについてまとめます。

画像は参考サイトからお借りします。

# RNN
RNNは隠れ層に再帰構造を持ったニューラルネットワーク。
![rnn_b.png](https://qiita-image-store.s3.amazonaws.com/0/114709/4dc6670d-1fbc-eb14-191d-f2184a78c8f6.png)


展開すると以下のような感じ。
![rnn_b2.png](https://qiita-image-store.s3.amazonaws.com/0/114709/3fad0e74-d703-216e-3dbc-c4e2a2a76957.png)

##ポイント
過去の状態は

```math
state=W_xx_t+W_hh_{t−1}+b
```

予測は

```math
h_t = tanh(state)
```
で表され、次のシーケンスの学習へと受け渡されていく。

問題は、長期的なシーケンスデータが扱えないのと、勾配消失。

# LSTM
RNNのデメリットを改善し
・長期のシーケンスデータを扱える。
・ゲートを使うことで勾配消失を解決した。
というモデル。

LSTMでは、RNNでの
**・予測を出す。**
**・これまでに処理された隠れ層の過去の状態を表す。**
という２つの目的を、

```math
h_t, C
```

という二つの変数に分けて果たす。

キーポイントは
・３つのゲートを使って、**セルの状態Cを更新する**

## ゲート
LSTMには、３つのゲートから入力を受け取り、以下のように表される。

```math
gate_{forget} = σ(W_{fx}X_t + W_{fh}h_{t-1} + b_f) \\
gate_{input} = σ(W_{ix}X_t + W_{ih}h_{t-1} + b_i) \\
gate_{out} = σ(W_{ox}X_t + W_{oh}h_{t-1} + b_o) \\
```

各入力ゲートでは、活性化関数にシグモイドが使われている。
これは、0に近い=更新しない、１に近い=更新する。というように使えるから。(だと思う。)

![InkedAAEAAQAAAAAAAAufAAAAJDJiMjg0OWIwLTJhMzktNGExNS04M2RlLTlhMGQxMjVmZjhiMQ_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/114709/19dc4f1f-7743-2f20-6baa-47562c11ebbe.jpeg)
(よく見かけるこの画像では、セルの状態を上側のパイプラインで表しており、予測の出力を右下の矢印で表している。)

ゲートのそれぞれの役割は
###**Forget Gate**
・前のセルの状態から、**どの部分を保持するか=どの部分を忘却するか**を制御する。(状態の忘却)

###**Input Gate**
・新しく計算した情報の**どの部分をセルの状態に加えるのか**を制御する。(状態の更新)

###**Out Gate**
・セルの状態の、**どの部分を予測として出力するか**を制御する。

## セルの更新
LSTMには、セルの更新と予測の更新があり、以下のように表される。

```math
\tilde{C} = tanh(W_{cx}C_t + W_{ch}h_{t-1} + b_c)\\
C_t = gate_{forget} \cdot C_{t-1} + gate_{input} \cdot \tilde{C}\\
h_t = gate_{out} \cdot tanh(C_t)
```

![update_cell.jpg](https://qiita-image-store.s3.amazonaws.com/0/114709/0dccf1c4-b4a8-f45a-44b9-b54b8a26aa92.jpeg)

###**忘却**
上の式のCtの

```math
gate_{forget} \cdot C_{t-1}
```
の部分で、前のセルの状態と忘却ゲートの入力をかけて、前のセルのいくつかの部分を忘却する。(=いくつかの部分を保持する。)

###**更新**

```math
\tilde{C} = tanh(W_{cx}C_t + W_{ch}h_{t-1} + b_c)\\
gate_{input} \cdot \tilde{C}\\
```

入力ゲートと更新元の情報(Cチルド)をかけて、セルの状態に新たな情報を加える。

###**セルの更新の全体**

```math
C_t = gate_{forget} \cdot C_{t-1} + gate_{input} \cdot \tilde{C}\\
```

前のセルの状態からいくつか忘却したものに新しい情報を加えて、このセルでの状態としている。

###**予測の出力**

```math
h_t = gate_{out} \cdot tanh(C_t)
```
セルの状態に出力ゲートの情報をかけて、予測を出力する。
Node.jsのAWS-SDKでPreSignedURLでPUTするとはまった件

眠いので手短にまとめる。

# 普通にPUTするURL取得する

```js
import AWS from "aws-sdk";

const s3 = new AWS.S3();
async function getPresignedURLForPUT(path){
   return new Promise((resolve,reject)=>{
        s3.getSignedUrl("putObject", {
                Bucket: "example.com",
                Key: path,
                Expires: 60 * 60 * 24 * 365
        }, (err, url) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(url);
                }
        });
   });
}

console.log(await getPresignedURLForPUT("aaa/bbb.jpg");
```

AWSのアクセスキーやシークレットなどは環境変数に入っている前提。 `AWS_DEFAULT_REGION`も環境変数に入っている。

## 最初の洗礼

この状態でやったら、URLは取得できるものの、送ろうとすると`301エラー`が出る。

```
<Error>
<script/>
<Code>PermanentRedirect</Code>
<Message>
The bucket you are attempting to access must be addressed using the 
specified endpoint. Please send all future requests to this endpoint.
</Message>
<Bucket>XXX.COM</Bucket>
<Endpoint>XXX.COM.s3.amazonaws.com</Endpoint>
<RequestId>A82721F2A44XXXX</RequestId><HostId>HPgWeSUk2cKu3AbijEu9+S41bHh7dUxSiwOEEVrS08dsrpJ3AvMP5V2iXXXXXX
</HostId>
</Error>
```

こんな感じのエラーが出る。検索するとリージョン関連のエラーである様だが、環境変数には入っている。

ダメ元で以下の様にしてもダメ。

```js
const s3 = new AWS.S3();
s3.config.update({region:"ap-northeast-1"});
```

ところが以下の様にすると問題ないようになった。

```js
AWS.config.update({region:"ap-northeast-1"});
const s3 = new AWS.S3();
```

## 弐の壁

先ほどので別のURLが帰って来る様になり、PUTリクエストが送れる様であったが、SignatureDoesNotMatchエラーが出る。

https://github.com/aws/aws-sdk-js/issues/902#issuecomment-184872976

これによると、以下が必要になるらしい。

```js
var s3 = new AWS.S3({
  signatureVersion: 'v4'
});
```

## 最後の壁

v4だと一週間以上の有効期限のSignatureは作れないらしい。諦めて1週間有効なSignatureを作った。

## 所感

そもそも設定おかしいなら最初からSigned-URL返して来るなよ。っていう感じではある。
容量の気になる iPhone から、Pythonista で S3 に動画を保存


この記事は [Pythonista Advent Calendar 2017](https://qiita.com/advent-calendar/2017/pythonista) の7日目の記事です。
ファイルサイズが大きくて扱いが難しい動画ファイルを、Pythonistaで AWS S3にアップしてみた話です。


## 概要
iPhone8で4k60pの動画が撮れるようになりましたね!
同じスペックで撮れるデジタルカメラがそう多くない状況で、身近なiPhoneが最新の映像規格をリードするのは非常に刺激的です。

iPhoneだけで短編映画を撮った作品で使われるほどに高品質な[Filmic Pro](https://itunes.apple.com/jp/app/filmic-pro/id436577167?mt=8)と言うアプリがあるのですが、
4k60pの動画ファイルをローカルストレージに保存しておくと、すぐに容量がいっぱいになってしまいます。
そこで、クラウドストレージの使用を検討してみました。

初めはGCPのストレージを使うつもりでAPI周辺のドキュメントを読んでいたのですが、
コマンドラインツール以外で認証させる仕組みがわからず、途方に暮れていました。
今回、AWSのS3を選んだ理由は、*boto*モジュールを使う事でiPhoneだけでシンプルにアップロードする事が出来たからです。

順を追って説明して行きます。


## 📱 iPhoneサイドの準備
* Pythonista
* stash
* boto モジュール

stashは bashをPythonで実装したサードパーティモジュールです。
以下のスクリプトを実行すると、pip が使えるようになります。

```python
import requests as r; exec(r.get('http://bit.ly/get-stash').text)
```

Pythonistaを再起動したら、stash上で以下コマンドを実行します。

```bash
pip install boto3
```
これでクライアント側の準備は整いました。


## 🖥 AWSサイドの準備
S3をセットアップして行きます。既に環境をお持ちであれば読み飛ばしていただいて大丈夫です。

#### 1. バケットを作成
![backet.jpg](https://qiita-image-store.s3.amazonaws.com/0/48607/07ae5b90-314e-264a-7bc4-f3ded7534e94.jpeg)

今回は、**qa-movie2017** と言うバケット名にしました。


#### 2. アクセスキーを作成

![secure.jpg](https://qiita-image-store.s3.amazonaws.com/0/48607/8ae6a91c-a5a9-d977-a3ee-1f675ce6c383.jpeg)

*ユーザ名 > セキュリティ認証情報* から、

*アクセスキータブ > 新しいアクセスキーの作成*でキーを作成。


#### 3. バケット名とアクセスキー、秘密鍵

![IAM_Management_Console.gif](https://qiita-image-store.s3.amazonaws.com/0/48607/00fd2db1-e850-4a52-d1b8-dc8e8f06fed7.gif)

バケット名とアクセスキー、秘密鍵を控えておきます。
csvファイルをダウンロードできるので、Pythonista内に保存して読み込んでも良いかもしれません。


## 🐍 Pythonista側
控えておいたキーを入力します。

```python
# uploadS3.py

import os
import appex
from boto.s3 import connection, key


BUCKET_NAME = ""
ACCESS_KEY = ""
SECRET_KEY = ""


def upload():

  # 登録するファイル
  filename = appex.get_file_path()
  _f=os.path.basename(filename)

  # コネクションの作成
  conn = connection.S3Connection(ACCESS_KEY, SECRET_KEY)

  # バケットの取得
  bucket = conn.get_bucket(BUCKET_NAME)
  k = key.Key(bucket, _f)

  # ファイル名を指定してアップロード
  size = k.set_contents_from_filename(filename)
  return size

if __main__ == “__main__”:
  upload()

```

Pythonista 右上のボタンより、
Share > Run Pythonista Script で、 uploadS3.py を登録しておきます。

あとは **OpenIn** からPythonistaに登録しておいたこのスクリプトを実行するだけで、
動画に限らず様々なフォーマットのファイルを S3の指定バケット内に保存することが出来ます。


## まとめ
Pythonistaとbotoモジュールを使う事で、
AWSのS3をiPhoneだけで操作することが簡単に出来ました。

スマートフォンでクラウドをがっつり操作できれば、効率はさておきiPhoneだけで仕事する事も可能かもしれません。

ただ、AWSはGCP等と比べ料金が割高になる傾向にあるため、
長期的に保存する用途では、DropBoxなど他のストレージサービスを検討する方が良いと思います。

iPhone と Pythonista にクラウドを組み合わせると、いろいろな可能性が見えてくる一例を紹介しました。
React.jsについて勉強


## Reactとは
Facebookが開発、OSSとして公開しているJavaScriptライブラリ
React.jsは、あくまでUIを構築するためのライブラリ

## Reactの特徴
- **Just the UI**
MVCのVにあたるUIのみを構築するためのもので、他にどういったライブラリと組み合わせるかは問わない。

- **Virtual DOM**
実際のDOMに対する操作を抽象化し、シンプルなコードでそれなりのパフォーマンスを提供する。VirtualDOMと画面のDOMを比較し、変化した部分だけを見つけ、Reactは変化した部分だけをアップデートするので速い！！

- **Data flow**
一方向のデータフローにより、従来の双方向データバインディングを実現するコードよりも簡素でわかりやすい。

- **宣言型**
状態に対しての「あるべき姿」を宣言するように定義

- **コンポネントベース**
Reactではコンポーネントを組み合わせてアプリを構築することで、コンポーネントごとに状態を管理すると同時に、複雑なUIを一つの部品としてまとめる。

- **どこでも使用できる**
Reactはクライアントサイドの描画だけでなく、Nodeを使ったサーバーサイドレンダリングに対応している他、ReactNativeというモバイルアプリ開発フレームワークを利用することで、モバイル開発にも対応している。

## React周りの用語
### Virtual DOMとは？
メモリ上に保存された、DOMのコピー。ユーザーイベントやサーバーイベントによりデータ更新が発生し、DOMを再描画する必要が出た場合、画面のDOMではなくVirtualDOMを更新する。

### コンポーネント
機能を兼ね備えたUIの部品。

以下は関数型コンポーネントとクラス型コンポーネントの例

```js:関数型コンポーネント
function Greeting(props) {
  return <h1>Hello, {props.name}</h1>;
}
```

```js:クラス型コンポーネント
class Greeting extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}
```

### Props
コンポーネントを生成するときに親から渡されるオブジェクト。コンポーネントが画面から取り除かれるまで、不変の値を保持する。
propsの値は親Componentで管理するので、決してReactのComponentの中で変更してはいけない。
これを守ることで、ReactのComponentは同じpropsを渡される限りは、必ず同じレンダリング結果になるので、immutableなComponentとして扱えることになる。

### State
コンポーネント内で保持される、プライベートなオブジェクトで、可変の変数を保持する。
例:クリックした際に数字をカウントアップしたい際など
親Componentでは値の変更はどうするの、というとこれはstateという、Componentの状態を保持するための変数に適用

#### setStateメソッド
stateオブジェクトのパラメータを更新させるためのメソッド


### Flux
クライアントサイドのWebアプリケーション（ユーザーインターフェース）を開発するためのアプリケーションアーキテクチャ

### JSX
HTMLに見える部分`<div>...</div>`的な部分(XMLなので閉じタグが必要)
基本的にはHTMLを変数化している

### Babel
ES6を現状のJavaScriptに変換するツール

### ESLint
JavaScriptの文法チェックツール

### webpack
ビルドツール

### webpack-dev-server
webpackの設定g￥ファイルを読み込みJSやCSSのソースファイルに変更があるとビルドを行い、結果をブラウザにリアルタイムで反映してくれる便利ツール


## コンポーネント
先ほども説明した通り、コンポーネントは機能を兼ね備えたUIの部品である。

### コンポーネントライフサイクル
Reactコンポーネントのライフサイクルには、大きく分けて3つのフェーズがあeactコンポーネントのライフサイクルには、大きく分けて3つのフェーズがある

- Mountingフェーズ
コンポーネントが生成されてDOMに要素が挿入される時

- Updatingフェーズ
PropsやStateの値に変更が発生した時

- Unmountingフェーズ
コンポーネントがDOMから取り除かれる時

componentWillMountメソッド:初期化時と属性変更時に呼ばれる
renderメソッド:描画時

## 属性値
コンポーネントには通常のDOMと同様に属性値を定義することができる

```
<Rect num={1} bgcolor='#e02020' />
```

## CSS Style
JSX内でスタイルを渡すにはキャメルケースで書く必要がある

```js
// CSS スタイルはキャメルケースでプロパティを書く
    this.rectStyle = {
      background: bgcolor,
      display: 'table-cell',
      border: '1px #000 solid',
      fontSize: 20,
      width: 30,
      height: 30,
      textAlign: 'center',
      verticalAlign: 'center',
    }
```



## React Tutorial
[React TutorialでComponentを別ファイルに分けてやってみた](https://qiita.com/taigamikami/items/4ea2813df24e12f14662)




## 参考
https://app.codegrid.net/entry/react-1
https://codezine.jp/article/detail/9878
価値反復 (value iteration) と方策反復 (policy iteration)、on-policy と off-policy

いつもごっちゃになるのでメモ (間違ってるかも)

**価値反復 (value iteration)** は、適当な初期価値関数 $Q_0$ と最適方策 $\pi^*$ を用意 (実用上はその時の価値関数に関する (ε-) グリーディ方策しか使えないと思われる) して、ベルマン方程式、つまり1ステップ進めてみたとき得られた報酬で価値関数を更新して $Q_t$ を順次求めていく方法。

**方策反復 (policy iteration)** は、適当な初期方策 $\pi_{t=0}$ を用意して、
1. 方策評価：$Q^{\pi_t}$ を求める (これめっちゃコストかかる)
2. 方策改善：$\pi_{t+1} = \text{greedy}(Q^{\pi_t})$
を繰り返す方法。

状態だけを見ているときは Q じゃなくて V にすれば同じ

方策勾配法ってのもあるけど、これはまた別のやつ。方策を直接モデル化して最適化する。

---
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第十章 しなやかな設計6 独立したクラス

# これまでの第十章

- [序章](https://qiita.com/YasuhiroKimesawa/items/c240451e6746497fd446)
- [意図の明白なインターフェース](https://qiita.com/YasuhiroKimesawa/items/988ed817de9aac785633)
- [副作用のない関数](https://qiita.com/YasuhiroKimesawa/items/a035d872d630eadeaffb#)
- [表明](https://qiita.com/YasuhiroKimesawa/items/bc2c417c30ec79efce15)
- [概念の輪郭](https://qiita.com/YasuhiroKimesawa/items/32c8ad3c54a4c486041d) 

# 独立したクラス

この**独立したクラス**と次の**閉じた操作**は値オブジェクトのパターン

依存関係が増えれば、そのクラスを理解するのに、関連を辿る必要が出てきて、難しくなる。

依存関係を極限まで減らすことで、理解しやすいクラスを作る。それは値オブジェクトなら可能ですね。
そのクラスは数個のプリミティブや基本ライブラリで表現されたクラスになるでしょう。

もちろん、プリミティブだけの大きなクラスを作るということではないというのは言うまでもないですね。適切な値オブジェクトを構成していくことが独立したクラスを作る近道になるのではないでしょうか。

# モジュール・集約に閉じ込める

どうしても依存関係が減らせない場合は、同じモジュール内に閉じ込めること。モジュールの外と依存関係がある場合に比べて複雑さは低減されます。

ただ、その依存関係は本当に本質的なのかどうかは考える事です。依存関係はなければないほど理解がし易いクラスになっていきます。

> 目標はすべての依存関係を取り除くことではない。本質的でない依存関係をすべて取り除くことなのだ。(第三部 第十章より)
macOS High Sierraで消されたftpとtelnetを復活させる



# macOS High Sierraでは、ftpとtelnetが使えません
公式の見解は[こちら](https://discussions.apple.com/thread/8093031?start=0&tstart=0)

    I’ve received answer from our engineers and it is not possible to access FTP through the terminal, because High Sierra is a more secure operating system.
    
だそうです、はい。

# 復活の呪文

    brew install inetutils
 

# 参照

[https://apple.stackexchange.com/questions/299758/how-to-get-bsd-ftp-and-telnet-back-in-10-13-high-sierra](https://apple.stackexchange.com/questions/299758/how-to-get-bsd-ftp-and-telnet-back-in-10-13-high-sierra)
Remi's RPM repository で公開されている最新のリリースパッケージを確認する方法

## 背景
PHP 7.1.12が2017/11/24にリリースされました。CentOS7 + Remi's RPM repositoryでPHP7.1をインストールした環境で、最新にアップグレードしようとした所、`php-7.1.12-1.el7.remi` のパッケージが存在せずアップデートに失敗しました。会社のインフラエンジニアに Remi's RPM Repository で提供されるリリースパッケージを確認する方法を教えてもらったので、備忘録用にまとめます。

## 前提

### Remi's RPM repository とは
[公式サイト](https://rpms.remirepo.net/)の `Which are the goals of this repository ?`　によると

> Providing the  latest versions of the PHP stack, full featured, and some other software, to the Fedora and Enterprise Linux (RHEL, CentOS, Oracle, Scientific Linux, ...) users.

Fedora とエンタープライズLinux(RHEL, CentOS, Oracle, Scientific Linux, ...)ユーザー向けに、最新バージョンのPHPとその他ソフトウェアを提供と説明されています。文字通り最新のPHPバージョンが提供される Yum リポジトリです。

## 確認方法

### 1. Remi's RPM repository 公式サイトを確認する

[ここ](https://rpms.remirepo.net/enterprise/7/)から利用しているリポジトリ別パッケージページに遷移できます。CentOS7の `remi-php71` リポジトリを利用しているので、[こちら](https://rpms.remirepo.net/enterprise/7/php71/x86_64/repoview/)から最新のパッケージ一覧が確認できます。

### 2. yum info で確認する

[yum info](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/230999/) で指定のパッケージ情報を確認できます。[--enablerepo オプション](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/795tmprepo.html)を利用することで、普段利用していないリポジトリを有効にして参照ができます。

まとめると以下コマンドで確認できます。

```shell-session
$ yum info --enablerepo=remi-php71 php
```

この２つ手順を辿ることで正確なリリースパッケージを確認できます。

## まとめ

単に php.net で公開されたリリース情報から安直にパッケージ名をインクリメントするのではなく、確実な情報源から判断するのが適切です。今回は Remi RPM's repository を題材としましたが、他ソフトウェアも同様です。適切な手順で正しい判断が出来るようにしたいと思います。
gvmを使ったgoのインストール


# 目的

go言語を使ったローカル開発環境整備のための、
gvmのインストール手順を整理。

go素人による備忘録。

# gvmって

rubyenv(Ruby)とかpyenv(python)とかnvm(node)のように、
単一の環境で複数のバージョンの言語環境を共存させるための仕組みの **go言語版がgvm** 。

(他にもgoenvとかあるみたい)

# gvmのインストール

```bash:gvmのインストール
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
$ source ~/.gvm/scripts/gvm
```

~/.bash_profileに以下を追加する。

```bash:.bash_profileへの追加項目
[[ -s ~/.gvm/scripts/gvm ]] && . ~/.gvm/scripts/gvm
```

```bash:gvmのインストールチェック
$ gvm version
Go Version Manager v1.0.22 installed at ${HOME}/.gvm
```


# goのインストール(バイナリインストール)

go 1.9.2 (2017/11/27時点の最新GA)をバイナリインストールする。

```bash:go1.9.2のバイナリインストール
$ gvm install go1.9.2 -B
```

バイナリインストールでない場合はgoのバイナリをビルドするために
あらかじめgo1.4系のインストールが必要。

```bash:go1.9.2をデフォルトとして利用するようしてい
$ gvm use go1.9.2 --default
$ go --version
go version go1.9.2 darwin/amd64
```

`go --version`したときにエラーなどがでなければOK

# 注意

あくまでもローカルで開発するときの話なので、
本番環境ならば複数バージョンを同時に動かさない限りは
特定のバージョンのものをインストールした方が楽やと思います。

# 参考文献

- [続: Go入門したときに開発環境を考えた話](https://qiita.com/ababup1192/items/e989d279d2a32fc07847)
- [gvmでGoをインストールする時はバイナリからがオススメ](https://qiita.com/takaken/items/1804289fe752a5e06c2c)
- [GVMを使って、Go言語をインストール for Mac](https://qiita.com/kitsuki00/items/91c29b147dbf5577cccb)
- [Go言語をMacにインストールしてみる（goenv + direnv + glide）](https://qiita.com/keitaMatsuo/items/466c6eabac4538d9de71)



...次は、depについて整理しておきたいなぁ
Androidでアプリの定数をBuildConfigではなくYamlから自動生成したい - Gradle Config Plugin

## 経緯
### やりたかったこと
* アプリケーションで使う定数的な値を一括管理したい
* ProductFlavorごとにAPIの向き先など設定情報を変えたい
* それらを管理するためのクラスを自分で作りたくない

### BuildConfigを使わない理由
* build.gradleが肥大化する
* 定数の記述が多少面倒
	* いちいち型を記述しないといけないので面倒
	* すべての値を文字列で埋め込むのも好みでない

## Gradle Config Plugin
https://github.com/tmiyamon/gradle-config

## 特徴
* ProductFlavorごとにYamlを定義できる
* Yamlから値に参照するためのクラスが自動生成される
	* 値の型はYamlの記述内容に合わせて自動的に解決してくれる

## 導入
### buildscriptにプラグインを追加
```groovy
buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.tmiyamon:gradle-config:0.2.1"
  }
}
```

### プラグインを適用する
アプリのプロジェクトがあるbuild.gradleに以下を追記
(app/build.config)

`apply plugin: 'com.tmiyamon.config'`

## 使い方
### コンフィグファイルを作る
アプリのプロジェクトルートに`config`ディレクトリを追加する

ファイル名は以下が対応している

```
config/default.yml
config/default_secret.yml
config/${productFlavor}.yml
config/${productFlavor}_secret.yml
config/${buildType}.yml
config/${buildType}_secret.yml
```

ProductFlavorに応じてこれらのファイルが適宜読み込まれて1つのクラスが生成される

`*_seciet.yml`のファイルは秘匿情報を入れることができる。使う場合はバージョン管理下に置かないように`.gitignore`に入れておくこと

### Yamlに項目を埋めていく
あとはYamlを作っていくだけ

```yaml
size: 2
server: google.com
section:
  size: 3
  servers: [ {name: yahoo.com}, {name: amazon.com} ]
```

このように記述するとビルド時に**Settings**という名前のクラスが生成される

生成されたクラスはこのように値を参照できるようになっている

```java
Settings.size   // => 2
Settings.server // => google.com
Settings.section.size // => 3
Settings.section.servers.get(0).name // => yahoo.com
Settings.section.servers.get(1).name // => amazon.com
```

便利！！！😃

## 応用
### kotlinの拡張を使って定数と引数を組み合わせた文字列を作る
例えばベースのURLだけYamlに書いておいて、パスの組み合わせをkotlinの拡張で実現する

```yaml
url:
  base: https://hoge.com
```

続いてkotlin側でプロパティを拡張する

```kotlin
fun Settings.Url.getDetail(id: String) = "$base/detail/$id"
```

こんな感じでアプリ上で参照できるようになる

```kotlin
Settings.url.getDetail("1") // => https://hoge.com/detail/1
```

## あとがき
設定情報は何かと細かく組み合わせたり、たくさん記述したりする部分なので、管理しやすくしたい

このプラグインはそうした部分の要求を叶えてくれるよいアプローチに思えた
[swift]ベクトルの足し算

<p>汚いながらもなんとか、ベクトルの足し算。</p>

<pre><code>var matABuf: [Double] =
    [1, 2, 3,
     4, 5, 6,
     7, 8, 9]
let vecA = la_matrix_from_double_buffer(matABuf,
                                        3,  /* 行数 */
    1,  /* 列数 */
    3,  /* 改行ごとにメモリバッファをスライドさせる幅 */
    la_hint_t(LA_NO_HINT),
    la_attribute_t(LA_DEFAULT_ATTRIBUTES))
print(vecA.matrixDescription)
 
var matBBuf: [Double] =
    [1, 4, 7,
     2, 5, 8,
     3, 6, 9]
let vecB = la_matrix_from_double_buffer(matBBuf,
                                        3,  /* 行数 */
    1,  /* 列数 */
    3,  /* 改行ごとにメモリバッファをスライドさせる幅 */
    la_hint_t(LA_NO_HINT),
    la_attribute_t(LA_DEFAULT_ATTRIBUTES))
print(vecB.matrixDescription)
 
let ans = la_sum(vecA, vecB)
print(ans.matrixDescription)
</code></pre>

<p>以下が結果。</p>

<pre><code>1.0
4.0
7.0
 
1.0
2.0
3.0
 
2.0
6.0
10.0
</code></pre>

<p>計算できてるじゃん。</p>

関連情報
<a href="https://dev.classmethod.jp/references/ios-8-accelerate-framework/">[iOS 8] Accelerate.Frameworkに加わった新たな線形代数ライブラリ</a><br />
<a href="https://developer.apple.com/documentation/accelerate/blas">BLAS</a><br />
<a href="https://qiita.com/advent-calendar/2017/cocoa">Cocoa Advent Calendar 2017</a><br />
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
MediaWiki APIを使ってキーワードを他言語で取得してみる

## やりたいこと
人名等のキーワードを英語表記から日本語表記で取得しようと思います。
例えばサッカー選手の「Lionel Messi」を「リオネル・メッシ」に変換するという感じです。

## 前提知識
MediaWiki APIを使いますので、下記のyubessyさんが書いたMediaWiki APIに関する記事の内容を前提とします。
[MediaWiki APIを使ってWikipediaの情報を取得](https://qiita.com/yubessy/items/16d2a074be84ee67c01f)

## 方法
MediaWiki APIで下記のように、メッシ選手の例でリクエストを送信します。

```APIリクエスト
https://en.wikipedia.org/w/api.php?format=xml&action=query&titles=Lionel Messi&prop=langlinks&lllimit=50
```
リクエストを投げる際のポイントは以下です。
　・ドメインは検索対象の文字(titlesパラメータ)に合ったものを設定します。
　　⇒　今回は「Lionel Messi」なのでドメインを「en」にしています。
　・propは「langlinks」を設定します。
　・レスポンスの件数は「lllimit」に設定します。
　　⇒　日本語は50番目くらいに出てくるので、今回は50にしています。

リクエストを投げると以下のように言語別の表記が、レスポンスとして取得できます。

```APIレスポンス
<api>
　<continue llcontinue="2150841|kk" continue="||"/>
　<query>
　<pages>
　<page _idx="2150841" pageid="2150841" ns="0" title="Lionel Messi">
　<langlinks>
　　<ll lang="af" xml:space="preserve">Lionel Messi</ll>
　　<ll lang="ak" xml:space="preserve">Lionel Messi</ll>
　　<ll lang="am" xml:space="preserve">ሊዮኔል ሜሲ</ll>
　　<ll lang="an" xml:space="preserve">Leo Messi</ll>
　　<ll lang="ar" xml:space="preserve">ليونيل ميسي</ll>
　</langlinks>
　</page>
　</pages>
　</query>
</api>
```

なお、言語のコードはISO 639-1が使用されています。
[ISO 639-1コード一覧](https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7)

## その他参考
[MediaWiki 操作 API の説明文書-ページの種類](https://www.mediawiki.org/wiki/API:Query/ja#ページの種類)
UIViewに角丸枠線のUIBizierPath作る


この一年間やたらとUIBezierPathを使ったけど、稀によくあるUIViewいっぱいいっぱいに角丸枠線つけたい時に使うExtension

```swift:UIBezierPath+roundedCorner

extension UIBezierPath {
    
    static func roundedCorners(rect: CGRect, topLeft: CGFloat, topRight: CGFloat, bottomRight: CGFloat, bottomLeft: CGFloat, lineWidth: CGFloat) -> UIBezierPath {
        
        func radian(_ angle: CGFloat) -> CGFloat {
            return angle * CGFloat(Double.pi) / 180
        }
        
        let path = UIBezierPath()
        
        path.lineWidth = lineWidth
        
        let halfWidth = lineWidth/2
        
        path.move(to: CGPoint(x: topLeft + halfWidth, y: halfWidth))
        
        path.addLine(to: CGPoint(x: rect.maxX - halfWidth - topRight, y: halfWidth))
        path.addArc(withCenter: CGPoint(x: rect.maxX - halfWidth - topRight, y: topRight + halfWidth),
                    radius: topRight,
                    startAngle: radian(-90),
                    endAngle: radian(0),
                    clockwise: true)
        
        path.addLine(to: CGPoint(x: rect.maxX - halfWidth, y: rect.maxY - halfWidth - bottomRight))
        path.addArc(withCenter: CGPoint(x: rect.maxX - halfWidth - bottomRight, y: rect.maxY - halfWidth - bottomRight),
                    radius: bottomRight,
                    startAngle: radian(0),
                    endAngle: radian(90),
                    clockwise: true)
        
        path.addLine(to: CGPoint(x: bottomLeft + halfWidth, y: rect.maxY - halfWidth))
        path.addArc(withCenter: CGPoint(x: bottomLeft + halfWidth, y: rect.maxY - halfWidth - bottomLeft),
                    radius: bottomLeft,
                    startAngle: radian(90),
                    endAngle: radian(180),
                    clockwise: true)
        
        path.addLine(to: CGPoint(x: halfWidth, y: topLeft + halfWidth))
        path.addArc(withCenter: CGPoint(x: topLeft + halfWidth, y: topLeft + halfWidth),
                    radius: topLeft,
                    startAngle: radian(180),
                    endAngle: radian(270),
                    clockwise: true)
        
        return path
    }
}

```
Win10 Creators Update後、vagrant upがエラーになったときの解決方法

# はじめに
vagrant upを行うとエラーが出て起動しなくなった。
解消方法メモ

# 前提（エラー発生の過程）
1. vagrant、visalboxの環境は安定稼働していたため、<br>
   updateせず初期インストールからそのままにしていた。
2. 突然、vagrant upが動作しなくなった。

# エラー発生時の環境
* Windows 10 64bit
* VisalBox バージョン 5.1.22 r115126 (Qt5.6.2)
* Vagrant 1.9.1

# エラー内容
~~~
VBoxManage.exe: error: Details: code E_FAIL (0x80004005),
component MachineWrap, interface IMachine
~~~

# 検証1:VisalBoxを最新バージョンへ上げてみる
**5.1.22 -> 5.2.0**へ変更しvagrant up
私のvagrntではVisualBox 5.1系までしかサポートしてしていないようだ。
エラーは変わったが、悪化してしまった。

~~~
The provider 'virtualbox' that was requested to back the machine
'default' is reporting that it isn't usable on this system. The
reason is shown below:

Vagrant has detected that you have a version of VirtualBox installed
that is not supported by this version of Vagrant. Please install one of
the supported versions listed below to use Vagrant:

4.0, 4.1, 4.2, 4.3, 5.0, 5.1

A Vagrant update may also be available that adds support for the version
you specified. Please check www.vagrantup.com/downloads.html to download
the latest version.
~~~

# 検証2:vagrantを最新バージョンへ上げてみる
**1.9.1 -> 2.0.1**へ変更しvagrant up
Vagrantのバージョンを上げたらVisualBox5.2に対応するかも？
思い切ってvagrantもバージョン上げてみました。
↓
起動成功！直りました。

~~~
Current machine states:
default                   running (virtualbox)
~~~

# 偶然解決したので、後付けで原因調査
* [Win10 Creators Updateが原因](https://superuser.com/questions/1199354/virtualbox-no-longer-running-in-win10-creators-update) の様子。

* [issues #8501](https://github.com/hashicorp/vagrant/issues/8501)にも同内容が記載されていた。

# まとめ
* Vagrant VisualBox両方を最新バージョンへ上げることで解消した。
* 次回からはトライ＆エラーをする前に[issues](https://github.com/hashicorp/vagrant/issues)でまず検索しようと思う
Wordメモ

# 文章校正の詳細設定（2010）

## 誤りのチェック

| 項目|設定値|
|:--|:--|
| 入力ミス|多め|

## 表現の推敲

* [x] 「の」の連続
* [x] あいまいな表現
* [x] 「が、」の多用
* [x] 二重否定
* [x] 文語調

## 表記の揺れ

* [x] 揺らぎ（送り仮名）
* [x] 揺らぎ（漢字/仮名）
* [x] 揺らぎ（数字）
* [x] 揺らぎ（全角/半角）

## 表現の基準

| 項目|設定値|
|:--|:--|
|送り仮名の基準 |本則|
|仮名書き推奨 |一般|
|カタカナ設定 |全角に統一|
|英文字設定 |半角に統一|
|句点 |「。」に統一|
|読点 |「、」に統一|
golangの最新版インストール（備忘録）

golangをインストールした際の備忘録です。
ubuntu14.04でやりましたが、きっと他のバージョンも同じはず。

macとwindowsはやり方違うみたいですね。
今回は扱いません。

本記事の内容は以下の公式ドキュメントをそのまま進めただけです。
これ見て大丈夫な人はこの先読まなくて大丈夫です。

https://golang.org/doc/install

対象は1.9.2ということで。

# 最新goのダウンロード

以下より最新のgolangを確認します。
https://golang.org/dl/

インストールしたいバージョンをダウンロード。

```
$ wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
```

チェックサムの値も確認しておきましょう。

```
$ shasum -a 256 go1.9.2.linux-amd64.tar.gz
```

# go言語の解凍とディレクトリへの配置

ダウンロードしてきた圧縮ファイルを解凍します。
今回の解凍先は/usr/local/とします。

```
$ tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
```

解凍先をPATHに追加するため、~/.profileに以下の内容を追記

```~/.profile
export PATH=$PATH:/usr/local/go/bin
```

ちなみに、このgo言語の動作ディレクトリが、GOROOTです。

# ワークスペースの作成

go言語でいろいろやったりするワークスペースを作成します。
$HOME/go/配下にするのが通例みたいですね。

```
$ mkdir ~/go
```

ちなみに、このワークスペースがGOPATHです。
ホームディレクトリ配下以外にもワークスペースを掘ることはできますが、
その場合はちゃんとその場所にGOPATHを通しましょう。
デフォルトだとこんな感じになっているはずです。

```
$ go env GOPATH
~/go
```

このワークスペース、少しだけ説明しますと、golangを次のように管理するためにあります。

* src goソースコード類を配置
* pkg goプログラミングに使用するパッケージ類を配置
* bin goの実行ファイルを配置

例えば、go installっていうコマンドがあって、
このコマンドは \$GOPATH/src配下のソースコードをコンパイルして\$GOPATH/bin配下に保存するという動作をします。
そして、$GOPATH/binを環境変数に加えておけば、
コンパイルしたgoアプリをそのまま実行可能になります。

こういった仕組みが用意されていますので、
インストールの段階からGo用のワーキングスペースを掘ることは大切なことなのです。

# インストール結果確認

先ほど作成したワークスペース下にsrcフォルダを掘りましょう。

こんな感じのサンプルコードを書いてhello.goというファイル名で、srcディレクトリ配下に保存しましょう。

```hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

これをコンパイルします。

```
$ cd $GOPATH/src/hello
$ go build
```

実行してハローワールドが表示されたらインストール完了です。

```
$ ./hello 
hello, world
```

# 最後に

go言語ってこんな簡単に動いたんや〜っていうのは正直な感想です（勝手にもう少しインストールは複雑な印象を抱いていました）。
ワークスペースに関しては公式ドキュメントを読んで勉強になりました。

また何かあったら記事にします。
それでは。
CLion で C++17 を使う

# 環境
- macOS 10.13.1
- CLion 2017.2

# LLVM 5.0.0 のインストール
`brew install llvm`

# CMake オプションでコンパイラを指定する
<img width="1022" alt="Screen Shot 2017-11-27 at 23.32.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/95255/00cda746-394e-606a-ff15-af1285c06698.png">

<img width="611" alt="Screen Shot 2017-11-27 at 23.33.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/95255/8b5ebbf2-7b11-f802-5ee2-53995bbac67a.png">

# C++17 を有効にする
`set(CMAKE_CXX_STANDARD 17)` を `CMakeList.txt` に記載。
【Swift】Argument labels '(_:, _:)' do not match any available overloadsなるエラーが出た


#Argument labels '(_:, _:)' do not match any available overloadsなるエラーが出た

ただの備忘録

今回のエラーコード

```swift

class drawPicView: UIView {

    var l: CGFloat!
    var r: CGFloat!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        
        l = frame.size.width / 3
        r = sqrt(1.5 * 1.5 + 0.5 * 0.5) * l
    }

override func draw(_ rect: CGRect) {
      
        self.yellowArc()
    }

private func yellowArc() {
let path = UIBezierPath(
            arcCenter: CGPoint(l * 1.5, l * 1.5),
            radius: r,
            startAngle: 0,
            endAngle: CGFloat(M_PI_2),
            clockwise: true)
        path.addLine(to: CGPoint(l * 2, l * 2))
    }
}
```

違和感無かったけど(なぜ)、xとかyが入ってない...
ここ↓

```swift
private func yellowArc() {
let path = UIBezierPath(
            arcCenter: CGPoint(l * 1.5, l * 1.5),
            radius: r,
            startAngle: 0,
            endAngle: CGFloat(M_PI_2),
            clockwise: true)
        path.addLine(to: CGPoint(l * 2, l * 2))
    }
```
訂正後

```swift

let path = UIBezierPath(
            arcCenter: CGPoint(x: l * 1.5,y l * 1.5),
            radius: r,
            startAngle: 0,
            endAngle: CGFloat(M_PI_2),
            clockwise: true)
        path.addLine(to: CGPoint(x: l * 2, y: l * 2))

```

昔のオープンソースコードから取ってきたコードは注意
Yamazen Hacks 山善の加湿器 KS-A253 をhackする


ぱっと見いかにもハックしやすそうな顔してたので買ってみることにした。

# 概要

- メーカーサイト: http://www.yamazen.co.jp/yamazenbook/product/humidifier/KS-A253
- Amazon: http://amzn.asia/2tw75yg


# 内部の様子

![IMG_2927.jpg](https://qiita-image-store.s3.amazonaws.com/0/26038/e83f4097-c00d-350e-205c-17e3f145762d.jpeg "IMG_2927.jpg")
![IMG_2928.jpg](https://qiita-image-store.s3.amazonaws.com/0/26038/0a3161b1-f47e-b2f6-8130-30d2a371e05d.jpeg "IMG_2928.jpg")

- 極めてhackしやすそう
- 修理もしやすそうだけど半導体が何もないから壊れる箇所がなさそう
  - 自分でヒューズの交換ができるかな？って思ったけどこの回路でヒューズ飛ぶようなときはヒーターが逝ってしまっているような場合なので、ヒューズ交換できる意味はあんまなさそう


# 回路図

- 簡単な回路だったのでトレスしてみた
- ヒーターにバイメタルが直列にはいっているようですが、省略しています
- `Heat_Fuse?`はたぶん温度ヒューズだと思う
- リレーと抵抗とコンデンサの時定数回路で水切れ検知がバタつくのを防いでいるっぽい

![KS-A253_sch.png](https://qiita-image-store.s3.amazonaws.com/0/26038/863c9932-c89e-73cc-3399-f26188193683.png "KS-A253_sch.png")

# 部品について

## リレー

http://www.sanyourelay.ca/public/products/pdf/SRD.pdf


# 基板マウンタをつくる

- 一応ヒーターで加熱するような機器なので、内部で基板をぶらぶらさせるのは心配
  - ただ動くかどうか実験するだけだったら適当に配置すればいいけど、今回は本来の加湿器の機能は損なわず普通に使える状態にしたかった
- 3DプリンタでKS-A253の内部の形状にぴったり合うように基板マウンタをつくる
オフラインリアルタイムどう書くF07の実装例


問題 : http://nabetani.sakura.ne.jp/hena/ordf07walk/
実装リンク集 : https://qiita.com/Nabetani/items/cf93b63acc8a313c88bb

一ヶ月ほど前に python で深さ優先探索する実装
https://qiita.com/Nabetani/items/41fcd6693326b8e0808a
をアップしていたんだけど、行きがかり上幅優先探索の実装を。

python2 でも python3 でも動く。

```python:python
W=5
H=5

class Walker:
  def __init__( self, src ):
    self._map = [[int(x) for x in list(line)] for line in src.split("/")]
    self._visited=[[False for x in range(W)] for y in range(H) ]

  def visited(self,x,y):
    return self._visited[y][x]

  def map(self,x,y):
    return self._map[y][x]

  def visit(self, x, y):
    self._visited[y][x]=True

  def walk(self, x0, y0):
    q=[[x0,y0]]
    while True:
      if q==[]:
        break
      x,y = q.pop(0)
      self.visit(x,y)
      nb0=[[x+n[0], y+n[1]] for n in [[0,-1],[0,1],[-1,0],[1,0]]]
      nb1=[n for n in nb0 if n[0] in range(W) and n[1] in range(H) and not self.visited(n[0], n[1]) ]
      cur=self.map(x,y)
      for n in [n for n in nb1 if abs(cur - self.map(n[0],n[1]))<2]:
        q.append(n)

def solve( src ):
  w=Walker(src)
  w.walk(2,0)
  return "/".join([
    "".join(["*" if w.visited(x,y) else str(w.map(x,y)) for x in range(W) ])
    for y in range(H)
  ])

def test( src, expected ):
  actual = solve(src)
  okay = actual==expected
  print( ", ".join( [("ok" if okay else "**NG**"), src, actual, expected ] ) )

test( "12345/29496/19485/09594/82457", "*****/*9*9*/*9*8*/*9*9*/82**7" );
test( "12345/11011/65432/71999/65432", "*****/*****/*****/*1999/*****" );
test( "11111/11111/11111/11111/11111", "*****/*****/*****/*****/*****" );
test( "34503/83687/42707/02558/12933", "***03/8**87/4**07/**558/**933" );
```

幅優先にするということで、`walk` の再帰呼び出しがなくなり、`q` というキューができた。

python に慣れていないので、`q.push(n)` とか `x,y=q.shift()` とか書いて怒られた。

||python|ruby|
|:--|:--|:--|
|末尾に追加|`q.append(val)`|`q.push(val)`|
|先頭から撤去|`val=q.pop(0)`|`val=q.shift`|

だね。

それと。
ruby も python も、C++ の deque に相当するデータ構造が用意されていなくて残念。
USキーのMacを使い始めました。

## 始めに
先日新しいMacbookを買いました。
スペックは問題なかったのですが、躊躇してしまったのが<b>キーボードがUSキー</B>であるということ。

結構前にUSキーボードを使用していたことがあったのでそこまで拒否反応はなかったのですが…慣れ親しんだJISキーボードのものから変えると後々苦労するのでは？と思っていました。

しかし改めて使い始めてみると、何点か良いことに気づいたので、もしうっかり購入してしまったなんて人もこれを見て気分が多少でも和らいでくれることを願ってまとめてみます。

※1 キーボードやマウスはプログラマーにとっては戦う武器であると思っているので、本当にフラストレーションが溜まるのであれば無理して使い続ける必要はないとは思っています。

▼JISキーボードとUSキーボード
![mac-wireless-keyboard-800x800.jpg](https://qiita-image-store.s3.amazonaws.com/0/57541/7380599e-f8d0-e2e7-1c04-fb867fc7d70b.jpeg)

### 良かった点1: Deleteキーがデカい
タイピングする以上必ず叩くDeleteキーですが、日本語版と比べると割と大きめです。
Returnキーに並んで多く叩くであろうボタンだからこそ、面積が大きいのは割と嬉しいです。

### 良かった点2: イコールを表示するためにShiftキーを押す必要がない
設定で変えられるかもですが、USキーではDeleteキーの左隣にあるキーを１つ押せば出せます。コーディングで多く登場するイコールを１タップで表示できるのは嬉しいです。

### 良かった点3: アポストロフィーを表示するためにShiftキーを押す必要がない
英語ネタですが、don'tなど英文を書くと必ずと言って良いほど登場するアポストロフィー。
これもUSキーだとreturnキーの左隣にあるキー１つで表示できます。英文をよく書くという人には嬉しいですね。（USキーなのでこれは意図的にそう設定されているものだと思いますが）

### そのほかにも色々良いことがあるUSキー
このネタはこれまでもまとめて下さっている方が多いものなので、詳しくはその方々の記事をご覧ください
（べ、別に書き飽きてないヨ！）

<a href=https://takakojima.com/macのusキーボードの利点/>Mac のUSキーボードがJISキーボードよりも優れている、3つの決定的な理由</a>
<a href=http://fum-s-tyle.com/us-jis-macbook.html>なぜJISよりUSキーボードをオススメするのか、というお話</a>
<a href=https://net-bizz.net/archives/3866>MacはUSキーボードJISキーボードどっちがいい?違いを比較</a>

### おしまい
とはいえ日本語と英字の変換は超面倒過ぎて辛い。
誰ですかShift+Control+Jなんて押しづらい標準設定を考えた人は。

### 追記
@tomo64 さんよりUSキーによる英数/かなをJISキーボードのように変換する方法を紹介した記事を教えて頂きましたのでこちらにも記載しておきます。

<a href=https://beadored.com/the-original-karabiner-elements-command-switching-eisuu-kana/>本家 Karabiner-Elements が USキーボードの左右 Commandキーによる「英数 / かな」の切り替えに対応！</a>

控えめに言って神アプリ(神記事)でした。
PhantomJS has crashed

## PhantomJS has crashed


- webpack で babel コードを bundle
- redux-saga を利用している

上記条件で、NODE_ENV を切り替えながらビルド。
rails の rspec を PhantomJS -v2.1.1 で実行。
redux-saga のコードを実行するあたりでクラッシュし、ハマった。


transform-flow-strip-types や .babelrc、uglifyJS を疑っていたが、原因がこんなところに…。

https://webpack.js.org/configuration/devtool/

source-map に 速度優先で `eval` を選択していたが、これがアウト。
Generator function と相性が悪い様だ。
ASP.NET MVCについて（適宜更新）

#そもそもMVCとは
- M：Model、データ
- V：View、画面
- C：Controller

MとCはC#にて記述されるが、Vは画面であるためcshtmlにて記述される。
MとCによって、Vが動的に変化する。

#cshtmlとは
cshtmlは、コードブロックとhtmlブロックを持つ。
Razorと呼ばれるビューエンジンにて使うらしい。


#【参考文献】
[1] 増田智明、ASP.NET MVC　プログラミング入門、日経BP社、2016、pp1-15
Raspberry Pi3B でPythonをcronする。

## Raspberrypi3BでPythonをcronする際の備忘録

pythonで作ったコードをcronで定期実行させようとしたところ動かなかった。
mtaがないとったログがありネットと調べpostfixをインストールしてもダメ。。。
答えはシンプルでした。

実行するpyhonのコードは以下のファイルとして記載しています。
/home/pi/abcd.py

以下のコマンドでcron設定を開始

```ruby:cronの設定
$ sudo crontab -e -u root
```

設定ファイルの末尾に以下を記述
※注意点はpythonの記述をフルパスで書くこと！

```ruby:cronの設定
*/1 * * * * /usr/bin/python /home/pi/abcd.py
```

（参考）cron関連のコマンドメモ

```ruby:cronの設定内容の表示
$ sudo crontab -l
```

```ruby:cronの設定
$ sudo crontab -e
```

```ruby:cronの設定削除
$ sudo crontab -r
```
```ruby:cronのステータス表示
$ sudo service cron status

```
```ruby:cronのログ確認
$ cat /var/log/cron.log 
```
ズンドコキヨシ with Elixir

Elixirに真面目に取り組む一環として、練習がてらにズンドコキヨシをElixirで解いてみる。

Rubyで前に解いたのはこっち https://qiita.com/msky026/items/8a520dd8be324389bf6e

```elixir
defmodule Zundoko do
  def run(list \\ []) do
    zundoko = Enum.random(["ズン", "ドコ"])
    IO.puts zundoko
    case complete?(last(list, 5)) do
      true -> show_zundoko(last(list, 5))
      _ -> run(trim(list) ++ [zundoko])
    end
  end

  def complete?(list) do
    list == ["ズン", "ズン","ズン", "ズン", "ドコ"]
  end

  def trim(list) do
    trimed_list =
      case Enum.count(list) do
        size when size >= 5 -> tl list
        _ -> list
      end
    trimed_list
  end

  def last(list, n) do
    list |> Enum.reverse |> Enum.take(n)
  end

  def show_zundoko(list) do
    list |> Enum.each(fn a -> IO.puts a end)
    IO.puts "キ・ヨ・シ！"
  end
end

Zundoko.run()
```

やってみると想像以上に手間取った。
追記：ifとかElixirっぽくないのと後少し手直しした。
Solidusの新規登録時に項目を追加する

こんばんは！Solidusの会員新規登録でユーザー名を追加したかったので追加を方法を調べました。

まずはユーザーテーブルにカラムを追加します。

```
bundle exec rails g migration AddNameToSpreeUsers name:string
```

```ruby
class AddNameToSpreeUsers < ActiveRecord::Migration[5.1]
  def change
    add_column :spree_users, :name, :string
  end
end
```

`config/initializers/spree.rb` に以下のコードを追記します。

```ruby:config/initializers/spree.rb
Spree::PermittedAttributes.user_attributes << :name
```

新規登録フォームにユーザー名を追加します。Viewのカスタマイズ方法は割愛します。
これで登録時にユーザー名を追加することができます。

![スクリーンショット 2017-11-27 22.27.56.png](https://qiita-image-store.s3.amazonaws.com/0/10699/476f561e-4591-e83f-f6ac-7aed03017d3d.png)
はじめて立てる GCE インスタンス

# 生れてはじめて立てる GCE インスタンス。どれくらいの時間がかかるのだろう

…という疑問のもと、やってみました。
インスタンスを立てる方法は Cloud SDK を使う手もあるのですが、初心者らしく Cloud Console 上で作業していきます。

# Cloud Console 上でインスタンスを作りましょう

左側のメニューから Compute Engine を選びます。「作成」ボタンをクリックします。

![gce001.png](https://qiita-image-store.s3.amazonaws.com/0/48133/07f5eb2b-04c9-6a05-1e2d-1670428a2080.png)

では各種情報を入力していきましょう。気にしておきたいのは赤枠で囲った料金に関する表示です。

![gce002_001.png](https://qiita-image-store.s3.amazonaws.com/0/48133/2b83b991-8f26-f76b-04df-c9e1816283eb.png)

個人でお試しで使う場合にはタダで使いたいです。
GCP のウェブページを見ると下記の通り書かれてますので、この条件を満たすように入力していきましょう。
https://cloud.google.com/compute/pricing?hl=ja
![image.png](https://qiita-image-store.s3.amazonaws.com/0/48133/fb77b772-0d73-0e6a-cec9-329ca0baf6ba.png)

ディスクイメージは主要なディストリビューションはほぼ網羅されているので、お気に入りのものを選びます。
なお、ファイアウォールでどのプロトコルを許可するかは、起動後に変更することもできます。https://cloud.google.com/compute/docs/networking?hl=ja#externalhttpconnection

![gce002_002-0.png](https://qiita-image-store.s3.amazonaws.com/0/48133/b952740c-0507-c279-2cef-71e287ff9066.png)

ディスク、ネットワーク、SSH 鍵についても、いくつか設定できるようになっています。

![gce002_002-2.png](https://qiita-image-store.s3.amazonaws.com/0/48133/3993b6fc-01f8-edc4-6c2c-e7dd2fdf34d2.png)

![gce002_002-3.png](https://qiita-image-store.s3.amazonaws.com/0/48133/733dd3da-d7be-9e63-3bd3-e6e74ced2c72.png)

![gce002_002-4.png](https://qiita-image-store.s3.amazonaws.com/0/48133/077ac476-e8c0-c901-a3ae-5b38bc0fe8fa.png)

下の方にスクロールすると作成ボタンがあるのですが、同等の REST またはコマンドラインも表示できます。

![gce002_003-0.png](https://qiita-image-store.s3.amazonaws.com/0/48133/ddd1acef-4020-156d-a95c-9ce71867f0f4.png)

試しにコマンドラインをクリックすると、このように表示されます。

![gce002_003-1.png](https://qiita-image-store.s3.amazonaws.com/0/48133/b77d7208-47f4-86f0-f315-40a2e9e842ac.png)

ボタンを押すとあっというまにインスタンスが起動します。接続列の SSH の隣のプルダウンをクリックした画面が下記になりますが、ブラウザ上で先ほど起動したインスタンスにログインして作業できます。

![gce003.png](https://qiita-image-store.s3.amazonaws.com/0/48133/ca4ec8b7-b4f9-2786-025e-0e042dd519f0.png)

ログインした画面が下記です。普通に作業できますよ！

![gce004.png](https://qiita-image-store.s3.amazonaws.com/0/48133/f1e3dcc7-acdc-117e-04af-8e1edcf36b36.png)

# かかった時間は・・・

15 分かかってないくらいです。はじめてで画面キャプチャしながらでもこの時間におさまっています。

![gce005.png](https://qiita-image-store.s3.amazonaws.com/0/48133/ecd02732-3cf1-9a1b-d563-477ead7933ea.png)

プロダクションでも事例は豊富ですが、個人でちょっとサーバを立てて試したい作業があるなーってときにも重宝しそうです。
# 使っている.zshrcの内容(2017/11/27現在)

```
##################################################
# COLOR
##################################################
autoload -Uz add-zsh-hook
autoload -U colors
colors


##################################################
# AUTO_CD
##################################################
setopt auto_cd

##################################################
# AUTOCONP
##################################################
# enable
autoload -Uz compinit
compinit
# complist grouping
zstyle ':completion:*' format '%B%F{blue}%d%f%b'
zstyle ':completion:*' group-name ''
# Upper letter
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
# 
zstyle ':completion:*' ignore-parents parent pwd ..
# sudo autocomp
zstyle ':completion:*:sudo:*' command-path /usr/local/sbin /usr/local/bin \
	                   /usr/sbin /usr/bin /sbin /bin
# ps autocomp
zstyle ':completion:*:processes' command 'ps x -o pid,s,args'
# add color for comp list
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"


##################################################
# PROMPT
##################################################
PROMPT="%k%f%{[38;5;010m%}[%D{%H:%M:%S} %h] %n:%F{006}%~%f%# "

##################################################
# ALIAS
##################################################
alias ls='ls --color=auto'
alias ll='ls -la --color=auto'
alias l='ls --color=auto'

##################################################
# HISTORY
##################################################
HISTFILE=~/.zsh_history
HISTSIZE=1000000
SAVEHIST=1000000
setopt share_history
setopt hist_reduce_blanks
setopt hist_ignore_all_dups


##################################################
# DIRECTORY STACK
##################################################
setopt auto_pushd
setopt pushd_ignore_dups


##################################################
# LETTER DELETE
##################################################
WORDCHARS=':?_-.[]~=&;!#$%^(){}<>'

export PATH="$HOME/.linuxbrew/bin:$PATH"
export MANPATH="$HOME/.linuxbrew/share/man:$MANPATH"
export INFOPATH="$HOME/.linuxbrew/share/info:$INFOPATH"
export XDG_DATA_DIRS="$HOME/.linuxbrew/share:$XDG_DATA_DIRS"

[ `uname` = "Linux" ] && alias open='xdg-open 2>/dev/null'
```
友達からおすすめのzshrcを聞いてから暫くこれにしています。
BigQuery標準SQLで期間を指定してAppEngineのログを検索する

# 背景
私は普段AppEngineでWebアプリを作っていますが、ログはStackDriver LoggingからBigQueryへストリーミングインポートさせています。
3ヶ月ほど前のログを漁りたくなり、当然StackDriver側には残っていないためBigQueryを探したのですが書き方が割と面倒だったので備忘としてここに残します。

# クエリー内容

`timestamp`のカラムに対してWHEREする際、`FORMAT_TIMESTAMP()`で好きな形のテキストに直してからそれに対して`BETWEEN`で範囲を指定します。
2017年9月16日の05:00:00〜07:00:00までのログが欲しい場合、以下のようになります。

```sql
SELECT
  *
FROM
  `appengine_request.appengine_googleapis_com_request_log_2017091*`
WHERE
  FORMAT_TIMESTAMP("%F %T", timestamp, "+09:00")
  BETWEEN "2017-09-16 05:00:00" AND "2017-09-16 07:00:00"
ORDER BY
  timestamp ASC
```


# 注意点
* BigQueryの基本ですが、今回はログ量がそう多くない事が予めわかっていたのであまり気にせず`SELECT *`にしました。大量のログがある合はスキャンの課金が嵩まないように絞りましょう
    * FROMの参照範囲も今回はいい加減に絞ったのでこれと同様
* AppEngineから流し込むとtimestampはUTCで記録されているので `"+09:00"` を付けて調整します

# 備考
* アドホックなクエリーなのでBigQueryのWeb画面からクエリーを流しました