OmniAICreator/Qiita-1.07M huggingface dataset:
SketchUp の Ruby コンソールで変更のあったファイルだけリロードしてくれるようなモノ

Gist にだけあったものをサルベージして Qiita にも。

[自分は SketchUp の Ruby コンソールで使うんだけど、開発中にいろいろスクリプトをいじったとして、Ruby コンソールで Matome.clap とやると更新のあったファイルだけリロードしてくれるようなもの](https://gist.github.com/unau/94efd42bed93f31c1ec50491b168adf0)

```clap-loader.rb
module Matome
  @@clapLoader = nil

  def self.clap(dir=nil)
    if @@clapLoader then
      @@clapLoader.reload
    else
      @@clapLoader = ClapLoader.new dir
    end
  end

  class ClapLoader
    def initialize(dir)
      @own = __FILE__
      @dir = dir.split('/')[0..-2].join('/')
      @mtimes = {}
      reload
    end

    def reload
      $LOADED_FEATURES.each{|f|
        if f != @own && f.start_with?(@dir) then
          File::Stat.new(f).mtime.tap { |mtimeOnFS|
            @mtimes[f].tap { |mtimeOnCache|
              if ! mtimeOnCache then
                @mtimes[f] = mtimeOnFS
              elsif mtimeOnFS > mtimeOnCache then
                warn("LOADING: %s" % f)
                load f
                @mtimes[f] = File::Stat.new(f).mtime
              end
              }
          } rescue warn('skip ... %s' % f)
        end
      }
    end
  end
end

__END__
```

```main.rb
require 'matome/clap-loader'
require 'matome/something-great'

Matome.clap __FILE__
Matome.SomethingGreat

Matome.clap
```

Qiita と Gist の連携は、先に Gist に書いちゃだめで、Qiita の記事を投稿したときにコード部分が Gist に載るようにするしかないのね。
NVR510 L2TP/IPsec に Ubuntu 17.10  から接続するメモ

 やっと繋がったのでメモっておく。自分用メモ。もしかしたら誰かの役に立つかもなので一応書いておく。

インストールなどはこの通り

http://moremagic.hateblo.jp/entry/2017/10/23/165440

NVR510
L2TP/IPsecを使用する
認証アルゴリズム HMAC-SHA
暗号アルゴリズム AES-CBC
ユーザー認証方式 MSCHAP-V2

NetworkManager
IPsec Settings
aes128-sha1-modp1536,aes128-sha1-modp1024,3des-sha1-modp1024
aes128-sha1,aes128-sha1,3des-sha1
L2TP PPP Options
MSCHAPv2
MPPE有効

Algorithmの調べ方
https://github.com/nm-l2tp/network-manager-l2tp/wiki/Known-Issues#querying-vpn-server-for-its-ikev1-algorithm-proposals
うちの場合

$ sudo ./scan.sh xxx.xxx.xxx.xxx | grep SA
	SA=(Enc=3DES Hash=MD5 Auth=PSK Group=1:modp768 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=3DES Hash=MD5 Auth=PSK Group=2:modp1024 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=3DES Hash=MD5 Auth=PSK Group=5:modp1536 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=3DES Hash=SHA1 Auth=PSK Group=1:modp768 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=3DES Hash=SHA1 Auth=PSK Group=2:modp1024 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=3DES Hash=SHA1 Auth=PSK Group=5:modp1536 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=AES Hash=MD5 Auth=PSK Group=1:modp768 KeyLength=128 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=AES Hash=MD5 Auth=PSK Group=2:modp1024 KeyLength=128 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=AES Hash=MD5 Auth=PSK Group=5:modp1536 KeyLength=128 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=AES Hash=SHA1 Auth=PSK Group=1:modp768 KeyLength=128 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=AES Hash=SHA1 Auth=PSK Group=2:modp1024 KeyLength=128 LifeType=Seconds LifeDuration(4)=0x00007080)
	SA=(Enc=AES Hash=SHA1 Auth=PSK Group=5:modp1536 KeyLength=128 LifeType=Seconds LifeDuration(4)=0x00007080)
Jupyterでmatplotlibのjavascriptアニメーションを動かす

Jupyter上でmatplotlibのグラフをアニメーションさせる際、nbaggバックエンド&animationモジュールを良く使うのですが、nbaggは環境やフレームレートによっては描画が結構カクつきます。
**matplotlib 2.1**で追加された[javascript HTMLアニメーション](https://matplotlib.org/users/whats_new.html#interactive-js-widgets-for-animation)
を試したところ、とても軽快で使い勝手も良かったのでメモしておきます。

# 動作環境
```txt
Windows10 64bit
Core i7-6700
Chrome 64.0.3282.119
python 3.6.3
jupyter 6.1.0
matplotlib 2.1.0
```

# 使い方

```example.py
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np

t = np.linspace(0, 6*np.pi, num=60)
x = 2.0 * np.cos(t) + 5.0 * np.cos(2.0/3.0 * t)
y = 2.0 * np.sin(t) - 5.0 * np.sin(2.0/3.0 * t)

fig, ax = plt.subplots(figsize=(5, 5))
l, = ax.plot([-7, 7],[-7, 7])

animate = lambda i: l.set_data(x[:i], y[:i])
ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t), interval = 1000/30.0)

from IPython.display import HTML
HTML(ani.to_jshtml())
```
![smp.gif](https://qiita-image-store.s3.amazonaws.com/0/234940/c62a8ef3-25fd-82f1-6968-65b430ce0ce7.gif)


[動作デモ](https://nbviewer.jupyter.org/gist/yoku001/271dda1ab7d6ab15c6999e56b712797b)

重要なのは末尾の一行で、FuncAnimationオブジェクトの **[to_jshtml](https://matplotlib.org/api/_as_gen/matplotlib.animation.Animation.html#matplotlib.animation.Animation.to_jshtml)** メソッドで生成したアニメーションのHTML要素を、IPython.display.HTMLでインライン表示しています。ArtistAnimationでも同様の手順で表示可能です。

アニメーションは静的なHTML要素として出力されるので↑の様にnbviewer上でも再生出来てしまいます。操作ボタン類も中々充実していて、再生速度の変更やコマ送り･コマ戻しも可能です。デバッグ時に便利そうですね。


# パフォーマンス
上手い計測方法が思い浮かばなかったので、愚直にjavascript版とnbagg版でアニメーション再生中の平均CPU使用率を比べてみました。コードは上のデモと同じものを使っています。

再生前|javascript|nbagg
---|---|---
(1.2%)|**3.0%**|34%

javascript版の軽さが際立ってます。

# 参考リンク
Jupyter上でmatplotlibのアニメーションを再生する - Qiita
https://qiita.com/Tatejimaru137/items/6083e2e3a4e618da6274

Inline animations in Jupyter - Stack Overflow
https://stackoverflow.com/questions/43445103/inline-animations-in-jupyter/43447370
ブラウザ依存Tips（Chrome, IEのみ）

ここではブラウザ毎による挙動の違いを軽く列挙したいと思います。

前の案件でブラウザ毎の挙動に悩まされたので（~~とくにIE~~）忘備録として
書き出していきます。（今回はChromeとIEのみ取り扱います）

*随時記事追加していきます。。

# placeholder
Chrome と IE ではplaceholderが非表示になるタイミングが異なります。
IEはフォーカスした時点で非表示になるので注意してください。

|                  |       Chrome      |          IE        |
|:-----------------|------------------:|:------------------:|
| 未フォーカス時    |              表示 |        表示         |
| フォーカス時      |              表示 |       **非表示**    |
| １文字入力        |            非表示 |       非表示        |

この挙動を揃えるには、

- IEをChromeに合わせる場合、
    - jQueryプラグイン ah-placeholder.js を使う。
    - プラグインを使わないなら、フォーカス時に文字をinputに重ねるなどしてゴリ押しするしかなさそう？
- ChromeをIEにあわせる場合、以下のスタイルを設定してください

```
input::focus::placeholder {
  color: transparent;
}
```

# window.close()
JavaScriptでタブやウィンドウを閉じようとして`window.close()`を実行しても
閉じない場合があります。
[ドキュメント](https://developer.mozilla.org/ja/docs/Web/API/Window/close)に書かれているように`window.close()`は基本的に`window.open()`で開かれたウィンドウの場合のみ閉じることが出来ます。

これに対してどうにかしようとする記事がいろいろありますが、現在のブラウザでは対策されているようです。（2017年10月ごろに私も調べましたが、有効な情報はなかった気がします。。）

しかし、IEは、スクリプトで開かれていないタブも閉じることができます。
IEで`window.close()`を叩くと確認ダイアログが表示され、「はい」を押すことでタブが閉じます
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/203410/7c6d241c-574b-43b9-b754-ae2b4b8ae31b.png)

|                  |       Chrome      |          IE        |
|:-----------------|------------------:|:------------------:|
| 通常タブ  |              無効 |        **有効（確認ダイアログ有）**         |
| スクリプトで開かれたタブ      |              有効 |       有効    |
Google Cloud Functions で Go を使おう！

# 注意
今 Google Cloud Functions (GCF) はまだベータで、まだアメリカしか使えなくて、まだNodeJSしか使えませんから、将来にいつかこの方法を使えないかもしれませんが、やってみよう！

# はじめに

普通に、前に AWS Lambda や GCF みたいな Function as a Service (FaaS) と言うサービスでは Go を使えませんでした。でも、今月 AWS Lambda がアプデイトされて、今 Go を使えますが AWS があまりすきじゃないんだから GCF で Go を使う方法をしらべました。そして、このプロジェクトを見つかりました。

https://github.com/GoogleCloudPlatform/cloud-functions-go

それは日本語で「グーグル・クラウド・ファンクションの非公式の Go のネイティブのランタイム」です。

# この方法について

この方法は初めてのリクエストで NodeJS のプロセスを完全に入れ替えて Go のプロセスがリクエストを引き継がせます。そして、新たなリクエストが来た時 NodeJS のプロセスがもうなくて、全部 Go のプロセスが返事します。もっと知りたかったら、[このプロジェクトのリードミー](https://github.com/GoogleCloudPlatform/cloud-functions-go/blob/master/README.md)を読んでください。

# 必要こと

- Linux の開発環境 (デプロイメントする時しか要らないけど、Linux がなければ Docker や Vagrant も ok です)
- Go v1.5 以上
- Node.js v0.10 以上
- node-gyp (`npm install -g node-gyp` でダウンロードします)
- Make
- GCC

# コード

先ずはメインのファンクションでフラグズからファイルディスクリプタを読まなければいけません。

```go
flag.Parse()
```

そして、リクエストのハンドラを準備します。ここで色々なコードが入れられます。

```go
http.HandleFunc(nodego.HTTPTrigger, func(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "こんにちは！僕はネイティブのGoです！")
})

// もしロギングが要ったらこのしたのコードを使ってください。

http.HandleFunc(nodego.HTTPTrigger, nodego.WithLoggerFunc(func(w http.ResponseWriter, r *http.Request) {
	log.Println("これはGoのメッセージです！")
}))
```

最後は、NodeJS のプロセスの役目を続きます。

```go
nodego.TakeOver()
```

完成の例は [examples のフォルダー](https://github.com/GoogleCloudPlatform/cloud-functions-go/blob/master/examples)に入っています。

### 注目に値すること
このプロジェクトは GOPATH の外で使うにデザインされたから、`"./nodego"` のインポートは名前の前に `./` があってローカルなんです。他のライブラリーを普通にインポートすればいいです。

# テスティング

ターミナルで `make godev` をしてから、ブラウザで `localhost:8080` をみてください。他のポートやアイピーをつかいたかったら、ターミナルで `go run main.go -addr=localhost:8080` をしてください。

# デプロイメント

ファンクションを準備できたら、ターミナルで `make` をしてください。そうしたら、自動にコードがコンパイルして、パッケージして、`function.zip` のファイルが出ます。下の画像で赤い四角形でハイライトしている設定を確認して、"__ZIP file__" のボックスで先出たファイルを選択して、"__Create__" のボタンをクリックしてからファンクションがデプロイします。

![ja-gcf-screenshot-1.png](https://qiita-image-store.s3.amazonaws.com/0/175714/68cacb57-e1d3-6df1-4af1-f604621f85b4.png)

# まとめ

__メリット__

- Go は NodeJS より速くて、安全です。
- NodeJS の環境で使えない基本機能は Go で使えます。（例えば [`fs`](https://nodejs.org/api/fs.html))
- 他のブートストラップの方法よりきれいで、いいです。

__デメリット__

- ~~今はウェブのトリガーしか使えません。~~

編集：７月から Storage Bucket や PubSub Topic のトリガーが使えるになりました！https://qiita.com/ssttevee/items/5c72edd24be266a32515

# 終わり

Thanks for reading!

読んでくれてありがとう！
組込み+RTOS > C > 70秒待ち > 46秒で処理が終わる > 実装ミス

```txt:動作環境
とある組込みシステム + RTOS
```

とある組込みシステムで70秒のカウントダウンを行っていた。
カウントダウンが終わるのは46秒。

何故か。

### 理由

- 1000ミリ秒待機処理に加えて300ミリ秒のシリアル受信待ち
    - 1.3倍
- カウントダウンする関数を用意
- その関数を2回呼んでいた
    - 1/2倍

70秒 / 2 * 1.3 = 45.5秒

### 備考

関数内でカウントダウンやカウントアップする処理をしている場合、その処理がN秒に1回などの指定通りにコールされるように実装しないといけない。

別の案としては、クロックを使った経過時間の判断にする。
jsのreplace関数みたいに高階関数渡す感じのreplace処理をScalaで模索

jsのコレっぽく

```javascript:js
function replace(str) {
  var dic = { "&amp;" : "&", "&lt;" : "<", "&gt;" : ">" }
  return str.replace(/&lt;|&gt;|&amp;/g, s => dic[s])
}
```

Scalaでも書けないかな？とおもって模索したらそれっぽいかんじで出来たのでメモ。

```scala:scala
def replace(str: String) = {
  val dic = Map("&amp;" -> "&", "&lt;" -> "<", "&gt;" -> ">")
  dic.keys.mkString("|").r.replaceAllIn(str, m => dic(m.matched))
}
```
Automatorにおけるshell scriptの環境変数

# PATH

PATHに`/usr/local/bin`が含まれていない。

```bash:シェルスクリプトを実行
printenv PATH
```

```console:結果
PATH=/usr/bin:/bin:/usr/sbin:/sbin
```

# プロファイル

プロファイルを読み込まない。

```bash:.bash_profile
export AAA=aaa
```

```bash:シェルスクリプトを実行
printenv AAA
if [ $? -eq 1 ]; then
  echo '環境変数「AAA」が存在しない'
fi
```

```console:結果
環境変数「AAA」が存在しない
```
Mecab関連のメモ

## macでbrewで入れたときのメモ
`sudo apt-get install mecab mecab-ipadic-utf8 libmecab-dev` でなく、`brew install mecab` と `brew install mecab-ipadic` で入れた

PTAHが `/usr/lib/mecab/mecab-dict-index` だったものが `/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index`
同一クラスにdefaultPropsが２つ存在するときの挙動

# 同一クラスにdefaultPropsが複数存在するときの挙動はどうなるの？

Babelを使用しているので公式を見てみたら、コンパイル結果を載せてくれてた。
さすが。
表示されるソースは編集可能なので、２つ描いてみましょう。

[ここです。](https://babeljs.io/repl/#?babili=false&evaluate=false&lineWrap=true&presets=es2015%2Cstage-0%2Creact&code=%2F%2F%20The%20ES6%2B%20way%0Aclass%20Video%20extends%20React.Component%20%7B%0A%20%20static%20defaultProps%20%3D%20%7B%0A%20%20%20%20autoPlay%3A%20false%2C%0A%20%20%20%20maxLoops%3A%2010%2C%0A%20%20%7D%0A%20%20static%20propTypes%20%3D%20%7B%0A%20%20%20%20autoPlay%3A%20React.PropTypes.bool.isRequired%2C%0A%20%20%20%20maxLoops%3A%20React.PropTypes.number.isRequired%2C%0A%20%20%20%20posterFrameSrc%3A%20React.PropTypes.string.isRequired%2C%0A%20%20%20%20videoSrc%3A%20React.PropTypes.string.isRequired%2C%0A%20%20%7D%0A%20%20state%20%3D%20%7B%0A%20%20%20%20loopsRemaining%3A%20this.props.maxLoops%2C%0A%20%20%7D%0A%7D%0A
)


どうやら、代入形式だから複数記述された場合は最後に記述された`defaultProps`しか動作しなさそう。
実際にソースをデバッグしてみたら確かに最後のしか動作してなかった。
最適化してくれないんだな〜と思いました。
JS関連はリファレンス見れば大概載ってるから助かる。

以上。
新卒後輩の扱いについてのTIPS

##はじめに

自身の思い出を振り返って。

個人的な思想と経験により、記述内容は偏っています。
組織風土によっては、真逆の行動の方が最適解にもなりえるかと思います。
やはり百者百様であるため、参考になる点だけを拾い工夫していただけると幸いです。

---

※筆者の4年振り返りの3部作
 [未経験から4年働きながら、読んでよかった読み物](https://qiita.com/Nao9syu/items/0bedec7a749ab2d8123a)
[未経験者が認識してなさそうなTIPS](https://qiita.com/Nao9syu/items/0950527548a08ff9d8c9)
[新卒後輩の扱いについてのTIPS](https://qiita.com/Nao9syu/items/7271eb5d88a4eda1b0d6)（当記事）

---

##労働者として

###自分が新人だった頃を思い出すこと
自分も誰かから教育されて今の立場があるはず。
良かったことは使い回し、そうでない部分は自分で試行錯誤してみる。
ただし、あなたにとって良かったとしても、他の人もそうだとは限らない。

###法律や会社規則を守ること
暴行、暴言、パワハラ、セクハラなどはしないこと。~~友達が欲しけりゃ犬でも飼ってろ。~~
しかし合法でも地雷はどこにあるかわからない。もし踏んでしまったら、謝罪して今後一切触れないこと。
地雷内容が業務に差し支えがある場合は、上司にエスカレーションすること。

###後輩も愉快に働けるように気を配ること
怒鳴らないこと。または怒鳴っていると見なされないように気をつけること。
故意の重過失でもない限り、裁いたり責めたりはしないこと。
無知でも恥をかかせたりしないこと。
当たり障りのない質問から始めて、コミュニケーションを試行すること。
相手にわからない小言はいってはならない。自分の鬱散をぶつけてはならない。

###成長していくように誘導すること
新人は成長がお仕事。
彼らの成長が早ければ、自分も楽できる。
彼らの成長が遅ければ、自分の作業が増える一方だ。
~~究極的には、「成長させるor追い出す」の2択だと思います。成長させる、であって欲しいですが。~~

###質問しやすいようにしておくこと
わからなければ質問するように、口を酸っぱくして言っておくこと。
萎縮されると情報フィードバックが滞ってしまう。
なるべくゆっくり話すこと。即答を求めないこと。
同じこと聞かれても、責めないこと。3回以上になると指摘はしたほうがいいかも。

###質問の答え方のこと
わからないことはわからないと答えて、必要に応じて上にエスカレーションすること。
無知を認めることは軽蔑されにくいが、知ったかぶりは軽蔑される。
細かい技術については、ビジネス書やWebページを探して読んでみると良いかと思います。
`紙やボードに図解する、検索ワード・参考書・仕様書などを教える、前後周辺レイヤーの話もしておく、
 フィードバックを意識する、自分の経験談や失敗談も話す、、、`

###質問に答える余裕がない場合の対応のこと
フロー状態（ノッてる状態）や緊急作業時に、質問される場合について。
まずは急ぎであるかを聞くこと。そちらのほうが優先順位が高いこともありえます。
こちらの優先順位が高いと判断したならば、いくらでも待たせておく。
その間は、他のタスクや自習（休憩）をさせておくこと。
ただし、待たせていることを忘れずに、当日のうちに一度は自分から質問のことを尋ねること。

もし一切割り込まれたくないのであれば、何らかのルールを決めて共有しておくこと。
`質問可能時間をあらかじめ決める。
何らかのサインを決める。（xxが机においてあるときは話しかけるな、yyをしてるときは話しかけていいよ、、、）など`

~~『業務は遂行する』『後輩も育てる』 
「両方」やらなくっちゃあならないってのが「先輩」のつらいところだな
覚悟はいいか？ オレはできてる~~

###業務時間中は労働装置とみなして有効活用すること
教育指導や業務命令は遠慮せずにしていくこと。
自分や業務内容の権限にもよるが、単純作業からどんどん委譲して教えていく。
しかし逆に、業務時間外は人間扱いを心がけること。
残業させるにしても、申し訳ないという態度はみせておく。

###能力を観察し測定すること
自分には簡単なことでも、できて当然と思い込まない。
`挨拶、基本計算、読み書き、掃除、PC操作、キーボード入力、ブラインドタッチ、
 電話、メール、Office操作、、、`
観察できたら、基礎練習や学習をするように伝える。
どんなスマホやPCや趣味を持っているのか聞き出して、興味を誘導できればベスト。
定期的に確認して、能力の測定値は更新していくこと。三日会わざれば刮目して見よ。
特定の能力が足りないように見えても、
実はフォーカスがずれていたり、数個前のレイヤーが問題かもしれない。

###期待しないこと
最低でも数ヶ月は使えないものと想定する。

###自分の成長に利用すること
教えれば自分も上手くなる。
復習になるし、知らなかったことに気づく。

###自分を追い越させるつもりで教えること
そのつもりで教えても、追い越されることなどそうそうない。
教えて簡単に成長するなら、世の中には超人が溢れてるはず。
万一追い越されたなら、上手く指導してやったという恩が売れる。
先に出世して、いつか報いてくれるかも？

###教育指導も技術であると認識すること
教育指導も技術としての1大分野である。
あなたも0から学び、失敗を経て成長すれば良い。

###簡単な作業でも説明をしっかりしておくこと
数分～数時間の説明時間をとる。
あなたにとっては当然だと思うことでも、新人にはよくわからないことも多い。
1.前準備として、特定ワードやURLリンクや書籍を指定し、ざっと読ませて勉強させておく。
　（もちろん業務時間中にさせる。）
2.説明する。会議室などが使えるなら使う。
　質疑応答の時間も数分はとる、質疑ないなら雑談に使う。
　あとでわからなかったり、再確認したかったら聞いてくれと口を酸っぱくしていっておく。
3.作業開始後数分は付き合い、離れた後の30～60分後に進捗を一度確認する。

###過剰な責任は負わないこと
本人の意欲や適性もあるため、
あなたがベストを尽くしたとしても、彼らがどうなるかはわからない。

###[未経験者が認識してなさそうなTIPS](https://qiita.com/Nao9syu/items/0950527548a08ff9d8c9)を読ませること
手前味噌ですが。



##IT技術者として

IT固有ではあまり思いつきませんが、少し書いてみます。
~~Qiitaの記事っぽくするためだけに。~~

###ソフトのインストール作業などを一緒にやって見せること
短期的には自分ひとりでやったほうが早いでしょうが、
長期的にはプロセスを見せたほうが成長すると思います。

###PC作業を観察して助言すること
ペアプログラミングは有名ですね。
筆者はペアプロの経験は少ないですが、作業の観察をしてボトルネックを探すのは好きです。
職種にもよるのでしょうが、一人でモニターを見ることが多いため、
作業プロセスを見て技術を盗む機会はあまりないように思います。
成果物はたくさん見れますが、成果物から作業プロセスを推測するのは難しい。
~~「PC」を消せば「労働者として」に当てはまってしまう。~~
ActiveModel::Errorsをいい感じのJSONで取得したい

いまどきJSからRailsのAPI叩いて更新なんてよくある話。
だけどバックエンド側のエラーレスポンスとかがいまいち定まってないことが多い。
特にバリデーションで困っちゃうことが多いのでこうしてほしい。ということを書いておく。

エラーメッセージの表示なんかではエラー箇所まで特定したいのでこんなレスポンスがほしい。

```json
{
  "errors": {
    "base": ["入力内容に誤りがあります。"],
    "email": ["メールアドレスを入力してください。"]
  }
}
```

即結論なんだけど、こんな感じでJSONに直してねってはなし。

```ruby
errors.to_hash(full_messages: true).to_json
```
[MSSQL]一定時間任意のテーブルをロックする

#はじめに
通常処理中に明示的にテーブルロックする事はあまりないですが、エラー処理の確認を行う時などに重宝します。

```sql:tablelock.sql
BEGIN TRAN
SELECT * FROM テーブル名 WITH(TABLOCKX) WAITFOR DELAY '00:01:00' --任意の待機時間
COMMIT TRAN
```
PhpstormでRemoteDebug

仕事の関係で、既存Phpのプロジェクトを維持する必要となったので、PhpStormでRemote Debugの方法を探ってみた。最善ではないとわかりながらも、すぐ忘れるのでとりあえずメモしておく。

### 環境
1. host はWindows7 pro　（HostにPhp環境なし）
2. VirtualBox でUbuntu14.4（DefultはPhp5.5.9）

### VMに既存システムのプロジェクトを作る  
　　既存プロジェクトを所定のフォルダにおく、必要ならComposerなどDependencyのパッケージをインストールする。GoalはVMで実行できること。  

### VMにSSH,SFTPから接続できるようにする
   Ubuntu を使っているので、コマンド一つで完了。
sudo apt-get install openssh-server

### VMのプロジェクトからローカルプロジェクトを作る
   [本家のInstruction参照](https://www.jetbrains.com/help/phpstorm/create-new-project-specify-remote-server.html)

### Remote Interpreter をセットする
   [本家のInstruction参照](https://www.jetbrains.com/help/phpstorm/configuring-remote-php-interpreters.html)

### ローカルのソースをRemote（VM）にSyncする
[役立った](https://confluence.jetbrains.com/display/PhpStorm/Sync+changes+and+automatic+upload+to+a+deployment+server+in+PhpStorm)

### Remote（VM）にDebug Extensionをインストール
[ここ参照](http://purencool.com/installing-xdebug-on-ubuntu)
>sudo apt-get install php5-xdebug (バージョン注意)
sudo vim /etc/php5/apache2/php.ini （Pathが違うかも）
\# Added for xdebug
zend_extension="/usr/lib/php5/20100525/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000
sudo service apache2 restart

### Fuel Oil をDebugするためには
[参考となった](https://goegoe.net/blog/fuel_tasks/)
ポイント： OilそのものはPhpですが、PhpStormにその点を認識させる必要

### Debug Config

### おまけ
[これも参考していた](https://confluence.jetbrains.com/display/PhpStorm/Working+with+Remote+PHP+Interpreters+in+PhpStorm)
[これも](https://confluence.jetbrains.com/display/PhpStorm/Remote+debugging+in+PhpStorm+via+SSH+tunnel)

時間があったら、DockerでのDebugも一応やってみたいですが。
[Unity] Unity2018の新機能Presetを使ってみた

Unity2018で追加された機能「Preset」を触ってみます。

## 実行環境
- Unity2018.1.0b4
- 追記: Unity2019.2.0f1

## Presetで出来ること
### コンポーネント/アセットの値のファイル書き出し
Unity2018からは下記のようなアイコンがコンポーネント上に表示されるようになります。

<img width="360" alt="preset.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/3aa141e0-16e6-37d3-5ff6-3c7029839b01.png">

これはフォントや画像、音声といったアセットにおいても同等です。

<img width="362" alt="preset2.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/c392ff2f-cc6c-fa3c-1e21-314b1b9ebf0e.png">

この動線から `Save current to...` を選択することでPresetファイルを書き出すことができます。
Presetファイルにはそのコンポーネントやアセットにおける設定値が保持されます。

![preset.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/65137e25-9182-c339-f1c0-28a5a2dd3dd8.gif)

### Presetをコンポーネントに適応する
上記で出力されたPeset(設定値)を特定のコンポーネント/アセットに適応することができます。
コンポーネント/アセットからPresetアイコンを選択し、適応したいPresetを選択します。

![preset2.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/fce49888-868c-0aac-3dcd-7aa1a0e973f4.gif)

また適応したいコンポーネント/アセット名にPresetアセットをドラッグしても適応できます。

![preset3.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/e4341d81-6c40-3d4f-5ceb-74219f4a102d.gif)

### 特定のPresetをデフォルト値とする
Presetアセットの `Set As ~~~ Default` の導線を選択することでデフォルト値を設定できます。
設定された値は、AddComponentもしくはアセットインポート時に適応されます。
当然ながら、同一のコンポーネント/アセットにおいて複数設定することはできません。

![preset4.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/9accb7a1-c1a1-2e81-9442-b3bd2c8fba4e.gif)

## Presetにおける注意事項
### Hierarchy/Menu経由でCreateした場合にデフォルト値が適応されない
#### 追記(20190731)
> Hierarchy/Menu経由でCreateした場合にデフォルト値が適応されない

Unity2019.2にてuGUIのケースにて解消されました！

======

Unity2018.1.0b4までのバージョンにおいて
Hierarchy/Menu経由でCreateした場合にはデフォルト値が適応されないことを確認しました。
(Unity初期値が設定されたPrefabをInstantiateしているような挙動)

![preset5.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/ed988497-5a30-9263-05a9-2d6092194ff8.gif)

ちなみにResetをすることでデフォルト値が反映されます。

![preset6.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/18205d82-2577-eb01-4632-1ca4ba09e74a.gif)


### Prefabと異なり、Preset自体の変更は伝搬できない
Prefabは変更をApplyすることで、Scene上に配置したコンポーネントに変更を伝搬することが可能ですが
Presetアセットを変更しても、既にScene上に配置したComponentやアセットには適応されません。
この場合、再度Presetを指定して変更を反映する必要があります。

![preset7.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/38033117-5bee-fee9-0e2a-6d0eedd405b0.gif)

## Presetの良いと感じた部分
### Prefabと違って対象のComponent以外を管理対象にしなくてよい
Prefabの場合、管理したいコンポーネント以外の情報も保有します。
Presetを使用することで、最小限の運用を行うことができます。

### デフォルト値が設定できる
画像や音声など一括で同一の設定を持っておきたいアセットの設定に重宝するでしょう。
(アセットの設定を持てることがそもそもPresetの大きなアドバンテージとなります)
また `UI.Text` や `UI.Image` において `RaycastTarget` を外しておき
下に描画されたボタンのタッチを阻害する事故を防ぐようなこともできるでしょう。
vagrantで起動したUbuntu上でyumを入れようと苦戦した話

Markdown形式で初めて書くため拙いところもあると思われます。
#目的
vagrantから起動したUbuntu上でoracleのjdkが必要となった．
多くのサイトを参考にし，yum(Yellowdog Updater Modified)を使用してインストールしようとしたところ

```bash
The program 'yum' is currently not installed. To run 'yum' please ask your administrator to install the package 'yum'
```

と出たのでyumがそもそも入っていないと判断．
色々調べたところ自分の知識不足から発生した恥ずかしいミスだと発覚したので，戒めも込めてその解決方法のメモ書き．

#そもそもyumとは？
パッケージ管理ツールの一つ(他にはRPMなどがある)，OSへのソフトウェアの導入と削除，依存関係の整理などを行うツール．

RPMとの違いは依存性の解決機能とパッケージの自動更新機能，リポジトリとの連動などが挙げられる．

[参考サイト](http://uxmilk.jp/9715)

#実行環境
oracle VM VirtualBox上にvagrantを用いて**Ubuntu14.04**を起動して仮想マシン環境を立てる．

#解決方法
結論から言うとこのときUbuntuで起動していたことが問題であった．
[このサイト](https://askubuntu.com/questions/383188/yum-install-fails-on-ubuntu-ec2-instance)によるとUbuntuはDebianをベースに作られており，yumではなくaptを使うようだ．
しかし，当初の目的を一応達成しておきたいのでyumをインストールしてみることにした．

```sh
sudo apt-get install yum
```

としたところyumのインストールに成功．しかし今後使うことは恐らくないであろう．

#結論
私の「CentOSとUbuntuなんて同じLinuxだろう」という甘い考えによって発生したミスであった．
Linux環境を自分で構築するのは初めてのためまだまだ勉強が必要である．
また，[こちらのサイト](http://sig9.hatenablog.com/entry/2015/06/21/081407)によるとyum事態がpython2.xベースで書かれているため今後はdnfへの移行が決まっているそうだ．
pythonの辞書のコピーを色々

pythonで辞書を一部再利用しようとした時に，deepcopyしようとしたんだけど，そこまでやる必要あったっけ？と思って簡単にテストした．

(追記)
そういえば速度テストをしてないことを思い出したので追記．

# 結論

辞書くらい参照の少ないオブジェクトのコピーごときにdeepcopyは要らない．
要素にクラスみたいなオブジェクトを入れてるなら別だが，文字列如きならやっぱし要らない．

(追記)
インポートするのは面倒だけど，実行速度的には
``copy.copy <= dict(x.item()) < copy.deepcopy``
可読性の面では，copyと書かれた方が分かりやすいかな…好みかもしれないが
さすがにdeepcopyは文字列でも遅かった

# 検証

```python3

In [1]: import copy

In [2]: a={1:'a',2:'b'}

In [3]: b=a;c=copy.copy(a);d=copy.deepcopy(a);e=dict(a.items())

In [4]: a
Out[4]: {1: 'a', 2: 'b'}

In [5]: b
Out[5]: {1: 'a', 2: 'b'}

In [6]: c
Out[6]: {1: 'a', 2: 'b'}

In [7]: d
Out[7]: {1: 'a', 2: 'b'}

In [8]: e
Out[8]: {1: 'a', 2: 'b'}

In [9]: a[3]='c'

In [10]: a
Out[10]: {1: 'a', 2: 'b', 3: 'c'}

In [11]: b
Out[11]: {1: 'a', 2: 'b', 3: 'c'}

In [12]: c
Out[12]: {1: 'a', 2: 'b'}

In [13]: d
Out[13]: {1: 'a', 2: 'b'}

In [14]: e
Out[14]: {1: 'a', 2: 'b'}

In [15]: a[2] += 'a'

In [16]: a
Out[16]: {1: 'a', 2: 'ba', 3: 'c'}

In [17]: b
Out[17]: {1: 'a', 2: 'ba', 3: 'c'}

In [18]: c
Out[18]: {1: 'a', 2: 'b'}

In [19]: d
Out[19]: {1: 'a', 2: 'b'}

In [20]: e
Out[20]: {1: 'a', 2: 'b'}
```

(追記)

```python3
In [1]: import copy

In [2]: x = {'a':'aaa', 'b':'bbb', 'c':'ccc','d':'ddd'}

In [3]: %timeit y = copy.copy(x)
        815 ns ± 12.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [4]: %timeit y = dict(x.items())
        1.07 µs ± 2.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [5]: %timeit y = copy.deepcopy(x)
        9.85 µs ± 135 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
```
メモリの使用状況を正しく調査する（freeとかsarとかpsとか）

freeとかtopの見方、覚えられなくてその都度調べて、わりと単純じゃなくて、正しく理解しようとして、その都度悩む。無駄だなぁ。
今回調べたことをここにまとめておこう。

# freeコマンドで実質メモリ消費の確認する
実質メモリ使用量 = kbmemused - ( kbbuffers + kbcached )
つまり、`-/+ buffers/cache:`  行を確認する

### 参考
free, used, buffer, cachedの相関がよく分かる図があります
http://ossfan.net/setup/linux-04.html

# sarコマンドでメモリ要件を確認する
`sar -r -f [saファイル]` で、`kbcommit` 列を確認する

# プロセスごとのメモリ使用量を調べる
`ps alx | awk '{printf ("%s\t%d\n", $13,$8)}' | awk '{m[$1]+=$2;c[$1]++;} END {for(i in m){ if(m[i]>0) printf("%10d %5d %s\n",m[i],c[i],i)}}' | sort -nr`
表示は、メモリ合計(kB)、プロセス数、プロセス名。

### 参照元
http://blog.mekachan.net/?p=228
Ubuntu 16.04 on AWSでリモートデスクトップを実現する(Macから接続)

#前置き
Ubuntu 16.04 on AWSでリモートデスクトップ接続を実現しようとしたらハマったのでメモ。
Mac <-> UbuntuなのでVNCとかでやる方が普通そうなので需要あるかわかりませんが。。

以下のようなページを彷徨い、色々と試したが結果的にうまくリモートデスクトップが動かなかった。（ハマった箇所は色々あったが最後はssh接続は問題なくできているのにリモートデスクトップからだと「Connection Refused」で先に進めない。権限周りなどを色々と確認したがうまくいかなかった。）

https://cryptotrader.muragon.com/entry/56.html
http://akira.matrix.jp/archives/972


#環境
サーバー
- Ubuntu Server 16.04 LTS (HVM), SSD Volume Type on AWS EC2

クライアント
- MacOSX 10.12.6

#解決方法

しかし以下のページのコマンドで一発で行けた。ありがとう。
https://qiita.com/tmikada/items/be27df3affc56eeffd8b

```shell:インストール
$ sudo apt install xrdp xfce4 xfce4-goodies tightvncserver
```

ただし、以降の部分は実行したらうまくいかなかった（接続はされてるが、グレーの画面が表示されてデスクトップが表示されない。Xウィンドウの設定なんだと思うが、時間がないので調査は割愛）。

```shell:実行したらうまくいかなかった箇所
$ sudo vi /etc/xrdp/xrdp.ini
# 以下のように編集
---------
...
#. /etc/X11/Xsession
---------
```

#実施した手順

最終的に実行した一連の流れは以下の通り。

```shell:xrdpのインストール
$ sudo apt install xrdp xfce4 xfce4-goodies tightvncserver
$ sudo service xrdp restart
```

AWSコンソールのセキュリティグループの設定（インバウンド）で以下を追加。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113188/42c87846-e1e3-91ad-8c9d-151740dd3fc3.png)

#クライアントからログイン

Macのリモートデスクトップ接続で設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113188/008b3619-1fcc-7e5a-646e-208dff53a99e.png)

無事にデスクトップに接続。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/113188/bfdd53e8-b41b-6862-c645-adf827577046.png)
役立ちメモ

DI
https://www.slideshare.net/KouheiToki/dispring

SpringBootとは
https://www.slideshare.net/masatoshitada7/spring-boot-jjug

SpringWebFlux
https://www.slideshare.net/makingx/introduction-to-spring-webflux-jsug-sfa1

continuous Delivery
http://www.ryuzee.com/contents/blog/4241

metrics
https://queue.acm.org/detail.cfm?id=3182626
https://devops-research.com/research.html
https://continuousdelivery.com/evidence-case-studies/
https://leanpub.com/measuringcontinuousdelivery

マイクロサービス
https://knowledge.sakura.ad.jp/3377/
コンテナ（Docker）の何が嬉しいのかがすぐに分かる雑なお絵かき

## 動機

以前こんな記事

* [なぜコンテナが期待されるか](https://qiita.com/NewGyu/items/d0b0d6074e13acd51f3e)
* [普段使いのDocker生活](https://qiita.com/NewGyu/items/47ae0cf7e69d11b59f07)

を書いたんですが、もっと簡単に何でコンテナを採用すべきなのかを書きます。

## 状況

テーブルの上に牛乳とか、フォークとか、ご飯とか色々のっていたとしましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/31010/87e35eba-7703-3847-3e1a-27922d30e683.jpeg" width=320px/>

ここでそれぞれが何のメタファーなのかというと下表のようになります。

| 上の絵にあるやつ | 何？ |
|:-:|:-:|
|テーブル   |サーバー   |
|牛乳   |Nginx   |
|フォーク|Node.js 8.x|
|ごはん| 自分の書いたプログラム|
|おかず| 設定ファイル|
|コップ|特定のなんかyumパッケージ|

## お母さんがやってきた

「あんた、ちょっとテーブル変えるから上の物を新しいテーブルに移して！」

![2018_01_31 14_00 Office Lens.jpg](https://qiita-image-store.s3.amazonaws.com/0/31010/f946138d-6911-1523-dcfd-e48402ff83a6.jpeg)

牛乳、フォーク、ごはん、おかず、コップ、それぞれを移すことになりますよね。
システムに例えると、新しいサーバー上でミドルウェアをセットアップするということになります。

## コンテナ is お盆

8月のナスに割り箸刺す時期じゃないです。トレーの方です。
最初からテーブルに直接物を置かずに、トレーの上に置いてあったらどうでしょう？

![2018_01_31 14_03 Office Lens.jpg](https://qiita-image-store.s3.amazonaws.com/0/31010/9d714a6e-52eb-a0f9-a14c-b5c7f0cf4ee9.jpeg)

お盆ごと持ち上げて、新しいテーブルに配置！ オレ、有能！

※画像はあくまでイメージです。実際の動作とは異なることがあります。

## 少し捕捉

昼休みに雑に書いた絵で済ませようと思っていましたが「わかんねーよ」と怒られそうなのですこし真面目に。

### ディスポーザブル

この絵は「可搬性」について書いています。実際にコンテナ化をするとコンテナを新しいサーバーに移すというのは若干ウソです。（export/importでできますけど）

本当は、

1. 古いサーバーは無慈悲に捨てる
2. 新しいサーバーで「イメージファイル」を「リポジトリ」から取ってきて（pull）くる
3. そのイメージファイルを元に「コンテナ」を実行（run）

ということになります。細かいことは、[なぜコンテナが期待されるか](https://qiita.com/NewGyu/items/d0b0d6074e13acd51f3e)を読んで下さいね。

### ステートレス

ここで、コンテナ自身は「ステートレス（状態を持たない）」設計にすることがポイントです。コンテナ自体は状態を持つことも出来ますが、無慈悲に捨てられないと「まぁ、新しいコンテナをイメージから作ればいいや」という気持ちになれないのです。
具体的には、

* ログはsplunkやcloudwatch logsなどの外部ログストレージに出す
* データはデータベースなどに持つ

ということです。

と、いうことでサーバーに直接物を置かずに、お盆の上に置きましょうというお話でした。
libva-intel-driverが生成するBufferのアライメントとオフセットとか

# 背景
[NV12フォーマットのGEM FLINK名からテクスチャを生成する](https://qiita.com/maueki/items/d1ca1b3757703f41bf1d)
を元に `YUV420` フォーマットで生成するにあたって、offset値に困った。
その調査ログである。
wayland + gstreamer-vaapiの環境の話。

# TL;DR
offset値は drmプロトコルのwl_drmインターフェースのcreate_planar_bufferリクエストで見える。
offset値の元となるplanerレイアウト値は、i965_drv_video.c の i965_check_alloc_surface_bo() で設定している。

# create_planarリクエスト
libvaのi965_output_wayland.cのva_GetSurfaceBufferWl()で設定/リクエストしている。

```
offsets[0] = 0;
pitches[0] = obj_surface->width;
offsets[1] = obj_surface->width * obj_surface->y_cb_offset;
pitches[1] = obj_surface->cb_cr_pitch;
offsets[2] = obj_surface->width * obj_surface->y_cr_offset
pitches[2] = obj_surface->cb_cr_pitch;
```

# planarレイアウト
`#define ALIGN(i, n)    (((i) + (n) - 1) & ~((n) - 1))`

bufferの情報は、 `struct object_surface *obj_surface` が所有している。

```
struct object_surface
{
    struct object_base base;
    VASurfaceStatus status;
    VASubpictureID subpic[I965_MAX_SUBPIC_SUM];
    struct object_subpic *obj_subpic[I965_MAX_SUBPIC_SUM];
    unsigned int subpic_render_idx;

    int width; // default: ALIGN(width, 16)
    int height; // default: ALIGN(height, 16)
    int size;
    int orig_width;
    int orig_height;
    int flags;
    unsigned int fourcc;
    dri_bo *bo;
    VAImageID locked_image_id;
    void (*free_private_data)(void **data);
    void *private_data;
    unsigned int subsampling;
    int x_cb_offset; // X offset is always 0
    int y_cb_offset;
    int x_cr_offset;
    int y_cr_offset;
    int cb_cr_width;
    int cb_cr_height;
    int cb_cr_pitch;
};
```

# 確認コード
https://wandbox.org/permlink/RZNwzBcMr0HFGHPS
https://gist.github.com/yuu/d7bd9413d6d1d90fa12638cdec658ec6

wayland_debugのログ↓

```
//                                                                id, name, width, height, format, offset0, stride0, offset1, stride1, offset2, stride2
[2610092.529]  -> wl_drm@14.create_planar_buffer(new id wl_buffer@13, 7, 320, 240, 842093913, 0, 320, 96000, 160, 76800, 160)
```

一緒ですね！終わり。
vscodeのスニペットで$をエスケープする

vscodeでsassのスニペットを作る際に少し困ったのでメモ。
sassだと変数は`$`で定義するので`\\`でエスケープする必要があります。


```json
{
	"variables": {
		"prefix": "variables",
		"body": [
			"\\$variables"
		],
		"description": "variables"
	}
}
```
php: symbol lookup error: php: undefined symbol: pcre_jit_exec

ubuntu14.04 でphp7.2.1を導入した際、以下のようなエラーが発生したので
その時の解決手順を残します

```
vagrant@vagrant-ubuntu-trusty-64:~$ php -v
php: symbol lookup error: php: undefined symbol: pcre_jit_exec
```

```
vagrant@vagrant-ubuntu-trusty-64:~$apt-get install libpcre3
```

```
vagrant@vagrant-ubuntu-trusty-64:~$ php -v
PHP 7.2.1-1+ubuntu14.04.1+deb.sury.org+1 (cli) (built: Jan 11 2018 22:52:58) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
   with Zend OPcache v7.2.1-1+ubuntu14.04.1+deb.sury.org+1, Copyright (c) 1999-2017, by Zend Technologies
```

これで解決です。
AWS DDoS対策勉強まとめ

・DDOS攻撃
複数の攻撃元が協調して大量のパケットやリクエストを送ってサービスを停止させる

・ランサムDDoS
攻撃者が公開サーバーをいつでも停止できる

下記三軸で考える
【高さ】
レイヤーごと
- アプリケーション層攻撃
アプリケーションリソースを攻撃。
HTTPGET

DNSクエリフロッド
→ボットネットと呼ばれる複数の感染ホストを利用し、大量のクエリをDNSに配信

- 状態枯渇攻撃
ファイヤーウォールなどに攻撃
TCP SYNフロッド
→クライアントから意図的にACKを返さないことで、他のユーザがアクセス出来なくする
- ボリューム攻撃
処理できる能力を越えたトラフィックを送る
UDP反射攻撃
→攻撃者はIPを偽装。要求と応答のパケットのサイズ差を利用

【深さ】
アプリケーションごとに対策は違う。
→エッジとリージョンなど

・ウェブアプリケーションの場合
エッジでAWS WAF, CloudFrontを利用
リージョンでセキュリティグループで対策

・クライアント/サーバーアプリケーションの場合
EC2の垂直スケール、拡張ネットワークでトラフィック吸収

・ゲームアプリケーションの場合
Routing Matching ServiceでIP配布
特定のIPのみからアクセスするよう制御

【幅】
・地理的分散
→CloudFrontで配信分散

・攻撃対象隠蔽
→セキュリティグループ使用
→Amazon API Gatewayを利用。Web API公開サーバーを立てない
→ELBでEC2を見せない

・攻撃吸収、緩和
→AWS Shieldによる自動緩和システム
→CloudFrontによるGEOリストリクション
→Route53。高可用性
→ELBとAutoscalingでインスタンスそp増減
→拡張ネットワーク。NICへのアクセスを複数あるようにする

・計画、監視
→CloudWatchでの監視

・AWS Shield Standard
Layer 3/4 protection
→一般的な攻撃から防御
無料

Layer 7 protection
→WAFを利用
→使った分だけ支払い

・AWS Shield Advanced
Standardに加え、より大規模な攻撃からの防御

参考URL:
https://www.slideshare.net/mobile/AmazonWebServicesJapan/20170905-aws-blackbeltddosmitigation-79478348
GitlabのMergeRequestに対するコメントはcommitよりchangesに書くほうがよさげ

# はじめに
Gitlabでドキュメントやコードレビューをしているみなさんこんにちは。

前回、通常コードレビューで使うMergeRequestをドキュメントでも使ってみようという記事を書きました。

[仕様書のレビューをGitlabのMerge Requestでやろう！](https://qiita.com/tk117/items/a4fe44fecf6b8fb0e587)

今回はその続きで、レビューのコメントの付け方についてです。

前回同様、ドキュメントに閉じた話ではなく、通常のコードレビューでも共通している話になります。

# 準備
適当にMergeRequestを作ってみました。

![mr1.png](https://qiita-image-store.s3.amazonaws.com/0/64903/aa9ddb97-7396-b915-598e-5d0541cd0083.png)

# MergeRequestでのコメントのつけかた
コメントの付け方には3通りあります。

## 1. commitで行にコメントする
MergeRequestのCommitsタブから対象のCommitを選択し、Commitの画面に移動します。マウスを行数のあたりに合わせると吹き出しが出るのでクリックしましょう。

コミットの13行目にコメントをしてみました。

![mr2.PNG](https://qiita-image-store.s3.amazonaws.com/0/64903/f1d6788b-a929-ea01-89ed-c740360bb2cc.png)

## 2. commitにコメントする
こちらも同じくMergeRequestのCommitsタブから対象のCommitを選択し、Commitの画面に移動します。下部のコメント欄にコメントできます。

これは特定行に関係なく、commit全体にコメントする感じになりますね。

![mr3.PNG](https://qiita-image-store.s3.amazonaws.com/0/64903/ff01f4c6-d11f-e1de-8461-9ca454cc6ea4.png)

下に書き込まれました。

![mr4.PNG](https://qiita-image-store.s3.amazonaws.com/0/64903/549f2f50-a0cb-ed72-1de5-adf97e370a3d.png)

## 3. changesで行にコメントする
次はchangesにコメントです。

MergeRequestのChangesタブをクリックし、``1. commitで行にコメントする``と同様に行数の付近にマウスを合わせると吹き出しが出るのでコメントできます。

changesはMergeRequestを送っているbranchの1番新しいコミットと、Merge先との差分を示しています。

![mr5.PNG](https://qiita-image-store.s3.amazonaws.com/0/64903/3bfdc4bc-910f-6c46-b843-2ab00239d02c.png)

書き込むとcommitのときと違ってResolve discussionと出ていますね。

![mr6.PNG](https://qiita-image-store.s3.amazonaws.com/0/64903/f07d926f-3486-5b3e-2d7b-0843130548ae.png)

# さらに追加でcommitする
指摘をされたので追加commitで修正しましょう。

コメントがあった13行目をたのしいからたのしくないに変更しました。

![mr7.PNG](https://qiita-image-store.s3.amazonaws.com/0/64903/f3f702d7-b4ff-070f-de47-15e2d7f5d499.png)

changesを見てみると、先ほど指摘したコメントは消えてしまいました。

![mr8.PNG](https://qiita-image-store.s3.amazonaws.com/0/64903/5f26dfe5-0392-dae1-629e-f39bad6d31be.png)

discussionには残っています。

# discussionとは
解決すべき議論ということで、changesにコメントした場合はそれはdiscussionとしてカウントされます。(このボタンを押すと未解決discussionにjumpします。便利。)

![mr9.PNG](https://qiita-image-store.s3.amazonaws.com/0/64903/f761741a-c5ac-2c29-1783-c9b79c3cbead.png)

このdiscussionはどういう意図でつけられているのか、公式ドキュメントを見てみましょう。

[GitLab Documentation - User documentation - Discussions](https://docs.gitlab.com/ce/user/discussions/)

``Commit discussions in the context of a merge request ``にある通り、changesに書き込んだ場合には解決すべき議論としてdiscussionに反映されます。

>Discussions created this way will only appear in the original merge request and not when navigating to that commit under your project's Repository > Commits page.

しかし、commitに紐づいたコメントはそのようにならないため、個別にコミットページに行って確認しないといけません。

(余談)このドキュメント見てて気づいたんですが画像にコメントもできるんですね、すごい

# まとめ
## 今回わかったこと
* MRに対するコメントの付け方は3つあり、discussionになるのはchangesにコメントした場合のみ
* changesに書き込んだコメントは、コメントをつけた行が変更されるとchangesからは表示されなくなる

## 使い分け
チーム内の運用ポリシーによりますが、指摘が解決されたかどうかをresolve discuttionで把握できたほうが便利なので、原則changesにコメントするほうが良いでしょう。反映を確認したら指摘者がresolveすればよいですね。

コミットに対するコメントはdiscussionに反映されるものの、解決すべきものとしては扱われません。補足情報を付加するだとか、修正を要求しないものに対して行うのが良いでしょう。

# おわりに
「指摘したけど反映されていない！」「指摘を管理するのがタイヘン。。。」そんな世界とはおさらばして、たのしいドキュメント開発ライフを！
アニメーションの登録

![スライド45.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/65cdf26a-969c-c62e-2c93-7cefcdd6d861.png)

![スライド46.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/5c10ac6a-991e-4fff-8e62-626972d81874.png)

![スライド47.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/59ed0459-4d21-7304-e07c-0a788e587cc2.png)

![スライド48.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/eb34b204-2efc-ec2a-8de4-0974572980d2.png)

![スライド49.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/0c75b942-8a2f-825a-f4e6-8c193d156de5.png)

![スライド50.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/8d3ca750-ad59-f902-9e94-11da7e44e43c.png)


[目次へ戻る](https://qiita.com/Getabako/items/6c2364f07458351d4370)
【動作確認】RubyのFile.open()にブロックを与えると処理後にクローズしてくれるって本当？

# はじめに

`File.open`の気になった点を解決するべく色々と動かしてみた。

動機の気になったやつら(前回記事)
* [【実際に動かしてみた】RubyのFile.openのブロックによるリソース管理について - Qiita](https://qiita.com/juntetsu_tei/items/df749f10ba144cc23ea3)
* [RubyのFile.openのブロックによるリソース管理について - OSのようなもの](http://d.hatena.ne.jp/wocota/20090426/1240750685)

# 実行

とりあえず色々なパターン動かしてみた。

```ruby
file = File.open('test.txt')
p file
# => <File:test.txt>

file = File.open('test.txt')
file.close
p file
# => <File:test.txt (closed)>
```



```ruby
p File.open('test.txt')
# => #<File:test.txt>

p File.open('test.txt').close
# => nil

file = nil
p (file = File.open('test.txt')).close
p file
# => #<File:test.txt (closed)>

file = nil
File.open('test.txt') { |f| file = f }
p file
# => #<File:test.txt (closed)>

p File.open('test.txt').each {}
# => #<File:test.txt>

p File.open('test.txt').each {}.close
# => nil

file = nil
(file = File.open('test.txt').each {}).close
p file
# => #<File:test.txt (closed)>

file = nil
File.open('test.txt') { |f| file = f }.each {}
p file
# => `each': closed stream (IOError)
```

# 結果


```ruby
file = nil
File.open('test.txt') { |f| file = f }
p file
# => #<File:test.txt (closed)>
```

`File.open()`にブロックを与えると、ブロック処理終了のタイミングでファイルクローズ(`File.close`)していることが分かった。

バージョンは違いますが、動作自体はリファレンス [singleton method File.new (Ruby 2.5.0)](https://docs.ruby-lang.org/ja/latest/method/File/s/open.html) に書いてあるんだからそうですよね。

> path で指定されるファイルをオープンし、File オブジェクトを生成して 返します。
>
> path が整数の場合はファイルディスクリプタとして扱い、それに対応する File オブジェクトを生成して返します。IO.open と同じです。 ブロックを指定して呼び出した場合は、File オブジェクトを引数として ブロックを実行します。ブロックの実行が終了すると、ファイルは自動的に クローズされます。ブロックの実行結果を返します。


# Rubyバージョン

```sh
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
```


# 参考文献

* [【実際に動かしてみた】RubyのFile.openのブロックによるリソース管理について - Qiita](https://qiita.com/juntetsu_tei/items/df749f10ba144cc23ea3)
* [RubyのFile.openのブロックによるリソース管理について - OSのようなもの](http://d.hatena.ne.jp/wocota/20090426/1240750685)
* [singleton method File.new (Ruby 2.5.0)](https://docs.ruby-lang.org/ja/latest/method/File/s/open.html)
ボーンを入れて動くようにする

![スライド36.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/16c3f448-7c36-d2dd-a3e4-921fa8c98f9b.png)

![スライド37.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/d1991e92-724c-d971-9e49-21474b9d5bc1.png)

![スライド38.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/e6eb3bd6-4e43-68c6-c7aa-066b71cc1b80.png)

![スライド39.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/4b3e71ce-9943-8ad9-0e9d-f3a3feb5eae6.png)

![スライド40.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/f077c1d6-e820-dfd0-e951-fec4475fb87f.png)

![スライド41.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/8a0916ba-6456-1143-c9c4-fd44a9f90f9d.png)

![スライド42.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/d92a2746-bedc-f91d-a5b4-5817e90ccda1.png)

![スライド43.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/cbedf8e6-789b-eef2-56a1-d48f58a297be.png)

[目次へ戻る](https://qiita.com/Getabako/items/6c2364f07458351d4370)
Azure Database for MySQLメモ書き

# はじめに
Azure Database for MySQLを使ってみての小ネタをメモしておきます。
※随時更新

# TIME_ZONEを日本時間(JST)にしたい
timstampを日本時間で登録したい場合、どうすれば良いか調べてみました。
日本時間はUTC+9:00となっていることからこのような設定となってます。

* 設定方法
[サーバーパラメータ]ブレードからtime_zoneの設定欄があるので`System`から`+9:00`に変更し、保存する。
![スクリーンショット 2018-01-31 12.52.27.png](https://qiita-image-store.s3.amazonaws.com/0/23761/da1abde9-2951-b77e-1291-201d01f33532.png)

* 確認

```:
mysql> SHOW VARIABLES LIKE '%time_zone%';
+------------------+----------------------------+
| Variable_name    | Value                      |
+------------------+----------------------------+
| system_time_zone | Coordinated Universal Time |
| time_zone        | +09:00                     |
+------------------+----------------------------+
2 rows in set (0.01 sec)
```

# スロークエリを出したい
パフォーマンスチューニングの目的でスロークエリを出したい時の設定です。

* 設定方法  
[サーバーパラメータ]ブレードからslow_query_logの設定欄があるので`Off`から`On`に変更し、保存する。

![スクリーンショット 2018-01-31 13.00.16.png](https://qiita-image-store.s3.amazonaws.com/0/23761/23ac767c-8018-0acc-9153-0b00fc4b63c9.png)

* 確認

```:
mysql> show variables like 'slow%';
+---------------------+--------------------------------------------------------+
| Variable_name       | Value                                                  |
+---------------------+--------------------------------------------------------+
| slow_launch_time    | 2                                                      |
| slow_query_log      | ON                                                     |
| slow_query_log_file | XXXXXX                                                 |
+---------------------+--------------------------------------------------------+
3 rows in set (0.01 sec)
```
※一部伏せてます

# MySQLのバージョンが違う？
Azure Potalからver.5.7で構築したはずなのになんで5.6系となっているんだろう。。。
[これ](https://docs.microsoft.com/ja-jp/azure/mysql/concepts-limits#current-known-issues)のこと？


```:
MySQL [(none)]> status;

Connection id:		65454
Current database:	
Current user:		xxxx@xxxx
SSL:			Cipher in use is ECDHE-RSA-AES256-SHA384
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.6.26.0 MySQL Community Server (GPL)
Protocol version:	10
Connection:		xxxx.mysql.database.azure.com via TCP/IP
Server characterset:	utf8
Db     characterset:	latin1
Client characterset:	utf8
Conn.  characterset:	utf8
TCP port:		3306

```

`select version();`だと5.7表示

```:
MySQL [(none)]> select version();
+------------+
| version()  |
+------------+
| 5.7.18-log |
+------------+
1 row in set (0.01 sec)
```
※一部抜粋

# 接続のセキュリティの「Azureサービスへのアクセスを許可」について  
こちらの設定ですが、てっきり自サブスクリプション内限定かと思ってましたら、他のサブスクリプションのAzure サービス（VM等のリソース）からもつながるようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23761/8f6de1fc-9ec5-d92a-a100-ce974eaad53c.png)



# 参考
[Customize server parameters for MySQL Database on Azure](https://docs.azure.cn/en-us/mysql/mysql-database-advanced-settings)
テクスチャ貼り付け

![スライド23.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/9d99343c-615c-c963-7ba7-8e75bff13728.png)

![スライド24.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/966da6f4-c4ca-712e-3e61-df98f2d28f74.png)

![スライド25.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/802dd302-fdb6-e4fe-81f3-5d7a5dc3984f.png)

![スライド26.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/8ac3cb62-214d-c43d-b1b9-6897a707907a.png)

![スライド27.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/c230feb2-9a06-3349-2adb-3d11e0d1c818.png)

![スライド28.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/2afac351-3e77-057a-976b-abea4a8c4ded.png)

![スライド29.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/6604b48e-31ae-7aa0-d3a4-2b0b74fd7499.png)

![スライド30.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/30fcddac-f088-cf8e-6f4a-f359160f81fa.png)

![スライド31.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/59449823-90d4-d34f-e455-a80fd6f34ab6.png)

![スライド32.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/cccd3c5f-9f44-66f3-e274-18a2a725274f.png)

![スライド33.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/c2df9a20-0873-5cce-26a3-1c764e005fe4.png)

![スライド34.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/4c58c88a-2acc-7dda-5a32-39b1cf0e679e.png)

[目次へ戻る](https://qiita.com/Getabako/items/6c2364f07458351d4370)
Microsoft Access から Azure SQL Database にデータ移行する方法

Access データベースを Azure SQL Database に移行するには、Microsoft SQL Server Migration Assistant v7.6 for Access というツールが提供されています。

## ダウンロード
DataBase移行ツール（SQL Server Migration Asistant For Access:SSMA）のダウンロートは、下記URLより可能です。
https://www.microsoft.com/en-us/download/details.aspx?id=54255

## 移行手順
SQL Server Migration Asistant（SSMA）を起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/a6d73de8-115c-f97f-4435-925e6a58d6f2.png)

プロジェクト名は適当でOK、Migrate TO は［SQL Azure］を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/3a041fee-4038-aa53-9aeb-4eb6491d828d.png)

［AddDatabase］を押して、移行する Access Database を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/f3ba846c-7523-0ba5-a37f-59c1b2f46f4a.png)

移行するテーブルを選択しますが、全て移行する場合は、そのまま［Next >］を押してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/6f4222f7-5331-8216-f9f1-f4968767de21.png)

移行先のAzure SQL Database を指定します。Azure Database は、事前に作成しておく必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/817ea484-3ebb-c806-cea3-fc020bd5b17a.png)

Azure SQL Database に接続できない場合は、下記のような警告メッセージが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/81a5b491-c115-c19c-baa8-11de7362f565.png)

Azure SQL Server のファイアウォール設定を行い、接続元のIPアドレスを許可する必要があります。［ファアウォール設定の表示］を押してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/13767a6a-b676-86c5-b3cf-d44a214c5ec0.png)

［クライアントIPの追加］を押して、［保存］してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/dd29dfee-09c8-32d9-1726-13193cf045fb.png)

［OK］押すと、移行作業が開始されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/ebaec368-b899-354b-9616-7d8c4313a1f6.png)

作業レポートが表示されます。［Close］を押して完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/b5f58675-369e-afdf-4962-abae5e78d4fe.png)

Access Database をAzure SQL Database に移行することにより、データをクラウドで共有することができます。

---
▼Accessを使って、「Accessをクラウドで運用する方法」をブログで発信しています。
よろしければ、お立ち寄りください。

汎用データベース「カードボックス BARI」
[![20180805_1.png](https://qiita-image-store.s3.amazonaws.com/0/93227/1250448c-ae0c-de0d-8df9-acc82710bd1c.png)](https://access-cloud.hatenablog.com/entry/cardbox-bari)
https://access-cloud.hatenablog.com/entry/cardbox-bari
犬のモデリング

![スライド9.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/d448c74b-8c4f-566f-82a1-c738b05c28d8.png)

![スライド10.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/fbab7d5d-8b02-80da-3000-e397bc16915f.png)

![スライド11.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/1e7a6fe8-0bfe-a3b0-4d55-e5463c23d65e.png)

![スライド12.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/080708bf-7c4c-0b13-b409-12174b88031b.png)

![スライド13.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/63165b81-5f7e-addd-bea4-46e846206df0.png)

![スライド14.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/ec585a65-7070-91a5-cdac-0f55374e49c5.png)

![スライド15.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/c75c4df1-e399-ba62-8577-dc324f1a8e16.png)

![スライド16.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/c7e9ae91-429d-fcc6-5761-5ede07e2c7e7.png)

![スライド17.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/31c1f674-1c29-af17-8680-acffc163fe28.png)

![スライド18.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/710c9a7c-7f32-4055-8846-48c61e9e9f43.png)

![スライド19.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/5234affe-b333-b019-4044-5ac1f6780f54.png)

![スライド20.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/d0b5ee90-1008-51b0-1807-357d6e07c59f.png)

![スライド21.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/41b5c033-986c-2f8c-a1a1-0d366392e37b.png)

[目次へ戻る](https://qiita.com/Getabako/items/6c2364f07458351d4370)
blenderで犬を作ろう

![スライド6.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/28080aaf-cb39-3c3e-f43d-292871d8bb77.png)

[モデリング編](https://qiita.com/Getabako/items/e6c97c286117fc12283e)

[テクスチャ貼り付け編](https://qiita.com/Getabako/items/07f6cb635f8e6ac0a741)

[ボーン設定編](https://qiita.com/Getabako/items/b79235a38a6ffb47e6dd)

[アニメーション編](https://qiita.com/Getabako/items/17fe62c9e5df32ffe05c)

[目次へ戻る](https://qiita.com/Getabako/items/ab1bb2e1b0cbb7dd7c68)
Windowsエクスプローラから一旦FTP接続したら他のFTP接続できなくなった


#事象
AzureWebAppsでFTPホストに接続してファイルアップロードとかしてたんだけどまた別のFTPホストに接続しようとしても前のFTPホストに接続してしまう

- FTPホストその1
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/8e9c5b5b-c02b-3877-a583-bb84dc8a3358.png)

- FTPホストその2
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/5a66c4d2-b2a5-ca23-8c54-1f382b9aa816.png)

違うサブスクリプションで作ったWebAppsだけどFTPホスト名一緒なのね…そういうもんか？
初回の接続時にはFTPユーザとパスワード聞いてきたんだけど聞いてくれないので切り替えできん。

 - エクスプローラで接続するとこうなる
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/2e70ab7b-7a61-57f2-882c-4c5c58498f89.png)

 - Cyduck使って接続するとFTPユーザ/パスワード聞いてくるので切り替えできる。若干ファイル違うのでこれその2の方ね。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/39091de8-b9a9-cf1b-e511-f17b5c2a5965.png)

多分FTPログオン情報みたいなのが残ってるんだと想像。
別にエクスプローラ使わなければいい話だけど気持ち悪いし。
以下で解消したのでメモ。

#対処方法
###レジストリエディタ起動
コマンドプロンプトでregeditコマンドで起動します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/c6d3938c-f3f7-805a-a604-14791a8c332b.png)

###FTPアカウント情報確認
レジストリエディタで以下配下にあるキーを確認します。
HKEY_CURRENT_USER\Software\Microsoft\FTP\Accounts
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/adb66b5f-9970-2897-9099-a9a76d5efd57.png)
接続先のクライアントごとにキーが作成され、その配下にさらにアカウント情報が記録されるようです。

###FTP接続アカウント情報の削除
レジストリキー削除します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/411981f4-0fe6-dd73-d9fe-341199ebc491.png)

###再度エクスプローラでFTP接続
ユーザ認証画面でた！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/0d4b2edc-a5d9-30d3-2ffe-bd012f56b146.png)

###接続できた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/1ad58c96-d93f-6508-0d11-bd957cfd459c.png)

##サブスクリプションIDが別なのになんでFTPホスト名同じなの？
Azureサポートに聞いてみた。

>App Service の FTP ホスト名については、各リージョン内に複数存在する ”スタンプ” と呼ばれる単位ごとに定まっております。
App Service インスタンスは、内部的にはデータセンター内に複数存在するホスト OS 上の Hyper-V のゲスト OS (Azure VM) として動作をしておりますが、それらのインスタンス (Azure VM) の集合体を “スタンプ” と呼び、各リージョンにはスタンプが複数存在します。
そして、同じスタンプをご利用いただいているユーザー様では FTP ホスト名が同一となり、FTP デプロイ ユーザー名の “\” マークの前の情報 (App Service 名) を利用し、アクセス先の App Service を判断します。
※ スクリーン ショットに表示されている ”waws-prod-dm1-023” の “dm1-023” の部分が、スタンプを指し示す文字列です。
なお、同じ App Service プランを利用してデプロイした App Service は、同じインスタンス上で動作いたします。
上述の通り、スタンプはインスタンスの集合体ですので、同じ App Service プランを利用してデプロイされ、同じインスタンス上で動作をする App Service は同じスタンプ、つまり同じ FTP ホスト名を持ちます。
また、複数の App Service を異なる App Service プランを利用してデプロイいただいた場合でも、ご利用いただくスタンプはランダムに定まるため、すべて同じ FTP ホスト名となる可能性はございます。

#参考になるページ
- Azure App Service の リージョンとスタンプ、IP アドレスについて
https://blogs.msdn.microsoft.com/jpcie/?p=325

- Windows エクスプローラーを使ったFTP接続方法
http://xn--hostgator--tx4i9cssv854df9de53p.com/windows-explorer-ftp/