OmniAICreator/Qiita-1.07M huggingface dataset:
【abc154-D】　小数の表示桁数/累積和

※注意
この記事は、もともと自分用に執筆したが気が向いて公開してしまったものです。ので、各所にお気持ちが伝わりづらい(伝わらない)言い回しやコードが散見されるかもしれませんがご了承ください。


#まえがき
[AtCoder Beginner Contest 154](https://atcoder.jp/contests/abc154)(あとから)。
A~Cは簡単に通せた。Dも簡単だったけど恥ずかしながら二悶着くらいあったのでメモレベルで残しておく。
※abc154-D(Dice in Line).Difficulty: 405

#本編
全然関係ないテーマ2つを吸収しました。

##小数の表示桁数
本日の戦犯。「なお、想定解答との絶対誤差または相対誤差が　$10^{-6}$ 以下であれば正解として扱われる。」に抵触したようです。
ただまあ原因がわかってしまえばそれだけなので要点だけまとめる。
ずっと一番上の方法で出力させててWA吐きまくったんだけどこの3つの違いについて。


```free.cpp
    cout<<ans<<endl;

    cout<<setprecision(8)<<ans<<endl;
    
    cout<<fixed<<setprecision(8)<<ans<<endl;
```

- `cout` をdouble型に対して適用すると、デフォルトでは**整数部、小数部合わせて6桁**が出力される。
- `setprecision(n)` をつけると、**整数部、小数部合わせてn桁**が出力される。
- `fixed` をつけると、**小数点以下だけ見てn桁**が出力される(普通に整数部分も出てくるよ)。

それだけ。「この問題ansは絶対整数もしくは~~~.5だから誤差とか生まれないだろ」とか思ってたら出力の問題でした。反省。確かに最大で500*200000~10000000くらい行くから6桁じゃ足りないね。

まあ競プロしてる上ではいつも `cout<<fixed<<setprecision(10)<<ans<<endl;` とかにしとけば全く問題はなさそうだけど、一応知識としては持っておこう。


##累積和
この問題でD問題ぽい要素があるとすればたぶんこのアルゴリズム。舐めたこと言ってるけど最初普通にこれ使わずにTLE吐いてるから軽くメモって意識に入れとく。

```abc154/d.cpp
    double expect[n-k+1];
    double sum;
    for(int i=0; i<n-k+1; i++) {
        sum = 0;
        for(int j=i; j<i+k; j++) {
            sum += dice[j];
        }
        expect[i] = sum;
    }

    double ans = *max_element(expect, expect+n-k+1);
```

はじめに安直に書いたコードの一部。要は毎回K個隣接するダイスの期待値の総和を計算してたんだけど、これだと計算量はざっくり $O(NK)$ くらい。確かにこれは入力によっては全然間に合わない。

この解決には**累積和**の考え方を使うといいぽいんだけど、これ本当に大したことなかった。
そこまでの総和を計算した配列を用意しておけば、その後は一瞬である区間の総和を求められる(考えればわかる)。前処理が $O(N)$ 。それ以降はもうO(1)。

本問では配列を作るまでもないなてなったので下のようにコードを書きました。細かいことは置いといてね。

```abc154/d2.cpp
    double ans = sum;
    for(int i=1; i<n-k+1; i++) {
        sum = sum + dice[i+k-1] - dice[i-1];
        if(sum>ans) ans = sum;
    }
```


##abc154-D のACコード

```abc154/d2.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n,k;
    cin>>n>>k;
    double dice[n];
    for(int i=0; i<n; i++) cin>>dice[i];

    for(int i=0; i<n; i++) {
        dice[i] = (dice[i]+1)/2;
    }

    double sum = 0;
    for(int i=0; i<k; i++) {
        sum += dice[i];
    }

    if(n==k) {
        cout<<sum<<endl;
        return 0;
    }

    double ans = sum;
    for(int i=1; i<n-k+1; i++) {
        sum = sum + dice[i+k-1] - dice[i-1];
        if(sum>ans) ans = sum;
    }

    cout<<fixed<<setprecision(8)<<ans<<endl;

    return 0;
}
```


#おしまい
梅酒飲んでプログラム書くと思ったより色々ミスるね
javascriptでslackにメッセージを送信する方法

javascriptでslackにメッセージを送信する方法をまとめました。

# 前提条件
- npmがインストールされていること
- slackのapiキーが分かっていること

# インストール
`npm`コマンドでモジュールをインストール

```shell
$ npm i --save axios
```

# 使い方
## ファイルの作成
`touch`コマンドで`test.js`ファイルを作成

```shell
$ touch test.js
```

## 設定
`path`にはslackのapiが入ります。

```javascript:test.js
const axios = require('axios')

const slack = async (path, channel, username, text, iconEmoji) => {
  const data = `payload={
    "channel": "${channel}",
    "username": "${username}",
    "text": "${text}",
    "icon_emoji":"${iconEmoji}"
  }`
  const param = {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    }
  }

  try {
    const res = await axios.post(path, data, param)
    console.log(res.data)
  } catch (err) {
    console.log(err)
  }
}

(async function () {
  await slack('xxxxxx', '#test', 'テストマン', 'テストコメント', ':memo:')
  console.log('slackにメッセージを送信しました。')
}())
```

## 実行
`node`コマンドで`test.js`を実行する

```shell
$ node test
```

## 出力結果

```console
ok
slackにメッセージを送信しました。
```

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [SlackのIncoming Webhooksを使い倒す](https://qiita.com/ik-fib/items/b4a502d173a22b3947a0)
- [Node.js(axios利用)でSlackにPOSTするサンプル](https://qiita.com/n0bisuke/items/1cbcc5b081b14c68f04d)
- [Qiita/Github/Slack/Discord 絵文字一覧](https://qiita.com/yamadashy/items/ae673f2bae8f1525b6af)
aws-sdkを使ってs3にあるjsonデータを取得する方法

`aws-sdk`を使ってs3にあるjsonデータを取得する方法をまとめました。
s3の`json`バケットの`test.json`のデータ「`{}`」を取得します。

# 前提条件
- npmがインストールされていること
- aws側の認証情報設定を行っていること

# インストール

```shell
$ npm i --save aws-sdk
```

# 使い方
## ファイルの作成
`touch`コマンドで`test.js`ファイルを作成

```shell
$ touch test.js
```

## 設定
認証情報とapiバージョン、リージョンを設定します。
s3の`getObject`メソッドでファイルデータを取得します。
`aws-sdk`では処理をプロミス化するのに`.promise()`メソッドが使えます。

```javascript:test.js
const AWS = require('aws-sdk')

const option = {
  credentials: new AWS.Credentials(
    'xxxxxxxxxxxxxxx', // AccessKeyIdが入ります
    'xxxxxxxxxxxxxxx' // SecretAccessKeyが入ります
  ),
  apiVersions: {
    s3: '2006-03-01'
  },
  region: 'ap-northeast-1'
}

AWS.config.update(option)

const s3 = new AWS.S3()

const param = {
  Bucket: 'json',
  Key: 'test.json'
};

(async function () {
  await s3.getObject(param).promise()
    .then(res => console.log(JSON.parse(res.Body.toString())))
    .catch(err => console.log(err))
  console.log('jsonを取得しました。')
}())
```

## 実行
`node`コマンドで`test.js`を実行する

```shell
$ node test
```

## 出力結果

```console
{}
jsonを取得しました。
```

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [Class: AWS.S3](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html)
- [AWS.config.updateでアクセスキーが設定できないときに見るページ](https://qiita.com/motchi0214/items/d9e8cfc04326f3bb6d6c)
CeleryのタスクをデバッグしやすいようにDjangoのコマンドを書いた

Django + Celeryのプロジェクトでタスクを同期的(非同期ではなく)に呼び出して動きを確認したかった。
Djangoのmanagementコマンドからタスクを指定して呼び出せると楽かなと思ったので書いた。

以下のファイルをアプリケーションのmanagement/commands/配下に置く。

```python:run_task.py

import importlib
import inspect
import json
import pdb

from django.core.management.base import BaseCommand


class Command(BaseCommand):
    help = "Django commands that make debugging celery tasks easier"

    def add_arguments(self, parser):
        parser.add_argument(
            "dottedname", help="The dotted name of the callable object."
        )
        parser.add_argument(
            "--task-args",
            default="[]",
            type=json.loads,
            help="Arguments passed to the task. (default: '[]')",
        )
        parser.add_argument(
            "--task-kwargs",
            default="{}",
            type=json.loads,
            help="Keyword arguments passed to the task. (default: '{}')",
        )
        parser.add_argument(
            "--pdb", action="store_true", help="Stop execution by debugger."
        )
        parser.add_argument(
            "--pdb-offset",
            default=0,
            type=int,
            help="Offset for debugger to create breakpoint. (default: 0)",
        )

    def handle(self, **options):
        dotted_list = options["dottedname"].strip().split(".")
        module_name = ".".join(dotted_list[:-1])
        func_name = dotted_list[-1]

        try:
            module = importlib.import_module(module_name)
        except ModuleNotFoundError:
            self.stderr.write(f"No module: {module_name}")
            return

        try:
            func = getattr(module, func_name)
        except AttributeError:
            self.stderr.write(f"No attribute: {func_name} not in {module_name}")
            return

        if not callable(func):
            self.stderr.write(f"Not function: {module_name}.{func_name}")
            return

        if options["pdb"]:
            lineno = inspect.getsourcelines(func)[1] + options["pdb_offset"]
            debugger = pdb.Pdb()
            debugger.set_break(module.__file__, lineno=lineno, funcname=func_name)
            debugger.set_trace()

        result = func(*options["task_args"], **options["task_kwargs"])
        self.stdout.write(f"Return: {json.dumps(result)}")

```


こんな感じで呼び出すと

```
$ python manage.py run_task myproject.tasks.example_task --task-args '[1, 2, 3]'
```

こんな感じで呼び出したのと同じ動きをする。

```
  >>> from myproject.tasks import example_task
  >>> example_task(1, 2, 3)
```

また `--pdb` を指定するとデバッガが起動するようにもしてみた。

```
$ python manage.py run_task myproject.tasks.example_task --pdb --task-args '[1, 2, 3]'
```

とすると、myproject.tasks.example_task内にbreakpointが設定された状態でデバッガが起動する。
標題のために書いたが、Celeryはあまり関係なかったな。

gistに置いておく。
https://gist.github.com/TakesxiSximada/d986ef7d8fbf5555d8e12586226dc389
async/awaitでシンプルにsetTimeoutする

`async/await`を使用するときに、`setTimeout`で`Promise`を返す関数を作ります。

# delayメソッド

```javascript
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
```

※この後の使い方を続けて記述する場合、↑行末のセミコロンを省略すると使えません。

## 使い方
`await`で`delay`メソッドを使い、引数にはミリ秒単位で時間を入れる、その間後続の処理は行われません。

```javascript
(async function() {
  await delay(3000)
  console.log('3秒経ちました。')
}())
```

## 出力結果

```console
3秒経ちました。
```

3秒後に「3秒経ちました。」と出力されました。

# 参考文献

この記事は以下の情報を参考にして執筆しました。

- [setTimeoutをasync/awaitプログラミングで使う](https://qiita.com/yuba/items/2b17f9ac188e5138319c)
CSS3 *（アスタリスク）

何気にこれがスマホアプリ作るときは便利なのですよね。

~~~ :CSS3
* {
   margin: 0;
   padding: 0;
}
~~~

<style>
* {
  margin: 0;
  padding: 0;
}
</style>
<h2>*（アスタリスク）</h2>
全てのって意味らしいです。


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
RESTサーバのMockを簡単に作る方法

# node.jsのjson-serverを利用する
json-serverというライブラリが素敵な感じ。

## 導入
ローカルに導入するとして。。。
1. 展開場所確保
npm init
2. インストール
npm install json-server
3. キック用にpackage.jason書き換え

```package.json
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "json-server": "json-server"
  },
```
4.mockデータファイル用意。例えばこんな感じのjsonだとするとtop下の階層がエンドポイントになる感じ。

```mockdata.json
{
  "movies": [
    { "title": "マトリックス", "rating": 9.1},
    { "title": "タイタニック", "rating": 8.8}
  ],
  "user": [
	 {"name": "fukuhara", "age": 35, "sex": "male"},
	 {"name": "sugiyama", "age": 42, "sex": "male"}
  ]
}
```
5.mockサーバ起動
npm run json-server -- --watch mockdata.json

```
npm WARN lifecycle The node binary used for scripts is C:\Program Files (x86)\Nodist\bin\node.exe but npm is using C:\Program Files (x86)\Nodist\v-x64\10.15.3\node.exe itself. Use the `--scripts-prepend-node-path` option to include the path for the node binary npm was executed with.

> restmock@1.0.0 json-server H:\work\restmock
> json-server "--watch" "mockdata.json"


  \{^_^}/ hi!

  Loading mockdata.json
  Done

  Resources
  http://localhost:3000/movies
  http://localhost:3000/user

  Home
  http://localhost:3000

  Type s + enter at any time to create a snapshot of the database
  Watching...
```

6.Curlでちょっと叩いてみる

```
curl -X GET "http://localhost:3000/movies"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   126  100   126    0     0    126      0  0:00:01 --:--:--  0:00:01   473[
  {
    "title": "マトリックス",
    "rating": 9.1
  },
  {
    "title": "タイタニック",
    "rating": 8.8
  }
]

```
## できること
### 登録/更新/削除操作ができる
登録

```
curl -X POST -H "Content-Type: application/json" -d '{
  "title": "test1",
  "id":1
}' "http://localhost:3000/movies"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    65  100    33  100    32     33     32  0:00:01 --:--:--  0:00:01   277{
  "title": "test1",
  "id": 1
}

curl -X GET "http://localhost:3000/movies/"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   169  100   169    0     0    169      0  0:00:01 --:--:--  0:00:01   722[
  {
    "title": "マトリックス",
    "rating": 9.1
  },
  {
    "title": "タイタニック",
    "rating": 8.8
  },
  {
    "title": "test1",
    "id": 1
  }
]

curl -X GET "http://localhost:3000/movies/1"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    33  100    33    0     0     33      0  0:00:01 --:--:--  0:00:01   150{
  "title": "test1",
  "id": 1
}

```

- 更新系作業時は「id」ってフィールド無いとダメっぽい。
- 逆に「id」フィールドさえあれば他はチェックしてないくさい

### 更新されたmockデータのjsonをスナップショットとして保存できる
ctrl+s

```
  Saved snapshot to db-1582737815807.json
```
【LINE bot】おいら、だじゃレンジャー！

#はじめに
[前回のLINE botの記事](https://qiita.com/Hexans/items/519a9059733b553ceab7)でオウムがえしのLINE botを作成したぞ！
ちびっこのみんなに好かれたくお題を与えるとそのお題にまつわる
<b>だじゃれを返すLINE bot</b>を作成することにしたんだ😁
LINE botの登録、作成、Herokuへのデプロイ等は
[前回のLINE botの記事](https://qiita.com/Hexans/items/519a9059733b553ceab7)を参考にしてくれ👍

#完成品
できあがりはこんな感じなんやで！
ぜひとも友達登録してくれよな😁
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/90be320f-e366-2103-3ab2-fc09783b3f91.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/6add9b63-c0e8-1838-6b10-d446af5ffa37.png)

#詳細
詳しい解説とコードは[	
【LINE bot】おいら、だじゃレンジャー！](https://www.aiprogrammers.net/entry/2020/04/19/011432)をご覧ください。
leet code 83 Remove Duplicates from Sorted List の覚え書き

83 Remove Duplicates from Sorted List
https://leetcode.com/problems/remove-duplicates-from-sorted-list/

この問題が曲者すぎた。
ぱっと見で簡単やろうと思った自分を殴りたい。激ムズでっせ。
ListNodeの値は[1,1,3]

```golang
func deleteDuplicates(head *ListNode) *ListNode {

	cur := head
	for cur != nil && cur.Next != nil {
		if cur.Val == cur.Next.Val {
			cur.Next = cur.Next.Next //これでheadも更新済み

			fmt.Println(head, "headそのもの")
			fmt.Println(head.Next, "head.Next")
			fmt.Println(cur.Next, "cur.Next")
		} else {
			cur = cur.Next
			//ここでcur自身を新しく作る(上書き)ので,curはheadとは別物になる
			//curという入れ物自体は変化する
			//しかし、入れた値のNextは番地を与えているので、中身を変えるとheadも変わる
		}
	}

	return head
}
```


ここで、考えなければならないことが大きく3つある。
ListNodeの扱い方
アルゴリズムを考える
ポインタ(番地とか)

その中でも、Listnodeとポインタが時間を取られたところ。

1 ListNode

```
//  * Definition for singly-linked list.
type ListNode struct {
	Val  int
	Next *ListNode
}
```
これはstruct(構造体)である。すでに定義済みのものを扱うとのこと
でもその中身とかどうやって見るのかわからん。調べてみた。
https://play.golang.org/p/StDSHvDEvb
`&ListNode{Val: 2, Next: &ListNode{Val: 4, Next: &ListNode{Val: 3, Next: &ListNode{}}}}`
中身はこうなっていて、2を取得するには、ListNode.Val、4を取得するにはListNode.Next.Valと書く。
ちなみに最後のNextは{0,nil}になるみたいです。⬅︎重要！

2 ポインタ
if分のprintを実行すると以下のようになる。

```
&{1 0xc000086050} headそのもの
&{3 0xc000086060} head.Next
&{3 0xc000086060} cur.Next
&{1 0xc000086050} headそのもの
&{3 0xc000086070} head.Next
&{0 <nil>} cur.Next
```
いかなる時でもheadの番地は変化していないのがわかる。
headの入れ物自体は変化はしないが、実際にはheadの中身(Next)は変化しているのもわかる。
 head = [Val:1,Next{Val:1,Next:{Val:3,Next{}}}]
headの変数の入れ物自体は変化はしていない。これ→[]
headの中身head.Nextは変化しているので番地は変更される[Val:1,Next:{Val:3,Next{}}]

elseの処理の cur = cur.Nextはcurを上書きしている(つまり新しく作成しているので番地は変更になる)
けれども、その中身のNextの番地はheadのものなのでcur.Nextをいじるとhead.Nextも変更される。


という、大きな仮説を立てました。
よくわかる解説が欲しい。
Monitでのサーバー監視等の自動化

# Monitとは
統合監視デーモンで、設定の閾値以上でメール通知や自動復旧等や監視を実施することができます。
・httpレスポンス、プロセス、ポートの監視　例)Apache、MySQL、SSL、Postfix、fluentd
・CPU、メモリ、ロードアベレージ、ディスク容量等

#１．初期設定（新規でサーバーに導入する場合）
## ①EPEL rpmパッケージをインストールして有効にする
```console
$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```

## ②monitをインストール
```console
$ sudo yum -y install monit
```

## ③関連ファイルがあるか確認
```console
$ rpm -ql monit
/etc/logrotate.d/monit
/etc/monit.d
/etc/monit.d/logging
/etc/monitrc
/usr/bin/monit
/usr/lib/systemd/system/monit.service
/usr/share/doc/monit-5.14
/usr/share/doc/monit-5.14/COPYING
/usr/share/doc/monit-5.14/README
/usr/share/man/man1/monit.1.gz
/var/log/monit.log
```
## ④設定ファイルのバックアップ
```console
$ sudo cp -av /etc/monitrc{,.bk}
`/etc/monitrc' -> `/etc/monitrc.bak'
// -a 権限を出来る限りそのままにしてコピー
// -v コピー前にファイル名を表示する
// {,.bk} ブレース展開と言われる手法で.bkというファイル名でコピー
```

## ⑤設定ファイルの編集
```console
$ vi /etc/monitrc
```

```
…
set daemon  30              // デフォルトチェック間隔は30secなので任意に変更
…
include /etc/monit.d/*.conf // .confだけを読み込むよう編集
```

## ⑤' monitはWWWサーバの機能も持っており、HTTP 経由で設定を参照したり、 サービスの制御を行ったりすることができる
```
set httpd port 2812 and    # Webインターフェースポート(Default:2812)
    allow localhost        # アクセスを許可するIP(localhost)
    allow XXX.XXX.XXX.XXX/XX  # アクセスを許可するIP(任意のIP)
    allow admin:monit      # 管理コンソールのuser='admin' password='monit'
#以下SSLを使わないためコメントアウト
    #with ssl {            # enable SSL/TLS and set path to server certificate
    #    pemfile: /etc/ssl/certs/monit.pem
    #}
```

## ⑥設定ファイルの作成
```console
$ vi /etc/monit.d/XXXX.conf　// 設定ごとに新規作成
$ mv /etc/monit.d/logging /etc/monit.d/logging.conf　// ログ設定ファイルの名前変更
```


#２．共通設定ファイル
以下がメイン設定ファイルです。

```
/etc/monitrc
バックアップ：/etc/monitrc.bk

includeして、以下の個別設定ファイルを読み込んでいます。
/etc/monit.d/*.conf
```

#３．個別設定ファイル(例）
```
/etc/monit.d/test.conf
```
```
// 監視プロセス設定
check process test matching "test"
// 起動設定
start program "/usr/local/test/bin/start_test.sh"
// 停止設定
stop program "/usr/local/test/bin/stop_test.sh"
// プロセスがない場合、リスタート
if does not exist then restart
// slackに通知　※
if does not exist then exec "/usr/local/test/bin/slacknotice.sh"
// 5回の監視中に5回リスタートして起きなければやめる
if 5 restarts within 5 cycles then unmonitor
```
※実行するシェルに実行権限付与することを忘れないこと
`$ chmod +x `

※slack通知参考サイト: https://cloudpack.media/10085

### monitのベストプラクティスとして以下のcronを仕込むことが推奨されている。
```
echo "0 */1 * * * /usr/bin/monit monitor all" >> /var/spool/cron/root
```
https://hogem.hatenablog.com/entry/20090723/1248358467

# ４．実行コマンド
起動コマンド
`$ systemctl start monit`
OS起動時に自動起動
`$ systemctl enable monit`
停止コマンド
`$ systemctl stop monit`
ステータス
`$ monit status`
設定を変更した場合のリロード (重要!!)
`$ monit reload`
設定を変更した場合のテストコマンド
`$ monit -t`
監視状況を知る
`$ monit summary`
monitがさぼってる場合（Not monitoredのとき）
`$ monit monitor all`
コマンド一覧
`$ monit -h`

# ５．管理画面（Monit Service Manager）
IP:monitのサーバーのIP
PORT:⑤'で設定したPORT
`http://XXX.XXX.XXX.XXX:2812/`

#６．有償のM/Monitについて
以下のサイトが詳しく記載されていました。
https://inokara.hateblo.jp/category/monit
Unity で Rigidbody と Collider をつけても衝突しないときがある

Unity で Rigidbody も Collider もあるのに衝突しない場合は、Rigidbody の Collision Detection の値を見直してみましょう。

# どこの値を変更するの？
Rigidbody の Collision Detection の設定が、 Discrete になっていたら、とりあえず Continuous に変更してみましょう。
![Donuts_-_HandTracking_-_Android_-_Unity_2019_3_0f6_Personal__Personal___Metal_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/82e16867-46e4-356f-ecf1-fd7a1815cd22.png)


# Collision Detection ってなに？
衝突判定のことですが、[公式サイト](https://docs.unity3d.com/ja/2019.3/Manual/class-Rigidbody.html)では以下の通りに説明されています。

> Collision Detection | これを使用すると、高速で動くオブジェクトが、衝突を検知せずに他のオブジェクトをすり抜けてしまうことを防ぎます。 

# なんで最初から Continous ではないの？
衝突検知するためには、衝突していることを判定しないといけませんが、その回数が多い方が性能問題を引き起こしやすくなります。Discreate と Continous を比較すると、Continous の方が衝突判定が多い分、高速に動いているものでも正確に衝突判定しやすくなります。そしてその分CPUリソースなどを使用することになります。

こちらのサイトがわかりやすく説明してくれています。他の設定値についても説明してくれているので、興味がある方はぜひ。
[【Unity】RigidbodyのCollision Detection(衝突の検知)を変えて実験](https://ekulabo.com/rigidbody-collision-detection)
【Python】ランダムフォレストで疾患分類〜LDAも交えて〜

#はじめに
[過去の記事](https://qiita.com/Hexans/items/c19277e7fbcfa8674fd8)でランダムフォレストを使って疾患分類をしたが、そのアップデート版。
今回は、データの標準化およびLiner Discriminant Analysis(LDA)を追加した。
また、結果のまとめがみれるようにClassification ReportとConfusion Matrixが出力されるようにした。

詳しい解説とコードは[【Python】ランダムフォレストで疾患分類〜LDAも交えて〜](https://www.aiprogrammers.net/entry/2020/04/19/011106)をご覧ください。
Dockerのインストール手順 For Mac

# はじめに
チーム開発で環境構築を統一する上で便利なツールであるDocker。

また、コンテナ型仮想化によりホスト型仮想化と比較して非常に便利。
MacとWindowsではDockerのインストールに違いがあります。

今回は、MacにDockerをインストールする手順を解説します。
10分程度で終わるので簡単です!

対象者は、
- Dockerのインストールをしてみたいけど、よくわからない方
- Dockerのインストールで挫折してしまった方
- Macをお持ちの方でDockerを１からインストールしたい方

# 目次
1. そもそもDockerとは
2. Dockerインストール手順
	1. Docker for Macをインストール
    2. Dockerがインストールされたか確認

# 1.そもそもDockerとは
![Docker](https://drive.google.com/uc?export=view&id=1_flk_Neii1uUF6lagpSDbSqqSPtoYGvg)

DockerとはDocker社が提供しているOSSのことで、コンテナ管理ソフトウェアです。

ざっくりでもDockerについて理解したい方は、以下を参照してください。

[いまさらだけどDockerに入門したので分かりやすくまとめてみた](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1)

# 2.Dockerインストール手順
## 1.Docker for Macをインストールする
Docker公式サイトからDockerのアカウントを作成後、DockerHubからダウンロードしインストールします。

[公式Docker](https://hub.docker.com/editions/community/docker-ce-desktop-mac)

![Dockerアカウント登録](https://drive.google.com/uc?export=view&id=15QPr4udfI5YA9wVTp5lN8EzP-Sb6l-zU)

![Docker For Macダウンロード](https://drive.google.com/uc?export=view&id=1d0bt5fMmhJdwvhtREHhId4IPC-ZcA2SF)

インストール時に「開発元が未確認のため開けません」表示された場合は、下記を参照してください。

[「開発元が未確認のため開けません」の対処法](http://itea40.jp/technic/mac-troubles/developer-is-unconfirmed/)

## 2.Dockerがインストールされたか確認

```sh
$ docker -v
Docker version 19.03.5, build 633a0ea
```

Dockerのバージョンが表示されれば、無事にインストールができています。
おめでとうございます!!
chat-spaceを作ろう②

# TOPページを作成する
## コントローラーを作成し、ルートを設定する
```ruby:ターミナル
rails g controller messages
messagesコントロラーと、views/messagesディレクトリが作成される
```

```ruby:controller/messages_controller.rb
def index
end
topページ用のindexアクションを定義する
```
```ruby:routes.rb
root "messages#index"
とりあえず、TOPページを表示する為のルートを設定する
```
# ビューファイルを作成する
views/messagesディレクトリ内に以下のファイルを作成する

- index.html.haml　（indexアクションに対応したビューファイル）
- _side_bar.html.haml　（TOPページの左サイド部分）
- _main_chat.html.haml　（TOPページのメイン部分）

```ruby:views/messages/index.html.haml
.wrapper
side_barとmain_chatの要素を囲むコンテナ（特に意味はない）
  = render "shared/side_bar.html.haml"
  = render "main_chat.html.haml"
　　部分テンプレートを呼び出す
```

今日ここまで
次回はアイコンを使用できる様にします
[見本サイト](https://chat-space-sample.herokuapp.com/users/sign_in)
Jquery タブスイッチ機能を実装してみよう

# 目標　プラグインを使わずにタブスィッチを実装する
今回はjavascriptのお話でございます。
最近プラグインを使わずに実装した
タブ切り替え機能の紹介をしたいと思います。

# HTML
まずタブとタブに連動したコンテンツのHTMLを用意します。

一番目のタブに「class=”select”」をつけます。
最初に表示させないコンテンツにはあらかじめ「display:none;」を設定しますので、
ここでは「class=”hide”」をつけました。

```html:html
<ul class="tab">
	<li class="select">タブ1</li>
	<li>タブ2</li>
	<li>タブ3</li>
	<li>タブ4</li>
</ul>
<ul class="content">
	<li>親譲りの無鉄砲で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰を抜かした事がある。</li>
	<li class="hide">なぜそんな無闇をしたと聞く人があるかも知れぬ。別段深い理由でもない。</li>
	<li class="hide">新築の二階から首を出していたら、同級生の一人が冗談に、いくら威張っても、そこから飛び降りる事は出来まい。</li>
	<li class="hide">弱虫やーい。と囃したからである。小使に負ぶさって帰って来た時、おやじが大きな眼をして二階ぐらいから飛び降りて腰を抜かす奴があるかと云ったから、この次は抜かさずに飛んで見せますと答えた。</li>
</ul>
```

# CSS
先ほどつけた「hide」というクラスには「display:none;」を設定します。
それ以外は最低限のCSSのみ記述しているので、必要な部分はお好みで書き込んでください。
（ちなみにCSSはリセットされている状態です。）

```css:css
.tab{
overflow:hidden;
}
.tab li{
background:#ccc; 
padding:5px 25px; 
float:left; 
margin-right:1px;
}
.tab li.select{
background:#eee;
}
.content li{
background:#eee; 
padding:20px;
}
.hide {
display:none;
}
```
# Jquery
jQueryで『タブをクリックしたら連動したコンテンツを表示する』指示を記述していきます。
もちろんですが、jQueryは先に読み込ませてください。

```javascript:javascript
$(function() {
	//クリックしたときのファンクションをまとめて指定
	$('.tab li').click(function() {

		//.index()を使いクリックされたタブが何番目かを調べ、
		//indexという変数に代入します。
		var index = $('.tab li').index(this);

		//コンテンツを一度すべて非表示にし、
		$('.content li').css('display','none');

		//クリックされたタブと同じ順番のコンテンツを表示します。
		$('.content li').eq(index).css('display','block');

		//一度タブについているクラスselectを消し、
		$('.tab li').removeClass('select');

		//クリックされたタブのみにクラスselectをつけます。
		$(this).addClass('select')
	});
});

```
# DEMO
[![Image from Gyazo](https://i.gyazo.com/ae0fdc9165533b6bbe213239f852f61e.gif)](https://gyazo.com/ae0fdc916553
3b6bbe213239f852f61e)

# これで完成

数行でシンプルに実装できます。

いろいろ応用が出来ると思いますので試してみてください。
正規表現について 電話番号で解説

##正規表現とは
正規表現とは、メタ文字と文字列を組み合わせてあらゆる文字列パターンを表現することです。
この記事では携帯電話番号を例にしてどのように書けばいいのか解説します。

#例
早速例を出します。以下は携帯電話番号の妥当性について検証しています。

・携帯電話の番号である条件
1. 先頭が070、080、090のいずれかであること
2. 4桁目が ハイフン であること
3. 5桁目から8桁目が数字であること
4. 9桁目が ハイフン であること
5. 10桁目から13桁目が数字であること

5つの条件を満たす文字列パターンを書くと以下のようになります。
``` /^0[789]0-\d{4}-\d[4]\ ```


##解説
それでは１つずつ解説していきます。

・先頭の / と末尾の /
この中に表現したい文字列パターンを入力します。

・^0
先頭の文字が0であること

・[789]0
2文字目が7,8,9のいずれかであること
これで条件1の「先頭が070、080、090のいずれかであること」が表現できました。

・ -　(ハイフン)
4桁目がハイフンであること
これで条件2の「4桁目がハイフンであること」を満たすことができます。

・ \d{4}
4桁の数字であること
この記述により、条件３の「5桁目から8桁目が数字であること」となります。

9桁目から13桁目については解説が被ることになるため割愛します。


##まとめ
以上で携帯電話番号の妥当性を確認できます。
画面から入力された値に対してこのチェックを入れることで、テーブルに予期せぬ値が格納されることを防ぐことが出来るわけですね！
Automation Anywhere Enterprise A360での型変換、応用編

#はじめに
Automation Anywhere Automation 360では、変数にデータ型が導入され、開発者寄りのユーザーさんのニーズにより応えられるようになりました。
詳しくはRPAbotさんの以下の記事をご覧ください。

[Automation Anywhere A2019で変数を使う (v11との比較) - Qiita](https://qiita.com/RPAbot/items/efdd03462e35dad35012)


それで、型変換を行う場合には型変換用のアクションを使うのですが、
これが時に手数が増えてしまって大変な時があります。

例えばこんなイメージですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/401a7b83-18a9-2873-e942-a2bae1ee6409.png)

そこで、変数を呼び出すと同時に型変換をする方法をご紹介します。
#やりかた
実は、製品ドキュメントのユーザー定義変数の項目に注記として下記のようなことが書いてあるのですが、これが実はなかなか便利で、これが今回ご紹介する方法になります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/cb634324-4939-33a0-6f94-e1d5ef2681da.png)
画像：Automation Anywhere 製品ドキュメントの[User-defined variables](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/aae-client/bot-creator/using-variables/cloud-user-local-variables.html#cloud-user-defined-variables__recursive-expression) より抜粋。

#####意訳:
> 1つのアクションの中で変数の型や値を一時的に変換することができます。
テキストフィールドで`$変数名.アクション$`という風に入力してください。
"."を入力した時点でオートフィル機能が働き、`toString`(文字列へ変換)といった利用可能なアクションの一覧が表示されます。

変数名の末尾に"."を入れると、変換できる型や、その変数に対して適用できるアクションの一覧が出て、選択すると希望するデータ型に変換出来たり、「文字列から空白を削除する」といったアクションを適用出来たりします。

こんな風に変換候補やアクションが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/445a94db-535f-1755-4678-e8b51a06f167.png)
この例の場合は上から、「デクリメント（-1する)」「インクリメント(+1する)」「文字列へ変換する」ですね。

こちらを使うと、メッセージボックスの本文上で型変換が出来てしまうため、
型変換のアクションが不要になり、また値を格納しておく変数を作らないでも済みました。
こんな感じに。
#####Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/401a7b83-18a9-2873-e942-a2bae1ee6409.png)
#####After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/7f24b51d-4524-e723-c5d0-ddd7806cb85d.png)
#####ただ、中身は結構ごちゃごちゃしてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/b7a7f5fd-35a0-e5b6-80c7-19c2a1e6027b.png)

#まとめ
以上のとおり、通常の型変換用のアクションを使う方法のほかに、
Javaっぽい感じでインラインで型や値の変換をする方法を紹介しました。

こちらはとても便利な機能ではあるのですが、その反面、Botのソースの可読性を下げてしまい、
また、初心者の方に理解しづらくなってしまいますので、お勧めできない面があります。
組織内のどんなユーザーが将来的に作ったBotをメンテナンスするのか。
想定される方のスキルレベルに合わせて、この機能を使うのか、多少手間でも通常の型変換アクションを使うのか、決めると良いと思います。

#関連記事
Automation Anywhere A2019 で変数の「型キャスト」を使いこなす - Qiita
https://qiita.com/RPAbot/items/c6b23a8b84ae30aef0ff
UICollectionViewのドラッグで、元の位置に戻すときに一瞬ちらつく現象

##ドラッグ時にちらつく

Xcode9時代にUICollectionViewのドラッグアンドドロップによる並び替え機能を実装していた画面にて、Xcode11.3でビルドしたところ、一見問題なく動いているものの、

- ドラッグ開始
- 元の位置に移動する
- 瞬時に元の位置に戻ったり、ドラッグ位置に戻ったりとちらつく

という現象に遭遇しました。
実はというと、Autolayoutで警告メッセージが表示されていたので、多分そっちを解決すべきなんですが、どうしてもAutolayoutが解決しなかった。

で、iOS11以降から使用できるというUICollectionViewDragDelegate/DropDelegateがあるためこちらに書き換えたところ、現象が解消されました。


## UICollectionViewDragDelegate

ドラッグ開始のデリゲート。
UIDragItemのitemProviderを通じてドラッグ後イベントにパラメータを渡したりできる。
よくある書き方はこんなかんじ。

```Swift
func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
    let index = indexPath.row.description
    let itemProvider = NSItemProvider(object: index as NSString)
    let dragItem = UIDragItem(itemProvider: itemProvider)
    return [dragItem]
}
```

並び替え処理の場合、このデリゲート内で

```Swift
func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal｛
    return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
｝
```
と返してあげる。
（ホントわかりにくい）


ドラッグ後のデリゲートはこちら。

```Swift
func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
    // 遷移先のindexPathはこうして取得
    let destinationIndexPath: IndexPath = coordinator.destinationIndexPath
        
    switch coordinator.proposal.operation {
        case .move:
            // UIDragItemは複数ある
            let items = coordinator.items
            // 先頭の1要素目から遷移元indexPathの取得はこういう感じで
            let firstIndexPath = items.first!.sourceIndexPath
            
            // performBatchUpdatesの中で、データの更新とCollectionViewのセルの増減操作をする。
            collectionView.performBatchUpdates({
                // データソースの更新
                let n = datalist.remove(at: sourceIndexPath.item)
                datalist.insert(n, at: destinationIndexPath.item)
            
                //セルの移動
                collectionView.deleteItems(at: [sourceIndexPath])
                collectionView.insertItems(at: [destinationIndexPath])
            })

            // dropを呼ぶと、指定したindexPathの位置にCellがスッと入る動きをしてくれる
            coordinator.drop(item.dragItem, toItemAt: destinationIndexPath)
        default:
            return
        }
    }
}
```
という感じ。
あとはUICollectionViewのDrag/DropDelegateを設定すれば実装できる。
ドラッグ中のスタイルの設定はまた別でデリゲートがあります。


※このコードは動作確認してません。
Codeforces Round #624 B. WeirdSort : バブルソート

https://codeforces.com/contest/1311/problem/B

# 概要

- 数列 $a1, a2, ... , an$が与えられる。正の整数であり、重複する可能性がある。(例[1,1,1] などのこともある
- また、$p1,p2, ... , pm$が与えられる。ある、$px$の値を$c$としたとき、あなたは、$a_{c}$と$a_{c+1}$の要素を入れ替えられる。$px$は何回使っても良い。
- 数列aを昇順にすることは可能か調べろ

# 例

`p が 1 originなことに注意すること。`

$a=[3, 2, 1]$とし、$p=[1, 2]$とすると、action1: index1とindex2を入れ替える、action2: index2,index3を好きなだけ繰り返すことができる。つまり、全部の要素を入れ替えられる。このため、
$[3, 2, 1] -> [2, 3, 1] -> [2, 1, 3] -> [1, 2, 3]$などとすればよい。(答えはYes)

$a=[4, 1, 2, 3]$で$p=[2, 3]$の場合、index1にある4を右端にもっていかないとならない。しかし、$p$に1は存在しないため、$4$を移動できない。故に答えはNo。

# アプローチ

隣り合う要素の交換を行い、昇順に並べ替えるというのはバブルソートに他ならない。しかし、すべての要素が並び替えられるわけではなく、$p$に値のあるインデックスだけが、右隣りと要素を入れ替えれれる。

2つのアプローチが思い浮かぶ。

`アプローチ1`: あるべき位置 を知り、初期位置からそこに移動するまでに必要なpが存在するかを調べる。ただし、これは、$[1, 3, 1, 3, 1, 3]$のように同じ数字が複数個存在し、それぞれ右や左から移動することを考えると、多少面倒である。また、pに各値が存在するかを確認するのは多少面倒である。

`アプローチ2`: 実際にバブルソートを行う。数列aはたかがか$len(100)$程度であるので、$O(n^{2})$でバブルソートは行える。具体的に以下のバブルソートを行う。

- 配列の最初から最後まで$a_{i}$と$a_{i+1}$を比較し、$a_{i} \gt a_{i+1}$であるならば、pにその値があるかを確認し(pは1 originなことに注意しつつ) 入れ替える。もし、pにその値が存在しないなら、ソートはできない。(より右にいるべき文字が移動できないので)

- この処理を移動が起きなくなるまで繰り返す。 移動が起きなくなったとき、ソートは完了するのでYes

尚、pにその添え字の配列が存在するかを確認するのには、リストのまま$O(m)$で毎回探索するより、最初に各添え字が入れ替え可能かの辞書を作っておく方が効率が良い。

# コード
```Python
from pprint import pprint
q = int(input())
for _ in range(q):
    n, m =map(int, input().split())
    data = list(map(int, input().split())) # to n
    datp = list(map(int, input().split())) # to m
    canchange = [False] * 2000
    for i in range(len(datp)):
        canchange[datp[i] - 1] = True
 
    f = True
    while True:
        nochange = True
        for i in range(n - 1):
            if data[i] > data[i + 1]:
                if canchange[i]:
                    data[i], data[i+1] = data[i+1], data[i]
                    nochange=False
                else:
                    nochange=True
                    f = False
                    break
        if nochange:
            break
    print("YES" if f else "NO")
```
https://codeforces.com/contest/1311/submission/71780499
angrをUbuntu18.04にインストールする

#はじめに
angrを使うことになりそうなのでインストールしてみた．今後のためにメモを残しておく．

#環境
* Oracle VM VirtualBox
* Ubuntu18.04.4 LTS
* Python3.6.9

#手順
## 各種インストール
[公式](https://github.com/angr/angr-doc/blob/master/INSTALL.md)を見たところ，virtualenvを強く推奨しているみたいなので従ってみた．

```bash
sudo apt-get update
sudo apt-get upgrade

sudo apt-get install python3-dev libffi-dev build-essential virtualenvwrapper
```

## シェルの再起動
この後いきなり`mkvirtualenv`を使うと`command not found`と怒られた．理由は分からないがシェルを再起動する（単に閉じて開きなおす）と解決した．

## 仮想環境の構築
これで`mkvirtualenv`が使えるはずなので仮想環境を立てる．

```bash
mkvirtualenv --python=$(which python3) angr
```

## angrのインストール
そして最後に`pip`でangrをいれる．

```bash
pip install angr
```

#動作確認
`python`コマンドでインタラクティブシェルに入ってimportできるか試す．

```python
import angr
```
エラーが出なければ成功．

#virtualenvの使い方(おまけ)
##環境から抜けるとき

```bash
deactivate
```

##今回の環境に入るとき

```bash
workon angr
```

#最後に
次は簡単な例で使ってみたい．
Windows 10の標準VPNクライアントでNATトラバーサルが必要な場合の簡易手順

# 前提条件

- 過去にNATトラバーサル設定を行っていない事
- 設定はレジストリの変更を伴うため、実行は自己責任で行うこと

なお、Windows 10標準VPNクライアントで`L2TP/IPSec`を使用している場合で、二人目がVPNに接続したら一人目のVPN接続が切断される場合にも効果がある場合があります。

# 自働化

## 状態確認用ファイルの作成

次の内容を`VPN_NAT-T_確認.bat`として任意の場所に作成してください。
デスクトップでも大丈夫です。

```cmd
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent" /v "AssumeUDPEncapsulationContextOnSendRule"

pause
```

## 設定追加用ファイルの作成

次の内容を`VPN_NAT-T_設定追加.bat`として任意の場所に作成してください。
デスクトップでも大丈夫です。

```cmd
reg query "HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent" /v "AssumeUDPEncapsulationContextOnSendRule"

reg add "HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent" /v "AssumeUDPEncapsulationContextOnSendRule" /t REG_DWORD /d 2

reg query "HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent" /v "AssumeUDPEncapsulationContextOnSendRule"

pause
```

# 実施

## 現状確認

まず最初に`VPN_NAT-T_確認.bat`を実行します。
このファイルに副作用はありません。
これは保存した`VPN_NAT-T_確認.bat`をダブルクリックやエンターするだけでOKです。

実行すると次の表示となります。
`エラー: 指定されたレジストリ キーまたは値が見つかりませんでした`と表示されていればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40108/559d0ca3-98ac-4575-95d0-771ad42de52b.png)

それ以外の表示となっている場合、すでに一度NATトラバーサルの設定が行われている可能性があります。
自身の所属する組織のシステム管理者に問い合わせてください。

## 設定追加

次に`VPN_NAT-T_設定追加.bat`を実行します。
このファイルには**副作用があります**。
このファイルを実行した場合、レジストリに変更が加えられます。
以降はご自身の責任において実施してください。

保存した`VPN_NAT-T_設定追加.bat`を右クリックし、`管理者として実行`をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40108/bcf69c03-68eb-731d-f15f-0b183e02a075.png)

`管理者として実行`すると次の表示となります。
次の表示とならなかった場合、管理者ではなく通常の実行を行っています。ご注意ください。
`はい`をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40108/f5320ebd-6893-29fc-6746-3dc7a6bd6a26.png)

`はい`をクリックすると次の表示となります。
`AssumeUDPEncapsulationContextOnSendRule    REG_DWORD    0x2`と表示されていれば正しく設定できています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40108/2f39f10f-6fbb-b434-24fe-53af28dfeded.png)

# レファレンス

設定値の詳細については
[Windows Vista および Windows Server 2008 で NAT-T デバイスの背後に L2TP/IPsec サーバーを構成する方法]
(https://support.microsoft.com/ja-jp/help/926179/how-to-configure-an-l2tp-ipsec-server-behind-a-nat-t-device-in-windows)内、**値データ**近辺を参照してください。
CloudFormationのスタックを削除しようとしたらバケットの削除で「The following resource(s) failed to delete:」となりスタック削除が失敗する

## 事象

AWSコンソールからCloudFormationのスタックを削除しようとしたら、バケットの削除で「The following resource(s) failed to delete:」となりスタック削除が失敗する。
![image.png](https://image.docbase.io/uploads/780293a0-9e44-4f0b-843a-ac4f0b7e9790.png)

## 解決

再度削除を試みると以下のようなダイアログが表示された。[スタックの削除]をクリック。
![image.png](https://image.docbase.io/uploads/dac0b73e-8ca3-4cda-b686-acc9a84df9f8.png)

すると、次は以下のようなエラーとなった。バケットが空ではないと言っている。

- `The bucket you tried to delete is not empty (Service: Amazon S3; Status Code: 409; Error Code: BucketNotEmpty; Request ID: BDABC5D46C982FDA; S3 Extended Request ID: lR2udDv6irz9E7qJ7iHS0qCNuQehUmn2r9Qt6ybdRAHXXBNjUS1MA62Jr0L4KsVcQAc5CxTWVm4=)`

![image.png](https://image.docbase.io/uploads/cb4f2c4a-1b54-409f-8aad-eded96b4f17e.png)

該当バケット内のオブジェクトをすべて削除して空にし、再度スタック削除を試みると、正常に削除することができた。
![image.png](https://image.docbase.io/uploads/71def7fb-1873-4076-8755-bfc54cc35d12.png)

以上
ViewModelにLiveDataとMutableLiveDataを同時に宣言しなくていいようにする

MainViewModelからMutableLiveDataのみを扱い、LiveDataの宣言をしなくていいようにします。

### 変更前のコード

```kotlin
class MainViewModel() : ViewModel() {
    private val _param = MutableLiveData<MainViewParam>()
    val param: LiveData<MainViewParam>
        get() = _param

    fun load() {
        viewModelScope.launch {
            delay(1000L)
            _param.value = MainViewParam(
                nickname = "タロー",
                firstName = "太郎",
                lastName = "山田",
            )
        }
    }
}

data class MainViewParam (
    val nickname: String,
    val firstName: String,
    val lastName: String,
)
```
```xml
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="viewmodel"
            type="com.example.mvvmlab.MainViewModel" />
    </data>


    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewmodel.param.nickname}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
```


### LiveDataを追い出す解決策


interfaceを利用すればすぐにできます。なおレイアウトXMLの変更は不要です。


```kotlin

interface MainViewModel {
    val param: LiveData<MainViewParam>
    fun load()
}

class MainViewModelImpl : ViewModel(), MainViewModel {
    override val param = MutableLiveData<MainViewParam>()
    override fun load() {
        viewModelScope.launch {
            delay(1000L)
            param.value = MainViewParam(
                nickname = "タロー",
                firstName = "太郎",
                lastName = "山田",
            )
        }
    }
}

data class MainViewParam (
    val nickname: String,
    val firstName: String,
    val lastName: String,
)
```

正直どっちでもいいのですが、ViewModelにLiveData/MutableLiveDataの宣言数が増えてちょっと嫌だなーって思って作って意外と悪くなかったので、もし同じ課題を抱えているのであれば一つの選択肢としてみてはどうでしょうか？
interface増やす必要あるの？みたいな増えるのが嫌そーな反応があればむりにねじ込むようなものではないと思います。
【JavaScript】JSONを検索して、特定のデータを取り出す方法

# まずはJSONデータを用意

とりあえずこんな感じで用意しました。

```js
const JSONDATA = [
  {
    id: "aaa",
    name: "apple"
  },
  {
    id: "bbb",
    name: "orange"
  },
  {
    id: "ccc",
    name: "grape"
  }
];

```

# idを指定してオレンジを取り出す！

「findIndex」を使って何番目かを確認し（０はじまり）、その番号を指定してJSONデータを返します。

```js
const getFruitById = id => {
    const fruitIndex = JSONDATA.findIndex(data => data.id === id);
    return JSONDATA[fruitIndex];
};

const orange =  getFruitById("bbb");
console.log(orange.name); // display orange

```
NumPyのpiecewiseをCuPy向けに書き換える

# NumPyのpiecewise

NumPyのpiecewiseで、区分関数を実現することができる。

```math
f(x) = \left\{
\begin{array}{ll}
x^2 & (x \geq 0) \\
0 & (x \lt 0)
\end{array}
\right.
```

これをpiecewiseで書くと、次のようになる。

```python
import numpy as np

x = np.arange(-4, 5)
np.piecewise(x, [x >= 0, x < 0], [lambda v: v ** 2, 0])
```

これを実行すると、

```python
array([ 0,  0,  0,  0,  0,  1,  4,  9, 16])
```

となる。
x >= 0 の範囲で x の2乗、x < 0 の範囲で0になっている。

# piesewiseを使用しない方法

CuPyは[piecewiseに対応していない（v7.2時点）](https://docs-cupy.chainer.org/en/stable/reference/comparison.html)ため、別の方法で記述することになる。
パフォーマンスが悪いif文は使わずに記述する。

書き方は簡単で、区分の条件と関数の値の掛け合わせた結果を合計すればよい。

```python
import cupy as cp

x = cp.arange(-4, 5)
positive_condition = x >= 0
positive_value = x ** 2
negative_condition = x < 0
negative_value = 0
positive_condition * positive_value + negative_condition * negative_value
```

これを実行すると、

```python
array([ 0,  0,  0,  0,  0,  1,  4,  9, 16])
```

と、piecewiseと同じ結果となる。

この書き方はもちろんNumPyでも有効。
メッセージ機能実装

前日のモデル、マイグレーションが消えた原因はGitHubでマスターにしてからプルしていなかった
Easy Miss

t.references :user, foreign_key: true
マイグレーションの記述、foreign_keyを使用する場合はreferencesを使う

ネスト　　（入れ子）
記述の仕方、ネスト自体の理解がまだ全然できていない

コントローラー、モデルの記述一から考えるとなるとわからないことが多すぎる
if文が入るとわからない

リンク先、リダイレクト先の指定記述は時間はかかったけどなんとかこなせたが、たぶんこうだろうなぁという感じなのでこうすればこうなるまで理解していきたい。
Route53を使用したドメイン名でインターネットへ接続する方法

#本記事のゴール
・購入したドメインのネームサーバーをRoute53に変更し、ドメイン名でインターネットにアクセス出来るようにする。

#まずドメイン名を購入しよう！
・迷ったら「お名前.com」がオススメ。

#ドメインのネームサーバーをRoute53に変更
###Route53でホストゾーンを作成
・[ホストゾーン作成]→[ドメイン名]欄に購入したドメイン名を入力。
・[タイプ]は[パブリックホストゾーン]を選択。（インターネットからドメインにアクセスする場合に選択）
（[Amazon VPC のプライベートホストゾーン]はAWSのVPC内でルーティングする際にIPアドレスではなくドメイン名にしたい時等に使用）
・作成を押下する。作成されたらネームサーバーをメモしておく。

###ドメイン名を購入したサイトからネームサーバーをRoute53に変更
・ドメイン名購入サイト側のネームサーバー変更ページから先程メモしたRoute53のネームサーバーに変更。

###ネームサーバーをコマンドで確認してみよう
・EC2インスタンスにログインしてdigコマンドを実施。
（digコマンドはドメインに紐づくIPアドレスの情報を調べたいときに使用する）
・上記でメモしたネームサーバーが表示されればOKだ。

```
$ dig 'ドメイン名' NS +short
```

#ドメインに紐づくIPアドレスを登録
###Route53 でレコードセットを作成
・Route53 で作成したホストゾーンを選択し、[レコードセットに移動]を押下する。
・[レコードセットの作成]を押下し、下記情報を入力し、作成を押下。
　[名前]：なしでOK
　[タイプ]：[A-IPv4アドレス]
　[値]：'ドメインに紐づくIPアドレス'

以上、ドメイン名でインターネットにアクセスしてみよう！
Lambda入門#3 Lambdaのバージョン管理/エイリアス設定

さぁ、今日もLambdaの勉強をしますかー！

#参考URL
クラスメソッドさんの以下のURLを見て、学習しました。
https://dev.classmethod.jp/cloud/aws/version-management-with-api-gateway-and-lambda/

##Lambdaのバージョン管理/エイリアス設定
上記のURLに沿って、関数を作っていきます。
もう、この辺りはもう前回までの操作で慣れた感じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/3fd596a8-32e1-f72e-f52f-47542d22063e.png)

指定した文字を出力するだけの関数を作成します。

```python:テストコード
import json

def lambda_handler(event, context):
    return "version1"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/3ccea27c-da3b-05d8-127a-413bf6611a90.png)

記事にも記載されている通り、関数は作成した段階では、バージョンは作成されていない状態になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/4fd0c985-165e-a136-fbf8-2cb6e334395d.png)

バージョンの作成は以下のように[アクション]から[新しいバージョンを発行]を選択します。
作成したバージョンの内容は変更できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/a3346983-80ff-8c2c-5793-2d8d50fefac7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/9017d8c7-fe1b-ba31-6f6c-626f9af273f5.png)

バージョンが作成されたことを以下のように確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/3f8be387-4f92-8393-2755-485b7a8cd5da.png)

特定のバージョンに対して、エイリアスを設定することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/d4ef5b80-4cad-ec8f-6aff-3f0dd5d14a65.png)

エイリアスを設定することでバージョンに対する意味を定義することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/26b7eb4d-8d6d-bec8-dbab-bb6d4e4045c7.png)

プルダウンメニューも[エイリアス:dev]で表示されるようになったことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/6b8f2ed8-9c4a-37bf-5d1a-6d2cbce82c34.png)

先ほど作成したバージョン1をproductionとして、エイリアスを設定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/85dc3603-687a-ef8d-2e15-7f2325d67fc6.png)

バージョン1は変更できないし、本番設定という位置づけですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/a147e10a-93b6-29f1-79a3-ad6dce543b62.png)

今日は疲れちゃったので、ここまで。
大したことはできていないですが、また明日も続きやります！
活動記録(2020.2.26)

#活動記録(2020.2.26)

本日は有給を取ってインフラ周りの学習をした。

・『DNSをはじめよう』→ほぼ読了
・お名前.comでテスト開発用ドメイン取得
・AWSに登録して基本的なところだけを触った。
（EC2、Route53、IAM）


**課題・不明点**
・お名前.comからAWS(Route53)へのNSの変更が反映されていない？
・AWSの従量課金をまだ理解できていない。
・『コンテナ時代のWebサービスの作り方』：楽しそうな本だけどTerraformからいきなり何も分からん…**ディレクトリ構成については参考にする。**
ECSを使用しているのでDocker学習後がよい。

**Terraformに拘らず『AWSをはじめよう』に沿ってAWSをもう少し勉強した後さっさとDockerの学習をやった方がよい？**(特にインフラ周りは休日しかできないので
AWS educateのクレジットで新型コロナウイルスの感染者マップを作った（個人開発）

# 完成物
~~[新型コロナウイルス感染マップ]()~~

<img width="1063" alt="Screen Shot 2020-02-26 at 23.09.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266140/2ae06a01-39f7-c31f-5ad7-eb5aeba0eb4e.png">


## 使用した技術
* フロンエンド
    * React
    * Typescript
    * Nginx
* バックエンド
    * Golang (Gin)
    * PostgreSQL
* インフラ
    * AWS (EC2, S3, Route53)
    * Docker (Compose)
* API
    * Twitter


## インフラコスト
学生であればAWS educateに登録すれば**$40**のクレジットがもらえます。無料利用期間であれば、EC2のt2microインスタンスであれば約一ヶ月間は無料で起動できます。またRDSに関しても同様に一ヶ月無料で利用可能です。今回、課金したのはRoute53で購入したドメイン名（$13/year）とhttps化のためのALBの利用のみです（nginx側でLet's Encryptでやってもいいと思います）。

↓　AWS Account（赤枠）ってところからいけます。
<img width="1089" alt="Screen Shot 2020-02-26 at 23.36.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266140/43efd91e-f685-f67b-2a20-d81a051c62e2.png">

関係ないですけど、[Github Student Pack](https://education.github.com/pack)も学生なら無料でたくさんのサービスが使えてすごいです！

## デプロイ
デプロイはECSを試したんですが、うまくいかなかったので、全然スマートではないですが、EC2にDockerいれて、Git pullして、docker-compose upで終わらせました。

Dockerfileはフロント、バックエンドそれぞれこんな感じです。

### 開発環境
#### バンクエンド (Golang)
```Dockerfile

#build stage
FROM golang:latest
WORKDIR /go/src/app
COPY . .
RUN go get -d -v ./...

EXPOSE 8080
```

### 本番環境
#### フロント (React + Typescript -> Nginx)　
```Dockerfile
FROM node:12 as builder

WORKDIR /coronamap_japan_front
ADD . .
ENV NODE_ENV=production
RUN yarn install
RUN yarn build

FROM nginx:1.16.0-alpine
COPY --from=builder /coronamap_japan_front/build /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf
ADD  nginx.conf /etc/nginx/conf.d
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]  
```

* [node-prune](https://github.com/tj/node-prune)（使ってない.js, .tsのモジュールを消してくれるやつ）使う予定でしたが,yarn buildしたときにTypescriptのエラーが出てしまい断念しました。。。

#### バンクエンド (Golang)
```Dockerfile

#build stage
FROM golang:alpine AS builder
WORKDIR /go/src/app
COPY . .
RUN apk add --no-cache git
RUN go get -d -v ./...
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o /main .

#final stage
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /main .
RUN chmod +x ./main
LABEL Name=coronamap_japan Version=0.0.1
ENTRYPOINT [ "./main" ]
EXPOSE 8080
```

サーバー落ちないように頑張ります。
CSSで２カラムの料金表をつくる時のテクニック

#やりたいこと

PCでは２〜３カラム、SPでは1カラムの料金表にしたい

##イメージ

<img width="943" alt="スクリーンショット 2020-02-26 23.41.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592738/35b6efa3-6f91-b1f2-f94d-6d59633344ec.png">

#出来上がったコード

表組みだとやりたいイメージを実現できないので、リストで書きます。

```index.html
<ul class="price_list">
  <li><strong>本日のおすすめラム料理</strong>2000円</li>
  <li><strong>ラムケバブ（２本）</strong>800円</li>
  <li><strong>ラムチョップ（２本）</strong>800円</li>
  <li><strong>ラム＆チップス</strong>800円</li>
  <li><strong>揚げたて！ラム唐揚げ</strong>1000円</li>
  <li><strong>おいしいラムのソテー</strong>1000円</li>
  <li><strong>ラム餃子</strong>1000円</li>
  <li><strong>マトンカレー</strong>1200円</li>
  <li><strong>ラムシチュー</strong>1200円</li>
</ul>
```
2カラムにするために `column-count` を使います。

```style.css
ul.price_list{
  list-style:none;
  column-count: 2;
  column-gap: 40px;
  margin:5%;
  padding:0;
}
ul.price_list li{
  display: inline-flex;
  padding-bottom: 8px;
  border-bottom: #d2d2d2 1px dotted;
  margin-bottom: 8px;
  width: 100%;
  color:#cc0000;
}
ul.price_list li strong{
  font-weight:normal;
  color:#333;
  margin-right:auto;
}
@media screen and (max-width: 500px){
  ul.price_list{
    column-count: 1;
  }
}
```

`column-count` で分割する要素がブロック要素の場合、↓のようにpaddingやborderなどがズレてしまいます。

<img width="943" alt="スクリーンショット 2020-02-26 23.46.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592738/a028450e-b8d7-6d6e-f796-6891eed3a6b3.png">

`column-count` 内の要素はインライン要素にしてください。
今回はメニューと料金を分けるために `inline-flex` を使用しているのがポイントです。

##実際のサンプル

<p class="codepen" data-height="500" data-theme-id="6431" data-default-tab="css,result" data-user="mei331" data-slug-hash="QWbpQJj" data-pen-title="2カラムの料金表サンプル"><span>See the Pen <a href="https://codepen.io/mei331/pen/QWbpQJj">2カラムの料金表サンプル</a> by Mei Koutsuki (<a href="https://codepen.io/mei331">@mei331</a>)on <a href="https://codepen.io">CodePen</a>.</span></p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
スパークラインの多重化

初Qiita記事です。（ぺこり）

一番最初の記事くらいは他の方の記事とバッティングしないネタをやろうと思い色々考えた結果なぜか
「スパークラインの多重化」
というマニアックなネタを選んでしまいました。

何がマニアックって、そもそもエクセルのスパークラインの機能自体を知ってる人がどれだけいるでしょう。あまり使い道も思いつきません。（私が有効な使い方を知らないだけかもですが。）

プレゼン資料に簡易的にグラフを付けて見栄えを良くしたい時などには良いかもです。

そういうわけで、まずは「スパークラインってどんな機能？」というところから触れていきます。
これがスパークラインです。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/f146d6b5-11da-c49a-b8a4-d21221ac0f78.png)


セルの中にグラフが描かれるんです。
棒グラフにもできます。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/afa7e50c-e29f-f913-5127-215980bf63ed.png)

リボンにはスパークラインのタブができます。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/8a09cca4-87c0-e828-4263-8c08005f3495.png)


右クリックメニューもあります。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/035a1534-a29c-7ce1-73cd-94a2596adcb1.png)

スパークラインの作り方ですが、
　１．グラフにしたい表を用意する
　２．挿入タブの「スパークライン」グループからグラフを選択
　３．データ範囲とグラフが表示されてほしいセルを選択
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/2a77b4f4-92da-054c-a3c3-fee5016ac59b.png)
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/4c3580c0-e198-441a-070d-c2f8f69b2e88.png)

１行だけスパークラインを作ってオートフィルで広げる、とかもできます。

で、本題はこのスパークラインのグラフを重ねて表示する方法です。
右のオレンジのグラフを左の青のグラフに重ねると
![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/88d9d7a2-536c-7fc1-4589-1db8bcb65d9e.png)

こんなふうになります。
![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/cc9c3d2b-daf4-664a-1338-bbbd9810c86b.png)

差異を視覚化したい場合とかに便利です。

手順
　１．２つの表にそれぞれスパークラインを作る
　２．片方のスパークラインをコピー
　３．もう片方のスパークラインのセルを選択
　４．「その他の貼り付けオプション」→「リンクされた図」を選択
![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592129/fd99d07d-a1ec-686a-499a-146535d5edf3.png)

スパークラインの機能そのものでは複数のグラフが重なる状態を作ることはできませんが、この方法ならばグラフを２つでも３つでも重ねて表現できます。

この技がどこかの誰かの役に立ったらうれしいです。