OmniAICreator/Qiita-1.07M huggingface dataset:
python初学者の備忘録　比較演算子について

#### [←目次](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# 比較演算子とは
`基本`

+ 2つの式や値を比較し、bool型を返す
+ 以下の演算子がある

| 演算子| 式 | 　　　　　　　　説明 | 
|:-:|:-:|:--|
| == | a == b | aとb等しい |
| != | a != b | aとbが等しくない |
| <= | a <= b | aがb以下 |
| >= | a >=b | aがb以上 |
| < | a < b | aがbより小さい |
| > | a > b | aがbより大きい |
| is | a is b | aとbが等しい（objectの比較） |
| is not | a is not b | aとbが等しくない（objectの比較） |
| in | a in b | b(文字列、コレクション)にaが含まれる |
| not in | a not in b | b(文字列、コレクション)にaが含まれない |

##### ` == 、!= ` 演算子
```python
>>> 1 == 1 # 左辺と右辺が等しい
True

>>> 1 != 1 # 左辺と右辺が等しくない
False

>>> 1 == '1' # 左辺と右辺の型が違うのでFalseになる
False

>>> 1 == int('1') # 文字列をint型にキャストしたのでTrueになる
True

```

##### ` >、>=、<、<= `演算子
```python
>>> 2 > 1 # 左辺が右辺より大きい
True
>>> 2 >= 1 # 左辺が右辺以上
True

>>> 2 < 1 # 左辺が右辺より小さい
False
>>> 2 <= 1 # 左辺が右辺以下
False

# -- 複数使用も可 --
>>> 1 < 6 < 10
True

>>> 1 < 6 > 10
False
```

##### `論理積（and）`：すべての条件が真の場合Trueになる

```python
>>> 5 <= 6 and 5 >= 0
True
>>> 5 <= 6 and 5 <= 0
False
```

##### `論理和（or）`：いずれかの条件が真の場合Trueになる

```python
>>> 5 <= 6 or 5 <= 0
True
>>> 5 == 6 or 5 <= 0 
False
```

##### ` is、is not `演算子

```python
# object同士の比較
# -- ==ではなくisを使用する --
>>> a,b = 1,1
>>> a is b
True
# -- !=ではなくis notを使用する --
>>> a is not = b
False

# -- 違う型の比較 --
>>> a = '1'
>>> a is b
False
# 型が違うのでFalseになる
```

##### ` in 、not in `演算子
```python
# -- 右辺に左辺が含まれる場合Trueになる --
>>> 'い' in 'あいうえお'
True
>>> 'か' in 'あいうえお'
False

# -- 右辺に左辺が含まれない場合Trueになる --
>>> 'か' not in 'あいうえお'
True
>>> 'い' not in 'あいうえお'
False
```
python初学者の備忘録　print()関数について

#### [←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# print()関数とは
`基本`

+ print(値)で「値」を出力できる
+ ()の中を「,」で区切る事で複数の値を出力できる
+ ()の中で演算も行うことができる

##### 型毎の出力

```python
# -- 数値型 --
>>> print(1)
1

# -- 浮動小数型 --
>>> print(0.100100)
0.1001

# -- ''で囲うと出力結果が数値型に見えるが文字列 --
>>> print('0.100100')
0.100100
print('0.100100' type('0.100100'))
0.100100 #<class 'str'>

# -- 文字列型 --
>>> print('Hello')
Hello

# -- 複数値 --
>>> print(1, 1)
1 1
>>> print('a', 'b', 'c')
a b c

# -- 演算 --
>>> print(1 + 2)
3

# -- 不等式 --
print(2 > 1)
True
print(2 < 1)
False
```

##### 文字列の連結
```python
>>> print('テストの点数は' + 100 + '点です')
# 文字と数字は結合出来ないのでエラー

>>> print('テストの点数は' + '100' + '点です')
または
>>> print('テストの点数は' + str(100) + '点です')
テストの点は100点です

print('おはよう' * 6)
おはようおはようおはようおはようおはようおはよう

>>> print('おはよう' * 6 + 'こんにちは')
おはようおはようおはようおはようおはようおはようこんにちは

>>> print('おはよう' * 6 - 'こんにちは')
# 文字列の引き算は出来ないためエラー

>>> print('こんにちは' + 'おはよう' * 6)
こんにちはおはようおはようおはようおはようおはようおはよう
# 文字列結合の場合、演算子の優先順位は関係なくなる
```

#### print()関数のオプション

##### `sep`：区切り文字を指定して文字を連結する

```python:print_option.py
# -- オプションなし -- 
print('おはよう','こんにちは','こんばんは','またあした')
# -- 出力結果 --
おはようこんにちはこんばんはまたあした

# -- ,を指定する -- 
print('おはよう','こんにちは','こんばんは','またあした', sep=',')
# -- 出力結果 --
おはよう,こんにちは,こんばんは,またあした
```

##### `end`：末尾に文字を指定して連結する

```python:print_option.py
# -- 末尾に改行コードを挿入 --
print('おはよう','こんにちは', sep=',', end='\n')
print('こんばんは','またあした', sep=',')
# -- 出力結果 --
おはよう,こんにちは
こんばんは,またあした
```
python初学者の備忘録　変数について

#### [←目次へ](https://qiita.com/dondondon/items/cd45224ca93e65c976cc)

:::note info
python,Qiita初心者なので、備忘録として記載していきます。
なにせ初心者なので、知識不足はご容赦ください。
知識を深めながら追記していきたいと思います。
:::

# 変数とは
`基本`

+ 1など数字からの変数は宣言出来ない
+ Trueやifなどの予約語は使用できない
+ コードは上からの処理なので変数は上書きされる

:::note
他言語のように宣言時に型を指定する必要がない
代入するたびに型が変わる
:::

:::note alert
そのため暗黙的なキャストが発生しないように注意する
:::

##### `文字列の変数`

```python
>>> name = 'minnie'
>>> name
'minnie'

>>> name = 'mickey'
>>> name
'mickey'

>>> type(name)
# <class 'str'>
```

##### `数値型の変数`

```python
# -- 正数型 ---
>>> number = 1
>>> number
1
>>> type(number)
# <class 'int'>

# -- 浮動小数型 --
>>> number = 1.0
>>> number
1.0
>>> type(number)
# <class 'float'>
```

##### `複数の変数への代入`
```python
# 他言語と違い同時に別の型を代入できる
>>> a, b = 1, 'b'
>>> a,type(a), b,type(b) 
# 1 <class 'int'> b <class 'str'>
```

```vb:VB.NETでやるならこう？
Dim a As Integer = 1, b As String = "b"
Dim a As Integer = 1 : Dim b As String = "b"
```

```C#:C#でやるならこう？
int a = 1; string b = "b";

```

##### `異なる型の値を代入すると型も変わる`

```python
# -- 文字列変数に数値を代入すると数値型に変わる --
>>> name = 'mickey'
>>> type(name)
# <class 'str'>

>>> name = 1
>>> type(name)
# <class 'int'>
```

##### `変数に変数を代入する事もできる`

```python
>>> a = 5
>>> b = 10
>>> a, b
5 10

# -- aにbを代入 --
>>> a = b
>>> a
10

# -- 一度に代入する事も可能 --
>>> a, b = b, a
>>> a, b
10 5

# -- 一度に宣言する事も可能 --
>>> c, d = 20, 30
>>> c, d
20, 30
```
python3 辞書型

##辞書の基本
```
n = int(input())

zaisan = {}

for i in range(n):
    [s,a] = input().split()
    zaisan[s]= a

S = input()
    
print(zaisan[S])
print(zaisan)
```
・zaisan = {} とすることで辞書を初期化して 変数 zaisan に代入できます。
・zaisan に s に対応する値 a を追加するには zaisan[s] = a とします。（重要）
・zaisan における S に対応する値にアクセスするには zaisan[S] とします。

入力例1
2
Kirishima 1
Kyoko 2
Kirishima

出力例1
1

<hr>

```
n = int(input())
dmg = {}

for i in range(n):
    s=input()
    dmg[s]=0
#kirishima:0,kyoko:0を作る
    
m = int(input())

for i in range(m):
     [p,a] = input().split()
     a = int(a)
     dmg[p] += a
#kyoko:2,kyoko:1と上書きされる     

S = input()

print(dmg[S])
print(dmg)
```


気づきとしては、dmg[]というのは、
dmgに登録されている[Aさん]Aさんを参照していることになる。

名前が同じであれば上書きすることもできる。

<hr>

#辞書データの順序

```
n = int(input())
dmg = {}

for i in range(n):
    s = input()
    dmg[s] = 0

m = int(input())

for i in range(m):
    [p, a] = input().split()
    a = int(a)
    dmg[p] += a

names = list(dmg.keys())
names.sort()

for name in names:
    print(dmg[name])
```
・keys は辞書のメソッドで、辞書のキー（今回だと人名）を取り出します。dmg.keys() はこれだけだとリストになっていないので、list関数 でリストに変換すると、dmg のキーになっている人名のリスト names を作ることができます。
・あとは names をソートして、names の要素をキーとする dmg の値を順に出力すれば OK です。
【重要】
・Python のfor文はリストなどの要素を直接ループ用の変数に代入することができます。したがって、for i in range(n): とした後に names[i] のようにして人名にアクセスせずとも、for name in names: で name が names のそれぞれの要素を指すようになります。
[Java基礎⑤] forで繰り返し処理

<h2>初めに</h2>
今回はforでのループ処理の基本と、
標準入力からデータを読み込む方法を学びました。

最後に標準入力とループ処理を行います。


<h2>forでのループ処理の基本形</h2>

```java:
public class Main {
    public static void main(String[] args) {
        for(int i = 0; i<=4; i++){
            System.out.println("hello world");
        }
    }
}
```
実行すると hello worldが４回出力されます。

<h6>HTMLを作成する</h6>

```java:
public class Main {
    public static void main(String[] args) {
        System.out.println("<ul>");
        for(int i = 1; i <= 100; i++) {
            System.out.println("<li>" + i + "</li>");
        }
        System.out.println("</ul>");
    }
}
```

HTMLを使う場合は、```System.out.println("<li>" + i + "</li>");```というふうに書くんですね


<h2>標準入力からデータを読み込む</h2>

<h6>文字列の読み込み</h6>

```java:
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.next();
        System.out.println(line);
    }
}
```

<h6>数値の読み込み</h6>

```java:
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int line = sc.nextInt();
        System.out.println(line);
    }
}
```
 「sc.nextInt();」が忘れがちでした。

<h2>標準入力×ループ処理</h2>
複数回出力したい場合には、nextメソッドを複数回実行すれば良いそうです。

```java:
// 標準入力とループ処理
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        for(int i=1; i<=count; i++){
        System.out.println("スライムがあらわれた"); 
        }
    }
}
```
標準入力が３なら、スライムがあらわれた　が３回出力されます。


```java:
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();

        String line;
        for(int i = 0; i < count; i++) {
            line = sc.next();
            System.out.println(line);
        }
    }
}
```
標準入力で
３
りんご
メロン
みかん　と入力されれば、
りんご
メロン
みかん　が出力されます。

<h2>終わり</h2>
複数データを読み込み、forで処理するのがまだ難しいです。
【PHP】余り計算の活用方法

```PHP
<?php

$cnt = 3;

3 % 3 余りは0

2 % 3 余りは2 

1 % 3 余りは1  

0 % 3 余りは0

$nocori = $cnt - (1 % 3);
//残りは2となる
?>


4 % 4 余りは0

3 % 4 余りは3

2 % 4 余りは2 

1 % 4 余りは1  

0 % 4 余りは0

```
python3 sort　昇順・降順　（記録）

#重要なところは、a.sort(reverse=True)の箇所

# 昇順
```python
n = int(input())
a = [0]*n

for i in range(n):
    a[i] = int(input())

a.sort()

for i in range(n):
    print(a[i])
```

#降順

```python
n = int(input())

a = [0]*n

for i in range(n):
    a[i] = int(input())

a.sort(reverse=True)

for i in range(n):
    print(a[i])
```

https://note.nkmk.me/python-list-sort-sorted/


#辞書型のソート

```
n = int(input())
ab = [None]*n

for i in range(n):
    [a,b] = input().split()
    a = int(a)
    b = int(b)
    ab[i] = [a,b]

ab.sort(reverse=True)

for i in range(n):
    [a,b] = ab[i]
    print(a,b)
```

入力例1
2
1 3
2 2

出力例1
2 2
1 3
Neko Project IIを使ってみた

PC-9801のエミュレータはいくつかありますが、Neko Project IIを使ってみました。

https://www.yui.ne.jp/np2/

いろいろ派生プロジェクトがあるようですが、こちらが本家のようです。

DISK Imageはもちろん[targ](https://qiita.com/yamori813/items/0203a6f0d016a68bdfc6)から持ってきます。Neko Project IIではVirtual98(v98)というフォーマットを使っているようです。

v98フォーマットは220バイトのヘッダーがあり、その後が実際のデータです。ヘッダーの最初にはVHD1.00という文字が入っていて、セクター数やヘッド数などの情報が入っているようです。

これの空イメージを作るコマンドを作られている方がいました。

https://github.com/lpproj/mydosuty/tree/master/makehdi

githubでv98のシグネチャーのVHD1.00を検索して一番最後にありました。githubの検索は同じものが最初に出てきて、頭が悪いです。

FreeBSDでコンパイルして、これで空イメージを作ります。

```
% cc -s -Wall -O2 -o makehdi makehdi.c
% ./makehdi -f v98 --size 40m -h 8 -s 25 dos.hdd
```

scsi_targetにvオプションを追加してv98を使えるようにしました。

```
% sudo ./scsi_target -v 2:0:0 dos.hdd
```

これで実機でフロッピーからMS-DOS 5.0Aを起動してformatコマンドで固定ディスクを初期化,領域確保してdos.hddをWindows 7にコピーします。私はRLoginを使っているので、このアプリのSFTPファイル転送機能を使います。

コピーしたファイルをNeko Project IIのHarddiskから読み込みリセットします。

![neko2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7fff2241-793f-c599-4e59-a2fcc26d3184.png)

イメージはNDというアプリケーションで開く事ができました。

![ND.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/233dbcac-61a1-fac7-5d67-60e73c4bea61.png)

DiskExplorerという同様なアプリもあったのですが、こちらでは開く事ができませんでした。

FreeBSD上のmtoolsでも開けました。

https://qiita.com/yamori813/items/f9449e7bd8c4f33c4279
svn log をコメントなしで取得する

# コマンド
- `-q`オプションを付けてログを取得する。

```
$ svn log -q > svn_log.txt
```

# おまけ
- 上記`svn_log.txt`中の点線を削除したい場合は以下のコマンドを実行。

```
$ sed -i -e '/------------------------------------------------------------------------/d' svn_log.txt
```
WSL2でlocalhostに接続できなくてはまったこと

WSL2 (ubuntu)で起動したlocalhostアプリに接続できなかった。

原因は、ネットワークアダプタのipv6が有効なせいっぽい。
でも、ipv6をoffにする運用をするわけにはいかないので

WSLから起動しているubuntuのipv6を無効にすることで解決させた。
いろんな記事では、標準 or mntする機能をごにょごにょすることでコントロールできるとかいろいろあるんだけど全然うまくいかず。

結局

>/etc/sysctl.conf

に

```
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
```
を定義しておいて

```/etc/profile.d/ ```
の配下に

> ipv4.sh

とか適当なシェルを作成して

```
#! /bin/bash
sudo sysctl -p
```

起動時に実行させる方法にした。

> sudo netstat -tulpn | grep LISTEN

の結果が

```
127.0.0.1:8000          0.0.0.0:*
```

の状態にならないとつながらない。

```
127.0.0.1:8000          ::1
```

の状態は駄目だった。

補足: .wslconfigで指定しても無理。

```
localhostForwarding=true
```
緊急避妊にかかる対面診療が可能な産婦人科医療機関等の一覧をCSVに変換


最終更新　令和6年5月20日のデータ
スプレッドシート

https://docs.google.com/spreadsheets/d/19BF7W4ajfrP3ySBUz6HBZg7GrvefLZsb3mB6jzcmt7w/edit?usp=sharing

camelotだと遅いのと変換できない県があったのでpdfplumberで変換

とりあえず変換のみ

```python
import pathlib
from urllib.parse import urljoin

import requests
from bs4 import BeautifulSoup

import pdfplumber
import pandas as pd

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
}


def fetch_soup(url, parser="html.parser"):

    r = requests.get(url, headers=headers)
    r.raise_for_status()

    soup = BeautifulSoup(r.content, parser)

    return soup


def fetch_file(url, name, dir="."):

    p = pathlib.Path(dir, f"{name}.pdf")
    p.parent.mkdir(parents=True, exist_ok=True)

    r = requests.get(url)
    r.raise_for_status()

    with p.open(mode="wb") as fw:
        fw.write(r.content)
    return p


url = "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/0000186912_00002.html"

soup = fetch_soup(url)

dfs = []

for i in soup.select("ul.m-listLink--hCol2 > li > a"):

    pref = i.get_text()

    print(pref)

    link = urljoin(url, i.get("href"))

    p = fetch_file(link, pref)

    with pdfplumber.open(p) as pdf:

        for page in pdf.pages:

            table = page.extract_table()

            df_tmp = pd.DataFrame(table)

            row, col = df_tmp.shape

            if col == 8:

                df_tmp.insert(0, "有無", "")

            df_tmp = df_tmp.set_axis(
                [
                    "公表の希望の有無",
                    "施設名",
                    "郵便番号",
                    "住所",
                    "電話番号",
                    "ウェブサイトURL",
                    "産科、婦人科又は産婦人科の標榜の有無",
                    "医療機関における緊急避妊にかかる対面診療への対応可能時間帯",
                    "常時の緊急避妊薬の在庫の有無",
                ],
                axis=1,
            )

            dfs.append(df_tmp)

df0 = pd.concat(dfs).reset_index(drop=True)
df0

df1 = df0.copy()

df1[df1["施設名"].isin(["基本情報", "施設名"])].to_csv("kakunin.csv", encoding="utf_8_sig")

df1.shape

df2 = df1[~df1["施設名"].isin(["基本情報", "施設名"])].copy().reset_index(drop=True)

df2.shape


df2["施設名"] = df2["施設名"].str.replace("\n", "")
df2["住所"] = df2["住所"].str.replace("\n", "")
df2["ウェブサイトURL"] = df2["ウェブサイトURL"].str.replace("\n", "")

df2

df2.to_csv("list.csv", encoding="utf_8_sig")
```
備忘録 WinMerge Excel VBA 比較

Excel 前設定
1. 「ファイル」-「その他」-「オプション」-「トラストセンター」-「トラストセンターの設定」
2. ☑「マクロの設定」-「VBA プロジェクト オブジェクト モデルへのアクセスを信頼する」
WinMerge 設定
3. .xlsmファイル　選択
4. 「ファイル展開プラグイン」で「CompareMSExcelFiles.sct」指定
5. 比較
Haskellを使ってHello World（Mac向け）

# Haskellの動作環境構築 （Mac向け）
## はじめに
<b>Haskell</b>の動作環境構築方法を記します。
筆者の環境の都合上、Mac向けのものです。また、本内容は記事執筆時点(2021年9月)のものです。
内容が陳腐化する可能性がある点、ご容赦ください。

## 環境構築方法

[Haskellのホームページ](https://www.haskell.org/)にアクセスしましょう。

まず、【Downloads】をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630591/ccd3df8b-b1f6-a1df-fd3d-ec256c409d79.png)

次に、Platform specific instructionsから【GHCup】をクリックします。
![スクリーンショット 2021-09-05 17.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630591/e1574763-6a81-c0cc-b839-158c5f5023e6.png)

遷移した画面に表示されているコマンドをターミナルに入力して実行し、インストールを開始します。
ナビゲーションに従ってキー入力し、インストールを進めます。


![スクリーンショット 2021-09-05 17.19.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630591/4f1e65e1-9cc7-863a-912d-f73f8b1ed5ad.png)

参考：記事執筆時点のコマンド

`curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh`

参考：インストール中のターミナル画面
![スクリーンショット 2021-09-05 17.31.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630591/4d5a4b03-ceaa-4240-0eb2-9ae22d34ae9a.png)

参考：インストール完了時のターミナル画面
![スクリーンショット 2021-09-05 17.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630591/458edc9c-208c-ad2d-6aa6-40c7cccc539d.png)

ターミナルを再起動してコマンド`ghci`を実行し、次の画面が表示されることを確認します。
![スクリーンショット 2021-09-05 17.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630591/b0e88417-dd93-b43c-c736-34b08f1013c7.png)

それでは最後に、恒例のミッションを遂行しましょう。
Haskellでは、`putStrLn`と命名されている関数を用います。

![スクリーンショット 2021-09-05 18.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630591/5c26dc57-926a-cc24-0ecd-21d0e6f9ea69.png)
【Mac】Docker+rails6+MySQLで環境構築中にaddress already in useと出たら？

環境
---
・macOS Big Sur バーション11.5.2
・シェル zsh
・Ruby 3.0.2
・rails 6.1.4
・My SQL 8.0.23
・Docker 20.10.8

Docker file
---
```rails:Dockerfile
FROM ruby:3.0.2
RUN apt-get update -qq && apt-get install -y nodejs

# yarnパッケージ管理ツールをインストール
# https://classic.yarnpkg.com/en/docs/install/#debian-stable
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update && apt-get install yarn

WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]
```
docker-compose.yml
---
```rails:docker-compose.yml
version: "3"

services:
  db:
    image: mysql:8.0.26
    command: mysqld --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    ports:
        - 3306:3306
    volumes:
      - ./tmp/db:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    environment:
      MYSQL_HOST: db
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```
エラー内容
---
```
$ docker compose up
```
↓

```
Starting mysql_db_1 ... error

ERROR: for mysql_db_1  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use

ERROR: for db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use
ERROR: Encountered errors while bringing up the project.
```
[【Docker】Rails+MySQLの環境をDockerで構築中「ポートの衝突」に遭遇してから解決するまで](https://qiita.com/terufumi1122/items/8253a47ff24b64455fe5)
こちらの記事を参考に２つの解決策を試してみるも解決できず、、、

エラーにはaddress already in useとあるので他にaddressが使われていないか調べていきます。

```
$ lsof -i:3306
```
↓

```
COMMAND   PID  USER  ...
mysqld    117 SAKAE  ...
```
出てきました！これを消せばいいわけです！

消すコマンドはこちら

```
$ kill 117
```
それでもうまくいかない場合
---
__探すとき__

```
$ sudo lsof -i:3306
```
or

```
$ sudo lsof -i -P | grep "LISTEN"
```
__消したい時__

```
$ sudo kill <killしたいportのPID>
```
それでもダメなら
---
```rails:docker-compose.yaml
ports:
      - "3306:3306"
```
↓

```
ports:
      - "3307:3306"
```
このようにポート番号を変えることで解決できる場合もあります。
【2021最新版】Minecraft serverを高速で走らせる.batファイルの書き方

サーバーが重い原因はいろいろあるが、それを解消するために`.bat`ファイルに引数を色々書いてサーバーを起動させる…というテクニックがある。ググればいろんなサイトがいろんな設定を紹介してくれているが、実際何をするとサーバーが軽くなるのか、様々なパラメータを検証した。
**※細かい話はいいから結論だけ知りたい人は一番下までスクロール**

##テストしたサーバーのスペック
minecraft forge server 1.12.2-2855
MOD各種(工業系とか魔術系とか)70個ぐらい

シングルプレイに安定8GB必要な感じの構成。

#サーバーに必要なのはメモリ？CPU？グラボ？

結論から言うと、CPU>メモリ>>>>>グラボではないかなと。

###CPU
**特にクロック(周波数)が重要**で、実はコア数はサーバーにはあんまり関係がない。
クロックというのはざっくり言って1秒間に何回の演算処理ができるかという数値で、だいたい3GHzが安定して出ていればサーバーとしては問題ないと思われる。
コア数が関係ないというのは、マインクラフトのサーバーはシングルコアで動かすのが実際最適なため。加速させようとして並列化するとかえって遅くなったりする。つまり、

```
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing
-XX:ParallelGCThreads=12 -XX:+AggressiveOpts
```
なんかよく紹介されているコレは不要だった。
ただし、サーバーとクライアントを同じPCで動かす場合、`-server`を指定しておかないと、両方を同じコアで動かそうとして重くなってしまう(らしい)ので、どんなにひどくても2コアはあった方がいいと思われる。もっとも今の時代なら大抵のCPUはその点問題ないとは思うが。

###メモリ

シングルプレイが満足にできるスペックであれば、メモリの要件は満たしていると言える。サーバーがカクつかないように、シングルプレイで割り当てていたのと同程度の割り当てをしておきたい。MOD山盛りのサーバーだとかなり割り当てを増やさないといけなくなるが、逆にバニラサーバーで遊ぶ分には2GBもあれば足りる。
サーバーとクライアントを同じPCで動かす場合、例えば16GB積みのPCでサーバー8GB、クライアント8GBのような割り当てをしてしまうと`OutOfMemoryError`待ったなしなので、少しでいいから余裕を持たせよう。メモリの割り当ては2の累乗数であるべきとよく言われるが、実際例えばクライアントのメモリ割り当てを6GBとかにしても普通に動く。

###GPU(グラボ)

画面描画のお話なので、サーバーには関係がない。

##Java

###JREかJDKか
走らせるにはJREが必要だが、JDKにはJREが同梱されているため、どっちでも動く。

###64bin版か32bit版か

64bit版推奨。32bit版だとメモリの割り当てで不具合をきたすことがある。両方インストールしている場合は32bit版をアンインストールする。

##その他よく紹介されている引数の要不要について

###@echo off
**要らない。というか、どうでもいい。**
.batファイルの中身をコマンドプロンプトに表示させるかどうかというそれだけの話なので、あってもなくても動作に影響はない。書きたければ書く、ぐらい。

###pause
**これもどうでもいい。**
これを書くと最後コマンドプロンプトの画面が自動で消えない、というだけ。サーバーの動作には影響がない。

###nogui
**これを書いた方が軽いらしい。**
書かないとコマンドプロンプトとマイクラサーバーのGUI画面が出る。これを書くとコマンドプロンプトのみになる。後者の方がやや早い。
情報が錯綜しているポイントだが、**ハイフンは不要。**ハイフン入れると普通にGUIが表示される。

#結論

```
java -server -Xmx8G -Xms8G -jar server.jar nogui
pause
```
これだけで良かった。
Simple is best.
GitとGitHubを基本からまとめてみた【チーム開発】

## 基本的な流れ

#### 1. GitHubなどにリポジトリを作成する

#### 2. ローカルのGitとリポジトリを接続する<br>（あるいは既存リポジトリのデータをCloneする）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/e38a46fd-440a-52a9-dc82-2cfba7fd09e2.png)

```
git clone <URL>
```

#### 3. master(main)から作業ブランチを作成する。
##### ※ 絶対にmaster(main)で作業を行わない ＝ ローカルでは手を加えないこと

作業用のブランチは、『feauture/番号や作業内容』が多い。
急ぎのバグ修正は、『fix/番号や作業内容』や『hotfix/番号や作業内容』を頭に付ける。

Taskを管理する機能『issues』

①『New issues』をクリックし、タイトルを入力する。

②『Assignees』を選択し、コメント入力後、『Submit new issue』を押す。
##### ※ タイトルの最後尾に　#番号　が記載してあるので、ブランチにfeature/9などを記載して、ブランチを見ただけで他の人がどういった作業をしたのか理解できるようにする。

③　VScodeの左下の『master』を押して、新しいブランチ　例『feature/9』と入力する。

④ コードを編集し、差分を確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/ca466753-dddd-8f24-820d-6d426540721c.png)



#### 4. 作業し、コミットする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/984dc649-0bf3-6467-1b1b-ff96750b5f80.png)

#### 5. リモートにPushする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/258a43ca-9046-00b6-df82-d8180058e1bd.png)

#### 6. masterに対してプルリクエストを出す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/0e06e1dc-3bdf-90ab-f3c3-cc77e9744e36.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/c4aa6d60-d112-e6e3-99f5-88ee3ade8b6a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/f5e736d1-0c16-0bee-e1cd-3621782e2eb1.png)


#### 7. FB(ファンクションブロック)があった場合、対応して再度Pushする。

※ ファンクションブロックとは、よく使う演算処理などのロジックプログラムを1つの関数としてまとめたもの。関数化することでロジックプログラムが簡素化でき、プログラム作成の工数が削減できる。

## プルリクエスト時のポイント

- 何をやったのか明確に記載する
- 作業範囲のスクリーンショットが添付する
- issueの番号を記載する（#1）
- fix #14 のようにissue番号を記載しておくと、マージされた時点で該当Issueを自動でクローズしてくれる




## 参考サイト
[チーム開発の流れ](https://www.flock.codes/Wqu2Rh22633p4dFdnG3E)
[チーム開発におけるGitの基本操作](https://yoshiaki-toyama.com/%E3%83%81%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bgit%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/)
PowerAutomateDesktopを用いてexcelの表まとめの自動化までのメモ　その3

本記事はPowerAutomateDesktopを用いて業務で利用するエクセルをまとめる
手法を記載したものである

[PowerAutomateDesktopを用いてexcelの表まとめの自動化までのメモ - Qiita](https://qiita.com/moitaro/items/df30ce015fba33fc98ab)
[PowerAutomateDesktopを用いてexcelの表まとめの自動化までのメモ　その２ - Qiita](https://qiita.com/moitaro/items/0131d7e38ba776a21c96)

今現在は
値がエクセルそのままだと取得出来ないので

```
Excel.ReadCell Instance: excelTounendoInstance StartColumn: 15 StartRow: 10 ReadAsText: True CellValue=> ExcelData
↓
Excel.ReadCell Instance: excelTounendoInstance StartColumn: 15 StartRow: 10 ReadAsText: False CellValue=> ExcelData
```
とReadAsText: False でやったら出来た所まで　です……
えーっとココから……
OneNoteが重いときの Tips

同期で遅くなっていることが大半のため、[ファイル] ＞ [同期] から手動同期に変更する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203985/7f1b1339-a6ed-820b-3d31-0fef221f2adf.png)

同期を深夜や電源オフ前にスケジューリングできれば良いが、、方法は調査中。
java 標準入力　（記録）

##N行のデータの入力

```java
    public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      String[]input_line = new String[sc.nextInt()];
      sc.nextLine();
      for(int i=0;i<input_line.length;i++){
        input_line[i] = sc.nextLine();

        System.out.println(input_line[i]);
      }
    }
```

入力例1
3
aaaaa
bbbbbb
cccc

出力例1
aaaaa
bbbbbb
cccc

<hr>

###3つのデータの入力

```java
    public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      String a = sc.next();
      String b = sc.next();
      String c = sc.next();
      System.out.println(a);
      System.out.println(b);
      System.out.println(c);
  }
```

scにまず新しく入力されたものを入れるよと、new Scanner(System.in)と書く。
次に、sc.next()でスキャン文字を入れていく。nextの回数分scに入れる。
<hr>

###N個のデータの入力 (空白除去）

```java
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    String N = sc.nextLine();
    int n = Integer.parseInt(N);
    // String[] str = sc.nextLine().split(",");
    String[] str = sc.nextLine().split("[ ]");
    for(int i =0; i <n;i++){
      System.out.println(str[i]);
    }
  }
```

.split("[ ]")で空白行を除去して出力したりできます。

入力例1
3
aaaaa bbbbbb cccc

出力例1
aaaaa
bbbbbb
cccc

<hr>

###カンマ区切りの3つのデータの入力

```java
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    String[] str = sc.nextLine().split(",");
    System.out.println(str[0]);
    System.out.println(str[1]);
    System.out.println(str[2]);
  }
}
```

入力例1
aaaaa,bbbbbb,cccc

出力例1
aaaaa
bbbbbb
cccc

<hr>

###カンマ区切りのN個のデータの入力

```java
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    String N = sc.nextLine();
    int n = Integer.parseInt(N);
    String[] str = sc.nextLine().split(",");
    for(int i =0; i <n;i++){
      System.out.println(str[i]);
    }
  }
```

入力例1
3
aaaaa,bbbbbb,cccc

出力例1
aaaaa
bbbbbb
cccc
Slackのスレッドが未読(太字)のままになってしまった

スレッドをすべて読んでも、未読状態(太字表示)のままになってしまいました。
以下の方法で解決しました。

* `Shift+Esc` で全未読をクリアする

参考
https://github.com/wavebox/waveboxapp/issues/201
フォーム入力欄に最初から数字が入ってしまう現象をvalue: "" で対処した。

# なぜかフォーム入力欄に最初から数字の ０ が入ってしまう現象が発生してしまった。

```ruby
 <div class="weight-bold-text">
        商品名
        <span class="indispensable">必須</span>
      </div>
      <%= f.text_area :item_name, class:"items-text", id:"item-name", placeholder:"商品名（必須 40文字まで)", maxlength:"40" %>
```
原因はわかりませんが、ページを開くと入力欄に数字の０が既に入ってしまい対処に困りました。

```ruby
 <div class="weight-bold-text">
        商品名
        <span class="indispensable">必須</span>
      </div>
      <%= f.text_area :item_name, class:"items-text", id:"item-name", placeholder:"商品名（必須 40文字まで)", maxlength:"40" , value: "" %>
```
とりあえず　value: ""　を記述して入力欄を空にできましたが、何故このような現象が起きたのかは、未だに分かっていません…
【Linux】ディレクトリごとコピーする

ディレクトリごとコピーをしたいときに使えるLinuxコマンド

```
$ cp -r [コピーしたいディレクトリ] [コピーしたいディレクトリの場所]
```

```
$ cp -r app /Users/******```
```
こんな感じでコマンドを実行するとappというディレクトリが/User/******の中にコピーされる。
AWS 日常タスク用IAMユーザーをつくる(Day1対応)

AWSアカウント作成時に作られるルートアカウントは日常タスクでは使用しないことが強く推奨されます。

ひとまず日常的なタスク用の管理者権限のIAMユーザーを作成します。

#大まかな手順
*ルートユーザーでIAMのダッシュボードへ
*IAMユーザーを新規に作成して、IAMポリシーにより管理者権限を設定する
*IAMユーザーにログインする

#今回つくるIAMユーザー
・IAMの操作権限あり
・ルートアカウントしかできない権限は付与されない
・IAMユーザー単体にポリシーを付けてIAMを機能させていく

#IAMダッシュボードの操作
*ユーザー＞ユーザーを追加
###ユーザー詳細の設定
ユーザー名：何用かとか入力
アクセスの種類：プログラムによるアクセス、AWS マネジメントコンソールへのアクセス両方選択
コンソールのパスワード：は好きな方を選択
パスワードのリセットが必要：自分ではない第三者に付与する場合などにチェックすることがよい

###アクセス権限の設定
「既存のポリシーを直接アタッチ」　をクリック
「AdministratorAccess」にチェックをして次へ
(上記ポリシーはルートアカウントとほぼ変わらない権限を付与されているもの)

###タグの設定
情報を追加するようなもの。どの部署のユーザーなのかどこのリソースなのか。(Group：iOS department　など)
管理しやすいものを入力する

*ユーザー作成成功画面で表示される「アクセスキーID」と「シークレットアクセスキー」はAWS CLIで使うもの

*作成が完了したらMFAを有効にする
sbt native packager でビルドしたDockerイメージにファイルをコピー

# sbt native packager でビルドしたDockerイメージにファイルをコピーする

Amazon Keyspacesに接続するために jksファイルをDocker Imageに含める必要があった。

Native packager の Docker plugin の設定にファイルのマッピングを含めればいいだけだった。

```scala
  def dockerSettings: Seq[Setting[_]] = Seq(
    Docker / mappings += file("shared-resources/cassandra_truststore.jks") -> "opt/docker/cassandra_truststore.jks"
  )
```

https://www.scala-sbt.org/sbt-native-packager/formats/docker.html
RailsマンにとってPandasのDataFrame型がモヤモヤする理由

## PandasのDataFrame型はモヤモヤする
当方、元々Rails歴3年で、最近Kaggleを始めた超初心者なのですが、Railsの経験が活かされる場面もあれば、逆にRailsの経験がバイアスになり混乱する場面もあります。入門してまず躓いたのは、PandasのDataFrame型です。特に`df['name']`や`df.iloc[0]`とやらで混乱してしまいました。

## RailsとPandas テーブルデータの操作の違い
例えば、次のようなテーブルデータからオブジェクトを作成し、1行目・1列目を取り出す場合のコードの違いを比較します。

| id | name |
| --- | --- |
| 1 | 田中太郎 |
| 2 | 佐藤花子 |
| 3 | 山田一郎 |

### PandasのDataFrame型
```python
data = {
    'id': [1, 2, 3],
    'name': ['田中太郎', '佐藤花子', '山田一郎']
}
users = pd.DataFrame(data)

# 1行目を取り出したいとき
users.iloc[0]

# 1列目を取り出したいとき
users['id']
```

### RailsのActive Record
```ruby
data = [
    {id: 1, name: '田中太郎'},
    {id: 2: name: '佐藤花子'},
    {id: 3: name: '山田一郎'},
]
users = User.new(data)

# 1行目を取り出したいとき
users[0]

# 1列目を取り出したいとき
users.select('id')
```

## 何が違うのか？
PandasもRailsも、テーブルのデータを操作するという点で共通ですが、決定的に違う点があります。それはズバリ、

**Pandasは列でデータを区切るが、
Railsは行でデータを区切る**

という違いになります。

それぞれの`data`の型を見比べればさらに明らかになります。
Pandasでは辞書型になっていますが、Railsでは配列型になっています。

実はPandasが`users['id']`と書くのは、Pandasだから(あるいはPythonだから)ではなく、辞書型だから当然のことなのです。

## なぜ違うのか？（私見）
どちらもテーブルのデータを操作するという点で共通ですが、なぜPandasでは列でデータを区切り、Railsは行でデータを区切るのでしょうか？
これは公式の見解ではなく、私見になります。
それは単純に、**PandasとRailsで用途が違うから** だと思います。

**Pandasの用途はデータ分析なので、行よりも列を柔軟に扱いたい**
→データ分析では、列ごとに何かしらの処理をしたいことが多いです。例えばある列の平均値を算出したり、ある列の欠損値を埋めたりなど。逆に分析対象のデータの行数が増減したり、行ごとに抽出したりするシーンは比較的少ないのだと思います。なので列ごとにデータを区切ったほうが都合が良いです。

**Railsの用途はWeb開発なので、列よりも行を柔軟に扱いたい**
→一方、Web開発では行ごとに何かしらの処理をしたいことが多いです。where文である条件に合致する行だけを抽出したり、行の新規追加、削除、更新など。逆にテーブルの列が増減したりは比較的少ないと思います。なので行ごとにデータを区切ったほうが都合が良いです。

## PandasのDataFrameはスバラシイ
以上のように理解してから、PandasのDataFrame型と仲良くなれた気がします。公式の見解ではありませんが、少しでもPandas習得の助けになれば幸いです。
【Ruby on Rails】redcarpetを使ったMarkdown記法の拡張機能のまとめ


#対象者

* マークダウンを実装予定の方
* gem redcarpetを使う予定の方

#目的

* redcarpetの拡張機能を一つひとつ理解しながら使用する

#実際の手順と実例
###1.gemの導入
Gemfile

````
:
gem redcarpet
:
````

**bundle install**を実行


###2.拡張機能一覧

|   | 機能 | 説明 |
|:-:|:-:|:-:|
|  １ | :no_intra_emphasis  | 単語の強調。**や--で囲う|
|  ２ |  :fenced_code_blocks |  フェンスで囲まれたコードブロックを解析します。3つ以上の~バックティックで区切られたブロックは、インデントする必要なしにコードと見なされます。オプションの言語名は、コードブロックの開始フェンスの最後に追加できます。 |
|  ３ |  :autolink |  リンクを解析します。http、https、およびftpプロトコルの自動リンクは自動的に検出されます |
|  ４ | :disable_indented_code_blocks  |  各行の前に4つのスペースがあるテキストをコードブロックに変換します。 |
|  ５ |  :strikethrough |  打ち消し線を使います。〜文字〜と入力すると打ち消しされます |
| ６  | :space_after_headers  | 見出しを作ります。#の数でh1〜h6まで分かれます。#の後に半角スペースが必要  |


※随時更新


#参照

>[red carpet 公式Github](https://github.com/vmg/redcarpet)


####投稿者コメント

PFにマークダウンを実装したので、拡張機能をまとめました。関連記事として、マークダウン自体の実装方法も記事にする予定です。

####My Profile
プログラミング学習歴4ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や
自分が躓いた箇所等のアウトプットの為に発信しています。
もし、投稿した記事の中に誤り等ございましたら、
コメント欄でご教授いただけると幸いです。
インテルNUC11PAHi7のブルースクリーンに困った

# 概要
NUC11PAHi7を買って組み立てたはいいが、最新のドライバーをインストールした瞬間から、以降Windows起動するたびにブルースクリーンになる問題が解決しました。

# 現象の詳細
Windows起動後3分前後で、マウスやキーボード、画面の切り替えなどの動きが遅くなり、リセットしました。
リセットせずにブルースクリーンになるように設定しましたが、ブルースクリーンになってもダンプファイルが生成されず、
どこでリセットしているのかが全くわからない状態でした。
イベントビューアでみると、「WHEA-Logger イベントID：1＝致命的なハードウェアエラー」としか表示されず・・・
トリガーは「ドライバーの更新」なので、ドライバーを最新の状態にせず、だましだまし使っていましたが、今回はWindows Update適用時のドライバ適用で現象が再現するようになってしまった。

# 原因と解決策
こちらです。
https://www.intel.co.jp/content/www/jp/ja/support/articles/000059177/intel-nuc.html

BIOSのアップデートをあえて2回実行することで、最新のドライバーを適用しても正常に動作するようになりました。

こんなん分かるか～！
AWS Security Hubとは

##AWS Security Hubとは
　組織内の様々なセキュリティデータを集約して、一元的に可視化してくれるAWSサービス
以下でAWS Security Hub利用の6つのステップについてのベストプラクティスをまとめる

##1.AWS Security Hubをデプロイする

* 全リージョン、全アカウントでSecurity Hub、Configを有効化する
* セキュリティマスターアカウントを指定する

##2.セキュリティツールと統合する

* GuardDuty・Inspector・Macie・IAM Access Analyzer・Firewall Manager・SystemsManagerなどのAWSサービスを統合する
* パートナーソリューションを統合する

##3.セキュリティ基準を有効化する

* 「AWS基礎セキュリティのベストプラクティス」や「CIS AWS Founfations Benchmark」などのセキュリティ基準を有効化する

##4.セキュリティ検出結果を取り扱う

* 高い重要度の検出結果を優先し、改善ガイダンスに従って対応する
* カスタムインサイトやワークフローステータスを使い、調査を効率化する

##5.対応を自動化する

* カスタムアクションを定義し対応を自動化する

##6.コス管理をする

* 無料期間を利用してコスト試算する
* セキュリティチェック項目を選別し、コストを最適化する

##おわりに
SCS試験対策の自分用のメモとして記録しました。
【初心者向け】ディープリンク技術の概要と注意点

チーム内で「ディープリンク」「ダイナミックリンク」「ユニバーサルリンク」等の用語の認識が合っているのか怪しかったので、整理してみました。

基本iOS開発者目線で書いてますが、実装寄りではなく概念寄りの内容なので、Android開発者でも読めると思います。

私の認識違いなどがありましたら、コメント欄にてご教示いただけますと幸いです。

※この記事ではURL/URIの区別を厳密に意識せず、より馴染み深い"URL"に統一して記述しています。

# ディープリンク (Deep Link) とは

任意のアプリの任意の画面に遷移させるURL、またはそれを扱う仕組みの総称であり、概念を表す用語です。

スマホアプリで代表的なユースケースは以下のとおりです。

- スマホのブラウザでWebコンテンツ内のリンクをtapした際に、AアプリのX画面に遷移させる。
- Aアプリのボタンをtapした際に、BアプリのY画面に遷移させる。

# ディープリンクを実現する仕組み

## カスタムURLスキーム

- URLスキームとは、URLの“://”より前の部分で、リソースにアクセスするための手段を示します。
- http/https, ftp, mailto などなどが既定のURLスキームです。
- アプリ独自で決めたURLスキームをカスタムURLスキームと呼びます。myapp://hoge/fuga のようなURLになります。
- アプリでの設定/実装によって、カスタムURLスキームによるディープリンクを実現できます。

iOS/Androidでの実装方法については素晴らしい記事が他にたくさんあるので、他に譲ります。

### カスタムURLスキームの弱点と注意点

- ブラウザやメールソフトからのカスタムURLスキーム起動においては「アプリがインストールされていない場合に○○する」という要件を満たすことが困難です（※「仕様を認識しているアプリ同士」においては可能です）。
- 誰かが管理しているわけではないので、他のアプリとスキームが競合する可能性があります。
- 端末内に同じカスタムURLスキームを持つアプリが複数インストールされている場合、
    - Androidの場合、どのアプリを起動するかを選択するためのダイアログが表示されます。
    - iOSの場合、バージョンによって違いがあるようですが先／後にインストールしたアプリが勝手に起動されます。
- したがって「ユーザーが気づかないうちに意図に反した挙動をしてしまう可能性がある」という弱点があり、それを狙った攻撃を「URLスキーム・ハイジャック」と呼びます。

URLスキーム・ハイジャックの事例解説記事：

https://blog.trendmicro.co.jp/archives/22020

## iOS ユニバーサルリンク (Universal Links)

見た目は"https"で始まる単なるWebページのようなURLです。
iOS端末でユニバーサルリンクにアクセスすると、ターゲットのアプリがインストールされている場合は起動しますし、インストールされていない場合は任意のWebページを表示してくれます。

※リンクのtapにて直接App Storeへの遷移はできないため、当該Webページ内にApp Storeへのリンクを用意する必要があります。

この機能を使う前提作業として、関連づけファイル (apple-app-site-association/AASA) をWebサーバーに配置します。
「このドメイン・パスのURLリンクはこのアプリと関連づきますよ」という定義をするためのファイルです。
したがってAASAは、独自ドメインの、自前のWebサーバーに配置する必要があり、AASAにはアプリを一意にするBundle IDなどを設定します。

その他にアプリ側の対応（プロビジョニング・プロファイルとXcodeの設定、ハンドリングの実装）も必要です。

以上の設定と実装によって、iOS端末と、AASAを配置したWebサーバーとの間で内部的に連携して、URLリンクにアクセスした際に連携するべきアプリが決定されます。

公式ドキュメント：

https://developer.apple.com/ios/universal-links/

参考リンク：

https://dev.classmethod.jp/articles/universal-links/

## Android アプリリンク (App Links)

ユニバーサルリンクと同様の概念・機能ですので詳細は割愛します。

公式ドキュメント：

https://developer.android.com/studio/write/app-link-indexing?hl=ja

# Firebase Dynamic Links

ユニバーサルリンク／アプリリンクは、カスタムURLスキームの弱点を解消した強力な仕組みではありますが、「自前のドメインとWebサーバーを用意し、OSごとに異なる"仕込み"を行う必要がある」というデメリットがあります。

Firebase DynamicLinksはその手間を解消することを主目的とし、

- 関連づけファイルを配置するWebサーバーをホスティングしてくれる
- Dynamic Links既定の `https://{任意のサブドメイン}.page.link` というドメインで使える、または独自ドメインも指定可能
- 関連づけファイルの設定をコンソール上から行える

というサービスです。

リンクを開いたユーザーのiOS/Androidデバイスにアプリがインストールされていない場合にストアに遷移し、インストール完了後にアプリを起動してリンクを開く、といったこともできます。

さらに「どこから流入してアプリをインストールしたか」といった解析サービスも付いています。

公式ドキュメント：

https://firebase.google.com/docs/dynamic-links?hl=ja
PyUSB USBError: [Errno 16] Resource busy への対処療法かもしれないメモ

# 結論

入出力実行(USBデバイスに制御データ・データを送る)前にis_kernel_driver_activeがTrueならdetach_kernel_driverする。

入出力実行後に、usb.util.dispose_resourcesしてからattach_kernel_driver

例。これは手元にあるデバイス用なので、各自適宜変更してください。

``` python3
if dev.is_kernel_driver_active(intf.bInterfaceNumber):
    dev.detach_kernel_driver(intf.bInterfaceNumber)
writes = dev.ctrl_transfer(bmRequestType=0x21,
                           bRequest=0x09,
                           wValue=0x0200,
                           data_or_wLength=[1 << 6])
data = dev.read(endp.bEndpointAddress, 1)
usb.util.dispose_resources(dev)
dev.attach_kernel_driver(intf.bInterfaceNumber)
```

# 経緯

djangoつかっていて実際の入出力をしようとすると、

USBError: [Errno 16] Resource busy

と怒られる。kernelが先にドライバーを登録しちゃってるからだそうで、

dev = usb.core.find(idVendor=0xa81, idProduct=0x0701)

(※手元にあるデバイス用なので適宜変更して下さい。)

したときのdevで

``` python
cfg = dev[0]
intf = cfg[(0, 0)]
if dev.is_kernel_driver_active(intf.bInterfaceNumber):
    dev.detach_kernel_driver(intf.bInterfaceNumber)
```

をすると動く。
これで解決！

…ならばここに来てないと思う。

1度目はこれで動くのだが、2度目のurlリクエストでは、is_kernel_driver_activeもFalseなのに

USBError: [Errno 16] Resource busy

って怒られる。1回目の処理のインスタンスでくわえ込んだままになってる？

でわ、各自入出力した後は一旦kernelに戻してやればよいではないか！
入出力実行した後で detach_kernel_driver()である！

しかしなぜかこれも怒られる。

USBError: [Errno 16] Resource busy

どうも自分自身でもで実行したら実行した後も続けて実行するときのために
PyUSB内部でくわえこんでるようなのである。それがattach/detachを妨げる。

そこで、探してきたのが

usb.util.dispose_resources(dev)

PyUSBがくわえこんでるのを一旦開放しちゃう！
すると、

dev.attach_kernel_driver(intf.bInterfaceNumber)

が成功するようになる。

次回また実行してもうまくいく。

なお、別プログラム(別プロセス)でPyUSBしてる時に自分のところでも同じデバイスに対してPyUSB入出力すると

USBError: [Errno 16] Resource busy

になる。
テスト時等には注意されたし。
Write Code Every Day. Have Fun Every Day.

続けることそのものに特に意味はない。とはいえ。「知之者不如好之者、好之者不如楽之者」という言葉があるという。

## 続けている人々

https://zenn.dev/kazuchanfl/articles/a5d012bd957d4c

https://queryok.ikuwow.com/entry/everyday-commit/

https://syfm.hatenablog.com/entry/2017/11/30/055733

https://ksoichiro.blogspot.com/2015/07/blog-post.html

https://snowlong.hatenablog.com/entry/2014/04/18/%E6%AF%8E%E6%97%A5%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%93%E3%81%A8

https://johnresig.com/blog/write-code-every-day/

https://qiita.com/hidenorly/items/f445c8dfb94d65208f32

https://qiita.com/sauna1137/items/a8c2a078a31d367b789d

https://techblog.zozo.com/entry/techblog6years

続けるコツというとダイエットとか英会話とか、よくある話題なのだけど、自分は以下がなっとくした。

https://note.com/mayu_word/n/n6643706403de#jYJ1y

結果が見えるのは大事だし、楽しくないと続かない。そしてそれが習慣化されることが大事だとおもう。

https://qiita.com/mizo_k/items/c2aba14e77f5fc6f7483

こんな同僚もいて尊敬する。

## 続けたい自分

コードなり駄文なり書くのに悩むことは無くはない。

しかし自分の情報収集元というのを大体決めていて、その「インプット」に対する感想を膨らます。それを書き続けている。インプットはだいたい以下である。

1. はてぶで話題になっているもの。https://b.hatena.ne.jp/hotentry/it
2. [Qiita](https://qiita.com/)、 [zenn](https://zenn.dev/) そのもの
3. [dev.to](https://dev.to/)
4. [githubのTrending](https://github.com/trending)
5. 社内Slackで見かけた話題

本当は加えて、月1冊は本を読みたい。ただ少なくとも「話題になっているもの」そのものに加えて極力、第一次情報や公式情報を大事に読むのを意識したいと考えている。これは自分のために。

そして流石に半年以上やってくるとまとめ記事的な話題には追記とか、メンテナンス作業が大事だなということも増えた。

ただ結局何が一番楽しくてやっているかと言うと反応だったりその話題に対してああだこうだ言われること。アクシデント的に「バズる」より、むしろ小さな反応が嬉しい。コメントしてもらえたり、リンク張ってもらえたり。

https://pixe.la/v1/users/yamada-n/graphs/my-tweet-graph.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/1eca6e63-7624-5e3e-2d99-82af41209040.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/2d8e3cdc-328f-213c-92bb-0df1b5cd0217.png)

ということで「楽しむこと」。「Have fun」。それが一番の「続けるコツ」だろうな、という自己の記録。冒頭の「知之者不如好之者、好之者不如楽之者」は昔の上司が何かと言っていた「これを知る者はこれを好む者に如かず。これを好む者はこれを楽しむ者に如かず。」という孔子の「論語」。そんなもんですかねえ～という程度に当時は受け止めていたがまあ、できれば楽しいことに越したことはないよなと思い2021年9月の話として書いておく。(2022.04ちょいと追記)

## 2人目

https://note.com/sho0113/n/n4468b7d5cb0e

2人目、3人目と踊りたいなあとおもう。

以上なにがしか参考になればさいわいです。
AudioUnitV2のExampleを動かす

## はじめに

AppleサイトにおけるAudioUnitプラグイン開発の[最新のサンプル](https://developer.apple.com/documentation/audiotoolbox/audio_unit_v3_plug-ins/creating_custom_audio_effects)はAudioUnitV3のサンプルのみとなっています。

AudioUnitV2のサンプルXcodeプロジェクトは[ここ](https://developer.apple.com/library/archive/samplecode/sc2195/Introduction/Intro.html#//apple_ref/doc/uid/DTS40013969-Intro-DontLinkElementID_2)にありますが、2016年を最後にメンテナンスはされておらず、最新の環境(2021年9月現在)ではそのままでは動きません。

ここでは、AudioUnitEffectExample内のFilterDemoプロジェクト をXcode 12.5, Mac OSX 10.15の環境でビルドするための手順をメモしておきます。(BigSurやApple Sillicon環境では試せていません)

AudioUnitEffectExample\FilterDemo.xcodeprojを開いて下記の手順で修正します。

## 1. "error: implicit declaration of function 'verify_noerr' is invalid in C99" の修正


HighSierraからマクロがリネームされ、アンダーバーを二つ頭につける形になったようです。昔の名前を使うには、プリプロセッサー定義で"-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=1"を付加します。

FilterDemo, CocoaUIターゲットそれぞれについて"Build Settings"から下記のように設定してください。（実際のところ全てに設定しなくても良いかもしれませんが、どれが効いているかわからないので全部に設定しました）。

![スクリーンショット 2021-09-06 4.51.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58790/838ee5db-b9c7-0273-f12e-727cb16a6f9e.png)

## 2. "'CADebugMacros.h' file not found" の修正

PublicUtilityフォルダにあるファイルのうちサンプルで使っているファイルがXcodeのプロジェクトに追加されていないのが原因です。PublicUtilityフォルダにあるファイルを全て選択してXcodeのPublicUtilityフォルダ以下にドラッグアンドドロップで追加します

![スクリーンショット 2021-09-06 4.54.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58790/405a7bea-319a-02b1-1640-4574fed75b3c.png)

## 3. ビルド＆インストール
これでとりあえずビルドは通るようになりました。

Xcode上で、Products\Filter.componentを右クリックして、"Open in finder"でcomponentファイルのあるフォルダを開きます。

Filter.componentを下記のいずれかにコピーしてください。これでLogic等から読み込めるようになるはずです。

- ~Library/Audio/Plug-Ins/Components/
- /Library/Audio/Plug-Ins/Components

![スクリーンショット 2021-09-06 5.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58790/2c808d4b-77ce-f9b2-8c00-b512340dc42e.png)
はじめてのJulia (4)：データ構造

# 辞書 (Dictionary)
`(key) => (値)`で辞書を作成できる。keyと値のペアを除去する場合は`pop!()`を使う。

```jl
# 辞書の作成
fruits = Dict("Apple" => "¥65", "Banana" => "¥100")

# 値の確認
fruits["Apple"]

# keyと値の一覧
fruits

# 後から追加
fruits["Orange"] = "¥80"

# 辞書から除去する
pop!(fruits, "Apple")

# インデックス指定はできない
fruits[1] # Error
```

# タプル (Tuple)
タプルは丸括弧`(values)`で指定する。配列（後述）と違い、後から編集できない。

インデックスの値は`1`からであることに注意。

```jl
# タプルの作成
animals = ("Zebrafish", "Rat", "Macaques")

# 名前をつけることもできる
animals = (fish = "Zebrafish", rodent = "Rat", monkey = "Macaques")

# 名前やインデックス指定で値を呼び出せる
animals[1] # Zebrafish
animals.fish # Zebrafish

# 値の変更はできない
animals[1] = "Nematode" # Error
```

# 配列 (Array)
配列は角括弧`[values]`で作成する。タプルと違い、後から編集が可能。
値の追加は`push!()`、値の削除は`pop!()`で行う。

```jl
# 配列の作成：データ型は問わない
addresses = ["Tokyo", "Fukuoka", "Hokkaido"]
numbers = [1, 2, 3, 4]

# 混合でも大丈夫
mix = [1, 2.0, "three", true]

# インデックス指定
addresses[3] #Hokkaido

# 値の変更
addresses[3] = "Aomori"

# 値の追加
push!(numbers, 5)

# 最後尾の値の削除
pop!(numbers)
```

より複雑な配列も作成できる。

```jl
# ベクトル配列
numbers = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]

# 2次元配列
a = rand(3, 2)
b = [1 2 3
     4 5 6]

# 3次元配列
c = rand(3, 2, 4)
d = reshape(collect(1:24), (2, 3, 4))
```

空の配列を作りたい時は、`[]`で作成できる。

```jl
numbers = [] #空の配列を作成
for i in 1:10
    push!(numbers, i) #1から10までの数字を順に入れていく
end
```

以上。
はじめてのJulia(3)：基本操作

# 基本操作
## ショートカット
| 機能 | コマンド | ショートカット |
| --- | --- | --- |
| Juliaを閉じる | exit() | CTRL + D |


# 四則演算

| 演算 | 構文 |
| :---: | :---: | 
|足し算|+|
|引き算|-|
|掛け算|*|
|べき乗|^|
|割り算（商：小数）|/|
|割り算（商：整数）|÷|
|割り算（余り）|%|

# 文字・文字列

文字にはstring型（文字列）とcharacter型（文字）がある。
string型は文字列でダブルクォーテーション`" "`またはダブルクォーテーションx3`""" """`で囲む。
character型は文字でシングルクォーテーション`' '`で囲む。

| 型 | 記法 |
| :---: | :---: | 
| string | " " |
| string | """ """ |
| character | ' ' |

```jl
# 通常のstring型は""で囲む
"Hello Julia!"

# 文字列内に""がある場合はエラーとなる
"We get an "error"!"

# 文字列内の"はバックスラッシュでエスケープする
"We don't get an \"error\"!"

# """ """で囲めばエラーとならない
"""We get no "error"!"""

# character型は''で囲む
'a'

# 文字列をcharacter型として指定するとエラーが出る
'You should give a character!'
```

`$変数`とすることで、string型の文字列の中に変数を挿入することができる。`$(式)`とすれば、各種演算も可能。

```jl
item = "books"
num = 10
num_tot = 20

# 文字列への挿入
println("I bought $num $(item)!")
# 演算もできる
println("I have $(num + num_tot) $(item)!")
```

文字列の結合は`string()`または`*`でできる。

```jl
# string()でstring型の結合ができる
println(string("Hello, ", "Julia!"))

# 結果は上と同じ
s1 = "Hello, ";
s2 = "Julia!";
println(s1*s2)
```


以上。
Materializeを組み込むためのTips

## 導入
https://materializecss.com/getting-started.html

## M
```js
M.AutoInit();
```
JSの操作はMというオブジェクトを使って行う。このMはグローバル変数として定義されていて、その証拠にブラウザの開発用コンソールからアクセスできる。つまり一つのスクリプトファイル内で

```js
import "materialize-css/dist/js/materialize"
```
されていれば、他のコンポーネント等で再度importする必要がない。というよりしてはいけない。Mを使った操作を行うと無駄に処理が行われてしまう。
例えば[.waves-*](https://materializecss.com/waves.html#!)を使ってボタンを押す度にエフェクトを出すようにすると、エフェクトがそのまま残り続けたりする。

## import
webpackなどを使用していて、エントリー用のJSに

```js
import "materialize-css"
```
のようにしてしまうと、materialize.cssが別に読み込まれてcssをオーバライドできなくなる。JS単体はdistディレクトリ内のJSから読み込む。

## オーバライド
Materializeの設定は~materialize-css/sass/components/_variables.scssで設定されている。ここで書かれている変数は全て[!default](https://sass-lang.com/documentation/variables#default-values)フラグ付きでグローバル変数として定義されているので、エントリー用のscssファイルに

```scss
$primary-color: black; // e.g.
@import "materialize-css/sass/materialize.scss";
```
のようにすると上書きされる。

## utilites
Materializeはutilitesがあまり充実していない。htmlのclassだけでレイアウトを整えるにはBootstrapを部分的に使うとよい。

https://getbootstrap.jp/docs/5.0/getting-started/download/

コンパイル済みのbootstrap-grid.css, bootstrap-reboot.css, bootstrap-utilities.cssを読み込ませる。bootstrap-gridはMaterializeと設定が重複するので使いたい方を後に読み込ませる。
【UE4】Unreal Engine 4.27.0において、バインディングのマッピングを追加するとエンジンが落ちるバグとその対策

#この記事を読む前に
この記事は、UE4バージョン「4.27.0」と「SteamVR」Pluginの両方に関わりがある方向けの記事となります。また、このバグの根本的な解決はできておりません。何卒ご容赦ください。

#症状
Unreal Engine 4.27.0において、[設定]→[プロジェクト設定]→[インプット]→[バインディング]から「アクションマッピング」「軸マッピング」のどちらかを追加するとUE4が落ちる。

#原因を探る
色々試してみて分かったことを記述する。
まず、このバグがこのプロジェクト固有のバグかどうか確かめるために、新しくプロジェクトを作成した。その結果、新しく作成したプロジェクトでは起きなかった。が、バグが発生したプロジェクトと環境が違う点が一つある。

それは「SteamVR」Pluginの有無だ。
私はHTC Viveを所持しており、UE4を起動すると設定せずとも勝手にSteamVRが立ち上がる。
しかし、今回のプロジェクトではVRの開発をするわけでもなく、さらに、毎回プロジェクトを立ち上げる度に起動するのは鬱陶しい。
これを無効化させる為に、Pluginの設定からSteamVRを無効化させている。

今回新しく作成したプロジェクトではSteamVRのPluginを無効化させておらず、無効化させると、同様のバグが発生するのを確認した。

#ならば別のバージョンはどうか
ひとつ前のバージョンの「4.26.2」をインストールし、同様の検証をした。
結果、「SteamVR」Pluginの有無関係なしに、このバグは起きなかった。

#ダウングレードが上手くいかない
ならばこのバージョンで開発してみてはどうか?ということで、早速プロジェクトのバックアップをとり、ダウングレード。
プロジェクトを開いてみたところ、作業の進捗度具合が上手く反映されておらず、実質クラッシュ。
やはり新しくバージョンを上げることは容易でも、落とすことは難しいらしい。

#しかし、1から別バージョンでプロジェクトを作るのはきつい。
ダウングレードも上手くいかず、アップデートも待ってられない。どうしたものか。

#別バージョンから一部データを持ってくるのはどうか。
プロジェクトのバインディングなどのデータは「DefaultInput.ini」というデータに保存される。
ディレクトリは「プロジェクトフォルダー」→「Config」→「DefaultInput.ini」

このデータを別バージョンからコピーし、本データに移動させるのはどうか。
検証の結果、可能ではあるが、同様のバグは解消されなかった。
つまり、バインディングのみ過去バージョンで編集し、データを移動して使用することは可能であった。

#結論
バグは解消されなかったが、いくつかの方法で対処はできる為、下記に記述する。

1: Plugin「SteamVR」の無効化をせず開発を続ける。
2: 過去バージョンでバインディングの設定を制作し、「DefaultInput.ini」に保存されたデータを本データに置き換える。
3: 過去バージョンで制作する。
4: アップデートを待つ。

#まとめ
今回のバグに遭遇し検索しても記事が見つからなかった為、記事を制作してみたい気持ちもあり、初めて投稿した。このように文面にしてまとめるのは好きなので今後も続けていきたい。

#更新履歴
2021_0906_0233 記事を投稿
2021_0906_1758 更新履歴の追加と改行を修正
TrueNASのNFSをUbuntuでマウントできない時

※自分用メモです

## 環境
### server
TrueNAS on ESXi
バージョン: TrueNAS-12.0-U5.1
### client
Ubuntu 20.04 on ESXi

## エラー
```
sudo mount -t nfs <server> <local>
mount.nfs: access denied by server while mounting <server>
```

## 原因
Mapall userを設定しないとプロセスがnobody:nobodyになってしまうらしい…
参考のページを紛失したため、真偽不明。

## 解決策
![スクリーンショット 2021-09-06 022421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179807/f51b46a4-c1a4-82c3-dc87-6be74ffa16f2.png)

共有 > NFS > Add の`Mapall User`を設定する。
【エラー備忘録】git commit時にエディタが開かない　There was a problem with the editor 'code --wait'

##状況・エラー文
はじめて`$ git commit`コマンドを使う際、コミットメッセージを登録するためのエディタが開かない。
ターミナルには以下のエラーメッセージ。

```
$ git commit

hint: Waiting for your editor to close the file... code --wait: code: command not found
error: There was a problem with the editor 'code --wait'.
Please supply the message using either -m or -F option.
```

##原因・解決策
`code: command not found`とあるので、vscodeのPathが原因と思われる。　
vscodeを開いて設定を行う。

コマンドパレッド（Shift+Command+p)より、`シェルコマンド　PATH内にcodeコマンドをインストールします`を選択してインストールすると、解決した。

###注
`error: unable to start editor`となる場合は、configの設定が必要。

```
$ git config --global core.editor 'code --wait'
```

##参考記事
https://qiita.com/grca3/items/0771099a6750840721b1
SSH接続でWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!と表記されて接続できない！

#エラー内容
サーバ移行後にSSH接続をしようとすると接続先や鍵ファイルが正しいのに下記メッセージが表示されて接続できない時があった。

```terminal
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

こちらのメッセージが表示され接続拒否されます。

#原因
fingerprint(フィンガープリント)というものが存在する。
fingerprintとは、接続したことあるサーバの情報のこと。
一度接続したサーバーの情報（fingerprint）は、known_hostsに保存されている。
二回目以降のSSH接続では、fingerprintと、接続先のサーバー情報（ホスト名）を比較し、一致した場合、接続が可能となり、不一致だとこのような警告が表示される。

#対処方法
対処方法は2つあります。

①/Users/~/.ssh/known_hostsを開き、接続するIPアドレスについて検索し情報を削除。

```terminal
vi /Users/~/.ssh/known_hosts
```
　⇨開いたら接続するIPアドレスについて検索し削除する

②/Users/~/.ssh/known_hostsから、コマンドにて接続するIPアドレスの情報を削除。

・ssh-keygenコマンド

```terminal
ssh-keygen -R 00.00.00.00
```
※00.00.00.00 の部分はホスト名か接続先IPアドレスに置き換える。

●エラー文の中に下記のような文があるのでそこからファイルのパスとIPアドレスをコピーすると楽

```terminal
Offending ECDSA key in /Users/〜/.ssh/known_hosts:~~
ECDSA host key for 00.00.00.00 has changed and you have requested strict checking.
```

# 参考
https://www.niandc.co.jp/sol/tech/date20150729_507.php

https://knowledge.amimoto-ami.com/knowledge/warning-remote-host-identification-has-changed

https://qiita.com/wnoguchi/items/690f3f4651f8f11e4ed3
K6のメトリクスの早見表

K6はロードテストツールです。
K6の実行結果が何を表しているかわからなかったので、自分なりにまとめてみました。
間違っていたらツッコミお願いします。
正確な情報はドキュメントを参照してください。
https://k6.io/docs/using-k6/metrics/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482013/32c73b42-297e-2124-57b8-9aa14b79f45d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482013/e44e76bd-d8d0-8997-bf01-94d9a19a9504.png)
C++の競プロ環境を作る  M1 Mac(Big Sur)

最近メインのPCをM1 Macにしたのですが、C++で競プロをやる際に、コンパイルあたりで躓いたので記事にしました。

この記事は以下の2つの記事･サイトをBig Surに対応させただけの記事です

https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6#3path%E3%81%AE%E8%A8%AD%E5%AE%9A

https://blog.spiralray.net/cp/devenv-cpp

# 環境
- macOS Big Sur
- g++ 11
- Apple Silicon

# 目標
`bits/stdc++.h`を使いたい
デバッグとかは使わない

#解決したいこと
macOSに標準搭載のC++用コンパイラはClang系らしい。
目標の通り、`bits/stdc++.h`を使いたいので、コンパイラをgcc系に切り替える

# 1.確認
```bash
$ which g++
/usr/bin/g++
```
何もしてないから、Clangが出てくる

# 2.gccのインストール
```bash
$ brew install gcc
```

# 3.PATH
上記の記事では`/usr/local/bin/`にgccがあると書いている。
が、Apple SiliconのArm64では、homebrewのインストール先は`/opt/homebrew`配下になるので、`/opt/homebrew/bin`にgccがある。

ここからシンボリックリンクを貼る

```bash
$ ln -s /opt/homebrew/bin/g++-11 /usr/local/bin/g++
```

これでOK。確認してみる

```bash
$ which g++
/usr/local/bin/g++
```

# 4. Visual Studio Code
このままだとVScodeで`bits/stdc++.h`をincludeしようとすると警告が出てうざいので治す。
[上記の記事](https://qiita.com/EngTks/items/ffa2a7b4d264e7a052c6#5-include-bitsstdch%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B"target="_blank")の通り、`/opt/homebrew/Celler/gcc/11.2.0/include/c++/11.1.0/aarch64-apple-darwin20/bits/stdc++.h`を`/opt/homebrew/include`以下に配置する。

```bash
$ cd /opt/homebrew
$ mkdir ./include/bits
$ cp ./Celler/gcc/11.2.0/include/c++/11.1.0/aarch64-apple-darwin20/bits/stdc++.h ./include/bits
```

## Intellisenseに`bits/stdc++.h`を認識させる

```json:c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${workspaceFolder}/**",
                "/opt/homebrew/include/**"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
            ],
            "compilerPath": "/usr/local/bin/g++",
            "cStandard": "c17",
            "cppStandard": "c++14",
            "intelliSenseMode": "macos-gcc-arm64"
        }
    ],
    "version": 4
}
```
おわり