OmniAICreator/Qiita-1.07M huggingface dataset:
Golang（echo） in Docker for Mac

GolangをDockerコンテナ内で行うためのセットアップ方法について記載していきます。

### 概要
- docker-composeを利用して、`docker-compose up`をしたら環境ができあがる。
- port80でLISTENするappサーバで、curl経由で叩くと"Hello world"を出力する。
- 言語はgolangで、フレームワークはechoを使用してみます。
- docker-compose-upするとDockerコンテナ内の/app内にマウントされている状態

### 行うべきこと
- docker-compose
- Dockerfile
- main.go

### ディレクトリ構造
```
-app
 ├ Dockerfile
 ├ docker-compose.yml 
 ├ main.go
```

### 事前準備(Goインスール)
仮にGoがインストール済みの場合は飛ばしてください。

```bash:goenvインストール
$ brew install goenv
```

```bash:.bashrc
# 追記
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval "$(goenv init -)"

# 再起動
$ source ~/.bashrc
```

```bash:Golangインストール
# バージョンはお好みでお願いします。
$ goenv install 1.10.0　 
$ goenv global 1.10.0 
```

```bash:goバージョン確認
$ go version
go version go1.10 darwin/amd64
```

```bahs:$GOPATH指定~.bashrc~
#追記
export GOPATH="$HOME/go"
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin

# 再起動
$ source ~/.bashrc
```

```bash:echo
$ go get github.com/labstack/echo/...
```

---

## 構築作業
以下のGitHubに公開しています。
[i35-267-m/docker-go](https://github.com/i35-267-m/docker-go)

### docker-compose.yml
```bash:docker-compose.yml
version: '3'
services:
  api:
    build: .
    command: go run main.go
    volumes:
      - .:/app 
    ports:
      - 1323:1323
```

### Dockerfile
```bash:Dockerfile
FROM golang:1.10.0

RUN go get github.com/labstack/echo/...

WORKDIR /app
ADD . /app

CMD ["go", "run", "main.go"]
```

### main.go
```bash:main.go
package main

import (
  "net/http"
  "github.com/labstack/echo"
)

func main() {
  e := echo.New()
  e.GET("/ping", func(c echo.Context) error {
    return c.String(http.StatusOK, "Hello, World!")
  })
  e.Logger.Fatal(e.Start(":1323"))
}
```
引用 :https://qiita.com/shibacow/items/320679971bfd5d834b80

### コンテナ生成+起動

```bash:-dでバックグランドで起動
$ docker-compose up -d
```
`docker ps`, `docker images`で起動しているかを確認してください。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker-go_api       latest              0819586c7162        5 hours ago         797MB
golang              1.10.0              d632bbfe5767        5 months ago        779MB

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
12db2718a671        docker-go_api       "go run main.go"    5 hours ago         Up 44 seconds       0.0.0.0:1323->1323/tcp   docker-go_api_1
```

実行イメージ(-dなし)

```
$ docker-compose up 
docker-go_api_1 is up-to-date
Attaching to docker-go_api_1
api_1  | 
api_1  |    ____    __
api_1  |   / __/___/ /  ___
api_1  |  / _// __/ _ \/ _ \
api_1  | /___/\__/_//_/\___/ v3.3.dev
api_1  | High performance, minimalist Go web framework
api_1  | https://echo.labstack.com
api_1  | ____________________________________O/_______
api_1  |                                     O\
api_1  | ⇨ http server started on [::]:1323
```


```bash:curlで通信してみます。
$ curl http://127.0.0.1:1323/ping
Hello, World!
```

無事、『Hello, World!』がでたら成功です！
cypressでintegrationフォルダ以外を対象にしたい時

Angularのテストランナーをkarma→cypressに乗り換えたときに
デフォルトのspec探索パスが'/cypress/integration/**.spec.ts'になっているのを変更したい

# TL;DR

- package.jsonのscriptsを変更する
- cypress.jsonの設定を追加する

# 対象読者

- cypressを使う人です

# デフォルト設定

cypressをインストールしてすぐだと、cypressフォルダが生成され、
cypress/integration/配下にあるspecファイルだけがテストの実行対象になっているはずです。

```
cypress
  ├── fixtures
  │   └── example.json
  ├── integration
  │   └── test.spec.ts
  ├── plugins
  │   ├── cy-ts-preprocessor.js
  │   └── index.js
  ├── support
  │   ├── commands.js
  │   ├── index.js
  │   └── po.ts
  └── tsconfig.json

```

しかし、angularではsrc/app配下にspecファイルが生成されるので、そのspecファイルを対象にしたい・・・


# 1. package.jsonのscriptsを変更する

cypress runだけだと、cypress/integration配下specファイルだけですが、--specで対象を変更できます。

```package.json

{
  "scripts": {
    "test": "cypress run --spec 'src/app/**/*.spec.ts'",
  },
  (以下省略)
}

```


# 2. cypress.jsonの設定を追加する
cypressフォルダがデフォルトになっているので、
あとはcypress.jsonで'./'相対パスになるよう追加すれば完了です。

```cypress.json

{
  "integrationFolder": "./"
}

```

すると

```
src/app
├── app.component.pug
├── app.component.sass
├── app.component.spec.ts
├── app.component.ts
├── app.module.ts
├── favorite-lists
│   ├── favorite-lists.component.pug
│   ├── favorite-lists.component.sass
│   ├── favorite-lists.component.spec.ts
│   ├── favorite-lists.component.ts
│   └── favorite-mock-lists.ts
└── top-toolbar
    ├── top-toolbar.component.pug
    ├── top-toolbar.component.sass
    ├── top-toolbar.component.spec.ts
    └── top-toolbar.component.ts
```

src/app配下のspecファイルが対象にできました:santa:


# 参考


https://github.com/cypress-io/cypress/issues/2256#issuecomment-410389944
実践 Atomと正規表現で検索置換してみた1

人からもらったCSVのデータを整形してRubyのハッシュや配列
にするのに、まだウロ覚えの正規表現を使ってみた。
まずは、Part1として復習を兼ね、必要そうな正規表現を思い出してみる。
Atomでの実際の検索置換は[Part2](https://qiita.com/gestalt/items/c79cdaf4db9edd67e988)で書いているので、せっかちな方はリンク先に飛んで頂ければと思います。

### 元のデータ

```
Tokyo,130,,
Kanagawa,110,,
Saitama,105,,
Chiba,108,,
```

### 最終形態

この状態にしたい。

```ruby
{ Tokyo: 130, Kanagawa: 110, Saitama: 105, Chiba: 108 }

```

### 必要そうな知識

必要となりそうな正規表現の知識の候補は以下となる。
実際に[Part2](https://qiita.com/gestalt/items/c79cdaf4db9edd67e988)を書いてからこのPart1を見直すと`必要なかった`ものもあったが、正規表現の勉強＆復習という観点から、敢えてこのままにしてきますが、ご容赦下さい。

(1).行頭を抽出

(2).行末を抽出

(3).改行箇所を抽出

(4).英字で書かれている箇所の抽出

(5).数字で書かれている箇所の抽出

(6).カンマが複数書かれている箇所の抽出。


### 答え

#### (1).行頭を抽出
`^`
#### (2).行末を抽出
`$`
#### (3).改行箇所を抽出
`\n`
#### (4).英字で書かれている箇所の抽出
`[a-z]`
ただし、これだと文字単位で抽出されるので
単語単位で抽出したいなら
`1回以上の繰り返しのうち最長`を意味する
`[a-z]+`
#### (5).数字で書かれている箇所の抽出
`\d`
ただし、これだと1文字単位で抽出されるので
まとまりで抽出したいなら
`1回以上の繰り返しのうち最長`を意味する
`\d+`
#### (6).カンマが複数書かれている箇所の抽出。
`,{2}`
ここで使っているのは{n,m} の量指定子。直前の文字(ここで言えばカンマ)が `n 個以上、m 個以下` という意味なる。今回は `2以上` だけでよいので {n} の形だけでよい。

実際にAtomでの検索置換は[Part2](https://qiita.com/gestalt/items/c79cdaf4db9edd67e988)にて。


[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」]
(https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)

[Ruby 正規表現のまとめ]
(https://qiita.com/agotoh/items/87960d256e427d5673a9)
実践  Atomと正規表現で検索置換してみた2

人からもらったCSVのデータを整形してRubyのハッシュや配列
にするのに、まだウロ覚えの正規表現を使ってみた。
[Part1](https://qiita.com/gestalt/items/d9883014344992183191)では必要となる正規表現のおさらいを行ったので、
当ページではAtomでの実際の検索置換をPart2として行ってみる。
なお、あくまで正規表現の練習なので、`最短のやり方` では `ない` かもしれませんが、ご容赦下さい。

### 元のデータ

```
Tokyo,130,,
Kanagawa,110,,
Saitama,105,,
Chiba,108,,
```

### 最終形態

この状態にしたい。

```ruby
{ Tokyo: 130, Kanagawa: 110, Saitama: 105, Chiba: 108 }
```

### Step1 カンマを除去

これは素直に以下の様にして`Replace All`すればOK。
<img width="727" alt="スクリーンショット 2018-09-08 23.04.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/163778/b002b776-c223-1a55-8562-843f8c58efaf.png">



### Steap2 Atomで正規表現モードにする

`検索` → `置換` メニューで検索置換機能を呼び出し、以下の画像の `*` の部分(青と白で反転している部分)をクリックして正規表現オプションをONにする。
<img width="697" alt="スクリーンショット 2018-09-08 22.31.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/163778/afcc6b83-895d-8532-5ecb-28cca53a44bc.png">

### Step3 文字列の後ろにセミコロンと半角スペースを加える

#### Before

```
Tokyo130
Kanagawa110
Saitama105
Chiba108
```

#### After

```
Tokyo: 130
Kanagawa: 110
Saitama: 105
Chiba: 108
```

#### 正規表現の書き方
<img width="728" alt="スクリーンショット 2018-09-08 22.42.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/163778/1dbb8635-3368-825b-c091-7a0bf8c3f8aa.png">

まず`[a-z]`で`英字`を抽出するが、これだけだと英字が１つ１つ別に抽出されてしまう。そこで`[a-z]+`とする。これは`+`が`1回以上の繰り返しのうち最長`を意味するからである。

#### 置換のやり方

正規表現としては`[a-z]+`でOKだが、実際に行いたいのは抽出である。まずは、Atomoの`Find in a current buffer`となっている入力欄に抽出の正規表現を入力したら`全体をカッコで囲む`、その結果、上記の画像の様に`([a-z]+)`になる。

続いて、`抽出後にどうしたいか`を入力する。Atomの`Replace in current buffer`の入力欄に、まず`$1`と入力する。この`$1`はカッコで囲った正規表現の部分に対応している。なお、今回は一箇所しかないので`$1`となっているが、複数の場合は`$1` `$2`・・・となる。

抽出した部分の後にコロンと半角スペースを付け足すので、最終的には`$1: `として(半角スペースと分かりくいけど）`Replace`ボタンをクリックする。実行前に抽出箇所を確認したい場合は`Find all`をクリックすればよい。

### step4 行末にカンマと半角スペースを追加

これは以下でよし（半角スペースが見えないけど）。
<img width="718" alt="スクリーンショット 2018-09-08 23.11.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/163778/5bfd8e2d-a199-a257-be78-c5681eae7e88.png">

#### After

```
Tokyo: 130,
Kanagawa: 110,
Saitama: 105,
Chiba: 108,
```

### step5 改行を除去

改行は`\n`なので以下の様になる。

<img width="724" alt="スクリーンショット 2018-09-08 23.13.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/163778/ca765534-c7c1-f772-71cd-98a34f38dad2.png">

#### after

```
Tokyo: 130, Kanagawa: 110, Saitama: 105, Chiba: 108,
```

### step6 最後は手作業

ハッシュの開始や閉じは１つだけなので手作業で入力し、また最後のカンマも削除して以下の様になり終了。

```ruby
{ Tokyo: 130, Kanagawa: 110, Saitama: 105, Chiba: 108 }
```











## 参考
[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」]
(https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)

[初心者歓迎！手と目で覚える正規表現入門・その２「微妙な違いを許容しつつ置換しよう」]
(https://qiita.com/jnchito/items/64c3fdc53766ac6f2008)

[Ruby 正規表現のまとめ]
(https://qiita.com/agotoh/items/87960d256e427d5673a9)
at coder beginner contest 004

B
高橋君は 4 x 4 マスの盤面を見つけました。
各マスには .ox のいずれかの文字が書かれています。
彼はこの盤面を回転させた後、どういった状態になるのか気になりました。
盤面を正面から見たときの状態が与えられるので、180 度回転させた後の盤面を出力してください。 

```
#include<iostream>
using namespace std;

int main() {
	char c[4][4];
	char copy[4][4];
	for (int i = 0; i < 4; ++i) {
		for (int j = 0; j < 4; ++j) {
			cin >> c[i][j];
		}
	}
	for (int i = 0; i < 4; ++i) {
		for (int j = 0; j < 4; ++j) {
			copy[i][j] = c[3 - i][3 - j];
		}
	}
	for (int i = 0; i < 4; ++i) {
		for (int j = 0; j < 4; ++j) {
			cout << copy[i][j]<<" ";
		}
		cout << endl;
	}
	return 0;
}
```

C
ここにカードが 6 枚あり、それぞれ 1 から 6 までの整数が書かれています。
最初、左から右へ 1 のカードから 6 のカードまでがソートされた状態で並んでいます。
高橋君には整数 N が与えられます。高橋君は以下の操作を i=0,1,2, … ,N−1 に対して i=0 から 順番に行います。 
左から (i mod 5)+1 番目にあるカードと、左から (i mod 5)+2 番目にあるカードの位置を入れ替える。
mod とは、「剰余」を意味し、例えば 8 mod 5 は 3 であり、15 mod 5 は 0 になります。 
ここで実際に N=5 のときに行われる操作を例示します。
i=0 のとき：
(0 mod 5)+1 = 1、(0 mod 5)+2 = 2 より、左から 1 番目のカード」と、「左から 2 番目のカード」を入れ替えます。 

```
#include<iostream>
using namespace std;

int main() {
	int n;
	while (cin >> n) {
		int a[6] = { 1,2,3,4,5,6 };
		n %= 30;
		int i = 0;
		while (i < n) {
			for (int j = 0; j < 5; ++j){
				swap(a[j], a[j + 1]);
			    i++;
			    if (i >= n)break;
		    }
	    }
	for (int i = 0; i < 6; ++i)cout << a[i];
	cout << endl;
    }
}
```
30回で元に戻るっていうループになってる。ifとwhileは普通にこういう使い方もできるのか

二回目。３０回で元に戻るの気づかなかったでもコードはずいぶんと簡潔にかけるようになってきた気がする

```
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main() {
	int N;
	cin >> N;
	int n = N % 30;
	string S = "123456";
	for (int i = 0; i < n; ++i) {
		swap(S[i%5], S[(i%5)+1]);
	}
	cout << S << endl;
	return 0;

}
```
拡張機能Mouse DictionaryをFirefoxでも使いたい


**(2018/9/10追記)**
作者様がFirefox対応を準備しているようです。ベータ版が公開中！詳しくは[こちら](https://qiita.com/wtetsu/items/c43232c6c44918e977c9)から
そしてこの記事はもはや用済みだー

# Mouse Dictionaryとは
Chromeブラウザで使用できる、英単語をマウスオーバーすると単語(+熟語)の意味を表示してくれる便利な拡張機能です。
詳しくは[こちら](https://qiita.com/wtetsu/items/c43232c6c44918e977c9)

# Firefoxで使いたい
本拡張機能はWebExtensionsで実装されているので、おおむねFirefoxでも互換性があるはず。ちょっといじってみたらFirefoxで使えないかなー。

ということで試してみました。

過程とかいいから結果はどうなの、という方は[こちら](#結果)からどうぞ。

# 手順

## manifest.json編集

まずはGithubから一式をダウンロードしてきます。

    $ git clone https://github.com/wtetsu/mouse-dictionary

次にsrc/manifest.jsonをいじります。以下の部分が対象です。

```json:manifest.json-before
"background": {
  "scripts": ["background.js"],
  "persistent": false 
},
"browser_action": {
  "default_title": "Mouse Dictionary"
},
```

2か所編集します。
1つは、persistentを削除します。前の行のカンマも忘れずに消しておきましょう。
もう1つは、default_iconを設定します。これがないとアドオンのボタンにアイコンが適用されません。

```json:manifest.json-after
"background": {
  "scripts": ["background.js"]
},
"browser_action": {
  "default_icon": "icon48.png",
  "default_title": "Mouse Dictionary"
},
```

## ビルド

node.js(+npm)がいるようです。とりあえず[公式サイト](https://nodejs.org/ja/)からテキトーに最新版(Node.js10.10.0, npm6.4.1)をダウンロードしてきて、インストールしました。

そして、以下のコマンドを実行

```
$ npm install
$ npm run build
```

## 動作確認

Firefoxのアドレスバーからabout:debuggingと入力し、「FireFox 開発ツール デバッガー」を開きます。上部のボタン「一時的なアドオンを読み込む」を押して出てくるダイアログで、先ほど編集したmanifest.jsonを指定します。

# 結果

一応、動くことは動くっぽい。
ただし、今のところ少なくとも2つ、問題があります。

## 問題点1. 大きな辞書を食わせるとクラッシュする

アドオンの設定画面から、辞書データを読み込ませることができるのですが、BOOTHで購入してきた「英辞郎」の[テキストデータ](https://booth.pm/ja/items/777563)(約128MB)を読ませたところ、途中でブラウザごとクラッシュしました。

**(2018/9/10更新)**
問題はFirefoxにおけるメモリの使用量に起因する可能性が高いです。上記の英辞郎データの読み込み時のメモリ使用量はMax7GBにもなり、メモリスワップ領域を少なく設定しているLinux環境などではブラウザがクラッシュする可能性があります。Windowsでは自動的にメモリスワップが行われるため、問題はありませんが、一時的にシステムの動作が鈍くなる可能性があります。


## 問題点2. 署名しないと不便

上記の方法でアドオンを読み込ませると、ブラウザ終了時にすべての情報が削除されてしまいます(アドオンも、辞書データも)。デバッグ用だから仕方ないんです(むしろ残ったら困る)。それを避けるための手段はアドオンパッケージ(.xpi)を作成してインストールすることです。

xpiは実際はただのzipですので、distフォルダ以下のファイルを全部まとめてzipしてしまえば簡単に作れます。

    $ cd dist
    $ zip -r mouse-dictionary.xpi *

ただし、このままではFirefoxはセキュリティ上、このxpiを受け付けてくれません。署名が必要で、そのためには開発者登録が必要で、という感じに面倒な手順が必要です。詳しくは[こちら](https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/Distribution)を参照願います。

[Waterfox](https://www.waterfoxproject.org/en-US/)なら未署名のxpiでもインストールできます。

# まとめ


~~・ちょっと修正すれば動く~~
~~・**大きな辞書ファイルは使えない(要追加検証)**~~
~~・使うときはFirefoxではなくWaterfox推奨(署名の都合上)~~
・Firefox版アドオンの正式公開を待とう(あるいは[ベータ版](https://addons.mozilla.org/ja/firefox/addon/mousedictionary/)を試そう)
・Linuxユーザーでデータ読み込み時にブラウザがクラッシュする場合は、メモリをたくさん積む(16GB推奨)か、スワップ領域をたくさん確保しよう
「AMI削除時にスナップショットも自動で削除する」でつまづいたこと・対処したこと

# 執筆日
2018/09/09

# 事象
下記の記事などを参考に「AMI削除時にスナップショットも自動で削除する」設定をしてみたけど、一向にスナップショットが削除されない、という事象に遭遇しました。

[AMI削除時にスナップショットも自動で削除するCloudWatch Events](https://dev.classmethod.jp/cloud/aws/ami-and-snapshot-delete/)
[AMI登録解除時、スナップショットを自動で削除するように設定してみました！](https://coatiblog.sios.jp/ami%E7%99%BB%E9%8C%B2%E8%A7%A3%E9%99%A4%E6%99%82%E3%80%81%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92%E8%87%AA%E5%8B%95%E3%81%A7%E5%89%8A%E9%99%A4%E3%81%99/)

参考記事では、AMI削除時にCloudTrailに記録される「DeregisterImage」オペレーションをトリガーにして、Lambda関数でスナップショットを削除する、という感じで設定しています。
が、AMIを削除し、CloudTrailのイベント履歴で当該オペレーションが検索されるようになっても、スナップショットが削除されません・・・

# 対処したこと
CloudTrailの「証跡情報」で、「証跡の作成」を行いました。
設定は↓のような感じです。
　※「管理イベント」は、今回のケースでは「書き込み専用」でもいいと思います
![cloudtrail-shoseki.png](https://qiita-image-store.s3.amazonaws.com/0/115750/a39f5e9a-8ba2-cd63-7e3a-5f0a5b9170eb.png)

↑を行ったところ、AMIを削除した後、しばらくした後にスナップショットが削除されるようになりました。
（コンソール上では、AMIを削除した直後にスナップショットは削除されず、しばらくした後にスナップショット削除されていました。）

AWSのユーザーガイド（[証跡のデータイベントと管理イベントのログ記録](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/logging-management-and-data-events-with-cloudtrail.html)）にもありますが、「CloudWatch Events」を利用するには「証跡の作成」を行う必要があるみたいです。
単に自分の知識不足でした・・・というお話です。。
Azure Functions を試してみた

# Azure Functions とは？
Microsoftのクラウドサービスのこと。
サーバーレスと呼ばれているものですが、別にサーバーが無い、サーバーが要らないということじゃなくて、
サーバーの存在をほとんど意識せずにWebサービスを作ることが出来るものです。

WebAPIをとても簡単に作ることが出来るフレームワークと言った方が分かり易いでしょうか。

[Microsoft Azure](https://azure.microsoft.com/ja-jp/)

# 試しにサービスを作ってみる
## ポータルから App Service を作成する
ポータルメニューの「すべてのサービス」もしくは「お気に入り」から「App Service」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/4f21bb60-5766-a35f-7531-39535fef3b67.png)

「追加」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/f63120ac-4cc1-14b6-045e-69fb20c026d4.png)

## Function App を選択し、サービスを「作成」します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/7b8536c9-a07a-c341-78c8-bd63c4d430d1.png)

作成するアプリ名を設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/15cf53c6-90ef-2572-eb2d-8922873052bb.png)
アプリ名：他の利用者と被らないアプリ名(ホスト名)を付けます。
サブスクリプション：無料の人は無料のアカウントを選択します。
リソースグループ：１つのアプリは複数のサービスから構成されるので、それらのグループ名です。
場所：日本であれば「東日本」か「西日本」を選択すれば良いです。Azureのデータセンターが日本に2か所有ります。
Storage：Azure FunctionsがStorageを使用しますので、そのアカウントも併せて作ります。
Application Insights：アプリの動作状況を監視する仕組みです。

作成したアプリはAzureメニューの「すべてのリソース」や「リソースグループ」から辿ることが出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/df7f6970-d50b-1751-a2f5-bdb4bee7b18a.png)

「種類」が「App Service」となっているところで実装します。

## 関数を実装する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/f0621b20-09bc-ed22-03db-4fd5c664748f.png)
「関数」から「新しい機能」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/6383bcee-3cd9-a7a1-9d69-198b2671ae6d.png)
色んなパターンのテンプレートが用意されています。

HTTPのリクエストに対して応答を返す標準的なものや、POSTされたデータをテーブルに保存するもの、さらにはタイマーで起動するものなど。様々な入力パターンをトリガーとして、様々な出力パターンの組み合わせが選択出来ます。
後からカスタマイズも可能です。
これらを連携させてアプリを構築していきます。

### HTTP triggerのテンプレートから作成してみる
HTTP要求に対して応答を返す機能です。
標準で、C#, F# JavaScriptが開発言語として選べます。
オプションでPhthonやTypeScriptなども可能なようです。

ここでは、言語をJavaScriptで作成してみます。
「承認レベル」はFunctionにしておきます。

以下がテンプレートとして生成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/279c7c6d-cf35-d616-4032-10714902980d.png)
既に、「実行」ボタンを押すと「ログ」が出力されて「出力」欄にHTTP応答の内容が出力される状態です。

実装方法など、ドキュメントは以下に有ります。
[Functionsのドキュメント](https://docs.microsoft.com/ja-jp/azure/azure-functions/)
言語毎のドキュメントは以下です。
[サポートされている言語](https://docs.microsoft.com/ja-jp/azure/azure-functions/supported-languages)

### 入出力をカスタマイズする
左側メニューで「統合」を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120192/cab35b53-f42f-17b9-4140-fe7d234ef49b.png)
「トリガー」：この関数が動くきっかけです。この場合はHTTPのリクエストが有った場合です。
「入力」：この関数で参照したいストレージデータです。
「出力」：処理結果の出力先です。この場合はHTTP応答です。テーブルやキューなどを出力先に追加することも出来ます。

それぞれ設定されている欄を選択することで、詳細を設定します。

# 最後に
Azure Functions は、WebAPI、Webサービスをとても簡単に作ることが出来ます。
HTTPも、フレームワーク側で要求を処理してくれたものを変数で受け取って、応答も変数にセットするだけです。
開発者はその間の処理を書くだけで良いです。
ストレージへの入出力についても、バインドされた変数への読み書きだけなので非常に簡単です。

アプリに大量のリクエストが来た時もサーバー台数を増やすなんてことも考えなくていいです。Azureが自動的にやってくれます。
サーバーのハード障害も心配要りません。自動的に切り替わります。
ユーザはもうサーバーの面倒を見る必要は無く、ただアプリロジックを書けばいいだけなのです。
【Gang of Four】デザインパターン学習

# GoF

色々なデザインパターンを勉強しようと「[オブジェクト指向における再利用のためのデザインパターン改訂版](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF-%E3%82%AC%E3%83%B3%E3%83%9E/dp/4797311126/ref=cm_cr_arp_d_product_top?ie=UTF8)」を読みました

各パターンを自分なりに解釈し、出来る限り簡潔にアウトプットしようと思います

サンプルプログラムはkotlinで実装します

でもこの本難しい…「[Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=QY2HM95KYA2MJ91VXKT3)」を先に読むべきやろうか…いやいやそんな甘ったれたこと言いよっちゃあいかんぜよ

全部まとめきれた暁には「[時を超えた建設の道](https://www.amazon.co.jp/%E6%99%82%E3%82%92%E8%B6%85%E3%81%88%E3%81%9F%E5%BB%BA%E8%A8%AD%E3%81%AE%E9%81%93-%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%83%BC-%E3%82%A2%E3%83%AC%E3%82%B0%E3%82%B6%E3%83%B3%E3%83%80%E3%83%BC/dp/4306043061)」を読んでみようかな

## 目次
- 生成に関するパターン
    - [Abstract Factory](https://qiita.com/Tonkachi0620/items/16526bace12161619b81)
    - [Builder](https://qiita.com/Tonkachi0620/items/b2cd08dc591ac3ba666d)
    - [Factory Method](https://qiita.com/Tonkachi0620/items/52e94b05694566a397f1)
    - [Prototype](https://qiita.com/Tonkachi0620/items/86cbb38102497b21e075)
    - [Singleton](https://qiita.com/Tonkachi0620/items/1942d529f33d38becdb4)
- 構造に関するパターン
    - [Adapter](https://qiita.com/Tonkachi0620/items/ec034ee05d6dfb0a9072)
    - [Bridge](https://qiita.com/Tonkachi0620/items/b6d2abc59c65de35ad17)
    - [Composite](https://qiita.com/Tonkachi0620/items/817cca9da8029897e52f)
    - [Decorator](https://qiita.com/Tonkachi0620/items/206b24679cec54d80b00)
    - [Facade](https://qiita.com/Tonkachi0620/items/7f28c35258b78a412a76)
    - [Flyweight](https://qiita.com/Tonkachi0620/items/012b2bf95a395f349e3b)
    - [Proxy](https://qiita.com/Tonkachi0620/items/e329ad0251c208f76ac8)
- 振る舞いに関するパターン
    - [Chain of Responsibility](https://qiita.com/Tonkachi0620/items/9caefa263ce42737d37b)
    - [Command](https://qiita.com/Tonkachi0620/items/f7f755a4fe0d1dbfd153)
    - [Interpreter](https://qiita.com/Tonkachi0620/items/b01daf3b0044e255fac4)
    - [Iterator](https://qiita.com/Tonkachi0620/items/43cb3bde4e4c06fe0028)
    - [Mediator](https://qiita.com/Tonkachi0620/items/2ddc1f484a191e3268e0)
    - [Memento](https://qiita.com/Tonkachi0620/items/a72db830731a2a51df0d)
    - [Observer](https://qiita.com/Tonkachi0620/items/f2c51f96c9e9c37ef305)
    - [State](https://qiita.com/takumi0620/items/af396b79c9bbf7ec2325)
    - [Strategy](https://qiita.com/Tonkachi0620/items/eba3a647d2828c57f24e)
    - [Template Method](https://qiita.com/Tonkachi0620/items/e9be18338bf60bcd5d61)
    - [Visitor](https://qiita.com/takumi0620/items/2a259368864bfd2f9047)
PHPのとあるライブラリ経由でJavaの処理を呼び出せる環境を整備した

こういう分野ってどうやって勉強したらいいですか？
ひとつひとつを調べるのに時間がかかりすぎてしまいました。
反省の意を込めた備忘録です。

# 環境構築

## Javaをインストールする

```:
# yum install java-1.8.0-openjdk
# yum install java-1.8.0-openjdk-devel
```

`java -version` や `javac -version` でバージョンが返ってくればインストール完了。

### 参考

[CentOS 7 に Java 8 (OpenJDK) を yum インストールする手順 | WEB ARCH LABO](https://weblabo.oscasierra.net/installing-openjdk8-on-centos7/)

## Javaを環境変数に設定する

```sh:java.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
```

```:
# source java.sh
```

`printenv` で環境変数が設定されていることが確認できればOK。

### 参考

[CentOS7にJava OpenJDK8のインストール](https://qiita.com/Esfahan/items/60cf425514c66553bd42)

## composerをインストールする

```:
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php composer-setup.php
```

`ll` で `composer.phar` がダウンロードされていることが確認できればOK。

### 参考

[Composer を CentOS にインストールする手順 | WEB ARCH LABO](https://weblabo.oscasierra.net/php-composer-centos-install/)

# 問題解決

コマンドラインで実行した時には問題なかったのに、Apache経由でエラーが発生したため、追加で行った作業。

## SELinuxにポリシーを登録する

`/var/log/messages` に出力されているログで検索したところ、原因はSELinuxであることを突き止めました。
ところが、解決方法を調べると `setenforce 0` の実行によるSELinuxの無効化ばかりです。
これはセキュリティが緩くなりすぎるため、さらに調べて見つけたSELinuxにポリシーを登録する方法で解決します。
ツールの導入も検討したのですが、あまり環境を汚したくなかったので、`/var/log/audit/audit.log` を解析して自作しました。

```:javalocal.te
module javalocal 1.0;
require {
	type httpd_sys_script_t;
	type proc_net_t;
	class process { execmem };
	class file { read open getattr };
}
allow httpd_sys_script_t self:process { execmem };
allow httpd_sys_script_t proc_net_t:file { read open getattr };
```

```:
# make -f /usr/share/selinux/devel/Makefile
# semodule -i javalocal.pp
```

### 参考

[selinux上のCGIでjavaを動かせるようにする方法 - muibrog](http://muibrog.hatenablog.com/entry/2014/11/20/150822)
[SELinuxのポリシー・モジュールを自作する - わんこいん](http://wankomagic.hatenablog.com/entry/2013/05/02/012203)
[「SELinuxのせいで動かない」撲滅ガイド](https://qiita.com/yunano/items/857ab36faa0d695573dd)
[理由がわかれば怖くない！SELinux とのつきあい方](https://blog.fenrir-inc.com/jp/2016/09/selinux.html)

## ロケールを日本に設定する

さて、ようやくApache経由でも実行されるようになったのですが、日本語を含むと想定の結果が返ってきません。
これは調べたところ、原因はPHPの [`exec`](http://php.net/manual/ja/function.exec.php) や [`escapeshellcmd`](http://php.net/manual/ja/function.escapeshellcmd.php) によって日本語が切り捨てられたことでした。試しに実行コマンドを文字列として出力させたところ、日本語が抜け落ちていました。
この解決は有識者が行ったため、私は詳細を把握していないのですが、おそらくPHPとApacheで日本語を扱えるよう設定を変更したのだと思います。

### 参考

[PHPでexecを走らせると日本語だけ消える](https://qiita.com/wakisuke/items/57ce6313c506b230879f)
raspberry piをファイルサーバー化

### ファイルサーバーとは

ファイルサーバーとは
会社とか学校でよくあるファイルを共有出来るサーバーのことです。
家でファイルサーバーを立てると家のネットワークにつながったパソコンやタブレット、スマホから同じファイルにアクセスできます。
権限を設定することで家族間でもファイルを見られなかったりするので大変便利。

### やり方

sambaを導入して共有したいディスクを設定します

sambaインストール

``` 
$ sudo apt-get install samba
```

sambaの設定ファイルを書き換える
末尾に下記を追記する

``` bash
$ sudo vim /etc/samba/smb.conf
(省略)
[pi]
        comment = Raspberry pi
        path = /home/pi
        force user = pi
        guest ok = Yes
```

設定ファイルは主に以下のような構成となっている

セクションは、全体的な設定を行う［global］やプリンタの共有設定を行う［printers］などがあり、好きな名前で［共有名］というセクションを作ることで、共有が作成できます。パラメータ値は、具体的に設定したい内容を記述することもありますが、「設定する」/「設定しない」に関しては「Yes」/「No」とすることで設定できます。

```
［セクション名］
　パラメータ名 ＝ パラメータ値
　　　　　　　　　 ：
　　　　　　　　　 ：
```

共有の名前は、予約されているglobal,home,printerなど以外であれば、自由につけることが可能です。特に、Samba日本語版では日本語を用いた共有名を利用することができます。

* comment
共有名の説明を設定します

* path
共有の対象ディレクトリを指定します

* read only
書き込み禁止にするかどうかのパラメータです。更新がある共有では No と設定します

* browseable
「ネットワークコンピュータ」に表示するかどうかの設定です。表示させたい場合は「Yes」とします。

詳細は下記を参照してください
■ [公式ドキュメント](http://www.samba.gr.jp/project/translation/3.5/htmldocs/manpages-3/smb.conf.5.html)

以下でsambaの設定ファイルの確認を行うことができる
NGが出た場合はスペルなどを確認しましょう

```
$ testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
WARNING: The "syslog" option is deprecated
Processing section "[homes]"
Processing section "[printers]"
Processing section "[print$]"
Processing section "[pi]"
Loaded services file OK.
```

問題がなければsambaサービスを再起動

```
$ sudo systemctl restart smbd
$ sudo systemctl enable smbd
```

※エラーが出た場合はファイアウォールの設定が必要な可能性があります。
samba用に適切にポートを設定してください

sambaでは下記ポートをデフォルトで使用します)
137/udp,138/udp,139/tcp,445/tcp

### 確認

あとはwindowsからエクスプローラーなりで
\\[IPアドレス]
と、入力すれば上記で設定したディレクトリにアクセスできるようになる

macの場合は
smb://[IPアドレス]/
で、アクセスできます
Excelの表を元にで1対1の連想配列リストをつくる正規表現置換


Excelで作成した下記の様な対応表を元にPHPの連想配列コードにするための正規表現を紹介します。

| Code | Name |
|------|------|
|A001  |名前A  |
|B001  |名前B  |
|（ずっと続く）|    |

私はCotエディタで変換してもますが他のエディタでも正規表現使えればいけると思います。（記述方法は多少違うかも）

## Step1．Excelのセルをエディタにコピペ


```
A001	名前A
B001	名前B
```

（見た目でわらかないですが、タブ区切りになってます）

## Step2．一括置換

検索　```^(.+)\t(.+)\n```
置換 ```'$1' => '$2',\n```

これで置換すると下記の様になります。

```
'A001' => '名前A',
'B001' => '名前B',
```

## Step3．必用なファイルにはりつけて、前後をととえる

```php
$map = [
'A001' => '名前A',
'B001' => '名前B',
];
```

PHPStormとかを使ってるなら、貼り付けて前後をつけたら、"Reformat Code"を実行しとくといいと思います。
now cliでgitignoreで無視されたファイルもアップロードしたい

# 問題
now cliでは.gitignoreでリストアップされたファイルやディレクトリがアップロードされない。
画像ファイルなどのマルチメディアファイルはファイルサイズが大きいので.gitignoreで無視するようにしていた。
ただ、これらのファイルはアプリケーションの動作には必要なわけでどうしたらいいものか困っていた。

# 解決策

`now.json`のfilesにホワイトリストを列挙すればgitignoreに書いてあったとしてもアップロードしてくれる。
不便だなーと思うのは、.gitignoreの対象外のファイルに加えてfilesのファイルをアップロードしてくれるわけではなく、
単純にfilesのファイルだけをアップロードする。
なのでアップロードしたいファイルをすべて列挙ないといけない:cry: 

以下はGatsby.jsのプロジェクトでのfiles例

```now.json
{
  (略)
  "files": [
    "gatsby-browser.js",
    "gatsby-config.js",
    "gatsby-node.js",
    "gatsby-ssr.js",
    "now.json",
    "package.json",
    "src",
    "yarn.lock"
  ]
}
```
家族全員がiPhoneの時のオススメ構成（小学生・中学生）

## はじめに
ウチには小学生と中学生の子供がいるのですが、まだまだ一人で安全にスマホを使いこなすことはできません。（というか、好きに使わせたらエライ事になります）
今まではキッズ携帯（Android）でしたが、機能が結構制限されて使いづらいのと、流石に上の子も中学2年になったのでちゃんとしたスマホにしてあげようかなと。
ということで悩んだ挙げく、家族全員同じiPhoneにしたのでその時の構成を備忘がてらに。
ここ数ヶ月間はパパとママの言うことを聞いてきたし、毎月のお小遣いも今後は半分になるしねｗ

### 概要 
- 子どもたちには機能制限をかけてアプリを自由に落とせないようにする
    - アプリを落とす時に、承認がパパに飛んでくるようにする（フリーアプリ）
    - 課金はパパがいる時に、直接PWを入力する
- もっと家族でうまくデータ共有したい（Googleサービスと連携）
    - 各端末の写真はGoogleフォトで家族全員が自動で共有
    - 家族のカレンダーはGoogleカレンダーで全員共有
    - 音楽の共有はGooglePlayMusic
- 端末の容量は64GBなので、iCloud連携は最低限に
    - 同期は最低限のものだけ（詳細は後述）
    - バックアップはiCloudでは取得しない。たまにPC繋いでバックアップすれば十分だし
- その他
    - Googleアカウントは各自作成していることが前提としてます
    - 時間制限をするアプリは何個かあるみたいですが、今回は入れてません
        - iOS 12 が出たら「スクリーン・タイム」を設定してみたいと思います
    - うちのママはITリテラシーが低いから子供と同じ設定にしていますｗ

## 設定
### Apple ID 関連
- iTunesとAppStore
    - パパ　：　Gmailで新規登録（パパだけクレカ登録）
    - パパ以外　：　ファミリー共有登録後にGmailを設定する
- ファミリー共有　：　パパの端末で全員分登録する。ここで必ず承認が必要をOnにする
- iCloud
    - 各自の作成内容
        - パパ　：　新規作成（@icloud.com）　※上記AppStoreで設定したメアド使えないので新規
        - ママ　：　自分のGmailを設定
        - 長男（13歳）　：　自分のGmailを設定
        - 長女（11歳）　：　未成年の為iCloudアカウントをパパの端末で作成（@icloud.com）
    - 同期対象　：　最低限のものだけ設定（メール、連絡先、メモ、Safari）
    - キーチェーン　：　On
    - iPhoneを探す　：　On
    - iCloud バックアップ　：　Off

### 機能制限をOnに　（パパ以外に設定）
- App内課金　：　Off
    - 他の項目はOnでOK

### アプリ
- 撮った写真を家族間で共有（Googleフォト）
    - パパのGoogle ID で全員が設定　（各自のIDで共有設定しても良いが利便性を重視）
    - Wifiの時にしか同期しないようになってるかしっかり確認
- 家族用カレンダー
    - Googleカレンダーでも良いが、「SnapCal」がオススメ
    - パパのGoogle ID で全員が設定（同上）
- 音楽の共有
    - ウチはGooglePlayMusic（5万曲まで無料）とAmazoonMusicを併用
    - 写真とカレンダーと同じ
- 家族の居場所がわかる
    - 「友達を探す」アプリ　：　On
- 2段階認証
    - GoogleAuthenticator入れて、Google ID を2段階認証にしとくと安全です

## その他
- 各端末をPCに繋いでバックアップ取りましょう（定期的に）

## キャリア別
### au
- 「友達を探す」で問題がある場合は「安心ナビ」を利用するのがオススメ
- My au のインストール
    - 毎月の料金やデータ通信量を確認できる
- デジラアプリ のインストール
    - 残りのデータ通信量が確認できるので、「これを超えたら怒だよ！！」と子どもたちにしっかり伝えておく。→超えた場合は小遣いから払わせるべし
- au ID、MSS、+メッセージは初期設定マニュアル見て実施するだけ
AWS Batchでハマったポイントまとめ

<img width="743" alt="Screen Shot 2018-09-09 at 17.31.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/253717/ef28b1c9-50de-c230-7e18-bf05498bb95a.png">

# AWS Batchでハマったポイントまとめ

Lambdaの処理時間5分の制約やデバッグの難しさは避けたいけれど、EC2を立ち上げ続けるほどの頻度では発生しないタスクを処理するのにAWS Batchが適任だったので導入してみました。
使い勝手は良かったのですが、上手く動くまでに間違いやすい箇所が多く、失敗すると原因が分かりにくいためチェックすべき箇所をまとめておきます。

## VPC関連
デフォルトVPCを利用する場合はあまり問題になりませんが、自作のVPC上でECSクラスタを動かす場合は注意が必要です。

### サブネットからインターネットにアクセスできない
サブネットからインターネットアクセスができないとECS用のインスタンスが立ち上がってもECSクラスタに登録されない（要検証）ようでEC2インスタンスは立ち上がったままジョブがRunnableの状態で停止します。放置しておくとEC2が立ち上がっている分課金され続けます。

原因としては次のような事があります。

- VPCにゲートウェイが設定されていない
- VPC内のルーティングが設定されていない
- サブネットのパブリックIPv4自動割当が無効になっている
- セキュリティグループのアウトバウンドが阻害されている

パブリックIPの問題はこちらの記事でも取り上げられていました。
[AWS BatchのジョブがRUNNABLEのまま進まない](https://qiita.com/sekitaka_1214/items/dbfc16d26168efc39900)

### セキュリティグループがVPCに紐付いていない
こちらはTerraformでセキュリティグループを作成したときにハマりましたが、セキュリティグループをVPCに紐付け忘れるとECS用のインスタンスが立ち上がらなくなります。
この場合コンピューティング環境の状態がINVALIDとなり次のようなエラーが表示されます。

```
CLIENT_ERROR - One or more security groups configured in the launch configuration are not linked to the VPCs configured in the Auto Scaling group
```

こちらのブログでも同じ現象が報告されてました。
[【未完】Developers.ioの記事を読んでやってみる「API Gateway + LambdaでAWS BatchのJobを実行する」(2018/03/22)](https://blog.anorlondo448.net/entry/2018/03/23/014759)

## IAM Role関連
AWS Batchには3種類のIAM Roleが出てきますが、それぞれ適切に設定しないとジョブが正常に処理されません。

### AWS Batchに付与するロール
AWS BatchがECSやEC2などのリソースを操作するためのロールでAWS Batch自体に付与します。

マネジメントコンソールで「IAM」 -> 「IAM Role」 -> 「ロールの作成」 -> 「Batch」を選択すると予め用意されている「AWSBatchServiceRole 」が表示されるのでそのまま作成すれば大丈夫です。

### ECS用のEC2インスタンスに付与するロール
AWS Batchが裏で作成するEC2インスタンスに対して付与するロールです。

マネジメントコンソールで「IAM」 -> 「IAM Role」 -> 「ロールの作成」 -> 「Elastic Container Service」 -> 「EC2 Role for Elastic Container Service」を選択すると予め用意されている「AmazonEC2ContainerServiceforEC2Role」が表示されるのでそのまま作成すれば大丈夫です。

### ECSのタスクに付与するロール（ジョブロール）
ECSのタスクに対して付与するロールで、ポリシーの内容はジョブを実行する上で連携するサービスによって変わります。AWSによって用意されているポリシーでは不十分な場合は予めポリシーを作成しておきます。自分の場合は入出力目的のS3バケットへのアクセス用のポリシーを作成しました。

マネジメントコンソールで「IAM」 -> 「IAM Role」 -> 「ロールの作成」 -> 「Elastic Container Service」 -> 「Elastic Container Service Task」を選択し必要なポリシーを付与します。

## ECSクラスタ関連
### コンピューティング環境のリソースとジョブのリソース
コンピューティング環境の設定で利用できるインスタンスタイプが指定できますが、ジョブに指定したvCPUとメモリが利用できるインスタンスのvCPUとメモリを越えていると適合するインスタンスが作られずジョブが停止するようです。


# AWS Batch設定のテンプレート

次回以降の導入を簡単にするために、TerraformでAWS Batchの設定をテンプレート化しておきました。
AWS BatchのチュートリアルにあるHello Worldのジョブ定義まで作られるので、あとはマネジメントコンソールからジョブを動かすことができます。
https://github.com/yukihira1992/aws-batch-template

<img width="1174" alt="Screen Shot 2018-09-09 at 17.34.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/253717/31915349-b3d4-f83f-2c02-f45ec2625093.png">

ジョブを登録後は、ECSクラスタが準備できるまでRunnableで止まり、その後ジョブが完了してSucceededに移動します。

<img width="1186" alt="Screen Shot 2018-09-09 at 17.35.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/253717/509e8ce7-7cde-4f9e-341f-299570792ed3.png">
メカトロ講座02 Arduino megaのPWMについて

# 概要
ロボットでArduinoを使うときに一番多いシチュエーションはPWM信号を出すことです。多くのハードウェアを制御するためには多くのPWMが必要になります。Arduinoで出せるPWMの限界について考えてみます。

# PWMとは
PWMとはLow(0)とHigh(1)が交互に変化するいわゆるデジタルな波形です。PWM波形の要素として周波数とデューティー比があります。

![hard_pwm.png](https://qiita-image-store.s3.amazonaws.com/0/254442/d5a5fde0-a4e8-6400-5c3b-d5ce89a1438d.png)

PWMの使用方法としてロボットでは主に2つがあり、周期が大きく異なります。

* モーターの制御  
モーターに送る電力をPWMで調整します。周波数1k～（周期が～1ms）のPWMを通常は使います。
* サーボモーターへの信号  
RCサーボモーター（ホビー界隈でサーボと呼ばれるもの）への信号です。周期が20msで規格化されています。

# arduino megaの場合
上記のモーター用とサーボ用の2つのPWMについてどれだけ出せるか検討します。

## モーター用のPWMについて
[Arduinoについてまとめたページ](http://arms22.blog91.fc2.com/blog-entry-501.html)ではmegaは15本のPWMが出せると書いてあります。実際Arduinno megaの回路図を見るとP2~13,44~46の15本がPWMのピンに割り当てられています。
しかしこれらすべてがフルに使えるわけではありません。下記のようにタイマーに2、3個のチャンネルがぶら下がって合計15本のPWMになっています。

| timer | ch | pin |
|:-:|:-:|:-:|
| timer0 | A | 13 |
|        | B |  4 |
| timer1 | A | 11 |
|        | B | 12 |
| timer2 | A | 10 |
|        | B |  9 |
| timer3 | A |  5 |
|        | B |  2 |
|        | C |  3 |
| timer4 | A |  6 |
|        | B |  7 |
|        | C |  8 |
| timer5 | A | 46 |
|        | B | 45 |
|        | C | 44 |

一部のtimerはほかの部分で使用されています。

* timer0はシステムが使用していて、これをいじってしまうとdelay()関数の待つ時間がずれます。
* またtimer0,2は8bit timerで残りの1,3,4,5は16bit timerです。8bit timerでは精度が低くて、しっかりしたモーター用のPWMを出すには適しません。
* timer5は後述するservoライブラリを使うと使用されてしまうために使えなくなります。

よってまともに使えるPWMはtimer1,3,4の8本のPWMになります。これらは自由にDuty比を変更することがありますが、周期を変更する場合は注意が必要です。

## モーター用PWMの周期について
モーター用PWMの周期はtimerで共有されます。timer1,3,4は全て同じ構成でデフォルトでは490Hzに設定されています。以下のコードでtimer1の速度を変更できます。

```c++:PWMの周期を変更
#include <avr/io.h>
void change_freq1(int divide){
  TCCR1B = (TCCR1B & 0b11111000) | divide;
}
```

これで以下のようになります。timer3の時はTCCR1BをTCCR3Bに書き直してください。

| divide | 周波数 |
|:-:|:-:|
| 1 | 31.37 kHz |
| 2 | 3.921 kHz |
| 3 | 490.2 Hz |
| 4 | 122.5 Hz |
| 5 | 30.64 Hz |
| 他 | 禁止 |
# サーボ用のPWMについて
サーボ用の周期が20msのPWMはservo.hライブラリを使うとPWMのハードウェア機能を直接に使わずにソフトウェア機能で生成することができます。出力するピンはデジタル出力ができるピンならどこでも構いませんが、数に制限があります。PWM出力をする数によってtimerを占有する数が変わります。

| PWM出力の数 | 占有するタイマー |
|:-:|:-:|
| 0      | 無し |
| 1~12   | timer5 |
| 13~24  | timer4,5 |
| 25~36  | timer3,4,5 |
| 37~48  | timer1,3,4,5 |

なおArduino Unoだと最大は12個でtimer1を占有します。
またこれらのサーボ用のPWMでは周期を変更することは基本的にできません。また、Duty比の設定の精度が悪く、サーボモーターの出力で言うと1deg相当での分解能しかありません。

# 参考
[Arduinoについてまとめたページ](http://arms22.blog91.fc2.com/blog-entry-501.html)
[Arduino megaのPWMのチャンネル](http://anbalab.com/summary/megapwm)
[Arduinoにつながるservoの限界について](http://forum.arduino.cc/index.php?topic=90335.0)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/eri_aka/items/5f44440afea0eb616b4a)
GMT (Generic Mapping Tools) における３次元座標でのテキスト表示

当方の計算環境は以下の通り．(2018.10.25 追記)

+ MacBook Pro (Retina, 13-inch, Mid 2014)
+ macOS Mojave
+ GMT 5.4.4


GMT において３次元座標上でテキスト表示を行う方法の紹介です．
以下にサンプル画像を示します．

![_gmt_3dtext.jpg](https://qiita-image-store.s3.amazonaws.com/0/129300/94d61c4c-e4c3-3b02-12e3-fdff6f55d2b0.jpeg)


+ ３次元座標上へのテキスト表示は，pstextに -Z オプションを用いて座標指定することにより可能です．[pstext — GMT 5.3.2 documentation](http://gmt.soest.hawaii.edu/doc/5.3.2/pstext.html)
+ ３次元プロットの中の任意の位置にテキストを表示する場合，くせ（というか仕様）があるので，座標指定の特性を知っておく必要があるので注意．

サンプル画像描画用スクリプトは以下の通り．スクリプト中に解説を入れたので参考にしてください．


```
gmt set FONT_ANNOT_PRIMARY 16p
gmt set MAP_ANNOT_OFFSET_PRIMARY 0.3c
gmt set FONT_LABEL 16p
gmt set MAP_LABEL_OFFSET 0.5c
gmt set MAP_TICK_LENGTH_PRIMARY -0.2c

# x軸：-5 / 25 長さ 30m
# y軸：-5 / 55 長さ 60m
# z軸：60 / 75 長さ 15m
# x軸長さ 30m を  8cm にセット
# y軸長さ 60m を 16cm にセット
# z軸長さ 15m を  4cm にセット
rangez=-5/25/-5/55/60/75
scalex=8/16
scalez=4
bax=a5f1
bay=a5f1
baz=a5f1
xlabel="Distance x (m)"
ylabel="Distance y (m)"
zlabel="Distance z (m)"
#ang=150/30
ang=140/30
#ang=30/25

fig=_gmt_3dtext.eps
gmt psbasemap -R$rangez -JX$scalex -JZ$scalez -Bx$bax+l"$xlabel" -By$bax+l"$ylabel" -Bz$baz+l"$zlabel" -BESZnw -p$ang -P -K > $fig
gmt psxyz -R -JX -JZ -G#dddddd -p -O -K << EOT >> $fig
>
-5 -5 60
-5 55 60
-5 55 75
-5 -5 75
EOT
gmt psxyz -R -JX -JZ -G#eeeeee -p -O -K << EOT >> $fig
>
-5 55 60
25 55 60
25 55 75
-5 55 75
EOT
# pstext の中に，オプション -Z を指定することにより，三次元座標の中にテキストを表示できる．
# テキスト表示は x-y 平面上となり，角度 0 ならx軸に並行，角度 90 ならy軸に平行となる．
gmt pstext -R -JX -JZ -Z -F+f+a+j -G#ffffbf -W1 -p -O -K << EOT >> $fig
 0.0  0.0 60 20p,Helvetica-Bold 90 ML EL.60
 0.0  0.0 65 20p,Helvetica-Bold 90 ML EL.65
 0.0  0.0 70 20p,Helvetica-Bold 90 ML EL.70
 0.0  0.0 75 20p,Helvetica-Bold 90 ML EL.75
EOT
gmt pstext -R -JX -JZ -Z -F+f+a+j -p -O -K << EOT >> $fig
0.0  10.0 60 18p 0 BL (x,y,z)=(0,10,60)BL
0.0  20.0 60 18p 0 BL (x,y,z)=(0,20,60)BL
0.0  30.0 60 18p 0 BL (x,y,z)=(0,30,60)BL
0.0  40.0 60 18p 0 BL (x,y,z)=(0,40,60)BL
0.0  50.0 60 18p 0 BL (x,y,z)=(0,50,60)BL
EOT
# x軸長さを 8cm，y軸長さを 16cm にセットしてあるので
# ２次元プロットを行う場合，x軸範囲を 8，y軸範囲を 16 とすれば
# 2 x 2 で線を引けば 2cm 四方の正方形が描ける．
gmt psxy -R0/8/0/16 -JX -Sv0.2+s -W1,#aaaaaa -K -O << EOT >> $fig
0  0 8  0
0  2 8  2
0  4 8  4
0  6 8  6
0  8 8  8
0 10 8 10
0 12 8 12
0 14 8 14
0 16 8 16
 0 0  0 16
 2 0  2 16
 4 0  4 16
 6 0  6 16
 8 0  8 16
EOT
# 作図領域の座標を，x軸で 0 から 1，y軸で 0 から 1 とすれば
# x軸では 8cm が 0 から 1，y軸では 16cm が 0 から 1 に割り振られる．
# したがって，座標 (1,1) は基準点から (8cm, 16cm) の位置を意味する．
# 同様に座標 (2,0.7) は基準点から (16cm, 16cm x 0.7 = 11.2cm) の地点をお見する．
echo '0 0 20p 0 LB Finish(0,0)LB' | gmt pstext -R0/1/0/1 -JX -F+f+a+j -N -O -K >> $fig
echo '0 0.5 20p 0 LT Finish(0,0.5)LT' | gmt pstext -R0/1/0/1 -JX -F+f+a+j -N -O -K >> $fig
echo '0 0.7 20p 0 LT Finish(0,0.7)LT' | gmt pstext -R0/1/0/1 -JX -F+f+a+j -N -O -K >> $fig
echo '2 0.7 20p 0 RT Finish(2,0.7)RT' | gmt pstext -R0/1/0/1 -JX -F+f+a+j -N -O -K >> $fig
echo '1 1 20p 0 RT Finish(1,1)RT' | gmt pstext -R0/1/0/1 -JX -F+f+a+j -N -O >> $fig

# eps を jpg (-Tj) に変換．-A オプションにより余白削除を行う．
for fn in *.eps
do
gmt psconvert $fn -Tj -A
done
rm *.eps
```

以　上
Dispatcherを作ってモデルを単一スレッドで実行したり画像をバックグラウンドでダウンロードしたり

#   Dispatcherを作ってモデルを単一スレッドで実行したり画像をバックグラウンドでダウンロードしたり

ちゃんとした文献が見つからなかったから本当に問題ないかは知らない

##  Dispatcherを作って

```C#:App.xaml.cs
public partial class App : Application
{
    public static Dispatcher BackgroundDispatcher => CreateBackgroundDispatcherAsync().Result;
    static Task<Dispatcher> CreateBackgroundDispatcherAsync()
    {
        var tcs = new TaskCompletionSource<Dispatcher>();

        var th = new Thread(() => {
            var d = Dispatcher.CurrentDispatcher;
            tcs.SetResult(d);
            Current.Dispatcher.InvokeAsync(() => {
                Current.Exit += (sender, e) =>
                {
                    d.InvokeShutdown();
                };
            });
            Dispatcher.Run();
        });
        th.SetApartmentState(ApartmentState.STA);
        th.Start();

        return tcs.Task;
    }
}
```

##  モデルを単一スレッドで実行したり

モデルクラスを作って

```C#:Counter.cs
class Counter : DispatcherObject
{
    int _Count = 0;
    public int Count
    {
        get
        {
            VerifyAccess();
            return _Count;
        }
    }

    public void Add(int n)
    {
        VerifyAccess();
        _Count += n;
    }
}
```

何時も通りDispatcher経由で触る

```C#
async void btnCounter_Click(object sender, RoutedEventArgs e)
{
    var cnt = await App.BackgroundDispatcher.InvokeAsync(() => new Counter());

    await Task.WhenAll(Enumerable.Range(0, 10).Select(i => Task.Run(async () =>
    {
        foreach (var j in Enumerable.Range(0, 1000))
        {
            await cnt.Dispatcher.InvokeAsync(() => cnt.Add(1));
        }
    })));

    MessageBox.Show($"{ await cnt.Dispatcher.InvokeAsync(() => cnt.Count) }");
}
```

##  画像をバックグラウンドでダウンロードしたり

```C#
async void btnDownloadImage_Click(object sender, RoutedEventArgs e)
{
    imgMain.Source = await DownloadImageAsync(new Uri(txtUri.Text));
}

Task<BitmapImage> DownloadImageAsync(Uri uri)
{
    var tcs = new TaskCompletionSource<BitmapImage>();

    App.BackgroundDispatcher.InvokeAsync(() => {
        var bmp = new BitmapImage(uri);
        void handler(object sender, EventArgs e)
        {
            bmp.DownloadCompleted -= handler;
            bmp.Freeze();
            tcs.SetResult(bmp);
        }
        bmp.DownloadCompleted += handler;
    });

    return tcs.Task;
}
```

##  ソースコード

https://github.com/n2yas/DispatcherTest

##  参考文献

*   [.NETの新しいディスパッチャを作成する - vb.net、マルチスレッド、ディスパッチャ](https://steakrecords.com/ja/827184-net-create-new-dispatcher-vbnet-multithreading-dispatcher.html)
*   [[WPF] BitmapImage の生成・初期化を非同期で行う際のメモリの問題について](http://pierre3.hatenablog.com/entry/2015/10/25/001207)
*   [バックグラウンド スレッドで UI 要素を作るとメモリリークする (WPF)](http://grabacr.net/archives/1851)
SQLServerでランダム文字取得ストアドを作ってみました

# SQLServerでランダム文字取得ストアドを作ってみました
テストデータを作るのに欲しかったので。

## コード
``` RandomString.sql
CREATE PROCEDURE [dbo].[RandomString](@length INT , @ret NVARCHAR(100) OUTPUT)
AS
    DECLARE @count AS INT;
    DECLARE @randitem AS NVARCHAR(62) = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

    SET @ret = '';
    SET @count = 0;

    WHILE @count < @length
    BEGIN
       SELECT @ret = @ret + SUBSTRING(@randitem, CONVERT(int, (CEILING(RAND() * LEN(@randitem)))), 1);
       SET @count = @count + 1;
    END;

    RETURN;
GO
```

## 使い方
```
DECLARE @RC int
DECLARE @Length int = 30
DECLARE @ret nvarchar(100)

EXECUTE @RC = [dbo].[RandomString] 
   @Length
  ,@ret OUTPUT

SELECT @ret AS RandomString;

GO

```

### 結果
```
Q8EDUF8iyOnvOpB3s87zoUYMhBI5EJ
```
UiPath Studio 2018.3 Early access - Beta release をさわってみた1

### UiPath Studio 待望の日本語化

「UiPath Studio 2018.3」でググってみたところ、[2018.3 Early access - Beta release - Releases / 18.3 Beta - UiPath Community Forum](https://forum.uipath.com/t/2018-3-early-access-beta-release/62314) にあるように2018.3 Early access がダウンロードできるようになっていたので、、早速。。

おー本当に、Studioが日本語化されましたねー。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/8f088bf7-369a-1476-f8a8-fe8febc248c9.png)
さて、ザックリとさわってみた感想を。。


### ＵＩの日本語化について
ＵＩについて日本語化されましたね。とくにプロパティなどは、下記の通りなかなかいい感じかもです。とくにエンジニアでないユーザさまからみたら、かなりとっつきやすくなりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/053de739-6e38-31c9-1091-20cad57280e8.png)


アクティビティについては、イイものもありますが、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/80d21152-9234-35bc-7328-3f5131bf6c30.png)

うーん、「Write Line」の「文字列と行終端記号を書き込み」この訳はなんとかならなかったんでしょうか、、。「コンソール出力」とかじゃダメだったのかな。。


悪名高き(？)「Publish」は、うーん迷った結果なのでしょうか、「パブリッシュ」とそのままとなりました :-)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/cde77003-e1a8-2c10-62a6-bbddc46c5ec1.png)


### アクティビティのフィルタリングの使い勝手は？
[UiPath Developer Community 第6回ワークショップ](https://www.uipath.com/ja/resources/knowledge-base/uipath-developer-community-20180829)  で説明して下さったUiPathの中の人が「アクティビティの検索は、表示されている日本語名称でしか検索できなくなってます(かつての英語名じゃできない)」とおっしゃっていたのですが、ためしにmessageと入れてみたところ、、、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/174b0425-d0c5-fe32-f696-450264d3f523.png)
どうやら問題無さそうです。


### Publish時にバージョン指定できるようになった
いままで、明示的に指定出来なかったですよね？ 2018.3からはバージョン指定出来るようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/8364afca-e9f0-3ff6-39e0-1ac0284e115c.png)

### タスクトレイでフィルタ
ロボット(Process)をたくさん利用してると、タスクトレイの一覧が膨大になって使い勝手が悪いって指摘がよくありましたが、フィルタできるようになりました。。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/a2f8bed1-de31-b6e9-6975-f0e1f31f9679.png)



日本語対応が大きく話題になっていますが、いままで不満だーっていわれていたところにもいくつか改良がなされているようです。
カスタムアクティビティの作り方も色々と変わっているようですし、それはあらためてしらべてみようとおもいます。



### 関連リンク
- [2018.3 Early access - Beta release - Releases / 18.3 Beta - UiPath Community Forum](https://forum.uipath.com/t/2018-3-early-access-beta-release/62314)
- [UiPath Developer Community 第6回ワークショップ](https://www.uipath.com/ja/resources/knowledge-base/uipath-developer-community-20180829) 
- [UiPath Developer Community 第6回ワークショップ 覚え書き「出現するタイミングが不定のポップアップを処理する」](https://qiita.com/masatomix/items/72422148ea8353662eb1)
【Netlify】Github連携でWEBサイトを公開する

# Netlifyとは

WEBサイトのホスティングサービス
https://www.netlify.com/

![netlify.png](https://qiita-image-store.s3.amazonaws.com/0/141934/36200c1e-9c92-8376-964d-7113cf0ef524.png)

# Netlifyに関する投稿
- [Netlify / GithubPages / Heroku の速度比較](https://qiita.com/NaokiIshimura/items/0b6c4ff5da437081866b)
- [ドラッグ＆ドロップでWEBサイトを公開する](https://qiita.com/NaokiIshimura/items/40ed08203b35aa0b527c)
- Github連携でWEBサイトを公開する ←今回の投稿
- [カスタムドメインを設定する](https://qiita.com/NaokiIshimura/items/64e060ccc244e38d0c15)
- [Forms機能を利用して問い合わせフォームを作成する](https://qiita.com/NaokiIshimura/items/bce2f0b865ec1bc16a53)


---

# Github連携

**New site from Git**ボタンをクリックして、Githubを選択する。
画面に従ってリポジトリ、ブランチを選択するとサイトが作成される。

以降はブランチがコミットするたびにサイトが更新されるようになる。

![git01-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/5abf286d-673f-397e-2754-a9640162d9cc.png)
![git02-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/999b821d-dfdd-cae6-4295-9e8a98927748.png)
![git03-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/0d66bac2-d32a-7fdf-e51e-e0de4201e6e4.png)
![git04-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/1d7d4a20-2c75-4153-4127-fdae4e34348d.png)
![git05.png](https://qiita-image-store.s3.amazonaws.com/0/141934/a5cb1ca4-353c-ae44-beaa-4f32530717d5.png)

# アクセス確認

サイトが作成されるとURLが払い出されるのでブラウザでアクセスする

![git05-a.png](https://qiita-image-store.s3.amazonaws.com/0/141934/0a8b2893-4d5b-7f02-682e-5bf2cf21b5dd.png)
![git06.png](https://qiita-image-store.s3.amazonaws.com/0/141934/1a8833a6-00b5-0349-b0af-4e9b5776a3c0.png)
コマンドラインから入力した文字列を改行手前の文字列のみを取得する

C言語で
コマンドライン上から入力された文字列を取得したいと考えたとき、
C言語上ではgetchar()やgetc()などの関数しか存在しなかったので、command line上で
確かに入力した文字列を一字一句取得するため以下のような関数をトレーニングも兼ねて書いた。


```C



#include <stdio.h>
#include <stdlib.h>
#include <string.h>


unsigned char* get_string_from_cli(unsigned char* input) {
    unsigned char* temp = NULL;
    unsigned char c;
    input = malloc(1 * sizeof(char));
    if (input == NULL) {
        printf("ヒープへのメモリ確保に失敗");
        return("");
    }
    int index = 0;
    while(c = getchar()) {
        // 取得内容が改行文字だった場合入力終了
        if (c == '\n') {
            input[index] = 0;
            break;
        }
        input[index] = c;
        index++;
        temp = realloc(input, (index + 1) * sizeof(char));
        if (temp == NULL) {
            printf("reallocによるメモリ拡充に失敗");
            return ("");
        }
        if (temp != input ) {
            input = temp;
        }
    }
    return (input);
}



int main () {
    unsigned char *string_you_input = NULL;

    // 特定の文字列を入力するまでCLI上ではループさせる
    while (1) {
        printf("Input any string you want to ensure:");
        string_you_input = get_string_from_cli(string_you_input);
        printf("It you inputed is ... => %s", string_you_input);
        if (strncmp(string_you_input, "exit", strlen("exit")) == 0) {
            printf("Command Lineを終了します。");
            exit(0);
        }
    }
    return (0);
}
```

入力受付終了は[exit]と入力するとループから抜け
アプリケーションを終了することができます。
Swiftlintのline_lengthで引っかかって解決したので共有します。

Swiftlintの`line_length`が複数行になったときの指定方法で引っかかったので、
どのように解決したかやその経緯を共有します。
`line_length`に限らず、Swiftlintの記述方法全般に共通する内容だと思います。

## 結論
まずは解決した方法を紹介します。
以下の記述で`line_length`の文字数を指定、かつコメントアウト部分は指定外になります。

```:.swiftlint.yml
line_length:
  warning: 180
  error: 350
  ignores_comments: true
```
180~349文字で`warning`、350文字以上で`error`が発生し、コメントアウトは指定から除外されます。

## 導入
Swiftlintのインストール方法などについては省略します。
`.swiftlint.yml`ファイルの初期状態は[Swiftlint](https://github.com/realm/SwiftLint/)のConfiguration以下の記述をほぼコピペしたものです。

```:.swiftlint.yml
disabled_rules: # rule identifiers to exclude from running
  - colon
  - comma

// ...
// 長いので省略
// ...

reporter: "xcode" # reporter type (xcode, json, csv, checkstyle, junit, html, emoji, sonarqube)
```

## 引っかかった記述方法
line_lengthのコピペ時の初期状態は以下です。

```:.swiftlint.yml
line_length: 110
```

この場合、1行に110以上の文字が記述されていると`warning`が発生します。
**問題は、コメントアウトした部分にも`warning`が発生するため`line_length`以下に
`ignores_comments: true`を記述しようと考えました。**
（ついでに許容する文字数も110では少ないので180に変更します。）

:fist:**以下、ダメだった記述例**

```:.swiftlint.yml
line_length: 180
  ignores_comments: true
```

```:.swiftlint.yml
line_length:
 - 180
 - ignores_comments: true
```

:smile: **改めて、正しい記述例↓**

```:.swiftlint.yml
line_length:
  warning: 180
  ignores_comments: true
```

## まとめ
`line_length`の条件が複数行になる場合、`warning:`や`error:`の付加が必要になります。
Kudu で任意のインスタンスに接続する方法

# 概要
デフォルトでは最初に接続した後は同じインスタンスに接続されてしまいます
障害調査の場合などに任意のインスタンスに接続したい事がありその方法を記載します

詳細は以下のサイトに記載されていますのでこちらをご参考ください
[Azure App Service: How to connect to the Kudu site of a specific instance](instancehttps://blogs.msdn.microsoft.com/kaushal/2016/11/21/azure-app-service-how-to-connect-to-the-kudu-site-of-a-specific-instance/)

# 方法
* Kudu に接続後 Cookie 名 ARRAffinity の値を接続したい InstanceID に変更する

Chrome Developer Tool を使えば Application の Cookies の箇所から変更可能です
Value の値をダブルクリックすることで直接編集できます

![ChromeDeveloperTool.png](https://qiita-image-store.s3.amazonaws.com/0/52146/22b056b3-4e25-227a-d247-c69fca866d12.png)

## InstaceID 調査方法
接続したい InstanceID がわからないとそもそも接続できません
InstanceID は [Azure Resource Explorer](https://resources.azure.com/) を使って調べることが可能です

* 画面上部の Search ボックスに Web Apps名 を入れれば検索可能
    * 同じ名前のものが複数ある場合、Web Apps 名の後ろに (Microsoft.Web/Sites) と表示されているものを選択
* Resource Explorer 左側の instances のメニューを選択
* 表示された Json の value[].properties.name の値が InstaceID となります

![ResourceExplorer.png](https://qiita-image-store.s3.amazonaws.com/0/52146/33783d7a-13f6-bb50-7e8d-a8ee4790da0f.png)
※画面は表示上値を切り取って表示していますが、実際の値はもっと長いです