OmniAICreator/Qiita-1.07M huggingface dataset:
P5.js 日本語リファレンス(rectMode)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の rectMode関数を説明します。

## rectMode()

### 説明文

rect() に指定されたパラメータにより長方形が描画される場所を変更します。

デフォルトのモードは rectMode(CORNER) です。これは rect() の最初の2つのパラメータを形状の左上隅として解釈し、3番目と4番目のパラメータはその幅と高さです。

rectMode(CORNERS) は、rect() の最初の2つのパラメータを1つのコーナーの位置として解釈し、3番目と4番目のパラメータを反対側のコーナーの位置として解釈します。

rectMode(CENTER)は、rect() の最初の2つのパラメータを形状の中心点として解釈し、3番目と4番目のパラメータはその幅と高さです。

rectMode(RADIUS) も、図形の中心点として rect() の最初の2つのパラメータを使用しますが、3番目と4番目のパラメータを使用して図形の幅と高さの半分を指定します。

JavaScriptは大文字と小文字を区別する言語であるため, パラメータはすべて大文字で記述する必要があります。

### 構文

rectMode(mode)

### パラメタ

- mode  
定数：CORNER、CORNERS、CENTER、RADIUS

### 例1

```javascript
function draw() {
  rectMode(CORNER); // デフォルトの rectMode は CORNER です
  fill(255); // 塗りつぶしを白に設定します
  rect(25, 25, 50, 50); // CORNERモードを使用して白い長方形を描画します

  rectMode(CORNERS); // rectMode を CORNERS に設定します
  fill(180); //塗りつぶしを灰色に設定します
  rect(25, 25, 50, 50); // CORNERSモードを使用して灰色の長方形を描画します
}
```

### 実行結果
![rectMode-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/d7fd944d-2651-6f5c-d8b3-8f759aa99740.png)



### 例2

```javascript
function draw() {
  rectMode(RADIUS); // rectMode を RADIUS に設定します
  fill(255); // 塗りつぶしを白に設定します
  rect(50, 50, 30, 30); // RADIUSモードを使用して白い長方形を描画します

  rectMode(CENTER); // rectMode を CENTERに設定します
  fill(100); // 塗りつぶしを灰色に設定します
  rect(50, 50, 30, 30); // CENTER モードを使用して灰色の長方形を描画します
}
```

### 実行結果
![rectMode-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/b2cf2c6b-48bf-d421-6c60-b6e1273d3bb4.png)




### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
text_fieldを使うとwrong number of arguments (given 3, expected 1..2)で怒られる

下記のようにf.text_fieldを使ったら怒られました。

```erb
<%= f.text_field :parent_category, "", id: "search_category" } %>
=> wrong number of arguments (given 3, expected 1..2)
```

え！こんな初歩的なことで。
Referrenceを見ても第3引数まで定義してるようなんですが。。
https://railsdoc.com/page/text_field

と思ったらこれ、`text_field`と`f.text_field`でわけてるっぽいです。
`text_field`は`text_field_tag`のことなんですかね。

よくよく見ると<b>f.objectと関連付けているときは、引数は2つまで</b>と書いてありました。

なので、上記リファレンスに記載はなかったものの、下記のように実装したらうまくいきました。

```erb
<%= f.text_field :parent_category, { value: "", id: "search_category" } %>

```
Firelensのヘルスチェック方法

# 概要

Firelensのヘルスチェック方法がAWSドキュメントに無いので（もしかしたらあるかもしれないですが見つけられなかった）やり方を共有します。
前提として、下記条件での使用になります。

- Firelensの実装はFluent Bitを使用
- Firelensはサイドカーとして組み込む
- ECSで使用

# Firelensとは

FirelensはAWSのコンテナサービスでログ収集を簡単に取り扱えるようにしたツールです。

[Firelens の発表 – コンテナログの新たな管理方法](https://aws.amazon.com/jp/blogs/news/announcing-firelens-a-new-way-to-manage-container-logs/)

# Firelensの使用方法

サイドカーとして組み込んで使用します。
アプリケーションがログを標準出力するとそれを拾ってくれます。
下記の私の記事も読んでいただく良いかもしれません。

[ecs-cli composeを使用してFireLensからDatadogへログを送信するYamlの記述方法](https://qiita.com/edi_t/items/877243fb98a05c0db472)

# Firelensのヘルスチェック方法

下記ドキュメントが情報源になります。

https://github.com/aws-samples/amazon-ecs-firelens-under-the-hood/blob/master/generated-configs/fluent-bit/README.md

ドキュメントによると、下記コマンドでヘルスチェックが可能になります。

```sh
echo '{"health": "check"}' | nc 127.0.0.1 8877 || exit 1
```

`nc` コマンド入っているの？という心配は無用で、Firelens（FluentBit）コンテナイメージにはインストールされています。
これが分かればあとは簡単で、このコマンドをTaskDefinitionに組み込んでいきます。

## Docker Composeの場合

ecs-params.yamlに記述します。

```yaml
version: 1
task_definition:
  services:
    hoge:
#~省略~
    log_router:
      essential: true
      healthcheck:
        test: "echo '{\"health\": \"check\"}' | nc 127.0.0.1 8877 || exit 1"
        interval: 3m
        timeout: 30s
        retries: 3
        start_period: 3m
      firelens_configuration:
#~省略~
```

## Task Defintionsの場合

```json-doc
{
//~省略~
      "healthCheck": {
        "retries": 3,
        "command": [
          "CMD-SHELL",
          "echo '{\"health\": \"check\"}' | nc 127.0.0.1 8877 || exit 1"
        ],
        "timeout": 30,
        "interval": 180,
        "startPeriod": 180
      },
//~省略~
}
```

# 補足：ヘルスチェックのログについて

このヘルスチェックのアクセスログはどうなるのかというと、先程のドキュメントにも書いてありますが、

```text
[INPUT]
    Name tcp
    Tag firelens-healthcheck
    Listen 127.0.0.1
    Port 8877
```

入力処理で `firelens-healthcheck` のタグが付けられて、

```text
[OUTPUT]
    Name null
    Match firelens-healthcheck
```

`firelens-healthcheck` タグが付いているログは出力処理で捨てられます。
上記設定はFirelensに予め仕込まれているため、ユーザー側で設定を入れる必要はありません。

# ヘルスチェックできると何がうれしいか

ステータスが全部 `HEALTHY` になるのも気持ち良いですが、下記が可能になります。

- Firelensが応答しなくなった場合、アプリケーションコンテナと共に自動的に破棄される
- DependsOnのconditionで `HEALTHY` が利用可能になる

GithubのREADMEが公式ドキュメントと言われたらそうなもしれないですが、こういうのはちゃんと本家AWSドキュメントの分かりやすいところに記載しておいてほしいですね。
P5.js 日本語リファレンス(noSmooth)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の noSmooth関数を説明します。

## noSmooth()

### 説明文

すべてのジオメトリをギザギザのエッジで描画します。 2Dモードでは、smooth() がデフォルトでアクティブであるためジオメトリ、画像、フォントのスムージングを無効にするには、noSmooth() を呼び出す必要があることに注意してください。 3Dモードでは、デフォルトで noSmooth() が有効になっているため、ジオメトリのエッジをスムーズ(アンチエイリアス)にしたい場合は, smooth() を呼び出す必要があります。

### 構文

noSmooth()

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(ellipseMode)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の ellipseMode関数を説明します。

## ellipseMode()

### 説明文

ellipse()、circle()、arc() に指定されたパラメータの解釈方法を変更することにより、楕円が描画される位置を変更します。

デフォルトのモードは ellipseMode(CENTER) です。これは、ellipse() の最初の2つのパラメータを形状の中心点として解釈し、3番目と4番目のパラメータはその幅と高さです。

ellipseMode(RADIUS) も、形状の中心点として ellipse() の最初の2つのパラメータを使用しますが、3番目と4番目のパラメータを使用して, 形状の幅と高さの半分を指定します。

ellipseMode(CORNER) は ellipse() の最初の2つのパラメータを形状の左上隅として解釈し、3番目と4番目のパラメータはその幅と高さです。

ellipseMode(CORNERS) は、ellipse() の最初の2つのパラメータを楕円の境界ボックスの1つのコーナーの位置として解釈し, 3番目と4番目のパラメータを反対側のコーナーの位置として解釈します。

JavaScriptは大文字と小文字を区別する言語であるため, パラメータはすべて大文字で記述する必要があります。

### 構文

ellipseMode(mode)

### パラメタ

- mode  
定数：CENTER、RADIUS、CORNER、CORNERS のいずれか

### 例1

```javascript
function draw() {
  ellipseMode(RADIUS); // ellipseMode を RADIUS に設定します
  fill(255); //塗りつぶしを白に設定します
  ellipse(50, 50, 30, 30); // RADIUS モードを使用して半径30(直径60)の白い楕円を描画します

  ellipseMode(CENTER); // ellipseMode を CENTERに設定します
  fill(180); //塗りつぶしを灰色に設定します
  ellipse(50, 50, 30, 30); // CENTER モードを使用して直径30の灰色の楕円を描画します
}
```

### 実行結果
![ellipseMode-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/c9d6c1e6-4cf0-5af7-cdcf-512a9dcf9a7a.png)


### 例2

```javascript
  noFill();
  stroke(255, 0, 0);
  rect(25, 25, 50, 50);

  stroke(0);
  ellipseMode(CORNER); // ellipseMode を CORNERに設定します
  fill(255); //塗りつぶしを白に設定します
  ellipse(25, 25, 50, 50); // CORNER モードを使用して白い楕円を描画します

  ellipseMode(CORNERS); // ellipseMode を CORNERS に設定します
  fill(180); //塗りつぶしを灰色に設定します
  ellipse(25, 25, 50, 50); // CORNERSモードを使用して灰色の楕円を描画します
```

### 実行結果
![ellipseMode-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/8724441a-1cdf-8e99-e686-39b8b9959dbd.png)



### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Windowsシミュレータで学ぶuITRON (6) - アラームハンドラ

# はじめに

**uITRON（FreeRTOSベース）Windowsシミュレータ - Qiita**
https://qiita.com/imagou/items/42c687402e6e58fccddb

今回のお題は、[周期ハンドラ](https://qiita.com/imagou/items/f6c50d8e01a5f8d86141)に続くタイマ機能である、**アラームハンドラ**です。

# 本編

## 1. 環境

[こちらの記事](https://qiita.com/imagou/items/42c687402e6e58fccddb#1-1-%E7%92%B0%E5%A2%83)を参照ください。

## 2. 動かしてみる

### 2-1. アラームハンドラの開始

コンソールで「alarm」と入力してみましょう（入力後にEnterを押してください）。

```console
[2020/05/01 14:19:56.131] [TimerTask]: DELAY 3000ms
alarm
[2020/05/01 14:19:59.131] [TimerTask]: DELAY 3000ms
[2020/05/01 14:20:02.131] [TimerTask]: DELAY 3000ms
[2020/05/01 14:20:02.767] [UserAlarmHandler]: Alarm Timer Expired (1)
[2020/05/01 14:20:05.132] [TimerTask]: DELAY 3000ms
[2020/05/01 14:20:08.133] [TimerTask]: DELAY 3000ms
```

入力してから5000msec後、`UserAlarmHandler`が`Alarm Timer Expired (n)`を出力します（カッコ内の数値は満了回数）。

周期ハンドラと異なり、満了は1回のみです。

### 2-2. アラームハンドラの停止

次は、コンソールで「alarm」を入力した後、再度「alarm」投入してみましょう。

```console
[2020/05/01 14:26:32.239] [TimerTask]: DELAY 3000ms
alarm
[2020/05/01 14:26:35.240] [TimerTask]: DELAY 3000ms
alarm
[2020/05/01 14:26:38.241] [TimerTask]: DELAY 3000ms
[2020/05/01 14:26:41.241] [TimerTask]: DELAY 3000ms
[2020/05/01 14:26:44.241] [TimerTask]: DELAY 3000ms
```

この場合、前述の満了ログは出力されません。

## 3. 解説

### 3-1. 概要

アラームハンドラは、**指定時間経過後、何らかの処理を実施する仕組み**です。
一般的には**ワンショットタイマ**と呼ばれるものです。

（「ワンショット」という名称からも明らかですが）周期ハンドラとの違いは、1回の満了で終了する点です。

### 3-2. コードによる説明

以降は、プログラムコード - `main.c`を引用して説明します。

#### 3-2-1. アラームハンドラ生成

`cre_alm()`で生成します。

```C
    T_CALM calm;
    calm.almatr = TA_HLNG;
    calm.almhdr = UserAlarmHandler;
    cre_alm(ALARM_ID(USER), &calm);
```

このパラメータは下表：

|パラメータ番号|名称|説明|
|---|---|---|
|第1パラメータ|アラームハンドラID|単なるID。<br>以降はこのIDでもって開始・停止を実施。|
|第2パラメータ|T_CALM構造体変数|下表で説明。|

T_CALMのメンバは下表：

|名称|指定可能な値|説明|
|---|---|---|
|almatr|TA_HLNG|属性。高級言語を使用。|
|almhdr|void *func*(void*)|満了時に呼び出すハンドラ関数。|

**※なお、属性はこれ以外の値も指定可能（だが、上記のみで必要十分と考える）。**

#### 3-2-2. アラームハンドラ開始・停止

それぞれ`sta_alm()`、`stp_alm()`を使います。

```C
        /* Alarm */
        else if (EQUALS_(alarm)) {
            T_RALM ralm;
            ref_alm(ALARM_ID(USER), &ralm);
            if (!(ralm.almstat))    sta_alm(ALARM_ID(USER), 5000);
            else                    stp_alm(ALARM_ID(USER));
        }
```

また`ref_alm()`を用い、アラームハンドラが起動しているか参照していますが、こちらの説明は割愛。

#### 3-2-3. ハンドラ関数

**（しつこいですが）ハンドラは非タスクコンテキスト、すなわち割り込みから呼ばれるので、簡潔な処理に留めないといけません。**

今回はあまり有用な例ではなく、単にログを吐くだけです。

```C
static void UserAlarmHandler(void* params)
{
    /* Just to remove compiler warning. */
    (void)params;

    static int32_t expired = 0;
    DEBUG_PRINT("[%s]: Alarm Timer Expired (%d)", __func__, ++expired);
}
```

# おわりに

経験上、周期ハンドラよりも有用と感じますので、ぜひ使い方をマスターしてください！
（というほど難しい機能でもありませんが）

# 参考

**Micro-ITRON4.0 Specification (in Japanese)**
http://www.ertl.jp/ITRON/SPEC/mitron4-j.html
App Storeへ申請時にデバイスの画面サイズまたは解像度をサポートするように最適化できていないので拒否されました。どうすればいいのでしょうか。

App Storeへ申請時にデバイスの画面サイズまたは解像度をサポートするように最適化できていないので拒否されました。どうすればいいのでしょうか。
Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング④

# 4.Beats(Metricbeat+Filebeat)のセットアップ（後半）

次はBeatsのサービスを立ち上げます。
サービスが立ち上がるとelasticsearchにログが出力される様になり、いよいよkibanaでモニタリングができる様になります。
次のdocker-composeファイルを作成し、サービスを立ち上げてください。

```docker-compose-beats.yml
version: '3.7'
 
services:
  metricbeat:
    image: docker.elastic.co/beats/metricbeat:7.5.1
    user: root
    volumes:
      - ./config/metricbeat.docker.yml:/usr/share/metricbeat/metricbeat.yml:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro
      - /proc:/hostfs/proc:ro
      - /:/hostfs:ro
    command: metricbeat -e -E output.elasticsearch.hosts=["elasticsearch:9200"]
    networks:
      - elastic-base_default
  filebeat:
    image: docker.elastic.co/beats/filebeat:7.5.1
    user: root
    volumes:
      - ./config/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    command: filebeat -e -strict.perms=false -E output.elasticsearch.hosts=["elasticsearch:9200"]
    networks:
      - elastic-base_default
networks:                                                                                                                                                                                                  
  elastic-base_default:
    external: true
```
```shell
docker stack deploy --prune -c docker-compose-beats.yml elastic-beats
```
なんとこれだけです。こちらもdocker-composeファイルさえあれば、ほとんどコマンド一発で起動完了します。
ポイントはelastic-baseを立ち上げたときにattachableにしたelastic-base_defaultを、elastic-beatsから参照することです。
この辺を意識して構成すると、swarm外のサービスと連携する必要がない限り、elasticsearchのports設定は要らなくなります。

さて、これで全ての構成が完了しましたので、
http://localhost:5601
にアクセスして、左のメニューからDashboardを選んでください。
searchに「metric system」あたりを入力するといい感じのダッシュボードが検索できるはずなので、いろいろ見てください。
また、この状態でswarmノードにnginxコンテナを立てたりすると、そのログをkibanaで見ることができます。Dashboardの検索に「filebeat nginx」をいれていい感じのダッシュボードを探してみてください。
感動しますよ！
これで、マシンモニタリング編は終了です。
が、metricbeatやfilebeatが特別な設定なしに、stack外のコンテナの情報まで収集できるのには[Hints based autodiscover](https://www.elastic.co/guide/en/beats/filebeat/current/configuration-autodiscover-hints.html)という仕組みが非常に重要な役割を果たしています。今度投稿する際にはこの辺りを解説できればいいなぁ...
Elasticsearch+Kibana自体はログに限らず、いろんな物の分析に使用できるので、機会があればまた投稿してみます。

[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング①](https://qiita.com/SNAMGN/items/06f22028011f76558db0/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング②](https://qiita.com/SNAMGN/items/159286d95fcbfbcb98c0/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング③](https://qiita.com/SNAMGN/items/0f62af1c7867c15bbe0e/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング④](https://qiita.com/SNAMGN/items/45153b2d118c0f2d2928/)

参考リンク：
https://www.elastic.co/guide/en/beats/metricbeat/current/running-on-docker.html
https://www.elastic.co/guide/en/beats/filebeat/current/running-on-docker.html
https://www.elastic.co/guide/en/beats/filebeat/current/configuration-autodiscover-hints.html
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-modules.html
Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング③

# 3.Beats(Metricbeat+Filebeat)のセットアップ（前半）

次はBeats(Metricbeat+Filebeat)のセットアップです。
こちらは前半後半に別れます。
まずは前半です。前半ではサービスを立ち上げる前に行う必要があるセットアップ作業を行います。
次の様にbeat用の設定ファイルをダウンロードしてください。

```shell
mkdir config
cd config
curl -L -O https://raw.githubusercontent.com/elastic/beats/7.5/deploy/docker/filebeat.docker.yml
curl -L -O https://raw.githubusercontent.com/elastic/beats/7.5/deploy/docker/metricbeat.docker.yml
cd ..
```

その後、次のスクリプトでelasticsearch,kibanaにBeats用のIndex,Dashboardをセットアップします。

```setup-metricbeat.sh
#!/bin/sh                                                                                                                                                                                                  
docker run \
       --network elastic-base_default \
       docker.elastic.co/beats/metricbeat:7.5.1 \
       setup -E setup.kibana.host=kibana:5601 \
       -E output.elasticsearch.hosts=["elasticsearch:9200"]
```
```setup-filebeat.sh
#!/bin/sh                                                                                                                                                                                                  
docker run \
       --network elastic-base_default \
       docker.elastic.co/beats/filebeat:7.5.1 \
       setup -E setup.kibana.host=kibana:5601 \
       -E output.elasticsearch.hosts=["elasticsearch:9200"]
```
```shell
chmod u+x setup-*.sh
./setup-metricbeat.sh
./setup-filebeat.sh
```
これで前半のセットアップは完了です。
次は実際にBeatsのサービスを立ち上げる後半に進みましょう。

[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング①](https://qiita.com/SNAMGN/items/06f22028011f76558db0/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング②](https://qiita.com/SNAMGN/items/159286d95fcbfbcb98c0/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング③](https://qiita.com/SNAMGN/items/0f62af1c7867c15bbe0e/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング④](https://qiita.com/SNAMGN/items/45153b2d118c0f2d2928/)

参考リンク：
https://www.elastic.co/guide/en/beats/metricbeat/current/running-on-docker.html
https://www.elastic.co/guide/en/beats/filebeat/current/running-on-docker.html
Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング②

# 2.Elasticsearch+Kibanaのセットアップ

まずは基盤となるElasticsearch,Kibanaのセットアップを行います。
具体的には以下のコンポーズファイルを使用して、dockerでサービスを立ち上げてください。

```docker-compose-elk.yml
version: '3.7'
 
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
#    volumes:                                                                                                                                                                                              
#      - ./data:/usr/share/elasticsearch/data                                                                                                                                                              
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: docker.elastic.co/kibana/kibana:7.5.1                                                                                                                                                      
    ports:
      - 5601:5601
networks:
  default:
    attachable: true
```

```shell
docker stack deploy --prune -c docker-compose-elk.yml elastic-base
```

なんとこれだけです。elasticsearchのデータを永続化したい場合はvolumesの記述のコメントアウトを外してください。
しばらくはelasticsearchの初期セットアップとkibanaの初期セットアップが行われるので、完了されるまで待ちます。
portainerあたりでkibanaのログを監視していれば、セットアップが完了後にnginxサーバが立ち上がったことを知らせるログが表示されるはずです。
http://localhost:5601
にアクセスして、kibanaの画面が表示されれば成功です。
次に行く前にcomposeファイルでnetworkをattachableにしていることに注意してください。これは次のbeatsを後から立ち上げる際にelastic-base_defaultのnetworkに接続できる様にするための設定です。
では次にいきましょう。

[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング①](https://qiita.com/SNAMGN/items/06f22028011f76558db0/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング②](https://qiita.com/SNAMGN/items/159286d95fcbfbcb98c0/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング③](https://qiita.com/SNAMGN/items/0f62af1c7867c15bbe0e/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング④](https://qiita.com/SNAMGN/items/45153b2d118c0f2d2928/)

参考リンク：
https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html
https://www.elastic.co/guide/en/kibana/current/docker.html
【HTML/CSS】CSSでLEDランプ、あるいは信号機みたいな感じの「丸」を作ってみたい

# 見た目がなんかこう光ってる丸いマークみたいなのが欲しかった

デザインで**LEDランプ**（電気製品についてる**発光ダイオード**みたいなランプ）とか**信号機**みたいな感じのやつが欲しかった
けど探しても案外見つからなかったのでCSS書いてみた

# できたやつ（CodePen）

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="sola-msr" data-slug-hash="BaowQrE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="LED lamp(Traffic Light)">
  <span>See the Pen <a href="https://codepen.io/sola-msr/pen/BaowQrE">
  LED lamp(Traffic Light)</a> by sola-msr (<a href="https://codepen.io/sola-msr">@sola-msr</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# ソースコード

```html
<div id="app">
  <div class="green-circle"></div>
  <div class="yellow-circle"></div>
  <div class="red-circle"></div>
</div>
```

```css
#app {
  text-align: center;
}

.green-circle {
    display: inline-block; /* センター寄せ用 */
    background-color: rgb(0, 255, 0); /* ベースカラー */
    box-shadow: 0 0 3px 3px rgb(224, 255, 211), 3px 3px 5px 3px rgb(200, 255, 0) inset; /* 外側のカラー・左上のカラー */
    height:20px; /* 円の大きさ */
    width:20px;  /* 円の大きさ */
    border-radius:50%; /* まるみ */
    /* 以下はそろえるだけの為のmargin */
    margin-right: 10px;
    margin-bottom: 5px;
    margin-top: 2px;
}

.yellow-circle {
    display: inline-block;
    background-color: rgb(255, 230, 0);
    box-shadow: 0 0 3px 3px rgb(251, 255, 199), 3px 3px 5px 3px rgb(244, 255, 93) inset;
    height:20px;
    width:20px;
    border-radius:50%;
    margin-right: 10px;
    margin-bottom: 5px;
    margin-top: 2px;
}

.red-circle {
    display: inline-block;
    background-color: rgb(255, 0, 0);
    box-shadow: 0 0 3px 3px rgb(255, 213, 213), 3px 3px 5px 3px rgb(255, 166, 0) inset;
    height:20px;
    width:20px;
    border-radius:50%;
    margin-right: 10px;
    margin-bottom: 5px;
    margin-top: 2px;
}
```

# おわり
- CSSわからなさすぎる
- ということで正しいかは自信ないです
Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング①

# 1.全体構成

elasticプロダクトにはいろんなものがあり、それを組み合わせてソリューションを構成しますが、今回のマシンモニタリングに目的を絞ると以下のプロダクトを使用することになります。
(製品の最新バージョンは7.6.2になってしまっていますが、これに読み替えて作業してもらっても特に問題なく動作すると思います。未検証ですみませんが...)

| プロダクト | 説明 |
|:--------:|:----:|
|Elasticsearch|	データベース兼検索エンジン。スケーリングが容易。|
|Kibana|	Elasticsearchの可視化ツール。7.5.0からLensが追加され、さらに使いやすくなった。|
|Metricbeat|	マシンのCPU・メモリ使用率やネットワーク利用量などの情報をElasticsearchに送信する軽量なデータシッパー|
|Filebeat|	マシン上で動作するサービスのログファイルの情報をElasticsearchに送信する軽量なデータシッパー|
これ以降の章では実際に上記のプロダクトのセットアップ方法を解説し、KibanaのダッシュボードでCPU情報などのモニタができればゴールとします。

簡単にセットアップすることを目指しているので、Docker(swarmモード)環境にシングルノード構成でのセットアップになります。

実際にかかった時間を計測しましたが、３７分と行ったところでした。サーバのセットアップ完了を待ったりしていた時間も含んでいるので、私の非力なノートPC上での作業でなかったらもっと早かったかもしれません。

[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング①](https://qiita.com/SNAMGN/items/06f22028011f76558db0/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング②](https://qiita.com/SNAMGN/items/159286d95fcbfbcb98c0/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング③](https://qiita.com/SNAMGN/items/0f62af1c7867c15bbe0e/)
[Elasticsearch+Kibana+Metricbeats(+FIlebeats)でマシンモニタリング④](https://qiita.com/SNAMGN/items/45153b2d118c0f2d2928/)
【Salesforce】カスタムオブジェクトで商談のフェーズのような挙動設定

# 動作確認

通常の商談と同じ挙動が可能
<img width="1672" alt="スクリーンショット 2020-05-01 14.26.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/491dd7d5-7bb7-901a-8b55-c43317bdb2cf.png">

商談が無事成約したら、お祝いすることも可能
<img width="1680" alt="スクリーンショット 2020-05-01 14.28.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/60080070-99ec-aa01-6d86-f94847897de1.png">

# 実現方法
1. カスタムオブジェクトの作成
2. 選択リストの作成
3. パスの作成
4. Lightning レコードページの更新

## 1. カスタムオブジェクトの作成

<img width="1669" alt="スクリーンショット 2020-05-01 14.03.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/1914cf78-44a4-936a-e221-0641ca0d0f34.png">

## 2. 選択リストの作成

値は商談オブジェクトのフェーズ項目を参照
<img width="1672" alt="スクリーンショット 2020-05-01 14.04.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/874c7bfd-dac8-30e8-16c4-353c39a7cb13.png">
<img width="1396" alt="スクリーンショット 2020-05-01 14.04.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/2e34a218-559c-8b53-cc5b-c81a2e4b4191.png">

## 3. パスの作成

初期設定ではパスは無効化の状態
<img width="1673" alt="スクリーンショット 2020-05-01 14.06.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/8d4e84a6-d857-9f66-1776-7432b1e86965.png">

新しいパスを押下
<img width="1417" alt="スクリーンショット 2020-05-01 14.07.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/cd76aa78-4c4f-e83c-3046-ac95175d42cd.png">

対象のオブジェクトなどを設定
<img width="1675" alt="スクリーンショット 2020-05-01 14.08.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/61baa714-9785-c54b-39de-8475e15dca5e.png">

フェーズの段階によって、強調する項目が選択可能。またアドバイスの記載も可能。
<img width="1679" alt="スクリーンショット 2020-05-01 14.13.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/8e5d4848-03c3-0c63-5eca-71ef156d8269.png">

選択リスト値によってお祝い機能を設定可能。
<img width="841" alt="スクリーンショット 2020-05-01 14.13.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/bb0b7c92-544c-86fc-0a48-52fe4fd446d6.png">

作成後の画面
<img width="1420" alt="スクリーンショット 2020-05-01 14.14.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/672e9bc5-893a-f2da-dbd4-59061a983fac.png">


## 4. Lightning レコードページの更新

ページにパスを追加
<img width="1675" alt="スクリーンショット 2020-05-01 14.20.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/68da24fb-488a-7bb6-0f34-17f30867fbbf.png">


# 参考リンク
[パス (Lightning コミュニティコンポーネント)](https://help.salesforce.com/articleView?id=rss_sales_path.htm&type=5)
【忘備録】ウィルス対策ソフトとセキュリティソフトの差異

#ウィルス対策ソフト
基本的にはウィルス対策に特化したソフトウェア。
コンピュータ内に侵入してきたコンピュータウィルスやスパイウェア(以下、マルウェア)等、悪意を持つプログラム群を検知～駆除するソフトウェア。
ファイアーウォールや不正アクセス等の機能はなく、原則として別ソフト、または機能(WindowsDifender等)に委ねられている。

1.ダウンロードファイル、またはコンピュータ内の検疫(ファイルスキャン)
2.マルウェアファイルの駆除
3.パターンファイルの更新

#セキュリティソフト
ウィルス対策のみならず、ファイアウォール、パスワード保護、通信の暗号化等、セキュリティに関連した一切の保護を行うソフト。

#最近はセキュリティソフトしか見なくなった
とはいえここ10年程度でウィルス対策ソフトは減少した模様。

1つはウィルス対策ソフトがセキュリティソフトと統合してしまったこと
2つ目にウィルスソフトが独自のファイアウォールを廃止したこと
3つ目にWindowsDefenderの登場により下手なアンチウィルスを導入するよりは安価にセキュリティが一定レベル保護されること

らしい。。。詳しくは知らないけど。。。

#つまり
ウィルス対策ソフトとセキュリティソフトは厳密には別物。
ただし最近はどちらも同一機能を持つのでほぼセキュリティソフト。
CDKでGraphQLに挑戦する(認証編)

# はじめに

本日は[GWアドベントカレンダー](https://gw-advent.9wick.com/calendars/2020/89)３日目です。[昨日](https://qiita.com/ufoo68/items/512b74156789a128bc95)で簡単なGraphQLサーバーの実装ができたので今日はそれに[Cognito](https://aws.amazon.com/jp/cognito/)を追加して認証機能を実装していきます。

# Cognitoとは

公式のドキュメントを拝借すると、`Amazon Cognito を使用すれば、ウェブアプリケーションおよびモバイルアプリに素早く簡単にユーザーのサインアップ/サインインおよびアクセスコントロールの機能を追加できます。`とのこと。
CogitoはフルマネージドのAWSサービスとなってます。一々こちらでデータベースやアプリケーションの実装をすることなくセキュアなユーザー管理システムを実現させることができます。AppSyncはCognitoとの連携が簡単に実現できるので、今回はAppSyncのクエリ操作を認証されたユーザーに限定していきたいと思います。

# CDKを実装

Cognitoのユーザープール（ユーザー管理を行うところ）作成に関するコードは実は以下の１行だけで十分です。

```typescript
const userPool = new UserPool(this, 'UserPool')
```

あとはこのユーザープールをAppSyncに連携させます。以下のコードが全体のコードになります。

```typescript
import * as cdk from '@aws-cdk/core'
import { GraphQLApi, MappingTemplate, PrimaryKey, Values, UserPoolDefaultAction } from '@aws-cdk/aws-appsync'
import { Table, AttributeType } from '@aws-cdk/aws-dynamodb'
import { UserPool } from '@aws-cdk/aws-cognito'

export class CdkAppsyncTestStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    const userPool = new UserPool(this, 'UserPool')

    const api = new GraphQLApi(this, 'graphQlApi', {
      name: 'test-api',
      authorizationConfig: {
        defaultAuthorization: {
          userPool,
          defaultAction: UserPoolDefaultAction.ALLOW,
        },
      },
      schemaDefinitionFile: './schema.graphql',
    })

    const itemTable = new Table(this, 'itemTable', {
      partitionKey: {
        name: 'id',
        type: AttributeType.STRING,
      }
    })

    const itemDS = api.addDynamoDbDataSource('Item', 'Item data source', itemTable)
    itemDS.createResolver({
      typeName: 'Query',
      fieldName: 'allItem',
      requestMappingTemplate: MappingTemplate.dynamoDbScanTable(),
      responseMappingTemplate: MappingTemplate.dynamoDbResultList(),
    })
    itemDS.createResolver({
      typeName: 'Mutation',
      fieldName: 'addItem',
      requestMappingTemplate: MappingTemplate.dynamoDbPutItem(
        PrimaryKey.partition('id').auto(),
        Values.projecting('item')),
      responseMappingTemplate: MappingTemplate.dynamoDbResultItem(),
    })
  }
}

```

`CfnApiKey()`は今回はCognitoのAPI Key認証を用いるので不要です。`GraphQLApi()`のpropsに`authorizationConfig`というフィールドが追加されました。
これだけでCognitoとの連携は可能です。

# 実行する

早速認証の機能がちゃんと動くのか試してみたいと思います。CognitoユーザーのログインはAppSyncのクエリ実行ページから行えます。事前にCognitoのユーザープールにユーザーを作成する必要があります。

ログインなし（認証トークンなし）の状態だと以下のメッセージが返ってくるかと思います。

```json
{
  "errors": [
    {
      "errorType": "UnauthorizedException",
      "message": "Unable to parse JWT token."
    }
  ]
}
```

しかし`ユーザープールでログイン`というボタンを押してログインを行うと今まで通りのGraphQLのクエリ実行が行えるかと思います。

![login.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/aeda49af-ad09-66f1-af69-bf88d496dc12.jpeg)

一応赤枠で示しているのが、`ufoo68`というユーザー名でログインしたという部分です。この状態になってはじめてクエリの実行に成功することができます。

# さいごに

今日までの内容で[公式のサンプルコード](https://docs.aws.amazon.com/cdk/api/latest/docs/aws-appsync-readme.html)の概要がある程度わかるようになりました。まだ日はあるのでもう少しAppSyncと戯れてみようかと思います。ではまた明日！
hostsの全台のディスク使用率悪い順に並べるワンライナー

https://qiita.com/ystmg/items/41f710fc50d036e3f8a6 (hostsに書かれてる全台がいつから起動してるかワンライナー) の続き

```
$ ./pssh-2.3.1/bin/pssh -x "-oStrictHostKeyChecking=no"\
 -H "`cat /etc/hosts |\
 awk '{if( $1 != "#" && length($2) > 0 ){print $2 }}'`"\
-i 'echo -n "$HOSTNAME "; df -h | egrep "/$"'\
 | sort -k 6 -n
```

(出力イメージ)

```
[10] 14:16:25 [SUCCESS] my-api010
[11] 14:16:25 [SUCCESS] my-api011
[1] 14:16:25 [SUCCESS] my-api001
[14] 14:16:25 [SUCCESS] my-archive001
...
my-web007 /dev/100100  147G   46G  102G  32% /
my-api009 /dev/100100  147G   65G   83G  44% /
my-dapi005 /dev/100100 1021G  668G  354G  66% /
```

(Zabbixなら、 監視データ→最新データ→Free disk space on / (percentage) で検索とかでも出る…が、台数が多いとソートが大変かも)
cert-manager(arm64)でさくらのDNSつかいたかった...

# こんな記事があったので...
「cert-managerでさくらのクラウドDNSを使ってワイルドカード証明書を発行する」
https://febc-yamamoto.hatenablog.jp/entry/2019/10/03/182310
やったー！と食い付いたんですが、どうやらamd64イメージのみの配布でarm64イメージはなく、私が最近構築したraspberry pi4 Bでのkubernetesクラスタでは動かないっぽいことが判明。
公式のcert-managerの導入を試すとarm64イメージもあるみたいだったので、自分でさくらのDNS対応私家版cert-manager(v0.14.0)を書いてビルドが通るまでがんばってみましたが、bazelややこしくてamd64イメージはビルドできたけど、arm64イメージのビルドは断念。（しかもその後、v0.14のコードがバージョンアップしてたので、差分適用しなおしたらビルドできなくなった... image["diff_id"] ってなにー？ bazelわからんー...）
供養のためにコードは晒しておきます。動作検証とかしてないのでこれを使用して何が起こっても当方は責任を負えませんあしからず。
https://github.com/snmagn/cert-manager/tree/snmagn-sacloud/release-0.14-dev

# 現在のcert-managerではwebhookを使用したDNS対応追加が正式
改めて公式のページを確認すると以下のページが確認できます。要約すると、「DNSの追加要望多すぎるのでwebhook使ってプラグインっぽいの作れる様にしといたから、各自で勝手に作ってね！」ということらしいです。
「DNS Providers | cert-manager」
https://cert-manager.io/docs/contributing/dns-providers/

上記のページでは、以下のgitリポジトリを参考にLet's EncryptのDNS01 challengeを使用したwebhook実装のサンプル(DNSとの接続部分は入っておらずコメントになってます)が公開されています。このリポジトリからforkされた実際のDNSに合わせた実装もあるようです。（詳細はわからないですが...）
「ACME webhook example」
https://github.com/jetstack/cert-manager-webhook-example

webhookで実装できたら追記します。(~~Go覚えるのから始めないといけないのだけど~~)
もし、さくらの中の人が実装したwebhookを知ってる人がいたら、教えていただけると~~尻尾振って~~喜びます。
[playframework][evolution][mysql] キー削除(INDEX,UNIQUE,FOREIGN KEY)でIF EXISTSと同等の動きを実現する

# 背景

PlayFrameworkで構築したWebアプリケーションのデータベースマイグレーションツールとして`evolution`を使用しています。
データベースは`MySQL`

初期に構築(して未使用だった)テーブルの定義が誤っていました。
具体的には不要なユニークキーを付与してしまっていました。(重複が発生してレコード追加できない不具合発生)

削除したいがテーブル定義を記述したスクリプトを修正するとデータが失われてしまうので追加スクリプトにDROPを記載して対応したい。

# 問題点

キーの削除は、UP節に`alter table xxx drop key xxx`で可能です。を記載すればOKです。
問題はDOWN節でCREATEできないこと(キー重複エラーになる)。

このため、UP節が2回実行されると存在しないキーを削除しようとするのでマイグレーション操作がエラーになってしまいます。

`IF EXISTS`はテーブルの削除(`DROP TABLE`)はサポートしていますが`ALTER TABLE`ではサポートされていません。

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.7 ALTER TABLE 構文](https://dev.mysql.com/doc/refman/5.6/ja/alter-table.html)

# 対応策

`information_schema`で存在をチェックして動的にSQL文を作成することで複数回実行してもパスするようになりました。

## インデックス､ユニークキーの場合

```sql
set @tablename='テーブル名';
set @indexname='インデックス名';
set @var=if((SELECT true FROM information_schema.STATISTICS WHERE
            INDEX_SCHEMA = DATABASE() AND
            TABLE_NAME   = @tablename AND
            INDEX_NAME   = indexname) = true,concat('ALTER TABLE ', @tablename, ' drop key ', @indexname),'select 1');
prepare stmt from @var;
execute stmt;
deallocate prepare stmt;
```

## 外部キーの場合

```sql
# --- !Ups
set @tablename='テーブル名';
set @constraintname='外部キー名';
set @var=if((SELECT true FROM information_schema.table_constraints WHERE
            table_SCHEMA = database()
            and table_name = @tablename
            and constraint_type="FOREIGN KEY"
            and CONSTRAINT_NAME = @constraintname) = true,concat('ALTER TABLE ', @tablename, ' drop FOREIGN KEY ', @constraintname),'select 1');
prepare stmt from @var;
execute stmt;
deallocate prepare stmt;
```



# 参考

以下のQ&Aの上位回答のあわせ技です。

mysql - Drop foreign key only if it exists - Stack Overflow
https://stackoverflow.com/questions/17161496/drop-foreign-key-only-if-it-exists
【pandas.DataFrame】継承したときに出る 【UserWarning: Pandas doesn't allow columns to be created】 の避け方

pandas.DataFrameが便利なので、チョット応用したいときにクラス継承したりします。

```python:インスタンス変数を定義


class ChildDataFrame(pd.DataFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(pd.DataFrame(*args, **kwargs))
        instance = [1, 4, 6]


```

こうすればpandas.DataFrameにはないインスタンス変数やメソッドを定義できるわけです。


```python:インスタンス変数呼び出し
>> > df = pd.DataFrame(np.random.randn(4, 5))
>> > cdf = ChildDataFrame(df)
>> > cdf.instance
[1, 4, 6]
```

しかしながらpandasは新しいインスタンス変数の追加を基本的に禁止しているそうです。
上のようにインスタンス変数定義すると、呼び出すたびにこんなワーニングがでます。

```UserWarning
UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https: // pandas.pydata.org/pandas-docs/stable/indexing.html  # attribute-access
self.instance = [1, 4, 6]
```

インスタンス変数の代わりにクラス変数を使うとワーニングが抑えられるようです。

```python:クラス変数を定義


class ChildDataFrame(pd.DataFrame):
    klass = [1, 4, 6]

    def __init__(self, *args, **kwargs):
        super().__init__(pd.DataFrame(*args, **kwargs))


```

インスタンス時に初期化したいときは、クラス変数を介してやるとワーニング無しにインスタンス変数のように扱えます。

```python:クラス変数をインスタンス変数のように初期化


class ChildDataFrame(pd.DataFrame):
    klass = [1, 4, 6]

    def __init__(self, *args, **kwargs):
        super().__init__(pd.DataFrame(*args, **kwargs))
        ChildDataFrame.klass = ls


```

```python:クラス変数をインスタンス変数のように初期化使い方
>> > df = pd.DataFrame(np.random.randn(4, 5))
>> > cdf = ChildDataFrame(df, [10, 20])
>> > cdf.klass
[10, 20]
```
【macのみ】HEICファイルをjpgにコマンドで変換

出力のoutdirは別に作成しておく

```
for f in *.HEIC; do sips --setProperty format jpeg $f --out ./outdir/`basename -s .HEIC $f`.jpg ; done
```

ffmpegを利用可能にするのに手間取ったのと、基本コマンドで流用可能な内容を記載

### 参考
https://qiita.com/1coin178/items/83098b1be474db3e8bda
https://qiita.com/3attoC/items/ee75825be2b22c57bc41
【laravel】リダイレクト処理

# 概要
laravelのリダイレクト機能について簡単な備忘録を投稿します。
何気なく使用しているredirect関数ですが細かく分類すると3つの使い方に分類できます。
・PHPのheader関数のように指定したパスを表示する
・`Illuminate\Http\RedirectResponse`クラスのインスタンス
・`Illuminate\routing\Redirector`クラスのインスタンス

また、redirectメソッドはグローバルに使用できるヘルパー関数の一つで、どのクラスにおいても自由に使える関数です。

# RedirectResponseクラス
`Illuminate\Http\RedirectResponse`クラスのレスポンスを返すredirectメソッドです。
ここではthis自身をreturnするシンプルなメソッドをまとめます。

<table>
<tr>
<th>内容</th>
<th>メソッド</th>
<th>概要</th>
</tr>

<tr>
<td>入力データの付加</td>
<td>$response->withInput()</td>
<td>送信されたフォームの値をInput::old()へ引き継ぐ</td>
</tr>

<tr>
<td>バリデーションのエラーを付加する</td>
<td>$response->withError()</td>
<td>引数の値を$errors変数へ保存してリダイレクト先へ引き継ぐ</td>
</tr>

<tr>
<td>クッキーを付加する</td>
<td>$response->WithCookie()</td>
<td>クッキーを保存してリダイレクト先へ引き継ぐ</td>
</tr>

</table>


# Redirecorクラス
引数をなしで呼び出すと`Illuminate\routing\Redirector`クラスのインスタンスが返されます。
主にルーティングに関する情報を扱う機能です。

<table>
<tr>
<th>内容</th>
<th>メソッド</th>
<th>概要</th>
</tr>

<tr>
<td>ルートの指定</td>
<td>redirect()->route('ルート名'，'配列')</td>
<td>web.phpにルート情報として記述したものを指定します。</td>
</tr>

<tr>
<td>アクションの指定</td>
<td>redirect()->action('アクションの指定'，'配列')</td>
<td>SampleController@indexのようにコントローラーにアクションを指定します。</td>
</tr>

<tr>
<td>ビューを指定</td>
<td>redirect()->view('ビュー名')</td>
<td>ビューを指定してリダイレクトします。</td>
</tr>

<tr>
<td>JSONにデータを返す</td>
<td>redirect()->json('テキスト')</td>
<td>JSONデータっをクライアントに返します。</td>
</tr>

<tr>
<td>ファイルを表示</td>
<td>redirect()->file('ファイルパス')</td>
<td>パスで指定したファイルを表示します。</td>
</tr>

<tr>
<td>ファイルをダウンロード</td>
<td>redirect()->download('ファイルパス')</td>
<td>パスで指定したファイルをダウンロードします。</td>
</tr>

</table>

# 参考
[ヘルパ（redirect）]
(https://readouble.com/laravel/6.x/ja/helpers.html#method-redirect)
[HTTPレスポンス]
(https://readouble.com/laravel/6.x/ja/responses.html#redirects)
Scalaでリストを使った簡単な占いを実装してみる

# きっかけ
大学でプログラムならまずこれを勉強しろと言われ、文字通り1+1しか書けず挫折したScalaを改めて触ってみたいと思う。
少しばかりpythonで簡単な処理は書けるようになったので、今なら理解できるかどうか試してみたくなったのが動機。
ちなみに、Javaは全く触ったことがありません。

[コップ本](https://www.amazon.co.jp/dp/B01LYPRFI7/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を片手に頑張ります！
理解がおかしかったらご指摘ください。

# 占い
[Randomライブラリ](https://www.scala-lang.org/api/2.12.0/scala/util/Random.html)を使う。

```scala
import scala.util.Random

def fortune(): String = {
  val fortuneNumber: Int = Random.nextInt(3)
  if ( fortuneNumber == 0 ) "大吉"
  else if ( fortuneNumber == 1 ) "吉"
  else "凶"
}

println(fortune())
```

Randomモジュールを使うことで乱数を扱うことができる。
nextIntメソッドは0から"引数で指定した値 -1"の整数をランダムに出力する。
今回は３パターン出してみたので、nextInt(3)で0, 1, 2が生成される。

あとは、0=大吉、1=吉、2=凶に振り分けて条件分岐。
scalaはelif使えないんですね。

# もう少し簡潔に書く
このままだと、出力候補が増えれば増えるほどelse if文が増えるのでイケてない。
じゃんけんみたいな処理だと、数値->文字列の置き換え処理が必要で、非常にイケてないプログラムになることが想像できる。
Randomライブラリにsuffleメソッドがあった。これで返したい値をリスト化し、さらに要素をシャッフルすることが可能。

```scala
import scala.util.Random

val fortune = List("大吉", "吉", "凶")
val result = Random.shuffle(fortune).apply(0)

println(result)
```

ちなみに、shuffle関数を今回用に自分で作るとこんな感じ。

```scala
import scala.util.Random

def shuffle(list: List[String]): String = {
  list(Random.nextInt(list.length + 1))
}

val fortune  = List("大吉", "吉", "凶")
val result = shuffle(fortune)

println(result)
```

# 頭の整理：配列とリスト
## 配列とリスト
Pythonだとメソッドを呼び出すときは次のように[]を使った。
配列のデータに直接触りに行って参照しているイメージ。

```python
>>> test = ["one", "two", "three"]
>>> test[0]
'one'
>>>
```

Scalaはapplyという関数で呼び出しているらしい。
関数なので、指定すべき要素は引数扱いになる。だから()で呼び出す。

```scala
scala> test(0)
val res1: String = one

scala> test.apply(0) //同じこと
val res2: String = one
```

## 配列とリストの違い
- 配列：要素は全て同じ型
- リスト：要素の型はそれぞれ違っていて良い

架空の勇者の情報として、「名前、レベル、魔王討伐状況」を配列、リストにそれぞれ入れることを試す。
※辞書で書けばいい話だけど、今回は練習として。

```scala
scala> val testArray = new Array[String](3) //これは配列。そもそもこう書かないと通らない。
val testArray: Array[String] = Array(null, null, null)

scala> testArray(0) = "勇者"

scala> testArray(1) = 20
                      ^
       error: type mismatch; //当然型エラー
        found   : Int(20)
        required: String

scala> testArray(2) = false
                      ^
       error: type mismatch; //当然型エラー
        found   : Boolean(false)
        required: String

scala> val testList = ("勇者", 20, false) //これはリスト
val testList: (String, Int, Boolean) = (勇者,20,false)
```

## リストの定義
先ほどのListの定義を下記のように書くと、エラーが出る。

```scala
scala> val test = new List("test")
                  ^
       error: class List is abstract; cannot be instantiated              ^

scala> val test = new List("test": String)
                  ^
       error: class List is abstract; cannot be instantiated
```

コップ本にはこう書いてある。
> List.apply()はscala.Listコンパニオンファクトリーメソッドとして定義されているので、new Listと書く必要はない。

"ファクトリーメソッド"とあるから、
List.apply()の処理で作られるモノが具体的なオブジェクトだから、作り方なListクラスはインスタンスにはできないということ？
飲み込むのに時間がかかりそうなので、これは次の機会に。
[Kotlin]Firebase Analytics, Crashlyticsの実装

# はじめに
 - Analyticsでユーザー情報が取得できる
 - Crashlyticsでクラッシュしたらとれる

# 画面
Analytics
導入するだけで色んな情報がとれます

![スクリーンショット 2020-05-01 13.14.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/eae71f76-9b07-f540-0ffb-9bf4a8547fe4.png)

Crashlytics
クラッシュするとクラッシュの詳細が見れます

![スクリーンショット 2020-05-01 13.17.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/ae2c15b7-409f-99d8-353d-4d52f7cd1f76.png)

何もない画面

```activity_crashlytics.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activity.CrashlyticsActivity">

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

クラッシュ情報を取得したい為、クラッシュさせます。

<img width="375" alt="File.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199764/cc2b7e98-5da8-e9bc-720d-4105629d8662.png">


# 実装

rootのgradle

```build.gradle(.)
    dependencies {
        〜

        // 追加
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0'
    }
```

applicationレベルのgradle

```build.gradle(app)
// 追加
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
   〜

    // Analytics.
    implementation 'com.google.firebase:firebase-analytics:17.4.0'
    // Crashlytics.
    implementation 'com.google.firebase:firebase-crashlytics:17.0.0'
}
```

Activity

```CrashlyticsActivity.kt
class CrashlyticsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_crashlytics)

        // イベントを送ると詳細な情報がとれる
        val firebaseAnalytics = FirebaseAnalytics.getInstance(this)
        val bundle = Bundle()
        bundle.putString("param1", "value")
        firebaseAnalytics.logEvent("test_event", bundle)

        // クラッシュさせる
        throw Exception("test exception")
    }
}
```

# おわりに
Analyticsはイベントを送らなくてもスクショの情報がとれます

ソースコードは[こちら](https://github.com/yoshihitoijichi/FireabseSample)
google-drive-ocamlfuse で Linux で Google drive shared drives(旧 Team Drives)をマウントする

## 背景

google shared drives(旧 Team drives)を使ってプロジェクト単位で外部とデータ共有している.

Linux でも Nautilus(Gnome)などで使いたいが, Windows explorer や macOS finder にはプラグインがあるが, Linux には提供されていない.

## google-drive-ocamlfuse

https://github.com/astrada/google-drive-ocamlfuse

で Linux でも fuse でマウントできます.

shared drives(Team drives) にも対応しました.

https://github.com/astrada/google-drive-ocamlfuse/wiki/Team-Drives

## 問題点

fuse 上でテキストやソースコード編集するとよく固まります(vim で確認). 基本的にはファイルを置く, 取得するに限ったほうがよいでしょう.

## TODO

* [ ] rclone あたりと組み合わせる
Swiftで半角英数字を判定する

#Swiftで半角英数字を判定する

現在のSwift5ですぐに使える判定が意外と見つからなかったので。

```swift:String+.swift
    /// 文字が半角英数字のみか判定します
    /// - Returns: true：半角英数字のみ、false：半角英数字以外が含まれる
    func isAlphanumeric() -> Bool {
      return !isEmpty && range(of: "[^a-zA-Z0-9]", options: .regularExpression) == nil
    }

```
reactでonKeyPress Enter


# reactで、フォーカスされているinputformでenterが押されたら特定のアクションを実行したいとき。

```react
class InputForm extends Component {
  constructor(props) {
    super(props);
    this.actionWhenPressEnter = this.actionWhenPressEnter.bind(this);
    this.enterListener = this.enterListener.bind(this);
  }

  // enterが押された時に行いたい処理
  actionWhenPressEnter() {
    console.log('pressed enter');
  }

  // enterが押されるのを待つ。
  enterListener(e) {
    if(e.key === 'Enter') {
      e.preventDefault()
      this.actionWhenPressEnter()
    } 
  }

  render() {
    return (
      <div>
        <input
          placeholder='placeholder' 
          onKeyPress={ this.enterListener }
        />
        <button onClick={this.handleClick}> add </button>
      </div>
    );
  }

}

```

コレダケ。
【Udemy】AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得　受講後の片付け

## はじめに
Udemyの[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-aｎd-infra/) の受講後の片付けについて書きます。
お金がかからないように必要ないものは削除しましょう。


## 作業内容
効率的な手順ではなく、構築を逆順に追っていくだけです。
忘れているところは構築当時のことを思い出しながらやると良いです。


- IAMポリシー、ロール、ユーザーの削除
- CloudWatchの削除
- __SNSのトピックの削除 (20200501 記載漏れのため追加)__
    - 私の場合、サブスクリプション(配信先)は今後も使えそうなので残しておきました
- RDSのマルチAZの解除
    - 動画内で済のはず
- ELBの削除
    - ターゲットグループの削除
    - ロードバランサーの削除
- AMIの削除
- CloudFrontを無効化、削除
- S3操作用のIAMユーザーの削除
- S3のバケットの __中身__ を削除
- S3のバケットを削除
- RDSの停止、削除
- Route53の削除
- ElasticIPの関連付けの削除
- ElasticIPの開放
- EC2インスタンスの停止、終了（＝削除）
    - インスタンスは、terminated状態でしばらく残る
- VPCの削除

- ドメインの解約
年間契約で、他の学習でも使えるのでとりあえずそのままでも良いと思います。
勉強メモ

プログラム関連で勉強したメモをココにまとめる．

# ROS2
前提として，僕はROS1を昔に少し触ったことがある程度でほとんど何も知りません．ただ，ROS2を使う必要が発生したため勉強をはじめました．そして，僕はとても忘れやすいので，さっぱり忘れてしまったとしても(自分が読めば)理解できるように，言葉の定義や世界観といった全体像と，コマンド，使い方，作り方といった具体的な手を動かす部分をまとめた勉強ノートを作ることにしました．
#### 環境
- Ubuntu 18.04LTS
- ROS2 Dashing

#### 勉強したこと
- [ROS2 Whai is ?](https://qiita.com/Dorebom/items/8e1649c78745c011386c)
- [ROS2 用語](https://qiita.com/Dorebom/items/e5028051f20157e7d43d)
- [ROS2 コマンド](https://qiita.com/Dorebom/items/9e906035092f5e343f76)
- [ROS2 How to use](https://qiita.com/Dorebom/items/a66d4c01b1b5b06318bc)
- ROS2 How to make
    - [launchファイルの作成](https://qiita.com/Dorebom/items/eb42802254baa7eae9ff)
    - [publisher/subscriber node(+topic)の作成](https://qiita.com/Dorebom/items/47fb67e5e47a205f1395)
    - [service/client node(+service)の作成](https://qiita.com/Dorebom/items/486ebbb5edb23844422e)
    - action(ファイル)の作成
    - [packageの作成](https://qiita.com/Dorebom/items/2f99fdb16106ee96f066)
    - [workspaceの作成](https://qiita.com/Dorebom/items/dbcefa143b8bc7f2a9c0)
  
# 参考サイト

# 更新履歴
2020.5.1 ROS2を追加
Bitbucketのmarkdownで順序リストの中にコードブロックを書きたい

## 順序リストの中にコードブロックを書くと、ナンバリングがリセットされてしまう

### NG（半角スペース4個）  
VSCodeやQiitaではこれで問題なく表示される

```
1. list1
2. list2
    ```php
    $a = $b + $c;
    echo $a;
    ```
3. list3
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104999/d360638b-7433-030c-fde5-76dcb61da1a4.png)

---

### OK（半角スペース8つと空行）  

半角スペース8つで自動的にコードブロックになる。
前後に空行が必要。
言語表記は`#!#`で囲むことができるが、Bitbucketにハイライト機能がないので無意味かも？
逆にVSCodeやQiitaでは`#!#`が使えないので不要かもしれない。

```
1. list1
2. list2

        #!php#
        $a = $b + $c;
        echo $a;

3. list3
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104999/c9411370-7543-cf59-b583-024918527f03.png)

---

- 出典  
How to markdown nested list items in Bitbucket?  
https://stackoverflow.com/questions/40707725/how-to-nest-code-block-under-a-list-item-in-bitbucket-mark-down
仕事の合間にconsole.?og

## まえがき

コ○ナのせいで外出できず、暇だったので作りました。
味気ないconsole.logに飽きたら使ってみてください。


## 使用例

#### ソースコード

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script src="console.js"></script>
    <script>
    console.cog("hoge");
    console.dog("hoge");
    console.fog("hoge");
    console.hog("hoge");
    console.jog("hoge");
    </script>
  </body>
</html>
```

#### 結果

<img width="957" alt="console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321361/a58ea12b-5c0c-8254-21e5-41a13a36f04b.png">


## スクリプト（コピペ用）

```javascript:console.js
/***
 * Params are
 * s(speaker), w(word), l(length)
 */
console.xog = function(s, w, l) {
    console.log(`
      /￣${`￣`.repeat(l)}￣
${s}　＜　${w}
      \\＿${`＿`.repeat(l)}＿
    `);
}

console.cog = function(oil, l=oil.length/2) {
    console.xog("⚙", oil, l);
};

console.dog = function(bark, l=bark.length/2) {
    console.xog("🐶", bark, l);
};

console.fog = function(moisture, l=moisture.length/2) {
    console.xog("🌫", moisture, l);
};

console.hog = function(grunt, l=grunt.length/2) {
    console.xog("🐷", grunt, l);
};

console.jog = function(wind, l=wind.length) {
    console.log(`🏃🏽${`💨`.repeat(l)}`);
};
```
【Vue / Nuxt】componentが共通な２つのページ間の遷移時にDOMを更新する方法

例えば下記の様な、newとedit両方のページがEditコンポーネントを再利用して作られているケースがあります。

```js:router/index.js
  {
    path: '/new',
    name: 'new',
    component: Edit
  },
  {
    path: '/edit/:id',
    name: 'edit',
    component: Edit
  },
```


デフォルトでは、newとeditの直接遷移時には、DOMはリセットされません。
遷移時にDOMを更新する方法として、```router-view```にユニークなkeyを追加することで、
遷移時にDOMを初期化(リロード)することができます。

今回はrouteパラメータのpathをユニーク値として選択しています。

```vue:container.vue
<router-view :key="$route.fullPath"></router-view>
```
PHPの配列、連想配列について

#PHPの配列
###配列とは
配列とは、同じ変数名で、いくつかデータを入れることができる大きな箱のようなものです。配列の場合は、一つの配列に複数の箱で振り分けることができます。

基本的な使い方としては以下のような書き方をする。

こうするとブラウザには”２”が出力される。

```php
 $array_1 = [1,2,3];//変数=[値]
 echo $array_1[1];
```
配列は行をふやす事もできる

```php
$array_2 = [
  ['赤','青','黄'],
  ['test','numbers','baseball']
];
```
これは$array_2と言う配列の中に更に「赤、青、黄」の配列と「test,numbers,baseball」があることを示している。値の取り出し方は下記の通りで、[0][1]の[0]は１列目「赤、青、黄」を指定し,[1]はその配列の中の何番目かを指定している。この場合では”青”が表示される。

```php
 echo $array_2[0][1];
```
#連想配列
###連想配列とは
配列には、変数の箱の中身に 0,1,2……と番号を振り、その番号を指定することでデータを指定していましたが、連想配列では、番号のかわりに名前をつけて管理することができます。

```php
 //変数 = ['キー'=>'バリュー'];
$array_member = [
  'name' => '山田',
  'height' => 175,
  'hobby' => '野球'
];
```

このようにキーとバリューを使い値を指定する事ができます。

```php
 echo $array_member['name'];
```
'name'と指定する事で’山田’と言うデータが取り出せます。

```php
 $array_member_3 = [
  'ライオンズ' => [
    '山川' => [
      'height' => 183,
      'position' => '一塁手'
    ],
    '中村' => [
      'height' => 175,
      'position' => '三塁手'
    ] 
  ],
  'ファイターズ' => [
    '中田' => [
      'height' => 189,
      'position' => '一塁手'
    ],
    '大田' => [
      'height' => 179,
      'position' => '外野手'
    ]
  ]
];

echo $array_member_3 ['ファイターズ']['中田']['position'];

```
応用としてこのような書き方もできます。説明すると、$array_member_3の配列の中に「ライオンズ」と「ファイターズ」と言う配列があり、その中にライオンズなら「山川」「中村」、ファイターズは「中田」「大田」というデータがあります。
その中に'height','position'というデータがある構造です。
イメージでいうとリーグがあって、そのリーグにはライオンズとファイターズというチームがあって、その各チームの選手の身長とポジションのデータが入っているよと考えて頂けたらいいかなと思います。
最後のechoは”一塁手”と表示されると思います。
簡単ではありましたが、自分なりにまとめてみました。ご意見、ご指摘等ありましたら、どんどんお願いします！！