OmniAICreator/Qiita-1.07M huggingface dataset:
VIM設定備忘録

#### VIM設定ファイル
◯確認コマンド
> $ vim --version

|項目|対象|場所|
|:-|:-:|:-|
|システム設定|vimrc|/etc/vimrc|
|ユーザー設定|vimrc|$HOME/.vimrc|
|第2ユーザー|vimrc|~/.vim/vimrc|
|ユーザー|exrc|$HOME/.exrc|
|デフォルトファイル | |$VIMRUNTIME/defaults.vim|

Alma Linux 9 \\$VIMRUNTIME 省略時(デフォルト未設定)
\\$VIMRUNTIME:/usr/share/vim/vim80

　vim実行時、システム設定は全ユーザー共通で読み込まれ、次にユーザー設定が反映される。ユーザー設定の読込には優先順位があり、ユーザー設定、第2ユーザー設定、デフォルトファイルの順に読み込まれる。ただし、ユーザー設定、第2ユーザー設定、デフォルトファイルの内一つの設定を読み込むと後の優先順位が低い設定は読み込まれない。
　基本的な設定はデフォルトファイルにまとめられている為、ユーザーの独自設定を作るならば\\$VIMRUNTIME/defaults.vimを、ユーザーのホームディレクトリ($HOME)へコピーし、.vimrcとリネームして使用するのが無難と考えられる。
　
> cp　/usr/share/vim/vim80/defaults.vim　$HOME/.vimrc

〇vimrc 設定

　vimrcの設定は無数にあり日々バージョンアップされている。
サイト：[Vim-jp
](https://vim-jp.org/vimdoc-ja/options.html) の日本語ドキュメントのoptionを参照するのが確実。

　筆者は普段プログラムを行う事が多く、プログラム用途にあわせて使用している設定のみ以下にピックアップする。

|設定|意味|備考|
|:-:|:-|:-|
|fenc|文字コード設定|設定例：sjis, shift-jis, euc-jp, utf-8|
|showcmd|編集中のコマンドをステータスへ表示|
|tabstop|タブの空白幅|2,4,8 を指定する事が多い|
|autoindent|カレント行のインデントをキープする||
|noautoindent|autoindentの無効化||
|smartindent|C言語風のプログラミング言語向けの自動インデント||
|nosmartindent|smartindentの無効化||
|cindent|C言語に特化したインデント||
|nocindent|cindentの無効化||
|list|不可視文字を記号で表示||
|number|行番号表示||

　自動インデントは手動編集では強力なサポートになるが、マウス操作でのコピーを行うと妨げになる場合が殆どである。その為、基本的には無効化している事が多い。

```vimrc
" 設定例
set showcmd
set tabstop=4
set noautoindent
set nosmartindent
set nocindent
```

　手動編集がメインとなる場合はvim上で個別にsetコマンドを用いて、インデントのサポートを有効にしている。


#### 参考サイト
https://vim-jp.org/vimdoc-ja/options.html
基本情報（ビットとバイトとその他の単位）

みんな大好き単位の時間だよ！

コンピュータが表現する最小の単位がビット（bit)です。
８ビットをひとまとめにしたバイト(Byte)を主に使います。

ビットの表し方は「500b」で末尾にbが書いてある場合はビット
「500B」と末尾に大文字のBが書いてある場合はバイトを示しています。

## 1バイトであらわせる数の範囲
1ビットは
```
1 or 0
```
です。

では2ビットは
```
00
01
10
11
```
４通りに増えますね。
2ビットだと2進数2桁になるので、2²個の数を表現できます。

3ビットだと2³個で8通り。4ビットだと2⁴個で16通り。
8ビットだと256通りとなります。

負の数を入れると表現できる数値は正と負に２等分されます。
符号ありの場合はあらわせる数は下記のようになります。

```
00000000 ⇨ 00000001 ~ 0111111
             1         127

00000000 ⇨ 11111111 ~ 10000001 ~ 10000000
             -1        -127       -128
```
## 様々な補助単位
m(メートル）という長さの単位がありますが、目的地まで40,000mだったときに40,000mとは言わないで
40kmというと思います。
この時の「k」を補助単位と呼びます。

そこでバイトが1,000,000,000バイトですと呼んだりするのはないと思うので、分かりやすく
補助単位を使います。下記がその補助単位の一覧です。

### 記憶容量など大きい数値を表す補助単位
|  補助単位   |  意味   |  説明   |
| :---: | :---:| :---: |
|   キロ(k)  |  10³  |  基本単位 * 1,000倍  |
|   メガ(M)  |  10⁶  |  基本単位 * 1,000,000倍  |
|   ギガ(G)  |  10⁹  |  基本単位 * 1,000,000,000倍  |
|   テラ(T)  |  10¹²  |  基本単位 * 1,000,000,000,000倍  |
### 処理速度など小さい数値を表す補助単位
|  補助単位   |  意味   |  説明   |
| :---: | :---:| :---: |
|   ミリ(m)  |  10⁻³  |  基本単位 / 1,000倍  |
|   マイクロ(μ)  |  10⁻⁶  |  基本単位 / 1,000,000倍  |
|   ナノ(n)  |  10⁻⁹  |  基本単位 / 1,000,000,000倍  |
|   ピコ(p)  |  10⁻¹²  |  基本単位 / 1,000,000,000,000倍  |


## ※追加説明
会社の方から1KBなら1024Bじゃない？と説明してもらって、検索すると「エンジニアなら2進数で考えて当たり前でしょう！」という記事がありました。
ええ。ええ。

1KBは1000なの？1024なの？と検索するとたくさんの記事の結果が出てきます。

なんと10進法と2進法をめぐる「メモリカード容量の不当表示」訴訟なんてのも起きていたみたいですね。
[10進法と2進法をめぐる「メモリカード容量の不当表示」集団訴訟](https://wired.jp/2007/12/06/10%E9%80%B2%E6%B3%95%E3%81%A82%E9%80%B2%E6%B3%95%E3%82%92%E3%82%81%E3%81%90%E3%82%8B%E3%80%8C%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%AB%E3%83%BC%E3%83%89%E5%AE%B9%E9%87%8F%E3%81%AE%E4%B8%8D%E5%BD%93/)

|  補助単位   |  10進   |  2進   |
| :---: | :---:| :---: |
|   キロ(kB)  |  1,000byte(10³)  |  1024byte(2¹⁰)  |
|   メガ(M)  |  1,000,000byte(10⁶)  |  1,048,576byte(2²⁰)  |
|   ギガ(G)  |  1,000,000,000byte(10⁹)  |  1,073,741,824(2³⁰)  |
|   テラ(T)  |  1,000,000,000,000byte(10¹²)  |  1,099,511,627,776(2⁴⁰)  |

1024byte = 1KB ◯
1024byte = 1kB ✖️

KBだとOKでkbだとダメなんですね。
国際単位系(SI)で規定されている「SI接頭辞」と呼ばれるもので規定されており
1000倍を示すものは「k」で表記することが決まっているみたいです。
[キロバイト](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%AD%E3%83%90%E3%82%A4%E3%83%88)

紛らわしすぎて**kibibyte**という単位があるそうです。
[キビバイト](https://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%93%E3%83%90%E3%82%A4%E3%83%88)

単位の話が結構、奥が深いようなのでここまでにしようと思います。

## まとめ
暗記ぱん食べたい。
２進数で全て考えられるようになってエンジニアを名乗れるみたいなので頑張ります。
Python,pipでのバージョン確認

pythonを実行して```ModuleNotFoundError: No module named 'xxxx'``` とエラーが出たとき、調べてみると、pythonのバージョンやライブラリのバージョンが対応していないとか、そもそもライブラリが入っていないとかがよくあります。その都度、pipやpythonのバージョンをネットで確認するのが手間なので、バージョンをチェックするプログラムを作って確認できるようにしてみました。

# 実行環境
Python version: 3.9.13
OS: Windows 10

# プログラム
subprocessモジュールはPythonスクリプトから他のプログラム（アプリケーション）を起動することができます。
windowsのコマンドプロンプトやmacのターミナルを実行するために使われます。
```version_check.py
import subprocess

# pythonのバージョン確認
subprocess.run("python -V")

# pipのバージョン確認
subprocess.run("pip -V")

# pipでインストールしたライブラリのバージョンをpip_list.txtへ保存
subprocess.run("pip list > pip_list.txt", shell=True)
```
```""```内に実行したいコマンドを入れると、実行できます。```> pip_list.txt```の部分は、コマンドライン上に出力される情報を保存しています。

### pipのアップデートのコマンド
[pipでアップデートするときのコマンド pip update](https://qiita.com/HyunwookPark/items/242a8ceea656416b6da8)

# 参考リンク
[Windowsコマンドプロンプトのコマンドを実行する方法（subprocessモジュール）](https://office54.net/python/basic/python-windows-command#section4)

※platformライブラリが使えなくなっていたので、platformに関する記事を消しました。 20220622
SQLで内部結合してみよう【inner join】

データベース内のテーブル同士を結合したいなぁ

そんなときに用いるのが`inner join`や`outer join`です。

inner_joinというのは内部結合と呼ばれていて、テーブル同士を結合させるときに使います。
これらを見てみてください
![スクリーンショット (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/6b646dc7-a79e-07e2-8a75-bf1c47ec6a82.png)
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/c1e6e378-eea6-23e4-a51d-e36711abf129.png)

これらに共通するものとは、user_idとidなのです。
これら『共通する』要素を結合させれば、無事にテーブル同士がくっつくということです

では実際にコードを書いたのがこちら。
![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/55a8f7e7-ffaa-97ea-ad21-c6d85a83b323.png)

一番見て欲しいのはwhere句の前のコードになります。

`from orders`で元となるテーブル名
ここで oと語尾についているのは後々の記述で書きやすくするためです

`inner join`で前のテーブルと結合させたいテーブルを選択します。

`on`で　共通する要素を=で結んでいます。
その時に、両方に`id`という要素があった場合、どっちの`id`か分からなくなります。
その為、`on` = `テーブル名A.要素名` = `テーブル名B.要素名` と表記しなくてはいけません。
その際にわざわざテーブル名をたびたび入力するのは手間なので、
`from テーブル名 AS 省略したいテーブル名`
とすればコードが書きやすくなります。

ASについては、省略することがかのうなので、上記のコードでは省略しています。

それではまた。
Java if, for

ifは条件がTrueならif文、falseならelse if文。

     int i = 7;
        if (i > 5) {
            System.out.println("true");
        } else if (i < 5) {
            System.out.println("false");
        }  else {
              System.out.println("rest");
            }

この場合は ifで止まってtrueが表示されるが、intが4の場合falseが、5の場合restが表示。




Forは繰り返し文。
    for (int i = 0; i < 10; i++) {　//0から9までが出る
            System.out.println(i);
            if (i == 6) {
                break; // iが6まで出て止まる。
                continue; iが6の場合を除く
Excel関数

①文字列で分割（split）
=TRANSPOSE(FILTERXML(SUBSTITUTE("<r><n>"&B3&"</n></r>","☆","</n><n>"),"r/n"))


<r><n>はまち</n><n>えび</n><n>サーモン</n><n>ほたて</n></r>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/ec26e175-ad2a-3da3-22a4-3271b2446780.png)
参照リンク：https://www.officeisyours.com/entry/2020/09/07/220413

②文字列を他の文字列に置き換える（SUBSTITUTE 関数）
数式は、「=SUBSTITUTE(文字列,検索する文字列,置換後の文字列,[置換対象])」とします。

1.「,」を入力し、「置換文字列」("奥田 理恵") を入力し、「)」を入力して、[Enter] キーを押します。
置換文字列は置き換えた後の文字列です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/3f04a0fd-e82e-a83c-7fa5-65463f888deb.png)
2.結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/6d75858f-3ff3-7bd0-59f9-2d9a21c6c1a5.png)

参照リンク：https://www.crie.co.jp/chokotech/detail/8/
TECH CAMP 2日目　~HTML&CSS,flexbox~

# 学習内容
- HTML&CSS
  - `vh`,`wh`,`calc()`の使い方
  - flexbox(レイアウト)


# 苦労した事、改善
- テキストに載っているHTMLとCSSのコードをVSCodeにコピペしたが、ブラウザ上で見本通りに表示されなかった。
⇨ 試しにCSSに`background-color:black;`を記述したがブラウザの見た目が変わらなかった。ファイルを見て見ると、違うフォルダのCSSファイルを開いていた。
改善：これからは作業するときに作業中のファイルが正しいフォルダに入っているかどうかを確認する。

- もともと横並びになっている２つの要素a,bについて、新しい要素cをaの下に配置したかった。
```html
<div class="container">
  <h2 class="a">A<h2>
  <a href="#" class="b">
</div>
```
（CSSで親要素のcontainerに対して`display:flex;`を使用している）
上記のHTMLを編集して、
```html
<div class="container">
  <div class="left-box">
    <h2 class="a">A<h2>
    <div class="c">C</div>
  </div>
  <a href="#" class="b">
</div>
```
こうする。
⇨新しくc要素を追加する際にどこに記載すればよいかわからず時間がかかった。
改善：親要素と子要素、レイアウトについてまだ慣れていないのでたくさんプログラムに触れる時間と作り、とにかく慣れる。（平日１日の勉強時間：１０時間）できるだけメンターに質問したり回答を見て理解することで、何回もカリキュラムを見返す時間を作り、より定着させる。
Java基礎の基礎

long l = 30L; intより大きな単位
double dd = 30.0; Doubleは小数点を指名
int i = (int) 30L; 小さい単位を大きい単位に表示するには小さい単位を宣言しないといけない
long ll = 30; 大木単位は小さい単位を含むのでそのままの入力でもOK

String str = "複数の文字";　
System.out.println("Hello");
C/C++ コードを WASI(WASM)向けにコンパイルするメモ 

## 制約事項

WASI では

* 例外
* thread

が使えません.
(いろいろ対応予定はあるようであるが, 2022/06 月時点では stable ではないっぽい)

例外は `-fno-exceptions` で off に, `thread` はインクルードしないようにします.

## アーキテクチャ

32bit になります. 

sizeof(size_t) は 4 になります.

昨今ネイティブはほぼ 64bit アーキテクチャのため, C/C++ er は 64bit を想定してコーディングしているでしょうから, 32bit も考慮してポータブルに記述が必要になります.

## macro

`__wasi__` が定義されていますのでこちらを利用しましょう. e.g.

```
#ifdef __wasi__
// do nothing
#else
#include <thread>
#endif
```

## Stack, memory size

WASI の場合, stack size はデフォルトでは 16KB です.
再帰関数があるとだとけっこうすぐ stack overflow してしまいます.
(stack trace は出してくれるが, stack overflow の検出などはしてくれないもよう)

https://github.com/bytecodealliance/wasm-micro-runtime/blob/main/doc/build_wasm_app.md

そこそこ大きいアプリを動かしたい場合, `-z stack-size=` でリンカフラッグでスタックサイズを 64KB あたりに増やすとよいでしょう(初期メモリサイズは 64KB で, スタックサイズは初期メモリよりちいさくないといけないので, 初期メモリサイズも 256KB とかに増やしておく).

## ファイルアクセス(runtime 依存)

`wasmtime` ではデフォルト off です.

https://github.com/bytecodealliance/wasmtime/blob/main/docs/WASI-tutorial.md

`wasmtime --dir=. myapp`

で `--dir` でファイルアクセスを許可するフォルダを指定します.
tutorial では `open()` を使っていますが, 一応 `fopen()` とか `std::ifstream` などの高水準 API も使えるようです.

## 細かいところ

`wordexp` などは使えません.

## TODO

* [ ] C++17 filesystem はどうかな?
scipy.stats: シャピロ・ウィルク検定 shapiro

# scipy.stats: シャピロ・ウィルク検定 `shapiro`

シャピロ・ウィルク検定（正規性の検定）を行う。

`shapiro(x)`

帰無仮説 $H_0$: データは正規母集団から抽出されたものである
対立仮説 $H_1$: データは正規母集団から抽出されたものではない


```python
from scipy.stats import shapiro
import numpy as np
```

# 1.　正規乱数

平均値=50，標準偏差=10 の 20 個の乱数を発生させ，シャピロ・ウィルク検定でこのデータが正規分布に従うか検定する。


```python
np.random.seed(123)
x = np.random.normal(50, 10, 20)
shapiro(x)
```




    ShapiroResult(statistic=0.9611964225769043, pvalue=0.5680192112922668)



$p \gt 0.05$ なので，有意水準 5% のもとでは，帰無仮説は棄却できない。結論は，「データは正規母集団から抽出されたものではないとはいえない」となる。

# 2.　t 分布に従う乱数

## 2．1．　自由度=1 の場合


```python
from scipy.stats import t
np.random.seed(123)
y = t.rvs(df=1, size=50)
shapiro(y)
```




    ShapiroResult(statistic=0.25566935539245605, pvalue=1.693792811086406e-14)



自由度 1 の場合は，コーシー分布である。

$p \lt 0.05$ なので，有意水準 5% のもとでは，帰無仮説は棄却される。結論は，「データは正規母集団から抽出されたものではない」となる。

## 2.2.　自由度=10 の場合

$t$ 分布は，自由度が無限大の場合には正規分布になる。


```python
np.random.seed(123)
z = t.rvs(df=10, size=100)
shapiro(z)
```




    ShapiroResult(statistic=0.9897159337997437, pvalue=0.6416555643081665)



サンプルサイズが 100 の場合，自由度が 10 程度で正規分布と区別がつきにくくなる。

$p \gt 0.05$ なので，有意水準 5% のもとでは，帰無仮説は棄却できない。結論は，「データは正規母集団から抽出されたものではないとはいえない」となる。
ClosedXMLではまったことメモ

# はじめに
[こちらの記事](https://qiita.com/m-isik/items/f92376b547dddfe91387)でClosedXMLの使い方をまとめてみましたが、うまくセルの値が取得できずはまったことがあったので、まとめ。

# 対応していない関数がある
Excelのセルから値を取得するときは、ClosedXMLのメソッドValueで取得します。このときセルに関数が設定されていると、関数の計算結果が取得できます。
```CS
var workBook = new XLWorkbook("C:\\wk\\sample.xlsx");
var workSheet = workBook.Worksheet("sheet1");
var cellVal = workSheet.Cell(1, 1).Value;
```

### 正しく取得できるケース
例えば、以下の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/2021d47b-cb00-ebbe-c1c0-9ed9bebed62e.png)
C1セルに関数：SUM(A1:B1)を設定します。計算結果は「3」。

で、ClosedXMLでC1セルの値を取得
```CS
var workBook = new XLWorkbook("C:\\wk\\sample.xlsx");
var workSheet = workBook.Worksheet("sheet1");
Console.WriteLine($"C1 = {workSheet.Cell(1, 3).Value}");
```
結果は
```
C1 = 3
```
関数の計算結果が取得できます。

### 失敗するケース
次に以下のような関数を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/cfebf724-cd68-466a-34b2-42888dfdb701.png)

C3セルの計算にINDIRECT関数を使用します。→→SUM(INDIRECT("A1:B1"))

結果は以下のようなエラーとなります。
```
Unhandled exception. ClosedXML.Excel.CalcEngine.Exceptions.NameNotRecognizedException: The identifier `INDIRECT` was not recognised.
```

以下ClosedXMLのソースを見ると、全ての関数に対応しているわけでは無いようです。

https://github.com/ClosedXML/ClosedXML/wiki/Evaluating-Formulas

https://github.com/ClosedXML/ClosedXML/tree/develop/ClosedXML/Excel/CalcEngine/Functions

詳しくは追っていませんが、プログラムで関数を解釈して結果を返しているものと思われます。

### 補足
こちらのソースで何度か試しているときに、エクセル側の計算式の変更、ブックの変更などのタイミングにより、うまく動くこともあったり、エラーになることもありました。法則がちょっとよくわかってませんが、エラーが出力されることがあるのは確かです。

# 対策
try/catchでValue取得でエラーとなる場合、FormulaA1でセルに設定している関数を取得するようにして回避してみました。
```cs
try
{
    Console.WriteLine($"C1 = {workSheet.Cell(1, 3).Value}");
}catch
{
    Console.WriteLine($"C1(関数) = {workSheet.Cell(1, 3).FormulaA1}");
}
```
結果は
```
C1 = SUM(INDIRECT("A1:B1"))
```
【C言語】atoi()で文字列をぶち込んだらint 0の出力になる？例外処理について

## 0で返ってくるのは"0"だけではない。
0で返ってくるけど、元の場合が違う〜といったことがありました。

関数： ```atoi() ``` 
原因： 有効でない文字列を変換しようとすると0を返し、それ以降変換を行わないため

## 気づいたコーディング状況
数字で入力されているであろう文字入力をint型にしようとして   ``` int n = atoi(argv[1]);```を用い、その後```n```の値を見て例外処理をしようとしていた。```atoi() ``` には例外処理がなく、数字以外のものを変換しようとすると```0```を返すことを忘れてしまっていた。どういうことかと言うと、```0,1,2,3,4```等は```0,1,2,3,4```で返ってくるが、```0,A```は同じ```0,0```で返ってきてしまうということである。よって暫定的にASCIIコードを用いて入力判定を実装した。

## atoi()の例外処理
atoi()には例外処理がない。```if((*argv[1]-'0')!= 0 && n==0) ```この部分で、変換文字列の先頭文字が0ではないのに、変換後に0となっている時にエラーを出すコードを記述した。つまり、有効でない文字列で変換後0となってしまう例外を処理している。

```c:atoi()の例外処理
    int n = atoi(argv[1]);
    if((*argv[1]-'0')!= 0 && n==0){
        //先頭文字が0でないのに、atoiで0
        printf("引数が数字でありません(error)\n");
        exit(1);
    }
```
pipx: The term 'pipx' is not recognized as a name of a cmdlet, function, script file, or executable program.の対処法

備忘録も兼ねて。

# 経緯
pipxを使ってみようと思い、
`pip install --user pipx`でインストールして
`pipx ensurepath`でパスを通したあと、
blackを使うために`pipx install black`としたら、以下のエラーが赤文字で出た

```
pipx: The term 'pipx' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
```

# 原因と対処法
`pipx ensurepath`で自動的に通された環境変数パスが、何故かすべて小文字になっているのが原因

正しいパスを環境変数に入れてやれば解決する

正しいパスは、`pipx ensurepath`をはじめてしたときに出てくる
```
Success! Added C:\Example1\hoge to the PATH environment variable.
Success! Added C:\Example2\hoge to the PATH environment variable.

Consider adding shell completions for pipx. Run 'pipx completions' for instructions.

Otherwise pipx is ready to go! ✨ 🌟 ✨
```
というメッセージの
`Success! Added [Path] to the PATH environment variable.`
の部分(今回は適当なパスで置き換えている)

`pipx ensurepath`が2回目以降なら、
```
C:\Example1\hoge is already in PATH.
C:\Example2\hoge is already in PATH.

⚠️  All pipx binary directories have been added to PATH. If you are sure you want to proceed, try again with the '--force' flag.      

Otherwise pipx is ready to go! ✨ 🌟 ✨
```
の`[Path] is already in PATH.`  の部分にある

この部分に表示されたパスが正しいパスなので、コピーして環境変数へとペーストする

環境変数の設定の仕方は、
Windows(10)の場合はまず、環境変数のウィンドウを開く[(開き方)](https://www.tipsfound.com/windows10/11011)
開いたウィンドウの`[UserName]のユーザー環境変数`→`Path`内に先程コピーしたパスが小文字であるはずなので、それらを正しいパスで置換して完了

これでターミナルを再起動すればちゃんとインストールできるはず

# 参考サイト
https://stackoverflow.com/questions/69686581/the-term-pipx-is-not-recognized-as-the-name-of-a-cmdlet
【Next.js】useRouterのrouter.queryが初回レンダリングでundefinedになる

## やろうとしていたこと
Next.jsでURLの中のパラメータを取得。
取得したパラメータの有無によって、関数処理を分ける。

## 生じていた問題
確かに、目視ではパラメータがあるんです。
あるのに、どうして...
なんでだか、console.logで値を覗いてみるとundefinedが...oh..No
たしかに、次レンダリング時には値は取れてる、取れてるのだけど、その前の値(undefined)で処理が走ってしまう。
```react.js:logout.jsx
const router = useRouter();
const { param } = router.query;

useEffect(()=>{
    onLogOut(); //←paramの値がundefinedでログアウト処理が進んでしまう
},[param])
```

## 解決できた方法
useRouterには、router.isReadyというオブジェクトがあるらしいです。
文字通り、routerの準備の有無が確認できました。
なので、router.isReadyを使って、routerの準備ができないうち(つまり無条件にundefinedを出す時)は、returnを返して、undefined状態で処理が進まないようにします。
準備ができたら、router.queryの中身が必要な処理をします。

```react.js:logout.jsx
const router = useRouter();
const { param } = router.query;

useEffect(()=>{
  if (!router.isReady) return; //routerの準備中はここで処理がstop
    onLogOut(); //routerの準備が完了したら、ここが呼ばれる
},[param])
```

参考：

https://nextjs.org/docs/api-reference/next/router#router-object
【GCP】三週間でGoogle Cloud Professional Cloud Architect認定資格合格

# 筆者について
随分前にGCPのProfessional Data Engineer（PDE）を合格しましたが、
https://qiita.com/SHA_AKA/items/f034f28e1adb7773bf24
データエンジニアとして、やはりインフラの知識が必要ではないがと考え、三週間ぐらいProfessional Cloud Architect（PCA）を勉強してから、受けて合格しました。

# 資格について
・公式サイド：https://cloud.google.com/certification/cloud-architect?hl=ja
・出題範囲：https://cloud.google.com/certification/guides/professional-cloud-architect?hl=ja
特に事例紹介のところが大事です。最初の１５問ぐらいはこちらのケーススタディになります。
試験中で読むこともできるが、結構時間かがるので、事前通読することをお勧めです。
・試験申し込み：https://www.webassessor.com/googlecloudjp

# 教材について
- テキスト
    - 取ろう！GCP Professional Cloud Architect 
    - ゲーム開発が変わる！GCPゲームインフラ実践ガイド

基礎知識では「取ろう！GCP Professional Cloud Architect」の一本だけで十分だと思いますが、
試験向けでは「ゲーム開発が変わる！GCPゲームインフラ実践ガイド」も読んだ方が良いと思います。
（GCPサービス以外のJenkins、terraform、prometheus、helmなどの製品に対する認識があった方がいいです。）

- 公式ドキュメント
    - https://cloud.google.com/architecture?hl=ja

GoogleCloudでワークロードをビルドまたは移行するためのリファレンス アーキテクチャ、図、設計パターン、ガイダンス、ベスト プラクティスを示す公式資料です。試験前せめてベストプラクティス（おすすめの方法）を読み切った方がよいと思います。時間があまりないので筆者は実装が全て飛びました。

- その他
    - https://www.youtube.com/user/sunseeandyou/videos

PCAの試験と対策を紹介されたビデオです。

# 受験準備
- 公式模擬試験
２回までやりました
- その他模擬試験：https://www.examtopics.com/
同じ問題が試験に出ますが、英語かつ正解率が低いため、正解よりdiscussionを参考して、他人の選択理由を理解することが重要だと思います。

# まとめ
自分のスケジュールでは、一週テキスト、一週公式ドキュメントとビデオ、残りの時間が模擬試験でした。
最近仕事上でもgcpを触ることも増えて、gcp上でRailsの実装してみたので、PDEの時と比べ、今回は自信を持って受験しました。
【AWS】 クラウド学習　セキュリティグループについて

プログラミングを初めて3ヶ月。
備忘録としてつまづいたところを記載し、アウトプットツールとして活用していきます。

# AWSインフラ・クラウド学習中
VPSやらEC2やらS3やらなにをやっているのかわからなすぎて自分自身に絶望しています。

# セキュリティグループについて
今回はセキュリティグループについて学んだ事を書きます。
アウトバウンドルール、インバウンドルールがあり
インバウンドは外からサーバーやWEBアプリケーションなどに入ってくる事をいい、アウトバウンドは外に出ていく事をいう。（ざっくり）
アウトバウンドはあまり使わないイメージ、、、
今回でいうとパブリックのサブネットからプライベートのサブネットに移動することをアウトバウンドというみたい。あくまでパブリックから見た場合。プライベートから見るとインバウンドになる。

# インバウンドルールに関して
今回はアウトバウンドはデフォルトの設定のままにして問題なし。

インバウンドは、SSHと作成したWEBアプリはHTTPS化しているので
HTTPSの2個設定するべき。
SSHに関しては、私はクラウド9を使用し、EC2に入りたいので
ソースはクラウド9のパブリックIPを記載しないといけない。
最初は教材を進めていてなにもわからず0.0.0.0/0にしていたが
セキュリティ上アウトであることが後々わかってきた。（0.0.0.0/0はすべてを許可する？的なものらしい）

HTTPSに関しては、いろんな人がいろいろなデバイスから私の作ったWEBアプリに入ってくるので、この場合のソースは0.0.0.0/0にしないと、誰もアクセスできない状態になってしまう。
なんかHTTPSがセキュリティ強化みたいな認識だったので、0.0.0.0/0だとセキュリティ的に大丈夫なの？？と疑問だったが
ここはそういう意味らしい。

クラウド、インフラは本当になにをやっているのかわからない。
何回も触ること、諦めずに向き合うことで少しずつ理解ができるというのも掴んできた。
これからも頑張ろう。。
経営組織と経営・マーケティング戦略

## 経営組織
代表的な形態
<b><font color = blue>職能別組織</font>
<font color = blue>事業部制組織</font>
<font color = blue>マトリックス組織</font>
<font color = blue>プロジェクト組織</font>
## 全社戦略
<b>企業全体の視点から進べき方向性を示したもの。経営資源でありヒト・モノ・カネ・情報を集中させていく。
### コアコンピタンス
<b>競合他社が真似のできない独自のノウハウや技術などに経営資源を集中し、競争優位を確立する手法
### ベンチマーキング
<b>最強の競合他社、または先進企業と比較して、製品やサービス、オペレーションなどを定性的・定量的に把握する手法。
### PPM
<b>事業や製品を「花形」・「金のなる木」・「負け犬」・「問題児」に分類し、経営資源の差異的配分を意思決定する手法

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/94dec2fc-4f66-bbb8-9cfb-da9b98ef5549.png)

### M&A
<b>企業を合併・買収すること
### アライアンス
<b>企業同士が連携すること
### アウトソーシング
<b>情報システムのコストを削減するために、情報システムの開発や運用・保守に関わる全部または、ほとんどの機能を外部の専門企業に委託する形。また、人件費などが安い海外の企業に外部委託することを<font color = blue>オフショアアウトソーシング</font>という。
さらに、自社の業務を含めて外部企業に委託することを<font color = blue>BPO</font>という。
## 事業戦略
<b>事業事に進むべき方向性を示したもの。
### SWOT分析
<b>企業の経営環境を内部環境である「強み」と「弱み」、外部環境である「機会」と「脅威」に分類する手法。
内部環境 - 価格や技術、ブランド力など
外部環境 - 政治・経済情勢、市場、競合他社など

![クロス分析-650x440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/24f32e87-f389-63cf-52c3-ee9409420e13.png)
### バリューチェーン分析
<b>企業が顧客に提供する製品やサービスの利益などの付加価値が、どの活動で生み出されているのかを分析する。

![value-chain_img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/c0592bd9-9f6a-6c60-af06-d32135249ef3.png)
### 成長マトリクス
<b>「市場浸透」・「市場開拓」・「製品開発」・「多角化」の四つのタイプに分類する。
![Matrix01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/b91f5d2c-9d54-5f20-5c28-88ba463b247e.jpeg)

## マーケティング
<b>顧客が自社の製品やサービスに満足に満足してもらうことで、継続的に売れる仕組みを作る一連の活動。
<font color = blue>顧客満足度</font>とは、顧客に対して精神的・主観的に満足させるもの。
### プロダクトライフサイクル
<b>製品を「導入期」・「成長期」・「成熟期」・「衰退期」に分類。
![6d2e4244cf0a13037263a2f6c7d32121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/51592615-dffd-8b99-7941-7e8dcc9ead61.png)
### PLM
<b>企画・発売から廃棄までの一連のサイクルを通じて、製品の情報を一元管理し、商品力向上やコスト低減を図る取り組み。
### STP分析
<b>マーケティングの基本要素のセグメンテーション・ターゲティング・ポジショニングがあり、それらの観点で分析すること。
### コトラーの競争戦略
![img_db2e70bb316eaf38d8f249783d58c86e179707.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/b1235ddf-92bb-7024-f29b-01b1e2a54dc0.jpeg)
### マーケティングミックス
![a268f748d84423d72bb99b5647e781e7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/2f11a3ff-5dd6-628c-5a61-386e6fb1aa73.jpeg)
<b>売り手からは<font color = blue>4C</font>・買い手からは<font color = blue>4C</font>といわれている。
### コストプラス法
<b>製造原価、または仕入原価に一定マージンを乗せて価格を決定する手法。他には、競争相手の価格を反映する<font color = blue>競争指向型</font>、目標とするROIを実現できる価格にする<font color = blue>ターゲットリターン型</font>、一番売れそうな価格に設定する<font color = blue>需要指向型</font>などもある。
### イノベータ理論
![195_img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/47a25e76-4c65-cb55-4e44-b96e97a59d3c.png)
<b>アーリーアダプタとアーリーマジョリティの間には、重要視するポイントの違いによる溝(<font color = blue>キャズム</font>)がある。
PsychoPyインストール時のpocketsphinxビルドエラーの解消方法

この記事ではWindows10または11上に作成したanaconda仮想環境で実行した際の解消方法となります。
# 解消方法
根本的な解決ではないですが場当たり的な解法としてpocketsphinxのビルド済みのバイナリファイルをダウンロードして、インストールしていきます。以下のサイトに有志の方が公開されているものがあるのでこちらを拝借させていただきました。
https://www.lfd.uci.edu/~gohlke/pythonlibs/
今回私の場合は、pocketsphinx‑0.1.15‑cp38‑cp38‑win_amd64.whlをインストールしました。簡単にはcp38がpython3.8を示していて、最後のamd64が64bit版をあらわしています。ご自身の環境にあったものをインストールしてみてください。
インストールの方法は、
```cmd:cmd
pip install \'ダウンロードのパス'\pocketsphinx‑0.1.15‑cp38‑cp38‑win_amd64.whl
```
でインストール可能です。
私の環境ではswingをいくらインストールしてもパスが通らなかったので、このような無理やりなインストールになっています。
動かない、解消しない、そんなサイトない等問題があればコメントを是非お願い致します。
データ分析のためのPythonまたはR：どちらを学ぶべきですか？


データアナリストにとって最も重要なスキルの1つは、プログラミング言語の習熟度です。データアナリストはSQL（Structured Query Language）を使用してデータベースと通信しますが、データのクリーンアップ、操作、分析、および視覚化に関しては、PythonまたはRのいずれかを検討しています。

PythonとR：違いは何ですか？
PythonとRはどちらも、Windows、macOS、およびLinuxで実行できる無料のオープンソース言語です。どちらもほぼすべてのデータ分析タスクを処理でき、特に初心者にとっては、どちらも比較的習得しやすい言語と見なされています。では、どちらを学ぶ（または最初に学ぶ）かを選択する必要がありますか？違いを掘り下げる前に、ここに各言語の大まかな概要があります。

Pythonとは何ですか？
Pythonは、自然言語を模倣した直感的な構文で知られる高級汎用プログラミング言語です。 Pythonコードはさまざまなタスクに使用できますが、一般的な3つのアプリケーションは次のとおりです。

データサイエンスとデータ分析

Webアプリケーション開発

自動化/スクリプティング

Rとは何ですか？
Rは、統計計算とデータ視覚化のために構築されたソフトウェア環境と統計プログラミング言語です。 Rの多数の能力は、大きく3つのカテゴリに分類される傾向があります。

データの操作

統計分析

データの視覚化

PythonとRのどちらを選択するにはどうすればよいですか？
PythonまたはRの学習に関しては、間違った選択はありません。どちらも需要の高いスキルであり、発生するほぼすべてのデータ分析タスクを実行できます。どちらがあなたにとって良いかは、最終的にはあなたの経歴、興味、そしてキャリアの目標に帰着します。

学習曲線
PythonとRはどちらも、習得がかなり簡単な言語と見なされています。 Pythonは、もともとソフトウェア開発用に設計されました。以前にJavaまたはC++の経験がある場合は、Rよりも自然にPythonを習得できる可能性があります。一方、統計のバックグラウンドがある場合は、Rの方が少し簡単かもしれません。

全体として、Pythonの読みやすい構文により、学習<a href="https://chk-pd.com/">私家偵探</a>曲線がスムーズになります。 Rは最初は学習曲線が急になる傾向がありますが、Rの機能の使用方法を理解すると、非常に簡単になります。
RoomsのデータテーブルMigrationするのしんどすぎてテーブル消した

# 環境？
Android studioで言語はJavaを使ってるよ

# 発端
初めに何も考えずにRoomsでデータベース作った時，適当なサイトを参考にしてこんな感じで`export_schema=false`を設定してしまった

```java:My_table.java
@Database(entities = {My_Entity.class}, version = 1, export_schema=false)
public abstract class My_Table extends RoomDatabase {
    public abstract My_Dao My_Dao();
}
```

事の発端はこれ．

# 問題
このあと何やかんやあって，Entityの仕様を大幅変更した．（カラムの削除と追加をやりたい放題した）

そのあと，シンタックスエラーだけ直してもう一度ビルドしたところ当然のように様々なエラーにであう．
↓例
## その1
```c:
Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.
```
テーブルの中身変えたでしょ！バージョン上げなさいよね！
と怒られているので自動でmigrationしてくれないかな〜という期待も込めて次のように書き換え．

```java:
@Database(entities = {My_Entity.class}, version = 2, export_schema=false, autoMigrations = {@AutoMigration (from = 1, to = 2)})
public abstract class My_Table extends RoomDatabase {
    public abstract My_Dao My_Dao();
}
```

## その2
 ```c:
Schema export directory is not provided to the annotation processor so we cannot import the schema. To generate auto migrations, you must provide `room.schemaLocation` annotation processor argument AND set exportSchema to true. 
```
export_schema=falseにしてたら前のバージョンが見れないでしょ！Migrationするならtrueにしときなさいよね！
と怒られているので，（あれ，falseの設定のままテーブルの中身書き換えちゃったよな..?）と嫌な予感をさせながら書き換え．

```java:
@Database(entities = {My_Entity.class}, version = 2, autoMigrations = {@AutoMigration (from = 1, to = 2)})
public abstract class My_Table extends RoomDatabase {
    public abstract My_Dao My_Dao();
}
```

### その3
```c:
Migration didn't properly handle ...
Expected: ...
```
はい，嫌な予感が的中しました！
バージョン1をexport_scemeしないまま書き換えてしまったせいで，元のデータテーブルを構成することができずMigrationはもはや機能しません！！！！

## 対処
幸い，データテーブルには引き継ぎたいデータがまだ全くなかったので，一回データテーブルを消してまっさらにして作り直すことにしました．

データテーブルの所在するActivity内で以下を実行するだけ

```java
public class MainActivity extends AppCompatActivity{
    this.getApplicationContext().deleteDatabase("消したいテーブル名");
```
まっさらになるので，もう一度version=1にして作り直すことが可能に！
もう`export_schema=false`なんてしない．．．
AzureDevOpsのパイプライン無料実行枠がなく、実行できないエラーの解決法

# はじめに

Azure PipelinesでCIパイプラインを作成し、テストを兼ねて実行しようとしたところ、「Microsoft Hosted環境でのパイプライン無料実行枠が購入されていない、または許可されていない」旨のエラー。
動かせるところを目標とし、解決策を記載する。

# 事象が起きたAzure DevOps環境について

- 作成： Portalからではなく[サービス概要ページ](https://azure.microsoft.com/ja-jp/services/devops/)から
- Billing設定、Azure ADの紐付けは後から
- Organizationの中にProjectは1つのみ
- パイプライン実行自体はOrganizationの中で初めて

# 出力されたエラーメッセージ

```terminal
##[error]No hosted parallelism has been purchased or granted. To request a free parallelism grant, please fill out the following form https://aka.ms/azpipelines-parallelism-request
Pool: Azure Pipelines
Image: ubuntu-latest
Started: Today at 0:45
Duration: 19m 0s

Job preparation parameters
```

# 原因調査

## OrganizationのBilling設定を確認

問題なく支払い先のAzureサブスクリプションは登録されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/a4031ad4-1254-235f-1b08-bb6b89841401.png)

`Paid parallel jobs`が`0`であるせいかとも考えたが、他のパイプライン実行を問題なく動かせるDevOps Organization設定を見ると、同じように`0`設定だった。

エラーメッセージの言う通り、「無料枠」としてパイプラインが動かせる時間が確保（Microsoftから許可）されているかいないか、という単純なことらしい。

# 解決策

2通りの方法がある。

## その1、無料枠をリクエストする

パイプライン実行ログに記載されている通り、無料枠リクエストする[フォーム](https://aka.ms/azpipelines-parallelism-request)に必要事項を記入し登録する。
2、3営業日かかるので、急ぎの場合は[その2](#その2パイプライン実行に支払いを設定する)のやり方で。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/434b3f21-b4c8-79ee-3bbb-07f14747dec5.png)

### メール返答

こんなメールがMicrosoftから来ます。


>Hi [XXXXXXXXXX],
>We’ve received your request to increase free parallelism in Azure DevOps.
>Please note that your request was Completed
>
>Request Details:
>\-----------------------------------------------------------------------------
>Name: [XXXXXXXXXX]
>Email: [EMAIL@ADDRESS.com]
>Organization Name: [Your Azure DevOps URL]
>Parallelism Type: Private
>\-----------------------------------------------------------------------------
>
>Request Free Parallelism for your organization: [Azure DevOps Parallelism Request Form](https://aka.ms/azpipelines-parallelism-request)
>Useful information:
>Azure DevOps Documentation: [Configure and pay for parallel jobs](https://docs.microsoft.com/en-us/azure/devops/pipelines/licensing/concurrent-jobs?view=azure-devops&tabs=ms-hosted)
>Azure DevOps Blog post [Change in Azure Pipelines Grant for Private Projects](https://devblogs.microsoft.com/devops/change-in-azure-pipelines-grant-for-private-projects/)
>Azure DevOps Blog post [Change in Azure Pipelines Grant for Public Projects](https://devblogs.microsoft.com/devops/change-in-azure-pipelines-grant-for-public-projects/)

このメールを受け取った後にパイプラインをRunしたら正常に動きました。

## その2、パイプライン実行に支払いを設定する

[OrganizationのBilling設定を確認](#organizationのbilling設定を確認)項で貼った画像の`Paid parallel jobs`入力欄を`1`以上の値とする。
料金（月額¥4,000くらい）はかかりますが、一番手っ取り早い。
Pythonを学ぶためのヒント


Pythonを使用したプログラミングのような技術的なスキルを学ぶことは恐ろしいことのように聞こえるかもしれませんが、思ったほど難しくはないかもしれません。これらのヒントを参考にして、学習を強化してください。

毎日コーディングしてください。
Pythonは言語であり、他の言語と同じように、繰り返しはそれを学ぶための鍵です。コーディングの練習には、たとえ15分であっても、毎日時間を割いてください。 Python for Everybodyを含む多くのオンラインPythonコースは、短いビデオレクチャー、クイズ、コーディング練習問題に分かれています。このタイプの構造は、あなたの人生を学ぶ時間を見つけるのをより簡単にすることができます。

また、より効率的に学習するのに役立つ場合があります。マイクロラーニングと呼ばれる手法である小さなチャンクでの学習は、保持とエンゲージメントを向上させます。

基本から始めましょう。
将来Pythonをどのように使用する予定であっても、同じ一連の基本から始めたいと思うでしょう。最初に基本を学ぶことで、より複雑な使用法に取り組むときに成功するための準備が整います。自分で学習する場合でも、コースを通じて学習する場合でも、必ず上記の基本事項をカバーしてください（「基本的なPythonの学習にはどのくらい時間がかかりますか？」を参照）。

構文よりも論理に焦点を当てます。
Pythonのコード行の方法と理由を理解することは、構文を覚えるよりも重要です。

インデントが繰り返される前に、かっこを閉じるか、コロンを含めることを忘れないでください。さらに、GoogleまたはStack Overflow（プログラマー向けのオンラインコミュニティ）でコードを構造化する方法をいつでも調べることができます。ただし、達成しようとしていることの論理を理解する必要があります。

Pythonコーディングの問題に取り組んでいるときに、構文を気にせずにコードで実行する必要があることの概要を手書きで書くと役立つ場合があります。これは擬似コードと呼ばれ、経験豊富なPythonプログラマーでさえプログラムを計画するために使用する手法です。

Pythonを使用するジョブ
Pythonは、さまざまな業界や職務で使用されていることもあり、世界で最も人気のあるプログラミング言語の1つにランクされています。 Pythonの書き方を学ぶことで、さまざまなキャリアの機<a href="https://ecoair.com.hk/%E9%99%A4%E7%94%B2%E9%86%9B">除甲醛</a>会を生み出すことができます。 Pythonを使用するいくつかの役職は次のとおりです。

データアナリスト-68,583ドル

バックエンド開発者-78,585ドル

品質保証エンジニア-85,731ドル

運用自動化エンジニア-88,462ドル

Python開発者-95,849ドル

フルスタック開発者-99,106ドル

データエンジニア-$112,071

データサイエンティスト-$116,041

機械学習エンジニア-129,417ドル

*給与データは、グラスドアからの2021年6月の米国平均を表しています。
【基本情報技術者】ネットワーク接続機器

基本情報技術者試験の分野「ネットワーク接続機器」についてご紹介いたします。
## ネットワーク接続機器
LAN内やLAN同士、LANとWANを接続する時は、階層ごとに次のようなネットワーク接続機器を使って中継する。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/a729689c-80c9-eb5d-4900-a165d035694e.png)

### リピータ
リピータは、LANにおいて**物理層（第1層）で中継する**装置。伝送路の途中で**データの信号波形を増幅・整形**する。電気信号を受信し**弱まったりノイズが入った信号を、 増幅や整形して元の信号に戻す役割を持つ**ネットワーク機器。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/bfcf01fb-d849-82b9-50f8-566c2ec0b21f.png)

### ブリッジ
ブリッジは、複数のLANを接続し、**データリンク層（第2層）で中継する**装置。ネットワークを流れるフレームの**宛先MACアドレスを解析し、適切なネットワークに中継する**。ブリッジにはMACアドレスを学習する機能があり、学習したMACアドレスに従い宛先MACアドレスが存在するセグメントへパケットを流す役割がある。
※MACアドレスは、PCやネットワーク機器が持つ世界で一つの固有識別番号。機器の住所・宛先というイメージ。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/5dc7fd2a-3112-d58c-9ef3-ced4e8f6b670.png)

### スイッチングハブ
LANケーブルを束ねる集線装置。「ブリッジ」機能を持つハブ。L2スイッチも同じ機能を持つ装置である。
※ハブとは、LANケーブルの接続口（ポート）を複数持つ集線装置。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/897b1995-c0ee-2a04-63c4-928760a6e216.png)

ブリッジは、1対1を基本とする通信です。
スイッチは、n対nのそれぞれの通信で、ブリッジ動作を行います。

### ルータ
ルータは、LAN同士やLANとWANを接続し、**ネットワーク層（第3層）で中継する**装置。ネットワークを流れる※パケットの**宛先IPアドレスを解析し、最適な経路を選択(ルーティング)し中継**する。L3スイッチも同じ機能を持っている。
※パケットは、ネットワーク上に流れるデータを小さく分割したもの。データ通信において、ネットワーク経由でやりとりされる情報の伝送単位。
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/0f93d071-8b9c-4df6-deaf-b315bdbe22db.png)

### ゲートウェイ
ゲートウェイは、ネットワークにおいて、**トランスポート層（第4層）以上の異なる通信プロトコルがネットワーク同士でデータをやり取りする際、中継する役割**を担うルータのような機能を備えた機器。

内部ネットワークと外部ネットワーク（異なるネットワーク）を繋ぎ、出入り口となる装置を**デフォルトゲートウェイ**と呼ぶ。一般的にはルータがデフォルトゲートウェイの役割を担う。
ゲートウェイという言葉は英単語では「玄関」の意味を持ちます。その意味の通り、内部ネットワークにいるコンピュータからインターネットなどの外部ネットワークにアクセスする際は必ず玄関であるデフォルトゲートウェイを経由します。
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/591b1c8c-0ccf-2379-b786-04daf57690e9.png)
再帰関数でpythonのyieldを使う（例題：数字和がnになる数を昇順でリスト）

再帰関数でpythonのyieldをどう使うか分かりづらかったので調べてみました。

### 【例題】数字和がnになる数を小さい順に出力する関数を作れ

このような問題を例として考えてみます。まず数字和がnになる**k桁の数**を昇順にプリントする再帰プログラムを考えます。

#### 数字和がnになる**k桁の数**を昇順にプリントする
```python 
def ds2n(n,k,ans=0): # n:数字和, k:桁数, ans:答え 初期値0, 
    if n==0 and k==0:
      print(ans)
      return
    for d in range(max(0 if ans>0 else 1,n-(k-1)*9),10):
      ans1, n1 = ans*10+d, n-d
      if n1 >= 0:
        ds2n(n1,k-1,ans1)
    return

n = 5
for k in range(1,2+1):
  print(f"-- k={k} --")
  ds2n(n,k)
# k=1 --
# 5
# -- k=2 --
# 14
# 23
# 32
# 41
# 50
```
例題はこのkを1からカウントアップすればよいので関数**digsum2n**をかぶせます。中身は同じなので省略しています。

#### 数字和がnになる数を昇順にプリントする

```python 
def digsum2n(n):     # n:数字和
    :
  for k in range(1,2+1):
    ds2n(n,k)
  return 
digsum2n(5)
#結果は同じ
```
#### 結果をgeneratorとして出すようにyieldに変える

ここからyieldをどう入れるかですか、基本方針に以下の通りです。

1. Print文をyieldに変える
1. 関数を呼ぶ前にyield fromを入れる

#### 【解答】yieldを使ったプログラム

この方針で簡単にGenaratorとなるプログラムに変更できました。ほぼ無限に数を生成するので呼び側で値を見て止める必要があります。

この考え方は、この問題のように再帰関数などの深いところで答えが見つかる場合などの有効だと思います。

```python 
def digsum2n(n):       # n:数字和
  def ds2n(n,k,ans=0): # n:数字和, k:桁数, ans:答え 初期値0, 
    if n==0 and k==0:
      yield ans
      return
    for d in range(max(0 if ans>0 else 1,n-(k-1)*9),10):
      ans1, n1 = ans*10+d, n-d
      if n1 >= 0:
        yield from ds2n(n1,k-1,ans1)
    return

  for k in range(1,100+1):
    yield from ds2n(n,k)
  return 

for ans in digsum2n(20):
  if ans >= 500: break
  print(ans)
# 299
# 389
# 398
# 479
# 488
# 497
```

（開発環境：Google Colab）

この考え方はProject Euler Problem 254: Sums of Digit Factorialsを解くのに役に立ちます。
BackupImageで起動したJUNOSの修復方法

## JUNOSがBackupImageで起動した際の表示

JUNOSが破損した場合、BackupImageで起動します。
その際、以下のような表示がされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/bb4d4f8c-2d57-9a04-7059-7ac6ecf1408e.png)
```
WARNING: THIS DEVICE HAS BOOTED FROM THE BACKUP JUNOS IMAGE
It is possible that the primary copy of JUNOS failed to boot up properly, and so this device has booted from the backup copy.
Please re-install JUNOS to recover the primary copy in case it has been corrupted.
```

プライマリパーティーションにインストールされているJUNOSが破損した事により、バックアップ（alternate）パーティーションのJUNOSが起動しています。


## JUNOSを復旧する
JUNOSを復旧するには、以下の2つの手順を踏みます
1. プライマリパーティーションの復旧
1. JUNOSのアップデート

## この記事について
以下の記事を清書したものになります。
内容は当時(2015.02.12)のものとなります。
https://blog.mikalab.info/archives/644271.html

### 環境
Juniper EX2200-48T-4G

### パーティーションの復元
現在起動しているバックアップパーティーションを、プライマリパーティーションにコピーします。
以下のコマンドを実行します
`request system snapshot media internal slice alternate`

```
root@:RE:0% cli
root> request system snapshot media internal slice alternate
Formatting alternate root (/dev/da0s1a)...
Copying '/dev/da0s2a' to '/dev/da0s1a' .. (this may take a few minutes)
The following filesystems were archived: /
```

### パーティーションの確認
以下のコマンドで、パーティーションの状態を確認します。
`show system storage partitions`
```
root> show system storage partitions
Boot Media: internal (da0) ←SRX/EX内部のUSBマスストレージ
Active Partition: da0s1a ←プライマリのパーティーション
Backup Partition: da0s2a ←バックアップ(alternate)のパーティーション
Currently booted from: backup (da0s2a)
（中略）
root>
```

### プライマリパーティーションからのリブート
最後に、JUNOSをリブートします。
明示的にプライマリパーティーションから起動するよう、オプションを付与します。
`request system reboot slice alternate media internal`

```
root> request system reboot slice alternate media internal
Reboot the system ? [yes,no] (no) yes
（中略）
*** FINAL System shutdown message from root@ ***
 
System going down IMMEDIATELY
```
## JUNOSをバージョンアップする。

再起動後、現在のJUNOSバージョンを確認します。
バックアップパーティーションのJUNOSがバージョンは古い為、実際に使用するものにバージョンアップする必要があります。

```
root> show version
Model: ex2200-48t-4g
JUNOS Base OS boot [11.4R7.5]
JUNOS Base OS Software Suite [11.4R7.5]
JUNOS Kernel Software Suite [11.4R7.5]
JUNOS Crypto Software Suite [11.4R7.5]
JUNOS Online Documentation [11.4R7.5]
JUNOS Enterprise Software Suite [11.4R7.5]
JUNOS Packet Forwarding Engine Enterprise Software Suite [11.4R7.5]
JUNOS Routing Software Suite [11.4R7.5]
JUNOS Web Management [11.4R7.5]
JUNOS FIPS mode utilities [11.4R7.5]
```

### USBメモリをマウントする。
JUNOSをバージョンアップする手段はいくつかありますが、今回はUSBメモリ上のJUNOSイメージを使用します。
事前にFATでフォーマットされたUSBメモリに、英字のみでイメージを配置します。
今回は、USBメモリの`/JUNOS/EX2200`以下にJUNOSイメージを保存しています。
```
root@:LC:0% mount_msdosfs /dev/da1s1 /mnt
root@:LC:0% ls /mnt/JUNOS/EX2200/
jinstall-ex-2200-12.3R6.6-domestic-signed.tgz
jinstall-ex-2200-12.3R7.7-domestic-signed.tgz
```

### USBメモリからJUNOSイメージを展開する。
CLIモードに移行し、以下のコマンドでJUNOSイメージを展開します。
`request system software add no-copy no-validate <JUNOSイメージのフルパス 例:/mnt/JUNOS/EX2200/>`

### リブート
以下のコマンドでリブートを行います。
`request system reboot`
SoftEtherVPNでのクラスレス静的ルートの実装

## L2VPN接続時のルーティングについて
リモートワーク等でPCをL2 VPNで接続する際、対向ルーターへ接続するためのデフォルトゲートウェイと、実際にブラウザ等アプリケーションが使用するデフォルトゲートウェイが異なる場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/7b6b4e14-6aa9-a416-9627-35b4706948c6.png)

## この記事について
以下の記事を清書したものになります。
内容は当時(2014.10.08)のものとなります。
https://blog.mikalab.info/archives/643937.html
また、現時点ではオープンソース版でのクラスレス静的ルートは使用できません。

通常、L2VPN上でDHCPを使用した場合、VPNの先にあるルーターをデフォルトゲートウェイとしてプッシュする事となります。
しかし、DHCPの拡張仕様である、クラスレス静的ルート(RFC3442)を使用することで、VPN内で使用する必要な静的ルートテーブルのみプッシュする事が可能になります。

RFC 3442 - The Classless Static Route Option for Dynamic Host Configuration Protocol (DHCP) version 4 
https://tools.ietf.org/html/rfc3442

また、Windows Vista以降、MacOSX(10.9で確認)、iOS(iOS8. iOS7で確認)などが実装されています。

## SoftEther VPNの実装を使ってみる
クラスレス静的ルートを実装した和製のソフトウェアとして、SoftEtherVPNがあります。
今回は、SoftEther VPN Serverを用いて、静的ルートがプッシュされているか確認していきます。

### セキュアNATの設定

#### 仮想HUBの管理画面からSecureNATの設定を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/a09182e8-edf6-4f2d-db09-48558eabf0f0.png)

#### Secure NATの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/04a5b7d3-e4f3-65e7-199c-09bf2752e65c.png) 
- デフォルトゲートウェイを空欄にする 
- SecureNATのIPアドレスを覚えておく 

#### プッシュする静的ルーティングテーブルを設定
プッシュするルーティングテーブルを設定していきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/f6996696-3dd1-da24-3bac-f2a13d56062f.png)

この画像内では、以下のように入力しています
```
10.0.0.0/255.255.255.0/192.168.30.1,10.0.1.0/255.255.255.0/192.168.30.1
```

### クライアントでの認識
Windowsの場合、以下のように静的ルートがプッシュされている事がわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/a6768b74-1526-a928-bb40-215b83345f55.png)
VPC マルチAZで、商用版VyattaでHAクラスタを構成する

## AWS上でソフトウェアルーターを冗長化する
AWS上でソフトウェアルーターの冗長化(HAクラスタ)を構成します。
これにより、EC2インスタンスのトラブル等による影響を最小限に抑えられる、といったメリットがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/8f6431fc-cbb6-19da-ab71-5e3a3e837610.png)

今回、商用版Vyatta(および、Vyatta Core)を用いて、マルチAZ環境下でのHAクラスタを構成します。

## この記事について
以下の記事を清書したものになります。
内容は当時(2014.10.08)のものとなります。
https://blog.mikalab.info/archives/643967.html

## Vyatta固有の問題
Vyattaは、HAクラスタの機能として、OSSの`Heartbeat`を使用しています。
Heartbeatでは、ハートビートの送信にユニキャスト・マルチキャストを選択する事が可能です。
しかし、Vyattaは起動のタイミングで、Vyattaのコンフィグを基に全ミドルウェアのコンフィグを生成しなおした上で、ミドルウェアを起動します。
ここでは、Heartbeatのコンフィグを生成した上で、Heartbeatが起動される事になります。
併せて、Vyattaはハートビートの送信方法がマルチキャストに固定されています。
しかし、VPCではマルチキャストを取り扱う事が出来ず、そのままではHAクラスタを構成する事ができません。
その結果、起動直後からスプリットブレインが発生します。

## VPC上でマルチキャストを使う方法
ここではGRE Tunnelを構成した上で、トンネル内にマルチキャストパケットを通します。

1. GRE Tunnelを作成する
1. GRE Tunnelの両端にIPアドレスを割り当てる。
1. トンネルを用いて、Heartbeatがマルチキャストパケットを用いて相互監視をはじめる。

今回はVyatta固有の問題でしたが、マルチキャストパケットの取り扱いとして、1つの例になるかもしれません。

この結果、無事にクラスタが構成され、スプリットブレインが解消されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/f8aa67fa-9a52-68f5-fa08-812594470ad5.png)

### 検証環境
以下のAMIを使用しました
- AWS Marketplace: Vyatta Virtual Router/Firewall/VPN by Vyatta, Inc. VSE6.6R (07/17/2014) 
- https://aws.amazon.com/marketplace/pp/B009I5TLOE?ref=cns_srchrow
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53593/9a290ff6-2496-04b9-ee73-332248d7c593.png)



### サンプルコンフィグ
クラスタの片側(vyatta-a)でのコンフィグ例
```
set system host-name vyatta-a
set system time-zone Asia/Tokyo
 
set interfaces tunnel tun00 address '169.254.0.1/24'
set interfaces tunnel tun00 encapsulation 'gre'
set interfaces tunnel tun00 local-ip '《vyatta-aのLocalIP》'
set interfaces tunnel tun00 remote-ip '《vyatta-cのLocalIP》'
set interfaces tunnel tun00 multicast enable
 
set cluster interface tun00
set cluster pre-shared-secret mikalab
set cluster group aws
set cluster group aws primary vyatta-a
set cluster group aws secondary vyatta-c
```
VPC上でVyattaCoreのHA CLUSTERを自動構成する

## AWS VPC上でVyatta CoreをHA構成する
Vyattaは、HAの動作にマルチキャストを使用しており、そのままではMAZ上でHAにする事が出来ません。
この問題は、GRE Tunnelを構成し、トンネル内でマルチキャストパケットを疎通させる事で解決します。

## この記事について
以下の記事を清書したものになります。
内容は当時(2014.10.11)のものとなります。
https://blog.mikalab.info/archives/643917.html

## 本スクリプトについて
本スクリプトでは、Vyatta CoreにAWS CLIをインストールし、HA Clusterを半自動で設定します。

## スクリプト
https://github.com/tsumura-cloudpack/aws-vyatta-clustering-builder

## 使い方
```
% curl https://raw.githubusercontent.com/tsumura-cloudpack/aws-vyatta-clustering-builder/master/aws-vyatta-clustering-builder.sh > ./aws-vyatta-clustering-builder.sh
% chmod +x ./aws-vyatta-clustering-builder.sh
% ./aws-vyatta-clustering-builder.sh
```
スクリプトの実行が終了すると、以下のようなコメントとサンプルConfigが表示されます。
```
**************************
*** CONFIGURE COMPLETE ***
**************************
 
Can use aws-cli after re-login vyatta user.
Please edit setting files.
o /root/.aws/credentials - AWSCLI config.
o /etc/sysconfig/associate-eip - EIP Failover config.
o /etc/sysconfig/associate-nat - ROUTE TABLE Failover config.
o /etc/init.d/failover - Failover Script.
 
Edit AWSCLI credentials file first.
If use IAM role, delete credentials file.
 
Vyatta clustering sample config on vpc.
o vyatta-a - Primary 169.254.0.1/30
o vyatta-c - Secondary 169.254.0.2/30
* local-ip is this instanse ip addr.
---
set system host-name vyatta-a
set interfaces tunnel tun00 address '169.254.0.[1-2]/30'
set interfaces tunnel tun00 encapsulation 'gre'
set interfaces tunnel tun00 local-ip '10.0.0.1' // ※自身のLocalIP
set interfaces tunnel tun00 remote-ip '[Peer LocalIP]'
set interfaces tunnel tun00 multicast enable
  
set cluster interface tun00
set cluster pre-shared-secret mikalab
set cluster group aws
set cluster group aws primary vyatta-a
set cluster group aws secondary vyatta-c
```

Config内のlocal-ipは、自身のLocalIPを取得して表示しています。
Peer LocalIPとhostname、事前共有鍵、トンネルインターフェースのIPアドレスを書き換えてください。

### --nodownload
外部のパッケージのダウンロードをスキップします

### --configonly
Python + awscliのインストールとダウンロードをスキップします


## 動作条件
VyattaCore固有の部分をハードコードしている為、他への転用は難しいかと思います。
例）`/bin/sh.distrib`

## 動作の解説

### AWS CLIのダウンロード
AWS CLIのインストールを行います。
依存関係で、Python等を同時にインストールします。

### awsコマンドのオートコンプリート
次に、シェル上でのawsコマンドのオートコンプリートのため、/etc/profile.d/awscli.shを生成します。
次回ログイン時より、オートコンプリートが有効になります。

### コマンド類・設定ファイルの生成
`associate-nat`、`associate-eip`コマンド、及び設定ファイルを生成します。

#### associate-natコマンド
NATインスタンス等で使われるROUTE TABLEのエントリを書き換えます。
例えば「0.0.0.0/0」のエントリを書き換える場合、置換処理になる為、事前にエントリを生成する必要があります。

#### associate-eipコマンド
設定されたEIPを、自身に付け替えます。
この際、PublicIPで接続されているセッションは全て切断される為、クラスタの挙動を監視する場合などは事前にVPC内に踏み台を用意するなどして下さい。

### フェールオーバー時のスクリプトの生成
`/etc/init.d/failover`を生成します。
フェールオーバーした際にこのコードがVyatta内のHeartbeatからコールされます。
デフォルトでは、`associate-nat`、`associate-eip`といったコマンド類がコメントアウトされた状態ですので、環境に合わせて適宜編集してください。

## 参考サイト
VyattaにPython版AWSコマンドラインインターフェース(CLI)をインストールしてみた - suz-lab blog (Archive.org)
https://web.archive.org/web/20141013222921/http://blog.suz-lab.com/2013/08/vyattapythonawscli.html
Webサーバーとは

Webクライアントに対する窓口の役割を持つ。
動的、静的のコンテンツを配信している。
動的の場合はサーバーサイド・スクリプトプログラムと連携してWebブラウザへ転送している。
サーバーが停止すると```サービスが停止する```
Webサーバーの停止を防ぐために複数のサーバーが用意され、一台の負担を少なくするこれを```冗長化```（構成)という。

# 求められるサーバー機器の性能
静的ページのリクエストが多い場合はメモリの容量を大きくする。
動的ページのリクエストが多い場合は、CPUの性能の高さが求められる。

# 静的コンテンツの配置
Webサーバーと同じ場所になくてもいい。(ネットワーク環境/アクセスできる環境があれば)繋がれていればいい。
しかし通信する分レスポンスが遅くなってしまう。
複数台のサーバーで動作しているときは機器間で同じコンテンツを持つようにコンテンツの同期を行う。
Juniper SRX100でLACPを構成する

## Juniper SRXのETHポートは、スイッチングも出来る
Juniper SRX100のETHポートは、スイッチポートとしても利用する事が可能です。
今回は、Juniper SRX 100HでLACPを構成し、対向スイッチと接続します。

## この記事について
以下の記事を清書したものになります。
内容は当時(2014.09.10)のものとなります。
https://blog.mikalab.info/archives/643881.html

### ラボ環境
- Juniper SRX100H2(version 12.1X44-D35.5)
- Cisco Catalyst 2940

### コンフィグ(SRX100)
`fe-0/0/6`と、`fe-0/0/7`で、仮想インターフェース`ae0`を構成し、LACPを構成します
```
interfaces fe-0/0/6  fastether-options 802.3ad ae0;
interfaces fe-0/0/7 fastether-options 802.3ad ae0;
interfaces ae0 aggregated-ether-options lacp active;
interfaces ae0 aggregated-ether-options lacp periodic fast;
interfaces ae0 unit 0 family ethernet-switching vlan members vlan-trust;
```

### コンフィグ(対向スイッチ)
`FastEthernet0/1`と`FastEthernet0/2`で、`PortChannel1`を構成します
```
interface Port-channel1
!
interface FastEthernet0/1
 channel-group 1 mode active
!
interface FastEthernet0/2
 channel-group 1 mode active
!
```

## 参考サイト
- SRXシリーズ サービス・ゲートウェイ データシート 
 http://www.juniper.net/jp/jp/local/pdf/datasheets/1000281-jp.pdf

- Link aggregation (LACP) supported/non-supported configurations on SRX and EX 
http://kb.juniper.net/InfoCenter/index?page=content&id=KB22474

- Example: Configuring Chassis Cluster Redundant Ethernet Interfaces 
- http://www.juniper.net/techpubs/en_US/junos12.1/topics/example/chassis-cluster-redundant-ethernet-interface-configuring-cli.html#jd0e438

- The Joy of SRX – Fun With Redundancy 
- http://lamejournal.com/2013/08/30/the-joy-of-srx-fun-with-redundancy/

- JUNOSサンプルコンフィグ(EX編) Link Aggregation 
http://www.hs-juniperproducts.jp/guide/sample_config/ex/linkaggregation.html

- EtherChannel（LACP） 
http://www.ccstudy.org/study/switching/eclacp/eclacp.html
VueでDRYなエラーハンドリングを行う。

エラーの処理、どうしていますか？
今まで毎回下のようにコードに埋め込んでいたのですが、これではエラーハンドリングやエラーメッセージの保守コストが高くなります。
```throw new Error('エラーだよ。')```

よりDRYに書く方法はないかと調べているとすばらしい記事がヒットしました。
https://speakerdeck.com/nori3tsu/vue-dot-js-nuxt-dot-jsfalsekuroharuerahantorinkushi-zhuang

vueのpluginとしてエラーハンドリングを登録することでグローバルレベルでエラーハンドリングの定義が可能です。
また、自作のエラークラス(CustomError)を作成することでエラーの可読性や再利用性を高めています。

以下でvue3での実装を忘備録として書き残します。

### エラープラグインを作成・登録
```ErrorHandlingPlugin.ts
import { App } from 'vue'
import { CustomError, MissingConnectionError } from 'CustomError'

const ErrorHandlingPlugin = {
  install: function (app: App<Element>) {

    app.config.errorHandler = (err: unknown) => {
      handler(err)
    }

    // Vue.js以外のエラー
    window.addEventListener('error', (event) => {
      handler(event.error)
    })

    // Promise経由で呼び出されるエラー(Promise.reject)
    window.addEventListener('unhandledrejection', (event) => {
      handler(event.reason)
    })
  },
}

const handler = (err: unknown) => {
  if (err instanceof MissingConnectionError) {
    alert(err.message)
    // retry、画面再読み込みなど
  } else if (err instanceof 自作のエラークラス) {
    // ... 
  } else if (err instanceof CustomError) {
    console.info('CustomError')
    // エラー後の共通の処理(モーダル出すとか)
  } else if (err instanceof Error) {
    console.error('Error')
    // エラー後の共通の処理（5xxエラー画面飛ばすとか）
  }
}

export { ErrorHandlingPlugin }

```
```main.ts
import { createApp } from 'vue'
import { ErrorHandlingPlugin } from 'ErrorHandlingPlugin'

const app = createApp(App)
app.use(ErrorHandlingPlugin)
// ...
```

### 自作のエラークラス
```CustomError.ts
// メッセージの内容はenumで定義しておく
const ErrorMessage = {
  MISSING_CONNECTION: '通信エラーが発生しました。',
} as const
type ErrorMessage = typeof ErrorMessage[keyof typeof ErrorMessage]

interface CustomErrorInterface {
  message: string
  name: string
}

class CustomError extends Error implements CustomErrorInterface {
  constructor(message: string) {
    super(message)
    this.name = 'CustomError'
  }
}

// 自作のエラーはCustomErrorを拡張。命名としてErrorをつけるようにしている
class MissingConnectionError extends CustomError {
  constructor() {
    super(ErrorMessage.MISSING_CONNECTION)
    this.name = 'MissingConnectionError'
  }
}

export {
  ErrorMessage,
  CustomError,
  MissingConnectionError,
}
```

### エラー呼び出し
あとはエラーが出た時に自作エラーを投げれば共通の処理を行なってくれます！
```client.js
try {
  // エラーが出そうな処理
} catch (e) {
  console.error(e)
  throw new MissingConnectionError()
}

```
2022年6月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2022年6月1日の検索結果 (リスティング広告)

![20220601_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/fb75912c-fdbe-3c56-fac8-1b152df1b94c.png)

* IBM
* Splunk
* ServiceNow

リスティング広告だと、今月もIBM がトップでした(3か月連続)。 Splunk、ServiceNow が続いていますが、今月は3社しか広告が表示されていません (いつもは4社です)。

先月の結果はこちら --> [2022年5月 AIOps 定点観測](https://qiita.com/mkodera/items/35b97a683faf969b62fd)

# 2022年6月1日の検索結果 (広告以外)

![20220601_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/b4ae6843-8748-1162-46d0-46678b26caba.png)

* Splunk
* JBSVC
* テックファーム株式会社
* ServiceNow
* ITmedia
* 日本情報通信株式会社 (IBM Watson)

広告以外だと、上位 2位までは 2022年2月の定点観測開始以来、不動の2社です。その後にテックファーム株式会社、ServiceNow が続いています。

先月の結果はこちら --> [2022年5月 AIOps 定点観測](https://qiita.com/mkodera/items/35b97a683faf969b62fd)