OmniAICreator/Qiita-1.07M huggingface dataset:
volumioにvscode Remote SSHでアクセスする

#volumioにvscode Remote SSHでアクセスする
VS codeのRemote SSH拡張機能でvolumio（ラズパイOS)にアクセスしようとしたときの備忘録です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728667/825294a8-fa49-08e8-ca9a-43c19496323f.png)
↑こいつ

# こんなエラーがでる
```
Resolver error: Error: The VS Code Server failed to start
```
ログをたどっていくと、どうやらファイルが見つかっていないようです。

```
error while loading shared libraries: libatomic.so.1: cannot open shared object file: No such file or directory
```
apt-getで必要なファイルを入れて終わり

```
apt-get install libatomic1
```

volumioには libatomic.so.1がデフォルトで入っていないみたいです。
追加で入れてやりましょう。
なぜシェルスクリプトではメモ化再帰を使ってフィボナッチ数を求めることができないのか？

## はじめに

この記事は最終的に**シェルスクリプトでメモ化再帰を使ってフィボナッチ数を求めるコードを提示します**が、この記事の趣旨は他の言語と同じようなコードではシェルスクリプトでメモ化再帰ができない理由とそれを回避するためのテクニックを紹介することです。再帰を使わない実装や `awk` や `bc` 等のシェルスクリプト以外のコマンドを使って実装する話はこの記事の対象外です。またフィボナッチ数やメモ化再帰そのものについては詳しく解説しないので他のサイトなどで調べてください。

## JavaScript による実装

参考として JavaScript でフィボナッチ数を求めるコードを提示します。

まずはメモ化を行わない通常の再帰を使ったコードです。私の環境では 45 番目 のフィボナッチ数 1134903170 を求めるのにおよそ 10 秒ぐらいかかりました。（ちなみに以下のコードは n = 0 を考慮していません。）

```javascript
function fib(n) {
  if (n < 3) return 1;
  return fib(n - 1) + fib(n - 2);
}

console.log(fib(45))
```

これをメモ化（要するに計算済みの値をメモリにキャッシュしておいて再利用すること）を使って実装すると 0.4 秒で結果を求めることができ計算処理を高速化することが出来ます。

```javascript
const memo = [null, 1, 1];
function fib(n) {
  if (memo[n]) return memo[n];
  memo[n] = fib(n - 1) + fib(n - 2);
  return memo[n];
}

console.log(fib(45))
```

これと同じことをシェルスクリプトでやろうという話です。

## シェルスクリプトによる実装

シェルスクリプトの戻り値（終了ステータス）は 0 〜 255 の範囲しか返すことが出来ないので求めたフィボナッチ数を返すことが出来ません。そのため標準出力を使って値を返すのが定番パターンです。

メモ化を行わないコードです。遅いので 15 番目のフィボナッチ数 610 に変更しています。JavaScript 版より少し見づらいと思いますがやっている処理自体は変わりません。実行時間は 16 秒程度でした。

```sh
fib() {
 [ "$1" -lt 3 ] && echo 1 && return 0
 echo $(( $( fib $(($1 - 1)) ) + $( fib $(($1 - 2)) ) ))
}

fib 15
```

### メモ化してるのに速くならない

このコードは遅いので JavaScript と同様にメモ化を行います。私は普段 POSIX シェル準拠のコードを書いているのですが、今回はわかりやすさ優先で配列が使える bash コードです。配列部分を `eval` を使って `memo_N`（N は任意の数字）変数に入れるようにすれば POSIX シェルにも対応させることが出来ます。

```bash
memo=(0 1 1)
fib() {
  [ "${memo[$1]}" ] && echo "${memo[$1]}" && return 0
  memo[$1]=$(( $( fib $(($1 - 1)) ) + $( fib $(($1 - 2)) ) ))
  echo "${memo[$1]}"
}

fib 15
```

実行時間は・・・およそ 16 秒で全く変わりません。つまりメモ化が行われていないということです。さてなぜなのでしょうか？

### 原因はサブシェル

メモ化が出来ない原因は `$( fib $(($1 - 1)) )` の部分です。`fib` 関数は標準出力に計算した結果を出力しますが、それを受け取るためにコマンド置換`$(...)` を使用します。コマンド置換はサブシェルを生成します。サブシェルは現在のシェルと同じ環境を作り出すもので、多くのシェルの実装では現在のプロセスをコピー（fork）した子プロセスとして実装されています。つまりコマンド置換の中で呼び出した `fib` 関数は別プロセスで実行されているのです。別プロセスでメモ化（メモリに計算結果をキャッシュ）したとしても、残念ながら呼び出し元のプロセスには反映されません。またサブシェルが使用する fork はとても遅い処理なので、コマンド置換を多用することはシェルスクリプトを遅くする原因にもなります。

### 「出力引数パターン」で解決

これを解決するには「出力引数パターン」を使用します。「出力引数パターン」というのはシェルスクリプト用語ではなく MATLAB や他の言語を参考に私がつけた名前で（他にもっといい名前があれば教えて下さい） `read` コマンドや `getopts` コマンドと同じように引数で指定した変数に戻り値を返すテクニックです。つまり `fib ret 15` という形で関数を呼び出し、戻り値を `ret` 変数に返します。以下はその実装例です。（以下の例では POSIX シェルでも使える `eval` を用いて実装していますが、`eval` はサブシェルよりはかなりマシとはいえ遅い処理の一つです。bash 等では`eval` を使わない方法もあります。）

```bash
memo=(0 1 1)
fib() {
  [ "${memo[$2]}" ] && eval "$1=\${memo[\$2]}" && return 0
  fib i $(($2 - 1))
  fib j $(($2 - 2))
  memo[$2]=$((i + j))
  eval "$1=\${memo[\$2]}"
}

fib ret 45
echo "$ret"
```

書き換えたコードを実行してみるとすぐに分かると思いますが 0.1 秒未満で結果が返ってきます。おっと上のコードをよく見て下さい。JavaScript と同じく 45 番目に戻していますよ。JavaScript では 0.4 秒でした。なんとシェルスクリプトの方が速く結果が返ってくるようになってしまいました。まあこれは bash の処理速度が速いわけではなく node 起動のオーバーヘッドが大きいってだけなのですが。処理速度自体は JavaScript の方が速いです。

## まとめ

サブシェルというのは他の言語にはないシェルスクリプト特有の概念です。その動きを正しく理解していないと予想していないところでハマったり大幅なパフォーマンス低下を引き起こします。シェルスクリプトを使う上で正しく知っておかなければいけないことの一つです。
【初心者向け】効果音を加工してみよう

# 効果音をいい感じにしたい人へ
フリー素材の効果音をゲームに使ってみたけれど、なんだか合っていない気がする…ちょっと加工して、いい感じにならないかな？

いやでも自分はサウンドの専門家じゃないし…難しそうだし…

『そこのキミ！ 心配するな。**誰でも最初は初心者さ！**』

というわけで、そんな悩んでいる方のためにCRI ADX2LEに付属のAtomCraftを使って効果音をいい感じにするテクニックを紹介します。
ダウンロードは以下からどうぞ。

https://game.criware.jp/products/adx2-le/

なお、一般的なDAWを使っても似たような事ができます。効果音作りのノウハウという事でひとつよろしくお願いします。

## そもそも"いい感じの音"って？
絵と音が合っている状態を"いい感じ"と考えているので、絵と音の表現の粒度やタイミングが適切である状態を"いい感じ"と定義します。
その辺りの細かい説明は以下の記事をご参照ください。

https://note.com/adx_kawaguchi/n/nb409bf9eaf32

## 試しに爆発音を加工してみる
爆発音に限りませんが、いい感じの効果音を構成する要素として**時間軸で3つに分けて考えます。**
"ちゅどーん"っていう爆発音があるとして

* アタック感　（ちゅ）
* メインの音 （ど）
* 余韻 （ーん）

これをそれぞれ完成イメージに近づけることでいい感じになります。

と言ってもいきなり全部やるのは難しいので簡単なところから。
**まずは余韻が長めの効果音を短くしていい感じに合わせる**方法から説明します。
素材は以下のページから"小爆発２"をお借りします。ありがとうございます。

https://taira-komori.jpn.org/arms01.html

なお、mp3は直接読み込めないので何かツールを用いてwav形式に変換してください。

### 余韻を短くする
ツールの初歩的な操作については公式チュートリアルを見ていただくとして、キューを作成するとタイムライン上に波形が現れます。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96688/d1aaf34d-373e-c974-c42a-e7a9d844562a.png)


ここの"オートメーションなし"と書かれた部分をクリックし、ボリュームを選択すると音量変化のカーブを書き込めるようになります。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96688/a80e3cb6-0b92-581b-abb6-1a3f0823664c.png)

黄色い線の途中をクリックして図のようにカーブを作ると、余韻が短くなった爆発音のできあがりです！

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96688/278dd218-5b09-7601-9745-4ee95d1c4a36.png)

また、ポイントリストを表示すると数値入力ができたりカーブタイプを変更したりできるのでお好みで。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96688/baf29dc9-1534-2d0b-fa9a-fa72d332d672.png)

### 余韻を長くする 手段1
手っ取り早いのは途中からピッチを少し下げるという手段です。
ニュアンスは少し変わりますが、本当に雑に簡単なのはこれです。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96688/3f459699-2816-02c7-4047-4d464bb0aa51.png)
最初の部分を下げていないのは余韻だけを変化させたいからです。

### 余韻を長くする 手段2
トラックを増やし、同じ波形を少しズラして並べます。
このままでは当然、2度爆発音が鳴ってしまうので、ボリュームのオートメーションを追加して

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96688/7bf83ef0-a517-951c-6a76-bd4e78f5384d.png)

前半のボリュームをゼロにし、フェードインしてくる形で余韻の部分だけを重ねます。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96688/6bc47b1b-a5fa-234b-69d5-cff278d3ba40.png)

いい感じに調整が済んだらバウンスという機能を使うと1つのwavファイルとして書き出されるのでそれを使います。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96688/c350bd13-fc19-f531-6612-471c6253093a.png)

## 余韻以外の調整について
余韻を長くする手段2と同様に、トラックを増やし、欲しい要素をうまいこと切り出してオートメーションを書き、重ねて鳴らしてバウンスして1ファイルにする、という工程は変わりません。
音の高域、低域などをコントロールしたり、合わせた音が音割れしにくい設定などのテクニックもありますが、それらはまた別の機会に。

これをきっかけに効果音作りの楽しさを感じてもらえたら良いなーと思います。
レッツチャレンジ！
【ナレッジ】Amazon Linux2でタイムゾーンの変更を行う時、"絶対"にcpをしてはいけない話

# はじめに
Amazon Linux1 から Amazon Linux2への移行を行いました。
その時、**Amazon Linux1 では問題のなかったやり方でAmazon Linux2のタイムゾーン変更設定**を行ったところ、**「下手したらなかなか致命的なリスクになるのでは？」**という事象を発見したので書き留めました。

Linuxにバリバリ詳しいわけでは無いので、間違いや微妙な表現などがあったら、ご指摘頂けると助かります！

# タイムゾーンの設定
Linuxのタイムゾーンは `/etc/localtime` ファイルで設定します。
この`/etc/localtime`を各国や地域のタイムゾーンに対応したバイナリファイルに指定することによって、**Linux内の時間帯が設定されます**。

例えば、日本であれば特段の事情がない限り「**日本標準時（JST）**」を指定することになります。
各タイムゾーンは`/usr/share/zoneinfo/` に格納されています。
※詳しくはこちらを参照↓

https://linuc.org/study/knowledge/516/

デフォルトでは`/etc/localtime` がUTCのバイナリファイルとなっています。
その為、 **date**コマンドを入力すると**UTC**の時間帯が返ってきます。

```
$ strings /etc/localtime
TZif2
TZif2
UTC0
$ strings /usr/share/zoneinfo/Etc/UTC
TZif2
TZif2
UTC0
$ date
Sun Jul 11 14:27:26 UTC 2021   ###日本では7/11 23時27分
```
# Amazon Linux2でやってはいけない変更方法
**`/etc/localtime` にタイムゾーンファイルを`cp`するやり方はしてはいけません。**
これは先ほどのリンク先にも紹介されていたやり方だし、ググるとこのやり方を紹介するページをちょくちょく散見します。
昔のLinuxであれば特に問題ないやり方だったのかもしれません（※ Amazon Linux1では問題ないやり方だった）。

```
「/etc/localtime」には、このファイルの中身をコピーするか、シンボリックリンクを張ることになります。作業例を以下に示します。

○/etc/localtimeの設定例
# date
Wed Dec  12 04:14:10 GMT 2015                       ←「GMT」で表示
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime  ←ファイルコピー
# date
Wed Dec  12 13:15:11 JST 2015                       ←「JST」で表示
```

# なぜcpでタイムゾーン変更してはいけないか
結論から言うと、Amazon Linux2では

```
$ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

このようにコピーを行うと、UTCのバイナリファイルである `/usr/share/zoneinfo/UTC`と`/usr/share/zoneinfo/Etc/UTC` の中身が
**`/usr/share/zoneinfo/Asia/Tokyo`のファイルになってしまいます**。

何故こうなるかというと、Amazon Linux2はデフォルトで **`/etc/localtime`が`/usr/share/zoneinfo/UTC`へのシンボリックリンクになっているからです。**


```
$ ls -la /etc/localtime
lrwxrwxrwx 1 root root 25 Jul  9 02:40 /etc/localtime -> ../usr/share/zoneinfo/UTC
```

※ちなみに、Amazon Linux1ではシンボリックリンクになってません。

```
$ ls -la /etc/localtime
-rw-r--r-- 1 root root 118 Dec 25  2012 /etc/localtime
```

恐らく、Amazon Linux2は**CentOS7ベースで作られたOS**なので、systemdで制御される**timedatectl** の影響だと思われます。
なので、Amazon Linux2だけでなく、CentOSでも同じ事象が発生するかも知れません。
（ここら辺が詳しく無いので、教えてくれる人がいると幸いです）

# これによるリスク
具体的なcodeは記載しませんが、私のプロダクトではRailsで
「受け取った時間dataをUTCとして認識して、JSTの時間dataに変換する」
という処理がありました。

この時、**ローカルシステムの `/usr/share/zoneinfo/Etc/UTC` を受け取って処理**をしているらしいのですが、
既述の通り`Etc/UTC` は `Asia/Japn` のファイルに上書きされてしまっているので、

「受け取った時間dataを**JST**として認識して、JSTの時間dataに変換する（つまり変換されない）」
という処理に変わってしまいました。
時間が9時間ズレるので大変な事になります・・・

# Amazon Linux2でタイムゾーン変更するには
CentOS7ベースで作られて居るので、timedetactlコマンドを使用しましょう。

```
$ timedatectl set-timezone Asia/Tokyo
```

http://www.ajisaba.net/linux/centos7/timezone.html
オブジェクト指向

#オブジェクト指向とは

オブジェクト指向とはアプリケーションをどう作るかという考え方である。
また、人間が楽をするためのモノです。

「オブジェクト」はモノという意味で、指向は〜を中心に考えるという意味です。
ですので、オブジェクト指向はモノを中心に考えるという意味になります。

オブジェクトは情報と振る舞いを持ちます。

#インスタンスとクラス

そして、オブジェクト指向で大事なのはインスタンスとクラスです。
インスタンスはオブジェクト（モノ）の別名です。
クラスはインスタンスの設計図になります。
ですので、インスタンスはクラスから作られます。

クラスからインスタンスを生成するにはnew クラス名();です。
そして、インスタンスは変数に代入して使います。
クラス型　変数 = new クラス名();
1つのクラスから複数のオブジェクトが生成できます。

```Java:Main.java
class Main {
 public static void main(String[] args) {
  Person person = new Person();
  person1.hello();

  Person person = new Person();
  person2.hello();

 }
}
```

```Java:Person.java
class Person {
 public void hello(); {
  System.out.pritnln("こんにちは");
 }

}
```

インスタンスは情報と振る舞いを持っていると言いましたが、
情報にあたるものをインスタンスフィールド、
振る舞いにあたるのがインスタンスメソッドと言います。

インスタンスの振る舞いはメソッドで表現します。
これをインスタンスメソッドと言います。
public 戻り値の型 メソッド名();で表します。
インスタンスメソッドはクラスに定義しますが、インスタンスに属します。
なので、呼ぶ時はインスタンスに対して呼び出します。

インスタンスフィールドは情報を格納しておく変数です。
変数はクラスの一番上に置きます。
そして、public データ型 変数と置きます。

これもインスタンスに属することを忘れないようにして下さい。

```Java:Main.java
class Main {
 public static void main(String[]args) {
  Person person1 = new Person();
  person1.hello();
  person1.name = "Krith";
  System.out.println(person1.name);

  Person person2 = new Person();
  person2.hello();
  person2.name = "Kate";
  System.out.println(person2.name);
 }
}
```

```Java:Person.java
class Person {
 public String name;

 public void hello() {
  System.out.println("こんにちは");
 }
}
```
メソッド内でインスタンスフィールドにアクセルするときはthisを使います。
これはインスタンスの示すモノになります。

#コンストラクタ

コンストラクタとはnewを使ってインスタンスを実行した時に
自動で呼び出される特別なメソッドです。ルールが2つあります。
① メソッド名(大文字)とクラス名を同じにする。
② 戻り値を使わない。

そして、インスタンスを生成する時に引数にセットしましょう。
その引数はコンストラクタでも使えます。
また、thisでも使えるようにしましょう。

```Java:Main.java
class Main {
 public static void main(String[]args) {
  Person person1 = new Person("Kate");
  person1.hello();

  Person person2 = new Person("John");
  person2.hello();
 }
}
```

```Java:Person.java
class Person {
 public String name;
 
 Person (String name) {
  this.name = name;
 }

 public void hello() {
  System.out.println("こんにちは、私は" + this.name + "です");
 }
}
```

#最後に

初心者ですので、拙い文章や書き方だと思いますが、最後まで見て頂き
ありがとうございました。もし、ご指摘等がございましたらよろしくお願い致します。
PHP 多重連想配列のソート

Every Qiita #9
のんびり独学初学者の毎日投稿チャレンジ 9日目
今回は・・・
PHPでの多重連想配列の並べ替えに関しての備忘録です。

###asort関数を使ってみる
"num"のキーを昇順に揃えていきたいと思います。

```php
$arrs = [
    ["fruit" => "apple" ,"num" => 1 ],
    ["fruit" => "banana" ,"num" => 3 ],
    ["fruit" => "melon" ,"num" => 5 ],
    ["fruit" => "orange" ,"num" => 4 ],
    ["fruit" => "peach" ,"num" => 2 ],
];
asort($arrs);//返り値はbool
foreach ($arrs as $value) {
    echo $value["num"].$value["fruit"];
}
```
####結果
asortで昇順にしたので見てみましょう。

```
1apple
3banana
5melon
4orange
2peach
```
***あれ？・・・どうやら配列の最初の値が対象になるみたいです。***
"fruit"の値がローマ字昇順でソートされているみたいですね。

###"num"のキーを対象にしたい
配列の最初のキーをnumにしてみます。

```php5
$replace_arrs=[];
foreach ($arrs as $key => $value) {
    $replace_arrs[] = array_reverse($arrs[$key]);
}
```
多重連想配列なので上記でforeach文で1つずつarray_reverse関数を実行します。

####結果
```php
// output
[
    ["num" => 1, "fruit" => "apple"],
    ["num" => 3, "fruit" => "banana"],
    ["num" => 5, "fruit" => "melon"],
    ["num" => 4, "fruit" => "orange"],
    ["num" => 2, "fruit" => "peach"],
]
```
できました！
あとはasort関数を再度実行します。

###asort関数を使ってみるリターンズ
```php5
asort($replace_arrs);
```
####結果・・・
```
1apple
2peach
3banana
4orange
5melon
```
***できました！***
多重連想配列の場合は、

1. ソートしたい値を配列の最初に配置
1. 任意のソート関数を使う

これで行けそうですねー。

```php
//多重連想配列
$arrs = [
    ["fruit" => "apple" ,"num" => 1 ],
    ["fruit" => "banana" ,"num" => 3 ],
    ["fruit" => "melon" ,"num" => 5 ],
    ["fruit" => "orange" ,"num" => 4 ],
    ["fruit" => "peach" ,"num" => 2 ],
];
//numとfruitを入れ替える
$replace_arrs=[];
foreach ($arrs as $key => $value) {
    $replace_arrs[] = array_reverse($arrs[$key]);
}
//numを基準に昇順ソート
asort($replace_arrs);

foreach ($replace_arrs as $value) {
    echo $value["num"].$value["fruit"]."<br>";
}
```
リモートホストのファイルをvscode上で編集する

## rmateのインストール
```bash
wget -O /usr/bin/rmate https://raw.github.com/aurora/rmate/master/rmate
chmod a+x /usr/bin/rmate
firewall-cmd --add-port=52698/tcp
firewall-cmd --permanent --add-port=52698/tcp
firewall-cmd --reload
```

## sshコンフィグの編集

```bash
Host hoge
  HostName hoge.jp //EC2インスタンスのグローバルIP
  User ec2-user
  IdentityFile ~/hoge //秘密鍵が置かれているところ
  IdentitiesOnly yes
  ForwardAgent yes
  RemoteForward 52698 127.0.0.1:52698
```
AWS Certified Developer - Associate 合格しました

先日、AWS認定デベロッパーアソシエイトの試験を受験し、合格しました！
その記録を残しておきます。

AWSを触り始めてから2年ぐらいです。最初にアソシエイト1つ取り、そのあとに専門知識を3つを取っていました。専門知識からアソシエイトに戻り、今回はデベロッパーアソシエイトの受験でした。

AWS認定試験の履歴 (リンクは合格体験記)

- 2019年9月 AWS Certified Solutions Architect - Associate
- 2019年10月 [AWS Certified Big Data - Specialty](https://qiita.com/suzuki-navi/items/8b2fe5a35a4439013461)
- 2019年11月 [AWS Certified Machine Learning – Specialty](https://qiita.com/suzuki-navi/items/3664bfbc102052717426)
- 2020年10月 [AWS Certified Database - Specialty](https://qiita.com/suzuki-navi/items/59f8a4a94ad9a22dd569)
- 2021年7月 AWS Certified Developer - Associate (今回)

合格はしたものの、今回はその過程で反省がありました。

# 勉強方法

Udemyの模擬試験を買って勉強しました。5回分の模擬試験が含まれてます。

1回目は勉強なしでやってみて正答率5割ぐらいで、そこから問題内容を見直して1つずつ理解するようにしました。それを2回目、3回目まで繰り返しましたが、あまり正答率が上がらず、凹んでました。

模擬試験で進捗を実感できなかったため、4月終わりごろにこの試験を受けると決めてから、試験を申し込むまでずるずると2か月も経過。そして、時間もないので観念してダメ元で申し込んでから、模擬試験の4回目をやりましたが、正答率6割ぐらい。もう落ちてもいいかと気を楽にして勉強に時間を充てるのをやめました。

# 試験当日

オンライン試験はいろいろ面倒そうなので、試験会場での試験を申し込んでました。

65問130分ですが、ゆっくりやって1時間ぐらいで終わりました。

模擬試験よりもずっと難易度が低く、問題を解いている最中から後悔していました。受験までに勉強時間をかけすぎという後悔です。模擬試験の結果に惑わされずにさっさと受験すればよかったです。

いつも活用している「見直しフラグ」も1回も使いませんでした。全部解き終わった後、時間に余裕があったので、いちおう1問目に戻って見直しを始めたのですが、意味がないと思って終了にしました。わからない問題もありましたが、見直すほどではありませんでした。

# 結果

スコア916（合格ライン720）。いままでのAWSの受験履歴の中で最高得点でした。

# 反省

Udemyの模擬試験を最初にやってみて、Elastic Beanstalkなど触ったことのないサービスが出題範囲にあるということは把握でき、概要を理解するきっかけにはなりました。

ただ、模擬試験の成績に惑わされずにとりあえず受験すべきでした。

試験時間中から集中力を欠いていたので、もうどんな問題だったか忘れましたが、たぶん以下のあたりのサービスが登場してたんじゃないかと思います。

- RDS
- DynamoDB
- S3
- Elastic Beanstalk
- CloudFormation
- CodeDeploy
- CodeBuild
- CodePipeline
- CloudFront
- API Gateway
- Lambda
- CloudWatch
- VPC
- IAM
残プロ　第-40回　~今週のまとめ~

#　各回のまとめ

[第-34回](https://qiita.com/R1nY1x1/items/ab0e61ebfd8461a2ecac) subprocessモジュールで外部コマンド実行
[第-35回](https://qiita.com/R1nY1x1/items/d2abf5a398392ef81d71) キャリッジリターン
[第-36回](https://qiita.com/R1nY1x1/items/086e01d2267a4596b58f) HTML中でに複数行に分けて文字列
[第-37回](https://qiita.com/R1nY1x1/items/a1ffba791f74987a868d) 画像のAA化
[第-38回](https://qiita.com/R1nY1x1/items/52cda53cefd3a7471905) ANSIエスケープシーケンスでコンソールにAA動画表示
[第-39回](https://qiita.com/R1nY1x1/items/2e072d4d31209f59381c) コンソール簡易タスクマネージャ
ただただdockerでLinuxと戯れてみたい

# Dockerを使ってLinuxと戯れたい
※自分用の備忘録です
virtualboxを使ってubuntuを入れてみようかと思いましたが、新しくvirtualboxを入れるのもなぁ...
前に少し勉強したdockerがmacにはインストール済みなので、こちらでlinuxをさわれば良いのではないかと。
dockerでlinux環境を作ってdockerで入れたlinuxにnginxとかを入れるのってそのままnginxを入れるのか。
それとも仮想linuxにnginxを入れた方がよいのかの良し悪しは不明。

## dockerのバージョン
Docker version 20.10.6, build 370c289

## Ubuntuの実行
```terminal
#docker pull ubuntu →runコマンドにてプルまで実行してくれるため省略
docker run ubuntu
```

## コンテナの起動
```
#コンテナ名がmylinuxで作成
docker run -it -d --name mylinux ubuntu
```

## ubuntuの操作
```
docker exec -it mylinux /bin/bash
```

## ubuntuの画面
```
root@XXXXXXXXXXXX:/# 
```

## 戯れる
パッケージが最小限？しかないようなのでupdateして入れたいものをインストールしていく

```
root@XXXXXXXXXXXX:/# apt update
root@XXXXXXXXXXXX:/#　apt install vim ...
```

## 抜け出す
```
exit
```

## コンテナの停止
```
docker stop mylinux
```

## コンテナの起動
```
docker start mylinux
```
[PostgreSQL] UPDATE で注意すること


仕事でUPDATE文を書いた際にミスをしたので忘れないように備忘録。
初歩的な内容だと思います。

### 前提

以下のようなテーブル定義とデータがあったとする

```sql
CREATE TABLE companies(
  id bigint primary key, 
  name varchar(50) NOT NULL,
  tel varchar(50)
);

CREATE TABLE employees(
  id bigint primary key, 
  company_id bigint,
  name varchar(50) NOT NULL,
  age integer,
  department varchar(50),
  FOREIGN KEY (company_id) references companies(id)
);

INSERT INTO public.companies(id, name, tel)
VALUES 
    (1, '株式会社ほげ', '00-0000-0000'),
    (2, '株式会社ふが', '00-0000-1111'),
    (3, '株式会社ぴよ', '00-0000-2222');


INSERT INTO public.employees(id, company_id, name, age, department)
VALUES 
    (1, 1, 'テスト太郎', 25, '人事部'),
    (2, 1, 'テスト次郎', 20, '営業部'),
    (3, 2, 'テスト三郎', 30, '人事部'),
    (4, null, 'テスト五郎', 40, '営業部');
```

### やりたいこと

Companiesテーブルの `name` = `株式会社ほげ` に一致するものを対象に、
Emoloyeesテーブルの `department` = `人事部` に一致するものを `人事採用部` に変える

employeesのid:1のレコードだけが書き換わる想定。

※他テーブルとJOINしたい例なので、例題がおかしいことは気にしない。

### だめな例

```sql
UPDATE employees
SET department = '人事採用部'
FROM employees e
JOIN companies c ON c.id = e.company_id
WHERE c.name = '株式会社ほげ' AND e.department = '人事部'
```

結果

| id | company_id | name       | age | department |
|----|------------|------------|-----|------------|
|  1 |          1 | テスト太郎 |  25 | 人事採用部 |
|  2 |          1 | テスト次郎 |  20 | 人事採用部 |
|  3 |          2 | テスト三郎 |  30 | 人事採用部 |
|  4 |            | テスト五郎 |  40 | 人事採用部 |

すべてのレコードが書き換わってしまう。

### なぜか？

postgresのドキュメントより引用

> FROM句が存在する場合、基本的に、対象テーブルとfrom_itemリストで指定されたテーブルが結合され、この結合の出力行が対象テーブルの更新操作の結果となります。 FROM句を使用する場合、更新対象テーブルの1行に対して、結合 結果が複数行にならないように注意してください。 言い換えると、対象テーブルの個々の行は、他テーブルの複数の行と結合すべきではありません。 結合結果が複数行になった場合、対象行の更新には結合結果のいずれか1行のみが使用.されますが、どの行が使用されるかは簡単には予測できません。

UPDATE で指定した `employees` と　FROM で指定した `employees` が結合してしまうのが原因。
UPDATE の `employees` には何も条件が付与されていないため、全レコード取得して更新を行ってしまう。

### どう書くべきか


#### 1. UPDATEとFROMのテーブルに条件を追加する

```sql
UPDATE employees e1
SET department = '人事採用部'
FROM employees e2
JOIN companies c ON c.id = e2.company_id
WHERE e1.id = e2.id  AND c.name = '株式会社ほげ' AND e2.department = '人事部'
```

#### 2. FROMに結合したいテーブルを定義する

JOINを使わない方法。
こちらのほうがスマートだと思われる。

```sql
UPDATE employees e
SET department = '人事採用部'
FROM companies c 
WHERE e.company_id = c.id  AND c.name = '株式会社ほげ' AND e.department = '人事部'
```

### 参照

- [PostgreSQL 12.4文書 UPDATE](https://www.postgresql.jp/document/12/html/sql-update.html)
- [【PostgreSQL】JOINしたテーブルにUPDATE文を実行する際に気をつけること](https://chusotsu-program.com/%E3%80%90postgresql%E3%80%91join%E3%81%97%E3%81%9F%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%ABupdate%E6%96%87%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4/)
EC2一覧を見るためのShell関数 (aws-cliに依存)

# 利用方法

## コマンド入力

```sh
# そのままだとデフォルトプロファイルで一覧を取ってくる
show-ec2

# プロファイル名を第一引数に取れる
show-ec2 production
```

## 結果

```
-----------------------------------------------------------------------
|                          DescribeInstances                          |
+--------------+-----------------------+----------------+-------------+
|   no1_Name   |    no2_InstanceId     | no3_PrivateIp  |  no4_Type   |
+--------------+-----------------------+----------------+-------------+
|  Server-01   |  i-XXXXXXXXXXXXXXXXX  |  10.X.XX.XXX   |  t3.small   |
|  Server-02   |  i-XXXXXXXXXXXXXXXXX  |  10.X.XX.XXX   |  t3.small   |
|  Server-03   |  i-XXXXXXXXXXXXXXXXX  |  10.X.XX.XXX   |  t3a.xlarge |
|  Server-04   |  i-XXXXXXXXXXXXXXXXX  |  10.X.XX.XXX   |  t3.medium  |
|  Server-05   |  i-XXXXXXXXXXXXXXXXX  |  10.X.XX.XXX   |  t2.micro   |
|  Server-06   |  i-XXXXXXXXXXXXXXXXX  |  10.X.XX.XXX   |  t3.large   |
+--------------+-----------------------+----------------+-------------+
```

# やりたいこと

EC2の一覧がコンソール上でサッと確認できるようにしたかった

# 前提

- aws-cliがインストール済み
- プロファイルを設定済みで、`aws ec2 describe-instances`が使用できること
- Shell関数はbashとzshで動作確認済み

# 定義

.bashrcや.zshrcなどに下記のShell関数を定義する。

```sh
show-ec2 () {
  profile=$1
  if [ -z "$profile" ]; then
    profile="default"
  fi

  aws ec2 describe-instances \
      --profile $profile \
      --filter "Name=instance-state-name,Values=running" \
      --query "sort_by(Reservations[].Instances[].{no1_Name: Tags[?Key==\`Name\`].Value|[0] , no2_InstanceId: InstanceId, no3_PrivateIp: PrivateIpAddress, no4_Type: InstanceType}, &no1_Name)" \
      --output table
}
```

# 仕様

- 第一引数はaws configure等で設定したプロファイルを渡す。未入力の場合はデフォルトプロファイルを使用する。
- Nameタグ・インスタンスID・プライベートIP・インスタンスタイプを表示する
- Nameタグで昇順にソートする
- キー名に`no1_`のようなprefixをつけることでカラムのソートを実現している

# 参考

https://qiita.com/yut0201/items/543ada113790b10c8913
UE4の Pixel2D買ってみたよ (Part6) キャラクターのジャンプ！

reating 2D games with Unreal Engine using Pixel 2D - Part 6 - Jumping

https://www.youtube.com/watch?v=mtjcDyEUk7Q

#今回やること！
キャラクターにジャンプを実装

#変数の準備01:00)

![6.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/8ca7dbdc-348a-3d80-bc78-8eaaf7fd16d3.png)

#ジャンプはコレだけでできるよ
※さっきの変数も使わない
![6.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/a15a0abc-8360-b124-00dc-2de54df7d4f4.png)

まぁ見た目変わらないけどね。
![6.2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/5876b8be-c452-3c46-78c0-10001e92b9e6.gif)

#この後で必要なこと
1.キャラクターに状態の変数を用意しておく
2.Anime管理スクリプトにキャラクターの変数を取得する
・その値をもとにステータスと画像の切り替えを行う

#Animationの設定を調整するよ(07:15)

![6.4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/af2fc600-108b-8782-fbb9-fca0c24add8b.png)

#StatMachineを調整するよ(08:15)


![6.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/34e5e751-7ea5-9d23-b514-aace9e4af51e.png)

以前作ったステータスマシンに
1.Falling、Jumpの状態を追加し
2.画像を割り当てる(※1)
3.状態遷移を全部割り当てる


(※1)アニメーションFalling
![6.6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/a4567a6f-b7df-6971-9134-a4bcea106320.png)

こんな感じに線をつなげる

![6.7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/aad28a28-d1fb-2f90-d5dd-a11cf001197b.png)

状態を変える設定をする
![6.8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/d60881ca-5667-4ab1-c905-49c709f80a76.png)

上記のJumping→Fallingの時はこれを割り当ててあげればOK！
![6.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/986d5006-7177-c5d8-e185-e3c976d03d22.png)

#一度再生！(15:00)
![2021-07-11_22h24_47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/c4518732-ca44-cc5a-6eca-a6d8ebd1666d.gif)
ジャンプするけどアニメーションしっぱなしですやん・・・

#着地時の処理を追加(15:10)
![6.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/17923231-ff6e-978e-90a9-35cf8d46ee30.png)

#崖から落ちた時にアニメーションがおかしい。(17:00)

歩いた状態で崖から落ちると
落下アニメーションではなく、通常状態になってしまうので

さらにイベント追加

![6.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/619d8642-af49-75bc-75d8-c1bc27374772.png)

#完成！
再生したら問題なく動いているはず！
![2021-07-11_23h03_09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/98ed54f2-d0ed-06b5-75ab-10b266fb8978.gif)

次回は攻撃を作るよ
keytoolで自己証明書を作成する方法

「[OpenSSLで作成したPEM形式の証明書をJavaのkeytoolのキーストア（JKS）に変換する方法](https://qiita.com/yasushi-jp/items/89bd88e13949c73d0f16 "OpenSSLで作成したPEM形式の証明書をJavaのkeytoolのキーストア（JKS）に変換する方法")」では

+ `openssl genrsa -aes256 -passout pass:keypass -out key.pem 2048`
+ `openssl req -new -key key.pem -out csr.pem -subj "/C=JP/ST=KANAGAWA/L=YOKOHAMA/O=SAMPLE CORP/OU=DEV1/CN=yasushi.local" -passin pass:keypass`
+ `openssl x509 -req -in csr.pem -passin pass:keypass -out cert.pem -signkey key.pem -days 366 -sha256`
+ `openssl pkcs12 -export -in cert.pem -name test -inkey key.pem -passin pass:keypass -out keystore.p12 -passout pass:storepass`

のコマンドで自己証明書を作成し、PKCS12形式のキーストアに格納しました。

keytoolコマンドでは以下のコマンドで、同様に自己証明書を作成し、PKCS12形式のキーストアに格納することができます。

`keytool -genkeypair -alias <エイリアス名> -keyalg <鍵ペアのアルゴリズム> -keysize <鍵のサイズ> -sigalg <署名アルゴリズム> -dname <識別名> -validity <有効日数> -storetype <キーストアのタイプ> -keystore <キーストアのファイル名> -storepass <キーストアのパスワード>`

```console:実行結果
[root@CENTOS7 test3]# keytool -genkeypair -alias test -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -dname "cn=yasushi.local, ou=DEV1, o=SAMPLE CORP, l=YOKOHAMA, st=KANAGAWA, c=JP" -validity 366 -storetype PKCS12 -keystore keystore.p12 -storepass storepass
366日間有効な2,048ビットのRSAのキー・ペアと自己署名型証明書(SHA256withRSA)を生成しています
        ディレクトリ名: CN=yasushi.local, OU=DEV1, O=SAMPLE CORP, L=YOKOHAMA, ST=KANAGAWA, C=JP
[root@CENTOS7 test3]# ls -l
合計 4
-rw-r--r-- 1 root root 2587  7月 11 23:21 keystore.p12
[root@CENTOS7 test3]#
```

---

以上
schtasks.exe – コマンドを時刻指定して実行する

1日の業務の中で決まった時刻に特定のコマンドを実行したい場合には、タスクスケジューラで登録すると便利です。

# 手順と概略
Windowsではタスクスケジューラとして **schtasks.exe** が用意されているので、
1. 実行したいコマンドをシェルスクリプトとして作成
1. 1.のファイルを `schtasks.exe` を実行する `schtasks` コマンドにてスケジュール登録

という手順で設定します。
## 1. シェルスクリプト
まずは実行したいコマンドをシェルファイルとして作成しておきます。

例えば、任意のURLを開くコマンドを実行したいとして下記のように組んで保存します。

```bash
#! /bin/sh
start https://google.com
```
便宜上、 `daily.sh`というファイル名でホームディレクトリ（ `C:\Users\ユーザ名`)にでも保存しておきます。
## 2. `schtasks` コマンド
次にpowershellかコマンドプロンプトで、上記の `daily.sh` を指定してスケジュール登録します。

```bash
schtasks /create /tn "MyTask" /tr c:\Users\ユーザ名\daily.sh /sc weekly /d mon,tue,wed,thu,fri /st 18:00
```
### 設定の解説
|オプション|説明|この場合の設定値|
|-|-|-|
|`/tn`|任意のタスク名|"MyTask"|
|`/tr`|実行したいタスクのファイルパス|c:\Users\ユーザ名\daily.sh|
|`/sc`|スケジュールのタイプ|週次|
|`/d`|実行する日のタイプ|(月)(火)(水)(木)(金)|
|`/st`|実行する時刻|18:00|

上記を含む `schtasks` コマンドのオプションについては [Microsoftの公式ドキュメント](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/schtasks)に詳細が書かれています。

---
この一連のコマンドは **毎平日に定時になったら実行することを忘れたくないコマンド** を登録しておくイメージです。

こういう些細な作業こそ、ガシガシ自動化しちゃいましょう！
constexprの読み方

# まとめ

コードを読んでいても発音が分かりません。
発音できないのが気持ち悪いので頑張って調べてみました。

英語のビデオを見る限りは「こんすとえくすぷろ」が圧倒的に多いです。
これは間違いなさそうです。

いくつかの情報（記事内参照）によると日本語的には「こんすとえくすぷれっしょん」~~なのかもしれません~~でまとまっているようです。
**~~とにかく日本語でしゃべっている動画をみつけられません。~~何か知っている方教えてください。**

**20210926追記。**独断と偏見によるまとめです。charと似たような状況っぽいです。
**20210927追記。**指摘を頂いて更新。さすがに偏ってました。両論併記にしました。

||constexpr|char(比較対象)|
|---|---|---|
|日本語|[こんすとえくすぷれっしょん](https://qiita.com/h1day/items/fb3738737731d5b17ed5#20210926%E8%BF%BD%E8%A8%98-boost%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%81%A7%E3%81%AEconstexpr-%E3%83%A9%E3%83%A0%E3%83%80%E3%81%AE%E8%AA%AC%E6%98%8E%E3%82%84%E3%81%A3%E3%81%A8%E5%8B%95%E7%94%BB%E3%81%BF%E3%81%A4%E3%81%91%E3%81%BE%E3%81%97%E3%81%9F%E8%A9%B1%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%E9%AB%98%E6%A9%8B%E6%99%B6%E3%81%95%E3%82%93)<br>こんすとえくすぱー|[きゃら](https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=10483&forum=3)<br>[ちゃー](https://paiza.hatenablog.com/entry/2018/10/23/char%E3%81%AF%E3%83%81%E3%83%A3%E3%83%BC%EF%BC%9F%E3%82%AD%E3%83%A3%E3%83%A9%EF%BC%9F%E8%AA%AD%E3%81%BF%E6%96%B9%E3%81%AB%E8%BF%B7%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)|
|英語|[こんすとえくすぱー](https://qiita.com/h1day/items/fb3738737731d5b17ed5#20210919%E8%BF%BD%E8%A8%98-bjarne-stroustrup-%E3%81%95%E3%82%93%E3%81%8C%E3%81%97%E3%82%83%E3%81%B9%E3%81%A3%E3%81%A6%E3%82%8B%E3%81%AE%E8%A6%8B%E3%81%A4%E3%81%91%E3%81%BE%E3%81%97%E3%81%9F)|[ちゃー](https://qiita.com/yumetodo/items/2f2d95e8fabd78a5d0c8#%E4%BD%99%E8%AB%87)|

注）ただし、[1人のときは好きに読む。他の人と話すときは相手に合わせる。](https://wa3.i-3-i.info/word18517.html)

## こんすとえくすぷろ/こんすとえくすぱー　

「こんすとえくすぷろぁ」とか「こんすとえくすぷろ」とか「こんすとえくすぱー」とか言っているように聞こえます。

https://www.youtube.com/watch?v=F521mw7p7NA

https://www.youtube.com/watch?v=XV1lXtB3sqg&t=118s

https://www.youtube.com/watch?v=cuFILbHp-RA

https://www.youtube.com/watch?v=fZjYCQ8dzTc

https://www.youtube.com/watch?v=Dpob2KsYLWs

https://www.youtube.com/watch?v=cC9MtflQ_nI

https://isocpp.org/blog/tag/constexpr

https://www.youtube.com/watch?v=WZYKzCsACiw

↓constexprの発音は「コンストエクスプロォァ〜」が国際標準らしい。

https://hkoie.livedoor.blog/tag/C++

##### 20210919追記 Bjarne Stroustrup さんがしゃべってるの見つけました。

https://youtu.be/CxiCAZuDg7s?t=3177

https://youtu.be/u_ij0YNkFUs?t=3395

## こんすたんとえくすぷれっしょんず

このパターンの動画もありますが、少ないです。

https://www.youtube.com/watch?v=frifFlPO_uI

https://www.youtube.com/watch?v=4Vnd2I91s2c

## こんすとえくすぷれっしょん

見つけられたのが2012/2013とC++11が出た直後なのが気になりますが、日本ではコンストエクスプレッション派が多いらしいです。しかし発音している動画は見つけられませんでした。

https://togetter.com/li/590259?page=8

https://www.wdic.org/w/TECH/constexpr

http://shinh.skr.jp/yomikata/

##### 20210922追記 あの”狂える中3女子ボレロ村上”さんのインタビュー記事に記載がありました。日本語的には「こんすとえくすぷれっしょん」で良さそうです。

https://xtech.nikkei.com/atcl/nxt/mag/sys/18/031600005/032300001/

##### 20210926追記 Boost勉強会でのConstexpr ラムダの説明。やっと動画みつけました。話しているのは[高橋晶](https://faithandbrave.github.io/profile.html)さん。

https://youtu.be/hsgThXd-5Ac?t=870

## こんすと いーえっくすぴーあーる

このような派閥もあり。

https://kaworu.jpn.org/cpp/constexpr

http://gcraud.blog.jp/archives/42508770.html
【axios】非同期処理の実装を試してみる

# はじめに

『あべちゃんのフロントエンド塾』[【React入門】#7 axiosを用いたHTTP通信の実装](https://youtu.be/tPK0nDpnu98)を見て`axios`について学んだので、その内容をかいつまんでアウトプットし、まとめていこうと思います。

# axiosとは

【公式】
> ブラウザやnode.js上で動くpromiseベースのHTTPクライアント

　
axiosを使うことで、容易に非同期的なHTTP通信を実装できます。


# axiosのinstall
axiosを使用するために、`yarn add axios`でaxiosをインストールします。

# semantic-ui CDNの導入
https://cdnjs.com/libraries/semantic-ui

こちら↑↑のページより

```
https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css
```

上記コードをコピーして、`public`フォルダの`index.html`ヘッド内に

```
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" />
```

のように貼り付けます。

# baseURLの作成

```jsonplaceholder.js
import axios from 'axios'

export default axios.create({
  baseURL: 'https://jsonplaceholder.typicode.com',
})
```
このあと、`async` `await`を用いた非同期通信をするのですが、その際[JSONPlaceholder](https://jsonplaceholder.typicode.com/)からデータを取得します。

こちらの`jsonplaceholder.js`コンポーネントを`APP.js`コンポーネントにimportして使用するのですが、そのとき、

```
jsonplaceholder.get('/取得したいデータがある場所')
```

のように記述することで、[JSONPlaceholder](https://jsonplaceholder.typicode.com/)の中の`/posts`という場所からデータを引っ張ってくることができます。

この`jsonplaceholder.js`でやっていることは、`/posts`の前にある`https://jsonplaceholder.typicode.com`というURLは、基本一緒なので`baseURL`として定義してしまおう、そしてその他の場所でこのファイルをimportとして`jsonplaceholder`として使いやすくしてしまおう、ということをやっているわけです。

# JSONPlaceholderからデータを取得

```App.js
import React,{useState} from 'react'
import jsonplaceholder from './apis/jsonplaceholder';
import Button from './components/Button'
import Resources from './components/Resources'

const App = () => {
  const [resources, setResources] = useState([]);

  const getPosts = async() => {
    try{
      const posts = await jsonplaceholder.get('/posts')
      setResources(posts.data)
    }catch(err){
      console.log(err)
    }
  }

  const getAlbums = async() => {
    try{
      const albums = await jsonplaceholder.get('/albums')
      setResources(albums.data)
    }catch(err){
      console.log(err)
    }
  }

  return (
    <div className="ui container" style={{marginTop: "30px"}}>
      <Button text={"posts"} color={"primary"} onClick={getPosts}/>
      <Button text={"albums"} color={"red"} onClick={getAlbums}/>
      <Resources resources={resources}/>
    </div>
  )
}

export default App
```
さきほどの、`jsonplacehodler.js`で作った`baseURL`のあとに`/posts`を付けることで、[JSONPlaceholder](https://jsonplaceholder.typicode.com/)の中の`posts`からデータを取りますよ、という記述をこの部分では表現しています。

### 非同期通信
`async` `await`を使う際は、`try catch構文`を使います。
`try`の中では、`getPosts()`という関数が正常に動いている際の処理を、`catch`の中にはエラーが発生した際に、それをconsoleに表示するコードを記述します。


# まとめ
`axios` `async` `await`を用いて、非同期通信処理をする方法を学んでみました。

`try catch構文`などの書き方も学べたので、実際に外部APIを叩くような処理を書いて試してみたいと思います。

非同期通信をする際は、データを取得する際に**"その処理が終わるまで待つ"**という`await`を使わないと、データ取得の前に処理が終わってしまって、思ったような結果が得られなくなってしまいます。

外部APIを叩くようなアプリを作れることは、フロントエンドエンジニアとして働く上で、とても重要になってくるようなので、しっかり使いこなせるように頑張ります。
MLPベース画像認識モデル(1)[MLP-Mixer]

# はじめに
最近、MLPベースの画像認識がVision業界を騒がせているのはご存知でしょうか？
2020年の終わりからViT[1]をきっかけに、Vision界にTransformerが本格的に流入してきました。しかし、Self-Attentionの計算コストが高い(2次)ということもあって、その問題を対処する研究も多く進められていました。そんな中、Google Brainのチームによる論文『MLP-Mixer: An all-MLP Architecture for Vision』[2]が発表されました。その内容は、ニューラルネットワークの基礎中の基礎であるMLPと転置などのテンソル形状の変更、正規化だけを使用したアーキテクチャで、ViTに対抗できるようなモデルが作れたいう衝撃的なものでした。

この記事では、MLP-Mixerがどのような構造についての解説を簡単にしたいと思います。続編以降で、MLP-Mixerの仲間たちのアイデアについても紹介していきたいと思います。間違いや質問などがございましたら遠慮なくコメントを頂ければ幸いです。

# MLP-Mixer

## アイデア

MLP-MixerはViT同様、16x16のようなパッチ分割をします(ViTについてご存じない方は例えば[こちらの記事](https://qiita.com/omiita/items/0049ade809c4817670d7)を御覧ください)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630841/429f58e6-16cc-b959-89df-29ee95732427.png)

分割したパッチに対して、MLPを使用した以下の操作を、繰り返しを行うアイデアです。

1. 同じ空間の特徴間の関係
1. 異なる空間位置の特徴の関係

CNNでは1x1Conv.が1を、3x3Conv.などが1,2の両方を担っており。TransformerではSelf-Attentionが1,2の両方を担っていました。MLP-Mixerの枠組みでは1にはchannel-mixing block、2にはtoken-mixing blockという名前がついております。2つのブロックに入力する前に、関係を捉える次元を切り替える必要があります。それは転置によって実現しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630841/d9ecb10f-c857-a872-fc75-1bd1ecb50f7b.png)

どちらのブロックもMLPによって構成されており、それ以外の構成要素としてはGELU, 残差接続, Layer Normalizationが使われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630841/d194c26d-a67e-c20d-cca9-442ec2400502.png)

Mixer-B/16というモデルではこれらのモジュールが12回繰り返され、グローバルアベレージプーリングの後に、1000クラスの分類器に入力するだけ、という大変シンプルなモデルです。

## 実験結果の一部

実験では、ViTとImageNet, ImageNet-21k, JFT-300Mのデータセットを使用して事前学習の精度が比較されています。ViTよりも精度は少し落ちるものの、MLPだけでこの精度が叩き出せるとは驚くべきことですね。また、ViTに比べて計算コストが低いこともスループットやTPUv3 core-daysの結果からもわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630841/21219046-8aba-a42d-7f62-7c633cd27fea.png)

論文ではファインチューニングの実験もされていますが、ここでは割愛します。

# 筆者コメント
筆者自身もPyTorchで実装してみましたが、容易に実装することができました。CIFAR10で学習を試しましたが、高々10分程度の学習でも、90%近い精度を叩き出すことができて、正直驚いています。現状ではImageNetあたりの量や解像度ではさすがに学習はさすがに辛いです。リソースがないと辛いですし、実際筆者がImageNetで学習させてみても、label smoothingやら、CutMix, MixUpなどいろいろやって初めてまともに学習できます。筆者自身は生成モデルについての研究もしているので、生成モデルにもMLPベースの画像認識モデルの知見を取り込んで行けたらいいなと思っています。

# おわりに
MLP-Mixerを始めとする、MLPベース画像認識モデルはCNNやTransformerに比べたら、まだ性能やあるいは学習速度、パラメータ数など課題が盛りだくさんですが、シンプルゆえに今後の発展が望まれます。CNNが過去の遺物になる時代もくるかもしれませんね。MLPベースのアイデアは他のチームも研究していたようで、この論文が公開された直後に、近いアイデアの論文が公開されております。続編ではその１つであるResMLP[4]について取り上げられたらと思います。

# 参考文献
[1] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale, Alexey Dosovitskiy et al., 2020, https://arxiv.org/abs/2010.11929
[2] MLP-Mixer: An all-MLP Architecture for Vision, Ilya Tolstikhin et al., 2021, https://arxiv.org/abs/2101.07172 
[3] 画像認識の大革命。AI界で話題爆発中の「Vision Transformer」を解説！, https://qiita.com/omiita/items/0049ade809c4817670d7
[4] ResMLP: Feedforward networks for image classification with data-efficient training, Hugo Touvron et al., 2021, https://arxiv.org/abs/2105.03404
PDOについて(備忘録)


備忘録的なやつ,RDBMSはmysqlを想定

<h4>■レコード取得</h4>

```php

<?php

$hostname = '(DBサーバ ex.localhost)';
$username = '(ユーザ名)';
$password = '(パスワード)';
$dbname = '(Database名)';
$dsn = "mysql:host={$hostname}; dbname={$dbname}";
$tablename = '(テーブル名)';
$sql = "(SQL文)"; 

try {
    //$dbhはデータベースハンドラの略
    $dbh = new PDO($dsn, $username, $password);
    echo "接続成功\n";
    
    //①アロー演算子でqueryメソッドでの戻り値を$dataに格納
    $data = $dbh -> query($sql);
    //②アロー演算子でfetchAllメソッドでの戻り値（配列にしたもの）を$resultに格納 
    $result = $data -> fetchAll(PDO::FETCH_ASSOC);
    print_r($result);

} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage() . "\n";
    exit();
}

?>
```
フェッチモード（配列の形式）について
https://blog.senseshare.jp/fetch-mode.html


<h4>■レコード更新</h4>
```php
<?php
//PDO
$hostname = '(DBサーバ ex.localhost)';
$username = '(ユーザ名)';
$password = '(パスワード)';
$dbname = '(Database名)';
$dsn = "mysql:host={$hostname}; dbname={$dbname}";
$tablename = '(テーブル名)';
$sql = "(SQL文)";  
try {
    $dbh = new PDO($dsn, $username, $password);
    echo "接続成功\n";
    //execメソッドでSQL文を実行
    $dbh -> exec($sql);
    $dbh = null;

} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage() . "\n";
    exit();
}
?>
```

prepareメソッドの利用
prepareメソッドを利用する事でSQL文に引数をセットできる。
https://www.javadrive.jp/php/pdo/index8.html
GPSモジュールの使い方

# GPSとは？
### GPSについて
　GPSとは、Global Positioning Systemの略称です。日本語では「全地球測位システム」とも訳されます。簡単に説明すると、アメリカが開発した衛星測位システムで、人工衛星から発せられた電波を受信し、位置・距離・時刻などを計算して、現在位置を測位する技術です。

https://join.biglobe.ne.jp/mobile/sim/gurashi/about_gps/

### GNSSについて
　GNSSとは、Global Navigation Satellite Systemの略称です。まず、人工衛星にとって地上の現在位置を決定する「衛星測位システム」をNSSと呼び、その中で地球全てを測位可能なものをGNSSと分類します（ちなみに特定地域が測位可能なものをRNSSと分類）。GPSはアメリカが開発したGNSSの一つです。

https://www.risuisha.co.jp/faq/95


# 実測
## 使用したGPSモジュール
- GPS ＆ GLONASS Receiver (G-Mouse)
- https://akizukidenshi.com/catalog/g/gM-12905/
- ESP32に接続している状態
<img width="302" alt="iOS の画像 (3).jpg (758.7 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/07/06/90646/c471f84d-ae1a-4088-88e8-24b6cba800e9.jpg">

- 接続方式：UART

### UARTとは
　UARTはUniversal Asynchronous Receiver Transmitter（汎用非同期式送受信機）の頭文字で、「ユーアート」と読みます。
　UARTは単純な仕組みゆえに開発コストが低く、安価な電化製品の普及やIoTの導入と共に、コスト重視の組み込み機器の多くに搭載されるようになりました。UARTの特徴のひとつとして、名前の通り「非同期」のシリアル通信であることが挙げられます。つまり，I2CやSPIのような同期をとるためのクロック配線を用いたクロック信号の必要がなくなるということになります。さらに、UARTは2本のデータ配線によって、マスター/スレーブの関係ではない双方向の通信が可能となっています。

## プログラムコード
```gps_data.py
from machine import UART
from machine import Pin
import math
import urequests
import ujson


URTN = 1
BPS = 9600
RXPIN = 3
TXPIN = 1
p3 = Pin(3,Pin.IN,Pin.PULL_UP)
#p1 = Pin(1,Pin.IN,Pin.PULL_UP)
#uart = UART(URTN,BPS)
uart.init(9600, bits=8, parity=None, stop=1, tx=TXPIN, rx=RXPIN)

print(uart.any())

for n in range(uart.any()):
    sp = uart.readline()
    sp = str(sp)
    sp = sp.split(',')
    #print(sp)
    gps_latitude = list()
    if sp[0][3:8] == 'GNGLL':
        count = 1
        while count <= 2:
            if count == 1:
                #print(sp[count])
                logger_latitude = float(sp[count])
                decimal, integer = math.modf(logger_latitude/100.0)
                gps_latitude.append(integer + decimal / 60.0 * 100.0)
            else:
                #print(sp[count])
                count = 3
                logger_latitude = float(sp[count])
                decimal, integer = math.modf(logger_latitude/100.0)
                gps_latitude.append(integer + decimal / 60.0 * 100.0)
            count += 1
        print('gps_latitude : ', gps_latitude[0] , ' , ' , gps_latitude[1])
```

## 実行結果
<img width="266.5" alt="キャプチャ.PNG (12.6 kB)" src="https://img.esa.io/uploads/production/attachments/12882/2021/07/06/90646/31f309b4-fee0-4025-8c01-4e84e996ede9.PNG">

240はブロックなしで読み込める文字数です。
gps_latitudeはRaw dataをフィルタリングして導きだした現在地の緯度と経度になります。
【Svelte】Svelte公式チュートリアルでvue.jsとの類似点のまとめ(1.Introduction) 

昨今流行りのSvelteのチュートリアルを触ってみたのですが、vue.ｊｓと類似点が多かったのでまとめてみます。
svelteのチュートリアルで書かれているsvelteのソースをvue.jsでかいたらどうなるのか作ってみました。


# Introduction
## Basic
まずは基本の書き方。
この時点ですでにコードの量が違います。

``` App.svelte
<h1>Hello world!</h1>
```

```App.vue
<template>
  <h1>Hello world!</h1>
</template>
```


## Adding data
データの入れ方。
svelteは変数で宣言できるのに対して
vueはdataの関数を用意しこの時点でソース量に差が出てきています。

```App.svelte
<script>
	let name = 'world';
</script>

<h1>Hello {name}!</h1>
```

```App.vue
<template>
  <h1>Hello {{ name }}!</h1>
</template>

<script>
export default {
  data() {
    return {
      name: "world",
    };
  },
};
</script>
```


## Dynamic attributes
画像の入れ方`src={src}`は変数と属性が同じなら省略ができます。
また、svelteではデフォルトでaltタグがなければ警告が出るようになっています。
vueは`v-bind`を使って表示させます。

```App.svelte
<script>
	let src = 'tutorial/image.gif';
</script>

<img {src} alt="A man dances.">
```

```App.vue
<template>
  <img v-bind:src="src" alt="A man dances.">
</template>

<script>
export default {
  data() {
    return {
      src: 'tutorial/image.gif'
    };
  },
};
</script>
```

## Styling
cssはどちらも同じく`<style>`タグでかきます。
vueは下に書きことが多くsvelteは上に書くことがおおいのでしょうか？

```App.svelte
<style>
	p {
		color: purple;
		font-family: 'Comic Sans MS', cursive;
		font-size: 2em;
	}
</style>

<p>This is a paragraph.</p>
```

```App.vue
<template>
  <p>This is a paragraph.</p>
</template>

<style>
	p {
		color: purple;
		font-family: 'Comic Sans MS', cursive;
		font-size: 2em;
	}
</style>
```

## Nested compornent
svelteではimportすればそのまま使える。
vueはimportしたら一度componentsで設定してから使う。(Nuxtではそのまま使える設定ができる)
vueはtemplateのなかでは同じ階層のタグは1つだけでしたので親要素にぐるっとタグを囲っていましたが、
svelteは複数のタグを同じ階層で使えるようです。(vue3ではこのへんが対応しています)

```App.svelte
<script>
	import Nested from './Nested.svelte';
</script>

<p>This is a paragraph.</p>
<Nested/>

<style>
	p {
		color: purple;
		font-family: 'Comic Sans MS', cursive;
		font-size: 2em;
	}
</style>
```

```Nested.svelte
<p>This is another paragraph.</p>
```

```App.vue
<template>
  <div>
    <p>This is a paragraph.</p>
    <Nested />
  </div>
</template>

<script>
import Nested from '~/components/Nested.vue'
export default {
  components: {
    Nested
  }
}
</script>

<style>
    p {
        color: purple;
        font-family: 'Comic Sans MS', cursive;
        font-size: 2em;
    }
</style>
```

```Nasted.vue
<template>
  <p>This is another paragraph.</p>
</template>
```

## HTML tags
 HTMLを表示するやり方です。
svelteのほうは`{}`内に`@html`と書けばHTMLを直接レンダリングしてくれます。
vueの`{{}}`にはできなかったですね。
vueはそのかわりに`v-html`があります。
vueはXSSの警告がでるのでサニタイズ処理をするのですがsvelteではサニタイズ処理を行わないようです。

```App.svelte
<script>
	let string = `this string contains some <strong>HTML!!!</strong>`;
</script>

<p>{@html string}</p>
```

```App.vue
<template>
  <p v-html="string"></p>
</template>

<script>
export default {
  data() {
    return {
      string: `this string contains some <strong>HTML!!!</strong>`
    }
  }
}
</script>
```

## Making an app
ここではビルドツールについて書かれています。
使い方も公式に書いてあるので親切ですね。
(vueも公式が充実しているのでこの辺はどちらもやりやすい)

chapterの2以降はまた後日
初めてのダイクストラ法

# ダイクストラ法
A
早川桃子先生のYouTube
離散数学入門#5: 最短経路問題：ダイクストラ法とワーシャル–フロイド法
https://m.youtube.com/watch?v=e6X2gDTZYCQ
の例題の実装を試みてみました。
実行環境はpaiza.ioです。

# いっぱいコメントアウトがあります。（お見苦しいです。）
無限大を999999にしています。
リストvが地点までのコストの合計（最後には一番ちいさくなる）
リストvkが最小のコストが確定したらTrueにするものです。![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663576/b790b40c-76af-5377-c9ab-ff07c6ab3219.png)

# データ
地点の数、道の数
地点→地点　コスト
7 12
0 1 16
0 2 8
0 3 15
1 6 78
1 5 13
2 1 13
2 4 10
2 5 17
2 3 21
3 5 33
4 6 15
5 6 52

```python:dijkstra.py
n,m=[int(i) for i in input().split()]
#print(n,m)
a=[]
for i in range(m):
   a.append([int(j) for j in input().split()])
#print(a)
v=[999999]*n
vk=[False]*n
#print(v,vk)
v[0]=0
#print(v,vk)
#j=0
while True:
    v1=999999
    i1=999999
    for i in range(n):
        if v[i]<v1 and vk[i]==False:
            i1=i
            v1=v[i]
    if i1==999999:
        break
    #print(i1,v1)
    vk[i1]=True
    for a1 in a:
        #print(a1)
        if a1[0]==i1:
            v[a1[1]]=min(v[a1[1]],v[i1]+a1[2])
            #print(v,vk)
    #j+=1
print("ans",v,vk)
#print(a)
#後戻り
#print(v[6])
i1=6
rp=[]
rp.append(i1)
#j=0
while True:
    if i1==0:
        break
    for a1 in a:
        if a1[1]==i1:
            #print(a1,v[i1],v[a1[0]])
            if v[i1]-a1[2]==v[a1[0]]:
                #print(a1,v[i1],v[a1[0]]," ",end="")
                i1=a1[0]
                #print(i1)
                rp.append(i1)
                #print(rp)
                #j+=1
                break
print("pass",rp[::-1])
```

上記が初めてのダイクストラ法の実装でした。
# 次は後半のワーシャル–フロイド法も実装してみたいと思います。
上と同じ経路を双方向にしてワーシャル–フロイド法にしてみました。
こんなに短いプログラムでどうしてちゃんとできるのか不思議です。

```python:Floyd–Warshall.py
# coding: utf-8
# Your code here!
#ワーシャルフロイド法
n,m=[int(i) for i in input().split()]
#print(n,m)
a=[[999999]*n for i in range(n)]
for i in range(m):
   a1=[int(j) for j in input().split()]
   #print(a1)
   a[a1[0]][a1[1]]=a1[2]
   a[a1[1]][a1[0]]=a1[2]
   #print(a1[0])
for i in range(n):
    a[i][i]=0
for i in a:
    print(i)
print()
for k in range(n):
    for i in range(n):
        for j in range(n):
            a[i][j]=min(a[i][j],a[i][k]+a[k][j])
for i in a:
    print(i)
```
railsにおけるルーティングについての整理

#この記事を書こうと思ったきっかけ
自分でオリジナルのアプリケーションを作っていく過程で新しい知識を身につけていきましたが、ここでrailsの基礎の一つであるところのルーティングについてまとめてみたいと思います。

#ルーティングについて
早速ルーティングについて記述していきたいと思いますがまずは<a href='https://www.javadrive.jp/rails/ini/index7.html'>こちら</a>でMVCとはどういうものなのか調べてみてからをお勧めします。（リンクは一例です）

ルーティングとは**railsアプリケーションの各コントローラーへの道筋を教えてくれる役割**みたいなものだと捉えて大丈夫でしょう。

webサイト利用者が訪問したいページにアクセスした際のURLに対してルーティングがどのアクションを実行すれば良いか案内してくれます。

root "homes#index"
この記述の場合は"root"という道筋でアプリケーションに帰ってきたら、"homesコントローラー"の"indexアクション"への案内をしてくれます。

そしてwebサイトに対してアクションで記述した処理内容が送られます。

#ルーティングの記述

```app/config/routes.rb
Rails.application.routes.draw do
  # この中にルーティングを記述します。
end
```

#基本の書き方

```app/config/routes.rb
Rails.application.routes.draw do
  root "homes#index"
  get "homes#new"
  post "homes" => "homes/create"
end
```

#root

webページにアクセスした際に一番最初にコントローラに指示です。
主にwebページの最初のページを設定したい時に使われます。

#resources
railsの基礎となる７つのアクションへのルーティングを指定するときしようします。

以上です、今回は軽く触れましたが今後詳しく記述したいと思います
SharePoint フォルダのファイル集計するなら FIiles → Contents で

# 概要
PowerBI(Power Query) でSharePointのファイル群を処理する場合、DefaultのFilesより速くなるContentsを利用しよう

# 方法
1. "Files" を "Contents" に変える<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/892b2edb-42ef-a64c-bfae-e42853d2bdce.png)
1. あとは、拾いたいPathまで掘っていってContents展開するのみ<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/5e7bec3e-8e6d-90ff-2426-d20b5757e2fc.png)


# 結果
Excel File 1090 点の取得速度比較例。以下の例だと、Contents に変えるだけで二倍になってます。

|方法|時間|
|-|-|
|Files|2:28|
|Contents|1:12|

※以下のように、更新時の方がその差は歴然かも・・<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ff0fce5e-d48e-837a-40db-953051f556b1.png)

### DefaultのFiles取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ae4d5d2b-6d10-7bb5-8d6a-9b21f2da9394.png)

### Contents取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/33ed9827-cf56-ed93-7821-79f7b7c3f461.png)


# 参考
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e5dd3683-d981-22d4-3013-106d0cbb0dec.png)

https://exceleratorbi.com.au/fast-track-power-bi-dev-with-sharepoint-files/
firestoreからget()したtimestampがnullになる件

firestoreにcreatedAtやupdatedAtを追加した後に

```
doc(id).get().date()
```

でデータを取ろうとしたら　

```
[
   name: "test",
   createdAt: null,
   updatedAt: null,
]
```

とデータを吐き出してきた!
原因を探っていくとどうやら[こいつ](https://firebase.google.com/docs/reference/node/firebase.firestore.DocumentSnapshot#data)が関係あるらしい
リンク先を参考に

```
doc(id).get().data({serverTimestamps: "estimate"})
```

とうつとうまく行った。
オプションや説明については[こちら](https://qiita.com/1amageek/items/dc3ef8faffa792779d44)の分かりやすい記事を参照することをすすめる！
Docker上で起動しているWebアプリのSupervisorをDatadogで監視する

# 結論

`/var/run/supervisor.sock`をVolumeマウントして、
WebアプリコンテナとDatadogAgentコンテナ間で`/var/run/supervisor.sock`を使用できるようにする。

## 経緯

[DatadogによるSupervisor チェック](https://docs.datadoghq.com/ja/integrations/supervisord/?tab=host)によると

```/etc/supervisor.conf
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[unix_http_server]
file=/var/run/supervisor.sock
chmod=777
chown=nobody:nogroup
```

こちらの設定だけで、DatadogでSupervisorが監視できるとのこと。

だが、Connection refuseされまくる。。。
そもそもDatadogAgentで、`unix:///var/run/supervisor.sock`に接続できないっぽい。。。

結論にも書いてある通りですが、
`/var/run/supervisor.sock`を、DatadogAgentコンテナにだけ記述しても、そんなものはDatadogAgentコンテナには存在しない。ここに気づくまでだいぶ時間飛ばしました。

## 対応策

`/var/run/supervisor.sock`をVolumeマウントして、
WebアプリコンテナとDatadogAgentコンテナ間で`/var/run/supervisor.sock`を使用できるようにする。

## 具体例

supervisorsocketという名称のVolumeマウント作成し、
WebアプリコンテナとDatadogAgentコンテナ間で`/var/run/supervisor.sock`を使用できるようにする。


```docker-compose.yml
version: '3'
services:

  # Webアプリコンテナ
  app:
    build:
    .
    .
    .
    volumes:
      - supervisorsocket:/var/run

  # DatadogAgentコンテナ
  dd-agent:
    image: datadog/agent:7
    .
    .
    .
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - supervisorsocket:/var/run
    .
    .
    .

#Volumes
volumes:
  supervisorsocket:
    driver: local
```

## 参考

[Datadog公式ドキュメント](https://docs.datadoghq.com/ja/integrations/supervisord/?tab=host)
【Mac】Finderで隠しファイル、隠しフォルダの表示／非表示切り替え

## Finderで隠しファイル、隠しフォルダの表示／非表示切り替え

### キーボードショートカットで設定
command + shift + .（コマンド + シフト ＋ ピリオド）
で切り替えることができます！！
未経験からCCNA取得までの道のり　ver８

実際問題を解いてくときに、言葉の意味を間違えて理解していたのでアウトプット！！
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
『サブネット計算』
サブネット（ホスト部からビットを借用して作られたネットワーク）に関する以下の情報は、提示されたIPアドレスから算出される！
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
🚩サブネットマスク
・説明
ネットワーク部とホスト部を区別するための数値

・算出方法
「/24」のようなCIDR表記から2進数と10進数のアドレス変換する

🚩ネットワークアドレス
・説明
ネットワーク自体を表すアドレス

・算出方法
ホスト部を全て「0」にして10進数に変換する

🚩ブロードキャストアドレス
・説明
特定のネットワークに属する全ホストにパケットを送るためのアドレス

・算出方法
ホスト部を全て「1」にして10進数に変換する

🚩ホストアドレスの範囲
・説明
ホストに割り当て可能なアドレス

・算出方法
ネットワークアドレスの1つ後ろ〜ブロードキャストアドレスの1つ前まで

🚩ホストアドレス数
・説明
ホストに割り当て可能なアドレス数

・算出方法
公式：2のn乗-2=ホストアドレス数
※nはホスト部のビット数

🚩サブネット数
・説明
ホスト部からビットを借用して作られたネットワークの数

・算出方法
公式：2のn乗＝サブネット数
※nはホスト部から借用したビット数
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿
キーワードプランナーでタイトルを決めるまでの道のり


#キーワードプランナーで需要のあるキーワードを探す手順(2021年7月11日最新)


http://techblog.short-tips.info/inhouse_se/seo_word2.html


##内容

キーワードプランナーを用いて適切なキーワードを見つけるまでの手順について記しました。
便利なツールを使ったことがない人にとってはおすすめです。