OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonではじめる機械学習 part1

# はじめに
世間的にもAIや機械学習の需要が高まってきている中で、趣味として興味がありPython+sklearnを用いた機械学習の概要を学習しています。

この記事は、自分の得た知識の定着の意味も込めて1冊の参考書の概要と所感をまとめていきます。
(オライリーは敬遠しがちだったので、強い気持ちを持って読み切りたい)

自分が学ぶ過程で誰かの知識の糧になれば幸いです。

### 目的
・習得した知識の定着を図る。
・素早く学びを振り返れる状態にする。

### 記載ルール
概要と所感をセットで記述する。
概要の1セクションは5行程度に収める。読みやすさ大事。

### 参考文献
[Pythonではじめる機械学習<br> ~scikit-learnで学ぶ特徴料エンジニアリングと機械学習の基礎~](https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E2%80%95scikit-learn%E3%81%A7%E5%AD%A6%E3%81%B6%E7%89%B9%E5%BE%B4%E9%87%8F%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E7%A4%8E-Andreas-C-Muller/dp/4873117984/ref=asc_df_4873117984/?tag=jpgo-22&linkCode=df0&hvadid=295686767484&hvpos=&hvnetw=g&hvrand=4025408870408604495&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009278&hvtargid=pla-526272655673&psc=1&th=1&psc=1)
発行：オライリー・ジャパン

### 環境構築
環境は、参考書に則っています。

# 1章(前半) 概要
#### 機械学習とは？
一般的なプログラミングにおいて人間が構築する多くのシステムは、「もし、〜ならば」などの所謂条件部分は、個別に記載していく。
この「ルール」に当たる部分をシステム自らが生み出して、順次判断していくこと機械学習と呼ぶ。

#### 機械学習で解決可能な課題
世の中の全ての課題が、機械学習で解くことが最適というわけではない。
概要をまとめると、おおよそ下記の通りとなるだろうか。

**安価に意味のある大量のデータが集められること**

「安価に」：一つのデータの収集に掛かるなコストと解決したい課題の価値の釣り合いを考える。
「意味のある」：苗字データから性別を判断することは不可能
「大量の」：データの物量がモノを言うケースもある。

#### 課題とデータがいかに重要か
先のセクションで記載したが、大量にデータを持っていても抽出する特徴量が適切でなければ意味がない。
せっかく機械学習のモデルを構築したとしても、正しい問題解決ができなければ意味がない。
モデルを構築した後の評価方法まで検討する必要がある。(どのようにしてそのモデルが正しいと評価するか)

＊機械学習における特徴量とは、データを表に見立てた時の列にそうとうするものである。

# 1章(前半) 所感
1章の前半まで読んでみて、結局は

```
・解決する課題は何か。
・それが機械学習を通して解決することが最適なのか。
・モデルを作成して評価可能か。
```
この辺りが重要であるように感じました。
機械学習の有無に関わらず問題解決をする上で重要なことは共通して変わらないのかもしれません。

機械学習と聞いて、自分が元々想像するものは、画像認識とか対話AI(チャットbot)とか株式の予測とかそういった具体的な技術の部分でした。

機械学習を使って問題解決をする際は、本質的な課題の深堀を怠らないことが重要だと感じました。

# 次回記事
[Pythonではじめる機械学習 part2](https://qiita.com/yuto_suzuki/items/20d4475a82aa38a4466c)
[Python] png画像ファイルの白い背景を透明にする

個人的な備忘録です。

同じフォルダにあるpngファイルの白の箇所を透明にします。


```python

from PIL import Image

for fname in glob("tmp*.png"):
    print (fname)

    img = Image.open(fname)
    img = img.convert("RGBA")
    datas = img.getdata()

    newData = []
    for item in datas:
        if item[0] == 255 and item[1] == 255 and item[2] == 255:
            newData.append((255, 255, 255, 0))
        else:
            newData.append(item)

    img.putdata(newData)
    img.save(fname, "PNG")

```

https://codehero.jp/python/765736/how-to-use-pil-to-make-all-white-pixels-transparent
flutter webでMaterial Iconが5重のハンバーガーメニューみたいになる

# ハンバーガーメニューは通常3段だが...
スクショを撮り忘れたので再現できないが、リリースモードもしくはビルドでのみ、5段ぐらいのハンバーガーメニューになる。
普通のアイコンをハンバーガーだとするとこれはビッ○マック。

厄介なのはデバッグでは普通に表示されること。
しかも、全てのアイコンがビッ○マックになっている。

# 解決法
正しいかどうかはわからないが、FontManifest.jsonに

```json
[
  {
    "family": "MaterialIcons",
    "fonts": [
      {
        "asset": "fonts/MaterialIcons-Regular.otf"
      }
    ]
  }
]
```
と書くことで解決した。

これは```flutter build web```でbuild/webに生成されるファイルの中に```MaterialIcons-Regular.otf```というファイルがあったからで、開発中は見えないのだが、これを直接指定してみたところ、、、

あら不思議！
解決してしまった。

アボカドワッパー食べたい。
AWS の EC2(Ubuntu 20.04) に Coturn-4.5.2 をインストール 2021/8


# 経緯

- AWS Ubuntu Server 20.04 に turnserver-4.5.2.tar.gz をインストール
- 記事の内容がほとんどなく、参考サイトのコピー＆劣化で、投稿するのは大変恐縮ですが、軽くはまったのでメモ

# 環境

- AWS
- Ubuntu Server 20.04 LTS
- turnserver-4.5.2.tar.gz

# はまった点(読み飛ばし可能)

- 参考サイト1 を参考に `./configure` すると以下のエラーに遭遇
- `ginstall: not found` が先に目が入ってしまい、このメッセージで検索したのがはまった原因
  - `ginstall` は、なくてもよいと後ほど気づく
- `ERROR: cannot use compiler unknown properly` が見なければいけないエラーメッセージ

```
ginstall: not found
install is /usr/bin/install
pkill is /usr/bin/pkill
sqlite3 is /usr/bin/sqlite3
Use TMP dir /var/tmp
Compiler: unknown
ERROR: cannot use compiler unknown properly
```

# 手順

- 参考文献1に `gcc` と `pkg-config` を追加

```
sudo apt update -y
sudo apt install -y libssl-dev libevent-dev sqlite3 make gcc pkg-config

wget http://turnserver.open-sys.org/downloads/v4.5.2/turnserver-4.5.2.tar.gz
tar xvfz turnserver-4.5.2.tar.gz
cd turnserver-4.5.2/

./configure

make && sudo make install
```

- 実行ファイルの格納場所

```bash
which turnserver
/usr/local/bin/turnserver
```

# apt でインストール

- `apt` でもインストールできる
- Coturn-4.5.1.1 がインストールされた
- 最新を使いたい場合は、ソースからインストールした方がよさそう

```
sudo apt install coturn
```

- 実行ファイルの格納場所

```
 /usr/bin/turnserver
```


# 参考サイト

## 参考サイト1
https://qiita.com/okyk/items/2d7db6b148a43bc3b405

## 参考サイト2
https://stackoverflow.com/questions/47249001/installing-coturn-4-5-0-6-on-ubuntu-16-04-3-x64-tls-not-working
Hightchartsのシリーズ/seriesの表示on/off

# やりたいこと

Highchartsを使っていて、シリーズ名部分をクリックすると、そのシリーズの表示on/offが出来てとっても便利だが、シリーズ数が多いと、その中の1つだけを見たい！という時にクリック数が増えて面倒。

https://www.highcharts.com/demo/line-basic より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13513/43a424f6-31ec-4ede-966c-6d7284f46be1.png)

## 一括でシリーズの表示on/off する

<p class="codepen" data-height="600" data-theme-id="dark" data-default-tab="result" data-slug-hash="RwVEgmO" data-user="annnews" style="height: 600px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/annnews/pen/RwVEgmO">
  Basic line</a> by annnews (<a href="https://codepen.io/annnews">@annnews</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

Highchartのインスタンスから、seriesに対してsetVisible(true|false)すればOK.

```js
// シリーズのi番目を消す
chart.series[i].setVisible(false,true);
```
二番目のパラメータは、redrawするかしないか。

## 失敗例

```js
chart.series[i].visible = false;
```

これだと、内部データでは非表示になっているが、表示が更新されない。chart.redraw()してもダメでした。
DjangoをLambdaで動かそうと思ったけどやっぱり向かないと思った話

# はじめに
DjangoでWebアプリを作成した際に、サーバーを借りると高くつくので、何とかLambdaに乗っけて実行課金にできないかと試した記録です。
 ~~結論から言うと上手くいかなかったのですが、何か役立つかもしれないので書き残しておきます。~~
無事動かすことができましたので、こちらの記事もご覧ください。→https://qiita.com/kerorinfather/items/9fc0c6e2d68950fde50f

# DjangoをLambdaで動かすまでの手順
以下のサイトを参考に実施しました。相違点としては、以下のサイトではMySQLにて動かしていますが、私はSQLiteにて試しています。（ただし、うまくいきませんでした。）

https://qiita.com/umihico/items/4534e1f84e8de5a62db5

# 問題点

### Werkzeugが最新バージョンだと動かない
Python用のWSGIユーティリティライブラリであるWerkzeugを、最新バージョンにしていると動かないです。
requirements.txtにて、バージョンを指定してあげる必要があります。

```plaintext:requirements.txt
Django
Werkzeug==1.0.1
```

### Pythonが最新バージョンだと動かない
上記のエラーを解決後、また別のエラーになりました。
原因がよく分からなかったですが、ランタイムを`Python 3.6`にしたら解決しました。

### MySQLのバージョンが古いと言われる
Lambdaで使われている環境には、標準で`SQLite 3.7.17`がインストールされていますが、Djangoで利用しようとした際に新しいバージョンにしろと言われます。
Djangoのバージョンを下げて対応しようかと考えましたが、Django3の場合最低でも`SQLite 3.8.3`が要求されるので、諦めました。。。

### Serverless Frameworkに依存している
DjangoはWSGI（Web Server Gateway Interface）に対応するため、同じくWebサーバ側もWSGIに対応していれば実行可能です。しかし、LambdaでWSGIを実現するために、Serverless Frameworkのプラグインである`serverless-wsgi`を利用しているため、Serverless Frameworkから離れられない状態です。

https://www.serverless.com/plugins/serverless-wsgi

何が言いたいかというと、DockerイメージでSQLiteのバージョンを上げたものを作成して、Lambdaにデプロイすればいいと考えたのですが、その場合は`serverless-wsgi`を利用できないので詰む、ということです。ほかのライブラリも探しましたが見つからないので、自力でWSGIに対応させるしかなさそう。

# おわりに
Lambdaを使うなら、素直にFlaskなどの軽量フレームワークを使うのがよさそうです。
LighthouseのMutation、１リクエストで検索して更新


Lighthouseを使いMutaionで更新する際、
該当レコードを検索して
→該当なし＝新規作成
→１件該当＝更新
→複数件該当＝該当レコードを削除して新規追加（該当を１レコードだけにする）
みたいな事を１リクエストで完結したかった。


## 処理内容
Versionを検索して
該当なしはレコード新規作成
１件該当があればレコード更新
それ以外は該当レコードを削除して新規作成
該当レコードのidを返却する

## 以下、ソース抜粋

```schema.graphql


type mutation {
    searchUpdateVersions(
        ptype: String!
        module: String!
        performer: String!
        version: String!
    ): VersionIdResponse
        @field(resolver: "App\\GraphQL\\Mutations\\SearchUpdateVersion@handle")
}

type VersionIdResponse{
    id: ID!
}
```

```SearchUpdateVersion.php
<?php

namespace App\GraphQL\Mutations;

use GraphQL\Type\Definition\ResolveInfo;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
use App\Version;

class SearchUpdateVersion
{

    public function handle(
        $rootValue,
        array $args,
        GraphQLContext $context = null,
        ResolveInfo $resolveInfo
    ) {

        $query = Version::query();
        $query->where('ptype', $args['ptype']);
        $query->where('module', $args['module']);
        $query->where('performer', $args['performer']);

        $versions = $query->get();

        $version = new Version;

        switch($versions->count()){
            case 0:
                break;
            case 1:
                $version = $versions[0];
                if($version->version==$args['version']){
                    $id = $version->id;
                    return compact('id');
                }
                break;
            default :
                foreach($versions as $obj)
                {
                    $obj->delete();
                }
                break;
        }
        $version->fill($args);
        $version->save();

        $id = $version->id;

        return compact('id');
    }
}
```

## 参考にさせていただいた素晴らしい記事
[LaravelでGraphQLを使い倒してみた](https://qiita.com/TsukasaGR/items/1a8b0020e5e83e7a46c7)
awkを利用して複数ファイルを行末に改行がなければ改行を追加して結合

## ファイルの行末に改行がないファイルをそのままcatすると改行なしで連結されてしまう


```bash:ファイル1
りんご
バナナ
みかん[EOF]
```

```bash:ファイル2
トマト
キャベツ
レタス
[EOF]
```

```bash
$ cat ファイル1 ファイル2
りんご
バナナ
みかんトマト　　 ←改行なしで連結される
キャベツ
レタス
```

## awkで連結すれば解決する

```bash
$ awk 1 ファイル1 ファイル2
りんご
バナナ
みかん
トマト
キャベツ
レタス
```

## 解説
- ```awk 1 ファイル```でパターンのみ指定
- awkはアクションの指定がない場合、{ print $0 }で全行でprintする
- パターンを```1```にすることで、0以外のすべての数字もしくはすべての文字列がマッチする
- awkは改行がなくても行と認識するため、改行なしの行が、printで改行付きに置き換わって出力される

## ひとこと
- awkすげー
- 参考の1個めの記事まんまだが（そちら見てください）、備忘とawkの理解深めるため書いた


## 参考
https://qiita.com/ngyuki/items/b55ce646cd84eb71c900

https://linuxcommand.net/awk/
Cloud Armor

# 概要
Cloud ArmorはDDoS攻撃やXSS、SQLインジェクションなどからアプリケーションを保護するためのサービス。構成済みのルール（XSSやインジェクションなど）と手動で構成するルール（IPアドレスのホワイトルール、その他リクエストの属性に基づく許可・拒否ルール）がある。

Cloud Armorは外部HTTP(S)ロードバランサにのみアタッチできる。ロードバランサのバックエンドは以下のいずれかを使用できる。

- インスタンスグループ
- ゾーンNEG
- サーバーレスNEG
- インターネットNEG
- GCSバケット

# セキュリティポリシー
セキュリティポリシーにはバックエンドセキュリティポリシーとエッジセキュリティポリシーの2種類がある。エッジセキュリティーポリシーは現在(2021/8/10）プレビュー版になっている。バックエンドセキュリティポリシーはロードバランサのバックエンドに対して適用されるポリシーで、エッジセキュリティポリシーはCDNによってキャッシュされているコンテンツへのトラフィックに適用されるポリシーになっている。以前はキャッシュにヒットしたリクエストにはポリシーが適用されてなかったっぽい。

# 事前構成済みの保護の構成
事前構成済みの保護は主にOWASP TOP10を含んだ広範囲の攻撃を防御するためのものになっている。
以下は事前に防御されるルールのリスト。XSSやSQLインジェクションなどが防御される項目として定義されている。

![Screen Shot 2021-08-10 at 11.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642884/03e9d2c1-404a-68be-73c9-10c29655e3f3.png)


だがこれだけだと、どのような条件でブロックされるかがわからないと思うので、より詳細にルールを定義している[リポジトリ](https://github.com/coreruleset/coreruleset//)も公開されている。ただ、少し読んでみたけど全くわからなかった。リポジトリはルールのソースだが、Google Cloudのドキュメントにもうまくまとめられているので、[こちら](https://cloud.google.com/armor/docs/rule-tuning?hl=ja#preconfigured_modsecurity_rules)も参照してほしい。


事前構成済みのルール が必要なリクエストをブロックしている場合は、`evaluatePreconfigureExpr`コマンドを使用して特定のCRS(Core Rules Set)を除外することができる。(CRSは上のリポジトリに乗っている）


# カスタムルールの作成
カスタムルールを構成すると、一致条件とそのアクションを定義することで特定の受信リクエストを許可・拒否できる。
一致条件には以下の条件が使用できる。式の評価はCEL（Common Expression Language）の拡張版によって記述される。
https://github.com/google/cel-spec

- 基本一致条件：IPアドレスの範囲のリストで構成される
- 詳細一致条件：受信リクエストの属性に基づいて構成できる。

詳細一致条件に使用できる属性は以下の通り。
![Screen Shot 2021-08-10 at 11.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642884/25bbb55d-4feb-ec67-163f-dee33e60b307.png)


例えば、`inIpRange(origin.ip, "9.9.9.0/24")` という値を使用すると、送信元IPアドレスが`9.9.9.0/24`以内であれば式はtrueを返す。式の例がドキュメントに記載されているので、ここを読めばイメージがつくと思う。ドキュメントを読めばわかるが、正規表現や簡単な関数（デコードの処理）なども使用できて、結構柔軟に設定できることがわかる。
https://cloud.google.com/armor/docs/rules-language-reference?hl=ja#expression-examples

# 名前付きIPアドレスのリスト
サードパーティプロバイダが管理しているIPアドレスのリストを使用して、一括で複数のIPアドレスを許可・拒否することができる。ユースケースとしては、特定のプロバイダ経由のみのトラフィックを許可したい場合。これのメリットとしては、、Cloud Armorは自動的にリストを毎日同期すことにあるる。プロバイダがIPアドレスのリストを変更したとしても、手動で変更する必要がなくなる。
`node_modules` を探した話

# まとめ

- 思い込みがあると，探すべきところを後回しにしてしまう場合がある．

## エラーになった

```
node_modules/chokidar-cli/node_modules/chokidar/lib/fsevents-handler.js:28
  return (new fsevents(path)).on('fsevent', callback).start();
          ^

TypeError: fsevents is not a constructor
    at createFSEventsInstance (node_modules/chokidar-cli/node_modules/chokidar/lib/fsevents-handler.js:28:11)
    at setFSEventsListener (node_modules/chokidar-cli/node_modules/chokidar/lib/fsevents-handler.js:82:16)
    at FSWatcher.FsEventsHandler._watchWithFsEvents (node_modules/chokidar-cli/node_modules/chokidar/lib/fsevents-handler.js:252:16)
    at FSWatcher.<anonymous> (node_modules/chokidar-cli/node_modules/chokidar/lib/fsevents-handler.js:386:25)
    at LOOP (fs.js:1834:14)
    at processTicksAndRejections (internal/process/task_queues.js:75:11)
error Command failed with exit code 1.
```

### よくある解決方法を検索すると？

- `node_modules`を消して，`yarn install` する
- `npm cache clean --force` する

みたいなものがあった．
`node_modules/fsevents` がおかしな状態になっていて，一度消してみる．というのは理解できるが，cache は関係ないと思っていた．

### そもそも無い

プロジェクトルートディレクトリ / サブディレクトリなどの `node_modules` に `fsevents` ディレクトリは存在しなかった．
今回の件では，`node_modules`ディレクトリは関係ないのでは？

### 無くともよい

`fsevents` 無くとも動きそう．

https://github.com/paulmillr/chokidar/blob/aa49e9e00fda1e663a6853492c46de8f8008e773/lib/fsevents-handler.js#L8-L10

```js:fsevents-handler.js#L8-L10
try {
  fsevents = require('fsevents');
} catch (error) {
```

とはいえ，`fsevents` があると動かないというのは良くないので，
そちらの対応状況を確認した方がより適切かもしれない．

### 探した

結局はシンプルに，親ディレクトリに `node_modules/fsevents` が存在していた．

# まとめ

- 思い込みがある
    - 自分が`src/*` ディレクトリのようなところ配下にソースを置く習慣があるので，それより上に `node_modules` があると想定していなかった．
        - 親ディレクトリの `node_modules` についての記憶はないらしかった．

# 参考

https://qiita.com/hnw/items/269f8eb44614556bd6bf
M5StickC PlusでIPSOUTに5Vを出力するには？

# M5StickC PlusでIPSOUTに5Vを出力するには？

## あれ？「5V→」ポートと「HY2.0-4PのVout」から5Vが出力されてないなー。

覚えられないので、貼っておく。すこしでも誰かに貢献できれば何よりです。👍


電源はAXP192というICで制御されているようだ。
M5のライブラリを使わないと、2.54ピッチの5VOUTには出力されない。ポートは`IPSOUT`から出力されている。
次のメソッドを実行するとIPSOUTに5Vが出力された。

```
M5.Axp.EnableCoulombcounter();
```

Coulomb＝クーロンと読む。電荷のこと。AXP192は電荷をカウントすることができる。バッテリーの使用電力量を計測できるようだ。しらんけど。

G26にPWMを出力させた。2.54ピッチデュポンコネクタの5Vアウトから5Vを出力できた。
サーボの端子を左から、GND、5V、信号線（PWM）と接続したところ、サーボモータが動作した。トルクがかかっている状態となった。

![ポート](https://static-cdn.m5stack.com/resource/docs/static/assets/img/product_pics/core/minicore/m5stickc_plus/m5stickc_plus_04.webp)

![ポート](https://static-cdn.m5stack.com/resource/docs/static/assets/img/product_pics/core/minicore/m5stickc_plus/m5stickc_plus_05.webp)

本家から回路図を貼っておく。

![回路図](https://static-cdn.m5stack.com/resource/docs/static/assets/img/product_pics/core/minicore/m5stickc_plus/StickC_sch.webp)

[PDF](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/schematic/Core/M5StickC_Plus/StickC_Plus_20200616.pdf)

（了）
cron のタイムゾーンを変更する際は再起動が必要！

表題の通りだが、システムのタイムゾーンを変更しても、すぐに cron に反映されるわけではないらしい。

```shell:Shell
sudo timedatectl set-timezone Asia/Tokyo
```

上記のようにシステムのタイムゾーンを変更したら、

```shell:Shell
sudo systemctl restart cron
```

cron の再起動も忘れずに。
多要素認証の問題のトラブルシューティング


https://help.salesforce.com/s/articleView?id=000331182&type=1


# APIアクセスの場合

[エクセルVBAで作成したツールへの影響について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Bs1xSSAR)

APIアクセスの場合はMFA必須でないと記載されています。

APIアクセスでもMFAを要求する場合にはご認識の設定が必要です。

なおSSOについては「SSO側でMFAを設定」「SSO側でMFAを設定せずSalesforce側のMFA」を使用するの２手段があります。

後者の場合、私の認識する限りプロファイルでのセッションの「高保証」を設定しないとMFAの画面が表示されずホーム画面が表示されます。ただ同設定を行うと、該当プロファイルのユーザにてAPIアクセスができなくなります
TerraformでVPC Peering 実装

## これは何
TerraformでVPC Peering 実装してみた。のメモです。

今回は、同一AWSアカウント間でのPeeringを行なっています。

## 早速やってみた


```vpc.tf
resource "aws_vpc_peering_connection" "peer-1-2" {
  peer_owner_id = Your_AWS_Account_Id
  peer_vpc_id   = aws_vpc.peer-1.id
  vpc_id        = aws_vpc.peer-2.id
  auto_accept   = true

  tags = {
    Name = "VPC Peering between peer-1 and peer-2"
  }
}

resource "aws_vpc" "peer-1" {
  cidr_block = "10.1.0.0/16"
}

resource "aws_vpc" "peer-2" {
  cidr_block = "10.2.0.0/16"
}

resource "aws_route_table" "vpc-peer-1-route-table" {
  vpc_id = aws_vpc.peer-1.id

  route {
    cidr_block                = aws_vpc.peer-2.cidr_block
    vpc_peering_connection_id = aws_vpc_peering_connection.peer-1-2.id
  }

  tags = {
    Name = "vpc-peer-1-route-table"
  }
}


resource "aws_route_table" "vpc-peer-2-route-table" {
  vpc_id = aws_vpc.peer-2.id

  route {
    cidr_block                = aws_vpc.peer-1.cidr_block
    vpc_peering_connection_id = aws_vpc_peering_connection.peer-1-2.id
  }

  tags = {
    Name = "vpc-peer-2-route-table"
  }
}

```

## 各パラメータ解説

```vpc.tf
resource "aws_vpc_peering_connection" "peer-1-2" {
  peer_owner_id = Your_AWS_Account_Id
  
　　　　# アクセプターのVPC
　　　　peer_vpc_id   = aws_vpc.peer-1.id
  
　　　　# リクエスターのVPC
  vpc_id        = aws_vpc.peer-2.id
  
  # 同じAWSアカウント内でPeeringを行う場合、自動承認をするかどうか
  auto_accept   = true

  tags = {
    Name = "VPC Peering between peer-1 and peer-2"
  }
}

resource "aws_vpc" "peer-1" {
  cidr_block = "10.1.0.0/16"
}

resource "aws_vpc" "peer-2" {
  cidr_block = "10.2.0.0/16"
}

　　　　# 各VPCにルートテーブルを定義して相互通信可能にする。
resource "aws_route_table" "vpc-peer-1-route-table" {
  vpc_id = aws_vpc.peer-1.id

  route {
    cidr_block                = aws_vpc.peer-2.cidr_block
    vpc_peering_connection_id = aws_vpc_peering_connection.peer-1-2.id
  }

  tags = {
    Name = "vpc-peer-1-route-table"
  }
}


resource "aws_route_table" "vpc-peer-2-route-table" {
  vpc_id = aws_vpc.peer-2.id

  route {
    cidr_block                = aws_vpc.peer-1.cidr_block
    vpc_peering_connection_id = aws_vpc_peering_connection.peer-1-2.id
  }

  tags = {
    Name = "vpc-peer-2-route-table"
  }
}

```

## 参考

```
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/vpc_peering_connection
https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html
```
コンパイラ作りながら学ぶ第4章　字句解析

この記事に出てくるプログラムは，コンパイラ作りながら学ぶ https://www.ohmsha.co.jp/book/9784274221163/ で紹介されているC言語プログラムや疑似コードをPythonで書き換えたものです．
## 4.1 文字読み込み
コンパイラはまず，原始プログラムを読み込まなければならない．このときに次のような機能を持つ関数nextCharを作る．
(1) 読み込んだ原始プログラムの中で最後に返した文字の位置を覚えていて
(2) 呼ばれたら，その次の文字を返す．返す文字がなかったらファイルから次の行を読み込みその最初の文字を返す．

```python
import linecache
line_number = 1 #行番号
lineIndex = -1
end = len(open('sample.c').readlines()) #ファイルの行数

def nextChar():
    global line_number
    global lineIndex

    line = linecache.getline('sample.c', int(line_number))
    if lineIndex == -1:
        if line_number<=end:
            lineIndex = 0
        else:
            print("end of file")
            exit(1)
    ch = line[lineIndex]
    lineIndex+=1
    if ch == '\n':
        lineIndex = -1
        line_number+=1
        return ' '
    return ch
```
linecache.getline()で特定の行を文字列として取得する．line_numberが行番号を指定する変数．'\n'を読み込んだ場合lineIndexを-1，lineIndex+=1として，次に関数が呼ばれた際には次の行を読み込む．

## 4.2 字句読み取り
　以下のプログラムは，名前を読み込むためのものです．ここでいう「名前」とは，単語の一文字目が英字，その後に英字または数字のゼロ回以上の繰り返しから成る文字列のことを意味します．state1関数で，一文字目の英字を読み込みます．一文字目が英字でない場合，エラーとなります．次に，state2関数によって，英字or数字の繰り返しから生成される文字列を読み込みます．単語が読み込み終わり，次の単語へと移る際にはstate3関数で，lineindex-=1をします．最終的に変数ansに読み込んだ名前が返される仕組みになっています．

```python
def error():
    return "Not Name"

def state3():
    global lineIndex
    lineIndex-=1

def state1(s):
    ch = nextChar()
    while ch == ' ':
        ch = nextChar() #単語間の空白文字を読み飛ばす
    if ch.isalpha():
        s+=ch
        return state2(s)
    else:
        return error()

def state2(s):
    ch = nextChar()
    if ch.isalpha() or ch.isdigit():
        s+=ch
        return state2(s)
    else:
        state3()
        return s

if __name__ == '__main__':
    while True:
        ans = state1("")
        print(ans)
```
```python
def error():
    return "Error"

def state5():
    global lineIndex
    lineIndex-=1

def state4(s): #区切り記号
    ch = nextChar()
    state5()
    return s

def state3(s): #数字
    ch = nextChar()
    if ch.isdigit():
        s+=ch
        return state3(s)
    else:
        state5()
        return s

def state2(s): #名前
    ch = nextChar()
    if ch.isalpha() or ch.isdigit():
        s+=ch
        return state2(s)
    else:
        state5()
        return s

def state1(s):
    ch = nextChar()
    while ch == ' ':
        ch = nextChar() #単語間の空白文字を読み飛ばす
    s+=ch
    if ch.isalpha(): #名前のとき
        return state2(s)
    elif ch.isdigit(): #数字のとき
        return state3(s)
    elif ch == ',' or ch == ';': #区切り記号
        return state4(s)
    else:
        return error()
```
[初心者向け]　Gretelを使わずページごとにパンくずリストの表示内容を変える

#はじめに
右も左もわからないプログラミング初心者が書く備忘録です。
膨大な勉強量の中で気になった事をメモしていきます。

間違いや記事を見て良かったことなど
気軽にコメントを残して頂けると活力に繋がりますのでよろしくおねがいします:smiley:

今回、パンくずリスト導入時、親・子・孫関係の「子」にあたるリンクを特定のページでのみ表示させようとした時にすこし頭を使う事になったので
備忘録として残しておこうと思います。

#今回の内容
gretelは使用せず、bootstrapドキュメントを使用してパンくずリストを作成します。
https://getbootstrap.jp/docs/5.0/components/breadcrumb/

#基本の型

```html:views/layouts/_breadcrumbs.html.erb
<nav aria-label="breadcrumb">
  <ol class="breadcrumb">
    <li class="breadcrumb-item"><a href="#">Home</a></li>
    <li class="breadcrumb-item"><a href="#">Library</a></li>
    <li class="breadcrumb-item active" aria-current="page">Data</li>
  </ol>
</nav>
```

表示内容
![breadcrumb1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624943/dd3d346f-2d9e-f12a-6a60-b49451aedbf8.png)

HomeとLibraryがリンクを持ち、カレントページである事を想定しているDataはリンクを持たないので灰色で表示されています。

hrefの＃部分をリンク先のパスにすればパンくずの基本の形が完成です:thumbsup:

#事前準備
パンくずはパーシャル化した方が使い勝手が良く、コーディングもキレイになるので切っておきます。


```html:views/layouts/_breadcrumbs.html.erb
<nav aria-label="breadcrumb">
  <ol class="breadcrumb">
    <li class="breadcrumb-item"><a href="#">Home</a></li>
    <li class="breadcrumb-item active" aria-current="page">Show</li>
  </ol>
</nav>
```

#####今回は親にHomeを、子にShopを、孫にShowをという形を目指します。
Shopの部分はこれから記述していきます。
パーシャル化に関しては調べれば良い記事がたくさん出てきますのでここでは詳しい話を省きます。

#ここから本題に入ります
今回は、showページに転移するとパンくずリストに”Shop”が表示されるようにします。
まずは基本の形に対し、showページからの”Shopを表示して！”という命令を受け付けるようにします。

```html:views/layouts/_breadcrumbs.html.erb
<nav aria-label="breadcrumb">
  <ol class="breadcrumb">
    <li class="breadcrumb-item"><a href="#">Home</a></li>
　　　　　　　　<!--  ここから 　　-->
　　　　　　　　<% if yield(:shop_to_display).empty? %>
      <li　class="breadcrumb-item"><%= link_to 'Shop', '#' %></li>
    <% end %>
    <!--  ここまで追加  -->
    <li class="breadcrumb-item active" aria-current="page">Show</li>
  </ol>
</nav>
```

追加したif文は
shop_to_displayという変数が来ていますか？(枠は必要だけど値はなくていいよ〜)
来てるならリンク先が＃のShopをパンくずについかするからね:ok_hand:
という意味です。

これで受けの部分はOKなので、showページを作成し下記コードをshow.html.erbの一番上に記述します

```erb:show.html.erb
<% content_for :shop_to_display %>
```

この記述でshowページに転移した際、先程の　yield　が変数を受け取ることが出来ます。

次に、パーシャル化した_breadcrumbs.html.erbをshow.html.erbで表示出来るように呼び出します。

```erb:show.html.erb
<% content_for :shop_to_display %>

<%= render 'layouts/breadcrumbs' %>  <!--  これを追加  -->
```

注意点として、呼び出す時は”＿”や拡張子”html.erb"などは不要であり、
呼び出しを行うviewファイル（ここではshow.html.erb）からみてのパスになります。

以上でshow.html.erbで呼び出したパンくずリストにShopが追加され

Home / Shop / Data

と表示されていると思います

この技法を駆使すれば、任意のページで、任意のパンくずリストを作成することができます♪
何より導入がかなり簡単なので、試してみてください

#おまけ

####呼び出し時、必ず表示されるパンくずを増やす場合
ちなみにbreadcrumb-itemを増やせば、表示されるパンくずが増えます。
これは **本題と違い”呼び出し時に必ず表示”** されるので気をつけてください。

```erb:views/layouts/_breadcrumbs.html.erb
<nav aria-label="breadcrumb">
  <ol class="breadcrumb">
    <li class="breadcrumb-item"><a href="#">Home</a></li>
    <li class="breadcrumb-item"><a href="#">Library</a></li>
    <li class="breadcrumb-item"><a href="#">Abc</a></li>
    <li class="breadcrumb-item active" aria-current="page">Data</li>
  </ol>
</nav>
```

’Abc'が追加され表示内容がHome / Library / Abc / Dataとなります。

#最後に
勉強を始めたばかりで知識もなく、拙い文章ですがアウトプットすることで頭の中を整理しつつ、どなたかのお役に立てれば良いなと思い投稿させて頂きました。
最後まで見て頂きありがとうございました！
【Google Cloud Day'21】「SIer におけるマルチクラウド戦略と Anthos の活用」を視聴して

SIer におけるマルチクラウド戦略と Anthos の活用
https://cloudonair.withgoogle.com/events/google-cloud-day-digital-21/watch?talk=d2-appdev-06
"SIer がコンテナとマルチクラウドに取り組み、なぜ Anthos を採用するのでしょうか？
JBCC では SI 案件にコンテナを活用して、お客様がやりたいことを素早く実現できることを目指しています。
本セッションでは、SIer からみた Anthos で実現出来る価値と、弊社が SI 案件でお客様に提供していきたい価値をビジネスと技術の両方の視点でご紹介します。"

<table>
	<tr>
		<th>質問</th>
		<th>回答</th>
	</tr>
	<tr>
		<th>DBをなぜAnthos上ではなく、別に構築するようにしているのでしょうか？分けている理由を教えて下さい。</th>
		<td>現時点では、PaaSのDBを使ったほうが構築も運用も楽だと考えています。将来的にはKubernetes Operatorを使ってDBもコンテナにすることも検討してみたいと思っています。</td>
	</tr>
	<tr>
		<th>各クラウド環境のスキルセットにもよると思いますし、定量的には言えないと思いますが、各環境毎にクラスタを運用するのと比べ、Anthosの利用でどの程度クラスタ管理が楽になると感じますか？</th>
		<td>数値で表現するのはむずかしいのですが、他の人にスキル展開をする点ではかなり楽になるかと思ってます。特にCNIまわりはクラウドに合わせて理解する必要性が小さくなりました。</td>
	</tr>
	<tr>
		<th>Azure</th>
		<td> AWS</td>
		<td> Google Cloud すべてを利用されるのでしょうか。マルチクラウド環境を用意できるという点ではいいですが、特にプラットフォームにこだわらない場合、逆に言うと 1つだけでも問題ないように思われますが。どういう場合にクラウドを使い分けるのでしょうか  (</td>
		<td>お客様からのリクエストで選ぶケースがおおいです。既にクラウド構築されている場合は合わせたいという感じです。</td>
	</tr>
	<tr>
		<th>マルチクラウドを管理する製品はAnthos以外に他社製品も選択肢があると思いますが、Anthosを選択した理由はなんですか？</th>
		<td>一番大きな点はマルチクラウド、従量課金で利用できる点です。</td>
	</tr>
	<tr>
		<th>Anthosである程度共通化できるものの、一部は各クラウドサービス個別に設定が必要だと読み取れましたが、Anthosで共通化出来る/できないの線引きはどの辺に設定していますか？</th>
		<td>一番わかりやすいところでは、ロードバランサーまわりは、各クラウドで個別の設定が必要になります。</td>
	</tr>
</table>

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
	</tr>
	<tr>
		<th>会社概要</th>
		<td></td>
	</tr>
	<tr>
		<th>よくある課題</th>
		<td></td>
	</tr>
	<tr>
		<th>解決策</th>
		<td></td>
	</tr>
	<tr>
		<th>マルチクラウドの実行基盤について</th>
		<td></td>
	</tr>
	<tr>
		<th>実行基盤</th>
		<td></td>
	</tr>
	<tr>
		<th>今後の予定、期待</th>
		<td></td>
	</tr>
</table>

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/1cd3e654-a47a-c281-1598-533e48e29d24.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/65c3fd80-7b14-41d1-0da5-8735ab14c8ea.png)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9f960a08-44f9-6c86-984e-0f8c94bd6477.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/fd81714f-690d-df49-9f32-cf5795d380a3.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/d654623d-04c7-1d37-284d-a96a3db470a9.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/be96f858-c06a-43b6-239d-cdef51e7b026.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/9f2abf5e-d783-e718-3240-862c23163bbf.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/4388b49d-43a5-3f53-6479-264000b021ca.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/5a1ef392-91f8-83c1-121e-199831a6449c.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556084/c4bcc644-c23d-c1bd-32e3-5364c46931ca.png)
桁の重みをかけるとなぜ10進数になるのか？

# 導入

質問された中で、自分では考えたことがなかったので、備忘録として書いておきます。

# 基数とは

n進数のnが基数です。
n進数とはある桁の数値がnになれば桁上がりするような数のことです。

我々は一般的には10進数を使います。
ダースは12進数ですし、週は7進数、分秒は60進数で時は24進数など以外といろいろなn進数が生活の中で使われています

コンピュータの世界では2進数を使いますし、2進数だと桁数が大きくなりやすいので、8進数や16進数もよく使います。
※8=2の3乗、16=2の4乗ということで、8進数/16進数の1桁は、2進数の3桁/4桁分をまとめて表現できるのです。

以降、n進数で表現された数値xyzについては下記の書式を用います。

```
xyz(n)
```

# 基数変換とは

値を変えずに基数を変換することです。
例えば100(10)の場合は下記のように変換可能です。

```
100(10) ⇔ 64(16) ⇔ 144(8) ⇔ 1100100(2)
```

# 桁の重み

よく基数変換の説明で出てくるのが桁の重みです。

2進数の場合は以下のように記載されていることが多いかと思います

```
2^6=64
↓   2^4=16
↓   ↓   2^2=4
↓   ↓   ↓   2^0=1
↓   ↓   ↓   ↓
1 1 0 0 1 0 0(2)
  ↑   ↑   ↑
  ↑   ↑   2^1=2
  ↑   2^3=8
  2^5=32
```

これを利用して、1100100(2)を10進数に変換すると下記の通り100(10)になります。

```
64×1 + 32×1 + 4×1 = 100
```

# 本題

前述の通り桁の重みを各桁にかけることで、n進数→10進数の変換が出来ます。
しかし、なぜ10進数になるのかが分からないといわれたのです。

考えたことがなかったので、即答できなかったのですが、よく考えれば簡単なことです。

先ほどの桁の重みの説明では抜けている箇所がありました。
追記したものを下記に示します。

```:2進数→10進数の基数変換
2^6=64(10)
↓   2^4=16(10)
↓   ↓   2^2=4(10)
↓   ↓   ↓   2^0=1(10)
↓   ↓   ↓   ↓
1 1 0 0 1 0 0(2)
  ↑   ↑   ↑
  ↑   ↑   2^1=2(10)
  ↑   2^3=8(10)
  2^5=32(10)

64(10)×1 + 32(10)×1 + 4(10)×1 = 100(10)
```

つまり、桁の重みを10進数で表しているので、
10進数の桁の重みをかければ10進数へ基数変換ができるのです。

同じことを8進数と16進数でも基数変換でもやってみます。

<details><summary>2進数→8進数の基数変換</summary><div>

```:2進数→8進数の基数変換
2^6=100(8)
↓   2^4=20(8)
↓   ↓   2^2=4(8)
↓   ↓   ↓   2^0=1(8)
↓   ↓   ↓   ↓
1 1 0 0 1 0 0(2)
  ↑   ↑   ↑
  ↑   ↑   2^1=2(8)
  ↑   2^3=10(8)
  2^5=40(8)

100(8)×1 + 40(8)×1 + 4(8)×1 = 144(8)
```

</div></details>

<details><summary>2進数→16進数の基数変換</summary><div>

```:2進数→16進数の基数変換
2^6=40(16)
↓   2^4=10(16)
↓   ↓   2^2=4(16)
↓   ↓   ↓   2^0=1(16)
↓   ↓   ↓   ↓
1 1 0 0 1 0 0(2)
  ↑   ↑   ↑
  ↑   ↑   2^1=2(16)
  ↑   2^3=8(16)
  2^5=20(16)

40(16)×1 + 20(16)×1 + 4(16)×1 = 64(16)
```

</div></details>

<details><summary>8進数→16進数の基数変換</summary><div>

```:8進数→16進数の基数変換
8^2=40(16)
↓   8^0=1(16)
↓   ↓
1 4 4(8)
  ↑ 
  8^1=8(16)

40(16)×1 + 8(16)×4 + 1(16)×4 = 64(16)
```

</div></details>

<details><summary>8進数→10進数の基数変換</summary><div>

```:8進数→10進数の基数変換
8^2=64(10)
↓   8^0=1(10)
↓   ↓
1 4 4(8)
  ↑ 
  8^1=8(10)

64(10)×1 + 8(10)×4 + 1(10)×4 = 100(10)
```

</div></details>

<details><summary>16進数→10進数の基数変換</summary><div>

```:16進数→10進数の基数変換
16^1=16(10)
↓
6 4(16)
  ↑ 
  16^0=1(10)

16(10)×6 + 1(10)×4 = 100(10)
```

</div></details>

# 回答

桁の重みを変換後の基数で算出すれば、任意の基数への基数変換が可能です。

しかし、10進数以外のn進数の掛け算や足し算を計算することは難しいです。
（少なくとも基数変換を学び始める人が、すらすら出来ることはないでしょう。）

なので、通常、基数変換の説明では10進数への変換でしかこの方法はとられません。
結果、桁の重みが10進数となっていることは説明されないのです。
2020年と2021年の海水面温度を比較 (NASA Worldviewをembed)

# はじめに

[NASAのEOSDIS Worldview](https://worldview.earthdata.nasa.gov/ "NASA Worldview")は色々は人工衛星画像を見ることが出来るサイトである。そのシェアの方法としてhtmlにembedに対応したということなので試して見た。

> [Worldview’s New Embed Feature Makes Telling Data-Driven Stories Easier than Ever | Earthdata](
https://earthdata.nasa.gov/learn/articles/embed-worldview)

ここでは2020年と2021年8月4日の日本周辺の海面水温を比較する図を作ってみる。

# WorldViewで図を準備

[Worldview](https://worldview.earthdata.nasa.gov/ "NASA Worldview")　のサイトに行って、compasisonモードに入る。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77672/dbf63427-90a6-407f-dd39-5122d3c6f6e1.png)

左側の図で、物理量にGHRSST L4 MURを選び、日付を2020年8月4日にする。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77672/65f67d63-112b-118d-8eb4-bb9edce1b7fa.png)

右側の図で、物理量にGHRSST L4 MURを選び、日付を2021年8月4日にする。(同じ日の別の物理量を比較するという使い方も出来る)。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77672/1860cfce-af41-cf62-4aca-1165127ef26c.png)

シェアボタンからembedを選択し、コードを取得する。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77672/e097d1bf-09af-62cb-771e-95eb0d03a0d3.png)

# 結果

Qiitaにはiframeのコードを直接は埋め込めないようなので、[Qiitaにhtml, css, jsの実際の表示例を埋め込む方法（CodePen） - Qiita](https://qiita.com/shizen-shin/items/9407f8f8380bee90f9b9)の記事を参考に、CodePenというサービスを介して、埋め込むことにする。

左側が埋め込みコードで、heightを600に変更している。右側が結果の図である(読み込みにしばらく時間がかかるかもしれない)。真ん中のスライダーを左右に動かすことで、図の比較が出来る。今年の北日本周辺の水温は去年よりずいぶん高い。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="jOmXmpJ" data-user="tmiyama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tmiyama/pen/jOmXmpJ">
  WorldView</a> by Toru Miyama (<a href="https://codepen.io/tmiyama">@tmiyama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 2021/08/12 追記
embed以外に、リンクをSNSでシェアすることもできる。
(例)
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">８月８日と10日の海面水温平年差の比較(真ん中のスライダーを左右に動かす)。台風でだいぶ下がった。高い所はまだ高いけど。<br> <a href="https://twitter.com/hashtag/NASAWorldview?src=hash&amp;ref_src=twsrc%5Etfw">#NASAWorldview</a> - <a href="https://t.co/VQMENQjGmN">https://t.co/VQMENQjGmN</a></p>&mdash; Toru Miyama (@tmiyama) <a href="https://twitter.com/tmiyama/status/1425587011801341953?ref_src=twsrc%5Etfw">August 11, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
XP（eXtreme Programming）の概要と解説

XP（eXtreme Programming）とは、アジャイル開発における開発手法やマネジメントの経験則をまとめたものです。
アジャイル開発の”秘伝の技”のようなイメージですかね。

※アジャイル開発とは、短いスパンで計画・実行・評価を繰り返して反復しながら開発する手法です。


開発のプラクティスが複雑なので、まとめてみます。


#ペアプログラミング
AP頻出度★★★

2人のプログラマがペアになり、その場でレビューしながら開発

#テスト駆動開発
AP頻出度★★

普通はコードを書いてからテストをしますが、テストを先に設計し、テストをパスする必要最低限の実装を行った後に、コードをブラッシュアップするやり方。


#リファクタリング
AP頻出度★★
完成済みのプログラミングでも改良し、より保守性の高いプログラムに書き直す。

利用者から見た動作は変更しないのがポイントです。


#継続的インテグレーション
AP頻出度★
コードの結合とテストを継続的に繰り返し、問題や改善点を早期に発見する。
基礎③〜for文、while文〜　php

# はじめに
前回はif文について触れたので今回はfor文とwhile文について触れてみたいと思います。

# 内容

## for文について
・for文とは繰り返し処理を行うことを意味します。

例：

```php
for($i = 1; $i<=100; $i++){
   
  echo $i;

}
```
結果： 123456789101112131415.....100

１〜１００までが出力されることになります。

上記の例を説明すると
・＄i = 1　というのは１から始まります。
・＄i=100は100までループするよというループ条件を表しています。
・＄i++は条件を満たすまで更新し続けることを表しています。

##while文について
・while文もfor文と同様に繰り返し処理ができる１つです。

例：

```php
$i = 1;

while($i <= 100){

  echo $i;

  $i++

}
```

結果： 123456789101112131415.....100


上記の例を説明すると
・＄iに１という変数を代入する
・(＄i <= 100)という記述で１〜１００までという条件を指定
・echo ＄i;で結果をだし
・＄i++で条件をループすることにする

#まとめ
・繰り返す数が決まっておらず、特定の条件を満たすまで繰り返す場合→while文
・繰り返す数が決まっており、指定の回数まで繰り返す場合→ for文

参考：https://big-mac.jp/column/while-and-for-of-php-loop/
Series 要素の追加・削除

#要素の追加
Seriesに要素を追加する時、追加する要素もSeries型である必要がある。
追加したい要素をSeries型に変換後、追加先に**append(データ配列, index=インデックス配列 )**で渡す事が可能。




```python
import pandas as pd

fruits = ["apple", "orange", "banana", "straberry", "kiwifruit"]
data = [10, 5, 1, 2, 3]

#Series型の作成
series = pd.Series(data, index = fruits)
print(series)

#データ値が12,インデックスがpineappleのSeries型に変換し、appendで追加
series = series.append(pd.Series([12], index = ["pineapple"]))

print(series)
```

###出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/4b795f30-80cd-f693-4538-dcb24d8cb5d8.png)



一番最後に**pineapple  12**が追加されました。


#要素の削除
変数に対して、 **.drop("インデックス")**とする事で指定のインデックスを持つ要素が削除できる。

```python
#上記のSeries型のappleを削除する。
series = series.drop("apple")
print(series)
```

###出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/800fe41b-8bae-eb2d-03e5-9a8c8af0dfb8.png)


見事appleが削除されました。
Macでbashの設定をターミナル起動時に読み込む設定(.bashrc / .bash_profile)

# はじめに
2021/08/10時点での記事になります。
最近、ターミナルでコマンドを叩く機会が減ってたのですが、久々実行するとなんとなく違和感を感じました。
いつも `ls` コマンドを実行するとエイリアスで、 `ls -aF` としてたのに素の `ls` コマンドでした。
ということで、いつの間にかターミナル起動時に `.bashrc` が自動的に読み込まれなくなっていました。

そこでの解決策をここで書いていきます。

## スペック
mac OS Big Sur / Ver11.4

```
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
Copyright (C) 2007 Free Software Foundation, Inc.
```

# やること
やることは一つだけで、 `.bash_profile` を作成して、おまじないを書けば完了

１. まずはターミナルを開きます。
２. その後、 `.bash_profile` を開きます。

```
$ vi ~/.bash_profile
```

３. 以下のおまじないを書いて保存すれば完了です。

```
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
``` 

# さいごに
最近では `zsh` をデフォルトのシェルとして利用してくださいねと注意書きがされています。

```
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

でも、もう少し `bash` を使っていきたい（PCを買い換えるまでは）です。
FirebaseCrashlyticsのレポート収集＆送信をコントロールする

## 概要
iOSやAndroidでクラッシュ情報を収集するために、FirebaseCrashlyticsを利用されている方は多いと思います。
FirebaseCrashlyticsはデフォルトではクラッシュレポートの収集・送信を全て自動的に行ってくれますが、

* ユーザーの同意を得た上で収集&送信をしたい
* 収集&送信をコントロールしたい

など、開発者側でコントロールをしたいというニーズが発生することがあるかと思います。
この記事では、これらのコントロールを行う方法を紹介させていただきたいと思います。

## 前提
本記事はFirebaseCrashlytics 8.0.0 の情報を元に記載しています。
今後のバージョンアップなどにより動作が異なる場合があるので、ご注意ください。


## クラッシュレポートの自動収集を停止する
クラッシュレポートの自動収集を停止するには、以下のいずれかの対応が必要です。

1. `Info.plist` の <b>FirebaseCrashlyticsCollectionEnabled</b> キーに対して、<b>false</b>(Bool値) を設定する

2. `setCrashlyticsCollectionEnabled` をプロダクト内で実行しfalseの設定を行う

[オプトインレポートを有効にする](https://firebase.google.cn/docs/crashlytics/customize-crash-reports?hl=ja#enable-reporting)

:::note warn
false値が適用されるタイミングに注意してください。詳しくは公式のドキュメント参照。
:::

## クラッシュレポートの送信をコントロールする
上述の自動収集が停止されている場合に、

- checkForUnsentReports(completion:)
- sendUnsentReports()
- deleteUnsentReports()

の関数を利用してコントロールを行うことができます。

[iOS Reference](https://firebase.google.com/docs/reference/swift/firebasecrashlytics/api/reference/Classes/Crashlytics#checkforunsentreportscompletion:)
[Android Reference](https://firebase.google.com/docs/reference/android/com/google/firebase/crashlytics/FirebaseCrashlytics#checkForUnsentReports())
[オプトインオプトアウトに関する記述](https://firebase.google.com/docs/crashlytics/upgrade-sdk?hl=ja#the_crashlyticsdelegate_is_replaced_by_separate_methods_for_handling_crash_reports)

:::note warn
上記ドキュメントにも記載がある通り、データ収集を無効にした場合でもクラッシュ情報はローカル保存されています。
その後データ収集が有効になった際に、保存された全てのクラッシュ情報がFirebaseCrashlyticsに送信されるので注意してください。
:::


## FirebaseCrashlyticsに送信しているクラッシュ以外のレポートについて
FirebaseCrashlyticsには、致命的でない例外を報告することができます。
[致命的でない例外を報告する](https://firebase.google.cn/docs/crashlytics/customize-crash-reports?hl=ja#log-excepts)

このレポートについても、
上述の[自動収集を停止する] 作業を行うことで自動的に送信されないようになります。

## これら機能を実装する上での注意点
APIリファレンスには非常にざっくりと各機能に関する記載はあるのですが、
詳細な使い方などに関する説明はかなり不足している（かつiOS/Androidで書いてある内容も少し違う）ので、
リファレンスを参考にしつつ、実動作をしっかりと確認しながら組み込みを行うようにする必要があります。
AtCoderログ：0066 - ABC 213 A

# 問題

https://atcoder.jp/contests/abc213/tasks/abc213_a

## 問題文
> $0$ 以上 $255$ 以下の整数 $A,B$ が与えられます。$A {\rm xor} C = B$ となる 
$0$ 以上の整数 $C$ を求めてください。
> なお、そのような $C$ はただ $1$ つ存在し、$0$ 以上 $255$ 以下であることが証明されます。

## 制約
> ・$0 \le A,B \le 255$
> ・入力に含まれる値は全て整数である

# 回答
## 回答1 (AC)
問題文より $0 \le C \le 255$ になることが保証されているので、$C$ に関するループを回せば良いでしょう。なお、C++ では a と b の xor は a^b で求められます。コードは以下のようになりました。

```C++:abc213a-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int a, b;
  cin >> a >> b;

  for ( int c=0; c<256; c++ ) {
    if ( (a^c)==b ) {
      cout << c << endl;
      break;
    }
  }
}
```

## 回答2 (AC)
xor の持つ性質として次の2つが有名です：(1) $0$ との xor は値が変わらない、つまり $A$ xor $0$ = $A$。(2) 自分自身との xor の結果は必ず $0$ になる、つまり $A$ xor $A = 0$。
これらの性質を利用して、与えられた式を変形します。与えられた式 $A$ xor $C=B$ の両辺に $A$ を xor すると、$A$ xor $A$ xor $C = A$ xor $B$ となり、$0$ xor $C = A$ xor $B$ つまり $C=A$ xor $B$ となります。つまり、求める値 $C$ は $A$ xor $B$ に等しいことがわかりました。
この等式を利用したコードは以下のようになりました。

```C++:abc213a-2.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int a, b;
  cin >> a >> b;

  cout << (a^b) << endl;
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc213/tasks/abc213_a/editorial) → [公式解説](https://atcoder.jp/contests/abc213/editorial/2363)
回答1,回答2の両方が紹介されていました。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0065 - ABC 071 B](https://qiita.com/RoadLynton/items/a4026a43eb3b76489a4a)
- 次の記事 → [AtCoderログ：0067 - ABC 061 B](https://qiita.com/RoadLynton/items/464eb7945e0978ce5c80)
Gopherエンジニア面接質問 fmt.Println(uint(1) - uint(2))の結果は?

###背景
一つGo言語の面接質問を紹介します
以下の出力結果はなんですか？

```go
package main

import (
	"fmt"
)

func main()  {
	a := uint(0)
	b := uint(1)
	fmt.Println(a - b)
}
```

面接質問だから、明らかに-1ではないですね
この質問の正確な答えは

```
uintの最大値が出力されます
PCは32bitの場合は、uint32の最大値になり、2**32-1 になります,
PCは64bitの場合は、uinit64の最大値になり、2**64-1になります
```
※　なお、以下の公式サイトによるとuint64の最大値は18446744073709551615になり、2**64-1まではいかないです。
> uint64 is the set of all unsigned 64-bit integers. Range: 0 through 18446744073709551615.

https://pkg.go.dev/builtin#uint64


###解説
まずaとbを二進数に変換します。たとえPCは32bitです。

```
a := uint(1)
```
上に対してPCは32bitの場合は、aのバイナリデータは以下になります


```
00000000 00000000 00000000 00000001
```

計算機は引き算を足し算として計算されてあるため、bは-2として見直していきます。

```
b := -uint(2)
```
上に対してPCは32bitの場合は、bのバイナリデータは以下になります。一番左の1は負を表しています。

```
10000000 00000000 00000000 00000010
```


aは正数ですので、aの2の補数はaの二進数そのものです

```
0000000 00000000 00000000 00000001
```


bは負数ですので、bの2の補数は以下のように計算されます

```
10000000 00000000 00000000 00000010 <- b(-2)の二進数
↑先頭の1は負数を表しています。

11111111 11111111 11111111 11111101 <-　b(-2)の1の補数
↑先頭の1をそのまま、他の位置の二進数を逆転します

11111111 11111111 11111111 11111110 <-　b(-2)の2の補数
1の補数を1を足したら、2の補数になります
```


負数の足し算の場合は、計算機は2の補数で行うため、a+bは以下になります

```
0と-1の2の補数を足し算します
00000000 00000000 00000000 00000001 <- aの2の補数
11111111 11111111 11111111 11111110 <- bの2の補数

11111111 11111111 11111111 11111111 <- a+bの2の補数
```

そじて以下のデータをuintに渡して出力しようとしていました

```
11111111 11111111 11111111 11111111
```

***以下の方は渡しの憶測です、間違うことになったら、指摘してください。***
aとbはuint型です、そのためa-bの結果もuint型です。
uintは符号なしなので、補数から二進数に変換して、出力するではなく、そのまま2の補数を正数として出力しようとしました
そのためa+bの2の補数の足し算の結果をそのまま出力します。
結果は2**32 - 1です。

もしaとbはuintではなく、intの場合は、最後に以下のように２の補数の結果を2進数に変換してから出力することになります。そのため、aとbはintの場合、結果は-1になります。



```
11111111 11111111 11111111 11111111  <- a+bの2の補数
11111111 11111111 11111111 11111110  <-　a+bの1の補数
↑2の補数を1を引き算します

10000000 00000000 00000000 00000001  <-　a+bの二進数
↑先頭の1をそのままで、他の位置の二進数を逆転します
```

###まとめ###
引き算はPC側では負数の足し算として行っています
負数の足し算は2の補数として行っています
uintは符号なしですので、2の補数の結果はそのまま正数として出力します(要検討)
SORACOM 3G対応データ通信端末 AK-020、Raspberry PI 3 Model B+、PyCharmでIoT開発環境を整えて見ました

###背景###
Raspberry PiはIoTデバイスとして使うときに、どうやってネットワークに繋がることは回避できない問題です。Raspberry Piは家に置くときに、家の有線LANもしくは無線WIFIに繋がって、ngrokなどネットワーク浸透ツールを利用して、なんとなく外部ネットワークとつながります。
もしデバイスは有線LANもしくは無線WIFIがないところに設定する必要がある場合、SIMカードが搭載する通信端末を利用する場、問題を解決できると思います。
今回、SORACOM 3G対応データ通信端末 AK-020とPyCharmを利用し、開発環境を整える手順を紹介したいと思います。


###手順###

####1. SDカードとSORACOM端末を準備します####
以下の手順に従って行ってください
https://soracom.jp/recipes_index/4171/

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/e250ff89-639d-69f9-2bef-eecfd196af39.png)


![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/fb39184d-70e4-e084-bfff-5a19af4d1a88.png)


####2.ssh情報の確認####
SORACOM ユーザーコンソールに入って、sshのホストとポートを確認します
https://console.soracom.io/

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/a2f63473-2d0f-dc36-8204-dad5505d6baf.png)

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/753d3b3f-0fff-6952-bafb-746031c9e53a.png)

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/7d579eff-11d4-cfd8-a6a9-d00356e23608.png)

####3. PyCharmでリモートPython Interpreterを設定します
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/8263eb97-2ce2-b7b2-aa1e-8e4506522605.png)
設定 -> Project -> Project Interpreter ->歯車 -> Add
ここからリモートRaspberry Pi　のPython Interpreterのpathを追加します
Raspberry Piのユーザー名を入力します

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/82a559d6-7471-0789-db8f-908b33b84fcc.png)
step2でSORACOM ユーザーコンソール確認されたsshのホストとポートをここに入力します![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/7eb7642e-4ea2-14ec-0666-7440c8e0eaa3.png)
Raspberry Piのパースワードを入力します


![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/5ce66968-89e3-a7d2-a50c-2d21b5fc33a3.png)
リモートのPython InterpreterのPathとプロジェクトのリモートPathを変更します

![スクリーンショット 2021-08-08 18.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/91969984-7e0d-c688-8548-38d4e8bde195.png)
Python3のPathとプロジェクトの絶対Pathを確認します


![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/e70ac9ae-38e0-857b-d162-269c045ae881.png)
設定完了して、しばらく待ちます

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/1c0eda53-f084-9214-a2f6-6049a9c8529e.png)
remote ブラウザでリモートの状況を確認します

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/2d94c580-d09f-05a2-8c1a-3f3c3278c8de.png)
完了したら、ローカル環境のソースコードはリモートへ同期開始します

###まとめ###
Raspberry Piは外のネットワークに繋がるときに一つの手段として、SORACOM端末3G対応データ通信端末 AK-020を紹介いたしました。
感想としては、開発するときに、家の有線LANと無線WIFIを経由してリモートRaspberry Piにアクセスしたほうが早いです。やはり3Gより、家のローカルネットワークの方が早いです。ただ、運用するときに、SORACOM端末3G対応データ通信端末を使うのはネットワークの心配をしなくても自由度は高いです。

###trouble shooting###
![スクリーンショット 2021-08-18 23.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191439/35ba39d0-cefd-706c-cdf0-c397a286edb9.png)
statusはOnlineではなくofflineの場合は以下のコマンドを実行してください

```
sudo bash setup_air.sh
sudo ifdown wwan0
sudo ifup wwan0
```

###参考資料###
https://qiita.com/xu1718191411/items/056e99f6aef527d086b8
[JavaScript]基本構文まとめ

今回は、JavaScriptの基本構文についてまとめていきます。

#変数の定義

```js:
let 変数名 = 値;
```
#定数の定義

```js:
const 定数名　= 値;
```

#if文

if文の閉じカッコに、`セミコロンは不要`

```js:
if (条件){
  処理
} else if (条件){
  処理
} else {
  処理
}
```

#swich文

ある値によって処理を実行するという条件分岐ができる。

`break;`をつけないと、条件に当てはまっても次の処理が実行される。

```js:
switch (条件の値){
  case 値1:
    処理
    break;
  case 値2:
    処理
    break;
}
```

#比較演算子

他の言語と少し違う

```js:
// aとbが等しい
a === b
// aとbが異なる
a !== b
```

#while文

繰り返し処理ができる。
while文の閉じカッコに、`セミコロンは不要`

```js:
while (条件){
  処理
}
```

#for文

繰り返し処理ができる。
for文の閉じカッコに、`セミコロンは不要`
while文に比べてシンプルに書くことができる。

```js:
for (変数の定義;条件式;変数の更新){
  処理
}
```

#まとめ

生のJavascriptを触ることはほぼないので、よく使うものだけをまとめておきました！
AtCoderログ：0065 - ABC 071 B

# 問題

https://atcoder.jp/contests/abc071/tasks/abc071_b

## 問題文
> 英小文字からなる文字列 $S$ が与えられます．$S$ に現れない英小文字であって，最も辞書順（アルファベット順）で小さいものを求めてください．ただし，$S$ にすべての英小文字が現れる場合は，代わりに None を出力してください．

## 制約
> ・$1 \le |S| \le 10^5$ ($|S|$ は文字列 $S$ の長さ)
> ・$S$ は英小文字のみからなる．

## 収録されている問題セット
- [AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067) ([第07問類題](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-7-%E5%95%8F--abc-085-b---kagami-mochi-200-%E7%82%B9))

# 回答
## 回答1 (AC)
文字列 s で使用されていない文字を聞かれているので、文字列 s で使用されている文字を set 型の変数 letter に保持し、アルファベット列 "abcdefghijklmnopqrstuvwxyz" のうちで最初に使用されていない文字を出力すれば良いでしょう。"None" を出力するのは文字列 s で全てのアルファベットが使用されているときなので、letterのサイズが26になっているときです。コードは以下のようになりました。

```C++:abc071b-1.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  string s;
  cin >> s;

  set<char> letter;
  for ( int i=0; i<(int)s.size(); i++ ) {
    letter.insert(s.at(i));
  }

  if ( letter.size()==26 ) {
    cout << "None" << endl;
  } else {
    string alphabet="abcdefghijklmnopqrstuvwxyz";
    for ( int i=0; i<26; i++ ) {
      if ( s.find(alphabet.at(i))==-1 ) {
        cout << alphabet.at(i) << endl;
        break;
      }
    }
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc071/tasks/abc071_b/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/arc081/editorial.pdf)
アルファベットと文字コードを変換する方法を使用していました。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0064 - ABC 213 に参加しました](https://qiita.com/RoadLynton/items/dbbdf7da4527495f7a83)
- 次の記事 → [AtCoderログ：0066 - ABC 213 A](https://qiita.com/RoadLynton/items/4004e7aa403cdf6b3ee7)
統計で用いられる数式【個人メモ】


統計の数式メモ。
<h2>相関係数</h2>
2つの変数の関係を示す指標。
-1>0>1の実数値をとる。
プラスの値の時は正の相関。
マイナスの時は負の相関。
絶対値が1に近いほど相関が強く、0に近いほど相関が弱いとされる。

【個人メモ】
2つの定量データにどれぐらいの相関関係があるか調べる際に使う。
「因果関係」と「相関関係」を分けて考えられない人を黙らせる時に。

数式

$$
r_{xy} = \frac{\displaystyle \sum_{i = 1}^n (x_i - \overline{x})
(y_i - \overline{y})}{\sqrt{\displaystyle \sum_{i = 1}^n 
(x_i - \overline{x})^2}\sqrt{\displaystyle \sum_{i = 1}^n 
(y_i - \overline{y})^2}}
$$

LaTex

```
r_{xy} = \frac{\displaystyle \sum_{i = 1}^n (x_i - \overline{x})
(y_i - \overline{y})}{\sqrt{\displaystyle \sum_{i = 1}^n 
(x_i - \overline{x})^2}\sqrt{\displaystyle \sum_{i = 1}^n 
(y_i - \overline{y})^2}}
```

Excel関数:<b>CORREL</b>
https://support.microsoft.com/ja-jp/office/correl-%E9%96%A2%E6%95%B0-995dcef7-0c0a-4bed-a3fb-239d7b68ca92#:~:text=CORREL%20%E9%96%A2%E6%95%B0%E3%81%AF%E3%80%812%20%E3%81%A4%E3%81%AE,%E8%AA%BF%E3%81%B9%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

相関係数の判断指標
![cats.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214763/7dd30c11-34c8-f458-dc77-5fa6ec7b5af0.jpeg)



<h2>偏相関係数</h2>

目的変数と各説明変数の「1:1」の関係ではなく、
「1:多」の関係を考慮した(その他の説明変数の影響を除去した)相関を示す指標
分析には「Excel統計」など専用ソフトが必要

【個人メモ】
「AがBなのはCが原因！(A=B→C)」と複合要因を考えられない人を黙らせる時に

数式

$$
r_{xy\cdot z} = \frac{r_{xy} - r_{xz}r_{yz}}{\sqrt{1 - r_{xz}^2} \sqrt{1 - r_{yz}^2}}
$$

LaTex

```
r_{xy\cdot z} = \frac{r_{xy} - r_{xz}r_{yz}}{\sqrt{1 - r_{xz}^2} \sqrt{1 - r_{yz}^2}}
```

<h2>平均偏差</h2>
正負両符号が存在するので絶対値を取る。

【個人メモ】
平均に対してのばらつき(変動幅)を調べる時に使う。
平均数字でウソをつく人向けに中央値を示したい時の暫定計算など。

数式

$$
\sigma = \sqrt{\frac{1}{n}\sum_{i = 1}^n {(x_i - \overline{x})^2}}
$$

LaTex

```
\sigma = \sqrt{\frac{1}{n}\sum_{i = 1}^n {(x_i - \overline{x})^2}}
```

スプレッドシート関数：<b>AVEDEV</b>
<h2>分散</h2>
<h2>標準偏差</h2>



数式

$$
\sigma = \sqrt{\frac{1}{n}\sum_{i = 1}^n {(x_i - \overline{x})^2}}
$$


LaTex

```
\sigma = \sqrt{\frac{1}{n}\sum_{i = 1}^n {(x_i - \overline{x})^2}}
```

スプレッドシート関数:<b>STDEV</b>
https://support.google.com/docs/answer/3094054?hl=ja
<h2>メディアン(中央値)</h2>



$$
D_{wt} = \frac{1}{2}D_{ut} + \frac{1}{2}D_{vt} - \frac{1}{4}D_{uv}
$$

LaTex

```
D_{wt} = \frac{1}{2}D_{ut} + \frac{1}{2}D_{vt} - \frac{1}{4}D_{uv}
```

https://bellcurve.jp/statistics/glossary/553.html
【Ruby on Rails】submitボタンにFontAwesomeのアイコンを表示する方法


#対象者

* form_withを使っている方
* submit btnをFontAwesomeで表示したい方


#目的

* FontAwesomeを使ってSubmitを表示する

#実際の手順と実例
###1.下記のように記載

````ruby
  <%= form_with(model: [@article, @comment]) do |f| %>
   <%= f.text_area :comment_content %>

   #下記の部分
   <%= button_tag type: "submit", class: "btn btn-default" do %>
   <i class="far fa-comment-alt"></i>

   <% end %>
  <% end %>
```

button_tag typeというメソッドを使っています。
これで、FontAwesomeのクラスを囲えば完成です。
問題なく投稿も行えます。

####投稿者コメント
FontAwesome多様するので今回やり方が全く分からず調べてみました。参考になれば幸いです。

####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。