OmniAICreator/Qiita-1.07M huggingface dataset:
#15 Remix(Browser-Solidity)をインストールする

ブロックチェーンの特性であるスマートコントラクトを構築し、デプロイするためのIDEであるRemixのインストール方法を記載します。

結構ハマりましたが、結論から言うと、
**バージョンを合わせる！、githubからクローンする!**
これに尽きます。

##1. Node.js、NPMのバージョンを合わせる
githubでインストールに成功したバージョンが記載されているので完全に合わせましょう。

成功したリストは以下リンクに沢山あります
https://travis-ci.org/ethereum/browser-solidity/builds

リンクの先のどれかの記載に沿ってバージョンを合わせます。
記事を書いている時点だと、以下のバージョンにしておきます。

$ node --version
v7.10.1
$ npm --version
4.2.0
$ nvm --version
0.33.8
![スクリーンショット 2018-01-04 4.22.20.png](https://qiita-image-store.s3.amazonaws.com/0/210201/9834f49c-e11c-8cc0-796d-22aa2d884da4.png)


##2 githubからクローンする

`git clone https://github.com/ethereum/browser-solidity`

クローンされたディレクトリへ移動
`cd browser-solidity`

`npm install`

##3　ローカルで立ち上げる
`npm start`

ブラウザで`http://127.0.0.1:8080`を開きます

##4　うまくいけば以下のようにRemixの画面が見えます
![スクリーンショット 2018-01-04 4.27.40.png](https://qiita-image-store.s3.amazonaws.com/0/210201/8269f738-a895-475c-ed26-b5999f1c8c77.png)

##参考
https://github.com/ethereum/browser-solidity

##Update 2018/1/6
新しく買ったMacbook proで敢えて一からインストールしたらハマったので、その時の備忘を追記しておきます。
https://github.com/npm/npm/issues/19525
「ラズパイマガジン2017年10月号の拡張ボードHATを作ろう」をやってみた

![undefined]()
ラズパイマガジンの2017年10月号の「拡張ボードHATを作ろう」の記事をやってみた


本の通りにやると図23の通りデバイスツリーソースをコンパイルしても図24のようにならなかった。spiが認識されていない

このことを出版社に問い合わせた。しかし返事は来たがわからないとのことだった

そのため自分で対策を立てることにした

3週間に渡るトライアンドエラーの結果ついに出来た

デバイスツリーソースを以下のようにするとspiが認識されdhtカーネルドライバが動くように出来た
図23のspiのfragmentのやり方がかなり間違っていることが分かった

 ```dht_hat.dts
/dts-v1/;

/ {
	compatible = "brcm,bcm2835", "brcm,bcm2836", "brcm,bcm2708", "brcm,bcm2709";

	fragment@0 {
		target-path = [2f 00];

		__overlay__ {

			dht11@0 {
				compatible = "dht11";
				pinctrl-names = "default";
				pinctrl-0 = <0x1>;
				gpios = <0xdeadbeef 0x4 0x0>;
				status = "okay";
				phandle = <0x2>;
			};
		};
	};

	fragment@1 {
		target = <0xdeadbeef>;

		__overlay__ {

			dht11_pins {
				brcm,pins = <0x4>;
				brcm,function = <0x0>;
				brcm,pull = <0x0>;
				phandle = <0x1>;
			};
		};
	};

	fragment@2 {                 //spi0有効
		target = <0xdeadbeef>;

		__overlay__ {
			cs-gpios = <0x0 0x0>;
			status = "okay";
		};
	};

	fragment@3 {                //spi0有効
		target = <0xdeadbeef>;

		__overlay__ {
			brcm,pins = <0x8 0x7>;
			brcm,function = <0x4>;
		};
	};

	__overrides__ {
		gpiopin = <0x1 0x6272636d 0x2c70696e 0x733a3000 0x2 0x6770696f 0x733a3400>;
	};

	__symbols__ {
		dht11 = "/fragment@0/__overlay__/dht11@0";
		dht11_pins = "/fragment@1/__overlay__/dht11_pins";
	};

	__local_fixups__ {

		fragment@0 {
			__overlay__ {
				dht11@0 {
					pinctrl-0 = <0x0>;
				};
			};
		};

		__overrides__ {
			gpiopin = <0x0 0x10>;
		};
	};

	__fixups__ {
		gpio = "/fragment@0/__overlay__/dht11@0:gpios:0", "/fragment@1:target:0";
		spi0 = "/fragment@2:target:0";
		spi0_cs_pins = "/fragment@3:target:0";//spi0有効
	};
};

```
![hat.jpg](https://qiita-image-store.s3.amazonaws.com/0/190551/d466701a-7b88-c552-6161-1e8c725ec903.jpeg)
buffaloのnasからデータを救出する

#背景
容量/価格だけを重視して購入したNASである
buffalo LS210D（２TB、2015年製）が見事に操作不能に陥りました。

Amazonでの購入から約2年間、
主にwindows、mac、androidで使用しており
当然大きな声で言えないような大切なファイルも多数格納しておりました。

端末からNASへのアクセスが極端に遅くなり、
それに気づいた時点でwindowsのrobocopyなどで救出を試みるも
遂にネットワーク経由ではアクセスができなくなり
６００GBほどのデータが取り残されてしまいました。

似た状況で困られている方がおられると思うので
LS210DからHDDを取り出してデータを救出した方法をご紹介します。


#１.NASケースを物理的に破壊してディスクを取り出す
LS210Dには東芝製のハードディスクが採用されています。
筐体を壊してこれを取り出します。

筐体を壊すのは雑でも良いですが、
ハードディスクを取り出す際にはSATAの端子部分に傷をつけないように注意しましょう。

#2.PCに接続する
取り出したハードディスクのSATAをUSBに変換してPCに接続します。
私はこちらの変換ケーブルを使用しました。
　　Inateck SATA - USB3.0変換ケーブル 
　　http://amzn.asia/2vIEip7

#3.ubuntuでデータを救出する
変換ケーブルを使ってNASとPCが接続できても、
buffaloのNASのデータ保存形式はext4ですので、
windowsではデータの操作ができません。

そこでデータの読み出しにubuntuを使用します。
私はデュアルブートのubuntuを使用して
windowsで使用しているexfat形式のHDDにデータをコピーしました。
（わざわざこのためだけにデュアルブートにしたくない方は、
ubuntuOSのインストールDVDを作成し、BIOSの起動ディスクに設定し、
try ubuntuすれば同様のことが可能です。）

デフォルトのubuntuではexfat形式を操作できないので
次のコマンドでexfatを読めるようにします。

```shell:ubuntu
sudo apt-get install exfat-fuse exfat-utils
```

後はドラッグ＆ドロップでファイルを移せば救出完了です。

諦めず試してみましょう。
マークダウン記法の基本

初めての投稿です。
何を投稿しようか迷った結果、投稿するにあたって書かなければならないマークダウン記法についてまとめようかなと思いました。
参考：[Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)

## 目次
- 見出し
- 箇条書き
- 番号付き箇条書き
- code記法
- 引用
- 水平線
- リンク

## 見出し
1個から6個の `#` で始めることで見出しの大きさを指定できる。

### 記述方法
`###(半角スペース)見出し`

### 記述例
```
# 見出し
## 見出し
### 見出し
#### 見出し
##### 見出し
###### 見出し
```

### 表示例    
# 見出し
## 見出し
### 見出し
#### 見出し
##### 見出し
###### 見出し

## 箇条書き
ハイフン、プラス、アスタリスクのどれか一つを文頭に置くことで記述可能。
それぞれの記号はグループ化されるらしく、複数の記号を使用するとグループ間にスペースを入れることが出来る。

### 記述方法
`{+,-,*}(半角スペース)記述する文字列`

### 記述例
```
- 記述その１
    - 記述その１の１
        - 記述その１の１の１
- 記述その２
- 記述その３
* 記述その４
* 記述その５
+ 記述その６
+ 記述その７
```

### 表示例
- 記述その１
    - 記述その１の１
        - 記述その１の１の１
- 記述その２
- 記述その３
* 記述その４
* 記述その５
+ 記述その６
+ 記述その７

## 番号付き箇条書き
数字+ドットを文の先頭に置くことによって記述可能。数字は何でもいいっぽい。

### 記述方法
`[数字].(半角スぺース)記述する文字列`

### 記述例
```
1. 記述その１
2. 記述その２
1. 記述その３
    1. 記述その４
    1. 記述その５
```

### 表示例
1. 記述その１
2. 記述その２
1. 記述その３
    1. 記述その４
    1. 記述その５

## code記法
文の一部をハイライトするときに用いる。
バッククォート`` ` ``で文字列を囲むことで記述可能。
バッククォート自体をハイライトしたい場合は、ハイライトするバッククォートの数よりも多いバッククォートで囲むとよい。

### 記述方法
`` `ハイライトする文字列`  ``

### 記述例
```
` Hello World!! `
`` `<-これはバッククォートといいます。 ``
```

### 表示例
このコードを実行すると` Hello World!! `という文章が表示されるでしょう。
私も最近知りましたが　`` ` ``<-これはバッククォートというらしいです。

## コンソール表示
この記事の「記述例」のように背景を暗くしてコンソールのように表示してくれるものです。

### 記述例
```
/```←バッククォート3つで始めて（/はコンソール表示として認識させないためです。）
文字列文字列文字列
/```←バッククォート3つで締める
```

### 表示例
```
文字列文字列文字列（/を無くしたバージョン）
```

## 引用
`「>」`を文頭に置くことで記述可能。
引用文を明確に表したい場合に使用する。

### 記述方法
`>(半角スペース)引用文`

### 記述例
```
> 引用文１  
> 引用文２  
> 引用文３  
> 引用文４
```

### 表示例
> 引用文１  
> 引用文２  
> 引用文３  
> 引用文４

## 水平線
複数の記事や内容を区切るときに用いる。
`*`や`_`、`-`を三つ以上並べて書くことで記述可能。

### 記述方法
`{ *** , ___ , --- }`

### 記述例
```
***
___
---

* * *

_   _   _
```

### 表示例
***
___
---

* * *

_   _   _

## リンク
別のサイトへのリンクを載せたいときに用いる。
[表示文字]+(URL)で記述可能。

### 記述方法
` [表示文字](URL) `

### 記述例
```
[Google](https://www.google.co.jp/)
```

### 表示例
[Google](https://www.google.co.jp/)
Swiperのページ遷移ボタンをスライダーの横に出す&デザイン変更とか

## 概要
Swiperのswiper-buttonを横に出すのに少しハマったのでメモ。
環境 : Swiper 3.4.0

- ノーマルなやつ

```html
<div class="swiper-container">
  <div class="swiper-wrapper">
      <div class="swiper-slide"></div>
      <div class="swiper-slide"></div>
      <div class="swiper-slide"></div>
  </div>
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>  
</div>
```  

```css
.swiper-container{
  width: 700px;
  height: 220px;
  margin: 100px 100px 0;
  padding: 10px;
  border: 1px solid #ccc;
}
.swiper-slide{
  background: red;
}
```

![スクリーンショット 2018-01-04 2.22.02.png](https://qiita-image-store.s3.amazonaws.com/0/165193/1e33e1bb-bd37-8870-4c62-4e27550ad3ac.png)
以下jsは共通。

- 横に出したやつ  
コツはswiper-button-hogeをswiper-containerと並べるとこ？

```html
<div class="swiper-custom-parent">
  <div class="swiper-container">
    <div class="swiper-wrapper">
        <div class="swiper-slide"></div>
        <div class="swiper-slide"></div>
        <div class="swiper-slide"></div>
    </div>
  </div>
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>  
</div>
```

```css
.swiper-custom-parent{
  border: 1px solid #ccc;
  margin: 100px 100px 0;
  width: 800px;
  position: relative;
}
.swiper-container{
  width: 700px;
  height: 220px;
  padding: 10px;
}
.swiper-slide{
  background: red;
}
```
```javascript
var swiper1 = new Swiper ('.swiper-container', {
  loop: true,
  nextButton: '.swiper-button-next',
  prevButton: '.swiper-button-prev',
  centeredSlides: true,
  paginationClickable: true,
  slidesPerView: 3,
  spaceBetween: 20,
});
```

![スクリーンショット 2018-01-04 2.28.19.png](https://qiita-image-store.s3.amazonaws.com/0/165193/551aa523-cfb3-39ca-4aab-56947a843708.png)

- ついでにFontAwesomeボタンのデザイン変更とか  
swiper-button-hoge以外のclassをボタンにしようとするとスライドしなくなっちゃうので注意。

```html
<div class="swiper-custom-parent">
  <div class="swiper-container">
    <div class="swiper-wrapper">
        <div class="swiper-slide"></div>
        <div class="swiper-slide"></div>
        <div class="swiper-slide"></div>
    </div>
  </div>
  <div class="swiper-button-prev swiper-custom-button">
    <i class="fa fa-angle-left"></i>
  </div>
  <div class="swiper-button-next swiper-custom-button">
    <i class="fa fa-angle-right"></i>
  </div>  
</div>
```

```css
.swiper-custom-parent{
  border: 1px solid #ccc;
  margin: 100px 100px 0;
  width: 800px;
  position: relative;
}
.swiper-container{
  width: 700px;
  height: 220px;
  padding: 10px;
}
.swiper-slide{
  background: red;
}
.swiper-custom-button{
  background-image: none !important;
  background: blue;
  color: white;
  font-size: 36px;
  text-align: center;
  width: 24px !important;
  height: 64px !important;
  line-height: 64px;
}
.swiper-custom-button .fa{
  line-height: 62px;
}
```

![スクリーンショット 2018-01-04 2.44.10.png](https://qiita-image-store.s3.amazonaws.com/0/165193/78851181-16c7-1e25-30b5-12c6d43141bb.png)
Google Home miniを用いてEvernoteにメモを追加

<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/3d887345-fdec-5415-86a9-108261b45689.jpeg" height=200px>
Google Home mini買ったけど、あまり使う機会もなくて。
ただ、プログラミング書いてカスタマイズする気力もなくて。

IFTTTというサービスを利用すれば、プログラミングせずに新機能を追加できます。
やり方を覚えれば5分程度で設定できます。
今回はEvernoteにノートを追加する機能を追加したので紹介します。

### 概要

今回はGoogle Home miniに「Evernoteに〇〇を追加」と言ったら、ノートブック「memo_google」にタイトル「Google追加リスト」というノート内容に「〇〇」追加を行い、Google Home miniが「Evernoteに〇〇を追加しました」と返事する機能を作る。

まずは用いるサービスについて説明を下記に。

#### IFTTT

<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/6215f3c1-5a76-c0fb-4706-6be714ceb2d7.png" width=200px>

イフト。IF This Then That。iOS・Androidアプリ。
「thisをトリガーにthatを実行」というルール設定（Applet）を行う。
今回であれば、下記のように設定する。
- 「this」に「Google Assistant」を設定
- 「that」に「Evernote」を設定

#### Google Assistant

<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/33c73fca-809c-1442-89e6-66da0c3793a3.png" width=200px>

GoogleのAIアシスタント。iOS・Androidアプリ。
Google Home miniに入力された音声は、まずGoogle Assistantに送られる。
そして、音声の解析を行う。解析された結果、別サービスに指示が送られる。

#### Evernote

<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/9281e61f-5f0a-49fd-ad3e-5c540647065a.png" width=200px>

ノートを取るように情報を蓄積するソフトウェア・ウェブサービス。
アプリとしても利用可能。
ノートブックの中に複数のノートを格納できる。
詳しくは[公式ページ](https://evernote.com/)にて。

### 手順

概要は、IFTTTにGoogle AssistantとEvernoteを繋いであげて、IFTTT内で今回作成する機能を設定、です。細かい手順は下記に記載。

1. IFTTTをインストール。AppStoreかGooglePlayにて。
2. IFTTT内にてGoogle Assistantと接続。検索>Google Assistant>Connect>login。
3. IFTTT内にてEvernoteと接続。検索>Evernote>Connect>login。
4. Appletを追加。My Appletsタブ>プラスボタン。
5. thisを設定開始。
6. thisにGoogle Assistantを設定。検索>Google Assistant。今回は `Say a phrase with a text ingredient` を利用。

<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/fea44a11-8674-ddaa-5d47-6f55cb5a2a2a.png" width=200px>
7. Google Assistantの設定。
<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/60fac1e1-2d06-21a5-fe80-a2dece15bd7c.png" width=200px>
8. thatにEvernoteを設定。検索>Evernote。今回は `Append a to-do to note` を利用。

<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/5ccdaaf5-a14c-f7b8-9401-448a9c0d1647.png" width=200px>
9. Evernoteの設定。

<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/f6dfcc01-1d0b-035c-b170-fc5078d0f880.png" width=200px>
10. Next>設定完了。

### 実際に試してみる

Google Home miniに、
「ok google, Evernoteにシャンプーを買うを追加」と言ってみると、
「Evernoteにシャンプーを買うを追加しました」と返事が。
Evernoteを見てみると、下記のようにちゃんと追加されていた。

<img src="https://qiita-image-store.s3.amazonaws.com/0/136401/89bc4b3e-198e-84ce-ef57-09c29164c729.png" height=200px>

### まとめ

本当に設定が簡単。これならプログラミングやったことない人にも薦められます。
ただやってみると、「Google追加リスト」というノートが複数作られてしまって、1つのノートにtodoをたくさん追加、はできませんでした。どうにかできないかなっと思った次第です。
今度は実際にサーバを立てて、何か作りたいと思います。
Zaif APIを使って取引履歴を取得する

時期的に必要になったので作った

# コード
```python:get_zaif_api.py
import json
import hmac
import hashlib
import requests
from future.moves.urllib.parse import urlencode
from datetime import datetime
import time
  
secret = 'your secret key'
key = 'your key'
get_from = 0

fw = open('zaif_trade_btc-jpy.csv','w')
fw.write('date,currency_pair,action,price,amount,total,fee\n')

while True:
  nonce = int(datetime.now().strftime('%s'))

  params = {
    'method': 'trade_history',
    'nonce':nonce,
    'from': get_from,
    'currency_pair': 'btc_jpy', #bch-jpy, bch-btc
    'count':1000
  }
  encoded_params = urlencode(params)
  signature = hmac.new(bytearray(secret.encode('utf-8')), digestmod=hashlib.sha512)
  signature.update(encoded_params.encode('utf-8'))
  headers = {
    'key': key,
    'sign': signature.hexdigest()
  }
  
  response = requests.post('https://api.zaif.jp/tapi', data=encoded_params, headers=headers)
  if response.status_code != 200:
  	raise Exception('return status code is {}'.format(response.status_code))
  
  data = json.loads(response.text)

  if not len(data['return']):
    break

  for order_id, history in sorted(data['return'].items(),key=lambda x:x[1]['timestamp'],reverse=True):
    date = datetime.fromtimestamp(float(history['timestamp'])).strftime('%Y-%m-%d %H:%M:%S')
    pair = history['currency_pair']
    action = 'buy' if history['action'] == 'bid' else 'sell'
    total = history['price'] * history['amount']

    try:
      fee = history['fee'] - history['bonus'] # btc-jpy
    except:
      fee = history['fee_amount'] # bch-jpy, bch-btcで動作確認

    print date, pair, action, history['price'], history['amount'], total, fee
    fw.write('{},{},{},{},{},{},{}\n'.format(date, pair, action, history['price'], history['amount'], total, fee))

  get_from += len(data['return'])
  print get_from # 1 loopでの取得数を出力
  time.sleep(3)

fw.close()
```

# 実行結果
下記のフォーマットで全期間の取引履歴を出力する

```csv:zaif_trade_btc-jpy.csv
date,currency_pair,action,price,amount,total,fee
2017-12-18 23:10:50,btc_jpy,sell,2150005.0,0.206,442901.03,-200.0
2017-12-17 07:08:57,btc_jpy,buy,2224000.0,0.2,444800.0,-44.4
2017-12-17 07:08:55,btc_jpy,sell,2224400.0,0.25,556100.0,-200.0
2017-12-17 07:06:03,btc_jpy,sell,2222505.0,0.2,444501.0,-200.0
2017-12-17 07:03:20,btc_jpy,sell,2228000.0,0.009,20052.0,-10.0
...
```

### 参考
- http://techbureau-api-document.readthedocs.io/ja/latest/trade/3_how_to_implement/1_python.html
- http://techbureau-api-document.readthedocs.io/ja/latest/trade/2_individual/5_trade_history.html
- https://www.enigma.co.jp/media/page-16728/
Mac上のVirtualBox Win10でJISキーボードをUS配列で使って英数かなキーも有効にする

とてもタイトルが長くなってしまいましたが、
これと同じことをやっているドンピシャ記事はなく、
意外と設定に苦労したので書いておきます。

## TL;DR
* 英数・かなキーの設定は、Karabiner-Elements使ってこの記事の通りにすればOK<br>
[JISキーボードMacbookのWindows(VirtualBox)でも`かな`キーと`英数`キーでIME on/off する](https://qiita.com/takas-ho/items/7f3a5f922a26e1fa603e)
* MacでJANSIなど使ってUS配列にしててもVBoxのWinでは無視される
* Win標準機能でUS配列(英語101/102キー)にすると英数・かなキーが無効になるのでNG
* AutoHotkeyをインストールして以下の設定ファイルを作ってダブルクリック起動orスタートアップに登録

```autohotkey:keymap.ahk
#UseHook

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 1段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +2::Send,{@}       ; Shift + 2         ["] -> @
 +6::Send,{^}       ; Shift + 6         [&] -> ^
 +7::Send,{&}       ; Shift + 7         ['] -> &
 +8::Send,{*}       ; Shift + 8         [(] -> *
 +9::Send,{(}       ; Shift + 9         [)] -> (
 +0::Send,{)}       ; Shift + 0         [ ] -> )
 +-::Send,{_}       ; Shift + -         [=] -> _
 ^::Send,{=}        ;                   [^] -> =
 +^::Send,{+}       ; Shift + ^         [~] -> +
 \::Send,{``}       ;                   [\] -> `
 +\::Send,{~}       ; Shift + \         [|] -> ~

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 2段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 @::[              ;                   [@] -> [
 +@::{             ; Shift + @         [`] -> {
 [::]              ;                   [[] -> ]
 +[::Send,{}}      ; Shift + [         [{] -> }

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 3段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;::Send,{:}      ; Shift + ;         [+] -> :
 :::Send,{'}       ;                   [:] -> '
 *::Send,{"}       ; Shift + :         [*] -> "
 ]::Send,{\}       ;                   []] -> \
 +]::Send,{|}      ; Shift + ]         [}] -> |
```

## そもそもの僕の環境

MacBook Proに外付けUSキーボード([Matias Ergo Pro for Mac](https://www.diatec.co.jp/products/det.php?prod_c=1912))を付けて、
Karabiner-ElementsでCommandキーを英数かなキーとして使いつつ、
本体キーボードはあえてJISを選んでJANSI使ってUS配列で使ってます。

普通のUSキーボードは左右Commandキーの位置が外側すぎて、
押すときに親指をすごく深く折り曲げないといけないので辛いんです。
でもそれ以外のキー配列はUS配列の方が好きなのです。

Matiasは、分離キーボードとして非常に使ってて楽ですし、
何よりスペースバーが短めで、Commandキーがスッと打てる。これならOK！
でもMacBook ProのUS配列はCommand外側すぎるので、
本体はJIS配列にしてソフトウェア的にUS配列に直すことで、
英数かなキーの恩恵も受けられるというわけなのです。

そのMacにVirtualBoxで構築したWindows10で同じようにしようとすると、
なかなか一筋縄では行かなかったのであります。

## 詳しい解説
めんどくさくなったので省略w

## 参考サイト
* [Windows10へAutoHotkeyの導入（キーマップの変更）
](https://qiita.com/chr/items/47f50e36703d3bb20371)
* [AutohotkeyでJIS配列をUS配列化して使ってる](http://d.hatena.ne.jp/gnarl/20090429/1240996300)
    * 設定ファイルはこの記事のを自分好みに書き換えたものです。

## 参考にしないほうが良いサイト
レジストリ編集(ダークサイド)です。それなりに時間かけて試したけど失敗したのでやめました。AutoHotkeyのほうがフォースにバランスがもたらされるとジェダイは考えます。

* [日本語キーボードを US 配列で使いつつ、変換/無変換キーで IME ON/OFF](http://uchanote.blogspot.jp/2015/08/us-ime-onoff.html)
ubuntu16.04 : ホスト名を恒久的に変更する

```
sudo hostnamectl set-hostname <新しいhost名>
```
を実行すれば良いよう。
しかし、 `/etc/hosts` 等は変更されないようなので、
真面目に (検証以外)行う場合には、他にも変更すべき点がある。
VisualStudio 2019 ショートカットキー とか コードスニペットとか


windows 10 
VisualStudio2019 ショートカットキー覚書

## **ショートカット**
| １つ目 | ２つ目 |  効果  |
|:-----------|:------------|:------------:|
| Ctrl + W   |-      |  単語の選択 |
| Ctrl + K    |Ctrl + K      |  ブックマークをトグル(有効無効を切り替え)する      |
| Ctrl + K    |Ctrl + P      |  次のブックマークに飛ぶ |
| Ctrl + K    |Ctrl + W      | ブックマークウィンドを表示する      |
| Ctrl + K    |Ctrl + D      | ドキュメント(全体)をフォーマット|
| Ctrl + K    |Ctrl + F      | ドキュメント(選択範囲)をフォーマット|
| Ctrl + Shift + U    |-     | 選択した単語を大文字へ変換 |
| Ctrl + Shift + ↑    |-     | 選択中(カーソルがいる)単語に飛ぶ(上へ) |
| Ctrl + Shift + ↓    |-     | 選択中(カーソルがいる)単語に飛ぶ(下へ) |
| Ctrl + U    |-      | 選択した単語を小文字へ変換 |
| Ctrl + Alt + L    |-     | ソリューションエクスプローラーに移動|
| Ctrl + F4    |-     | ファイルを閉じる
| Ctrl + ,    |-     | ナビゲーションウィンドウを開く
| Alt + W + L    |-     | すべてのタブを閉じる
| F12    |-     | 定義へ飛ぶ
| Ctrl + -    |-     | 元のカーソル位置へ戻る(定義へ飛ぶのあとによく使う)
| ALT + F12    |-     | 定義をその場で表示
| シフト+ALT + ↓    |-     | マルチカーソル

<br>

## **コードスニペット**
VisualStudioでは入力後、tab を２度押下すると下記のコードが挿入される。
### cw
```csharp
Console.WriteLine();
```

### class
```csharp
class MyClass
{

 }
```
### ctor
```csharp
public Program ()
{

}
```
### prop
```csharp
public int MyProperty { get; set; }
```

### propfull
```csharp
private int myVar;

public int MyProperty
{
    get { return myVar; }
    set { myVar = value; }
}
```

### foreach
```csharp
foreach (var item in collection)
{

}
```
### for
```csharp
for (int i = 0; i < length; i++)
{

}
```
TITAN V で Lyra2REv2 をマイニングする(2018 年 1 月 3 日時点 104 MH/s @ 160W)

<img width="960" alt="Screen Shot 2017-12-30 at 17.15.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/cee058d1-3954-b697-0467-f1cf3f352d84.png">


漢なら TITAN V で Lyra2REv2(モナコイン, Verge)でマイニングしたいですね!

やりましょう!

(ZCash はこちら: https://qiita.com/syoyo/items/7bd2636ce15d29d33cc5 )

# 環境

* Ubuntu 16.04.3
* CUDA 9.1

# マイニングソフトウェア

ccminer を使いました.

ccminer はいろいろバージョンがあり, KlausT's ccminer が最新で良さげで試してみましたが, CUDA 9 環境で問題があったり, lyra2rev2 だと CPU validation error が出たりとでうまく動かなかったりあまり性能出ない(84 MH/s)でした.

https://github.com/KlausT/ccminer/issues/101

いくらか熟成必要ですね.

とりあえずは, 少し古いですが, 実績があり Lyra2REv2 の性能が相対的に少し良い Nanashi-Meiyo-Meijin

https://github.com/Nanashi-Meiyo-Meijin/ccminer

をベースに, 

https://github.com/KlausT/ccminer/issues/101

にあるように

```
cudaFuncSetAttribute(lyra2v2_gpu_hash_32_2, cudaFuncAttributePreferredSharedMemoryCarveout, 100);
```

を `lyra2v2_cpu_hash_32` に追加しました.

あとは CUDA 9 対応で equi/eqcuda.hpp にちょびっと修正

```
-#include <device_functions_decls.h>
+#include <device_functions.h>
```

と, `Makefile.am` に 

```
nvcc_ARCH  = -gencode=arch=compute_70,code=\"sm_70,compute_70\"
```

と compute 70 profile を追加しました.

## 結果

<img width="724" alt="Screen Shot 2018-01-04 at 1.10.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/13d17fce-6bab-14a3-e251-d8b7f5011e9c.png">

Voala!
`-i 24`(instensity 24) で 104 MH/s くらい出るようになりました.
(cudaFuncAttributePreferredSharedMemoryCarveout を設定しないと 94 MH/s くらいでした) 

消費電力は 150W くらいだったので, `nvidia-smi` で 160W に powerlimit しました.

GTX 1080 Ti だと 160W power limit で 58 Mh/s なので, TITAN V は二倍弱くらいの性能でしょうか.
 
TODO

* powerlimit なし(250W)でも消費電力 150W くらいなので, うまく kernel thread 数とか調整すればより性能でるはず. 
* KlausT ccminer あたりできちんと動くようにする.
ドメイン駆動設計的テスト戦略

# ドメイン駆動設計的テスト戦略

DDD本を読んでいると、ところどころでテストの話が出てきます。

今回は、ドメイン駆動設計において、テストをどう書くか。ということに焦点を当てて行きたいと思います。

## [前提]　ドメイン駆動設計は自動テスト必須
ドメイン駆動設計でのモデルは、イテレーションを通じて進化していくことが前提とされています。

ですので、アジャイルで開発することが期待されています。

アジャイルではスプリント期間中にテストを終わらせるため、テスト自動化に取り組む必要があります。
ドメイン駆動設計でも同様に、テスト自動化は必須のプラクティスとなります。

## モデルを実際に使うためのテスト

設計の意図が明らかになるように、型名・メソッド名・引数名などを正しい名前に揃えるという[**意図の明白なインターフェイス**](https://qiita.com/YasuhiroKimesawa/items/988ed817de9aac785633)。

意図の明白なインターフェイスを設計するためにテストを活用できます。

振る舞いを実装する前にテストを書いて**実際にモデルを使用してみる**ことで、モデルを利用する側の視点が得られ、意図の明白なインターフェースを見つけやすくなります。

## 値オブジェクトのテスト

値オブジェクトは基本、[副作用のない関数](https://qiita.com/YasuhiroKimesawa/items/a035d872d630eadeaffb)になります。

同じコマンドを同じように実行したら同じ値が返って来る関数が副作用のない関数。
なんども実行されるテストにとって、副作用のない関数は書きやすいですね。

さらに、[閉じたクラス](https://qiita.com/YasuhiroKimesawa/items/f79ab74d05bed015e1fb)を併用するともっと書きやすくなるでしょう。

## エンティティのテスト

どうしても副作用の出てしまう関数のテストをどうするかというと、**[表明](https://qiita.com/YasuhiroKimesawa/items/bc2c417c30ec79efce15)**を使います。Entityでどうしても状態を変更するときなどに使用します。

表明はテストで表現することもできます。

メソッドが取りうる条件と、テストで実行した結果が合っているかをテストで書いておくことで、表明としての事前条件と事後条件を表現することができます。それがドキュメントとして利用できるということですね。

## 境界のテストは超重要

ドメイン駆動設計において、コンテキストの境界を設置して、適切な大きさのモデル・チームでモデルを構成していくことが大事になってきます。

その境界間を統合するいくつかの戦略がありますが、[別々の道](https://qiita.com/YasuhiroKimesawa/items/259cff6e393d5d03e274)を選択しない限り、どの選択をしてもその統合は困難です。

境界の統合は[継続的な統合](https://qiita.com/YasuhiroKimesawa/items/6a58743c90c5b707c29d)を利用して統合します。

概念的な統合が重要ですが、技術的にCIを利用して、モデルの分裂に対して素早く警告する自動化されたテストが必要です。

### 共有カーネルを選択したときのテスト

統合に[共有カーネル](https://qiita.com/YasuhiroKimesawa/items/7895d8c28137bd34008a)を選択した場合は、頻繁に統合し、**境界の両側のテストが通ること**が大事です。

### 顧客/供給者の開発チームを選択したときのテスト

統合に[顧客/供給者の開発チーム](https://qiita.com/YasuhiroKimesawa/items/c9668a437499897fa9d5)を選択した場合は、**受け入れテストを共同で開発すること**が大事です。
開発したテストは上流側のテストスイートに追加し、継続的な統合の一部として実行されるようにします。

### 腐敗防止層を選択したときのテスト

統合に[腐敗防止層](https://qiita.com/YasuhiroKimesawa/items/bf22f7a970d5ee29a111)を選択した場合は、**腐敗防止層が、それ自体で複雑なソフトウェアになりえる**ことに注意します。

その分テストが大事になってきます。
Eclipseで簡単なバッチ処理の実行可能 jarファイルを作成する。

この記事は、Eclipse でバッチ処理を作成後、jarファイルを作成して、バッチ処理が動くようにする為の手順について、記載したものです。

まず、最初にやってみてうまくいかなかった方法を記載します。この方法で jar ファイルを作成しても、中途半端に動作するので、一瞬うまく動作しているのかと思いましたが、ジョブやタスクが実行されず、終了してしまいます。簡単な手順は以下になります。
(1) Eclipse のパッケージエクスプローラでプロジェクトを選択して、右クリックする。
(2) エクスポート->実行可能jarファイル->そのままウィザードを進めて、jarファイルを作成する。

出来上がったjarファイルを java -jar BatchTestApp.jar で実行してみます。
SPRINGは起動していますが、ジョブやタスクが処理されず、終了しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/82b20980-2a65-768a-c686-beaadbb1886d.png)


ここでも、いろいろ試行錯誤しましたが、どうやら jarファイルの作成方法が違っていたようです。
以下の手順で実行していきます。
(1) mvnw.cmd clean を実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/039b81c3-4951-cc04-3ccf-c7c148552513.png)

(2) mvnw.cmd package を実行します。
    pom.xml に記載されている jar ファイルがダウンロードされます。少し時間がかかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/8d1656ce-48b3-56dd-5a4b-5c62c8d5f352.png)

(3) mvnw.cmd package を実行します。
    targetディレクトリが作成されて、その中に pom.xml で定義されている、jarファイルが作成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/2535aef3-174d-4030-c218-3c49812282c0.png)

(4) java -jar BatchTestApp-0.0.1-SNAPSHOT.jar を実行します。
    今度は SPRING が起動した後、ジョブやタスクも正常に起動されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/157744/e43b041b-bbbe-0d93-c65c-7f83767b5ae1.png)
ターミナルをオシャンティにする

まえから憧れてたおしゃれで見やすいターミナル。

一度やろうとして色々必要なもののインストールはしたものの、**その後がよくわからず挫折していた。**

が、今日ついに実現した。
今後のために備忘録。

##こんな感じ
![terminal.gif](https://qiita-image-store.s3.amazonaws.com/0/181516/d11531d6-2fdc-835b-86fd-635ba3f48294.gif)

- 最低限の情報表示で画面が超スッキリ
- Tabで補完のみならず、候補から選択もできる
- .gitを検知してブランチを表示してくれる
- コマンドに色がつく（正しいコマンドは緑、間違ったコマンドは赤）
- とにかく見やすい
- そして見やすい

## 必要なもの
- iTerm2
- Homebrew
- zsh
- oh-my-zsh

各種インストール手順は[デザイナーが学ぶコマンドライン環境作り](https://qiita.com/imatomi/items/ef363355c0659f0bacb9#_reference-4c222c7a4d45f96fd2a6)を参考にするとよいかと。
ただし、Homebrew Caskの部分と、oh-my-zsh以下は無視していい。
それと、何かインストールした後は念のためターミナルを再起動しよう（または新しいウィンドウを開く）

## 手順
※必要なもののインストールは済んだ前提。

 .zshrcを編集し、テーマを設定（ここではrefinedを使用）
他のが使いたければ[こちら](https://github.com/robbyrussell/oh-my-zsh/wiki/External-themes)から

```bash:~/.zshrc
ZSH_THEME="refined"
```

コマンドに色を付ける（syntax highlighting）

```bash:~/
cd ~/.oh-my-zsh && git clone git://github.com/zsh-users/zsh-syntax-highlighting.git
```

```bash:~/.zshrc
source ~/.oh-my-zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
```

色はiTerm2の設定から調節できる。
(Preferences > Profiles > Colors)

## おまけ（Vimのsyntax highlighting）
![vim.gif](https://qiita-image-store.s3.amazonaws.com/0/181516/380e4e75-0a12-aefe-8bbf-530505a588fc.gif)

まずplug.vimを導入

```bash:~/
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \\n  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
```

.vimrcを作り、以下を記述して保存

```bash:~/.vimrc
call plug#begin('~/.vim/plugged')
Plug 'nightsense/stellarized'
call plug#end()

colorscheme stellarized_dark

syntax on
```

Vimを再起動して、以下を実行

```vim:vim
:PlugUpdate
```
---
ちなみに、最低

```bash:~/.vimrc
syntax on
```
これだけでもsyntax highlightはされるようになる。
でもカスタマイズしたいじゃん？

##あとがき
どうやら[oh-my-zshよりPreztoの方がいい](https://qiita.com/b4b4r07/items/875235f6122a6d779306)かもしれないらしい（今更）
要調査。
##参考リンク
[Badassify your terminal and shell](http://jilles.me/badassify-your-terminal-and-shell/)
[お前らのターミナルはダサい](https://qiita.com/kinchiki/items/57e9391128d07819c321)
[デザイナーが学ぶコマンドライン環境作り](https://qiita.com/imatomi/items/ef363355c0659f0bacb9#_reference-4c222c7a4d45f96fd2a6)
[zshテーマまとめページ](https://github.com/robbyrussell/oh-my-zsh/wiki/External-themes)
[~/.vim/colors（vimテーマまとめサイト）](http://vimcolors.com/)
[stellarrized（使用したvimテーマ）](https://github.com/nightsense/stellarized)
Raspberry Pi 3 の Ubuntu を設定する

# 大切な前置き

この設定は Raspberry Pi に Ubuntu 16.04 を設定する場合の話です。Raspbianはしりません。MATEでもありません。[ここにあるUbuntu 16.04です。](https://wiki.ubuntu.com/ARM/RaspberryPi)

# u-bootは切っておく

[この記事の](https://wiki.ubuntu.com/ARM/RaspberryPi) **Booting the official Pi 2 image on the Pi 3** に従って、ubootからvmlinuzに変えておく。やっとかないと `apt-get upgrade` で起動しなくなる。

`/boot/firmware/config.txt`の下記はコメントアウト

```text:config.txt
#kernel=uboot.bin
```

下記を追記

```text:config.txt
kernel=vmlinuz
initramfs initrd.img followkernel
```

device_tree_addressもコメントアウト

```text:config.txt
# set extended DT area
#device_tree_address=0x100
device_tree_end=0x8000
```

再起動して上がる事を確認する。起動時にフルカラー表示が出ればOK

# apt-get upgradeしておく

有線LANをつないで、このタイミングやっておくのが無難

```shell-session
sudo apt-get update
sudo apt-get upgrade
```

再起動しておく

# WiFiを設定する

この段階で `ifconfig -a` しても **wlan0** は表示されなくなってしまっているので、[このページ](https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=141834#p1152584)の対処に従ってKernel Moduleを復活させておく

```shell-session
cd /lib/firmware/brcm/
sudo wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.bin
sudo wget https://github.com/RPi-Distro/firmware-nonfree/raw/master/brcm80211/brcm/brcmfmac43430-sdio.txt
```

設定後に再起動すると `ifconfig -a` したとき **wlan0** が表示されるようになる

```shell-session
sudo apt-get install wireless-tools wpasupplicant
```

で設定に必要なツール類をインストールする。その後にSSIDとpassphraseを流し込む。下記のコマンドで括弧ごと自分のSSIDとpassに置き換える

```shell-session
sudo sh -c "wpa_passphrase [SSID] [passphrase] >> /etc/wpa_supplicant/wpa_supplicant.conf"
```

`/etc/network/interfaces`　　は下記のようにwlan0に関連する行を追記する。今回はDHCPとしている。

```text:interfaces
# The loopback network interface
auto lo
iface lo inet loopback

allow-hotplug wlan0
iface wlan0 inet dhcp
    wireless-power off
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

これで、再起動時にWiFiを掴むようになる

# おまけ:オフライン起動の高速化

オフラインで起動しようとすると `A start job is running for raise network interfaces` とか出て5分も待たされるので15秒くらいに縮める。

`/etc/dhcp/dhclient.conf`の**timeout**を下記のようにでもしておけば15秒になる

```text:dhclient.conf
timeout 15
```

# おまけ:液晶の最適設定

RaspberryPiの液晶は買いまくったけど、SPI接続はUbuntu 16.04では使い方が解らなかったので却下。HDMIの製品から選ぶ。OSOYOOだと[これとか](http://amzn.asia/iJZMlWP)は **使えない** 

[こっち](http://amzn.asia/dc7mooz)なら使える。でも、1920x1280は対応入力解像度であって実解像度は低い。ケースは綺麗なんだけど全体が覆われて Raspberry Pi 3 は放熱出来なくてつらい。

[こっち](http://amzn.asia/08UQkjp)がおすすめ。これは安っぽいけど外壁が無いので放熱できる

設定どちらも下記が、読める字の限界設定だと思う。
`/boot/firmware/config.txt`の下記を変更する

```text:config.txt
# uncomment to force a specific HDMI mode (this will force VGA)
hdmi_group=2
hdmi_mode=14
```

以上、毎回解らなくなって時間を浪費するのでメモとして残しておく
自分用のLGTMを簡単に作ってみた



今回は自分用にLTGM用のGIFが簡単に作れたのでやってみました。

普段はテキストで会話していますが、だんだん面白い日本人好みのGIFも出てきているのでちょっと自分でも作ってみたいなと思ったので一度やってみました。

## LGTMって何それ美味しいの？

LGTMって言うのは略語ですがプログラマーの間ではいかのように定義がされているようです。

> 「Looks good to me」の略。
>「良いと思う」「問題ないと思う」という意味。
>作品や作業をチェックした結果を返答するときなどに用いられる。
>出典：はてなキーワード[(LGTM)](http://d.hatena.ne.jp/keyword/LGTM)

コードチェックした時に単純にオッケーと言うだけだと面白くないので、GIFの面白い画像を使って返信する文化らしいです。

もちろん会社で使う際は使っていかとかは聞く必要があると思いますが一つくらい自分の持ちネタを持っているのはいいのかなと思います。


## 自分でLGTMのGIFを作りたい時は？

![GIPHY.COM](https://techcrunchjp.files.wordpress.com/2016/02/2016-02-17-giphyseriesc.gif)

LGTMはおもしろGIFに「LGTM」のテキストを貼り付けるだけなので特別アーティスティックにしない限り作るのはそんな難しくない気がします。

メジャーなところだと[GIPHY](https://giphy.com/)というサイトを利用して作るのが簡単です。

このサイトに気に言ったGIFのソースをコピペしてアップロードし、テンプレートのフォントを選んでLGTMとつければあっという間に作ることが可能です。

手順としてはこんな感じ

1. GIFPHYのサイトでCREATEのボタンをクリック
2. 気に入ったGIFのURLかソースのデータをアップロードする
3. LGTMをテキスト入力してテキストのスタイルやアニメーションを選択
4. もしフィルターを入れたい場合はFiltersをで好きなフィルターを選んでカスタマイズ
5. Continue to uploadをクリックして作成完了

ちなみに可愛い系が好きなのでこういう感じに作ってみました。

![0EC225BC-F959-43C2-A4B5-29DF8414ED7D-40184-00001F6435E06F58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89244/d75f4d5f-8f49-4f27-63c5-d81060b22887.gif)

まあ作ったからと言って頻繁に使うかはわかりませんが一個くらいは自分のスタンプのように使えるGIFを持っていると今後いいかなと思います。
Sample using numpy.indices

```python
print("====intro.====")
def c_indices(t):
 ni = np.indices(t)
 print(ni.shape)
 print(ni)
 print("==")

c_indices((0,1))
c_indices((1,2))
c_indices((2,3))
c_indices((2,3,1))
c_indices((2,3,3))
c_indices((4,5))

def cartesian(arrays):
    arrays = [np.asarray(a) for a in arrays]
    print(arrays)
    for x in arrays:
        print(len(x))
    shape = (len(x) for x in arrays)
    print(shape)

    print("==ix==")
    ix = np.indices(shape, dtype=int)
    print(ix)
    ix = ix.reshape(len(arrays), -1)
    print(ix)
    ix = ix.T

    for n, arr in enumerate(arrays):
        ix[:, n] = arrays[n][ix[:, n]]

    return ix

print (cartesian(([1, 2, 3], [4, 5], [6, 7])))
```
```
====intro.====
(2, 0, 1)
[]
==
(2, 1, 2)
[[[0 0]]

 [[0 1]]]
==
(2, 2, 3)
[[[0 0 0]
  [1 1 1]]

 [[0 1 2]
  [0 1 2]]]
==
(3, 2, 3, 1)
[[[[0]
   [0]
   [0]]

  [[1]
   [1]
   [1]]]


 [[[0]
   [1]
   [2]]

  [[0]
   [1]
   [2]]]


 [[[0]
   [0]
   [0]]

  [[0]
   [0]
   [0]]]]
==
(3, 2, 3, 3)
[[[[0 0 0]
   [0 0 0]
   [0 0 0]]

  [[1 1 1]
   [1 1 1]
   [1 1 1]]]


 [[[0 0 0]
   [1 1 1]
   [2 2 2]]

  [[0 0 0]
   [1 1 1]
   [2 2 2]]]


 [[[0 1 2]
   [0 1 2]
   [0 1 2]]

  [[0 1 2]
   [0 1 2]
   [0 1 2]]]]
==
(2, 4, 5)
[[[0 0 0 0 0]
  [1 1 1 1 1]
  [2 2 2 2 2]
  [3 3 3 3 3]]

 [[0 1 2 3 4]
  [0 1 2 3 4]
  [0 1 2 3 4]
  [0 1 2 3 4]]]
==
[array([1, 2, 3]), array([4, 5]), array([6, 7])]
3
2
2
<generator object cartesian.<locals>.<genexpr> at 0x103f99410>
==ix==
[[[[0 0]
   [0 0]]

  [[1 1]
   [1 1]]

  [[2 2]
   [2 2]]]


 [[[0 0]
   [1 1]]

  [[0 0]
   [1 1]]

  [[0 0]
   [1 1]]]


 [[[0 1]
   [0 1]]

  [[0 1]
   [0 1]]

  [[0 1]
   [0 1]]]]
[[0 0 0 0 1 1 1 1 2 2 2 2]
 [0 0 1 1 0 0 1 1 0 0 1 1]
 [0 1 0 1 0 1 0 1 0 1 0 1]]
[[1 4 6]
 [1 4 7]
 [1 5 6]
 [1 5 7]
 [2 4 6]
 [2 4 7]
 [2 5 6]
 [2 5 7]
 [3 4 6]
 [3 4 7]
 [3 5 6]
 [3 5 7]]
```
# Refs.
* [Cartesian product](https://ja.wikipedia.org/wiki/%E7%9B%B4%E7%A9%8D%E9%9B%86%E5%90%88)
* [numpy.indices](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.indices.html)
* [Create a numpy matrix with elements a function of indices](https://stackoverflow.com/questions/6254713/create-a-numpy-matrix-with-elements-a-function-of-indices)
* [reshape minus](https://teratail.com/questions/14978)
AはBです。AはBではありません。 


AはBです。
① A＋是＋B
    Wǒ shì rìběn rén.

我是日本人。
私は日本人です。

我是は英語でいうと「I am 〜」
Aのところに人称代名詞などの主語を入れて、Bのところに名詞を入れるとどんどん文が作れる。


    Tā shì wǒ de péngyǒu

他是我的朋友。
彼は私の友達です。


    Wǒ shì dàxuéshēng

我是大学生。（私は大学生）


    Wǒ shì shàngbān zú

我是上班族。（私は会社員）


    Wǒ shì A xíng

我是A型。（私はA型）

単語

- 大学生（大学生）
- 上班族（会社員）

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

② A＋是＋B
    Zhè shì wǒ de

这是我的。
これは私のものです。

「これ」は「这」「あれ」は「那」
近いか遠いかだけの2分法。日本語の「それ」に該当するものは特にない。


    Zhè shì lǐwù

这是礼物。（これはプレゼント）


    Zhǐshì zuìhòu yīcì

只是最后一次。（これが最後）


    Zhǐshì zuì guì de

只是最贵的。（これが1番高いもの）

単語

- 礼物（プレゼント）
- 一次（一回）
- 贵（高い）

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

③ A＋很＋B
    Wǒ hěn hǎo

我很好。（私は元気です）

「很」はとても非常にという意味の副詞。だが、基本フレーズの很はとてもと訳さない。
形容詞の前には很をつけることが多く、ルールのようなもの。どうしても強調したい場合は很にアクセントを置いて発音する。


    Wǒ hěn kāixīn

我很开心。（私は嬉しい）


    Wǒ hěn máng

我很忙。（私は忙しい）


    Wǒ hěn nánguò

我很难过。（私は悲しい）

単語

- 开心（嬉しい）
- 忙（忙しい）
- 难过（悲しい）

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝


AはBではありません
① A＋不是＋B
    Wǒ bùshì xuéshēng

我不是学生。
私は学生ではありません。

是の前に不をつけるだけ。
発音は、後ろに四声の発音が来る時だけ二声になる。


    Wǒ bùshì shàngbān zú

我不是上班族。（私は会社員ではありません）


    Wǒ bùshì táiwān rén

我不是台湾人。（私は台湾人ではありません）


    Tā bùshì wǒ de nán péngyǒu

他不是我的男朋友。（彼はボーイフレンドではありません）

単語

- 上班族（会社員）
- 他（彼）
- 男朋友（ボーイフレンド）

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

② A＋不是＋B
    Wǒ bù è

我不饿。
これは私のものです。

是以外の動詞や形容詞の場合でも、前に不をつけるだけで否定形になる。


    Wǒ bù lèi

我不累。（疲れていません）


    Wǒ bù mǎnyì

我不满意。（満足していません）


    Wǒ bù lěng

我不冷。（寒くないです）

単語

- 累（疲れる）
- 满意（満足した）
- 冷（寒い）

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
DalogflowのFullfillment

# はじめに
アマゾンみたいにわかりやすい関数側の説明がなかったので、備忘録的に。

# 最初にやっておく設定
1. Dialogflowのfulfillmentのinline Editorをオンに
2. Intentの下のFulfillmentのところを`Use Webhook`にチェックをいれる

# サンプルコード

```js
'use strict';

process.env.DEBUG = 'actions-on-google:*';
const App = require('actions-on-google').DialogflowApp;
const functions = require('firebase-functions');

// Intentのアクション名かくよー
//最初はDefault Welcome Intentに書いたアクションに行くから注意
const FOO_ACTION = "foo";
const HOGE_ACTION = 'hoge';

// パラメータのかくよー
const FOOFOO = "foofoo";
const HOGEHOGE = "hogehoge";

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    const app = new App({request, response});

    function hoge_function (app) {
        // Entitiesを取得
        let params = app.getArgument(HOGEHOGE);
        //googleさんが喋る言葉をかくよ
　　　　　　　　　　　　　　　　　app.tell("google assistantが返す文字だよー");
        //app.ask("askだと会話はおわらないよー");
    }
    function foo_function (app) { 
        let params = app.getArgument(FOOFOO);
        app.tell("intentのアクションによってかえるよー");
    }
    let actionMap = new Map();
    actionMap.set(FOO_ACTION, foo_action);//インテント名と関数名
    actionMap.set(HOGE_ACTION, hoge_action);

    app.handleRequest(actionMap);
});
```
PHP-CS-Fixerの設定が面倒くさい人のためのルールセット

次に当てはまる場合は[suin/php-cs-fixer-rules](https://github.com/suin/php-cs-fixer-rules)が便利。

* 「PHP-CS-Fixerの設定が面倒」
* 「詳しい人、セットアップして」
* そして、PHP 7.1以上の環境

どんなルールが設定されているかは[php-cs-fixer-rules/Rules.php](https://github.com/suin/php-cs-fixer-rules/blob/master/src/Rules.php#L165)を見ると分かる。おそらくこれと同等のものを作ろうとしたら半日はかかるので、特にこだわりがなければこれをまず使ってみるのも手だ。

## ルールセットのインストール

composerでインストールできる。

```
composer require --dev suin/php-cs-fixer-rules
```

## php_cs.distの設定

`Suin\PhpCsFixer\Rules::create()`がルールセットの配列を返してくれえるので、それを`setRules`に渡すだけ。

```php:php_cs.dist
<?php

return PhpCsFixer\Config::create()
    ->setRiskyAllowed(true)
    ->setRules(Suin\PhpCsFixer\Rules::create([
        // ルールセットのデフォルトを上書きしたり、ルールを追加したい場合はここに書く。
        'declare_strict_types' => false,
    ]))
    ->setFinder(PhpCsFixer\Finder::create()
        ->exclude('vendor')
        ->in(__DIR__)
    );
```

以上でセットアップ完了。
macOSをupdateしたらHomebrewが動作しない、あるいはXcode 8から9にupdate後にcarthage updateできない件

# 環境

- macOS Sierra 10.12.2(?) → 10.12.6
- Xcode 8.3 → Xcode 9.2
- carthage 0.22.0 → 0.27.0

# 経緯と現象と対応

1）Xcode 8から9へアップデートしようと重い腰をあげました（笑。

2）Xcode 9の動作要件としてmacOS Sierra 10.12.6が必要なのでOSをバージョンアップしました。

3）Xcode 8から9にアップデートしました。

ここで、ライブラリを最新化するために、carthage updateを実行しようとしたところ…

```
$ carthage update
*** Please update to the latest Carthage version: 0.27.0. You currently are on 0.22.0
```

carthageをアップデートしてください、というメッセージがでたので、brew upgradeを行おうとすると…

```
$ brew upgrade carthage
Error: Xcode alone is not sufficient on Sierra.
Install the Command Line Tools:
  xcode-select --install
```

『SierraではXcode単体では不十分です。コマンドラインツールをインストールしてください』という旨のエラーメッセージが。

言われた通りコマンドを叩きます。

```
$ xcode-select --install
```

インストーラーが起動するので、インストール。
<img width="490" alt="スクリーンショット 2018-01-02 7.52.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/07009730-73ec-9c8c-429d-eb0c552fc5d7.png">

この後、
`$ brew upgrade carthage`
`$ carthage update`
を実行したら、今度は上手く行きました。

# 原因

**macOSをアップデートしたら、毎回`xcode-select --install`を実行しないとダメなようです。**

多分、El CapitanからSierraにアップデートした際にも同じ作業をやっていたのでしょうけど、すっかり忘れてました。:sweat_smile:

＜参考リンク＞
[Web エンジニアが macOS Sierra にアップグレードしてやったこと](https://blog.manabusakai.com/2016/09/macos-sierra-upgrade/)
FirebaseでTwitter認証 メールアドレスを取得

先日FirebaseでTwitter認証を実装した際に、認証時メールアドレスが取得できず少しハマったので備忘録の意味も込めて書いておこうと思います。

## 結論
結論から言うと、Additional Permissionsを追加してあげることで簡単に実現できます。

やり方としては、[Twitter Application Management](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwj-3tfH_bvYAhVU6LwKHYB9Ao8QFggzMAE&url=https%3A%2F%2Fapps.twitter.com%2F&usg=AOvVaw3Ul5UzJ1kb7JLRLnliJDY5)でアプリのページへ行き、Permissionタブへ移動します。
![twittermanage.png](https://qiita-image-store.s3.amazonaws.com/0/18699/2da2cd91-7200-ae87-ec71-594fc544f32a.png)
Additional Permissionsでチェックボックスを入れます。これでOK。
![twittermanagement.png](https://qiita-image-store.s3.amazonaws.com/0/18699/d9526454-a690-5eb9-bec6-edd3ef49771b.png)

### :bulb:注意点
↑の画像をよく読むと分かるのですが、
> These additional permissions require that you provide URLs to your application or service's privacy policy and terms of service. You can configure these fields in your Application Settings.

と書いてあってSettingタブの
![twittersetting.png](https://qiita-image-store.s3.amazonaws.com/0/18699/9cfc3a78-9501-2c42-f79f-1a681b63fe11.png)

* Privacy Policy URL
* Terms of Service URL

を埋めておく必要があります。
argsort and argpartition method sample in numpy

```python
np.set_printoptions(threshold=np.inf)
Z = np.arange(10)
np.random.shuffle(Z)
print(Z)
n = 3

# Slow
a = np.argsort(Z)
print(a)
print (Z[a[-n:]])
# Fast
print(-Z)
a = np.argpartition(-Z,n)
print(a)
print (Z[a[:n]])
```
* e.g.

```
[0 5 6 9 3 1 2 8 4 7]
[0 5 6 4 8 1 2 9 7 3]
[7 8 9]
[ 0 -5 -6 -9 -3 -1 -2 -8 -4 -7]
[3 7 9 2 1 8 4 6 5 0]
[9 8 7]
```
* argpartition method results is not sorted.

# Refs
https://gist.github.com/naoyashiga/8f8a215932e881a3f9ec85e45d499e99
* [省略表記無効](http://www.tensorflowz.com/faq/html/Tensorflow_no-scroll-option-AD.html)
[Xcode] Carthageで導入したライブラリを削除する、またはCarthage自体の利用を止める手順

Carthageによるライブラリの導入手順は良く見かけるのですが、削除手順は案外見かけないので、まとめてみました。
分かっている人にとっては、今更ネタなのかもしれませんが…

本稿で前提とする環境は以下の通りです。

| Items | Version |
|:--|:--|
| Xcode | 9.2 |
| Carthage | 0.27.0 |

**１．Targets**

- Build Phases > Link Binary With Librariesにて削除したいライブラリを選択し、「－」をクリックする。
<img width="1021" alt="スクリーンショット 2018-01-02 11.57.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/e4b5930e-c888-5c3b-20f0-9ad1720845fd.png">

- Build Phases > Run Script > Input Filesにて削除したいライブラリを選択し、「－」をクリックする。
<img width="836" alt="スクリーンショット 2018-01-02 12.05.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/556e6373-3603-a740-fe44-2037085d7676.png">
- Carthageの利用を止める場合は、さらに、
    - Build Phases > Run Script > ShellからCarthageの記述を削除する。
    - Build Settings > Framework Search PathsからCarthageの記述を削除する。

**２．Frameworks**

- Frameworksにて削除したいライブラリを右クリックし、「Delete」をクリックする。
<img width="452" alt="スクリーンショット 2018-01-02 11.58.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/df744820-526c-5c92-60de-38626258a0bb.png">

- 参照のみ削除するか、ファイルをゴミ箱に入れるか聞かれます。潔く「Move to Trash」で良いと思います。
<img width="550" alt="スクリーンショット 2018-01-02 12.01.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/122917/4c7b3a20-e52f-4558-4830-18de365a261d.png">

**３．Cartfile**

- 特定のライブラリを削除したい場合
    - 削除したいライブラリの記述を削除する。
- アプリでCarthageの利用を止める（Carthageで管理するライブラリが無くなる）場合
    - Cartfileごと削除する。

**４．仕上げ**

- 特定のライブラリを削除した場合
    - プロジェクトフォルダ > 「Carthage」フォルダ > 「Build」および「Checkouts」フォルダを削除し、`carthage update`をやり直す。（のが無難かと思われます）
- Carthageの利用を止める場合
    - 「Carthage」フォルダごと削除する。

あとは、プロジェクトをビルドしてみて、エラーがでなければOKです！
探索的テストの使い方

# 探索的テストとは

```
探索的テストは、テストの目的が含まれたテストチャータを基にしたもので、
テスト設計、テスト実行、テスト記録や学習を並行して同じ時間枠内で実行する。
このアプローチは、仕様がほとんどなかったり、不十分であったり、
スケジュール的な余裕がない場合や、他の形式的なテスト技法を補完する場合に効果が大きい。
探索的テストは、テストプロセスのチェックや、きわめて重大な欠陥を見つけ出すのに役に立つ。 
```

* http://jstqb.jp/dl/JSTQB-Syllabus.Foundation_Version2011.J01.pdf
* 探索的テストについては調べるといろいろ出てくる

# 探索的テストの使い方
1. チーム内の他のメンバーが作った機能の理解
    * 自分が作っていない機能を探索的にテストすることでその機能への理解が深まる
    * みんなが集まってテストできれば, 不明点(仕様やロジックなど)を作成者にすぐ聞くことができ, それを他のメンバーも聞くことができるので暗黙知や知識の共有にもなる
1. 品質の確認
    * [Session-based testing](https://en.wikipedia.org/wiki/Session-based_testing)などを使えば品質を確認, レポートすることができる
    * (参考) [「探索的テスト」を活用して品質を高める](http://www.nttdata.com/jp/ja/insights/trend_keyword/2014072401.html)
1. バグ出し
    * テストスクリプトなどの用意をせず, どのあたりをテストするのかをざっくり方針決めてテストするだけである程度の致命的なバグを見つけることができるため費用対効果(ROI)は高い
        * バグを仕込んで直すまでの時間が短ければ短いほど修正コストは低いので, 機能がある程度出来たら行うと良い
        * 開発チームで行うとよりよい
1. 回帰テスト
    * https://techblog.king.com/moving-from-scripted-regression-testing-to-exploratory-testing/
1. 上記の使い方を同時に複数行うこともできる

# 探索的テストはソフトウェアテストの1つのスタイル
* 「探索的テストってなんですか？」(高橋寿一さん)より
    * http://jasst.jp/symposium/jasst14kyushu/pdf/S3.pdf
* 探索的テストは特徴を把握して自分たちに合うように使うとよい
sample using reduceat method in numpy

```python
def pr(x,a):
 C = np.add.reduceat(Z,x,axis=a)
 print(C)

n=3
Z = np.arange(3*3).reshape(3,3)
print(Z)
k = 1
print(np.arange(0,5))
A = np.arange(0, Z.shape[0],k)
B = np.arange(0, Z.shape[1],k)
print(A,B)
pr([0],0)
C=pr([1],0)
pr([2],0)
#pr([3],0) # invalid
print("==2d==")
pr([0,2],0)
pr([0,1],0)
pr([1,2],0)
pr([2,1],0)
pr([2,0],0)
pr([1,1],0)
print("==3d==")
pr([0,1,2],0)
pr([1,2,0],0)
pr([2,2,2],0)
print("==block==")
n = 16
Z = np.ones((n,n))
k = n//4
A = np.arange(0, Z.shape[0], k)
print(A)
#print(np.add.reduceat(Z, [0,4,8,12]))
A = np.add.reduceat(Z, A, axis=0)
print(A)
S = np.add.reduceat(A, np.arange(0, Z.shape[1], k), axis=1)
print(S)
```
```
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[0 1 2 3 4]
[0 1 2] [0 1 2]
[[ 9 12 15]]
[[ 9 11 13]]
[[6 7 8]]
==2d==
[[3 5 7]
 [6 7 8]]
[[ 0  1  2]
 [ 9 11 13]]
[[3 4 5]
 [6 7 8]]
[[ 6  7  8]
 [ 9 11 13]]
[[ 6  7  8]
 [ 9 12 15]]
[[ 3  4  5]
 [ 9 11 13]]
==3d==
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[ 3  4  5]
 [ 6  7  8]
 [ 9 12 15]]
[[6 7 8]
 [6 7 8]
 [6 7 8]]
==block==
[ 0  4  8 12]
[[ 4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.]
 [ 4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.]
 [ 4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.]
 [ 4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.]]
[[ 16.  16.  16.  16.]
 [ 16.  16.  16.  16.]
 [ 16.  16.  16.  16.]
 [ 16.  16.  16.  16.]]
```
# Refs.
* [区分行列](https://ja.wikipedia.org/wiki/%E5%8C%BA%E5%88%86%E8%A1%8C%E5%88%97)
* [reduceat](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ufunc.reduceat.html)
Promiseのテンプレート（非同期で並列処理）

Promiseのテンプレート（非同期で並列処理）

```javascript
Promise.resolve()
  .then(() => {
    return Promise.all([
      new Promise((resolve, reject) => {
        resolve(result1);
      }),
      new Promise((resolve, reject) => {
        resolve(result2);
      })
    ]);
  })
  .then((_result) => {
    return new Promise((resolve, reject) => {
      const result1 = _result[0];
      const result2 = _result[1];
      resolve();
    });
  });```
Promiseのテンプレート（非同期の同期処理）

Promiseのテンプレート（非同期の同期処理）

```javascript
Promise.resolve()
  .then(() => {
    return new Promise((resolve, reject) => {
      resolve();
    });
  })
  .then(() => {
    return new Promise((resolve, reject) => {
      resolve();
    });
  });```
AppStore アプリのアップデート画面で更新情報が切れるバグ

この記事は、株式会社ACCESS Advent Calendar 2017 22日目の記事です。

# あらまし

2017/9/M にリリースされた iOS 11 より AppStore アプリも全面リニューアルされました。
機能的、GUI 的にも大幅に変更が入り、賛否はあるものと思いますが、
それとは別に**明らかにバグ(Not インシデント)**があります。

よくある OS 公開後のバタバタで、すぐに修正されるものと思っていましたが、
未だに修正されないので情報共有として記事にしておきます。

# どんな現象か？

**<font color="red">AppStore アプリのアップデート画面で更新情報が切れます。</font>**

<img width="414" alt="ss_01.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/38837/7d91473c-e32b-685a-ecc3-6657ff216985.jpeg">

上記は AppStore アプリのアップデートタブのスクリーンショットです。
TimeTree と Amazon Alexa の更新情報が、明らかに**途中なのに切れている**ことがわかると思います。

# それは仕様では？

いえ、**恐らく違います。**
インシデントではなく、バグだと言い切ったのには理由があります。

続く更新情報を見るためには一旦アプリの詳細画面へ遷移しないと不可能なように思えますが、
実は、**<font color="red">右下あたりをタップすると更新情報を展開することができます。</font>**

![ss_0102.jpg](https://qiita-image-store.s3.amazonaws.com/0/38837/6557a156-e60a-9a19-42aa-1579d7aa767d.jpeg)

明らかに仕様とは思えない振る舞いです。

# どうしてそんなことに気づいたのか？

ここで、同じくスクリーンショットの Nuzzel アプリの更新情報をみてください。

<img width="414" alt="ss_04.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/38837/eeb9d1dd-8074-1263-0cf9-021a059d3497.jpeg">


なんと、こちらは**<font color="red">右下に「さらに表示」ラベルが表示</font>**されていて、
このラベルをタップすることで続く情報を展開することが可能です。

そう、厳密に切り分けを行ったわけではありませんが、
更新情報が**英語のみで記述されている場合**は、「さらに表示」ラベルが表示されているように思えます。

一体どうしてこうなった…。

# まとめ

というわけで、AppStore のバグを紹介しましたが、
結局のところ、日本語を利用する以上はこの問題は避けられないものと思います。

なので、せいぜいできることといえば、一般論ですが下記くらいでしょうか。

* 最初の2行に重要な情報を書く
* 情報が続く場合は、2行目で終わらせず、情報がまだあるように見せる

また、最後に当方は iPhone 7 plus で動作確認しています。
特に iPhone X で更新情報の表示がどうなるかについて(3行以上表示される可能性がある)は、
確認できていませんのでご注意ください。

# 動作確認環境

* iPhone 7 plus
* iOS 11.2.1 (言語設定 日本語)
swift 演算子を作る

# Swift で演算子を作成する。

Swift で演算子を作成する。
Apple の下記ページに存在しない演算子を作成します。

https://developer.apple.com/documentation/swift/operator_declarations

右辺の値がnilの場合、何も返さない的な演算子になります。

```

import Foundation

infix operator ??= : AssignmentPrecedence

func ??=<T>(lhs: inout T?, rhs: T?) {
    guard let rhs = rhs else { return }
    lhs = rhs
}
let str: String? = nil
var hash: [String: String] = [:]
hash["LO"] = "lpllp"
hash["lp"] ??= str

print (hash)

```

出力結果

```
["LO": "lpllp"]
Program ended with exit code: 0
```
String 型のstrはnilなので、連想配列のhashには何も代入されません。

こちらの演算子は下記に実装されてます。

https://github.com/mattdonnelly/Swifter

Twitterのクライアント作る場合結構いいと私は思います。

参考になる。

演算子の作り方は下記が参考になるかと思われます。

https://qiita.com/shimesaba/items/cb36c0120a0a9f509da7

以上！
キャラクターの後ろを追尾してくるカメラの実装

三人称視点のゲームでは、カメラがプレイヤーの後ろに回り込んでくる処理が、よく実装されています。

こんなやつ。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/dAUMI6taqXQ/0.jpg)](http://www.youtube.com/watch?v=dAUMI6taqXQ)

<iframe width="560" height="315" src="https://www.youtube.com/embed/dAUMI6taqXQ" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen></iframe>

この処理の疑似コードを記載します。なお、3Dゲームを作るうえでの簡単なベクトルやカメラの知識はあるものとします。
肝は、新しい視点を決定する際に、元々の注視点と視点の距離を維持するように視点を決定することです。

```cpp
/////////////////////////////////////////////////////////////////
// ⓵　現在のカメラの注視点と視点を使って、XZ平面上での、
//      注視点から視点までのベクトル(toCameraPosXZ)と長さ(toCameraPosXZLen)を求める。
/////////////////////////////////////////////////////////////////
Vector3 toCameraPosXZ = m_camera.m_position - m_camera.m_target;
float height = toCameraPosXZ.y;                  //視点へのY方向の高さは、後で使うのでバックアップしておく。
toCameraPosXZ.y = 0.0f;                          //XZ平面にするので、Yは0にする。
float toCameraPosXZLen = toCameraPosXZ.Length(); //XZ平面上での視点と注視点の距離を求める。
toCameraPosXZ.Normalize();                       //単位ベクトル化。

/////////////////////////////////////////////////////////////////
// ⓶　新しい注視点をアクターの座標から決める。
/////////////////////////////////////////////////////////////////
Vector3 target = m_actor->m_position;
target.y += 50.0f;

/////////////////////////////////////////////////////////////////
// ⓷　新しい注視点と現在のカメラの視点を使って、XZ平面上での、
//     注視点から視点までのベクトル(toNewCameraPos)を求める。
/////////////////////////////////////////////////////////////////
Vector3 toNewCameraPos = m_camera.m_position - target; //新しい注視点からカメラの始点へ向かうベクトルを求める。
toNewCameraPos.y = 0.0f;              //XZ平面にするので、Yは0にする。
toNewCameraPos.Normalize();         //単位ベクトル化。

/////////////////////////////////////////////////////////////////
// ⓸　１と２と３で求めた情報を使って、新しい視点を決定する。
/////////////////////////////////////////////////////////////////
//ちょっとづつ追尾。
float weight = 0.7f;  //このウェイトの値は0.0～1.0の値をとる。1.0に近づくほど追尾が強くなる。
toNewCameraPos = toNewCameraPos * weight + toCameraPosXZ * (1.0f - weight);
toNewCameraPos.Normalize();
toNewCameraPos *= toCameraPosXZLen; 
toNewCameraPos.y = height;              //高さを戻す。
Vector3 pos = target + toNewCameraPos;  //これで新しい視点が決定。

/////////////////////////////////////////////////////////////////
// ⓹　視点と注視点をカメラに設定して終わり。
/////////////////////////////////////////////////////////////////
m_camera.m_position = pos;
m_camera.m_target = target;

```
モバイルでのレイアウト制御のタグ

#モバイル対応のタグ宣言

毎回モバイル対応のタグを書き忘れてしまうのでメモ。。。

・以下のタグをheadに記載

~~~html
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=10.0, user-scalable=yes">
~~~

・ちょっとした説明
`viewport`： 表示するサイズの設定
`width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=10.0,`： サイズに関する記述
`user-scalable=yes`： モバイルの幅で表示させた後は拡大・縮小は出来ない設定

以上