OmniAICreator/Qiita-1.07M huggingface dataset:
Electronで手軽にSkyWayを使う

## ElectronでSkyWayを使うときの問題点
ElectronでSkyWayを使う場合、問題になるのがXHR等でリクエストを投げる時、リクエストヘッダーにOriginフィールドがないまたはOriginフィールドの値が"file://"(WebSocket)になるということ。
SkyWayでは(APIキーごとに)登録したドメインからしか接続が行えない仕組みとなっていますが、ドメインの判定をこのリクエストヘッダーのOriginフィールドで行っているため、なんの対処をせずにSkyWayのプログラムを組んだElectronアプリで接続しようとするとどうしてもはじかれてしまいます。

## １つの解決方法
すでに、Qiitaにこの問題の１つの解決方法が上がっております。
[Electronでskyway.ioを使う](https://qiita.com/pirosikick/items/9f4e511edfe541172259)
こちらの解決方法は、前段のXHR及びWebSocketをoriginキーの追加/変更が行える[isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch)および[ws](https://github.com/websockets/ws)に書き換えるという方法をとっています。
私も、同様のアプローチしか思いつきませんでした。

## もっと手軽に解決する方法
ちょっと前置きが長くなりましたが、本題へ。
ElectronのGitHubのissuesに[こんな投稿がありました。(スレッドの最後の投稿)](https://github.com/electron/electron/issues/7931#issuecomment-309242850)

```js:Originフィールド追加/変更コード
electron.session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => {
  details.requestHeaders['Origin'] = 'electron://graphiql-app';
  callback({ cancel: false, requestHeaders: details.requestHeaders });
});
```

おお！？っと思いこのコードを組み込んでみたら、XHR / fetch / WebSocket すべてにおいてOriginフィールド(が追加され)値が、"electron://graphiql-app"になりました。
Originフィールド追加/変更コードは、メインプロセスのコードに追加します。
ただし、アプリの'ready'イベントが発生する前にこのコードを実行すると、`'ready'になる前ではダメ`的なエラーを吐くため、'ready'イベントハンドラー内にOriginフィールド追加/変更コードを追加します。

```js
//...
app.on('ready', _ => {
    electron.session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => {
        details.requestHeaders['Origin'] = 'electron://localhost';
        callback({
            cancel: false,
            requestHeaders: details.requestHeaders
        });
    });
    //...
});
//...
```


これだけで、ElectronでSkyWayが使えるようになりました。

## Originフィールドの値
Originフィールドの値は、URI(scheme+host)を設定するのですが、"sss://hhh"の形式でscheme,hostがそれぞれイリーガルなものでなければ自由に設定してもSkyWayからはじかれることはないようです。あと、大文字小文字の区別はしていないようで、SkyWayには"hoge"で登録していて、Originフィールドの値を"HOGE://HOGE"としても接続することができました。

##サンプルアプリ
サンプルアプリのソースをGitHubに上げましたので、cloneしてサクッと検証することができます。
[Electron_SkyWay](https://github.com/turbographics2000/Electron_SkyWay)
![electron_skyway_ss.png](https://qiita-image-store.s3.amazonaws.com/0/17554/74b4488e-d7ea-56aa-f0d4-f2fd2a9cccc7.png)
NuxtのasyncDataで複数のHTTPリクエストを扱う

asyncDataに限らないんだけど `await Promise.all()` 使うとキレイに書けるよねって話。
TypeScript x ES6 な感じ。

prefetch的な処理をキレイにかけるNuxtは最高だなと思います:relaxed:

```html:FooBar.vue
<script lang="ts">
import Vue from "vue";
import Component from "nuxt-class-component";

import Foo from "~/Foo";
import Bar from "~/Bar";

@Component({
  async asyncData({ app, params }) {
    const id = _.get(params, "id");
    // 2つのHTTPのレスポンスを受けてからページがレンダリングされる
    const [foo, bar] = await Promise.all([
      app.$axios.get(`/foo/${id}`),
      app.$axios.get(`/bar/foo/${id}`),
    ]);
    return { foo, bar };
  },
})
export default class extends Vue {
  foo: Foo;
  bar: Bar;
};
</script>
```
iOS9ではxibから作ったカスタムセルのボタンはタップできないことがある

##はじめに
ハマったのでメモです。
とあるプロジェクトで、iOS9ではxibから作ったカスタムセル上のボタンがタップできませんでした。
※iOS10、iOS11ではタップできることを確認
※ストーリーボードからカスタムセルを作成した場合はボタンをタップできることを確認。

下記赤枠のボタンがタップできませんでした。
![WNIV3171.jpeg](https://qiita-image-store.s3.amazonaws.com/0/89206/172e927a-fd60-65ff-194d-0a4047d3db06.jpeg)

##対処方法
このプロジェクトの場合は、セルのcontentViewをisUserInteractionEnabled = falseとすると直りました。
(=falseとしてもセルをタップできます)

```
self.contentView.isUserInteractionEnabled = false
```

##参考
http://paranishian.hateblo.jp/entry/objc/ios7-tableviewcell
Lumenでクロスドメインアクセス設定	

現在 VueJSとLumenでSPAのサービスを作っているのですが
クロスドメインに引っかかり一日がっつりハマったので備忘録も兼ねて
記述

## 結論
色々試行錯誤したのですが結局以下で出来ました。

Lumenのapi/public/index.phpに以下を追記

```api/public/index.php
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
header('Access-Control-Allow-Methods: GET, POST, PUT');
```

## CORSについて
詳しくは
[https://dev.classmethod.jp/etc/about-cors/](https://dev.classmethod.jp/etc/about-cors/)
ここなどに譲るとして、簡単に言うとJSONPは裏技的な感じなので、正式にクロスドメインアクセスを実現するための仕様です。

色々調べてるとLumenのCORS対応のライブラリインストールするとか
js側でheaderを設定するとかあったんですが
結局はindex.phpにheaderの設定を書くだけで可能でした。


## 改修

今のソースでは**Access-Control-Allow-Origin**が全て許可する設定になっているのでここはURL設定する方が良いと思います
moment.jsが勝手にlocalのtimezoneを拾ってきていたのでメモ

moment.jsが勝手にlocalのTimezoneを拾ってきていたのでメモ
（多分[docsのどっか](https://momentjs.com/timezone/docs/)に書いてありそう）　

```js
console.log(moment('2017-11-29 11:00')) //1511920800000
console.log(moment('2017-11-29 11:00').tz('Asia/Tokyo')) //1511920800000
console.log(moment('2017-11-29 11:00').tz('Europe/London')) //1511920800000
console.log(moment('2017-11-29 11:00').format('YYYY-MM-DD HH:mm:ss')) //2017-11-29 11:00:00
console.log(moment('2017-11-29 11:00').tz('Asia/Tokyo').format('YYYY-MM-DD HH:mm:ss')) //2017-11-29 11:00:00
console.log(moment('2017-11-29 11:00').tz('Europe/London').format('YYYY-MM-DD HH:mm:ss')) //2017-11-29 02:00:00
```
大人しくtimestamp突っ込む
FTPサーバの設定手順


# 設定環境
OS: Amazon Linux


# 設定作業

注） 以下の作業はルート権限で行います。

```
$ sudo su
```


## ユーザ追加

```bash
$ useradd ftp-user
$ passwd ftp-user # パスワード設定
```

## FTP用のディレクトリ作成

```bash
$ mkdir -p /var/www/ftp_dir
```

## ディレクトリの権限変更

```bash
$ chown ftp-user /var/www/ftp_dir
$ chmod 755 /var/www/ftp_dir
```

## FTPインストール

```bash
$ yum update
$ yum install vsftpd -y
```

## FTPの初期設定

```bash
$ cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
$ vi /etc/vsftpd/vsftpd.conf
```

```bash:/etc/vsftpd/vsftpd.conf
# 以下を追記

# userlist_fileで指定指定したユーザを有効にする（接続できる）
userlist_enable=YES

# アクセスファイル（/etc/hosts.allow, /etc/hosts.deny)をアクセス制御に利用しない
tcp_wrappers=NO

# パッシブモードの接続を許可する
pasv_enable=YES

# FTPサーバのIPアドレスを指定（パッシブモードで接続時）
pasv_address=[固定IP]

# ポート指定 
pasv_min_port=60001
pasv_max_port=60010

# ドットから始まるファイルを含めた一覧を返す
force_dot_files=YES

# ファイル（またはディレクトリ）のタイムスタンプの表示をローカルタイムで表示する
use_localtime=YES

# 
user_config_dir=/etc/vsftpd/user_conf
```
```bash:/etc/vsftpd/vsftpd.conf
# 以下のコメントを外す
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
```

### FTPの接続用にユーザの登録

```bash
$ vi /etc/vsftpd/chroot_list
```

```bash:/etc/vsftpd/chroot_list
ftp-user
```


```bash
$ mkdir /etc/vsftpd/user_conf
$ vi /etc/vsftpd/user_conf/ftp-user
```

```bash:/etc/vsftpd/user_conf/ftp-user
local_root=/var/www/ftp_dir
```


## サービス起動

```bash
$ /etc/init.d/vsftpd start
```
Webtask on Serverless Framework

#はじめに
本稿は[オープンストリーム Advent Calendar 2017](https://qiita.com/advent-calendar/2017/opst-advent2017)の14日目の記事です。
[Serverless Framework](https://serverless.com/)がいつの間にか[Webtask](https://webtask.io/)に対応していたので試してみました。執筆に際しての実行環境はVirtualBox上に構築したCentOS 7サーバですが、Node.js(npm)が使えれば環境的な差異はほとんどないと思われます。

#導入
Node.jsのインストール

    sudo yum install -y nodejs

Serverless Frameworkのインストール

    npm install -y serverless

``webtask-nodejs``テンプレートを用いてサービスを作成

    sls create --template webtasks-nodejs --path my-service

依存ライブラリのインストール

    cd my-service
    npm install

credentialの初期設定

    sls config credentials --provider webtasks

メールアドレスまたは電話番号の入力を求められます。メールアドレスを入力すると**Webtask Verification Code**という件名でメールが送信されるので、それに記載されたverification codeを入力します。(電話番号を入力した場合の挙動は未確認)

#デプロイと実行
ここまでの手順を行うとテンプレートより設定ファイル(``serverless.yml``)とソースコード(``handler.js``)が生成され、デプロイを行うことができるようになります。デプロイ方法は他のプロバイダと変わりはありません。

    sls deploy

実行も同様です。テンプレートでは**main**というファンクションが定義されています。

    sls invoke --function main

#設定
設定ファイル``serverless.conf``に記述できるWebtaskのための設定は多くありません。
``service.name``にはサービス名を指定します。生成された設定ファイルには``webtasks-nodejs``と記載されています。``sls create``時の``--name``オプションを指定した場合はその値が入りそうな気がしましたがそんなことはありませんでした。この値はWebtaskのエンドポイントURLの一部となるため、公開するのであれば意識する必要があります。

``provider.environment``に記述した変数群はWebtaskのSecretsとして登録されます。Lambdaの環境変数のようなものです。生成された設定ファイルではコメントアウトされているので、これを有効にすればSecretsに登録されます。

    # you can define service wide environment variables here
    #  environment:
    #    variable1: value1
Lambdaのようにfunctionsに記述することでファンクションごとにSecretsが設定できるかと思いましたが、残念ながら無視されてしまいました。
#その他
以下はWebtask特有の挙動はないのでさらっとご紹介します。
##ステージ
``--stage``オプションでステージを指定することができます。本番とステージングなど、複数の環境を構築する場合などに使用します。
##ログ
``sls logs``でログ出力を捕捉することができます。別窓で``invoke``と併用するのが定番です。
##INFO
``sls info``で諸々の情報を出力します。エンドポイントURLを知りたければこのコマンドを使用します。
##削除
``sls remove``で関数(群)を削除します。
#余談
さて、いろいろ試しているうちにServerless Frameworkでデプロイした関数がwt-cliに現れないということに気付いてしまいました。CLIだけでなく、オンラインエディタにも居ません。同じメールアドレスでセットアップしたのに不可解な現象です。
結論から言うとプロファイルが分かれていて、ホスティング先が異なっていました。

    $ cat ~/.webtask
    
    {
      "default": {
        "url": "https://webtask.it.auth0.com",
        "token": "(秘密)",
        "container": "wt-00112233445566778899aabbccddeeff-0"
      },
      "serverless": {
        "url": "https://sandbox.auth0-extend.com",
        "token": "(秘密)",
        "container": "wt-00112233445566778899aabbccddeeff-0"
      }
    }

つまりデフォルトとは別の``serverless``プロファイルが作成されていて、Serverless Frameworkからはこのプロファイルが使用されていたということです。
CLIで関数一覧を取得する場合:

    wt ls -p serverless

オンラインエディタを開く場合:

    wt edit -p serverless

といった風に指定することで解決しました。

#所感
Webtaskは使い勝手の良いCLI([wt-cli](https://github.com/auth0/wt-cli))が提供されているため、[AWS Lambda](https://aws.amazon.com/jp/lambda/)ほどの必須感はありませんが、やはりServerless Frameworkの恩恵はあると感じました。初期設定さえ済ませてしまえば他のプロバイダとの違いを意識せず画一的に操作できるのが最大の利点だと思います。
ls でディレクトリ情報が欲しいとき。

`ls` でディレクトリ情報が欲しいとき。

```bash
 mochizuki ~/Desktop
$ tree foo
foo
├── a.txt
├── b.txt
└── c.txt
```

こんな状況だとします。

普通にやると。

```bash
$ ls foo
a.txt b.txt c.txt
```

ディレクトリも取るには `-d` オプションを使います。

```bash
$ ls -d foo/*
foo/a.txt foo/b.txt foo/c.txt
```

フルパスで欲しいときは。

```bash
 mochizuki ~/Desktop
$ ls -d /Users/mochizuki/Desktop/foo/*
/Users/mochizuki/Desktop/foo/a.txt /Users/mochizuki/Desktop/foo/b.txt /Users/mochizuki/Desktop/foo/c.txt
```

以上です。🍐
【Unity5.6/VR】視点検知によるアクションの実装

# 今回やること
1. ポインターによる視点検知
2. 視点検知によるアクションの実装

# 概要


- ポインターによる視点検知とアクションの実装を行います。

#　準備するもの
- [前回の続き](https://qiita.com/UCH1DA/items/19984c2f914b0b9beb32)です。



# 1.　ポインターによる視点検知
Cubeにポインターが入るときを例に進めてみましょう。
![スクリーンショット 2017-11-29 9.43.39.png](https://qiita-image-store.s3.amazonaws.com/0/183114/081d6a39-d841-35cd-5d4d-8db08037a249.png)

- 3D Object>Cubeを配置します。

![スクリーンショット 2017-11-29 9.45.25.png](https://qiita-image-store.s3.amazonaws.com/0/183114/6afba3c1-3611-e723-df18-7e5d85df7db7.png)

- CubeのPositionを調整して、カメラに映るようにしましょう。

![スクリーンショット 2017-11-29 9.46.56.png](https://qiita-image-store.s3.amazonaws.com/0/183114/3b04ba30-22f0-be4e-9338-d72d5b1e8e1b.png)

- Main CameraにPhysics Raycasterを追加します。

![スクリーンショット 2017-11-29 9.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/183114/385a7c00-d897-7528-8a60-349e8ed7398f.png)

- Event SystemをSceneに追加します。

![スクリーンショット 2017-11-29 9.48.22.png](https://qiita-image-store.s3.amazonaws.com/0/183114/a2731c85-ce38-1337-f5f4-7fd12d510fd1.png)

- Event SystemにGazeInputModuleを追加します。

![スクリーンショット 2017-11-29 9.49.24.png](https://qiita-image-store.s3.amazonaws.com/0/183114/34e30b2b-e220-9816-bf50-2a97f6ba82a1.png)

このままでは、standalone Input Moduleと競合してしまい、GazeInputModuleが思ったように機能しないため、優先順位をあげます。

ここまで実装したら、シーンを再生してみましょう。ポインターがCubeを認識するようになります。



# 2.　視点検知によるアクションの実装
次は、ポインターがCube上に乗ったとき動くようにしたいと思います。

![スクリーンショット 2017-11-29 10.10.43.png](https://qiita-image-store.s3.amazonaws.com/0/183114/0b449c46-6c44-18a0-313c-fd6bff90208b.png)

- 例えば、moveUpという名前でscriptを作成してください。

**CubeのInspectorにおいて追加すること**に注意してください。

![スクリーンショット 2017-11-29 10.16.06.png](https://qiita-image-store.s3.amazonaws.com/0/183114/b06f4b58-450d-d407-3bf7-1dffcb4c703a.png)

選択された部分のコードを入力してください。今回は、y軸方向に移動するようにしています。 

![スクリーンショット 2017-11-29 10.18.02.png](https://qiita-image-store.s3.amazonaws.com/0/183114/ea4de77c-cee0-5241-9089-89e990ab7aea.png)

CubeにEvent Triggerを追加します。

![スクリーンショット 2017-11-29 10.18.13.png](https://qiita-image-store.s3.amazonaws.com/0/183114/1a5d061d-89af-e080-4642-138ababaf8ce.png)

Add New Event Type>PointerEnterを選択します。
他にもTriggerはあるので、色々と検証してみると良いと思います。

![スクリーンショット 2017-11-29 10.35.41.png](https://qiita-image-store.s3.amazonaws.com/0/183114/338c1973-1d90-5fb6-d95f-632a2495f459.png)

CubeのInspectorにあるMove Up(Script)をRuntime Onlyの下(None Object)まで　D&Dします。

![スクリーンショット 2017-11-29 10.35.54.png](https://qiita-image-store.s3.amazonaws.com/0/183114/60a19819-ceb0-1bb4-d7a9-2be067e259fb.png)

None Function>moveUp>moveCubeUp()を選択します。

これで、ポインターがCubeに入ったとき、CubeがY軸正方向に動きます。

以上で、視点検知と視点検知によるアクションの実装は終了です。
javaのバージョンを下げる方法

#Javaのダウングレード方法

複数のJavaを共存させたい場合は別だが、今インストール済のJavaは削除した方が良い。
**（古いバージョンをインストールしても、通常使うJavaは新しいバージョンになってしまうから）**



####※複数のJavaを使い分けるには
必要に応じて切り替えたい場合は環境変数を変更する必要がある。
詳細な方法は以下を参照
[複数のJavaを使い分ける方法](https://www.javadrive.jp/install/jdk/index4.html)


##■使っているJavaを削除する方法
1. 「コントロールパネル」→「プログラムと機能」を選択
2. プログラムの一覧からJavaを探す
3. 右クリックで「アンインストール」を実行
4. 
これで、選択したJavaはアンインストールされる。


##■旧バージョンのJava(JDK・JRE)をインストール方法
以下にアクセスし、必要なバージョンのjavaファイルをダウンロードする
[javaダウンロードページへ](http://www.oracle.com/technetwork/java/javase/archive-139210.html)

以下のような形になっているので、今回必要なOSに適したjavaをダウンロード
※x86は32ビットOS(ファイル名:i586)、x64は64ビットOSを表している。
------------------------------------------------------
Windows x86	138.35 MB  	  jdk-7u80-windows-i586.exe
Windows x64	140.09 MB  	  jdk-7u80-windows-x64.exe
------------------------------------------------------


「Java Runtime Environment(JRE)」はJavaの実行環境だけが含まれており、
「Java Development Kit(JDK)」はJREに加え開発者向けのパッケージが含まれている。


※ダウンロードの際にORACLEアカウントでのログインを求められるため、
ログインまたは、アカウント作成が必要。



##■ダウンロードしたファイルを実行し、
後は画面の通りに進んでいけばJavaのインストールは完了！
Dartメモ：ファイルの読み込み


自分用メモです。

## ベタにStreamで読む方法

[標準入力](https://qiita.com/YusukeIwaki/items/0c72e2f956c6d3684bd8)と同じお作法でいくならばこんなかんじ。

```dart:ファイル読み込み
import 'dart:io';
import 'dart:convert';

void main() {
    new File("something.text").openRead()
        .transform(UTF8.decoder)
        .transform(const LineSplitter())
        .forEach((line) {
            print("> $line");
        });
}
```

## 便利メソッドを使う方法（大きなファイルには不向き）

dart:ioのソースを見てみると、いくつか便利メソッドが定義されている。

```dart:/sdk/lib/io/file_impl.dart
	
  Future<String> readAsString({Encoding encoding: utf8}) =>
      readAsBytes().then((bytes) => _tryDecode(bytes, encoding));

  String readAsStringSync({Encoding encoding: utf8}) =>
      _tryDecode(readAsBytesSync(), encoding);

  Future<List<String>> readAsLines({Encoding encoding: utf8}) =>
      readAsString(encoding: encoding).then(const LineSplitter().convert);

  List<String> readAsLinesSync({Encoding encoding: utf8}) =>
      const LineSplitter().convert(readAsStringSync(encoding: encoding));

```

readAsLinesとかを使うと

```dart:readAsLinesを使ってファイル読み込み
import 'dart:io';
import 'dart:convert';

void main() {
    new File("some.txt").readAsLines()
        .then((lines) {
            for (String line in lines) {
                print("> $line");
            }
        });
}
```

```dart:readAsLinesを使ってファイル読み込み(2)
import 'dart:io';
import 'dart:convert';

void main() async {
    for (String line in await new File("some.txt").readAsLines()) {
        print("> $line");
    }
}
```

こんな書き方ができる。

ただ、readAsXXXXX系のメソッドは、一旦全部を読み込んで文字列変換するので、巨大なファイルを開くときには良くないみたい。
Denite file_rec でマッチャーが機能しない | nixprime/cpsmのビルド方法

# 序章

NeoVimでDenite file_recをしてる時にcpsmマッチャーがうまく機能していないっぽかったので、手動でcpsmのビルドを試みてみた。というおはなし。

# 原因がcpsmだと分かったきっかけ

`:message`をしたらcpsmが原因っぽいエラー出力があった。
何事もverboseなログ出力コマンドは知っておくべきですね。

# 解決手順

まずは普通にinstall.shを用いて手動ビルドを試す。

```bash:sh
cd /path/to/cpsm
./install.sh
```

エラー。

```:エラー出力
PY3 not specified; 
inferring Python version from vim script: 
    cannot set signal handler: 
        Function not implemented script: 
            cannot set signal handler: Function not implemented
                ./install.sh: line 26: [: : integer expression expected
                ./install.sh: line 29: [: : integer expression expected
ERROR: No Python support detected
```

PY3が特定できなかったのでvim scriptから推測？
期待されていない整数？
Pythonのサポートが検知されない？
「知らんけどPY3って文字見たことあるな...そう言えばPY3=ONってdein_lazy.tomlに書いたわ。なるほど？まぁ、よくわからんが大文字だけの変数らしきものって大抵環境変数なんだよね～」
...とアホな推理をして`export PY3=ON && ./install.sh`とかすると、ダメな選択な癖して先に進めてしまうので、どんどん泥沼にハマっていってしまいます。

正解は、**envコマンド**です。
envコマンドとは、環境を変更してコマンドを実行するコマンドです。

```bash:使い方
env [env_name]=[value] [command]
```

今回はこのコマンドを使用して、Python3を使用した環境ですよ～と伝えた状態で./install.shしてみましょう。

```bash
env PY3=ON ./install.sh
```

すると、またエラーがでてきます。
しかも今度は量がめちゃくちゃあります。

こういう時はとある定石がひとつあります。
それは、**READMEを読むこと**です。

README大事。ホントに。

```:README
Requirements
------------

- Vim 7.4, compiled with the `+python` flag.

- A C++ compiler supporting C++11.

- Boost (Ubuntu: package `libboost-all-dev`).

- CMake (Ubuntu: package `cmake`).

- Python headers (Ubuntu: package `python-dev`).

- Optional, required for Unicode support: ICU (Ubuntu: package `libicu-dev`).

Pyenv users on Mac OS X: cpsm requires dynamic Python libraries, which pyenv
does not build by default. If CMake indicates that it's using static libraries,
e.g.:

\```
-- Found PythonLibs: /Users/<username>/.pyenv/versions/3.5.2/lib/python3.5/config-3.5m/libpython3.5m.a
\```

Rebuild with dynamic library support by running `env
PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install <version>`.

Python 3 Support
----------------

If your Vim is compiled against Python 3 instead (`+python3` flag) the install
script should detect this in most cases and everything should just work. You may
need different python headers installed (e.g. `python3-dev` on Ubuntu).

If the detection does not work for any reason you can set `PY3=ON` or `PY3=OFF`
as appropriate when running `./install.sh` to override it.
```

どうやら今回はBoostというものが足りてなかったみたいです。（地味にちゃんとPY3=ONの話も書いてありますね。env PY3=ONと書かれていないのは不親切な気もしますが。）
なので、それを入れてからもう一度試してみましょう。

```bash
apt -y install libboost-all-dev
env PY3=ON ./install.sh
```

成功しました！
ちゃんとマッチャーとして機能していますね！
わーい！
mackerelで監視した後の一次対応を自動化する話

## はじめに
監視システムからアラートを受信した後におこなう対応のうち、手順が決まっていて誰がやっても同じ部分（一次対応）を自動化して、その後対応するエンジニアが楽になるようにお膳立てします。

## 監視アラート対応
監視から通知される情報は、一時点・一監視項目（メトリクス）の情報にすぎません。
対応するエンジニアが適切な診断・正しい対応判断するためには情報不足であり、追加でその周辺情報や時系列遷移を情報収集するという作業が毎回発生しています。

今回はこの情報収集作業を、監視の通知がされたらすぐに自動で行われるようにします。

これができると、

* エンジニアが情報収集作業を飛ばして、即時に対応が開始できるようになります。  
なんといっても楽ですし、復旧時間を短縮でき、障害によるサービスレベルの低下・損失を最小化できます。
* CPU使用率やメモリ使用率の一過性の閾値超過など、エンジニアが確認したときには既に解消してしまっていて何がおこっていたのか判断する材料がない！という状況を改善できます。  
情報収集をタイムリーにおこなう仕組みができあがるため、判断材料がなくて原因判明までに時間がかかるという問題を解決できます。
* エンジニアは、情報収集の結果・ログの記録をチケットに添付し忘れたり、後日まとめて整理して記録するといった面倒から解放されます。

## 対応フロー
自動化したあとの監視アラート対応のフロー図（一部）です。（〇がスタート）
この図の一次対応のレーンを自動化します。

![mackerel-action.png](https://qiita-image-store.s3.amazonaws.com/0/133603/f0f80376-81af-e40e-2be0-0a86e0a56bfa.png)



## 対応フロー説明と設定のポイント
* 通知
    * 異常をmackerelが検知し、Slack通知とWebhook通知をおこないます。
        * Slack通知では「関連するグラフを表示」を有効にします。
        * Webhook通知の通知先は、FrontOpsで作成したNgrokのエンドポイントを指定します。
* Slack通知
    * 二次対応担当者はSlackで異常発生を認知します。また時系列グラフをみて傾向をつかみます
* Webhook通知
    * FrontOpsは、Webhook通知を受けてフローを開始します。
* 実機確認・情報収集
    * 異常が検出された対象ホストにSSHでログインして情報収集をおこないます
        * 対象ホストの情報は、通知データに含まれるhostsデータから取得します。
            * mackerelのhostデータには、外部IPアドレスを保持するプロパティがありません。代わりにmemoプロパティをIPアドレス登録用に使用することにしました。
    * 情報収集には、アラート種別に応じたコマンドを使います。
        * 共通
            * `hostname`、`w`、`last -5` で、ログインしているホストが正しいか、誰かがログインして作業していないか、サーバが再起動していないか確認します
        * CPU|loadavg の場合
            * `top`と`ps`を使ってどのプロセスがリソースを使っているのか確認します。
        * Memory|Swap の場合
            * `top`と`free`を使って、どのプロセスがメモリを使っているのか、メモリ使用状況がどうかを確認します
        * Filesystemの場合
            * `df` を使って、ディスク全体の状態を確認します。
                * mackerelのアラートデータには、対象デバイス情報が含まれていません。対象デバイス情報がとれれば、`find ${mountpoint} -mmin -1 -ls` で最近更新されているファイルリストも取得したいところ。
* チケット作成・更新
    * Redmineのチケットを作成して収集した情報を記録します
        * Webhook通知で受信したデータ
            * 元の`JSON`のままでは可読性が低いので、`YAML`形式にして記録します
        * 情報収集コマンドの結果
            * 標準出力の結果を記録します
* Slack通知
    * 追加で収集したデータとチケットのURLをSlack通知します
    * 二次対応担当者は、追加データをみて状況把握し、対応判断をおこない以降の対応をおこないます

## 二次対応者のSlack画面

* Mackerelからのアラート通知の後に、情報収集した結果とチケットURLが補足添付されます。
二次対応者は自分で情報を集めて回る必要がなく、Slack上に判断材料が準備されるおかげで、迅速に診断・対応判断が行えます。
 
![mackerel-slack.png](https://qiita-image-store.s3.amazonaws.com/0/133603/738385d9-fd09-6153-694e-e180a248e229.png)


## 仕組み

![mackerel-action-picture.png](https://qiita-image-store.s3.amazonaws.com/0/133603/5fa8da27-ddef-9662-d32b-e57b1b4e443e.png)



## 次回に続く
この仕組みの作り方は次回に続きます。
![mackerl-flow-overview.png](https://qiita-image-store.s3.amazonaws.com/0/133603/4f134d0f-9adf-332f-4280-c4860ebcd26b.png)


## 使うもの

1. 監視には[mackerel](https://mackerel.io/)を使います
  * Webhookを使って一次対応ツールと連携させます
  * mackerelは通知メッセージに監視項目の時系列グラフを含めることができます
       * 時系列観点での判断情報提供を標準で行っている点が気に入っています
1. 一次対応には [FrontOps](https://frontops.exhands.org/)を使います
  * FrontOpsを動かすPC1台
  * 従来なかった新カテゴリのツールです。ターミナル操作はもちろん、電話やチャット、ブラウザ操作まで一次対応者が使う大半の道具をワークフローの中で操作できます
       * 2017年11月リリースしたばかりの新ソフトです。今までこのようなツールがなかったので作りました。
1. チケットには[Redmine](https://www.redmine.org/)を使います
1. エンジニアとのコミュニケーションには[Slack](https://slack.com/)を使います
Ubuntu 16.04で "'jp.archive.ubuntu.com' が一時的に解決できません"がでたら

Ubuntu 16.04で "'jp.archive.ubuntu.com' が一時的に解決できません"がでて困った

# 理由
``` /etc/resolv.conf
nameserver 127.0.1.1
```

になってて、名前解決に自分のマシンを使おうとしてる。
なんで、時々つながったりするのかわからないが、こうなってると、ネット上の名前を解決できず、接続できなくなると思う。

# 解決?

なので、
``` /etc/resolv.conf
nameserver 8.8.8.8
```
こうすることで、自分のマシンを名前解決に使わず、googleの名前解決サーバを使ってwebにアクセスしてくれるようになる。

# 解決

が、NetworkManagerが起動するたびに、NetworkManagerに登録されているdnsに書き換えるため、上のダメな方に毎度書き直される。(あと、resolv.confにも手動で書き換えないでって書いてある)
なので、NetworkManagerの方を設定することが一番簡単な解決方法かと思う。
``$ nmcli connection modify "eth0" ipv4.dns "8.8.8.8 8.8.4.4"``
で、解決できた。
pySpherepts > on GitHub > 球面上の点: Icosahedral Nodesを取るNumpy+Scipy実装

https://github.com/gradywright/spherepts
のNumpy+Scipy版を移植してみた。

[GitHub](https://github.com/yasokada/pySpherepts_171126)

オリジナルのMATLABコードでは球上の点の様々な取り方を実装している。
そのうち、Icosahedral Nodesを取る手法を移植した。

### 関連

[code > spherepts > モジュール構造調査](https://qiita.com/7of9/items/a5248835bdc35cba1b63)

[Paper > A Comparison of Popular Point Configurations on S^2 > 球面上の点の取り方の比較 > mesh icosahedral equal area nodesが一番mesh ratioが低い](https://qiita.com/7of9/items/149c740d44d0e533dbd3)
VR ゲーム「ホラー実体験室 脱出病棟Ω」から学ぶ極限状態でのコミュニケーションと仕事への応用

## 前置き

ホラー実体験室 脱出病棟Ω は VR ZONE SHINJUKU にある VR のゲームです。

詳細は以下のサイトを御覧ください。

https://vrzone-pic.com/activity/omega.html

ざっくりと概要を説明すると、恐怖の病棟から脱出するためにチームプレーである選択をしながら進んでいくゲームです。 全視界が恐怖に包まれた状況下でコミュニケーションを取りながら進んでいくのは至難の業でした。

そんなゲームの体験を振り返ってどのようにコミュニケーションを取るべきだったかを考えてみたいと思います。

ちなみに僕たちは4人でプレイしてクリアできませんでした。

## 発生した現象

ゲーム中に僕達はどのような状態に陥ったかを説明します。 ゲームのネタバレはしないので安心してください。

1. 4人で叫んだり騒いだりしてるのでコミュニケーションが取れない
2. 音声越しなので誰から誰への指示なのか分からない
3. 状況が状況なので冷静さを失って決断を急いでしまう
  - 例えば1分の制限時間がある状況下で決断を急いで10秒程度で決断してしまう等。
4. 他の人に何が起こっているのか分からない

ざっくりとこんな状況になりました。

## 改善点

それぞれに関して思いつく改善策を考えたいと思います。

1. 叫ばない
  - 無理かもしれないけどできるだけパニックにならないように務める。
2. 名前を言うようにする
  - XXです。 YYさんZZしてください。 のように。
3. 残された時間を把握しそれを十分に活用するように心がける
  - パニック状態でこれが可能かはわからないですが...
4. 必要に応じて自分の状況を説明する

それができたら苦労しないというレベルの改善策しか思いつきませんでした。

また、全体を通して誰か最も冷静さを保っている人が指揮官の様な立場になり、他のメンバーに順番に状況を説明させたりして全体を把握してから指示を出すようにするとかなり効率的になると思いました。

## リモート(テレビ)会議と同じでは？

これをここに書こうと思ったのはこれはリモート会議と似たような状況だなと思ったからです。

例を挙げると

1. 4人で叫んだり騒いだりしてるのでコミュニケーションが取れない
  - -> 複数の人が同時に話し始めてしまう
2. 音声越しなので誰から誰への指示なのか分からない 
  - -> 対面の会議と違い目線などが伝わらないので誰に話してるのか分かりにくい
3. 状況が状況なので冷静さを失って決断を急いでしまう
  - -> これはリモートに限りませんが、やることが明確にならないうちになんとなく結論を急いで結局誰が何するの？という結論になってしまうことがあります
4. 他の人に何が起こっているのか分からない
  - -> これは対面の会議と違い頷きなどのフィードバックが薄いため話してると理解してくれてるのか分からなくて不安になる現象です。

しかしこれらの問題も全体をコントロールする議長のような立場の人がいるとある程度緩和することができます。

ただし、3,4 に関しては相当な技量が求められると思うので難しいかもしれません。

これに関しては僕らの会社でも良い方法が無いかを模索中です。何かいい方法があったら教えていただけるとうれしいです。

## まとめ

- VR の恐怖ゲームを通してコミュニケーションの知見を得た
- それらの知見はリモート会議にも通じることがあった


## まとめの補足

この記事をみてどうかリモート会議は対面の会議よりコストが掛かるからリモート会議は止めようとならないでください。

確かにリモート会議はコストがかかりますが、会議室に集まるコストに比べたら全体としては小さいコストで済むと思います。

リモート会議なら hangout で繋ぐだけで済みますが、対面で会議するとなると出社する必要がありますし、会議の場所に集まる必要もあって面倒です。 基本移動は面倒なのでこういったムダを省けるということはある程度のコストを払う価値があると思います。

という思い。
jsdoでbpmn その2

#概要
jsdoでbpmn-jsやってみた。
modelerやってみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/0/o/s/0osb.jpg?t=1511859381)

#成果物
http://jsdo.it/ohisama1/0osb

以上。
ここが変だよScalaさん

Scala を使っていて感じた変なところを書きます。
人によっては、どうでも良いというレベルのポエム記事です。

1. メソッド内の匿名関数からダイレクト return 出来てしまう

初期の Scala から fork されたという Kotlin でも同じことが出来ますが、
メソッド内で collection の foreach なんかに関数を渡すとします。
その際に、 関数の中で return が書かれていると、ダイレクトに foreach を呼び出しているメソッドから抜けてしまいます。

```:scala
val data = Map("a" -> Seq(1,2,3), "b" -> Seq(4,5,6), "c" -> Seq(), "d" -> Seq(7,8,9))

def conv(data: Map[String, Seq[Int]]): Boolean = {
    data.foreach(kv => {
        val key = kv._1
        val value = kv._2
        if (value.isEmpty) {
            println(s"${key} is empty")
            return false // ここで親のconvメソッドの戻り値が返せてしまう
        }
        value.map(v => {
            s"${key} - ${v}"
        })
        .foreach(println)
    })
    true
}

println(conv(data))
```

結果、こんな感じになります

```
a - 1
a - 2
a - 3
b - 4
b - 5
b - 6
c is empty
false
```

![スクリーンショット 2017-11-29 7.40.20.png](https://qiita-image-store.s3.amazonaws.com/0/6762/b83c257e-a90b-52e8-aa3e-d5f1763e3edd.png)

foreach に返されるんじゃないんかい！というところが変だと思うわけです。
mongodbのインストールとコマンド

# mongodbのインストール
### CentOS
CentOsならmongodbの[公式サイト](https://www.mongodb.com/)を見ながらリポジトリを獲得することをオススメする。
設定ファイルを/etc/yum.repos.d/mongodb-org-3.0.repoを作成して

```:/etc/yum.repos.d/mongodb-org-3.0.repo
[monogodb-org-3.0]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$release/mongodb-org/3.0/x86_64/
gpgcheck=0
dnabled=1
```
インストールコマンドは

```:terminal
$ sudo yum install -y mongodb-org
```

### Debian
Debianだと
aptであったので最新版じゃないと思いますが
リポジトリとか面倒なので

```:terminal
$ sudo apt install mongodb
```

これでインストール完了

## コマンド

versionを調べる

~~~
$ mongo --version
~~~
mongodbへのアクセス

~~~
$ mongo
~~~

mongodbから去る時は、
Ctrl+dかexit

~~~
> exit
~~~

dbの一覧を表示

~~~:mongodb
> show dbs;
~~~
最初は、localというdbが入っている。

※mongoでは、dbに何かのデータを入れた時点でdbになる
データの入っていないからのdbは
いちいちcreateしなくても
useでいきなり入れる

```:mongodb
> use testdb
```
コレクションを作成

```
> db.createCollection("users");
```
もう一度dbを見るとdbが作成されている

```
> show dbs;
```

mongodbの状態を見たい時

```
> db.stats();
```
UE4でVR空間にカノジョを錬金 10日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 10日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は前回の続き、うなずきUIのロジック実装です。

#ロジック実装

前回の続きです。今回はYES,NOの判定が実際に行われたとき、前回までに実装した関数を呼び出すように修正します。
MotionControllerPawnのTickイベントに以下を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/34a4fe1e-389f-9f2f-698d-3453a2f0f734.png)

ここでは最後、GameManagerにYes,Noを選択した時に再生するボイスを変えるようにしています。
これで実際にHMDでうなずきアクションをしたときに、選択ができるようになりました。

#次回
Look Atを実装します！
UE4でVR空間にカノジョを錬金 9日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 9日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は前回の続き、うなずきUIのロジック実装です。

#二つ並べる

デザインは以下の通りです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/c3624c2e-ae28-a421-5b90-076948a5b792.png)

段々それっぽくなってきました。

#ロジック

続いてロジック実装。

まず、選ばれなかったほうのUIを削除する関数を作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/1ced85ba-fd3f-bd87-1bd3-1248c0189527.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8f820a7c-ed05-264a-124a-e3926d50a2dd.png)

---

続いて、ゲームの物語を進めている時、選択肢が必要な場面で出すように実装します。
今回は単純にスポーンでやっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/06f672b3-b68c-eff9-a38e-d6b12d39fa89.png)

あとはYES、NOでUI削除を呼び出す処理を入れていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/f180581c-db2c-9739-8cbd-65f6ee59add8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/ff7ad7d9-8eac-d744-569e-2ae50e1d55f0.png)

最後、削除のカスタムイベントを呼び出すようにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/b22e9a4a-667c-8041-f283-003af10ba35b.png)

今回はここまで。

#次回

次は実際に選択後、ここで作成した関数を呼び出すように実装します。
UE4でVR空間にカノジョを錬金 8日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 8日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回はうなずきアクション改め、うなずきUIを実装していきます。
割と書く内容が多いので、今回も複数分けて書きます。

#うなずきUI　YES

まずはYES判定から。このようなデザインにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/5c616b4f-e5c4-af5e-869e-99a06bb81f56.png)

手書き感あふれていますねｗ

このアセットはUE4にあるSpherをエクスポートし、ペイント３Dで顔を適当に書いた感じです。

#うなずきUI　NO

続いてNO判定。このようなデザインにしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/62e990fa-3bad-97a5-bedb-270b191bc2a5.png)

ただ、これだけだとユーザーがどうアクションをすればいいのかわからないため、簡単なアニメーションをつけることにします。

#ロジック

続いて簡易的なアニメーションロジック実装。今回もタイムラインを使用しています。

まずはYESのブループリントから。タイムラインで実装しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7fcd35e9-29f5-763e-6bbb-936360284e8e.png)

タイムラインはこのような形で作成しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8498e765-f46a-80c9-d43b-abf1a63b718f.png)

つづいてNOのブループリント。やっていることは大体同じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/6d67c478-7cbe-753b-0e5f-1d180009d60a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/905837ac-b85f-50a0-70ea-b507401c5250.png)

今回実装したタイムラインです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/9b3198b7-f3e5-4fd5-6b4c-5132a8475fcf.png)

これでNoのアニメーションもできました。

残りは明日以降で。

#次回
今回の続きです。
UE4でVR空間にカノジョを錬金 7日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 7日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は前回に引き続き、視線入力に対応した選択肢のロジックを書いていきます。

#ロジック

選択後のロジックを書いていきます。

まず、選択後いきなり消えてしまうと何を選んだのかわからなくなってしまうため、選択したものを少しの間だけ表示し、他は表示を消すようにします。

まずは共通で呼び出す関数を作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/11239cde-7b4c-6f6e-48ad-3bf6fdb575a4.png)


つづいて選択後のロジックです。
カスタムイベントで呼び出せるように実装します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/5ce9a594-b732-89b4-b180-f369682a2fa1.png)

まず上三つの処理が、選択以外の項目を非表示にする処理の塊です。
最後、それが終わったら何秒か遅延させ、表示している選択肢も非表示にして、選択したということを通知しています。
今回はこちらが作成したGameManagerクラスにタグをつけ、それをこのカスタムイベントで呼び出したメソッド内で呼び出せるようにしています。

これで視線入力における選択肢を実装出来ました。

#次回

次はうなずきアクションを二つ並べた時のロジックを書いていきます。
UE4でVR空間にカノジョを錬金 6日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 6日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は視線入力に対応した選択肢を書いていきます。
ちょっと長くなったので２回に分けます。

#視線入力の選択肢

今回は仕様として、かならず三つの選択肢を出すという前提で実装していきます。
まず、デザインは以下の通りです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/21622e92-68dc-d221-8161-479ec1c48bd7.png)

選択肢を３つ並べているだけです。

あと、デフォルトで任意のタグを一つつけておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/8b94a9f6-a6d9-f4ab-5267-db469c533ad4.png)

これでレベルに配置していれば他のブループリントクラスでも取得ができるようになりました。

ここからはロジックを書いていきます。

#ロジック

まず初期化のロジックです。単純にボタンラベルと、そのボタンのインデックスをセットしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a717f32c-1285-3bcd-3ef9-00832ac7421b.png)

つづいて一括表示の関数を実装します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/bcadae93-e6e3-3879-1fae-8e13baac4e77.png)

続いて一括非表示の関数を実装します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7d066880-b51b-2575-de9e-fad9a7d21aef.png)

今回は一旦ここで終了します。

#次回

この続き。今度は選択後のロジックを書いていきます。
こら、そこ。水増しとか言わない。
UE4でVR空間にカノジョを錬金 5日目

[UE4でVR空間にカノジョを錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 5日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は視線入力に対応したUIとロジックを作成します。

# 視線入力に対応したUI

今回も以下のサイトを記述してあったロジックをそのまま利用しました。
[UE4　ガンシューティングゲームを作ろう！その4 視線選択](http://yumadogidogi.hatenablog.com/entry/2015/08/19/124503)

UIデザインは以下のようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/e9457912-06aa-daad-aa08-af7d9040de6c.png)

選択肢の内容はimageを背景にしたText、下にはProgressBarを配置しています。
このUIはVR空間内で出すので、ブループリントでUIを表示するように作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/c7aac55c-e994-0748-ee39-e0ee9d636fbe.png)


#ロジック作成

ロジックです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/0d494b4c-cfd0-7b74-4f37-fde569b771c2.png)

Tickイベントで常時観察します。前回で選択フラグを立てていた場合、ProgressBarを上昇させ、視線を外した場合は下げるようにします。

最初のブランチでTrueだった場合、わざと選択フラグを倒しています。
これは前回、視線をUIに向けていれば自然にこのフラグが立つように実装されているため、視線を外せばフラグが更新されないため倒されていると判断できるためです。

時間はタイムラインで測っています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/d17b7059-f7f2-03b2-ae4e-17376468b3e8.png)

最終的にタイムラインが終了し、ProgressBarが１以上であれば選択後の処理を行うように実装しています。今回は呼び出したいコンポーネントにタグ名を付けているので、タグをGetAllActorsWithTagで検索して引っかかったコンポーネントに処理を渡しています。

ついでにPublicで呼べるラベル名をセットする関数を作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a83e8e67-680e-4802-9951-fd30f57e4594.png)

これで視線入力による選択のロジックが完成しました。

#次回

次回は３つの選択肢を表示するロジックを書きます。
UE4でVR空間にカノジョを錬金 4日目

[UE4でVR空間に彼女を錬金する Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ue4vrgame-create) 4日目の記事です。

12/1～25日までに一人で、UE4を用いてサ○○レッスンとかVR○○ジョっぽいゲームを作って仮想彼女を生み出すことにチャレンジします。

今回は視線入力について記述します。

#視線入力

視線入力は以下のサイトに記述してあったロジックをそのまま利用しました。
[UE4　ガンシューティングゲームを作ろう！その4 視線選択](http://yumadogidogi.hatenablog.com/entry/2015/08/19/124503)

今回はカメラからMulti Line Trace by Channelを使っています。
なぜMulti Line Trace by Channelなのかというと、作りがあまくて手前で別のコンポーネントをヒットさせてしまうため、Multiのほうを利用しています。

#ロジック実装

ロジックは以下のように組みました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/843a42d5-91a8-3235-d679-cf39db337848.png)

カメラの位置からTraceの距離を設定し、Traceがあたったコンポーネントをチェックし、もし視線入力に対応したUIがあった場合、選択の処理を行う、という感じです。

#次回

次は視線入力に対応したUIのロジックを書きます。
VisualStudioのstd::allocate_sharedを使用すると型のアライメント要求が小さくなる

# 問題
VisualStudio2015でstd::allocate_sharedを使用した時に、型のアライメント要求が指定より小さくなる問題が発生した。型のアライメント要求は16であった。

# 原因
ライブラリ内部で定義されるstd::aligned_union<1, T>のアライメント要求が、Tのアライメント要求と異なるのが原因であった。

# 解決方法
この問題を、std::allocatorをカスタマイズしてrebind前の型の情報を保存しておき、最もアライメント要求の大きい数値を選択する事で回避した。

以下は、確認用のコードである。
rebindされた時にTを可変引数テンプレートに保存している。

```cpp
#include <memory>
#include <iostream>

template <class... Types>
void print()
{
    struct info
    {
        char const* name;
        size_t size;
        size_t align;
    };
    for (auto&& it : { info{typeid(Types).name(), sizeof(Types), alignof(Types)}... }) {
        std::cout << it.name << " size=" << it.size << " align=" << it.align << std::endl;
    }
}

template <class T, class... Binds>
struct my_allocator : std::allocator<T>
{
    template <class U>
    struct rebind
    {
        using other = my_allocator<U, Binds..., T>;
    };
    my_allocator() = default;
    
    template <class U, class... Any>
    my_allocator(my_allocator<U, Any...> const&) {}
    
    template <class... Args>
    auto allocate(Args&&... args) {
        print<Binds..., T>();
        return std::allocator<T>::allocate(std::forward<Args>(args)...);
    }
};

int main() {
    struct alignas(16) X {};
    auto x = std::allocate_shared<X>(my_allocator<X>());
}
```

# 確認
上記コードをclangでコンパイルして実行すると以下の出力を得る

```text
Z4mainE1X size=16 align=16
NSt3__120__shared_ptr_emplaceIZ4mainE1X12my_allocatorIS1_JEEEE size=48 align=16
```

Xのアライメント要求は16で、rebind後のTのアライメント要求も16である事が判る。
一方、VisualStudio2015でコンパイルして実行すると以下の出力を得る

```text
struct `int __cdecl main(void)'::`2'::X size=16 align=16
class std::_Ref_count_obj_alloc<struct `int __cdecl main(void)'::`2'::X,struct my_allocator<struct `int __cdecl main(void)'::`2'::X> > size=32 align=8
```

VisualStudio2015では、Xのアライメント要求16に対して、rebind後のTのアラインメント要求は8である事が判る。よってTのアライメント要求でストレージを確保すると、オブジェクトが期待したアドレスに配置されない場合がある。

なお、VisualStudio2017でも同様の出力である。

```text
struct `int __cdecl main(void)'::`2'::X size=16 align=16
class std::_Ref_count_obj_alloc<struct `int __cdecl main(void)'::`2'::X,struct my_allocator<struct `int __cdecl main(void)'::`2'::X> > size=32 align=8
```

# 結論
VisualStudioでstd::allocate_sharedを使用する場合はアライメントに注意した方が良い。
Qt Quickで折れ線グラフ

# はじめに
このエントリは[Qt Advent Calendar 2017](https://qiita.com/advent-calendar/2017/qt)の一日目の記事です。
今回は、動的なデータに合わせて折れ線グラフを更新するという想定で、QMLのCanvasで描いた場合とQQuickPaintedItemを継承してQPainterで描いた場合とを比較してみました。
大きな要素としては以下の3つです。

- なんとなくLive Coding的な仕組み
- QMLのCanvasで折れ線グラフを描く
- QQuickPaintedItemを継承して折れ線グラフを描く

コードは全て[GitHubにあげてあります](https://github.com/Atsushi4/qml_canvas_chart_example)。

### 前提
- データは8系列、各系列300点データ
- 各系列は0～30の範囲で推移
- エラー処理などは入っていません
- マジックナンバー多め

# なんとなくLive Coding的な仕組み
QML変更して動作確認、というサイクルを繰り返すことになると思ったので、QMLファイルを更新したら自動で再読み込みする仕組みを先に作っておきました。これはmain.cppに書いてあります。

[1] 指定したルートディレクトリから再帰的に辿って見つかったqmlとjsファイルをQFileSystemWatcherで監視して、変更が見つかったら再読み込みさせています。

Windowsでは変更直後に再読み込みすると失敗することがあったのでSleepを入れています。また2回目以降のfileChangedシグナルが出なかったので毎回addPathしなおしています。
シャドウビルドOFFの前提でQMLのパスを書いてあります。

# QMLのCanvasで折れ線グラフを描く
[2] Chart1.qmlのCanvas.onPaintでガリガリと描いています。getContextでContext2Dインスタンスを取得して、strokeStyleとlineWidthで色と線幅を指定し、beginPath, moveTo, lineToでpathを作ってstrokeで描画する流れです。

# QQuickPaintedItemを継承して折れ線グラフを描く
[3] QQuickPaintedItemを継承したQPainterChartクラスを作り、paint関数を上書きしてこの中で折れ線グラフを描いています。
[4] main関数でQML側にこのクラスを登録しています。
[5] 登録した型をChart2.qmlで使用しています。

※ 始めはQPainterChartのchartDataプロパティをQList&lt;QList&lt;int&gt;&gt;型にしていてQMLからセットされずに悩んでいました。QMLから受ける時はQVariantListなんですね。

# 比較
手元の環境（Windows10 + Qt5.9.1MSVC）では、10fpsでQQuickPaintedItemで描くとCPU使用率15%前後、Canvasで描くと9%前後という結果になりました。QPainterで描く方が速いのかと思っていたので意外でした。
awkに関するメモ

# awk

## ■ 特徴

* Cに近い
* 高速
* awkだけで、処理を実装可能

---

## ■ 基本構文
awk パターン {アクション}'

```
cat text.txt | awk 'NR <= 4 && NR >=1 {value="test"; print $1}'

※ アクションがない場合は、そのまま表示
echo 100 | awk 1

```

---

## ■ 真偽値

* 0 : False
* 空文字 : False
* 上記以外 : True

```
* TRUEの場合
# echo 100 | awk 1
100

* FALSEの場合
# echo 100 | awk 0
```

代入を行う際は、戻り値が左辺値になることに注意が必要。


```
※ 第２文字列を空文字にする処理
※ 戻り値は, $2になるので、$2がFalseだと表示されない
# echo "a b c" | awk '$2 = ""'

# echo "a b c" | awk '!($2 = "")'
a c
```

---

## ■ 組み込み変数

* NF : フィルード(列)の数
* NR : レコード(行)の数
* FS : フィールドの区切り文字 (デフォルトは空白)
* RS : レコードの区切り文字 (デフォルトは改行)
* OFS : 出力するときのフィールドの区切り文字 (デフォルトは空白)
* ORS : 出力するときのレコードの区切り文字 (デフォルトは改行)

---

## ■ 組み込み関数

* substr(対象文字列, 切り出し開始文字位置, 切り出す文字数)
* sub(置換対象文字列, 置換後文字列, 対象文字列)
  => 最初に検索にヒットした文字だけ
* gsub(置換対象文字列, 置換後文字列, 対象文字列)
  => 検索にヒットした文字全て
* index(文字列, 検索文字) => 検索文字位置
* match(文字列, 正規表現) => 真偽値
  => RSTART : マッチした文字位置
  => RLENGTH : マッチした文字数

* split() : 文字列から配列を作る、配列数を返す
* patsplit() : パターンを指定して配列を作成
* length(配列) => 配列の数


* printf

```
echo "1 2 3"  | awk '{var = $2; printf("test %s test", var);}'
```

* sprintf : 文字列を結合する

```
echo "1 2 3"  | awk '{var = $2; string=sprintf("test %s test", var); print string}'

```

* fork : 並列処理

```
@load "fork";

BEGIN {
    for (i = 1; i <= 3; i++) {
         pid = fork();

        # pid が 0 なら子プロセス
        if (pid == 0) {
            for (j = 1; j < 3; j++) {
                print i j
            }
        }

    }
}
```

---

## ■ 正規表現

パターンを/で囲む。

```
ps aux  | awk '/.+sh/ { print $0 }'
```

---

## ■ スイッチ

```
※ NR = 1でTrueに、NR = 5でFalseni
NR == 1, NR == 5
```

---

## ■ 計算

2進数で表現できない数値は計算する際に誤差がでる場合もある

70.21 * 100 = 7021にならないケースがある

---

## ■ 乱数

```
awk '{ srand('"$RANDOM"'); print rand() }'
```

---

## ■ 繰り返し文

```
awk 'BEGIN {for (i = 1; i <= 5; i++) print i;}'
```

## ■ 参考サイト

* https://www.gnu.org/software/gawk/manual/gawk.html
* http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_toc.html
* https://qiita.com/tofu511/items/3ecf9c5361d08b5c6eae
Grove Piで光量の取得エラー。ファームウェアのアップデートで解決

# 概要(2017年11月29日時点の手順)
Grove Piとは、Raspberry Pi向けの拡張ボード。
これを使うことで、はんだ付けをしなくても簡単に電子工作が楽しめる。

開発者向けに、Grove Piの開発元であるDexter Industriesはライブラリを提供している。
[github.com/DexterInd/GrovePi](https://github.com/DexterInd/GrovePi)

今回はRaspberry Pi 3 Model BにGrove Piの光量センサーを挿して、上記ライブラリのlight_sensor.pyを実行し光量を取得しようとした。
すると、このようなエラーが発生した。

```
sensor_value = grovepi.analogRead(light_sensor)  
File “/home/pi/Documents/roedi/Python/grovepi.py”, line 227, in analogRead  
return number[1] * 256 + number[2]  
TypeError: ‘int’ object is not subscriptable 
```

# 解決策
以下の手順でGrovePiのファームウェアをアップデートしたら、エラーが解消され光量の取得に成功した。

1. `cd /home/pi/Desktop/GrovePi/Firmware`

2. `sudo chmod +x firmware_update.sh`

3. `sudo ./firmware_update.sh`

# 参考文献
[Updating the Firmware](https://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/updating-firmware/) - Dexter Industriesによるファームウェアアップデートの手順解説

# 追記
PINTOさんが、2018.04.25時点では本記事での手順が通用しないことを報告してくださった。

>残念ながらこちらにまとめてくださっている手順は現時点では成功しなかった。
a-r-iさんの記事
Grove Piで光量の取得エラー。ファームウェアのアップデートで解決

同氏がまとめてくださった2018.04.25時点のファームウェアアップデート手順は、こちら
[GrovePi+ のファームウェアアップデート手順](https://qiita.com/PINTO/items/15361ccad06af68413c8)
[swift][線形代数]3次元ベクトルの加算

<p>Accelerate Frameworkで行列計算を行うのはBLASというAPIを利用することになるのだが、これが古くからの伝統にのっとったもので使いにくい。そこで、Cocoaで扱いやすくするためにla_object_t という型が用意されている。今回はこれの使い方を試してみるのと、まずは基本的な演算に挑戦する。</p>

<p>XとYという3次元ベクトルを用意する。まずは値のバッファ。</p>

<pre><code>let vecXBuf: [Double] = [20.0, 30.0, 40.0]
let vecYBuf: [Double] = [15.0, 10.0, 5.0]
</code></pre>

<p>これを3行1列の行列として生成する。</p>

<pre><code>let vecX = la_matrix_from_double_buffer(vecXBuf, 3, 1, 1,la_hint_t(LA_NO_HINT), la_attribute_t(LA_DEFAULT_ATTRIBUTES))
let vecY = la_matrix_from_double_buffer(vecYBuf, 3, 1, 1,la_hint_t(LA_NO_HINT), la_attribute_t(LA_DEFAULT_ATTRIBUTES))
</code></pre>

<p>これを足してみる。</p>

<pre><code>et vecZ = la_sum(vecX, vecY)
print(vecZ.matrixDescription)
</code></pre>

<p>以下の結果となった。</p>

<pre><code>35.0 
40.0 
45.0 
</code></pre>

関連情報
<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 />
Ruby on Rails ページ表示までやってみた

# Ruby on Railsd ローカルで表示までやってみた

Ruby on Rails　巷で騒がれている、勢いとどまるところ知らずだ、

なのでやってみた、

mac デフォでインストールされてるものを確認してみる

```
$ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
```

rubyのバージョンやらrails のバージョンをワインライナーで設定してくれる便利ツールを入れます。

rbenv
```
$ brew install rbenv
$ brew install ruby-build
```

これを入れと簡単にバージョンを切り替える事ができらしいっす、、、、

rbenv のホームディレクトリーに隠しフォルダー的にフォルダーを作成、

```
$ mkdir .rbenv
```

```
$ vi ~/.bashrc

##下記を追加
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

インストールできるrubyのバージョンを全て列挙できるらしいっす、、、

```
$ rbenv install -l
```

```
Available versions:
  1.8.5-p52
  1.8.5-p113
  1.8.5-p114
  1.8.5-p115
  1.8.5-p231
  1.8.6
  1.8.6-p36
  1.8.6-p110
  1.8.6-p111
  1.8.6-p114
  1.8.6-p230
  1.8.6-p286
  1.8.6-p287
  1.8.6-p368
  1.8.6-p369
  1.8.6-p383
  1.8.6-p388
  any....
  any...
  any..
  any.
```

rails が動作する最小バージョンは2.2.2らしいっす、、、、

なのでインストールします。

```
rbenv install 2.2.2
```

変更した設定が反映されるらしいっす

```
rbenv rehash
```

```
rbenv global 2.2.2
```

上記二つを実行すると反映されます。

```
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin16]
```
これでRubyは準備完了

```
$ RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.1.2
```
rails インストール

```
gem install rails --version="4.2.0"
```

```
$ rbenv rehash
$ rails -v
Rails 4.2.0
```

開発したいディレクトリーにて
下記実行

```
$ rails new stu
```

作成したrails アプリのディレクトリーに移動するらしいっす、、、

```
$ cd stu/
```

```
$ bundle install --path ./vendor/bundle
```
これでProjectディレクトリ配下のvendor/bundleディレクトリ内にgemがインストールされるようになるらしいっす

```
$ bundle exec rails s
```

上記でブラウザーで確認できます。
http://127.0.0.1:3000/

完了です、

やっつけです

これからやってみます。

cake phpに似てるかも
Ruby｜REx　eラーニングサービスはじめました


## はじめに

Tipsでもなんでもありません。たんなる宣伝です:smile:

Ruby技術者認定試験のeラーニングサービスを始めました。REx（レックス）といいます。
https://rex.libertyfish.co.jp

Githubのアカウントがあれば簡単に始めることが出来ます:tada:


## きっかけ

保守ばっかりやっているとつまらないので、自分の知識の棚卸しをかねていちから作ってみたかったので:smile:

## 新しいチャレンジ

このサービスは管理画面はありません。いまのところは。

おそらく私だけだと思いますが、サービスを作る場合に管理画面から作り始めて
フロントはもう疲れ果てているケースが多いです:sweat:
eラーニングはどうしても作りたかったのでフロントから作り始めました。

で、肝心の問題なのですがどうやって管理しているかというとGithubでリポジトリを作って管理しています。
こうすることによるメリットは4つあります。

1. マークダウンのプレビュー機能を作らなくていい
2. 検索機能をつくらなくていい
3. PRレビュー機能をそのまま使える
4. 管理ページは見せないなど権限チェックを作らなくていい

できるだけミスが無いように問題を提供しようと思っていますので、
GithubのPRレビュー機能をそのまま使えるのはありがたいです:smile:

デメリットも2つあります。

1. 問題ごとの識別子が振れない
2. テーブルの親子の構造を表現できない

これらをどうやってクリアしたのか話していこうと思います。

## 識別子をどう振る問題

識別子はUUIDを利用するようにしました。UUIDが衝突する可能性はかなり低いのでPRがじゃんじゃん来てもコンフリクトが起きる心配が減りました:tada:

参考：https://qiita.com/ta_ta_ta_miya/items/1f8f71db3c1bf2dfb7ea

## テーブルの親子構造をどうする問題

テーブルの親子構造はファイルを分けることで実現しました！


![スクリーンショット 2017-11-29 0.14.57.png](https://qiita-image-store.s3.amazonaws.com/0/137044/c57d6824-8db7-0cd5-ca60-8f1f55786b1d.png "スクリーンショット 2017-11-29 0.14.57.png")



キャプチャにあるファイルはそれぞれ役割を持っています。

- default.yml その問題はSiverかGoldか答えの選択肢はどれかを定義
- exam_masters_description.md 問題文
- exam_masters_question.md 解説
- option_masters_sentence_1.md 選択肢１
- option_masters_sentence_2.md 選択肢２
- option_masters_sentence_3.md 選択肢３
- option_masters_sentence_4.md 選択肢４

ファイル名にも意味があり次のようになっています。

- 親テーブル  
  `テーブル名_カラム名.md`
- 小テーブル  
  `テーブル名_カラム名_通し番号.md`

テーブルとカラムはファイル名をパース、どの問題の更新/新規なのかはディレクトリ名で判断と言う風になんちゃって管理画面を実現しました:tada:

## さいごに

Githubのリポジトリを管理画面として使ってみましたが目的に沿ってなかったりと銀の弾丸ではないと思います。むしろ管理画面で息切れしないための私だけの工夫ですが。。。:sunglasses: 

リリースすることが目標でしたので荒削りなところがありますが、
どうぞRExをよろしくです:bow:

https://rex.libertyfish.co.jp
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第十章 しなやかな設計7 閉じた操作

# これまでの第十章

- [序章](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) 
- [独立したクラス](https://qiita.com/YasuhiroKimesawa/items/ad710fd130fa1aee9df2)

# 閉じた操作

前回の[独立したクラス](https://qiita.com/YasuhiroKimesawa/items/ad710fd130fa1aee9df2)に続き、値オブジェクトのパターンです。

閉じた操作とは、引数と戻り値を同じ型にする、更にその型はその実装クラスと同じ型である操作を「閉じた操作」といいます。

その操作はすべてその型で簡潔しているので、クラス間の依存関係に関わらず変更に強い、操作が解釈しやすいコードになります。

値オブジェクトを設計する際には、閉じた操作にできないかを気にしながら設計するとよいですね。

# まとめ

７個のパターンを読んできました。

正直あまり、意識していなかったパターン、テストの書き方、値オブジェクトの設計パターンがありました。

> ソフトウェアを明白で、予測可能で、伝達力のあるものにすると、抽象化とカプセル化による効力が発揮される。(第三部第十章より)

基本的なオブジェクト指向の原則ですが、それをドメイン駆動設計と組み合わせて考えることで、より深い洞察へと向かうことができることがわかりました。

明日はしなやかな設計を行う上で、これらのテクニックの組み合わせる方法について読んでいきます。
Docker for Windowsでのエラー

# Docker for Windowsでのエラー

Docker for Windowsで以下のコマンドを実行すると、エラーが出るようになった。

```
$ docker ps
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
```

`docker-machine ls`などもアウト。

```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER   ERRORS
default            virtualbox   Timeout

$ docker-machine active
Error getting active host: timeout

$ eval $(docker-machine env default)
Error checking TLS connection: ssh command error:
command : ip addr show
err     : exit status 255
output  :
```

`docker -v`などは動く。


以下のサイトを参考にし、解決。

参考：http://acchi-muite-hoi.hatenablog.com/entry/2016/04/26/223559

## 1．Dockerマシンの再作成
Dockerマシン`default`を削除し、再作成する。
```
$ docker-machine rm default
$ docker-machine create default --driver virtualbox
```

## 2．環境変数を設定
```
$ eval` "$(docker-machine env default)"`
```
実行したら、以下のようなメッセージが出てきた。

```
$ eval` "$(docker-machine env default)"`
bash: export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\USERNAME\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env default): No such file or directory
```

最後の行、直接パスを指定？
言われるがまま実行。
```
$ eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env default)
```

これでうまくいきました。